18 static int prepare_globaldt(
21 FTYPE accdt,
int accdti,
int accdtj,
int accdtk,
22 FTYPE gravitydt,
int gravitydti,
int gravitydtj,
int gravitydtk,
28 static void dUtoU(
int timeorder,
int whichpl,
int i,
int j,
int k,
int loc,
FTYPE *dUgeom,
FTYPE (*dUcomp)[NPR],
FTYPE *dUriemann,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE *Ui,
FTYPE *uf,
FTYPE *ucum);
29 static void dUtoU_check(
int timeorder,
int i,
int j,
int k,
int loc,
int pl,
FTYPE *dUgeom,
FTYPE (*dUcomp)[NPR],
FTYPE *dUriemann,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucum);
36 static FTYPE compute_dissmeasure(
int timeorder,
int i,
int j,
int k,
int loc,
FTYPE *
pr,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE (*F1)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F2)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F3)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE *Ui,
FTYPE *Uf,
FTYPE *tempucum);
80 #if(STOREFLUXSTATE||STORESHOCKINDICATOR)
82 compute_and_store_fluxstatecent(pb);
117 pre_interpolate_and_advance(pb);
127 MYFUN(advance_finitevolume(truestep,stage,pi,pb,pf,pstag,pl_ct, pr_ct, F1, F2, F3, vpot,ui,uf,ucum,CUf,CUnew,fluxdt,boundtime,fluxtime,timeorder,numtimeorders,ndt),
"advance.c:advance()",
"advance_finitevolume()", 1);
132 MYFUN(
advance_standard(truestep,stage,pi,pb,pf,pstag,pl_ct, pr_ct, F1, F2, F3, vpot,ui,uf,ucum,CUf,CUnew,fluxdt,boundtime,fluxtime,timeorder,numtimeorders,ndt),
"advance.c:advance()",
"advance_standard()", 1);
178 int timeorder,
int numtimeorders,
181 FTYPE ndt1, ndt2, ndt3;
185 static SFTYPE dt4diag_willbe=0;
186 int finalstep,initialstep;
187 FTYPE accdt, accdt_ij;
188 int accdti,accdtj,accdtk;
189 FTYPE gravitydt, gravitydt_ij;
190 int gravitydti,gravitydtj,gravitydtk;
206 int whichpltoavg[NPR];
207 int ifnotavgthencopy[NPR];
208 int is,ie,js,je,ks,ke;
209 int doingextrashiftforstag;
255 accdti=accdtj=accdtk=-100;
257 gravitydti=gravitydtj=gravitydtk=-100;
275 if(timeorder==numtimeorders-1){
288 int doflux = (CUf[2]!=0.0 || CUnew[1]!=0.0);
301 dt4diag=dt4diag_willbe;
328 if(doingmetricsubstep()) copy_3dnpr_2ptrs(is,ie,js,je,ks,ke,ucum,ucumformetric,ui);
329 else copy_3dnpr(is,ie,js,je,ks,ke,ucum,ui);
334 if(doingmetricsubstep()) copy_3dnpr(is,ie,js,je,ks,ke,ucum,ucumformetric);
353 if(doflux && truestep){
357 MYFUN(
fluxcalc(stage,initialstep,finalstep,pb,pstag,pl_ct, pr_ct, vpot,F1,F2,F3,CUf,CUnew,fluxdt,fluxtime,&ndt1,&ndt2,&ndt3),
"advance.c:advance_standard()",
"fluxcalcall", 1);
387 if(timeorder==0) init_3dnpr_3ptrs(is, ie, js, je, ks, ke,0.0, uf,tempucum,olduf);
391 #if(WHICHEOM==WITHNOGDET && (NOGDETB1==1 || NOGDETB2==1 || NOGDETB3==1) )
394 dualfprintf(
fail_file,
"Not setup for field source term if staggered field\n");
415 dualfprintf(
fail_file,
"This approach requires B have no source terms.\n");
419 #pragma omp parallel // OPENMPGLOBALPRIVATEFORINVERSION // don't need EOS stuff here since not getting state or doing inversion yet.
434 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
440 flux2dUavg(
DOBPL,i,j,k,F1,F2,F3,dUriemann1,dUriemann2,dUriemann3);
441 PLOOPBONLY(pl) dUriemann[pl]=dUriemann1[pl]+dUriemann2[pl]+dUriemann3[pl];
448 dUtoU(timeorder,
DOBPL,i,j,k,
CENT,dUgeom, dUcomp, dUriemann, CUf, CUnew,
MAC(ui,i,j,k),
MAC(uf,i,j,k),
MAC(tempucum,i,j,k));
469 if(finalstep==1) preupoint=tempucum;
484 if(finalstep==1 && CUnew[2]!=1.0){
524 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
534 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM // <-- only includes more than OPENMPGLOBALPRIVATEFORINVERSION needed for inversion
538 struct of_geom *ptrgeom=&geomdontuse;
552 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
554 int allowlocalfailurefixandnoreport=1;
563 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
577 MYFUN(
get_state(
MAC(pi,i,j,k), ptrgeom, qptr),
"step_ch.c:advance()",
"get_state()", 1);
578 MYFUN(
primtoU(
UEVOLVE,
MAC(pi,i,j,k), qptr, ptrgeom, Uitemp, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
596 flux2dUavg(doother,i,j,k,F1,F2,F3,dUriemann1,dUriemann2,dUriemann3);
597 PLOOP(pliter,pl) dUriemann[pl]=dUriemann1[pl]+dUriemann2[pl]+dUriemann3[pl];
600 PLOOP(pliter,pl) dUriemann[pl]=0.0;
604 FTYPE piorig[NPR],pborig[NPR];
606 piorig[pl] =
MACP0A1(pi,i,j,k,pl);
607 pborig[pl] =
MACP0A1(pb,i,j,k,pl);
634 FTYPE dissmeasure=compute_dissmeasure(timeorder,i,j,k,ptrgeom->p,
MAC(pf,i,j,k),ptrgeom,qptr2,CUf, CUnew, F1, F2, F3,
MAC(ui,i,j,k),
MAC(olduf,i,j,k),
MAC(tempucum,i,j,k));
639 MYFUN(
source(piorig, pborig,
MAC(pf,i,j,k), &didreturnpf, &eomtype, ptrgeom, qptr2,
MAC(ui,i,j,k),
MAC(olduf,i,j,k), CUf, CUimp,dissmeasure, dUriemann, dUcomp, dUgeom),
"step_ch.c:advance()",
"source", 1);
650 #if(ACCURATESOURCEDIAG>=1)
651 diag_source_all(ptrgeom,dUgeom,fluxdt);
653 diag_source_all(ptrgeom,dUgeom,dt4diag);
655 #if(ACCURATESOURCEDIAG>=2)
656 diag_source_comp(ptrgeom,dUcomp,fluxdt);
658 diag_source_comp(ptrgeom,dUcomp,dt4diag);
671 FTYPE ufconsider[NPR],tempucumconsider[NPR];
673 ufconsider[pl]=
MACP0A1(olduf,i,j,k,pl);
674 tempucumconsider[pl]=
MACP0A1(tempucum,i,j,k,pl);
676 dUtoU(timeorder,doother,i,j,k,ptrgeom->p,dUgeom, dUcomp, dUriemann, CUf, CUnew,
MAC(ui,i,j,k), ufconsider, tempucumconsider);
683 FTYPE origolduf[NPR];
687 origolduf[pl] =
MACP0A1(olduf,i,j,k,pl);
688 MACP0A1(olduf,i,j,k,pl) = ufconsider[pl];
694 origolduf[pl] =
MACP0A1(olduf,i,j,k,pl);
695 MACP0A1(olduf,i,j,k,pl) = ufconsider[pl];
705 utoinvert = tempucum;
708 utoinvert1 = tempucumconsider;
709 useducum1 = tempucumconsider;
718 utoinvert1 = ufconsider;
719 useducum1 = tempucumconsider;
740 myupoint1=utoinvert1;
756 eomtypelocal=eomtype;
791 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtypelocal,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UEVOLVE,utoinvert1, qptr2, ptrgeom, dissmeasure, piorig,
MAC(pf,i,j,k),&newtonstats),
"step_ch.c:advance()",
"Utoprimgen", 1);
795 #if(DODISS||DODISSVSR)
815 #if(FIXUPZONES==FIXUP1ZONE)
818 FTYPE utoinvertlocal[NPR];
819 PLOOP(pliter,pl) utoinvertlocal[pl] = utoinvert1[pl];
820 int docorrectucons=0;
821 int didfixup=fixup1zone(docorrectucons,
MAC(pf,i,j,k),utoinvertlocal, ptrgeom,finalstep);
837 MACP0A1(uf,i,j,k,pl)=ufconsider[pl];
838 MACP0A1(tempucum,i,j,k,pl)=tempucumconsider[pl];
850 #if(LIMITDTWITHSOURCETERM)
857 dUtodt(ptrgeom, qptr2,
MAC(pb,i,j,k), dUgeom, dUriemann, dUcomp[
GEOMSOURCE], &accdt_ij, &gravitydt_ij);
867 if(gravitydt_ij<gravitydt){
868 gravitydt=gravitydt_ij;
876 #endif // end if doing LIMITDTWITHSOURCETERM
890 copy_3dnpr_2ptrs(is,ie,js,je,ks,ke,ui,uf,tempucum);
915 if(doingmetricsubstep()){
921 compute_new_metric_substep(CUf,CUnew,pb,ucumformetric);
935 if(doflux && truestep){
944 diag_flux_pureflux(pb,F1, F2, F3, fluxdt);
982 #if(FIXUPZONES==FIXUPALLZONES)
984 fixup(stage,pf,utoinvert,finalstep);
997 prepare_globaldt(truestep,ndt1,ndt2,ndt3,accdt,accdti,accdtj,accdtk,gravitydt,gravitydti,gravitydtj,gravitydtk,ndt);
1019 static FTYPE compute_dissmeasure(
int timeorder,
int i,
int j,
int k,
int loc,
FTYPE *pr,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE (*F1)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F2)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F3)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE *ui,
FTYPE *uf,
FTYPE *tempucum)
1035 tempucumtemp[pl]=tempucum[pl];
1043 #if(EOMRADTYPE!=EOMRADNONE)
1059 specialfrom=plspeciallist[plsp-NPR];
1060 dUgeomtemp[plsp]=0.0;
1061 uitemp[plsp] = uitemp[specialfrom];
1062 uftemp[plsp] = uftemp[specialfrom];
1063 tempucumtemp[plsp] = tempucumtemp[specialfrom];
1069 flux2dUavg(
DOSPECIALPL,i,j,k,F1,F2,F3,dUriemann1temp,dUriemann2temp,dUriemann3temp);
1072 PLOOP(pliter,pl) dUriemanntemp[pl]=dUriemann1temp[pl]+dUriemann2temp[pl]+dUriemann3temp[pl];
1074 dUriemanntemp[plsp]=dUriemann1temp[plsp]+dUriemann2temp[plsp]+dUriemann3temp[plsp];
1080 PLOOP(pliter,pl)
SCLOOP(sc) dUcomptemp[sc][pl]=0.0;
1084 dUtoU(timeorder,
DOSPECIALPL,i,j,k,loc,dUgeomtemp, dUcomptemp, dUriemanntemp, CUf, CUnew, uitemp, uftemp, tempucumtemp);
1095 FTYPE dUdissplusnondiss[NPR];
1096 FTYPE dUnondiss[NPR];
1098 FTYPE dissmeasurepl[NPR];
1102 specialfrom=plspeciallist[plsp-NPR];
1103 dUdissplusnondiss[specialfrom]=(uftemp[specialfrom] - uitemp[specialfrom]);
1104 dUnondiss[specialfrom]=(uftemp[plsp] - uitemp[plsp]);
1105 dUdiss[specialfrom]=dUdissplusnondiss[specialfrom] - dUnondiss[specialfrom];
1107 norm[specialfrom]=
SMALL+(fabs(dUdiss[specialfrom])+fabs(dUnondiss[specialfrom]));
1111 FTYPE actualnorm[NPR];
1113 specialfrom=plspeciallist[plsp-NPR];
1114 if(specialfrom==
RHO || specialfrom==
UU){
1115 actualnorm[specialfrom] =
SMALL + norm[specialfrom];
1117 else if(specialfrom==
B1 || specialfrom==
B2 || specialfrom==
B3){
1121 actualnorm[specialfrom]=0.0;
1125 actualnorm[specialfrom] +=
SMALL+(fabs(dUdiss[pl]*dUdiss[pl])+fabs(dUnondiss[pl]*dUnondiss[pl]));
1127 actualnorm[specialfrom] += fabs(dUdiss[
UU]) + fabs(dUnondiss[
UU]);
1131 else if(specialfrom==URAD0){
1132 actualnorm[specialfrom] =
SMALL + norm[specialfrom];
1142 specialfrom=plspeciallist[plsp-NPR];
1145 if(specialfrom==
RHO) signdiss=+1.0;
1146 else if(specialfrom==
UU) signdiss=-1.0;
1147 else if(specialfrom==
B1 || specialfrom==
B2 || specialfrom==
B3) signdiss=-1.0;
1148 else if(specialfrom==URAD0) signdiss=-1.0;
1151 if(specialfrom==
RHO || specialfrom==
UU || specialfrom==URAD0){
1153 dissmeasurepl[specialfrom] = -signdiss*(dUdiss[specialfrom])/actualnorm[specialfrom];
1155 else if(specialfrom==
B1 || specialfrom==
B2 || specialfrom==
B3){
1157 dissmeasurepl[specialfrom] = -signdiss*(
sign(dUdiss[specialfrom])*dUdiss[specialfrom]*dUdiss[specialfrom])/actualnorm[specialfrom];
1166 GLOBALMACP0A1(dissmeasurearray,i,j,k,plsp-NPR)=dissmeasurepl[specialfrom];
1176 if(truenspecial==1){
1181 else if(truenspecial>=5){
1185 FTYPE dissmeasurefield=dissmeasurepl[
B1];
1186 dissmeasurefield=
MIN(dissmeasurefield,dissmeasurepl[
B2]);
1187 dissmeasurefield=
MIN(dissmeasurefield,dissmeasurepl[
B3]);
1190 dissmeasure=
MIN(dissmeasure,10.0*
NUMEPSILON+dissmeasurefield);
1195 calc_tautot(pr, ptrgeom, NULL, tautot, &tautotmax);
1199 dissmeasure =
MIN(dissmeasure,dissmeasurepl[
SPECIALPL6])*dissswitch + dissmeasure*(1.0-dissswitch);
1205 GLOBALMACP0A1(dissmeasurearray,ptrgeom->i,ptrgeom->j,ptrgeom->k,
NSPECIAL)=dissmeasure;
1213 return(dissmeasure);
1253 int timeorder,
int numtimeorders,
1256 FTYPE ndt1, ndt2, ndt3;
1260 static SFTYPE dt4diag_willbe=0;
1261 int finalstep,initialstep;
1262 FTYPE accdt, accdt_ij;
1263 int accdti,accdtj,accdtk;
1264 FTYPE gravitydt, gravitydt_ij;
1265 int gravitydti,gravitydtj,gravitydtk;
1275 int whichpltoavg[NPR];
1276 int ifnotavgthencopy[NPR];
1277 int is,ie,js,je,ks,ke;
1278 int doingextrashiftforstag;
1316 accdti=accdtj=accdtk=-100;
1318 gravitydti=gravitydtj=gravitydtk=-100;
1326 dualfprintf(
fail_file,
"pi in advance\n");
1329 dualfprintf(
fail_file,
"pb in advance\n");
1345 if(timeorder==numtimeorders-1){
1357 int doflux = (CUf[2]!=0.0 || CUnew[1]!=0.0);
1371 dt4diag=dt4diag_willbe;
1398 if(doingmetricsubstep()) copy_3dnpr_2ptrs(is,ie,js,je,ks,ke,ucum,ucumformetric,ui);
1399 else copy_3dnpr(is,ie,js,je,ks,ke,ucum,ui);
1404 if(doingmetricsubstep()) copy_3dnpr(is,ie,js,je,ks,ke,ucum,ucumformetric);
1422 if(doflux && truestep){
1427 MYFUN(
fluxcalc(stage,initialstep,finalstep,pb,pstag,pl_ct, pr_ct, vpot,F1,F2,F3,CUf,CUnew,fluxdt,fluxtime,&ndt1,&ndt2,&ndt3),
"advance.c:advance_standard_orig()",
"fluxcalcall", 1);
1433 ndt1donor=ndt2donor=ndt3donor=
BIG;
1434 MYFUN(
fluxcalc_donor(stage,pb,pstag,pl_ct, pr_ct, vpot,
GLOBALPOINT(F1EM),
GLOBALPOINT(F2EM),
GLOBALPOINT(F3EM),CUf,CUnew,fluxdt,fluxtime,&ndt1donor,&ndt2donor,&ndt3donor),
"advance.c:advance_standard_orig()",
"fluxcalcall", 1);
1438 int i,
j,k,pl,pliter;
1441 if(
N1>1)
MACP0A1(F1,i,j,k,pl)=GLOBALMACP0A1(F1EM,i,j,k,pl);
1442 if(
N2>1)
MACP0A1(F2,i,j,k,pl)=GLOBALMACP0A1(F2EM,i,j,k,pl);
1443 if(
N3>1)
MACP0A1(F3,i,j,k,pl)=GLOBALMACP0A1(F3EM,i,j,k,pl);
1455 int i,
j,k,pliter,pl;
1457 dualfprintf(
fail_file,
"ndt1orig=%21.15g ndt1new=%21.15g ndt2orig=%21.15g ndt2new=%21.15g\n",ndt1,ndt1donor,ndt2,ndt2donor);
1459 if(i==390 && j==1 && k==0){
1460 dualfprintf(
fail_file,
"i=%d j=%d k=%d\n",i,j,k);
1461 PLOOP(pliter,pl) dualfprintf(
fail_file,
" pl=%d F1orig=%21.15g F1new=%21.15g :: F2orig=%21.15g F2new=%21.15g \n",pl,
MACP0A1(F1,i,j,k,pl),GLOBALMACP0A1(F1EM,i,j,k,pl),
MACP0A1(F2,i,j,k,pl),GLOBALMACP0A1(F2EM,i,j,k,pl));
1469 int i,
j,k,pliter,pl;
1473 dualfprintf(
fail_file,
"ndt1orig=%21.15g ndt1new=%21.15g ndt2orig=%21.15g ndt2new=%21.15g\n",ndt1,ndt1donor,ndt2,ndt2donor);
1476 diff1=fabs(
MACP0A1(F1,i,j,k,pl)-GLOBALMACP0A1(F1EM,i,j,k,pl));
1477 sum1=fabs(
MACP0A1(F1,i,j,k,pl))+fabs(GLOBALMACP0A1(F1EM,i,j,k,pl))+
SMALL;
1478 diff2=fabs(
MACP0A1(F2,i,j,k,pl)-GLOBALMACP0A1(F2EM,i,j,k,pl));
1479 sum2=fabs(
MACP0A1(F2,i,j,k,pl))+fabs(GLOBALMACP0A1(F2EM,i,j,k,pl))+
SMALL;
1481 dualfprintf(
fail_file,
"i=%d j=%d k=%d\n",i,j,k);
1482 dualfprintf(
fail_file,
" pl=%d diff1/sum1=%21.15g F1orig=%21.15g F1new=%21.15g :: diff2/sum2=%21.15g F2orig=%21.15g F2new=%21.15g \n",pl,diff1/sum1,
MACP0A1(F1,i,j,k,pl),GLOBALMACP0A1(F1EM,i,j,k,pl),diff2/sum2,
MACP0A1(F2,i,j,k,pl),GLOBALMACP0A1(F2EM,i,j,k,pl));
1525 if(timeorder==0) init_3dnpr_2ptrs(is, ie, js, je, ks, ke,0.0, uf,tempucum);
1529 #if(WHICHEOM==WITHNOGDET && (NOGDETB1==1 || NOGDETB2==1 || NOGDETB3==1) )
1532 dualfprintf(
fail_file,
"Not setup for field source term if staggered field\n");
1538 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM
1540 int pl,pliter,
i,
j,k;
1542 struct of_geom *ptrgeom=&geomdontuse;
1556 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1570 MYFUN(
get_state(
MAC(pi,i,j,k), ptrgeom, qptr),
"step_ch.c:advance()",
"get_state()", 1);
1571 MYFUN(
primtoU(
UEVOLVE,
MAC(pi,i,j,k), qptr, ptrgeom, Uitemp, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
1585 flux2dUavg(
DOALLPL,i,j,k,F1,F2,F3,dUriemann1,dUriemann2,dUriemann3);
1586 PLOOP(pliter,pl) dUriemann[pl]=dUriemann1[pl]+dUriemann2[pl]+dUriemann3[pl];
1589 PLOOP(pliter,pl) dUriemann[pl]=0.0;
1622 MYFUN(
source(
MAC(pi,i,j,k),
MAC(pb,i,j,k),
MAC(pf,i,j,k), &didreturnpf, &eomtype, ptrgeom, qptr2,
MAC(ui,i,j,k),
MAC(uf,i,j,k), CUf, CUimp, 0.0, dUriemann, dUcomp, dUgeom),
"step_ch.c:advance()",
"source", 1);
1636 #if(ACCURATESOURCEDIAG>=1)
1637 diag_source_all(ptrgeom,dUgeom,fluxdt);
1639 diag_source_all(ptrgeom,dUgeom,dt4diag);
1641 #if(ACCURATESOURCEDIAG>=2)
1642 diag_source_comp(ptrgeom,dUcomp,fluxdt);
1644 diag_source_comp(ptrgeom,dUcomp,dt4diag);
1652 dUtoU(timeorder,
DOALLPL, i,j,k,ptrgeom->p,dUgeom, dUcomp, dUriemann, CUf, CUnew,
MAC(ui,i,j,k),
MAC(uf,i,j,k),
MAC(tempucum,i,j,k));
1657 #if(LIMITDTWITHSOURCETERM)
1664 dUtodt(ptrgeom, qptr2,
MAC(pb,i,j,k), dUgeom, dUriemann, dUcomp[
GEOMSOURCE], &accdt_ij, &gravitydt_ij);
1666 #pragma omp critical
1674 if(gravitydt_ij<gravitydt){
1675 gravitydt=gravitydt_ij;
1683 #endif // end if doing LIMITDTWITHSOURCETERM
1694 PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,0*NPR + pl)=dUgeom[pl];
1696 if(
N1>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,1*NPR + pl)=dUriemann1[pl];
1697 else PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,1*NPR + pl)=0.0;
1699 if(
N2>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,2*NPR + pl)=dUriemann2[pl];
1700 else PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,2*NPR + pl)=0.0;
1702 if(
N3>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,3*NPR + pl)=dUriemann3[pl];
1703 else PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,3*NPR + pl)=0.0;
1715 copy_3dnpr_2ptrs(is,ie,js,je,ks,ke,ui,uf,tempucum);
1740 if(doingmetricsubstep()){
1746 compute_new_metric_substep(CUf,CUnew,pb,ucumformetric);
1759 if(doflux && truestep){
1768 diag_flux_pureflux(pb,F1, F2, F3, fluxdt);
1836 field_integrate_fluxrecon(stage, pb, utoinvert, myupoint);
1876 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
1878 #pragma omp parallel OPENMPGLOBALPRIVATEFORINVERSION
1880 int pl,pliter,
i,
j,k;
1882 struct of_geom *ptrgeom=&geomdontuse;
1883 FTYPE prbefore[NPR];
1884 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
1886 int allowlocalfailurefixandnoreport=1;
1897 #pragma omp for schedule(OPENMPVARYENDTIMESCHEDULE(),OPENMPCHUNKSIZE(blocksize)) reduction(+: nstroke)
1914 FTYPE dissmeasure=-1.0;
1920 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UEVOLVE,
MAC(myupoint,i,j,k), NULL, ptrgeom, dissmeasure,
MAC(pi,i,j,k),
MAC(pf,i,j,k),&newtonstats),
"step_ch.c:advance()",
"Utoprimgen", 1);
1924 #if(DODISS||DODISSVSR)
1926 diss_compute(
EVOLVEUTOPRIM,
UEVOLVE,
MAC(myupoint,i,j,k),ptrgeom,prbefore,
MAC(pf,i,j,k),&newtonstats);
1931 FTYPE dissmeasure=-1.0;
1937 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UEVOLVE,
MAC(myupoint,i,j,k), NULL, ptrgeom, dissmeasure,
MAC(pi,i,j,k),
MAC(pf,i,j,k),&newtonstats),
"step_ch.c:advance()",
"Utoprimgen", 1);
1951 #if(FIXUPZONES==FIXUP1ZONE)
1954 int docorrectucons=0;
1955 MYFUN(fixup1zone(docorrectucons,
MAC(pf,i,j,k),
MAC(useducum,i,j,k), ptrgeom,finalstep),
"fixup.c:fixup()",
"fixup1zone()", 1);
1973 dualfprintf(
fail_file,
"useducum in advance\n");
1974 asym_compute_2(useducum);
1993 #if(FIXUPZONES==FIXUPALLZONES)
1994 fixup(stage,pf,useducum,finalstep);
2006 prepare_globaldt(truestep,ndt1,ndt2,ndt3,accdt,accdti,accdtj,accdtk,gravitydt,gravitydti,gravitydtj,gravitydtk,ndt);
2035 static int advance_finitevolume(
2053 int timeorder,
int numtimeorders,
2057 FTYPE ndt1, ndt2, ndt3;
2061 static SFTYPE dt4diag_willbe=0;
2062 int finalstep,initialstep;
2063 FTYPE accdt, accdt_ij;
2064 int accdti,accdtj,accdtk;
2065 FTYPE gravitydt, gravitydt_ij;
2066 int gravitydti,gravitydtj,gravitydtk;
2077 int whichpltoavg[NPR];
2078 int ifnotavgthencopy[NPR];
2079 int docons,dosource;
2081 int is,ie,js,je,ks,ke;
2082 int doingextrashiftforstag;
2111 dosource*=(
DOENOFLUX == ENOFINITEVOLUME);
2130 accdti=accdtj=accdtk=-100;
2132 gravitydti=gravitydtj=gravitydtk=-100;
2147 if(timeorder==numtimeorders-1){
2159 int doflux = (CUf[2]!=0.0 || CUnew[1]!=0.0);
2171 dt4diag=dt4diag_willbe;
2208 if(doingmetricsubstep()) copy_3dnpr_2ptrs(is,ie,js,je,ks,ke,ucum,ucumformetric,ui);
2209 else copy_3dnpr(is,ie,js,je,ks,ke,ucum,ui);
2214 if(doingmetricsubstep()) copy_3dnpr(is,ie,js,je,ks,ke,ucum,ucumformetric);
2230 if(doflux && truestep){
2232 MYFUN(
fluxcalc(stage,initialstep,finalstep,pb,pstag,pl_ct, pr_ct, vpot,F1,F2,F3,CUf,CUnew,fluxdt,fluxtime,&ndt1,&ndt2,&ndt3),
"advance.c:advance_standard_orig()",
"fluxcalcall", 1);
2262 copy_3dnpr_fullloop(pb,pf);
2275 #if(WHICHEOM==WITHNOGDET && (NOGDETB1==1 || NOGDETB2==1 || NOGDETB3==1) )
2278 dualfprintf(
fail_file,
"Not setup for field source term if staggered field\n");
2286 #pragma omp parallel
2288 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM
2291 int i,
j,k,pl,pliter;
2294 struct of_geom *ptrgeom=&geomdontuse;
2303 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
2321 flux2dUavg(
DOALLPL,i,j,k,F1,F2,F3,dUriemann1,dUriemann2,dUriemann3);
2322 PLOOP(pliter,pl) dUriemann[pl]=dUriemann1[pl]+dUriemann2[pl]+dUriemann3[pl];
2325 PLOOP(pliter,pl) dUriemann[pl]=0.0;
2330 MYFUN(
source(
MAC(pi,i,j,k),
MAC(pb,i,j,k),
MAC(pf,i,j,k), &didreturnpf, &eomtype, ptrgeom, qptr,
MAC(ui,i,j,k),
MAC(uf,i,j,k), CUf, CUimp, 0.0, dUriemann, dUcomp,
MAC(dUgeomarray,i,j,k)),"
step_ch.c:
advance()", "
source", 1);
2340 #pragma omp critical // since diagnostics store in same global cumulative variables
2343 #if(ACCURATESOURCEDIAG>=2)
2344 diag_source_comp(ptrgeom,dUcomp,fluxdt);
2346 diag_source_comp(ptrgeom,dUcomp,dt4diag);
2383 #pragma omp parallel
2385 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM
2388 int i,
j,k,pl,pliter;
2392 struct of_geom *ptrgeom=&geomdontuse;
2401 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
2432 PLOOP(pliter,pl) dUgeom[pl]=
MACP0A1(dUgeomarray,i,j,k,pl);
2441 #pragma omp critical // since diagnostics store in same global cumulative variables
2444 #if(ACCURATESOURCEDIAG>=1)
2445 diag_source_all(ptrgeom,dUgeom,fluxdt);
2447 diag_source_all(ptrgeom,dUgeom,dt4diag);
2456 flux2dUavg(
DOALLPL,i,j,k,F1,F2,F3,dUriemann1,dUriemann2,dUriemann3);
2457 PLOOP(pliter,pl) dUriemann[pl]=dUriemann1[pl]+dUriemann2[pl]+dUriemann3[pl];
2460 PLOOP(pliter,pl) dUriemann[pl]=0.0;
2471 dUtoU(timeorder,
DOALLPL, i,j,k,ptrgeom->p,dUgeom, dUcomp, dUriemann, CUf, CUnew,
MAC(ui,i,j,k),
MAC(uf,i,j,k),
MAC(tempucum,i,j,k));
2475 #if(LIMITDTWITHSOURCETERM)
2479 MYFUN(
source(
MAC(pi,i,j,k),
MAC(pb,i,j,k),
MAC(pf,i,j,k), &didreturnpf, &eomtype, ptrgeom, qptr,
MAC(ui,i,j,k),
MAC(uf,i,j,k), CUf, CUimp, 0.0, dUriemann, dUcomp, &fdummy),
"step_ch.c:advance()",
"source", 2);
2482 dUtodt(ptrgeom, qptr,
MAC(pb,i,j,k), dUgeom, dUriemann, dUcomp[
GEOMSOURCE], &accdt_ij, &gravitydt_ij);
2488 #pragma omp critical
2496 if(gravitydt_ij<gravitydt){
2497 gravitydt=gravitydt_ij;
2509 PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,0*NPR + pl)=dUgeom[pl];
2511 if(
N1>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,1*NPR + pl)=dUriemann1[pl];
2512 else
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,1*NPR + pl)=0.0;
2514 if(
N2>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,2*NPR + pl)=dUriemann2[pl];
2515 else
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,2*NPR + pl)=0.0;
2517 if(
N3>1)
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,3*NPR + pl)=dUriemann3[pl];
2518 else
PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,3*NPR + pl)=0.0;
2544 compute_new_metric_substep(CUf,CUnew,pb,ucumformetric);
2555 if(doflux && truestep){
2564 diag_flux_pureflux(pb,F1, F2, F3, fluxdt);
2662 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
2664 #pragma omp parallel OPENMPGLOBALPRIVATEFORINVERSION
2666 int i,
j,k,pl,pliter;
2667 FTYPE prbefore[NPR];
2669 struct of_geom *ptrgeom=&geomdontuse;
2670 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
2672 int allowlocalfailurefixandnoreport=1;
2681 newtonstats.nstroke=newtonstats.lntries=0;
2683 ptrgeom=&geomdontuse;
2685 #pragma omp for schedule(OPENMPVARYENDTIMESCHEDULE(),OPENMPCHUNKSIZE(blocksize)) reduction(+: nstroke)
2701 int dissmeasure=-1.0;
2707 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UEVOLVE,
MAC(myupoint,i,j,k), NULL, ptrgeom, dissmeasure,
MAC(pi,i,j,k),
MAC(pf,i,j,k),&newtonstats),"
step_ch.c:advance()", "
Utoprimgen", 1);
2712 MYFUN(check_point_vs_average(timeorder, numtimeorders,
GLOBALMAC(pflag,i,j,k),
MAC(pb,i,j,k),
MAC(pf,i,j,k),
MAC(myupoint,i,j,k),
MAC(utoinvert,i,j,k),ptrgeom,&newtonstats),
"advance.c:advance_finitevolume()",
"check_point_vs_average()", 1);
2716 #if(DODISS||DODISSVSR)
2719 diss_compute(EVOLVEUTOPRIM,UEVOLVE,
MAC(useducum,i,j,k),ptrgeom,prbefore,
MAC(pf,i,j,k),&newtonstats);
2730 #if(FIXUPZONES==FIXUP1ZONE)
2733 int docorrectucons=0;
2734 MYFUN(fixup1zone(docorrectucons,
MAC(pf,i,j,k),
MAC(useducum,i,j,k), ptrgeom, finalstep),
"advance.c:advance_finitevolume()",
"fixup1zone()", 1);
2756 #if(FIXUPZONES==FIXUPALLZONES)
2757 fixup(stage,pf,useducum,finalstep);
2769 prepare_globaldt(truestep,ndt1,ndt2,ndt3,accdt,accdti,accdtj,accdtk,gravitydt,gravitydti,gravitydtj,gravitydtk,ndt);
2784 static int prepare_globaldt(
2787 FTYPE accdt,
int accdti,
int accdtj,
int accdtk,
2788 FTYPE gravitydt,
int gravitydti,
int gravitydtj,
int gravitydtk,
2817 #if(USEGRAVITYDTINDTLIMIT)
2819 *ndt =
MIN(*ndt,gravitydt);
2839 logdtfprintf(
"nstep=%ld steppart=%d :: dt=%g ndt=%g ndt1=%g ndt2=%g ndt3=%g\n",
nstep,
steppart,
dt,*ndt,ndt1,ndt2,ndt3);
2841 logdtfprintf("accdt=%g (accdti=%d accdtj=%d accdtk=%d) :: gravitydt=%g (gravitydti=%d gravitydtj=%d gravitydtk=%d) ::
gravityskipstep=%d\n",accdt,accdti,accdtj,accdtk,gravitydt,gravitydti,gravitydtj,gravitydtk,
gravityskipstep);
2868 PFTYPE invert_from_point_flag, invert_from_average_flag;
2869 FTYPE frac_avg_used;
2871 int is_convergence_failure;
2876 int allowlocalfailurefixandnoreport=1;
2882 finalstep=timeorder == numtimeorders-1;
2887 if(avgschemeatall==0)
return(0);
2894 dualfprintf(
fail_file,
"t = %g, nstep = %ld, steppart = %d, i = %d, j = %d, rho = %21.15g, u = %21.15g, fracneg = %21.15g\n",
2896 pf[
RHO], pf[
UU], (pf[RHO]>0)?(-pf[UU]/(pf[RHO]+DBL_MIN)):(-pf[RHO]/(pf[UU]+DBL_MIN)) );
2911 PLOOP(pliter,pl) pavg[pl] = pb[pl];
2913 int dissmeasure=-1.0;
2914 int whichcap=CAPTYPEBASIC;
2915 int whichmethod=MODEPICKBEST;
2917 int checkoninversiongas=CHECKONINVERSION;
2918 int checkoninversionrad=CHECKONINVERSIONRAD;
2919 MYFUN(Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,EVOLVEUTOPRIM, UEVOLVE, uavg, NULL, ptrgeom, dissmeasure, pavg, pavg,newtonstats),"
step_ch.c:advance()", "Utoprimgen", 3);
2921 invert_from_average_flag = GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
2931 #if( DOENODEBUG ) //atch debug; note that use the location with pl =0 , interporflux = 0, & dir = 1 since limiting the change in prim quantities is not a per-component operation
2932 if( frac_avg_used > 0.01 ) {
2933 MACP0A4(enodebugarray,ptrgeom->i,ptrgeom->j,ptrgeom->k,1-1,0,0,ENODEBUGPARAM_LIMCORR_PRIM)++;
2937 if( pf[
UU] < 0.0 && timeorder == numtimeorders-1 ) {
2950 frac_avg_used = 0.0;
2968 if((timeorder==numtimeorders-1 ) ||
2970 ( 1 == is_convergence_failure ) ||
2972 ( (timeorder<numtimeorders-1) && (
2979 if(debugfail >= 1) {
2980 dualfprintf(
fail_file,
"Inversion from the point value failed. Using the inversion from the average value.\n" );
2984 PLOOP(pliter,pl) pf[pl] = pb[pl];
2986 int dissmeasure=-1.0;
2987 int whichcap=CAPTYPEBASIC;
2988 int whichmethod=MODEPICKBEST;
2990 int checkoninversiongas=CHECKONINVERSION;
2991 int checkoninversionrad=CHECKONINVERSIONRAD;
2992 MYFUN(Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,EVOLVEUTOPRIM, UEVOLVE, uavg, NULL, ptrgeom, dissmeasure, pb, pf,newtonstats),"
step_ch.c:advance()", "Utoprimgen", 3);
3003 frac_avg_used = 1.0;
3007 frac_avg_used = 0.0;
3018 #define COMPARE_GAMMA 0
3025 FTYPE gammain = 0.0, gammaout = 0.0;
3026 FTYPE frac_start, frac_end, frac_diff;
3027 FTYPE fraction_input_value;
3028 FTYPE comovingenergyin, comovingenergyout;
3033 FTYPE bdotuin, bdotuout;
3036 #if( COMPARE_GAMMA )
3037 gamma_calc( pin, geom, &gammain );
3038 gamma_calc( pout, geom, &gammaout );
3047 bdotuin = 0.0;
DLOOPA(jj) bdotuin+=(qin.
ucov[jj])*(qin.
bcon[jj]);
3048 bdotuout = 0.0;
DLOOPA(jj) bdotuout+=(qout.
ucov[jj])*(qout.
bcon[jj]);
3051 comovingenergyin = pin[
RHO] + pin[
UU] + bsqin*0.5 - bdotuin*bdotuin;
3052 comovingenergyout = pout[
RHO] + pout[
UU] + bsqout*0.5 - bdotuout*bdotuout;
3056 #if( COMPARE_GAMMA )
3064 frac_start = 0.5 * fractional_difference_threshold;
3067 frac_end = fractional_difference_threshold;
3070 fraction_input_value =
MAX( 0.,
MIN(1., (frac_diff - frac_start)/(frac_end - frac_start) ) );
3072 if( 0.0 != fraction_input_value ){
3074 dualfprintf(
fail_file,
"States are too different, using %3d%% of the average values: i = %d, j = %d, k = %d, nstep = %ld, steppart = %d, t = %21.15g\n",
3075 (
int)(100. * fraction_input_value), geom->i, geom->j, geom->k,
nstep,
steppart,
t );
3076 if( debugfail >= 2 ){
3077 dualfprintf(
fail_file,
"Prim. pt. value (gamma, rho, u): " );
3078 dualfprintf(
fail_file,
"%21.15g %21.15g %21.15g\n", gammaout, pout[
RHO], pout[
UU] );
3079 dualfprintf(
fail_file,
"Prim. avg value (gamma, rho, u): " );
3080 dualfprintf(
fail_file,
"%21.15g %21.15g %21.15g\n", gammain, pin[RHO], pin[UU] );
3081 dualfprintf(
fail_file,
"Frac. difference(ganna, rho, u): " );
3082 dualfprintf(
fail_file,
"%21.15g %21.15g %21.15g\n",
3091 pout[pl] = fraction_input_value * pin[pl] + (1. - fraction_input_value) * pout[pl];
3094 return( fraction_input_value );
3104 frac_diff = 2. * fabs( a - b ) / ( fabs(a) + fabs(b) + DBL_MIN );
3106 return( frac_diff );
3137 FTYPE idx1,idx2,idx3;
3236 FTYPE lowerF2,upperF2;
3237 #if(IF3DSPCTHENMPITRANSFERATPOLE==1)
3250 #if(IF3DSPCTHENMPITRANSFERATPOLE==1)
3251 if(pl!=
B2 && preconditionF2lower) lowerF2=0.0;
3253 if(pl!=
B2 && preconditionF2upper) upperF2=0.0;
3293 static void dUtoU(
int timeorder,
int whichpl,
int i,
int j,
int k,
int loc,
FTYPE *dUgeom,
FTYPE (*dUcomp)[NPR],
FTYPE *dUriemann,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucum)
3296 void dUtoU_check(
int timeorder,
int i,
int j,
int k,
int loc,
int pl,
FTYPE *dUgeom,
FTYPE (*dUcomp)[NPR],
FTYPE *dUriemann,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucum);
3314 if(pl<NPR) dUrad[pl] = dUcomp[sc][pl];
3317 dUnonrad[pl] = dUgeom[pl] - dUrad[pl];
3324 PLOOP(pliter,pl) dUradall[pl][ii]=0.0;
3339 for(ii=0;ii<=timeorder;ii++){
3354 PALLLOOPSPECIAL(pl,special) Uf[pl] = UFSET(CUf,
dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3359 PALLLOOPSPECIAL(pl,special) ucum[pl] += UCUMUPDATE(CUnew,dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3363 PLOOP(pliter,pl) dUtoU_check(timeorder,i,j,k,loc,pl, dUgeom, dUcomp, dUriemann, CUf, CUnew, Ui, Uf, ucum);
3368 else if(whichpl==
DOBPL){
3369 PLOOPBONLY(pl) Uf[pl] = UFSET(CUf,dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3370 PLOOPBONLY(pl) ucum[pl] += UCUMUPDATE(CUnew,dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3373 PALLLOOPSPECIAL(pl,special) if(!
BPL(pl)) Uf[pl] = UFSET(CUf,dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3374 PALLLOOPSPECIAL(pl,special) if(!
BPL(pl)) ucum[pl] += UCUMUPDATE(CUnew,dt,Ui[pl],Uf[pl],dUriemann[pl],dUnonrad[pl],dUradall[pl]);
3387 static
void dUtoU_check(
int timeorder,
int i,
int j,
int k,
int loc,
int pl,
FTYPE *dUgeom,
FTYPE (*dUcomp)[NPR],
FTYPE *dUriemann,
FTYPE *CUf,
FTYPE *CUnew,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucum)
3397 dualfprintf(
fail_file,
"dUtoU after: nan found for Uf[%d]=%21.15g\n",pl,Uf[pl]);
3398 dualfprintf(
fail_file,
"pl=%d Ui=%21.15g dUriemann=%21.15g dugeom=%21.15g\n",pl,Ui[pl],dUriemann[pl],dUgeom[pl]);
3402 dualfprintf(
fail_file,
"dUtoU after: nan found for ucum[%d]=%21.15g\n",pl,ucum[pl]);
3403 dualfprintf(
fail_file,
"pl=%d Ui=%21.15g dUriemann=%21.15g dugeom=%21.15g\n",pl,Ui[pl],dUriemann[pl],dUgeom[pl]);
3417 void ucum_check(
int i,
int j,
int k,
int loc,
int pl,
FTYPE *ucum)
3426 dualfprintf(
fail_file,
"ucum_check: nan found at i=%d j=%d k=%d loc=%d for ucum[pl=%d]=%21.15g\n",i,j,k,loc,pl,ucum[pl]);
3441 dualfprintf(
fail_file,
"pl=%d i=%d j=%d k=%d :: F1[i]=%21.15g F1[i+1]=%21.15g dF1/dx1=%21.15g \n",pl,i,j,k,
MACP0A1(F1,i,j,k,pl),
MACP0A1(F1,i+
SHIFT1,j,k,pl),(
MACP0A1(F1,i+
SHIFT1,j,k,pl)-
MACP0A1(F1,i,j,k,pl))/
dx[1]);
3444 dualfprintf(
fail_file,
"pl=%d i=%d j=%d k=%d :: F2[j]=%21.15g F2[j+1]=%21.15g dF2/dx2=%21.15g\n",pl,i,j,k,
MACP0A1(F2,i,j,k,pl),
MACP0A1(F2,i,j+
SHIFT2,k,pl),(
MACP0A1(F2,i,j+
SHIFT2,k,pl)-
MACP0A1(F2,i,j,k,pl))/
dx[2]);
3447 dualfprintf(
fail_file,
"pl=%d i=%d j=%d k=%d :: F3[k]=%21.15g F3[k+1]=%21.15g dF3/dx3=%21.15g \n",pl,i,j,k,
MACP0A1(F3,i,j,k,pl),
MACP0A1(F3,i,j,k+
SHIFT3,pl),(
MACP0A1(F3,i,j,k+
SHIFT3,pl)-
MACP0A1(F3,i,j,k,pl))/
dx[3]);
3460 struct of_geom *ptrgeom=&geomdontuse;
3464 int dir,ignorecourant;
3469 int accdti,accdtj,accdtk;
3470 int gravitydti,gravitydtj,gravitydtk;
3471 FTYPE tempwavedt,tempaccdt,tempgravitydt;
3474 FTYPE wavedt_1,wavedt_2,wavedttemp;
3478 int *waveenerpos, *sourceenerpos;
3480 FTYPE dUriemann[NPR];
3481 FTYPE Ugeomfree[NPR],U[NPR];
3486 wavedt_1=wavedt_2=wavedt=accdt=gravitydt=ndtfinal=
BIG;
3487 wavendt[1]=wavendt[2]=wavendt[3]=
BIG;
3488 wavendti[1]=wavendtj[1]=wavendtk[1]=-100;
3489 wavendti[2]=wavendtj[2]=wavendtk[2]=-100;
3490 wavendti[3]=wavendtj[3]=wavendtk[3]=-100;
3491 accdti=accdtj=accdtk=-100;
3492 gravitydti=gravitydtj=gravitydtk=-100;
3506 MYFUN(
get_state(
MAC(prim,i,j,k), ptrgeom, &state),
"advance.c:set_dt()",
"get_state()", 1);
3511 MYFUN(
vchar_all(
MAC(prim,i,j,k), &state, dir, ptrgeom, &cmax1, &cmin1,&ignorecourant),
"advance.c:set_dt()",
"vchar_all() dir=1", 1);
3512 dtij[dir] =
cour *
dx[dir] /
MAX(fabs(cmax1),fabs(cmin1));
3514 dtij[dir] =
cour*
dx[dir]*sqrt(ptrgeom->gcov[
GIND(dir,dir)]);
3516 if (dtij[dir] < wavendt[dir]){
3517 wavendt[dir] = dtij[dir];
3526 MYFUN(
vchar_all(
MAC(prim,i,j,k), &state, dir, ptrgeom, &cmax2, &cmin2,&ignorecourant),
"advance.c:set_dt()",
"vchar_all() dir=2", 1);
3527 dtij[dir] =
cour *
dx[dir] /
MAX(fabs(cmax2),fabs(cmin2));
3529 dtij[dir] =
cour*
dx[dir]*sqrt(ptrgeom->gcov[
GIND(dir,dir)]);
3531 if (dtij[dir] < wavendt[dir]){
3532 wavendt[dir] = dtij[dir];
3541 MYFUN(
vchar_all(
MAC(prim,i,j,k), &state, dir, ptrgeom, &cmax3, &cmin3,&ignorecourant),
"restart.c:set_dt()",
"vchar_all() dir=3", 1);
3542 dtij[dir] =
cour *
dx[dir] /
MAX(fabs(cmax3),fabs(cmin3));
3544 dtij[dir] =
cour*
dx[dir]*sqrt(ptrgeom->gcov[
GIND(dir,dir)]);
3546 if (dtij[dir] < wavendt[dir]){
3547 wavendt[dir] = dtij[dir];
3557 wavedttemp =
MINDTSET(dtij[1],dtij[2],dtij[3]);
3558 if(wavedttemp<wavedt_2) wavedt_2=wavedttemp;
3570 #if(LIMITDTWITHSOURCETERM)
3573 MYFUN(
primtoU(UEVOLVE,
MAC(prim,i,j,k), &state, ptrgeom, U, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
3578 PLOOP(pliter,pl) dUriemann[pl]=0.0;
3585 MYFUN(
source(
MAC(prim,i,j,k),
MAC(prim,i,j,k),
MAC(prim,i,j,k), &didreturnpf, &eomtype, ptrgeom, &state, U, U, CUf, CUimp, 0.0, dUriemann, dUcomp, dUgeom),
"advance.c:set_dt()",
"source", 1);
3588 compute_dt_fromsource(ptrgeom,&state,
MAC(prim,i,j,k), Ugeomfree, dUgeom, dUcomp[
GEOMSOURCE], &tempaccdt, &tempgravitydt);
3589 if(accdt>tempaccdt){
3595 if(gravitydt>tempgravitydt){
3596 gravitydt=tempgravitydt;
3604 dualfprintf(
fail_file,
"BANG: i=%d\n",i);
3606 PLOOP(pliter,pl) dualfprintf(fail_file,"dUgeom[%d]=%21.15g dUcompgeomsource=%21.15g\n",pl,dUgeom[pl],dUcomp[
GEOMSOURCE][pl]);
3609 coord(i,j,k,CENT,X);
3613 dualfprintf(fail_file,
"r(i=-1)=%21.15g r(i=0)=%21.15g\n",V[1],Vp1[1]);
3614 dualfprintf(fail_file,
"gdet(i=-1)=%21.15g gdet(i=0)=%21.15g\n",
GLOBALMETMACP1A0(
gdet,CENT,i,j,k),
GLOBALMETMACP1A0(
gdet,CENT,
ip1mac(i),j,k));
3615 DLOOP(jj,kk) dualfprintf(fail_file,"%d %d
gcov(i=-1)=%21.15g
gcov(i=0)=%21.15g\n",jj,kk,
GLOBALMETMACP1A2(
gcov,CENT,i,j,k,jj,kk),
GLOBALMETMACP1A2(gcov,CENT,
ip1mac(i),j,k,jj,kk));
3616 DLOOP(jj,kk) dualfprintf(fail_file,"%d %d gcovlast(i=-1)=%21.15g gcovlast(i=0)=%21.15g\n",jj,kk,
GLOBALMETMACP1A2(gcovlast,CENT,i,j,k,jj,kk),
GLOBALMETMACP1A2(gcovlast,CENT,
ip1mac(i),j,k,jj,kk));
3617 DLOOP(jj,kk) dualfprintf(fail_file,"%d %d
gcon(i=-1)=%21.15g
gcon(i=0)=%21.15g\n",jj,kk,
GLOBALMETMACP1A2(
gcon,CENT,i,j,k,jj,kk),
GLOBALMETMACP1A2(gcon,CENT,
ip1mac(i),j,k,jj,kk));
3618 DLOOP(jj,kk)
DLOOPA(ll) dualfprintf(fail_file,"%d %d %d
conn(i=-1)=%21.15g
conn(i=0)=%21.15g\n",jj,kk,ll,
GLOBALMETMACP0A3(
conn,i,j,k,jj,kk,ll),
GLOBALMETMACP0A3(conn,
ip1mac(i),j,k,jj,kk,ll));
3638 mpifmin(&wavendt[1]);
3639 mpifmin(&wavendt[2]);
3640 mpifmin(&wavendt[3]);
3642 wavedt_1 =
MINDTSET(wavendt[1],wavendt[2],wavendt[3]);
3649 else wavedt=wavedt_2;
3653 mpifmin(&gravitydt);
3661 ndtfinal=
MIN(wavedt,
MIN(accdt,gravitydt));
3665 SLOOPA(jj) dualfprintf(
log_file,"dtij[%d]=%21.15g wavendti=%d wavendtj=%d wavendtk=%d\n",jj,wavendt[jj],wavendti[jj],wavendtj[jj],wavendtk[jj]);
3666 dualfprintf(log_file,"wavedt_1=%21.15g wavedt_2=%21.15g\n",wavedt_1,wavedt_2);
3667 dualfprintf(log_file,"ndtfinal=%21.15g wavedt=%21.15g accdt=%21.15g gravitydt=%21.15g\n",ndtfinal,wavedt,accdt,gravitydt);
3668 dualfprintf(log_file,"accdti=%d accdtj=%d accdtk=%d :: gravitydti=%d gravitydtj=%d gravitydtk=%d\n",accdti,accdtj,accdtk,gravitydti,gravitydtj,gravitydtk);
3675 if (
t + *dt >
tf) *dt =
tf -
t;
3684 #define GRAVITYCOUR (0.1)
3694 FTYPE rho,u,P,bsq,w,eta;
3696 FTYPE mydUdtgravity, rhoprimegravity, aggravity;
3699 extern void compute_dr(
int i,
int j,
int k,
FTYPE *dr);
3700 FTYPE dr,dphidt,phi,tempdt;
3719 dUevolve[
UU+jj] = dUevolvedt[
UU+jj]*
dt;
3720 dUgeomevolve[
UU+jj] = dUgeomevolvedt[
UU+jj]*
dt;
3725 dUd[jj]=dUevolve[
UU+jj]*(ptrgeom->IEOMFUNCNOSINGMAC(
UU+jj));
3727 raise_vec(dUd,ptrgeom,dUu);
3731 mydUdtgravity = dUgeomevolvedt[
UU]*(ptrgeom->IEOMFUNCNOSINGMAC(
UU));
3744 P=pressure_rho0_u_simple(i,j,k,loc,rho,u);
3764 rhoprime[jj]=
MAX(fabs(eta),fabs(U[
UU]));
3769 ag[jj]=
SMALL+fabs(mydU[jj]/rhoprime[jj]);
3772 if(jj==
TT) dtsource[jj]=
cour*(mydx[jj]/ag[jj]);
3774 else dtsource[jj]=
cour*(mydx[jj]/ag[jj]);
3806 dphidt = fabs(dphidt);
3810 phi = -(1.0+ptrgeom->gcov[
GIND(
TT,
TT)])*0.5;
3817 frac = fabs(dphidt/phi);
3824 compute_dr( i, j, k, &dr);
3829 if(tempdt<*gravitydt) *gravitydt=tempdt;
3832 frac = fabs(ptrgeom->gcon[
GIND(
TT,
TT)]*dphidt);
3849 frac = fabs(dphidt/phi);
3856 compute_dr( i, j, k, &dr);
3861 #if(REMOVERESTMASSFROMUU==2)
3862 rhoprimegravity=fabs(U[
UU]);
3865 rhoprimegravity=fabs(U[UU]+U[
RHO]);
3867 aggravity=
SMALL+fabs(mydUdtgravity/rhoprimegravity);
3868 veleff = aggravity*mydx[1];
3871 sol(pr,state,1,ptrgeom,&v1max,&v1min);
3873 if(veleff>fabs(v1min)) veleff=fabs(v1min);
3874 if(veleff>fabs(v1max)) veleff=fabs(v1max);
3877 if(tempdt<*gravitydt) *gravitydt=tempdt;
3884 if(tempdt<*gravitydt) *gravitydt=tempdt;
3892 #endif // end if DOSELFGRAVVSR==1
3917 if (dtsource[
TT] < *dtij) *dtij = dtsource[
TT];
3920 if (dtsource[
RR] < *dtij) *dtij = dtsource[
RR];
3923 if (dtsource[
TH] < *dtij) *dtij = dtsource[
TH];
3926 if (dtsource[
PH] < *dtij) *dtij = dtsource[
PH];
3941 FTYPE Ugeomfree[NPR],U[NPR];
3947 dUtotal[pl]=dUriemann[pl]+dUgeom[pl];
3953 MYFUN(
primtoU(UEVOLVE, pr, qaddr, ptrgeom, U, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
3957 compute_dt_fromsource(ptrgeom, qaddr, pr, Ugeomfree, dUtotal, dUgeomgravity, accdt, gravitydt);