11 #if(0) // uniformly low values although not always lower than original version
15 #define CON2 (CON*CON)
17 #define NTAB 30 // number of function evaluations is 2XNTAB
20 #define TRYTOL (trytollocal) // attempted tolerance
21 #define OKTOL 1e-5 // error must be below this to avoid report
26 #if(1) // original version (gets pretty damn low for many, but not all, derivatives -- some 1E-6 rather than 1E-13)
27 #define MAXITER 15 //Increased by Sasha up from 5 to avoid non-convergence errors (>1e-5)
30 #define CON2 (CON*CON)
31 #define NTAB 10 // number of function evaluations is 2XNTAB
34 #define TRYTOL 1E-10 // attempted tolerance
35 #define OKTOL 1e-5 // error must be below this to avoid report
43 #define DEBUGOUTPUTAMATRIX 0
46 #define USEJONEXTENSION 1
57 FTYPE firsthstart,hstart;
63 FTYPE minerror,minerrorhstart;
72 FTYPE truecon,truecon2;
73 int nrlasti,nrgoodi,nrgoodj;
74 FTYPE nrerr,nrans,nrgoodhh;
91 else hstart=0.5*
dx[kk];
121 if (h <= 0.0) nrerror(
"h must be positive definite in dfridr.");
126 for(k=0;k<
NDIM;k++) dX[k]=0.0;
149 a[1][1]=((*func)(ptrgeom,Xh,ii,jj)-(*func)(ptrgeom,Xl,ii,jj))/(2.0*hh);
151 for (i=2;i<=
NTAB;i++) {
156 for(k=0;k<
NDIM;k++) Xl[k]=X[k]-dX[k];
157 for(k=0;k<
NDIM;k++) Xh[k]=X[k]+dX[k];
162 a[1][
i]=((*func)(ptrgeom,Xh,ii,jj)-(*func)(ptrgeom,Xl,ii,jj))/(2.0*hh);
169 a[
j][
i]=(a[j-1][
i]*fac-a[j-1][i-1])/(fac-1.0);
176 errt=
MAX(fabs(a[j][i]-a[j-1][i]),fabs(a[j][i]-a[j-1][i-1]));
177 errt/=
MAX(
MAX(
MAX(fabs(a[j][i]),fabs(a[j-1][i])),
MAX(fabs(a[j][i]),fabs(a[j-1][i-1]))),
SMALL);
194 if (fabs((a[i][i]-a[i-1][i-1]))/
MAX(
SMALL,
MAX(fabs(a[i][i]),fabs(a[i-1][i-1]))) >=
SAFE*(err)){
201 #if(0) // NR breaks a bit early -- found solution can sometimes be better if wait -- so just do whole NTAB
218 #if(DEBUGOUTPUTAMATRIX) // debug report to see exactly what table contained
219 dualfprintf(
fail_file,
"BEGIN DFRIDR table for i=%d j=%d k=%d :: ii=%d jj=%d kk=%d hstart=%21.15g lasti=%d nrlasti=%d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,ii,jj,kk,hstart,lasti,nrlasti);
220 dualfprintf(
fail_file,
" %21s ",
"ORDERS");
221 for(i=1;i<=lasti;i++){
225 for(i=1;i<=lasti;i++){
226 dualfprintf(
fail_file,
"hh=%21.15g ",hstart/pow(truecon,i-1));
227 for(j=1;j<=lasti;j++){
229 if(i==goodi && j==goodj){
230 dualfprintf(
fail_file,
"*%21.15g*",a[j][i]);
232 else if(i==nrgoodi && j==nrgoodj){
233 dualfprintf(
fail_file,
"?%21.15g?",a[j][i]);
236 dualfprintf(
fail_file,
" %21.15g ",a[j][i]);
242 if(j==lasti) dualfprintf(
fail_file,
"\n");
245 if(i==lasti) dualfprintf(
fail_file,
"\n");
247 dualfprintf(
fail_file,
"final error=%21.15g goodhh=%21.15g ans=%21.15g\n",err,goodhh,ans);
248 dualfprintf(
fail_file,
"NR error=%21.15g goodhh=%21.15g ans=%21.15g\n",nrerr,nrgoodhh,nrans);
249 dualfprintf(
fail_file,
"END DFRIDR table for i=%d j=%d k=%d ii=%d jj=%d kk=%d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,ii,jj,kk);
258 #if(USEJONEXTENSION==0)
281 if(errlist[iter]<minerror){
283 minerror=errlist[iter];
284 minerrorhstart=hhlist[iter];
288 dualfprintf(
fail_file,
"minerr=%21.15g minhstart=%21.15g miniter=%d minans=%21.15g\n",minerror,minerrorhstart,miniter,minans);
295 if(iter==1) dualfprintf(
fail_file,
"Done with no better error (iter=%d)\n",iter);
296 else dualfprintf(
fail_file,
"Did better on multiple iterations (iter=%d)\n",iter);
307 hbottom=goodhh/truecon;
308 truecon= pow(hbottom,-1.0/
NTAB) * pow(htop,1.0/
NTAB);
309 truecon2=truecon*truecon;
314 dualfprintf(
fail_file,
"iter=%d err=%21.15g goodhh=%21.15g lasti=%d truecon=%21.15g htop=%21.15g hbottom=%21.15g\n",iter,err,goodhh,lasti,truecon,htop,hbottom);
339 dualfprintf(
fail_file,
"iter=%d>=MAXITER=%d: never found error below %21.15g: err=%21.15g : ii=%d jj=%d kk=%d\n",iter,
MAXITER,
OKTOL,err,ii,jj,kk);
340 dualfprintf(
fail_file,
"gi=%d gj=%d gk=%d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
342 dualfprintf(
fail_file,
"miniter=%d errlist[miniter]=%21.15g hhlist[miniter]=%21.15g\n",miniter,errlist[miniter],hhlist[miniter]);
343 dualfprintf(
fail_file,
"minerror=%21.15g minans=%21.15g\n",minerror,minans);
344 for(iterdebug=0;iterdebug<iter;iterdebug++){
345 dualfprintf(
fail_file,
"h[%d]=%21.15g err[%d]=%21.15g ans[%d]=%21.15g\n",iterdebug,hhlist[iterdebug],iterdebug,errlist[iterdebug],iterdebug,anslist[iterdebug]);
353 #endif // end JCM addition
368 if(debugfail>=2) dualfprintf(
fail_file,
"Bad NUMREC error at i=%d j=%d k=%d ii=%d jj=%d kk=%d error=%21.15g ans=%21.15g :: iter=%d lasti=%d minerrorhstart=%21.15g firsthstart=%21.15g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,ii,jj,kk,err,ans,iter,lasti,minerrorhstart,firsthstart);
410 int contmod(
int x,
int y)
423 int contmod(
int x,
int y);
428 nmod4=contmod((
int)(th/(M_PI*0.5)),4);
441 ans=-sin(2.0*M_PI-th);
444 dualfprintf(
fail_file,
"No such case for mysin with nmod4=%d\n",nmod4);
463 return(mysin(th+M_PI*0.5));
472 #if(SUPERLONGDOUBLE==0)
478 if(fabs(fmod(arg,M_PI))<1
E-14){
483 return(mycos(arg)/mysin(arg));
485 return(1.0/tan(arg));
495 if(fabs(fmod(arg,M_PI))<1
E-14){
500 return(1.0/mysin(arg));
502 return(1.0/sin(arg));
510 if(fabs(fmod(arg,0.5*M_PI))<1
E-14){
515 return(1.0/mycos(arg));
517 return(1.0/cos(arg));
527 int find_horizon(
int fromwhere)
564 if(fromwhere==0) trifprintf(
"begin: find_horizon ... ");
578 for (ii =
numprocs - 1; ii >= 0; ii--) {
580 for (i =
N1-1; i >= 0; i--) {
593 if(ii==myid && myid==0 && i==0){
595 if(horizonvalue<=r1 || horizonvalue<
SMALL){
607 if(horizonvalue >= r1 && horizonvalue < r2){
613 else if (fromwhere==2){
614 if(horizonvalue >= r1 && horizonvalue < r2){
635 MPI_Bcast(&
horizoni, 1, MPI_INT, MPIid[ii], MPI_COMM_GRMHD);
636 MPI_Bcast(&
horizoncpupos1, 1, MPI_INT, MPIid[ii], MPI_COMM_GRMHD);
652 dualfprintf(
fail_file,
"Never found horizon: fromwhere=%d :: MBH=%21.15g a=%21.15g :: Rhor=%21.15g Risco=%21.15g\n",fromwhere,
MBH,
a,
Rhor,
Risco);
665 trifprintf(
"end: find_horizon\n");
701 MPI_Bcast(localRout, 1, MPI_FTYPE, MPIid[whichcpu], MPI_COMM_GRMHD);
719 MPI_Bcast(localRin, 1, MPI_FTYPE, MPIid[whichcpu], MPI_COMM_GRMHD);
736 void set_drsing(
void)
748 dr = (dxdxp[1][1]*
dx[1] + dxdxp[1][2]*
dx[2])/10.0;
755 MPI_Allreduce(&dr, &
drsing,1, MPI_FTYPE, MPI_MAX,MPI_COMM_GRMHD);
808 DLOOP(jj,kk) generalmatrixlower[jj][kk] = gcov[
GIND(jj,kk)];
810 toreturn=gdet_func_singcheck(whichcoord, V,generalmatrixlower,gdet);
835 if(V[2]<0.0) *gdet*=-1.0;
836 if(V[2]>M_PI) *gdet*=-1.0;
852 int j, k, indx[
NDIM];
854 int anglesing,centersing,truedim;
862 tmp = dmatrix(1, NDIM, 1, NDIM);
864 static int firstc = 1;
867 tmp = dmatrix(1, NDIM, 1, NDIM);
877 metric_sing_check(whichcoord, generalmatrixlower, &anglesing, ¢ersing, &truedim);
885 DLOOP(j,k) tmp[j + 1][k + 1] = generalmatrixlower[
j][k];
888 if(ludcmp(tmp, truedim, indx - 1, &d)>=1){
889 if(debugfail>=2) dualfprintf(
fail_file,
"ludcmp failure in gdet_func_orig\n");
893 if(debugfail>=2) dualfprintf(
fail_file,
"Assuming on polar axis\n");
897 dualfprintf(
fail_file,
"ludcmp failure 2: whichcoord=%d\n",whichcoord);
901 dualfprintf(
fail_file,
"ludcmp failure: Can't assume on polar axis for whichcoord=%d\n",whichcoord);
907 if(singfix==0 || truedim<NDIM){
909 for (j = 1; j <=
NDIM; j++) d *= tmp[j][j];
911 if(d>0.0 && d<
SMALL){
915 dualfprintf(
fail_file,
"Metric has bad signature: d=%21.15g\n",d);
916 DLOOP(j,k) dualfprintf(
fail_file,
"generalmatrixlower[%d][%d]=%21.15g\n",j,k,generalmatrixlower[j][k]);
930 free_dmatrix(tmp, 1, NDIM, 1, NDIM);
937 if(singfix)
return(-1);
946 void matrix_inverse_2d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM])
950 DLOOP(jj,kk) genmatrixupper[jj][kk] = 0.0;
953 genmatrixupper[
TT][
TT] = 1.0/(-genmatrixlower[
TT][
RR]*genmatrixlower[
TT][
RR]/genmatrixlower[
RR][
RR] + genmatrixlower[
TT][
TT]);
955 genmatrixupper[TT][
RR] = genmatrixupper[
RR][TT] = -genmatrixlower[TT][
RR]/(-genmatrixlower[TT][
RR]*genmatrixlower[TT][
RR] + genmatrixlower[
RR][
RR]*genmatrixlower[TT][TT]);
957 genmatrixupper[
RR][
RR] = 1.0/(-genmatrixlower[TT][
RR]*genmatrixlower[TT][
RR]/genmatrixlower[TT][TT] + genmatrixlower[
RR][
RR]);
963 void matrix_inverse_3d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM])
966 FTYPE genmatrixlowerrhsq,genmatrixlowertrsq,genmatrixlowerthsq;
969 DLOOP(jj,kk) genmatrixupper[jj][kk] = 0.0;
972 genmatrixlowerrhsq = genmatrixlower[RR][
TH]*genmatrixlower[RR][
TH];
973 genmatrixlowertrsq = genmatrixlower[TT][RR]*genmatrixlower[TT][RR];
974 genmatrixlowerthsq = genmatrixlower[TT][TH]*genmatrixlower[TT][TH];
976 genmatrixupper[TT][TT]=(genmatrixlowerrhsq - genmatrixlower[TH][TH]*genmatrixlower[RR][RR])/(genmatrixlower[RR][RR]*genmatrixlowerthsq - 2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] - genmatrixlower[TH][TH]*genmatrixlower[RR][RR]*genmatrixlower[TT][TT]);
977 genmatrixupper[TT][RR]=genmatrixupper[RR][TT]=(-(genmatrixlower[RR][TH]*genmatrixlower[TT][TH]) + genmatrixlower[TH][TH]*genmatrixlower[TT][RR])/(-2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] + genmatrixlower[RR][RR]*(genmatrixlowerthsq - genmatrixlower[TH][TH]*genmatrixlower[TT][TT]));
978 genmatrixupper[TT][TH]=genmatrixupper[TH][TT]=(genmatrixlower[RR][RR]*genmatrixlower[TT][TH] - genmatrixlower[RR][TH]*genmatrixlower[TT][RR])/(genmatrixlower[RR][RR]*genmatrixlowerthsq - 2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] - genmatrixlower[TH][TH]*genmatrixlower[RR][RR]*genmatrixlower[TT][TT]);
979 genmatrixupper[RR][RR]=(genmatrixlowerthsq - genmatrixlower[TH][TH]*genmatrixlower[TT][TT])/(genmatrixlower[RR][RR]*genmatrixlowerthsq - 2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] - genmatrixlower[TH][TH]*genmatrixlower[RR][RR]*genmatrixlower[TT][TT]);
980 genmatrixupper[RR][TH]=genmatrixupper[TH][RR]=(-(genmatrixlower[TT][TH]*genmatrixlower[TT][RR]) + genmatrixlower[RR][TH]*genmatrixlower[TT][TT])/(-2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] + genmatrixlower[RR][RR]*(genmatrixlowerthsq - genmatrixlower[TH][TH]*genmatrixlower[TT][TT]));
981 genmatrixupper[TH][TH]=(genmatrixlowertrsq - genmatrixlower[RR][RR]*genmatrixlower[TT][TT])/(genmatrixlower[RR][RR]*genmatrixlowerthsq - 2.0*genmatrixlower[RR][TH]*genmatrixlower[TT][TH]*genmatrixlower[TT][RR] + genmatrixlower[TH][TH]*genmatrixlowertrsq + genmatrixlowerrhsq*genmatrixlower[TT][TT] - genmatrixlower[TH][TH]*genmatrixlower[RR][RR]*genmatrixlower[TT][TT]);
995 DLOOP(jj,kk) genmatrixlower[jj][kk]=gcov[
GIND(jj,kk)];
996 DLOOP(jj,kk) genmatrixupper[jj][kk]=gcon[
GIND(jj,kk)];
1001 DLOOP(jj,kk) gcon[
GIND(jj,kk)]=genmatrixupper[jj][kk];
1013 int anglesing,centersing,truedim;
1014 void metric_sing_check(
int whichcoord,
FTYPE (*genmatrixlower)[NDIM],
int *anglesing,
int*centersing,
int *truedim);
1015 void matrix_inverse_2d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM]);
1016 void matrix_inverse_3d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM]);
1022 tmp = dmatrix(1, NDIM, 1, NDIM);
1024 static int firstc = 1;
1027 tmp = dmatrix(1, NDIM, 1, NDIM);
1035 DLOOP(j,k) tmp[j + 1][k + 1] = genmatrixlower[
j][k];
1041 metric_sing_check(whichcoord, genmatrixlower, &anglesing, ¢ersing, &truedim);
1048 DLOOP(j,k) genmatrixupper[
j][k]=0.0;
1054 if(gaussj(tmp, truedim, NULL, 0)){
1056 #if(0) // new singularity check before if(gaussj) should work
1061 matrix_inverse_2d(genmatrixlower,genmatrixupper);
1064 dualfprintf(
fail_file,
"whichcoord=%d\n",whichcoord);
1068 dualfprintf(
fail_file,
"Singularity check didn't work\n");
1069 dualfprintf(
fail_file,
"whichcoord=%d anglesing=%d centersing=%d truedim=%d\n",whichcoord,anglesing,centersing,truedim);
1070 DLOOP(j,k) dualfprintf(
fail_file,
"inputmatrix[%d][%d]=%21.15g\n",j,k,genmatrixlower[j][k]);
1078 DLOOP(j,k) genmatrixupper[
j][k] = tmp[j + 1][k + 1];
1082 #if(1) // check for nan's
1083 DLOOP(j,k)
if(!finite(genmatrixupper[j][k])){
1084 dualfprintf(
fail_file,
"Came out of matrix_inverse with inf/nan for genmatrixupper at j=%d k=%d\n",j,k);
1094 free_dmatrix(tmp, 1, NDIM, 1, NDIM);
1105 void matrix_inverse_gen(
int truedim,
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM])
1114 tmp = dmatrix(1, NDIM, 1, NDIM);
1116 static int firstc = 1;
1119 tmp = dmatrix(1, NDIM, 1, NDIM);
1127 DLOOP(j,k) tmp[j + 1][k + 1] = genmatrixlower[j][k];
1131 DLOOP(j,k) genmatrixupper[j][k]=0.0;
1134 if(gaussj(tmp, truedim, NULL, 0)){
1137 DLOOP(j,k) dualfprintf(
fail_file,"inputmatrix[%d][%d]=%21.15g\n",j,k,genmatrixlower[j][k]);
1143 DLOOP(j,k) genmatrixupper[j][k] = tmp[j + 1][k + 1];
1147 #if(1) // check for nan's
1148 DLOOP(j,k) if(!finite(genmatrixupper[j][k])){
1149 dualfprintf(fail_file,
"Came out of matrix_inverse_gen with inf/nan for genmatrixupper at j=%d k=%d\n",j,k);
1159 free_dmatrix(tmp, 1, NDIM, 1, NDIM);
1171 void matrix_inverse_4d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM])
1175 void matrix_inverse_2d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM]);
1176 void matrix_inverse_3d(
FTYPE (*genmatrixlower)[NDIM],
FTYPE (*genmatrixupper)[NDIM]);
1182 tmp = dmatrix(1, NDIM, 1, NDIM);
1184 static int firstc = 1;
1187 tmp = dmatrix(1, NDIM, 1, NDIM);
1195 DLOOP(j,k) tmp[j + 1][k + 1] = genmatrixlower[j][k];
1200 DLOOP(j,k) genmatrixupper[j][k]=0.0;
1206 if(gaussj(tmp, truedim, NULL, 0)){
1208 dualfprintf(fail_file,
"Singular\n");
1209 DLOOP(j,k) dualfprintf(fail_file,"inputmatrix[%d][%d]=%21.15g\n",j,k,genmatrixlower[j][k]);
1215 DLOOP(j,k) genmatrixupper[j][k] = tmp[j + 1][k + 1];
1219 #if(1) // check for nan's
1220 DLOOP(j,k) if(!finite(genmatrixupper[j][k])){
1221 dualfprintf(fail_file,
"Came out of matrix_inverse_4d with inf/nan for genmatrixupper at j=%d k=%d\n",j,k);
1231 free_dmatrix(tmp, 1, NDIM, 1, NDIM);
1242 void metric_sing_check(
int whichcoord,
FTYPE (*genmatrixlower)[NDIM],
int *anglesing,
int*centersing,
int *truedim)
1250 if(fabs(genmatrixlower[
PH][
PH])<10.0*
SMALL){
1253 if(fabs(genmatrixlower[TH][TH])<10.0*
SMALL){
1259 else if(*anglesing){
1275 FTYPE rmso_calc(
int which)
1284 Z1 = 1. + pow(1. - j*j,1./3.)*(pow(1. + j,1./3.) +
1285 pow(1. - j, 1./3.)) ;
1286 Z2 = sqrt(fabs(3.*j*j + Z1*Z1)) ;
1287 rmso=3. + Z2-sign*sqrt(fabs(3. - Z1)*fabs(3. + Z1 + 2.*Z2)) ;
1304 Z1=rnew*rnew-sign*2.*j*sqrt(rnew)+j*
j;
1305 Z2=rnew*(rnew*rnew-3.*rnew+sign*2.*j*sqrt(rnew));
1307 uphi=sign*Z1/sqrt(Z2);
1313 FTYPE rhor_calc(
int which)
1321 if(which==0) sign=1;
else sign=-1;
1323 disc=
MAX(1.0 - jsq,0.0);
1327 rhor=1. +sign*sqrt(disc);
1346 ptrgeomorig=ptrgeom;
1350 if(ptrgeom!=ptrgeomorig){
1352 *ptrgeomorig=*ptrgeom;
1360 void set_igdet_old(
struct of_geom *geom)
1368 geom->igdetnosing =
sign(geom->gdet)/(fabs(geom->gdet)+
SMALL);
1371 #if(WHICHEOM!=WITHGDET)
1382 igdetnosing =
sign(geom->gdetvol)/(fabs(geom->gdetvol)+
SMALL);
1383 geom->igdetnosing = igdetnosing;
1391 void set_igdetsimple_old(
struct of_geom *geom)
1396 #if(WHICHEOM!=WITHGDET)
1397 dualfprintf(fail_file,
"Using set_igdetsimple() but WHICHEOM!=WITHGDET\n");
1405 geom->igdetnosing =
sign(geom->gdet)/(fabs(geom->gdet)+
SMALL);
1409 igdetnosing =
sign(geom->gdetvol)/(fabs(geom->gdetvol)+
SMALL);
1410 geom->igdetnosing = igdetnosing;
1423 *alphalapse = 1.0/sqrt(fabs(-gcon[
GIND(TT,TT)]));
1433 *betasqoalphasq = 0.0;
1434 SLOOPA(j) *betasqoalphasq += (gcov[
GIND(TT,j)])*(gcon[
GIND(TT,j)]);
1444 alphasq=alphalapse*alphalapse;
1458 void gset(
int getprim,
int whichcoord,
int i,
int j,
int k,
struct of_geom *ptrgeom)
1464 gset_genloc(getprim, whichcoord, i, j, k, loc, ptrgeom);
1475 void gset_genloc(
int getprim,
int whichcoord,
int i,
int j,
int k,
int loc,
struct of_geom *ptrgeom)
1486 dualfprintf(fail_file,
"gset(): no such whichcoord=%d\n",whichcoord);
1490 gset_X(getprim, whichcoord, i, j, k, loc, X, ptrgeom);
1504 void gset_X(
int getprim,
int whichcoord,
int i,
int j,
int k,
int loc,
FTYPE *X,
struct of_geom *ptrgeom)
1523 #if(GETGEOMUSEPOINTER==0 || NEWMETRICSTORAGE==1)
1525 gcovptr=ptrgeom->gcov;
1526 gconptr=ptrgeom->gcon;
1527 gcovpertptr=ptrgeom->gcovpert;
1530 gcovptr=ptrgeom->gengcov;
1531 gconptr=ptrgeom->gengcon;
1532 gcovpertptr=ptrgeom->gengcovpert;
1534 ptrgeom->gcov=ptrgeom->gengcov;
1535 ptrgeom->gcon=ptrgeom->gengcon;
1536 ptrgeom->gcovpert=ptrgeom->gengcovpert;
1542 bl_coord_ijk_2(i, j, k, loc, X, V);
1543 gcov_func(ptrgeom,getprim,whichcoord,X,gcovptr,gcovpertptr);
1546 if(debugfail>=2) dualfprintf(fail_file,
"Caught gdet_func_metric() problem in gset_genloc()\n");
1548 gcon_func(ptrgeom,getprim,whichcoord,X,gcovptr,gconptr);
1549 alphalapse_func(ptrgeom,getprim,whichcoord,X,gcovptr,gconptr,&(ptrgeom->alphalapse));
1550 betasqoalphasq_func(ptrgeom,getprim,whichcoord,X,gcovptr,gconptr,&(ptrgeom->betasqoalphasq));
1551 beta_func(ptrgeom,getprim,whichcoord,X,gcovptr,gconptr,ptrgeom->alphalapse,ptrgeom->beta);
1552 eomfunc_func(ptrgeom, getprim, whichcoord,X,&(ptrgeom->EOMFUNCMAC(0)));
1553 assign_eomfunc(ptrgeom,&(ptrgeom->EOMFUNCMAC(0)));
1556 gdetvol_func(ptrgeom,ptrgeom->gdet,&(ptrgeom->EOMFUNCMAC(0)),ptrgeom->gdetvol);
1558 set_igdet_old(ptrgeom);
1565 dualfprintf(fail_file,
"gset(): no such whichcoord=%d\n",whichcoord);
1577 #define OPTMETRICLOOP 1 // whether to use highly optmized loop (assumes metric is symmetric)
1578 #define COMPUTEPERTURBEDMETRIC 0 // GODMARK: NOT CORRECT RIGHT NOW, so do NOT do it
1585 FTYPE ftemp1,ftemp2;
1598 dxdxprim_ijk_2(ptrgeom,X,V,dxdxp);
1600 #if(OPTMETRICLOOP==0)
1602 tmpgcov[
GIND(j,k)] = 0.;
1603 for(l=0;l<
NDIM;l++)
for(m=0;m<
NDIM;m++){
1613 gcovprim[
GIND(j,k)] = tmpgcov[
GIND(j,k)];
1634 FTYPE ftemp1,ftemp2;
1643 #if(COMPUTEPERTURBEDMETRIC)
1660 else ftemp1=(-1.0 + dxdxp[q][q] * dxdxp[q][q]);
1661 if(q==TT) ftemp1 *=-1.0;
1662 gcovpertprim[q] = (gcovpert[q] * dxdxp[q][q] * dxdxp[q][q]) + ftemp1;
1666 for(l=0;l<
NDIM;l++)
for(m=0;m<
NDIM;m++){
1667 if((l!=q)&&(m!=q)) ftemp2+= gcov[
GIND(l,m)] * dxdxp[l][q] * dxdxp[m][q];
1670 gcovpertprim[q]+=ftemp2;
1678 gcovpertprim[
TT]=gcovprim[
GIND(TT,TT)]-
mink(TT,TT);
1680 gcovpertprim[q]=gcovprim[
GIND(q,q)]-
mink(q,q);
1684 gcovpertprim[
TT]=gcovprim[
GIND(TT,TT)]+1.0;
1685 gcovpertprim[
RR]=gcovprim[
GIND(RR,RR)]-1.0;
1686 gcovpertprim[
TH]=gcovprim[
GIND(TH,TH)]-1.0;
1687 gcovpertprim[
PH]=gcovprim[
GIND(PH,PH)]-1.0;
1693 void transgcov_old(
FTYPE *gcov,
FTYPE (*dxdxp)[NDIM],
FTYPE *gcovprim)
1699 tmpgcov[
GIND(j,k)] = 0.;
1700 for(l=0;l<
NDIM;l++)
for(m=0;m<
NDIM;m++){
1703 tmpgcov[
GIND(j,k)] += gcov[
GIND(l,m)] * dxdxp[l][
j] * dxdxp[m][k];
1708 gcovprim[
GIND(j,k)] = tmpgcov[
GIND(j,k)];
1738 DLOOPA(j) gcovpert[
j] = gcovpertprim[
j];
1773 #define GCOV_DOT_TRANS_DOT_TRANS(a,b) \
1774 gcov[GIND(0,0)] * trans[0][a]* trans[0][b] \
1775 + gcov[GIND(1,1)] * trans[1][a]* trans[1][b] \
1776 + gcov[GIND(2,2)] * trans[2][a]* trans[2][b] \
1777 + gcov[GIND(3,3)] * trans[3][a]* trans[3][b] \
1778 + gcov[GIND(0,1)] * (trans[0][a]* trans[1][b] + trans[1][a]* trans[0][b]) \
1779 + gcov[GIND(0,2)] * (trans[0][a]* trans[2][b] + trans[2][a]* trans[0][b]) \
1780 + gcov[GIND(0,3)] * (trans[0][a]* trans[3][b] + trans[3][a]* trans[0][b]) \
1781 + gcov[GIND(1,2)] * (trans[1][a]* trans[2][b] + trans[2][a]* trans[1][b]) \
1782 + gcov[GIND(1,3)] * (trans[1][a]* trans[3][b] + trans[3][a]* trans[1][b]) \
1783 + gcov[GIND(2,3)] * (trans[2][a]* trans[3][b] + trans[3][a]* trans[2][b])
1801 gcovprim[
GIND(0,1)]=gcovprim[
GIND(1,0)]=tmp[0][1];
1802 gcovprim[
GIND(0,2)]=gcovprim[
GIND(2,0)]=tmp[0][2];
1803 gcovprim[
GIND(0,3)]=gcovprim[
GIND(3,0)]=tmp[0][3];
1804 gcovprim[
GIND(1,2)]=gcovprim[
GIND(2,1)]=tmp[1][2];
1805 gcovprim[
GIND(1,3)]=gcovprim[
GIND(3,1)]=tmp[1][3];
1806 gcovprim[
GIND(2,3)]=gcovprim[
GIND(3,2)]=tmp[2][3];
1819 idxdxprim_ijk_2(ptrgeom, X, V, idxdxp);
1827 for(l=0;l<
NDIM;l++){
1828 for(m=0;m<
NDIM;m++){
1845 void setup_delta(
int whichfun,
int whichdifftype,
FTYPE defaultdelta,
struct of_geom *geom,
struct of_geom (*localptrgeoml)[NDIM],
struct of_geom (*localptrgeomh)[NDIM],
FTYPE *truedelta)
1848 int localwhichdifftype;
1858 if(whichfun==0 || whichfun==1){
1860 localwhichdifftype=0;
1863 localwhichdifftype=1;
1867 dualfprintf(fail_file,
"no such whichfun=%d for whichdifftype=%d",whichfun,whichdifftype);
1873 if(localwhichdifftype==0){
1876 ((*localptrgeoml)[jj]).
p=((*localptrgeomh)[jj]).
p=
NOWHERE;
1878 ((*localptrgeoml)[jj]).i=((*localptrgeomh)[jj]).i=(geom->i);
1879 ((*localptrgeoml)[jj]).j=((*localptrgeomh)[jj]).j=(geom->j);
1880 ((*localptrgeoml)[jj]).k=((*localptrgeomh)[jj]).k=(geom->k);
1883 truedelta[jj]=defaultdelta*
Diffx[jj];
1889 ((*localptrgeoml)[jj]).
p=((*localptrgeomh)[jj]).
p=
CENT;
1893 else if(localwhichdifftype==1){
1900 ((*localptrgeoml)[jj]).
p=((*localptrgeomh)[jj]).
p=
CENT + jj*(N[jj]!=1);
1902 ((*localptrgeoml)[jj]).i=(geom->i);
1903 ((*localptrgeoml)[jj]).j=(geom->j);
1904 ((*localptrgeoml)[jj]).k=(geom->k);
1907 ((*localptrgeomh)[jj]).i=(geom->i) + (jj==1 ?
SHIFT1 : 0);
1908 ((*localptrgeomh)[jj]).j=(geom->j) + (jj==2 ?
SHIFT2 : 0);
1909 ((*localptrgeomh)[jj]).k=(geom->k) + (jj==3 ?
SHIFT3 : 0);
1911 truedelta[jj]=
dx[jj];
1915 dualfprintf(fail_file,
"No localptrgeom defined for p=%d\n",geom->p);
1920 dualfprintf(fail_file,
"No such difftype=%d\n",localwhichdifftype);
1925 dualfprintf(fail_file,
"whichfun=%d whichdifftype=%d localwhichdifftype=%d\n",whichfun,whichdifftype,localwhichdifftype);
1926 DLOOPA(jj) dualfprintf(fail_file,"%d :: truedelta=%21.15g\n",jj,truedelta[jj]);
1927 DLOOPA(jj) dualfprintf(fail_file,"%d :: low: i=%d j=%d k=%d
p=%d :: high: i=%d j=%d k=%d
p=%d\n",jj,((*localptrgeoml)[jj]).i,((*localptrgeoml)[jj]).j,((*localptrgeoml)[jj]).k,((*localptrgeoml)[jj]).
p,((*localptrgeomh)[jj]).i,((*localptrgeomh)[jj]).j,((*localptrgeomh)[jj]).k,((*localptrgeomh)[jj]).p);
2017 #define DELTAFORTIMEh(DELTA) (Xmetricnew[TT]!=Xmetricold[TT] ? (0.0) : 2.0*DELTA)
2018 #define DELTAFORTIMEl(DELTA) (Xmetricnew[TT]!=Xmetricold[TT] ? (-(Xmetricnew[TT]-Xmetricold[TT])) : DELTA)
2020 #define MYDELTAh(DELTA,k) ( k==TT ? DELTAFORTIMEh(DELTA) : +DELTA*0.5 )
2021 #define MYDELTAl(DELTA,k) ( k==TT ? DELTAFORTIMEl(DELTA) : -DELTA*0.5 )
2060 struct of_geom localgeoml[NDIM];
2061 struct of_geom localgeomh[NDIM];
2062 struct of_geom (*localptrgeoml)[NDIM];
2063 struct of_geom (*localptrgeomh)[NDIM];
2065 struct of_geom *localptrgeom=&localgeom;
2066 void setup_delta(
int whichfun,
int whichdifftype,
FTYPE defaultdelta,
struct of_geom *geom,
struct of_geom (*localptrgeoml)[NDIM],
struct of_geom (*localptrgeomh)[NDIM],
FTYPE *truedelta);
2068 int doingmachinebody;
2070 int compute_metricquantities_midlh(
int donormal,
int domachinebody
2072 ,
struct of_geom (*localptrgeoml)[NDIM],
struct of_geom (*localptrgeomh)[NDIM],
FTYPE (*Xlgen)[NDIM],
FTYPE (*Xhgen)[NDIM]
2076 int conndertypelocal;
2089 localptrgeoml=&localgeoml;
2090 localptrgeomh=&localgeomh;
2095 #if(DOEVOLVEMETRIC==1 && CONNDERTYPE==DIFFNUMREC)
2097 dualfprintf(fail_file,
"Not good idea to use DOEVOLVEMETRIC==1 with CONNDERTYPE==DIFFNUMREC\n");
2121 setup_delta(0,conndertypelocal,DELTA,geom,localptrgeoml,localptrgeomh,truedelta);
2125 setup_XlXh(X,truedelta,Xlgen,Xhgen,signdXgen);
2128 compute_metricquantities_midlh(1,doingmachinebody
2129 ,geom, X, gmid, gcovpertmid,&gdetmid,gdetlgen,gdethgen
2130 ,localptrgeoml,localptrgeomh,Xlgen,Xhgen
2131 ,lngdetlgen, lngdethgen, glgen, ghgen, gcovpertlgen, gcovperthgen
2136 setup_XlXh(X,truedelta,Xlgen,Xhgen,signdXgen);
2145 for (k = 0; k <
NDIM; k++) {
2152 conn2[k]= signdXgen[k]*(lngdethgen[k] - lngdetlgen[k]) / (Xhgen[k][k] - Xlgen[k][k]);
2160 for (i = 0; i <
NDIM; i++){
2161 for (j = 0; j <=
i; j++){
2165 conn[
i][
j][k] = signdXgen[k]*(ghgen[k][
GIND(i,j)] - glgen[k][
GIND(i,j)]) / (Xhgen[k][k] - Xlgen[k][k]);
2192 setup_delta(0,
CONNDERTYPE,DELTA,geom,localptrgeoml,localptrgeomh,truedelta);
2196 localptrgeom->i=geom->i;
2197 localptrgeom->j=geom->j;
2198 localptrgeom->k=geom->k;
2202 for (k = 0; k <
NDIM; k++) {
2206 failreturn = dfridr(lngdet_func_mcoord,localptrgeom,X,0,0,k,&value);
2207 if(failreturn==0) conn2[k]=value;
2212 for (i = 0; i <
NDIM; i++){
2213 for (j = 0; j <=
i; j++){
2214 failreturn = dfridr(gcov_func_mcoord,localptrgeom,X,i,j,k,&value);
2215 if(failreturn==0)
conn[
i][
j][k]=value;
2235 for (k = 0; k <
NDIM; k++) {
2236 for (i = 0; i <
NDIM; i++){
2237 for (j = i+1; j <
NDIM; j++){
2249 for (i = 0; i <
NDIM; i++)
2250 for (j = 0; j <
NDIM; j++)
2251 for (k = 0; k <
NDIM; k++)
2261 for (i = 0; i <
NDIM; i++)
2262 for (j = 0; j <
NDIM; j++)
2263 for (k = 0; k <
NDIM; k++) {
2265 for (l = 0; l <
NDIM; l++){
2266 conn[
i][
j][k] += geom->gcon[
GIND(i,l)] * tmp[l][
j][k];
2301 if(doingmachinebody){
2312 setup_delta(0,
DIFFFINITE,DELTA,geom,localptrgeoml,localptrgeomh,truedelta);
2315 setup_XlXh(X,truedelta,Xlgen,Xhgen,signdXgen);
2318 compute_metricquantities_midlh(0,doingmachinebody
2319 ,geom, X, gmid, gcovpertmid,&gdetmid,gdetlgen,gdethgen
2320 ,localptrgeoml,localptrgeomh,Xlgen,Xhgen
2321 ,lngdetlgen, lngdethgen, glgen, ghgen, gcovpertlgen, gcovperthgen
2326 setup_XlXh(X,truedelta,Xlgen,Xhgen,signdXgen);
2341 for (k = 0; k <
NDIM; k++) {
2342 conndiag2[k] = signdXgen[k]*(gdethgen[k] - gdetlgen[k]) / (Xhgen[k][k] - Xlgen[k][k]);
2343 conndiag2[k] /= gdetmid;
2359 for (i = 0; i <
NDIM; i++){
2360 for (j = 0; j <
NDIM; j++){
2361 if(fabs(conndiag2[j])==0.0) ftemp=1.0;
2362 else ftemp=(fabs(conndiag2[j])+
SMALL)/(fabs(conndiag[j])+
SMALL);
2364 if(fabs(ftemp-1.0)>0.5){
2365 dualfprintf(fail_file,
"WARNING: Large correction for machinebody: i=%d j=%d :: i=%d j=%d ftemp=%21.15g :: %21.15g %21.15g :: %21.15g\n",geom->i,geom->j,i,j,ftemp,conndiag[j],conndiag2[j],gdetmid);
2378 sumabsconn[kk]=
SMALL;
2379 DLOOPA(jj) sumabsconn[kk] += fabs(
conn[jj][kk][jj]);
2383 for (i = 0; i <
NDIM; i++){
2384 for (j = 0; j <
NDIM; j++){
2386 dS=conndiag2[
j]-conndiag[
j];
2388 weight=fabs(
conn[i][j][i])/sumabsconn[
j];
2402 if(geom->i==0 || geom->i==-1){
2403 for (i = 0; i <
NDIM; i++)
for (l = 0; l <
NDIM; l++){
2404 dualfprintf(fail_file,
"i=%d gcon[%d][%d]=%21.15g\n",geom->i,i,l,geom->gcon[
GIND(i,l)]);
2406 dualfprintf(fail_file,
"i=%d conn[0][0][0]=%21.15g\n",geom->i,
conn[0][0][0]);
2422 for (k = 0; k <
NDIM; k++) {
2424 for (l = 0; l <
NDIM; l++){
2430 Xhgen[k][k] +=
MYDELTAh(truedelta[k],k);
2431 Xlgen[k][k] +=
MYDELTAl(truedelta[k],k);
2436 if(Xlgen[k][k]>X[k]){
2437 dualfprintf(fail_file,
"Xl in future! Xl=%21.15g Xh=%21.15g\n",Xlgen[k][k],Xhgen[k][k]);
2467 int compute_metricquantities_midlh(
int donormal,
int domachinebody
2469 ,
struct of_geom (*localptrgeoml)[NDIM],
struct of_geom (*localptrgeomh)[NDIM],
FTYPE (*Xlgen)[NDIM],
FTYPE (*Xhgen)[NDIM]
2485 for (k = 0; k <
NDIM; k++) {
2489 lngdethgen[k]=lngdet_func_mcoord(&((*localptrgeomh)[k]),Xhgen[k],0,0);
2490 lngdetlgen[k]=lngdet_func_mcoord(&((*localptrgeoml)[k]),Xlgen[k],0,0);
2493 if(donormal || domachinebody){
2495 gcov_func(&((*localptrgeomh)[k]),1,
MCOORD,Xhgen[k], ghgen[k],gcovperthgen[k]);
2496 gcov_func(&((*localptrgeoml)[k]),1,
MCOORD,Xlgen[k], glgen[k],gcovpertlgen[k]);
2526 return(gcovmcoord[
GIND(i,j)]);
2538 FTYPE *eomfuncptr=eomfunc;
2546 bl_coord_ijk_2(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p, X, V);
2549 if(debugfail>=2) dualfprintf(fail_file,
"Caught gdet_func_metric() issue in lngdet_func_mcoord()\n");
2568 bl_coord_ijk_2(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p, X, V);
2570 if(debugfail>=2) dualfprintf(fail_file,
"Caught gdet_func_metric() issue in gdet_func_mcoord()\n");
2588 bl_coord_ijk_2(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p, X, V);
2590 if(debugfail>=2) dualfprintf(fail_file,
"Caught gdet_func_metric() issue in gdet_func_mcoord_usegcov()\n");
2637 delta[jj][kk]+= ptrgeom->gcov[
GIND(jj,pp)]* ptrgeom->gcon[
GIND(pp,kk)];
2643 dualfprintf(fail_file,
"Problem with metric at i=%d j=%d k=%d loc=%d delta[%d][%d]=%21.15g should be %21.15g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,jj,kk,delta[jj][kk],delta(jj,kk));
2650 dualfprintf(fail_file,
"MAJOR Problem with metric at i=%d j=%d k=%d loc=%d delta[%d][%d]=%21.15g should be %21.15g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,jj,kk,delta[jj][kk],delta(jj,kk));
2659 if (fabs(ptrgeom->gcon[
GIND(TT,TT)]) < SMALL) {
2660 bl_coord_ijk_2(i,j,k,loc,X,V);
2661 dualfprintf(fail_file,
"grid location too near g_{tt}==0: %d %d %d : r=%21.15g th=%21.15g phi=%21.15g : Rin=%21.15g %21.15g\n", i,j,k,V[1],V[2],V[3],
Rin,ptrgeom->gcon[
GIND(TT,TT)]);
2664 if (0 && fabs(ptrgeom->gcon[
GIND(RR,RR)]) < SMALL) {
2665 bl_coord_ijk_2(i,j,k,loc,X,V);
2666 dualfprintf(fail_file,
"grid location too near g^{rr}==0: %d %d %d : r=%21.15g th=%21.15g phi=%21.15g : Rin=%21.15g %21.15g\n", i,j,k,V[1],V[2],V[3],
Rin,ptrgeom->gcon[
GIND(RR,RR)]);
2669 if (0 && fabs(ptrgeom->gcon[
GIND(TH,TH)]) < SMALL) {
2670 bl_coord_ijk_2(i,j,k,loc,X,V);
2671 dualfprintf(fail_file,
"grid location too near g^{\\theta\\theta}==0: %d %d %d : r=%21.15g th=%21.15g phi=%21.15g : Rin=%21.15g %21.15g\n", i,j,k,V[1],V[2],V[3],
Rin,ptrgeom->gcon[
GIND(TH,TH)]);
2674 if (0 && fabs(ptrgeom->gcon[
GIND(PH,PH)]) < SMALL) {
2675 bl_coord_ijk_2(i,j,k,loc,X,V);
2676 dualfprintf(fail_file,
"grid location too near g^{\\phi\\phi}==0: %d %d %d : r=%21.15g th=%21.15g phi=%21.15g : Rin=%21.15g %21.15g\n", i,j,k,V[1],V[2],V[3],
Rin,ptrgeom->gcon[
GIND(PH,PH)]);
2693 void check_rmin(
void)
2707 trifprintf(
"rmin(i=%d,X=%21.15g) = %21.15g\n", i,X[1],r);
2708 trifprintf(
"r=%21.15g Rhor=%21.15g :: rmin/rh: %21.15g\n",r,
Rhor, r / (fabs(
Rhor)+SMALL) );
2710 if(r/(fabs(
Rhor)+SMALL)<=1.0){
2711 trifprintf(
"inner grid is inside horizon\n");
2714 trifprintf(
"inner grid is outside horizon\n");
2727 logfprintf(
"INSIDE Horizon (r=%g): i=%d r=%21.15g\n",
Rhor, i, r);