312 "\nLHMatrix: The size of the Influence coefficient matrix is %d X %d\n",
331 printf(
"Computing influence coefficient matrix ... will take time ...\n");
334 int nthreads = 1, tid = 0;
335#pragma omp parallel private(nthreads, tid)
340 tid = omp_get_thread_num();
342 nthreads = omp_get_num_threads();
343 printf(
"Starting influence matrix computation with %d threads\n",
351 for (
int elefld = 1; elefld <=
NbElements; ++elefld) {
357 const double xfld = (
EleArr + elefld - 1)->BC.CollPt.X;
358 const double yfld = (
EleArr + elefld - 1)->BC.CollPt.Y;
359 const double zfld = (
EleArr + elefld - 1)->BC.CollPt.Z;
364 for (
int elesrc = 1; elesrc <=
NbElements; ++elesrc) {
366 printf(
"\n\nelefld: %d, elesrc: %d\n", elefld, elesrc);
370 const int primsrc = (
EleArr + elesrc - 1)->PrimitiveNb;
371 const double xsrc = (
EleArr + elesrc - 1)->G.Origin.X;
372 const double ysrc = (
EleArr + elesrc - 1)->G.Origin.Y;
373 const double zsrc = (
EleArr + elesrc - 1)->G.Origin.Z;
375 if ((
EleArr + elesrc - 1)->E.Type == 0) {
377 "LHMatrix: Wrong EType for elesrc %d element %d on %dth "
379 elesrc, (
EleArr + elesrc - 1)->Id, primsrc);
394 double InitialVector[3] = {xfld - xsrc, yfld - ysrc, zfld - zsrc};
395 double TransformationMatrix[3][3] = {
396 {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}};
398 TransformationMatrix[0][0] = DirCos->
XUnit.
X;
399 TransformationMatrix[0][1] = DirCos->
XUnit.
Y;
400 TransformationMatrix[0][2] = DirCos->
XUnit.
Z;
401 TransformationMatrix[1][0] = DirCos->
YUnit.
X;
402 TransformationMatrix[1][1] = DirCos->
YUnit.
Y;
403 TransformationMatrix[1][2] = DirCos->
YUnit.
Z;
404 TransformationMatrix[2][0] = DirCos->
ZUnit.
X;
405 TransformationMatrix[2][1] = DirCos->
ZUnit.
Y;
406 TransformationMatrix[2][2] = DirCos->
ZUnit.
Z;
407 double FinalVector[3] = {0., 0., 0.};
409 for (
int i = 0; i < 3; ++i) {
410 for (
int j = 0; j < 3; ++j) {
411 FinalVector[i] += TransformationMatrix[i][j] * InitialVector[j];
415 localP.
X = FinalVector[0];
416 localP.
Y = FinalVector[1];
417 localP.
Z = FinalVector[2];
421 if ((elefld == 0) && (elesrc == 0))
427 &(
EleArr + elesrc - 1)->G.DC);
429 printf(
"elefld: %d, elesrc: %d, Influence: %.16lg\n", elefld,
430 elesrc,
Inf[elefld][elesrc]);
439 "Mirror not correctly implemented in this version of neBEM "
476 Inf[elefld][elesrc] -= AddnalInfl;
479 Inf[elefld][elesrc] += AddnalInfl;
490 Inf[elefld][elesrc] -= AddnalInfl;
493 Inf[elefld][elesrc] += AddnalInfl;
504 Inf[elefld][elesrc] -= AddnalInfl;
507 Inf[elefld][elesrc] += AddnalInfl;
511 printf(
"After reflection of basic device =>\n");
512 printf(
"elefld: %d, elesrc: %d, Influence: %.16lg\n", elefld,
513 elesrc,
Inf[elefld][elesrc]);
544 double XOfRpt = xsrc +
XPeriod[primsrc] * (double)xrpt;
548 double YOfRpt = ysrc +
YPeriod[primsrc] * (double)yrpt;
552 double ZOfRpt = zsrc +
ZPeriod[primsrc] * (double)zrpt;
554 if ((xrpt == 0) && (yrpt == 0) && (zrpt == 0))
561 double InitialVector[3] = {xfld - XOfRpt, yfld - YOfRpt,
563 double TransformationMatrix[3][3] = {
564 {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}};
566 TransformationMatrix[0][0] = DirCos->
XUnit.
X;
567 TransformationMatrix[0][1] = DirCos->
XUnit.
Y;
568 TransformationMatrix[0][2] = DirCos->
XUnit.
Z;
569 TransformationMatrix[1][0] = DirCos->
YUnit.
X;
570 TransformationMatrix[1][1] = DirCos->
YUnit.
Y;
571 TransformationMatrix[1][2] = DirCos->
YUnit.
Z;
572 TransformationMatrix[2][0] = DirCos->
ZUnit.
X;
573 TransformationMatrix[2][1] = DirCos->
ZUnit.
Y;
574 TransformationMatrix[2][2] = DirCos->
ZUnit.
Z;
575 double FinalVector[3] = {0., 0., 0.};
577 for (
int i = 0; i < 3; ++i) {
578 for (
int j = 0; j < 3; ++j) {
580 TransformationMatrix[i][j] * InitialVector[j];
584 localP.
X = FinalVector[0];
585 localP.
Y = FinalVector[1];
586 localP.
Z = FinalVector[2];
592 elefld, elesrc, &localP, &(
EleArr + elesrc - 1)->G.DC);
593 Inf[elefld][elesrc] += AddnalInfl;
596 printf(
"REPEATED\n");
597 printf(
"elefld: %d, elesrc: %d\n", elefld, elesrc);
598 printf(
"xsrc: %lg, ysrc: %lg, zsrc: %lg\n", xsrc, ysrc,
600 printf(
"xrpt: %d, yrpt: %d, zrpt: %d\n", xrpt, yrpt,
602 printf(
"XOfRpt: %lg, YOfRpt: %lg, ZOfRpt: %lg\n", XOfRpt,
604 printf(
"AddnalInfl: %lg\n", AddnalInfl);
605 printf(
"Inf: %lg\n",
Inf[elefld][elesrc]);
613 "Mirror not correctly implemented in this version of "
642 Inf[elefld][elesrc] -=
645 Inf[elefld][elesrc] += AddnalInfl;
657 Inf[elefld][elesrc] -=
660 Inf[elefld][elesrc] += AddnalInfl;
672 Inf[elefld][elesrc] -=
675 Inf[elefld][elesrc] += AddnalInfl;
679 printf(
"REPEATED and reflected\n");
680 printf(
"elefld: %d, elesrc: %d\n", elefld, elesrc);
681 printf(
"xsrc: %lg, ysrc: %lg, zsrc: %lg\n", xsrc, ysrc,
683 printf(
"xrpt: %d, yrpt: %d, zrpt: %d\n", xrpt, yrpt,
685 printf(
"XOfRpt: %lg, YOfRpt: %lg, ZOfRpt: %lg\n",
686 XOfRpt, YOfRpt, ZOfRpt);
687 printf(
"AddnalInfl: %lg\n", AddnalInfl);
688 printf(
"Inf: %lg\n",
Inf[elefld][elesrc]);
714 for (
int row = 1; row <=
NbEqns; ++row) {
715 if (((
EleArr + row - 1)->E.Type == 1) ||
716 ((
EleArr + row - 1)->E.Type == 3))
738 for (
int row = 1; row <=
NbEqns; ++row) {
739 int etfld = (
EleArr + row - 1)->E.Type;
748 int etfld = (
EleArr + col - 1)->E.Type;
765 printf(
"storing the influence matrix in a formatted file ...\n");
770 strcat(InflFile,
"/Infl.out");
771 FILE *fInf = fopen(InflFile,
"w+");
778 for (
int elefld = 1; elefld <=
NbEqns; ++elefld) {
779 for (
int elesrc = 1; elesrc <=
NbUnknowns; ++elesrc)
780 fprintf(fInf,
"%.16lg\n",
Inf[elefld][elesrc]);
791 "LHMatrix - Binary write of Infl matrix not implemented yet.\n");
796 strcat(InflFile,
"/RawInfl.out");
797 FILE *fInf = fopen(InflFile,
"wb");
802 printf(
"\nfInf: %p\n", (
void *)fInf);
805 printf(
"\nNb of items successfully written in raw mode in %s is %d\n",
2785 double **RawInf = NULL;
2791 printf(
"\ncomputing solution for each element: ");
2794 printf(
"%6d ...", i);
2800#pragma omp parallel for private(j) reduction(+ : sum)
2807 printf(
"\b\b\b\b\b\b\b\b\b\b");
2811 printf(
"\nsolution over for all elements ...\n");
2817 printf(
"\nsolution over for system charge zero constraint ...\n");
2824 "\nsolution over for floating conductor charge zero constraint "
2833 strcat(SolnFile,
"/Soln.out");
2834 FILE *fSoln = fopen(SolnFile,
"w");
2835 if (fSoln == NULL) {
2839 fprintf(fSoln,
"#EleNb\tX\tY\tZ\tSolution\tAssigned\tTotal\n");
2840 for (
int ele = 1; ele <=
NbElements; ++ele) {
2842 fprintf(fSoln,
"%d\t%lg\t%lg\t%lg\t%.16lg\t%.16lg\t%.16lg\n", ele,
2843 (
EleArr + ele - 1)->G.Origin.X, (
EleArr + ele - 1)->G.Origin.Y,
2844 (
EleArr + ele - 1)->G.Origin.Z, (
EleArr + ele - 1)->Solution,
2845 (
EleArr + ele - 1)->Assigned,
2846 ((
EleArr + ele - 1)->Solution + (
EleArr + ele - 1)->Assigned));
2851 fprintf(fSoln,
"#NbSystemChargeZero\tVSystemChargeZero\n");
2855 fprintf(fSoln,
"#NbFloatCon\tVFloatCon\n");
2863 char PrimSolnFile[256];
2865 strcat(PrimSolnFile,
"/PrimSoln.out");
2866 FILE *fPrimSoln = fopen(PrimSolnFile,
"w");
2867 if (fPrimSoln == NULL) {
2872 "#PrimNb\tEleBgn\tEleEnd\tX\tY\tZ\tAvChDen\tAvAsgndChDen\n");
2880 area += (
EleArr + ele - 1)->G.dA;
2883 (
EleArr + ele - 1)->Assigned * (
EleArr + ele - 1)->G.dA;
2889 fprintf(fPrimSoln,
"%d\t%d\t%d\t%lg\t%lg\t%lg\t%.16lg\t%.16g\n", prim,
2907 printf(
"Computing solution at the collocation points for comparison.\n");
2911 printf(
"Influence matrix in memory ...\n");
2920 printf(
"Influence matrix in memory ...\n");
2922 printf(
"Influence matrix NOT in memory ...\n");
2925 printf(
"repeating influence coefficient matrix computation ...\n");
2937 "reading influence coefficient matrix from formatted file...\n");
2941 strcat(InflFile,
"/Infl.out");
2942 FILE *fInf = fopen(InflFile,
"r");
2949 int chkNbEqns, chkNbUnknowns;
2950 fscanf(fInf,
"%d %d\n", &chkNbEqns, &chkNbUnknowns);
2952 neBEMMessage(
"Solve - matrix dimension do not match!");
2957 printf(
"Solve: Matrix dimensions: %d equations, %d unknowns\n",
2962 for (
int elefld = 1; elefld <=
NbEqns; ++elefld)
2963 for (
int elesrc = 1; elesrc <=
NbUnknowns; ++elesrc)
2964 fscanf(fInf,
"%le\n", &
Inf[elefld][elesrc]);
2970 "Solve - Binary read of Infl matrix not implemented yet.\n");
2976 "reading influence coefficient matrix from unformatted file "
2981 strcat(InflFile,
"/RawInfl.out");
2982 printf(
"\nread from file %s\n", InflFile);
2984 FILE *fInf = fopen(InflFile,
"rb");
2990 printf(
"\nfInf: %p\n", (
void *)fInf);
2993 printf(
"\nNb of items successfully read from raw mode in %s is %d\n",
2997 for (
int unknown = 1; unknown <=
NbUnknowns; ++unknown)
2998 for (
int eqn = 1; eqn <=
NbEqns; ++eqn)
3000 "Unknown:%d, Eqn:%d => diff Inf: %lg, RawInf: %lg is %lg\n",
3001 unknown, eqn,
Inf[unknown][eqn], RawInf[unknown][eqn],
3002 fabs(
Inf[unknown][eqn] - RawInf[unknown][eqn]));
3009 if (
Inf || RawInf) {
3013 strcat(Chkfile,
"/XChk.out");
3014 FILE *fChk = fopen(Chkfile,
"w");
3019 fprintf(fChk,
"#Row\tGivenPot\tError\n");
3021 int ElementOfMaxError = 1;
3022 double *Error, MaxError = 0.0;
3026#pragma omp parallel for private(elesrc)
3028 for (
int elefld = 1; elefld <=
NbEqns; elefld++) {
3030 for (elesrc = 1; elesrc <=
NbUnknowns; elesrc++) {
3033 XChk += RawInf[elefld][elesrc] *
Solution[elesrc];
3037 Error[elefld] = fabs(
RHS[elefld] - XChk);
3039 if (Error[elefld] > MaxError) {
3040 MaxError = Error[elefld];
3041 ElementOfMaxError = elefld;
3044 for (
int elefld = 1; elefld <=
NbEqns; elefld++)
3045 fprintf(fChk,
"%d\t%lg\t%lg\n", elefld,
RHS[elefld], Error[elefld]);
3048 printf(
"Computed values at the collocation points for comparison.\n");
3049 printf(
"Error maximum on element %d and its magnitude is %lg.\n",
3050 ElementOfMaxError, MaxError);
3053 fprintf(fChk,
"#Error maximum on element %d and its magnitude is %lg.\n",
3054 ElementOfMaxError, MaxError);
3067 "Solve - Infl matrix not available, re-computation forced.\n");
3071 neBEMMessage(
"Solve - LHMatrix in forced OptRepeatLHMatrix");
3079 strcat(Chkfile,
"/XChk.out");
3080 fChk = fopen(Chkfile,
"w");
3082 neBEMMessage(
"Solve - ChkFile in forced recomputation");
3085 fprintf(fChk,
"#Row\tGivenPot\tComputedPot\tDiff\n");
3087 int ElementOfMaxError = 1;
3088 double Error, MaxError = 0.0;
3089 for (
int elefld = 1; elefld <=
NbEqns; elefld++) {
3091 for (
int elesrc = 1; elesrc <=
NbUnknowns; elesrc++) {
3094 Error = fabs(
RHS[elefld] - XChk);
3095 fprintf(fChk,
"%d\t%lg\t%lg\t%lg\n", elefld,
RHS[elefld], XChk,
3098 if (Error > MaxError) {
3100 ElementOfMaxError = elefld;
3104 printf(
"Computed values at the collocation points for comparison.\n");
3105 printf(
"Error maximum on element %d and its magnitude is %lg.\n",
3106 ElementOfMaxError, MaxError);
3110 "#Error maximum on element %d and its magnitude is %lg.\n",
3111 ElementOfMaxError, MaxError);
3116 neBEMMessage(
"Solve - Infl matrix not available, no validation.\n");
3163 "Properties at non-collocation points on element for estimating "
3168 int PrimitiveOfMaxError = 1;
3169 int ElementOfMaxError = 1;
3170 double MaxError = 0.0;
3171 double xerrMax = 0.0, yerrMax = 0.0, zerrMax = 0.0;
3175 strcat(Errfile,
"/Errors.out");
3176 FILE *fErr = fopen(Errfile,
"w");
3182 "#Prim\tEle\tGType\tIType\txerr\tyerr\tzerr\tGivenBC\tComputVal\tDi"
3200 double normdisp = 1.0e-8;
3202 if ((prim == 91) && (ele == 337))
3213 if ((
EleArr + ele - 1)->G.Type == 2)
continue;
3215 if ((
EleArr + ele - 1)->G.Type == 3)
3220 double x0 = (
EleArr + ele - 1)->G.Vertex[0].
X;
3221 double y0 = (
EleArr + ele - 1)->G.Vertex[0].Y;
3222 double z0 = (
EleArr + ele - 1)->G.Vertex[0].Z;
3223 double x1 = (
EleArr + ele - 1)->G.Vertex[1].X;
3224 double y1 = (
EleArr + ele - 1)->G.Vertex[1].Y;
3225 double z1 = (
EleArr + ele - 1)->G.Vertex[1].Z;
3226 double x2 = (
EleArr + ele - 1)->G.Vertex[2].X;
3227 double y2 = (
EleArr + ele - 1)->G.Vertex[2].Y;
3228 double z2 = (
EleArr + ele - 1)->G.Vertex[2].Z;
3229 double xb = (x0 + x1 + x2) / 3.0;
3230 double yb = (y0 + y1 + y2) / 3.0;
3231 double zb = (z0 + z1 + z2) / 3.0;
3238 PFAtPoint(&globalP, &Potential, &globalF);
3239 Err =
ApplPot[prim] - Potential;
3240 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3241 prim, ele, 3, 1, xb, yb, zb,
ApplPot[prim], Potential, Err);
3242 if (fabs(Err) > fabs(MaxError)) {
3244 PrimitiveOfMaxError = prim;
3245 ElementOfMaxError = ele;
3253 double xplus = xb + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3254 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3255 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3256 double yplus = yb + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3257 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3258 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3259 double zplus = zb + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3260 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3261 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3265 PFAtPoint(&globalP, &Potential, &globalF);
3269 double value1 = -localF.
Y;
3270 double xminus = xb - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3271 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3272 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3273 double yminus = yb - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3274 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3275 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3276 double zminus = zb - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3277 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3278 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3282 PFAtPoint(&globalP, &Potential, &globalF);
3286 double value2 = -localF.
Y;
3288 Err = epsratio - (value1 / value2);
3289 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3290 prim, ele, 3, 4, xb, yb, zb, epsratio, (value1 / value2),
3292 if (fabs(Err) > fabs(MaxError)) {
3294 PrimitiveOfMaxError = prim;
3295 ElementOfMaxError = ele;
3304 0.25 * (x0 + 0.5 * (x0 + x1) + 0.5 * (x1 + x2) + 0.5 * (x0 + x2));
3306 0.25 * (y0 + 0.5 * (y0 + y1) + 0.5 * (y1 + y2) + 0.5 * (y0 + y2));
3308 0.25 * (z0 + 0.5 * (z0 + z1) + 0.5 * (z1 + z2) + 0.5 * (z0 + z2));
3316 PFAtPoint(&globalP, &Potential, &globalF);
3317 Err =
ApplPot[prim] - Potential;
3318 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3319 prim, ele, 3, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3321 if (fabs(Err) > fabs(MaxError)) {
3323 PrimitiveOfMaxError = prim;
3324 ElementOfMaxError = ele;
3332 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3333 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3334 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3335 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3336 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3337 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3338 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3339 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3340 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3344 PFAtPoint(&globalP, &Potential, &globalF);
3348 double value1 = -localF.
Y;
3349 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3350 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3351 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3352 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3353 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3354 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3355 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3356 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3357 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3361 PFAtPoint(&globalP, &Potential, &globalF);
3365 double value2 = -localF.
Y;
3367 Err = epsratio - (value1 / value2);
3368 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3369 prim, ele, 3, 4, xerr, yerr, zerr, epsratio,
3370 (value1 / value2), Err);
3371 if (fabs(Err) > fabs(MaxError)) {
3373 PrimitiveOfMaxError = prim;
3374 ElementOfMaxError = ele;
3382 xerr = (0.5 * (x0 + x1) + 0.5 * (x1 + x2) + x1) / 3.0;
3383 yerr = (0.5 * (y0 + y1) + 0.5 * (y1 + y2) + y1) / 3.0;
3384 zerr = (0.5 * (z0 + z1) + 0.5 * (z1 + z2) + z1) / 3.0;
3392 PFAtPoint(&globalP, &Potential, &globalF);
3393 Err =
ApplPot[prim] - Potential;
3394 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3395 prim, ele, 3, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3397 if (fabs(Err) > fabs(MaxError)) {
3399 PrimitiveOfMaxError = prim;
3400 ElementOfMaxError = ele;
3408 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3409 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3410 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3411 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3412 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3413 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3414 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3415 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3416 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3420 PFAtPoint(&globalP, &Potential, &globalF);
3424 double value1 = -localF.
Y;
3425 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3426 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3427 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3428 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3429 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3430 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3431 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3432 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3433 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3437 PFAtPoint(&globalP, &Potential, &globalF);
3441 double value2 = -localF.
Y;
3443 Err = epsratio - (value1 / value2);
3444 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3445 prim, ele, 3, 4, xerr, yerr, zerr, epsratio,
3446 (value1 / value2), Err);
3447 if (fabs(Err) > fabs(MaxError)) {
3449 PrimitiveOfMaxError = prim;
3450 ElementOfMaxError = ele;
3458 xerr = (0.5 * (x0 + x2) + 0.5 * (x1 + x2) + x2) / 3.0;
3459 yerr = (0.5 * (y0 + y2) + 0.5 * (y1 + y2) + y2) / 3.0;
3460 zerr = (0.5 * (z0 + z2) + 0.5 * (z1 + z2) + z2) / 3.0;
3468 PFAtPoint(&globalP, &Potential, &globalF);
3469 Err =
ApplPot[prim] - Potential;
3470 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3471 prim, ele, 3, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3473 if (fabs(Err) > fabs(MaxError)) {
3475 PrimitiveOfMaxError = prim;
3476 ElementOfMaxError = ele;
3484 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3485 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3486 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3487 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3488 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3489 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3490 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3491 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3492 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3496 PFAtPoint(&globalP, &Potential, &globalF);
3500 double value1 = -localF.
Y;
3501 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3502 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3503 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3504 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3505 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3506 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3507 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3508 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3509 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3513 PFAtPoint(&globalP, &Potential, &globalF);
3517 double value2 = -localF.
Y;
3519 Err = epsratio - (value1 / value2);
3520 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3521 prim, ele, 4, 4, xerr, yerr, zerr, epsratio,
3522 (value1 / value2), Err);
3523 if (fabs(Err) > fabs(MaxError)) {
3525 PrimitiveOfMaxError = prim;
3526 ElementOfMaxError = ele;
3534 if ((
EleArr + ele - 1)->G.Type == 4)
3540 double x0 = (
EleArr + ele - 1)->G.Vertex[0].
X;
3541 double y0 = (
EleArr + ele - 1)->G.Vertex[0].Y;
3542 double z0 = (
EleArr + ele - 1)->G.Vertex[0].Z;
3543 double x1 = (
EleArr + ele - 1)->G.Vertex[1].X;
3544 double y1 = (
EleArr + ele - 1)->G.Vertex[1].Y;
3545 double z1 = (
EleArr + ele - 1)->G.Vertex[1].Z;
3546 double x2 = (
EleArr + ele - 1)->G.Vertex[2].X;
3547 double y2 = (
EleArr + ele - 1)->G.Vertex[2].Y;
3548 double z2 = (
EleArr + ele - 1)->G.Vertex[2].Z;
3549 double x3 = (
EleArr + ele - 1)->G.Vertex[3].X;
3550 double y3 = (
EleArr + ele - 1)->G.Vertex[3].Y;
3551 double z3 = (
EleArr + ele - 1)->G.Vertex[3].Z;
3552 double xo = 0.25 * (x0 + x1 + x2 + x3);
3553 double yo = 0.25 * (y0 + y1 + y2 + y3);
3554 double zo = 0.25 * (z0 + z1 + z2 + z3);
3561 PFAtPoint(&globalP, &Potential, &globalF);
3562 Err =
ApplPot[prim] - Potential;
3563 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3564 prim, ele, 4, 1, xo, yo, zo,
ApplPot[prim], Potential, Err);
3565 if (fabs(Err) > fabs(MaxError)) {
3567 PrimitiveOfMaxError = prim;
3568 ElementOfMaxError = ele;
3576 double xplus = xo + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3577 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3578 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3579 double yplus = yo + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3580 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3581 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3582 double zplus = zo + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3583 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3584 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3588 PFAtPoint(&globalP, &Potential, &globalF);
3592 double dispfld1 =
Epsilon1[prim] * localF.
Y;
3593 double xminus = xo - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3594 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3595 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3596 double yminus = yo - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3597 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3598 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3599 double zminus = zo - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3600 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3601 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3605 PFAtPoint(&globalP, &Potential, &globalF);
3609 double dispfld2 =
Epsilon2[prim] * localF.
Y;
3613 PFAtPoint(&globalP, &Potential, &globalF);
3617 double dispfldo =
Epsilon1[prim] * localF.
Y;
3618 Err = (dispfld2 - dispfld1) /
3620 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3621 prim, ele, 4, 4, xo, yo, zo, dispfld1, dispfld2, Err);
3622 if ((prim == 91) && (ele == 337)) {
3624 double TotalInfl = 0.0;
3625 for (
int elesrc = 1; elesrc <=
NbElements; ++elesrc) {
3628 printf(
"TotalInfl: %lg\n", TotalInfl);
3630 "%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\t%"
3633 dispfld1, dispfld2, dispfldo, Err);
3635 if (fabs(Err) > fabs(MaxError)) {
3637 PrimitiveOfMaxError = prim;
3638 ElementOfMaxError = ele;
3646 double xerr = 0.25 * (x0 + 0.5 * (x1 + x0) + xo + 0.5 * (x0 + x3));
3647 double yerr = 0.25 * (y0 + 0.5 * (y1 + y0) + yo + 0.5 * (y0 + y3));
3648 double zerr = 0.25 * (z0 + 0.5 * (z1 + z0) + zo + 0.5 * (z0 + z3));
3653 PFAtPoint(&globalP, &Potential, &globalF);
3654 Err =
ApplPot[prim] - Potential;
3655 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3656 prim, ele, 4, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3658 if (fabs(Err) > fabs(MaxError)) {
3660 PrimitiveOfMaxError = prim;
3661 ElementOfMaxError = ele;
3669 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3670 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3671 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3672 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3673 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3674 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3675 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3676 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3677 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3681 PFAtPoint(&globalP, &Potential, &globalF);
3685 double value1 = -localF.
Y;
3686 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3687 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3688 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3689 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3690 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3691 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3692 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3693 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3694 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3698 PFAtPoint(&globalP, &Potential, &globalF);
3702 double value2 = -localF.
Y;
3704 Err = epsratio - (value1 / value2);
3705 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3706 prim, ele, 4, 4, xerr, yerr, zerr, epsratio,
3707 (value1 / value2), Err);
3708 if (fabs(Err) > fabs(MaxError)) {
3710 PrimitiveOfMaxError = prim;
3711 ElementOfMaxError = ele;
3719 xerr = 0.25 * (0.5 * (x1 + x0) + x1 + 0.5 * (x1 + x2) + xo);
3720 yerr = 0.25 * (0.5 * (y1 + y0) + y1 + 0.5 * (y1 + y2) + yo);
3721 zerr = 0.25 * (0.5 * (z1 + z0) + z1 + 0.5 * (z1 + z2) + zo);
3729 PFAtPoint(&globalP, &Potential, &globalF);
3730 Err =
ApplPot[prim] - Potential;
3731 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3732 prim, ele, 4, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3734 if (fabs(Err) > fabs(MaxError)) {
3736 PrimitiveOfMaxError = prim;
3737 ElementOfMaxError = ele;
3745 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3746 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3747 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3748 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3749 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3750 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3751 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3752 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3753 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3757 PFAtPoint(&globalP, &Potential, &globalF);
3761 double value1 = -localF.
Y;
3762 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3763 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3764 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3765 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3766 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3767 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3768 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3769 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3770 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3774 PFAtPoint(&globalP, &Potential, &globalF);
3778 double value2 = -localF.
Y;
3780 Err = epsratio - (value1 / value2);
3781 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3782 prim, ele, 4, 4, xerr, yerr, zerr, epsratio,
3783 (value1 / value2), Err);
3784 if (fabs(Err) > fabs(MaxError)) {
3786 PrimitiveOfMaxError = prim;
3787 ElementOfMaxError = ele;
3795 xerr = 0.25 * (xo + 0.5 * (x1 + x2) + x2 + 0.5 * (x3 + x2));
3796 yerr = 0.25 * (yo + 0.5 * (y1 + y2) + y2 + 0.5 * (y3 + y2));
3797 zerr = 0.25 * (zo + 0.5 * (z1 + z2) + z2 + 0.5 * (z3 + z2));
3805 PFAtPoint(&globalP, &Potential, &globalF);
3806 Err =
ApplPot[prim] - Potential;
3807 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3808 prim, ele, 4, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3810 if (fabs(Err) > fabs(MaxError)) {
3812 PrimitiveOfMaxError = prim;
3813 ElementOfMaxError = ele;
3821 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3822 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3823 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3824 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3825 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3826 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3827 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3828 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3829 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3833 PFAtPoint(&globalP, &Potential, &globalF);
3837 double value1 = -localF.
Y;
3838 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3839 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3840 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3841 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3842 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3843 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3844 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3845 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3846 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3850 PFAtPoint(&globalP, &Potential, &globalF);
3854 double value2 = -localF.
Y;
3856 Err = epsratio - (value1 / value2);
3857 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3858 prim, ele, 4, 4, xerr, yerr, zerr, epsratio,
3859 (value1 / value2), Err);
3860 if (fabs(Err) > fabs(MaxError)) {
3862 PrimitiveOfMaxError = prim;
3863 ElementOfMaxError = ele;
3871 xerr = 0.25 * (0.5 * (x0 + x3) + xo + 0.5 * (x3 + x2) + x3);
3872 yerr = 0.25 * (0.5 * (y0 + y3) + yo + 0.5 * (y3 + y2) + y3);
3873 zerr = 0.25 * (0.5 * (z0 + z3) + zo + 0.5 * (z3 + z2) + z3);
3881 PFAtPoint(&globalP, &Potential, &globalF);
3882 Err =
ApplPot[prim] - Potential;
3883 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3884 prim, ele, 4, 1, xerr, yerr, zerr,
ApplPot[prim], Potential,
3886 if (fabs(Err) > fabs(MaxError)) {
3888 PrimitiveOfMaxError = prim;
3889 ElementOfMaxError = ele;
3897 double xplus = xerr + (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3898 xplus += (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3899 xplus += (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3900 double yplus = yerr + (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3901 yplus += (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3902 yplus += (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3903 double zplus = zerr + (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3904 zplus += (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3905 zplus += (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3909 PFAtPoint(&globalP, &Potential, &globalF);
3913 double value1 = -localF.
Y;
3914 double xminus = xerr - (
EleArr + ele - 1)->G.DC.XUnit.X * normdisp;
3915 xminus -= (
EleArr + ele - 1)->G.DC.YUnit.X * normdisp;
3916 xminus -= (
EleArr + ele - 1)->G.DC.ZUnit.X * normdisp;
3917 double yminus = yerr - (
EleArr + ele - 1)->G.DC.XUnit.Y * normdisp;
3918 yminus -= (
EleArr + ele - 1)->G.DC.YUnit.Y * normdisp;
3919 yminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Y * normdisp;
3920 double zminus = zerr - (
EleArr + ele - 1)->G.DC.XUnit.Z * normdisp;
3921 zminus -= (
EleArr + ele - 1)->G.DC.YUnit.Z * normdisp;
3922 zminus -= (
EleArr + ele - 1)->G.DC.ZUnit.Z * normdisp;
3926 PFAtPoint(&globalP, &Potential, &globalF);
3930 double value2 = -localF.
Y;
3932 Err = epsratio - (value1 / value2);
3933 fprintf(fErr,
"%d\t%d\t%d\t%d\t%lg\t%lg\t%lg\t%lg\t%lg\t%lg\n",
3934 prim, ele, 4, 4, xerr, yerr, zerr, epsratio,
3935 (value1 / value2), Err);
3936 if (fabs(Err) > fabs(MaxError)) {
3938 PrimitiveOfMaxError = prim;
3939 ElementOfMaxError = ele;
3951 "#Error maximum on element %d on primitive %d with x,y,z %lg, "
3952 "%lg, %lg and its magnitude is %lg.\n",
3953 ElementOfMaxError, PrimitiveOfMaxError, xerrMax, yerrMax, zerrMax,