42int ExactRecSurf(
double X,
double Y,
double Z,
double xlo,
double zlo,
43 double xhi,
double zhi,
double *Potential,
Vector3D *Flux) {
44 if (
DebugISLES) printf(
"In ExactRecSurf ...\n");
51 if ((fabs(xhi - xlo) < 3.0 *
MINDIST) || (fabs(zhi - zlo) < 3.0 *
MINDIST)) {
52 fprintf(stdout,
"Element size too small! ... returning ...\n");
56 double ar = fabs((zhi - zlo) / (xhi - xlo));
58 fprintf(stdout,
"Element too thin! ... returning ...\n");
66 double dxlo = X - xlo;
67 if (fabs(dxlo) <
MINDIST) dxlo = 0.0;
68 double dxhi = X - xhi;
69 if (fabs(dxhi) <
MINDIST) dxhi = 0.0;
70 double dzlo = Z - zlo;
71 if (fabs(dzlo) <
MINDIST) dzlo = 0.0;
72 double dzhi = Z - zhi;
73 if (fabs(dzhi) <
MINDIST) dzhi = 0.0;
78 double D11 = sqrt(dxlo * dxlo + Y * Y + dzlo * dzlo);
79 if (fabs(D11) <
MINDIST) D11 = 0.0;
80 double D21 = sqrt(dxhi * dxhi + Y * Y + dzlo * dzlo);
81 if (fabs(D21) <
MINDIST) D21 = 0.0;
82 double D12 = sqrt(dxlo * dxlo + Y * Y + dzhi * dzhi);
83 if (fabs(D12) <
MINDIST) D12 = 0.0;
84 double D22 = sqrt(dxhi * dxhi + Y * Y + dzhi * dzhi);
85 if (fabs(D22) <
MINDIST) D22 = 0.0;
90 double modY = fabs(Y);
92 double I1 = dxlo * modY;
93 double I2 = dxhi * modY;
94 double R1 = Y * Y + dzlo * dzlo;
95 double R2 = Y * Y + dzhi * dzhi;
102 fprintf(stdout,
"X: %.16lg, Y: %.16lg, Z: %.16lg\n", X, Y, Z);
103 fprintf(stdout,
"xlo: %.16lg, zlo: %.16lg, xhi: %.16lg, zhi: %.16lg\n", xlo,
105 fprintf(stdout,
"dxlo: %.16lg, dzlo: %.16lg, dxhi: %.16lg, dzhi: %.16lg\n",
106 dxlo, dzlo, dxhi, dzhi);
107 fprintf(stdout,
"D11: %.16lg, D12: %.16lg, D21: %.16lg, D22: %.16lg\n", D11,
109 fprintf(stdout,
"S1: %d, S2: %d, modY: %.16lg\n", S1, S2, modY);
110 fprintf(stdout,
"I1: %.16lg, I2: %.16lg, R1: %.16lg, R2: %.16lg\n", I1, I2,
112 fprintf(stdout,
"MINDIST: %.16lg, MINDIST2: %.16lg, SHIFT: %.16lg\n",
141 if (
DebugISLES) printf(
"fabs(D11) <= MINDIST ... ");
144 if ((X >= xlo) && (Z >= zlo)) {
149 }
else if ((X <= xlo) && (Z >= zlo)) {
154 }
else if ((X >= xlo) && (Z <= zlo)) {
159 }
else if ((X <= xlo) && (Z <= zlo)) {
167 ExactRecSurf(X1, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
176 if (
DebugISLES) printf(
"fabs(D21) <= MINDIST ... ");
179 if ((X >= xhi) && (Z >= zlo)) {
184 }
else if ((X <= xhi) && (Z >= zlo)) {
189 }
else if ((X >= xhi) && (Z <= zlo)) {
194 }
else if ((X <= xhi) && (Z <= zlo)) {
202 ExactRecSurf(X1, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
211 if (
DebugISLES) printf(
"fabs(D12) <= MINDIST ... ");
214 if ((X >= xlo) && (Z >= zhi)) {
219 }
else if ((X <= xlo) && (Z >= zhi)) {
224 }
else if ((X >= xlo) && (Z <= zhi)) {
229 }
else if ((X <= xlo) && (Z <= zhi)) {
237 ExactRecSurf(X1, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
246 if (
DebugISLES) printf(
"fabs(D22) <= MINDIST ... ");
249 if ((X >= xhi) && (Z >= zhi)) {
254 }
else if ((X <= xhi) && (Z >= zhi)) {
259 }
else if ((X >= xhi) && (Z <= zhi)) {
264 }
else if ((X <= xhi) && (Z <= zhi)) {
272 ExactRecSurf(X1, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
287 if (
DebugISLES) printf(
"fabs(dxlo) < MINDIST ... ");
303 ExactRecSurf(X1, Y, Z, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
304 ExactRecSurf(X2, Y, Z, xlo, zlo, xhi, zhi, &Pot2, &Flux2);
305 *Potential = 0.5 * (Pot1 + Pot2);
306 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
307 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
308 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
313 if (
DebugISLES) printf(
"fabs(dzlo) < MINDIST ... ");
329 ExactRecSurf(X, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
330 ExactRecSurf(X, Y, Z2, xlo, zlo, xhi, zhi, &Pot2, &Flux2);
331 *Potential = 0.5 * (Pot1 + Pot2);
332 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
333 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
334 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
339 if (
DebugISLES) printf(
"fabs(dxhi) < MINDIST ... ");
355 ExactRecSurf(X1, Y, Z, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
356 ExactRecSurf(X2, Y, Z, xlo, zlo, xhi, zhi, &Pot2, &Flux2);
357 *Potential = 0.5 * (Pot1 + Pot2);
358 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
359 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
360 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
365 if (
DebugISLES) printf(
"fabs(dzhi) < MINDIST ... ");
381 ExactRecSurf(X, Y, Z1, xlo, zlo, xhi, zhi, &Pot1, &Flux1);
382 ExactRecSurf(X, Y, Z2, xlo, zlo, xhi, zhi, &Pot2, &Flux2);
383 *Potential = 0.5 * (Pot1 + Pot2);
384 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
385 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
386 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
394 double DZTerm1 = log((D11 - dzlo) / (D12 - dzhi));
395 double DZTerm2 = log((D21 - dzlo) / (D22 - dzhi));
396 double DXTerm1 = log((D11 - dxlo) / (D21 - dxhi));
397 double DXTerm2 = log((D12 - dxlo) / (D22 - dxhi));
402 "DZTerm1: %.16lg, DZTerm2: %.16lg, DXTerm1: %.16lg, DXTerm2: %.16lg\n",
403 DZTerm1, DZTerm2, DXTerm1, DXTerm2);
406 if (isnan(DZTerm1) || isinf(DZTerm1)) {
412 fprintf(stdout,
"DZTerm1 problem ... approximating: %d.\n",
ApproxFlag);
416 if (isnan(DZTerm2) || isinf(DZTerm2)) {
422 fprintf(stdout,
"DZTerm2 problem ... approximating: %d.\n",
ApproxFlag);
426 if (isnan(DXTerm1) || isinf(DXTerm1)) {
432 fprintf(stdout,
"DXTerm1 problem ... approximating: %d.\n",
ApproxFlag);
436 if (isnan(DXTerm2) || isinf(DXTerm2)) {
442 fprintf(stdout,
"DXTerm2 problem ... approximating: %d.\n",
ApproxFlag);
459 fprintf(stdout,
"S1-I1 problem ... approximating: %d.\n",
ApproxFlag);
471 fprintf(stdout,
"S1-I2 problem ... approximating: %d.\n",
ApproxFlag);
485 fprintf(stdout,
"S2-I1 problem ... approximating: %d.\n",
ApproxFlag);
497 fprintf(stdout,
"S2-I2 problem ... approximating: %d.\n",
ApproxFlag);
504 double sumTanTerms = 0.;
510 double a = D11 * D11 * dzlo * dzlo;
511 double b = R1 * R1 + I1 * I1;
512 double tmp = -S1 * atan(2 * I1 * D11 * fabs(dzlo) / (a - b));
514 if ((X > xlo && Z > zlo) || (X < xlo && Z < zlo)) {
516 }
else if ((X < xlo && Z > zlo) || (X > xlo && Z < zlo)) {
524 double a = D21 * D21 * dzlo * dzlo;
525 double b = R1 * R1 + I2 * I2;
526 double tmp = -S1 * atan(2 * I2 * D21 * fabs(dzlo) / (a - b));
528 if ((X > xhi && Z > zlo) || (X < xhi && Z < zlo)) {
530 }
else if ((X < xhi && Z > zlo) || (X > xhi && Z < zlo)) {
540 double a = D12 * D12 * dzhi * dzhi;
541 double b = R2 * R2 + I1 * I1;
542 double tmp = -S2 * atan(2 * I1 * D12 * fabs(dzhi) / (a - b));
544 if ((X > xlo && Z > zhi) || (X < xlo && Z < zhi)) {
546 }
else if ((X < xlo && Z > zhi) || (X > xlo && Z < zhi)) {
554 double a = D22 * D22 * dzhi * dzhi;
555 double b = R2 * R2 + I2 * I2;
556 double tmp = -S2 * atan(2 * I2 * D22 * fabs(dzhi) / (a - b));
558 if ((X > xhi && Z > zhi) || (X < xhi && Z < zhi)) {
560 }
else if ((X < xhi && Z > zhi) || (X > xhi && Z < zhi)) {
569 double Pot = -dxlo * DZTerm1 + dxhi * DZTerm2 + modY * sumTanTerms -
570 dzlo * DXTerm1 + dzhi * DXTerm2;
571 double Fx = DZTerm1 - DZTerm2;
572 double Fy = -SY * sumTanTerms;
573 double Fz = DXTerm1 - DXTerm2;
575 printf(
"XTerms: %.16lg, YTerms: %.16lg, ZTerms: %.16lg\n",
576 -dxlo * DZTerm1 + dxhi * DZTerm2, modY * sumTanTerms,
577 -dzlo * DXTerm1 + dzhi * DXTerm2);
578 printf(
"Pot: %lf, Fx: %lf, Fy: %lf, Fz: %lf\n", Pot, Fx, Fy, Fz);
587 Pot -= 2.0 * modY *
ST_PI;
589 Fy += 2.0 * (double)SY *
ST_PI;
594 printf(
"Constants of integration added for potential and Fy.\n");
595 printf(
"Pot: %lf, Fx: %lf, Fy: %lf, Fz: %lf\n", Pot, Fx, Fy, Fz);
600 if ((Pot < 0.0) || (isnan(Pot) || isinf(Pot))) {
601 fprintf(
fIsles,
"\n--- Approximation in ExactRecSurf ---\n");
602 fprintf(
fIsles,
"Negative, nan or inf potential ... approximating!\n");
604 fprintf(stdout,
"\n--- Approximation in ExactRecSurf ---\n");
605 fprintf(stdout,
"Negative, nan or inf potential ... approximating!\n");
607 fprintf(
fIsles,
"X: %.16lg, Y: %.16lg, Z: %.16lg\n", X, Y, Z);
608 fprintf(
fIsles,
"xlo: %.16lg, zlo: %.16lg, xhi: %.16lg, zhi: %.16lg\n", xlo,
610 fprintf(
fIsles,
"dxlo: %.16lg, dzlo: %.16lg, dxhi: %.16lg, dzhi: %.16lg\n",
611 dxlo, dzlo, dxhi, dzhi);
612 fprintf(
fIsles,
"D11: %.16lg, D12: %.16lg, D21: %.16lg, D22: %.16lg\n", D11,
614 fprintf(
fIsles,
"modY: %.16lg\n", modY);
615 fprintf(
fIsles,
"I1: %.16lg, I2: %.16lg, R1: %.16lg, R2: %.16lg\n", I1, I2,
617 fprintf(
fIsles,
"S1: %d, S2: %d\n", S1, S2);
618 fprintf(
fIsles,
"Computed Pot: %.16lg\n", Pot);
626 if (isnan(Fx) || isinf(Fx)) {
627 fprintf(
fIsles,
"\n--- Approximation in ExactRecSurf ---\n");
628 fprintf(
fIsles,
"Nan or inf Fx ... approximating!\n");
630 fprintf(stdout,
"\n--- Approximation in ExactRecSurf ---\n");
631 fprintf(stdout,
"Nan or inf Fx ... approximating!\n");
633 fprintf(
fIsles,
"X: %.16lg, Y: %.16lg, Z: %.16lg\n", X, Y, Z);
634 fprintf(
fIsles,
"xlo: %.16lg, zlo: %.16lg, xhi: %.16lg, zhi: %.16lg\n", xlo,
636 fprintf(
fIsles,
"dxlo: %.16lg, dzlo: %.16lg, dxhi: %.16lg, dzhi: %.16lg\n",
637 dxlo, dzlo, dxhi, dzhi);
638 fprintf(
fIsles,
"D11: %.16lg, D12: %.16lg, D21: %.16lg, D22: %.16lg\n", D11,
640 fprintf(
fIsles,
"Computed Fx: %.16lg\n", Fx);
648 if (isnan(Fy) || isinf(Fy)) {
649 fprintf(
fIsles,
"\n--- Approximation in ExactRecSurf ---\n");
650 fprintf(
fIsles,
"Nan or inf Fy ... approximating!\n");
652 fprintf(stdout,
"\n--- Approximation in ExactRecSurf ---\n");
653 fprintf(stdout,
"Nan or inf Fy ... approximating!\n");
655 fprintf(
fIsles,
"X: %.16lg, Y: %.16lg, Z: %.16lg\n", X, Y, Z);
656 fprintf(
fIsles,
"xlo: %.16lg, zlo: %.16lg, xhi: %.16lg, zhi: %.16lg\n", xlo,
658 fprintf(
fIsles,
"dxlo: %.16lg, dzlo: %.16lg, dxhi: %.16lg, dzhi: %.16lg\n",
659 dxlo, dzlo, dxhi, dzhi);
660 fprintf(
fIsles,
"D11: %.16lg, D12: %.16lg, D21: %.16lg, D22: %.16lg\n", D11,
662 fprintf(
fIsles,
"S1: %d, S2: %d, SY: %d, modY: %.16lg\n", S1, S2, SY, modY);
663 fprintf(
fIsles,
"I1: %.16lg, I2: %.16lg, R1: %.16lg, R2: %.16lg\n", I1, I2,
665 fprintf(
fIsles,
"Computed Fy: %.16lg\n", Fy);
673 if (isnan(Fz) || isinf(Fz)) {
674 fprintf(
fIsles,
"\n--- Approximation in ExactRecSurf ---\n");
675 fprintf(
fIsles,
"Nan or inf Fz ... approximating!\n");
677 fprintf(stdout,
"\n--- Approximation in ExactRecSurf ---\n");
678 fprintf(stdout,
"Nan or inf Fz ... approximating!\n");
680 fprintf(
fIsles,
"X: %.16lg, Y: %.16lg, Z: %.16lg\n", X, Y, Z);
681 fprintf(
fIsles,
"xlo: %.16lg, zlo: %.16lg, xhi: %.16lg, zhi: %.16lg\n", xlo,
683 fprintf(
fIsles,
"dxlo: %.16lg, dzlo: %.16lg, dxhi: %.16lg, dzhi: %.16lg\n",
684 dxlo, dzlo, dxhi, dzhi);
685 fprintf(
fIsles,
"D11: %.16lg, D12: %.16lg, D21: %.16lg, D22: %.16lg\n", D11,
687 fprintf(
fIsles,
"Computed Fz: %.16lg\n", Fz);
701 if (
DebugISLES) printf(
"Going out of ExactRecSurf ...\n");
783int ExactTriSurf(
double zMax,
double X,
double Y,
double Z,
double *Potential,
785 if (
DebugISLES) printf(
"In ExactTriSurf ...\n");
796 fprintf(stdout,
"Element size too small! ... returning ...\n");
801 fprintf(stdout,
"Element too thin! ... returning ...\n");
808 if (fabs(X) <
MINDIST) X = 0.0;
809 if (fabs(Y) <
MINDIST) Y = 0.0;
810 if (fabs(Z) <
MINDIST) Z = 0.0;
811 double modY = fabs(Y);
812 if (modY <
MINDIST) modY = 0.0;
817 double D11 = sqrt(X * X + Y * Y + Z * Z);
819 double D21 = sqrt((X - 1.0) * (X - 1.0) + Y * Y + Z * Z);
821 double D12 = sqrt(X * X + Y * Y + (Z - zMax) * (Z - zMax));
824 double G = zMax * (X - 1.0) + Z;
825 if (fabs(G) <
MINDIST) G = 0.0;
826 double E1 = (X - zMax * (Z - zMax));
827 if (fabs(E1) <
MINDIST) E1 = 0.0;
828 double E2 = (X - 1.0 - zMax * Z);
829 if (fabs(E2) <
MINDIST) E2 = 0.0;
830 double H1 = Y * Y + (Z - zMax) * G;
832 double H2 = Y * Y + Z * G;
834 double R1 = Y * Y + Z * Z;
836 double I1 = modY * X;
838 double I2 = modY * (X - 1.0);
840 double Hypot = sqrt(1.0 + zMax * zMax);
842 fprintf(stdout,
"Hypotenuse too small! ... returning ...\n");
845 double Zhyp = zMax * (1.0 - X);
848 printf(
"\n\nzMax: %.16lg, X: %.16lg, Y: %.16lg, Z: %.16lg\n", zMax, X, Y,
850 printf(
"D11: %.16lg, D21: %.16lg, D12: %.16lg, Hypot: %.16lg\n", D11, D21,
852 printf(
"modY: %.16lg, G: %.16lg\n", modY, G);
853 printf(
"E1: %.16lg, E2: %.16lg, H1: %.16lg, H2: %.16lg\n", E1, E2, H1, H2);
854 printf(
"S1: %d, SY: %d, R1: %.16lg, I1: %.16lg, I2: %.16lg\n", S1, SY, R1,
856 printf(
"H1+G*D12: %.16lg, E1-zMax*D12: %.16lg\n", H1 + G * D12,
858 printf(
"H2+G*D21: %.16lg, E2-zMax*D21: %.16lg\n", H2 + G * D21,
860 printf(
"D11*fabs(Z): %.16lg, D21*fabs(Z): %.16lg\n", D11 * fabs(Z),
862 printf(
"Hypot*D12 - E1: %.16lg\n", Hypot * D12 - E1);
863 printf(
"Hypot*D21 - E2: %.16lg\n\n", Hypot * D21 - E2);
864 fprintf(stdout,
"MINDIST: %.16lg, MINDIST2: %.16lg, SHIFT: %.16lg\n",
895 if ((X >= 0.0) && (Z >= 0.0)) {
900 }
else if ((X <= 0.0) && (Z >= 0.0)) {
905 }
else if ((X >= 0.0) && (Z <= 0.0)) {
910 }
else if ((X <= 0.0) && (Z <= 0.0)) {
929 if ((X >= 1.0) && (Z >= 0.0)) {
934 }
else if ((X <= 1.0) && (Z >= 0.0)) {
940 }
else if ((X >= 1.0) && (Z <= 0.0)) {
945 }
else if ((X <= 1.0) && (Z <= 0.0)) {
964 if ((X >= 0.0) && (Z >= zMax)) {
969 }
else if ((X <= 0.0) && (Z >= zMax)) {
974 }
else if ((X >= 0.0) && (Z <= zMax)) {
980 }
else if ((X <= 0.0) && (Z <= zMax)) {
998 if (
DebugISLES) printf(
"Y line at (0,0,0) corner\n");
1001 if ((X >= 0.0) && (Z >= 0.0)) {
1006 }
else if ((X <= 0.0) && (Z >= 0.0)) {
1011 }
else if ((X >= 0.0) && (Z <= 0.0)) {
1016 }
else if ((X <= 0.0) && (Z <= 0.0)) {
1033 if (
DebugISLES) printf(
"Y line at (1,0,0) corner\n");
1036 if ((X >= 1.0) && (Z >= 0.0)) {
1041 }
else if ((X <= 1.0) && (Z >= 0.0)) {
1046 }
else if ((X >= 1.0) && (Z <= 0.0)) {
1051 }
else if ((X <= 1.0) && (Z <= 0.0)) {
1068 if (
DebugISLES) printf(
"Y line at (0,0,zMax) corner\n");
1071 if ((X >= 0.0) && (Z >= zMax)) {
1076 }
else if ((X <= 0.0) && (Z >= zMax)) {
1081 }
else if ((X >= 0.0) && (Z <= zMax)) {
1086 }
else if ((X <= 0.0) && (Z <= zMax)) {
1112 if (
DebugISLES) printf(
"edge along X-axis\n");
1113 double X1 = X, X2 = X;
1119 }
else if (X <= 0.0) {
1129 *Potential = 0.5 * (Pot1 + Pot2);
1130 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
1131 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
1132 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
1157 if (fabs(X - 1.0) <
MINDIST) {
1159 if (
DebugISLES) printf(
"edge along X = 1.\n");
1160 double X1 = X, X2 = X;
1166 }
else if (X >= 1.0) {
1176 *Potential = 0.5 * (Pot1 + Pot2);
1177 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
1178 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
1179 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
1182 if (fabs(Z - zMax) <
MINDIST) {
1184 if (
DebugISLES) printf(
"edge along Z = zMax\n");
1185 double Z1 = Z, Z2 = Z;
1191 }
else if (Z <= zMax) {
1201 *Potential = 0.5 * (Pot1 + Pot2);
1202 Flux->
X = 0.5 * (Flux1.
X + Flux2.
X);
1203 Flux->
Y = 0.5 * (Flux1.
Y + Flux2.
Y);
1204 Flux->
Z = 0.5 * (Flux1.
Z + Flux2.
Z);
1207 if (fabs(Z - Zhyp) <
MINDIST) {
1209 if (
DebugISLES) printf(
"edge along Hypotenuse\n");
1210 double X1 = X, Z1 = Z;
1216 }
else if (Z >= Zhyp) {
1239 "(fabs(G) <= MINDIST) && (modY <= MINDIST) ... approximating: %d.\n",
1299 double DblTmp1 = (Hypot * D12 - E1) / (Hypot * D21 - E2);
1301 printf(
"DblTmp1: %.16lg\n", DblTmp1);
1305 double DTerm1 = log(DblTmp1);
1306 if (isnan(DTerm1) || isinf(DTerm1)) {
1316 double DblTmp2 = (D11 - X) / (D21 - X + 1.0);
1318 printf(
"DblTmp2: %.16lg\n", DblTmp2);
1322 double DTerm2 = log(DblTmp2);
1323 if (isnan(DTerm2) || isinf(DTerm2)) {
1333 printf(
"DTerm1: %.16lg, DTerm2: %.16lg\n", DTerm1, DTerm2);
1338 double deltaLog = 0.;
1339 double deltaArg = 0.;
1341 const double s1 = 1. / (X * X + modY * modY);
1342 double Re1 = ((-X) * (H1 + G * D12) + modY * modY * (E1 - zMax * D12)) * s1;
1343 double Im1 = ((-X) * modY * (E1 - zMax * D12) - (H1 + G * D12) * modY) * s1;
1344 const double s2 = 1. / ((1. - X) * (1. - X) + modY * modY);
1346 ((1. - X) * (H2 + G * D21) + modY * modY * (E2 - zMax * D21)) * s2;
1348 ((1. - X) * modY * (E2 - zMax * D21) - (H2 + G * D21) * modY) * s2;
1349 deltaLog = 0.5 * log((Re1 * Re1 + Im1 * Im1) / (Re2 * Re2 + Im2 * Im2));
1350 deltaArg = atan2(Im1, Re1) - atan2(Im2, Re2);
1352 double f1 = fabs((H1 + G * D12) / (-X));
1354 double f2 = fabs((H2 + G * D21) / (1. - X));
1356 deltaLog = log(f1 / f2);
1358 const double c1 = 2. / (G * G + zMax * zMax * modY * modY);
1359 double LTerm1 = c1 * (G * deltaLog - zMax * modY * deltaArg);
1360 double LTerm2 = c1 * (G * deltaArg + zMax * modY * deltaLog);
1362 printf(
"LTerm1: %.16lg, LTerm2: %.16lg\n", LTerm1, LTerm2);
1384 double TanhTerm1 = 0.;
1385 double TanhTerm2 = 0.;
1388 const double f1 = R1 / (D11 * fabs(Z));
1389 const double f2 = R1 / (D21 * fabs(Z));
1390 TanhTerm1 = log1p(f1) - log1p(-f1) - log1p(f2) + log1p(-f2);
1393 if (fabs(R1 - D11 * fabs(Z)) >
MINDIST2 ||
true) {
1394 const double rp = D11 * fabs(Z) + R1;
1395 const double rm = D11 * fabs(Z) - R1;
1396 TanhTerm1 *= (I1 * I1 + rp * rp) / (I1 * I1 + rm * rm);
1398 if (fabs(R1 - D21 * fabs(Z)) >
MINDIST2 ||
true) {
1399 const double rp = D21 * fabs(Z) + R1;
1400 const double rm = D21 * fabs(Z) - R1;
1401 TanhTerm1 *= (I2 * I2 + rm * rm) / (I2 * I2 + rp * rp);
1403 TanhTerm1 = 0.5 * log(TanhTerm1);
1407 double a = D11 * D11 * Z * Z;
1408 double b = R1 * R1 + I1 * I1;
1409 double tmp = atan(2 * I1 * D11 * fabs(Z) / (a - b));
1420 double a = D21 * D21 * Z * Z;
1421 double b = R1 * R1 + I2 * I2;
1422 double tmp = atan(2 * I2 * D21 * fabs(Z) / (a - b));
1435 printf(
"TanhTerm1: %.16lg, TanhTerm2: %.16lg\n", TanhTerm1, TanhTerm2);
1439 double Pot = (zMax * Y * Y - X * G) * LTerm1 -
1440 (zMax * X + G) * modY * LTerm2 + (S1 * X * TanhTerm1) +
1441 S1 * modY * TanhTerm2 + 2. * (G * DTerm1 - Z * DTerm2);
1444 G * LTerm1 + zMax * modY * LTerm2 - S1 * TanhTerm1 - 2.0 * zMax * DTerm1;
1446 double Fy = -zMax * Y * LTerm1 + G * SY * LTerm2 - S1 * SY * TanhTerm2;
1449 double Fz = DTerm2 - DTerm1;
1451 printf(
"Pot: %.16lg, Fx: %.16lg, Fy: %.16lg, Fz: %.16lg\n", Pot, Fx, Fy,
1463 if ((X >= 0.0) && (X <= 1.0)) {
1466 if ((Z >= 0.0) && (Z <= Zhyp)) {
1469 Pot -= modY *
ST_PI;
1476 }
else if ((Z <= 0.0) && (Z >= -Zhyp)) {
1479 Pot += modY *
ST_PI;
1486 }
else if (((Z > Zhyp) && (Z <= zMax))) {
1490 Pot -= modY *
ST_PI;
1497 }
else if ((Z < -Zhyp) && (Z >= -zMax)) {
1501 Pot += modY *
ST_PI;
1508 }
else if (Z > zMax) {
1511 Pot -= modY *
ST_PI;
1518 }
else if (Z < -zMax) {
1521 Pot += modY *
ST_PI;
1562 printf(
"After constant addition %d\n", ConstAdd);
1563 printf(
"Pot: %.16lg, Fx: %.16lg, Fy: %.16lg, Fz: %.16lg\n", Pot, Fx, Fy,
1570 if ((Pot < 0) || isnan(Pot) || isinf(Pot)) {
1571 fprintf(
fIsles,
"\n---Approximation in ExactTriSurf---\n");
1572 fprintf(
fIsles,
"Problem with potential ... approximating!\n");
1573 fprintf(
fIsles,
"zMax: %.16lg, X: %.16lg, Y: %.16lg, Z: %.16lg\n", zMax, X,
1575 fprintf(
fIsles,
"D11: %.16lg, D21: %.16lg, D12: %.16lg, Hypot: %.16lg\n",
1576 D11, D21, D12, Hypot);
1577 fprintf(
fIsles,
"modY: %.16lg, G: %.16lg\n", modY, G);
1578 fprintf(
fIsles,
"E1: %.16lg, E2: %.16lg, H1: %.16lg, H2: %.16lg\n", E1, E2,
1580 fprintf(
fIsles,
"S1: %d, R1: %.16lg, I1: %.16lg, I2: %.16lg\n", S1, R1, I1,
1582 fprintf(
fIsles,
"Pot: %.16lg\n", Pot);
1590 if (isnan(Fx) || isinf(Fx)) {
1591 fprintf(
fIsles,
"\n---Approximation in ExactTriSurf---\n");
1592 fprintf(
fIsles,
"Problem with Fx ... approximating!\n");
1593 fprintf(
fIsles,
"zMax: %.16lg, X: %.16lg, Y: %.16lg, Z: %.16lg\n", zMax, X,
1595 fprintf(
fIsles,
"D11: %.16lg, D21: %.16lg, D12: %.16lg, Hypot: %.16lg\n",
1596 D11, D21, D12, Hypot);
1597 fprintf(
fIsles,
"modY: %.16lg, G: %.16lg\n", modY, G);
1598 fprintf(
fIsles,
"E1: %.16lg, E2: %.16lg, H1: %.16lg, H2: %.16lg\n", E1, E2,
1600 fprintf(
fIsles,
"S1: %d, R1: %.16lg, I1: %.16lg, I2: %.16lg\n", S1, R1, I1,
1602 fprintf(
fIsles,
"Fx: %.16lg\n", Fx);
1610 if (isnan(Fy) || isinf(Fy)) {
1611 fprintf(
fIsles,
"\n---Approximation in ExactTriSurf---\n");
1612 fprintf(
fIsles,
"Problem with Fy ... approximating!\n");
1613 fprintf(
fIsles,
"zMax: %.16lg, X: %.16lg, Y: %.16lg, Z: %.16lg\n", zMax, X,
1615 fprintf(
fIsles,
"D11: %.16lg, D21: %.16lg, D12: %.16lg, Hypot: %.16lg\n",
1616 D11, D21, D12, Hypot);
1617 fprintf(
fIsles,
"modY: %.16lg, G: %.16lg\n", modY, G);
1618 fprintf(
fIsles,
"E1: %.16lg, E2: %.16lg, H1: %.16lg, H2: %.16lg\n", E1, E2,
1620 fprintf(
fIsles,
"S1: %d, R1: %.16lg, I1: %.16lg, I2: %.16lg\n", S1, R1, I1,
1622 fprintf(
fIsles,
"Fy: %.16lg\n", Fy);
1630 if (isnan(Fz) || isinf(Fz)) {
1631 fprintf(
fIsles,
"\n---Approximation in ExactTriSurf---\n");
1632 fprintf(
fIsles,
"Problem with Fz ... approximating!\n");
1633 fprintf(
fIsles,
"zMax: %.16lg, X: %.16lg, Y: %.16lg, Z: %.16lg\n", zMax, X,
1635 fprintf(
fIsles,
"D11: %.16lg, D21: %.16lg, D12: %.16lg, Hypot: %.16lg\n",
1636 D11, D21, D12, Hypot);
1637 fprintf(
fIsles,
"modY: %.16lg\n", modY);
1638 fprintf(
fIsles,
"E1: %.16lg, E2: %.16lg\n", E1, E2);
1639 fprintf(
fIsles,
"Fz: %.16lg\n", Fz);
1653 if (
DebugISLES) printf(
"Going out of ExactTriSurf ...\n\n");
2276 printf(
"In LineKnChPF:\n");
2277 printf(
"LineStart: %lg %lg %lg\n", LineStart.
X, LineStart.
Y, LineStart.
Z);
2278 printf(
"LineStop: %lg %lg %lg\n", LineStop.
X, LineStop.
Y, LineStop.
Z);
2279 printf(
"FieldPt: %lg %lg %lg\n", FieldPt.
X, FieldPt.
Y, FieldPt.
Z);
2282 double xvert[2], yvert[2], zvert[2];
2283 xvert[0] = LineStart.
X;
2284 xvert[1] = LineStop.
X;
2285 yvert[0] = LineStart.
Y;
2286 yvert[1] = LineStop.
Y;
2287 zvert[0] = LineStart.
Z;
2288 zvert[1] = LineStop.
Z;
2290 double xfld = FieldPt.
X;
2291 double yfld = FieldPt.
Y;
2292 double zfld = FieldPt.
Z;
2294 double xorigin = 0.5 * (xvert[1] + xvert[0]);
2295 double yorigin = 0.5 * (yvert[1] + yvert[0]);
2296 double zorigin = 0.5 * (zvert[1] + zvert[0]);
2299 printf(
"xorigin: %lg, yorigin: %lg, zorigin: %lg\n", xorigin, yorigin,
2301 printf(
"LZ: %lg\n", LZ);
2315 DirCos.
ZUnit.
X = (xvert[1] - xvert[0]) / LZ;
2316 DirCos.
ZUnit.
Y = (yvert[1] - yvert[0]) / LZ;
2317 DirCos.
ZUnit.
Z = (zvert[1] - zvert[0]) / LZ;
2328 double maxComp = fabs(ZUnit.
X);
2329 if (fabs(ZUnit.
Y) > maxComp) {
2331 maxComp = fabs(ZUnit.
Y);
2333 if (fabs(ZUnit.
Z) > maxComp) {
2335 maxComp = fabs(ZUnit.
Z);
2342 XUnit.
X = (ZUnit.
Y + ZUnit.
Z) / ZUnit.
X;
2347 XUnit.
Y = (ZUnit.
X + ZUnit.
Z) / ZUnit.
Y;
2352 XUnit.
Z = (ZUnit.
X + ZUnit.
Y) / ZUnit.
Z;
2376 double InitialVector[3] = {xfld - xorigin, yfld - yorigin, zfld - zorigin};
2377 double TransformationMatrix[3][3] = {{0.0, 0.0, 0.0},
2380 TransformationMatrix[0][0] = DirCos.
XUnit.
X;
2381 TransformationMatrix[0][1] = DirCos.
XUnit.
Y;
2382 TransformationMatrix[0][2] = DirCos.
XUnit.
Z;
2383 TransformationMatrix[1][0] = DirCos.
YUnit.
X;
2384 TransformationMatrix[1][1] = DirCos.
YUnit.
Y;
2385 TransformationMatrix[1][2] = DirCos.
YUnit.
Z;
2386 TransformationMatrix[2][0] = DirCos.
ZUnit.
X;
2387 TransformationMatrix[2][1] = DirCos.
ZUnit.
Y;
2388 TransformationMatrix[2][2] = DirCos.
ZUnit.
Z;
2389 double FinalVector[3];
2391 for (
int i = 0; i < 3; ++i) {
2392 FinalVector[i] = 0.0;
2393 for (
int j = 0; j < 3; ++j) {
2394 FinalVector[i] += TransformationMatrix[i][j] * InitialVector[j];
2398 localPt.
X = FinalVector[0];
2399 localPt.
Y = FinalVector[1];
2400 localPt.
Z = FinalVector[2];
2405 double xpt = localPt.
X;
2406 double ypt = localPt.
Y;
2407 double zpt = localPt.
Z;
2413 printf(
"localPt: %lg %lg %lg\n", localPt.
X, localPt.
Y, localPt.
Z);
2414 printf(
"LZ: %lg\n", LZ);
2418 double zptplus = zpt + 0.5 * LZ;
2419 double zptminus = zpt - 0.5 * LZ;
2460 double tmpxy = xpt * xpt + ypt * ypt;
2461 double tmpzplus = sqrt(zptplus * zptplus + xpt * xpt + ypt * ypt);
2462 double tmpzminus = sqrt(xpt * xpt + ypt * ypt + zptminus * zptminus);
2464 log(zptplus + tmpzplus) - log(zptminus + tmpzminus);
2465 localF.
X = xpt * ((zptplus / tmpxy / tmpzplus) -
2466 (zptminus / tmpxy / tmpzminus));
2467 localF.
Y = ypt * ((zptplus / tmpxy / tmpzplus) -
2468 (zptminus / tmpxy / tmpzminus));
2469 localF.
Z = (1.0 / tmpzminus) - (1.0 / tmpzplus);
2471 printf(
"Using MatLab expressions =>\n");
2472 printf(
"Pot: %lg\n", Pot);
2473 printf(
"localF: %lg %lg %lg\n", localF.
X, localF.
Y, localF.
Z);
2499 printf(
"Pot: %lg\n", Pot);
2500 printf(
"localF: %lg %lg %lg\n", localF.
X, localF.
Y, localF.
Z);
2505 printf(
"globalF: %lg %lg %lg\n", globalF->
X, globalF->
Y, globalF->
Z);
2698 "Only rectangular areas with known charges allowed at present ...\n");
2702 double xvert[4], yvert[4], zvert[4];
2703 xvert[0] = Vertex[0].
X;
2704 xvert[1] = Vertex[1].
X;
2705 xvert[2] = Vertex[2].
X;
2706 xvert[3] = Vertex[3].
X;
2707 yvert[0] = Vertex[0].
Y;
2708 yvert[1] = Vertex[1].
Y;
2709 yvert[2] = Vertex[2].
Y;
2710 yvert[3] = Vertex[3].
Y;
2711 zvert[0] = Vertex[0].
Z;
2712 zvert[1] = Vertex[1].
Z;
2713 zvert[2] = Vertex[2].
Z;
2714 zvert[3] = Vertex[3].
Z;
2716 double xfld = FieldPt.
X;
2717 double yfld = FieldPt.
Y;
2718 double zfld = FieldPt.
Z;
2720 double xorigin = 0.25 * (xvert[3] + xvert[2] + xvert[1] + xvert[0]);
2721 double yorigin = 0.25 * (yvert[3] + yvert[2] + yvert[1] + yvert[0]);
2722 double zorigin = 0.25 * (zvert[3] + zvert[2] + zvert[1] + zvert[0]);
2725 double SurfLX = sqrt((xvert[1] - xvert[0]) * (xvert[1] - xvert[0]) +
2726 (yvert[1] - yvert[0]) * (yvert[1] - yvert[0]) +
2727 (zvert[1] - zvert[0]) * (zvert[1] - zvert[0]));
2728 double SurfLZ = sqrt((xvert[2] - xvert[1]) * (xvert[2] - xvert[1]) +
2729 (yvert[2] - yvert[1]) * (yvert[2] - yvert[1]) +
2730 (zvert[2] - zvert[1]) * (zvert[2] - zvert[1]));
2746 DirCos.
XUnit.
X = (xvert[1] - xvert[0]) / SurfLX;
2747 DirCos.
XUnit.
Y = (yvert[1] - yvert[0]) / SurfLX;
2748 DirCos.
XUnit.
Z = (zvert[1] - zvert[0]) / SurfLX;
2749 DirCos.
ZUnit.
X = (xvert[0] - xvert[3]) / SurfLZ;
2750 DirCos.
ZUnit.
Y = (yvert[0] - yvert[3]) / SurfLZ;
2751 DirCos.
ZUnit.
Z = (zvert[0] - zvert[3]) / SurfLZ;
2759 double InitialVector[3] = {xfld - xorigin, yfld - yorigin, zfld - zorigin};
2760 double TransformationMatrix[3][3] = {{0.0, 0.0, 0.0},
2763 TransformationMatrix[0][0] = DirCos.
XUnit.
X;
2764 TransformationMatrix[0][1] = DirCos.
XUnit.
Y;
2765 TransformationMatrix[0][2] = DirCos.
XUnit.
Z;
2766 TransformationMatrix[1][0] = DirCos.
YUnit.
X;
2767 TransformationMatrix[1][1] = DirCos.
YUnit.
Y;
2768 TransformationMatrix[1][2] = DirCos.
YUnit.
Z;
2769 TransformationMatrix[2][0] = DirCos.
ZUnit.
X;
2770 TransformationMatrix[2][1] = DirCos.
ZUnit.
Y;
2771 TransformationMatrix[2][2] = DirCos.
ZUnit.
Z;
2772 double FinalVector[3];
2774 for (
int i = 0; i < 3; ++i) {
2775 FinalVector[i] = 0.0;
2776 for (
int j = 0; j < 3; ++j) {
2777 FinalVector[i] += TransformationMatrix[i][j] * InitialVector[j];
2781 localPt.
X = FinalVector[0];
2782 localPt.
Y = FinalVector[1];
2783 localPt.
Z = FinalVector[2];
2788 double xpt = localPt.
X;
2789 double ypt = localPt.
Y;
2790 double zpt = localPt.
Z;
2794 double diag = sqrt(a * a + b * b);
2797 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
2798 double dist3 = dist * dist * dist;
2804 localF.
X = xpt * dA / dist3;
2805 localF.
Y = ypt * dA / dist3;
2806 localF.
Z = zpt * dA / dist3;
2810 ExactRecSurf(xpt / a, ypt / a, zpt / a, -1.0 / 2.0, -(b / a) / 2.0,
2811 1.0 / 2.0, (b / a) / 2.0, &Pot, &localF);
2813 printf(
"problem in computing Potential of rectangular element ... \n");
2814 printf(
"a: %lg, b: %lg, X: %lg, Y: %lg, Z: %lg\n", a, b, xpt, ypt, zpt);