File indexing completed on 2023-05-28 05:10:56 UTC
view on githubraw file Latest commit b4daa243 on 2023-05-28 03:53:22 UTC
b4daa24319 Shre*0001
0002
0003
0004
0005
0006
0007
0008 #include <string.h>
0009 #include <stdio.h>
0010 #include <stdlib.h>
0011 #include <sys/types.h>
0012 #include <sys/stat.h>
0013 #include <errno.h>
0014 #include <math.h>
0015 #include "adDebug.h"
0016
0017
0018 #include <mpi.h>
0019
0020 extern void pushNArray(char *x, unsigned int nbChars, int checkReadOnly) ;
0021 extern void popNArray(char *x, unsigned int nbChars, int checkReadOnly) ;
0022 extern void pushCharacterArray(char *x, int n) ;
0023 extern void popCharacterArray(char *x, int n) ;
0024
0025
0026
0027 typedef struct _DBAD_CallStackElem {
0028 char *funcname ;
0029 int deltadepth ;
0030 int code ;
0031 struct _DBAD_CallStackElem *context ;
0032 } DBAD_CallStackElem ;
0033
0034 static DBAD_CallStackElem dbad_topContext ;
0035 static DBAD_CallStackElem *dbad_callStack ;
0036 static int dbad_calltracedepth = 1 ;
0037
0038 static int dbad_mode, dbad_phase, dbad_nberrors ;
0039 static int dbad_trace = 0 ;
0040 static int dbad_nocommunication = 0 ;
0041
0042
0043
0044 static int dbad_testThisProcess = -1 ;
0045 static FILE *dbad_file ;
0046 static double dbad_errormax, dbad_ddeps = 1.e-6 ;
0047 static double dbad_seed = 0.137 ;
0048 static double dbad_currentSeed = 0.0 ;
0049 static double dbad_condensed_dd, dbad_condensed_tgt, dbad_condensed_adj ;
0050 static double dbad_refsum, dbad_nextrefsum ;
0051
0052
0053 static double dbad_adr8buf[512] ;
0054 static int dbad_adr8ibuf = 0 ;
0055 static int dbad_adi4buf[512] ;
0056 static int dbad_adi4ibuf = 0 ;
0057
0058 void dbad_pushReal8(double x) {
0059 if (dbad_adr8ibuf >= 511) {
0060 dbad_adr8buf[511] = x ;
0061 pushNArray((char *)dbad_adr8buf, 512*8, 1) ;
0062 dbad_adr8ibuf = 0 ;
0063 } else {
0064 dbad_adr8buf[dbad_adr8ibuf] = x ;
0065 ++dbad_adr8ibuf ;
0066 }
0067 }
0068
0069 void dbad_popReal8(double *x) {
0070 if (dbad_adr8ibuf <= 0) {
0071 popNArray((char *)dbad_adr8buf, 512*8, 1) ;
0072 dbad_adr8ibuf = 511 ;
0073 *x = dbad_adr8buf[511] ;
0074 } else {
0075 --dbad_adr8ibuf ;
0076 *x = dbad_adr8buf[dbad_adr8ibuf] ;
0077 }
0078 }
0079
0080 void dbad_pushinteger4(int x) {
0081 if (dbad_adi4ibuf >= 511) {
0082 dbad_adi4buf[511] = x ;
0083 pushNArray((char *)dbad_adi4buf, 512*4, 1) ;
0084 dbad_adi4ibuf = 0 ;
0085 } else {
0086 dbad_adi4buf[dbad_adi4ibuf] = x ;
0087 ++dbad_adi4ibuf ;
0088 }
0089 }
0090
0091 void dbad_popinteger4(int *x) {
0092 if (dbad_adi4ibuf <= 0) {
0093 popNArray((char *)dbad_adi4buf, 512*4, 1) ;
0094 dbad_adi4ibuf = 511 ;
0095 *x = dbad_adi4buf[511] ;
0096 } else {
0097 --dbad_adi4ibuf ;
0098 *x = dbad_adi4buf[dbad_adi4ibuf] ;
0099 }
0100 }
0101
0102
0103 void dbad_pushCallFrame(char* unitname, int deltadepth, int forcetraced) {
0104 DBAD_CallStackElem *newCallLevel = (DBAD_CallStackElem*)malloc(sizeof(DBAD_CallStackElem)) ;
0105 newCallLevel->funcname = (char*)malloc(100) ;
0106 sprintf(newCallLevel->funcname, "%s", unitname) ;
0107 newCallLevel->deltadepth = (dbad_calltracedepth>0?1-deltadepth:0) ;
0108 dbad_calltracedepth -= newCallLevel->deltadepth ;
0109
0110 if (forcetraced>0 && forcetraced>dbad_calltracedepth) {
0111 newCallLevel->deltadepth -= (forcetraced-dbad_calltracedepth) ;
0112 dbad_calltracedepth = forcetraced ;
0113 }
0114 newCallLevel->code = 0 ;
0115 newCallLevel->context = dbad_callStack ;
0116 dbad_callStack = newCallLevel ;
0117 }
0118
0119 void dbad_popCallFrame() {
0120 dbad_calltracedepth += dbad_callStack->deltadepth ;
0121 DBAD_CallStackElem *newCallLevel = dbad_callStack->context ;
0122 free(dbad_callStack->funcname) ;
0123 free(dbad_callStack) ;
0124 dbad_callStack = newCallLevel ;
0125 }
0126
0127 int dbad_debughere(int forcetraced) {
0128 return (dbad_calltracedepth>0 || forcetraced) ;
0129 }
0130
0131 int dbad_debugabove() {
0132 return (dbad_calltracedepth+dbad_callStack->deltadepth)>0 ;
0133 }
0134
0135 int dbad_callstackdepth() {
0136 DBAD_CallStackElem *incallstack = dbad_callStack ;
0137 int depth = 0 ;
0138 while (incallstack) {++depth ; incallstack=incallstack->context ;}
0139 return depth-1 ;
0140 }
0141
0142 void dbad_resetCondensors() {
0143 dbad_currentSeed = 0.0 ;
0144 dbad_condensed_dd = 0.0 ;
0145 dbad_condensed_tgt = 0.0 ;
0146 dbad_condensed_adj = 0.0 ;
0147 }
0148
0149 double dbad_nextRandom() {
0150 dbad_currentSeed += dbad_seed ;
0151 if (dbad_currentSeed>=1.0) dbad_currentSeed-=1.0 ;
0152
0153 return dbad_currentSeed+1.0 ;
0154 }
0155
0156
0157
0158 void dbad_scaleIndepDirection4(float *indepd, float indep) {
0159 int exponent ;
0160 frexpf(indep, &exponent);
0161 *indepd = ldexpf(*indepd, exponent) ;
0162 }
0163
0164
0165
0166 void dbad_scaleIndepDirection8(double *indepd, double indep) {
0167 int exponent ;
0168 frexp(indep, &exponent);
0169 *indepd = ldexp(*indepd, exponent) ;
0170 }
0171
0172 void dbad_putOneVarName(char *varname) {
0173 char buf[8]=" " ;
0174 int len = strlen(varname) ;
0175 if (len>8) len = 8 ;
0176 memcpy(buf, varname, len) ;
0177 fwrite(buf, sizeof(char), 8, dbad_file) ;
0178 }
0179
0180 void dbad_ddcheckvarname(char* varname) {
0181 char localBuf[9]=" " ;
0182 char remoteBuf[9]=" " ;
0183 int len = strlen(varname) ;
0184 if (len>8) len = 8 ;
0185 memcpy(localBuf, varname, len) ;
0186 fread(remoteBuf, sizeof(char), 8, dbad_file) ;
0187 if (strcmp(localBuf, remoteBuf)!=0) {
0188 printf("Control mismatch, expecting a variable named \"%s\", got \"%s\"\n",localBuf,remoteBuf) ;
0189 exit(0) ;
0190 }
0191 }
0192
0193 void dbad_putOne8(double var) {
0194 fwrite(&var, sizeof(double), 1, dbad_file) ;
0195 }
0196
0197 void dbad_putOne4(float var) {
0198 float fl2[2] ;
0199 fl2[0] = var ;
0200 fwrite(fl2, sizeof(float), 2, dbad_file) ;
0201 }
0202
0203 void dbad_getOne8(double *var) {
0204 fread(var, sizeof(double), 1, dbad_file) ;
0205 }
0206
0207 void dbad_getOne4(float *var) {
0208 float fl2[2] ;
0209 fread(fl2, sizeof(float), 2, dbad_file) ;
0210 *var = fl2[0] ;
0211 }
0212
0213
0214
0215 int dbad_discrepancy8(double vareps, double var, double vard, double *dd, float *diff) {
0216 int hasDifference = 0 ;
0217 int almostZero = -15;
0218 int errMaxBits = 8;
0219 int trustableMantissa = 53;
0220 *dd = 0.0 ;
0221
0222 int expoTG ;
0223 frexp(vard, &expoTG) ;
0224 double dv = vareps-var ;
0225
0226 if (dv==0.0) {
0227 *dd = 0.0 ;
0228 if (vard==0.0 || expoTG<almostZero) {
0229 hasDifference = 0 ;
0230 *diff = 0.0 ;
0231 } else {
0232 hasDifference = 1;
0233 *diff = 100.0;
0234
0235
0236
0237
0238 }
0239 } else {
0240 *dd = dv/dbad_ddeps ;
0241 int expoDD ;
0242 frexpf(*dd, &expoDD) ;
0243 double hv = dv - dbad_ddeps*vard ;
0244
0245 if (hv==0.0 || expoTG<almostZero || expoDD<almostZero) {
0246 hasDifference = 0 ;
0247 *diff = 0.0 ;
0248 } else {
0249 int expoDV, expoV1, expoV2, expoV, expoHV ;
0250 frexp(dv, &expoDV) ;
0251 frexp(var, &expoV1) ;
0252 frexp(vareps, &expoV2) ;
0253 expoV = (var==0.0?expoV2:(vareps==0?expoV1:(expoV1>expoV2?expoV1:expoV2))) ;
0254 frexp(hv, &expoHV) ;
0255 int discrepancySmallness = expoDV-expoHV ;
0256 int discrepancyExactness = trustableMantissa-expoV+expoDV ;
0257 hasDifference = (discrepancySmallness<errMaxBits && discrepancySmallness<discrepancyExactness) ;
0258
0259 double absvard = (vard>=0.0?vard:-vard) ;
0260 double absdd = (*dd>=0.0?*dd:-*dd) ;
0261 double maxabs = (absvard>absdd?absvard:absdd) ;
0262 double absvardmdd = vard-*dd ;
0263 if (absvardmdd<0.0) absvardmdd=-absvardmdd ;
0264 *diff = (float)((absvardmdd/maxabs)*100.0) ;
0265
0266
0267
0268
0269
0270
0271
0272 }
0273 }
0274 return hasDifference ;
0275 }
0276
0277 int dbad_discrepancy4(float vareps, float var, float vard, float *dd, float *diff) {
0278 int hasDifference = 0 ;
0279 int almostZero = -15;
0280 int errMaxBits = 6;
0281 int trustableMantissa = 23;
0282 *dd = 0.0 ;
0283
0284 int expoTG ;
0285 frexpf(vard, &expoTG) ;
0286 float dv = vareps-var ;
0287 if (dv==0.0) {
0288 *dd = 0.0 ;
0289 if (vard==0.0 || expoTG<almostZero) {
0290 hasDifference = 0 ;
0291 *diff = 0.0 ;
0292 } else {
0293 hasDifference = 1;
0294 *diff = 100.0;
0295
0296
0297
0298
0299 }
0300 } else {
0301 *dd = dv/dbad_ddeps ;
0302 int expoDD ;
0303 frexpf(*dd, &expoDD) ;
0304 float hv = dv - dbad_ddeps*vard ;
0305 if (hv==0.0 || expoTG<almostZero || expoDD<almostZero) {
0306 hasDifference = 0 ;
0307 *diff = 0.0 ;
0308 } else {
0309 int expoDV, expoV1, expoV2, expoV, expoHV ;
0310 frexpf(dv, &expoDV) ;
0311 frexpf(var, &expoV1) ;
0312 frexpf(vareps, &expoV2) ;
0313 expoV = (var==0.0?expoV2:(vareps==0?expoV1:(expoV1>expoV2?expoV1:expoV2))) ;
0314 frexpf(hv, &expoHV) ;
0315 int discrepancySmallness = expoDV-expoHV ;
0316 int discrepancyExactness = trustableMantissa-expoV+expoDV ;
0317 hasDifference = (discrepancySmallness<errMaxBits && discrepancySmallness<discrepancyExactness) ;
0318
0319 float absvard = (vard>=0.0?vard:-vard) ;
0320 float absdd = (*dd>=0.0?*dd:-*dd) ;
0321 float maxabs = (absvard>absdd?absvard:absdd) ;
0322 float absvardmdd = vard-*dd ;
0323 if (absvardmdd<0.0) absvardmdd=-absvardmdd ;
0324 *diff = (absvardmdd/maxabs)*100.0 ;
0325
0326
0327
0328
0329
0330
0331
0332 }
0333 }
0334 return hasDifference ;
0335 }
0336
0337 void dbad_display_location(char *placename) {
0338 if (dbad_testThisProcess!=-2) {
0339 int i ;
0340 char* enclosproc = dbad_callStack->funcname ;
0341 int callStackDepth = dbad_callstackdepth() ;
0342 char indentWhite[20] = " " ;
0343 if (callStackDepth<10) indentWhite[2*callStackDepth]='\0';
0344 if (dbad_testThisProcess==-1) {
0345 printf("%s[%2i]AT:%s OF %s\n", indentWhite, callStackDepth, placename, enclosproc) ;
0346 } else {
0347 printf("[process %i] %s[%2i]AT:%s OF %s\n", dbad_testThisProcess, indentWhite, callStackDepth, placename, enclosproc) ;
0348 }
0349 }
0350 }
0351
0352 void dbad_adDebugTgt_testComplex16(char* varname, cdcmplx var, cdcmplx *vard, int conclude) {
0353 if (dbad_testThisProcess!=-2) {
0354 if (dbad_phase==1) {
0355 dbad_putOneVarName(varname) ;
0356 dbad_putOne8(var.dr) ;
0357 dbad_putOne8(var.di) ;
0358 } else if (dbad_phase==2) {
0359 cdcmplx ddvar, dd ;
0360 float diffR, diffI ;
0361 int hasDifferenceR, hasDifferenceI ;
0362 dbad_ddcheckvarname(varname) ;
0363 dbad_getOne8(&(ddvar.dr)) ;
0364 dbad_getOne8(&(ddvar.di)) ;
0365 hasDifferenceR = dbad_discrepancy8(ddvar.dr, var.dr, vard->dr, &(dd.dr), &diffR) ;
0366 hasDifferenceI = dbad_discrepancy8(ddvar.di, var.di, vard->di, &(dd.di), &diffI) ;
0367 if (dbad_trace) {
0368 printf("%s [v-eps:(%24.16e,%24.16e) v-loc:(%24.16e,%24.16e)] (%24.16e,%24.16e)(dd (%5.1f,%5.1f)%% DIFF? WITH ad)(%24.16e,%24.16e)\n",
0369 varname,ddvar.dr,ddvar.di,var.dr,var.di,dd.dr,dd.di,diffR,diffI,vard->dr,vard->di) ;
0370 } else if (hasDifferenceR||hasDifferenceI) {
0371 printf("%s (%24.16e,%24.16e)(dd (%5.1f,%5.1f)%% DIFF WITH ad)(%24.16e,%24.16e)\n",
0372 varname,dd,dd,diffR,diffI,vard->dr,vard->di) ;
0373 }
0374 if (conclude==-1) {
0375 if (hasDifferenceR) {
0376 vard->dr = dd.dr ;
0377 printf("%s (.real) RESET:\n", varname) ;
0378 }
0379 if (hasDifferenceI) {
0380 vard->di = dd.di ;
0381 printf("%s (.imag) RESET:\n", varname) ;
0382 }
0383 }
0384 if (conclude==1) {
0385 cdcmplx varb ;
0386 varb.dr = dbad_nextRandom();
0387 varb.di = dbad_nextRandom();
0388 dbad_condensed_dd += dd.dr*varb.dr + dd.di*varb.di;
0389 dbad_condensed_tgt += vard->dr*varb.dr + vard->di*varb.di;
0390 }
0391 }
0392 }
0393 }
0394
0395 void dbad_adDebugTgt_testReal8(char* varname, double var, double *vard, int conclude) {
0396 if (dbad_testThisProcess!=-2) {
0397 if (dbad_phase==1) {
0398 dbad_putOneVarName(varname) ;
0399 dbad_putOne8(var) ;
0400 } else if (dbad_phase==2) {
0401 double ddvar, dd ;
0402 float diff ;
0403 dbad_ddcheckvarname(varname) ;
0404 dbad_getOne8(&ddvar) ;
0405 int hasDifference = dbad_discrepancy8(ddvar, var, *vard, &dd, &diff) ;
0406 if (dbad_trace) {
0407 printf("%s [v-eps:%24.16e v-loc:%24.16e] %24.16e(dd %5.1f%% DIFF? WITH ad)%24.16e\n",
0408 varname,ddvar,var,dd,diff,*vard) ;
0409 } else if (hasDifference) {
0410 printf("%s %24.16e(dd %5.1f%% DIFF WITH ad)%24.16e\n",
0411 varname,dd,diff,*vard) ;
0412 }
0413 if (conclude==-1 && hasDifference) {
0414 *vard = dd ;
0415 printf("%s RESET:\n", varname) ;
0416 }
0417 if (conclude==1) {
0418 double varb = dbad_nextRandom() ;
0419 dbad_condensed_dd += dd*varb;
0420 dbad_condensed_tgt += *vard*varb;
0421 }
0422 }
0423 }
0424 }
0425
0426 void dbad_adDebugTgt_testReal4(char* varname, float var, float *vard, int conclude) {
0427 if (dbad_testThisProcess!=-2) {
0428 if (dbad_phase==1) {
0429 dbad_putOneVarName(varname) ;
0430 dbad_putOne4(var) ;
0431 } else if (dbad_phase==2) {
0432 float ddvar, dd ;
0433 float diff ;
0434 dbad_ddcheckvarname(varname) ;
0435 dbad_getOne4(&ddvar) ;
0436 int hasDifference = dbad_discrepancy4(ddvar, var, *vard, &dd, &diff) ;
0437 if (dbad_trace) {
0438 printf("%s [v-eps:%18.10e v-loc:%18.10e] %18.10e(dd %5.1f%% DIFF? WITH ad)%18.10e\n",
0439 varname,ddvar,var,dd,diff,*vard) ;
0440 } else if (hasDifference) {
0441 printf("%s %18.10e(dd %5.1f%% DIFF WITH ad)%18.10e\n",
0442 varname,dd,diff,*vard) ;
0443 }
0444 if (conclude==-1 && hasDifference) {
0445 *vard = dd ;
0446 printf("%s RESET:\n", varname) ;
0447 }
0448 if (conclude==1) {
0449 double varb = dbad_nextRandom() ;
0450 dbad_condensed_dd += ((double)dd)*varb;
0451 dbad_condensed_tgt += ((double)*vard)*varb;
0452 }
0453 }
0454 }
0455 }
0456
0457 void dbad_adDebugTgt_testComplex16Array(char* varname, cdcmplx* var, cdcmplx* vard, int length, int conclude) {
0458 if (!var || !vard) return ;
0459 if (dbad_testThisProcess!=-2) {
0460 int i ;
0461 if (dbad_phase==1) {
0462 dbad_putOneVarName(varname) ;
0463 for (i=0 ; i<length ; ++i) {
0464 dbad_putOne8(var[i].dr) ;
0465 dbad_putOne8(var[i].di) ;
0466 }
0467 } else if (dbad_phase==2) {
0468 cdcmplx ddvar, dd, vardbuf[10], ddbuf[10], varepsbuf[10], varlocbuf[10] ;
0469 float diffR, diffI ;
0470 int hasDifferenceR, hasDifferenceI, printedheader = 0, indexbuf[10], ibuf = 0 ;
0471 dbad_ddcheckvarname(varname) ;
0472 for (i=0 ; i<length ; ++i) {
0473 dbad_getOne8(&ddvar.dr) ;
0474 dbad_getOne8(&ddvar.di) ;
0475 hasDifferenceR = dbad_discrepancy8(ddvar.dr, var[i].dr, vard[i].dr, &(dd.dr), &diffR) ;
0476 hasDifferenceI = dbad_discrepancy8(ddvar.di, var[i].di, vard[i].di, &(dd.di), &diffI) ;
0477 if (hasDifferenceR || hasDifferenceI || dbad_trace) {
0478 if (dbad_trace) {
0479 varepsbuf[ibuf] = ddvar ;
0480 varlocbuf[ibuf] = var[i] ;
0481 }
0482 vardbuf[ibuf] = vard[i] ;
0483 ddbuf[ibuf] = dd ;
0484 indexbuf[ibuf] = i ;
0485 ++ibuf ;
0486 }
0487 if (conclude==-1) {
0488 if (hasDifferenceR) vard[i].dr = dd.dr ;
0489 if (hasDifferenceI) vard[i].di = dd.di ;
0490 }
0491 if (ibuf>=5 || (i==length-1 && ibuf>0)) {
0492 int j ;
0493 if (!printedheader) {
0494 if (conclude==-1)
0495 printf("%s RESET:\n", varname) ;
0496 else
0497 printf("%s DIFFS:\n", varname) ;
0498 printedheader = 1 ;
0499 }
0500 printf(" ") ;
0501 for (j=0 ; j<ibuf ; ++j)
0502 printf(" %4i->(%11.4e,%11.4e)", indexbuf[j], vardbuf[j].dr, vardbuf[j].di) ;
0503 printf("\n ") ;
0504 if (dbad_trace) {
0505 for (j=0 ; j<ibuf ; ++j)
0506 printf(" (eps)(%11.4e,%11.4e)", varepsbuf[j].dr, varepsbuf[j].di) ;
0507 printf("\n ") ;
0508 for (j=0 ; j<ibuf ; ++j)
0509 printf(" (loc)(%11.4e,%11.4e)", varlocbuf[j].dr, varlocbuf[j].di) ;
0510 printf("\n ") ;
0511 }
0512 for (j=0 ; j<ibuf ; ++j)
0513 printf(" (dd:)(%11.4e,%11.4e)", ddbuf[j].dr, ddbuf[j].di) ;
0514 printf("\n") ;
0515 ibuf = 0 ;
0516 }
0517 if (conclude==1) {
0518 cdcmplx varb ;
0519 varb.dr = dbad_nextRandom();
0520 varb.di = dbad_nextRandom();
0521 dbad_condensed_dd += dd.dr*varb.dr + dd.di*varb.di ;
0522 dbad_condensed_tgt += vard[i].dr*varb.dr + vard[i].di*varb.di ;
0523 }
0524 }
0525 }
0526 }
0527 }
0528
0529 void dbad_adDebugTgt_testReal8Array(char* varname, double* var, double* vard, int length, int conclude) {
0530 if (!var || !vard) return ;
0531 if (dbad_testThisProcess!=-2) {
0532 int i ;
0533 if (dbad_phase==1) {
0534 dbad_putOneVarName(varname) ;
0535 for (i=0 ; i<length ; ++i) {
0536 dbad_putOne8(var[i]) ;
0537 }
0538 } else if (dbad_phase==2) {
0539 double ddvar, dd, vardbuf[10], ddbuf[10], varepsbuf[10], varlocbuf[10] ;
0540 float diff ;
0541 int hasDifference, printedheader = 0, indexbuf[10], ibuf = 0 ;
0542 dbad_ddcheckvarname(varname) ;
0543 for (i=0 ; i<length ; ++i) {
0544 dbad_getOne8(&ddvar) ;
0545 hasDifference = dbad_discrepancy8(ddvar, var[i], vard[i], &dd, &diff) ;
0546 if (dbad_trace) {
0547 varepsbuf[ibuf] = ddvar ;
0548 varlocbuf[ibuf] = var[i] ;
0549 }
0550 if (hasDifference || dbad_trace) {
0551 vardbuf[ibuf] = vard[i] ;
0552 ddbuf[ibuf] = dd ;
0553 indexbuf[ibuf] = i ;
0554 ++ibuf ;
0555 }
0556 if (conclude==-1 && hasDifference) {
0557 vard[i] = dd ;
0558 }
0559 if (ibuf>=10 || (i==length-1 && ibuf>0)) {
0560 int j ;
0561 if (!printedheader) {
0562 if (conclude==-1)
0563 printf("%s RESET:\n", varname) ;
0564 else
0565 printf("%s DIFFS:\n", varname) ;
0566 printedheader = 1 ;
0567 }
0568 printf(" ") ;
0569 for (j=0 ; j<ibuf ; ++j)
0570 printf(" %4i->%11.4e", indexbuf[j], vardbuf[j]) ;
0571 printf("\n ") ;
0572 if (dbad_trace) {
0573 for (j=0 ; j<ibuf ; ++j)
0574 printf(" (eps)%11.4e", varepsbuf[j]) ;
0575 printf("\n ") ;
0576 for (j=0 ; j<ibuf ; ++j)
0577 printf(" (loc)%11.4e", varlocbuf[j]) ;
0578 printf("\n ") ;
0579 }
0580 for (j=0 ; j<ibuf ; ++j)
0581 printf(" (dd:)%11.4e", ddbuf[j]) ;
0582 printf("\n") ;
0583 ibuf = 0 ;
0584 }
0585 if (conclude==1) {
0586 double varb = dbad_nextRandom() ;
0587 dbad_condensed_dd += dd*varb;
0588 dbad_condensed_tgt += vard[i]*varb;
0589 }
0590 }
0591 }
0592 }
0593 }
0594
0595 void dbad_adDebugTgt_testReal4Array(char* varname, float* var, float* vard, int length, int conclude) {
0596 if (!var || !vard) return ;
0597 if (dbad_testThisProcess!=-2) {
0598 int i ;
0599 if (dbad_phase==1) {
0600 dbad_putOneVarName(varname) ;
0601 for (i=0 ; i<length ; ++i) {
0602 dbad_putOne4(var[i]) ;
0603 }
0604 } else if (dbad_phase==2) {
0605 float ddvar, dd, vardbuf[10], ddbuf[10], varepsbuf[10], varlocbuf[10] ;
0606 float diff ;
0607 int hasDifference, printedheader = 0, indexbuf[10], ibuf = 0 ;
0608 dbad_ddcheckvarname(varname) ;
0609 for (i=0 ; i<length ; ++i) {
0610 dbad_getOne4(&ddvar) ;
0611 hasDifference = dbad_discrepancy4(ddvar, var[i], vard[i], &dd, &diff) ;
0612 if (dbad_trace) {
0613 varepsbuf[ibuf] = ddvar ;
0614 varlocbuf[ibuf] = var[i] ;
0615 }
0616 if (hasDifference || dbad_trace) {
0617 vardbuf[ibuf] = vard[i] ;
0618 ddbuf[ibuf] = dd ;
0619 indexbuf[ibuf] = i ;
0620 ++ibuf ;
0621 }
0622 if (conclude==-1 && hasDifference) {
0623 vard[i] = dd ;
0624 }
0625 if (ibuf>=10 || (i==length-1 && ibuf>0)) {
0626 int j ;
0627 if (!printedheader) {
0628 if (conclude==-1)
0629 printf("%s RESET:\n", varname) ;
0630 else
0631 printf("%s DIFFS:\n", varname) ;
0632 printedheader = 1 ;
0633 }
0634 printf(" ") ;
0635 for (j=0 ; j<ibuf ; ++j)
0636 printf(" %4i->%11.4e", indexbuf[j], vardbuf[j]) ;
0637 printf("\n ") ;
0638 if (dbad_trace) {
0639 for (j=0 ; j<ibuf ; ++j)
0640 printf(" (eps)%11.4e", varepsbuf[j]) ;
0641 printf("\n ") ;
0642 for (j=0 ; j<ibuf ; ++j)
0643 printf(" (loc)%11.4e", varlocbuf[j]) ;
0644 printf("\n ") ;
0645 }
0646 for (j=0 ; j<ibuf ; ++j)
0647 printf(" (dd:)%11.4e", ddbuf[j]) ;
0648 printf("\n") ;
0649 ibuf = 0 ;
0650 }
0651 if (conclude==1) {
0652 double varb = dbad_nextRandom() ;
0653 dbad_condensed_dd += ((double)dd)*varb;
0654 dbad_condensed_tgt += ((double)vard[i])*varb;
0655 }
0656 }
0657 }
0658 }
0659 }
0660
0661
0662
0663 void adDebugTgt_init(double epsilon, double seed, int tested_process) {
0664
0665 dbad_mode = 1 ;
0666 dbad_ddeps = epsilon ;
0667 dbad_seed = seed ;
0668 dbad_topContext.funcname = "TESTED CODE\0" ;
0669 dbad_topContext.deltadepth = 0 ;
0670 dbad_topContext.code = 0 ;
0671 dbad_calltracedepth = 1 ;
0672 dbad_callStack = &dbad_topContext ;
0673 char* phase = getenv("DBAD_PHASE") ;
0674 if (phase==NULL) {
0675 printf("Please set DBAD_PHASE environment variable to 1 (perturbed), 2 (tangent), or 0 (no debug)\n") ;
0676 exit(0) ;
0677 } else if (strcmp(phase,"0")==0) {
0678 dbad_phase = 0 ;
0679 } else if (strcmp(phase,"1")==0) {
0680 dbad_phase = 1 ;
0681 } else if (strcmp(phase,"2")==0) {
0682 dbad_phase = 2 ;
0683 } else if (strcmp(phase,"-1")==0) {
0684 dbad_phase = 1 ;
0685 dbad_trace = 1 ;
0686 } else if (strcmp(phase,"-2")==0) {
0687 dbad_phase = 2 ;
0688 dbad_trace = 1 ;
0689 } else {
0690 printf("DBAD_PHASE environment variable must be set to 1 (perturbed), 2 (tangent), or 0 (no debug)\n") ;
0691 exit(0) ;
0692 }
0693 char* fifoFileName = (char*)malloc(20*sizeof(char)) ;
0694 int this_process_world_rank;
0695 MPI_Comm_rank(MPI_COMM_WORLD, &this_process_world_rank);
0696 if (tested_process==this_process_world_rank || tested_process==-1) {
0697 dbad_testThisProcess = this_process_world_rank ;
0698 sprintf(fifoFileName, "/tmp/DBAD_fifo%i\0", this_process_world_rank) ;
0699 } else {
0700 dbad_testThisProcess = -2 ;
0701 }
0702 if (dbad_testThisProcess!=-2) {
0703 if (dbad_trace) {
0704 printf("INTERNAL TESTS, epsilon=%7.1e\n", epsilon) ;
0705 printf("===========================================================\n") ;
0706 }
0707 if (dbad_phase==1) {
0708 if (dbad_testThisProcess==-1) {
0709 printf("Starting TGT test, phase one, epsilon=%7.1e [seed=%7.1e]\n",
0710 epsilon, seed) ;
0711 } else {
0712 printf("[process %i] Starting TGT test, phase one, epsilon=%7.1e [seed=%7.1e]\n",
0713 dbad_testThisProcess, epsilon, seed) ;
0714 }
0715 printf("===========================================================\n") ;
0716 mkfifo(fifoFileName, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH | S_IRWXU | S_IRWXO) ;
0717 dbad_file = fopen(fifoFileName, "a") ;
0718 if (dbad_file==NULL) {
0719 char errbuf[20] ;
0720 strerror_r(errno, errbuf, 20) ;
0721 printf("FIFO ERROR %i: %s OR %s\n",errno,strerror(errno),errbuf) ;
0722 exit(0) ;
0723 }
0724 } else if (dbad_phase==2) {
0725 if (dbad_testThisProcess==-1) {
0726 printf("Starting TGT test, phase two, epsilon=%7.1e [seed=%7.1e]\n",
0727 epsilon, seed) ;
0728 } else {
0729 printf("[process %i] Starting TGT test, phase two, epsilon=%7.1e [seed=%7.1e]\n",
0730 dbad_testThisProcess, epsilon, seed) ;
0731 }
0732 printf("===========================================================\n") ;
0733 dbad_file = fopen(fifoFileName, "r") ;
0734 }
0735 dbad_resetCondensors() ;
0736 }
0737 }
0738
0739 void adDebugTgt_call(char* unitname, int deltadepth, int forcetraced) {
0740 if (dbad_trace) {
0741 printf("call %s deltadepth:%i forcetraced:%i\n", unitname, deltadepth, forcetraced) ;
0742 }
0743 if (dbad_phase!=0) {
0744 dbad_pushCallFrame(unitname, deltadepth, forcetraced) ;
0745 }
0746 }
0747
0748 void adDebugTgt_exit() {
0749 if (dbad_trace) {
0750 printf("exit\n") ;
0751 }
0752 if (dbad_phase!=0) {
0753 dbad_popCallFrame() ;
0754 }
0755 dbad_resetCondensors() ;
0756 }
0757
0758 int adDebugTgt_here(char* placename, int forcetraced) {
0759 if (dbad_testThisProcess!=-2) {
0760 if (dbad_trace) {
0761 printf("here?? %s forcetraced:%i\n", placename, forcetraced) ;
0762 printf(" will return %i\n", (dbad_phase==0?0:dbad_debughere(forcetraced))) ;
0763 }
0764 if (dbad_phase==0) return 0 ;
0765 return dbad_debughere(forcetraced) ;
0766 } else {
0767 return 0 ;
0768 }
0769 }
0770
0771 void adDebugTgt_initComplex16(char* varname, cdcmplx *indep, cdcmplx *indepd) {
0772 indepd->dr = dbad_nextRandom() ;
0773 indepd->di = dbad_nextRandom() ;
0774
0775 if (dbad_phase==1) {
0776 indep->dr = (indep->dr)+dbad_ddeps*(indepd->dr) ;
0777 indep->di = (indep->di)+dbad_ddeps*(indepd->di) ;
0778 }
0779 if (dbad_trace)
0780 printf("initComplex16 of %s: (%24.16e,%24.16e) //(%24.16e,%24.16e)\n", varname, indep->dr, indep->di, indepd->dr, indepd->di) ;
0781 }
0782
0783 void adDebugTgt_initReal8(char* varname, double *indep, double *indepd) {
0784 *indepd = dbad_nextRandom() ;
0785
0786 if (dbad_phase==1)
0787 *indep = (*indep)+dbad_ddeps*(*indepd) ;
0788 if (dbad_trace)
0789 printf("initReal8 of %s: %24.16e //%24.16e\n", varname, *indep, *indepd) ;
0790 }
0791
0792 void adDebugTgt_initReal4(char* varname, float *indep, float *indepd) {
0793 *indepd = (float)dbad_nextRandom() ;
0794
0795 if (dbad_phase==1)
0796 *indep = (*indep)+dbad_ddeps*(*indepd) ;
0797 if (dbad_trace)
0798 printf("initReal4 of %s: %24.16e //%24.16e\n", varname, (double)*indep, (double)*indepd) ;
0799 }
0800
0801 void adDebugTgt_initComplex16Array(char* varname, cdcmplx *indep, cdcmplx *indepd, int length) {
0802 if (!indep || !indepd) return ;
0803 int i ;
0804 for (i=0 ; i<length ; ++i) {
0805 indepd[i].dr = dbad_nextRandom() ;
0806 indepd[i].di = dbad_nextRandom() ;
0807
0808
0809
0810 }
0811 if (dbad_phase==1) {
0812 for (i=0 ; i<length ; ++i) {
0813 indep[i].dr += dbad_ddeps*indepd[i].dr ;
0814 indep[i].di += dbad_ddeps*indepd[i].di ;
0815 }
0816 }
0817 if (dbad_trace) {
0818 printf("initComplex16Array of %s, length=%i:\n", varname, length) ;
0819 for (i=0 ; i<length ; ++i)
0820 printf(" %i:(%24.16e,%24.16e) //(%24.16e,%24.16e)",i,indep[i].dr,indep[i].di,indepd[i].dr,indepd[i].di) ;
0821 printf("\n") ;
0822 }
0823 }
0824
0825 void adDebugTgt_initReal8Array(char* varname, double *indep, double *indepd, int length) {
0826 if (!indep || !indepd) return ;
0827 int i ;
0828 for (i=0 ; i<length ; ++i) {
0829 indepd[i] = dbad_nextRandom() ;
0830
0831
0832
0833 }
0834 if (dbad_phase==1) {
0835 for (i=0 ; i<length ; ++i) {
0836 indep[i] = indep[i]+dbad_ddeps*indepd[i] ;
0837 }
0838 }
0839 if (dbad_trace) {
0840 printf("initReal8Array of %s, length=%i:\n", varname, length) ;
0841 for (i=0 ; i<length ; ++i)
0842 printf(" %i:%24.16e //%24.16e",i,indep[i],indepd[i]) ;
0843 printf("\n") ;
0844 }
0845 }
0846
0847 void adDebugTgt_initReal4Array(char* varname, float *indep, float *indepd, int length) {
0848 if (!indep || !indepd) return ;
0849 int i ;
0850 for (i=0 ; i<length ; ++i) {
0851 indepd[i] = (float)dbad_nextRandom() ;
0852
0853 }
0854 if (dbad_phase==1) {
0855 for (i=0 ; i<length ; ++i) {
0856 indep[i] = indep[i]+dbad_ddeps*indepd[i] ;
0857 }
0858 }
0859 if (dbad_trace) {
0860 printf("initReal4Array of %s, length=%i:\n", varname, length) ;
0861 for (i=0 ; i<length ; ++i)
0862 printf(" %i:%24.16e //%24.16e",i,(double)indep[i],(double)indepd[i]) ;
0863 printf("\n") ;
0864 }
0865 }
0866
0867 void adDebugTgt_passiveComplex16(char *varname, cdcmplx var) {
0868 if (dbad_testThisProcess!=-2) {
0869 if (dbad_phase==1) {
0870 dbad_putOneVarName(varname) ;
0871 dbad_putOne8(var.dr) ;
0872 dbad_putOne8(var.di) ;
0873 } else if (dbad_phase==2) {
0874 cdcmplx ddvar ;
0875 dbad_ddcheckvarname(varname) ;
0876 dbad_getOne8(&(ddvar.dr)) ;
0877 dbad_getOne8(&(ddvar.di)) ;
0878 if (dbad_trace) {
0879 printf("passiveComplex16 %s v-eps:(%24.16e,%24.16e) v-loc:(%24.16e,%24.16e) are %s\n",
0880 varname,ddvar.dr,ddvar.di,var.dr,var.di,(ddvar.dr==var.dr && ddvar.di==var.di?"equal":"different")) ;
0881 } else if (ddvar.dr!=var.dr || ddvar.di!=var.di) {
0882 printf("passiveComplex16 %s appears to be varied (v-eps:(%24.16e,%24.16e) v-loc:(%24.16e,%24.16e)). Hope it is really not useful!\n",
0883 varname,ddvar.dr,ddvar.di,var.dr,var.di) ;
0884 }
0885 }
0886 }
0887 }
0888
0889 void adDebugTgt_passiveReal8(char *varname, double var) {
0890 if (dbad_testThisProcess!=-2) {
0891 if (dbad_phase==1) {
0892 dbad_putOneVarName(varname) ;
0893 dbad_putOne8(var) ;
0894 } else if (dbad_phase==2) {
0895 double ddvar ;
0896 dbad_ddcheckvarname(varname) ;
0897 dbad_getOne8(&ddvar) ;
0898 if (dbad_trace) {
0899 printf("passiveReal8 %s v-eps:%24.16e v-loc:%24.16e are %s\n",
0900 varname,ddvar,var,(ddvar==var?"equal":"different")) ;
0901 } else if (ddvar!=var) {
0902 printf("passiveReal8 %s appears to be varied (v-eps:%24.16e v-loc:%24.16e). Hope it is really not useful!\n",
0903 varname,ddvar,var) ;
0904 }
0905 }
0906 }
0907 }
0908
0909 void adDebugTgt_passiveReal4(char *varname, float var) {
0910 if (dbad_testThisProcess!=-2) {
0911 if (dbad_phase==1) {
0912 dbad_putOneVarName(varname) ;
0913 dbad_putOne4(var) ;
0914 } else if (dbad_phase==2) {
0915 float ddvar ;
0916 dbad_ddcheckvarname(varname) ;
0917 dbad_getOne4(&ddvar) ;
0918 if (dbad_trace) {
0919 printf("passiveReal4 %s v-eps:%18.10 v-loc:%18.10 are %s\n",
0920 varname,ddvar,var,(ddvar==var?"equal":"different")) ;
0921 } else if (ddvar!=var) {
0922 printf("passiveReal4 %s appears to be varied (v-eps:%18.10 v-loc:%18.10). Hope it is really not useful!\n",
0923 varname,ddvar,var) ;
0924 }
0925 }
0926 }
0927 }
0928
0929 void adDebugTgt_passiveComplex16Array(char *varname, cdcmplx *var, int length) {
0930 if (!var) return;
0931 if (dbad_testThisProcess!=-2) {
0932 int i ;
0933 double varsum = 0.0 ;
0934 for (i=0 ; i<length ; ++i) {
0935 varsum += var[i].dr + var[i].di ;
0936 }
0937 adDebugTgt_passiveReal8(varname, varsum) ;
0938 }
0939 }
0940
0941 void adDebugTgt_passiveReal8Array(char *varname, double *var, int length) {
0942 if (!var) return;
0943 if (dbad_testThisProcess!=-2) {
0944 int i ;
0945 double varsum = 0.0 ;
0946 for (i=0 ; i<length ; ++i) {
0947 varsum += var[i] ;
0948 }
0949 adDebugTgt_passiveReal8(varname, varsum) ;
0950 }
0951 }
0952
0953 void adDebugTgt_passiveReal4Array(char *varname, float *var, int length) {
0954 if (!var) return;
0955 if (dbad_testThisProcess!=-2) {
0956 int i ;
0957 float varsum = 0.0 ;
0958 for (i=0 ; i<length ; ++i) {
0959 varsum += var[i] ;
0960 }
0961 adDebugTgt_passiveReal4(varname, varsum) ;
0962 }
0963 }
0964
0965 void adDebugTgt_testComplex16(char *varname, cdcmplx var, cdcmplx *vard) {
0966 dbad_adDebugTgt_testComplex16(varname, var, vard, 0) ;
0967 }
0968
0969 void adDebugTgt_testReal8(char *varname, double var, double *vard) {
0970 dbad_adDebugTgt_testReal8(varname, var, vard, 0) ;
0971 }
0972
0973 void adDebugTgt_testReal4(char *varname, float var, float *vard) {
0974 dbad_adDebugTgt_testReal4(varname, var, vard, 0) ;
0975 }
0976
0977 void adDebugTgt_testComplex16Array(char *varname, cdcmplx* var, cdcmplx* vard, int length) {
0978 dbad_adDebugTgt_testComplex16Array(varname, var, vard, length, 0) ;
0979 }
0980
0981 void adDebugTgt_testReal8Array(char *varname, double* var, double* vard, int length) {
0982 dbad_adDebugTgt_testReal8Array(varname, var, vard, length, 0) ;
0983 }
0984
0985 void adDebugTgt_testReal4Array(char *varname, float* var, float* vard, int length) {
0986 dbad_adDebugTgt_testReal4Array(varname, var, vard, length, 0) ;
0987 }
0988
0989 void adDebugTgt_concludeComplex16(char* varname, cdcmplx var, cdcmplx *vard) {
0990 dbad_adDebugTgt_testComplex16(varname, var, vard, 1) ;
0991 }
0992
0993 void adDebugTgt_concludeReal8(char* varname, double var, double *vard) {
0994 dbad_adDebugTgt_testReal8(varname, var, vard, 1) ;
0995 }
0996
0997 void adDebugTgt_concludeReal4(char* varname, float var, float *vard) {
0998 dbad_adDebugTgt_testReal4(varname, var, vard, 1) ;
0999 }
1000
1001 void adDebugTgt_concludeComplex16Array(char* varname, cdcmplx *var, cdcmplx *vard, int length) {
1002 dbad_adDebugTgt_testComplex16Array(varname, var, vard, length, 1) ;
1003 }
1004
1005 void adDebugTgt_concludeReal8Array(char* varname, double *var, double *vard, int length) {
1006
1007 dbad_adDebugTgt_testReal8Array(varname, var, vard, length, 1) ;
1008 }
1009
1010 void adDebugTgt_concludeReal4Array(char* varname, float *var, float *vard, int length) {
1011 dbad_adDebugTgt_testReal4Array(varname, var, vard, length, 1) ;
1012 }
1013
1014 void adDebugTgt_conclude() {
1015 if (dbad_testThisProcess!=-2) {
1016 printf("===========================================================\n") ;
1017 if (dbad_trace) {
1018 if (dbad_testThisProcess==-1) {
1019 printf("Condensed results: %24.16e //%24.16e",dbad_condensed_tgt,dbad_condensed_dd) ;
1020 } else {
1021 printf("[process %i] Condensed results: %24.16e //%24.16e",dbad_testThisProcess,dbad_condensed_tgt,dbad_condensed_dd) ;
1022 }
1023 }
1024 if (dbad_phase==2) {
1025 double abstgt, absdd, maxabs, abserror, diff ;
1026 abstgt = (dbad_condensed_tgt>=0.0?dbad_condensed_tgt:-dbad_condensed_tgt) ;
1027 absdd = (dbad_condensed_dd>=0.0?dbad_condensed_dd:-dbad_condensed_dd) ;
1028 maxabs = (abstgt>absdd?abstgt:absdd) ;
1029 abserror = dbad_condensed_tgt-dbad_condensed_dd ;
1030 if (abserror<0.0) abserror=-abserror ;
1031 diff = (abserror*100.0)/ maxabs ;
1032 if (dbad_testThisProcess==-1) {
1033 printf("Condensed tangent: %24.16e (ad)%5.1f%% DIFF WITH (dd)%24.16e [seed:%7.1e]\n",
1034 dbad_condensed_tgt,diff,dbad_condensed_dd,dbad_seed) ;
1035 } else {
1036 printf("[process %i] Condensed tangent: %24.16e (ad)%5.1f%% DIFF WITH (dd)%24.16e [seed:%7.1e]\n",
1037 dbad_testThisProcess,dbad_condensed_tgt,diff,dbad_condensed_dd,dbad_seed) ;
1038 }
1039 }
1040 }
1041 }
1042
1043 void adDebugTgt_display(char *placename) {
1044 if (dbad_testThisProcess!=-2) {
1045 if (dbad_trace) {
1046 if (dbad_testThisProcess==-1) {
1047 printf("display %s\n", placename) ;
1048 } else {
1049 printf("[process %i] display %s\n", dbad_testThisProcess, placename) ;
1050 }
1051 }
1052 if (dbad_phase==2) {
1053 dbad_display_location(placename) ;
1054 }
1055 }
1056 }
1057
1058
1059
1060 void adDebugBwd_init(double errmax, double seed) {
1061 dbad_mode = -1 ;
1062 dbad_phase = 1 ;
1063 dbad_errormax = errmax ;
1064 dbad_seed = seed ;
1065 dbad_topContext.funcname = "TESTED CODE\0" ;
1066 dbad_topContext.deltadepth = 0 ;
1067 dbad_topContext.code = 0 ;
1068 dbad_calltracedepth = 1 ;
1069 dbad_callStack = &dbad_topContext ;
1070 char* phase = getenv("DBAD_PHASE") ;
1071 if (phase==NULL) {
1072 printf("Please set DBAD_PHASE environment variable to 0 (no debug), 1 (sendToTgt), or -1 (plusTraces)\n") ;
1073 dbad_phase = 1 ;
1074 } else if (strcmp(phase,"0")==0) {
1075 dbad_phase = 1 ;
1076 dbad_nocommunication = 1 ;
1077 } else if (strcmp(phase,"1")==0) {
1078 dbad_phase = 1 ;
1079 } else if (strcmp(phase,"-1")==0) {
1080 dbad_phase = 1 ;
1081 dbad_trace = 1 ;
1082 } else {
1083 printf("DBAD_PHASE environment variable must be set to 0 (no debug), 1 (sendToTgt), or -1 (plusTraces)\n") ;
1084 exit(0) ;
1085 }
1086 printf("Starting ADJ test, phase one (bwd), errmax=%4.1f% [seed=%7.1e]\n", errmax, seed) ;
1087 printf("===========================================================\n") ;
1088 if (dbad_nocommunication) {
1089 dbad_file = NULL ;
1090 printf("FIFO COMMUNICATION TURNED OFF !\n") ;
1091 } else {
1092 mkfifo("/tmp/DBAD_fifo", S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH | S_IRWXU | S_IRWXO) ;
1093 dbad_file = fopen("/tmp/DBAD_fifo", "a") ;
1094 if (dbad_file==NULL) {
1095 char errbuf[20] ;
1096 strerror_r(errno, errbuf, 20) ;
1097 printf("FIFO ERROR %i: %s OR %s\n",errno,strerror(errno),errbuf) ;
1098 exit(0) ;
1099 }
1100 }
1101 dbad_resetCondensors() ;
1102 }
1103
1104 void adDebugBwd_call(char *funcname, int deltadepth) {
1105 dbad_pushCallFrame(funcname, deltadepth, 0) ;
1106 }
1107
1108 void adDebugBwd_exit() {
1109 dbad_resetCondensors() ;
1110 if (dbad_debugabove()) {
1111 if (dbad_nocommunication) {
1112 printf("adDebug would send (%i %s)\n", (dbad_debughere(0)?2:-2), dbad_callStack->funcname) ;
1113 } else {
1114 fprintf(dbad_file, "%i\n", (dbad_debughere(0)?2:-2)) ;
1115 fprintf(dbad_file, "%s\n", dbad_callStack->funcname) ;
1116 }
1117 }
1118 dbad_popCallFrame() ;
1119 }
1120
1121 int adDebugBwd_here(char* placename) {
1122 dbad_resetCondensors() ;
1123 return adDebugTgt_here(placename, 0) ;
1124 }
1125
1126
1127
1128 void adDebugFwd_init(double errmax, double seed) {
1129 dbad_mode = -1 ;
1130 dbad_phase = 2 ;
1131 dbad_errormax = errmax ;
1132 dbad_seed = seed ;
1133 dbad_topContext.funcname = "TESTED CODE\0" ;
1134 dbad_topContext.deltadepth = 0 ;
1135 dbad_topContext.code = 0 ;
1136 dbad_calltracedepth = 1 ;
1137 dbad_callStack = &dbad_topContext ;
1138 char* phase = getenv("DBAD_PHASE") ;
1139 if (phase==NULL) {
1140 printf("Please set DBAD_PHASE environment variable to 0 (no debug), 2 (readFromAdj), or -2 (plusTraces)\n") ;
1141 dbad_phase = 2 ;
1142 } else if (strcmp(phase,"0")==0) {
1143 dbad_phase = 2 ;
1144 dbad_nocommunication = 1 ;
1145 } else if (strcmp(phase,"2")==0) {
1146 dbad_phase = 2 ;
1147 } else if (strcmp(phase,"-2")==0) {
1148 dbad_phase = 2 ;
1149 dbad_trace = 1 ;
1150 } else {
1151 printf("DBAD_PHASE environment variable must be set to 0 (no debug), 2 (readFromAdj), or -2 (plusTraces)\n") ;
1152 exit(0) ;
1153 }
1154 dbad_nberrors = 0 ;
1155 printf("Starting ADJ test, phase two (fwd), errmax=%4.1f% [seed=%7.1e]\n", errmax, seed) ;
1156 printf("===========================================================\n") ;
1157 if (dbad_nocommunication) {
1158 dbad_file = NULL ;
1159 printf("FIFO COMMUNICATION TURNED OFF !\n") ;
1160 } else {
1161 dbad_file = fopen("/tmp/DBAD_fifo", "r") ;
1162 dbad_resetCondensors() ;
1163
1164
1165
1166
1167
1168
1169
1170 int ret=0 ;
1171 int label ;
1172 char placename[40] ;
1173 double value ;
1174 while (1) {
1175 ret = fscanf(dbad_file, "%i\n", &label) ;
1176 if (ret!=1) break ;
1177 ret = fscanf(dbad_file, "%s\n", placename) ;
1178 if (label==1) {
1179 ret = fscanf(dbad_file, "%lf\n", &value) ;
1180 dbad_pushReal8(value) ;
1181 }
1182 pushCharacterArray(placename, 40) ;
1183 dbad_pushinteger4(label) ;
1184 }
1185 }
1186 }
1187
1188 void adDebugFwd_call(char *funcname) {
1189 int label ;
1190 char funcnamefrom[40] ;
1191 char funcnamehere[40] ;
1192
1193
1194 if (dbad_debughere(0) && !(dbad_nocommunication && dbad_phase==2)) {
1195 dbad_popinteger4(&label) ;
1196 if (label!=2 && label!=-2) {
1197 printf("Control mismatch, expecting a trace (-2or2) from %s bwd call exit, got %i\n",funcname,label) ;
1198 exit(0) ;
1199 }
1200 popCharacterArray(funcnamefrom, 40) ;
1201 sprintf(funcnamehere,"%s",funcname) ;
1202 if (strcmp(funcnamefrom,funcnamehere)!=0) {
1203 printf("Control mismatch, expecting a call to %s, got %s\n",funcnamehere,funcnamefrom) ;
1204 exit(0) ;
1205 }
1206 dbad_pushCallFrame(funcname, 0, 0) ;
1207 if (label==2) {
1208 dbad_callStack->deltadepth += (dbad_calltracedepth-1) ;
1209 dbad_calltracedepth = 1 ;
1210 } else {
1211 dbad_callStack->deltadepth += dbad_calltracedepth ;
1212 dbad_calltracedepth = 0 ;
1213 }
1214 } else {
1215 dbad_pushCallFrame(funcname, 0, 0) ;
1216 }
1217 }
1218
1219 void adDebugFwd_exit() {
1220 dbad_popCallFrame() ;
1221 }
1222
1223 int adDebugFwd_here(char* placename) {
1224
1225
1226
1227 if (dbad_nocommunication && dbad_phase==2) {
1228 if (strcmp(placename,"end")==0 || strcmp(placename,"start")==0)
1229 return 1 ;
1230 else
1231 return 0 ;
1232 } else {
1233 if (dbad_debughere(0)) {
1234 int label ;
1235 char placenamefrom[40] ;
1236 char placenamehere[40] ;
1237 dbad_resetCondensors() ;
1238 dbad_popinteger4(&label) ;
1239 if (label!=1 && label!=-1 && label!=0) {
1240 printf("Control mismatch, expecting a trace (-1or0or1) from place %s, got %i\n",placename,label) ;
1241 exit(0) ;
1242 }
1243 popCharacterArray(placenamefrom, 40) ;
1244 sprintf(placenamehere,"%s",placename) ;
1245 if (strcmp(placenamefrom,placenamehere)!=0) {
1246 printf("Control mismatch, expecting place %s, got %s\n",placenamehere,placenamefrom) ;
1247 exit(0) ;
1248 }
1249 if (label==1) {
1250 dbad_popReal8(&dbad_nextrefsum) ;
1251 }
1252 return label!=-1 ;
1253 } else {
1254 return 0 ;
1255 }
1256 }
1257 }
1258
1259
1260
1261 void adDebugAdj_rwComplex16(cdcmplx *vard) {
1262 double varbR = dbad_nextRandom() ;
1263 double varbI = dbad_nextRandom() ;
1264 dbad_condensed_adj += varbR*(vard->dr) + varbI*(vard->di) ;
1265 vard->dr = varbR ;
1266 vard->di = varbI ;
1267 }
1268
1269 void adDebugAdj_rwReal8(double *vard) {
1270 double varb = dbad_nextRandom() ;
1271 dbad_condensed_adj += varb*(*vard) ;
1272 *vard = varb ;
1273 }
1274
1275 void adDebugAdj_rwReal4(float *vard) {
1276 double varb = dbad_nextRandom() ;
1277 dbad_condensed_adj += varb*(*vard) ;
1278 *vard = (float)varb ;
1279 }
1280
1281 void adDebugAdj_rComplex16(cdcmplx *vard) {
1282 double varbR = dbad_nextRandom() ;
1283 double varbI = dbad_nextRandom() ;
1284 dbad_condensed_adj += varbR*(vard->dr) + varbI*(vard->di) ;
1285 }
1286
1287
1288
1289
1290 void adDebugAdj_rReal8(double *vard) {
1291 double varb = dbad_nextRandom() ;
1292 dbad_condensed_adj += varb*(*vard) ;
1293 }
1294
1295
1296
1297
1298 void adDebugAdj_rReal4(float *vard) {
1299 double varb = dbad_nextRandom() ;
1300 dbad_condensed_adj += varb*(*vard) ;
1301 }
1302
1303 void adDebugAdj_wComplex16(cdcmplx *vard) {
1304 vard->dr = dbad_nextRandom() ;
1305 vard->di = dbad_nextRandom() ;
1306 }
1307
1308 void adDebugAdj_wReal8(double *vard) {
1309 *vard = dbad_nextRandom() ;
1310 }
1311
1312 void adDebugAdj_wReal4(float *vard) {
1313 *vard = (float)dbad_nextRandom() ;
1314 }
1315
1316 void adDebugAdj_rwComplex16Array(cdcmplx *vard, int length) {
1317 int i ;
1318 if (vard)
1319 for (i=0 ; i<length ; ++i)
1320 adDebugAdj_rwComplex16(&(vard[i])) ;
1321 }
1322
1323 void adDebugAdj_rwReal8Array(double *vard, int length) {
1324 int i ;
1325 if (vard)
1326 for (i=0 ; i<length ; ++i)
1327 adDebugAdj_rwReal8(&(vard[i])) ;
1328 }
1329
1330 void adDebugAdj_rwReal4Array(float *vard, int length) {
1331 int i ;
1332 if (vard)
1333 for (i=0 ; i<length ; ++i)
1334 adDebugAdj_rwReal4(&(vard[i])) ;
1335 }
1336
1337 void adDebugAdj_rComplex16Array(cdcmplx *vard, int length) {
1338 int i ;
1339 if (vard)
1340 for (i=0 ; i<length ; ++i)
1341 adDebugAdj_rComplex16(&(vard[i])) ;
1342 }
1343
1344 void adDebugAdj_rReal8Array(double *vard, int length) {
1345 int i ;
1346 if (vard)
1347 for (i=0 ; i<length ; ++i)
1348 adDebugAdj_rReal8(&(vard[i])) ;
1349 }
1350
1351 void adDebugAdj_rReal4Array(float *vard, int length) {
1352 int i ;
1353 if (vard)
1354 for (i=0 ; i<length ; ++i)
1355 adDebugAdj_rReal4(&(vard[i])) ;
1356 }
1357
1358 void adDebugAdj_wComplex16Array(cdcmplx *vard, int length) {
1359 int i ;
1360 if (vard)
1361 for (i=0 ; i<length ; ++i)
1362 adDebugAdj_wComplex16(&(vard[i])) ;
1363 }
1364
1365 void adDebugAdj_wReal8Array(double *vard, int length) {
1366 int i ;
1367 if (vard)
1368 for (i=0 ; i<length ; ++i)
1369 adDebugAdj_wReal8(&(vard[i])) ;
1370 }
1371
1372 void adDebugAdj_wReal4Array(float *vard, int length) {
1373 int i ;
1374 if (vard)
1375 for (i=0 ; i<length ; ++i)
1376 adDebugAdj_wReal4(&(vard[i])) ;
1377 }
1378
1379 void adDebugAdj_rwDisplay(char *placename, int indent) {
1380 adDebugAdj_rDisplay(placename, indent) ;
1381 if (dbad_phase==2)
1382 dbad_refsum = dbad_nextrefsum ;
1383 }
1384
1385 void adDebugAdj_rDisplay(char *placename, int indent) {
1386 if (dbad_phase==1) {
1387 if (dbad_nocommunication) {
1388 printf("adDebug would send (1 %s %24.16e)\n", placename, dbad_condensed_adj) ;
1389 } else {
1390 fprintf(dbad_file, "1\n") ;
1391 fprintf(dbad_file, "%s\n", placename) ;
1392 fprintf(dbad_file, "%24.16e\n", dbad_condensed_adj) ;
1393 }
1394 } else if (dbad_phase==2) {
1395
1396
1397 if (dbad_nocommunication) {
1398 printf("Condensed tangent result is %24.16e\n", dbad_condensed_adj) ;
1399 } else {
1400 double absref = (dbad_refsum>=0.0?dbad_refsum:-dbad_refsum) ;
1401 double absadj = (dbad_condensed_adj>=0.0?dbad_condensed_adj:-dbad_condensed_adj) ;
1402 double absdiff = dbad_refsum - dbad_condensed_adj ;
1403 if (absdiff<0.0) absdiff = -absdiff ;
1404 double reldiff = (absdiff*200.0)/(absref+absadj) ;
1405 if (reldiff>dbad_errormax) {
1406 printf(" %5.1f%% DIFFERENCE!! tgt:%24.16e adj:%24.16e\n",
1407 reldiff, dbad_condensed_adj, dbad_refsum) ;
1408 ++dbad_nberrors ;
1409 } else if (strcmp(placename,"end")==0 && dbad_nberrors==0) {
1410
1411 printf(" difference is just %7.3f% between tgt:%24.16e and adj:%24.16e\n",
1412 reldiff, dbad_condensed_adj, dbad_refsum) ;
1413 }
1414 if (indent==0) dbad_display_location(placename) ;
1415 }
1416 }
1417 dbad_resetCondensors() ;
1418 }
1419
1420 void adDebugAdj_wDisplay(char *placename, int indent) {
1421 if (dbad_phase==1) {
1422 if (dbad_nocommunication) {
1423 printf("adDebug would send (0 %s)\n", placename) ;
1424 } else {
1425 fprintf(dbad_file, "0\n") ;
1426 fprintf(dbad_file, "%s\n", placename) ;
1427 }
1428 } else if (dbad_phase==2) {
1429 if (indent==0) dbad_display_location(placename) ;
1430 dbad_refsum = dbad_nextrefsum ;
1431 }
1432 dbad_resetCondensors() ;
1433 }
1434
1435 void adDebugAdj_skip(char *placename) {
1436 if (dbad_phase==1 && dbad_debughere(0)) {
1437 if (dbad_nocommunication) {
1438 printf("adDebug would send (-1 %s)\n", placename) ;
1439 } else {
1440 fprintf(dbad_file, "-1\n") ;
1441 fprintf(dbad_file, "%s\n", placename) ;
1442 }
1443 }
1444 }
1445
1446 void adDebugAdj_conclude() {
1447 if (dbad_phase==2) {
1448 if (!dbad_nocommunication) {
1449
1450
1451 printf("End of ADJ test, %i error(s) found.\n", dbad_nberrors) ;
1452 printf("===========================================================\n") ;
1453 }
1454 }
1455 }
1456
1457
1458
1459
1460
1461
1462
1463 void addebugtgt_init_(double *epsilon, double *seed, int *tested_process) {
1464 adDebugTgt_init(*epsilon, *seed, *tested_process) ;
1465 }
1466
1467 void addebugtgt_call_(char* unitname, int *deltadepth, int *forcetraced) {
1468 adDebugTgt_call(unitname, *deltadepth, *forcetraced) ;
1469 }
1470
1471 void addebugtgt_exit_() {
1472 adDebugTgt_exit() ;
1473 }
1474
1475 int addebugtgt_here_(char* placename, int *forcetraced) {
1476 return adDebugTgt_here(placename, *forcetraced) ;
1477 }
1478
1479 void addebugtgt_initcomplex16_(char* varname, cdcmplx *indep, cdcmplx *indepd) {
1480 adDebugTgt_initComplex16(varname, indep, indepd) ;
1481 }
1482
1483 void addebugtgt_initreal8_(char* varname, double *indep, double *indepd) {
1484 adDebugTgt_initReal8(varname, indep, indepd) ;
1485 }
1486
1487 void addebugtgt_initreal4_(char* varname, float *indep, float *indepd) {
1488 adDebugTgt_initReal4(varname, indep, indepd) ;
1489 }
1490
1491 void addebugtgt_initcomplex16array_(char* varname, cdcmplx *indep, cdcmplx *indepd, int *length) {
1492 adDebugTgt_initComplex16Array(varname, indep, indepd, *length) ;
1493 }
1494
1495 void addebugtgt_initreal8array_(char* varname, double *indep, double *indepd, int *length) {
1496 adDebugTgt_initReal8Array(varname, indep, indepd, *length) ;
1497 }
1498
1499 void addebugtgt_initreal4array_(char* varname, float *indep, float *indepd, int *length) {
1500 adDebugTgt_initReal4Array(varname, indep, indepd, *length) ;
1501 }
1502
1503 void addebugtgt_passivecomplex16_(char *varname, cdcmplx *var) {
1504 adDebugTgt_passiveComplex16(varname, *var) ;
1505 }
1506
1507 void addebugtgt_passivereal8_(char *varname, double *var) {
1508 adDebugTgt_passiveReal8(varname, *var) ;
1509 }
1510
1511 void addebugtgt_passivereal4_(char *varname, float *var) {
1512 adDebugTgt_passiveReal4(varname, *var) ;
1513 }
1514
1515 void addebugtgt_passivecomplex16array_(char *varname, cdcmplx *var, int *length) {
1516 adDebugTgt_passiveComplex16Array(varname, var, *length) ;
1517 }
1518
1519 void addebugtgt_passivereal8array_(char *varname, double *var, int *length) {
1520 adDebugTgt_passiveReal8Array(varname, var, *length) ;
1521 }
1522
1523 void addebugtgt_passivereal4array_(char *varname, float *var, int *length) {
1524 adDebugTgt_passiveReal4Array(varname, var, *length) ;
1525 }
1526
1527 void addebugtgt_testcomplex16_(char *varname, cdcmplx *var, cdcmplx *vard) {
1528 adDebugTgt_testComplex16(varname, *var, vard) ;
1529 }
1530
1531 void addebugtgt_testreal8_(char *varname, double *var, double *vard) {
1532 adDebugTgt_testReal8(varname, *var, vard) ;
1533 }
1534
1535 void addebugtgt_testreal4_(char *varname, float *var, float *vard) {
1536 adDebugTgt_testReal4(varname, *var, vard) ;
1537 }
1538
1539 void addebugtgt_testcomplex16array_(char *varname, cdcmplx* var, cdcmplx* vard, int *length) {
1540 adDebugTgt_testComplex16Array(varname, var, vard, *length) ;
1541 }
1542
1543 void addebugtgt_testreal8array_(char *varname, double* var, double* vard, int *length) {
1544 adDebugTgt_testReal8Array(varname, var, vard, *length) ;
1545 }
1546
1547 void addebugtgt_testreal4array_(char *varname, float* var, float* vard, int *length) {
1548 adDebugTgt_testReal4Array(varname, var, vard, *length) ;
1549 }
1550
1551 void addebugtgt_concludecomplex16_(char* varname, cdcmplx *dep, cdcmplx *depd) {
1552 adDebugTgt_concludeComplex16(varname, *dep, depd) ;
1553 }
1554
1555 void addebugtgt_concludereal8_(char* varname, double *dep, double *depd) {
1556 adDebugTgt_concludeReal8(varname, *dep, depd) ;
1557 }
1558
1559 void addebugtgt_concludereal4_(char* varname, float *dep, float *depd) {
1560 adDebugTgt_concludeReal4(varname, *dep, depd) ;
1561 }
1562
1563 void addebugtgt_concludecomplex16array_(char* varname, cdcmplx *dep, cdcmplx *depd, int *length) {
1564 adDebugTgt_concludeComplex16Array(varname, dep, depd, *length) ;
1565 }
1566
1567 void addebugtgt_concludereal8array_(char* varname, double *dep, double *depd, int *length) {
1568 adDebugTgt_concludeReal8Array(varname, dep, depd, *length) ;
1569 }
1570
1571 void addebugtgt_concludereal4array_(char* varname, float *dep, float *depd, int *length) {
1572 adDebugTgt_concludeReal4Array(varname, dep, depd, *length) ;
1573 }
1574
1575 void addebugtgt_conclude_() {
1576 adDebugTgt_conclude() ;
1577 }
1578
1579 void addebugtgt_display_(char *placename) {
1580 adDebugTgt_display(placename) ;
1581 }
1582
1583 void addebugbwd_init_(double *errmax, double *seed) {
1584 adDebugBwd_init(*errmax, *seed) ;
1585 }
1586
1587 void addebugbwd_call_(char *funcname, int *deltadepth) {
1588 adDebugBwd_call(funcname, *deltadepth) ;
1589 }
1590
1591 void addebugbwd_exit_() {
1592 adDebugBwd_exit() ;
1593 }
1594
1595 int addebugbwd_here_(char* placename) {
1596 return adDebugBwd_here(placename) ;
1597 }
1598
1599 void addebugfwd_init_(double *errmax, double *seed) {
1600 adDebugFwd_init(*errmax, *seed) ;
1601 }
1602
1603 void addebugfwd_call_(char *funcname) {
1604 adDebugFwd_call(funcname) ;
1605 }
1606
1607 void addebugfwd_exit_() {
1608 adDebugFwd_exit() ;
1609 }
1610
1611 int addebugfwd_here_(char* placename) {
1612 return adDebugFwd_here(placename) ;
1613 }
1614
1615 void addebugadj_rwreal4_(float *vard) {
1616 adDebugAdj_rwReal4(vard) ;
1617 }
1618
1619 void addebugadj_rwreal8_(double *vard) {
1620 adDebugAdj_rwReal8(vard) ;
1621 }
1622
1623 void addebugadj_rwcomplex16_(cdcmplx *vard) {
1624 adDebugAdj_rwComplex16(vard) ;
1625 }
1626
1627 void addebugadj_rreal4_(float *vard) {
1628 adDebugAdj_rReal4(vard) ;
1629 }
1630
1631 void addebugadj_rreal8_(double *vard) {
1632 adDebugAdj_rReal8(vard) ;
1633 }
1634
1635 void addebugadj_rcomplex16_(cdcmplx *vard) {
1636 adDebugAdj_rComplex16(vard) ;
1637 }
1638
1639 void addebugadj_wreal4_(float *vard) {
1640 adDebugAdj_wReal4(vard) ;
1641 }
1642
1643 void addebugadj_wreal8_(double *vard) {
1644 adDebugAdj_wReal8(vard) ;
1645 }
1646
1647 void addebugadj_wcomplex16_(cdcmplx *vard) {
1648 adDebugAdj_wComplex16(vard) ;
1649 }
1650
1651 void addebugadj_rwreal4array_(float *vard, int *length) {
1652 adDebugAdj_rwReal4Array(vard, *length) ;
1653 }
1654
1655 void addebugadj_rwreal8array_(double *vard, int *length) {
1656 adDebugAdj_rwReal8Array(vard, *length) ;
1657 }
1658
1659 void addebugadj_rwcomplex16array_(cdcmplx *vard, int *length) {
1660 adDebugAdj_rwComplex16Array(vard, *length) ;
1661 }
1662
1663 void addebugadj_rreal4array_(float *vard, int *length) {
1664 adDebugAdj_rReal4Array(vard, *length) ;
1665 }
1666
1667 void addebugadj_rreal8array_(double *vard, int *length) {
1668 adDebugAdj_rReal8Array(vard, *length) ;
1669 }
1670
1671 void addebugadj_rcomplex16array_(cdcmplx *vard, int *length) {
1672 adDebugAdj_rComplex16Array(vard, *length) ;
1673 }
1674
1675 void addebugadj_wreal4array_(float *vard, int *length) {
1676 adDebugAdj_wReal4Array(vard, *length) ;
1677 }
1678
1679 void addebugadj_wreal8array_(double *vard, int *length) {
1680 adDebugAdj_wReal8Array(vard, *length) ;
1681 }
1682
1683 void addebugadj_wcomplex16array_(cdcmplx *vard, int *length) {
1684 adDebugAdj_wComplex16Array(vard, *length) ;
1685 }
1686
1687 void addebugadj_rwdisplay_(char *placename, int *indent) {
1688 adDebugAdj_rwDisplay(placename, *indent) ;
1689 }
1690
1691 void addebugadj_rdisplay_(char *placename, int *indent) {
1692 adDebugAdj_rDisplay(placename, *indent) ;
1693 }
1694
1695 void addebugadj_wdisplay_(char *placename, int *indent) {
1696 adDebugAdj_wDisplay(placename, *indent) ;
1697 }
1698
1699 void addebugadj_skip_(char* placename) {
1700 adDebugAdj_skip(placename) ;
1701 }
1702
1703 void addebugadj_conclude_() {
1704 adDebugAdj_conclude() ;
1705 }