22static constexpr double InvFourPiEps0 = 1. /
MyFACTOR;
36 switch ((
EleArr + ele - 1)->G.Type) {
38 value =
RecPot(ele, localP);
41 value =
TriPot(ele, localP);
47 printf(
"Geometrical type out of range! ... exiting ...\n");
58 printf(
"In RecPot ...\n");
63 double xpt = localP->
X;
64 double ypt = localP->
Y;
65 double zpt = localP->
Z;
67 double a = (
EleArr + ele - 1)->G.LX;
68 double b = (
EleArr + ele - 1)->G.LZ;
69 double diag = sqrt(a * a + b * b);
72 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
79 int fstatus =
ExactRecSurf(xpt / a, ypt / a, zpt / a, -0.5, -(b / a) / 2.0,
80 0.5, (b / a) / 2.0, &Pot, &Field);
82 printf(
"problem in computing Potential of rectangular element ... \n");
83 printf(
"a: %lg, b: %lg, X: %lg, Y: %lg, Z: %lg\n", a, b, xpt, ypt, zpt);
91 return Pot * InvFourPiEps0;
100 printf(
"In TriPot ...\n");
105 double xpt = localP->
X;
106 double ypt = localP->
Y;
107 double zpt = localP->
Z;
110 double a = (
EleArr + ele - 1)->G.LX;
111 double b = (
EleArr + ele - 1)->G.LZ;
113 double diag = sqrt(a * a + b * b);
115 const double xm = xpt - a / 3.;
116 const double zm = zpt - b / 3.;
117 double dist = sqrt(xm * xm + ypt * ypt + zm * zm);
120 double dA = 0.5 * a * b;
123 int fstatus =
ExactTriSurf(b / a, xpt / a, ypt / a, zpt / a, &Pot, &Field);
125 printf(
"problem in computing Potential of triangular element ... \n");
126 printf(
"a: %lg, b: %lg, X: %lg, Y: %lg, Z: %lg\n", a, b, xpt, ypt, zpt);
134 return Pot * InvFourPiEps0;
144 printf(
"In WirePot ...\n");
148 double xpt = localP->
X;
149 double ypt = localP->
Y;
150 double zpt = localP->
Z;
152 double rW = (
EleArr + ele - 1)->G.LX;
153 double lW = (
EleArr + ele - 1)->G.LZ;
156 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
159 double dA = 2.0 *
ST_PI * rW * lW;
172 return Pot * InvFourPiEps0;
183 switch ((
EleArr + ele - 1)->G.Type) {
194 printf(
"Geometrical type out of range! ... exiting ...\n");
205 switch ((
EleArr + ele - 1)->G.Type) {
216 printf(
"Geometrical type out of range! ... exiting ...\n");
225 printf(
"In RecFlux ...\n");
228 double xpt = localP->
X;
229 double ypt = localP->
Y;
230 double zpt = localP->
Z;
232 double a = (
EleArr + ele - 1)->G.LX;
233 double b = (
EleArr + ele - 1)->G.LZ;
234 double diag = sqrt(a * a + b * b);
237 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
241 const double f = a * b / (dist * dist * dist);
247 int fstatus =
ExactRecSurf(xpt / a, ypt / a, zpt / a, -0.5, -(b / a) / 2.0,
248 0.5, (b / a) / 2.0, &Pot, localF);
250 printf(
"problem in computing flux of rectangular element ... \n");
257 localF->
X *= InvFourPiEps0;
258 localF->
Y *= InvFourPiEps0;
259 localF->
Z *= InvFourPiEps0;
270 printf(
"In TriFlux ...\n");
273 double xpt = localP->
X;
274 double ypt = localP->
Y;
275 double zpt = localP->
Z;
277 double a = (
EleArr + ele - 1)->G.LX;
278 double b = (
EleArr + ele - 1)->G.LZ;
279 double diag = sqrt(a * a + b * b);
285 const double xm = xpt - a / 3.;
286 const double zm = zpt - b / 3.;
287 double dist = sqrt(xm * xm + ypt * ypt + zm * zm);
290 const double f = 0.5 * a * b / (dist * dist * dist);
296 int fstatus =
ExactTriSurf(b / a, xpt / a, ypt / a, zpt / a, &Pot, localF);
299 printf(
"problem in computing flux of triangular element ... \n");
306 localF->
X *= InvFourPiEps0;
307 localF->
Y *= InvFourPiEps0;
308 localF->
Z *= InvFourPiEps0;
322 printf(
"In WireFlux ...\n");
325 double xpt = localP->
X;
326 double ypt = localP->
Y;
327 double zpt = localP->
Z;
328 double rW = (
EleArr + ele - 1)->G.LX;
329 double lW = (
EleArr + ele - 1)->G.LZ;
332 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
335 const double f = 2.0 *
ST_PI * rW * lW / (dist * dist * dist);
341 localF->
X = localF->
Y = 0.0;
353 localF->
X *= InvFourPiEps0;
354 localF->
Y *= InvFourPiEps0;
355 localF->
Z *= InvFourPiEps0;
369 int fstatus =
ElePFAtPoint(globalP, &ElePot, &EleglobalF);
372 "Problem in ElePFAtPoint being called from PFAtPoint ... returning\n");
376 globalF->
X = EleglobalF.
X;
377 globalF->
Y = EleglobalF.
Y;
378 globalF->
Z = EleglobalF.
Z;
386 "Problem in KnChPFAtPoint being called from PFAtPoint ... "
390 *Potential += KnChPot;
391 globalF->
X += KnChglobalF.
X;
392 globalF->
Y += KnChglobalF.
Y;
393 globalF->
Z += KnChglobalF.
Z;
405 const double xfld = globalP->
X;
406 const double yfld = globalP->
Y;
407 const double zfld = globalP->
Z;
410 *Potential = globalF->
X = globalF->
Y = globalF->
Z = 0.0;
439 pPot[prim] = plFx[prim] = plFy[prim] = plFz[prim] = 0.0;
443 int tid = 0, nthreads = 1;
444#pragma omp parallel private(tid, nthreads)
449 tid = omp_get_thread_num();
451 nthreads = omp_get_num_threads();
452 printf(
"PFAtPoint computation with %d threads\n", nthreads);
460 for (
int primsrc = 1; primsrc <=
NbPrimitives; ++primsrc) {
462 printf(
"Evaluating effect of primsrc %d using on %lg, %lg, %lg\n",
463 primsrc, xfld, yfld, zfld);
478 double TransformationMatrix[3][3];
479 TransformationMatrix[0][0] =
PrimDC[primsrc].XUnit.X;
480 TransformationMatrix[0][1] =
PrimDC[primsrc].XUnit.Y;
481 TransformationMatrix[0][2] =
PrimDC[primsrc].XUnit.Z;
482 TransformationMatrix[1][0] =
PrimDC[primsrc].YUnit.X;
483 TransformationMatrix[1][1] =
PrimDC[primsrc].YUnit.Y;
484 TransformationMatrix[1][2] =
PrimDC[primsrc].YUnit.Z;
485 TransformationMatrix[2][0] =
PrimDC[primsrc].ZUnit.X;
486 TransformationMatrix[2][1] =
PrimDC[primsrc].ZUnit.Y;
487 TransformationMatrix[2][2] =
PrimDC[primsrc].ZUnit.Z;
514 double InitialVector[3] = {xfld - xpsrc, yfld - ypsrc, zfld - zpsrc};
515 double FinalVector[3] = {0., 0., 0.};
516 for (
int i = 0; i < 3; ++i) {
517 for (
int j = 0; j < 3; ++j) {
518 FinalVector[i] += TransformationMatrix[i][j] * InitialVector[j];
522 localPP.
X = FinalVector[0];
523 localPP.
Y = FinalVector[1];
524 localPP.
Z = FinalVector[2];
525 GetPrimPF(primsrc, &localPP, &tmpPot, &tmpF);
527 pPot[primsrc] += qpr * tmpPot;
533 printf(
"PFAtPoint base primitive =>\n");
534 printf(
"primsrc: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n", primsrc,
535 localPP.
X, localPP.
Y, localPP.
Z);
536 printf(
"primsrc: %d, Pot: %lg, Fx: %lg, Fx: %lg, Fz: %lg\n", primsrc,
537 tmpPot, tmpF.
X, tmpF.
Y, tmpF.
Z);
538 printf(
"primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n",
539 primsrc, pPot[primsrc], lFx, lFy, lFz);
554 for (
int ele = eleMin; ele <= eleMax; ++ele) {
555 const double xsrc = (
EleArr + ele - 1)->G.Origin.X;
556 const double ysrc = (
EleArr + ele - 1)->G.Origin.Y;
557 const double zsrc = (
EleArr + ele - 1)->G.Origin.Z;
559 double vG[3] = {xfld - xsrc, yfld - ysrc, zfld - zsrc};
560 double vL[3] = {0., 0., 0.};
561 for (
int i = 0; i < 3; ++i) {
562 for (
int j = 0; j < 3; ++j) {
563 vL[i] += TransformationMatrix[i][j] * vG[j];
567 const int type = (
EleArr + ele - 1)->G.Type;
568 const double a = (
EleArr + ele - 1)->G.LX;
569 const double b = (
EleArr + ele - 1)->G.LZ;
570 GetPF(type, a, b, vL[0], vL[1], vL[2], &tPot, &tF);
579 printf(
"PFAtPoint base primitive:%d\n", primsrc);
580 printf(
"ele: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n", ele,
581 vL[0], vL[1], vL[2]);
583 "ele: %d, tPot: %lg, tFx: %lg, tFy: %lg, tFz: %lg, Solution: "
585 ele, tPot, tF.
X, tF.
Y, tF.
Z, qel);
586 printf(
"ele: %d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: %lg\n", ele,
587 ePot, eF.
X, eF.
Y, eF.
Z);
592 pPot[primsrc] += ePot;
597 printf(
"prim%d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: %lg\n", primsrc,
598 ePot, eF.
X, eF.
Y, eF.
Z);
599 printf(
"prim%d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n", primsrc,
600 pPot[primsrc], lFx, lFy, lFz);
607 printf(
"basic primitive\n");
608 printf(
"primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n",
609 primsrc, pPot[primsrc], lFx, lFy, lFz);
615 printf(
"Mirror may not be correctly implemented ...\n");
625 if (perx || pery || perz) {
626 for (
int xrpt = -perx; xrpt <= perx; ++xrpt) {
627 const double xShift =
XPeriod[primsrc] * (double)xrpt;
628 const double XPOfRpt = xpsrc + xShift;
629 for (
int yrpt = -pery; yrpt <= pery; ++yrpt) {
630 const double yShift =
YPeriod[primsrc] * (double)yrpt;
631 const double YPOfRpt = ypsrc + yShift;
632 for (
int zrpt = -perz; zrpt <= perz; ++zrpt) {
633 const double zShift =
ZPeriod[primsrc] * (double)zrpt;
634 const double ZPOfRpt = zpsrc + zShift;
636 if ((xrpt == 0) && (yrpt == 0) && (zrpt == 0))
continue;
651 double InitialVector[3] = {xfld - XPOfRpt, yfld - YPOfRpt,
653 double FinalVector[3] = {0., 0., 0.};
654 for (
int i = 0; i < 3; ++i) {
655 for (
int j = 0; j < 3; ++j) {
657 TransformationMatrix[i][j] * InitialVector[j];
661 localPPR.
X = FinalVector[0];
662 localPPR.
Y = FinalVector[1];
663 localPPR.
Z = FinalVector[2];
668 GetPrimPF(primsrc, &localPPR, &tmpPot, &tmpF);
670 pPot[primsrc] += qpr * tmpPot;
677 "primsrc: %d, xlocal: %lg, ylocal: %lg, zlocal: "
679 primsrc, localPPR.
X, localPPR.
Y, localPPR.
Z);
680 printf(
"primsrc: %d, Pot: %lg, Fx: %lg, Fy: %lg, Fz: %lg\n",
681 primsrc, tmpPot * qpr, tmpF.
X * qpr, tmpF.
Y * qpr,
684 "primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: "
686 primsrc, pPot[primsrc], lFx, lFy, lFz);
700 for (
int ele = eleMin; ele <= eleMax; ++ele) {
701 const double xrsrc = (
EleArr + ele - 1)->G.Origin.X;
702 const double yrsrc = (
EleArr + ele - 1)->G.Origin.Y;
703 const double zrsrc = (
EleArr + ele - 1)->G.Origin.Z;
705 const double XEOfRpt = xrsrc + xShift;
706 const double YEOfRpt = yrsrc + yShift;
707 const double ZEOfRpt = zrsrc + zShift;
709 double vG[3] = {xfld - XEOfRpt, yfld - YEOfRpt,
711 double vL[3] = {0., 0., 0.};
712 for (
int i = 0; i < 3; ++i) {
713 for (
int j = 0; j < 3; ++j) {
714 vL[i] += TransformationMatrix[i][j] * vG[j];
720 const int type = (
EleArr + ele - 1)->G.Type;
721 const double a = (
EleArr + ele - 1)->G.LX;
722 const double b = (
EleArr + ele - 1)->G.LZ;
723 GetPF(type, a, b, vL[0], vL[1], vL[2], &tPot, &tF);
725 (
EleArr + ele - 1)->Assigned;
732 printf(
"PFAtPoint base primitive:%d\n", primsrc);
733 printf(
"ele: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n",
734 ele, vL[0], vL[1], vL[2]);
736 "ele: %d, tPot: %lg, tFx: %lg, tFy: %lg, tFz: %lg, "
738 ele, tPot, tF.
X, tF.
Y, tF.
Z, qel);
740 "ele: %d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: %lg\n",
741 ele, erPot, erF.
X, erF.
Y, erF.
Z);
747 pPot[primsrc] += erPot;
755 printf(
"basic repeated xrpt: %d. yrpt: %d, zrpt: %d\n", xrpt,
758 "primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n",
759 primsrc, pPot[primsrc], lFx, lFy, lFz);
767 "Mirror not correctly implemented in this version of "
793 'X', primsrc, srcptp, fldpt,
805 pPot[primsrc] -= qpr * tmpPot;
811 pPot[primsrc] += qpr * tmpPot;
822 for (
int ele = eleMin; ele <= eleMax; ++ele) {
823 const double xsrc = (
EleArr + ele - 1)->G.Origin.X;
824 const double ysrc = (
EleArr + ele - 1)->G.Origin.Y;
825 const double zsrc = (
EleArr + ele - 1)->G.Origin.Z;
827 const double XEOfRpt = xsrc + xShift;
828 const double YEOfRpt = ysrc + yShift;
829 const double ZEOfRpt = zsrc + zShift;
836 'X', ele, srcpte, fldpt,
838 const int type = (
EleArr + ele - 1)->G.Type;
839 const double a = (
EleArr + ele - 1)->G.LX;
840 const double b = (
EleArr + ele - 1)->G.LZ;
841 GetPFGCS(type, a, b, &localPERM, &tmpPot, &tmpF,
844 (
EleArr + ele - 1)->Assigned;
847 pPot[primsrc] -= qel * tmpPot;
853 pPot[primsrc] += qel * tmpPot;
876 pPot[primsrc] -= qpr * tmpPot;
882 pPot[primsrc] += qpr * tmpPot;
893 for (
int ele = eleMin; ele <= eleMax; ++ele) {
894 const double xsrc = (
EleArr + ele - 1)->G.Origin.X;
895 const double ysrc = (
EleArr + ele - 1)->G.Origin.Y;
896 const double zsrc = (
EleArr + ele - 1)->G.Origin.Z;
898 const double XEOfRpt = xsrc + xShift;
899 const double YEOfRpt = ysrc + yShift;
900 const double ZEOfRpt = zsrc + zShift;
907 'Y', ele, srcpte, fldpt,
909 const int type = (
EleArr + ele - 1)->G.Type;
910 const double a = (
EleArr + ele - 1)->G.LX;
911 const double b = (
EleArr + ele - 1)->G.LZ;
912 GetPFGCS(type, a, b, &localPERM, &tmpPot, &tmpF,
915 (
EleArr + ele - 1)->Assigned;
918 pPot[primsrc] -= qel * tmpPot;
924 pPot[primsrc] += qel * tmpPot;
947 pPot[primsrc] -= qpr * tmpPot;
953 pPot[primsrc] += qpr * tmpPot;
965 for (
int ele = eleMin; ele <= eleMax; ++ele) {
966 const double xsrc = (
EleArr + ele - 1)->G.Origin.X;
967 const double ysrc = (
EleArr + ele - 1)->G.Origin.Y;
968 const double zsrc = (
EleArr + ele - 1)->G.Origin.Z;
970 const double XEOfRpt = xsrc + xShift;
971 const double YEOfRpt = ysrc + yShift;
972 const double ZEOfRpt = zsrc + zShift;
979 'Z', ele, srcpte, fldpt,
981 const int type = (
EleArr + ele - 1)->G.Type;
982 const double a = (
EleArr + ele - 1)->G.LX;
983 const double b = (
EleArr + ele - 1)->G.LZ;
984 GetPFGCS(type, a, b, &localPERM, &tmpPot, &tmpF,
987 (
EleArr + ele - 1)->Assigned;
990 pPot[primsrc] -= qel * tmpPot;
996 pPot[primsrc] += qel * tmpPot;
1016 plFx[primsrc] = tmpF.
X;
1017 plFy[primsrc] = tmpF.
Y;
1018 plFz[primsrc] = tmpF.
Z;
1022 double totPot = 0.0;
1024 totF.
X = totF.
Y = totF.
Z = 0.0;
1026 totPot += pPot[prim];
1027 totF.
X += plFx[prim];
1028 totF.
Y += plFy[prim];
1029 totF.
Z += plFz[prim];
1034 *Potential = totPot * InvFourPiEps0;
1035 globalF->
X = totF.
X * InvFourPiEps0;
1036 globalF->
Y = totF.
Y * InvFourPiEps0;
1037 globalF->
Z = totF.
Z * InvFourPiEps0;
1047 printf(
"Final values due to all primitives: ");
1050 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", xfld, yfld, zfld,
1051 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
1073 fldPt.
X = globalP->
X;
1074 fldPt.
Y = globalP->
Y;
1075 fldPt.
Z = globalP->
Z;
1080 globalF->
X = globalF->
Y = globalF->
Z = 0.0;
1096 printf(
"Final values due to all known point charges (*MyFACTOR): ");
1098 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", fldPt.
X, fldPt.
Y, fldPt.
Z,
1099 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
1111 tmpPot =
LineKnChPF(startPt, stopPt, fldPt, &tmpF);
1112 (*Potential) +=
LineKnChArr[line].Assigned * tmpPot;
1119 printf(
"Final values due to all known line charges (*MyFACTOR): ");
1121 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", fldPt.
X, fldPt.
Y, fldPt.
Z,
1122 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
1130 ((
AreaKnChArr + area - 1)->Vertex), fldPt, &tmpF);
1131 (*Potential) += (
AreaKnChArr + area - 1)->Assigned * tmpPot;
1138 printf(
"Final values due to all known area charges (*MyFACTOR): ");
1140 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", fldPt.
X, fldPt.
Y, fldPt.
Z,
1141 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
1148 (*Potential) += (
VolumeKnChArr + vol - 1)->Assigned * tmpPot;
1155 printf(
"Final values due to all known volume charges (*MyFACTOR): ");
1158 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", fldPt.
X, fldPt.
Y, fldPt.
Z,
1159 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
1176 "\nPhysical potential and field computation for voxelized data export\n");
1178 char VoxelFile[256];
1180 strcat(VoxelFile,
"/VoxelFPR.out");
1181 FILE *fVoxel = fopen(VoxelFile,
"w");
1182 if (fVoxel == NULL) {
1188 "# X(cm)\tY(cm)\tZ(cm)\tFX(V/cm)\tFY(V/cm)\tFZ(V/cm)\tPot(V)\tRegion\n");
1191 printf(
"VoxelFPR.out created ...\n");
1195 int nbXCells =
Voxel.NbXCells;
1196 int nbYCells =
Voxel.NbYCells;
1197 int nbZCells =
Voxel.NbZCells;
1198 double startX =
Voxel.Xmin;
1199 double startY =
Voxel.Ymin;
1200 double startZ =
Voxel.Zmin;
1201 double delX = (
Voxel.Xmax -
Voxel.Xmin) / nbXCells;
1202 double delY = (
Voxel.Ymax -
Voxel.Ymin) / nbYCells;
1203 double delZ = (
Voxel.Zmax -
Voxel.Zmin) / nbZCells;
1206 double *VoxelFX =
dvector(0, nbZCells + 1);
1207 double *VoxelFY =
dvector(0, nbZCells + 1);
1208 double *VoxelFZ =
dvector(0, nbZCells + 1);
1209 double *VoxelP =
dvector(0, nbZCells + 1);
1212 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
1214 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY, startZ);
1215 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
1219 for (
int i = 1; i <= nbXCells + 1; ++i) {
1220 for (
int j = 1; j <= nbYCells + 1; ++j) {
1222 printf(
"VoxelFPR => i: %4d, j: %4d", i, j);
1228 int nthreads = 1, tid = 0;
1229#pragma omp parallel private(nthreads, tid)
1234 tid = omp_get_thread_num();
1236 nthreads = omp_get_num_threads();
1237 printf(
"Starting voxel computation with %d threads\n", nthreads);
1245#pragma omp for private(k, point, potential, field)
1247 for (k = 1; k <= nbZCells + 1; ++k) {
1249 field.
X = field.
Y = field.
Z = 0.0;
1251 point.
X = startX + (i - 1) * delX;
1252 point.
Y = startY + (j - 1) * delY;
1253 point.
Z = startZ + (k - 1) * delZ;
1256 printf(
"i, j, k: %d, %d, %d\n", i, j, k);
1257 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
1263 int fstatus =
PFAtPoint(&point, &potential, &field);
1265 neBEMMessage(
"wrong PFAtPoint return value in VoxelFPR\n");
1270 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
1277 VoxelFX[k] = field.
X;
1278 VoxelFY[k] = field.
Y;
1279 VoxelFZ[k] = field.
Z;
1280 VoxelP[k] = potential;
1284 for (
int k = 1; k <= nbZCells + 1; ++k) {
1285 point.
X = startX + (i - 1) * delX;
1286 point.
Y = startY + (j - 1) * delY;
1287 point.
Z = startZ + (k - 1) * delZ;
1305 "%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%4d\n",
1308 VoxelFY[k] / 100.0, VoxelFZ[k] / 100.0, VoxelP[k] /
LengthScale,
1334 printf(
"\nPhysical potential and field computation for 3dMap data export\n");
1336 char MapInfoFile[256];
1338 strcat(MapInfoFile,
"/MapInfo.out");
1339 FILE *fMapInfo = fopen(MapInfoFile,
"w");
1340 if (fMapInfo == NULL) {
1345 printf(
"MapInfoFile.out created ...\n");
1354 fprintf(fMapInfo,
"%d\n",
OptMap);
1356 fprintf(fMapInfo,
"%d\n",
Map.NbXCells + 1);
1357 fprintf(fMapInfo,
"%d\n",
Map.NbYCells + 1);
1358 fprintf(fMapInfo,
"%d\n",
Map.NbZCells + 1);
1359 fprintf(fMapInfo,
"%le %le\n",
Map.Xmin * 100.0,
Map.Xmax * 100.0);
1360 fprintf(fMapInfo,
"%le %le\n",
Map.Ymin * 100.0,
Map.Ymax * 100.0);
1361 fprintf(fMapInfo,
"%le %le\n",
Map.Zmin * 100.0,
Map.Zmax * 100.0);
1362 fprintf(fMapInfo,
"%le\n",
Map.XStagger * 100.0);
1363 fprintf(fMapInfo,
"%le\n",
Map.YStagger * 100.0);
1364 fprintf(fMapInfo,
"%le\n",
Map.ZStagger * 100.0);
1365 fprintf(fMapInfo,
"MapFPR.out\n");
1372 strcat(MapFile,
"/MapFPR.out");
1373 FILE *fMap = fopen(MapFile,
"w");
1379 printf(
"MapFPR.out created ...\n");
1385 "# X(cm)\tY(cm)\tZ(cm)\tFX(V/cm)\tFY(V/cm)\tFZ(V/cm)\tPot(V)\tRegion\n");
1387 int nbXCells =
Map.NbXCells;
1388 int nbYCells =
Map.NbYCells;
1389 int nbZCells =
Map.NbZCells;
1390 double startX =
Map.Xmin;
1391 double startY =
Map.Ymin;
1392 double startZ =
Map.Zmin;
1393 double delX = (
Map.Xmax -
Map.Xmin) / nbXCells;
1394 double delY = (
Map.Ymax -
Map.Ymin) / nbYCells;
1395 double delZ = (
Map.Zmax -
Map.Zmin) / nbZCells;
1397 double *MapFX =
dvector(0, nbZCells + 1);
1398 double *MapFY =
dvector(0, nbZCells + 1);
1399 double *MapFZ =
dvector(0, nbZCells + 1);
1400 double *MapP =
dvector(0, nbZCells + 1);
1403 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
1405 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY, startZ);
1406 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
1410 for (
int i = 1; i <= nbXCells + 1; ++i) {
1411 for (
int j = 1; j <= nbYCells + 1; ++j) {
1413 printf(
"MapFPR => i: %4d, j: %4d", i, j);
1419 int nthreads = 1, tid = 0;
1420#pragma omp parallel private(nthreads, tid)
1425 tid = omp_get_thread_num();
1427 nthreads = omp_get_num_threads();
1428 printf(
"Starting voxel computation with %d threads\n", nthreads);
1436#pragma omp for private(k, point, potential, field)
1438 for (k = 1; k <= nbZCells + 1; ++k) {
1439 point.
X = startX + (i - 1) * delX;
1440 point.
Y = startY + (j - 1) * delY;
1441 point.
Z = startZ + (k - 1) * delZ;
1444 printf(
"i, j, k: %d, %d, %d\n", i, j, k);
1445 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
1454 neBEMMessage(
"wrong FastPFAtPoint return value in MapFPR\n");
1459 "Suggestion: Use of FastVol can expedite generation of Map.\n");
1460 int fstatus =
PFAtPoint(&point, &potential, &field);
1462 neBEMMessage(
"wrong PFAtPoint return value in MapFPR\n");
1468 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
1478 MapP[k] = potential;
1482 for (
int k = 1; k <= nbZCells + 1; ++k) {
1484 point.
X = startX + (i - 1) * delX;
1485 point.
Y = startY + (j - 1) * delY;
1486 point.
Z = startZ + (k - 1) * delZ;
1503 fprintf(fMap,
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%4d\n",
1506 MapFY[k] / 100.0, MapFZ[k] / 100.0, MapP[k] /
LengthScale,
1522 char StgrMapFile[256];
1524 strcat(StgrMapFile,
"/StgrMapFPR.out");
1525 fMap = fopen(StgrMapFile,
"w");
1531 printf(
"StgrMapFPR.out created ...\n");
1538 "X(cm)\tY(cm)\tZ(cm)\tFX(V/cm)\tFY(V/cm)\tFZ(V/cm)\tPot(V)\tRegion\n");
1540 double LX = (
Map.Xmax -
Map.Xmin);
1542 Map.Xmax =
Map.Xmin + LX;
1543 double LY = (
Map.Ymax -
Map.Ymin);
1545 Map.Ymax =
Map.Ymin + LY;
1546 nbXCells =
Map.NbXCells;
1547 nbYCells =
Map.NbYCells;
1548 nbZCells =
Map.NbZCells;
1551 startY =
Map.Ymin +
Map.YStagger;
1553 delX = (
Map.Xmax -
Map.Xmin) / nbXCells;
1554 delY = (
Map.Ymax -
Map.Ymin) / nbYCells;
1555 delZ = (
Map.Zmax -
Map.Zmin) / nbZCells;
1557 MapFX =
dvector(0, nbZCells + 1);
1558 MapFY =
dvector(0, nbZCells + 1);
1559 MapFZ =
dvector(0, nbZCells + 1);
1560 MapP =
dvector(0, nbZCells + 1);
1563 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
1565 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY, startZ);
1566 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
1570 for (
int i = 1; i <= nbXCells + 1; ++i) {
1571 for (
int j = 1; j <= nbYCells + 1; ++j) {
1573 printf(
"StgrMapFPR => i: %4d, j: %4d", i, j);
1579 int nthreads = 1, tid = 0;
1580#pragma omp parallel private(nthreads, tid)
1585 tid = omp_get_thread_num();
1587 nthreads = omp_get_num_threads();
1588 printf(
"Starting voxel computation with %d threads\n", nthreads);
1596#pragma omp for private(k, point, potential, field)
1598 for (k = 1; k <= nbZCells + 1; ++k) {
1599 point.
X = startX + (i - 1) * delX;
1600 point.
Y = startY + (j - 1) * delY;
1601 point.
Z = startZ + (k - 1) * delZ;
1604 printf(
"i, j, k: %d, %d, %d\n", i, j, k);
1605 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
1614 neBEMMessage(
"wrong FastPFAtPoint return value in MapFPR\n");
1619 "Suggestion: Use of FastVol can expedite generation of "
1621 int fstatus =
PFAtPoint(&point, &potential, &field);
1623 neBEMMessage(
"wrong PFAtPoint return value in MapFPR\n");
1629 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
1639 MapP[k] = potential;
1643 for (
int k = 1; k <= nbZCells + 1; ++k) {
1645 point.
X = startX + (i - 1) * delX;
1646 point.
Y = startY + (j - 1) * delY;
1647 point.
Z = startZ + (k - 1) * delZ;
1665 fMap,
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%4d\n",
1667 100.0 * point.
Z /
LengthScale, MapFX[k] / 100.0, MapFY[k] / 100.0,
1668 MapFZ[k] / 100.0, MapP[k] /
LengthScale, ivol + 1);
1696 "Problem in FastVolElePF being called from FastVolPF ... returning\n");
1737 "\nPhysical potential and field computation within basic fast volume\n");
1738 int bskip = 0, iskip = 0, jskip = 0, kskip = 0;
1742 int volptcnt = 0, endskip = 0;
1744 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
1748 for (
int i = 1; i <= nbXCells + 1; ++i) {
1749 for (
int j = 1; j <= nbYCells + 1; ++j) {
1750 for (
int k = 1; k <= nbZCells + 1; ++k) {
1771 "Basic fast volume => bskip, iskip, jskip, kskip: %d, %d, %d, %d\n",
1772 bskip, iskip, jskip, kskip);
1776 char FastVolPFFile[256];
1778 strcat(FastVolPFFile,
"/FastVolPF.out");
1779 FILE *fFastVolPF = fopen(FastVolPFFile,
"w");
1780 if (fFastVolPF == NULL) {
1784 fprintf(fFastVolPF,
"#block\tX\tY\tZ\tPot\tFX\tFY\tFZ\n");
1787 printf(
"FastVolPF.out created ...\n");
1791 for (
int block = 1 + bskip; block <=
FastVol.NbBlocks; ++block) {
1800 delZ =
BlkLZ[block] / nbZCells;
1802 "NbBlocks: %d, block: %d, nbXCells: %d, nbYCells: %d, nbZCells: %d\n",
1803 FastVol.NbBlocks, block, nbXCells, nbYCells, nbZCells);
1806 printf(
"block: %d\n", block);
1807 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
1809 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY, startZ);
1810 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
1811 printf(
"bskip, iskip, jskip, kskip: %d, %d, %d, %d\n", bskip, iskip,
1817 for (
int i = 1 + iskip; i <= nbXCells + 1; ++i) {
1818 for (
int j = 1 + jskip; j <= nbYCells + 1; ++j) {
1819 printf(
"Fast volume => block: %3d, i: %4d, j: %4d", block, i, j);
1824 int nthreads = 1, tid = 0;
1825#pragma omp parallel private(nthreads, tid)
1830 tid = omp_get_thread_num();
1832 nthreads = omp_get_num_threads();
1833 printf(
"Starting fast volume computation with %d threads\n",
1843#pragma omp for private(k, point, omitFlag, potential, field)
1845 for (k = 1 + kskip; k <= nbZCells + 1; ++k) {
1847 field.
X = field.
Y = field.
Z = 0.0;
1849 point.
X = startX + (i - 1) * delX;
1850 point.
Y = startY + (j - 1) * delY;
1851 point.
Z = startZ + (k - 1) * delZ;
1856 for (
int omit = 1; omit <=
FastVol.NbOmitVols; ++omit) {
1869 printf(
"block, i, j, k: %d, %d, %d, %d\n", block, i, j, k);
1870 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
1873 printf(
"omitFlag: %d\n", omitFlag);
1878 potential = field.
X = field.
Y = field.
Z = 0.0;
1885 "wrong ElePFAtPoint return value in FastVolElePF.\n");
1890 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
1897 FastPot[block][i][j][k] = potential;
1898 FastFX[block][i][j][k] = field.
X;
1899 FastFY[block][i][j][k] = field.
Y;
1900 FastFZ[block][i][j][k] = field.
Z;
1904 for (
int k = 1 + kskip; k <= nbZCells + 1; ++k)
1906 point.
X = startX + (i - 1) * delX;
1907 point.
Y = startY + (j - 1) * delY;
1908 point.
Z = startZ + (k - 1) * delZ;
1911 "%4d\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
1920 "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
1921 "\b\b\b\b\b\b\b\b\b\b");
1929 printf(
"Potential and field computation within staggered fast volume\n");
1931 bskip = iskip = jskip = kskip = 0;
1935 int volptcnt = 0, endskip = 0;
1937 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
1941 for (
int i = 1; i <= nbXCells + 1; ++i) {
1942 for (
int j = 1; j <= nbYCells + 1; ++j) {
1943 for (
int k = 1; k <= nbZCells + 1; ++k) {
1964 "Staggered volume => bskip, iskip, jskip, kskip: %d, %d, %d, %d\n",
1965 bskip, iskip, jskip, kskip);
1969 char StgFastVolPFFile[256];
1970 FILE *fStgFastVolPF;
1971 strcpy(StgFastVolPFFile,
BCOutDir);
1972 strcat(StgFastVolPFFile,
"/StgFastVolPF.out");
1973 fStgFastVolPF = fopen(StgFastVolPFFile,
"w");
1974 if (fStgFastVolPF == NULL) {
1978 fprintf(fStgFastVolPF,
"#block\tX\tY\tZ\tPot\tFX\tFY\tFZ\n");
1981 printf(
"StgFastVolPF.out created ...\n");
1985 for (
int block = 1 + bskip; block <=
FastVol.NbBlocks; ++block) {
1994 delZ =
BlkLZ[block] / nbZCells;
1996 "NbBlocks: %d, block: %d, nbXCells: %d, nbYCells: %d, nbZCells: %d\n",
1997 FastVol.NbBlocks, block, nbXCells, nbYCells, nbZCells);
2000 printf(
"block: %d\n", block);
2001 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
2003 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY,
2005 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
2006 printf(
"bskip, iskip, jskip, kskip: %d, %d, %d, %d\n", bskip, iskip,
2012 for (
int i = 1 + iskip; i <= nbXCells + 1; ++i) {
2013 for (
int j = 1 + jskip; j <= nbYCells + 1; ++j) {
2014 printf(
"Fast volume => block: %3d, i: %4d, j: %4d", block, i, j);
2019 int nthreads = 1, tid = 0;
2020#pragma omp parallel private(nthreads, tid)
2025 tid = omp_get_thread_num();
2027 nthreads = omp_get_num_threads();
2029 "Starting staggered fast volume computation with %d "
2040#pragma omp for private(k, point, omitFlag, potential, field)
2042 for (k = 1 + kskip; k <= nbZCells + 1; ++k) {
2044 field.
X = field.
Y = field.
Z = 0.0;
2046 point.
X = startX + (i - 1) * delX;
2047 point.
Y = startY + (j - 1) * delY;
2048 point.
Z = startZ + (k - 1) * delZ;
2053 for (
int omit = 1; omit <=
FastVol.NbOmitVols; ++omit) {
2068 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
2071 printf(
"omitFlag: %d\n", omitFlag);
2076 potential = field.
X = field.
Y = field.
Z = 0.0;
2083 "wrong PFAtPoint return value in FastVolElePF.\n");
2088 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
2102 for (
int k = 1 + kskip; k <= nbZCells + 1; ++k)
2104 point.
X = startX + (i - 1) * delX;
2105 point.
Y = startY + (j - 1) * delY;
2106 point.
Z = startZ + (k - 1) * delZ;
2108 fprintf(fStgFastVolPF,
2109 "%4d\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
2115 fflush(fStgFastVolPF);
2118 "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
2119 "\b\b\b\b\b\b\b\b\b\b\b");
2124 fclose(fStgFastVolPF);
2135 double Xpt = globalP->
X;
2136 double Ypt = globalP->
Y;
2137 double Zpt = globalP->
Z;
2141 double CornerX =
FastVol.CrnrX;
2142 double CornerY =
FastVol.CrnrY;
2143 double CornerZ =
FastVol.CrnrZ;
2144 double TriLin(
double xd,
double yd,
double zd,
double c000,
double c100,
2145 double c010,
double c001,
double c110,
double c101,
double c011,
2152 for (
int ignore = 1; ignore <=
FastVol.NbIgnoreVols; ++ignore) {
2160 neBEMMessage(
"In FastPFAtPoint: point in an ignored volume!\n");
2162 int fstatus =
PFAtPoint(globalP, Potential, globalF);
2164 neBEMMessage(
"wrong PFAtPoint return value in FastVolPF.\n");
2178 printf(
"\nin FastPFAtPoint\n");
2179 printf(
"x, y, z: %g, %g, %g\n", Xpt, Ypt, Zpt);
2180 printf(
"RptVolLX, RptVolLY, RptVolLZ: %g, %g, %g\n", RptVolLX, RptVolLY,
2182 printf(
"CornerX, CornerY, CornerZ: %g, %g, %g\n", CornerX, CornerY,
2184 printf(
"Nb of blocks: %d\n",
FastVol.NbBlocks);
2185 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
2189 printf(
"LZ: %le\n",
BlkLZ[block]);
2190 printf(
"CornerZ: %le\n",
BlkCrnrZ[block]);
2196 double dx = Xpt - CornerX;
2197 double dy = Ypt - CornerY;
2198 double dz = Zpt - CornerZ;
2200 printf(
"real dx, dy, dz from volume corner: %g, %g, %g\n", dx, dy, dz);
2202 int NbFastVolX = (int)(dx / RptVolLX);
2203 if (dx < 0.0) --NbFastVolX;
2204 int NbFastVolY = (int)(dy / RptVolLY);
2205 if (dy < 0.0) --NbFastVolY;
2206 int NbFastVolZ = (int)(dz / RptVolLZ);
2207 if (dz < 0.0) --NbFastVolZ;
2209 printf(
"Volumes in x, y, z: %d, %d, %d\n", NbFastVolX, NbFastVolY,
2213 dx -= NbFastVolX * RptVolLX;
2214 dy -= NbFastVolY * RptVolLY;
2215 dz -= NbFastVolZ * RptVolLZ;
2229 if (dx > RptVolLX) {
2233 if (dy > RptVolLY) {
2237 if (dz > RptVolLZ) {
2242 printf(
"equivalent dist from corner - dx, dy, dz: %g, %g, %g\n", dx, dy,
2249 if ((RptVolLX - dx) <
MINDIST)
2260 printf(
"equivalent dist adjusted - dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
2284 if ((dx >= 0.0) && (dx <=
FastVol.LX) && (dy >= 0.0) &&
2288 }
else if ((dx >= 0.0) && (dx <=
FastVol.LX) && (dy >
FastVol.LY) &&
2304 }
else if ((dx >
FastVol.LX) && (dx <= 2.0 *
FastVol.LX) && (dy >= 0.0) &&
2315 neBEMMessage(
"FastPFAtPoint: point in none of the sectors!\n");
2317 if (dbgFn) printf(
"stagger modified dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
2324 if ((RptVolLX - dx) <
MINDIST)
2335 printf(
"equivalent dist adjusted for staggered: %g, %g, %g\n", dx, dy, dz);
2338 for(
int omit = 1; omit <=
FastVol.NbOmitVols; ++omit) {
2345 neBEMMessage(
"In FastPFAtPoint: point in an omitted volume!\n");
2347 globalF->
X = 0.0; globalF->
Y = 0.0; globalF->
Z = 0.0;
2353 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
2354 double blkBtmZ =
BlkCrnrZ[block] - CornerZ;
2355 double blkTopZ = blkBtmZ +
BlkLZ[block];
2357 printf(
"block, dz, blkBtmZ, blkTopZ: %d, %lg, %lg, %lg\n", block, dz,
2362 if ((dz <= blkBtmZ) && ((blkBtmZ - dz) <
MINDIST)) dz = blkBtmZ -
MINDIST;
2363 if ((dz >= blkBtmZ) && ((dz - blkBtmZ) <
MINDIST)) dz = blkBtmZ +
MINDIST;
2364 if ((dz <= blkTopZ) && ((blkTopZ - dz) <
MINDIST)) dz = blkTopZ -
MINDIST;
2365 if ((dz >= blkTopZ) && ((dz - blkTopZ) <
MINDIST)) dz = blkTopZ +
MINDIST;
2367 if ((dz >= blkBtmZ) && (dz <= blkTopZ)) {
2373 neBEMMessage(
"FastPFAtPoint: point in none of the blocks!\n");
2379 double delX =
FastVol.LX / nbXCells;
2380 double delY =
FastVol.LY / nbYCells;
2381 double delZ =
BlkLZ[thisBlock] / nbZCells;
2382 dz -= (
BlkCrnrZ[thisBlock] - CornerZ);
2385 printf(
"thisBlock: %d\n", thisBlock);
2386 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
2388 printf(
"BlkCrnrZ: %lg\n",
BlkCrnrZ[thisBlock]);
2389 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
2390 printf(
"dz: %lg\n", dz);
2395 int celli = (int)(dx / delX) + 1;
2401 if (celli > nbXCells) {
2406 int cellj = (int)(dy / delY) + 1;
2412 if (cellj > nbYCells) {
2417 int cellk = (int)(dz / delZ) + 1;
2423 if (cellk > nbZCells) {
2428 if (dbgFn) printf(
"Cells in x, y, z: %d, %d, %d\n", celli, cellj, cellk);
2437 double dxcellcrnr = dx - (double)(celli - 1) * delX;
2438 double dycellcrnr = dy - (double)(cellj - 1) * delY;
2439 double dzcellcrnr = dz - (double)(cellk - 1) * delZ;
2441 printf(
"cell crnr dx, dy, dz: %g, %g, %g\n", dxcellcrnr, dycellcrnr,
2445 double xd = dxcellcrnr / delX;
2446 double yd = dycellcrnr / delY;
2447 double zd = dzcellcrnr / delZ;
2448 if (xd <= 0.0) xd = 0.0;
2449 if (yd <= 0.0) yd = 0.0;
2450 if (zd <= 0.0) zd = 0.0;
2451 if (xd >= 1.0) xd = 1.0;
2452 if (yd >= 1.0) yd = 1.0;
2453 if (zd >= 1.0) zd = 1.0;
2456 double P000 =
FastPot[thisBlock][celli][cellj][cellk];
2457 double FX000 =
FastFX[thisBlock][celli][cellj][cellk];
2458 double FY000 =
FastFY[thisBlock][celli][cellj][cellk];
2459 double FZ000 =
FastFZ[thisBlock][celli][cellj][cellk];
2460 double P100 =
FastPot[thisBlock][celli + 1][cellj][cellk];
2461 double FX100 =
FastFX[thisBlock][celli + 1][cellj][cellk];
2462 double FY100 =
FastFY[thisBlock][celli + 1][cellj][cellk];
2463 double FZ100 =
FastFZ[thisBlock][celli + 1][cellj][cellk];
2464 double P010 =
FastPot[thisBlock][celli][cellj + 1][cellk];
2465 double FX010 =
FastFX[thisBlock][celli][cellj + 1][cellk];
2466 double FY010 =
FastFY[thisBlock][celli][cellj + 1][cellk];
2467 double FZ010 =
FastFZ[thisBlock][celli][cellj + 1][cellk];
2468 double P001 =
FastPot[thisBlock][celli][cellj][cellk + 1];
2469 double FX001 =
FastFX[thisBlock][celli][cellj][cellk + 1];
2470 double FY001 =
FastFY[thisBlock][celli][cellj][cellk + 1];
2471 double FZ001 =
FastFZ[thisBlock][celli][cellj][cellk + 1];
2472 double P110 =
FastPot[thisBlock][celli + 1][cellj + 1][cellk];
2473 double FX110 =
FastFX[thisBlock][celli + 1][cellj + 1][cellk];
2474 double FY110 =
FastFY[thisBlock][celli + 1][cellj + 1][cellk];
2475 double FZ110 =
FastFZ[thisBlock][celli + 1][cellj + 1][cellk];
2476 double P101 =
FastPot[thisBlock][celli + 1][cellj][cellk + 1];
2477 double FX101 =
FastFX[thisBlock][celli + 1][cellj][cellk + 1];
2478 double FY101 =
FastFY[thisBlock][celli + 1][cellj][cellk + 1];
2479 double FZ101 =
FastFZ[thisBlock][celli + 1][cellj][cellk + 1];
2480 double P011 =
FastPot[thisBlock][celli][cellj + 1][cellk + 1];
2481 double FX011 =
FastFX[thisBlock][celli][cellj + 1][cellk + 1];
2482 double FY011 =
FastFY[thisBlock][celli][cellj + 1][cellk + 1];
2483 double FZ011 =
FastFZ[thisBlock][celli][cellj + 1][cellk + 1];
2484 double P111 =
FastPot[thisBlock][celli + 1][cellj + 1][cellk + 1];
2485 double FX111 =
FastFX[thisBlock][celli + 1][cellj + 1][cellk + 1];
2486 double FY111 =
FastFY[thisBlock][celli + 1][cellj + 1][cellk + 1];
2487 double FZ111 =
FastFZ[thisBlock][celli + 1][cellj + 1][cellk + 1];
2494 P000 =
StgFastPot[thisBlock][celli][cellj][cellk];
2495 FX000 =
StgFastFX[thisBlock][celli][cellj][cellk];
2496 FY000 =
StgFastFY[thisBlock][celli][cellj][cellk];
2497 FZ000 =
StgFastFZ[thisBlock][celli][cellj][cellk];
2498 P100 =
StgFastPot[thisBlock][celli + 1][cellj][cellk];
2499 FX100 =
StgFastFX[thisBlock][celli + 1][cellj][cellk];
2500 FY100 =
StgFastFY[thisBlock][celli + 1][cellj][cellk];
2501 FZ100 =
StgFastFZ[thisBlock][celli + 1][cellj][cellk];
2502 P010 =
StgFastPot[thisBlock][celli][cellj + 1][cellk];
2503 FX010 =
StgFastFX[thisBlock][celli][cellj + 1][cellk];
2504 FY010 =
StgFastFY[thisBlock][celli][cellj + 1][cellk];
2505 FZ010 =
StgFastFZ[thisBlock][celli][cellj + 1][cellk];
2506 P001 =
StgFastPot[thisBlock][celli][cellj][cellk + 1];
2507 FX001 =
StgFastFX[thisBlock][celli][cellj][cellk + 1];
2508 FY001 =
StgFastFY[thisBlock][celli][cellj][cellk + 1];
2509 FZ001 =
StgFastFZ[thisBlock][celli][cellj][cellk + 1];
2510 P110 =
StgFastPot[thisBlock][celli + 1][cellj + 1][cellk];
2511 FX110 =
StgFastFX[thisBlock][celli + 1][cellj + 1][cellk];
2512 FY110 =
StgFastFY[thisBlock][celli + 1][cellj + 1][cellk];
2513 FZ110 =
StgFastFZ[thisBlock][celli + 1][cellj + 1][cellk];
2514 P101 =
StgFastPot[thisBlock][celli + 1][cellj][cellk + 1];
2515 FX101 =
StgFastFX[thisBlock][celli + 1][cellj][cellk + 1];
2516 FY101 =
StgFastFY[thisBlock][celli + 1][cellj][cellk + 1];
2517 FZ101 =
StgFastFZ[thisBlock][celli + 1][cellj][cellk + 1];
2518 P011 =
StgFastPot[thisBlock][celli][cellj + 1][cellk + 1];
2519 FX011 =
StgFastFX[thisBlock][celli][cellj + 1][cellk + 1];
2520 FY011 =
StgFastFY[thisBlock][celli][cellj + 1][cellk + 1];
2521 FZ011 =
StgFastFZ[thisBlock][celli][cellj + 1][cellk + 1];
2522 P111 =
StgFastPot[thisBlock][celli + 1][cellj + 1][cellk + 1];
2523 FX111 =
StgFastFX[thisBlock][celli + 1][cellj + 1][cellk + 1];
2524 FY111 =
StgFastFY[thisBlock][celli + 1][cellj + 1][cellk + 1];
2525 FZ111 =
StgFastFZ[thisBlock][celli + 1][cellj + 1][cellk + 1];
2528 P000 =
StgFastPot[thisBlock][celli][cellj][cellk];
2529 FX000 =
StgFastFX[thisBlock][celli][cellj][cellk];
2530 FY000 =
StgFastFY[thisBlock][celli][cellj][cellk];
2531 FZ000 =
StgFastFZ[thisBlock][celli][cellj][cellk];
2532 P100 =
StgFastPot[thisBlock][celli + 1][cellj][cellk];
2533 FX100 =
StgFastFX[thisBlock][celli + 1][cellj][cellk];
2534 FY100 =
StgFastFY[thisBlock][celli + 1][cellj][cellk];
2535 FZ100 =
StgFastFZ[thisBlock][celli + 1][cellj][cellk];
2536 P010 =
StgFastPot[thisBlock][celli][cellj + 1][cellk];
2537 FX010 =
StgFastFX[thisBlock][celli][cellj + 1][cellk];
2538 FY010 =
StgFastFY[thisBlock][celli][cellj + 1][cellk];
2539 FZ010 =
StgFastFZ[thisBlock][celli][cellj + 1][cellk];
2540 P001 =
StgFastPot[thisBlock][celli][cellj][cellk + 1];
2541 FX001 =
StgFastFX[thisBlock][celli][cellj][cellk + 1];
2542 FY001 =
StgFastFY[thisBlock][celli][cellj][cellk + 1];
2543 FZ001 =
StgFastFZ[thisBlock][celli][cellj][cellk + 1];
2544 P110 =
StgFastPot[thisBlock][celli + 1][cellj + 1][cellk];
2545 FX110 =
StgFastFX[thisBlock][celli + 1][cellj + 1][cellk];
2546 FY110 =
StgFastFY[thisBlock][celli + 1][cellj + 1][cellk];
2547 FZ110 =
StgFastFZ[thisBlock][celli + 1][cellj + 1][cellk];
2548 P101 =
StgFastPot[thisBlock][celli + 1][cellj][cellk + 1];
2549 FX101 =
StgFastFX[thisBlock][celli + 1][cellj][cellk + 1];
2550 FY101 =
StgFastFY[thisBlock][celli + 1][cellj][cellk + 1];
2551 FZ101 =
StgFastFZ[thisBlock][celli + 1][cellj][cellk + 1];
2552 P011 =
StgFastPot[thisBlock][celli][cellj + 1][cellk + 1];
2553 FX011 =
StgFastFX[thisBlock][celli][cellj + 1][cellk + 1];
2554 FY011 =
StgFastFY[thisBlock][celli][cellj + 1][cellk + 1];
2555 FZ011 =
StgFastFZ[thisBlock][celli][cellj + 1][cellk + 1];
2556 P111 =
StgFastPot[thisBlock][celli + 1][cellj + 1][cellk + 1];
2557 FX111 =
StgFastFX[thisBlock][celli + 1][cellj + 1][cellk + 1];
2558 FY111 =
StgFastFY[thisBlock][celli + 1][cellj + 1][cellk + 1];
2559 FZ111 =
StgFastFZ[thisBlock][celli + 1][cellj + 1][cellk + 1];
2564 TriLin(xd, yd, zd, P000, P100, P010, P001, P110, P101, P011, P111);
2565 double intFX =
TriLin(xd, yd, zd, FX000, FX100, FX010, FX001, FX110, FX101,
2567 double intFY =
TriLin(xd, yd, zd, FY000, FY100, FY010, FY001, FY110, FY101,
2569 double intFZ =
TriLin(xd, yd, zd, FZ000, FZ100, FZ010, FZ001, FZ110, FZ101,
2578 printf(
"Cell corner values:\n");
2579 printf(
"Potential: %g, %g, %g, %g\n", P000, P100, P010, P001);
2580 printf(
"Potential: %g, %g, %g, %g\n", P110, P101, P011, P111);
2581 printf(
"FastFX: %g, %g, %g, %g\n", FX000, FX100, FX010, FX001);
2582 printf(
"FastFX: %g, %g, %g, %g\n", FX110, FX101, FX011, FX111);
2583 printf(
"FastFY: %g, %g, %g, %g\n", FY000, FY100, FY010, FY001);
2584 printf(
"FastFY: %g, %g, %g, %g\n", FY110, FY101, FY011, FY111);
2585 printf(
"FastFZ: %g, %g, %g, %g\n", FZ000, FZ100, FZ010, FZ001);
2586 printf(
"FastFZ: %g, %g, %g, %g\n", FZ110, FZ101, FZ011, FZ111);
2587 printf(
"Pot, FX, FY, FZ: %g, %g, %g, %g\n", *Potential, globalF->
X,
2588 globalF->
Y, globalF->
Z);
2592 printf(
"out FastPFAtPoint\n");
2610 double Xpt = globalP->
X;
2611 double Ypt = globalP->
Y;
2612 double Zpt = globalP->
Z;
2616 double CornerX =
FastVol.CrnrX;
2617 double CornerY =
FastVol.CrnrY;
2618 double CornerZ =
FastVol.CrnrZ;
2619 double TriLin(
double xd,
double yd,
double zd,
double c000,
double c100,
2620 double c010,
double c001,
double c110,
double c101,
double c011,
2627 for (
int ignore = 1; ignore <=
FastVol.NbIgnoreVols; ++ignore) {
2635 neBEMMessage(
"In FastKnChPFAtPoint: point in an ignored volume!\n");
2639 neBEMMessage(
"wrong KnChPFAtPoint return value in FastVolKnChPF.\n");
2653 printf(
"\nin FastKnChPFAtPoint\n");
2654 printf(
"x, y, z: %g, %g, %g\n", Xpt, Ypt, Zpt);
2655 printf(
"RptVolLX, RptVolLY, RptVolLZ: %g, %g, %g\n", RptVolLX, RptVolLY,
2657 printf(
"CornerX, CornerY, CornerZ: %g, %g, %g\n", CornerX, CornerY,
2659 printf(
"Nb of blocks: %d\n",
FastVol.NbBlocks);
2660 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
2664 printf(
"LZ: %le\n",
BlkLZ[block]);
2665 printf(
"CornerZ: %le\n",
BlkCrnrZ[block]);
2671 double dx = Xpt - CornerX;
2672 double dy = Ypt - CornerY;
2673 double dz = Zpt - CornerZ;
2675 printf(
"real dx, dy, dz from volume corner: %g, %g, %g\n", dx, dy, dz);
2677 int NbFastVolX = (int)(dx / RptVolLX);
2678 if (dx < 0.0) --NbFastVolX;
2679 int NbFastVolY = (int)(dy / RptVolLY);
2680 if (dy < 0.0) --NbFastVolY;
2681 int NbFastVolZ = (int)(dz / RptVolLZ);
2682 if (dz < 0.0) --NbFastVolZ;
2684 printf(
"Volumes in x, y, z: %d, %d, %d\n", NbFastVolX, NbFastVolY,
2688 dx -= NbFastVolX * RptVolLX;
2689 dy -= NbFastVolY * RptVolLY;
2690 dz -= NbFastVolZ * RptVolLZ;
2704 if (dx > RptVolLX) {
2708 if (dy > RptVolLY) {
2712 if (dz > RptVolLZ) {
2717 printf(
"equivalent dist from corner - dx, dy, dz: %g, %g, %g\n", dx, dy,
2724 if ((RptVolLX - dx) <
MINDIST)
2735 printf(
"equivalent dist adjusted - dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
2759 if ((dx >= 0.0) && (dx <=
FastVol.LX) && (dy >= 0.0) &&
2763 }
else if ((dx >= 0.0) && (dx <=
FastVol.LX) && (dy >
FastVol.LY) &&
2779 }
else if ((dx >
FastVol.LX) && (dx <= 2.0 *
FastVol.LX) && (dy >= 0.0) &&
2790 neBEMMessage(
"FastKnChPFAtPoint: point in none of the sectors!\n");
2792 if (dbgFn) printf(
"stagger modified dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
2799 if ((RptVolLX - dx) <
MINDIST)
2810 printf(
"equivalent dist adjusted for staggered: %g, %g, %g\n", dx, dy, dz);
2813 for(
int omit = 1; omit <=
FastVol.NbOmitVols; ++omit) {
2820 neBEMMessage(
"In FastKnChPFAtPoint: point in an omitted volume!\n");
2822 globalF->
X = 0.0; globalF->
Y = 0.0; globalF->
Z = 0.0;
2827 for (
int block = 1; block <=
FastVol.NbBlocks; ++block) {
2828 double blkBtmZ =
BlkCrnrZ[block] - CornerZ;
2829 double blkTopZ = blkBtmZ +
BlkLZ[block];
2831 printf(
"block, dz, blkBtmZ, blkTopZ: %d, %lg, %lg, %lg\n", block, dz,
2836 if ((dz <= blkBtmZ) && ((blkBtmZ - dz) <
MINDIST)) dz = blkBtmZ -
MINDIST;
2837 if ((dz >= blkBtmZ) && ((dz - blkBtmZ) <
MINDIST)) dz = blkBtmZ +
MINDIST;
2838 if ((dz <= blkTopZ) && ((blkTopZ - dz) <
MINDIST)) dz = blkTopZ -
MINDIST;
2839 if ((dz >= blkTopZ) && ((dz - blkTopZ) <
MINDIST)) dz = blkTopZ +
MINDIST;
2841 if ((dz >= blkBtmZ) && (dz <= blkTopZ)) {
2847 neBEMMessage(
"FastKnChPFAtPoint: point in none of the blocks!\n");
2853 double delX =
FastVol.LX / nbXCells;
2854 double delY =
FastVol.LY / nbYCells;
2855 double delZ =
BlkLZ[thisBlock] / nbZCells;
2856 dz -= (
BlkCrnrZ[thisBlock] - CornerZ);
2859 printf(
"thisBlock: %d\n", thisBlock);
2860 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
2862 printf(
"BlkCrnrZ: %lg\n",
BlkCrnrZ[thisBlock]);
2863 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
2864 printf(
"dz: %lg\n", dz);
2869 int celli = (int)(dx / delX) + 1;
2875 if (celli > nbXCells) {
2878 neBEMMessage(
"FastKnChPFAtPoint - celli > nbXCells\n");
2880 int cellj = (int)(dy / delY) + 1;
2886 if (cellj > nbYCells) {
2889 neBEMMessage(
"FastKnChPFAtPoint - cellj > nbYCells\n");
2891 int cellk = (int)(dz / delZ) + 1;
2897 if (cellk > nbZCells) {
2900 neBEMMessage(
"FastKnChPFAtPoint - cellk > nbZCells\n");
2902 if (dbgFn) printf(
"Cells in x, y, z: %d, %d, %d\n", celli, cellj, cellk);
2911 double dxcellcrnr = dx - (double)(celli - 1) * delX;
2912 double dycellcrnr = dy - (double)(cellj - 1) * delY;
2913 double dzcellcrnr = dz - (double)(cellk - 1) * delZ;
2915 printf(
"cell crnr dx, dy, dz: %g, %g, %g\n", dxcellcrnr, dycellcrnr,
2919 double xd = dxcellcrnr / delX;
2920 double yd = dycellcrnr / delY;
2921 double zd = dzcellcrnr / delZ;
2922 if (xd <= 0.0) xd = 0.0;
2923 if (yd <= 0.0) yd = 0.0;
2924 if (zd <= 0.0) zd = 0.0;
2925 if (xd >= 1.0) xd = 1.0;
2926 if (yd >= 1.0) yd = 1.0;
2927 if (zd >= 1.0) zd = 1.0;
2930 double P000 =
FastPotKnCh[thisBlock][celli][cellj][cellk];
2931 double FX000 =
FastFXKnCh[thisBlock][celli][cellj][cellk];
2932 double FY000 =
FastFYKnCh[thisBlock][celli][cellj][cellk];
2933 double FZ000 =
FastFZKnCh[thisBlock][celli][cellj][cellk];
2934 double P100 =
FastPotKnCh[thisBlock][celli + 1][cellj][cellk];
2935 double FX100 =
FastFXKnCh[thisBlock][celli + 1][cellj][cellk];
2936 double FY100 =
FastFYKnCh[thisBlock][celli + 1][cellj][cellk];
2937 double FZ100 =
FastFZKnCh[thisBlock][celli + 1][cellj][cellk];
2938 double P010 =
FastPotKnCh[thisBlock][celli][cellj + 1][cellk];
2939 double FX010 =
FastFXKnCh[thisBlock][celli][cellj + 1][cellk];
2940 double FY010 =
FastFYKnCh[thisBlock][celli][cellj + 1][cellk];
2941 double FZ010 =
FastFZKnCh[thisBlock][celli][cellj + 1][cellk];
2942 double P001 =
FastPotKnCh[thisBlock][celli][cellj][cellk + 1];
2943 double FX001 =
FastFXKnCh[thisBlock][celli][cellj][cellk + 1];
2944 double FY001 =
FastFYKnCh[thisBlock][celli][cellj][cellk + 1];
2945 double FZ001 =
FastFZKnCh[thisBlock][celli][cellj][cellk + 1];
2946 double P110 =
FastPotKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2947 double FX110 =
FastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2948 double FY110 =
FastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2949 double FZ110 =
FastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2950 double P101 =
FastPotKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2951 double FX101 =
FastFXKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2952 double FY101 =
FastFYKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2953 double FZ101 =
FastFZKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2954 double P011 =
FastPotKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2955 double FX011 =
FastFXKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2956 double FY011 =
FastFYKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2957 double FZ011 =
FastFZKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2958 double P111 =
FastPotKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2959 double FX111 =
FastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2960 double FY111 =
FastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2961 double FZ111 =
FastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2985 FX110 =
StgFastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2986 FY110 =
StgFastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2987 FZ110 =
StgFastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk];
2989 FX101 =
StgFastFXKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2990 FY101 =
StgFastFYKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2991 FZ101 =
StgFastFZKnCh[thisBlock][celli + 1][cellj][cellk + 1];
2993 FX011 =
StgFastFXKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2994 FY011 =
StgFastFYKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2995 FZ011 =
StgFastFZKnCh[thisBlock][celli][cellj + 1][cellk + 1];
2996 P111 =
StgFastPotKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2997 FX111 =
StgFastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2998 FY111 =
StgFastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
2999 FZ111 =
StgFastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
3019 FX110 =
StgFastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk];
3020 FY110 =
StgFastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk];
3021 FZ110 =
StgFastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk];
3023 FX101 =
StgFastFXKnCh[thisBlock][celli + 1][cellj][cellk + 1];
3024 FY101 =
StgFastFYKnCh[thisBlock][celli + 1][cellj][cellk + 1];
3025 FZ101 =
StgFastFZKnCh[thisBlock][celli + 1][cellj][cellk + 1];
3027 FX011 =
StgFastFXKnCh[thisBlock][celli][cellj + 1][cellk + 1];
3028 FY011 =
StgFastFYKnCh[thisBlock][celli][cellj + 1][cellk + 1];
3029 FZ011 =
StgFastFZKnCh[thisBlock][celli][cellj + 1][cellk + 1];
3030 P111 =
StgFastPotKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
3031 FX111 =
StgFastFXKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
3032 FY111 =
StgFastFYKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
3033 FZ111 =
StgFastFZKnCh[thisBlock][celli + 1][cellj + 1][cellk + 1];
3038 TriLin(xd, yd, zd, P000, P100, P010, P001, P110, P101, P011, P111);
3039 double intFX =
TriLin(xd, yd, zd, FX000, FX100, FX010, FX001, FX110, FX101,
3041 double intFY =
TriLin(xd, yd, zd, FY000, FY100, FY010, FY001, FY110, FY101,
3043 double intFZ =
TriLin(xd, yd, zd, FZ000, FZ100, FZ010, FZ001, FZ110, FZ101,
3052 printf(
"Cell corner values:\n");
3053 printf(
"Potential: %g, %g, %g, %g\n", P000, P100, P010, P001);
3054 printf(
"Potential: %g, %g, %g, %g\n", P110, P101, P011, P111);
3055 printf(
"FastFX: %g, %g, %g, %g\n", FX000, FX100, FX010, FX001);
3056 printf(
"FastFX: %g, %g, %g, %g\n", FX110, FX101, FX011, FX111);
3057 printf(
"FastFY: %g, %g, %g, %g\n", FY000, FY100, FY010, FY001);
3058 printf(
"FastFY: %g, %g, %g, %g\n", FY110, FY101, FY011, FY111);
3059 printf(
"FastFZ: %g, %g, %g, %g\n", FZ000, FZ100, FZ010, FZ001);
3060 printf(
"FastFZ: %g, %g, %g, %g\n", FZ110, FZ101, FZ011, FZ111);
3061 printf(
"Pot, FX, FY, FZ: %g, %g, %g, %g\n", *Potential, globalF->
X,
3062 globalF->
Y, globalF->
Z);
3066 printf(
"out FastKnChPFAtPoint\n");
3089 const double xfld = globalP->
X;
3090 const double yfld = globalP->
Y;
3091 const double zfld = globalP->
Z;
3094 *Potential = globalF->
X = globalF->
Y = globalF->
Z = 0.0;
3122 pPot[prim] = plFx[prim] = plFy[prim] = plFz[prim] = 0.0;
3126 int tid = 0, nthreads = 1;
3127#pragma omp parallel private(tid, nthreads)
3132 tid = omp_get_thread_num();
3134 nthreads = omp_get_num_threads();
3135 printf(
"PFAtPoint computation with %d threads\n", nthreads);
3143 for (
int primsrc = 1; primsrc <=
NbPrimitives; ++primsrc) {
3145 printf(
"Evaluating effect of primsrc %d using on %lg, %lg, %lg\n",
3146 primsrc, xfld, yfld, zfld);
3161 double TransformationMatrix[3][3];
3162 TransformationMatrix[0][0] =
PrimDC[primsrc].XUnit.X;
3163 TransformationMatrix[0][1] =
PrimDC[primsrc].XUnit.Y;
3164 TransformationMatrix[0][2] =
PrimDC[primsrc].XUnit.Z;
3165 TransformationMatrix[1][0] =
PrimDC[primsrc].YUnit.X;
3166 TransformationMatrix[1][1] =
PrimDC[primsrc].YUnit.Y;
3167 TransformationMatrix[1][2] =
PrimDC[primsrc].YUnit.Z;
3168 TransformationMatrix[2][0] =
PrimDC[primsrc].ZUnit.X;
3169 TransformationMatrix[2][1] =
PrimDC[primsrc].ZUnit.Y;
3170 TransformationMatrix[2][2] =
PrimDC[primsrc].ZUnit.Z;
3180 double InitialVector[3] = {xfld - xpsrc, yfld - ypsrc, zfld - zpsrc};
3181 double FinalVector[3] = {0., 0., 0.};
3182 for (
int i = 0; i < 3; ++i) {
3183 for (
int j = 0; j < 3; ++j) {
3184 FinalVector[i] += TransformationMatrix[i][j] * InitialVector[j];
3187 localPP.
X = FinalVector[0];
3188 localPP.
Y = FinalVector[1];
3189 localPP.
Z = FinalVector[2];
3209 GetPrimPF(primsrc, &localPP, &tmpPot, &tmpF);
3210 const double qpr =
AvWtChDen[IdWtField][primsrc];
3211 pPot[primsrc] += qpr * tmpPot;
3212 lFx += qpr * tmpF.
X;
3213 lFy += qpr * tmpF.
Y;
3214 lFz += qpr * tmpF.
Z;
3217 printf(
"PFAtPoint base primitive =>\n");
3218 printf(
"primsrc: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n",
3219 primsrc, localPP.
X, localPP.
Y, localPP.
Z);
3220 printf(
"primsrc: %d, Pot: %lg, Fx: %lg, Fx: %lg, Fz: %lg\n",
3221 primsrc, tmpPot, tmpF.
X, tmpF.
Y, tmpF.
Z);
3222 printf(
"primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n",
3223 primsrc, pPot[primsrc], lFx, lFy, lFz);
3239 for (
int ele = eleMin; ele <= eleMax; ++ele) {
3240 const double xsrc = (
EleArr + ele - 1)->G.Origin.X;
3241 const double ysrc = (
EleArr + ele - 1)->G.Origin.Y;
3242 const double zsrc = (
EleArr + ele - 1)->G.Origin.Z;
3245 double vG[3] = {xfld - xsrc, yfld - ysrc, zfld - zsrc};
3246 double vL[3] = {0., 0., 0.};
3247 for (
int i = 0; i < 3; ++i) {
3248 for (
int j = 0; j < 3; ++j) {
3249 vL[i] += TransformationMatrix[i][j] * vG[j];
3253 const int type = (
EleArr + ele - 1)->G.Type;
3254 const double a = (
EleArr + ele - 1)->G.LX;
3255 const double b = (
EleArr + ele - 1)->G.LZ;
3256 GetPF(type, a, b, vL[0], vL[1], vL[2], &tPot, &tF);
3264 printf(
"PFAtPoint base primitive:%d\n", primsrc);
3265 printf(
"ele: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n", ele,
3266 vL[0], vL[1], vL[2]);
3268 "ele: %d, tPot: %lg, tFx: %lg, tFy: %lg, tFz: %lg, Solution: "
3270 ele, tPot, tF.
X, tF.
Y, tF.
Z, qel);
3271 printf(
"ele: %d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: %lg\n", ele,
3272 ePot, eF.
X, eF.
Y, eF.
Z);
3277 pPot[primsrc] += ePot;
3282 printf(
"prim%d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: %lg\n", primsrc,
3283 ePot, eF.
X, eF.
Y, eF.
Z);
3284 printf(
"prim%d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n", primsrc,
3285 pPot[primsrc], lFx, lFy, lFz);
3292 printf(
"basic primtive\n");
3293 printf(
"primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: %lg\n",
3294 primsrc, pPot[primsrc], lFx, lFy, lFz);
3301 printf(
"Mirror may not be correctly implemented ...\n");
3311 if (perx || pery || perz) {
3312 for (
int xrpt = -perx; xrpt <= perx; ++xrpt) {
3313 const double xShift =
XPeriod[primsrc] * (double)xrpt;
3314 double XPOfRpt = xpsrc + xShift;
3315 for (
int yrpt = -pery; yrpt <= pery; ++yrpt) {
3316 const double yShift =
YPeriod[primsrc] * (double)yrpt;
3317 double YPOfRpt = ypsrc + yShift;
3318 for (
int zrpt = -perz; zrpt <= perz; ++zrpt) {
3319 const double zShift =
ZPeriod[primsrc] * (double)zrpt;
3320 double ZPOfRpt = zpsrc + zShift;
3322 if ((xrpt == 0) && (yrpt == 0) && (zrpt == 0))
continue;
3326 double InitialVector[3] = {xfld - XPOfRpt, yfld - YPOfRpt,
3328 double FinalVector[3] = {0., 0., 0.};
3329 for (
int i = 0; i < 3; ++i) {
3330 for (
int j = 0; j < 3; ++j) {
3332 TransformationMatrix[i][j] * InitialVector[j];
3335 localPPR.
X = FinalVector[0];
3336 localPPR.
Y = FinalVector[1];
3337 localPPR.
Z = FinalVector[2];
3358 GetPrimPF(primsrc, &localPPR, &tmpPot, &tmpF);
3359 const double qpr =
AvWtChDen[IdWtField][primsrc];
3360 pPot[primsrc] += qpr * tmpPot;
3361 lFx += qpr * tmpF.
X;
3362 lFy += qpr * tmpF.
Y;
3363 lFz += qpr * tmpF.
Z;
3367 "primsrc: %d, xlocal: %lg, ylocal: %lg, zlocal: "
3369 primsrc, localPPR.
X, localPPR.
Y, localPPR.
Z);
3371 "primsrc: %d, Pot: %lg, Fx: %lg, Fy: %lg, Fz: %lg\n",
3372 primsrc, tmpPot * qpr, tmpF.
X * qpr, tmpF.
Y * qpr,
3375 "primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: "
3377 primsrc, pPot[primsrc], lFx, lFy, lFz);
3392 for (
int ele = eleMin; ele <= eleMax; ++ele) {
3393 const double xrsrc = (
EleArr + ele - 1)->G.Origin.X;
3394 const double yrsrc = (
EleArr + ele - 1)->G.Origin.Y;
3395 const double zrsrc = (
EleArr + ele - 1)->G.Origin.Z;
3397 const double XEOfRpt = xrsrc + xShift;
3398 const double YEOfRpt = yrsrc + yShift;
3399 const double ZEOfRpt = zrsrc + zShift;
3402 double vG[3] = {xfld - XEOfRpt, yfld - YEOfRpt,
3404 double vL[3] = {0., 0., 0.};
3405 for (
int i = 0; i < 3; ++i) {
3406 for (
int j = 0; j < 3; ++j) {
3407 vL[i] += TransformationMatrix[i][j] * vG[j];
3413 const int type = (
EleArr + ele - 1)->G.Type;
3414 const double a = (
EleArr + ele - 1)->G.LX;
3415 const double b = (
EleArr + ele - 1)->G.LZ;
3416 GetPF(type, a, b, vL[0], vL[1], vL[2], &tPot, &tF);
3418 erPot += qel * tPot;
3419 erF.
X += qel * tF.
X;
3420 erF.
Y += qel * tF.
Y;
3421 erF.
Z += qel * tF.
Z;
3424 printf(
"PFAtPoint base primitive:%d\n", primsrc);
3426 "ele: %d, xlocal: %lg, ylocal: %lg, zlocal %lg\n",
3427 ele, vL[0], vL[1], vL[2]);
3429 "ele: %d, tPot: %lg, tFx: %lg, tFy: %lg, tFz: %lg, "
3431 ele, tPot, tF.
X, tF.
Y, tF.
Z, qel);
3433 "ele: %d, ePot: %lg, eFx: %lg, eFy: %lg, eFz: "
3435 ele, erPot, erF.
X, erF.
Y, erF.
Z);
3441 pPot[primsrc] += erPot;
3449 printf(
"basic repeated xrpt: %d. yrpt: %d, zrpt: %d\n",
3452 "primsrc: %d, pPot: %lg, lFx: %lg, lFy: %lg, lFz: "
3454 primsrc, pPot[primsrc], lFx, lFy, lFz);
3463 "Mirror not correctly implemented in this version of "
3478 plFx[primsrc] = tmpF.
X;
3479 plFy[primsrc] = tmpF.
Y;
3480 plFz[primsrc] = tmpF.
Z;
3484 double totPot = 0.0;
3486 totF.
X = totF.
Y = totF.
Z = 0.0;
3488 totPot += pPot[prim];
3489 totF.
X += plFx[prim];
3490 totF.
Y += plFy[prim];
3491 totF.
Z += plFz[prim];
3496 *Potential = totPot * InvFourPiEps0;
3497 globalF->
X = totF.
X * InvFourPiEps0;
3498 globalF->
Y = totF.
Y * InvFourPiEps0;
3499 globalF->
Z = totF.
Z * InvFourPiEps0;
3518 printf(
"Final values due to all primitives and other influences: ");
3521 printf(
"%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n\n", xfld, yfld, zfld,
3522 (*Potential), globalF->
X, globalF->
Y, globalF->
Z);
3539 "neBEMPrepareWeightingField: reached MaxWtField (%d) weighting "
3558 printf(
"\nComputing weighting potential & field within basic fast volume\n");
3559 int bskip = 0, iskip = 0, jskip = 0, kskip = 0;
3563 int volptcnt = 0, endskip = 0;
3565 for (
int block = 1; block <=
WtFldFastVol[IdWtField].NbBlocks; ++block) {
3569 for (
int i = 1; i <= nbXCells + 1; ++i) {
3570 for (
int j = 1; j <= nbYCells + 1; ++j) {
3571 for (
int k = 1; k <= nbZCells + 1; ++k) {
3592 "Basic fast volume => bskip, iskip, jskip, kskip: %d, %d, %d, %d\n",
3593 bskip, iskip, jskip, kskip);
3598 char stringIdWtField[16];
3599 snprintf(stringIdWtField, 16,
"%d", IdWtField);
3601 char WtFldFastVolPFFile[256];
3602 strcpy(WtFldFastVolPFFile,
BCOutDir);
3603 strcat(WtFldFastVolPFFile,
"/WtFldFastVolPF_");
3604 strcat(WtFldFastVolPFFile, stringIdWtField);
3605 strcat(WtFldFastVolPFFile,
".out");
3606 FILE *fWtFldFastVolPF = fopen(WtFldFastVolPFFile,
"w");
3607 if (fWtFldFastVolPF == NULL) {
3608 neBEMMessage(
"CreateWtFldFastVolPF - WtFldFastVolPFFile");
3611 fprintf(fWtFldFastVolPF,
"#block\tX\tY\tZ\tPot\tFX\tFY\tFZ\n");
3614 printf(
"WtFldFastVolPF.out created ...\n");
3618 for (
int block = 1 + bskip; block <=
WtFldFastVol[IdWtField].NbBlocks;
3628 delZ =
WtFldBlkLZ[IdWtField][block] / nbZCells;
3630 "WtFldNbBlocks: %d, block: %d, nbXCells: %d, nbYCells: %d, nbZCells: "
3632 WtFldFastVol[IdWtField].NbBlocks, block, nbXCells, nbYCells, nbZCells);
3635 printf(
"block: %d\n", block);
3636 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
3638 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY, startZ);
3639 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
3640 printf(
"bskip, iskip, jskip, kskip: %d, %d, %d, %d\n", bskip, iskip,
3646 for (
int i = 1 + iskip; i <= nbXCells + 1; ++i) {
3647 for (
int j = 1 + jskip; j <= nbYCells + 1; ++j) {
3648 printf(
"Fast volume => block: %3d, i: %4d, j: %4d", block, i, j);
3653 int nthreads = 1, tid = 0;
3654#pragma omp parallel private(nthreads, tid)
3659 tid = omp_get_thread_num();
3661 nthreads = omp_get_num_threads();
3662 printf(
"Starting fast volume computation with %d threads\n",
3672#pragma omp for private(k, point, omitFlag, potential, field)
3674 for (k = 1 + kskip; k <= nbZCells + 1; ++k) {
3676 field.
X = field.
Y = field.
Z = 0.0;
3678 point.
X = startX + (i - 1) * delX;
3679 point.
Y = startY + (j - 1) * delY;
3680 point.
Z = startZ + (k - 1) * delZ;
3685 for (
int omit = 1; omit <=
WtFldFastVol[IdWtField].NbOmitVols;
3702 printf(
"block, i, j, k: %d, %d, %d, %d\n", block, i, j, k);
3703 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
3706 printf(
"omitFlag: %d\n", omitFlag);
3711 potential = field.
X = field.
Y = field.
Z = 0.0;
3720 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
3734 for (
int k = 1 + kskip; k <= nbZCells + 1; ++k)
3736 point.
X = startX + (i - 1) * delX;
3737 point.
Y = startY + (j - 1) * delY;
3738 point.
Z = startZ + (k - 1) * delZ;
3740 fprintf(fWtFldFastVolPF,
3741 "%4d\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
3749 fflush(fWtFldFastVolPF);
3752 "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
3753 "\b\b\b\b\b\b\b\b\b\b");
3758 fclose(fWtFldFastVolPF);
3762 "\nComputing weighting potential & field within staggered fast "
3765 bskip = iskip = jskip = kskip = 0;
3769 int volptcnt = 0, endskip = 0;
3771 for (
int block = 1; block <=
WtFldFastVol[IdWtField].NbBlocks; ++block) {
3775 for (
int i = 1; i <= nbXCells + 1; ++i) {
3776 for (
int j = 1; j <= nbYCells + 1; ++j) {
3777 for (
int k = 1; k <= nbZCells + 1; ++k) {
3798 "Staggered volume => bskip, iskip, jskip, kskip: %d, %d, %d, %d\n",
3799 bskip, iskip, jskip, kskip);
3803 char StgWtFldFastVolPFFile[256];
3804 strcpy(StgWtFldFastVolPFFile,
BCOutDir);
3805 strcat(StgWtFldFastVolPFFile,
"/StgWtFldFastVolPF_");
3806 strcat(StgWtFldFastVolPFFile, stringIdWtField);
3807 strcat(StgWtFldFastVolPFFile,
".out");
3808 FILE *fStgWtFldFastVolPF = fopen(StgWtFldFastVolPFFile,
"w");
3809 if (fStgWtFldFastVolPF == NULL) {
3810 neBEMMessage(
"WtFldFastVolPF - StgWtFldFastVolPFFile");
3813 fprintf(fStgWtFldFastVolPF,
"#block\tX\tY\tZ\tPot\tFX\tFY\tFZ\n");
3816 printf(
"StgWtFldFastVolPF.out created ...\n");
3820 for (
int block = 1 + bskip; block <=
WtFldFastVol[IdWtField].NbBlocks;
3830 delZ =
WtFldBlkLZ[IdWtField][block] / nbZCells;
3832 "NbBlocks: %d, block: %d, nbXCells: %d, nbYCells: %d, nbZCells: %d\n",
3833 WtFldFastVol[IdWtField].NbBlocks, block, nbXCells, nbYCells,
3837 printf(
"block: %d\n", block);
3838 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
3840 printf(
"startX, startY, startZ: %le, %le, %le\n", startX, startY,
3842 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
3843 printf(
"bskip, iskip, jskip, kskip: %d, %d, %d, %d\n", bskip, iskip,
3849 for (
int i = 1 + iskip; i <= nbXCells + 1; ++i) {
3850 for (
int j = 1 + jskip; j <= nbYCells + 1; ++j) {
3851 printf(
"Fast volume => block: %3d, i: %4d, j: %4d", block, i, j);
3856 int nthreads = 1, tid = 0;
3857#pragma omp parallel private(nthreads, tid)
3862 tid = omp_get_thread_num();
3864 nthreads = omp_get_num_threads();
3866 "Starting staggered fast volume computation with %d "
3877#pragma omp for private(k, point, omitFlag, potential, field)
3879 for (k = 1 + kskip; k <= nbZCells + 1; ++k) {
3881 field.
X = field.
Y = field.
Z = 0.0;
3883 point.
X = startX + (i - 1) * delX;
3884 point.
Y = startY + (j - 1) * delY;
3885 point.
Z = startZ + (k - 1) * delZ;
3890 for (
int omit = 1; omit <=
WtFldFastVol[IdWtField].NbOmitVols;
3911 printf(
"point X, Y, Z: %.8lg\t%.8lg\t%.8lg\n",
3914 printf(
"omitFlag: %d\n", omitFlag);
3919 potential = field.
X = field.
Y = field.
Z = 0.0;
3924 "wrong WtFldPFAtPoint return value in staggered part of "
3925 "CreateWtFldFastVolElePF.\n");
3930 printf(
"%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
3944 for (
int k = 1 + kskip; k <= nbZCells + 1; ++k) {
3946 point.
X = startX + (i - 1) * delX;
3947 point.
Y = startY + (j - 1) * delY;
3948 point.
Z = startZ + (k - 1) * delZ;
3950 fprintf(fStgWtFldFastVolPF,
3951 "%4d\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\n",
3959 fflush(fStgWtFldFastVolPF);
3962 "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
3963 "\b\b\b\b\b\b\b\b\b\b\b");
3968 fclose(fStgWtFldFastVolPF);
3984 "neBEMPrepareWeightingField: reached MaxWtField (%d) weighting "
3991 double Xpt = globalP->
X;
3992 double Ypt = globalP->
Y;
3993 double Zpt = globalP->
Z;
4000 double TriLin(
double xd,
double yd,
double zd,
double c000,
double c100,
4001 double c010,
double c001,
double c110,
double c101,
double c011,
4008 for (
int ignore = 1; ignore <=
WtFldFastVol[IdWtField].NbIgnoreVols;
4020 neBEMMessage(
"In WtFldFastPFAtPoint: point in an ignored volume!\n");
4023 int fstatus =
ElePFAtPoint(globalP, Potential, globalF);
4025 neBEMMessage(
"wrong WtFldPFAtPoint return value in FastVolPF.\n");
4039 printf(
"\nin WtFldFastPFAtPoint\n");
4040 printf(
"x, y, z: %g, %g, %g\n", Xpt, Ypt, Zpt);
4041 printf(
"RptVolLX, RptVolLY, RptVolLZ: %g, %g, %g\n", RptVolLX, RptVolLY,
4043 printf(
"CornerX, CornerY, CornerZ: %g, %g, %g\n", CornerX, CornerY,
4045 printf(
"Nb of blocks: %d\n",
WtFldFastVol[IdWtField].NbBlocks);
4046 for (
int block = 1; block <=
WtFldFastVol[IdWtField].NbBlocks; ++block) {
4050 printf(
"LZ: %le\n",
WtFldBlkLZ[IdWtField][block]);
4057 double dx = Xpt - CornerX;
4058 double dy = Ypt - CornerY;
4059 double dz = Zpt - CornerZ;
4061 printf(
"real dx, dy, dz from volume corner: %g, %g, %g\n", dx, dy, dz);
4063 int NbFastVolX = (int)(dx / RptVolLX);
4064 if (dx < 0.0) --NbFastVolX;
4065 int NbFastVolY = (int)(dy / RptVolLY);
4066 if (dy < 0.0) --NbFastVolY;
4067 int NbFastVolZ = (int)(dz / RptVolLZ);
4068 if (dz < 0.0) --NbFastVolZ;
4070 printf(
"Volumes in x, y, z: %d, %d, %d\n", NbFastVolX, NbFastVolY,
4074 dx -= NbFastVolX * RptVolLX;
4075 dy -= NbFastVolY * RptVolLY;
4076 dz -= NbFastVolZ * RptVolLZ;
4090 if (dx > RptVolLX) {
4094 if (dy > RptVolLY) {
4098 if (dz > RptVolLZ) {
4103 printf(
"equivalent dist from corner - dx, dy, dz: %g, %g, %g\n", dx, dy,
4110 if ((RptVolLX - dx) <
MINDIST)
4122 printf(
"equivalent dist adjusted - dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
4146 if ((dx >= 0.0) && (dx <=
WtFldFastVol[IdWtField].LX) && (dy >= 0.0) &&
4150 }
else if ((dx >= 0.0) && (dx <=
WtFldFastVol[IdWtField].LX) &&
4171 (dx <= 2.0 *
WtFldFastVol[IdWtField].LX) && (dy >= 0.0) &&
4184 neBEMMessage(
"WtFldFastPFAtPoint: point in none of the sectors!\n");
4186 if (dbgFn) printf(
"stagger modified dx, dy, dz: %g, %g, %g\n", dx, dy, dz);
4193 if ((RptVolLX - dx) <
MINDIST)
4205 printf(
"equivalent dist adjusted for staggered: %g, %g, %g\n", dx, dy, dz);
4209 for (
int block = 1; block <=
WtFldFastVol[IdWtField].NbBlocks; ++block) {
4215 printf(
"block, dz, blkBtmZ, blkTopZ: %d, %lg, %lg, %lg\n", block, dz,
4220 if ((dz <= blkBtmZ) && ((blkBtmZ - dz) <
MINDIST)) dz = blkBtmZ -
MINDIST;
4221 if ((dz >= blkBtmZ) && ((dz - blkBtmZ) <
MINDIST)) dz = blkBtmZ +
MINDIST;
4222 if ((dz <= blkTopZ) && ((blkTopZ - dz) <
MINDIST)) dz = blkTopZ -
MINDIST;
4223 if ((dz >= blkTopZ) && ((dz - blkTopZ) <
MINDIST)) dz = blkTopZ +
MINDIST;
4225 if ((dz >= blkBtmZ) && (dz <= blkTopZ)) {
4231 neBEMMessage(
"WtFldFastPFAtPoint: point in none of the blocks!\n");
4239 double delZ =
WtFldBlkLZ[IdWtField][thisBlock] / nbZCells;
4244 printf(
"thisBlock: %d\n", thisBlock);
4245 printf(
"nbXCells, nbYCells, nbZCells: %d, %d, %d\n", nbXCells, nbYCells,
4247 printf(
"WtFldBlkCrnrZ: %lg\n",
WtFldBlkCrnrZ[IdWtField][thisBlock]);
4248 printf(
"delX, delY, delZ: %le, %le, %le\n", delX, delY, delZ);
4249 printf(
"dz: %lg\n", dz);
4254 int celli = (int)(dx / delX) + 1;
4260 if (celli > nbXCells) {
4263 neBEMMessage(
"WtFldFastPFAtPoint - celli > nbXCells\n");
4265 int cellj = (int)(dy / delY) + 1;
4271 if (cellj > nbYCells) {
4274 neBEMMessage(
"WtFldFastPFAtPoint - cellj > nbYCells\n");
4276 int cellk = (int)(dz / delZ) + 1;
4282 if (cellk > nbZCells) {
4285 neBEMMessage(
"WtFldFastPFAtPoint - cellk > nbZCells\n");
4287 if (dbgFn) printf(
"Cells in x, y, z: %d, %d, %d\n", celli, cellj, cellk);
4296 double dxcellcrnr = dx - (double)(celli - 1) * delX;
4297 double dycellcrnr = dy - (double)(cellj - 1) * delY;
4298 double dzcellcrnr = dz - (double)(cellk - 1) * delZ;
4300 printf(
"cell crnr dx, dy, dz: %g, %g, %g\n", dxcellcrnr, dycellcrnr,
4304 double xd = dxcellcrnr / delX;
4305 double yd = dycellcrnr / delY;
4306 double zd = dzcellcrnr / delZ;
4307 if (xd <= 0.0) xd = 0.0;
4308 if (yd <= 0.0) yd = 0.0;
4309 if (zd <= 0.0) zd = 0.0;
4310 if (xd >= 1.0) xd = 1.0;
4311 if (yd >= 1.0) yd = 1.0;
4312 if (zd >= 1.0) zd = 1.0;
4316 WtFldFastPot[IdWtField][thisBlock][celli][cellj][cellk];
4317 double FX000 =
WtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk];
4318 double FY000 =
WtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk];
4319 double FZ000 =
WtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk];
4320 double P100 =
WtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk];
4321 double FX100 =
WtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk];
4322 double FY100 =
WtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk];
4323 double FZ100 =
WtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk];
4324 double P010 =
WtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk];
4325 double FX010 =
WtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk];
4326 double FY010 =
WtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk];
4327 double FZ010 =
WtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk];
4328 double P001 =
WtFldFastPot[IdWtField][thisBlock][celli][cellj][cellk + 1];
4329 double FX001 =
WtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk + 1];
4330 double FY001 =
WtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk + 1];
4331 double FZ001 =
WtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk + 1];
4332 double P110 =
WtFldFastPot[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4333 double FX110 =
WtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4334 double FY110 =
WtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4335 double FZ110 =
WtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4336 double P101 =
WtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4337 double FX101 =
WtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4338 double FY101 =
WtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4339 double FZ101 =
WtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4340 double P011 =
WtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4341 double FX011 =
WtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4342 double FY011 =
WtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4343 double FZ011 =
WtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4345 WtFldFastPot[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4347 WtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4349 WtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4351 WtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4359 FX000 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk];
4360 FY000 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk];
4361 FZ000 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk];
4362 P100 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk];
4363 FX100 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk];
4364 FY100 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk];
4365 FZ100 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk];
4366 P010 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk];
4367 FX010 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk];
4368 FY010 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk];
4369 FZ010 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk];
4370 P001 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj][cellk + 1];
4371 FX001 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk + 1];
4372 FY001 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk + 1];
4373 FZ001 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk + 1];
4374 P110 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4375 FX110 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4376 FY110 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4377 FZ110 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4378 P101 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4379 FX101 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4380 FY101 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4381 FZ101 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4382 P011 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4383 FX011 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4384 FY011 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4385 FZ011 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4389 StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4391 StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4393 StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4397 FX000 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk];
4398 FY000 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk];
4399 FZ000 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk];
4400 P100 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk];
4401 FX100 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk];
4402 FY100 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk];
4403 FZ100 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk];
4404 P010 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk];
4405 FX010 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk];
4406 FY010 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk];
4407 FZ010 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk];
4408 P001 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj][cellk + 1];
4409 FX001 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj][cellk + 1];
4410 FY001 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj][cellk + 1];
4411 FZ001 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj][cellk + 1];
4412 P110 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4413 FX110 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4414 FY110 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4415 FZ110 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk];
4416 P101 =
StgWtFldFastPot[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4417 FX101 =
StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4418 FY101 =
StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4419 FZ101 =
StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj][cellk + 1];
4420 P011 =
StgWtFldFastPot[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4421 FX011 =
StgWtFldFastFX[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4422 FY011 =
StgWtFldFastFY[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4423 FZ011 =
StgWtFldFastFZ[IdWtField][thisBlock][celli][cellj + 1][cellk + 1];
4427 StgWtFldFastFX[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4429 StgWtFldFastFY[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4431 StgWtFldFastFZ[IdWtField][thisBlock][celli + 1][cellj + 1][cellk + 1];
4436 TriLin(xd, yd, zd, P000, P100, P010, P001, P110, P101, P011, P111);
4437 double intFX =
TriLin(xd, yd, zd, FX000, FX100, FX010, FX001, FX110, FX101,
4439 double intFY =
TriLin(xd, yd, zd, FY000, FY100, FY010, FY001, FY110, FY101,
4441 double intFZ =
TriLin(xd, yd, zd, FZ000, FZ100, FZ010, FZ001, FZ110, FZ101,
4450 printf(
"WtFldCell corner values:\n");
4451 printf(
"Potential: %g, %g, %g, %g\n", P000, P100, P010, P001);
4452 printf(
"Potential: %g, %g, %g, %g\n", P110, P101, P011, P111);
4453 printf(
"FastFX: %g, %g, %g, %g\n", FX000, FX100, FX010, FX001);
4454 printf(
"FastFX: %g, %g, %g, %g\n", FX110, FX101, FX011, FX111);
4455 printf(
"FastFY: %g, %g, %g, %g\n", FY000, FY100, FY010, FY001);
4456 printf(
"FastFY: %g, %g, %g, %g\n", FY110, FY101, FY011, FY111);
4457 printf(
"FastFZ: %g, %g, %g, %g\n", FZ000, FZ100, FZ010, FZ001);
4458 printf(
"FastFZ: %g, %g, %g, %g\n", FZ110, FZ101, FZ011, FZ111);
4459 printf(
"Pot, FX, FY, FZ: %g, %g, %g, %g\n", *Potential, globalF->
X,
4460 globalF->
Y, globalF->
Z);
4464 printf(
"out WtFldFastPFAtPoint\n");
4477 const double x = localP->
X;
4478 const double y = localP->
Y;
4479 const double z = localP->
Z;
4482 RecPF(a, b, x, y, z, Potential, &localF);
4485 TriPF(a, b, x, y, z, Potential, &localF);
4488 WirePF(a, b, x, y, z, Potential, &localF);
4491 printf(
"Geometrical type out of range! ... exiting ...\n");
4501void GetPF(
int type,
double a,
double b,
double x,
double y,
double z,
4502 double *Potential,
Vector3D *localF) {
4505 RecPF(a, b, x, y, z, Potential, localF);
4508 TriPF(a, b, x, y, z, Potential, localF);
4511 WirePF(a, b, x, y, z, Potential, localF);
4514 printf(
"Geometrical type out of range! ... exiting ...\n");
4522void RecPF(
double a,
double b,
double x,
double y,
double z,
double *Potential,
4524 const double d2 = x * x + y * y + z * z;
4525 if (d2 >=
FarField2 * (a * a + b * b)) {
4526 (*Potential) = a * b / sqrt(d2);
4527 const double f = (*Potential) / d2;
4532 int fstatus =
ExactRecSurf(x / a, y / a, z / a, -0.5, -(b / a) / 2.0, 0.5,
4533 (b / a) / 2.0, Potential, localF);
4535 printf(
"problem in RecPF ... \n");
4545void TriPF(
double a,
double b,
double x,
double y,
double z,
double *Potential,
4548 const double xm = x - a / 3.;
4549 const double zm = z - b / 3.;
4550 const double d2 = xm * xm + y * y + zm * zm;
4552 if (d2 >=
FarField2 * (a * a + b * b)) {
4553 (*Potential) = 0.5 * a * b / sqrt(d2);
4554 const double f = (*Potential) / d2;
4559 int fstatus =
ExactTriSurf(b / a, x / a, y / a, z / a, Potential, localF);
4561 printf(
"problem in TriPF ... \n");
4571void WirePF(
double rW,
double lW,
double x,
double y,
double z,
4572 double *Potential,
Vector3D *localF) {
4573 const double d2 = x * x + y * y + z * z;
4575 double dA = 2.0 *
ST_PI * rW * lW;
4576 const double dist = sqrt(d2);
4577 (*Potential) = dA / dist;
4578 double f = dA / (dist * d2);
4589 localF->
X = localF->
Y = 0.0;
4606 RecPrimPF(prim, localP, Potential, &localF);
4609 TriPrimPF(prim, localP, Potential, &localF);
4612 WirePrimPF(prim, localP, Potential, &localF);
4615 printf(
"Geometrical type out of range! ... exiting ...\n");
4628 RecPrimPF(prim, localP, Potential, localF);
4631 TriPrimPF(prim, localP, Potential, localF);
4637 printf(
"Geometrical type out of range! ... exiting ...\n");
4645 double xpt = localP->
X;
4646 double ypt = localP->
Y;
4647 double zpt = localP->
Z;
4648 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
4652 double diag = sqrt(a * a + b * b);
4656 (*Potential) = dA / dist;
4657 const double f = dA / (dist * dist * dist);
4658 localF->
X = xpt * f;
4659 localF->
Y = ypt * f;
4660 localF->
Z = zpt * f;
4662 int fstatus =
ExactRecSurf(xpt / a, ypt / a, zpt / a, -0.5, -(b / a) / 2.0,
4663 0.5, (b / a) / 2.0, Potential, localF);
4665 printf(
"problem in RecPrimPF ... \n");
4677 double xpt = localP->
X;
4678 double ypt = localP->
Y;
4679 double zpt = localP->
Z;
4683 double diag = sqrt(a * a + b * b);
4684 const double xm = xpt - a / 3.;
4685 const double zm = zpt - b / 3.;
4686 double dist = sqrt(xm * xm + ypt * ypt + zm * zm);
4689 double dA = 0.5 * a * b;
4690 (*Potential) = dA / dist;
4691 double f = dA / (dist * dist * dist);
4692 localF->
X = xpt * f;
4693 localF->
Y = ypt * f;
4694 localF->
Z = zpt * f;
4697 ExactTriSurf(b / a, xpt / a, ypt / a, zpt / a, Potential, localF);
4699 printf(
"problem in TriPrimPF ... \n");
4710 double xpt = localP->
X;
4711 double ypt = localP->
Y;
4712 double zpt = localP->
Z;
4713 double rW =
Radius[prim];
4714 double lW =
PrimLZ[prim];
4715 double dist = sqrt(xpt * xpt + ypt * ypt + zpt * zpt);
4718 double dA = 2.0 *
ST_PI * rW * lW;
4719 (*Potential) = dA / dist;
4720 double f = dA / (dist * dist * dist);
4721 localF->
X = xpt * f;
4722 localF->
Y = ypt * f;
4723 localF->
Z = zpt * f;
4731 localF->
X = localF->
Y = 0.0;
4739double TriLin(
double xd,
double yd,
double zd,
double c000,
double c100,
4740 double c010,
double c001,
double c110,
double c101,
double c011,
4742 double c00 = c000 * (1.0 - xd) + c100 * xd;
4743 double c10 = c010 * (1.0 - xd) + c110 * xd;
4744 double c01 = c001 * (1.0 - xd) + c101 * xd;
4745 double c11 = c011 * (1.0 - xd) + c111 * xd;
4746 double c0 = c00 * (1.0 - yd) + c10 * yd;
4747 double c1 = c01 * (1.0 - yd) + c11 * yd;
4748 return (c0 * (1.0 - zd) + c1 * zd);
int KnChPFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF)
void GetFlux(int ele, Point3D *localP, Vector3D *localF)
double GetPotential(int ele, Point3D *localP)
int FastPFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF)
int WtFldPFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF, int IdWtField)
void WirePrimPF(int prim, Point3D *localP, double *Potential, Vector3D *localF)
int FastKnChPFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF)
double TriPot(int ele, Point3D *localP)
void RecPrimPF(int prim, Point3D *localP, double *Potential, Vector3D *localF)
double WirePot(int ele, Point3D *localP)
void TriFlux(int ele, Point3D *localP, Vector3D *localF)
int CreateWtFldFastVolPF(int IdWtField)
void RecFlux(int ele, Point3D *localP, Vector3D *localF)
void GetPrimPFGCS(int prim, Point3D *localP, double *Potential, Vector3D *globalF, DirnCosn3D *DirCos)
double RecPot(int ele, Point3D *localP)
int WtFldFastPFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF, int IdWtField)
void WireFlux(int ele, Point3D *localP, Vector3D *localF)
void RecPF(double a, double b, double x, double y, double z, double *Potential, Vector3D *localF)
int ElePFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF)
void TriPF(double a, double b, double x, double y, double z, double *Potential, Vector3D *localF)
void GetPFGCS(int type, double a, double b, Point3D *localP, double *Potential, Vector3D *globalF, DirnCosn3D *DirCos)
int PFAtPoint(Point3D *globalP, double *Potential, Vector3D *globalF)
int FastElePFAtPoint(Point3D *, double *, Vector3D *)
int CreateFastVolElePF(void)
double TriLin(double xd, double yd, double zd, double c000, double c100, double c010, double c001, double c110, double c101, double c011, double c111)
void TriPrimPF(int prim, Point3D *localP, double *Potential, Vector3D *localF)
void WirePF(double rW, double lW, double x, double y, double z, double *Potential, Vector3D *localF)
void GetPrimPF(int prim, Point3D *localP, double *Potential, Vector3D *localF)
int CreateFastVolPF(void)
void GetPF(int type, double a, double b, double x, double y, double z, double *Potential, Vector3D *localF)
void GetFluxGCS(int ele, Point3D *localP, Vector3D *globalF)
double ExactThinFX_W(double rW, double lW, double X, double Y, double Z)
double ExactCentroidalP_W(double rW, double lW)
double ExactThinFY_W(double rW, double lW, double X, double Y, double Z)
double ExactAxialP_W(double rW, double lW, double Z)
int ExactThinWire(double rW, double lW, double X, double Y, double Z, double *potential, Vector3D *Flux)
double ExactThinFZ_W(double rW, double lW, double X, double Y, double Z)
int ExactRecSurf(double X, double Y, double Z, double xlo, double zlo, double xhi, double zhi, double *Potential, Vector3D *Flux)
int ExactTriSurf(double zMax, double X, double Y, double Z, double *Potential, Vector3D *Flux)
double LineKnChPF(Point3D LineStart, Point3D LineStop, Point3D FieldPt, Vector3D *globalF)
double ExactThinP_W(double rW, double lW, double X, double Y, double Z)
double AreaKnChPF(int NbVertices, Point3D *Vertex, Point3D FieldPt, Vector3D *globalF)
double PointKnChPF(Point3D SourcePt, Point3D FieldPt, Vector3D *globalF)
double VolumeKnChPF(int, Point3D *, Point3D, Vector3D *globalF)
Vector3D RotateVector3D(Vector3D *A, DirnCosn3D *DC, int Sense)
int neBEMVolumePoint(double x, double y, double z)
Return the volume in which a point is located.
int neBEMMessage(const char *message)
Point3D ReflectPrimitiveOnMirror(char Axis, int primsrc, Point3D srcpt, Point3D fldpt, double distance, DirnCosn3D *MirroredDC)
Point3D ReflectOnMirror(char Axis, int elesrc, Point3D srcpt, Point3D fldpt, double distance, DirnCosn3D *MirroredDC)
neBEMGLOBAL Element * EleArr
neBEMGLOBAL double **** FastFY
neBEMGLOBAL int DebugLevel
neBEMGLOBAL int WtFldNbPtSkip[MAXWtFld]
neBEMGLOBAL int * PeriodicInY
neBEMGLOBAL int OptStaggerFastVol
neBEMGLOBAL double **** FastFZ
neBEMGLOBAL int OptStaggerWtFldFastVol[MAXWtFld]
neBEMGLOBAL int WtFldPrimAfter
neBEMGLOBAL double **** StgWtFldFastPot[MAXWtFld]
neBEMGLOBAL int * MirrorTypeZ
neBEMGLOBAL double * OmitVolCrnrZ
neBEMGLOBAL double * MirrorDistYFromOrigin
neBEMGLOBAL int * WtFldBlkNbZCells[MAXWtFld]
neBEMGLOBAL double * WtFldBlkLZ[MAXWtFld]
neBEMGLOBAL double * WtFldOmitVolCrnrY[MAXWtFld]
neBEMGLOBAL double **** WtFldFastFY[MAXWtFld]
neBEMGLOBAL double * ZPeriod
neBEMGLOBAL PointKnCh * PointKnChArr
neBEMGLOBAL double * OmitVolLX
neBEMGLOBAL VolumeKnCh * VolumeKnChArr
neBEMGLOBAL int OptStaggerMap
neBEMGLOBAL double **** FastFYKnCh
neBEMGLOBAL double **** StgFastFY
neBEMGLOBAL double * WtFldOmitVolLX[MAXWtFld]
neBEMGLOBAL double VSystemChargeZero
neBEMGLOBAL int * WtFldBlkNbYCells[MAXWtFld]
neBEMGLOBAL double **** StgFastFZ
neBEMGLOBAL double * PrimOriginZ
neBEMGLOBAL double * WtFldIgnoreVolCrnrZ[MAXWtFld]
neBEMGLOBAL double * BlkCrnrZ
neBEMGLOBAL int NbPrimitives
neBEMGLOBAL int * NbVertices
neBEMGLOBAL int * PeriodicTypeX
neBEMGLOBAL int StgWtFldNbPtSkip[MAXWtFld]
neBEMGLOBAL double **** StgFastFYKnCh
neBEMGLOBAL double * WtFldOmitVolCrnrX[MAXWtFld]
neBEMGLOBAL double * WtFldIgnoreVolCrnrY[MAXWtFld]
neBEMGLOBAL int * PeriodicTypeY
neBEMGLOBAL int NbPointsKnCh
neBEMGLOBAL double * WtFldBlkCrnrZ[MAXWtFld]
neBEMGLOBAL FastAlgoVol FastVol
neBEMGLOBAL double * PrimOriginY
neBEMGLOBAL double * MirrorDistZFromOrigin
neBEMGLOBAL AreaKnCh * AreaKnChArr
neBEMGLOBAL DirnCosn3D * PrimDC
neBEMGLOBAL int PrimAfter
neBEMGLOBAL double * BlkLZ
neBEMGLOBAL double * OmitVolCrnrX
neBEMGLOBAL int OptSystemChargeZero
neBEMGLOBAL int NbLinesKnCh
neBEMGLOBAL double * OmitVolLZ
neBEMGLOBAL int NbStgPtSkip
neBEMGLOBAL double * XPeriod
neBEMGLOBAL double **** StgFastFZKnCh
neBEMGLOBAL double * WtFldIgnoreVolCrnrX[MAXWtFld]
neBEMGLOBAL int NbVolumesKnCh
neBEMGLOBAL double * AvAsgndChDen
neBEMGLOBAL double * IgnoreVolCrnrY
neBEMGLOBAL char MapVersion[10]
neBEMGLOBAL double * OmitVolCrnrY
neBEMGLOBAL double * WtFldIgnoreVolLY[MAXWtFld]
neBEMGLOBAL int * MirrorTypeY
neBEMGLOBAL double **** WtFldFastFZ[MAXWtFld]
neBEMGLOBAL double **** FastFX
neBEMGLOBAL int NbAreasKnCh
neBEMGLOBAL int * ElementEnd
neBEMGLOBAL double * AvChDen
neBEMGLOBAL double * WtFldOmitVolCrnrZ[MAXWtFld]
neBEMGLOBAL double * Radius
neBEMGLOBAL int * MirrorTypeX
neBEMGLOBAL double **** StgFastPotKnCh
neBEMGLOBAL double * WtFldOmitVolLZ[MAXWtFld]
neBEMGLOBAL double * OmitVolLY
neBEMGLOBAL int * BlkNbXCells
neBEMGLOBAL int * PrimType
neBEMGLOBAL int OptReadFastPF
neBEMGLOBAL double * PrimLX
neBEMGLOBAL double **** StgWtFldFastFX[MAXWtFld]
neBEMGLOBAL int * BlkNbZCells
neBEMGLOBAL double * Solution
neBEMGLOBAL int * ElementBgn
neBEMGLOBAL double * PrimOriginX
neBEMGLOBAL double ** AvWtChDen
neBEMGLOBAL double * IgnoreVolLY
neBEMGLOBAL double * IgnoreVolLX
neBEMGLOBAL int * PeriodicInZ
neBEMGLOBAL int * WtFldBlkNbXCells[MAXWtFld]
neBEMGLOBAL int * PeriodicInX
neBEMGLOBAL double * WtFldIgnoreVolLZ[MAXWtFld]
neBEMGLOBAL double **** WtFldFastFX[MAXWtFld]
neBEMGLOBAL double **** FastFXKnCh
neBEMGLOBAL double * WtFldIgnoreVolLX[MAXWtFld]
neBEMGLOBAL double LengthScale
neBEMGLOBAL double **** StgFastFXKnCh
neBEMGLOBAL double * IgnoreVolLZ
neBEMGLOBAL double **** FastFZKnCh
neBEMGLOBAL double **** WtFldFastPot[MAXWtFld]
neBEMGLOBAL VoxelVol Voxel
neBEMGLOBAL double ** WtFieldChDen
neBEMGLOBAL WtFldFastAlgoVol WtFldFastVol[MAXWtFld]
neBEMGLOBAL int * PeriodicTypeZ
neBEMGLOBAL double * WtFldOmitVolLY[MAXWtFld]
neBEMGLOBAL LineKnCh * LineKnChArr
neBEMGLOBAL double **** FastPot
neBEMGLOBAL double **** StgWtFldFastFY[MAXWtFld]
neBEMGLOBAL double **** FastPotKnCh
neBEMGLOBAL double **** StgFastFX
neBEMGLOBAL double * IgnoreVolCrnrX
neBEMGLOBAL char BCOutDir[256]
neBEMGLOBAL double * YPeriod
neBEMGLOBAL double * PrimLZ
neBEMGLOBAL double * MirrorDistXFromOrigin
neBEMGLOBAL int NbSystemChargeZero
neBEMGLOBAL double **** StgFastPot
neBEMGLOBAL double * IgnoreVolCrnrZ
neBEMGLOBAL int * BlkNbYCells
neBEMGLOBAL double **** StgWtFldFastFZ[MAXWtFld]
void free_dvector(double *v, long nl, long)
double * dvector(long nl, long nh)