diff --git a/src/libnptm/tra_subs.cpp b/src/libnptm/tra_subs.cpp index 13a5aa9ab809515a982e0b7dd03a43a9ae328f43..e9122e7dbd277bf18f3a876b1c833a648855a11e 100644 --- a/src/libnptm/tra_subs.cpp +++ b/src/libnptm/tra_subs.cpp @@ -297,7 +297,7 @@ void pwmalp(complex<double> **w, double *up, double *un, complex<double> *ylm, i int lf = l20 + 1; int lftl = lf * l20; double x = 1.0 * lftl; - complex<double> cl = std::pow((four_pi / sqrt(x)) * uim, 1.0 * l20); + complex<double> cl = (four_pi / sqrt(x)) * std::pow(uim, 1.0 * l20); int mv = l20 + lf; int m = -lf; for (int mf20 = 1; mf20 <= mv; mf20++) { @@ -387,7 +387,7 @@ void wamff( if (!(onz && onx && ony)) { rho = sqrt(x * x + y * y); cph = x / rho; - sph = y = rho; + sph = y / rho; } else { if (onz) { // label 10 cph = 1.0; @@ -429,6 +429,7 @@ void wamff( } } if (lmode == 0 || sth != 0.0) { // label 25 + bool skip62 = false; ylm[nlmp - 1] = cc0; sphar(cth, sth, cph, sph, lm, ylm); up[0] = cph * cth; @@ -461,16 +462,19 @@ void wamff( cfam *= (sth * pmf * ftc1); for (int i52 = 0; i52 < nlmmt; i52++) wk[i52] = w[i52][0] * cfam; // returns + skip62 = true; } else if (lmode == 3) { // label 53 ftc2 = 2.0 * cthl / (cthl + cth * rir); cfam *= (sth * pmf * ftc2); for (int i55 = 0; i55 < nlmmt; i55++) wk[i55] = w[i55][1] * cfam; // returns + skip62 = true; } if (lmode == 0 || lmode == 1) { //label 48 cf1 = cph * ftc1 * cfam; cf2 = -sph * ftc2 * cfam; // goes to 62 + skip62 = false; } } else { // label 57 double fam = tra * std::exp(-apfa * apfa) / sqrt(cth); @@ -479,23 +483,29 @@ void wamff( double f2 = -sph * fam; for (int i58 = 0; i58 < nlmmt; i58++) wk[i58] = w[i58][0] * f1 + w[i58][1] * f2; // returns + skip62 = true; } else if (lmode == 1) { // label 60 cfam = (pmf * sth * fam) * (cph * uim * sph); cf1 = cph * cfam; cf2 = -sph * cfam; // follows on to 62 + skip62 = false; } else if (lmode == 2) { // label 65 fam *= (pmf * sth); for (int i67 = 0; i67 < nlmmt; i67++) wk[i67] = w[i67][0] * fam; // returns + skip62 = true; } else if (lmode == 3) { // label 68 fam *= (pmf * sth); for (int i70 = 0; i70 < nlmmt; i70++) wk[i70] = w[i70][1] * fam; // returns + skip62 = true; } } - if (lmode == 0 || lmode == 1) { // label 62 - for (int i63 = 0; i63 < nlmmt; i63++) wk[i63] = w[i63][0] * cf1 + w[i63][1] * cf2; + if (!skip62) { + if (lmode == 0 || lmode == 1) { // label 62 + for (int i63 = 0; i63 < nlmmt; i63++) wk[i63] = w[i63][0] * cf1 + w[i63][1] * cf2; + } } } // Clean up memory diff --git a/src/trapping/cfrfme.cpp b/src/trapping/cfrfme.cpp index 251ea9117b5100bfc70b6bfccde7e49ef787a1e2..55f6f0e170834c22e3513e063739c0054e9d30b5 100644 --- a/src/trapping/cfrfme.cpp +++ b/src/trapping/cfrfme.cpp @@ -49,14 +49,14 @@ void frfme(string data_file, string output_path) { str_target = m.suffix().str(); regex_search(str_target, m, re); int jlml = stoi(m.str()); - int lmode, lm, nks, nkv; - double vk, exri, an, ff, tra; - double exdc, wp, xip, xi; - int idfc, nxi; - double apfafa, pmf, spd, rir, ftcn, fshmx; - double vxyzmx, delxyz, vknmx, delk, delks; - double frsh, exril; - int nlmmt, nrvc; + int lmode = 0, lm = 0, nks = 0, nkv = 0; + double vk = 0.0, exri = 0.0, an = 0.0, ff = 0.0, tra = 0.0; + double exdc = 0.0, wp = 0.0, xip = 0.0, xi = 0.0; + int idfc = 0, nxi = 0; + double apfafa = 0.0, pmf = 0.0, spd = 0.0, rir = 0.0, ftcn = 0.0, fshmx = 0.0; + double vxyzmx = 0.0, delxyz = 0.0, vknmx = 0.0, delk = 0.0, delks = 0.0; + double frsh = 0.0, exril = 0.0; + int nlmmt = 0, nrvc = 0; // Vector size variables int vkzm_size, wsum_size; // End of vector size variables @@ -78,6 +78,7 @@ void frfme(string data_file, string output_path) { tfrfme.read(reinterpret_cast<char *>(&spd), sizeof(double)); tfrfme.read(reinterpret_cast<char *>(&frsh), sizeof(double)); tfrfme.read(reinterpret_cast<char *>(&exril), sizeof(double)); + vkv = new double[nkv](); xv = new double[nxv](); yv = new double[nyv](); zv = new double[nzv](); @@ -85,10 +86,9 @@ void frfme(string data_file, string output_path) { for (int yi = 0; yi < nxv; yi++) tfrfme.read(reinterpret_cast<char *>(&(yv[yi])), sizeof(double)); for (int zi = 0; zi < nxv; zi++) tfrfme.read(reinterpret_cast<char *>(&(zv[zi])), sizeof(double)); fstream temptape2; - string tempname2 = output_path + "c_TEMPTAPE2"; + string tempname2 = output_path + "/c_TEMPTAPE2"; temptape2.open(tempname2.c_str(), ios::in | ios::binary); if (temptape2.is_open()) { - //vkv = new double[nkv](); for (int jx = 0; jx < nkv; jx++) temptape2.read(reinterpret_cast<char *>(&(vkv[jx])), sizeof(double)); vkzm = new double*[nkv]; vkzm_size = nkv; @@ -228,6 +228,11 @@ void frfme(string data_file, string output_path) { nlmmt = lm * (lm + 2) * 2; nks = nksh * 2; nkv = nks + 1; + // Array initialization + vkv = new double[nkv](); + vkzm = new double*[nkv]; + for (int vi = 0; vi < nkv; vi++) vkzm[vi] = new double[nkv]; + // End of array initialization double vkm = vk * exri; vknmx = vk * an; delk = vknmx / nksh; @@ -239,7 +244,6 @@ void frfme(string data_file, string output_path) { int nxv = nxs + 1; int nxshpo = nxsh + 1; xv = new double[nxv](); - //xv[nxsh] = 0.0; for (int i24 = nxshpo; i24 <= nxs; i24++) { xv[i24] = xv[i24 - 1] + delxyz; xv[nxv - i24 - 1] = -xv[i24]; @@ -248,7 +252,6 @@ void frfme(string data_file, string output_path) { int nyv = nys + 1; int nyshpo = nysh + 1; yv = new double[nyv](); - //yv[nysh] = 0.0; for (int i25 = nyshpo; i25 <= nys; i25++) { yv[i25] = yv[i25 - 1] + delxyz; yv[nyv - i25 - 1] = -yv[i25]; @@ -257,18 +260,12 @@ void frfme(string data_file, string output_path) { int nzv = nzs + 1; int nzshpo = nzsh + 1; zv = new double[nzv](); - //zv[nysh] = 0.0; for (int i27 = nzshpo; i27 <= nzs; i27++) { zv[i27] = zv[i27 - 1] + delxyz; zv[nzv - i27 - 1] = -zv[i27]; } // i27 loop int nrvc = nxv * nyv * nzv; int nkshpo = nksh + 1; - wsum = new complex<double>*[nlmmt]; - wsum_size = nlmmt; - for (int wsi = 0; wsi < nlmmt; wsi++) wsum[wsi] = new complex<double>[nrvc](); - vkv = new double[nkv](); - // vkv[nksh] = 0.0; for (int i28 = nkshpo; i28 <= nks; i28++) { vkv[i28] = vkv[i28 - 1] + delk; vkv[nkv - i28 - 1] = -vkv[i28]; @@ -319,21 +316,34 @@ void frfme(string data_file, string output_path) { temptape2.write(reinterpret_cast<char *>(&nrvc), sizeof(int)); temptape2.close(); temptape2.open("c_TEMPTAPE2", ios::in | ios::binary); - vkv = new double[nkv](); - for (int jx = 0; jx < nkv; jx++) - temptape2.read(reinterpret_cast<char *>(&(vkv[jx])), sizeof(double)); - vkzm = new double*[nkv]; - vkzm_size = nkv; - for (int vki = 0; vki < nkv; vki++) vkzm[vki] = new double[nkv](); + for (int jx = 0; jx < nkv; jx++) { + double value = 0.0; + temptape2.read(reinterpret_cast<char *>(&value), sizeof(double)); + vkv[jx] = value; + } for (int jy40 = 0; jy40 < nkv; jy40++) { - for (int jx40 = 0; jx40 < nkv; jx40++) - temptape2.read(reinterpret_cast<char *>(&(vkzm[jx40][jy40])), sizeof(double)); + for (int jx40 = 0; jx40 < nkv; jx40++) { + double value = 0.0; + temptape2.read(reinterpret_cast<char *>(&value), sizeof(double)); + vkzm[jx40][jy40] = value; + } } // jy40 loop temptape2.close(); - wk = new complex<double>[nlmmt]; - w = new complex<double>*[nkv]; - for (int wi = 0; wi < nkv; wi++) w[wi] = new complex<double>[nkv](); + if (wsum != NULL) { + for (int wsi = wsum_size - 1; wsi > -1; wsi--) delete[] wsum[wsi]; + delete[] wsum; + } + wsum = new complex<double>*[nlmmt]; for (int j80 = jlmf - 1; j80 < jlml; j80++) { + // w matrix + if (w != NULL) { + for (int wi = nkv - 1; wi > -1; wi--) delete[] w[wi]; + delete[] w; + } + w = new complex<double>*[nkv]; + for (int wi = 0; wi < nkv; wi++) w[wi] = new complex<double>[nkv](); + if (wk != NULL) delete[] wk; + wk = new complex<double>[nlmmt](); temptape1.open(temp_name1.c_str(), ios::in | ios::binary); for (int jy50 = 0; jy50 < nkv; jy50++) { for (int jx50 = 0; jx50 < nkv; jx50++) { @@ -348,6 +358,7 @@ void frfme(string data_file, string output_path) { } // jy50 loop temptape1.close(); int ixyz = 0; + wsum[j80] = new complex<double>[nrvc](); for (int iz75 = 0; iz75 < nzv; iz75++) { double z = zv[iz75] + frsh; for (int iy70 = 0; iy70 < nyv; iy70++) { @@ -364,11 +375,11 @@ void frfme(string data_file, string output_path) { double vkzl = vkzm[nkv - 1][jy60]; complex<double> phasl = exp(uim * (vkx * x + vky * y + vkzl * z)); complex<double> sumx = 0.5 * (w[0][jy60] * phasf + w[nkv - 1][jy60] * phasl); - for (int jx55 = 1; jx55 < nks; jx55++) { - vkx = vkv[jx55]; - double vkz = vkzm[jx55][jy60]; + for (int jx55 = 2; jx55 <= nks; jx55++) { + vkx = vkv[jx55 - 1]; + double vkz = vkzm[jx55 - 1][jy60]; complex<double> phas = exp(uim * (vkx * x + vky * y + vkz * z)); - sumx += (w[jx55][jy60] * phas); + sumx += (w[jx55 - 1][jy60] * phas); } // jx55 loop if (jy60 == 0 || jy60 == nkv - 1) sumx *= 0.5; sumy += sumx; @@ -439,14 +450,14 @@ void frfme(string data_file, string output_path) { for (int vki = vkzm_size - 1; vki > -1; vki--) delete[] vkzm[vki]; delete[] vkzm; } + if (w != NULL) { + for (int wi = nkv - 1; wi > -1; wi--) delete[] w[wi]; + delete[] w; + } if (wsum != NULL) { for (int wsi = wsum_size - 1; wsi > -1; wsi--) delete[] wsum[wsi]; delete[] wsum; } if (wk != NULL) delete[] wk; - if (w != NULL) { - for (int wi = nkv - 1; wi > -1; wi--) delete[] w[wi]; - delete[] w; - } printf("Done.\n"); }