Loading src/libnptm/clu_subs.cpp +244 −242 Original line number Original line Diff line number Diff line Loading @@ -56,22 +56,21 @@ void apc( dcomplex *vec_ac, *vec_gap; dcomplex *vec_ac, *vec_gap; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex uim = 0.0 + 1.0 * I; const dcomplex uim = 0.0 + 1.0 * I; dcomplex uimmp, summ, sume, suem, suee, summp, sumep; // dcomplex uimmp, summ, sume, suem, suee, summp, sumep; dcomplex suemp, sueep; // dcomplex suemp, sueep; double cof = 1.0 / sqk; double cof = 1.0 / sqk; double cimu = cof / sqrt(2.0); double cimu = cof / sqrt(2.0); int nlem = le * (le + 2); int nlem = le * (le + 2); const int nlemt = nlem + nlem; const int nlemt = nlem + nlem; const int nlemf = 2 * nlemt; vec_ac = new dcomplex[2 * nlemt](); vec_ac = new dcomplex[nlemf](); vec_gap = new dcomplex[6](); vec_gap = new dcomplex[6](); #pragma omp parallel for reduction(+: vec_ac[0:nlemf]) #pragma omp parallel for simd for (np_int ij = 0; ij < nlemt * nlemt; ij++) { for (int j45 = 0; j45 < nlemt; j45++) { np_int j45 = ij / nlemt; for (int i45 = 0; i45 < nlemt; i45++) { np_int i45 = ij % nlemt; vec_ac[2 * j45] += (am0m[j45][i45] * w[i45][0]); vec_ac[2 * j45] += (am0m[j45][i45] * w[i45][0]); vec_ac[2 * j45 + 1] += (am0m[j45][i45] * w[i45][1]); vec_ac[2 * j45 + 1] += (am0m[j45][i45] * w[i45][1]); } // ij loop } //i45 loop } //j45 loop for (int imu90 = 1; imu90 <=3; imu90++) { for (int imu90 = 1; imu90 <=3; imu90++) { int mu = imu90 - 2; int mu = imu90 - 2; gapp[imu90 - 1][0] = cc0; gapp[imu90 - 1][0] = cc0; Loading @@ -84,7 +83,7 @@ void apc( if ((l80 == 1 && ilmp == 1) || (l80 == le && ilmp == 3)) continue; // ilmp loop if ((l80 == 1 && ilmp == 1) || (l80 == le && ilmp == 3)) continue; // ilmp loop int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l80 + lmpml; int lmp = l80 + lmpml; uimmp = (-1.0 * lmpml) * uim; dcomplex uimmp = (-1.0 * lmpml) * uim; int impmmmp = lmp * (lmp + 1); int impmmmp = lmp * (lmp + 1); for (int im70 = 1; im70 <= ltpo; im70++) { for (int im70 = 1; im70 <= ltpo; im70++) { int m = im70 - lpo; int m = im70 - lpo; Loading @@ -96,17 +95,18 @@ void apc( int imp = impmmmp + mmp; int imp = impmmmp + mmp; int impe = imp + nlem; int impe = imp + nlem; double cgc = cg1(lmpml, mu, l80, m); double cgc = cg1(lmpml, mu, l80, m); int jpo = 1; int jpo = 2; for (int ipo = 0; ipo < 2; ipo++) { for (int ipo = 1; ipo <= 2; ipo++) { if (ipo == 1) jpo = 0; dcomplex summ, sume, suem, suee, summp, sumep, suemp, sueep; summ = dconjg(vec_ac[2 * (i - 1) + ipo]) * vec_ac[2 * (imp - 1) + ipo]; if (ipo == 2) jpo = 1; sume = dconjg(vec_ac[2 * (i - 1) + ipo]) * vec_ac[2 * (impe - 1) + ipo]; summ = dconjg(vec_ac[2 * (i - 1) + ipo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; suem = dconjg(vec_ac[2 * (ie - 1) + ipo]) * vec_ac[2 * (imp - 1) + ipo]; sume = dconjg(vec_ac[2 * (i - 1) + ipo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; suee = dconjg(vec_ac[2 * (ie - 1) + ipo]) * vec_ac[2 * (impe - 1) + ipo]; suem = dconjg(vec_ac[2 * (ie - 1) + ipo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; summp = dconjg(vec_ac[2 * (i - 1) + jpo]) * vec_ac[2 * (imp - 1) + ipo]; suee = dconjg(vec_ac[2 * (ie - 1) + ipo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; sumep = dconjg(vec_ac[2 * (i - 1) + jpo]) * vec_ac[2 * (impe - 1) + ipo]; summp = dconjg(vec_ac[2 * (i - 1) + jpo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; suemp = dconjg(vec_ac[2 * (ie - 1) + jpo]) * vec_ac[2 * (imp - 1) + ipo]; sumep = dconjg(vec_ac[2 * (i - 1) + jpo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; sueep = dconjg(vec_ac[2 * (ie - 1) + jpo]) * vec_ac[2 * (impe - 1) +ipo]; suemp = dconjg(vec_ac[2 * (ie - 1) + jpo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; sueep = dconjg(vec_ac[2 * (ie - 1) + jpo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; if (lmpml != 0) { if (lmpml != 0) { summ *= uimmp; summ *= uimmp; sume *= uimmp; sume *= uimmp; Loading @@ -118,7 +118,7 @@ void apc( sueep *= uimmp; sueep *= uimmp; } } // label 55 // label 55 vec_gap[2 * (imu90 - 1) + ipo] += ( vec_gap[2 * (imu90 - 1) + ipo - 1] += ( ( ( summ * zpv[l80 - 1][ilmp - 1][0][0] summ * zpv[l80 - 1][ilmp - 1][0][0] + sume * zpv[l80 - 1][ilmp - 1][0][1] + sume * zpv[l80 - 1][ilmp - 1][0][1] Loading @@ -126,7 +126,7 @@ void apc( + suee * zpv[l80 - 1][ilmp - 1][1][1] + suee * zpv[l80 - 1][ilmp - 1][1][1] ) * cgc ) * cgc ); ); gapp[imu90 - 1][ipo] += ( gapp[imu90 - 1][ipo - 1] += ( ( ( summp * zpv[l80 - 1][ilmp - 1][0][0] summp * zpv[l80 - 1][ilmp - 1][0][0] + sumep * zpv[l80 - 1][ilmp - 1][0][1] + sumep * zpv[l80 - 1][ilmp - 1][0][1] Loading @@ -140,19 +140,20 @@ void apc( } // ilmp loop } // ilmp loop } // l80 loop } // l80 loop } // imu90 loop } // imu90 loop for (int ipo95 = 0; ipo95 < 2; ipo95++) { for (int ipo95 = 1; ipo95 <= 2; ipo95++) { sume = vec_gap[ipo95] * cimu; dcomplex sume, suee, suem, sumep, sueep, suemp; suee = vec_gap[2 + ipo95] * cof; sume = vec_gap[ipo95 - 1] * cimu; suem = vec_gap[4 + ipo95] * cimu; suee = vec_gap[2 + ipo95 - 1] * cof; gapr[0][ipo95] = real(sume - suem); suem = vec_gap[4 + ipo95 - 1] * cimu; gapr[1][ipo95] = real((sume + suem) * uim); gapr[0][ipo95 - 1] = real(sume - suem); gapr[2][ipo95] = real(suee); gapr[1][ipo95 - 1] = real((sume + suem) * uim); sumep = gapp[0][ipo95] * cimu; gapr[2][ipo95 - 1] = real(suee); sueep = gapp[1][ipo95] * cof; sumep = gapp[0][ipo95 - 1] * cimu; suemp = gapp[2][ipo95] * cimu; sueep = gapp[1][ipo95 - 1] * cof; gapp[0][ipo95] = sumep - suemp; suemp = gapp[2][ipo95 - 1] * cimu; gapp[1][ipo95] = (sumep + suemp) * uim; gapp[0][ipo95 - 1] = sumep - suemp; gapp[2][ipo95] = sueep; gapp[1][ipo95 - 1] = (sumep + suemp) * uim; gapp[2][ipo95 - 1] = sueep; } // ipo95 loop } // ipo95 loop // Clean memory // Clean memory delete[] vec_ac; delete[] vec_ac; Loading @@ -165,23 +166,29 @@ void apcra( ) { ) { const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex uim = 0.0 + 1.0 * I; const dcomplex uim = 0.0 + 1.0 * I; // dcomplex uimtl, uimtls, ca11, ca12, ca21, ca22; dcomplex uimtl, uimtls, ca11, ca12, ca21, ca22; // dcomplex a11, a12, a21, a22, fc; dcomplex a11, a12, a21, a22, sum1, sum2, fc; double *vec_svw = new double[le * 12](); double ****svw = new double***[le]; dcomplex *vec_svs = new dcomplex[le * 12](); dcomplex ****svs = new dcomplex***[le]; dcomplex sum1 = cc0; for (int i = 0; i < le; i++) { dcomplex sum2 = cc0; svw[i] = new double**[3]; svs[i] = new dcomplex**[3]; for (int j = 0; j < 3; j++) { svw[i][j] = new double*[2]; svs[i][j] = new dcomplex*[2]; for (int k = 0; k < 2; k++) { svw[i][j][k] = new double[2](); svs[i][j][k] = new dcomplex[2](); } } } int nlem = le * (le + 2); int nlem = le * (le + 2); #pragma omp parallel { #pragma omp for for (int l28 = 1; l28 <= le; l28++) { for (int l28 = 1; l28 <= le; l28++) { int lpo = l28 + 1; int lpo = l28 + 1; int ltpo = lpo + l28; int ltpo = lpo + l28; double fl = sqrt(1.0 * ltpo); double fl = sqrt(1.0 * ltpo); for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { if ((l28 == 1 && ilmp == 1) || (l28 == le && ilmp == 3)) continue; // ilmp loop if ((l28 == 1 && ilmp == 1) || (l28 == le && ilmp == 3)) continue; // ilmp loop const int svw_start = 12 * (l28 - 1) + 4 * (ilmp - 1); int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l28 + lmpml; int lmp = l28 + lmpml; double flmp = sqrt(1.0 * (lmp + lmp + 1)); double flmp = sqrt(1.0 * (lmp + lmp + 1)); Loading @@ -191,40 +198,38 @@ void apcra( if (inpol == 0) { if (inpol == 0) { double cgs = cgmpo + cgmmo; double cgs = cgmpo + cgmmo; double cgd = cgmpo - cgmmo; double cgd = cgmpo - cgmmo; vec_svw[svw_start] = cgs; svw[l28 - 1][ilmp - 1][0][0] = cgs; vec_svw[svw_start + 1] = cgd; svw[l28 - 1][ilmp - 1][0][1] = cgd; vec_svw[svw_start + 2] = cgd; svw[l28 - 1][ilmp - 1][1][0] = cgd; vec_svw[svw_start + 3] = cgs; svw[l28 - 1][ilmp - 1][1][1] = cgs; } else { // label 22 } else { // label 22 vec_svw[svw_start] = cgmpo; svw[l28 - 1][ilmp - 1][0][0] = cgmpo; vec_svw[svw_start + 2] = cgmpo; svw[l28 - 1][ilmp - 1][1][0] = cgmpo; vec_svw[svw_start + 1] = -cgmmo; svw[l28 - 1][ilmp - 1][0][1] = -cgmmo; vec_svw[svw_start + 3] = cgmmo; svw[l28 - 1][ilmp - 1][1][1] = cgmmo; } } // label 26 // label 26 } // ilmp loop } // ilmp loop } // l28 parallel loop } // l28 loop // for (int l30 = 1; l30 <= le; l30++) { // 0-init: can be omitted for (int l30 = 1; l30 <= le; l30++) { // 0-init: can be omitted // for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { // for (int ipa = 1; ipa <= 2; ipa++) { for (int ipa = 1; ipa <= 2; ipa++) { // for (int ipamp = 1; ipamp <= 2; ipamp++) { for (int ipamp = 1; ipamp <= 2; ipamp++) { // vec_svs[12 * (l30 - 1) + 4 * (ilmp - 1) + 2 * (ipa - 1) + ipamp - 1] = cc0; svs[l30 - 1][ilmp - 1][ipa - 1][ipamp - 1] = cc0; // } } // } // ipa loop } // ipa loop // } // ilmp loop } // ilmp loop // } // l30 loop } // l30 loop #pragma omp for reduction(+: vec_svs[0:12*le]) for (int l58 = 1; l58 <= le; l58 ++) { for (int l58 = 1; l58 <= le; l58 ++) { int lpo = l58 + 1; int lpo = l58 + 1; int ltpo = l58 + lpo; int ltpo = l58 + lpo; int imm = l58 * lpo; int imm = l58 * lpo; for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { if ((l58 == 1 && ilmp == 1) || (l58 == le && ilmp == 3)) continue; // ilmp loop if ((l58 == 1 && ilmp == 1) || (l58 == le && ilmp == 3)) continue; // ilmp loop const int svs_start = 12 * (l58 - 1) + 4 * (ilmp - 1); int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l58 + lmpml; int lmp = l58 + lmpml; int impmm = lmp * (lmp + 1); int impmm = lmp * (lmp + 1); dcomplex uimtl = uim * (1.0 * lmpml); uimtl = uim * (1.0 * lmpml); if (lmpml == 0) uimtl = 1.0 + 0.0 * I; if (lmpml == 0) uimtl = 1.0 + 0.0 * I; for (int im54 = 1; im54 <= ltpo; im54++) { for (int im54 = 1; im54 <= ltpo; im54++) { int m = im54 - lpo; int m = im54 - lpo; Loading @@ -247,7 +252,7 @@ void apcra( int lsmpml = ilsmp - 2; int lsmpml = ilsmp - 2; int lsmp = ls + lsmpml; int lsmp = ls + lsmpml; int ismpmm = lsmp * (lsmp + 1); int ismpmm = lsmp * (lsmp + 1); dcomplex uimtls = -uim * (1.0 * lsmpml); uimtls = -uim * (1.0 * lsmpml); if (lsmpml == 0) uimtls = 1.0 + 0.0 * I; if (lsmpml == 0) uimtls = 1.0 + 0.0 * I; for (int ims = 1; ims <= lstpo; ims++) { for (int ims = 1; ims <= lstpo; ims++) { int ms = ims - lspo; int ms = ims - lspo; Loading @@ -259,43 +264,35 @@ void apcra( int ismp = ismpmm + msmp; int ismp = ismpmm + msmp; int ismpe = ismp + nlem; int ismpe = ismp + nlem; double cgcs = cg1(lsmpml, mu, ls, ms); double cgcs = cg1(lsmpml, mu, ls, ms); dcomplex fc = (uimtl * uimtls) * (cgc * cgcs); fc = (uimtl * uimtls) * (cgc * cgcs); dcomplex ca11 = dconjg(am0m[is - 1][i - 1]); ca11 = dconjg(am0m[is - 1][i - 1]); dcomplex ca12 = dconjg(am0m[is - 1][ie - 1]); ca12 = dconjg(am0m[is - 1][ie - 1]); dcomplex ca21 = dconjg(am0m[ise - 1][i - 1]); ca21 = dconjg(am0m[ise - 1][i - 1]); dcomplex ca22 = dconjg(am0m[ise - 1][ie - 1]); ca22 = dconjg(am0m[ise - 1][ie - 1]); dcomplex a11 = am0m[ismp - 1][imp - 1]; a11 = am0m[ismp - 1][imp - 1]; dcomplex a12 = am0m[ismp - 1][impe - 1]; a12 = am0m[ismp - 1][impe - 1]; dcomplex a21 = am0m[ismpe - 1][imp - 1]; a21 = am0m[ismpe - 1][imp - 1]; dcomplex a22 = am0m[ismpe - 1][impe - 1]; a22 = am0m[ismpe - 1][impe - 1]; double z11 = zpv[ls - 1][ilsmp - 1][0][0]; double z11 = zpv[ls - 1][ilsmp - 1][0][0]; double z12 = zpv[ls - 1][ilsmp - 1][0][1]; double z12 = zpv[ls - 1][ilsmp - 1][0][1]; double z21 = zpv[ls - 1][ilsmp - 1][1][0]; double z21 = zpv[ls - 1][ilsmp - 1][1][0]; double z22 = zpv[ls - 1][ilsmp - 1][1][1]; double z22 = zpv[ls - 1][ilsmp - 1][1][1]; vec_svs[svs_start] += ( svs[l58 - 1][ilmp - 1][0][0] += ((ca11 * a11 * z11 ( + ca11 * a21 * z12 ca11 * a11 * z11 + ca11 * a21 * z12 + ca21 * a11 * z21 + ca21 * a11 * z21 + ca21 * a21 * z22 + ca21 * a21 * z22) * fc); ) * fc svs[l58 - 1][ilmp - 1][0][1] += ((ca11 * a12 * z11 ); + ca11 * a22 * z12 vec_svs[svs_start + 1] += ( + ca21 * a12 * z21 ( + ca21 * a22 * z22) * fc); ca11 * a12 * z11 + ca11 * a22 * z12 svs[l58 - 1][ilmp - 1][1][0] += ((ca12 * a11 * z11 + ca21 * a12 * z21 + ca21 * a22 * z22 + ca12 * a21 * z12 ) * fc + ca22 * a11 * z21 ); + ca22 * a21 * z22) * fc); vec_svs[svs_start + 2] += ( svs[l58 - 1][ilmp - 1][1][1] += ((ca12 * a12 * z11 ( + ca12 * a22 * z12 ca12 * a11 * z11 + ca12 * a21 * z12 + ca22 * a12 * z21 + ca22 * a11 * z21 + ca22 * a21 * z22 + ca22 * a22 * z22) * fc); ) * fc ); vec_svs[svs_start + 3] += ( ( ca12 * a12 * z11 + ca12 * a22 * z12 + ca22 * a12 * z21 + ca22 * a22 * z22 ) * fc ); } // ends ims loop } // ends ims loop } // ims loop } // ims loop } // ilsmp loop } // ilsmp loop Loading @@ -305,7 +302,8 @@ void apcra( } // im54 loop } // im54 loop } // ilmp loop } // ilmp loop } // l58 loop } // l58 loop #pragma omp for reduction(+: sum1, sum2) sum1 = cc0; sum2 = cc0; for (int l68 = 1; l68 <= le; l68++) { for (int l68 = 1; l68 <= le; l68++) { //int lpo = l68 + 1; //int lpo = l68 + 1; //int ltpo = l68 + lpo; //int ltpo = l68 + lpo; Loading @@ -314,34 +312,33 @@ void apcra( if ((l68 == 1 && ilmp == 1) || (l68 == le && ilmp == 3)) continue; // ilmp loop if ((l68 == 1 && ilmp == 1) || (l68 == le && ilmp == 3)) continue; // ilmp loop if (inpol == 0) { if (inpol == 0) { sum1 += ( sum1 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][1][1] ); ); sum2 += ( sum2 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][1][1] ); ); } else { // label 62 } else { // label 62 sum1 += ( sum1 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][1][1] ); ); sum2 += ( sum2 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][1][1] ); ); } // label 66, ends ilmp loop } // label 66, ends ilmp loop } // ilmp loop } // ilmp loop } // l68 loop } // l68 loop } // OMP parallel region const double half_pi = acos(0.0); const double half_pi = acos(0.0); double cofs = half_pi * 2.0 / sqk; double cofs = half_pi * 2.0 / sqk; gaprm[0][0] = 0.0; gaprm[0][0] = 0.0; Loading @@ -366,14 +363,24 @@ void apcra( gappm[2][0] = cc0; gappm[2][0] = cc0; gappm[2][1] = cc0; gappm[2][1] = cc0; } } // Clean memory // Clean memory delete[] vec_svw; for (int i = le - 1; i > -1; i--) { delete[] vec_svs; for (int j = 2; j > -1; j--) { for (int k = 1; k > -1; k--) { delete[] svw[i][j][k]; delete[] svs[i][j][k]; } delete[] svw[i][j]; delete[] svs[i][j]; } delete[] svw[i]; delete[] svs[i]; } delete[] svw; delete[] svs; } } #ifdef USE_TARGET_OFFLOAD #pragma omp begin declare target device_type(any) #endif dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int istep) { dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int istep) { dcomplex result = z; dcomplex result = z; if (nj > 0) { if (nj > 0) { Loading @@ -384,9 +391,6 @@ dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int } } return result; return result; } } #ifdef USE_TARGET_OFFLOAD #pragma omp end declare target #endif // #ifdef USE_TARGET_OFFLOAD // #ifdef USE_TARGET_OFFLOAD // #pragma omp begin declare target device_type(any) // #pragma omp begin declare target device_type(any) Loading Loading @@ -1134,7 +1138,7 @@ void hjv( delete[] rfn; delete[] rfn; } } int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { void lucin(dcomplex **am, const np_int nddmst, np_int n, int &ier) { /* NDDMST FIRST DIMENSION OF AM AS DECLARED IN DIMENSION /* NDDMST FIRST DIMENSION OF AM AS DECLARED IN DIMENSION * STATEMENT. * STATEMENT. * N NUMBER OF ROWS IN AM. * N NUMBER OF ROWS IN AM. Loading @@ -1142,24 +1146,22 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { */ */ double *v = new double[nddmst]; double *v = new double[nddmst]; double *vi = new double[nddmst](); double *vi = new double[nddmst](); dcomplex *vec_am = am[0]; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; int ier = 0; ier = 0; int nminus = n - 1; int nminus = n - 1; const np_int nn = n * n; #pragma omp parallel for #pragma omp parallel for (int64_t i = 1; i <= n; i++) { { #pragma omp parallel for reduction(+: vi[i - 1]) #pragma omp for reduction(+: vi[0:nddmst]) for (int64_t j = 1; j <= n; j++) { for (np_int ij = 0; ij < nn; ij++) { vi[i - 1] += ( np_int i = ij / n; real(vec_am[(i - 1) * n + j - 1]) * real(vec_am[(i - 1) * n + j - 1]) np_int j = ij % n; + imag(vec_am[(i - 1) * n + j - 1]) * imag(vec_am[(i - 1) * n + j - 1]) vi[i] += ( real(vec_am[i * n + j]) * real(vec_am[i * n + j]) + imag(vec_am[i * n + j]) * imag(vec_am[i * n + j]) ); ); } } // j1319 loop #pragma omp for v[i - 1] = 1.0 / vi[i - 1]; for (np_int i = 0; i < n; i++) v[i] = 1.0 / vi[i]; } // i1309 loop } // OMP parallel region delete[] vi; // 2. REPLACE AM BY TRIANGULAR MATRICES (L,U) WHERE AM=L*U. // 2. REPLACE AM BY TRIANGULAR MATRICES (L,U) WHERE AM=L*U. // REPLACE L(I,I) BY 1/L(I,I), READY FOR SECTION 4. // REPLACE L(I,I) BY 1/L(I,I), READY FOR SECTION 4. // (ROW INTERCHANGES TAKE PLACE, AND THE INDICES OF THE PIVOTAL ROWS // (ROW INTERCHANGES TAKE PLACE, AND THE INDICES OF THE PIVOTAL ROWS Loading Loading @@ -1193,11 +1195,13 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { v[k - 1] = 1.0 * l; v[k - 1] = 1.0 * l; if (psqmax == 0.0) { if (psqmax == 0.0) { ier = 1; ier = 1; // return ier; delete[] v; return; } } dcomplex ctemp = 1.0 / vec_am[(k - 1) * n + k - 1]; dcomplex ctemp = 1.0 / vec_am[(k - 1) * n + k - 1]; vec_am[(k - 1) * n + k - 1] = ctemp; vec_am[(k - 1) * n + k - 1] = ctemp; if (kplus <= n) { if (kplus <= n) { #pragma omp parallel for for (int64_t j = kplus; j <= n; j++) { for (int64_t j = kplus; j <= n; j++) { dcomplex cfun = cdtp(-vec_am[(k - 1) * n + j - 1], vec_am, k, 1, j, kminus, n); dcomplex cfun = cdtp(-vec_am[(k - 1) * n + j - 1], vec_am, k, 1, j, kminus, n); vec_am[(k - 1) * n + j - 1] = -ctemp * cfun; vec_am[(k - 1) * n + j - 1] = -ctemp * cfun; Loading Loading @@ -1242,9 +1246,7 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { } // i4319 loop } // i4319 loop } } } // l4309 loop } // l4309 loop delete[] vi; delete[] v; delete[] v; return ier; } } void mextc(double vk, double exri, dcomplex **fsac, double **cextlr, double **cext) { void mextc(double vk, double exri, dcomplex **fsac, double **cextlr, double **cext) { Loading Loading
src/libnptm/clu_subs.cpp +244 −242 Original line number Original line Diff line number Diff line Loading @@ -56,22 +56,21 @@ void apc( dcomplex *vec_ac, *vec_gap; dcomplex *vec_ac, *vec_gap; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex uim = 0.0 + 1.0 * I; const dcomplex uim = 0.0 + 1.0 * I; dcomplex uimmp, summ, sume, suem, suee, summp, sumep; // dcomplex uimmp, summ, sume, suem, suee, summp, sumep; dcomplex suemp, sueep; // dcomplex suemp, sueep; double cof = 1.0 / sqk; double cof = 1.0 / sqk; double cimu = cof / sqrt(2.0); double cimu = cof / sqrt(2.0); int nlem = le * (le + 2); int nlem = le * (le + 2); const int nlemt = nlem + nlem; const int nlemt = nlem + nlem; const int nlemf = 2 * nlemt; vec_ac = new dcomplex[2 * nlemt](); vec_ac = new dcomplex[nlemf](); vec_gap = new dcomplex[6](); vec_gap = new dcomplex[6](); #pragma omp parallel for reduction(+: vec_ac[0:nlemf]) #pragma omp parallel for simd for (np_int ij = 0; ij < nlemt * nlemt; ij++) { for (int j45 = 0; j45 < nlemt; j45++) { np_int j45 = ij / nlemt; for (int i45 = 0; i45 < nlemt; i45++) { np_int i45 = ij % nlemt; vec_ac[2 * j45] += (am0m[j45][i45] * w[i45][0]); vec_ac[2 * j45] += (am0m[j45][i45] * w[i45][0]); vec_ac[2 * j45 + 1] += (am0m[j45][i45] * w[i45][1]); vec_ac[2 * j45 + 1] += (am0m[j45][i45] * w[i45][1]); } // ij loop } //i45 loop } //j45 loop for (int imu90 = 1; imu90 <=3; imu90++) { for (int imu90 = 1; imu90 <=3; imu90++) { int mu = imu90 - 2; int mu = imu90 - 2; gapp[imu90 - 1][0] = cc0; gapp[imu90 - 1][0] = cc0; Loading @@ -84,7 +83,7 @@ void apc( if ((l80 == 1 && ilmp == 1) || (l80 == le && ilmp == 3)) continue; // ilmp loop if ((l80 == 1 && ilmp == 1) || (l80 == le && ilmp == 3)) continue; // ilmp loop int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l80 + lmpml; int lmp = l80 + lmpml; uimmp = (-1.0 * lmpml) * uim; dcomplex uimmp = (-1.0 * lmpml) * uim; int impmmmp = lmp * (lmp + 1); int impmmmp = lmp * (lmp + 1); for (int im70 = 1; im70 <= ltpo; im70++) { for (int im70 = 1; im70 <= ltpo; im70++) { int m = im70 - lpo; int m = im70 - lpo; Loading @@ -96,17 +95,18 @@ void apc( int imp = impmmmp + mmp; int imp = impmmmp + mmp; int impe = imp + nlem; int impe = imp + nlem; double cgc = cg1(lmpml, mu, l80, m); double cgc = cg1(lmpml, mu, l80, m); int jpo = 1; int jpo = 2; for (int ipo = 0; ipo < 2; ipo++) { for (int ipo = 1; ipo <= 2; ipo++) { if (ipo == 1) jpo = 0; dcomplex summ, sume, suem, suee, summp, sumep, suemp, sueep; summ = dconjg(vec_ac[2 * (i - 1) + ipo]) * vec_ac[2 * (imp - 1) + ipo]; if (ipo == 2) jpo = 1; sume = dconjg(vec_ac[2 * (i - 1) + ipo]) * vec_ac[2 * (impe - 1) + ipo]; summ = dconjg(vec_ac[2 * (i - 1) + ipo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; suem = dconjg(vec_ac[2 * (ie - 1) + ipo]) * vec_ac[2 * (imp - 1) + ipo]; sume = dconjg(vec_ac[2 * (i - 1) + ipo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; suee = dconjg(vec_ac[2 * (ie - 1) + ipo]) * vec_ac[2 * (impe - 1) + ipo]; suem = dconjg(vec_ac[2 * (ie - 1) + ipo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; summp = dconjg(vec_ac[2 * (i - 1) + jpo]) * vec_ac[2 * (imp - 1) + ipo]; suee = dconjg(vec_ac[2 * (ie - 1) + ipo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; sumep = dconjg(vec_ac[2 * (i - 1) + jpo]) * vec_ac[2 * (impe - 1) + ipo]; summp = dconjg(vec_ac[2 * (i - 1) + jpo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; suemp = dconjg(vec_ac[2 * (ie - 1) + jpo]) * vec_ac[2 * (imp - 1) + ipo]; sumep = dconjg(vec_ac[2 * (i - 1) + jpo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; sueep = dconjg(vec_ac[2 * (ie - 1) + jpo]) * vec_ac[2 * (impe - 1) +ipo]; suemp = dconjg(vec_ac[2 * (ie - 1) + jpo - 1]) * vec_ac[2 * (imp - 1) + ipo - 1]; sueep = dconjg(vec_ac[2 * (ie - 1) + jpo - 1]) * vec_ac[2 * (impe - 1) + ipo - 1]; if (lmpml != 0) { if (lmpml != 0) { summ *= uimmp; summ *= uimmp; sume *= uimmp; sume *= uimmp; Loading @@ -118,7 +118,7 @@ void apc( sueep *= uimmp; sueep *= uimmp; } } // label 55 // label 55 vec_gap[2 * (imu90 - 1) + ipo] += ( vec_gap[2 * (imu90 - 1) + ipo - 1] += ( ( ( summ * zpv[l80 - 1][ilmp - 1][0][0] summ * zpv[l80 - 1][ilmp - 1][0][0] + sume * zpv[l80 - 1][ilmp - 1][0][1] + sume * zpv[l80 - 1][ilmp - 1][0][1] Loading @@ -126,7 +126,7 @@ void apc( + suee * zpv[l80 - 1][ilmp - 1][1][1] + suee * zpv[l80 - 1][ilmp - 1][1][1] ) * cgc ) * cgc ); ); gapp[imu90 - 1][ipo] += ( gapp[imu90 - 1][ipo - 1] += ( ( ( summp * zpv[l80 - 1][ilmp - 1][0][0] summp * zpv[l80 - 1][ilmp - 1][0][0] + sumep * zpv[l80 - 1][ilmp - 1][0][1] + sumep * zpv[l80 - 1][ilmp - 1][0][1] Loading @@ -140,19 +140,20 @@ void apc( } // ilmp loop } // ilmp loop } // l80 loop } // l80 loop } // imu90 loop } // imu90 loop for (int ipo95 = 0; ipo95 < 2; ipo95++) { for (int ipo95 = 1; ipo95 <= 2; ipo95++) { sume = vec_gap[ipo95] * cimu; dcomplex sume, suee, suem, sumep, sueep, suemp; suee = vec_gap[2 + ipo95] * cof; sume = vec_gap[ipo95 - 1] * cimu; suem = vec_gap[4 + ipo95] * cimu; suee = vec_gap[2 + ipo95 - 1] * cof; gapr[0][ipo95] = real(sume - suem); suem = vec_gap[4 + ipo95 - 1] * cimu; gapr[1][ipo95] = real((sume + suem) * uim); gapr[0][ipo95 - 1] = real(sume - suem); gapr[2][ipo95] = real(suee); gapr[1][ipo95 - 1] = real((sume + suem) * uim); sumep = gapp[0][ipo95] * cimu; gapr[2][ipo95 - 1] = real(suee); sueep = gapp[1][ipo95] * cof; sumep = gapp[0][ipo95 - 1] * cimu; suemp = gapp[2][ipo95] * cimu; sueep = gapp[1][ipo95 - 1] * cof; gapp[0][ipo95] = sumep - suemp; suemp = gapp[2][ipo95 - 1] * cimu; gapp[1][ipo95] = (sumep + suemp) * uim; gapp[0][ipo95 - 1] = sumep - suemp; gapp[2][ipo95] = sueep; gapp[1][ipo95 - 1] = (sumep + suemp) * uim; gapp[2][ipo95 - 1] = sueep; } // ipo95 loop } // ipo95 loop // Clean memory // Clean memory delete[] vec_ac; delete[] vec_ac; Loading @@ -165,23 +166,29 @@ void apcra( ) { ) { const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex uim = 0.0 + 1.0 * I; const dcomplex uim = 0.0 + 1.0 * I; // dcomplex uimtl, uimtls, ca11, ca12, ca21, ca22; dcomplex uimtl, uimtls, ca11, ca12, ca21, ca22; // dcomplex a11, a12, a21, a22, fc; dcomplex a11, a12, a21, a22, sum1, sum2, fc; double *vec_svw = new double[le * 12](); double ****svw = new double***[le]; dcomplex *vec_svs = new dcomplex[le * 12](); dcomplex ****svs = new dcomplex***[le]; dcomplex sum1 = cc0; for (int i = 0; i < le; i++) { dcomplex sum2 = cc0; svw[i] = new double**[3]; svs[i] = new dcomplex**[3]; for (int j = 0; j < 3; j++) { svw[i][j] = new double*[2]; svs[i][j] = new dcomplex*[2]; for (int k = 0; k < 2; k++) { svw[i][j][k] = new double[2](); svs[i][j][k] = new dcomplex[2](); } } } int nlem = le * (le + 2); int nlem = le * (le + 2); #pragma omp parallel { #pragma omp for for (int l28 = 1; l28 <= le; l28++) { for (int l28 = 1; l28 <= le; l28++) { int lpo = l28 + 1; int lpo = l28 + 1; int ltpo = lpo + l28; int ltpo = lpo + l28; double fl = sqrt(1.0 * ltpo); double fl = sqrt(1.0 * ltpo); for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { if ((l28 == 1 && ilmp == 1) || (l28 == le && ilmp == 3)) continue; // ilmp loop if ((l28 == 1 && ilmp == 1) || (l28 == le && ilmp == 3)) continue; // ilmp loop const int svw_start = 12 * (l28 - 1) + 4 * (ilmp - 1); int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l28 + lmpml; int lmp = l28 + lmpml; double flmp = sqrt(1.0 * (lmp + lmp + 1)); double flmp = sqrt(1.0 * (lmp + lmp + 1)); Loading @@ -191,40 +198,38 @@ void apcra( if (inpol == 0) { if (inpol == 0) { double cgs = cgmpo + cgmmo; double cgs = cgmpo + cgmmo; double cgd = cgmpo - cgmmo; double cgd = cgmpo - cgmmo; vec_svw[svw_start] = cgs; svw[l28 - 1][ilmp - 1][0][0] = cgs; vec_svw[svw_start + 1] = cgd; svw[l28 - 1][ilmp - 1][0][1] = cgd; vec_svw[svw_start + 2] = cgd; svw[l28 - 1][ilmp - 1][1][0] = cgd; vec_svw[svw_start + 3] = cgs; svw[l28 - 1][ilmp - 1][1][1] = cgs; } else { // label 22 } else { // label 22 vec_svw[svw_start] = cgmpo; svw[l28 - 1][ilmp - 1][0][0] = cgmpo; vec_svw[svw_start + 2] = cgmpo; svw[l28 - 1][ilmp - 1][1][0] = cgmpo; vec_svw[svw_start + 1] = -cgmmo; svw[l28 - 1][ilmp - 1][0][1] = -cgmmo; vec_svw[svw_start + 3] = cgmmo; svw[l28 - 1][ilmp - 1][1][1] = cgmmo; } } // label 26 // label 26 } // ilmp loop } // ilmp loop } // l28 parallel loop } // l28 loop // for (int l30 = 1; l30 <= le; l30++) { // 0-init: can be omitted for (int l30 = 1; l30 <= le; l30++) { // 0-init: can be omitted // for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { // for (int ipa = 1; ipa <= 2; ipa++) { for (int ipa = 1; ipa <= 2; ipa++) { // for (int ipamp = 1; ipamp <= 2; ipamp++) { for (int ipamp = 1; ipamp <= 2; ipamp++) { // vec_svs[12 * (l30 - 1) + 4 * (ilmp - 1) + 2 * (ipa - 1) + ipamp - 1] = cc0; svs[l30 - 1][ilmp - 1][ipa - 1][ipamp - 1] = cc0; // } } // } // ipa loop } // ipa loop // } // ilmp loop } // ilmp loop // } // l30 loop } // l30 loop #pragma omp for reduction(+: vec_svs[0:12*le]) for (int l58 = 1; l58 <= le; l58 ++) { for (int l58 = 1; l58 <= le; l58 ++) { int lpo = l58 + 1; int lpo = l58 + 1; int ltpo = l58 + lpo; int ltpo = l58 + lpo; int imm = l58 * lpo; int imm = l58 * lpo; for (int ilmp = 1; ilmp <= 3; ilmp++) { for (int ilmp = 1; ilmp <= 3; ilmp++) { if ((l58 == 1 && ilmp == 1) || (l58 == le && ilmp == 3)) continue; // ilmp loop if ((l58 == 1 && ilmp == 1) || (l58 == le && ilmp == 3)) continue; // ilmp loop const int svs_start = 12 * (l58 - 1) + 4 * (ilmp - 1); int lmpml = ilmp - 2; int lmpml = ilmp - 2; int lmp = l58 + lmpml; int lmp = l58 + lmpml; int impmm = lmp * (lmp + 1); int impmm = lmp * (lmp + 1); dcomplex uimtl = uim * (1.0 * lmpml); uimtl = uim * (1.0 * lmpml); if (lmpml == 0) uimtl = 1.0 + 0.0 * I; if (lmpml == 0) uimtl = 1.0 + 0.0 * I; for (int im54 = 1; im54 <= ltpo; im54++) { for (int im54 = 1; im54 <= ltpo; im54++) { int m = im54 - lpo; int m = im54 - lpo; Loading @@ -247,7 +252,7 @@ void apcra( int lsmpml = ilsmp - 2; int lsmpml = ilsmp - 2; int lsmp = ls + lsmpml; int lsmp = ls + lsmpml; int ismpmm = lsmp * (lsmp + 1); int ismpmm = lsmp * (lsmp + 1); dcomplex uimtls = -uim * (1.0 * lsmpml); uimtls = -uim * (1.0 * lsmpml); if (lsmpml == 0) uimtls = 1.0 + 0.0 * I; if (lsmpml == 0) uimtls = 1.0 + 0.0 * I; for (int ims = 1; ims <= lstpo; ims++) { for (int ims = 1; ims <= lstpo; ims++) { int ms = ims - lspo; int ms = ims - lspo; Loading @@ -259,43 +264,35 @@ void apcra( int ismp = ismpmm + msmp; int ismp = ismpmm + msmp; int ismpe = ismp + nlem; int ismpe = ismp + nlem; double cgcs = cg1(lsmpml, mu, ls, ms); double cgcs = cg1(lsmpml, mu, ls, ms); dcomplex fc = (uimtl * uimtls) * (cgc * cgcs); fc = (uimtl * uimtls) * (cgc * cgcs); dcomplex ca11 = dconjg(am0m[is - 1][i - 1]); ca11 = dconjg(am0m[is - 1][i - 1]); dcomplex ca12 = dconjg(am0m[is - 1][ie - 1]); ca12 = dconjg(am0m[is - 1][ie - 1]); dcomplex ca21 = dconjg(am0m[ise - 1][i - 1]); ca21 = dconjg(am0m[ise - 1][i - 1]); dcomplex ca22 = dconjg(am0m[ise - 1][ie - 1]); ca22 = dconjg(am0m[ise - 1][ie - 1]); dcomplex a11 = am0m[ismp - 1][imp - 1]; a11 = am0m[ismp - 1][imp - 1]; dcomplex a12 = am0m[ismp - 1][impe - 1]; a12 = am0m[ismp - 1][impe - 1]; dcomplex a21 = am0m[ismpe - 1][imp - 1]; a21 = am0m[ismpe - 1][imp - 1]; dcomplex a22 = am0m[ismpe - 1][impe - 1]; a22 = am0m[ismpe - 1][impe - 1]; double z11 = zpv[ls - 1][ilsmp - 1][0][0]; double z11 = zpv[ls - 1][ilsmp - 1][0][0]; double z12 = zpv[ls - 1][ilsmp - 1][0][1]; double z12 = zpv[ls - 1][ilsmp - 1][0][1]; double z21 = zpv[ls - 1][ilsmp - 1][1][0]; double z21 = zpv[ls - 1][ilsmp - 1][1][0]; double z22 = zpv[ls - 1][ilsmp - 1][1][1]; double z22 = zpv[ls - 1][ilsmp - 1][1][1]; vec_svs[svs_start] += ( svs[l58 - 1][ilmp - 1][0][0] += ((ca11 * a11 * z11 ( + ca11 * a21 * z12 ca11 * a11 * z11 + ca11 * a21 * z12 + ca21 * a11 * z21 + ca21 * a11 * z21 + ca21 * a21 * z22 + ca21 * a21 * z22) * fc); ) * fc svs[l58 - 1][ilmp - 1][0][1] += ((ca11 * a12 * z11 ); + ca11 * a22 * z12 vec_svs[svs_start + 1] += ( + ca21 * a12 * z21 ( + ca21 * a22 * z22) * fc); ca11 * a12 * z11 + ca11 * a22 * z12 svs[l58 - 1][ilmp - 1][1][0] += ((ca12 * a11 * z11 + ca21 * a12 * z21 + ca21 * a22 * z22 + ca12 * a21 * z12 ) * fc + ca22 * a11 * z21 ); + ca22 * a21 * z22) * fc); vec_svs[svs_start + 2] += ( svs[l58 - 1][ilmp - 1][1][1] += ((ca12 * a12 * z11 ( + ca12 * a22 * z12 ca12 * a11 * z11 + ca12 * a21 * z12 + ca22 * a12 * z21 + ca22 * a11 * z21 + ca22 * a21 * z22 + ca22 * a22 * z22) * fc); ) * fc ); vec_svs[svs_start + 3] += ( ( ca12 * a12 * z11 + ca12 * a22 * z12 + ca22 * a12 * z21 + ca22 * a22 * z22 ) * fc ); } // ends ims loop } // ends ims loop } // ims loop } // ims loop } // ilsmp loop } // ilsmp loop Loading @@ -305,7 +302,8 @@ void apcra( } // im54 loop } // im54 loop } // ilmp loop } // ilmp loop } // l58 loop } // l58 loop #pragma omp for reduction(+: sum1, sum2) sum1 = cc0; sum2 = cc0; for (int l68 = 1; l68 <= le; l68++) { for (int l68 = 1; l68 <= le; l68++) { //int lpo = l68 + 1; //int lpo = l68 + 1; //int ltpo = l68 + lpo; //int ltpo = l68 + lpo; Loading @@ -314,34 +312,33 @@ void apcra( if ((l68 == 1 && ilmp == 1) || (l68 == le && ilmp == 3)) continue; // ilmp loop if ((l68 == 1 && ilmp == 1) || (l68 == le && ilmp == 3)) continue; // ilmp loop if (inpol == 0) { if (inpol == 0) { sum1 += ( sum1 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][1][1] ); ); sum2 += ( sum2 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][1][1] ); ); } else { // label 62 } else { // label 62 sum1 += ( sum1 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1)] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][0][0] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][1][0] * svs[l68 - 1][ilmp - 1][1][1] ); ); sum2 += ( sum2 += ( vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1)] svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][0][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][0][1] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 1] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 2] + svw[l68 - 1][ilmp - 1][0][1] * svs[l68 - 1][ilmp - 1][1][0] + vec_svw[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] * vec_svs[12 * (l68 - 1) + 4 * (ilmp - 1) + 3] + svw[l68 - 1][ilmp - 1][1][1] * svs[l68 - 1][ilmp - 1][1][1] ); ); } // label 66, ends ilmp loop } // label 66, ends ilmp loop } // ilmp loop } // ilmp loop } // l68 loop } // l68 loop } // OMP parallel region const double half_pi = acos(0.0); const double half_pi = acos(0.0); double cofs = half_pi * 2.0 / sqk; double cofs = half_pi * 2.0 / sqk; gaprm[0][0] = 0.0; gaprm[0][0] = 0.0; Loading @@ -366,14 +363,24 @@ void apcra( gappm[2][0] = cc0; gappm[2][0] = cc0; gappm[2][1] = cc0; gappm[2][1] = cc0; } } // Clean memory // Clean memory delete[] vec_svw; for (int i = le - 1; i > -1; i--) { delete[] vec_svs; for (int j = 2; j > -1; j--) { for (int k = 1; k > -1; k--) { delete[] svw[i][j][k]; delete[] svs[i][j][k]; } delete[] svw[i][j]; delete[] svs[i][j]; } delete[] svw[i]; delete[] svs[i]; } delete[] svw; delete[] svs; } } #ifdef USE_TARGET_OFFLOAD #pragma omp begin declare target device_type(any) #endif dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int istep) { dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int istep) { dcomplex result = z; dcomplex result = z; if (nj > 0) { if (nj > 0) { Loading @@ -384,9 +391,6 @@ dcomplex cdtp(dcomplex z, dcomplex *vec_am, int i, int jf, int k, int nj, np_int } } return result; return result; } } #ifdef USE_TARGET_OFFLOAD #pragma omp end declare target #endif // #ifdef USE_TARGET_OFFLOAD // #ifdef USE_TARGET_OFFLOAD // #pragma omp begin declare target device_type(any) // #pragma omp begin declare target device_type(any) Loading Loading @@ -1134,7 +1138,7 @@ void hjv( delete[] rfn; delete[] rfn; } } int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { void lucin(dcomplex **am, const np_int nddmst, np_int n, int &ier) { /* NDDMST FIRST DIMENSION OF AM AS DECLARED IN DIMENSION /* NDDMST FIRST DIMENSION OF AM AS DECLARED IN DIMENSION * STATEMENT. * STATEMENT. * N NUMBER OF ROWS IN AM. * N NUMBER OF ROWS IN AM. Loading @@ -1142,24 +1146,22 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { */ */ double *v = new double[nddmst]; double *v = new double[nddmst]; double *vi = new double[nddmst](); double *vi = new double[nddmst](); dcomplex *vec_am = am[0]; const dcomplex cc0 = 0.0 + 0.0 * I; const dcomplex cc0 = 0.0 + 0.0 * I; int ier = 0; ier = 0; int nminus = n - 1; int nminus = n - 1; const np_int nn = n * n; #pragma omp parallel for #pragma omp parallel for (int64_t i = 1; i <= n; i++) { { #pragma omp parallel for reduction(+: vi[i - 1]) #pragma omp for reduction(+: vi[0:nddmst]) for (int64_t j = 1; j <= n; j++) { for (np_int ij = 0; ij < nn; ij++) { vi[i - 1] += ( np_int i = ij / n; real(vec_am[(i - 1) * n + j - 1]) * real(vec_am[(i - 1) * n + j - 1]) np_int j = ij % n; + imag(vec_am[(i - 1) * n + j - 1]) * imag(vec_am[(i - 1) * n + j - 1]) vi[i] += ( real(vec_am[i * n + j]) * real(vec_am[i * n + j]) + imag(vec_am[i * n + j]) * imag(vec_am[i * n + j]) ); ); } } // j1319 loop #pragma omp for v[i - 1] = 1.0 / vi[i - 1]; for (np_int i = 0; i < n; i++) v[i] = 1.0 / vi[i]; } // i1309 loop } // OMP parallel region delete[] vi; // 2. REPLACE AM BY TRIANGULAR MATRICES (L,U) WHERE AM=L*U. // 2. REPLACE AM BY TRIANGULAR MATRICES (L,U) WHERE AM=L*U. // REPLACE L(I,I) BY 1/L(I,I), READY FOR SECTION 4. // REPLACE L(I,I) BY 1/L(I,I), READY FOR SECTION 4. // (ROW INTERCHANGES TAKE PLACE, AND THE INDICES OF THE PIVOTAL ROWS // (ROW INTERCHANGES TAKE PLACE, AND THE INDICES OF THE PIVOTAL ROWS Loading Loading @@ -1193,11 +1195,13 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { v[k - 1] = 1.0 * l; v[k - 1] = 1.0 * l; if (psqmax == 0.0) { if (psqmax == 0.0) { ier = 1; ier = 1; // return ier; delete[] v; return; } } dcomplex ctemp = 1.0 / vec_am[(k - 1) * n + k - 1]; dcomplex ctemp = 1.0 / vec_am[(k - 1) * n + k - 1]; vec_am[(k - 1) * n + k - 1] = ctemp; vec_am[(k - 1) * n + k - 1] = ctemp; if (kplus <= n) { if (kplus <= n) { #pragma omp parallel for for (int64_t j = kplus; j <= n; j++) { for (int64_t j = kplus; j <= n; j++) { dcomplex cfun = cdtp(-vec_am[(k - 1) * n + j - 1], vec_am, k, 1, j, kminus, n); dcomplex cfun = cdtp(-vec_am[(k - 1) * n + j - 1], vec_am, k, 1, j, kminus, n); vec_am[(k - 1) * n + j - 1] = -ctemp * cfun; vec_am[(k - 1) * n + j - 1] = -ctemp * cfun; Loading Loading @@ -1242,9 +1246,7 @@ int lucin(dcomplex *vec_am, const np_int nddmst, np_int n) { } // i4319 loop } // i4319 loop } } } // l4309 loop } // l4309 loop delete[] vi; delete[] v; delete[] v; return ier; } } void mextc(double vk, double exri, dcomplex **fsac, double **cextlr, double **cext) { void mextc(double vk, double exri, dcomplex **fsac, double **cextlr, double **cext) { Loading