14 static int general_average(
int useonlynonfailed,
int numbndtotry,
int maxnumbndtotry,
int startpl,
int endpl,
int i,
int j,
int k,
int doingmhd,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
PFTYPE (*lpflagfailorig)[
NSTORE2][
NSTORE3][NUMFAILPFLAGS],
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *ptrgeom);
15 static int fixup_nogood(
int startpl,
int endpl,
int i,
int j,
int k,
int doingmhd,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*pbackup)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *ptrgeom);
16 static int fixuputoprim_accounting(
int i,
int j,
int k,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
int limitgammamhd,
int limitgammarad,
PFTYPE (*lpflag)[
NSTORE2][
NSTORE3][
NUMPFLAGS],
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *geom,
FTYPE *pr0,
FTYPE (*ucons)[
NSTORE2][
NSTORE3][NPR],
int finalstep);
17 static int fixup_negdensities(
int whichtofix,
int *fixed,
int startpl,
int endpl,
int i,
int j,
int k,
PFTYPE mhdlpflag,
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *geom,
FTYPE *pr0,
FTYPE (*ucons)[
NSTORE2][
NSTORE3][NPR],
int finalstep);
19 static int superdebug_utoprim(
FTYPE *pr0,
FTYPE *
pr,
struct of_geom *ptrgeom,
int whocalled);
24 #define YFLADDRADTOGAS 0
34 get_bsqflags(stage,pv);
46 int stage,stagei,stagef;
64 for(stage=stagei;stage<=stagef;stage++){
71 bound_pflag(boundstage, finalstep, boundtime,
GLOBALPOINT(pflag), USEMPI);
72 if(stage!=
STAGEM1) boundstage++;
78 fixup_checksolution(stage,pv,finalstep);
82 bound_pflag(boundstage, finalstep, boundtime, pflag, USEMPI);
83 if(stage!=
STAGEM1) boundstage++;
95 fixup_utoprim(stage,pv,pbackup,ucons,finalstep);
98 fixup(stage, pv, ucons, finalstep);
105 bound_pflag(boundstage, finalstep, boundtime, pflag, USEMPI);
131 fixup_utoprim_nofixup(
STAGEM1,pv,pbackup,ucons,finalstep);
148 struct of_geom *ptrgeom=&geomdontuse;
155 if(fixup1zone(0,
MAC(pv,i,j,k),
MAC(ucons,i,j,k), ptrgeom,finalstep)>=1)
164 int diag_fixup_correctablecheck(
int docorrectucons,
struct of_geom *ptrgeom)
166 int is_within_correctable_region;
167 int docorrectuconslocal;
178 is_within_correctable_region=1;
188 docorrectuconslocal=docorrectucons && is_within_correctable_region;
191 return(docorrectuconslocal);
212 dualfprintf(
fail_file,
"In diag_fixup() whocalled=%d for i=%d j=%d k=%d\n",whocalled,i,j,k);
239 int diag_fixup_dUandaccount(
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep,
int whocalled,
int docorrectuconslocal)
242 int is_within_diagnostic_region;
243 FTYPE deltaUavg[NPR],Uiavg[NPR];
244 FTYPE Uprefixup[NPR],Upostfixup[NPR];
262 PALLLOOP(pl) deltaUavg[pl] = Uf[pl]-Ui[pl];
264 if(docorrectuconslocal){
267 PALLLOOP(pl) ucons[pl] += Upostfixup[pl] - Uprefixup[pl];
280 if(docorrectuconslocal){
285 PALLLOOP(pl) deltaUavg[pl] = Uf[pl]-Uiavg[pl];
291 PALLLOOP(pl) deltaUavg[pl] = Uf[pl]-Ui[pl];
297 if(DOONESTEPDUACCOUNTING && whocalled==
COUNTONESTEP || DOONESTEPDUACCOUNTING==0){
308 dUincell[pl]=
dVF * deltaUavg[pl];
314 GLOBALMACP0A1(failfloordu,ptrgeom->i,ptrgeom->j,ptrgeom->k,pl)+=dUincell[pl];
348 if(is_within_diagnostic_region){
354 dUincell[pl]=
dVF * deltaUavg[pl];
356 fladd[pl] += dUincell[pl];
392 if(is_within_diagnostic_region){
398 dUincell[pl]=
dVF * deltaUavg[pl];
420 int i,
j, k, pliter,pl;
425 ptrgeom=&(geomdontuse);
437 consfixup_1zone(finaluu, i,j,k, ptrgeom, &
MACP0A1(pf,i,j,k,0), &
MACP0A1(ucons,i,j,k,0));
448 int consfixup_1zone(
int finaluu,
int i,
int j,
int k,
struct of_geom *ptrgeom,
FTYPE *pf,
FTYPE *ucons)
458 FTYPE uu[NPR],uuabs[NPR];
459 primtoU(uutype,pp,&qp,ptrgeom,uu,uuabs);
462 #if(WHICHEOM==WITHGDET)
463 PLOOP(pliter,pl) uu0[pl]=ucons[pl]*ptrgeom->igdetnosing;
465 PLOOP(pliter,pl) uu0[pl]=ucons[pl]*ptrgeom->ieomfuncnosing[pl];
475 PLOOP(pliter,pl) uunew1[pl]=uu[pl];
481 DLOOPA(jj) uunew1[URAD0+jj] = uu0[URAD0+jj] - dugas[jj];
487 PLOOP(pliter,pl) uunew2[pl]=uu[pl];
490 DLOOPA(jj) uunew2[URAD0+jj] = uu[URAD0+jj];
491 DLOOPA(jj) durad[jj] = uu[URAD0+jj]-uu0[URAD0+jj];
492 DLOOPA(jj) uunew2[
UU+jj] = uu0[
UU+jj] - durad[jj];
495 FTYPE uunewfinal[NPR];
496 PLOOP(pliter,pl) uunewfinal[pl] = uu[pl];
499 uunewfinal[
UU+jj] = 0.5*(uunew1[
UU+jj] + uunew2[
UU+jj]);
500 uunewfinal[URAD0+jj] = 0.5*(uunew1[URAD0+jj] + uunew2[URAD0+jj]);
506 int allowlocalfailurefixandnoreport=1;
510 if(-uunew1[URAD0]<-uu[URAD0]){
515 PLOOP(pliter,pl) pprad[pl]=pp[pl];
517 u2p_rad(showmessages, allowlocalfailurefixandnoreport,GAMMAMAXRADIMPLICITSOLVER,whichcap,uunew1,pprad,ptrgeom,&lpflag,&lpflagrad);
518 int radinvmod=(
int)(lpflagrad);
533 int finalstep=finaluu;
539 FTYPE dissmeasure=0.0;
542 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
544 newtonstats.nstroke=newtonstats.lntries=0;
546 newtonstats.tryconv=1
E-3;
547 newtonstats.tryconvultrarel=1
E-5;
548 newtonstats.extra_newt_iter=1;
549 newtonstats.extra_newt_iter_ultrarel=1;
550 #define MINTRYCONVFORMHDINVERSION (1E-4) // assume not failure if got down to this much. -- don't have to be related to implicit allowance.
553 newtonstats.maxiter=100;
556 PLOOP(pliter,pl) pptry[pl] = pf[pl];
557 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtypelocal,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UNOTHING,uunewfinal, &qp, ptrgeom, dissmeasure, pptry, pptry, &newtonstats),"
step_ch.c:
advance()", "
Utoprimgen", 1);
559 PFTYPE *lpflag,*lpflagrad;
560 lpflag=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
572 PLOOP(pliter,pl) pf[pl] = pptry[pl];
579 FTYPE uf[NPR],ufabs[NPR];
580 primtoU(uutype,pf,&qf,ptrgeom,uf,ufabs);
582 FTYPE uudiag[NPR],ufdiag[NPR];
589 int docorrectuconslocal=0;
590 int finalstep=finaluu;
591 diag_fixup_dUandaccount(uudiag, ufdiag, ucons, ptrgeom, finalstep, whocalled, docorrectuconslocal);
612 int i,
j, k, pliter,pl;
617 dualfprintf(
fail_file,
"Cannot use diag_fixup_allzones() with DOENOFLUX!=NOENOFLUX\n");
621 ptrgeom=&(geomdontuse);
636 diag_fixup_Ui_pf(docorrectucons,
MAC(ucons,i,j,k),
MAC(pf,i,j,k),ptrgeom,finalstep,
COUNTONESTEP, Uf);
645 if(pl==
RHO) map[pl]=YFL1;
646 else if(pl==
UU) map[pl]=YFL2;
647 else if(pl==
U3) map[pl]=YFL3;
648 else if(pl==URAD0) map[pl]=YFL4;
649 else if(pl==URAD3) map[pl]=YFL5;
656 if(YFL1>=0) uconmap[YFL1]=ucon[
TT];
657 if(YFL2>=0) uconmap[YFL2]=-ucon[
TT];
658 if(YFL3>=0) uconmap[YFL3]=ucon[
TT];
660 if(YFL4>=0 || YFL5>=0){
662 ucon_calc(&pr[URAD1-
U1],ptrgeom,uradcon,othersrad);
663 if(YFL4>=0) uconmap[YFL4]=-uradcon[
TT];
664 if(YFL5>=0) uconmap[YFL5]=uradcon[
TT];
673 if(URAD0>=0) enfloor+= (pr[URAD0])*
NUMEPSILON*10.0;
675 if(YFL1>=0) offset[YFL1] = SMALL + rhofloor;
676 if(YFL2>=0) offset[YFL2] = SMALL + rhofloor*vfloor*vfloor +
UULIMIT;
677 if(YFL3>=0) offset[YFL3] = SMALL + rhofloor*vfloor;
678 if(YFL4>=0) offset[YFL4] = SMALL + enfloor;
679 if(YFL5>=0) offset[YFL5] = SMALL + enfloor*vfloor;
682 FTYPE uconsnothing[NPR];
685 FTYPE Ufnothing[NPR];
686 UtoU(
UDIAG,UNOTHING,ptrgeom,Uf,Ufnothing);
697 FTYPE pltotal=Ufnothing[pl]/uconmap[mapvar];
699 FTYPE dpl=(Ufnothing[pl] - uconsnothing[pl])/uconmap[mapvar];
705 dpl+=(Ufnothing[plalt] - uconsnothing[plalt])/uconmap[map[plalt]];
709 dpl+=(Ufnothing[plalt] - uconsnothing[plalt])/uconmap[map[plalt]];
716 plfl = uconsnothing[mapvar]/uconmap[mapvar];
719 FTYPE plflfinal = plfl + dpl;
720 if(1&&(mapvar==YFL2 || mapvar==YFL4)){
724 FTYPE offsetfull=0.0;
726 offsetfull=offset[mapvar]-uconsnothing[
RHO]/ucon[
TT];
728 else offsetfull=offset[mapvar];
729 if(plflfinal<offsetfull) plflfinal=offsetfull;
734 if(plflfinal>pltotal) plflfinal=pltotal;
739 MACP0A1(pf,i,j,k,mapvar) = plflfinal/(SMALL+fabs(pltotal));
743 MACP0A1(pf,i,j,k,mapvar) = plflfinal;
764 int diag_fixup(
int docorrectucons,
FTYPE *pr0,
FTYPE *pr,
FTYPE *uconsinput,
struct of_geom *ptrgeom,
int finalstep,
int doingmhdfixup,
int whocalled)
767 FTYPE Uicent[NPR],Ufcent[NPR];
769 void UtoU(
int inputtype,
int returntype,
struct of_geom *ptrgeom,
FTYPE *Uin,
FTYPE *Uout);
770 FTYPE deltaUavg[NPR],Uiavg[NPR];
771 FTYPE Uprefixup[NPR],Upostfixup[NPR];
772 int docorrectuconslocal;
777 if(uconsinput!=NULL){
778 PLOOP(pliter,pl) ucons[pl]=uconsinput[pl];
782 superdebug_utoprim(pr0,pr,ptrgeom,whocalled);
789 if(doingmhdfixup)
count_whocalled(ptrgeom->i,ptrgeom->j,ptrgeom->k, finalstep, whocalled,1);
807 docorrectuconslocal=diag_fixup_correctablecheck(docorrectucons,ptrgeom);
824 if(failreturn>=1) dualfprintf(
fail_file,
"get_state(1) failed in fixup.c, why???\n");
825 failreturn=
primtoU(UDIAG,pr0,&q,ptrgeom,Uicent, NULL);
826 if(failreturn>=1) dualfprintf(
fail_file,
"primtoU(1) failed in fixup.c, why???\n");
831 if(failreturn>=1) dualfprintf(
fail_file,
"get_state(2) failed in fixup.c, why???\n");
832 failreturn=
primtoU(UDIAG,pr,&q,ptrgeom,Ufcent, NULL);
833 if(failreturn>=1) dualfprintf(
fail_file,
"primtoU(2) failed in fixup.c, why???\n");
838 diag_fixup_dUandaccount(Uicent, Ufcent, ucons, ptrgeom, finalstep, whocalled, docorrectuconslocal);
841 if(uconsinput!=NULL && docorrectuconslocal){
847 uconsinput[pl] = ucons[pl];
867 int diag_fixup_Ui_pf(
int docorrectucons,
FTYPE *Uievolve,
FTYPE *pf,
struct of_geom *ptrgeom,
int finalstep,
int whocalled,
FTYPE *Uf)
870 FTYPE Ufcent[NPR],Uicent[NPR],uconsinput[NPR],ucons[NPR];
872 int pliter,pl,enerregion;
873 void UtoU(
int inputtype,
int returntype,
struct of_geom *ptrgeom,
FTYPE *Uin,
FTYPE *Uout);
874 int docorrectuconslocal;
881 count_whocalled(ptrgeom->i,ptrgeom->j,ptrgeom->k, finalstep, whocalled,1);
887 docorrectuconslocal=diag_fixup_correctablecheck(docorrectucons,ptrgeom);
898 PLOOP(pliter,pl) ucons[pl]=Uievolve[pl];
909 failreturn=
primtoU(UDIAG,pf,&q,ptrgeom,Ufcent, NULL);
910 if(failreturn>=1) dualfprintf(fail_file,"
primtoU(2)
failed in fixup.c, why???\n");
912 if(Uf!=NULL)
PLOOP(pliter,pl) Uf[pl]=Ufcent[pl];
922 UtoU(UEVOLVE,UDIAG,ptrgeom,Uievolve,Uicent);
929 PFTYPE *lpflag,*lpflagrad;
930 lpflag=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
939 PLOOP(pliter,pl) if(
RADPL(pl)==0) Ufcent[pl] = Uicent[pl];
943 PLOOP(pliter,pl) if(
RADPL(pl)==1) Ufcent[pl] = Uicent[pl];
953 diag_fixup_dUandaccount(Uicent, Ufcent, ucons, ptrgeom, finalstep, whocalled, docorrectuconslocal);
956 if(docorrectuconslocal){
961 uconsinput[pl] = ucons[pl];
982 int diag_fixup_U(
int docorrectucons,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *uconsinput,
struct of_geom *ptrgeom,
int finalstep,
int whocalled)
984 FTYPE Uicent[NPR],Ufcent[NPR];
987 int pliter,pl,enerregion, tscale;
988 void UtoU(
int inputtype,
int returntype,
struct of_geom *ptrgeom,
FTYPE *Uin,
FTYPE *Uout);
989 int docorrectuconslocal;
994 if(uconsinput!=NULL){
995 PLOOP(pliter,pl) ucons[pl]=uconsinput[pl];
999 count_whocalled(ptrgeom->i,ptrgeom->j,ptrgeom->k, finalstep, whocalled,1);
1009 docorrectuconslocal=diag_fixup_correctablecheck(docorrectucons,ptrgeom);
1025 UtoU(UDIAG,UEVOLVE,ptrgeom,Uf,ucons);
1042 diag_fixup_dUandaccount(Uicent, Ufcent, ucons, ptrgeom, finalstep, whocalled, docorrectuconslocal);
1044 if(uconsinput!=NULL && docorrectuconslocal){
1049 uconsinput[pl] = ucons[pl];
1066 #if(VARTOINTERP==PRIMTOINTERP_GDETFULLVERSION_WALD)
1067 #define FIXUPTYPE 0 // or else would create spurious Poynting flux
1069 #define FIXUPTYPE 0 // too expensive if inversion fails alot as can happen near floors, near poles, or with radiation.
1076 int fixup1zone(
int docorrectucons,
FTYPE *pr,
FTYPE *uconsinput,
struct of_geom *ptrgeom,
int finalstep)
1082 FTYPE ftempA,ftempB;
1085 FTYPE prfloor[NPR],prceiling[NPR];
1088 FTYPE prmhdnew[NPR];
1089 FTYPE U[NPR],U0[NPR];
1093 FTYPE scalemin[NPR];
1102 PFTYPE oldmhdpflag,oldradpflag;
1108 if(uconsinput!=NULL){
1109 PLOOP(pliter,pl) ucons[pl]=uconsinput[pl];
1142 if(DOEVOLVEURAD0) checkfl[PRAD0]=1;
1150 #if(WHICHVEL==VELREL4)
1158 if(failreturn>=1)
FAILSTATEMENT(
"fixup.c:fixup()",
"limit_gamma()", 1);
1159 if(failreturn==-1) didchangeprim=1;
1171 #endif// end if WHICHVEL==VEL4REL
1188 set_density_floors(ptrgeom,prmhd,prfloor,prceiling);
1202 if(prfloor[pl]<scalemin[pl]) prfloor[pl]=scalemin[pl];
1215 prmhdnew[pl]=prmhd[pl];
1219 if ( checkfl[pl]&&(prmhd[pl] < prfloor[pl] && prmhd[pl]<prceiling[pl]) ){
1223 prmhdnew[pl]=prfloor[pl];
1228 if ( checkfl[pl]&&(prmhd[pl] > prfloor[pl] && prmhd[pl]>prceiling[pl]) ){
1232 prmhdnew[pl]=prceiling[pl];
1251 prmhd[pl]=prmhdnew[pl];
1255 #elif(FIXUPTYPE==1 || FIXUPTYPE==2)
1264 if(failreturn>=1) dualfprintf(fail_file,
"get_state(1) failed in fixup.c, why???\n");
1265 failreturn=
primtoU(UNOTHING,prmhd,&q,ptrgeom,U, NULL);
1266 if(failreturn>=1) dualfprintf(fail_file,
"primtoU(1) failed in fixup.c, why???\n");
1269 PLOOP(pliter,pl) U0[pl]=U[pl];
1274 PALLLOOP(pl)
if(pl==
RHO || pl==
UU || pl==URAD0){ dprmhd[pl]=prmhdnew[pl]-prmhd[pl];}
1275 set_zamo_velocity(
WHICHVEL,ptrgeom,dprmhd);
1278 failreturn=
get_state(dprmhd,ptrgeom,&dq);
1279 failreturn=
primtoU(UNOTHING,dprmhd,&dq,ptrgeom,dU, NULL);
1280 if(failreturn>=1) dualfprintf(fail_file,
"primtoU(2) failed in fixup.c, why???\n");
1288 dU[
U1]=dU[
U2]=dU[
U3]=0.0;
1289 if(URAD0>=0) dU[URAD0]=dU[URAD1]=dU[URAD2]=dU[URAD3]=0.0;
1292 if ( checkfl[pl]&&(prfloor[pl] > prmhd[pl] || prceiling[pl] < prmhd[pl]) ){
1307 if(ENTROPY>=0) U[ENTROPY] = U0[ENTROPY];
1312 oldmhdpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMFAIL);
1313 oldradpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMRADFAIL);
1316 int allowlocalfailurefixandnoreport=1;
1318 FTYPE dissmeasure=-1.0;
1325 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
1334 #define IMPTRYCONVCONSTFORFX (1E-6)
1335 #define IMPOKCONVCONSTFORFX (1E-4)
1336 #define IMPALLOWCONVCONSTFORFX (1E-3)
1337 #define IMPMAXITERFORFX (10)
1338 newtonstats.
tryconv=1
E-2*
MAX(IMPTRYCONVCONSTFORFX,IMPOKCONVCONSTFORFX);
1342 newtonstats.
mintryconv=IMPALLOWCONVCONSTFORFX;
1343 newtonstats.
maxiter=IMPMAXITERFORFX;
1347 failreturn=
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep,&eomtype,whichcap,whichmethod,modprim,
OTHERUTOPRIM,UNOTHING,U,&q, ptrgeom,dissmeasure,prmhd,prmhd,&newtonstats);
1353 badinversion = (failreturn>=1 ||
IFUTOPRIMFAIL(GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMFAIL)));
1355 static long long int utoprimgenfixup=0,utoprimgenfixupbad=0;
1357 if(badinversion) utoprimgenfixupbad++;
1358 if(debugfail>=2)
if(utoprimgenfixup%
totalzones==0) dualfprintf(fail_file,
"UTOPRIMGENFIXUP: %lld (bad=%lld) : %ld %d\n",utoprimgenfixup,utoprimgenfixupbad,
nstep,
steppart);
1362 if(debugfail>=2) dualfprintf(fail_file,
"Utoprimgen failed in fixup.c");
1365 prmhd[pl]=prmhdnew[pl];
1370 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMFAIL)=oldmhdpflag;
1371 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMRADFAIL)=oldradpflag;
1380 if(
RHO>=0){ pl=
RHO; prmhd[pl]=
MAX(prmhd[pl],prmhdnew[pl]);}
1382 if(
UU>=0){ pl=
UU; prmhd[pl]=
MIN(prmhd[pl],prmhdnew[pl]);}
1383 if(URAD0>=0){ pl=URAD0; prmhd[pl]=
MIN(prmhd[pl],prmhdnew[pl]);}
1407 int doingmhdfixup=1;
1412 PFTYPE *lpflag,*lpflagrad;
1413 lpflag=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMFAIL);
1414 lpflagrad=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,FLAGUTOPRIMRADFAIL);
1418 FTYPE Uievolve[NPR];
1419 PLOOP(pliter,pl) Uievolve[pl] = ucons[pl];
1420 diag_fixup_Ui_pf(docorrectucons2, Uievolve, prmhd, ptrgeom, finalstep,
COUNTFLOORACT,NULL);
1424 diag_fixup(docorrectucons2,prdiag, prmhd, ucons, ptrgeom, finalstep,doingmhdfixup,
COUNTFLOORACT);
1467 pr[YFL1] = (pr0[YFL1]*pr0[
RHO] + drho)/pr[
RHO];
1468 if(pr[YFL1]<0.0) pr[YFL1]=0.0;
1469 if(pr[YFL1]>1.0) pr[YFL1]=1.0;
1472 pr[YFL1] = pr0[YFL1] + drho;
1473 if(pr[YFL1]<SMALL) pr[YFL1]=
SMALL;
1474 if(pr[YFL1]>pr[
RHO]) pr[YFL1]=pr[
RHO];
1483 primtoU(UNOTHING,pr,&qnew,ptrgeom,Unew, NULL);
1488 primtoU(UNOTHING,pr0,&q0,ptrgeom,U0, NULL);
1490 if(YFL2>=0) pr[YFL2]+= -(Unew[
UU]-U0[
UU])/qnew.
ucon[
TT];
1491 if(YFL3>=0) pr[YFL3]+= +(Unew[
U3]-U0[
U3])/qnew.
ucon[
TT];
1493 if(YFL2>=0) pr[YFL2]+= -(Unew[URAD0]-U0[URAD0])/qnew.
uradcon[
TT];
1494 if(YFL3>=0) pr[YFL3]+= +(Unew[URAD3]-U0[URAD3])/qnew.
uradcon[
TT];
1498 pr[YFL4]+= -(Unew[URAD0]-U0[URAD0])/qnew.
uradcon[
TT];
1501 if(YFL5>=0) pr[YFL5]+= (Unew[URAD3]-U0[URAD3])/qnew.
uradcon[
TT];
1518 primtoU(UEVOLVE,pr,&qnew,ptrgeom,ucons, NULL);
1526 if(uconsinput!=NULL && docorrectucons){
1531 uconsinput[pl] = ucons[pl];
1556 #define ISGAMMACHECK 0
1580 extern void get_advance_startendindices(
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke);
1581 int is,ie,js,je,ks,ke;
1617 #pragma omp parallel // don't need full (i.e. don't need EOS here)
1623 struct of_geom *ptrgeom=&geomdontuse;
1627 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1635 #if(WHICHVEL==VELREL4)
1636 MYFUN(gamma_calc(
MAC(pv,i,j,k),ptrgeom,&
MACP0A1(gammacheck,i,j,k,
UU),&qsq),
"fixup_checksolution: gamma calc failed\n",
"fixup.c",1);
1638 if (
ucon_calc(
MAC(pv,i,j,k), ptrgeom, ucon, others) >= 1)
FAILSTATEMENT(
"fixup.c:fixup_checksolution()",
"ucon_calc()", 1);
1657 #pragma omp parallel // don't need copyin, doesn't currently use global non-array vars
1670 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1684 percdiff[
ISGAMMACHECK][0]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,i,
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,i,
jp1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1685 percdiff[
ISGAMMACHECK][1]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,i,
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,i,
jm1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1686 percdiff[
ISGAMMACHECK][2]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),j,k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
ip1mac(i),j,k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1687 percdiff[
ISGAMMACHECK][3]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
im1mac(i),j,k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
im1mac(i),j,k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1689 percdiff[
ISGAMMACHECK][4]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
ip1mac(i),
jp1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1690 percdiff[
ISGAMMACHECK][5]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
ip1mac(i),
jm1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1691 percdiff[
ISGAMMACHECK][6]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
ip1mac(i),
jp1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1692 percdiff[
ISGAMMACHECK][7]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
im1mac(i),
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(gammacheck,
im1mac(i),
jm1mac(j),k,
UU)/
MACP0A1(gammacheck,i,j,k,
UU)) : -1;
1696 percdiff[
ISUUCHECK][0]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,i,
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,i,
jp1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1697 percdiff[
ISUUCHECK][1]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,i,
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,i,
jm1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1698 percdiff[
ISUUCHECK][2]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),j,k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
ip1mac(i),j,k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1699 percdiff[
ISUUCHECK][3]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
im1mac(i),j,k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
im1mac(i),j,k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1701 percdiff[
ISUUCHECK][4]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
ip1mac(i),
jp1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1702 percdiff[
ISUUCHECK][5]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
ip1mac(i),
jm1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1703 percdiff[
ISUUCHECK][6]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
ip1mac(i),
jp1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
ip1mac(i),
jp1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1704 percdiff[
ISUUCHECK][7]=(
IFUTOPRIMNOFAILORFIXED(GLOBALMACP0A1(pflag,
im1mac(i),
jm1mac(j),k,FLAGUTOPRIMFAIL))) ? fabs(
MACP0A1(pv,
im1mac(i),
jm1mac(j),k,
UU)/
MACP0A1(pv,i,j,k,
UU)) : -1;
1712 for(checki=0;checki<
NUMCHECKS;checki++){
1718 if(checkcondition[ISGAMMACHECK] && percdiff[ISGAMMACHECK][l]>=0.0){
1722 if(checkcondition[ISUUCHECK] && percdiff[ISUUCHECK][l]>=0.0){
1736 if(checkcondition[checki] && (vote[checki]>numvotes[checki]*0.5)){
1742 if(checkcondition[checki] && (vote[checki]>numvotes[checki]*0.5)){
1766 #if(MPIEQUALNONMPI==1)
1767 #define ORDERINDEPENDENT 1 // no choice
1770 #define ORDERINDEPENDENT 1 // NO choice anymore, with fixup done before assigning initial D0, gamma, etc.
1774 #define GENERALAVERAGE 1
1782 #define DO_CONSERVE_D_INFAILFIXUPS (0&&finalstep==1 && (SCALARPL(pl))) // not pl==RHO
1784 #define HANDLEUNEG 0
1789 #define HANDLERHONEG 0
1794 #define HANDLERHOUNEG 0
1805 extern void get_advance_startendindices(
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke);
1806 int is,ie,js,je,ks,ke;
1828 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
1839 copy_3dnpr(is,ie,js,je,ks,ke,pv,ptoavg);
1865 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM // accounting requires state stuff
1867 int i,
j,k,pl,pliter;
1871 PFTYPE mhdlpflag,radlpflag;
1872 int fixedmhd,fixedrad;
1880 struct of_geom *ptrgeom=&geomdontuse;
1881 int fixingmhd,fixingrad;
1882 int limitgammamhd,limitgammarad;
1886 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1893 mhdlpflag=GLOBALMACP0A1(pflagfailorig,i,j,k,FLAGUTOPRIMFAIL);
1894 radlpflag=GLOBALMACP0A1(pflagfailorig,i,j,k,FLAGUTOPRIMRADFAIL);
1919 fixuputoprim_accounting(i, j, k, mhdlpflag, radlpflag, 0, 0,
GLOBALPOINT(pflag),pv,ptoavg, ptrgeom, pr0, ucons, finalstep);
1923 else if(fixingmhd || fixingrad){
2007 #if(GENERALAVERAGE==1)
2008 int useonlynonfailed=1;
2012 for(numbndtotry=1;numbndtotry<=maxnumbndtotry;numbndtotry++){
2013 nogood=general_average(useonlynonfailed,numbndtotry,maxnumbndtotry,startpl, endpl, i, j, k, doingmhd, mhdlpflag, radlpflag,
GLOBALPOINT(pflagfailorig) ,pv,ptoavg,ptrgeom);
2014 if(nogood==0)
break;
2027 fixup_negdensities(
EOMSETMHD, &fixedmhd, startpl, endpl, i, j, k, mhdlpflag, pv,ptoavg, ptrgeom, pr0, ucons, finalstep);
2029 if(fixedmhd==1 && (startpl<=
RHO && endpl<=
UU)){
2034 if(fixedmhd==1 && (startpl<=RHO && endpl>=
U1)){
2048 fixup_nogood(startpl, endpl, i, j, k, doingmhd, mhdlpflag, radlpflag, pv,ptoavg, pbackup, ptrgeom);
2058 if(startpl<=U1 && endpl>=
U3){
2060 #if(WHICHVEL==VELREL4)
2065 MYFUN(gamma_calc(
MAC(ptoavg,i,j,k),ptrgeom,&gamma,&qsq),
"fixup_utoprim: gamma calc failed\n",
"fixup.c",1);
2066 if (
ucon_calc(
MAC(ptoavg,i,j,k), ptrgeom, ucon, others) >= 1)
FAILSTATEMENT(
"fixup.c:utoprimfail_fixup()",
"ucon_calc()", 1);
2068 alpha = ptrgeom->alphalapse;
2069 vsq = 1. - 1. / (alpha * alpha * ucon[0] * ucon[0]);
2074 if(debugfail>=2) dualfprintf(fail_file,
"MHD: initial gamma: %21.15g, max: %21.15g, initial vsq: %21.15g\n",gamma,
GAMMAMAX,vsq);
2080 if (
ucon_calc(
MAC(ptoavg,i,j,k), ptrgeom, ucon,others) >= 1)
FAILSTATEMENT(
"fixup.c:utoprimfail_fixup()",
"ucon_calc()", 1);
2090 #if(WHICHVEL==VELREL4)
2094 if(limitgammamhd=limit_gamma(0,gamma,
GAMMAMAXRAD,
MAC(pv,i,j,k),
MAC(ucons,i,j,k),ptrgeom,-1)>=1)
FAILSTATEMENT(
"fixup.c:fixup()",
"limit_gamma()", 2);
2102 MYFUN(gamma_calc(
MAC(pv,i,j,k),ptrgeom,&gamma,&qsq),
"fixup_utoprim: gamma calc failed\n",
"fixup.c",2);
2103 dualfprintf(fail_file,
"MHD: final gamma: %21.15g\n",gamma);
2118 if(pl==
RHO || pl==YFL1 || pl==YFL2 || pl==YFL3){
2119 if(startpl<=pl && endpl>=pl){
2126 if (
ucon_calc(
MAC(ptoavg,i,j,k), ptrgeom, ucon, others) >= 1)
FAILSTATEMENT(
"fixup.c:utoprimfail_fixup()",
"ucon_calc()", 1);
2134 FTYPE Unothing[NPR];
2135 UtoU(UEVOLVE,UNOTHING,ptrgeom,
MAC(ucons,i,j,k),Unothing);
2148 if(D0>0.0 && pl==
RHO || pl==YFL1 || pl==YFL2 || pl==YFL3){
2161 PALLLOOP(pl) dualfprintf(fail_file,
"nstep=%ld steppart=%d :: i=%d j=%d k=%d pl=%d pv=%21.15g ptoavg=%21.15g\n",
nstep,
steppart,i,j,k,pl,
MACP0A1(pv,i,j,k,pl),
MACP0A1(ptoavg,i,j,k,pl));
2243 #if(GENERALAVERAGE==1)
2244 int useonlynonfailed=1;
2247 for(numbndtotry=1;numbndtotry<=maxnumbndtotry;numbndtotry++){
2248 nogood=general_average(useonlynonfailed,numbndtotry,maxnumbndtotry,startpl, endpl, i, j, k, doingmhd, mhdlpflag, radlpflag,
GLOBALPOINT(pflagfailorig) ,pv,ptoavg,ptrgeom);
2249 if(nogood==0)
break;
2262 fixup_negdensities(
EOMSETRAD,&fixedrad, startpl, endpl, i, j, k, radlpflag, pv,ptoavg, ptrgeom, pr0, ucons, finalstep);
2264 if(fixedrad==1 && (startpl==URAD0 && endpl==URAD0)){
2268 if(fixedrad==1 && (startpl<=URAD0 && endpl>=URAD1)){
2285 fixup_nogood(startpl, endpl, i, j, k, doingmhd, mhdlpflag, radlpflag, pv,ptoavg, pbackup, ptrgeom);
2304 if(startpl<=PRAD1 && endpl>=PRAD3){
2306 #if(WHICHVEL==VELREL4)
2311 MYFUN(gamma_calc(&
MACP0A1(ptoavg,i,j,k,URAD1-
U1),ptrgeom,&gamma,&qsq),
"fixup_utoprim: gamma calc failed\n",
"fixup.c",1);
2314 alpha = ptrgeom->alphalapse;
2315 vsq = 1. - 1. / (alpha * alpha * ucon[0] * ucon[0]);
2320 if(debugfail>=2) dualfprintf(fail_file,
"RAD: initial gamma: %21.15g, max: %21.15g, initial vsq: %21.15g\n",gamma,
GAMMAMAXRAD,vsq);
2336 #if(WHICHVEL==VELREL4)
2340 if(limitgammarad=limit_gamma(0,
GAMMAMAX,gamma,
MAC(pv,i,j,k),
MAC(ucons,i,j,k),ptrgeom,-1)>=1)
FAILSTATEMENT(
"fixup.c:fixup()",
"limit_gamma()", 2);
2348 MYFUN(gamma_calc(&
MACP0A1(pv,i,j,k,URAD1-
U1),ptrgeom,&gamma,&qsq),
"fixup_utoprim: gamma calc failed\n",
"fixup.c",2);
2349 dualfprintf(fail_file,
"RAD: final gamma: %21.15g\n",gamma);
2364 if(pl==YFL4 || pl==YFL5){
2365 if(startpl<=pl && endpl>=pl){
2376 FTYPE Unothing[NPR];
2377 UtoU(UEVOLVE,UNOTHING,ptrgeom,
MAC(ucons,i,j,k),Unothing);
2390 if(pl==YFL4 || pl==YFL5){
2405 PALLLOOP(pl) dualfprintf(fail_file,
"nstep=%ld steppart=%d :: i=%d j=%d k=%d pl=%d pv=%21.15g ptoavg=%21.15g\n",
nstep,
steppart,i,j,k,pl,
MACP0A1(pv,i,j,k,pl),
MACP0A1(ptoavg,i,j,k,pl));
2423 fixuputoprim_accounting(i, j, k, mhdlpflag, radlpflag, limitgammamhd, limitgammarad,
GLOBALPOINT(pflag),pv,ptoavg, ptrgeom, pr0, ucons, finalstep);
2461 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM // accounting requires state stuff
2463 int i,
j,k,pl,pliter;
2465 PFTYPE mhdlpflag,radlpflag;
2467 struct of_geom *ptrgeom=&geomdontuse;
2471 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
2477 mhdlpflag=GLOBALMACP0A1(pflag,i,j,k,FLAGUTOPRIMFAIL);
2478 radlpflag=GLOBALMACP0A1(pflag,i,j,k,FLAGUTOPRIMRADFAIL);
2491 fixuputoprim_accounting(i, j, k, mhdlpflag, radlpflag, 0, 0,
GLOBALPOINT(pflag),pv,ptoavg, ptrgeom, pr0, ucons, finalstep);
2509 static
int fixup_negdensities(
int whicheomset,
int *fixed,
int startpl,
int endpl,
int i,
int j,
int k,
PFTYPE lpflag,
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR], struct
of_geom *ptrgeom,
FTYPE *pr0,
FTYPE (*ucons)[
NSTORE2][
NSTORE3][NPR],
int finalstep)
2511 FTYPE prguess[NPR],prceiling[NPR];
2528 set_density_floors(ptrgeom,
MAC(pv,i,j,k),prguess,prceiling);
2562 set_density_floors(ptrgeom,
MAC(pv,i,j,k),prguess,prceiling);
2598 set_density_floors(ptrgeom,
MAC(pv,i,j,k),prguess,prceiling);
2639 if(-
MACP0A1(pv,i,j,k,URAD0)<prguess[URAD0]){ *fixed=1;
MACP0A1(pv,i,j,k,URAD0)=prguess[URAD0];}
2671 #define DOCOUNTNEGU 1
2674 #define DOCOUNTNEGRHO 1
2677 #define DOCOUNTNEGRHOU 1
2685 #define ADJUSTCONSERVEDQUANTITY 0
2688 static int fixuputoprim_accounting(
int i,
int j,
int k,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
int limitgammamhd,
int limitgammarad,
PFTYPE (*lpflag)[
NSTORE2][
NSTORE3][NUMPFLAGS],
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *ptrgeom,
FTYPE *pr0,
FTYPE (*uconsinput)[
NSTORE2][
NSTORE3][NPR],
int finalstep)
2690 PFTYPE mhdutoprimfailtype,radutoprimfailtype;
2701 if(uconsinput!=NULL){
2702 PLOOP(pliter,pl) ucons[pl]=
MACP0A1(uconsinput,i,j,k,pl);
2715 mhdutoprimfailtype=-1;
2743 mhdutoprimfailtype=-1;
2752 mhdutoprimfailtype=-1;
2757 mhdutoprimfailtype=-1;
2784 mhdutoprimfailtype=-1;
2792 mhdutoprimfailtype=-1;
2797 mhdutoprimfailtype=-1;
2814 mhdutoprimfailtype=-1;
2823 mhdutoprimfailtype=-1;
2828 mhdutoprimfailtype=-1;
2861 dualfprintf(fail_file,
"prior pflag not cleared: nstep=%ld steppart=%d t=%21.15g i=%d j=%d k=%d \n",
nstep,
steppart,
t,i,j,k);
2862 mhdutoprimfailtype=-1;
2866 dualfprintf(fail_file,
"No such pflag failure type: %d for t=%21.15g nstep=%ld steppart=%d i=%d j=%d k=%d\n",mhdlpflag,
t,
nstep,
steppart,i,j,k);
2878 radutoprimfailtype=-1;
2890 dualfprintf(fail_file,
"prior rad pflag not cleared: nstep=%ld steppart=%d t=%21.15g i=%d j=%d k=%d \n",
nstep,
steppart,
t,i,j,k);
2891 radutoprimfailtype=-1;
2903 if(mhdutoprimfailtype!=-1 || radutoprimfailtype!=-1 || limitgammamhd==-1 || limitgammarad==-1){
2904 if(docorrectucons==1){
2932 FTYPE Uievolve[NPR];
2933 PLOOP(pliter,pl) Uievolve[pl] =
MACP0A1(uconsinput,i,j,k,pl);
2934 diag_fixup_Ui_pf(docorrectucons, Uievolve,
MAC(pv,i,j,k), ptrgeom, finalstep,(
int)mhdutoprimfailtype, NULL);
2961 else doadjustcons=0;
2971 MYFUN(
get_state(
MAC(pv,i,j,k), ptrgeom, &q),
"fixup.c:fixup_utoprim()",
"get_state()", 1);
2972 MYFUN(
primtoU(UEVOLVE,
MAC(pv,i,j,k), &q, ptrgeom, ucons, NULL),
"fixup.c:fixup_utoprim()",
"primtoU()", 1);
2977 if(uconsinput!=NULL && docorrectucons){
2981 MACP0A1(uconsinput,i,j,k,pl) = ucons[pl];
2993 if(mhdutoprimfailtype==-1) superdebug_utoprim(pr0,
MAC(pv,i,j,k),ptrgeom,mhdutoprimfailtype);
3004 #define PLOOPSTARTEND(pl) for(pl=startpl;pl<=endpl;pl++) if((NONRADFULLPL(pl) && doingmhd || RADFULLPL(pl) && doingmhd==0) && BPL(pl)==0)
3010 #define AVG4_1(pr,i,j,k,pl) (0.25*((MACP0A1(pr,i,jp1mac(j),k,pl)+MACP0A1(pr,i,jm1mac(j),k,pl))+(MACP0A1(pr,im1mac(i),j,k,pl)+MACP0A1(pr,ip1mac(i),j,k,pl)))) // symmetrized sum
3011 #define AVG4_2(pr,i,j,k,pl) (0.25*((MACP0A1(pr,ip1mac(i),jp1mac(j),k,pl)+MACP0A1(pr,ip1mac(i),jm1mac(j),k,pl))+(MACP0A1(pr,im1mac(i),jp1mac(j),k,pl)+MACP0A1(pr,im1mac(i),jm1mac(j),k,pl)))) //symmetrized sum
3013 #define AVG2_1(pr,i,j,k,pl) (0.5*(MACP0A1(pr,i,jp1mac(j),k,pl)+MACP0A1(pr,i,jm1mac(j),k,pl)))
3014 #define AVG2_2(pr,i,j,k,pl) (0.5*(MACP0A1(pr,ip1mac(i),j,k,pl)+MACP0A1(pr,im1mac(i),j,k,pl)))
3015 #define AVG2_3(pr,i,j,k,pl) (0.5*(MACP0A1(pr,ip1mac(i),jp1mac(j),k,pl)+MACP0A1(pr,im1mac(i),jm1mac(j),k,pl)))
3016 #define AVG2_4(pr,i,j,k,pl) (0.5*(MACP0A1(pr,ip1mac(i),jm1mac(j),k,pl)+MACP0A1(pr,im1mac(i),jp1mac(j),k,pl)))
3018 #define AVG4_1(pr,i,j,k,pl) (0.25*((MACP0A1(pr,i,jp1mac(j),k,pl)+MACP0A1(pr,i,jm1mac(j),k,pl))+(MACP0A1(pr,im1mac(i),j,k,pl)+MACP0A1(pr,ip1mac(i),j,k,pl)))) // symmetrized sum
3019 #define AVG4_2(pr,i,j,k,pl) (0.25*((MACP0A1(pr,ip1mac(i),jp1mac(j),k,pl)+MACP0A1(pr,ip1mac(i),jm1mac(j),k,pl))+(MACP0A1(pr,im1mac(i),jp1mac(j),k,pl)+MACP0A1(pr,im1mac(i),jm1mac(j),k,pl)))) //symmetrized sum
3025 #define CAUSALAVG_WHEN_U2AVG 0 // causal way -- uses same normal loops
3026 #define SIMPLEAVG_WHEN_U2AVG 1 // normal average
3027 #define MAXUPOSAVG_WHEN_U2AVG 2 // Sasha way -- take min of positive internal energies
3028 #define CAUSAL_THENMIN_WHEN_U2AVG 3 // Jon way -- use min of ANY (pos or neg) answer between (1) causal and (2) min of all positive
3032 #define HOWTOAVG_WHEN_U2AVG MAXUPOSAVG_WHEN_U2AVG
3036 static int general_average(
int useonlynonfailed,
int numbndtotry,
int maxnumbndtotry,
int startpl,
int endpl,
int i,
int j,
int k,
int doingmhd,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
PFTYPE (*lpflagfailorig)[
NSTORE2][
NSTORE3][NUMFAILPFLAGS],
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *ptrgeom)
3038 int doavgcausal,failavglooptype;
3046 int numavg0,numavg1[NPR];
3047 FTYPE mysum[2][NPR];
3048 int numupairs,qq,thisnotfail,thatnotfail,rnx,rny,rnz;
3050 FTYPE ftemp,ftemp1,ftemp2;
3051 FTYPE lastmin[NPR],avganswer0[NPR],avganswer1[NPR];
3052 int ignorecourant=0;
3058 prod0dualfprintf(debugfail>=2,fail_file,
"uc2generalA: doingmhd=%d mhdlpflag=%d radlpflag=%d startpl=%d endpl=%d :: i=%d j=%d k=%d\n",doingmhd,mhdlpflag,radlpflag,startpl,endpl,i,j,k);
3107 MYFUN(
get_state(
MAC(ptoavg,i,j,k), ptrgeom, &state_pv),
"fixup.c:fixup_utporim()",
"get_state()", 1);
3109 MYFUN(
vchar_all(
MAC(ptoavg,i,j,k), &state_pv, 1, ptrgeom, &cminmax[1][
CMAX], &cminmax[1][
CMIN],&ignorecourant),
"fixup.c:fixup_utoprim()",
"vchar_all() dir=1or2", 1);
3112 MYFUN(
vchar_all(
MAC(ptoavg,i,j,k), &state_pv, 2, ptrgeom, &cminmax[2][
CMAX], &cminmax[2][
CMIN],&ignorecourant),
"fixup.c:fixup_utoprim()",
"vchar_all() dir=1or2", 2);
3115 MYFUN(
vchar_all(
MAC(ptoavg,i,j,k), &state_pv, 3, ptrgeom, &cminmax[3][
CMAX], &cminmax[3][
CMIN],&ignorecourant),
"fixup.c:fixup_utoprim()",
"vchar_all() dir=1or2", 3);
3121 if(cminmax[jjj][
CMIN]>0.0){ superfast[jjj]=1.0;}
3122 else if(cminmax[jjj][
CMAX]<0.0){ superfast[jjj]=-1.0;}
3124 if(
MACP0A1(ptoavg,i,j,k,
U1-1+jjj)>0.0){ superfast[jjj]=1.0;}
3125 else if(
MACP0A1(ptoavg,i,j,k,
U1-1+jjj)<0.0){ superfast[jjj]=-1.0;}
3153 rnx=(
SHIFT1==1) ? (rbndx*2+1) : 1;
3154 rny=(
SHIFT2==1) ? (rbndy*2+1) : 1;
3155 rnz=(
SHIFT3==1) ? (rbndz*2+1) : 1;
3158 numupairs=(int)(rnx*rny*rnz-1)/2;
3160 for(qq=0;qq<numupairs;qq++){
3163 ii=(int)(qq%rnx)-rbndx;
3164 jj=(int)((qq%(rnx*rny))/rnx)-rbndy;
3165 kk=(int)(qq/(rnx*rny))-rbndz;
3167 if(useonlynonfailed==1){
3179 thisnotfail=thatnotfail=1;
3187 if( ii<0 && superfast[1]>0 && thisnotfail ) thatnotfail=0;
3188 if( ii>0 && superfast[1]<0 && thatnotfail ) thisnotfail=0;
3189 if( jj<0 && superfast[2]>0 && thisnotfail ) thatnotfail=0;
3190 if( jj>0 && superfast[2]<0 && thatnotfail ) thisnotfail=0;
3191 if( kk<0 && superfast[3]>0 && thisnotfail ) thatnotfail=0;
3192 if( kk>0 && superfast[3]<0 && thatnotfail ) thisnotfail=0;
3194 if(i<
totalsize[1]/2 && ii<0) thatnotfail=0;
3195 if(i<
totalsize[1]/2 && ii>0) thisnotfail=0;
3196 if(i>=
totalsize[1]/2 && ii<0) thisnotfail=0;
3197 if(i>=
totalsize[1]/2 && ii>0) thatnotfail=0;
3218 numavg0+=thisnotfail+thatnotfail;
3222 ftemp1=
MACP0A1(ptoavg,i+ii,j+jj,k+kk,pl);
3223 ftemp2=
MACP0A1(ptoavg,i-ii,j-jj,k-kk,pl);
3228 mysum[qq%2][pl]+=ftemp1*thisnotfail + ftemp2*thatnotfail;
3234 if(ftemp1>ref[pl] && thisnotfail){
3235 lastmin[pl]=
MIN(lastmin[pl],ftemp1);
3239 if(ftemp2>ref[pl] && thatnotfail){
3240 lastmin[pl]=
MIN(lastmin[pl],ftemp2);
3245 if(ftemp1>ref[pl] && thisnotfail && ftemp2>ref[pl] && thatnotfail){
3246 lastmin[pl]=
MIN(
MIN(lastmin[pl],ftemp1),ftemp2);
3249 else if(ftemp1>ref[pl] && thisnotfail){
3250 lastmin[pl]=
MIN(lastmin[pl],ftemp1);
3253 else if(ftemp2>ref[pl] && thatnotfail){
3254 lastmin[pl]=
MIN(lastmin[pl],ftemp2);
3275 avganswer0[pl]=(mysum[0][pl]+mysum[1][pl])/((
FTYPE)(numavg0));
3279 avganswer1[pl]=lastmin[pl];
3290 int doingavgtype[NPR];
3292 doingavgtype[pl]=-1;
3295 if(failavglooptype==0 || ((failavglooptype==2)&&(numavg1[pl]==0)) ){
3298 if(failavglooptype==1 || ((failavglooptype==2)&&(numavg0==0)) ){
3307 else doingavgtype[pl]=1;
3312 int numavgfinal=256;
3315 if(numavg1[pl]!=0 && doingavgtype[pl]==0){
3316 MACP0A1(pv,i,j,k,pl)=avganswer1[pl];
3318 numavg[pl]=numavg1[pl];
3321 if(numavg0!=0 && doingavgtype[pl]==1){
3322 MACP0A1(pv,i,j,k,pl)=avganswer0[pl];
3325 numavgfinal=
MIN(numavg[pl],numavgfinal);
3331 if(numbndtotry==maxnumbndtotry) numavgfinal++;
3353 prod0dualfprintf(debugfail>=2,fail_file,
"uc2simple: i=%d j=%d k=%d\n",i,j,k);
3376 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected1\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3381 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3390 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected2\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3394 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3406 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected3\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3410 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3417 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected4\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3421 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3428 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected5\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3432 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3439 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected6\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3443 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3454 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3458 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3464 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3468 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3474 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3478 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3484 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3488 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3494 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3498 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3504 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3508 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3514 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3518 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3524 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected7\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3528 if(debugfail>=2) dualfprintf(fail_file,
"uc2: pl=%d pv=%21.15g\n",pl,
MACP0A1(pv,i,j,k,pl));
3543 #define NOGOODSTATIC 0
3544 #define NOGOODRESET 1
3545 #define NOGOODAVERAGE 2
3548 #define TODONOGOOD NOGOODAVERAGE
3557 #define WHICHPTOUSEWHENNOGOOD 0
3562 static int fixup_nogood(
int startpl,
int endpl,
int i,
int j,
int k,
int doingmhd,
PFTYPE mhdlpflag,
PFTYPE radlpflag,
FTYPE (*pv)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ptoavg)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*pbackup)[
NSTORE2][
NSTORE3][NPR],
struct of_geom *ptrgeom)
3567 int ti,tj,tk,resetregion;
3571 prod0dualfprintf(debugfail>=2,fail_file,
"uc2nogood: i=%d j=%d k=%d\n",i,j,k);
3577 ptoavgwhennogood=ptoavg;
3580 ptoavgwhennogood=pbackup;
3602 #if(USERRESETREGION==1)
3606 resetregion=(tj<=1 || tj>=
totalsize[2]-2) || (ti<10);
3607 #elif(USERRESETREGION==0)
3617 if(debugfail>=2) dualfprintf(fail_file,
"t=%21.15g : i=%d j=%d k=%d : utoprim corrected9\n",
t,
startpos[1]+i,
startpos[2]+j,
startpos[3]+k);
3629 for(pl=0;pl<=
UU;pl++)
MACP0A1(pv,i,j,k,pl)=0.5*(
AVG4_1(ptoavgwhennogood,i,j,k,pl)+
AVG4_2(ptoavgwhennogood,i,j,k,pl));
3631 set_atmosphere(0,
WHICHVEL,ptrgeom,prguess);
3632 for(pl=
U1;pl<=
U3;pl++)
MACP0A1(pv,i,j,k,pl)=prguess[pl];
3634 for(pl=
B3+1;pl<NPR;pl++)
MACP0A1(pv,i,j,k,pl)=0.5*(
AVG4_1(ptoavgwhennogood,i,j,k,pl)+
AVG4_2(ptoavgwhennogood,i,j,k,pl));
3644 #if(GENERALAVERAGE==1)
3646 int useonlynonfailed=0;
3648 int maxnumbndtotry=1;
3649 int nogood=general_average(useonlynonfailed,numbndtotry,maxnumbndtotry,startpl, endpl, i, j, k, doingmhd, mhdlpflag, radlpflag, NULL ,pv,ptoavg,ptrgeom);
3652 PLOOPSTARTEND(pl)
MACP0A1(pv,i,j,k,pl)=0.5*(
AVG4_1(ptoavgwhennogood,i,j,k,pl)+
AVG4_2(ptoavgwhennogood,i,j,k,pl));
3660 dualfprintf(fail_file,
"No condition for failure in fixup_nogood()\n");
3671 static int superdebug_utoprim(
FTYPE *pr0,
FTYPE *pr,
struct of_geom *ptrgeom,
int whocalled)
3675 FTYPE Ui[NPR],Uf[NPR];
3679 static FILE * super_fail_file;
3680 static int firsttime=1;
3682 static int countoutput=0;
3685 dualfprintf(fail_file,
"Cannot Superdebug with OpenMP\n");
3691 super_fail_file=fopen(
"superdebug.out",
"wt");
3692 if(super_fail_file==NULL){
3693 dualfprintf(fail_file,
"Cannot open superdebug.out\n");
3701 if(ranc(0,0)>0.99) output=1;
3709 if(failreturn>=1) dualfprintf(fail_file,
"get_state(1) failed in fixup.c, why???\n");
3710 failreturn=
primtoU(UDIAG,pr0,&q,ptrgeom,Ui, NULL);
3711 if(failreturn>=1) dualfprintf(fail_file,
"primtoU(1) failed in fixup.c, why???\n");
3715 if(failreturn>=1) dualfprintf(fail_file,
"get_state(2) failed in fixup.c, why???\n");
3716 failreturn=
primtoU(UDIAG,pr,&q,ptrgeom,Uf, NULL);
3717 if(failreturn>=1) dualfprintf(fail_file,
"primtoU(2) failed in fixup.c, why???\n");
3720 coord_ijk(ptrgeom->i, ptrgeom->j, ptrgeom->k, ptrgeom->p, X);
3721 bl_coord_ijk(ptrgeom->i, ptrgeom->j, ptrgeom->k, ptrgeom->p, V);
3726 fprintf(super_fail_file,
"%21.15g %21.15g %21.15g %d %d %d ",V[1],V[2],V[3],
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k);
3727 PLOOP(pliter,pl) fprintf(super_fail_file,"%21.15g %21.15g %21.15g %21.15g ",pr0[pl],pr[pl],Ui[pl],Uf[pl]);
3728 fprintf(super_fail_file,"\n");
3729 if(!(countoutput%1000)) fflush(super_fail_file);
3750 FAILSTATEMENT(
"fixup.c:set_density_floors()",
"get_state() dir=0", 1);
3752 MYFUN(
primtoU(UDIAG,pr, &q, ptrgeom, U, NULL),
"fixup.c:set_density_floors()",
"primtoU()", 1);
3755 if(rescaletype==4||rescaletype==5){
3757 dualfprintf(fail_file,
"bsq_calc:bsq_calc: failure\n");
3762 set_density_floors_default_alt(ptrgeom, &q, pr, U, bsq, prfloor, prceiling);
3773 int i=ptrgeom->i,j=ptrgeom->j,k=ptrgeom->k,
p=ptrgeom->p;
3775 coord_ijk(ptrgeom->i, ptrgeom->j, ptrgeom->k, ptrgeom->p, X);
3776 bl_coord_ijk(ptrgeom->i, ptrgeom->j, ptrgeom->k, ptrgeom->p, V);
3785 if(PRAD0>=0.0) prfloor[PRAD0]=
ERADLIMIT;
3798 else if(rescaletype==1){
3803 else if(rescaletype==2){
3831 prfloor[
UU]=prfloor[
RHO]*0.01;
3834 else if(rescaletype==3){
3839 else if(rescaletype==4||rescaletype==5){
3847 FTYPE UORHOLIMITTEMP=0.5;
3848 FTYPE TRESTART=5930;
3849 FTYPE TRESTARTE=5921;
3856 prfloor[
RHO]=
MAX(bsq/BSQORHOLIMITTEMP,SMALL);
3857 prfloor[
UU]=
MAX(
MIN(pr[
UU],UORHOLIMITTEMP*prfloor[
RHO]),SMALL);
3859 else if(
t<TRESTART){
3869 prfloor[
UU]=
MAX(
MIN(pr[
UU],UORHOLIMITTEMP*prfloor[
RHO]),SMALL);
3874 prfloor[
UU]=
MAX(
MIN(pr[
UU],UORHOLIMITTEMP*prfloor[
RHO]),SMALL);
3897 prfloor[
RHO]*=pow(500,-1.5);
3898 prfloor[
UU]*=pow(500,-2.5);
3901 prfloor[
RHO]*=(pow(r,-1.5)+pow(500,-1.5));
3902 prfloor[
UU]*=(pow(r,-2.5)+pow(500,-2.5));
3907 FTYPE Z=fabs(r*cos(th));
3909 prfloor[
RHO]*=pow(500,-1.5);
3910 prfloor[
UU]*=pow(500,-2.5);
3913 prfloor[
RHO]*=pow(Z,-1.5);
3914 prfloor[
UU]*=pow(Z,-2.5);
3919 FTYPE Z=fabs(r*cos(th));
3920 prfloor[
RHO]*=
MIN(1.0/(pow(Z,1.5)*pow(R,-1.5)),1.0);
3921 prfloor[
UU]*=
MIN(1.0/(pow(Z,2.5)*pow(R,-2.5)),1.0);
3975 #define FLOORDAMPFRAC (0.1)
3976 #define NUMBSQFLAGS 5
3990 struct of_geom *ptrgeom=&geomdontuse;
4043 #if(WHICHVEL==VELREL4)
4045 if(gamma_calc(
MAC(pv,i,j,k),ptrgeom,&gamma,&qsq)>=1){
4046 dualfprintf(fail_file,
"gamma calc failed: get_bsqflags\n");
4060 set_density_floors(ptrgeom,
MAC(pv,i,j,k),prfloor,prceiling);
4077 GLOBALMACP0A1(pflag,i,j,k,
FLAGBSQOU)=flags[3];
4082 if((flags[0]==2)||(flags[1]==2)||(flags[2]==2)||(flags[3]==2)||(flags[4]==2)){ GLOBALMACP0A1(pflag,i,j,k,
FLAGREALLIM)=limgen-1; }
4083 else if((flags[0]==1)||(flags[1]==1)||(flags[2]==1)||(flags[3]==1)||(flags[4]==1)){ GLOBALMACP0A1(pflag,i,j,k,
FLAGREALLIM)=limgen-1; }
4084 else{GLOBALMACP0A1(pflag,i,j,k,
FLAGREALLIM)=limgen;}
4090 if((flags[0]==2)||(flags[1]==2)||(flags[2]==2)||(flags[3]==2)||(flags[4]==2)){ GLOBALMACP0A1(pflag,i,j,k,
FLAGREALFLUX)=
fluxmethod[
RHO]-1;}
4091 else if((flags[0]==1)||(flags[1]==1)||(flags[2]==1)||(flags[3]==1)||(flags[4]==1)){ GLOBALMACP0A1(pflag,i,j,k,
FLAGREALFLUX)=
fluxmethod[
RHO]; }
4104 #define GAMMAERGOLIMIT 0
4111 #define DO_CONSERVE_D 0
4114 int limit_gamma(
int docorrectucons,
FTYPE gammamax,
FTYPE gammamaxrad,
FTYPE*pr,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep)
4119 FTYPE radgamma,radqsq;
4122 FTYPE realgammamax,realgammamaxrad;
4151 if(r<2) realgammamax=3;
4155 realgammamax=gammamax;
4156 realgammamaxrad=gammamaxrad;
4157 if(realgammamax<=1.0 && realgammamaxrad<=1.0)
return(0);
4171 if(gamma_calc(pr,ptrgeom,&gamma,&qsq)>=1){
4172 dualfprintf(fail_file,
"limit_gamma: gamma calc failed\n");
4173 dualfprintf(fail_file,
"i=%d j=%d k=%d oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,gamma);
4179 if(gamma_calc(&pr[URAD1-
U1],ptrgeom,&radgamma,&radqsq)>=1){
4180 dualfprintf(fail_file,
"limit_gamma: gamma calc failed: rad\n");
4181 dualfprintf(fail_file,
"i=%d j=%d k=%d : rad : oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,gamma);
4203 if((gamma > realgammamax && (gamma!=1.0))) {
4206 pref=(realgammamax*realgammamax - 1.)/(gamma*gamma - 1.);
4209 dualfprintf(fail_file,
"nstep=%ld steppart=%d t=%21.15g :: i=%d j=%d k=%d :: pref=%21.15g oldgamma=%21.15g realgammamax=%21.15g\n",
nstep,
steppart,
t,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,pref,gamma,realgammamax);
4213 dualfprintf(fail_file,
"limit_gamma: pref calc failed pref=%21.15g\n",pref);
4214 dualfprintf(fail_file,
"i=%d j=%d k=%d oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,gamma);
4229 pr[
RHO] = pr0[
RHO]*gamma/realgammamax;
4241 if((radgamma > realgammamaxrad && (radgamma!=1.0))) {
4244 pref=(realgammamaxrad*realgammamaxrad - 1.)/(radgamma*radgamma - 1.);
4247 dualfprintf(fail_file,
"nstep=%ld steppart=%d t=%21.15g :: i=%d j=%d k=%d :: pref=%21.15g oldradgamma=%21.15g realgammamaxrad=%21.15g\n",
nstep,
steppart,
t,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,pref,radgamma,realgammamaxrad);
4251 dualfprintf(fail_file,
"limit_gamma: pref calc failed pref=%21.15g\n",pref);
4252 dualfprintf(fail_file,
"i=%d j=%d k=%d oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,radgamma);
4263 radgamma=gammamaxrad;
4278 alpha = ptrgeom->alphalapse;
4280 uu0max=realgammamax;
4283 if((uu0 > uu0max && (uu0!=1.0))) {
4287 if(debugfail>=2) dualfprintf(fail_file,
"i=%d j=%d k=%d oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,gamma);
4289 pref=(uu0max*uu0max*alpha*alpha - 1.)/(gamma*gamma - 1.);
4291 dualfprintf(fail_file,
"limit_gamma: pref calc failed pref=%21.15g\n",pref);
4292 dualfprintf(fail_file,
"i=%d j=%d k=%d oldgamma=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,gamma);
4306 pr[
RHO] = pr0[
RHO]*uu0/uu0max;
4323 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4324 int doingmhdfixup=1;
4328 diag_fixup(docorrectucons,prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,
COUNTLIMITGAMMAACT);
4329 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4349 #define UTLIMIT (50.0) // limit of u^t given no other info and need to fix u
4350 #define UTFIX (utobs) // if failed u^t, then fix to this level to keep normal, or use local value as desired value
4351 #define GRADIENTFACTOR (.001) // how to set?
4356 int check_pr(
FTYPE *pr,
FTYPE *prmodel,
FTYPE *ucons,
struct of_geom *ptrgeom,
int modelpos,
int finalstep)
4361 FTYPE ucon[NPR],uconmodel[NPR];
4363 FTYPE prold[NPR],probs[NPR];
4365 int trialcount,ntrials;
4368 FTYPE lastuttdiscr,uttdiscr0,utobs;
4369 FTYPE dampfactor,dampfactorchange;
4370 FTYPE newerr,olderr;
4372 struct of_geom modelgeomdontuse;
4373 struct of_geom *ptrmodelgeom=&modelgeomdontuse;
4375 FTYPE realutlimit,realdiscrlimit;
4379 int modeli,modelj,modelk;
4393 dampfactorchange=0.5;
4401 PALLLOOP(pl) probs[pl]=prold[pl]=pr[pl];
4405 if(
ucon_calc(pr, ptrgeom, ucon,others) >= 1) ucon[
TT]=1E30;
4419 if(modelpos==-2)
return(1);
4439 if(
ucon_calc(probs, ptrgeom, ucon, others) >= 1){
4440 dualfprintf(fail_file,
"Thought normal observer had to have good u^t!\n");
4443 else utobs=ucon[
TT];
4447 if(utinterp&&(modelpos>=0)){
4453 ptrmodelgeom=ptrgeom;
4456 else if(modelpos==1){
4457 if(ptrgeom->p==
FACE1){ idel=1; jdel=0; kdel=0; }
4458 else if(ptrgeom->p==
FACE2){ idel=0; jdel=1; kdel=0; }
4459 else if(ptrgeom->p==
FACE3){ idel=0; jdel=0; kdel=1; }
4460 modeli=(ptrgeom->i) -idel;
4461 modelj=(ptrgeom->j) -jdel;
4462 modelk=(ptrgeom->k) -kdel;
4466 else if(modelpos==2){
4474 if(
ucon_calc(prmodel, ptrmodelgeom, uconmodel, othersmodel) >= 1){
4477 dualfprintf(fail_file,
"serious failure. On-grid values and fixed bc values used have u^t imaginary: modeli: %d modelj: %d uttdiscr: %21.15g\n",
startpos[1]+modeli,
startpos[2]+modelj,
uttdiscr);
4482 else uconmodel[
TT]=realutlimit=1E30;
4485 else realutlimit=uconmodel[
TT];
4491 else realutlimit=
UTFIX;
4493 realdiscrlimit=1.0/(realutlimit*realutlimit);
4494 newerr=olderr=fabs(lastuttdiscr-realdiscrlimit)/realdiscrlimit;
4504 while( ((newerr>toldiscr)&&(method==1)) ||((ucon[
TT]>realutlimit)&&(method==0)) ){
4510 gradient[
i]=2.0*(ptrgeom->gcov[
GIND(0,i)]);
4513 gradient[
i]+=2.0*ucon[
j]*ptrgeom->gcov[
GIND(i,j)];
4515 normsq+=gradient[
i]*gradient[
i];
4519 gradient[
i]/=sqrt(normsq);
4531 prold[
U1+i-1]=pr[
U1+i-1];
4532 if(realdiscrlimit-
uttdiscr>0) pr[
U1+i-1]-=gradient[
i]*dampfactor;
4533 else pr[
U1+i-1]+=gradient[
i]*dampfactor;
4537 if(
ucon_calc(pr, ptrgeom, ucon,others) >= 1) ucon[
TT]=1E30;
4538 newerr=fabs(
uttdiscr-realdiscrlimit)/realdiscrlimit;
4539 if((method==1)&&(newerr>=olderr)){
4541 dampfactor*=dampfactorchange;
4542 if(dampfactor<1
E-10){
4543 if((fabs(ucon[
TT]-realutlimit)/realutlimit)<0.5)
break;
4546 if(debugfail>=1) dualfprintf(fail_file,
"dumpfactor reached min\n");
4552 pr[
U1+i-1]=prold[
U1+i-1];
4560 if((myid==0)&&(ptrgeom->i==117)&&(ptrgeom->j==-1)){
4561 dualfprintf(fail_file,
"trialcount=%d uttdiscr0=%21.15g uttdiscr=%21.15g newerr: %21.15g dampfactor=%21.15g\n",trialcount,uttdiscr0,
uttdiscr,newerr,dampfactor);
4565 if(trialcount==ntrials){
4566 if((fabs(ucon[
TT]-realutlimit)/realutlimit)<0.5)
break;
4569 if(debugfail>=1) dualfprintf(fail_file,
"number of trials reached max\n");
4577 if(debugfail>=1) dualfprintf(fail_file,
"couldn't fix ucon[TT]=%21.15g newerr=%21.15g uttdiscr=%21.15g\n",ucon[
TT],newerr,
uttdiscr);
4578 if(debugfail>=1) dualfprintf(fail_file,
"check_pr failure: t=%21.15g , couldn't fix ucon: i=%d j=%d k=%d p=%d ucon[TT]=%21.15g realutlimit=%21.15g uconmodel[TT]=%21.15g\n",
t,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,ptrgeom->p,ucon[TT],realutlimit,uconmodel[TT]);
4579 if(debugfail>=1) dualfprintf(fail_file,
"uttdiscr0=%21.15g uttdiscr=%21.15g realdiscrlimit=%21.15g modeldiscr=%21.15g dampfactor=%21.15g\n",uttdiscr0,
uttdiscr,realdiscrlimit,modeldiscr,dampfactor);
4583 dualfprintf(fail_file,
"pr[%d]=%21.15g prmodel[%d]=%21.15g\n",pl,pr[pl],pl,prmodel[pl]);
4585 if(debugfail>=1) dualfprintf(fail_file,
"need better algorithm: check_pr failure: couldn't fix ucon: i=%d j=%d k=%d p=%d ucon[TT]=%21.15g\n",
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,ptrgeom->p,ucon[TT]);
4594 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4595 int doingmhdfixup=1;
4597 diag_fixup(docorrectucons,prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,
COUNTLIMITGAMMAACT);
4598 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4608 int inflow_check_4vel(
int dir,
FTYPE *pr,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep)
4614 FTYPE pr0[NPR],prdiag[NPR];
4625 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE2)||(ptrgeom->p==
FACE3)||(ptrgeom->p==
CORN1) ){ iin=-1; iout=
totalsize[1]; }
4628 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4640 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4641 int doingmhdfixup=1;
4643 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4655 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4656 int doingmhdfixup=1;
4657 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4658 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4667 set_atmosphere(1,
WHICHVEL,ptrgeom,pr);
4670 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4671 int doingmhdfixup=1;
4672 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4673 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4678 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE1)||(ptrgeom->p==
FACE3)||(ptrgeom->p==
CORN2) ){ jjn=-1; jout=
totalsize[2]; }
4681 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4693 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4694 int doingmhdfixup=1;
4695 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4696 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4708 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4709 int doingmhdfixup=1;
4710 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4711 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4716 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE2)||(ptrgeom->p==
FACE3)||(ptrgeom->p==
CORN3) ){ kkn=-1; kout=
totalsize[3]; }
4719 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4731 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4732 int doingmhdfixup=1;
4733 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4734 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4746 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4747 int doingmhdfixup=1;
4748 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4749 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4759 int inflow_check_3vel(
int dir,
FTYPE *pr,
FTYPE *ucons, struct
of_geom *ptrgeom,
int finalstep)
4762 return(inflow_check_4vel(dir,pr,ucons, ptrgeom,-1));
4768 int inflow_check_rel4vel(
int dir,
FTYPE *pr,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep)
4776 FTYPE alpha,betacon,gamma,vsq ;
4781 int dofix=0, dofixrad=0;
4796 MYFUN(
ucon_calc(pr, ptrgeom, ucon, others),
"fixup.c:inflow_check_rel4vel()",
"ucon_calc() dir=0", 1);
4797 MYFUN(
ucon_calc(&pr[URAD1-U1], ptrgeom, uradcon, othersrad),
"fixup.c:inflow_check_rel4vel()",
"ucon_calc() dir=0", 1);
4805 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE2)||(ptrgeom->p==
FACE3)||(ptrgeom->p==
CORN1) ){ iin=-1; iout=
totalsize[1]; }
4808 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4832 set_atmosphere(1,
WHICHVEL,ptrgeom,pr);
4838 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE1)||(ptrgeom->p==
FACE3)||(ptrgeom->p==
CORN2) ){ jjn=-1; jout=
totalsize[2]; }
4841 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4860 if((ptrgeom->p==CENT)||(ptrgeom->p==
FACE1)||(ptrgeom->p==
FACE2)||(ptrgeom->p==
CORN3) ){ kkn=-1; kout=
totalsize[3]; }
4863 dualfprintf(fail_file,
"dir=%d no such location: %d\n",dir,ptrgeom->p);
4881 dualfprintf(fail_file,
"Shouldn't reach dir=%d\n",dir);
4891 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4895 if(gamma_calc(pr,ptrgeom,&gamma,&qsq)>=1){
4896 dualfprintf(fail_file,
"gamma calc failed: inflow_check_rel4vel\n");
4903 alpha = 1./sqrt(-ptrgeom->gcon[
GIND(0,0)]) ;
4908 betacon = ptrgeom->gcon[
GIND(0,1)]*alpha*alpha ;
4909 pr[
U1] = betacon/alpha ;
4912 betacon = ptrgeom->gcon[
GIND(0,2)]*alpha*alpha ;
4913 pr[
U2] = betacon/alpha ;
4916 betacon = ptrgeom->gcon[
GIND(0,3)]*alpha*alpha ;
4917 pr[
U3] = betacon/alpha ;
4921 SLOOP(j,k) vsq += ptrgeom->
gcov[
GIND(j,k)]*pr[U1+j-1]*pr[U1+k-1] ;
4926 trifprintf(
"vsq=%21.15g\n",vsq);
4933 if(debugfail>=1) dualfprintf(fail_file,
"i=%d j=%d k=%d inflow limit required change in gamma (after dofix==%d): vsq=%21.15g newvsq=%21.15g\n",ii+
startpos[1],jj+
startpos[2],kk+
startpos[3],dofix,vsq,1.0-1.0/(
GAMMAMAX*
GAMMAMAX));
4940 gamma = 1./sqrt(1. - vsq) ;
4946 int doingmhdfixup=1;
4947 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
4948 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
4959 PLOOP(pliter,pl) prdiag[pl]=pr0[pl];
4963 if(gamma_calc(&pr[URAD1-U1],ptrgeom,&gamma,&qsq)>=1){
4964 dualfprintf(fail_file,
"gamma calc failed: inflow_check_rel4vel\n");
4968 pr[URAD1] /= gamma ;
4969 pr[URAD2] /= gamma ;
4970 pr[URAD3] /= gamma ;
4971 alpha = 1./sqrt(-ptrgeom->gcon[
GIND(0,0)]) ;
4976 betacon = ptrgeom->gcon[
GIND(0,1)]*alpha*alpha ;
4977 pr[URAD1] = betacon/alpha ;
4979 else if(dofixrad==2){
4980 betacon = ptrgeom->gcon[
GIND(0,2)]*alpha*alpha ;
4981 pr[URAD2] = betacon/alpha ;
4983 else if(dofixrad==3){
4984 betacon = ptrgeom->gcon[
GIND(0,3)]*alpha*alpha ;
4985 pr[URAD3] = betacon/alpha ;
4989 SLOOP(j,k) vsq += ptrgeom->
gcov[
GIND(j,k)]*pr[URAD1+j-1]*pr[URAD1+k-1] ;
4994 trifprintf(
"vsq=%21.15g\n",vsq);
5001 if(debugfail>=1) dualfprintf(fail_file,
"i=%d j=%d k=%d inflow limit required change in gamma (after dofix==%d): vsq=%21.15g newvsq=%21.15g\n",ii+
startpos[1],jj+
startpos[2],kk+
startpos[3],dofix,vsq,1.0-1.0/(
GAMMAMAX*
GAMMAMAX));
5008 gamma = 1./sqrt(1. - vsq) ;
5009 pr[URAD1] *= gamma ;
5010 pr[URAD2] *= gamma ;
5011 pr[URAD3] *= gamma ;
5014 int doingmhdfixup=1;
5015 diag_fixup((
DOENOFLUX != NOENOFLUX),prdiag, pr, ucons, ptrgeom, finalstep,doingmhdfixup,COUNTINFLOWACT);
5016 PLOOP(pliter,pl) prdiag[pl]=pr[pl];
5021 if(dofix||dofixrad){
5053 set_boundloop(boundvartype, inboundloop,outboundloop,innormalloop,outnormalloop,inoutlohi, &riin, &riout, &rjin, &rjout, &rkin, &rkout, dosetbc);
5102 if(mycpupos[1]==
ncpux1-1){
5116 void diag_eosfaillookup(
int i,
int j,
int k)
5127 dualfprintf(fail_file,
"In diag_eosfaillookup() whocalled=%d for i=%d j=%d k=%d\n",whocalled,i,j,k);