Loading src/cluster/cluster.cpp +317 −3 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ void cluster() { const int ndi = c4->nsph * c4->nlim; C9 *c9 = new C9(ndi, c4->nlem, 2 * ndi, 2 * c4->nlem); double *gaps = new double[nsph](); double *tqev = new double[3](); double *tqsv = new double[3](); double **tqse, **tqss, **tqce, **tqcs; complex<double> **tqspe, **tqsps, **tqcpe, **tqcps; tqse = new double*[2]; Loading @@ -114,6 +116,7 @@ void cluster() { tqcs[ti] = new double[3](); tqcps[ti] = new complex<double>[3](); } double *gapv = new double[3](); complex<double> **gapp, **gappm; double **gap, **gapm; gapp = new complex<double>*[3]; Loading @@ -140,11 +143,16 @@ void cluster() { double *args = new double[1](); double *duk = new double[3](); double **cextlr, **cext; double **cmullr, **cmul; cextlr = new double*[4]; cext = new double*[4]; cmullr = new double*[4];; cmul = new double*[4]; for (int ci = 0; ci < 4; ci++) { cextlr[ci] = new double[4](); cext[ci] = new double[4](); cmullr[ci] = new double[4](); cmul[ci] = new double[4](); } int isq, ibf; double scan, cfmp, sfmp, cfsp, sfsp; Loading Loading @@ -558,12 +566,311 @@ void cluster() { fprintf(output, " COSAV=%15.7lE, RAPRS=%15.7lE\n", cosav, rapr); fprintf(output, " Fk=%15.7lE\n", fz); } // ilr210 loop // from RMBRIF double rmbrif = (c1ao->fsacm[0][0].real() - c1ao->fsacm[1][1].real()) / c1ao->fsacm[0][0].real(); double rmdchr = (c1ao->fsacm[0][0].imag() - c1ao->fsacm[1][1].imag()) / c1ao->fsacm[0][0].imag(); fprintf(output, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", rmbrif); fprintf(output, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", rmdchr); } // label 212 } // jphs loop } // jths loop fprintf(output, "********** JTH =%3d, JPH =%3d, JTHS =%3d, JPHS =%3d ********************\n", jth486, jph484, jths, jphs); fprintf(output, " TIDG=%10.3lE, PIDG=%10.3lE, TSDG=%10.3lE, PSDG=%10.3lE\n", th, ph, ths, phs); fprintf(output, " SCAND=%10.3lE\n", scan); fprintf(output, " CFMP=%15.7lE, SFMP=%15.7lE\n", cfmp, sfmp); fprintf(output, " CFSP=%15.7lE, SFSP=%15.7lE\n", cfsp, sfsp); if (isam >= 0) { fprintf(output, " UNI=(%12.5lE,%12.5lE,%12.5lE)\n", un[0], un[1], un[2]); fprintf(output, " UNS=(%12.5lE,%12.5lE,%12.5lE)\n", uns[0], uns[1], uns[2]); } else { // label 214 fprintf(output, " UN=(%12.5lE,%12.5lE,%12.5lE)\n\n", un[0], un[1], un[2]); } // label 220 if (inpol == 0) { fprintf(output, " LIN\n"); } else { // label 222 fprintf(output, " CIRC\n"); } // label 224 scr2(vk, vkarg, exri, duk, c1, c1ao, c3, c4); if (c4->li != c4->le) fprintf(output, " SPHERES; LMX=MIN0(LI,LE)\n"); for (int i226 = 1; i226 <= nsph; i226++) { if (c1->iog[i226 - 1] >= i226) { fprintf(output, " SPHERE %2d\n", i226); fprintf( output, " SAS(1,1)=%15.7lE%15.7lE, SAS(2,1)=%15.7lE%15.7lE\n", c1->sas[i226 - 1][0][0].real(), c1->sas[i226 - 1][0][0].imag(), c1->sas[i226 - 1][1][0].real(), c1->sas[i226 - 1][1][0].imag() ); fprintf( output, " SAS(1,2)=%15.7lE%15.7lE, SAS(2,2)=%15.7lE%15.7lE\n", c1->sas[i226 - 1][0][1].real(), c1->sas[i226 - 1][0][1].imag(), c1->sas[i226 - 1][1][1].real(), c1->sas[i226 - 1][1][1].imag() ); for (int j225 = 0; j225 < 16; j225++) { // QUESTION: check that 16 is a fixed dimension c1ao->vint[j225] = c1ao->vints[i226 - 1][j225]; } // j225 loop mmulc(c1ao->vint, cmullr, cmul); fprintf(output, " MULS\n"); for (int i1 = 0; i1 < 4; i1++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i1][0], cmul[i1][1], cmul[i1][2], cmul[i1][3] ); } // i1 loop fprintf(output, " MULSLR\n"); for (int i1 = 0; i1 < 4; i1++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i1][0], cmullr[i1][1], cmullr[i1][2], cmullr[i1][3] ); } // i1 loop } } // i226 loop fprintf( output, " SAT(1,1)=%15.7lE%15.7lE, SAT(2,1)=%15.7lE%15.7lE\n", c3->tsas[0][0].real(), c3->tsas[0][0].imag(), c3->tsas[1][0].real(), c3->tsas[1][0].imag() ); fprintf( output, " SAT(1,2)=%15.7lE%15.7lE, SAT(2,2)=%15.7lE%15.7lE\n", c3->tsas[0][1].real(), c3->tsas[0][1].imag(), c3->tsas[1][1].real(), c3->tsas[1][1].imag() ); fprintf(output, " CLUSTER\n"); pcros(vk, exri, c1, c1ao, c4); mextc(vk, exri, c1ao->fsac, cextlr, cext); mmulc(c1ao->vint, cmullr, cmul); if (jw != 0) { jw = 0; // Some implicit loops writing to binary. for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cext[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { double value = c1ao->scsc[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->scscp[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->scscp[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecsc[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecscp[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecscp[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { double value = gap[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = gapp[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = gapp[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { double value = tqce[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcpe[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcpe[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { double value = tqcs[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcps[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcps[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 3; i++) { double value = u[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = up[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = un[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } // label 254 for (int i = 0; i < 16; i++) { double value = c1ao->vint[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->vint[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cmul[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } int jlr = 2; for (int ilr290 = 1; ilr290 <= 2; ilr290++) { int ipol = (ilr290 % 2 == 0) ? 1 : -1; if (ilr290 == 2) jlr = 1; double extsec = c1ao->ecsc[ilr290 - 1]; double qext = extsec * sqsfi / c3->gcs; double extrat = extsec / c3->ecs; double scasec = c1ao->scsc[ilr290 - 1]; double albedc = scasec / extsec; double qsca = scasec * sqsfi / c3->gcs; double scarat = scasec / c3->scs; double abssec = extsec - scasec; double qabs = abssec * sqsfi / c3->gcs; double absrat = 1.0; double ratio = c3->acs / c3->ecs; if (ratio < -1.0e-6 || ratio > 1.0e-6) absrat = abssec / c3->acs; s0 = c1ao->fsac[ilr290 - 1][ilr290 - 1] * exri; double qschu = s0.imag() * csch; double pschu = s0.real() * csch; s0mag = sqrt((s0.real() + s0.imag()) * (s0.real() - s0.imag())) * cs0; double refinr = c1ao->fsac[ilr290 - 1][ilr290 - 1].real() / c3->tfsas.real(); double extcor = c1ao->fsac[ilr290 - 1][ilr290 - 1].imag() / c3->tfsas.imag(); if (inpol == 0) { fprintf(output, " LIN %2d\n", ipol); } else { // label 273 fprintf(output, " CIRC %2d\n", ipol); } // label 275 fprintf(output, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE%15.7lE\n", scasec, abssec, extsec, albedc ); fprintf(output, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE\n", qsca, qabs, qext ); fprintf(output, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE\n", scarat, absrat, extrat ); fprintf( output, " FSAC(%1d,%1d)=%15.7lE%15.7lE FSAC(%1d,%1d)=%15.7lE%15.7lE\n", ilr290, ilr290, c1ao->fsac[ilr290 - 1][ilr290 - 1].real(), c1ao->fsac[ilr290 - 1][ilr290 - 1].imag(), jlr, ilr290, c1ao->fsac[jlr - 1][ilr290 - 1].real(), c1ao->fsac[jlr - 1][ilr290 - 1].imag() ); fprintf( output, " SAC(%1d,%1d)=%15.7lE%15.7lE SAC(%1d,%1d)=%15.7lE%15.7lE\n", ilr290, ilr290, c1ao->sac[ilr290 - 1][ilr290 - 1].real(), c1ao->sac[ilr290 - 1][ilr290 - 1].imag(), jlr, ilr290, c1ao->sac[jlr - 1][ilr290 - 1].real(), c1ao->sac[jlr - 1][ilr290 - 1].imag() ); fprintf( output, " RE(FSAC(%1d,%1d))/RE(TFSAS)=%15.7lE, IM(FSAC(%1d,%1d))/IM(TFSAS)=%15.7lE\n", ilr290, ilr290, refinr, ilr290, ilr290, extcor ); fprintf( output, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", qschu, pschu, s0mag ); bool goto190 = isam >= 0 && (jths > 1 || jphs > 1); if (!goto190) { gapv[0] = gap[0][ilr290 - 1]; gapv[1] = gap[1][ilr290 - 1]; gapv[2] = gap[2][ilr290 - 1]; double extins = c1ao->ecsc[ilr290 - 1]; double scatts = c1ao->scsc[ilr290 - 1]; double rapr, cosav, fp, fn, fk, fx, fy, fz; rftr(u, up, un, gapv, extins, scatts, rapr, cosav, fp, fn, fk, fx, fy, fz); fprintf(output, " COSAV=%15.7lE, RAPRS=%15.7lE\n", cosav, rapr); fprintf(output, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", fp, fn, fk); fprintf(output, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", fx, fy, fz); tqev[0] = tqce[ilr290 - 1][0]; tqev[1] = tqce[ilr290 - 1][1]; tqev[2] = tqce[ilr290 - 1][2]; tqsv[0] = tqcs[ilr290 - 1][0]; tqsv[1] = tqcs[ilr290 - 1][1]; tqsv[2] = tqcs[ilr290 - 1][2]; double tep, ten, tek, tsp, tsn, tsk; tqr(u, up, un, tqev, tqsv, tep, ten, tek, tsp, tsn, tsk); fprintf(output, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", tep, ten, tek); fprintf(output, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", tsp, tsn, tsk); fprintf( output, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", tqce[ilr290 - 1][0], tqce[ilr290 - 1][1], tqce[ilr290 - 1][2] ); fprintf( output, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", tqcs[ilr290 - 1][0], tqcs[ilr290 - 1][1], tqcs[ilr290 - 1][2] ); } } //ilr290 loop double rbirif = (c1ao->fsac[0][0].real() - c1ao->fsac[1][1].real()) / c1ao->fsac[0][0].real(); double rdichr = (c1ao->fsac[0][0].imag() - c1ao->fsac[1][1].imag()) / c1ao->fsac[0][0].imag(); fprintf(output, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", rbirif); fprintf(output, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", rdichr); fprintf(output, " MULC\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i][0], cmul[i][1], cmul[i][2], cmul[i][3] ); } fprintf(output, " MULCLR\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i][0], cmullr[i][1], cmullr[i][2], cmullr[i][3] ); } if (iavm != 0) { mmulc(c1ao->vintm, cmullr, cmul); // Some implicit loops writing to binary. for (int i = 0; i < 16; i++) { double value; value = c1ao->vintm[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->vintm[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cmul[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } fprintf(output, " CLUSTER (ENSEMBLE AVERAGE, MODE%2d)\n", iavm); if (inpol == 0) { fprintf(output, " LIN\n"); } else { // label 316 fprintf(output, " CIRC\n"); } // label 318 fprintf(output, " MULC\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i][0], cmul[i][1], cmul[i][2], cmul[i][3] ); } fprintf(output, " MULCLR\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i][0], cmullr[i][1], cmullr[i][2], cmullr[i][3] ); } } // label 420, continues jphs loop if (isam < 1) phs += phsstp; } // jphs loop, labeled 480 if (isam <= 1) thsl += thsstp; } // jths loop, labeled 482 ph += phstp; } // jph484 loop th += thstp; } // jth486 loop printf("INFO: done jxi488 iteration.\n"); } // jxi488 loop Loading Loading @@ -609,6 +916,8 @@ void cluster() { delete[] tqcpe; delete[] tqcs; delete[] tqcps; delete[] tqev; delete[] tqsv; for (int gi = 2; gi > -1; gi--) { delete[] gapp[gi]; delete[] gappm[gi]; Loading @@ -619,6 +928,7 @@ void cluster() { delete[] gappm; delete[] gap; delete[] gapm; delete[] gapv; delete[] u; delete[] us; delete[] un; Loading @@ -635,9 +945,13 @@ void cluster() { for (int ci = 3; ci > -1; ci--) { delete[] cextlr[ci]; delete[] cext[ci]; delete[] cmullr[ci]; delete[] cmul[ci]; } delete[] cextlr; delete[] cext; delete[] cmullr; delete[] cmul; } else { // NSPH mismatch between geometry and scatterer configurations. throw UnrecognizedConfigurationException( "Inconsistent geometry and scatterer configurations." Loading src/include/Commons.h +4 −0 Original line number Diff line number Diff line Loading @@ -238,8 +238,12 @@ public: //! \brief QUESTION: definition? std::complex<double> **fsacm; //! \brief QUESTION: definition? double *scsc; //! \brief QUESTION: definition? std::complex<double> *scscp; //! \brief QUESTION: definition? double *ecsc; //! \brief QUESTION: definition? double *ecscm; //! \brief QUESTION: definition? double *scscm; Loading src/include/clu_subs.h +221 −18 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ extern void rabas( ); extern void rbf(int n, double x, int &nm, double sj[]); extern void rnf(int n, double x, int &nm, double sy[]); extern void mmulc(std::complex<double> *vint, double **cmullr, double **cmul); extern void sphar(double cth, double sth, double cph, double sph, int lm, std::complex<double> *ylm); extern void thdps(int lm, double ****zpv); extern void upvmp( Loading @@ -57,7 +58,6 @@ extern void wmasp( int nsph, double *argi, double *args, C1 *c1 ); // >>> END OF SPH_SUBS DECLARATION <<< void logmat(std::complex<double> **mat, int rows, int cols); /*! \brief C++ porting of CDTP * Loading Loading @@ -1415,6 +1415,74 @@ void mextc(double vk, double exri, std::complex<double> **fsac, double **cextlr, } } /*! \brief C++ porting of PCROS * * This function is intended to evaluate the particle cross-section. QUESTIUON: correct? * \param vk: `double` * \param exri: `double` * \param c1: `C1 *` * \param c1ao: `C1_AddOns *` * \param c4: `C4 *` */ void pcros(double vk, double exri, C1 *c1, C1_AddOns *c1ao, C4 *c4) { const std::complex<double> cc0(0.0, 0.0); std::complex<double> sump, sum1, sum2, sum3, sum4, am, amp, cc, csam; const double exdc = exri * exri; double ccs = 1.0 / (vk * vk); double cccs = ccs / exdc; csam = -(ccs / (exri * vk)) * std::complex<double>(0.0, 0.5); const double pi4sq = 64.0 * acos(0.0) * acos(0.0); double cfsq =4.0 / (pi4sq *ccs * ccs); const int nlemt = c4->nlem + c4->nlem; int jpo = 2; for (int ipo18 = 1; ipo18 <= 2; ipo18++) { if (ipo18 == 2) jpo = 1; int ipopt = ipo18 + 2; int jpopt = jpo + 2; double sum = 0.0; sump = cc0; sum1 = cc0; sum2 = cc0; sum3 = cc0; sum4 = cc0; for (int i12 = 1; i12 <= nlemt; i12++) { int i = i12 - 1; am = cc0; amp = cc0; for (int j10 = 1; j10 <= nlemt; j10++) { int j = j10 - 1; am += (c1ao->am0m[i][j] * c1->w[j][ipo18 - 1]); amp += (c1ao->am0m[i][j] * c1->w[j][jpo - 1]); } // j10 loop sum += (dconjg(am) * am).real(); sump += (dconjg(amp) * amp); sum1 += (dconjg(c1->w[i][ipo18 - 1]) * am); sum2 += (dconjg(c1->w[i][jpo - 1]) * am); sum3 += (c1->w[i][ipopt - 1] * am); sum4 += (c1->w[i][jpopt - 1] * am); } // i12 loop c1ao->scsc[ipo18 - 1] = cccs * sum; c1ao->scscp[ipo18 - 1] = cccs * sump; c1ao->ecsc[ipo18 - 1] = -cccs * sum1.real(); c1ao->ecscp[ipo18 - 1] = -cccs * sum2; c1ao->fsac[ipo18 - 1][ipo18 - 1] = csam * sum1; c1ao->fsac[jpo - 1][ipo18 - 1] = csam * sum2; c1ao->sac[ipo18 - 1][ipo18 - 1] = csam * sum3; c1ao->sac[jpo - 1][ipo18 - 1] = csam * sum4; } // ipo18 loop int i = 0; for (int ipo1 = 1; ipo1 <= 2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c1ao->sac[jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2 ++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { c1ao->vint[i++] = c1ao->sac[jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } /*! \brief C++ porting of PCRSM0 * * \param vk: `double` Loading Loading @@ -1800,6 +1868,39 @@ void raba( delete[] ctqcs; } /*! \brief C++ porting of RFTR * * \param u: `double *` * \param up: `double *` * \param un: `double *` * \param gapv: `double *` * \param extins: `double` * \param scatts: `double` * \param rapr: `double &` * \param cosav: `double &` * \param fp: `double &` * \param fn: `double &` * \param fk: `double &` * \param fx: `double &` * \param fy: `double &` * \param fz: `double &` */ void rftr( double *u, double *up, double *un, double *gapv, double extins, double scatts, double &rapr, double &cosav, double &fp, double &fn, double &fk, double &fx, double &fy, double &fz ) { fk = u[0] * gapv[0] + u[1] * gapv[1] + u[2] * gapv[2]; rapr = extins - fk; cosav = fk / scatts; fp = -(up[0] * gapv[0] + up[1] * gapv[1] + up[2] * gapv[2]); fn = -(un[0] * gapv[0] + un[1] * gapv[1] + un[2] * gapv[2]); fk = rapr; fx = u[0] * extins - gapv[0]; fy = u[1] * extins - gapv[1]; fz = u[2] * extins - gapv[2]; } /*! \brief C++ porting of SCR0 * * \param vk: `double` QUESTION: definition? Loading Loading @@ -1852,6 +1953,99 @@ void scr0(double vk, double exri, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 * c4) { } // i14 loop } /*! \brief C++ porting of SCR2 * * \param vk: `double` QUESTION: definition? * \param vkarg: `double` QUESTION: definition? * \param exri: `double` External medium refractive index * \param duk: `double *` QUESTION: definition? * \param c1: `C1 *` Pointer to a C1 instance. * \param c1ao: `C1_AddOns *` Pointer to C1_AddOns instance. * \param c3: `C3 *` Pointer to a C3 instance. * \param c4: `C4 *` Pointer to a C4 structure. */ void scr2( double vk, double vkarg, double exri, double *duk, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 *c4) { const std::complex<double> cc0(0.0, 0.0); const std::complex<double> uim(0.0, 1.0); std::complex<double> s11, s21, s12, s22, rm, re, csam, cph, phas, cc; double ccs = 1.0 / (vk * vk); csam = -(ccs / (exri * vk)) * std::complex<double>(0.0, 0.5); const double pi4sq = 64.0 * acos(0.0) * acos(0.0); double cfsq = 4.0 / (pi4sq * ccs * ccs); cph = uim * exri * vkarg; int ls = (c4->li < c4->le) ? c4->li : c4->le; c3->tsas[0][0] = cc0; c3->tsas[1][0] = cc0; c3->tsas[0][1] = cc0; c3->tsas[1][1] = cc0; for (int i14 = 1; i14 <= c4->nsph; i14++) { int i = i14 - 1; int iogi = c1->iog[i14 - 1]; if (iogi >= i14) { int k = 0; s11 = cc0; s21 = cc0; s12 = cc0; s22 = cc0; for (int l10 = 1; l10 <= ls; l10++) { int l = l10 - 1; rm = 1.0 / c1->rmi[l][i]; re = 1.0 / c1->rei[l][i]; int ltpo = l10 + l10 + 1; for (int im10 = 1; im10 <= ltpo; im10++) { k++; int ke = k + c4->nlem; s11 -= (c1->w[k - 1][2] * c1->w[k - 1][0] * rm + c1->w[ke - 1][2] * c1->w[ke - 1][0] * re); s21 -= (c1->w[k - 1][3] * c1->w[k - 1][0] * rm + c1->w[ke - 1][3] * c1->w[ke - 1][0] * re); s12 -= (c1->w[k - 1][2] * c1->w[k - 1][1] * rm + c1->w[ke - 1][2] * c1->w[ke - 1][1] * re); s22 -= (c1->w[k - 1][3] * c1->w[k - 1][1] * rm + c1->w[ke - 1][3] * c1->w[ke - 1][1] * re); } // im10 loop } // l10 loop c1->sas[i][0][0] = s11 * csam; c1->sas[i][1][0] = s21 * csam; c1->sas[i][0][1] = s12 * csam; c1->sas[i][1][1] = s22 * csam; } // label 12 phas = exp(cph * (duk[0] * c1->rxx[i] + duk[1] * c1->ryy[i] + duk[2] * c1->rzz[i])); c3->tsas[0][0] += (c1->sas[iogi - 1][0][0] * phas); c3->tsas[1][0] += (c1->sas[iogi - 1][1][0] * phas); c3->tsas[0][1] += (c1->sas[iogi - 1][0][1] * phas); c3->tsas[1][1] += (c1->sas[iogi - 1][1][1] * phas); } // i14 loop for (int i24 = 1; i24 <= c4->nsph; i24++) { int iogi = c1->iog[i24 - 1]; if (iogi >= i24) { int j = 0; for (int ipo1 = 1; ipo1 <=2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c1->sas[i24 - 1][jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { j++; c1ao->vints[i24 - 1][j - 1] = c1->sas[i24 - 1][jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } } // i24 loop int j = 0; for (int ipo1 = 1; ipo1 <=2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c3->tsas[jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { j++; c1ao->vintt[j - 1] = c3->tsas[jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } /*! \brief C++ porting of STR * * \param rcf: `double **` Matrix of double. Loading Loading @@ -1936,6 +2130,32 @@ void str(double **rcf, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 *c4, C6 *c6) { delete[] ylm; } /*! \brief C++ porting of TQR * * \param u: `double *` * \param up: `double *` * \param un: `double *` * \param tqev: `double *` * \param tqsv: `double *` * \param tep: `double &` * \param ten: `double &` * \param tek: `double &` * \param tsp: `double &` * \param tsn: `double &` * \param tsk: `double &` */ void tqr( double *u, double *up, double *un, double *tqev, double *tqsv, double &tep, double &ten, double &tek, double &tsp, double &tsn, double &tsk ) { tep = up[0] * tqev[0] + up[1] * tqev[1] + up[2] * tqev[2]; ten = un[0] * tqev[0] + un[1] * tqev[1] + un[2] * tqev[2]; tek = u[0] * tqev[0] + u[1] * tqev[1] + u[2] * tqev[2]; tsp = up[0] * tqsv[0] + up[1] * tqsv[1] + up[2] * tqsv[2]; tsn = un[0] * tqsv[0] + un[1] * tqsv[1] + un[2] * tqsv[2]; tsk = u[0] * tqsv[0] + u[1] * tqsv[1] + u[2] * tqsv[2]; } /*! \brief C++ porting of ZTM * * \param am: Matrix of complex. Loading Loading @@ -2025,23 +2245,6 @@ void ztm(std::complex<double> **am, C1 *c1, C1_AddOns *c1ao, C4 *c4, C6 *c6, C9 } // i0 loop } /*! \brief Write a matrix to a log file (debug function). * * \param mat: Matrix of complex. * \param rows: `int` * \param cols: `int` */ void logmat(std::complex<double> **mat, int rows, int cols) { FILE* logfile = fopen("c_matrix.log", "w"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { fprintf(logfile, "R:%3d,%3d,%15.7lE\n", i + 1, j + 1, mat[i][j].real()); fprintf(logfile, "I:%3d,%3d,%15.7lE\n", i + 1, j + 1, mat[i][j].imag()); } } fclose(logfile); } /*! \brief Sum all the elements of a matrix (debug function). * * \param mat: Matrix of complex. Loading src/libnptm/Commons.cpp +4 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/cluster/cluster.cpp +317 −3 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ void cluster() { const int ndi = c4->nsph * c4->nlim; C9 *c9 = new C9(ndi, c4->nlem, 2 * ndi, 2 * c4->nlem); double *gaps = new double[nsph](); double *tqev = new double[3](); double *tqsv = new double[3](); double **tqse, **tqss, **tqce, **tqcs; complex<double> **tqspe, **tqsps, **tqcpe, **tqcps; tqse = new double*[2]; Loading @@ -114,6 +116,7 @@ void cluster() { tqcs[ti] = new double[3](); tqcps[ti] = new complex<double>[3](); } double *gapv = new double[3](); complex<double> **gapp, **gappm; double **gap, **gapm; gapp = new complex<double>*[3]; Loading @@ -140,11 +143,16 @@ void cluster() { double *args = new double[1](); double *duk = new double[3](); double **cextlr, **cext; double **cmullr, **cmul; cextlr = new double*[4]; cext = new double*[4]; cmullr = new double*[4];; cmul = new double*[4]; for (int ci = 0; ci < 4; ci++) { cextlr[ci] = new double[4](); cext[ci] = new double[4](); cmullr[ci] = new double[4](); cmul[ci] = new double[4](); } int isq, ibf; double scan, cfmp, sfmp, cfsp, sfsp; Loading Loading @@ -558,12 +566,311 @@ void cluster() { fprintf(output, " COSAV=%15.7lE, RAPRS=%15.7lE\n", cosav, rapr); fprintf(output, " Fk=%15.7lE\n", fz); } // ilr210 loop // from RMBRIF double rmbrif = (c1ao->fsacm[0][0].real() - c1ao->fsacm[1][1].real()) / c1ao->fsacm[0][0].real(); double rmdchr = (c1ao->fsacm[0][0].imag() - c1ao->fsacm[1][1].imag()) / c1ao->fsacm[0][0].imag(); fprintf(output, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", rmbrif); fprintf(output, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", rmdchr); } // label 212 } // jphs loop } // jths loop fprintf(output, "********** JTH =%3d, JPH =%3d, JTHS =%3d, JPHS =%3d ********************\n", jth486, jph484, jths, jphs); fprintf(output, " TIDG=%10.3lE, PIDG=%10.3lE, TSDG=%10.3lE, PSDG=%10.3lE\n", th, ph, ths, phs); fprintf(output, " SCAND=%10.3lE\n", scan); fprintf(output, " CFMP=%15.7lE, SFMP=%15.7lE\n", cfmp, sfmp); fprintf(output, " CFSP=%15.7lE, SFSP=%15.7lE\n", cfsp, sfsp); if (isam >= 0) { fprintf(output, " UNI=(%12.5lE,%12.5lE,%12.5lE)\n", un[0], un[1], un[2]); fprintf(output, " UNS=(%12.5lE,%12.5lE,%12.5lE)\n", uns[0], uns[1], uns[2]); } else { // label 214 fprintf(output, " UN=(%12.5lE,%12.5lE,%12.5lE)\n\n", un[0], un[1], un[2]); } // label 220 if (inpol == 0) { fprintf(output, " LIN\n"); } else { // label 222 fprintf(output, " CIRC\n"); } // label 224 scr2(vk, vkarg, exri, duk, c1, c1ao, c3, c4); if (c4->li != c4->le) fprintf(output, " SPHERES; LMX=MIN0(LI,LE)\n"); for (int i226 = 1; i226 <= nsph; i226++) { if (c1->iog[i226 - 1] >= i226) { fprintf(output, " SPHERE %2d\n", i226); fprintf( output, " SAS(1,1)=%15.7lE%15.7lE, SAS(2,1)=%15.7lE%15.7lE\n", c1->sas[i226 - 1][0][0].real(), c1->sas[i226 - 1][0][0].imag(), c1->sas[i226 - 1][1][0].real(), c1->sas[i226 - 1][1][0].imag() ); fprintf( output, " SAS(1,2)=%15.7lE%15.7lE, SAS(2,2)=%15.7lE%15.7lE\n", c1->sas[i226 - 1][0][1].real(), c1->sas[i226 - 1][0][1].imag(), c1->sas[i226 - 1][1][1].real(), c1->sas[i226 - 1][1][1].imag() ); for (int j225 = 0; j225 < 16; j225++) { // QUESTION: check that 16 is a fixed dimension c1ao->vint[j225] = c1ao->vints[i226 - 1][j225]; } // j225 loop mmulc(c1ao->vint, cmullr, cmul); fprintf(output, " MULS\n"); for (int i1 = 0; i1 < 4; i1++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i1][0], cmul[i1][1], cmul[i1][2], cmul[i1][3] ); } // i1 loop fprintf(output, " MULSLR\n"); for (int i1 = 0; i1 < 4; i1++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i1][0], cmullr[i1][1], cmullr[i1][2], cmullr[i1][3] ); } // i1 loop } } // i226 loop fprintf( output, " SAT(1,1)=%15.7lE%15.7lE, SAT(2,1)=%15.7lE%15.7lE\n", c3->tsas[0][0].real(), c3->tsas[0][0].imag(), c3->tsas[1][0].real(), c3->tsas[1][0].imag() ); fprintf( output, " SAT(1,2)=%15.7lE%15.7lE, SAT(2,2)=%15.7lE%15.7lE\n", c3->tsas[0][1].real(), c3->tsas[0][1].imag(), c3->tsas[1][1].real(), c3->tsas[1][1].imag() ); fprintf(output, " CLUSTER\n"); pcros(vk, exri, c1, c1ao, c4); mextc(vk, exri, c1ao->fsac, cextlr, cext); mmulc(c1ao->vint, cmullr, cmul); if (jw != 0) { jw = 0; // Some implicit loops writing to binary. for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cext[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { double value = c1ao->scsc[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->scscp[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->scscp[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecsc[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecscp[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->ecscp[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { double value = gap[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = gapp[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = gapp[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { double value = tqce[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcpe[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcpe[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { double value = tqcs[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcps[i][j].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = tqcps[i][j].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } for (int i = 0; i < 3; i++) { double value = u[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = up[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = un[i]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } // label 254 for (int i = 0; i < 16; i++) { double value = c1ao->vint[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->vint[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cmul[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } int jlr = 2; for (int ilr290 = 1; ilr290 <= 2; ilr290++) { int ipol = (ilr290 % 2 == 0) ? 1 : -1; if (ilr290 == 2) jlr = 1; double extsec = c1ao->ecsc[ilr290 - 1]; double qext = extsec * sqsfi / c3->gcs; double extrat = extsec / c3->ecs; double scasec = c1ao->scsc[ilr290 - 1]; double albedc = scasec / extsec; double qsca = scasec * sqsfi / c3->gcs; double scarat = scasec / c3->scs; double abssec = extsec - scasec; double qabs = abssec * sqsfi / c3->gcs; double absrat = 1.0; double ratio = c3->acs / c3->ecs; if (ratio < -1.0e-6 || ratio > 1.0e-6) absrat = abssec / c3->acs; s0 = c1ao->fsac[ilr290 - 1][ilr290 - 1] * exri; double qschu = s0.imag() * csch; double pschu = s0.real() * csch; s0mag = sqrt((s0.real() + s0.imag()) * (s0.real() - s0.imag())) * cs0; double refinr = c1ao->fsac[ilr290 - 1][ilr290 - 1].real() / c3->tfsas.real(); double extcor = c1ao->fsac[ilr290 - 1][ilr290 - 1].imag() / c3->tfsas.imag(); if (inpol == 0) { fprintf(output, " LIN %2d\n", ipol); } else { // label 273 fprintf(output, " CIRC %2d\n", ipol); } // label 275 fprintf(output, " ----- SCC ----- ABC ----- EXC ----- ALBEDC --\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE%15.7lE\n", scasec, abssec, extsec, albedc ); fprintf(output, " --- SCC/TGS - ABC/TGS - EXC/TGS ---\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE\n", qsca, qabs, qext ); fprintf(output, " ---- SCCRT --- ABCRT --- EXCRT ----\n"); fprintf( output, " %14.7lE%15.7lE%15.7lE\n", scarat, absrat, extrat ); fprintf( output, " FSAC(%1d,%1d)=%15.7lE%15.7lE FSAC(%1d,%1d)=%15.7lE%15.7lE\n", ilr290, ilr290, c1ao->fsac[ilr290 - 1][ilr290 - 1].real(), c1ao->fsac[ilr290 - 1][ilr290 - 1].imag(), jlr, ilr290, c1ao->fsac[jlr - 1][ilr290 - 1].real(), c1ao->fsac[jlr - 1][ilr290 - 1].imag() ); fprintf( output, " SAC(%1d,%1d)=%15.7lE%15.7lE SAC(%1d,%1d)=%15.7lE%15.7lE\n", ilr290, ilr290, c1ao->sac[ilr290 - 1][ilr290 - 1].real(), c1ao->sac[ilr290 - 1][ilr290 - 1].imag(), jlr, ilr290, c1ao->sac[jlr - 1][ilr290 - 1].real(), c1ao->sac[jlr - 1][ilr290 - 1].imag() ); fprintf( output, " RE(FSAC(%1d,%1d))/RE(TFSAS)=%15.7lE, IM(FSAC(%1d,%1d))/IM(TFSAS)=%15.7lE\n", ilr290, ilr290, refinr, ilr290, ilr290, extcor ); fprintf( output, " QSCHU=%15.7lE, PSCHU=%15.7lE, S0MAG=%15.7lE\n", qschu, pschu, s0mag ); bool goto190 = isam >= 0 && (jths > 1 || jphs > 1); if (!goto190) { gapv[0] = gap[0][ilr290 - 1]; gapv[1] = gap[1][ilr290 - 1]; gapv[2] = gap[2][ilr290 - 1]; double extins = c1ao->ecsc[ilr290 - 1]; double scatts = c1ao->scsc[ilr290 - 1]; double rapr, cosav, fp, fn, fk, fx, fy, fz; rftr(u, up, un, gapv, extins, scatts, rapr, cosav, fp, fn, fk, fx, fy, fz); fprintf(output, " COSAV=%15.7lE, RAPRS=%15.7lE\n", cosav, rapr); fprintf(output, " Fl=%15.7lE, Fr=%15.7lE, Fk=%15.7lE\n", fp, fn, fk); fprintf(output, " Fx=%15.7lE, Fy=%15.7lE, Fz=%15.7lE\n", fx, fy, fz); tqev[0] = tqce[ilr290 - 1][0]; tqev[1] = tqce[ilr290 - 1][1]; tqev[2] = tqce[ilr290 - 1][2]; tqsv[0] = tqcs[ilr290 - 1][0]; tqsv[1] = tqcs[ilr290 - 1][1]; tqsv[2] = tqcs[ilr290 - 1][2]; double tep, ten, tek, tsp, tsn, tsk; tqr(u, up, un, tqev, tqsv, tep, ten, tek, tsp, tsn, tsk); fprintf(output, " TQEl=%15.7lE, TQEr=%15.7lE, TQEk=%15.7lE\n", tep, ten, tek); fprintf(output, " TQSl=%15.7lE, TQSr=%15.7lE, TQSk=%15.7lE\n", tsp, tsn, tsk); fprintf( output, " TQEx=%15.7lE, TQEy=%15.7lE, TQEz=%15.7lE\n", tqce[ilr290 - 1][0], tqce[ilr290 - 1][1], tqce[ilr290 - 1][2] ); fprintf( output, " TQSx=%15.7lE, TQSy=%15.7lE, TQSz=%15.7lE\n", tqcs[ilr290 - 1][0], tqcs[ilr290 - 1][1], tqcs[ilr290 - 1][2] ); } } //ilr290 loop double rbirif = (c1ao->fsac[0][0].real() - c1ao->fsac[1][1].real()) / c1ao->fsac[0][0].real(); double rdichr = (c1ao->fsac[0][0].imag() - c1ao->fsac[1][1].imag()) / c1ao->fsac[0][0].imag(); fprintf(output, " (RE(FSAC(1,1))-RE(FSAC(2,2)))/RE(FSAC(1,1))=%15.7lE\n", rbirif); fprintf(output, " (IM(FSAC(1,1))-IM(FSAC(2,2)))/IM(FSAC(1,1))=%15.7lE\n", rdichr); fprintf(output, " MULC\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i][0], cmul[i][1], cmul[i][2], cmul[i][3] ); } fprintf(output, " MULCLR\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i][0], cmullr[i][1], cmullr[i][2], cmullr[i][3] ); } if (iavm != 0) { mmulc(c1ao->vintm, cmullr, cmul); // Some implicit loops writing to binary. for (int i = 0; i < 16; i++) { double value; value = c1ao->vintm[i].real(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); value = c1ao->vintm[i].imag(); tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = cmul[i][j]; tppoan.write(reinterpret_cast<char *>(&value), sizeof(double)); } } fprintf(output, " CLUSTER (ENSEMBLE AVERAGE, MODE%2d)\n", iavm); if (inpol == 0) { fprintf(output, " LIN\n"); } else { // label 316 fprintf(output, " CIRC\n"); } // label 318 fprintf(output, " MULC\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmul[i][0], cmul[i][1], cmul[i][2], cmul[i][3] ); } fprintf(output, " MULCLR\n"); for (int i = 0; i < 4; i++) { fprintf( output, " %15.7lE%15.7lE%15.7lE%15.7lE\n", cmullr[i][0], cmullr[i][1], cmullr[i][2], cmullr[i][3] ); } } // label 420, continues jphs loop if (isam < 1) phs += phsstp; } // jphs loop, labeled 480 if (isam <= 1) thsl += thsstp; } // jths loop, labeled 482 ph += phstp; } // jph484 loop th += thstp; } // jth486 loop printf("INFO: done jxi488 iteration.\n"); } // jxi488 loop Loading Loading @@ -609,6 +916,8 @@ void cluster() { delete[] tqcpe; delete[] tqcs; delete[] tqcps; delete[] tqev; delete[] tqsv; for (int gi = 2; gi > -1; gi--) { delete[] gapp[gi]; delete[] gappm[gi]; Loading @@ -619,6 +928,7 @@ void cluster() { delete[] gappm; delete[] gap; delete[] gapm; delete[] gapv; delete[] u; delete[] us; delete[] un; Loading @@ -635,9 +945,13 @@ void cluster() { for (int ci = 3; ci > -1; ci--) { delete[] cextlr[ci]; delete[] cext[ci]; delete[] cmullr[ci]; delete[] cmul[ci]; } delete[] cextlr; delete[] cext; delete[] cmullr; delete[] cmul; } else { // NSPH mismatch between geometry and scatterer configurations. throw UnrecognizedConfigurationException( "Inconsistent geometry and scatterer configurations." Loading
src/include/Commons.h +4 −0 Original line number Diff line number Diff line Loading @@ -238,8 +238,12 @@ public: //! \brief QUESTION: definition? std::complex<double> **fsacm; //! \brief QUESTION: definition? double *scsc; //! \brief QUESTION: definition? std::complex<double> *scscp; //! \brief QUESTION: definition? double *ecsc; //! \brief QUESTION: definition? double *ecscm; //! \brief QUESTION: definition? double *scscm; Loading
src/include/clu_subs.h +221 −18 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ extern void rabas( ); extern void rbf(int n, double x, int &nm, double sj[]); extern void rnf(int n, double x, int &nm, double sy[]); extern void mmulc(std::complex<double> *vint, double **cmullr, double **cmul); extern void sphar(double cth, double sth, double cph, double sph, int lm, std::complex<double> *ylm); extern void thdps(int lm, double ****zpv); extern void upvmp( Loading @@ -57,7 +58,6 @@ extern void wmasp( int nsph, double *argi, double *args, C1 *c1 ); // >>> END OF SPH_SUBS DECLARATION <<< void logmat(std::complex<double> **mat, int rows, int cols); /*! \brief C++ porting of CDTP * Loading Loading @@ -1415,6 +1415,74 @@ void mextc(double vk, double exri, std::complex<double> **fsac, double **cextlr, } } /*! \brief C++ porting of PCROS * * This function is intended to evaluate the particle cross-section. QUESTIUON: correct? * \param vk: `double` * \param exri: `double` * \param c1: `C1 *` * \param c1ao: `C1_AddOns *` * \param c4: `C4 *` */ void pcros(double vk, double exri, C1 *c1, C1_AddOns *c1ao, C4 *c4) { const std::complex<double> cc0(0.0, 0.0); std::complex<double> sump, sum1, sum2, sum3, sum4, am, amp, cc, csam; const double exdc = exri * exri; double ccs = 1.0 / (vk * vk); double cccs = ccs / exdc; csam = -(ccs / (exri * vk)) * std::complex<double>(0.0, 0.5); const double pi4sq = 64.0 * acos(0.0) * acos(0.0); double cfsq =4.0 / (pi4sq *ccs * ccs); const int nlemt = c4->nlem + c4->nlem; int jpo = 2; for (int ipo18 = 1; ipo18 <= 2; ipo18++) { if (ipo18 == 2) jpo = 1; int ipopt = ipo18 + 2; int jpopt = jpo + 2; double sum = 0.0; sump = cc0; sum1 = cc0; sum2 = cc0; sum3 = cc0; sum4 = cc0; for (int i12 = 1; i12 <= nlemt; i12++) { int i = i12 - 1; am = cc0; amp = cc0; for (int j10 = 1; j10 <= nlemt; j10++) { int j = j10 - 1; am += (c1ao->am0m[i][j] * c1->w[j][ipo18 - 1]); amp += (c1ao->am0m[i][j] * c1->w[j][jpo - 1]); } // j10 loop sum += (dconjg(am) * am).real(); sump += (dconjg(amp) * amp); sum1 += (dconjg(c1->w[i][ipo18 - 1]) * am); sum2 += (dconjg(c1->w[i][jpo - 1]) * am); sum3 += (c1->w[i][ipopt - 1] * am); sum4 += (c1->w[i][jpopt - 1] * am); } // i12 loop c1ao->scsc[ipo18 - 1] = cccs * sum; c1ao->scscp[ipo18 - 1] = cccs * sump; c1ao->ecsc[ipo18 - 1] = -cccs * sum1.real(); c1ao->ecscp[ipo18 - 1] = -cccs * sum2; c1ao->fsac[ipo18 - 1][ipo18 - 1] = csam * sum1; c1ao->fsac[jpo - 1][ipo18 - 1] = csam * sum2; c1ao->sac[ipo18 - 1][ipo18 - 1] = csam * sum3; c1ao->sac[jpo - 1][ipo18 - 1] = csam * sum4; } // ipo18 loop int i = 0; for (int ipo1 = 1; ipo1 <= 2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c1ao->sac[jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2 ++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { c1ao->vint[i++] = c1ao->sac[jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } /*! \brief C++ porting of PCRSM0 * * \param vk: `double` Loading Loading @@ -1800,6 +1868,39 @@ void raba( delete[] ctqcs; } /*! \brief C++ porting of RFTR * * \param u: `double *` * \param up: `double *` * \param un: `double *` * \param gapv: `double *` * \param extins: `double` * \param scatts: `double` * \param rapr: `double &` * \param cosav: `double &` * \param fp: `double &` * \param fn: `double &` * \param fk: `double &` * \param fx: `double &` * \param fy: `double &` * \param fz: `double &` */ void rftr( double *u, double *up, double *un, double *gapv, double extins, double scatts, double &rapr, double &cosav, double &fp, double &fn, double &fk, double &fx, double &fy, double &fz ) { fk = u[0] * gapv[0] + u[1] * gapv[1] + u[2] * gapv[2]; rapr = extins - fk; cosav = fk / scatts; fp = -(up[0] * gapv[0] + up[1] * gapv[1] + up[2] * gapv[2]); fn = -(un[0] * gapv[0] + un[1] * gapv[1] + un[2] * gapv[2]); fk = rapr; fx = u[0] * extins - gapv[0]; fy = u[1] * extins - gapv[1]; fz = u[2] * extins - gapv[2]; } /*! \brief C++ porting of SCR0 * * \param vk: `double` QUESTION: definition? Loading Loading @@ -1852,6 +1953,99 @@ void scr0(double vk, double exri, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 * c4) { } // i14 loop } /*! \brief C++ porting of SCR2 * * \param vk: `double` QUESTION: definition? * \param vkarg: `double` QUESTION: definition? * \param exri: `double` External medium refractive index * \param duk: `double *` QUESTION: definition? * \param c1: `C1 *` Pointer to a C1 instance. * \param c1ao: `C1_AddOns *` Pointer to C1_AddOns instance. * \param c3: `C3 *` Pointer to a C3 instance. * \param c4: `C4 *` Pointer to a C4 structure. */ void scr2( double vk, double vkarg, double exri, double *duk, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 *c4) { const std::complex<double> cc0(0.0, 0.0); const std::complex<double> uim(0.0, 1.0); std::complex<double> s11, s21, s12, s22, rm, re, csam, cph, phas, cc; double ccs = 1.0 / (vk * vk); csam = -(ccs / (exri * vk)) * std::complex<double>(0.0, 0.5); const double pi4sq = 64.0 * acos(0.0) * acos(0.0); double cfsq = 4.0 / (pi4sq * ccs * ccs); cph = uim * exri * vkarg; int ls = (c4->li < c4->le) ? c4->li : c4->le; c3->tsas[0][0] = cc0; c3->tsas[1][0] = cc0; c3->tsas[0][1] = cc0; c3->tsas[1][1] = cc0; for (int i14 = 1; i14 <= c4->nsph; i14++) { int i = i14 - 1; int iogi = c1->iog[i14 - 1]; if (iogi >= i14) { int k = 0; s11 = cc0; s21 = cc0; s12 = cc0; s22 = cc0; for (int l10 = 1; l10 <= ls; l10++) { int l = l10 - 1; rm = 1.0 / c1->rmi[l][i]; re = 1.0 / c1->rei[l][i]; int ltpo = l10 + l10 + 1; for (int im10 = 1; im10 <= ltpo; im10++) { k++; int ke = k + c4->nlem; s11 -= (c1->w[k - 1][2] * c1->w[k - 1][0] * rm + c1->w[ke - 1][2] * c1->w[ke - 1][0] * re); s21 -= (c1->w[k - 1][3] * c1->w[k - 1][0] * rm + c1->w[ke - 1][3] * c1->w[ke - 1][0] * re); s12 -= (c1->w[k - 1][2] * c1->w[k - 1][1] * rm + c1->w[ke - 1][2] * c1->w[ke - 1][1] * re); s22 -= (c1->w[k - 1][3] * c1->w[k - 1][1] * rm + c1->w[ke - 1][3] * c1->w[ke - 1][1] * re); } // im10 loop } // l10 loop c1->sas[i][0][0] = s11 * csam; c1->sas[i][1][0] = s21 * csam; c1->sas[i][0][1] = s12 * csam; c1->sas[i][1][1] = s22 * csam; } // label 12 phas = exp(cph * (duk[0] * c1->rxx[i] + duk[1] * c1->ryy[i] + duk[2] * c1->rzz[i])); c3->tsas[0][0] += (c1->sas[iogi - 1][0][0] * phas); c3->tsas[1][0] += (c1->sas[iogi - 1][1][0] * phas); c3->tsas[0][1] += (c1->sas[iogi - 1][0][1] * phas); c3->tsas[1][1] += (c1->sas[iogi - 1][1][1] * phas); } // i14 loop for (int i24 = 1; i24 <= c4->nsph; i24++) { int iogi = c1->iog[i24 - 1]; if (iogi >= i24) { int j = 0; for (int ipo1 = 1; ipo1 <=2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c1->sas[i24 - 1][jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { j++; c1ao->vints[i24 - 1][j - 1] = c1->sas[i24 - 1][jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } } // i24 loop int j = 0; for (int ipo1 = 1; ipo1 <=2; ipo1++) { for (int jpo1 = 1; jpo1 <= 2; jpo1++) { cc = dconjg(c3->tsas[jpo1 - 1][ipo1 - 1]); for (int ipo2 = 1; ipo2 <= 2; ipo2++) { for (int jpo2 = 1; jpo2 <= 2; jpo2++) { j++; c1ao->vintt[j - 1] = c3->tsas[jpo2 - 1][ipo2 - 1] * cc * cfsq; } // jpo2 loop } // ipo2 loop } // jpo1 loop } // ipo1 loop } /*! \brief C++ porting of STR * * \param rcf: `double **` Matrix of double. Loading Loading @@ -1936,6 +2130,32 @@ void str(double **rcf, C1 *c1, C1_AddOns *c1ao, C3 *c3, C4 *c4, C6 *c6) { delete[] ylm; } /*! \brief C++ porting of TQR * * \param u: `double *` * \param up: `double *` * \param un: `double *` * \param tqev: `double *` * \param tqsv: `double *` * \param tep: `double &` * \param ten: `double &` * \param tek: `double &` * \param tsp: `double &` * \param tsn: `double &` * \param tsk: `double &` */ void tqr( double *u, double *up, double *un, double *tqev, double *tqsv, double &tep, double &ten, double &tek, double &tsp, double &tsn, double &tsk ) { tep = up[0] * tqev[0] + up[1] * tqev[1] + up[2] * tqev[2]; ten = un[0] * tqev[0] + un[1] * tqev[1] + un[2] * tqev[2]; tek = u[0] * tqev[0] + u[1] * tqev[1] + u[2] * tqev[2]; tsp = up[0] * tqsv[0] + up[1] * tqsv[1] + up[2] * tqsv[2]; tsn = un[0] * tqsv[0] + un[1] * tqsv[1] + un[2] * tqsv[2]; tsk = u[0] * tqsv[0] + u[1] * tqsv[1] + u[2] * tqsv[2]; } /*! \brief C++ porting of ZTM * * \param am: Matrix of complex. Loading Loading @@ -2025,23 +2245,6 @@ void ztm(std::complex<double> **am, C1 *c1, C1_AddOns *c1ao, C4 *c4, C6 *c6, C9 } // i0 loop } /*! \brief Write a matrix to a log file (debug function). * * \param mat: Matrix of complex. * \param rows: `int` * \param cols: `int` */ void logmat(std::complex<double> **mat, int rows, int cols) { FILE* logfile = fopen("c_matrix.log", "w"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { fprintf(logfile, "R:%3d,%3d,%15.7lE\n", i + 1, j + 1, mat[i][j].real()); fprintf(logfile, "I:%3d,%3d,%15.7lE\n", i + 1, j + 1, mat[i][j].imag()); } } fclose(logfile); } /*! \brief Sum all the elements of a matrix (debug function). * * \param mat: Matrix of complex. Loading
src/libnptm/Commons.cpp +4 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes