kp.c (1786B)
#include <stdio.h> #include <math.h> #include <complex.h> #include "kp.h" void solve(const double E, double complex k[2], double b, double V_0, double Delta) { double complex q = csqrt(2.0 * E); double complex kappa = csqrt(2.0 * (E - V_0)); double complex psi_11, psi_12, psi_21, psi_22; psi_11 = cexp(I * q * (b - Delta)) / (4.0 * q * kappa) * ( cexp(I * kappa * Delta) * (q + kappa) * (q + kappa) - cexp(-I * kappa * Delta) * (q - kappa) * (q - kappa) ); psi_22 = conj(psi_11); psi_12 = -I * cexp(I * q * (b - Delta)) / (2.0 * q * kappa) * (q * q - kappa * kappa) * csin(kappa * Delta); psi_21 = conj(psi_12); // quadratic determinantal eqn double complex u = -(psi_11 + psi_22); double complex v = (psi_11 * psi_22 - psi_12 * psi_21); double complex lam[2]; lam[0] = (-u + csqrt(u * u - 4.0 * v)) / 2.0; lam[1] = (-u - csqrt(u * u - 4.0 * v)) / 2.0; for (int x = 0; x < 2; x++) { k[x] = clog(lam[x]) / (I * b); } } void gen_data(double b, double V_0, double Delta) { const double pi = 4.0 * atan(1.0); const double dE = 0.01; double E = dE; const int N = 3000; FILE *fp = fopen("data.csv", "w"); if (!fp) { fp = fopen("/dev/null", "w"); } for (int y = 0; y < N; y++) { double complex q[2]; solve(E, q, b, V_0, Delta); double rq = creal(q[0]); if (rq > 0 && rq < pi / b) { fprintf(fp, "%.15g,%.15g\n", rq, E); fprintf(fp, "%.15g,%.15g\n", -rq, E); } rq = creal(q[1]); if (rq > 0 && rq < pi / b) { fprintf(fp, "%.15g,%.15g\n", rq, E); fprintf(fp, "%.15g,%.15g\n", -rq, E); } E += dE; } fclose(fp); }