16 #define CHECKONINVFRAC (1E-1)
18 #define CHECKONINVFRAC (1E-2)
20 #define CHECKONINVFRAC (MAX(1E-7,newtonstats->tryconv*1E3)) // can't check if didn't ask for large error.
24 #define FAILIFBADCHECK 1
27 #define CHECKONINVFRACFAIL (1E-1)
29 #define REPORTCYCLE (10)
32 #define ENTROPYFIXGUESSEXTERNAL (ENTROPYFIXGUESS)
37 static int negdensitycheck(
int finalstep,
FTYPE *prim,
PFTYPE *pflag);
38 static int check_on_inversion(
int checkoninversiongas,
int checkoninversionrad,
int usedhotinversion,
int usedentropyinversion,
int usedcoldinversion,
int usedffdeinversion,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
struct of_geom *ptrgeom,
FTYPE *Uold,
FTYPE *Unew,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
40 static int compare_ffde_inversions(
int showmessages,
int allowlocalfailurefixandnoreport,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
struct of_geom *ptrgeom,
FTYPE *Ugeomfree0,
FTYPE*Ugeomfree,
FTYPE *Uold,
FTYPE *Unew,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
42 static int tryhotinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
43 static int tryentropyinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
44 static int trycoldinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
45 static int tryffdeinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
53 int Utoprimgen(
int showmessages,
int checkoninversiongas,
int checkoninversionrad,
int allowlocalfailurefixandnoreport,
int finalstep,
int *eomtype,
int whichcap,
int whichmethod,
int modprim,
int evolvetype,
int inputtype,
FTYPE *U,
struct of_state *qptr,
struct of_geom *ptrgeom,
FTYPE dissmeasure,
FTYPE *pi,
FTYPE *
pr,
struct of_newtonstats *newtonstats)
57 FTYPE Ugeomfree[NPR],Ugeomfree0[NPR];
62 FTYPE Uold[NPR],Unew[NPR];
64 extern void UtoU(
int inputtype,
int returntype,
struct of_geom *ptrgeom,
FTYPE *Uin,
FTYPE *Uout);
65 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
66 int Utoprimgen_compare(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
67 int Utoprimgen_tryagain(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
68 int Utoprimgen_tryagain2(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
69 void convert_U_removerestmassfromuu(
int utoprimverison,
int removerestmassfromuu,
FTYPE *U);
74 int usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion;
75 FTYPE pressuremem=-1.0;
76 FTYPE *pressure=&pressuremem;
140 UtoU(inputtype,
UNOTHING,ptrgeom,U,Ugeomfree);
145 PLOOPBONLY(pl) Ugeomfree[pl]=U[pl]/ptrgeom->e[pl];
157 Uold[pl]=Ugeomfree0[pl]=Ugeomfree[pl];
189 static long long int didnothing=0,didsomething=0,didentropy=0,didenergy=0,didcold=0;
200 usedhotinversion=usedentropyinversion=usedcoldinversion=usedffdeinversion=0;
207 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
210 negdensitycheck(finalstep, pr, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL));
225 else eomtypelocal=*eomtype;
228 set_fracenergy(ptrgeom->i,ptrgeom->j,ptrgeom->k,dissmeasure, &fracenergy);
230 else fracenergy = (eomtypelocal==
EOMGRMHD ? 1.0 : 0.0);
235 if(eomtypelocal==
EOMGRMHD) didenergy++;
240 if(debugfail>=2)
if(didsomething%(
totalzones*
REPORTCYCLE)==0) dualfprintf(
fail_file,
"DIDSOMETHING: %lld : %ld %d : eomtype=%d -> eomtypelocal=%d : dids: %lld %lld %lld\n",didsomething,
nstep,
steppart,*eomtype,eomtypelocal,didenergy,didentropy,didcold);
279 Uold[pl]=Ugeomfree0[pl]=Ugeomfree[pl];
298 usedentropyinversion=0;
304 PFTYPE preexistingfailgas=0;
308 PFTYPE preexistingfailrad=0;
315 int entropytried=0,hottried=0,coldtried=0,ffdetried=0;
317 PFTYPE entropyradinvmod=1,hotradinvmod=1,coldradinvmod=1,ffderadinvmod=1;
318 int entropyhardfailure=1,hothardfailure=1,coldhardfailure=1,ffdehardfailure=1;
319 FTYPE entropypr[NPR],hotpr[NPR],coldpr[NPR],ffdepr[NPR];
336 *eomtype=eomtypelocal;
343 entropyfixguess(qptr, ptrgeom, Ugeomfree, pr);
345 pr[
UU]=
MAX(fabs(pr[
UU]),fabs(pi[UU]));
351 if(
UTOPRIMVERSION!=
UTOPRIMCOMPARE)
Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMVERSION, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
352 else Utoprimgen_compare(showmessages, allowlocalfailurefixandnoreport, eomtypelocal, whichcap,
EVOLVENOENTROPY,Ugeomfree,ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
357 #if((WHICHVEL==VELREL4)&&(REMOVERESTMASSFROMUU<=1)&&(UTOPRIMTRYAGAIN))
358 Utoprimgen_tryagain(showmessages, allowlocalfailurefixandnoreport, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree0, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
359 #elif((WHICHVEL==VELREL4)&&(REMOVERESTMASSFROMUU==2)&&(UTOPRIMTRYAGAIN))
361 Utoprimgen_tryagain2(showmessages, allowlocalfailurefixandnoreport, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree0, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
363 PLOOP(pliter,pl) hotpr[pl]=pr[pl];
367 hotpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
368 hotradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
376 usedentropyinversion=0;
380 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
383 hotpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
384 hotradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
391 if(0&&debugfail>=2&&hothardfailure){
393 extern int mathematica_report_check(
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
FTYPE errorabs,
FTYPE errorabsbestexternal,
int iters,
int iterstotal,
FTYPE realdt,
struct of_geom *ptrgeom,
FTYPE *ppfirst,
FTYPE *pp,
FTYPE *pb,
FTYPE *piin,
FTYPE *prtestUiin,
FTYPE *prtestUU0,
FTYPE *uu0,
FTYPE *uu,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
struct of_state *q,
FTYPE *dUother);
394 static long long int failnum=0;
397 FTYPE dUother[NPR]={0};
401 mathematica_report_check(0, 2, failnum, (
int)hotpflag, eomtypelocal, 0, 0.0, 0.0, -1, -1, fakedt, ptrgeom, pr, pr, pr, pr0, pr0, pr0, Ugeomfree0, Ugeomfree, Ugeomfree0, Ugeomfree0, fakeCUf, qptr, dUother);
410 int forcetryentropy=0;
414 entropytried=tryentropyinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, hotpflag, forcetryentropy, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
415 PLOOP(pliter,pl) entropypr[pl]=pr[pl];
419 entropypflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
420 entropyradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
423 if(!entropyhardfailure){
428 usedentropyinversion=1;
433 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
436 entropypflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
437 entropyradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
452 coldtried=trycoldinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, hotpflag, 0, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
453 PLOOP(pliter,pl) coldpr[pl]=pr[pl];
457 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
458 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
461 if(!coldhardfailure){
463 usedentropyinversion=0;
471 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
474 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
475 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
489 ffdetried=tryffdeinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, hotpflag, 0, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
490 PLOOP(pliter,pl) ffdepr[pl]=pr[pl];
494 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
495 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
498 if(!ffdehardfailure){
500 usedentropyinversion=0;
508 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
511 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
512 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
534 *eomtype=eomtypelocal;
541 entropyfixguess(qptr, ptrgeom, Ugeomfree, pr);
543 pr[
UU]=
MAX(fabs(pr[
UU]),fabs(pi[UU]));
552 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT, eomtypelocal, whichcap, whichentropy, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
553 PLOOP(pliter,pl) entropypr[pl]=pr[pl];
556 entropypflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
557 entropyradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
560 if(!entropyhardfailure){
566 usedentropyinversion=1;
570 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
573 entropypflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
574 entropyradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
591 hottried=tryhotinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, entropypflag, forcetryhot, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
592 PLOOP(pliter,pl) hotpr[pl]=pr[pl];
596 hotpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
597 hotradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
607 usedentropyinversion=0;
611 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
614 hotpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
615 hotradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
629 coldtried=trycoldinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, entropypflag, 0, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
630 PLOOP(pliter,pl) coldpr[pl]=pr[pl];
635 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
636 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
639 if(!coldhardfailure){
644 usedentropyinversion=0;
649 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
652 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
653 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
666 ffdetried=tryffdeinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, entropypflag, 0, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
667 PLOOP(pliter,pl) ffdepr[pl]=pr[pl];
672 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
673 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
676 if(!ffdehardfailure){
678 usedentropyinversion=0;
686 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
689 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
690 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
708 *eomtype=eomtypelocal;
713 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
716 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMCOLDGRMHD, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
718 PLOOP(pliter,pl) coldpr[pl]=pr[pl];
720 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
721 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
724 if(!coldhardfailure){
727 usedentropyinversion=0;
732 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
735 coldpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
736 coldradinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
747 ffdetried=tryffdeinversion(showmessages, allowlocalfailurefixandnoreport,finalstep, coldpflag, 0, whichcap, modprim, pi, pr0, pr, pressure, Ugeomfree, Ugeomfree0, qptr, ptrgeom,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
748 PLOOP(pliter,pl) ffdepr[pl]=pr[pl];
753 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
754 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
757 if(!ffdehardfailure){
759 usedentropyinversion=0;
767 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
770 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
771 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
782 else if(eomtypelocal==
EOMFFDE){
790 *eomtype=eomtypelocal;
798 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMFFDE, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
802 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr,pressure,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
805 compare_ffde_inversions(showmessages, allowlocalfailurefixandnoreport,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Ugeomfree0, Ugeomfree, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
807 PLOOP(pliter,pl) ffdepr[pl]=pr[pl];
812 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
813 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
816 if(!ffdehardfailure){
818 usedentropyinversion=0;
826 check_on_inversion(checkoninversiongas, checkoninversionrad, usedhotinversion,usedentropyinversion,usedcoldinversion,usedffdeinversion,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr0, pr, pressure, ptrgeom, Uold, Unew,newtonstats,&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL));
829 ffdepflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
830 ffderadinvmod=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL);
847 static long long int numpicks=0,didpickenergy=0,didpickentropy=0,didpicknormal=0,didpicknotbest=0;
848 if((whichmethod==
MODEPICKBEST) && hottried && hothardfailure==0 && entropytried && entropyhardfailure==0){
854 doentropy=whetherdoentropy(ptrgeom, fracenergy, !entropyhardfailure, !hothardfailure, entropyradinvmod, hotradinvmod, 1
E-16, 1
E-9, 1
E-10, 1
E-18, 1
E-18, entropypr, hotpr);
857 PLOOP(pliter,pl) pr[pl]=entropypr[pl];
858 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=entropypflag;
859 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL)=entropyradinvmod;
863 else if(!hothardfailure){
864 PLOOP(pliter,pl) pr[pl]=hotpr[pl];
865 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=hotpflag;
866 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL)=hotradinvmod;
882 if((whichmethod==
MODEPICKBEST) && debugfail>=2)
if(numpicks>0 && numpicks%(
totalzones*
REPORTCYCLE)==0) dualfprintf(
fail_file,
"DIDPICKS: %lld : %lld %lld %lld : %lld : %d\n",numpicks,didpickenergy,didpickentropy,didpicknormal,didpicknotbest,*eomtype);
895 negdensitycheck(finalstep, pr, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL));
913 lpflag=GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
920 if(showmessages&&debugfail>=1) dualfprintf(
fail_file,
"SOFT Failed to find a prim. var. solution on finalstep=%d!! t=%21.15g steppart=%d nstep=%ld i=%d j=%d k=%d : fail=%d : errx=%21.15g lpflagrad=%d\n",finalstep,
t,
steppart,
realnstep,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,lpflag,newtonstats->
lerrx,lpflagrad);
923 if(showmessages) dualfprintf(
fail_file,
"Failed to find a prim. var. solution on finalstep=%d!! t=%21.15g steppart=%d nstep=%ld i=%d j=%d k=%d : fail=%d : errx=%21.15g lpflagrad=%d\n",finalstep,
t,
steppart,
realnstep,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,lpflag,newtonstats->
lerrx,lpflagrad);
940 debug_utoprimgen(&lpflag, pr0, pr, ptrgeom, Uold, Unew);
952 if(preexistingfailgas) GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=preexistingfailgas;
953 if(preexistingfailrad) GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL)=preexistingfailrad;
958 if(preexistingfailgas>0 || preexistingfailrad>0){
966 FTYPE ub[NPR],ubabs[NPR];
968 primtoU(uutype,pr,&qb,ptrgeom,ub,ubabs);
974 PLOOP(pliter,pl) utot[pl] = Ugeomfree0[pl];
978 FTYPE ubdiag[NPR],utotdiag[NPR];
983 PLOOP(pliter,pl)
if(
BPL(pl)) utotdiag[pl] = ubdiag[pl];
1000 gamma_calc(pr,ptrgeom,&gamma,&qsq);
1004 if(bsqorho>
BSQORHOLIMIT/5.0 && tautotmax<1
E-1 && gamma<gammamaxlimit){
1011 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=preexistingfailgas;
1024 FTYPE radgamma,radqsq;
1025 gamma_calc(&pr[URAD1-
U1],ptrgeom,&radgamma,&radqsq);
1028 if(tautotmax<1
E-3 && radgamma<radgammamaxlimit){
1034 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL)=preexistingfailrad;
1042 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMRADFAIL)=preexistingfailrad;
1050 int docorrectuconslocal=0;
1051 extern int diag_fixup_dUandaccount(
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep,
int whocalled,
int docorrectuconslocal);
1052 diag_fixup_dUandaccount(utotdiag, ubdiag, NULL, ptrgeom, finalstep, whocalled, docorrectuconslocal);
1107 int tryhotinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *
pr,
FTYPE *
pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
1111 FTYPE prentropy[NPR],prhot[NPR];
1113 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
1117 int TRYNEWIFOLDUNEG=1;
1119 int TRYNEWIFOLDRHONEG=1;
1121 int TRYNEWIFOLDFAILCONV=1;
1137 if(badfailure || forcetry){
1142 prentropy[pl]=pr[pl];
1143 Ugeomfree[pl]=Ugeomfree0[pl];
1146 if(badfailure==0 && forcetry) prhot[pl]=prentropy[pl];
1147 else prhot[pl]=pr0[pl];
1155 entropyfixguess(qptr, ptrgeom, Ugeomfree, prhot);
1157 prhot[
UU]=
MAX(fabs(prhot[
UU]),fabs(pi[UU]));
1162 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMVERSION, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &hotpflag, prhot,pressure,newtonstats, lpflagrad);
1182 FTYPE Uievolve[NPR];
1208 if(forcetry==0 && debugfail>=2 && showmessages){
1209 dualfprintf(
fail_file,
"Tried hot and bad on finalstep=%d! t=%g steppart=%d nstep=%ld i=%d j=%d k=%d :: hotpflag=%d hotpflag=%d\n",finalstep,
t,
steppart,
nstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,hotpflag,hotpflag);
1232 int tryentropyinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
1236 FTYPE prold[NPR],prentropy[NPR];
1238 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
1244 int TRYNEWIFOLDUNEG=1;
1246 int TRYNEWIFOLDRHONEG=1;
1248 int TRYNEWIFOLDFAILCONV=1;
1264 if(badfailure || forcetry){
1272 Ugeomfree[pl]=Ugeomfree0[pl];
1275 if(forcetry && badfailure==0) prentropy[pl]=prold[pl];
1276 else prentropy[pl]=pr0[pl];
1284 entropyfixguess(qptr, ptrgeom, Ugeomfree, prentropy);
1286 prentropy[
UU]=
MAX(fabs(prentropy[
UU]),fabs(pi[UU]));
1293 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT, eomtypelocal, whichcap, whichentropy, Ugeomfree, ptrgeom, &entropypflag, prentropy,pressure,newtonstats, lpflagrad);
1313 FTYPE Uievolve[NPR];
1332 if(forcetry==0 && debugfail>=2 && showmessages) dualfprintf(
fail_file,
"Tried entropy and good on finalstep=%d! steppart=%d nstep=%ld i=%d j=%d k=%d :: oldpflag=%d entropypflag=%d\n",finalstep,
steppart,
nstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,entropypflag);
1355 GLOBALMACP0A1(pflag,ptrgeom->
i,ptrgeom->
j,ptrgeom->k,
FLAGUTOPRIMFAIL)=entropypflag;
1359 if(forcetry==0 && debugfail>=2 && showmessages){
1360 dualfprintf(
fail_file,
"Tried entropy and bad on finalstep=%d! t=%g steppart=%d nstep=%ld i=%d j=%d k=%d :: oldpflag=%d entropypflag=%d\n",finalstep,
t,
steppart,
nstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,entropypflag);
1379 return(triedentropy);
1392 int trycoldinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
1396 FTYPE prold[NPR],prcold[NPR];
1398 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
1403 int TRYNEWIFOLDUNEG=1;
1405 int TRYNEWIFOLDRHONEG=1;
1407 int TRYNEWIFOLDFAILCONV=1;
1426 FTYPE COLDFACTOR=0.1;
1427 int iscoldflow=
isflowcold(COLDFACTOR, includerad, pr0, ptrgeom, qptr, NULL);
1428 if(iscoldflow==0)
if(debugfail>=2) dualfprintf(
fail_file,
"in trycoldinversion but iscoldflow=0\n");
1432 if((badfailure || forcetry)&&iscoldflow){
1440 Ugeomfree[pl]=Ugeomfree0[pl];
1448 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT,
EOMCOLDGRMHD, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &coldpflag, prcold,pressure,newtonstats, lpflagrad);
1453 gamma_calc(pr,ptrgeom,&gamma,&qsq);
1467 pl=
UU; pr[pl] = pr0[pl];
1474 if(forcetry==0 && debugfail>=2) dualfprintf(
fail_file,
"Tried cold and good on finalstep=%d! i=%d j=%d k=%d :: oldpflag=%d coldpflag=%d\n",finalstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,coldpflag);
1523 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=coldpflag;
1533 if(forcetry==0 && debugfail>=2) dualfprintf(
fail_file,
"Tried cold and bad on finalstep=%d! t=%g steppart=%d nstep=%ld i=%d j=%d k=%d :: oldpflag=%d coldpflag=%d\n",finalstep,
t,
steppart,
nstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,coldpflag);
1551 int tryffdeinversion(
int showmessages,
int allowlocalfailurefixandnoreport,
int finalstep,
PFTYPE oldpflag,
int forcetry,
int whichcap,
int modprim,
FTYPE *pi,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
FTYPE *Ugeomfree,
FTYPE *Ugeomfree0,
struct of_state *qptr,
struct of_geom *ptrgeom,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
1555 FTYPE prold[NPR],prffde[NPR];
1557 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
1563 int TRYNEWIFOLDUNEG=0;
1565 int TRYNEWIFOLDRHONEG=0;
1567 int TRYNEWIFOLDFAILCONV=1;
1585 FTYPE FFDEFACTOR=0.5;
1589 if(V[1]<
Rhor) FFDEFACTOR=5.0;
1591 int isffdeflow=isflowffde(FFDEFACTOR, pr0, qptr);
1592 if(isffdeflow==0)
if(debugfail>=2) dualfprintf(
fail_file,
"in tryffdeinversion but isffdeflow=0\n");
1597 if((badfailure || forcetry)&&isffdeflow){
1605 Ugeomfree[pl]=Ugeomfree0[pl];
1616 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT,
EOMFFDE, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &ffdepflag, prffde,pressure,newtonstats, lpflagrad);
1629 pl=
RHO; pr[pl] = pr0[pl];
1630 pl=UU; pr[pl] = pr0[pl];
1639 if(forcetry==0 && debugfail>=2) dualfprintf(
fail_file,
"Tried ffde and good on finalstep=%d! i=%d j=%d k=%d :: oldpflag=%d ffdepflag=%d\n",finalstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,ffdepflag);
1674 GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL)=ffdepflag;
1683 if(forcetry==0 && debugfail>=2) dualfprintf(
fail_file,
"Tried ffde and bad on finalstep=%d! t=%g steppart=%d nstep=%ld i=%d j=%d k=%d :: oldpflag=%d ffdepflag=%d\n",finalstep,
t,
steppart,
nstep,ptrgeom->i,ptrgeom->j,ptrgeom->k,oldpflag,ffdepflag);
1709 static int check_on_inversion(
int checkoninversiongas,
int checkoninversionrad,
int usedhotinversion,
int usedentropyinversion,
int usedcoldinversion,
int usedffdeinversion,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_geom *ptrgeom,
FTYPE *Uold,
FTYPE *Unew,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
1711 int badinversion,badinversionfail;
1712 int badinversionrad,badinversionfailrad;
1713 FTYPE Unormalnew[NPR],Unormalnewabs[NPR],Unormalold[NPR];
1722 if(checkoninversiongas==0 && checkoninversionrad==0)
return(0);
1735 GLOBALMACP0A1(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k,PGASGLOBAL)=(*pressure);
1741 PLOOP(pliter,pl) prtest[pl] = pr[pl];
1745 if(usedcoldinversion || usedffdeinversion){
1748 GLOBALMACP0A1(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k,PGASGLOBAL)=0.0;
1751 if(usedffdeinversion){
1757 badinversion=badinversionfail=0;
1758 badinversionrad=badinversionfailrad=0;
1763 if(*lpflag==0 || *lpflagrad==0){
1772 MYFUN(
primtoU(
UNOTHING,prtest, &q, ptrgeom, Unew, Unewabs),
"step_ch.c:advance()",
"primtoU()", 1);
1781 Unormalold[pl] = Uold[pl];
1782 Unormalnew[pl] = Unew[pl];
1783 Unormalnewabs[pl] = Unewabs[pl];
1786 #if(REMOVERESTMASSFROMUU==2)
1790 Unormalold[
UU] = Uold[
UU];
1791 Unormalnew[
UU] = Unew[
UU];
1792 Unormalnewabs[
UU] = Unewabs[
UU];
1811 if(checkoninversiongas==0 && (pl!=PRAD0 && pl!=PRAD1 && pl!=PRAD2 && pl!=PRAD3))
continue;
1812 if(checkoninversionrad==0 && (pl==PRAD0 && pl==PRAD1 && pl==PRAD2 && pl==PRAD3))
continue;
1822 if(usedffdeinversion && (pl==RHO || pl==UU || pl==
U1 || pl==
U2 || pl==
U3 || pl==ENTROPY ||
SCALARPL(pl)) )
continue;
1823 if(usedcoldinversion && (pl==UU || pl==ENTROPY ||
SCALARPL(pl)) )
continue;
1825 if(usedentropyinversion && (pl==UU) )
continue;
1826 if(usedhotinversion && (pl==ENTROPY) )
continue;
1846 if(pl==RHO || pl==UU || pl==URAD0&&(*lpflagrad==0)){
1847 errornorm=(fabs(Unormalnewabs[pl])+fabs(Unormalnew[pl])+fabs(Unormalold[pl])+
SMALL);
1849 if(pl==URAD0) errornorm+=(fabs(Unormalnewabs[UU])+fabs(Unormalnew[UU])+fabs(Unormalold[UU])+
SMALL);
1850 fdiff[pl] = fabs(Unormalnew[pl]-Unormalold[pl])/errornorm;
1852 else if(pl==ENTROPY){
1857 FTYPE Tgasnew=compute_temp_simple(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,prtest[RHO],prtest[UU]);
1858 FTYPE Tgasold=compute_temp_simple(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,pr0[RHO],pr0[UU]);
1859 errornorm=(fabs(Tgasnew)+fabs(Tgasold))*(fabs(Unormalnewabs[pl])+fabs(Unormalnew[pl])+fabs(Unormalold[pl])+
SMALL) + (fabs(Unormalnewabs[UU])+fabs(Unormalnew[UU])+fabs(Unormalold[UU])+
SMALL);
1860 fdiff[pl] = (fabs(Tgasnew)+fabs(Tgasold))*fabs(Unormalnew[pl]-Unormalold[pl])/errornorm;
1862 else if(pl==
U1 || pl==
U2 || pl==
U3){
1865 +(fabs(Unormalnewabs[
U1]) + fabs(Unormalnew[
U1]) + fabs(Unormalold[
U1]))*sqrt(fabs(ptrgeom->gcon[
GIND(1,1)]))
1866 +(fabs(Unormalnewabs[
U2]) + fabs(Unormalnew[
U2]) + fabs(Unormalold[
U2]))*sqrt(fabs(ptrgeom->gcon[
GIND(2,2)]))
1867 +(fabs(Unormalnewabs[
U3]) + fabs(Unormalnew[
U3]) + fabs(Unormalold[
U3]))*sqrt(fabs(ptrgeom->gcon[
GIND(3,3)]))
1869 #if(REMOVERESTMASSFROMUU==2)
1871 errornorm =
MAX(errornorm,
THIRD*(fabs(Unormalold[UU])+fabs(Unormalnew[UU])+fabs(Unormalnewabs[UU])));
1873 fdiff[pl] = sqrt(fabs(ptrgeom->gcon[
GIND(pl-UU,pl-UU)]))*fabs(Unormalnew[pl]-Unormalold[pl]) / (errornorm+
SMALL);
1876 else if( (pl==URAD1 || pl==URAD2 || pl==URAD3)&&(*lpflagrad==0) ){
1879 +(fabs(Unormalnewabs[URAD1]) + fabs(Unormalnew[URAD1]) + fabs(Unormalold[URAD1]))*sqrt(fabs(ptrgeom->gcon[
GIND(1,1)]))
1880 +(fabs(Unormalnewabs[URAD2]) + fabs(Unormalnew[URAD2]) + fabs(Unormalold[URAD2]))*sqrt(fabs(ptrgeom->gcon[
GIND(2,2)]))
1881 +(fabs(Unormalnewabs[URAD3]) + fabs(Unormalnew[URAD3]) + fabs(Unormalold[URAD3]))*sqrt(fabs(ptrgeom->gcon[
GIND(3,3)]))
1885 +(fabs(Unormalnewabs[
U1]) + fabs(Unormalnew[
U1]) + fabs(Unormalold[
U1]))*sqrt(fabs(ptrgeom->gcon[
GIND(1,1)]))
1886 +(fabs(Unormalnewabs[
U2]) + fabs(Unormalnew[
U2]) + fabs(Unormalold[
U2]))*sqrt(fabs(ptrgeom->gcon[
GIND(2,2)]))
1887 +(fabs(Unormalnewabs[
U3]) + fabs(Unormalnew[
U3]) + fabs(Unormalold[
U3]))*sqrt(fabs(ptrgeom->gcon[
GIND(3,3)]))
1889 errornorm =
MAX(errornorm,0.5*(fabs(Unormalold[URAD0])+fabs(Unormalnew[URAD0])+fabs(Unormalnewabs[URAD0])));
1891 fdiff[pl] = sqrt(fabs(ptrgeom->gcon[
GIND(pl-URAD0,pl-URAD0)]))*fabs(Unormalnew[pl]-Unormalold[pl]) / (errornorm+
SMALL);
1893 else if(pl==
B1 || pl==
B2 || pl==
B3){
1895 +(fabs(Unormalnewabs[
B1]) + fabs(Unormalnew[
B1]) + fabs(Unormalold[
B1]))*sqrt(fabs(ptrgeom->gcon[
GIND(1,1)]))
1896 +(fabs(Unormalnewabs[
B2]) + fabs(Unormalnew[
B2]) + fabs(Unormalold[
B2]))*sqrt(fabs(ptrgeom->gcon[
GIND(2,2)]))
1897 +(fabs(Unormalnewabs[
B3]) + fabs(Unormalnew[
B3]) + fabs(Unormalold[
B3]))*sqrt(fabs(ptrgeom->gcon[
GIND(3,3)]))
1899 fdiff[pl] = sqrt(fabs(ptrgeom->gcov[
GIND(pl-
B1+1,pl-
B1+1)]))*fabs(Unormalnew[pl]-Unormalold[pl]) / (errornorm+
KINDASMALL);
1912 if((
IFUTOPRIMFAIL(*lpflag) || checkoninversiongas==0) && (pl!=PRAD0 && pl!=PRAD1 && pl!=PRAD2 && pl!=PRAD3))
continue;
1913 if((
IFUTOPRIMRADHARDFAIL(*lpflagrad) || checkoninversionrad==0) && (pl==PRAD0 && pl==PRAD1 && pl==PRAD2 && pl==PRAD3))
continue;
1919 plcheck=(fdiff[pl]!=0.0);
1924 ( (plcheck)&&((fabs(Unormalold[pl])>
SMALL)&&(fabs(Unormalnew[pl])>
SMALL)) )
1926 if(pl<URAD0 && pl>URAD3) badinversion++;
1927 else badinversionrad++;
1930 if(pl==ENTROPY) dualfprintf(
fail_file,
"fdiff[%d]=%21.15g :: %21.15g %21.15g : %21.15g %21.15g : %21.15g %21.15g\n",pl,fdiff[pl],Unormalold[pl],Unormalnew[pl],exp(Unormalold[pl]/Unormalold[RHO]),exp(Unormalnew[pl]/Unormalnew[RHO]),Unormalold[RHO],Unormalnew[RHO]);
1931 else dualfprintf(
fail_file,
"fdiff[%d]=%21.15g :: %21.15g %21.15g\n",pl,fdiff[pl],Unormalold[pl],Unormalnew[pl]);
1937 if( (plcheck)&&((fabs(Unormalold[pl])>
SMALL)&&(fabs(Unormalnew[pl])>
SMALL)) ){
1938 if(pl<URAD0 && pl>URAD3) badinversionfail++;
1939 else badinversionfailrad++;
1954 if(checkoninversiongas==1 &&
FAILIFBADCHECK && badinversionfail){
1955 if(debugfail>=2) dualfprintf(
fail_file,
"Changing flag since sufficiently bad inversion.\n");
1984 if(badinversion || badinversionrad){
1987 dualfprintf(
fail_file,
"Bad inversion (or possibly Bad U(p) calculation):\n");
1988 dualfprintf(
fail_file,
"Inversion types: %d %d %d %d\n",usedffdeinversion,usedcoldinversion,usedentropyinversion,usedhotinversion);
1990 dualfprintf(
fail_file,
"t=%21.15g nstep=%ld stepart=%d :: i=%d j=%d k=%d :: lntries=%d lerrx=%21.15g\n",
t,
nstep,
steppart,ptrgeom->i,ptrgeom->j,ptrgeom->k,newtonstats->
lntries,newtonstats->
lerrx);
1991 PLOOP(pliter,pl) dualfprintf(
fail_file,"Uoldgeomfree[%d]=%21.15g Unewgeomfree[%d]=%21.15g pr[%d]=%21.15g prtest[%d]=%21.15g (pr0[%d]=%21.15g) fdiff=%21.15g\n",pl,Uold[pl],pl,Unew[pl],pl,pr[pl],prtest[pl],pl,pr0[pl],fdiff[pl]);
1992 dualfprintf(fail_file,"special inversion pressure=%21.15g statepressure=%21.15g stateentropy=%21.15g\n",*pressure,q.pressure,q.
entropy);
1994 dualfprintf(fail_file,"g=%21.15g\n",ptrgeom->
gdet);
2038 static int compare_ffde_inversions(
int showmessages,
int allowlocalfailurefixandnoreport,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_geom *ptrgeom,
FTYPE *Ugeomfree0,
FTYPE*Ugeomfree,
FTYPE *Uold,
FTYPE *Unew,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2043 FTYPE Upr[NPR],Uprother[NPR];
2045 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2049 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMFFDE, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), pr, pressure, newtonstats,lpflagrad);
2051 PALLLOOP(pl) Ugeomfree[pl]=Ugeomfree0[pl];
2053 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIMJONNONRELCOMPAT, eomtypelocal, whichcap,
EVOLVENOENTROPY, Ugeomfree, ptrgeom, &GLOBALMACP0A1(pflag,ptrgeom->
i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL), prother, pressure, newtonstats, lpflagrad);
2061 MYFUN(get_state(prother, ptrgeom, &q),"
step_ch.c:advance()", "get_state()", 1);
2062 MYFUN(primtoU(UNOTHING,prother, &q, ptrgeom, Uprother, NULL),"
step_ch.c:advance()", "primtoU()", 1);
2068 dualfprintf(fail_file,"
nstep=%ld stepart=%d i=%d j=%d\n",
nstep,
steppart,ptrgeom->i,ptrgeom->j);
2069 for(pl=
U1;pl<
B3;pl++){
2079 ((fabs(pr[pl]-prother[pl])/(fabs(pr[pl])+fabs(prother[pl])+
SMALL)) > 1
E-12)&&( (fabs(pr[pl])>1
E-15)||(fabs(prother[pl])>1
E-15) )
2081 dualfprintf(fail_file,
"DIFF: %21.15g :: pl=%d Ugeomfree=%21.15g prold=%21.15g prnew=%21.15g Upr=%21.15g Uprother=%21.15g\n",(fabs(pr[pl]-prother[pl])/(fabs(pr[pl])+fabs(prother[pl])+
SMALL)),pl,Ugeomfree[pl],pr[pl],prother[pl],Upr[pl],Uprother[pl]);
2105 #define CRAZYDEBUG 0
2106 #if(CRAZYDEBUG) // begin crazy debug stuff
2107 if(1|| newtonstats->lntries>3){
2108 if(nstep==9 && steppart==2 && ptrgeom->i==0 && ptrgeom->j==31){
2111 dualfprintf(fail_file,
"nstep=%ld stepart=%d :: i=%d j=%d :: lntries=%d\n",nstep,steppart,ptrgeom->i,ptrgeom->j,newtonstats->lntries);
2114 PALLLOOP(pl) dualfprintf(fail_file,"Uoldgeomfree[%d]=%21.15g Uold[%d]=%21.15g pr[%d]=%21.15g (pr0[%d]=%21.15g)\n",pl,Uold[pl],pl,Uold[pl]*ptrgeom->gdet,pl,pr[pl],pl,pr0[pl]);
2116 dualfprintf(fail_file,"g=%21.15g\n",ptrgeom->gdet);
2127 if(nstep==9 && steppart==2 && ptrgeom->i==0 && ptrgeom->j==31){
2130 pr[0]= 7.22714301361038e-06 ;
2131 pr[1]=-2.55753797775927e-07 ;
2132 pr[2]= 0.000892168434512681 ;
2133 pr[3]= -0.0349621334882251 ;
2135 pr[5]= -0.00101880685475446 ;
2136 pr[6]= 0.0399035382308458 ;
2139 pr[0]= 7.46157819677347e-06;
2140 pr[1]= 7.3407120498644e-06;
2141 pr[2]= 0.000367464781319951;
2142 pr[3]= -0.0144105143008605;
2144 pr[5]= -0.00101880685475446;
2145 pr[6]= 0.0399035382308458;
2148 pr[0]= 7.5124289176258e-06 ;
2149 pr[1]= 1.33752037209996e-08 ;
2150 pr[2]= 1.33529579432262e-07 ;
2151 pr[3]=-5.23276639757274e-06 ;
2153 pr[5]= -0.00101880685475444 ;
2154 pr[6]= 0.0399035382308459 ;
2159 MYFUN(
get_state(pr, ptrgeom, &q),
"flux.c:fluxcalc()",
"get_state()", 1);
2160 MYFUN(
primtoU(UNOTHING,pr, &q, ptrgeom, Unew, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
2163 dualfprintf(fail_file,
"q.ucon[%d]=%21.15g q.ucov[%d]=%21.15g q.bcon[%d]=%21.15g q.bcov[%d]=%21.15g\n",k,q.ucon[k],k,q.ucov[k],k,q.bcon[k],k,q.bcov[k]);
2167 Unew[pl]*=ptrgeom->gdet;
2168 Uold[pl]*=ptrgeom->gdet;
2169 fdiff[pl] = fabs(Unew[pl]-Uold[pl])/(fabs(Unew[pl]+Uold[pl])+
SMALL);
2171 if((pl>=RHO)&&(pl<=B3)&&((fabs(Uold[pl])>1
E-20)||(fabs(Unew[pl])>1
E-20))){
2172 dualfprintf(fail_file,
"fdiff[%d]=%21.15g :: %21.15g %21.15g\n",pl,fdiff[pl],Uold[pl],Unew[pl]);
2177 dualfprintf(fail_file,
"dt=%21.15g\n",
dt);
2182 #endif// end crazy debug stuff
2195 static int negdensitycheck(
int finalstep,
FTYPE *prim,
PFTYPE *pflag)
2217 FTYPE myrhouu0,oneOmyrhouu0;
2220 FTYPE ylforadvect,ynuforadvect;
2236 myrhouu0=Ugeomfree[
RHO];
2237 oneOmyrhouu0=
sign(Ugeomfree[RHO])/(fabs(Ugeomfree[RHO])+
SMALL);
2249 ylforadvect = Ugeomfree[YL]*oneOmyrhouu0;
2255 ynuforadvect = Ugeomfree[YNU]*oneOmyrhouu0;
2268 #if(WHICHEOS==KAZFULL)
2269 advect2yl_kazfull(
GLOBALMAC(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k),ylforadvect,ynuforadvect,&pr[YE]);
2271 pr[YL] = ylforadvect;
2276 #if(WHICHEOS==KAZFULL)
2277 advect2ynu_kazfull(
GLOBALMAC(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k),ylforadvect,ynuforadvect,&pr[YNU]);
2279 pr[YNU] = ynuforadvect;
2290 fix_primitive_eos_scalars_simple(i,j,k,loc,pr);
2303 pr[YFL1] = Ugeomfree[YFL1]*oneOmyrhouu0;
2306 pr[YFL2] = -Ugeomfree[YFL2]*oneOmyrhouu0;
2309 pr[YFL3] = Ugeomfree[YFL3]*oneOmyrhouu0;
2325 #if(WHICHEOS==KAZFULL)
2326 yl2advect_kazfull(
GLOBALMAC(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k),pr[YL],pr[YNU],&prforadvect);
2328 prforadvect = pr[YL];
2330 Ugeomfree[YL] = prforadvect*myrhouu0;
2334 #if(WHICHEOS==KAZFULL)
2335 ynu2advect_kazfull(
GLOBALMAC(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k),pr[YL],pr[YNU],&prforadvect);
2337 prforadvect = pr[YNU];
2339 Ugeomfree[YNU] = prforadvect*myrhouu0;
2377 FTYPE udir[NPR]={0.0};
2378 udir[YFL1]=udir[YFL2]=udir[YFL3]=ucon[
TT];
2389 if(YFL1>=0) pr[YFL1] = Ugeomfree[YFL1]/udir[YFL1];
2391 pr[YFL2] = -Ugeomfree[YFL2]/udir[YFL2];
2394 if(YFL3>=0) pr[YFL3] = Ugeomfree[YFL3]/udir[YFL3];
2409 void convert_U_removerestmassfromuu(
int utoprimversion,
int removerestmassfromuu,
FTYPE *U)
2421 if(removerestmassfromuu==2){
2424 if( utoprimversion!=
UTOPRIM5D1 && (utoprimversion!=UTOPRIMJONNONRELCOMPAT) ){
2431 else if(removerestmassfromuu==0 || removerestmassfromuu==1){
2432 if(utoprimversion==UTOPRIMJONNONRELCOMPAT){
2451 int Utoprimdiss(
int showmessages,
int allowlocalfailurefixandnoreport,
int evolvetype,
int inputtype,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE *pr,
PFTYPE *otherpflag,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2455 FTYPE Ugeomfree[NPR],Ugeomfree0[NPR];
2458 FTYPE Upr[NPR],Uprother[NPR];
2461 FTYPE Uold[NPR],Unew[NPR];
2463 extern void UtoU(
int inputtype,
int returntype,
struct of_geom *ptrgeom,
FTYPE *Uin,
FTYPE *Uout);
2466 FTYPE *pressure=&pressuremem;
2467 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2476 UtoU(inputtype,UNOTHING,ptrgeom,U,Ugeomfree);
2485 Uold[pl]=Ugeomfree0[pl]=Ugeomfree[pl];
2513 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM5D1, eomtypelocal, whichcap, whichentropy, Uold, ptrgeom, otherpflag, pr, pressure, newtonstats, lpflagrad);
2548 int Utoprimgen_compare(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2550 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2552 FTYPE Uo1[NPR], Uo2[NPR];
2553 FTYPE ptest1[NPR],ptest2[NPR];
2554 FTYPE Uo[NPR], po[NPR];
2557 int lntries1,lntries2;
2558 FTYPE lerrx1,lerrx2;
2559 FTYPE pressure1mem,pressure2mem;
2560 FTYPE *pressure1=&pressure1mem,*pressure2=&pressure2mem;
2564 ptest1[pl]=ptest2[pl]=pr[pl];
2565 Uo1[pl]=Uo2[pl]=Ugeomfree[pl];
2574 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport, UTOPRIMJONNONRELCOMPAT, eomtype, whichcap, EVOLVENOENTROPY, Uo1, ptrgeom, &lpflag1, ptest1,pressure1,newtonstats,lpflagrad);
2576 Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM2DFINAL, eomtype, whichcap, EVOLVENOENTROPY, Uo2, ptrgeom, &lpflag2, ptest2,pressure2,newtonstats,lpflagrad);
2577 lntries2=newtonstats->
lntries; lerrx2=newtonstats->
lerrx;
2579 #define ERRORCONST (1E-10)
2582 if(ptest1[pl]!=0.0) test=fabs(ptest1[pl]-ptest2[pl])/ptest1[pl]>
ERRORCONST;
2583 else test=(ptest1[pl]-ptest2[pl])>ERRORCONST;
2585 dualfprintf(fail_file,
"utoprimdiff: %d %ld :: %d %d %d :: %d :: %21.15g %21.15g %21.15g %21.15g :: %d %d :: %21.15g %21.15g\n",steppart,nstep,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,pl,ptest1[pl]-ptest2[pl],(ptest1[pl]!=0.0) ? fabs(ptest1[pl]-ptest2[pl])/ptest1[pl] : ptest1[pl]-ptest2[pl],ptest1[pl],ptest2[pl],lntries1,lntries2,lerrx1,lerrx2);
2589 dualfprintf(fail_file,
"%d %ld :: %d %d %d :: lpflag1=%d lpflag2=%d errx1=%21.15g errx2=%21.15g\n",steppart,nstep,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,lpflag1,lpflag2,lerrx1,lerrx2);
2591 if(lntries1>10 || lntries2>10){
2592 dualfprintf(fail_file,
"%d %ld :: %d %d %d :: lpflag1=%d lpflag2=%d errx1=%21.15g errx2=%21.15g lntries1=%d lntries2=%d\n",steppart,nstep,
startpos[1]+ptrgeom->i,
startpos[2]+ptrgeom->j,
startpos[3]+ptrgeom->k,lpflag1,lpflag2,lerrx1,lerrx2,lntries1,lntries2);
2615 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree, struct
of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure, struct
of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2618 extern int Utoprim_coldgrmhd(
FTYPE *U,
struct of_geom *geom,
FTYPE *pr,
int *positivityproblem);
2619 int positivityproblem;
2640 if(which==
UTOPRIM5D1){
MYFUN(Utoprim(parameter,Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim", 1);}
2641 else if(which==
UTOPRIMLDZ){
MYFUN(Utoprim_ldz(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_ldz", 1);}
2642 else if(which==
UTOPRIM2D){
MYFUN(Utoprim_2d(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_2d", 1);}
2643 else if(which==
UTOPRIM1D){
MYFUN(Utoprim_1d(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_1d", 1);}
2644 else if(which==
UTOPRIM1DOPT){
MYFUN(Utoprim_1d_opt(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_1d_opt", 1);}
2645 else if(which==
UTOPRIM1DFINAL){
MYFUN(Utoprim_1d_final(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_1d_final", 1);}
2646 else if(which==
UTOPRIM2DFINAL){
MYFUN(Utoprim_2d_final(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_2d_final", 1);}
2648 else if(which==UTOPRIMJONNONRELCOMPAT){
MYFUN(
Utoprim_jon_nonrelcompat_inputnorestmass(showmessages,eomtype,
GLOBALMAC(EOSextraglobal,ptrgeom->i,ptrgeom->j,ptrgeom->k),Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_2d_final_nonrelcompat_inputnorestmass", 1);}
2649 else if(which==
UTOPRIM5D2){
MYFUN(Utoprim_5d2_final(Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats),
"step_ch.c:Utoprimgen()",
"Utoprim_5d2_final", 1);}
2651 else if(which==
UTOPRIMCOLDGRMHD){
MYFUN(Utoprim_coldgrmhd(Ugeomfree, ptrgeom, pr,&positivityproblem),
"step_ch.c:Utoprimgen()",
"Utoprim_ffde", 1);}
2653 else if(which==
UTOPRIMFFDE){
MYFUN(Utoprim_ffde(Ugeomfree, ptrgeom, pr),
"step_ch.c:Utoprimgen()",
"Utoprim_ffde", 1);}
2655 dualfprintf(fail_file,
"No such which=%d in Utoprimgen_pick()\n");
2684 FTYPE uumhd[NPR],uumhdabs[NPR];
2685 PLOOP(pliter,pl) uumhd[pl] = Ugeomfree[pl];
2690 DLOOPA(iv) uumhd[URAD0+iv] = Ugeomfree[URAD0+iv] - (uumhd[UU+iv]-Ugeomfree[UU+iv]);
2691 PLOOP(pliter,pl) Ugeomfree[pl] = uumhd[pl];
2693 u2p_rad(showmessages, allowlocalfailurefixandnoreport,
GAMMAMAXRAD, whichcap, Ugeomfree,pr,ptrgeom,lpflag,lpflagrad);
2700 FTYPE uurad[NPR],uuradabs[NPR];
2706 u2p_rad(showmessages, allowlocalfailurefixandnoreport,
GAMMAMAXRAD, whichcap, Ugeomfree,pr,ptrgeom,lpflag,lpflagrad);
2723 int Utoprimgen_tryagain(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2725 int Utoprimgen_tryagain_substep(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE*Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2727 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport, UTOPRIMJONNONRELCOMPAT, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2728 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM2DFINAL, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2733 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM1DFINAL, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2734 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM1DOPT, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2735 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM5D2, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2736 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM2D, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2737 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM1D, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2748 int Utoprimgen_tryagain2(
int showmessages,
int allowlocalfailurefixandnoreport,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2750 int Utoprimgen_tryagain_substep(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE*Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2751 void convert_U_removerestmassfromuu(
int utoprimverison,
int removerestmassfromuu,
FTYPE *U);
2752 FTYPE Uorig0[NPR],Uorig[NPR];
2756 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport, UTOPRIMJONNONRELCOMPAT, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2757 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM5D1, eomtype, whichcap, parameter, Ugeomfree0, Ugeomfree, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2760 Uorig0[pl]=Ugeomfree0[pl];
2761 Uorig[pl]=Ugeomfree[pl];
2769 Utoprimgen_tryagain_substep(showmessages, allowlocalfailurefixandnoreport,
UTOPRIM2DFINAL, eomtype, whichcap, parameter, Uorig0, Uorig, ptrgeom, lpflag, pr0, pr,pressure,newtonstats,lpflagrad);
2783 int Utoprimgen_tryagain_substep(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree0,
FTYPE*Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr0,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad)
2786 int Utoprimgen_pick(
int showmessages,
int allowlocalfailurefixandnoreport,
int which,
int eomtype,
int whichcap,
int parameter,
FTYPE *Ugeomfree,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
FTYPE *pr,
FTYPE *pressure,
struct of_newtonstats *newtonstats,
PFTYPE *lpflagrad);
2797 Ugeomfree[pl]=Ugeomfree0[pl];
2801 MYFUN(
Utoprimgen_pick(showmessages, allowlocalfailurefixandnoreport, which,eomtype, whichcap,parameter,Ugeomfree, ptrgeom, lpflag, pr,pressure,newtonstats,lpflagrad),
"step_ch.c:Utoprimgen_tryagain_substep()",
"Utoprimgen_pick", 1);
2815 struct of_geom *ptrgeom=&geomdontuse;
2818 int allowlocalfailurefixandnoreport=1;
2824 FTYPE dissmeasure=-1.0;
2830 MYFUN(
Utoprimgen(showmessages, checkoninversiongas, checkoninversionrad, allowlocalfailurefixandnoreport,0,&eomtype,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,
UEVOLVE,
MAC(U,i,j,k), NULL, ptrgeom, dissmeasure,
MAC(prim,i,j,k),
MAC(prim,i,j,k),newtonstats),
"step_ch.c:advance()",
"Utoprimgen", 1);
2841 struct of_geom *ptrgeom=&geomdontuse;
2846 MYFUN(
get_state(
MAC(prim,i,j,k), ptrgeom, &q),
"step_ch.c:primtoUloop()",
"get_state()", 1);
2849 MYFUN(
primtoU(
UEVOLVE,
MAC(prim,i,j,k), &q, ptrgeom,
MAC(U,i,j,k), NULL),
"step_ch.c:primtoUloop()",
"primtoU()", 1);
2857 void filterffde(
int i,
int j,
int k,
FTYPE *pr)
2861 struct of_geom *ptrgeom=&geomdontuse;
2862 FTYPE prout[NPR],prin[NPR];
2866 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
2869 int allowlocalfailurefixandnoreport=1;
2874 primtoU(UNOTHING,pr,&q,ptrgeom,U, NULL);
2878 FTYPE dissmeasure=-1.0;
2884 Utoprimgen(showmessages, checkoninversiongas, checkoninversionrad, allowlocalfailurefixandnoreport, finalstep, &eomtype,whichcap,whichmethod,modprim,
EVOLVEUTOPRIM,UNOTHING,U,NULL,ptrgeom,dissmeasure,pr,prout,&newtonstats);
2907 FTYPE Sspecenergy=entropy/energypr[
RHO];
2910 FTYPE Sspecentropy=entropy/entropypr[
RHO];
2912 if(Sspecenergy>=Sspecentropy)
return(0);
2921 int whetherdoentropy(
struct of_geom *ptrgeom,
FTYPE fracenergy,
int entropynotfail,
int energynotfail,
int radinvmodentropy,
int radinvmodenergy,
FTYPE tryerror,
FTYPE okerror,
FTYPE baderror,
FTYPE entropyerror,
FTYPE energyerror,
FTYPE *entropypr,
FTYPE *energypr)
2927 fracenergy==0.0 && entropynotfail==1 ||
2929 energynotfail==0 && entropynotfail==1 ||
2930 entropynotfail==1 && energynotfail==1 && (entropyerror<tryerror && energyerror>baderror) ||
2933 entropynotfail==1 && energynotfail==1 && (badenergy(ptrgeom,energypr,entropypr) && (entropyerror<okerror && energyerror<okerror))
2934 ||entropynotfail==1 && energynotfail==1 && radinvmodenergy>0 && radinvmodentropy<=0 && entropyerror<okerror
2939 if(entropynotfail==1 && energynotfail==1 && radinvmodenergy<=0 && radinvmodentropy>0 && energyerror<okerror){
2941 if(debugfail>=3) dualfprintf(fail_file,
"Went to energy with errorabs=%g because radinvmodentropy=%d with with entropyerror=%g\n",energyerror,radinvmodentropy,entropyerror);
2943 if(entropynotfail==1 && energynotfail==1 && radinvmodenergy>0 && radinvmodentropy<=0 && entropyerror<okerror){
2944 if(debugfail>=3) dualfprintf(fail_file,
"Went to entropy with errorabs=%g because radinvmodenergy=%d with with energyerror=%g\n",entropyerror,radinvmodenergy,energyerror);
2956 int set_fracenergy(
int i,
int j,
int k,
FTYPE dissmeasure,
FTYPE *fracenergy)
2970 divcond=GLOBALMACP1A0(shockindicatorarray,
DIVPLDIR1+dir-1,i,j,k);
2986 DIVCONDUP=DIVCONDDN;
2988 divcond=dissmeasure;
3001 if(DIVCONDDN!=DIVCONDUP){
3002 *fracenergy = (divcond-DIVCONDUP)/(DIVCONDDN-DIVCONDUP);
3003 *fracenergy=
MIN(1.0,*fracenergy);
3004 *fracenergy=
MAX(0.0,*fracenergy);
3008 if(divcond<DIVCONDDN) *fracenergy=1.0;
3009 else *fracenergy=0.0;
3031 FTYPE entropy0,specificentropy0;
3033 specificentropy0=entropy0/pp[
RHO];
3042 FTYPE rhoE,entropyE,specificentropyE;
3043 rhoE=fabs(uu[RHO]/qptr->
ucon[
TT]);
3047 specificentropyE=uu[ENTROPY]/uu[
RHO];
3048 entropyE=specificentropyE*pp[
RHO];
3050 FTYPE ppnew[NPR];
PLOOP(pliter,pl) ppnew[pl]=pp[pl];
3053 ppnew[UU]=ppnew[ENTROPY];
3054 #define SHOWUGCHANGEDUETOENTROPY (10.0)
3055 if(debugfail>=3 && (fabs(ppnew[UU]/pp[UU])>SHOWUGCHANGEDUETOENTROPY || ppnew[UU]<pp[UU]) ) dualfprintf(fail_file,
"CHANGE : Fixed (%g/%g) entropy (%g vs. %g): guessrho=%g guessug=%g newug=%g dug=%g\n",uu[ENTROPY],uu[RHO],specificentropy0,specificentropyE,pp[RHO],pp[UU],ppnew[UU],pp[UU]-ppnew[UU]);
3057 pp[
UU]=
MAX(pp[UU],ppnew[UU]);
3104 iscoldflow = (pb[
UU]<COLDFACTOR*pb[
RHO]);
3105 iscoldflow = (iscoldflow && pb[
UU]<COLDFACTOR*(pb[
RHO]+pb[
UU])*fabs(usq));
3111 DLOOPA(jj) ucovgas[jj]=uu0[UU+jj];
3112 DLOOPA(jj) ucovrad[jj]=uu0[URAD0+jj];
3114 raise_vec(ucovgas,ptrgeom,ucongas);
3115 raise_vec(ucovrad,ptrgeom,uconrad);
3116 FTYPE ugas=0.0;
SLOOPA(jj) ugas+=ucovgas[jj]*ucongas[jj];
3117 FTYPE urad=0.0;
SLOOPA(jj) urad+=ucovrad[jj]*uconrad[jj];
3123 iscoldflow = (pb[
UU]<COLDFACTOR*pb[
RHO]*fabs(usq) && fabs(ucongas[
TT]*ucovgas[
TT])<COLDFACTOR*fabs(ugas) && fabs(uconrad[TT]*ucovrad[TT])<COLDFACTOR*fabs(urad));
3141 isffdeflow = (pb[RHO]<FFDEFACTOR*fabs(bsq) && pb[UU]<FFDEFACTOR*fabs(bsq));
3142 isffdeflow = (isffdeflow && (pb[RHO]+pb[UU])*fabs(usq) < FFDEFACTOR*fabs(bsq));