100 x = (*aa >= 0 ? *aa : - *aa);
101 return( *bb >= 0 ? x : -x);
114 floor(*x + .5) : -floor(.5 - *x) );
117 #define MYEXTERN extern
142 fprintf(stderr,
"STOP ");
143 for(i = 0; i<n ; ++
i)
145 fprintf(stderr,
" statement executed\n");
178 return(pow(*ap, *bp) );
188 int get_rameshsolution(
int whichcall,
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
int baseitermethod,
FTYPE *errorabs,
FTYPE *errorabsbestexternal,
int iters,
int totaliters,
FTYPE realdt,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *pb,
FTYPE *piin,
FTYPE *uu0,
FTYPE *uu,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_state *q,
FTYPE *ppeng,
FTYPE *ppent,
FTYPE *uueng,
FTYPE *uuent,
struct of_state *qeng,
struct of_state *qent,
int *failtypeeng,
FTYPE *errorabseng,
int *iterseng,
int *radinvmodeng,
int *failtypeent,
FTYPE *errorabsent,
int *itersent,
int *radinvmodent);
190 int get_rameshsolution_wrapper(
int whichcall,
int eomtype,
FTYPE *errorabs,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
struct of_state *q,
FTYPE *ppeng,
FTYPE *ppent,
FTYPE *uueng,
FTYPE *uuent,
FTYPE (*dUcompeng)[NPR],
FTYPE (*dUcompent)[NPR],
struct of_state *qeng,
struct of_state *qent,
int *failtypeeng,
FTYPE *errorabseng,
int *iterseng,
int *radinvmodeng,
int *failtypeent,
FTYPE *errorabsent,
int *itersent,
int *radinvmodent);
199 #define PLOOPDYNAMICAL(pliter,pl) PLOOP(pliter,pl) if(SCALARPL(pl)==0)
208 #define AVOIDTAUFORFLOOR (1) // whether to apply optical depth calculation for floor (0) or not (1)
211 #define COURRADEXPLICIT (0.1) // Effective Courant-like factor for stiff explicit radiation source term. Required to not only avoid failure of explicit scheme, but also that explicit scheme is really accurate compared to implicit. E.g., near \tau\sim 1, explicit won't fail with RADPULSEPLANAR but will not give same results as implicit. So only use explicit if really in optically thin regime.
215 #define IMPTRYCONVHIGHTAU (NUMEPSILON*5.0) // for used implicit solver
219 #define IMPTRYCONV (1.e-9) // less greedy so doesn't slow things down so much.
221 #define IMPTRYCONV (1.e-12) // works generally to avoid high iterations
223 #define IMPTRYCONVQUICK (1.e-6) // even less greedy so doesn't slow things down so much.
226 #define ITERATIONMARGINAL2 (4)
227 #define IMPTRYCONVMARGINAL2 (1.e-5) // even less greedy so doesn't slow things down so much.
229 #define ITERATIONMARGINAL2 (4)
230 #define IMPTRYCONVMARGINAL2 (1.e-6) // even less greedy so doesn't slow things down so much.
233 #define IMPTRYCONVMARGINAL (1.e-6) // even less greedy so doesn't slow things down so much.
235 #define IMPTRYCONVSUPERQUICK (1.e-3) // even less greedy so doesn't slow things down so much.
237 #define IMPTRYCONVABS ((FTYPE)(NDIM+2)*trueimptryconv)
249 #define IMPALLOWCONVCONST (1.e-3)
250 #define IMPOKCONVCONST (1E-4) // even more likely to use energy solution
252 #define IMPALLOWCONVCONST (1.e-5)
253 #define IMPOKCONVCONST (1E-6) // even more likely to use energy solution
257 #define IMPOKCONVCONSTABS ((FTYPE)(NDIM+2)*IMPOKCONVCONST)
258 #define IMPOKCONV (MAX(trueimptryconv,IMPOKCONVCONST))
259 #define IMPOKCONVABS ((FTYPE)(NDIM+2)*IMPOKCONV)
262 #define IMPALLOWCONVCONSTABS ((FTYPE)(NDIM+2)*IMPALLOWCONVCONST)
264 #define IMPALLOWCONV (trueimpallowconv)
265 #define IMPALLOWCONV2 (IMPALLOWCONV)
266 #define IMPALLOWCONVABS ((FTYPE)(NDIM+2)*IMPALLOWCONV)
270 #define IMPBADENERGY (MIN(IMPALLOWCONV,1E-6))
273 #define TAUTOTMAXHIGHERTOL (-1.0) // i.e. avoid this
274 #define IMPTRYCONV_TAUTOTMAXHIGHERTOL (1E-4)
277 #define IMPTRYCONV_RHORHIGHERTOL (1E-3) // (leads to transition)
278 #define IMPTRYCONV_ROUTERHIGHERTOL (1E-3) // good to have since don't care about outer region with OUTERDEATH
279 #define IMPALLOWCONV_RHORHIGHERTOL (1E-2) // allow lower tol inside horizon to avoid failures (but leads to transition) NOTEMARK: Probably don't want this >1/BSQORHOLIMIT else rho will be in error by more than order unity just from G, which may be limit of acceptability. u will be in error much more likely, but u driven by Comptonization often so by thermal equilibrium.
283 #define ITERMHDINVTRYHARDER 5
284 #define MINTRYCONVFORMHDINVERSION (1E-4) // assume not failure if got down to this much. -- don't have to be related to implicit allowance.
288 #define ABORTBACKUPIFNOERRORREDUCE 1
289 #define IMPTRYCONVALT (MAX(1E-8,IMPTRYCONVABS)) // say that if error isn't reducing, ok to abort with this error. Only time saver, but realistic about likelihood of getting smaller error.
292 #define IMPTRYDAMPCONV (5.0*IMPTRYCONVABS)
304 #if(REALTYPE==FLOATTYPE)
305 #define IMPEPSLARGE (1E-4) // on small side
306 #define IMPEPSSMALL (1E-4) // on small side
307 #define ERRORFORIMPEPSSMALL (1E-5)
308 #elif(REALTYPE==DOUBLETYPE)
309 #define IMPEPSLARGE (1E-8) // Was 1E-6 (see next line)
310 #define IMPEPSSMALL (1E-10) // Was 1E-7 (but with PMHD method and disk-jet problem, led to very often not getting solution. Not sure why)
312 #define ERRORFORIMPEPSSMALL (1E-9)
313 #elif(REALTYPE==LONGDOUBLETYPE)
314 #define IMPEPSLARGE (1E-8)
315 #define IMPEPSSMALL (1E-10)
316 #define ERRORFORIMPEPSSMALL (1E-9)
321 #define SKIPJACCOMPUTE (DOPERF)
322 #define SKIPJACITER (4)
323 #define SKIPJACFACTOR (4)
328 #define MAXIMPEPS (0.3)
331 #define MAXJACITER (10)
336 #define IMPMAXITERLONG (100) // for used implicit solver
337 #define IMPMAXITERMEDIUM (40)
338 #define IMPMAXITERQUICK (13)
339 #define IMPMAXITERSUPERQUICK (2)
341 #define IMPMINABSERROR (1E-100) // minimum absolute error (or value) below which don't treat as bad error and just avoid 4-force. Otherwise will "fail" implicit solver even if impossible to reach smaller relative error due to absolute machine precision issues.
349 #define IMPLICITERRORNORM 4
352 #define MAXSUBCYCLES (2000) // for explicit sub-cycles when doing reversion
355 #define MAXSUBCYCLESFAIL (MAXSUBCYCLES*100)
358 #define MAXF1TRIES 20 // 20 might sound like alot, but Jacobian does 4 to 5 inversions each iteration, and that amount is only typically needed for very first iteration.
361 #define MAXMHDSTEPS (trueimpmaxiter*6) // limit total number of MHD inversion steps
364 #define RADDAMPDELTA (0.5) // choose, but best to choose 1/Integer so no machine precision issues.
365 #define RADDAMPUNDELTA (1.0/RADDAMPDELTA)
368 #define TRYFIRSTEXPLICIT 1
373 #define DONONEXPLICITIFFAILS ((DOPERF==0)*TRYFIRSTEXPLICIT)
377 #define TAUFAILLIMIT (2.0/3.0) // at what \tau below which to assume "failure1" in u2p_rad() means should be moving at gammamax rather than not moving.
379 #define TAUSWITCHPBVSPIIN (2.0/3.0) // at what \tau to switch using pb(uu0) vs. piin(Uiin).
383 #define IMPLICITREVERTEXPLICIT 0 // problem. Not a good idea. -- should try implicit again, starting out with more damping.
386 #define MAXEXPLICITSUBSTEPCHANGE 1.e-2
393 #define TAUSUPPRESS 0 // makes physical sense, but might be wrong in some limits (i.e. Gd can still be large relative), but try to account for lambda as well.
394 #define SPACETIMESUBSPLITNONE 1 // DON'T USE! (gets inversion failures because overly aggressive)
395 #define SPACETIMESUBSPLITTIME 2 // probably not ok -- need to split off mhd and rad
396 #define SPACETIMESUBSPLITALL 3 // probably not ok -- need to split off mhd and rad
397 #define SPACETIMESUBSPLITSUPERALL 4 // OK TO USE sometimes, but not always
398 #define SPACETIMESUBSPLITMHDRAD 5 // KINDA OK TO USE (generates noise in velocity where E is very small, but maybe ok since sub-dominant and don't care about velocity where E is small. E evolves fine, but Rtx eventually shows issues.)
399 #define SPACETIMESUBSPLITTIMEMHDRAD 6 // OK TO USE sometimes (works fine and no noise in velocity because split it off. Might have trouble in multiple dimensions if sub-dominant momentum dimension requires implicit step -- but general diffusive would suggest unlikely. But, not efficient in optically thick regime once radiation velocity is non-trivial in magnitude)
401 #define WHICHSPACETIMESUBSPLIT TAUSUPPRESS // only tausuppress works in general.
405 #define NUMERRORTYPES 2 // 0: over iterated 1: over all relevant terms
406 #define WHICHERROR 1 // choose, but generally should be 1.
418 #define GETRADINVFROMUU0FORPB 1 // might be expensive if uu0 has no solution for the MHD inversion.
426 #define USEDUINRADUPDATE 1
430 #define USEINPUTASGUESSIFERRORSMALL (WHICHERROR==1)
433 #define GAMMASMALLLIMIT (1.0-1E-10) // at what point above which assume gamma^2=1.0
440 #define CASECHOICE JONCHOICE // choose
443 #define TOZAMOFRAME 0 // reduce to ZAMO gammarel=1 frame (e.g. in non-GR that would be grid frame or v=0 frame or gammarel=1).
444 #define TOFLUIDFRAME 1 // reduce to using fluid frame (probably more reasonable in general).
445 #define TOOPACITYDEPENDENTFRAME 2
447 #define M1REDUCE TOOPACITYDEPENDENTFRAME // choose
453 #define MINTAUSOURCE (NUMEPSILON)
467 #define ENERGYSIMPLEFACTOR (NDIM) // NDIM=4 times simpler than full step
470 #define ITERMODENORMAL 0
471 #define ITERMODESTAGES 1
472 #define ITERMODECOLD 2
477 #define BEGINMOMSTEPS0 1
478 #define ENDMOMSTEPS0 2
480 #define BEGINENERGYSTEPS0 3
481 #define ENDENERGYSTEPS0 13
483 #define BEGINFULLSTEPS0 14
484 #define ENDFULLSTEPS0 (IMPMAXITERLONG*2)
486 #define BEGINNORMALSTEPS0 BEGINFULLSTEPS0
492 #define NUMPRIORERRORSITER0 7
493 #define NUMPRIORERRORS 5
494 #define PRIORERRORCHANGEREQUIRED (0.5) // damping is included below when used
497 #define DEBUGMAXITER (PRODUCTION==0)
501 #define DEBUGMAXITERVELOCITY 1
503 #define DEBUGLEVELIMPSOLVER 3 // which debugfail>=# to use for some common debug stuff
506 #define DEBUGLEVELIMPSOLVERMORE 3 // which debugfail>=# to use for some common debug stuff
510 #define RAMESHFIXEARLYSTEPS (DOSUBJAC==1 ? 0 : 3) // 3 if used is default
515 #define NEWJONHOLDPOS 0 // __WORKINGONIT__: WORKING ON IT
518 #define NUMHOLDTIMES 6
522 #define RAMESHSTOPENERGYIFTOOOFTENBELOWENTROPY 3
529 #define SWITCHTOENTROPYIFCHANGESTOENTROPY (0)
534 #define USERAMESH 0 // too slow if used too often, and rarely result really used.
537 #define TRYHARDERFEEDGUESSTOL (1E-4)
540 #define ERRORTOUSEENTROPYFORENERGYGUESS (1E-4)
548 #define DOFINALCHECK 1
552 #define REPORTMAXITERALLOWED (PRODUCTION==0)
555 #define FORCEJDIFFNOCROSS 1
560 #define POSTNEWTONCONVCHECK 1
563 #define DIFFXLIMIT (10.0*NUMEPSILON)
565 #define LOCALPREIMPCONVX (10.0*NUMEPSILON)
566 #define LOCALPREIMPCONVXABS ((FTYPE)(NDIM+2)*LOCALPREIMPCONVX)
570 #define NUMNOERRORREDUCE0 (5 + mtd.BEGINNORMALSTEPS)
571 #define NUMNOERRORREDUCE 5
576 #define SWITCHTODONOTHING 1
579 #define CHANGEDAMPFACTOR 2 // bit risky to set to 1 since changing DAMPFACTOR for no good reason limits ability to converge at normal rate.
580 #define NUMDAMPATTEMPTS (3*((DOPERF)==0) + 1*((DOPERF)==1))
582 #define NUMDAMPATTEMPTSQUICK 1
586 #define FACTORBADJUMPERROR (1.0E2)
591 #define WHICHU2PRAD 1
595 #define GAMMAMAXRADIMPLICITSOLVER (GAMMAMAXRAD) // for radiation, seek actual solution with this limit. Solver can find solutions, while harder when limiting gamma_{gas} for some reason.
602 #define ALLOWUSEUUALT 0
605 #define USECAPTYPEFIX2FORF1 1
607 #define USECAPTYPEFIX2FORFINALCHECK 1
609 #define AVOIDURAD0IFRADINVMODANDPMHDMETHOD (USECAPTYPEFIX2FORF1!=0)
611 #define TREATRADINVCAPASNONFAILUREFORPMHDMETHOD (USECAPTYPEFIX2FORF1!=0)
614 #define LETPMHDFAIL 1
617 #define USEPRIORITERMETHOD 0
620 #define STOPIFVERYLOWERROR (1)
622 #define STOPIFITERLOWERROR (0)
632 #define FAILRETURNGOTRIVIALEXPLICIT -1
633 #define FAILRETURNNOFAIL 0
634 #define FAILRETURNGENERAL 1
635 #define FAILRETURNJACISSUE 2
636 #define FAILRETURNMODESWITCH 3
637 #define FAILRETURNNOTTOLERROR 4
639 #define ACCEPTASNOFAILURE(failreturn) (failreturn==FAILRETURNNOFAIL || failreturn==FAILRETURNNOTTOLERROR || failreturn==FAILRETURNGOTRIVIALEXPLICIT)
641 #define NOTACTUALFAILURE(failreturn) (failreturn==FAILRETURNNOFAIL || failreturn==FAILRETURNMODESWITCH || failreturn==FAILRETURNGOTRIVIALEXPLICIT)
642 #define NOTBADFAILURE(failreturn) (failreturn==FAILRETURNNOFAIL || failreturn==FAILRETURNMODESWITCH || failreturn==FAILRETURNNOTTOLERROR || failreturn==FAILRETURNGOTRIVIALEXPLICIT)
644 #define ACTUALHARDFAILURE(failreturn) (failreturn==FAILRETURNGENERAL || failreturn==FAILRETURNJACISSUE)
645 #define ACTUALHARDORSOFTFAILURE(failreturn) (failreturn==FAILRETURNGENERAL || failreturn==FAILRETURNJACISSUE || failreturn==FAILRETURNNOTTOLERROR)
646 #define SWITCHGOODIDEAFAILURE(failreturn) (failreturn==FAILRETURNGENERAL || failreturn==FAILRETURNJACISSUE || failreturn==FAILRETURNNOTTOLERROR || failreturn==FAILRETURNMODESWITCH)
667 #define MODEMETHOD MODEPICKBESTSIMPLE // switches with only PMHD method
669 #define MODEMETHOD MODEPICKBEST // general switching method
693 static int koral_source_rad_implicit(
int *eomtype,
FTYPE *pb,
FTYPE *pf,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE dissmeasure,
FTYPE *dUother ,
FTYPE (*dUcomp)[NPR]);
695 static int koral_source_rad_implicit_mode(
int modemethodlocal,
int allowbaseitermethodswitch,
int modprim,
int havebackup,
int didentropyalready,
int *eomtype,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE trueimptryconv,
FTYPE trueimpokconv,
FTYPE trueimpallowconv,
int trueimpmaxiter,
int truenumdampattempts,
FTYPE fracenergy,
FTYPE dissmeasure,
int *radinvmod,
FTYPE *pb,
FTYPE *uub,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *dUother ,
FTYPE (*dUcomp)[NPR],
FTYPE *errorabs,
FTYPE *errorabsbestexternal,
int *iters,
int *f1iters,
int *nummhdinvs,
int *nummhdsteps);
697 static int f_implicit(
int allowbaseitermethodswitch,
int iter,
int f1iter,
int failreturnallowable,
int whichcall,
FTYPE impeps,
int showmessages,
int showmessagesheavy,
int allowlocalfailurefixandnoreport,
int *eomtype,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
int *radinvmod,
FTYPE conv,
FTYPE convabs,
FTYPE allowconvabs,
int maxiter,
FTYPE realdt,
int dimtypef,
FTYPE *dimfactU,
FTYPE *ppprev,
FTYPE *pp,
FTYPE *piin,
FTYPE *uuprev,
FTYPE *Uiin,
FTYPE *uu0,
FTYPE *uu,
FTYPE localdt,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *f,
FTYPE *fnorm,
FTYPE *freport,
int *goexplicit,
FTYPE *errorabs,
FTYPE *errorallabs,
int whicherror,
int *convreturn,
int *nummhdinvsreturn,
FTYPE *tautotmaxreturn,
struct of_method *mtd,
struct of_refU *ru);
705 static int get_implicit_iJ(
int allowbaseitermethodswitch,
int failreturnallowableuse,
int showmessages,
int showmessagesheavy,
int allowlocalfailurefixandnoreport,
int *eomtypelocal,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
FTYPE impepsjac,
FTYPE trueimptryconv,
FTYPE trueimptryconvabs,
FTYPE trueimpallowconvabs,
int trueimpmaxiter,
int iter,
FTYPE errorabs,
FTYPE errorallabs,
int whicherror,
int dimtypef,
FTYPE *dimfactU,
FTYPE *Uiin,
FTYPE *uu,
FTYPE *uup,
FTYPE *uu0,
FTYPE *piin,
FTYPE *pp,
FTYPE *ppp,
FTYPE fracdtG,
FTYPE realdt,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *f1,
FTYPE *f1norm,
FTYPE (*iJ)[NPR],
int *nummhdinvsreturn,
struct of_method *mtd,
struct of_refU *ru);
707 static int inverse_33matrix(
int sj,
int ej,
FTYPE aa[][
NDIM],
FTYPE ia[][NDIM]);
708 static int inverse_11matrix(
int sj,
int ej,
FTYPE aa[][
NDIM],
FTYPE ia[][NDIM]);
711 static int f_error_check(
int showmessages,
int showmessagesheavy,
int iter,
FTYPE conv,
FTYPE convabs,
FTYPE realdt,
int dimtypef,
int eomtype,
int radinvmod,
int itermode,
int baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
FTYPE *dimfactU,
FTYPE *pp,
FTYPE *piin,
FTYPE *f1,
FTYPE *f1norm,
FTYPE *f1report,
FTYPE *Uiin,
FTYPE *uu0,
FTYPE *uu,
struct of_geom *ptrgeom,
FTYPE *errorabs,
FTYPE *errorallabs,
int whicherror,
struct of_method *mtd,
struct of_refU *ru);
716 static int Utoprimgen_failwrapper(
int doradonly,
int *radinvmod,
int showmessages,
int checkoninversiongas,
int checkoninversionrad,
int allowlocalfailurefixandnoreport,
int finalstep,
int *eomtype,
int whichcap,
int evolvetype,
int inputtype,
FTYPE *U,
struct of_state *qptr,
struct of_geom *ptrgeom,
FTYPE dissmeasure,
FTYPE *
pr,
struct of_newtonstats *newtonstats);
718 static void define_method(
int iter,
int *eomtype,
int itermode,
int baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
struct of_method *mtd);
721 #define MAXJACDIM (NDIM)
725 static void showdebuglist(
int debugiter,
FTYPE (*pppreholdlist)[NPR],
FTYPE (*ppposholdlist)[NPR],
FTYPE (*f1reportlist)[NPR],
FTYPE (*f1list)[NPR],
FTYPE *errorabsf1list,
FTYPE *errorallabsf1list,
int *realiterlist,
FTYPE (*jaclist)[
MAXJACDIM][
MAXJACDIM],
FTYPE *fracdamplist,
int *implicititerlist,
int *implicitferrlist);
726 int mathematica_report_check(
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
int baseitermethod,
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,
FTYPE *CUimp,
struct of_state *q,
FTYPE *dUother);
729 static void get_dtsub(
int method,
FTYPE *
pr,
struct of_state *q,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
FTYPE *Gdpl,
FTYPE chi,
FTYPE *Gdplabs,
struct of_geom *ptrgeom,
FTYPE *dtsub);
731 static int source_explicit(
int whichsc,
int whichradsourcemethod,
int methoddtsub,
int *eomtype,
732 void (*sourcefunc)(
int method,
FTYPE *
pr,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
FTYPE *Gpl,
struct of_geom *ptrgeom,
FTYPE *dtsub),
736 static int get_m1closure_gammarel2_old(
int showmessages,
struct of_geom *ptrgeom,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE *gammarel2return,
FTYPE *deltareturn,
FTYPE *numeratorreturn,
FTYPE *divisorreturn);
739 static int get_m1closure_gammarel2_cold_old(
int showmessages,
struct of_geom *ptrgeom,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE *gammarel2return,
FTYPE *deltareturn,
FTYPE *numeratorreturn,
FTYPE *divisorreturn,
FTYPE *Erfreturn,
FTYPE *urfconrel);
744 static int get_m1closure_urfconrel_old(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE numerator,
FTYPE divisor,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad);
745 static int get_m1closure_urfconrel(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE numerator,
FTYPE divisor,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad);
746 static int get_m1closure_urfconrel_olek(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad);
766 #define FIMPLICITCALLTYPEF1 1
767 #define FIMPLICITCALLTYPEFINALCHECK 2
768 #define FIMPLICITCALLTYPEJAC 3
769 #define FIMPLICITCALLTYPEFINALCHECK2 4
777 #define DIMTYPEFCONS 0
778 #define DIMTYPEFPRIM 1
782 #define UTOPRIMGENWRAPPERRETURNNOFAIL (UTOPRIMNOFAIL)
783 #define UTOPRIMGENWRAPPERRETURNFAILRAD (1)
784 #define UTOPRIMGENWRAPPERRETURNFAILMHD (2)
797 static int Utoprimgen_failwrapper(
int doradonly,
int *radinvmod,
int showmessages,
int checkoninversiongas,
int checkoninversionrad,
int allowlocalfailurefixandnoreport,
int finalstep,
int *eomtype,
int whichcap,
int evolvetype,
int inputtype,
FTYPE *U,
struct of_state *qptr,
struct of_geom *ptrgeom,
FTYPE dissmeasure,
FTYPE *pr,
struct of_newtonstats *newtonstats)
804 int eomtypelocal=*eomtype;
813 PFTYPE *lpflag,*lpflagrad;
814 lpflag=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
820 *radinvmod=(int)(*lpflagrad);
829 MYFUN(
Utoprimgen(showmessages,checkoninversiongas,checkoninversionrad, allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcap, whichmethod, modprim, evolvetype, inputtype, U, qptr, ptrgeom, dissmeasure, pr, pr, newtonstats),
"phys.tools.rad.c:Utoprimgen_failwrapper()",
"Utoprimgen", 1);
832 *radinvmod=(int)(*lpflagrad);
842 prod0dualfprintf(showmessages && debugfail>=2,
fail_file,
"Got soft MHD failure inversion failure during Utoprimgen_failwrapper: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
848 prod0dualfprintf(showmessages && debugfail>=2,
fail_file,
"Got some radiation inversion failure during Utoprimgen_failwrapper: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
853 prod0dualfprintf(showmessages && debugfail>=2,
fail_file,
"Got hard failure of inversion (MHD part only considered as hard) in f_implicit(): ijk=%d %d %d : %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,*lpflag,*lpflagrad);
864 if(debugfail>=2 && showmessages){
867 int outputtype=inputtype;
869 MYFUN(
primtoU(outputtype,pr, &q, ptrgeom, Unew, NULL),
"step_ch.c:advance()",
"primtoU()", 1);
871 PLOOP(pliter,pl) dualfprintf(
fail_file,
"COMPARE: pl=%d pr=%g U=%g Unew=%g\n",pl,pr[pl],U[pl],Unew[pl]);
877 if((showmessages || debugfail>=2)){
878 static int maxlntries=0,maxnstroke=0;
882 if(newtonstats->
lntries>maxlntries){ maxlntries=newtonstats->
lntries; diff=1;}
883 if(newtonstats->
nstroke>maxnstroke){ maxnstroke=newtonstats->
nstroke; diff=1;}
885 if(diff) dualfprintf(
fail_file,
"newtonsteps: lntries=%d (max=%d) nstroke=%d (max=%d) logerror=%g\n",newtonstats->
lntries,maxlntries,newtonstats->
nstroke,maxnstroke,newtonstats->
lerrx);
917 #define QTYUMHD 0 // iter or ferr
918 #define QTYUMHDENERGYONLY 1 // ferr only for now
919 #define QTYUMHDMOMONLY 2 // ferr only for now
920 #define QTYURAD 3 // iter or ferr
921 #define QTYURADENERGYONLY 4 // ferr only for now
922 #define QTYURADMOMONLY 5 // ferr only for now
923 #define QTYPMHD 6 // only iter
924 #define QTYPMHDENERGYONLY 7 // iter
925 #define QTYPMHDMOMONLY 8 // iter
926 #define QTYPRAD 9 // only iter
927 #define QTYPRADENERGYONLY 10 // only iter
928 #define QTYPRADMOMONLY 11 // only iter
929 #define QTYENTROPYUMHD 12 // iter or ferr
930 #define QTYENTROPYUMHDENERGYONLY 13 // ferr only for now
931 #define QTYENTROPYUMHDMOMONLY 14 // ferr only for now
932 #define QTYENTROPYPMHD 15 // iter (not used)
933 #define QTYENTROPYPMHDENERGYONLY 16 // iter (not used)
934 #define QTYENTROPYPMHDMOMONLY 17 // iter (not used)
938 #define IMPPTYPE(implicititer) (implicititer==QTYPMHD ||implicititer==QTYPMHDENERGYONLY ||implicititer==QTYPMHDMOMONLY || implicititer==QTYPRAD ||implicititer==QTYPRADENERGYONLY ||implicititer==QTYPRADMOMONLY || implicititer==QTYENTROPYPMHD ||implicititer==QTYENTROPYPMHDENERGYONLY ||implicititer==QTYENTROPYPMHDMOMONLY)
940 #define IMPUTYPE(implicititer) (implicititer==QTYUMHD ||implicititer==QTYUMHDENERGYONLY ||implicititer==QTYUMHDMOMONLY || implicititer==QTYURAD ||implicititer==QTYURADENERGYONLY ||implicititer==QTYURADMOMONLY || implicititer==QTYENTROPYUMHD ||implicititer==QTYENTROPYUMHDENERGYONLY ||implicititer==QTYENTROPYUMHDMOMONLY)
943 #define IMPMHDTYPE(implicititer) (implicititer==QTYPMHD ||implicititer==QTYPMHDENERGYONLY ||implicititer==QTYPMHDMOMONLY || implicititer==QTYUMHD ||implicititer==QTYUMHDENERGYONLY ||implicititer==QTYUMHDMOMONLY || implicititer==QTYENTROPYUMHD ||implicititer==QTYENTROPYUMHDENERGYONLY ||implicititer==QTYENTROPYUMHDMOMONLY)
945 #define IMPRADTYPE(implicititer) (implicititer==QTYPRAD ||implicititer==QTYPRADENERGYONLY ||implicititer==QTYPRADMOMONLY || implicititer==QTYURAD ||implicititer==QTYURADENERGYONLY ||implicititer==QTYURADMOMONLY)
948 #define IMPMHDTYPEBASE(baseitermethod) (baseitermethod==QTYPMHD || baseitermethod==QTYUMHD || baseitermethod==QTYENTROPYUMHD)
950 #define IMPRADTYPEBASE(baseitermethod) (baseitermethod==QTYPRAD || baseitermethod==QTYURAD)
953 #define IMPPMHDTYPE(implicititer) (implicititer==QTYPMHD ||implicititer==QTYPMHDENERGYONLY ||implicititer==QTYPMHDMOMONLY)
959 static void define_method(
int iter,
int *eomtype,
int itermode,
int baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
struct of_method *mtd)
961 int eomtypelocal=*eomtype;
971 dualfprintf(
fail_file,
"Can't have EOMDONOTHING in radiation code.\n");
1015 dualfprintf(
fail_file,
"No such itermode=%d\n",itermode);
1049 else if(baseitermethod==
QTYURAD){
1053 else if(baseitermethod==
QTYPRAD){
1063 else if(baseitermethod==
QTYURAD){
1067 else if(baseitermethod==
QTYPRAD){
1078 else if(baseitermethod==
QTYURAD){
1082 else if(baseitermethod==
QTYPRAD){
1089 dualfprintf(
fail_file,
"A Not setup for iter=%d %d %d %g : %d %d : %d %d : %d %d : %d : %d\n",iter, *eomtype, itermode, fracenergy, mtd->
BEGINMOMSTEPS, mtd->
ENDMOMSTEPS, mtd->
BEGINENERGYSTEPS, mtd->
ENDENERGYSTEPS, mtd->
BEGINFULLSTEPS, mtd->
ENDFULLSTEPS, mtd->
BEGINNORMALSTEPS,baseitermethod);
1099 else if(baseitermethod==
QTYURAD){
1103 else if(baseitermethod==
QTYPRAD){
1128 else if(baseitermethod==
QTYURAD){
1132 else if(baseitermethod==
QTYPRAD){
1146 else if(baseitermethod==
QTYURAD){
1150 else if(baseitermethod==
QTYPRAD){
1166 else if(baseitermethod==
QTYURAD){
1170 else if(baseitermethod==
QTYPRAD){
1177 dualfprintf(
fail_file,
"B Not setup for iter=%d %d %d %g : %d %d : %d %d : %d %d : %d : %d\n",iter, *eomtype, itermode, fracenergy, mtd->
BEGINMOMSTEPS, mtd->
ENDMOMSTEPS, mtd->
BEGINENERGYSTEPS, mtd->
ENDENERGYSTEPS, mtd->
BEGINFULLSTEPS, mtd->
ENDFULLSTEPS, mtd->
BEGINNORMALSTEPS,baseitermethod);
1191 else if(baseitermethod==
QTYURAD){
1195 else if(baseitermethod==
QTYPRAD){
1203 dualfprintf(
fail_file,
"No such eomtypelocal=%d in define_method\n",eomtypelocal);
1218 #define JACNPR (NDIM+1) // maximum number of terms in Jacobian
1219 #define JACNUMTYPES 5
1220 #define JNORMALTYPE 0
1222 #define JSUPERFULLTYPE 2
1223 #define JFULLERRORTYPE 3
1224 #define JSUBERRORTYPE 4
1225 int jacstart[JACNUMTYPES],jaclist[JACNUMTYPES][
JACNPR],jacend[JACNUMTYPES];
1226 #define JACTYPELOOP(type) for(type=0;type<JACNUMTYPES;type++)
1227 #define JACALLLOOP(pl) for(pl=0;pl<JACNPR;pl++)
1228 #define JACLOOP(type,pliter,pl) for(pliter=jacstart[type],pl=jaclist[type][pliter];pliter<=jacend[type];pliter++,pl=jaclist[type][pliter])
1232 #define JACNPR (NDIM)
1233 #define JACLOOP(jj,startjj,endjj) for(jj=startjj;jj<=endjj;jj++)
1234 #define JACLOOPALT(jj,startjj,endjj) DLOOPA(jj) //for(jj=startjj;jj<=endjj;jj++) // for those things might or might not want to do all terms
1237 #define JACLOOPSUPERFULL(pliter,pl,eomtype,baseitermethod,radinvmod) PLOOPDYNAMICAL(pliter,pl) if(\
1238 pl!=ENTROPY && pl!=UU && pl!=URAD0 \
1239 || (eomtype==EOMDEFAULT && EOMTYPE==EOMENTROPYGRMHD || eomtype==EOMENTROPYGRMHD || eomtype==EOMDIDENTROPYGRMHD) \
1240 && (pl==ENTROPY || pl==URAD0 && IMPMHDTYPEBASE(baseitermethod)==0 || IMPMHDTYPEBASE(baseitermethod)==1 && (pl==URAD0 && AVOIDURAD0IFRADINVMODANDPMHDMETHOD==0 || pl==URAD0 && AVOIDURAD0IFRADINVMODANDPMHDMETHOD==1 && radinvmod==0)) \
1241 || (eomtype==EOMDEFAULT && EOMTYPE==EOMGRMHD || eomtype==EOMGRMHD || eomtype==EOMDIDGRMHD) \
1242 && (pl==UU || pl==URAD0 && IMPMHDTYPEBASE(baseitermethod)==0 || IMPMHDTYPEBASE(baseitermethod)==1 && (pl==URAD0 && AVOIDURAD0IFRADINVMODANDPMHDMETHOD==0 || pl==URAD0 && AVOIDURAD0IFRADINVMODANDPMHDMETHOD==1 && radinvmod==0) ) \
1246 #define JACLOOPFULLERROR(itermode,jj,startjj,endjj) for(jj=(itermode==ITERMODECOLD ? startjj : 0);jj<=(itermode==ITERMODECOLD ? endjj : NDIM-1);jj++)
1247 #define JACLOOPSUBERROR(jj,startjj,endjj) JACLOOP(jj,startjj,endjj)
1248 #define JACLOOP2D(ii,jj,startjj,endjj) JACLOOP(ii,startjj,endjj) JACLOOP(jj,startjj,endjj)
1251 static void get_refUs(
int *numdims,
int *startjac,
int *endjac,
int *implicititer,
int *implicitferr,
int *irefU,
int *iotherU,
int *erefU,
int *eotherU,
int *signgd2,
int *signgd4,
int *signgd6,
int *signgd7)
1260 *numdims=jacend[JNORMALTYPE];
1263 DLOOPA(jj) iotherU[jj]=URAD0+jj;
1268 JACTYPELOOP(type){ jacstart[type]=0; jacend[type]=
NDIM-1;
DLOOPA(jj) jaclist[type][jj]=
UU+jj; }
1272 JACTYPELOOP(type){ jacstart[type]=0; jacend[type]=0; jaclist[type][0]=
UU; }
1276 JACTYPELOOP(type){ jacstart[type]=0; jacend[type]=2;
SLOOPA(jj) jaclist[type][jj]=
U1+jj-1; }
1283 *startjac=0; *endjac=0;
1287 *startjac=1; *endjac=3;
1292 DLOOPA(jj) irefU[jj]=URAD0+jj;
1294 *startjac=0; *endjac=
NDIM-1;
1299 DLOOPA(jj) irefU[jj]=URAD0+jj;
1301 *startjac=0; *endjac=0;
1306 DLOOPA(jj) irefU[jj]=URAD0+jj;
1308 *startjac=1; *endjac=3;
1311 dualfprintf(
fail_file,
"No such implicititer=%d\n",*implicititer);
1320 DLOOPA(jj) eotherU[jj]=URAD0+jj;
1337 else if(*implicitferr==
QTYURAD){
1339 DLOOPA(jj) erefU[jj]=URAD0+jj;
1344 DLOOPA(jj) erefU[jj]=URAD0+jj;
1349 DLOOPA(jj) erefU[jj]=URAD0+jj;
1353 dualfprintf(
fail_file,
"No such implicitferr=%d\n",*implicitferr);
1371 jaclist[type][jacend[type]-1]=NRAD;
1389 DLOOPA(jj) ru->iotherU[jj]=URAD0+jj;
1390 ru->startjac=0; ru->endjac=
NDIM-1;
1415 DLOOPA(jj) ru->irefU[jj]=URAD0+jj;
1417 ru->startjac=0; ru->endjac=
NDIM-1;
1422 DLOOPA(jj) ru->irefU[jj]=URAD0+jj;
1424 ru->startjac=0; ru->endjac=0;
1429 DLOOPA(jj) ru->irefU[jj]=URAD0+jj;
1431 ru->startjac=1; ru->endjac=3;
1445 DLOOPA(jj) ru->eotherU[jj]=URAD0+jj;
1447 if(mtd->implicitferr==
QTYUMHD){
1464 DLOOPA(jj) ru->erefU[jj]=URAD0+jj;
1469 DLOOPA(jj) ru->erefU[jj]=URAD0+jj;
1474 DLOOPA(jj) ru->erefU[jj]=URAD0+jj;
1495 setnewtonstatsdefault(newtonstats);
1526 *checkoninversiongas=*checkoninversionrad=1;
1530 *checkoninversiongas=*checkoninversionrad=0;
1554 static int f_implicit(
int allowbaseitermethodswitch,
int iter,
int f1iter,
int failreturnallowable,
int whichcall,
FTYPE impeps,
int showmessages,
int showmessagesheavy,
int allowlocalfailurefixandnoreport,
int *eomtype,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
int *radinvmod,
FTYPE conv,
FTYPE convabs,
FTYPE allowconvabs,
int maxiter,
FTYPE realdt,
int dimtypef,
FTYPE *dimfactU,
FTYPE *ppprev,
FTYPE *pp,
FTYPE *piin,
FTYPE *uuprev,
FTYPE *Uiin,
FTYPE *uu0,
FTYPE *uu,
FTYPE localdt,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *f,
FTYPE *fnorm,
FTYPE *freport,
int *goexplicit,
FTYPE *errorabs,
FTYPE *errorallabs,
int whicherror,
int *convreturn,
int *nummhdinvsreturn,
FTYPE *tautotmaxreturn,
struct of_method *mtd,
struct of_refU *ru)
1559 int checkoninversiongas=0;
1560 int checkoninversionrad=0;
1562 FTYPE Gdpl[NPR]={0.0},Gdplabs[NPR]={0.0}, Tgas={0.0},Trad={0.0};
1564 FTYPE uuabs[NPR]={0.0};
1581 FTYPE ppbackup[NPR],uubackup[NPR]={0.0};
1582 FTYPE ppalt[NPR]={0.0},uualt[NPR]={0.0};
1583 int radinvmodbackup,radinvmodalt,failreturnalt;
1585 ppalt[pl]=ppbackup[pl]=pp[pl];
1586 uualt[pl]=uubackup[pl]=uu[pl];
1589 radinvmodbackup=*radinvmod;
1594 #if(MODEMETHOD==MODEENERGY ||MODEMETHOD==MODEENTROPY ||MODEMETHOD==MODESWITCH) // currently only ones that allow change
1600 define_method(iter, eomtype, itermode, *baseitermethod, fracenergy, dissmeasure, &mtd);
1601 get_refUs(&mtd, &ru);
1681 if(badchange && iter==1){
1683 PLOOP(pliter,pl) uu[pl] = uu0[pl];
1692 FTYPE Tgaslocal=0.0,Tradlocal=0.0;
1695 Tgaslocal=compute_temp_simple(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,pp[
RHO],pp[
UU]);
1702 int doradonly=1; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1704 int computeentropy=1;
1705 koral_source_rad_calc(computestate,computeentropy,pp, ptrgeom, Gdpl, Gdplabs, NULL, &Tgaslocal, &Tradlocal, q);
1709 uu[ENTROPY] = uu0[ENTROPY] + (ru->
signgd6)*GS;
1712 setgasinversionstuff(iter,whichcall,impeps,*errorabs,convabs,maxiter,&newtonstats,&checkoninversiongas,&checkoninversionrad);
1713 int doradonly=0; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1714 *nummhdinvsreturn++;
1718 PLOOP(pliter,pl) uu[pl] = uuprev[pl];
1719 doradonly=1; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1731 doradonly=1; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1744 radinvmodalt=*radinvmod;
1745 failreturnalt=failreturn;
1748 pp[
UU]=ppbackup[
UU];
1749 if(ENTROPY>=0) pp[ENTROPY]=pp[
UU];
1760 PLOOP(pliter,pl) ppalt[pl] = pp[pl];
1761 PLOOP(pliter,pl) uualt[pl] = uu[pl];
1783 setgasinversionstuff(iter,whichcall,impeps,*errorabs,convabs,maxiter,&newtonstats,&checkoninversiongas,&checkoninversionrad);
1784 int doradonly=0;
int eomtypetemp=
EOMENTROPYGRMHD; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, &eomtypetemp, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1785 *nummhdinvsreturn++;
1786 radinvmodalt=*radinvmod;
1787 failreturnalt=failreturn;
1789 pp[
UU]=ppbackup[
UU];
1790 if(ENTROPY>=0) pp[ENTROPY]=pp[
UU];
1798 FTYPE uuentropy[NPR],uuentropyabs[NPR];
1800 uu[ENTROPY]=uuentropy[ENTROPY];
1801 uuabs[ENTROPY]=uuentropyabs[ENTROPY];
1804 DLOOPA(iv) uu[URAD0+iv] = uu0[URAD0+iv] - (uu[
UU+iv]-uu0[
UU+iv]);
1806 int failreturn2;
int doradonly2=1; failreturn2=Utoprimgen_failwrapper(doradonly2,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1808 if(failreturn2>failreturn) failreturn=failreturn2;
1816 PLOOP(pliter,pl) ppalt[pl] = pp[pl];
1817 PLOOP(pliter,pl) uualt[pl] = uu[pl];
1851 if(ENTROPY>=0) pp[ENTROPY] = pp[
UU];
1863 int finalstepfixup=0;
1865 FTYPE ppfixup[NPR],ppfloor[NPR],uufixup[NPR],prceiling[NPR];
1867 ppfixup[pl]=ppfloor[pl]=pp[pl];
1873 set_density_floors_alt(ptrgeom, q, ppfixup, uu, bsq, ppfloor, prceiling);
1889 FTYPE pporig[NPR];
PLOOP(pliter,pl) pporig[pl]=pp[pl];
1901 FTYPE uumhd[NPR],uumhdabs[NPR];
1918 else whichcapnew=whichcap;
1919 int doradonly=1; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcapnew,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
1920 radinvmodalt=*radinvmod;
1921 failreturnalt=failreturn;
1928 if(iter<mtd->BEGINNORMALSTEPS+4 && pp[PRAD0]<10.0*
ERADLIMIT && ppbackup[PRAD0]>10.0*
ERADLIMIT){
1949 FTYPE uurad[NPR],uuradabs[NPR];
1973 PLOOP(pliter,pl) ppalt[pl] = pp[pl];
1975 PLOOP(pliter,pl) uualt[pl] = uu[pl];
1996 FTYPE uurad[NPR],uuradabs[NPR];
2000 uuabs[pl]=uuradabs[pl];
2010 FTYPE Tgaslocal=0.0,Tradlocal=0.0;
2012 Tgaslocal=compute_temp_simple(ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p,pp[
RHO],pp[
UU]);
2019 int computeentropy=1;
2020 koral_source_rad_calc(computestate,computeentropy,pp, ptrgeom, Gdpl, Gdplabs, NULL, &Tgaslocal, &Tradlocal, q);
2023 uu[ENTROPY] = uu0[ENTROPY] + (ru->
signgd6)*GS;
2025 setgasinversionstuff(iter,whichcall,impeps,*errorabs,convabs,maxiter,&newtonstats,&checkoninversiongas,&checkoninversionrad);
2026 int doradonly=0; failreturn=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, eomtype, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu, q, ptrgeom, dissmeasure, pp, &newtonstats);
2027 *nummhdinvsreturn++;
2028 radinvmodalt=*radinvmod;
2029 failreturnalt=failreturn;
2031 pp[
UU]=ppbackup[
UU];
2032 if(ENTROPY>=0) pp[ENTROPY]=pp[
UU];
2046 PLOOP(pliter,pl) ppalt[pl] = pp[pl];
2048 PLOOP(pliter,pl) uualt[pl] = uu[pl];
2058 #if(MODEMETHOD==MODEENERGY ||MODEMETHOD==MODEENTROPY ||MODEMETHOD==MODESWITCH) // currently only ones that allow change
2067 int doswitchbaseitermethod=0;
2073 uuallabs1 =
THIRD*(fabs(uuabs[pl]) + fabs(uu[pl]) + fabs(uu0[pl]));
2074 rdU[pl]=(uu[pl]-uu0[pl])/uuallabs1;
2082 if(rdU[
UU]>rdU[URAD0] && (*baseitermethod==
QTYURAD||*baseitermethod==
QTYPRAD)){
2092 doswitchbaseitermethod=1;
2094 pp[pl] = ppprev[pl];
2095 uu[pl] = uuprev[pl];
2101 *radinvmod=radinvmodbackup;
2112 if(doswitchbaseitermethod){
2114 define_method(iter, eomtype, itermode, *baseitermethod, fracenergy, dissmeasure, &mtd);
2115 get_refUs(&mtd, &ru);
2140 int computeentropy=needentropy;
2142 FTYPE tautot,tautotmax;
2143 koral_source_rad_calc(computestate,computeentropy,pp, ptrgeom, Gdpl, Gdplabs, &chieff, &Tgas, &Trad, q);
2145 *tautotmaxreturn=tautotmax;
2171 FTYPE extrafactor[NPR];
2173 extrafactor[pl]=1.0;
2179 extrafactor[pl]=fabs(Tgas)+
TEMPMIN;
2185 FTYPE uuallabs[NPR]={0.0},Gallabs[NPR]={0.0};
2188 f[pl] = ((uu[pl] - uu0[pl]) + (sign[pl] * localdt * Gdpl[pl]))*extrafactor[pl];
2190 falt[pl] = ((uualt[pl] - uu0[pl]) + (sign[pl] * localdt * Gdpl[pl]))*extrafactor[pl];
2194 uuallabs[pl] =
THIRD*(fabs(uuabs[pl]) + fabs(uu[pl]) + fabs(uu0[pl]))*extrafactor[pl];
2195 Gallabs[pl] = fabs(sign[pl] * localdt * Gdplabs[pl])*extrafactor[pl];
2196 fnorm[pl] = uuallabs[pl] + Gallabs[pl];
2208 *convreturn=f_error_check(showmessages, showmessagesheavy, iter, conv, convabs, realdt, dimtypef,*eomtype , *radinvmod, itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,pp,piin,f,fnorm,freport,Uiin,uu0,uu,ptrgeom,errorabs,errorallabs,whicherror,mtd,ru);
2224 FTYPE uuallabsURAD0 =
THIRD*(fabs(uuabs[pl]) + fabs(uu[pl]) + fabs(uu0[pl]));
2225 FTYPE ratchangeRtt2=fabs(Gdplabs[pl]*realdt)/uuallabsURAD0;
2228 FTYPE uuallabsUU =
THIRD*(fabs(uuabs[pl]) + fabs(uu[pl]) + fabs(uu0[pl]));
2229 FTYPE ratchangeRtt3=fabs(Gdplabs[pl]*realdt)/uuallabsUU;
2232 ratchangeRtt =
MAX(
MAX(ratchangeRtt1,ratchangeRtt2),ratchangeRtt3);
2247 #if(TRYFIRSTEXPLICIT)
2258 FTYPE Gdpli[NPR]={0.0},Gdplabsi[NPR]={0.0}, Tgasi={0.0},Tradi={0.0};
2259 FTYPE ppi[NPR],uui[NPR];
2260 FTYPE uuabsi[NPR]={0.0};
2261 PLOOP(pliter,pl) uuabsi[pl]=uuabs[pl];
2263 FTYPE extrafactori[NPR];
2264 FTYPE fi[NPR]={0.0},fnormi[NPR]={0.0};
2265 FTYPE uuallabsi[NPR]={0.0},Gallabsi[NPR]={0.0};
2267 FTYPE freporti[NPR];
2275 PLOOP(pliter,pl) ppi[pl]=piin[pl];
2277 if(pl>=
UU && pl<=U3 || pl>=URAD0 && pl<=URAD3) uui[pl]=Uiin[pl];
2278 else uui[pl]=uu0[pl];
2285 setgasinversionstuff(iter,whichcall,impeps,*errorabs,convabs,maxiter,&newtonstats,&checkoninversiongas,&checkoninversionrad);
2292 int eomtypei=*eomtype;
2294 int doradonlyi=0; failreturni=Utoprimgen_failwrapper(doradonlyi,&radinvmodi,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, &eomtypei, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uui, &qi, ptrgeom, dissmeasure, ppi, &newtonstats);
2305 koral_source_rad_calc(computestate,computeentropy,ppi, ptrgeom, Gdpli, Gdplabsi, &chieffi, &Tgasi, &Tradi, &qi);
2310 extrafactori[pl]=1.0;
2315 extrafactori[pl]=fabs(Tgasi)+
TEMPMIN;
2318 fi[pl] = ((uui[pl] - uu0[pl]) + (sign[pl] * localdt * Gdpli[pl]))*extrafactori[pl];
2320 uuallabsi[pl] =
THIRD*(fabs(uuabsi[pl]) + fabs(uui[pl]) + fabs(uu0[pl]))*extrafactori[pl];
2321 Gallabsi[pl] = fabs(sign[pl] * localdt * Gdplabsi[pl])*extrafactori[pl];
2322 fnormi[pl] = uuallabsi[pl] + Gallabsi[pl];
2326 convreturni=f_error_check(showmessages, showmessagesheavy, iter, conv, convabs, realdt, dimtypef,*eomtype , *radinvmod, itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,ppi,piin,fi,fnormi,freporti,Uiin,uu0,uui,ptrgeom,&errorabsi,&errorallabsi,whicherror);
2341 FTYPE uue[NPR],uueabs[NPR],ppe[NPR];
2343 FTYPE fe[NPR]={0.0},fnorme[NPR]={0.0};
2344 FTYPE uuallabse[NPR]={0.0},Gallabse[NPR]={0.0};
2345 FTYPE freporte[NPR];
2347 FTYPE Gdple[NPR]={0.0},Gdplabse[NPR]={0.0}, Tgase={0.0},Trade={0.0};
2350 FTYPE extrafactore[NPR];
2355 FTYPE explicitdt=localdt;
2358 uue[pl] = -((0- uu0[pl]) + (sign[pl] * explicitdt * Gdpl[pl]));
2359 uueabs[pl] = uuabs[pl];
2363 setgasinversionstuff(iter,whichcall,impeps,*errorabs,convabs,maxiter,&newtonstats,&checkoninversiongas,&checkoninversionrad);
2381 int eomtypee=*eomtype;
2384 int doradonly=0;
int failreturne=Utoprimgen_failwrapper(doradonly,&radinvmode,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstepe, &eomtypee, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uue, &qe, ptrgeom, dissmeasure, ppe, &newtonstats);
2398 FTYPE uumhd[NPR],uumhdabs[NPR];
2419 int eomtypee2=*eomtype;
2421 int doradonly2=1;
int failreturne2=Utoprimgen_failwrapper(doradonly2,&radinvmode2,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstepe, &eomtypee2, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uue, &qe, ptrgeom, dissmeasure, ppe, &newtonstats);
2435 FTYPE uurad[NPR],uuradabs[NPR];
2443 koral_source_rad_calc(computestate,computeentropy,ppe, ptrgeom, Gdple, Gdplabse, &chieffe, &Tgase, &Trade, &qe);
2446 extrafactore[pl]=1.0;
2451 extrafactore[pl]=fabs(Tgase)+
TEMPMIN;
2455 fe[pl] = ((uue[pl] - uu0[pl]) + (sign[pl] * localdt * Gdple[pl]))*extrafactore[pl];
2457 uuallabse[pl] =
THIRD*(fabs(uueabs[pl]) + fabs(uue[pl]) + fabs(uu0[pl]))*extrafactore[pl];
2458 Gallabse[pl] = fabs(sign[pl] * localdt * Gdplabse[pl])*extrafactore[pl];
2459 fnorme[pl] = uuallabse[pl] + Gallabse[pl];
2462 convreturne=f_error_check(showmessages, showmessagesheavy, iter, conv, convabs, realdt, dimtypef,*eomtype , *radinvmod, itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,ppe,piin,fe,fnorme,freporte,Uiin,uu0,uue,ptrgeom,&errorabse,&errorallabse,whicherror,mtd,ru);
2475 if(fabs(errorallabse)<fabs(*errorallabs)){
2480 uuallabs[pl]=uuallabse[pl];
2482 Gallabs[pl]=Gallabse[pl];
2484 fnorm[pl]=fnorme[pl];
2485 freport[pl]=freporte[pl];
2494 *errorabs=errorabse;
2495 *errorallabs=errorallabse;
2496 *convreturn=convreturne;
2499 FTYPE tautote,tautotmaxe;
2503 tautotmax=tautotmaxe;
2504 *tautotmaxreturn=tautotmaxe;
2508 else if(fabs(errorallabsi)<fabs(*errorallabs)){
2513 uuallabs[pl]=uuallabsi[pl];
2515 Gallabs[pl]=Gallabsi[pl];
2517 fnorm[pl]=fnormi[pl];
2518 freport[pl]=freporti[pl];
2527 *errorabs=errorabsi;
2528 *errorallabs=errorallabsi;
2529 *convreturn=convreturni;
2532 FTYPE tautoti,tautotmaxi;
2536 tautotmax=tautotmaxi;
2537 *tautotmaxreturn=tautotmaxi;
2573 #define ITERCHECKEXPLICITSAFE 1 // iteration by which assume G has settled and can test if can go explicit.
2583 if(fabs(ratchangeRtt*uu[pl])>
NUMEPSILON*fabs(uuallabs[pl])) *goexplicit=0;
2584 if(fabs(ratchangeRtt*uu0[pl])>
NUMEPSILON*fabs(uuallabs[pl])) *goexplicit=0;
2601 if(fracenergy>0.0 && fracenergy<1.0){
2604 FTYPE fentropy[NPR];
2605 FTYPE fnormentropy[NPR];
2611 f[
UU] = fracenergy*fabs(f[
UU]) + (1.0-fracenergy)*fabs(f[ENTROPY]);
2612 fnorm[
UU] = fracenergy*fnorm[
UU] + (1.0-fracenergy)*fnorm[ENTROPY];
2631 #if(ALLOWUSEUUALT) // purpose of this is equivalent to whether one can go explicit, but overly complicated and if reduces to using alternative when not desired, then not energy-momentum conserving
2637 FTYPE errorabsalt,errorallabsalt;
2638 FTYPE faltreport[NPR];
2639 int convreturnalt=f_error_check(showmessages, showmessagesheavy, iter, conv, convabs, realdt, dimtypef,*eomtype , *radinvmod, itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,pp,piin,falt,fnorm,faltreport,Uiin,uu0,uualt,ptrgeom,&errorabsalt,&errorallabsalt,whicherror,mtd,ru);
2648 if(errorabsalt<*errorabs && convreturnalt==1){
2660 freport[pl]=faltreport[pl];
2671 *convreturn=convreturnalt;
2672 *errorabs=errorabsalt;
2673 *errorallabs=errorallabsalt;
2674 *radinvmod=radinvmodalt;
2675 failreturn=failreturnalt;
2693 static long long int newtoncounttotal=0;
2694 newtoncounttotal+=newtonstats.
lntries;
2695 static long long int newtoncounthere=0;
2697 dualfprintf(
fail_file,
"Newtonstat: local=%d total=%d average=%21.15g\n",newtonstats.
lntries,newtoncounttotal,(
FTYPE)newtoncounttotal/(
FTYPE)newtoncounthere);
2703 if(failreturn && failreturn>failreturnallowable){
2704 prod0dualfprintf(showmessages && debugfail>=2,
fail_file,
"Utoprimgen_wrapper() failed, must return out of f_implicit(): %d vs. %d\n",failreturn,failreturnallowable);
2725 return(CUf[2]*dtin);
2730 return(CUimp[0]*dtin);
2744 static int koral_source_rad_implicit(
int *eomtype,
FTYPE *pb,
FTYPE *pf,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE dissmeasure,
FTYPE *dUother ,
FTYPE (*dUcomp)[NPR])
2763 int iiii=ptrgeom->i;
2764 int jjjj=ptrgeom->j;
2765 int kkkk=ptrgeom->k;
2766 int llloc=ptrgeom->p;
2772 int reducetoquick=0;
2779 int EXTRAPOLEDEATH=0,localpoledeath=0;
2783 localpoledeath=
POLEDEATH + EXTRAPOLEDEATH;
2793 localpoledeath=
POLEDEATH + EXTRAPOLEDEATH;
2803 FTYPE Rhorref=rhor_calc(0);
2806 else reducetoquick=1;
2808 else reducetoquick=1;
2823 int failreturn,noprims;
2824 int havebackup,didentropyalready;
2825 int usedenergy=0,usedentropy=0,usedboth=0,usedcold=0,usedimplicit=0,usedexplicitgood=0,usedexplicitkindabad=0,usedexplicitbad=0;
2834 int failfinalreturn;
2847 FTYPE fracdtuu0=1.0;
2848 FTYPE uu0[NPR],dUtot[NPR],rdUtot[NPR];
2851 uu0[pl]=UFSET(CUf,fracdtuu0*
dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
2852 dUtot[pl] = uu0[pl]-Uiin[pl];
2853 rdUtot[pl] = fabs(uu0[pl]-Uiin[pl])/(fabs(uu0[pl])+fabs(Uiin[pl]));
2872 FTYPE pbbackup[NPR];
2873 FTYPE uubbackup[NPR];
2877 pbbackup[pl]=pb[pl];
2878 uubbackup[pl]=uub[pl];
2879 SCLOOP(sc) dUcompbackup[sc][pl]=dUcomp[sc][pl];
2890 PFTYPE *lpflag,*lpflagrad;
2891 lpflag=&GLOBALMACP0A1(pflag,ptrgeom->i,ptrgeom->j,ptrgeom->k,
FLAGUTOPRIMFAIL);
2919 int testeom,counteom=0;
2920 for(testeom=0;testeom<
NUMEOMTYPES;testeom++)
if(eomtypecond[testeom]) counteom++;
2922 dualfprintf(
fail_file,
"Too many default eomtypeconds\n");
2923 for(testeom=0;testeom<
NUMEOMTYPES;testeom++) dualfprintf(
fail_file,
"%d %d\n",testeom,eomtypecond[testeom]);
2963 didentropyalready=0;
2964 eomtypelocal=*eomtype;
2965 errorabs[0]=errorabs[1]=1.0;
2979 failreturn=
koral_source_rad_implicit_mode(modemethodlocal,1,0,havebackup, didentropyalready, &eomtypelocal, whichcap, itermode, &baseitermethod, trueimptryconv, trueimpokconv, trueimpallowconv, trueimpmaxiter, truenumdampattempts, fracenergy, dissmeasure, &radinvmod, pb, uub, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, q, dUother ,dUcomp, errorabs, errorabs, &iters, &f1iters, &nummhdinvs, &nummhdsteps);
2986 pb[pl]=pbbackup[pl];
2987 uub[pl]=uubbackup[pl];
2988 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
2994 else if(failreturn>=0){
2997 *eomtype=eomtypelocal;
3019 didentropyalready=0;
3021 errorabs[0]=errorabs[1]=1.0;
3026 failreturn=
koral_source_rad_implicit_mode(modemethodlocal,1,0,havebackup, didentropyalready, &eomtypelocal, whichcap, itermode, &baseitermethod, trueimptryconv, trueimpokconv, trueimpallowconv, trueimpmaxiter, truenumdampattempts, fracenergy, dissmeasure, &radinvmod, pb, uub, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, q, dUother ,dUcomp, errorabs, errorabs, &iters, &f1iters, &nummhdinvs, &nummhdsteps);
3033 pb[pl]=pbbackup[pl];
3034 uub[pl]=uubbackup[pl];
3035 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
3041 else if(failreturn>=0){
3044 *eomtype=eomtypelocal;
3064 int gotrameshsolution=0;
3070 FTYPE uueng[NPR]={0.0},uuent[NPR]={0.0};
3081 pb[pl]=pbbackup[pl];
3082 uub[pl]=uubbackup[pl];
3083 SCLOOP(sc) dUcompeng[sc][pl]=dUcomp[sc][pl]=dUcompbackup[sc][pl];
3090 int whichcall=*eomtype;
3091 get_rameshsolution_wrapper(whichcall, *eomtype, errorabsforramesh, ptrgeom, pb, piin, Uiin, Ufin, dUother, CUf, CUimp, q, ppeng, ppent, uueng, uuent, dUcompeng, dUcompent, &qeng, &qent, &failtypeeng, errorabseng, &iterseng, &radinvmodeng, &failtypeent, errorabsent, &itersent, &radinvmodent);
3092 gotrameshsolution=1;
3097 SCLOOP(sc) dUcomp[sc][pl]=dUcompeng[sc][pl];
3101 *lpflag=*lpflagrad=(
PFTYPE)failtypeeng;
3102 radinvmod=radinvmodeng;
3105 errorabs[0]=errorabseng[0];
3106 errorabs[1]=errorabseng[1];
3112 pb[pl]=pbbackup[pl];
3113 uub[pl]=uubbackup[pl];
3114 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
3155 int itersenergy=0,itersentropy=0;
3156 int f1itersenergy=0,f1itersentropy=0;
3157 int nummhdinvsenergy=0,nummhdinvsentropy=0;
3158 int nummhdstepsenergy=0,nummhdstepsentropy=0;
3159 int itermodeenergy,itermodeentropy;
3160 int baseitermethodenergy,baseitermethodentropy;
3161 int whichcapenergy,whichcapentropy;
3162 FTYPE trueimptryconvenergy,trueimptryconventropy;
3163 FTYPE trueimpokconvenergy,trueimpokconventropy;
3164 FTYPE trueimpallowconvenergy,trueimpallowconventropy;
3165 int trueimpmaxiterenergy,trueimpmaxiterentropy;
3166 int truenumdampattemptsenergy,truenumdampattemptsentropy;
3170 eomtypelocal=*eomtype;
3172 didentropyalready=0;
3174 errorabsenergy[0]=errorabsenergy[1]=1.0;
3183 failreturnenergy=
koral_source_rad_implicit_mode(modemethodlocal,1,0,havebackup, didentropyalready, &eomtypelocal, whichcapenergy, itermodeenergy, &baseitermethodenergy, trueimptryconvenergy, trueimpokconvenergy, trueimpallowconvenergy, trueimpmaxiterenergy, truenumdampattemptsenergy, fracenergy, dissmeasure, &radinvmod, pb, uub, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, q, dUother ,dUcomp, errorabsenergy, errorabsenergy, &itersenergy, &f1itersenergy, &nummhdinvsenergy, &nummhdstepsenergy);
3184 nummhdsteps+=nummhdstepsenergy;
3191 pb[pl]=pbbackup[pl];
3192 uub[pl]=uubbackup[pl];
3193 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
3198 didentropyalready=0;
3200 errorabsentropy[0]=errorabsentropy[1]=1.0;
3208 baseitermethodentropy=
QTYPMHD;
3209 failreturnentropy=
koral_source_rad_implicit_mode(modemethodlocal,1,0,havebackup, didentropyalready, &eomtypelocal, whichcapentropy, itermodeentropy, &baseitermethodentropy, trueimptryconventropy, trueimpokconventropy, trueimpallowconventropy, trueimpmaxiterentropy, truenumdampattemptsentropy, fracenergy, dissmeasure, &radinvmod, pb, uub, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, q, dUother ,dUcomp, errorabsentropy, errorabsentropy, &itersentropy, &f1itersentropy, &nummhdinvsentropy, &nummhdstepsentropy);
3210 nummhdsteps+=nummhdstepsentropy;
3218 if(debugfail>=2) dualfprintf(
fail_file,
"Entropy also failed: energy=%d entropy=%d\n",failreturnenergy,failreturnentropy);
3220 else if(failreturnentropy>=0){
3225 errorabs[0]=errorabsentropy[0];
3226 errorabs[1]=errorabsentropy[1];
3228 f1iters=f1itersentropy;
3231 *eomtype=eomtypelocal;
3240 f1iters=f1itersentropy;
3245 else if(failreturnenergy>=0){
3250 errorabs[0]=errorabsenergy[0];
3251 errorabs[1]=errorabsenergy[1];
3253 f1iters=f1itersenergy;
3255 *eomtype=eomtypelocal;
3258 if(
ACTUALHARDFAILURE(failreturnenergy) && debugfail>=2) dualfprintf(
fail_file,
"Decided didn't meet go-entropy condition but failed: failreturn=%d eomtypelocal=%d\n",failreturn,eomtypelocal);
3265 f1iters=f1itersentropy;
3301 #define NUMPHASES (6)
3302 #define NUMPHASESENT (8)
3303 #define NUMPHASESCOLD (1)
3306 static long long int tryphaselistenergy[
NUMPHASES]={0};
3307 static long long int tryphaselistentropy[
NUMPHASESENT]={0};
3311 int gotrameshsolution=0,usedrameshenergy=0,usedrameshentropy=0;
3324 int baseitermethodentropy=
QTYPMHD;
3325 FTYPE trueimptryconventropy;
3326 FTYPE trueimpokconventropy;
3327 FTYPE trueimpallowconventropy;
3328 int trueimpmaxiterentropy;
3329 int truenumdampattemptsentropy;
3330 int whichcapentropy;
3337 int itersentropyold=0;
3340 int f1itersentropy=0;
3341 int nummhdinvsentropy=0;
3342 int nummhdstepsentropy=0;
3347 didentropyalready=0;
3353 FTYPE pbentropybest[NPR];
PLOOP(pliter,pl) pbentropybest[pl]=pbbackup[pl];
3354 FTYPE uubentropybest[NPR];
PLOOP(pliter,pl) uubentropybest[pl]=uubbackup[pl];
3356 struct of_state qentropybest=qbackup;
3357 PFTYPE lpflagentropybest=1;
3358 PFTYPE lpflagradentropybest=1;
3360 int radErfnegentropybest=1;
3365 int goexplicitentropybest=0;
3368 FTYPE pbentropy[NPR];
3369 FTYPE uubentropy[NPR];
3373 PFTYPE lpflagradentropy=1;
3375 int radErfnegentropy=1;
3380 int goexplicitentropy=0;
3392 set_fracenergy(ptrgeom->i,ptrgeom->j,ptrgeom->k,dissmeasure, &fracenergy);
3409 int f1itersenergy=0;
3410 int nummhdinvsenergy=0;
3411 int nummhdstepsenergy=0;
3415 int baseitermethodenergy=
QTYPMHD;
3416 FTYPE trueimptryconvenergy;
3417 FTYPE trueimpokconvenergy;
3418 FTYPE trueimpallowconvenergy;
3419 int trueimpmaxiterenergy;
3420 int truenumdampattemptsenergy;
3425 FTYPE pbenergybest[NPR];
PLOOP(pliter,pl) pbenergybest[pl]=pbbackup[pl];
3426 FTYPE uubenergybest[NPR];
PLOOP(pliter,pl) uubenergybest[pl]=uubbackup[pl];
3428 struct of_state qenergybest=qbackup;
3430 PFTYPE lpflagenergybest=1;
3431 PFTYPE lpflagradenergybest=1;
3433 int radErfnegenergybest=1;
3438 int goexplicitenergybest=0;
3441 FTYPE pbenergy[NPR];
3442 FTYPE uubenergy[NPR];
3447 PFTYPE lpflagradenergy=1;
3449 int radErfnegenergy=1;
3454 int goexplicitenergy=0;
3465 FTYPE ppeng[NPR],ppent[NPR];
3466 FTYPE uueng[NPR],uuent[NPR];
3469 ppeng[pl]=ppent[pl]=pbbackup[pl];
3470 uueng[pl]=uuent[pl]=uubbackup[pl];
3471 SCLOOP(sc) dUcompeng[sc][pl]=dUcompent[sc][pl]=dUcompbackup[sc][pl];
3473 struct of_state qeng=qbackup, qent=qbackup;
3490 static FTYPE sqrtnumepsilon1;
3491 static FTYPE sqrtnumepsilon2;
3492 static int firsttimeset=1;
3500 int radprimaryevolves=0;
3501 if(fabs(rdUtot[
UU])<sqrtnumepsilon1*fabs(rdUtot[URAD0]) || fabs(uu0[URAD0])<sqrtnumepsilon1*fabs(uu0[UU]) || fabs(pb[URAD0])<sqrtnumepsilon1*fabs(pb[UU])){
3502 radprimaryevolves=1;
3505 radprimaryevolves=0;
3507 int radextremeprimaryevolves=0;
3508 if(fabs(rdUtot[UU])<10.0*
NUMEPSILON*fabs(dUtot[URAD0]) || fabs(uu0[URAD0])<10.0*
NUMEPSILON*fabs(uu0[UU]) || fabs(pb[URAD0])<10.0*
NUMEPSILON*fabs(pb[UU])){
3509 radextremeprimaryevolves=1;
3512 radextremeprimaryevolves=0;
3514 int gasprimaryevolves=0;
3517 if(radprimaryevolves==0 && (fabs(rdUtot[URAD0])<sqrtnumepsilon2*fabs(rdUtot[UU]) || fabs(uu0[UU])<sqrtnumepsilon2*fabs(uu0[URAD0]) || fabs(pb[UU])<sqrtnumepsilon2*fabs(pb[URAD0]) )){
3518 gasprimaryevolves=1;
3521 gasprimaryevolves=0;
3523 int gasextremeprimaryevolves=0;
3524 if(radprimaryevolves==0 && radextremeprimaryevolves==0 && (fabs(rdUtot[URAD0])<10.0*
NUMEPSILON*fabs(dUtot[UU]) || fabs(uu0[UU])<10.0*
NUMEPSILON*fabs(uu0[URAD0]) || fabs(pb[UU])<10.0*
NUMEPSILON*fabs(pb[URAD0]) )){
3525 gasextremeprimaryevolves=1;
3528 gasextremeprimaryevolves=0;
3534 radprimaryevolves=0;
3535 gasprimaryevolves=0;
3540 radprimaryevolves=radextremeprimaryevolves=0;
3541 gasprimaryevolves=gasextremeprimaryevolves=1;
3545 int bsqorhocond=0,funnelcond=0;
3553 radprimaryevolves=radextremeprimaryevolves=0;
3554 gasprimaryevolves=gasextremeprimaryevolves=1;
3578 prioritermethodlist[oo]=GLOBALMACP0A1(prioritermethod,i,j,k,oo);
3613 int modprimlist[
NUMPHASES]={0,0,0,1,0,0};
3614 int checkradinvlist[
NUMPHASES]={0,1,1,0,1,1};
3627 if(gasprimaryevolves==0){
3628 if(radprimaryevolves){
3634 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0; whichfirsturad=tryphase1;
3635 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0; whichfirstprad=tryphase1;
3636 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=0; whichfirstpmhd=tryphase1;
3637 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0;
3638 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0;
3639 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=1;
3645 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0; whichfirstprad=tryphase1;
3646 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0; whichfirsturad=tryphase1;
3647 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=0; whichfirstpmhd=tryphase1;
3648 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0;
3649 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0;
3650 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=1;
3661 int firsttryphase1used=-1;
3662 for(tryphase1=0;tryphase1<
NUMPHASES;tryphase1++){
3676 if(V[1]<
Rhor && isbhspc){
3689 if(radextremeprimaryevolves && baseitermethodlist[tryphase1]==
QTYPMHD)
continue;
3690 if(gasextremeprimaryevolves && (baseitermethodlist[tryphase1]==
QTYURAD || baseitermethodlist[tryphase1]==
QTYPRAD))
continue;
3692 if(radextremeprimaryevolves==0 && (baseitermethodlist[tryphase1]==
QTYURAD || baseitermethodlist[tryphase1]==
QTYPRAD) ){
3700 if(gasextremeprimaryevolves==0 && (baseitermethodlist[tryphase1]==
QTYPMHD)){
3743 if(reducetoquick==1){
3745 trueimpmaxiterlist[tryphase1]=1;
3751 if(firsttryphase1used!=-1)
continue;
3763 if(firsttryphase1used==-1) firsttryphase1used=tryphase1;
3764 tryphaselistenergy[tryphase1]++;
3769 errorabsenergyold[0]=errorabsenergy[0];
3770 errorabsenergyold[1]=errorabsenergy[1];
3771 radinvmodenergyold=radinvmodenergy;
3772 itersenergyold=itersenergy;
3776 baseitermethodenergy=baseitermethodlist[tryphase1];
3777 itermodeenergy=itermodelist[tryphase1];
3778 trueimptryconvenergy=trueimptryconvlist[tryphase1];
3779 trueimpokconvenergy=(
MAX(trueimptryconvlist[tryphase1],trueimpokconvlist[tryphase1]));
3780 trueimpallowconvenergy=(
MAX(trueimptryconvlist[tryphase1],trueimpallowconvconstlist[tryphase1]));
3781 trueimpmaxiterenergy=trueimpmaxiterlist[tryphase1];
3782 truenumdampattemptsenergy=truenumdampattemptslist[tryphase1];
3784 if(havebackup==0) modprim=modprimlist[tryphase1];
3792 eomtypeenergy=eomtypelist[tryphase1];
3793 errorabsenergy[0]=errorabsenergy[1]=1.0;
3798 didentropyalready=0;
3802 didentropyalready=1;
3809 pbenergy[pl]=pbbackup[pl];
3810 uubenergy[pl]=uubbackup[pl];
3811 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3814 errorabsenergy[0]=errorabsenergy[1]=1.0;
3819 pbenergy[pl]=pbenergybest[pl];
3820 uubenergy[pl]=uubenergybest[pl];
3821 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3823 qenergy=qenergybest;
3824 errorabsenergy[0]=errorabsenergybest[0];
3825 errorabsenergy[1]=errorabsenergybest[1];
3826 radinvmodenergy=radinvmodenergybest;
3831 pbenergy[pl]=pbentropy[pl];
3832 uubenergy[pl]=uubentropy[pl];
3833 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3836 errorabsenergy[0]=errorabsentropy[0];
3837 errorabsenergy[1]=errorabsentropy[1];
3838 radinvmodenergy=radinvmodentropy;
3841 failreturnenergy=
koral_source_rad_implicit_mode(modemethodlocal,0,modprim,havebackup, didentropyalready, &eomtypeenergy, whichcapenergy, itermodeenergy, &baseitermethodenergy, trueimptryconvenergy, trueimpokconvenergy, trueimpallowconvenergy, trueimpmaxiterenergy, truenumdampattemptsenergy, fracenergy, dissmeasure, &radinvmodenergy, pbenergy, uubenergy, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, &qenergy, dUother ,dUcompenergy, errorabsenergy, errorabsenergybest, &itersenergy, &f1itersenergy, &nummhdinvsenergy, &nummhdstepsenergy);
3842 nummhdsteps+=nummhdstepsenergy;
3845 errorabslist[tryphase1][0]=errorabsenergy[0];
3846 errorabslist[tryphase1][1]=errorabsenergy[1];
3849 lpflagenergybest=*lpflag;
3850 lpflagradenergybest=*lpflagrad;
3851 radinvmodenergybest=radinvmodenergy;
3852 radErfnegenergybest=radErfnegenergy;
3853 failreturnenergybest=failreturnenergy;
3854 eomtypeenergybest=eomtypelist[tryphase1];
3855 goexplicitenergybest=1;
3877 lpflagenergybest=*lpflag;
3878 lpflagradenergybest=*lpflagrad;
3879 radinvmodenergybest=radinvmodenergy;
3880 radErfnegenergybest=radErfnegenergy;
3881 failreturnenergybest=failreturnenergy;
3882 eomtypeenergybest=eomtypeenergy;
3883 goexplicitenergybest=0;
3884 errorabsenergybest[0]=errorabsenergy[0];
3885 errorabsenergybest[1]=errorabsenergy[1];
3887 pbenergybest[pl]=pbenergy[pl];
3888 uubenergybest[pl]=uubenergy[pl];
3889 SCLOOP(sc) dUcompenergybest[sc][pl]=dUcompenergy[sc][pl];
3891 qenergybest=qenergy;
3898 methodindex[NUMDAMPINDEX] = truenumdampattemptslist[tryphase1];
3906 itersenergy+=itersenergyold;
3911 if(tryphase1!=firsttryphase1used && noproblem){
3912 if(debugfail>=2) dualfprintf(
fail_file,
"Recovered using tryphase1=%d (energy: failreturnenergy=%d radinvmod=%d -> %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g (best=%21.15g) iters: %d->%d baseitermethod=%d eomtype=%d\n",tryphase1,failreturnenergy,radinvmodenergyold,radinvmodenergy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsenergyold[
WHICHERROR],errorabsenergy[WHICHERROR],errorabsenergybest[WHICHERROR],itersenergyold,itersenergy,baseitermethodenergy,eomtypeenergy);
3915 if(debugfail>=2) dualfprintf(
fail_file,
"Failed to: <Recovered> using tryphase1=%d (energy: failreturnenergy=%d radinvmod=%d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g (best=%21.15g) iters: %d->%d baseitermethod=%d eomtype=%d\n",tryphase1,failreturnenergy,radinvmodenergy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsenergyold[
WHICHERROR],errorabsenergy[WHICHERROR],errorabsenergybest[WHICHERROR],itersenergyold,itersenergy,baseitermethodenergy,eomtypeenergy);
3937 errorabsenergyold[0]=errorabsenergy[0];
3938 errorabsenergyold[1]=errorabsenergy[1];
3939 radinvmodenergyold=radinvmodenergy;
3940 itersenergyold=itersenergy;
3943 if(gotrameshsolution){
3945 pbenergy[pl]=ppeng[pl];
3946 uubenergy[pl]=uueng[pl];
3947 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompeng[sc][pl];
3951 *lpflag=*lpflagrad=(
PFTYPE)failtypeeng;
3952 radinvmodenergy=radinvmodeng;
3954 itersenergy=iterseng;
3955 errorabsenergy[0]=errorabseng[0];
3956 errorabsenergy[1]=errorabseng[1];
3963 set_array(errorabsforramesh,NUMERRORTYPES,MPI_FTYPE,1.0);
3968 pbenergy[pl]=pbbackup[pl];
3969 uubenergy[pl]=uubbackup[pl];
3970 SCLOOP(sc) dUcompeng[sc][pl]=dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3973 errorabseng[0]=errorabseng[1]=1.0;
3974 errorabsforramesh[0]=errorabsforramesh[1]=1.0;
3979 pbenergy[pl]=pbentropy[pl];
3980 uubenergy[pl]=uubentropy[pl];
3981 SCLOOP(sc) dUcompeng[sc][pl]=dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3984 errorabseng[0]=errorabsentropybest[0];
3985 errorabseng[1]=errorabsentropybest[1];
3986 errorabsforramesh[0]=errorabsforramesh[1]=1.0;
3987 radinvmodeng=radinvmodentropybest;
3992 pbenergy[pl]=pbenergybest[pl];
3993 uubenergy[pl]=uubenergybest[pl];
3994 SCLOOP(sc) dUcompeng[sc][pl]=dUcompenergy[sc][pl]=dUcompbackup[sc][pl];
3996 qenergy=qenergybest;
3997 errorabseng[0]=errorabsenergybest[0];
3998 errorabseng[1]=errorabsenergybest[1];
3999 errorabsforramesh[0]=errorabsenergybest[0];
4000 errorabsforramesh[1]=errorabsenergybest[1];
4001 radinvmodeng=radinvmodenergybest;
4007 int whichcall=eomtypeenergy;
4008 get_rameshsolution_wrapper(whichcall, eomtypeenergy, errorabsforramesh, ptrgeom, pbenergy, piin, Uiin, Ufin, dUother, CUf, CUimp, q, ppeng, ppent, uueng, uuent, dUcompeng, dUcompent, &qeng, &qent, &failtypeeng, errorabseng, &iterseng, &radinvmodeng, &failtypeent, errorabsent, &itersent, &radinvmodent);
4009 gotrameshsolution=1;
4012 pbenergy[pl]=ppeng[pl];
4013 uubenergy[pl]=uueng[pl];
4014 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompeng[sc][pl];
4018 *lpflag=*lpflagrad=(
PFTYPE)failtypeeng;
4019 radinvmodenergy=radinvmodeng;
4021 itersenergy=iterseng;
4022 errorabsenergy[0]=errorabseng[0];
4023 errorabsenergy[1]=errorabseng[1];
4049 lpflagenergybest=*lpflag;
4050 lpflagradenergybest=*lpflagrad;
4051 radinvmodenergybest=radinvmodenergy;
4052 radErfnegenergybest=radErfnegenergy;
4053 failreturnenergybest=failreturnenergy;
4054 eomtypeenergybest=eomtypeenergy;
4055 errorabsenergybest[0]=errorabsenergy[0];
4056 errorabsenergybest[1]=errorabsenergy[1];
4058 pbenergybest[pl]=pbenergy[pl];
4059 uubenergybest[pl]=uubenergy[pl];
4060 SCLOOP(sc) dUcompenergybest[sc][pl]=dUcompenergy[sc][pl];
4062 qenergybest=qenergy;
4076 itersenergy+=itersenergyold;
4079 if(debugfail>=2) dualfprintf(
fail_file,
"(energy: failreturnenergy=%d): Recovered using ramesh (%d %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g iters: %d->%d\n",failreturnenergy,gotrameshsolution,usedrameshenergy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsenergyold[
WHICHERROR],errorabsenergy[WHICHERROR],itersenergyold,itersenergy);
4082 if(debugfail>=2) dualfprintf(
fail_file,
"Failed to (energy: failreturnenergy=%d): Recovered using ramesh (%d %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g iters: %d->%d\n",failreturnenergy,gotrameshsolution,usedrameshenergy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsenergyold[
WHICHERROR],errorabsenergy[WHICHERROR],itersenergyold,itersenergy);
4096 *lpflag=lpflagenergybest;
4097 *lpflagrad=lpflagradenergybest;
4098 radinvmodenergy=radinvmodenergybest;
4099 radErfnegenergy=radErfnegenergybest;
4100 failreturnenergy=failreturnenergybest;
4101 eomtypeenergy=eomtypeenergybest;
4102 errorabsenergy[0]=errorabsenergybest[0];
4103 errorabsenergy[1]=errorabsenergybest[1];
4105 pbenergy[pl]=pbenergybest[pl];
4106 uubenergy[pl]=uubenergybest[pl];
4107 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompenergybest[sc][pl];
4109 qenergy=qenergybest;
4110 goexplicitenergy=goexplicitenergybest;
4113 lpflagenergy=*lpflag;
4114 lpflagradenergy=*lpflagrad;
4134 reducetoquick!=1 && (
4149 int baseitermethodlist[
NUMPHASESENT]={
QTYPMHD,
QTYENTROPYUMHD,
QTYURAD,
QTYPRAD,
QTYPMHD,
QTYENTROPYUMHD,
QTYURAD,QTYPRAD};
int whichfirstpmhd=0,whichfirstentropyumhd=1,whichfirsturad=2,whichfirstprad=3;
4151 #if(DOPERF&&0) // superquick too little
4179 if(gasprimaryevolves==0){
4180 if(radprimaryevolves){
4186 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0; whichfirsturad=tryphase1;
4187 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0; whichfirstprad=tryphase1;
4188 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=0; whichfirstpmhd=tryphase1;
4189 tryphase1++; baseitermethodlist[tryphase1]=
QTYENTROPYUMHD; modprimlist[tryphase1]=0; whichfirstentropyumhd=tryphase1;
4190 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0;
4191 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0;
4192 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=1;
4193 tryphase1++; baseitermethodlist[tryphase1]=
QTYENTROPYUMHD; modprimlist[tryphase1]=0;
4199 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0; whichfirstprad=tryphase1;
4200 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0; whichfirsturad=tryphase1;
4201 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=0; whichfirstpmhd=tryphase1;
4202 tryphase1++; baseitermethodlist[tryphase1]=
QTYENTROPYUMHD; modprimlist[tryphase1]=0; whichfirstentropyumhd=tryphase1;
4203 tryphase1++; baseitermethodlist[tryphase1]=
QTYPRAD; modprimlist[tryphase1]=0;
4204 tryphase1++; baseitermethodlist[tryphase1]=
QTYURAD; modprimlist[tryphase1]=0;
4205 tryphase1++; baseitermethodlist[tryphase1]=
QTYPMHD; modprimlist[tryphase1]=1;
4206 tryphase1++; baseitermethodlist[tryphase1]=
QTYENTROPYUMHD; modprimlist[tryphase1]=0;
4212 int firsttryphase1used=-1;
4224 if(V[1]<
Rhor && isbhspc){
4237 if(radextremeprimaryevolves && (baseitermethodlist[tryphase1]==
QTYPMHD || baseitermethodlist[tryphase1]==
QTYENTROPYUMHD) )
continue;
4238 if(gasextremeprimaryevolves && (baseitermethodlist[tryphase1]==
QTYURAD || baseitermethodlist[tryphase1]==
QTYPRAD))
continue;
4240 if(radextremeprimaryevolves==0 && (baseitermethodlist[tryphase1]==
QTYURAD || baseitermethodlist[tryphase1]==
QTYPRAD) ){
4248 if(gasextremeprimaryevolves==0 && (baseitermethodlist[tryphase1]==
QTYPMHD)){
4285 if(reducetoquick==1){
4287 trueimpmaxiterlist[tryphase1]=1;
4293 if(firsttryphase1used!=-1)
continue;
4303 if(firsttryphase1used==-1) firsttryphase1used=tryphase1;
4304 tryphaselistentropy[tryphase1]++;
4307 itersentropyold=itersentropy;
4308 errorabsentropyold[0]=errorabsentropy[0];
4309 errorabsentropyold[1]=errorabsentropy[1];
4310 radinvmodentropyold=radinvmodentropy;
4313 baseitermethodentropy=baseitermethodlist[tryphase1];
4314 itermodeentropy=itermodelist[tryphase1];
4315 trueimptryconventropy=trueimptryconvlist[tryphase1];
4316 trueimpokconventropy=(
MAX(trueimptryconvlist[tryphase1],trueimpokconvlist[tryphase1]));
4317 trueimpallowconventropy=(
MAX(trueimptryconvlist[tryphase1],trueimpallowconvconstlist[tryphase1]));
4318 trueimpmaxiterentropy=trueimpmaxiterlist[tryphase1];
4319 truenumdampattemptsentropy=truenumdampattemptslist[tryphase1];
4321 if(havebackup==0) modprim=modprimlist[tryphase1];
4329 eomtypeentropy=eomtypelist[tryphase1];
4330 errorabsentropy[0]=errorabsentropy[1]=1.0;
4336 pbentropy[pl]=pbbackup[pl];
4337 uubentropy[pl]=uubbackup[pl];
4338 SCLOOP(sc) dUcompentropy[sc][pl]=dUcompbackup[sc][pl];
4341 errorabsentropy[0]=errorabsentropy[1]=1.0;
4346 pbentropy[pl]=pbentropybest[pl];
4347 uubentropy[pl]=uubentropybest[pl];
4348 SCLOOP(sc) dUcompentropy[sc][pl]=dUcompbackup[sc][pl];
4350 qentropy=qentropybest;
4351 errorabsentropy[0]=errorabsentropybest[0];
4352 errorabsentropy[1]=errorabsentropybest[1];
4353 radinvmodentropy=radinvmodentropybest;
4358 pbentropy[pl]=pbenergy[pl];
4359 SCLOOP(sc) dUcompentropy[sc][pl]=dUcompbackup[sc][pl];
4362 errorabsentropy[0]=errorabsenergy[0];
4363 errorabsentropy[1]=errorabsenergy[1];
4364 radinvmodentropy=radinvmodenergy;
4368 FTYPE fracenergyentropy=0;
4369 failreturnentropy=
koral_source_rad_implicit_mode(modemethodlocal,0,modprim,havebackup, didentropyalready, &eomtypeentropy, whichcapentropy, itermodeentropy, &baseitermethodentropy, trueimptryconventropy, trueimpokconventropy, trueimpallowconventropy, trueimpmaxiterentropy, truenumdampattemptsentropy, fracenergyentropy, dissmeasure, &radinvmodentropy, pbentropy, uubentropy, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, &qentropy, dUother ,dUcompentropy, errorabsentropy, errorabsentropybest, &itersentropy, &f1itersentropy, &nummhdinvsentropy, &nummhdstepsentropy);
4370 nummhdsteps+=nummhdstepsentropy;
4374 errorabslist[tryphase1][0]=errorabsentropy[0];
4375 errorabslist[tryphase1][1]=errorabsentropy[1];
4378 lpflagentropybest=*lpflag;
4379 lpflagradentropybest=*lpflagrad;
4380 radinvmodentropybest=radinvmodentropy;
4381 radErfnegentropybest=radErfnegentropy;
4382 failreturnentropybest=failreturnentropy;
4383 eomtypeentropybest=eomtypelist[tryphase1];
4384 goexplicitentropybest=1;
4406 lpflagentropybest=*lpflag;
4407 lpflagradentropybest=*lpflagrad;
4408 radinvmodentropybest=radinvmodentropy;
4409 radErfnegentropybest=radErfnegentropy;
4410 failreturnentropybest=failreturnentropy;
4411 eomtypeentropybest=eomtypeentropy;
4412 goexplicitentropybest=0;
4413 errorabsentropybest[0]=errorabsentropy[0];
4414 errorabsentropybest[1]=errorabsentropy[1];
4416 pbentropybest[pl]=pbentropy[pl];
4417 uubentropybest[pl]=uubentropy[pl];
4418 SCLOOP(sc) dUcompentropybest[sc][pl]=dUcompentropy[sc][pl];
4420 qentropybest=qentropy;
4427 methodindex[NUMDAMPINDEX] = truenumdampattemptslist[tryphase1];
4436 itersentropy+=itersentropyold;
4440 if(tryphase1!=firsttryphase1used && noproblem){
4441 if(debugfail>=2) dualfprintf(
fail_file,
"Recovered using tryphase1=%d (entropy: %d radinvmod=%d -> %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g (best=%21.15g) iters: %d->%d\n",tryphase1,failreturnentropy,radinvmodentropyold,radinvmodentropy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsentropyold[
WHICHERROR],errorabsentropy[WHICHERROR],errorabsentropybest[WHICHERROR],itersentropyold,itersentropy);
4444 if(debugfail>=2) dualfprintf(
fail_file,
"Failed to: <Recovered> using tryphase1=%d (entropy: %d radinvmod=%d -> %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g (best=%21.15g) iters: %d->%d\n",tryphase1,failreturnentropy,radinvmodentropyold,radinvmodentropy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsentropyold[
WHICHERROR],errorabsentropy[WHICHERROR],errorabsentropybest[WHICHERROR],itersentropyold,itersentropy);
4459 errorabsentropyold[0]=errorabsentropy[0];
4460 errorabsentropyold[1]=errorabsentropy[1];
4461 radinvmodentropyold=radinvmodentropy;
4462 itersentropyold=itersentropy;
4463 goexplicitentropy=0;
4466 if(gotrameshsolution){
4468 pbenergy[pl]=ppeng[pl];
4469 uubenergy[pl]=uueng[pl];
4470 SCLOOP(sc) dUcompenergy[sc][pl]=dUcompeng[sc][pl];
4474 *lpflag=*lpflagrad=(
PFTYPE)failtypeeng;
4475 radinvmodenergy=radinvmodeng;
4477 itersenergy=iterseng;
4478 errorabsenergy[0]=errorabseng[0];
4479 errorabsenergy[1]=errorabseng[1];
4486 set_array(errorabsforramesh,NUMERRORTYPES,MPI_FTYPE,1.0);
4490 pbentropy[pl]=pbbackup[pl];
4491 uubentropy[pl]=uubbackup[pl];
4492 SCLOOP(sc) dUcompent[sc][pl]=dUcompentropy[sc][pl]=dUcompbackup[sc][pl];
4495 errorabsent[0]=errorabsent[1]=1.0;
4496 errorabsforramesh[0]=errorabsforramesh[1]=1.0;
4501 pbentropy[pl]=pbentropybest[pl];
4502 SCLOOP(sc) dUcompent[sc][pl]=dUcompentropy[sc][pl]=dUcompbackup[sc][pl];
4504 qentropy=qentropybest;
4505 errorabsforramesh[0]=errorabsentropybest[0];
4506 errorabsforramesh[1]=errorabsentropybest[1];
4507 errorabsent[0]=errorabsentropybest[0];
4508 errorabsent[1]=errorabsentropybest[1];
4509 radinvmodent=radinvmodentropybest;
4515 int whichcall=eomtypeentropy;
4516 get_rameshsolution_wrapper(whichcall, eomtypeentropy, errorabsforramesh, ptrgeom, pbentropy, piin, Uiin, Ufin, dUother, CUf, CUimp, q, ppeng, ppent, uueng, uuent, dUcompeng, dUcompent, &qeng, &qent, &failtypeeng, errorabseng, &iterseng, &radinvmodeng, &failtypeent, errorabsent, &itersent, &radinvmodent);
4517 gotrameshsolution=1;
4520 pbentropy[pl]=ppent[pl];
4521 uubentropy[pl]=uuent[pl];
4522 SCLOOP(sc) dUcompentropy[sc][pl]=dUcompent[sc][pl];
4526 *lpflag=*lpflagrad=(
PFTYPE)failtypeent;
4527 radinvmodentropy=radinvmodent;
4529 itersentropy=itersent;
4530 errorabsentropy[0]=errorabsent[0];
4531 errorabsentropy[1]=errorabsent[1];
4553 lpflagentropybest=*lpflag;
4554 lpflagradentropybest=*lpflagrad;
4555 radinvmodentropybest=radinvmodentropy;
4556 radErfnegentropybest=radErfnegentropy;
4557 failreturnentropybest=failreturnentropy;
4558 eomtypeentropybest=eomtypeentropy;
4559 errorabsentropybest[0]=errorabsentropy[0];
4560 errorabsentropybest[1]=errorabsentropy[1];
4562 pbentropybest[pl]=pbentropy[pl];
4563 uubentropybest[pl]=uubentropy[pl];
4564 SCLOOP(sc) dUcompentropybest[sc][pl]=dUcompentropy[sc][pl];
4566 qentropybest=qentropy;
4579 itersentropy+=itersentropyold;
4581 if(debugfail>=2) dualfprintf(
fail_file,
"Recovered using ramesh(%d) (entropy: radinvmod=%d -> %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g iters: %d->%d\n",failtypeent,radinvmodentropyold,radinvmodentropy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsentropyold[
WHICHERROR],errorabsentropy[WHICHERROR],itersentropyold,itersentropy);
4584 if(debugfail>=2) dualfprintf(
fail_file,
"Failed to: Recovered using ramesh(%d) (entropy: radinvmod=%d -> %d): ijknstepsteppart=%d %d %d %ld %d : error: %21.15g->%21.15g iters: %d->%d\n",failtypeent,radinvmodentropyold,radinvmodentropy,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart,errorabsentropyold[
WHICHERROR],errorabsentropy[WHICHERROR],itersentropyold,itersentropy);
4597 *lpflag=lpflagentropybest;
4598 *lpflagrad=lpflagradentropybest;
4599 radinvmodentropy=radinvmodentropybest;
4600 radErfnegentropy=radErfnegentropybest;
4601 failreturnentropy=failreturnentropybest;
4602 eomtypeentropy=eomtypeentropybest;
4603 errorabsentropy[0]=errorabsentropybest[0];
4604 errorabsentropy[1]=errorabsentropybest[1];
4606 pbentropy[pl]=pbentropybest[pl];
4607 uubentropy[pl]=uubentropybest[pl];
4608 SCLOOP(sc) dUcompentropy[sc][pl]=dUcompentropybest[sc][pl];
4610 qentropy=qentropybest;
4611 goexplicitentropy=goexplicitentropybest;
4615 lpflagentropy=*lpflag;
4616 lpflagradentropy=*lpflagrad;
4651 int nummhdinvscold=0;
4652 int nummhdstepscold=0;
4655 FTYPE pbcold[NPR];
PLOOP(pliter,pl) pbcold[pl]=pbbackup[pl];
4656 FTYPE uubcold[NPR];
PLOOP(pliter,pl) uubcold[pl]=uubbackup[pl];
4662 int radErfnegcold=1;
4667 int goexplicitcold=0;
4671 if( reducetoquick!=1 && (
4684 FTYPE COLDFACTOR=0.1;
4685 int iscoldflow=
isflowcold(COLDFACTOR, includerad,pb,ptrgeom,q,uu0);
4695 tryphaselistcold[0]++;
4700 int baseitermethodcold=
QTYPMHD;
4701 #if(DOPERF&&0) // superquick too little
4717 if(V[1]<
Rhor && isbhspc){
4728 if(reducetoquick==1){
4730 trueimpmaxitercold=1;
4746 errorabscold[0]=errorabscold[1]=1.0;
4747 FTYPE fracenergycold=0.0;
4752 didentropyalready=0;
4754 pbcold[pl]=pbbackup[pl];
4755 uubcold[pl]=uubbackup[pl];
4764 SCLOOP(sc) dUcompcold[sc][pl]=dUcompbackup[sc][pl];
4767 errorabscold[0]=errorabscold[1]=1.0;
4770 failreturncold=
koral_source_rad_implicit_mode(modemethodlocal,0,0,havebackup, didentropyalready, &eomtypecold, whichcapcold, itermodecold, &baseitermethodcold, trueimptryconvcold, trueimpokconvcold, trueimpallowconvcold, trueimpmaxitercold, truenumdampattemptscold, fracenergycold, dissmeasure, &radinvmodcold, pbcold, uubcold, piin, Uiin, Ufin, CUf, CUimp, ptrgeom, &qcold, dUother ,dUcompcold, errorabscold, errorabscoldbest, &iterscold, &f1iterscold, &nummhdinvscold, &nummhdstepscold);
4771 nummhdsteps+=nummhdstepscold;
4776 lpflagradcold=*lpflagrad;
4816 int doentropy=whetherdoentropy(ptrgeom, fracenergy,
ACCEPTASNOFAILURE(failreturnentropy),
ACCEPTASNOFAILURE(failreturnenergy), radinvmodentropy, radinvmodenergy,
IMPTRYCONVABS,
IMPOKCONVABS,
IMPBADENERGY, errorabsentropy[
WHICHERROR], errorabsenergy[WHICHERROR], pbentropy, pbenergy);
4817 if(goexplicitentropy==1) doentropy=0;
4831 if(goexplicitentropy==0 && goexplicitenergy==0){
4843 *lpflag=lpflagentropy;
4844 *lpflagrad=lpflagradentropy;
4845 *eomtype=eomtypeentropy;
4848 pb[pl]=pbentropy[pl];
4849 uub[pl]=uubentropy[pl];
4850 SCLOOP(sc) dUcomp[sc][pl]=dUcompentropy[sc][pl];
4855 errorabs[0]=errorabsentropy[0];
4856 errorabs[1]=errorabsentropy[1];
4857 iters=itersentropy+itersenergy;
4858 f1iters=f1itersentropy+f1itersenergy;
4859 failreturn=failreturnentropy;
4868 *lpflag=lpflagenergy;
4869 *lpflagrad=lpflagradenergy;
4870 *eomtype=eomtypeenergy;
4873 pb[pl]=pbenergy[pl];
4874 uub[pl]=uubenergy[pl];
4875 SCLOOP(sc) dUcomp[sc][pl]=dUcompenergy[sc][pl];
4880 errorabs[0]=errorabsenergy[0];
4881 errorabs[1]=errorabsenergy[1];
4882 iters=itersentropy+itersenergy;
4883 f1iters=f1itersentropy+f1itersenergy;
4884 failreturn=failreturnenergy;
4894 *lpflagrad=lpflagradcold;
4895 *eomtype=eomtypecold;
4899 uub[pl]=uubcold[pl];
4900 SCLOOP(sc) dUcomp[sc][pl]=dUcompcold[sc][pl];
4905 errorabs[0]=errorabscold[0];
4906 errorabs[1]=errorabscold[1];
4907 iters=itersentropy+itersenergy+iterscold;
4908 f1iters=f1itersentropy+f1itersenergy+f1iterscold;
4909 failreturn=failreturncold;
4916 pbcold[
UU]=pbbackup[
UU];
4917 pbcold[URAD0]=pbbackup[URAD0];
4934 if(usedimplicit==0){
4935 if(goexplicitenergy==1 || goexplicitentropy==1){
4944 else{ usedexplicitkindabad=1; failfinalreturn=1;}
4946 prod0dualfprintf(debugfail>=3,
fail_file,
"Went explicit: eenergy=%g eentropy=%g ienergy=%d ientropy=%d\n",errorabsenergy[WHICHERROR],errorabsentropy[WHICHERROR],itersenergy,itersentropy);
4957 else{ usedexplicitkindabad=1; failfinalreturn=1;}
4959 prod0dualfprintf(debugfail>=3,
fail_file,
"Went explicit: eenergy=%g eentropy=%g ienergy=%d ientropy=%d\n",errorabsenergy[WHICHERROR],errorabsentropy[WHICHERROR],itersenergy,itersentropy);
4966 if(errorabsenergy[WHICHERROR]<errorabsentropy[WHICHERROR]){
4968 errorabs[0]=errorabsenergy[0];
4969 errorabs[1]=errorabsenergy[1];
4972 errorabs[0]=errorabsentropy[0];
4973 errorabs[1]=errorabsentropy[1];
4976 if(reducetoquick!=1) usedexplicitbad=1;
4978 prod0dualfprintf(debugfail>=2,
fail_file,
"No source: eenergy=%g eentropy=%g ienergy=%d ientropy=%d\n",errorabsenergy[WHICHERROR],errorabsentropy[WHICHERROR],itersenergy,itersentropy);
4983 pb[pl]=pbbackup[pl];
4984 uub[pl]=uubbackup[pl];
4985 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
4989 iters=itersentropy+itersenergy;
4990 f1iters=f1itersentropy+f1itersenergy;
4993 failreturn=failreturnenergy;
4997 prod0dualfprintf(*eomtype>=0 && failreturnenergy>=0 && failreturnentropy>=0 && failreturncold>=0,
fail_file,
"WTF: %d %d %d : %d : %d : %d\n",failreturnentropy,failreturnenergy,failreturncold,failfinalreturn,noprims,*eomtype);
5024 pf[pl]=pb[pl]=uu0[pl];
5042 if(!
isfinite(uub[pl])) caughtnan++;
5048 dualfprintf(
fail_file,
"implicit solver generated nan result and it wasn't caught\n");
5060 if(debugfail>=2) dualfprintf(
fail_file,
"No sourceNAN\n");
5062 if(reducetoquick!=1) usedexplicitbad=1;
5066 pb[pl]=pbbackup[pl];
5067 uub[pl]=uubbackup[pl];
5068 SCLOOP(sc) dUcomp[sc][pl]=dUcompbackup[sc][pl];
5084 GLOBALMACP0A1(prioritermethod,i,j,k,oo)=methodindex[oo];
5101 dualfprintf(
fail_file,
"WTF2: %g : %d %d %d : %d %d\n",errorabs[
WHICHERROR],usedenergy,usedentropy,usedcold,usedrameshenergy,usedrameshentropy);
5118 if(finalstep==1&& failfinalreturn==0){
5122 FTYPE ub[NPR],ubabs[NPR];
5124 primtoU(uutype,pb,&qb,ptrgeom,ub,ubabs);
5130 PLOOP(pliter,pl) utot[pl] = uub[pl];
5134 FTYPE ubdiag[NPR],utotdiag[NPR];
5139 PLOOP(pliter,pl)
if(
BPL(pl)) utotdiag[pl] = ubdiag[pl];
5147 else if(usedexplicitkindabad || usedexplicitbad) whocalled=
COUNTEXPLICITBAD;
5148 else if(usedenergy==0 && usedentropy==0 && usedboth==0 && usedcold==0 && usedimplicit==1) whocalled=
COUNTIMPLICITBAD;
5154 int docorrectuconslocal=0;
5155 extern int diag_fixup_dUandaccount(
FTYPE *Ui,
FTYPE *Uf,
FTYPE *ucons,
struct of_geom *ptrgeom,
int finalstep,
int whocalled,
int docorrectuconslocal);
5156 diag_fixup_dUandaccount(utotdiag, ubdiag, NULL, ptrgeom, finalstep, whocalled, docorrectuconslocal);
5176 extern int count_whocalled(
int i,
int j,
int k,
int finalstep,
int whocalled, CTYPE toadd);
5177 int fakefinalstep=1;
5187 if(usedenergy==0 && usedentropy==0 && usedboth==0 && usedcold==0 && usedimplicit==1)
count_whocalled(ptrgeom->i,ptrgeom->j,ptrgeom->k, fakefinalstep,
COUNTIMPLICITBAD,1);
5227 #define NUMNUMHIST (20)
5229 static long long int numenergy=0;
5230 static long long int numentropy=0;
5231 static long long int numboth=0;
5232 static long long int numcold=0;
5233 static long long int numbad=0;
5234 static long long int numramesh=0;
5235 static long long int numrameshenergy=0;
5236 static long long int numrameshentropy=0;
5238 static long long int numqtypmhd=0;
5239 static long long int numqtyumhd=0;
5240 static long long int numqtyprad=0;
5241 static long long int numqtyurad=0;
5242 static long long int numqtyentropyumhd=0;
5243 static long long int numqtyentropypmhd=0;
5244 static long long int numitermodenormal=0;
5245 static long long int numitermodestages=0;
5246 static long long int numitermodecold=0;
5248 static long long int numimplicits=0;
5249 static long long int numexplicitsgood=0;
5250 static long long int numexplicitskindabad=0;
5251 static long long int numexplicitsbad=0;
5252 static long long int numoff1iter=0,numofiter=0;
5253 static long long int numhisterr0[
NUMNUMHIST]={0};
5254 static long long int numhisterr1[
NUMNUMHIST]={0};
5259 static long long int totalnumenergy=0;
5260 static long long int totalnumentropy=0;
5261 static long long int totalnumcold=0;
5262 static long long int totalnumboth=0;
5263 static long long int totalnumbad=0;
5264 static long long int totalnumramesh=0;
5265 static long long int totalnumrameshenergy=0;
5266 static long long int totalnumrameshentropy=0;
5268 static long long int totalnumqtypmhd=0;
5269 static long long int totalnumqtyumhd=0;
5270 static long long int totalnumqtyprad=0;
5271 static long long int totalnumqtyurad=0;
5272 static long long int totalnumqtyentropyumhd=0;
5273 static long long int totalnumqtyentropypmhd=0;
5274 static long long int totalnumitermodenormal=0;
5275 static long long int totalnumitermodestages=0;
5276 static long long int totalnumitermodecold=0;
5279 static long long int totalnumimplicits=0;
5280 static long long int totalnumexplicitsgood=0;
5281 static long long int totalnumexplicitskindabad=0;
5282 static long long int totalnumexplicitsbad=0;
5283 static long long int totalnumoff1iter=0,totalnumofiter=0;
5284 static long long int totalnumhisterr0[
NUMNUMHIST]={0};
5285 static long long int totalnumhisterr1[
NUMNUMHIST]={0};
5290 static long long int totaltryphaselistenergy[
NUMPHASES];
5291 static long long int totaltryphaselistentropy[
NUMPHASESENT];
5305 numimplicits+=usedimplicit;
5306 numexplicitsgood+=usedexplicitgood;
5307 numexplicitskindabad+=usedexplicitkindabad;
5308 numexplicitsbad+=usedexplicitbad;
5310 numoff1iter+=f1iters;
5311 numenergy+=usedenergy;
5312 numentropy+=usedentropy;
5315 numbad+=(usedenergy==0 && usedentropy==0 && usedboth==0 && usedcold==0 && usedimplicit==1);
5316 numramesh+=gotrameshsolution;
5317 numrameshenergy+=usedrameshenergy;
5318 numrameshentropy+=usedrameshentropy;
5334 if(debugfail>=2 && (ptrgeom->i==0 && ptrgeom->j==0 && ptrgeom->k==0)){
5335 dualfprintf(
fail_file,
"nstep=%ld numimplicits=%lld numexplicitsgood=%lld numexplicitskindabad=%lld numexplicitsbad=%lld : numenergy=%lld numentropy=%lld numboth=%lld numcold=%lld : numbad=%lld : numramesh=%lld numrameshenergy=%lld numrameshentropy=%lld : averagef1iter=%g averageiter=%g : numqtypmhd=%lld numqtyumhd=%lld numqtyprad=%lld numqtyurad=%lld numqtyentropyumhd=%lld numqtyentropypmhd=%lld numitermodenormal=%lld numitermodestages=%lld numitermodecold=%lld\n",
nstep,numimplicits,numexplicitsgood,numexplicitskindabad,numexplicitsbad,numenergy,numentropy,numboth,numcold,numbad,numramesh,numrameshenergy,numrameshentropy,(
FTYPE)numoff1iter/(
SMALL+(
FTYPE)numimplicits),(
FTYPE)numofiter/(
SMALL+(
FTYPE)numimplicits),numqtypmhd,numqtyumhd,numqtyprad,numqtyurad,numqtyentropyumhd,numqtyentropypmhd,numitermodenormal,numitermodestages,numitermodecold);
5352 #define HISTREPORTSTEP (DTr) //something infrequent but not too much so
5353 if(debugfail>=2 &&
nstep%
HISTREPORTSTEP==0 && ptrgeom->i==0 && ptrgeom->j==0 && ptrgeom->k==0){
5356 dualfprintf(
fail_file,
"numhisterr%d=%lld %lld\n",histi,numhisterr0[histi],numhisterr1[histi]);
5359 dualfprintf(
fail_file,
"numhistiter%d=%lld\n",histi,numhistiter[histi]);
5365 #define GETCOLLECTIVETOTALS ( (debugfail>=2 || PRODUCTION<=1 && nstep%HISTREPORTSTEP==0 && steppart==0 ) && (ptrgeom->i==0 && ptrgeom->j==0 && ptrgeom->k==0) )
5371 MPI_Reduce(&numimplicits, &totalnumimplicits, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5372 MPI_Reduce(&numexplicitsgood, &totalnumexplicitsgood, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5373 MPI_Reduce(&numexplicitskindabad, &totalnumexplicitskindabad, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5374 MPI_Reduce(&numexplicitsbad, &totalnumexplicitsbad, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5375 MPI_Reduce(&numoff1iter, &totalnumoff1iter, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5376 MPI_Reduce(&numofiter, &totalnumofiter, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5377 MPI_Reduce(&numenergy, &totalnumenergy, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5378 MPI_Reduce(&numentropy, &totalnumentropy, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5379 MPI_Reduce(&numboth, &totalnumboth, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5380 MPI_Reduce(&numcold, &totalnumcold, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5381 MPI_Reduce(&numbad, &totalnumbad, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5382 MPI_Reduce(&numramesh, &totalnumramesh, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5383 MPI_Reduce(&numrameshenergy, &totalnumrameshenergy, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5384 MPI_Reduce(&numrameshentropy, &totalnumrameshentropy, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5386 MPI_Reduce(&numqtypmhd, &totalnumqtypmhd, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5387 MPI_Reduce(&numqtyumhd, &totalnumqtyumhd, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5388 MPI_Reduce(&numqtyprad, &totalnumqtyprad, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5389 MPI_Reduce(&numqtyurad, &totalnumqtyurad, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5390 MPI_Reduce(&numqtyentropyumhd, &totalnumqtyentropyumhd, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5391 MPI_Reduce(&numqtyentropypmhd, &totalnumqtyentropypmhd, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5392 MPI_Reduce(&numitermodenormal, &totalnumitermodenormal, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5393 MPI_Reduce(&numitermodestages, &totalnumitermodestages, 1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5395 MPI_Reduce(numhisterr0, totalnumhisterr0,
NUMNUMHIST, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5396 MPI_Reduce(numhisterr1, totalnumhisterr1,
NUMNUMHIST, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5397 MPI_Reduce(numhistiter, totalnumhistiter,
IMPMAXITERLONG+1, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5400 MPI_Reduce(tryphaselistenergy, totaltryphaselistenergy,
NUMPHASES, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5401 MPI_Reduce(tryphaselistentropy, totaltryphaselistentropy,
NUMPHASESENT, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5402 MPI_Reduce(tryphaselistcold, totaltryphaselistcold,
NUMPHASESCOLD, MPI_LONG_LONG_INT, MPI_SUM, MPIid[0], MPI_COMM_GRMHD);
5406 totalnumimplicits=numimplicits;
5407 totalnumexplicitsgood=numexplicitsgood;
5408 totalnumexplicitskindabad=numexplicitskindabad;
5409 totalnumexplicitsbad=numexplicitsbad;
5410 totalnumoff1iter=numoff1iter;
5411 totalnumofiter=numofiter;
5412 totalnumenergy=numenergy;
5413 totalnumentropy=numentropy;
5414 totalnumboth=numboth;
5415 totalnumcold=numcold;
5417 totalnumramesh=numramesh;
5418 totalnumrameshenergy=numrameshenergy;
5419 totalnumrameshentropy=numrameshentropy;
5421 totalnumqtypmhd=numqtypmhd;
5422 totalnumqtyumhd=numqtyumhd;
5423 totalnumqtyprad=numqtyprad;
5424 totalnumqtyurad=numqtyurad;
5425 totalnumqtyentropyumhd=numqtyentropyumhd;
5426 totalnumqtyentropypmhd=numqtyentropypmhd;
5427 totalnumitermodenormal=numitermodenormal;
5428 totalnumitermodestages=numitermodestages;
5432 totalnumhisterr0[histi]=numhisterr0[histi];
5433 totalnumhisterr1[histi]=numhisterr1[histi];
5436 totalnumhistiter[histi]=numhistiter[histi];
5441 totaltryphaselistenergy[oo]=tryphaselistenergy[oo];
5444 totaltryphaselistentropy[oo]=tryphaselistentropy[oo];
5447 totaltryphaselistcold[oo]=tryphaselistcold[oo];
5452 dualfprintf(
fail_file,
"nstep=%ld totalnumimplicits=%lld totalnumexplicitsgood=%lld totalnumexplicitskindabad=%lld totalnumexplicitsbad=%lld : totalnumenergy=%lld totalnumentropy=%lld totalnumboth=%lld totalnumcold=%lld : totalnumbad=%lld : totalnumramesh=%lld totalnumrameshenergy=%lld totalnumrameshentropy=%lld : totalaveragef1iter=%g totalaverageiter=%g : totalnumqtypmhd=%lld totalnumqtyumhd=%lld totalnumqtyprad=%lld totalnumqtyurad=%lld totalnumqtyentropyumhd=%lld totalnumqtyentropypmhd=%lld totalnumitermodenormal=%lld totalnumitermodestages=%lld totalnumitermodecold=%lld\n",
nstep,totalnumimplicits,totalnumexplicitsgood,totalnumexplicitskindabad,totalnumexplicitsbad,totalnumenergy,totalnumentropy,totalnumboth,totalnumcold,totalnumbad,totalnumramesh,totalnumrameshenergy,totalnumrameshentropy,(
FTYPE)totalnumoff1iter/(
SMALL+(
FTYPE)totalnumimplicits),(
FTYPE)totalnumofiter/(
SMALL+(
FTYPE)totalnumimplicits),totalnumqtypmhd,totalnumqtyumhd,totalnumqtyprad,totalnumqtyurad,totalnumqtyentropyumhd,totalnumqtyentropypmhd,totalnumitermodenormal,totalnumitermodestages,totalnumitermodecold);
5455 dualfprintf(
fail_file,
"totaltryenergy: ");
5456 for(oo=0;oo<
NUMPHASES;oo++) dualfprintf(
fail_file,
"%lld ",totaltryphaselistenergy[oo]);
5458 dualfprintf(
fail_file,
"totaltryentropy: ");
5461 dualfprintf(
fail_file,
"totaltrycold: ");
5468 trifprintf(
"totalnumhisterr%d=%lld %lld\n",histi,totalnumhisterr0[histi],totalnumhisterr1[histi]);
5471 trifprintf(
"totalnumhistiter%d=%lld\n",histi,totalnumhistiter[histi]);
5480 return(failfinalreturn);
5491 static int koral_source_rad_implicit_mode(
int modemethodlocal,
int allowbaseitermethodswitch,
int modprim,
int havebackup,
int didentropyalready,
int *eomtype,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE trueimptryconv,
FTYPE trueimpokconv,
FTYPE trueimpallowconv,
int trueimpmaxiter,
int truenumdampattempts,
FTYPE fracenergy,
FTYPE dissmeasure,
int *radinvmod,
FTYPE *pb,
FTYPE *uub,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *dUother ,
FTYPE (*dUcomp)[NPR],
FTYPE *errorabsreturn,
FTYPE *errorabsbestexternal,
int *itersreturn,
int *f1itersreturn,
int *nummhdinvsreturn,
int *nummhdstepsreturn)
5494 *nummhdinvsreturn=0;
5495 *nummhdstepsreturn=0;
5500 FTYPE dimfactU[NPR];
5501 PLOOP(pliter,pl) dimfactU[pl]=1.0;
5502 DLOOPA(jjdim) dimfactU[
UU+jjdim]=dimfactU[URAD0+jjdim]=sqrt(fabs(ptrgeom->gcon[
GIND(jjdim,jjdim)]));
5503 SLOOPA(jjdim) dimfactU[
B1+jjdim-1] = 1.0/dimfactU[
U1+jjdim-1];
5506 int i1,i2,i3,iv,ii,jj,kk,sc;
5508 int gotbest,bestfailreturnf;
5513 PLOOP(pliter,pl) pborig[pl]=pb[pl];
5514 int radinvmodorig=*radinvmod;
5522 FTYPE trueimptryconv_orig=trueimptryconv;
5537 #define NUMFRACDAMP 10
5545 FTYPE uu0[NPR],uup[NPR],uupp[NPR],uuppp[NPR],uu[NPR],uuporig[NPR],uu0orig[NPR],bestuu[NPR];
5546 FTYPE pp0[NPR],ppp[NPR],pppp[NPR],ppppp[NPR],pp[NPR],ppporig[NPR],pp0orig[NPR],bestpp[NPR];
5547 FTYPE f1[NPR],f1norm[NPR],f1report[NPR],f3report[NPR],lowestf1[NPR],lowestf1norm[NPR],lowestf1report[NPR],lowestf3report[NPR];
5549 FTYPE pppriorsteptype[NPR],uupriorsteptype[NPR];
5551 FTYPE radsource[NPR], deltas[NPR];
5552 extern int mathematica_report_check(
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
int baseitermethod,
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,
FTYPE *CUimp,
struct of_state *q,
FTYPE *dUother);
5556 int eomtypelocal=*eomtype;
5557 int allowlocalfailurefixandnoreport=0;
5564 int showmessagesheavy=0;
5565 static long long int failnum=0;
5567 int doingitsomecpu=0;
5570 if(
nstep==15 &&
steppart==0 && ptrgeom->i==6 && ptrgeom->j==8 && ptrgeom->k==0){
5580 showmessages=showmessagesheavy=1;
5610 lowestf1norm[pl]=
BIG;
5611 lowestf1report[pl]=
BIG;
5612 lowestf3report[pl]=
BIG;
5615 int gotfirstnofail=0;
5627 FTYPE fracdtuu0=1.0,fracdtG=1.0,fracuup=1.0;
5628 FTYPE fracdtuu0p=fracdtuu0;
5629 FTYPE fracdtuu0pp=fracdtuu0p;
5631 FTYPE fracdtGp=fracdtG;
5632 FTYPE fracdtGpp=fracdtGp;
5637 define_method(fakeitermethod, &eomtypelocal, itermode, *baseitermethod, fracenergy, dissmeasure, &mtd);
5648 PLOOP(pliter,pl) uu[pl]=uu0[pl]=UFSET(CUf,fracdtuu0*
dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
5658 FTYPE prtestUiin[NPR];
5659 PLOOP(pliter,pl) prtestUiin[pl]=piin[pl];
5662 #define GETDEFAULTFAILURESTATE (IMPPMHDTYPE(mtd.implicititer)==0) // with new rad inversion scheme, seems to push through without issue to just let hit gamma ceiling temporarily -- even with RADPULSEPLANAR
5667 int failreturnallowable;
5682 int failreturnallowableuse=failreturnallowable;
5683 int failreturnallowablefirst=-1;
5691 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
5694 #define IMPOKCONVCONSTFORDEFAULT (1E-6)
5695 #define IMPALLOWCONVCONSTFORDEFAULT (1E-4)
5696 #define IMPMAXITERFORDEFAULT (10)
5706 eomtypelocal=*eomtype;
5707 int checkoninversiongas;
5708 int checkoninversionrad;
5710 checkoninversiongas=checkoninversionrad=0;
5712 failreturnallowable=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcap,
EVOLVEUTOPRIM,
UNOTHING, Uiin, q, ptrgeom, dissmeasure, prtestUiin, &newtonstats);
5713 *nummhdinvsreturn++;
5715 if(showmessages && debugfail>=2) dualfprintf(
fail_file,
"Utoprimgen_wrapper() says that Uiin is already a problem with %d\n",failreturnallowable);
5718 if(showmessagesheavy && debugfail>=2) dualfprintf(
fail_file,
"Utoprimgen_wrapper() says that Uiin is NOT a problem with %d\n",failreturnallowable);
5722 else gotfirstnofail=0;
5723 failreturnallowablefirst=failreturnallowable;
5731 failreturnallowablefirst=failreturnallowable;
5750 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
5755 newtonstats.
tryconv=trueimptryconv;
5758 newtonstats.
maxiter=trueimpmaxiter;
5782 eomtypelocal=*eomtype;
5785 int checkoninversiongas;
5786 int checkoninversionrad;
5788 checkoninversiongas=checkoninversionrad=0;
5790 PLOOP(pliter,pl) prtest[pl]=pb[pl];
5791 failreturnallowable=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcapnew,
EVOLVEUTOPRIM,
UNOTHING, uu0, q, ptrgeom, dissmeasure, prtest, &newtonstats);
5792 if(doradonly==0) *nummhdinvsreturn++;
5814 FTYPE prtestUU0[NPR];
5815 PLOOP(pliter,pl) prtestUU0[pl]=pb[pl];
5827 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
5845 int failreturninversion;
5848 int checkoninversiongas;
5849 int checkoninversionrad;
5851 checkoninversiongas=checkoninversionrad=0;
5853 eomtypelocal=*eomtype;
5854 failreturninversion=Utoprimgen_failwrapper(doradonly,radinvmod,showmessages,checkoninversiongas,checkoninversionrad,allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcap,
EVOLVEUTOPRIM,
UNOTHING, uu0, q, ptrgeom, dissmeasure, prtestUU0, &newtonstats);
5855 *nummhdinvsreturn++;
5860 PLOOP(pliter,pl) ppfirst[pl]=pp[pl]=pp0[pl]=prtestUU0[pl];
5868 ppfirst[pl] = pp[pl] = pp0[pl] = pb[pl];
5886 trueimptryconv=trueimptryconv_orig;
5896 ppfirst[pl] = pp[pl] = pp0[pl] = piin[pl];
5900 ppfirst[pl] = pp[pl] = pp0[pl] = pb[pl];
5905 if(!(pl>=
UU && pl<=
U3 ||
RADPL(pl) || pl==ENTROPY)){
5907 ppfirst[pl] = pp[pl] = pp0[pl] = pb[pl];
5916 ppfirst[pl] = pp[pl] = pp0[pl] = piin[pl];
5922 uu[pl] = uu0[pl] = Uiin[pl];
5923 ppfirst[pl] = pp[pl] = pp0[pl] = piin[pl];
5932 pp[pl] = pp0[pl] = ppfirst[pl] = pb[pl];
5949 entropyfixguess(q, ptrgeom, uu0, pp);
5955 pp[
UU]=10.0*
MAX(pp[
UU],piin[UU]);
5970 FTYPE ppdampbackup[NPR],uudampbackup[NPR],uu0dampbackup[NPR];
5973 ppdampbackup[pl]=pp[pl];
5974 uudampbackup[pl]=uu[pl];
5975 uu0dampbackup[pl]=uu0[pl];
5983 int momiters=0,energyiters=0,fulliters=0;
5991 int earlylowerror=0;
5999 FTYPE tautotmaxreturn;
6003 int explicitattempt;
6017 if(explicitattempt==1){
6022 pp[pl]=ppdampbackup[pl];
6023 uu[pl]=uudampbackup[pl];
6024 uu0[pl]=uu0dampbackup[pl];
6036 for(dampattempt=0;dampattempt<truenumdampattempts;dampattempt++){
6041 if(debugfail>=2) dualfprintf(
fail_file,
"Damping worked to reach desired tolerance: errorabsf1=%g errorallabsf1=%g (IMPTRYDAMPCONV=%g), so should have lower error: dampattempt=%d iter=%d ijk=%d %d %d\n",errorabsf1[0],errorabsf1[1],
IMPTRYDAMPCONV,dampattempt,iter,ptrgeom->i,ptrgeom->j,ptrgeom->k);
6047 if(dampattempt==0) DAMPFACTOR0=1.0;
6048 else DAMPFACTOR0=1.0/pow(2.0,(
FTYPE)(dampattempt));
6050 if(dampattempt>0)
if(debugfail>=2) dualfprintf(
fail_file,
"Trying dampattempt=%d DAMPFACTOR0=%g failreturn=%d errorabsf1=%g errorallabsf1=%g iter=%d ijk=%d %d %d\n",dampattempt,DAMPFACTOR0,failreturn,errorabsf1[0],errorabsf1[1],iter,ptrgeom->i,ptrgeom->j,ptrgeom->k);
6064 pp[pl]=ppdampbackup[pl];
6065 uu[pl]=uudampbackup[pl];
6066 uu0[pl]=uu0dampbackup[pl];
6082 int checkconv,changeotherdt=1;
6090 uupriorsteptype[pl]=uuppp[pl]=uupp[pl]=uuporig[pl]=uup[pl]=uu0orig[pl]=uu[pl];
6091 pppriorsteptype[pl]=ppppp[pl]=pppp[pl]=ppporig[pl]=ppp[pl]=pp0orig[pl]=pp[pl];
6099 PLOOP(pliter,pl) pppreholdlist[iterlist][pl]=pp[pl];
6100 PLOOP(pliter,pl) ppposholdlist[iterlist][pl]=pp[pl];
6103 pppreholdlist[iterlist][
U1+jj-1]=q->
ucon[jj];
6104 pppreholdlist[iterlist][URAD1+jj-1]=q->
uradcon[jj];
6105 ppposholdlist[iterlist][
U1+jj-1]=q->
ucon[jj];
6106 ppposholdlist[iterlist][URAD1+jj-1]=q->
uradcon[jj];
6109 PLOOP(pliter,pl) f1reportlist[iterlist][pl]=
BIG;
6110 PLOOP(pliter,pl) f1list[iterlist][pl]=
BIG;
6111 realiterlist[iterlist]=-1;
6112 DLOOP(jj,kk) jaclist[iterlist][jj][kk]=
BIG;
6113 implicititerlist[iterlist]=-1;
6114 implicitferrlist[iterlist]=-1;
6115 fracdamplist[0]=fracdtuu0;
6116 fracdamplist[1]=fracdtG;
6119 errorabsf1list[iterlist]=
BIG;
6120 errorallabsf1list[iterlist]=
BIG;
6124 errorabsf1list[iterlist]=
BIG;
6125 errorallabsf1list[iterlist]=
BIG;
6130 errorabsreturn[0]=errorabsreturn[1]=
BIG;
6134 int holdingaspositive=0,iterhold=0;
6135 int countholdpositive=0;
6136 int countugnegative=0;
6137 int countbadenergy=0;
6138 int counterrorrose=0;
6139 int priorerrorscount=0;
6142 int convreturnf3limit=0;
6145 int numjumpchecks=0;
6156 debugiteratteempts[dampattempt]=debugiter;
6162 define_method(iter, &eomtypelocal, itermode, *baseitermethod, fracenergy, dissmeasure, &mtd);
6163 get_refUs(&mtd, &ru);
6185 convreturnf3limit=0;
6197 DAMPFACTOR=0.5*DAMPFACTOR0;
6200 DAMPFACTOR=0.5*DAMPFACTOR0;
6202 else DAMPFACTOR=DAMPFACTOR0;
6209 else DAMPFACTOR=DAMPFACTOR0;
6230 fracdtuu0pp=fracdtuu0p;
6231 fracdtuu0p=fracdtuu0;
6236 errorabspf3=errorabsf3;
6250 holdingaspositive=0;
6251 countholdpositive=0;
6253 for(itererror=0;itererror<
NUMPRIORERRORS;itererror++) errorabspf1[itererror]=
BIG;
6256 uupriorsteptype[pl]=uu[pl];
6257 pppriorsteptype[pl]=pp[pl];
6261 for(itererror=
MIN(priorerrorscount,
NUMPRIORERRORS)-1;itererror>=1;itererror--) errorabspf1[itererror]=errorabspf1[itererror-1];
6262 errorabspf1[0]=suberrorabsf1;
6265 PLOOP(pliter,pl) f1p[pl]=f1[pl];
6284 for(f1iter=f1iterstart;f1iter<
MAXF1TRIES;f1iter++){
6290 eomtypelocal=*eomtype;
6295 int baseitermethodorig=*baseitermethod;
6297 failreturnferr=
f_implicit(allowbaseitermethodswitch, iter, f1iter, failreturnallowableuse, whichcall, impepsjac, showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, baseitermethod, fracenergy, dissmeasure, radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, ppppp, pp, piin, uuppp, Uiin, uu0, uu, fracdtG*realdt, ptrgeom, q, f1, f1norm, f1report, &goexplicit, &errorabsf1[0], &errorabsf1[1],
WHICHERROR, &convreturnf1, nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
6315 trueimptryconv=trueimptryconv_orig;
6323 if(*baseitermethod!=baseitermethodorig) iter=1;
6326 #if(MODEMETHOD==MODEENERGY ||MODEMETHOD==MODEENTROPY ||MODEMETHOD==MODESWITCH)
6328 define_method(iter, &eomtypelocal, itermode, *baseitermethod, fracenergy, dissmeasure, &mtd);
6329 get_refUs(&mtd, &ru);
6346 trueimptryconvabs=((
FTYPE)(NDIM+2)*trueimptryconv);
6347 trueimptryconvalt=(
MAX(1
E-8,trueimptryconvabs));
6356 #define BACKUPRELEASEFAIL0 (1E-4)
6357 #define BACKUPRELEASEFAIL1 (1E-6)
6358 #define BACKUPRELEASEFAIL2 (1E-7)
6359 #define MAXF1ITERRADTRY (10) // number of iterations after which to release and allow radiation to "fail"
6363 failreturnallowableuse=failreturnallowable;
6375 fracdtuu0=
MIN(1.0,fracdtuu0);
6381 uup[pl]=uu[pl]=uu0[pl];
6382 ppp[pl]=pp[pl]=pp0[pl];
6396 PLOOP(pliter,pl) uu[pl]=(1.0-fracuup)*uupp[pl] + fracuup*uuporig[pl];
6398 PLOOP(pliter,pl) uup[pl]=uu[pl];
6400 PLOOP(pliter,pl) pp[pl]=(1.0-fracuup)*pppp[pl] + fracuup*ppporig[pl];
6402 PLOOP(pliter,pl) ppp[pl]=pp[pl];
6405 fracdtuu0=(1.0-fracuup)*fracdtuu0pp + fracuup*fracdtuu0p;
6407 fracdtG=(1.0-fracuup)*fracdtGpp + fracuup*fracdtGp;
6414 PLOOP(pliter,pl) uu0[pl]=UFSET(CUf,fracdtuu0*dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
6416 FTYPE uuiterback[NPR];
6417 PLOOP(pliter,pl) uuiterback[pl] = uu[pl];
6418 PLOOP(pliter,pl) uu[pl] = uu0[pl];
6426 if(showmessages && debugfail>=2) dualfprintf(
fail_file,
"f_implicit for f1 failed: iter=%d Backing-up both uu0 and G.: f1iter=%d fracdtuu0=%g fracdtG=%g fracuup=%g\n",iter,f1iter,fracdtuu0,fracdtG,fracuup);
6427 if(showmessagesheavy)
PLOOP(pliter,pl) dualfprintf(
fail_file,
"pl=%d Ui=%26.20g uu0=%26.20g uu0orig=%26.20g uu=%26.20g uup=%26.20g dUother=%26.20g\n",pl,Uiin[pl],uu0[pl],uu0orig[pl],uu[pl],uup[pl],dUother[pl]);
6433 if(showmessagesheavy)
PLOOP(pliter,pl) dualfprintf(
fail_file,
"SUCCESS: pl=%d Ui=%26.20g uu0=%26.20g uu0orig=%26.20g uu=%26.20g uup=%26.20g dUother=%26.20g: pp(pnew)=%g : fracdtuu0=%g fracdtG=%g fracuup=%g\n",pl,Uiin[pl],uu0[pl],uu0orig[pl],uu[pl],uup[pl],dUother[pl],pp[pl],fracdtuu0,fracdtG,fracuup);
6438 #define F1ITERSWITCHONNEG 20
6448 *nummhdstepsreturn = (int)(
nstroke-nstrokeorig);
6456 *f1itersreturn += f1iter;
6472 *nummhdstepsreturn = (int)(
nstroke-nstrokeorig);
6473 if(f1iter==MAXF1TRIES || *nummhdstepsreturn>
MAXMHDSTEPS){
6475 if(f1iter==MAXF1TRIES)
if(debugfail>=2) dualfprintf(
fail_file,
"Reached MAXF1TRIES=%d (nummhdstepsreturn=%d: %d %d trueimpmaxiter=%d): fracdtuu0=%g nstep=%ld steppart=%d ijk=%d %d %d : iter=%d eomtype=%d baseitermethod=%d failreturn=%d\n",MAXF1TRIES,*nummhdstepsreturn,nstrokeorig,
nstroke,trueimpmaxiter,fracdtuu0,
nstep,
steppart,ptrgeom->i,ptrgeom->j,ptrgeom->k,iter,eomtypelocal,*baseitermethod,failreturn);
6476 if(*nummhdstepsreturn>
MAXMHDSTEPS)
if(debugfail>=2) dualfprintf(
fail_file,
"Reached MAXMHDSTEPS=%d: fracdtuu0=%g nstep=%ld steppart=%d ijk=%d %d %d : iter=%d eomtype=%d baseitermethod=%d failreturn=%d\n",*nummhdstepsreturn,fracdtuu0,
nstep,
steppart,ptrgeom->i,ptrgeom->j,ptrgeom->k,iter,eomtypelocal,*baseitermethod,failreturn);
6484 if(doingit==1) myexit(10000000);
6497 if(showmessagesheavy)
PLOOP(pliter,pl) dualfprintf(
fail_file,
"i=%d ii=%d pl=%d f1=%g\n",ptrgeom->i,ii,pl,f1[pl]);
6533 if(fracdtG<1.0 && changeotherdt){
6551 suberrorabsf1 += fabs(f1report[ru.
erefU[jj]]);
6560 PLOOP(pliter,pl) pppreholdlist[debugiter][pl]=pp[pl];
6561 PLOOP(pliter,pl) ppposholdlist[debugiter][pl]=pp[pl];
6564 pppreholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
6565 pppreholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
6566 ppposholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
6567 ppposholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
6570 PLOOP(pliter,pl) f1reportlist[debugiter][pl]=f1report[pl];
6571 PLOOP(pliter,pl) f1list[debugiter][pl]=f1[pl];
6572 realiterlist[debugiter]=iter;
6573 DLOOP(jj,kk) jaclist[debugiter][jj][kk]=
BIG;
6576 fracdamplist[0]=fracdtuu0;
6577 fracdamplist[1]=fracdtG;
6578 fracdamplist[2]=DAMPFACTOR;
6580 errorabsf1list[debugiter]=errorabsf1[0];
6581 errorallabsf1list[debugiter]=errorabsf1[1];
6583 errorabsf1list[debugiter]=errorabsf1[0];
6584 errorallabsf1list[debugiter]=errorabsf1[1];
6596 FTYPE errorabs3=0.0;
int testi;
6597 for(testi=1;testi<=3;testi++) errorabs3 += fabs(f1report[ru.
irefU[testi]]);
6598 FTYPE errorneed=((
FTYPE)(3+2)*trueimptryconv);
6599 if(errorabs3<errorneed){
6608 FTYPE errorabs1=0.0;
int testi;
6609 for(testi=1;testi<=1;testi++) errorabs1 += fabs(f1report[ru.
irefU[testi]]);
6610 FTYPE errorneed=((
FTYPE)(1+2)*trueimptryconv);
6611 if(errorabs1<errorneed){
6629 #define ERRORJUMPCHECK 0 // no longer needed with error trend check, and expensive if u_g or Erf try to be <0 since hits continue.
6631 #define BUFFERITER 0 // how many iterations to wait until start to check how error is doing. When switching iteration methods, error will often rise initially in f1[0], but that's ok. But can temper jump by bridging used pp,uu, so ok to keep as 0 perhaps.
6633 #define NUMJUMPCHECKSMAX 5 // must limit, else if really drops-out and can't help, need to just accept.
6653 PLOOP(pliter,pl) pp[pl] = 0.75*pppp[pl] + 0.25*ppp[pl];
6654 PLOOP(pliter,pl) uu[pl] = 0.75*uupp[pl] + 0.25*uup[pl];
6659 PLOOP(pliter,pl) pppreholdlist[debugiter][pl]=pp[pl];
6660 PLOOP(pliter,pl) ppposholdlist[debugiter][pl]=pp[pl];
6663 pppreholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
6664 pppreholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
6665 ppposholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
6666 ppposholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
6669 DLOOP(jj,kk) jaclist[debugiter][jj][kk]=iJ[ru.
irefU[jj]][ru.
erefU[kk]];
6672 fracdamplist[0]=fracdtuu0;
6673 fracdamplist[1]=fracdtG;
6674 fracdamplist[2]=DAMPFACTOR;
6680 if(iter>trueimpmaxiter){
6691 #endif // end if ERRORJUMPCHECK
6708 FTYPE LOCALPREIMPCONVABS=(
FTYPE)(NDIM+2)*LOCALPREIMPCONV;
6728 errorabsbest[1]=0.0;
JACLOOPSUPERFULL(pliter,pl,*eomtype,*baseitermethod,*radinvmod) errorabsbest[1] += fabs(lowestf1report[pl]);
6730 PLOOP(pliter,pl) bestuu[pl]=uu[pl];
6731 PLOOP(pliter,pl) bestpp[pl]=pp[pl];
6732 PLOOP(pliter,pl) lowestf1[pl]=f1[pl];
6733 PLOOP(pliter,pl) lowestf1norm[pl]=f1norm[pl];
6734 PLOOP(pliter,pl) lowestf1report[pl]=f1report[pl];
6735 errorabsbest[0]=errorabsf1[0];
6736 errorabsbest[1]=errorabsf1[1];
6737 radinvmodbest=*radinvmod;
6771 #define CHECKDECREASE0 5
6772 #define CHECKDECREASEAVGNUM 3 // should be less than CHECKDECREASE0
6773 #define CHECKDECFACTOR (0.5) // i.e. should drop by this factor compared to older average
6777 avgerror[0]=avgerror[1]=0.0;
6779 for(ci=0;ci<CHECKDECREASEAVGNUM;ci++) avgerror[1] += errorallabsf1list[debugiter-
CHECKDECREASE0+ci];
6780 avgerror[0]/=(CHECKDECREASEAVGNUM);
6781 avgerror[1]/=(CHECKDECREASEAVGNUM);
6783 currenterror[0]=errorabsf1list[debugiter];
6784 currenterror[1]=errorallabsf1list[debugiter];
6788 int cond2=(currenterror[0]>
CHECKDECFACTOR*avgerror[0])&&(WHICHERROR==0);
6820 FTYPE errorneed=((
FTYPE)(numsub+2)*trueimptryconv);
6821 FTYPE errorneedalt=(
MAX(1
E-8,errorneed));
6823 if(suberrorabsf1>=errorabspf1[0]) counterrorrose++;
6838 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"SWITCHING MODE: Detected did not decrease error %d times at iter=%d : suberrorabsf1=%g errorabspf1=%g\n",counterrorrose,iter,suberrorabsf1,errorabspf1[0]);
6845 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"Aborting even without backup because error oscillated (iter=%d) and suberrorabsf1=%g errorabsf1[0,1]=%g %g\n",iter,suberrorabsf1,errorabsf1[0],errorabsf1[1]);
6865 FTYPE erroraverage=0.0;
int numerroraverage=0;
6866 for(itererror=1;itererror<
MIN(priorerrorscount,
NUMPRIORERRORS);itererror++){ erroraverage += errorabspf1[itererror]; numerroraverage++;} erroraverage/=((
FTYPE)numerroraverage);
6867 FTYPE changerequired;
6869 else if(dampattempt==1) changerequired=0.7;
6870 else if(dampattempt==2) changerequired=0.8;
6871 else if(dampattempt==3) changerequired=0.9;
6872 else changerequired=0.95;
6873 FTYPE errorneed=((
FTYPE)(numsub+2)*trueimptryconv);
6874 if(suberrorabsf1/erroraverage>changerequired && suberrorabsf1>errorneed){
6885 dualfprintf(
fail_file,
"Error is not decreasing sufficiently fast: iter=%d priorerrorscount=%d suberrorabsf1=%g\n",iter,priorerrorscount,suberrorabsf1);
6886 for(itererror=1;itererror<
MIN(priorerrorscount,
NUMPRIORERRORS);itererror++) dualfprintf(
fail_file,
"errorabspf1[%d]=%g\n",itererror,errorabspf1[itererror]);
6940 int failreturniJ=
get_implicit_iJ(allowbaseitermethodswitch, failreturnallowableuse, showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, baseitermethod, fracenergy, dissmeasure, impepsjac, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, iter, errorabsf1[0], errorabsf1[1],
WHICHERROR, dimtypef, dimfactU, Uiin, uu, uup, uu0, piin, pp, ppp, fracdtG, realdt, ptrgeom, q, f1, f1norm, iJ, nummhdinvsreturn,&mtd,&ru);
6942 if(failreturniJ!=0){
6957 if(showmessagesheavy){
6986 PLOOP(pliter,pl) uu[pl] = uup[pl];
6991 FTYPE diffuu=0.0,sumuu=0.0;
6993 diffuu += fabs(uu[pl]-uup[pl]);
6994 sumuu += fabs(uu[pl])+fabs(uup[pl]);
6997 convreturnf3limit=1;
7018 PLOOP(pliter,pl) pp[pl]=ppp[pl];
7027 FTYPE dpp[NPR]={0.0};
7028 PLOOP(pliter,pl) pp[pl]=ppp[pl];
7039 if(pp[ru.
irefU[ii]]<=0.0){
7042 PLOOP(pliter,pl) ppbad[pl]=pp[pl];
7044 PLOOP(pliter,pl) pp[pl]=ppp[pl];
7045 FTYPE REDAMP=fabs(+0.5*ppp[
UU]/dpp[
UU])*DAMPFACTOR;
7063 PLOOP(pliter,pl) pppreholdlist[debugiter][pl]=pp[pl];
7066 pppreholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
7067 pppreholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
7070 DLOOP(jj,kk) jaclist[debugiter][jj][kk]=iJ[ru.
irefU[jj]][ru.
erefU[kk]];
7073 fracdamplist[0]=fracdtuu0;
7074 fracdamplist[1]=fracdtG;
7075 fracdamplist[2]=DAMPFACTOR;
7096 if(pp[
RHO]<=0.0||pp[
UU]<=0.0){
7116 holdingaspositive=0;
7118 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"HOLDING: Detected unphysical iter=%d countholdpositive=%d : pp[ru.irefU[0]]=%g : ijknstepsteppart=%d %d %d %ld %d\n",iter,countholdpositive,pp[ru.
irefU[0]],ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7123 countholdpositive++;
7124 holdingaspositive=1;
7127 #define NUMITERHOLD (eomcond ? 2 : 4)
7128 if(holdingaspositive==0 || holdingaspositive==1 && iter<iterhold+NUMITERHOLD){
7129 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"HOLDING: Detected unphysical iter=%d iterhold+NUMITERHOLD=%d holdingaspositive=%d : pp[ru.irefU[0]]=%g : ijknstepsteppart=%d %d %d %ld %d\n",iter,iterhold+NUMITERHOLD,holdingaspositive,pp[ru.
irefU[0]],ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7130 if(holdingaspositive==0) iterhold=iter;
7132 holdingaspositive=1;
7145 pp[pl] = pppriorsteptype[pl];
7146 uu[pl] = uupriorsteptype[pl];
7154 pp[pl] = pppriorsteptype[pl];
7155 uu[pl] = uupriorsteptype[pl];
7163 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"Unable to hold off u_g<0, setting canbreak=1 and letting finalchecks confirm error is good or bad. iter=%d\n",iter);
7169 else if(havebackup){
7197 holdingaspositive=0;
7206 PLOOP(pliter,pl) ppposholdlist[debugiter][pl]=pp[pl];
7209 ppposholdlist[debugiter][
U1+jj-1]=q->
ucon[jj];
7210 ppposholdlist[debugiter][URAD1+jj-1]=q->
uradcon[jj];
7238 if(badenergy(ptrgeom,pp,pborig)) countbadenergy++;
7259 FTYPE diffpp=0.0,sumpp=0.0;
7261 diffpp += fabs(pp[pl]-ppp[pl]);
7262 sumpp += fabs(pp[pl])+fabs(ppp[pl]);
7265 convreturnf3limit=1;
7273 prod0dualfprintf(showmessagesheavy,
fail_file,
"POSTDX: pp: %g %g %g %g : ppp=%g %g %g %g\n",pp[ru.
irefU[0]],pp[ru.
irefU[1]],pp[ru.
irefU[2]],pp[ru.
irefU[3]],ppp[ru.
irefU[0]],ppp[ru.
irefU[1]],ppp[ru.
irefU[2]],ppp[ru.
irefU[3]]);
7305 #define NUMUGNEGENERGY (3)
7316 if(debugfail>=
DEBUGLEVELIMPSOLVER) dualfprintf(
fail_file,
"2Unable to hold off u_g<0, setting canbreak=1 and letting finalchecks confirm error is good or bad. iter=%d\n",iter);
7322 else if(havebackup){
7340 FTYPE f3[NPR]={0},f3norm[NPR]={0};
7369 FTYPE errorallabsf3;
7370 convreturnf3=f_error_check(showmessages, showmessagesheavy, iter, trueimptryconv, trueimptryconvabs, realdt, dimtypef3,eomtypelocal ,*radinvmod, itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,pp,piin,f3,f3norm,f3report,Uiin,uu0,uu,ptrgeom,&errorabsf3,&errorallabsf3,
WHICHERROR,&mtd,&ru);
7376 convreturnf3limit=0;
7387 if(convreturnf1 || convreturnf3limit || canbreak){
7390 if(convreturnf3limit && debugfail>=3){
7391 dualfprintf(
fail_file,
"f3limit good\n");
7394 if(convreturnf1) dualfprintf(
fail_file,
"f1 good: ijknstepsteppart=%d %d %d %ld %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7395 if(convreturnf3limit) dualfprintf(
fail_file,
"f3 good: ijknstepsteppart=%d %d %d %ld %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7396 if(canbreak) dualfprintf(
fail_file,
"canbreak=%d good: ijknstepsteppart=%d %d %d %ld %d\n",canbreak,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7436 fracuup=
MIN(1.0,fracuup);
7442 if(fracdtuu0<1.0 && changeotherdt){
7445 fracdtuu0=
MIN(1.0,fracdtuu0);
7447 PLOOP(pliter,pl) uu0[pl]=UFSET(CUf,fracdtuu0*dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
7449 FTYPE uuiterback[NPR];
7450 PLOOP(pliter,pl) uuiterback[pl] = uu[pl];
7451 PLOOP(pliter,pl) uu[pl] = uu0[pl];
7459 if(fracdtG<1.0 && changeotherdt){
7462 fracdtG=
MIN(1.0,fracdtG);
7469 *nummhdstepsreturn = (int)(
nstroke-nstrokeorig);
7470 if(iter>trueimpmaxiter || *nummhdstepsreturn>
MAXMHDSTEPS || notfinite ){
7494 PLOOP(pliter,pl) uu0[pl]=UFSET(CUf,fracdtuu0*dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
7496 if(!(pl>=
UU && pl<=
U3 ||
RADPL(pl) || pl==ENTROPY)){
7502 PLOOPBONLY(pl) bestpp[pl]=bestuu[pl]=pp[pl] = uu0[pl];
7531 if(failreturn==0 && earlylowerror==0){
7539 for(fakeiter=0;fakeiter<=0;fakeiter++){
7541 int convreturn=1,convreturnok=1,convreturnallow=1;
7559 failreturnf=
f_implicit(allowbaseitermethodswitch, iter,fakef1iter,failreturnallowableuse, whichcall,impepsjac,showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, baseitermethod, fracenergy, dissmeasure, radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, pp, pp, piin, uu, Uiin, uu0, uu, fracdtG*realdt, ptrgeom, q, f1, f1norm, f1report, &goexplicitfake, &errorabsf1[0], &errorabsf1[1],
WHICHERROR, &convreturn, nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
7563 convreturnallow=(errorabsf1[
WHICHERROR]<trueimpallowconvabs);
7564 convreturnok=(errorabsf1[
WHICHERROR]<trueimpokconvabs);
7565 if(debugfail>=
DEBUGLEVELIMPSOLVERMORE) dualfprintf(
fail_file,
"DOFINALCHECK: convreturn=%d convreturnok=%d convreturnallow=%d (IMPOKCONV=%g IMPALLOWCONV=%g) f1report: %g %g %g %g : %g %g\n",convreturn,convreturnok,convreturnallow,
IMPOKCONV,
IMPALLOWCONV,f1report[ru.
erefU[0]],f1report[ru.
erefU[1]],f1report[ru.
erefU[2]],f1report[ru.
erefU[3]],errorabsf1[0],errorabsf1[1]);
7580 convreturn=f_error_check(showmessages, showmessagesheavy, iter, trueimptryconv, trueimptryconvabs,realdt,dimtypef,eomtypelocal,*radinvmod,itermode,*baseitermethod,fracenergy,dissmeasure,dimfactU,pp,piin,f1,f1norm,f1report,Uiin,uu0,uu,ptrgeom,&errorabsf1[0],&errorabsf1[1],
WHICHERROR,&mtd,&ru);
7581 convreturnallow=(errorabsf1[
WHICHERROR]<trueimpallowconvabs);
7582 convreturnok=(errorabsf1[
WHICHERROR]<trueimpokconvabs);
7593 errorabsf1[1]=0.0;
JACLOOPSUPERFULL(pliter,pl,eomtypelocal,*baseitermethod,*radinvmod) errorabsf1[1] += fabs(f1report[pl]);
7595 errorabsbest[1]=0.0;
JACLOOPSUPERFULL(pliter,pl,eomtypelocal,*baseitermethod,*radinvmod) errorabsbest[1] += fabs(lowestf1report[pl]);
7599 if(showmessages && debugfail>=
DEBUGLEVELIMPSOLVERMORE) dualfprintf(
fail_file,
"Using best: %g %g : %g %g\n",errorabsf1[0],errorabsf1[1],errorabsbest[0],errorabsbest[1]);
7601 PLOOP(pliter,pl) uu[pl]=bestuu[pl];
7602 PLOOP(pliter,pl) pp[pl]=bestpp[pl];
7603 errorabsf1[0]=errorabsbest[0];
7604 errorabsf1[1]=errorabsbest[1];
7605 PLOOP(pliter,pl) f1[pl] = lowestf1[pl];
7606 PLOOP(pliter,pl) f1norm[pl] = lowestf1norm[pl];
7607 PLOOP(pliter,pl) f1report[pl] = lowestf1report[pl];
7608 *radinvmod = radinvmodbest;
7611 convreturn=(errorabsf1[
WHICHERROR]<trueimptryconvabs);
7612 convreturnallow=(errorabsf1[
WHICHERROR]<trueimpallowconvabs);
7613 convreturnok=(errorabsf1[
WHICHERROR]<trueimpokconvabs);
7614 if(debugfail>=
DEBUGLEVELIMPSOLVERMORE) dualfprintf(
fail_file,
"GETBEST: convreturn=%d convreturnok=%d convreturnallow=%d (IMPOKCONV=%g IMPALLOWCONV=%g) f1report: %g %g %g %g : %g %g\n",convreturn,convreturnok,convreturnallow,
IMPOKCONV,
IMPALLOWCONV,f1report[ru.
erefU[0]],f1report[ru.
erefU[1]],f1report[ru.
erefU[2]],f1report[ru.
erefU[3]],errorabsf1[0],errorabsf1[1]);
7617 if(debugfail>=
DEBUGLEVELIMPSOLVERMORE) dualfprintf(
fail_file,
"gotbest=%d but errorabsbest=%g %g while errorabsf1=%g %g\n",gotbest,errorabsbest[0],errorabsbest[1],errorabsf1[0],errorabsf1[1]);
7618 PLOOP(pliter,pl) bestuu[pl]=uu[pl];
7619 PLOOP(pliter,pl) bestpp[pl]=pp[pl];
7620 errorabsbest[0]=errorabsf1[0];
7621 errorabsbest[1]=errorabsf1[1];
7622 radinvmodbest = *radinvmod;
7623 failreturnbest = failreturn;
7647 if(convreturn || convreturnok){
7655 if(convreturnallow){
7660 if(iter>trueimpmaxiter){
7661 prod0dualfprintf(debugfail>=2,
fail_file,
"trueimpmaxiter=%d eomtype=%d MAXcheckconv=%d havebackup=%d failreturnallowable=%d: f1report=%g %g %g %g : f1=%g %g %g %g\n",trueimpmaxiter,eomtypelocal,checkconv,havebackup,failreturnallowable,f1report[ru.
erefU[0]],f1report[ru.
erefU[1]],f1report[ru.
erefU[2]],f1report[ru.
erefU[3]],f1[ru.
erefU[0]],f1[ru.
erefU[1]],f1[ru.
erefU[2]],f1[ru.
erefU[3]]);
7663 prod0dualfprintf(showmessages && debugfail>=2,
fail_file,
"iter>trueimpmaxiter=%d : iter exceeded in solve_implicit_lab(). But f1 was allowed error. checkconv=%d (if checkconv=0, could be issue!) : %g %g %g %g : %g %g %g %g : errorabs=%g %g : %g %g %g\n",trueimpmaxiter,checkconv,f1report[ru.
erefU[0]],f1report[ru.
erefU[1]],f1report[ru.
erefU[2]],f1report[ru.
erefU[3]],f1[ru.
erefU[0]],f1[ru.
erefU[1]],f1[ru.
erefU[2]],f1[ru.
erefU[3]],errorabsf1[0],errorabsf1[1],fracdtuu0,fracuup,fracdtG);
7671 mathfailtype=(eomtypelocal==
EOMGRMHD ? 6 : 600);
7687 if(canbreak==1 && havebackup==0) dualfprintf(
fail_file,
"Held u_g, couldn't hold anymore and broke, but error still larger than allowed : iter=%d ijknstepsteppart=%d %d %d %ld %d\n",iter,ptrgeom->i,ptrgeom->j,ptrgeom->k,
nstep,
steppart);
7688 if(canbreak==2 && havebackup==0) dualfprintf(
fail_file,
"Aborted due to oscillatory error despite not having backup: iter=%d\n",iter);
7689 if(canbreak==3 && havebackup==0) dualfprintf(
fail_file,
"Aborted due to error not decreasing fast enough: iter=%d errorabsf1=%g %g\n",iter,errorabsf1[0],errorabsf1[1]);
7690 if(canbreak==4 && havebackup==0) dualfprintf(
fail_file,
"Aborted due to error not decreasing fast enough: iter=%d errorabsf1=%g %g\n",iter,errorabsf1[0],errorabsf1[1]);
7691 if(canbreak==5 && havebackup==0) dualfprintf(
fail_file,
"Aborted due to error not decreasing fast enough: iter=%d errorabsf1=%g %g\n",iter,errorabsf1[0],errorabsf1[1]);
7692 if(iter>trueimpmaxiter && havebackup==0) dualfprintf(
fail_file,
"iter>trueimpmaxiter=%d : iter exceeded in solve_implicit_lab(). nstep=%ld steppart=%d ijk=%d %d %d : Bad error.\n",trueimpmaxiter,
nstep,
steppart,ptrgeom->i,ptrgeom->j,ptrgeom->k);
7693 if(notfinite && havebackup==0) dualfprintf(
fail_file,
"IMPGOTNAN at iter=%d : in solve_implicit_lab(). ijk=%d %d %d : Bad error.\n",iter,ptrgeom->i,ptrgeom->j,ptrgeom->k);
7694 if(havebackup==0) dualfprintf(
fail_file,
"checkconv=%d havebackup=%d failreturnallowable=%d: f1report=%g %g %g %g : f1=%g %g %g %g\n",checkconv,havebackup,failreturnallowable,f1report[ru.
erefU[0]],f1report[ru.
erefU[1]],f1report[ru.
erefU[2]],f1report[ru.
erefU[3]],f1[ru.
erefU[0]],f1[ru.
erefU[1]],f1[ru.
erefU[2]],f1[ru.
erefU[3]]);
7695 if(1||showmessages){
7725 failreturnbest=failreturn;
7726 radinvmodbest = *radinvmod;
7733 totaliters += (int)( (3.0/fndim)*(
FTYPE)momiters + (1.0/fndim)*(
FTYPE)energyiters + (fndim/fndim)*(
FTYPE)fulliters);
7736 if(dampattempt==truenumdampattempts && truenumdampattempts>1){
7737 prod0dualfprintf(debugfail>=2,
fail_file,
"Damping failed to avoid max iterations (but error might have dropped: %21.15g %21.15g): failreturn=%d dampattempt=%d eomtypelocal=%d eomtypelocal=%d ijk=%d %d %d\n",errorabsf1[0],errorabsf1[1],failreturn,dampattempt,eomtypelocal,eomtypelocal,ptrgeom->i,ptrgeom->j,ptrgeom->k);
7756 PLOOP(pliter,pl) uu[pl]=bestuu[pl];
7757 PLOOP(pliter,pl) pp[pl]=bestpp[pl];
7758 errorabsf1[0]=errorabsbest[0];
7759 errorabsf1[1]=errorabsbest[1];
7760 failreturn=failreturnbest;
7761 *radinvmod = radinvmodbest;
7780 FTYPE fakefracdtG=1.0;
7781 FTYPE f1fake[NPR],f1normfake[NPR],f1reportfake[NPR];
7783 errorabsf1fake[0]=errorabsf1[0];
7784 errorabsf1fake[1]=errorabsf1[1];
7785 int convreturnfake=1;
7786 FTYPE fakeimpepsjac=1
E-6;
7787 int fakefailreturnf=
f_implicit(allowbaseitermethodswitch, iter,fakef1iter,failreturnallowableuse, whichcall,fakeimpepsjac,showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, baseitermethod, fracenergy, dissmeasure, radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, pp, pp, piin, uu, Uiin, uu0, uu, fakefracdtG*realdt, ptrgeom, q, f1fake, f1normfake, f1reportfake, &goexplicitfake, &errorabsf1fake[0], &errorabsf1fake[1],
WHICHERROR, &convreturnfake, nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
7816 FTYPE uuentropy[NPR];
7818 uu[ENTROPY]=uuentropy[ENTROPY];
7833 FTYPE uuborrow[NPR];
7834 FTYPE ppborrow[NPR];
7836 struct of_state *qborrow=&qborrowdontuse;
7837 PLOOP(pliter,pl) uuborrow[pl] = uu[pl];
7838 PLOOP(pliter,pl) ppborrow[pl] = pp[pl];
7844 uuborrow[URAD0] = uu0[URAD0] - dugas;
7849 int goexplicitborrow;
7851 int borrowf1iter=-1;
7852 FTYPE borrowfracdtG=1.0;
7853 FTYPE f1borrow[NPR],f1normborrow[NPR],f1reportborrow[NPR];
7855 errorabsf1borrow[0]=errorabsf1[0];
7856 errorabsf1borrow[1]=errorabsf1[1];
7857 int convreturnborrow=1;
7858 FTYPE borrowimpepsjac=1
E-6;
7859 int radinvmodborrow=0;
7860 int borrowfailreturnf=
f_implicit(allowbaseitermethodswitch, iter,borrowf1iter,failreturnallowableuse, whichcall,borrowimpepsjac,showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, baseitermethod, fracenergy, dissmeasure, &radinvmodborrow, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, ppborrow, ppborrow, piin, uuborrow, Uiin, uu0, uuborrow, borrowfracdtG*realdt, ptrgeom, qborrow, f1borrow, f1normborrow, f1reportborrow, &goexplicitborrow, &errorabsf1borrow[0], &errorabsf1borrow[1],
WHICHERROR, &convreturnborrow, nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
7867 #define BORROWTOL (1E-1)
7878 uu[pl] = uuborrow[pl];
7879 pp[pl] = ppborrow[pl];
7881 errorabsf1[0]=errorabsf1borrow[0];
7882 errorabsf1[1]=errorabsf1borrow[1];
7883 #if(PRODUCTION==0&&0)
7890 uu[pl] = uuborrow[pl];
7893 #if(PRODUCTION==0&&0)
7911 DLOOPA(jj) uu[URAD0+jj] = uu0[URAD0+jj] - dugas[jj];
7915 DLOOPA(jj) durad[jj] = uu[URAD0+jj]-uu0[URAD0+jj];
7916 DLOOPA(jj) uu[
UU+jj] = uu0[
UU+jj] - durad[jj];
7925 DLOOPA(jj) uu[URAD0+jj] = uu0[URAD0+jj];
7926 if(ENTROPY>=0) uu[ENTROPY] = uu0[ENTROPY];
7933 if(ENTROPY>=0) uu[ENTROPY]=uu0[ENTROPY];
7950 PLOOP(pliter,pl) radsource[pl] = +(uu[pl]-uu0[pl])/realdt;
7973 PLOOP(pliter,pl) dUcomp[sc][pl] += radsource[pl];
7997 *eomtype=eomtypelocal;
8023 errorabsreturn[0]=errorabsf1[0];
8024 errorabsreturn[1]=errorabsf1[1];
8027 *itersreturn=totaliters;
8029 *nummhdstepsreturn = (int)(
nstroke-nstrokeorig);
8038 if(!
isfinite(uub[pl])) caughtnan++;
8041 if(!
isfinite(errorabsreturn[0])) caughtnan++;
8042 if(!
isfinite(errorabsreturn[1])) caughtnan++;
8047 dualfprintf(
fail_file,
"per mode implicit solver generated nan result and it wasn't caught\n");
8048 dualfprintf(
fail_file,
"per mode implicit solver: %d %d %d %d %d %d %d %d : %g %g %g : %d %d : %g %g : %d\n",allowbaseitermethodswitch, modprim, havebackup, didentropyalready, *eomtype, whichcap, itermode, *baseitermethod, trueimptryconv, trueimpokconv, trueimpallowconv, trueimpmaxiter, truenumdampattempts, fracenergy, dissmeasure, *radinvmod);
8049 PLOOPDYNAMICAL(pliter,pl) dualfprintf(
fail_file,
"0implicit solver: pl=%d Uiin=%21.15g dUother=%21.15g dU=%21.15g\n",pl,Uiin[pl],dUother[pl],dUcomp[
RADSOURCE][pl]);
8050 PLOOPDYNAMICAL(pliter,pl) dualfprintf(
fail_file,
"1implicit solver: pl=%d pb=%21.15g piin=%21.15g Ufin=%21.15g dU=%21.15g uub=%21.15g\n",pl,pb[pl],piin[pl],Ufin[pl],dUcomp[
RADSOURCE][pl],uub[pl]);
8055 errorabsreturn[0]=1.0;
8056 errorabsreturn[1]=1.0;
8078 PLOOP(pliter,pl) dualfprintf(
fail_file,
"ERRORCHECK: pl=%d f1=%21.15g f1norm=%21.15g f1report=%21.15g errorabsf1=%21.15g errorallabsf1=%21.15g\n",pl,f1[pl],f1norm[pl],f1report[pl],errorabsf1[0],errorabsf1[1]);
8093 failnum++; mathematica_report_check(*radinvmod, mathfailtype, failnum, gotfirstnofail, eomtypelocal, itermode, *baseitermethod, errorabsf1, errorabsbestexternal, iter, totaliters, realdt, ptrgeom, ppfirst,pp,pb,piin,prtestUiin,prtestUU0,uu0,uu,Uiin,Ufin, CUf, CUimp, q, dUother);
8095 int usedebugiter=debugiteratteempts[0];
8096 showdebuglist(usedebugiter,pppreholdlist,ppposholdlist,f1reportlist,f1list,errorabsf1list,errorallabsf1list,realiterlist,jaclist,fracdamplist,implicititerlist, implicitferrlist);
8100 dualfprintf(
fail_file,
"nummhdinvsreturn=%d nummhdstepsreturn=%d nstroke=%d\n",*nummhdinvsreturn,*nummhdstepsreturn,
nstroke);
8125 #define DEBUGMAXMODE 1
8128 static void showdebuglist(
int debugiter,
FTYPE (*pppreholdlist)[NPR],
FTYPE (*ppposholdlist)[NPR],
FTYPE (*f1reportlist)[NPR],
FTYPE (*f1list)[NPR],
FTYPE *errorabsf1list,
FTYPE *errorallabsf1list,
int *realiterlist,
FTYPE (*jaclist)[
JACNPR][
JACNPR],
FTYPE *fracdamplist,
int *implicititerlist,
int *implicitferrlist)
8134 if(
DEBUGMAXMODE==0) dualfprintf(
fail_file,
"%3s : %3s : %21s %21s %21s %21s %21s %21s %21s %21s %21s : %21s %21s %21s %21s %21s %21s %21s %21s %21s : %21s %21s %21s %21s : %21s %21s : %21s\n",
"li",
"ri",
"rho",
"ug",
"v1",
"v2",
"v3",
"Erf",
"vr1",
"vr2",
"vr3",
"rho",
"ug",
"v1",
"v2",
"v3",
"Erf",
"vr1",
"vr2",
"vr3",
"f1rep0",
"f1rep1",
"f1rep2",
"f1rep3",
"errorabs",
"errorallabs",
"umin");
8135 else if(
DEBUGMAXMODE==1) dualfprintf(
fail_file,
"%3s : %3s : %21s %21s %21s %21s %21s %21s %21s %21s %21s : %21s %21s : %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s : %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s %21s : %21s %21s : %21s : %21s %21s %21s %21s : %21s %21s %21s : %2d %2d\n",
"li",
"ri",
"rho",
"ug",
"v1",
"v2",
"v3",
"Erf",
"vr1",
"vr2",
"vr3",
"rho",
"ug",
"f0",
"f1",
"f2",
"f3",
"f4",
"f5",
"f6",
"f7",
"f8",
"f9",
"f10",
"f11",
"frep0",
"frep1",
"frep2",
"frep3",
"frep4",
"frep5",
"frep6",
"frep7",
"frep8",
"frep9",
"frep10",
"frep11",
"errorabs",
"errorallabs",
"umin",
"jac00",
"jac11",
"jac22",
"jac33",
"fracdtuu0",
"fracdtG",
"DAMPFACTOR",
"it",
"fe");
8137 for(listiter=0;listiter<=debugiter;listiter++){
8142 ,
"%3d : %3d : %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g : %21.15g\n"
8143 ,listiter,realiterlist[listiter]
8144 ,pppreholdlist[listiter][RHO],pppreholdlist[listiter][
UU],pppreholdlist[listiter][
U1],pppreholdlist[listiter][
U2],pppreholdlist[listiter][
U3],pppreholdlist[listiter][PRAD0],pppreholdlist[listiter][PRAD1],pppreholdlist[listiter][PRAD2],pppreholdlist[listiter][PRAD3]
8145 ,ppposholdlist[listiter][RHO],ppposholdlist[listiter][UU],ppposholdlist[listiter][U1],ppposholdlist[listiter][U2],ppposholdlist[listiter][U3],ppposholdlist[listiter][PRAD0],ppposholdlist[listiter][PRAD1],ppposholdlist[listiter][PRAD2],ppposholdlist[listiter][PRAD3]
8146 ,f1reportlist[listiter][0],f1reportlist[listiter][1],f1reportlist[listiter][2],f1reportlist[listiter][3]
8147 ,errorabsf1list[listiter]
8148 ,errorallabsf1list[listiter]
8155 ,
"%3d : %3d : %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g : %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g : %21.15g : %21.15g %21.15g %21.15g %21.15g : %21.15g %21.15g %21.15g : %d %d\n"
8156 ,listiter,realiterlist[listiter]
8157 ,pppreholdlist[listiter][RHO],pppreholdlist[listiter][
UU],pppreholdlist[listiter][
U1],pppreholdlist[listiter][
U2],pppreholdlist[listiter][
U3],pppreholdlist[listiter][PRAD0],pppreholdlist[listiter][PRAD1],pppreholdlist[listiter][PRAD2],pppreholdlist[listiter][PRAD3]
8158 ,ppposholdlist[listiter][RHO],ppposholdlist[listiter][UU]
8159 ,f1list[listiter][0],f1list[listiter][1],f1list[listiter][2],f1list[listiter][3],f1list[listiter][4],f1list[listiter][5],f1list[listiter][6],f1list[listiter][7],f1list[listiter][8],f1list[listiter][9],f1list[listiter][10],f1list[listiter][11]
8160 ,f1reportlist[listiter][0],f1reportlist[listiter][1],f1reportlist[listiter][2],f1reportlist[listiter][3],f1reportlist[listiter][4],f1reportlist[listiter][5],f1reportlist[listiter][6],f1reportlist[listiter][7],f1reportlist[listiter][8],f1reportlist[listiter][9],f1reportlist[listiter][10],f1reportlist[listiter][11]
8161 ,errorabsf1list[listiter]
8162 ,errorallabsf1list[listiter]
8164 ,jaclist[listiter][0][0]
8165 ,jaclist[listiter][1][1]
8166 ,jaclist[listiter][2][2]
8167 ,jaclist[listiter][3][3]
8171 ,implicititerlist[listiter], implicitferrlist[listiter]
8184 int get_rameshsolution_wrapper(
int whichcall,
int eomtype,
FTYPE *errorabs,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *piin,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
struct of_state *q,
FTYPE *ppeng,
FTYPE *ppent,
FTYPE *uueng,
FTYPE *uuent,
FTYPE (*dUcompeng)[NPR],
FTYPE (*dUcompent)[NPR],
struct of_state *qeng,
struct of_state *qent,
int *failtypeeng,
FTYPE *errorabseng,
int *iterseng,
int *radinvmodeng,
int *failtypeent,
FTYPE *errorabsent,
int *itersent,
int *radinvmodent)
8188 int failreturnentropy=0;
8190 int failnum=0,gotfirstnofail=0;
8193 FTYPE errorabsbestexternal[2];
8194 set_array(errorabsbestexternal,2,MPI_FTYPE,
BIG);
8200 FTYPE fracdtuu0=1.0;
8203 PLOOP(pliter,pl) uu0[pl]=UFSET(CUf,fracdtuu0*
dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
8207 get_rameshsolution(whichcall, radinvmod, failreturnentropy, failnum, gotfirstnofail, eomtype, itermode, baseitermethod, errorabs, errorabs, iters, iters, realdt, ptrgeom, pp, pp, piin, uu0, uu, Uiin, Ufin, CUf, CUimp, q, ppeng, ppent, uueng, uuent, qeng, qent, failtypeeng, errorabseng, iterseng, radinvmodeng, failtypeent, errorabsent, itersent, radinvmodent);
8211 PLOOP(pliter,pl) pp[pl]=ppeng[pl];
8215 PLOOP(pliter,pl) pp[pl]=ppent[pl];
8222 dUcompeng[sc][pl] = + (uueng[pl]-uu0[pl])/realdt;
8223 dUcompent[sc][pl] = + (uuent[pl]-uu0[pl])/realdt;
8231 if(1||!
isfinite(dUcompeng[sc][pl])) dualfprintf(
fail_file,
"POOPENG %g %g %g\n",uueng[pl],uu0[pl],realdt);
8232 if(1||!
isfinite(dUcompent[sc][pl])) dualfprintf(
fail_file,
"POOPENT %g %g %g\n",uuent[pl],uu0[pl],realdt);
8241 #define WHICHVELRAMESH VELREL4 // should be same as WHICHVEL in test.f
8243 int get_rameshsolution(
int whichcallramesh,
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
int baseitermethod,
FTYPE *errorabs,
FTYPE *errorabsbestexternal,
int iters,
int totaliters,
FTYPE realdt,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *pb,
FTYPE *piin,
FTYPE *uu0,
FTYPE *uu,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_state *q,
FTYPE *ppeng,
FTYPE *ppent,
FTYPE *uueng,
FTYPE *uuent,
struct of_state *qeng,
struct of_state *qent,
int *failtypeeng,
FTYPE *errorabseng,
int *iterseng,
int *radinvmodeng,
int *failtypeent,
FTYPE *errorabsent,
int *itersent,
int *radinvmodent)
8254 FTYPE *ppfirst=pp,*prtestUiin=piin,*prtestUU0=piin;
8265 #define NUMRESULTS 15
8274 errorabseng[0] = errorabseng[1] =
BIG;
8278 errorabsent[0] = errorabsent[1] =
BIG;
8280 for(pl=0;pl<
NUMRESULTS;pl++) resultseng[pl]=resultsent[pl]=-1.0;
8281 PLOOP(pliter,pl) ppeng[pl]=ppent[pl]=-1.0;
8294 #define NUMARGS (211+11)
8311 na++; args[na]=errorabsbestexternal[
WHICHERROR];
8314 na++; args[na]=realdt;
8325 na++; args[na]=calc_kappaes_user(1.0,1.0,0,0,0);
8326 na++; args[na]=calc_kappa_user(1.0,1.0,1.0,1.0,1.0,0,0,0);
8328 DLOOP(jj,kk){ na++; args[na]=ptrgeom->gcon[
GIND(jj,kk)];}
8329 DLOOP(jj,kk){ na++; args[na]=ptrgeom->gcov[
GIND(jj,kk)];}
8330 PLOOP(pliter,pl){ na++; args[na]=pp[pl]; na++; args[na]=ppfirst[pl]; na++; args[na]=pb[pl]; na++; args[na]=piin[pl]; na++; args[na]=prtestUiin[pl]; na++; args[na]=prtestUU0[pl]; na++; args[na]=uu0[pl]; na++; args[na]=uu[pl]; na++; args[na]=Uiin[pl]; }
8332 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8334 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8337 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8339 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8342 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8344 else DLOOPA(jj){ na++; args[na]=0.0; na++; args[na]=0.0; }
8347 dualfprintf(
fail_file,
"Wrong number of args=%d\n",na);
8352 rameshsolver_(args,resultseng,resultsent);
8356 *failtypeeng = (int)resultseng[11];
8357 if(*failtypeeng==0){
8361 ppeng[
RHO] = resultseng[0];
8362 ppeng[
UU] = ppeng[ENTROPY] = resultseng[1];
8364 uconeng[0] = resultseng[2];
8365 uconeng[1] = resultseng[3];
8366 uconeng[2] = resultseng[4];
8367 uconeng[3] = resultseng[5];
8371 SLOOPA(jj) ppeng[
UU+jj] = resultseng[2+jj];
8373 ppeng[URAD0] = resultseng[6];
8375 uradconeng[0] = resultseng[7];
8376 uradconeng[1] = resultseng[8];
8377 uradconeng[2] = resultseng[9];
8378 uradconeng[3] = resultseng[10];
8379 uconrel(uradconeng,&ppeng[URAD0],ptrgeom);
8382 SLOOPA(jj) ppeng[URAD0+jj] = resultseng[7+jj];
8392 errorabseng[0] = resultseng[12];
8393 *iterseng = (int)resultseng[13];
8394 *radinvmodeng = (int)resultseng[14];
8397 if(*failtypeeng) errorabseng[0] =
BIG;
8400 *failtypeent = (int)resultsent[11];
8401 if(*failtypeent==0){
8404 ppent[
RHO] = resultsent[0];
8405 ppent[
UU] = ppent[ENTROPY] = resultsent[1];
8407 uconent[0] = resultsent[2];
8408 uconent[1] = resultsent[3];
8409 uconent[2] = resultsent[4];
8410 uconent[3] = resultsent[5];
8414 SLOOPA(jj) ppent[
UU+jj] = resultsent[2+jj];
8416 ppent[URAD0] = resultsent[6];
8418 uradconent[0] = resultsent[7];
8419 uradconent[1] = resultsent[8];
8420 uradconent[2] = resultsent[9];
8421 uradconent[3] = resultsent[10];
8422 uconrel(uradconent,&ppent[URAD0],ptrgeom);
8425 SLOOPA(jj) ppent[URAD0+jj] = resultsent[7+jj];
8435 errorabsent[0] = resultsent[12];
8436 *itersent = (int)resultsent[13];
8437 *radinvmodent = (int)resultsent[14];
8440 if(*failtypeent) errorabsent[0] =
BIG;
8451 int allowbaseitermethodswitch=0;
8454 int failreturnallowableuse=0;
8458 int showmessagesheavy=0;
8459 int allowlocalfailurefixandnoreport=0;
8464 FTYPE fracenergy=1.0;
8465 FTYPE dissmeasure=-1.0;
8466 radinvmod=*radinvmodeng;
8475 FTYPE dimfactU[NPR];
8476 PLOOP(pliter,pl) dimfactU[pl]=1.0;
8477 DLOOPA(jjdim) dimfactU[
UU+jjdim]=dimfactU[URAD0+jjdim]=sqrt(fabs(ptrgeom->gcon[
GIND(jjdim,jjdim)]));
8478 SLOOPA(jjdim) dimfactU[
B1+jjdim-1] = 1.0/dimfactU[
U1+jjdim-1];
8491 FTYPE f1report[NPR];
8496 FTYPE tautotmaxreturn;
8499 int nummhdinvsreturn=0;
8502 if(*failtypeeng==0){
8509 ppppp[pl] = pp[pl] = ppeng[pl];
8510 uuppp[pl] = uu[pl] = uueng[pl];
8514 failreturnferr=
f_implicit(allowbaseitermethodswitch, fakeiter, fakef1iter, failreturnallowableuse, whichcall, impepsjac, showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, &baseitermethod, fracenergy, dissmeasure, &radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, ppppp, pp, piin, uuppp, Uiin, uu0, uu, fracdtG*realdt, ptrgeom, q, f1, f1norm, f1report, &goexplicit, &errorabsf1[0], &errorabsf1[1],
WHICHERROR, &convreturnf1, &nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
8517 *failtypeeng=failreturnferr;
8518 errorabseng[0]=errorabsf1[0];
8519 errorabseng[1]=errorabsf1[1];
8520 *radinvmodeng=radinvmod;
8523 if(*failtypeent==0){
8530 ppppp[pl] = pp[pl] = ppent[pl];
8531 uuppp[pl] = uu[pl] = uuent[pl];
8534 failreturnferr=
f_implicit(allowbaseitermethodswitch, fakeiter, fakef1iter, failreturnallowableuse, whichcall, impepsjac, showmessages, showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocal, whichcap, itermode, &baseitermethod, fracenergy, dissmeasure, &radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, ppppp, pp, piin, uuppp, Uiin, uu0, uu, fracdtG*realdt, ptrgeom, q, f1, f1norm, f1report, &goexplicit, &errorabsf1[0], &errorabsf1[1],
WHICHERROR, &convreturnf1, &nummhdinvsreturn, &tautotmaxreturn, &mtd, &ru);
8537 *failtypeent=failreturnferr;
8538 errorabsent[0]=errorabsf1[0];
8539 errorabsent[1]=errorabsf1[1];
8540 *radinvmodent=radinvmod;
8547 if(debugfail>=2 && whichcallramesh>0 && (*failtypeent==0 || *failtypeeng==0)){
8552 resultsjon[0] = pp[
RHO];
8553 resultsjon[1] = pp[
UU];
8555 resultsjon[2] = q->
ucon[0];
8556 resultsjon[3] = q->
ucon[1];
8557 resultsjon[4] = q->
ucon[2];
8558 resultsjon[5] = q->
ucon[3];
8561 resultsjon[2] = 0.0;
8562 SLOOPA(jj) resultsjon[2+jj] = pp[
UU+jj];
8564 resultsjon[6] = pp[URAD0];
8566 resultsjon[7] = q->
uradcon[0];
8567 resultsjon[8] = q->
uradcon[1];
8568 resultsjon[9] = q->
uradcon[2];
8569 resultsjon[10] = q->
uradcon[3];
8573 SLOOPA(jj) resultsjon[7+jj] = pp[URAD0+jj];
8575 resultsjon[11] = (
FTYPE)failtype;
8577 resultsjon[13] = (
FTYPE)iters;
8578 resultsjon[14] = radinvmod;
8580 for(pl=0;pl<
NUMRESULTS;pl++) dualfprintf(
fail_file,
"RAMESH1: pl=%d | resultsjon=%21.15g | resultseng=%21.15g resultsent=%21.15g\n",pl,resultsjon[pl],resultseng[pl],resultsent[pl]);
8581 SLOOPA(jj) dualfprintf(
fail_file,
"RAMESH2: jj=%d utildegasjon=%21.15g utildegaseng=%21.15g utildegasent=%21.15g\n",jj,pp[
U1+jj-1],ppeng[
U1+jj-1],ppent[
U1+jj-1]);
8582 SLOOPA(jj) dualfprintf(
fail_file,
"RAMESH3: jj=%d utilderadjon=%21.15g utilderadeng=%21.15g utilderadent=%21.15g\n",jj,pp[URAD1+jj-1],ppeng[URAD1+jj-1],ppent[URAD1+jj-1]);
8583 PLOOP(pliter,pl) dualfprintf(
fail_file,
"RAMESH3.5: pl=%d ppeng=%21.15g uueng=%21.15g ppent=%21.15g uuent=%21.15g\n",pl,ppeng[pl],uueng[pl],ppent[pl],ppeng[pl]);
8589 dualfprintf(
fail_file,
"RAMESH4: E_r=%21.15g Utildesq=%21.15g Utildecon0=%21.15g Utildecon1=%21.15g Utildecon2=%21.15g Utildecon3=%21.15g\n",Er,Utildesq,Utildecon[0],Utildecon[1],Utildecon[2],Utildecon[3]);
8591 if(*failtypeeng==0){
8593 dualfprintf(
fail_file,
"RAMESH5: E_r=%21.15g Utildesq=%21.15g Utildecon0=%21.15g Utildecon1=%21.15g Utildecon2=%21.15g Utildecon3=%21.15g\n",Er,Utildesq,Utildecon[0],Utildecon[1],Utildecon[2],Utildecon[3]);
8596 if(*failtypeent==0){
8598 dualfprintf(
fail_file,
"RAMESH6: E_r=%21.15g Utildesq=%21.15g Utildecon0=%21.15g Utildecon1=%21.15g Utildecon2=%21.15g Utildecon3=%21.15g\n",Er,Utildesq,Utildecon[0],Utildecon[1],Utildecon[2],Utildecon[3]);
8608 int mathematica_report_check(
int radinvmod,
int failtype,
long long int failnum,
int gotfirstnofail,
int eomtypelocal,
int itermode,
int baseitermethod,
FTYPE *errorabs,
FTYPE *errorabsbestexternal,
int iters,
int totaliters,
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,
FTYPE *CUimp,
struct of_state *q,
FTYPE *dUother)
8615 dualfprintf(
fail_file,
"FAILINFO: %d %d %lld %d\ndt=%21.15g\n",failtype, myid, failnum, gotfirstnofail,realdt);
8617 DLOOP(jj,kk) dualfprintf(fail_file,"gv%d%d=%21.15g\n",jj+1,kk+1,ptrgeom->
gcov[
GIND(jj,kk)]);
8619 PLOOP(pliter,pl) dualfprintf(fail_file,"pp%d=%21.15g\npb%d=%21.15g\nuu0%d=%21.15g\nuu%d=%21.15g\nuui%d=%21.15g\n",pl,pp[pl],pl,pb[pl],pl,uu0[pl],pl,uu[pl],pl,Uiin[pl]);
8622 if(
EOMRADTYPE!=
EOMRADNONE)
DLOOPA(jj) dualfprintf(fail_file,"uradcon%d=%21.15g\nuradcov%d=%21.15g\n",jj,qreport.uradcon[jj],jj,qreport.uradcov[jj]);
8623 else
DLOOPA(jj) dualfprintf(fail_file,"uradcon%d=%21.15g\nuradcov%d=%21.15g\n",jj,0.0,jj,0.0);
8624 DLOOPA(jj) dualfprintf(fail_file,"ucon%d=%21.15g\nucov%d=%21.15g\n",jj,qreport.ucon[jj],jj,qreport.ucov[jj]);
8641 if(!
isfinite(errorabsbestexternal[0])) errorabsbestexternal[0]=
BIG;
8642 if(!
isfinite(errorabsbestexternal[1])) errorabsbestexternal[1]=
BIG;
8665 dualfprintf(fail_file,
"\nFAILINFO: ");
8666 dualfprintf(fail_file,
"%d %d %d ",NUMARGS,NUMRESULTS,
WHICHVELRAMESH);
8667 dualfprintf(fail_file,
"%d %d %lld %d %d %d %21.15g %21.15g %d %d %21.15g %lld %d %21.15g ",failtype,myid,failnum,gotfirstnofail,eomtypelocal,itermode,errorabs[
WHICHERROR],errorabsbestexternal[WHICHERROR],iters,totaliters,realdt,
nstep,
steppart,
gam);
8670 dualfprintf(fail_file,
"%21.15g %21.15g %21.15g %21.15g ",
ARAD_CODE,calc_kappaes_user(1.0,1.0,0,0,0),calc_kappa_user(1.0,1.0,1.0,1.0,1.0,0,0,0),0.0);
8671 DLOOP(jj,kk) dualfprintf(fail_file,"%21.15g ",ptrgeom->
gcon[
GIND(jj,kk)]);
8672 DLOOP(jj,kk) dualfprintf(fail_file,"%21.15g ",ptrgeom->
gcov[
GIND(jj,kk)]);
8673 PLOOP(pliter,pl) dualfprintf(fail_file,"%21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g ",pp[pl],ppfirst[pl],pb[pl],piin[pl],prtestUiin[pl],prtestUU0[pl],uu0[pl],uu[pl],Uiin[pl]);
8675 else
DLOOPA(jj) dualfprintf(fail_file,"%21.15g %21.15g ",0.0,0.0);
8676 DLOOPA(jj) dualfprintf(fail_file,"%21.15g %21.15g ",qpp.
ucon[jj],qpp.
ucov[jj]);
8678 else dualfprintf(fail_file,"%21.15g %21.15g ",0.0,0.0);
8679 DLOOPA(jj) dualfprintf(fail_file,"%21.15g %21.15g ",qpb.
ucon[jj],qpb.
ucov[jj]);
8681 else dualfprintf(fail_file,"%21.15g %21.15g ",0.0,0.0);
8682 DLOOPA(jj) dualfprintf(fail_file,"%21.15g %21.15g ",qpiin.
ucon[jj],qpiin.
ucov[jj]);
8683 dualfprintf(fail_file,"\n");
8693 FTYPE uueng[NPR]={0},uuent[NPR]={0};
8707 dualfprintf(fail_file,
"\nFAILREPEATABLE: %d %d %lld : ",failtype,myid,failnum);
8708 dualfprintf(fail_file,
"dt=%21.15g;CUf[2]=%21.15g;gam=%21.15g;",realdt,CUf[2],
gam);
8709 PLOOP(pliter,pl) dualfprintf(fail_file,"pp[%d]=%21.15g;ppfirst[%d]=%21.15g;pb[%d]=%21.15g;piin[%d]=%21.15g;Uiin[%d]=%21.15g;Ufin[%d]=%21.15g;dUother[%d]=%21.15g;",pl,pp[pl],pl,ppfirst[pl],pl,pb[pl],pl,piin[pl],pl,Uiin[pl],pl,Ufin[pl],pl,dUother[pl]);
8711 DLOOP(jj,kk) dualfprintf(fail_file,"ptrgeom->
gcov[
GIND(%d,%d)]=%21.15g;ptrgeom->
gcon[
GIND(%d,%d)]=%21.15g;",jj,kk,ptrgeom->
gcov[
GIND(jj,kk)],jj,kk,ptrgeom->
gcon[
GIND(jj,kk)]);
8712 DLOOPA(jj) dualfprintf(fail_file,"ptrgeom->gcovpert[%d]=%21.15g;ptrgeom->
beta[%d]=%21.15g;",jj,ptrgeom->gcovpert[jj],jj,ptrgeom->
beta[jj]);
8713 dualfprintf(fail_file,"ptrgeom->alphalapse=%21.15g;ptrgeom->betasqoalphasq=%21.15g;ptrgeom->
gdet=%21.15g;ptrgeom->igdetnosing=%21.15g;ptrgeom->
i=%d;ptrgeom->
j=%d;ptrgeom->k=%d;ptrgeom->
p=%d;",ptrgeom->alphalapse,ptrgeom->betasqoalphasq,ptrgeom->
gdet,ptrgeom->igdetnosing,ptrgeom->
i,ptrgeom->
j,ptrgeom->k,ptrgeom->
p);
8715 DLOOPA(jj) dualfprintf(fail_file,"q->
ucon[%d]=%21.15g;q->
ucov[%d]=%21.15g;",jj,q->
ucon[jj],jj,q->
ucov[jj]);
8717 else
DLOOPA(jj) dualfprintf(fail_file,"q->
uradcon[%d]=%21.15g;q->
uradcov[%d]=%21.15g;",jj,0.0,jj,0.0);
8720 dualfprintf(fail_file,"\n");
8763 static
int f_error_check(
int showmessages,
int showmessagesheavy,
int iter,
FTYPE conv,
FTYPE convabs,
FTYPE realdt,
int dimtypef,
int eomtype,
int radinvmod,
int itermode,
int baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
FTYPE *dimfactU,
FTYPE *pp,
FTYPE *piin,
FTYPE *fin,
FTYPE *finnorm,
FTYPE *finreport,
FTYPE *Uiin,
FTYPE *uu0,
FTYPE *uu, struct
of_geom *ptrgeom,
FTYPE *errorabs,
FTYPE *errorallabs,
int whicherror,struct
of_method *mtd, struct
of_refU *ru)
8770 passedconv[0]=passedconv[1]=0;
8774 FTYPE dimfactferr[NPR];
8775 PLOOP(pliter,pl) dimfactferr[pl]=dimfactU[pl];
8778 DLOOPA(ii) dimfactferr[ru->erefU[ii]]=dimfactU[ru->erefU[ii]];
8779 DLOOPA(ii) dimfactferr[ru->eotherU[ii]]=dimfactU[ru->eotherU[ii]];
8783 DLOOPA(ii) dimfactferr[ru->erefU[ii]]=1.0/dimfactU[ru->erefU[ii]];
8784 DLOOPA(ii) dimfactferr[ru->eotherU[ii]]=1.0/dimfactU[ru->eotherU[ii]];
8788 FTYPE finnormnew[NPR];
8792 FTYPE fnormtime = fabs(finnorm[ru->erefU[ii]]*dimfactferr[ru->erefU[ii]]);
8793 FTYPE fnormtimeother = fabs(finnorm[ru->eotherU[ii]]*dimfactferr[ru->eotherU[ii]]);
8796 FTYPE fnormspace=0.0;
SLOOPA(ii) fnormspace += fabs(finnorm[ru->erefU[ii]]*dimfactferr[ru->erefU[ii]]);
8797 FTYPE fnormspaceother=0.0;
SLOOPA(ii) fnormspaceother += fabs(finnorm[ru->eotherU[ii]]*dimfactferr[ru->eotherU[ii]]);
8804 FTYPE fnormspace2 = rhoref*
prpow(fabs(fnormtime)/rhoref,0.5);
8805 FTYPE fnormtime2=rhoref*
prpow(fabs(fnormspace/rhoref),2.0);
8808 FTYPE fnormspace2 = fabs(fnormtime)*fakevel;
8810 FTYPE fnormtime2 = fnormtime;
8815 FTYPE fnormspace2 = fnormtime;
8816 FTYPE fnormtime2 = fnormtime;
8817 FTYPE fnormspaceother2 = fnormtimeother;
8818 FTYPE fnormtimeother2 = fnormtimeother;
8824 if(pl==YFL1) finnorm[pl] = fabs(finnorm[pl]) + fabs(finnorm[
RHO]);
8825 if(pl==YFL2) finnorm[pl] = fabs(finnorm[pl]) + fabs(finnorm[UU]);
8826 if(pl==YFL3) finnorm[pl] = fabs(finnorm[pl]) + fabs(finnorm[
U3]);
8827 if(pl==YFL4) finnorm[pl] = fabs(finnorm[pl]) + fabs(finnorm[URAD0]);
8828 if(pl==YFL5) finnorm[pl] = fabs(finnorm[pl]) + fabs(finnorm[URAD3]);
8832 PLOOP(pliter,pl) finnormnew[pl] = finnorm[pl];
8833 ii=TT; finnormnew[ru->erefU[ii]] = fnormtime + fnormtime2;
8834 SLOOPA(ii) finnormnew[ru->erefU[ii]] = fnormspace + fnormspace2;
8835 ii=TT; finnormnew[ru->eotherU[ii]] = fnormtimeother + fnormtimeother2;
8836 SLOOPA(ii) finnormnew[ru->eotherU[ii]] = fnormspaceother + fnormspaceother2;
8841 PLOOP(pliter,pl) finnew[pl]=fin[pl]*dimfactferr[pl];
8850 JACLOOPFULLERROR(itermode,jj,ru->startjac,ru->endjac) *errorabs += fabs(finreport[ru->erefU[jj]]);
8853 *errorallabs=0.0;
JACLOOPSUPERFULL(pliter,pl,eomtype,baseitermethod,radinvmod) *errorallabs += fabs(finreport[pl]);
8860 passedconv[0]=(*errorabs<convabs);
8861 passedconv[1]=(*errorallabs<convabs);
8867 if(passedconv[whicherror]){
8868 prod0dualfprintf(showmessagesheavy,fail_file,
"nstep=%ld steppart=%d dt=%g realdt=%g i=%d iter=%d DONE1 for conv=%g : finreport=%g %g %g %g\n",
nstep,
steppart,dt,realdt,ptrgeom->i,iter,conv,finreport[ru->erefU[0]],finreport[ru->erefU[1]],finreport[ru->erefU[2]],finreport[ru->erefU[3]]);
8874 prod0dualfprintf(showmessagesheavy,fail_file,
"POSTFIN (conv=%21.15g): uu: %21.15g %21.15g %21.15g %21.15g : uu0=%21.15g %21.15g %21.15g %21.15g\n",conv,uu[ru->irefU[0]],uu[ru->irefU[1]],uu[ru->irefU[2]],uu[ru->irefU[3]],uu0[ru->irefU[0]],uu0[ru->irefU[1]],uu0[ru->irefU[2]],uu0[ru->irefU[3]]);
8875 PLOOP(pliter,pl)
prod0dualfprintf(showmessagesheavy,fail_file,"pl=%d fin=%21.15g finnorm=%21.15g\n",pl,fin[pl],finnorm[pl]);
8876 prod0dualfprintf(showmessagesheavy,fail_file,"
nstep=%ld
steppart=%d dt=%g i=%d iter=%d : %g %g %g %g\n",
nstep,
steppart,dt,ptrgeom->i,iter,finreport[ru->erefU[0]],finreport[ru->erefU[1]],finreport[ru->erefU[2]],finreport[ru->erefU[3]]);
8885 #define JDIFFONESIDED 0
8886 #define JDIFFCENTERED 1
8892 static int get_implicit_iJ(
int allowbaseitermethodswitch,
int failreturnallowableuse,
int showmessages,
int showmessagesheavy,
int allowlocalfailurefixandnoreport,
int *eomtypelocal,
int whichcap,
int itermode,
int *baseitermethod,
FTYPE fracenergy,
FTYPE dissmeasure,
FTYPE impepsjac,
FTYPE trueimptryconv,
FTYPE trueimptryconvabs,
FTYPE trueimpallowconvabs,
int trueimpmaxiter,
int iter,
FTYPE errorabs,
FTYPE errorallabs,
int whicherror,
int dimtypef,
FTYPE *dimfactU,
FTYPE *Uiin,
FTYPE *uu,
FTYPE *uup,
FTYPE *uu0,
FTYPE *piin,
FTYPE *pp,
FTYPE *ppp,
FTYPE fracdtG,
FTYPE realdt,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE *f1,
FTYPE *f1norm,
FTYPE (*iJ)[NPR],
int *nummhdinvsreturn,
struct of_method *mtd,
struct of_refU *ru)
8897 int eomtypelocallocal=*eomtypelocal;
8919 FTYPE uujac[NPR],ppjac[NPR];
8920 FTYPE uujacalt[NPR],ppjacalt[NPR];
8931 FTYPE upitoup0[NPR], upitoup0U[NPR], upitoup0P[NPR];
8932 FTYPE x[NPR],xp[NPR],xjac[2][NPR],xjacalt[NPR];
8943 PLOOP(pliter,pl) upitoup0U[pl] = dimfactU[pl]*ptrgeom->alphalapse ;
8946 PLOOP(pliter,pl) upitoup0P[pl] = 1.0;
8948 SLOOPA(jj) upitoup0P[UU+jj] =upitoup0P[URAD0+jj] = 1.0/dimfactU[UU+jj];
8956 FTYPE uucopy[NPR],ppcopy[NPR];
8962 #define MAXSIGN(x,y) (fabs(x)>fabs(y) ? (x) : (y))
8963 #define MINSIGN(x,y) (fabs(x)<fabs(y) ? (x) : (y))
8990 PLOOP(pliter,pl) x[pl]=uucopy[pl];
8991 PLOOP(pliter,pl) xp[pl]=uup[pl];
8992 PLOOP(pliter,pl) xjac[0][pl]=xjac[1][pl]=xjacalt[pl]=uucopy[pl];
8993 PLOOP(pliter,pl) upitoup0[pl] = upitoup0U[pl];
8996 velmomscale=
prpow(fabs(x[ru->
irefU[TT]]*upitoup0[ru->
irefU[TT]]),1.0);
9000 PLOOP(pliter,pl) x[pl]=ppcopy[pl];
9001 PLOOP(pliter,pl) xp[pl]=ppp[pl];
9002 PLOOP(pliter,pl) xjac[0][pl]=xjac[1][pl]=xjacalt[pl]=ppcopy[pl];
9003 PLOOP(pliter,pl) upitoup0[pl] = upitoup0P[pl];
9007 else velmomscale=1.0;
9010 velmomscale=
MIN(1.0,velmomscale);
9025 predel[jj] = fabs(x[ru->
irefU[jj]]*upitoup0[ru->
irefU[jj]]);
9030 predel[jj] =
MAX(predel[jj],fabs(uup[ru->
irefU[jj]]*upitoup0U[ru->
irefU[jj]]));
9031 predel[jj] =
MAX(predel[jj],fabs(uu0[ru->
irefU[jj]]*upitoup0U[ru->
irefU[jj]]));
9042 vsqnorm += fabs(x[ru->
irefU[jj]]*upitoup0[ru->
irefU[jj]])*fabs(x[ru->
irefU[jj]]*upitoup0[ru->
irefU[jj]]);
9046 vsqnorm=
MIN(1.0,vsqnorm);
9056 delspace=0.0;
SLOOPA(jj) delspace =
MAX(delspace,
MAX(fabs(predel[jj]) , velmomscale ));
9061 jj=
TT; deltime =
MAX(fabs(predel[jj]),
MAX(ppp[
RHO],ppcopy[RHO])*vsqnorm);
9065 jj=
TT; deltime = fabs(predel[jj]);
9068 jj=
TT; deltime = fabs(predel[jj]);
9073 SLOOPA(jj) predel[jj] = delspace/upitoup0[ru->
irefU[jj]];
9080 predel[jj] = predel[jj]/upitoup0[ru->
irefU[jj]];
9090 PLOOP(pliter,pl) f2[0][pl]=f1[pl];
9096 FTYPE FRACIMPEPSCHANGE=0.1;
9098 FTYPE IMPEPSSTART=impepsjac;
9101 FTYPE localIMPEPS=IMPEPSSTART;
9107 for(sided=0;sided<numsides;sided++){
9112 if(sided==1) signside=-1.0;
9116 if(sided==1) signside=+1.0;
9123 del = localIMPEPS*predel[jj];
9127 PLOOP(pliter,pl) xjac[sided][pl]=xjacalt[pl]=x[pl];
9133 if(x[ru->
irefU[jj]]>0.0){
9134 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del;
9135 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del;
9138 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del;
9139 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del;
9142 else if(*baseitermethod==
QTYURAD){
9144 if(x[ru->
irefU[jj]]>0.0){
9145 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del*(jj==TT ? -1.0 : 1.0);
9146 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del*(jj==TT ? -1.0 : 1.0);
9149 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del*(jj==TT ? -1.0 : 1.0);
9150 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del*(jj==TT ? -1.0 : 1.0);
9153 else if(*baseitermethod==
QTYUMHD){
9155 if(x[ru->
irefU[jj]]>0.0){
9156 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del*(jj==TT ? -1.0 : 1.0);
9157 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del*(jj==TT ? -1.0 : 1.0);
9160 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del*(jj==TT ? -1.0 : 1.0);
9161 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del*(jj==TT ? -1.0 : 1.0);
9165 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del;
9166 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del;
9171 xjac[sided][ru->
irefU[jj]]=x[ru->
irefU[jj]] + signside*del;
9172 xjacalt[ru->
irefU[jj]]=x[ru->
irefU[jj]] - signside*del;
9179 uujac[pl]=xjac[sided][pl];
9180 uujacalt[pl]=xjacalt[pl];
9181 ppjac[pl]=ppjacalt[pl]=ppcopy[pl];
9186 uujac[pl]=uujacalt[pl]=uucopy[pl];
9187 ppjac[pl]=xjac[sided][pl];
9188 ppjacalt[pl]=xjacalt[pl];
9194 pl=ru->
irefU[subjj];
9199 if(xjac[sided][pl]<ppmin && x[pl]>0.0){
9200 xjac[sided][pl]=ppmin;
9203 else if(xjac[sided][pl]>-ppmin && x[pl]<0.0){
9204 xjac[sided][pl]=-ppmin;
9208 ppjac[pl]=xjac[sided][pl];
9217 eomtypelocallocal=*eomtypelocal;
9226 FTYPE tautotmaxreturn;
9227 failreturn=
f_implicit(allowbaseitermethodswitch, fakeiter,fakef1iter,failreturnallowableuse, whichcall,localIMPEPS,showmessages,showmessagesheavy, allowlocalfailurefixandnoreport, &eomtypelocallocal, whichcapnew,itermode, baseitermethod, fracenergy, dissmeasure, &radinvmod, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, realdt, dimtypef, dimfactU, ppjacalt, ppjac,piin,uujacalt, Uiin,uu0,uujac,fracdtG*realdt,ptrgeom,&qjac,f2[sided],f2norm[sided],f2report[sided], &goexplicitfake, &errorabsf2[0], &errorabsf2[1], whicherror, &convreturnf2, nummhdinvsreturn, &tautotmaxreturn, mtd, ru);
9229 prod0dualfprintf(showmessages&& debugfail>=2,fail_file,
"f_implicit for f2 failed: jj=%d. Trying smaller localIMPEPS=%g (giving del=%g) to %g\n",jj,localIMPEPS,del,localIMPEPS*FRACIMPEPSCHANGE);
9230 localIMPEPS*=FRACIMPEPSCHANGE;
9237 prod0dualfprintf(debugfail>=2,fail_file,
"Bad error: f_implicit for f2 failed: jj=%d with localIMPEPS=%g (giving del=%g)\n",jj,localIMPEPS,del);
9243 localIMPEPS=IMPEPSSTART;
9272 dualfprintf(fail_file,
"JISNAN: iter=%d startjac=%d endjac=%d ii=%d jj=%d irefU[jj]=%d erefU[ii]=%d : xjac[0]: %21.15g : xjac[1]: %21.15g : x=%21.15g (del=%21.15g localIMPEPS=%21.15g) : f2[0]=%21.15g f2[1]=%21.15g J=%21.15g : f2norm[0]=%21.15g f2norm[1]=%21.15g\n",
9275 xjac[0][ru->
irefU[jj]],
9276 xjac[1][ru->
irefU[jj]],
9280 f2norm[0][ru->
erefU[ii]],f2norm[1][ru->
erefU[ii]]
9284 dualfprintf(fail_file,
"NEW: ii=%d jj=%d J=%21.15g : %21.15g %21.15g : %21.15g %21.15g\n",ii,jj,J[ru->
erefU[ii]][ru->
irefU[jj]], f2[1][ru->
erefU[ii]],f2[0][ru->
erefU[ii]],xjac[1][ru->
irefU[jj]],xjac[0][ru->
irefU[jj]]);
9286 PLOOP(pliter,pl) dualfprintf(fail_file,
"JISNAN2: pl=%d ppjac=%21.15g uu0=%21.15g uujac=%21.15g\n",pl,ppjac[pl],uu0[pl],uujac[pl]);
9298 if(showmessagesheavy){
9299 dualfprintf(fail_file,
"POSTJAC: x: %21.15g %21.15g %21.15g %21.15g : x=%21.15g %21.15g %21.15g %21.15g\n",x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]],x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]]);
9322 failreturn=inverse_44matrix(Jsub,iJsub);
9335 iJ[ru->
irefU[ii]][ru->
erefU[jj]]=iJsub[ii][jj];
9346 dualfprintf(fail_file,
"Tried to invert Jacobian with %d %d %d %d : %g %g %g : %g %g %g : %d %d : %g %g : %d : %g %g\n",*eomtypelocal, whichcap, itermode, *baseitermethod, fracenergy, dissmeasure, impepsjac, trueimptryconv, trueimptryconvabs, trueimpallowconvabs, trueimpmaxiter, iter, errorabs, errorallabs, whicherror,fracdtG,realdt);
9347 PLOOP(pliter,pl) dualfprintf(fail_file,
"1Tried: pl=%d Uiin=%g uu=%g uup=%g uu0=%g piin=%g pp=%g ppp=%g f1=%g f1norm=%g\n", pl, Uiin[pl], uu[pl], uup[pl], uu0[pl], piin[pl], pp[pl], ppp[pl], f1[pl], f1norm[pl]);
9349 dualfprintf(fail_file,
"2Tried: ii=%d jj=%d (%d %d) : j=%g iJ=%g\n",ii,jj,ru->
startjac,ru->
endjac,Jsub[ii][jj],iJsub[ii][jj]);
9367 IMPEPSSTART/=FRACIMPEPSCHANGE;
9374 if(debugfail>=2) dualfprintf(fail_file,
"f_implicit for f2 failed to be different enough from f1 and gave singular Jacobian: IMPEPSSTART=%g (giving del=%g)\n",IMPEPSSTART,del);
9375 if(debugfail>=2 || showmessagesheavy){
9376 dualfprintf(fail_file,
"POSTJAC1: x: %21.15g %21.15g %21.15g %21.15g : x=%21.15g %21.15g %21.15g %21.15g\n",x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]],x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]]);
9378 DLOOP(iii,jjj) dualfprintf(fail_file,
"Jsub[%d][%d]=%21.15g\n",iii,jjj,Jsub[iii][jjj]);
9387 if(debugfail>=2) dualfprintf(fail_file,
"inverse_44matrix(J,iJ) failed with eomtypelocallocal=%d, trying IMPEPSSTART=%g :: ijk=%d %d %d\n",eomtypelocallocal,IMPEPSSTART,ptrgeom->i,ptrgeom->j,ptrgeom->k);
9388 if(debugfail>=2 || showmessagesheavy){
9389 dualfprintf(fail_file,
"POSTJAC2: x: %21.15g %21.15g %21.15g %21.15g : x=%21.15g %21.15g %21.15g %21.15g\n",x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]],x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]]);
9391 DLOOPA(iii) dualfprintf(fail_file,
"predel[%d]=%21.15g\n",iii,predel[iii]);
9392 DLOOP(iii,jjj) dualfprintf(fail_file,
"Jsub[%d][%d]=%21.15g\n",iii,jjj,Jsub[iii][jjj]);
9406 if(debugfail>=2) dualfprintf(fail_file,
"Failed to get inverse Jacobian with fulljaciter=%d with IMPEPSSTART=%g (giving del=%g)\n",fulljaciter,IMPEPSSTART,del);
9407 if(debugfail>=2 || showmessagesheavy){
9408 dualfprintf(fail_file,
"POSTJAC3: x: %g %g %g %g : x=%g %g %g %g\n",x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]],x[ru->
irefU[0]],x[ru->
irefU[1]],x[ru->
irefU[2]],x[ru->
irefU[3]]);
9410 DLOOP(iii,jjj) dualfprintf(fail_file,
"Jsub[%d][%d]=%g\n",iii,jjj,Jsub[iii][jjj]);
9445 static void get_dtsub(
int method,
FTYPE *pr,
struct of_state *q,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
FTYPE *Gdpl,
FTYPE chi,
FTYPE *Gdplabs,
struct of_geom *ptrgeom,
FTYPE *dtsub)
9449 FTYPE idtsub0,idtsub;
9451 FTYPE Umhd,Urad,Gmhd,Grad,iUmhd,iUrad;
9453 FTYPE idtsubs,idtsubt;
9454 FTYPE idtsubmhd,idtsubrad;
9455 FTYPE Usmhd,Usrad,Gsmhd,Gsrad,iUsmhd,iUsrad;
9456 FTYPE Utmhd,Utrad,Gtmhd,Gtrad,iUtmhd,iUtrad;
9461 dualfprintf(fail_file,
"get_dtsub() assumes removed rest mass from UU so can compare G and U[UU]\n");
9476 PLOOP(pliter,pl) Gddtpl[pl] = Gdpl[pl]*realdt;
9479 PLOOP(pliter,pl) Gddtpl[pl] = Gdplabs[pl]*realdt;
9488 PLOOP(pliter,pl) U0[pl]=UFSET(CUf,dt,Ui[pl],Uf[pl],dUother[pl],0.0,dUnongeomall);
9496 PLOOP(pliter,pl) U[pl]=Ui[pl];
9515 SLOOPA(jj) tautotdir[jj] = chi * dxortho[jj];
9519 idtsub0=taumax/realdt;
9524 idtsub0 = ratchangeRtt/realdt;
9543 jj=
TT; Urad=fabs(U[URAD0+jj]);
9544 idtsub=
MAX(idtsub,idtsub0*Urad/Umhd);
9550 jj=
TT; Urad=fabs(U0[URAD0+jj]);
9551 idtsub=
MAX(idtsub,idtsub0*Urad/Umhd);
9560 Umhd=Urad=Gmhd=Grad=0.0;
9561 DLOOPA(jj) Umhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9562 DLOOPA(jj) Urad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9563 DLOOPA(jj) Gmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9564 DLOOPA(jj) Grad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9566 iUrad=1.0/(fabs(Urad)+UUMINLIMIT);
9567 idtsub=UUMINLIMIT+fabs(Gmhd*iUmhd);
9568 idtsub=
MAX(idtsub,UUMINLIMIT+fabs(Grad*iUrad));
9569 idtsub=sqrt(idtsub);
9577 Usmhd=Usrad=Gsmhd=Gsrad=0.0;
9578 Utmhd=Utrad=Gtmhd=Gtrad=0.0;
9579 SLOOPA(jj) Usmhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9580 jj=TT; Utmhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9581 SLOOPA(jj) Usrad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9582 jj=TT; Utrad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9583 SLOOPA(jj) Gsmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9584 jj=TT; Gtmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9585 SLOOPA(jj) Gsrad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9586 jj=TT; Gtrad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9587 iUsmhd=1.0/(fabs(Usmhd)+UUMINLIMIT);
9588 iUtmhd=1.0/(fabs(Utmhd)+UUMINLIMIT);
9589 iUsrad=1.0/(fabs(Usrad)+UUMINLIMIT);
9590 iUtrad=1.0/(fabs(Utrad)+UUMINLIMIT);
9591 idtsubs=
SMALL+fabs(Gsmhd*iUsmhd);
9592 idtsubs=
MAX(idtsubs,
SMALL+fabs(Gsrad*iUsrad));
9593 idtsubt=
SMALL+fabs(Gtmhd*iUtmhd);
9594 idtsubt=
MAX(idtsubt,
SMALL+fabs(Gtrad*iUtrad));
9595 idtsub=
MAX(idtsubs,idtsubt);
9596 idtsub=sqrt(idtsub);
9600 Usmhd=Usrad=Gsmhd=Gsrad=0.0;
9603 Umhd = fabs(U[UU+jj]*U[UU+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9604 Urad = fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9605 Gmhd = fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9606 Grad = fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9609 idtsub=
MAX(idtsub,
SMALL+fabs(Gmhd*iUmhd));
9610 idtsub=
MAX(idtsub,
SMALL+fabs(Grad*iUrad));
9615 Usmhd=Usrad=Gsmhd=Gsrad=0.0;
9618 Umhd = fabs(U[UU+jj]*U[UU+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9619 Urad = fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9620 Gmhd = fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9621 Grad = fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->gcon[
GIND(jj,jj)]);
9624 idtsub=
MAX(idtsub,
SMALL+fabs(Gmhd*iUmhd));
9625 idtsub=
MAX(idtsub,
SMALL+fabs(Grad*iUrad));
9630 Umhd=Urad=Gmhd=Grad=0.0;
9632 DLOOPA(jj) Umhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9633 DLOOPA(jj) Urad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9634 DLOOPA(jj) Gmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9635 DLOOPA(jj) Grad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9636 iUmhd=1.0/(fabs(Umhd)+UUMINLIMIT);
9637 iUrad=1.0/(fabs(Urad)+UUMINLIMIT);
9638 idtsub=
MAX(idtsub,
SMALL+fabs(Gmhd*iUmhd));
9639 idtsub=
MAX(idtsub,
SMALL+fabs(Grad*iUrad));
9647 Usmhd=Usrad=Gsmhd=Gsrad=0.0;
9648 Utmhd=Utrad=Gtmhd=Gtrad=0.0;
9649 SLOOPA(jj) Usmhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9650 jj=TT; Utmhd += fabs(U[UU+jj]*U[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9651 SLOOPA(jj) Usrad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9652 jj=TT; Utrad += fabs(U[URAD0+jj]*U[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9653 SLOOPA(jj) Gsmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9654 jj=TT; Gtmhd += fabs(Gddtpl[UU+jj]*Gddtpl[UU+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9655 SLOOPA(jj) Gsrad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9656 jj=TT; Gtrad += fabs(Gddtpl[URAD0+jj]*Gddtpl[URAD0+jj]*ptrgeom->
gcon[
GIND(jj,jj)]);
9657 iUsmhd=1.0/(fabs(Usmhd)+UUMINLIMIT);
9658 iUtmhd=1.0/(fabs(Utmhd)+UUMINLIMIT);
9659 iUsrad=1.0/(fabs(Usrad)+UUMINLIMIT);
9660 iUtrad=1.0/(fabs(Utrad)+UUMINLIMIT);
9662 idtsub=
MAX(idtsub,SMALL+fabs(Gsmhd*iUsmhd));
9663 idtsub=
MAX(idtsub,SMALL+fabs(Gsrad*iUsrad));
9664 idtsub=
MAX(idtsub,SMALL+fabs(Gtmhd*iUtmhd));
9665 idtsub=
MAX(idtsub,SMALL+fabs(Gtrad*iUtrad));
9679 #define EXPLICITFAILEDBUTWENTTHROUGH -2
9680 #define EXPLICITNOTNECESSARY -1
9681 #define EXPLICITNOTFAILED 0 // should stay zero
9682 #define EXPLICITFAILED 1 // should stay one
9685 #define GETADVANCEDUNEW0FOREXPLICIT 1 // Use this to check if single explicit step was really allowable, but get_dtsub() already uses advanced U. But chi will be not updated for fluid dUriemann update, so still might want to do this (with proper code changes) in order to get chi good.
9694 static int source_explicit(
int whichsc,
int whichradsourcemethod,
int methoddtsub,
int *eomtype,
9695 void (*sourcefunc)(
int methoddtsub,
FTYPE *pr,
FTYPE *Ui,
FTYPE *Uf,
FTYPE *dUother,
FTYPE *CUf,
FTYPE *CUimp,
FTYPE *Gpl,
struct of_geom *ptrgeom,
FTYPE *dtsub),
9700 int eomtypelocal=*eomtype;
9708 int showmessagesheavy=0;
9709 int allowlocalfailurefixandnoreport=0;
9710 struct of_newtonstats newtonstats; setnewtonstatsdefault(&newtonstats);
9726 FTYPE pb0[NPR],Uiin0[NPR];
9727 FTYPE prnew[NPR],Unew[NPR],Unew0[NPR];
9734 PLOOP(pliter,pl) prnew[pl]=pb0[pl]=pb[pl];
9735 PLOOP(pliter,pl) Unew[pl]=Uiin0[pl]=Uiin[pl];
9740 FTYPE fracdtuu0=1.0;
9742 PLOOP(pliter,pl) Unew[pl]=Unew0[pl]=UFSET(CUf,fracdtuu0*dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
9745 int pushthroughraderror=0;
9747 pushthroughraderror=1;
9767 eomtypelocal=*eomtype;
9769 FTYPE dissmeasure=-1.0;
9770 int checkoninversiongas;
9771 int checkoninversionrad;
9773 checkoninversiongas=checkoninversionrad=0;
9775 int failutoprim=Utoprimgen_failwrapper(doradonly,&radinvmod,showmessages,checkoninversiongas,checkoninversionrad, allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcap,
EVOLVEUTOPRIM,
UNOTHING, Unew, q, ptrgeom, dissmeasure, prnew, &newtonstats);
9790 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"Backing off fracdtuu0=%g\n",fracdtuu0);
9793 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"In explicit, backed-off to very small level of fracdtuu0=%g, so must abort\n",fracdtuu0);
9804 PLOOP(pliter,pl) Unew[pl]=Unew0[pl]=UFSET(CUf,fracdtuu0*dt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
9806 PLOOP(pliter,pl) prnew[pl]=pb0[pl]=pb[pl];
9824 PLOOP(pliter,pl) prforG[pl]=prnew[pl];
9829 sourcefunc(methoddtsub, prforG, Uiin, Ufin, dUother, CUf, CUimp, Gpl, ptrgeom, &dtsubforG);
9836 PLOOP(pliter,pl) prnew[pl]=pb[pl];
9845 FTYPE dttrue=0.0,dtcum=0.0;
9847 FTYPE dtsub,dtsubold,dtsubuse;
9853 FTYPE Gplprevious[NPR]={0}, sourcepl[NPR];
9857 PLOOP(pliter,pl) sourcepl[pl] = 0;
9870 PLOOP(pliter,pl) Gplprevious[pl]=Gpl[pl];
9872 sourcefunc(methoddtsub, prnew, Uiin, Ufin, dUother, CUf, CUimp, Gpl, ptrgeom, &dtsub);
9873 if(itersub==0)
PLOOP(pliter,pl) Gplprevious[pl]=Gpl[pl];
9874 if(itersub==0 && dtsub>dtsubforG) dtsub=dtsubforG;
9883 if(showmessagesheavy&&debugfail>=2){
9884 PLOOP(pliter,pl) dualfprintf(fail_file,
"SOURCE: pl=%d Gpl=%g dtsub=%g realdt=%g prnew=%g Uiin=%g Ufin=%g dUother=%g\n",pl,Gpl[pl],dtsub,realdt,prnew[pl],Uiin[pl],Ufin[pl],dUother[pl]);
9905 if(debugfail>=2) dualfprintf(fail_file,
"MAJOR explicit issue: realdt=%g dtsub=%g and aborted assuming no real solution and that best approximation is no force.\n");
9913 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"itersub=%d dtsub very small: %g with realdt=%g and only allowing MAXSUBCYCLES=%d subcycles, so limit dtsub: ijk=%d %d %d\n",itersub,dtsub,realdt,
MAXSUBCYCLES,ptrgeom->i,ptrgeom->j,ptrgeom->k);
9916 else if(
NUMEPSILON*dtsub>=realdt && itersub==0){
9917 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit not necessary\n");
9923 if(itersub==0) dtsubold=dtsubuse=dtsub;
9931 else dtsubuse=dtsub;
9938 dtdiff=
MAX(realdt-dtcum,0.0);
9939 dttrue=
MIN(dtsubuse,dtdiff);
9940 fracdtG=
MIN(1.0,dttrue/realdt);
9943 if(showmessagesheavy&&debugfail>=2){
9944 dualfprintf(fail_file,
"DoingSUBCYCLE: itersub=%d : dtsub=%g dtsubuse=%g dtdiff=%g dttrue=%g dtcum=%g realdt=%g fracdtG=%g ijk=%d %d %d\n",itersub,dtsub,dtsubuse,dtdiff,dttrue,dtcum,realdt,fracdtG,ptrgeom->i,ptrgeom->j,ptrgeom->k);
9946 if(debugfail>=2 && (1||showmessages)&&(1.0/fracdtG>
MAXSUBCYCLES && itersub==0)){
9947 dualfprintf(fail_file,
"DoingLOTSofsub-cycles: ijk=%d %d %d 1/fracdtG=%g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,1.0/fracdtG);
9957 PLOOP(pliter,pl) sourcepl[pl] += 0.5*(Gplprevious[pl]+Gpl[pl])*fracdtG;
9967 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit done\n");
9973 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit sub-cycle done\n");
9983 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit sub-cycle can't be done.\n");
9989 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit success, just one step.\n");
9999 FTYPE xint=(dtcum/realdt);
10003 FTYPE fakefracdtuu0=1.0*(xint);
10006 FTYPE tempdt= fakefracdtuu0*
dt;
10008 PLOOP(pliter,pl) Unew0[pl]=UFSET(CUf,tempdt,Uiin[pl],Ufin[pl],dUother[pl],0.0,dUnongeomall);
10012 PLOOP(pliter,pl) Unew[pl] = Unew0[pl] + sourcepl[pl] * realdt;
10017 eomtypelocal=*eomtype;
10020 FTYPE dissmeasure=-1.0;
10023 int failutoprim=Utoprimgen_failwrapper(doradonly,&radinvmod,showmessages,checkoninversiongas,checkoninversionrad, allowlocalfailurefixandnoreport, finalstep, &eomtypelocal, whichcap,
EVOLVEUTOPRIM,
UNOTHING, Unew, q, ptrgeom, dissmeasure, prnew, &newtonstats);
10026 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"BAD: Utoprimgen_wrapper() failed during explicit sub-stepping. So sub-cycling failed.\n");
10032 if(showmessagesheavy &&debugfail>=2)
PLOOP(pliter,pl) dualfprintf(fail_file,
"POSTEXSTEP: pl=%2d Unew0=%21.15g Unew=%21.15g sourcepl*realdt=%21.15g fakefracdtuu0=%g\n",pl,Unew0[pl],Unew[pl],sourcepl[pl]*realdt,fakefracdtuu0);
10036 dtcum += realdt*fracdtG;
10049 PLOOP(pliter,pl) dUcomp[whichsc][pl] += sourcepl[pl];
10052 PLOOP(pliter,pl) pb[pl]=prnew[pl];
10055 *eomtype=eomtypelocal;
10073 int koral_source_rad(
int whichradsourcemethod,
FTYPE *piin,
FTYPE *pb,
FTYPE *pf,
int *didreturnpf,
int *eomtype,
FTYPE *Uiin,
FTYPE *Ufin,
FTYPE *CUf,
FTYPE *CUimp,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE dissmeasure,
FTYPE *dUother,
FTYPE (*dUcomp)[NPR])
10076 int showmessages=0;
10077 int showmessagesheavy=0;
10086 FTYPE pborig[NPR],pforig[NPR],piinorig[NPR],Uiinorig[NPR],Ufinorig[NPR];
10092 piinorig[pl]=piin[pl];
10093 Uiinorig[pl]=Uiin[pl];
10094 Ufinorig[pl]=Ufin[pl];
10117 dualfprintf(fail_file,
"Makes no sense to do explicit source (with or without subcycling) and IMEX stepping\n");
10133 int failexplicit=source_explicit(whichsc, whichradsourcemethod,methoddtsub,eomtype,koral_source_dtsub_rad_calc,pborig, piinorig, Uiinorig, Ufinorig, CUf, CUimp, ptrgeom, qorig, dUother, dUcomp);
10138 if(debugfail>=2) dualfprintf(fail_file,
"BAD: explicit failed: ijk=%d %d %d : whichradsourcemethod=%d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,whichradsourcemethod);
10145 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"explicit failed for implicit check. ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10151 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"explicit failed. ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10159 if(debugfail>=2) dualfprintf(fail_file,
"ODD: explicit found not necessary while implicit failed: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10167 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"explicit didn't fail. ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10168 PLOOP(pliter,pl) pf[pl]=pborig[pl];
10183 int doradimplicit = (CUimp[0]!=0.0);
10190 PLOOP(pliter,pl) pf[pl]=pborig[pl];
10201 int failimplicit=
koral_source_rad_implicit(eomtype, pborig, pforig, piinorig, Uiinorig, Ufinorig, CUf, CUimp, ptrgeom, qorig, dissmeasure, dUother, dUcomp);
10203 if(failimplicit>0){
10206 int failexplicit=
koral_source_rad(
SOURCEMETHODEXPLICITSUBCYCLEREVERSIONFROMIMPLICIT, piinorig, pborig, pf, didreturnpf, eomtype, Uiinorig, Ufinorig, CUf, CUimp, ptrgeom, qorig, dissmeasure, dUother, dUcomp);
10210 if(debugfail>=2) dualfprintf(fail_file,
"BAD: explicit failed while implicit failed: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10216 if(debugfail>=2) dualfprintf(fail_file,
"ODD: explicit found not necessary while implicit failed: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10223 if(debugfail>=2) dualfprintf(fail_file,
"HMM: explicit found necessary and had problems while implicit failed: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10230 if(debugfail>=2) dualfprintf(fail_file,
"GOOD: explicit worked while implicit failed (%d): ijk=%d %d %d\n",failexplicit,ptrgeom->i,ptrgeom->j,ptrgeom->k);
10231 PLOOP(pliter,pl) pf[pl]=pborig[pl];
10238 if(debugfail>=2) dualfprintf(fail_file,
"BAD: implicit failed and didn't choose to revert: ijknstepsteppart=%d %d %d %ld %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart);
10243 else if(failimplicit==0){
10246 PLOOP(pliter,pl) pf[pl]=pborig[pl];
10266 int failreturn=
koral_source_rad(
SOURCEMETHODEXPLICITCHECKSFROMIMPLICIT, piinorig, pborig, pf, didreturnpf, eomtype, Uiinorig, Ufinorig, CUf, CUimp, ptrgeom, qorig, dissmeasure, dUother, dUcomp);
10274 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"NOTE: Tried explicit step, but wasn't good choice or failed: ijk=%d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10284 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"NOTE: Was able to take explicit step: ijk=%d %d %d : failreturn=%d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,failreturn);
10290 if(showmessagesheavy && debugfail>=2) dualfprintf(fail_file,
"NOTE: Had to take implicit step: %d %d %d\n",ptrgeom->i,ptrgeom->j,ptrgeom->k);
10293 return(
koral_source_rad(
SOURCEMETHODIMPLICIT, piinorig, pborig, pf, didreturnpf, eomtype, Uiinorig, Ufinorig, CUf, CUimp, ptrgeom, qorig, dissmeasure, dUother, dUcomp));
10314 dualfprintf(fail_file,
"3 No Such EOMRADTYPE=%d\n",
EOMRADTYPE);
10350 int loc=ptrgeom->p;
10351 FTYPE Tgas=compute_temp_simple(ii,jj,kk,loc,rho,u);
10353 FTYPE Tradff,nradff,expfactorradff;
10357 FTYPE Ruufake=pr[PRAD0];
10358 Tradff = pow(fabs(Ruufake)/
ARAD_CODE,0.25);
10359 expfactorradff=1.0;
10364 calc_Trad(pr,ptrgeom,q,&Tradff,&nradff,&expfactorradff);
10370 #if(ALLOWKAPPAEXPLICITPOSDEPENDENCE)
10376 *kappa = calc_kappa_user(rho,B,Tgas,Tradff,expfactorradff,xx,yy,zz);
10380 FTYPE bsqorholimit=10.0;
10382 FTYPE thebsqorho=bsq/rho;
10384 factor=exp(-thebsqorho/bsqorholimit);
10403 int loc=ptrgeom->p;
10404 FTYPE T=compute_temp_simple(ii,jj,kk,loc,rho,u);
10405 FTYPE V[
NDIM]={0.0},xx=0.0,yy=0.0,zz=0.0;
10406 #if(ALLOWKAPPAEXPLICITPOSDEPENDENCE)
10412 *kappaes = calc_kappaes_user(rho,T,xx,yy,zz);
10418 FTYPE bsqorholimit=10.0;
10420 FTYPE thebsqorho=bsq/rho;
10422 factor=exp(-thebsqorho/bsqorholimit);
10423 *kappaes *= factor;
10432 FTYPE kappa,kappaes;
10433 calc_kappa(pr,ptrgeom,q,&kappa);
10434 calc_kappaes(pr,ptrgeom,&kappaes);
10436 *chi=kappa+kappaes;
10442 void calc_Tandopacityandemission(
FTYPE *pr,
struct of_geom *ptrgeom,
struct of_state *q,
FTYPE Ruu,
FTYPE gammaradgas,
FTYPE B,
FTYPE *Tgas,
FTYPE *Tradff,
FTYPE *nradff,
FTYPE *expfactorradff,
FTYPE *kappa,
FTYPE *kappan,
FTYPE *kappaemit,
FTYPE *kappanemit,
FTYPE *kappaes,
FTYPE *lambda,
FTYPE *nlambda)
10455 int loc=ptrgeom->p;
10456 *Tgas=compute_temp_simple(ii,jj,kk,loc,rho,u);
10457 *Tgas = fabs(*Tgas) +
TEMPMIN;
10461 *Tradff = fabs(*Tradff) +
TEMPMIN;
10462 *nradff = fabs(*nradff) +
SMALL;
10465 FTYPE V[
NDIM]={0.0},xx=0.0,yy=0.0,zz=0.0;
10466 #if(ALLOWKAPPAEXPLICITPOSDEPENDENCE)
10474 #if(WHICHFIT==ISFITNEW)
10478 #if(EOMRADTYPE!=EOMRADNONE)
10479 kappa_func_fits_all(rho, B, *Tgas, *Tradff, *expfactorradff, kappa, kappaemit, kappan, kappanemit, kappaes);
10491 #else // WHICHFIT==ISFITORIG
10493 *kappaes = calc_kappaes_user(rho,*Tgas,xx,yy,zz);
10496 *kappa = calc_kappa_user(rho,B,*Tgas,*Tradff,*expfactorradff,xx,yy,zz);
10500 *kappaemit = calc_kappaemit_user(rho,B,*Tgas,*Tradff,*expfactorradff,xx,yy,zz);
10515 *kappan = calc_kappan_user(rho,B,*Tgas,*Tradff,*expfactorradff,xx,yy,zz);
10518 *kappanemit = calc_kappanemit_user(rho,B,*Tgas,*Tradff,*expfactorradff,xx,yy,zz);
10534 FTYPE bsqorholimit=10.0;
10536 FTYPE thebsqorho=bsq/rho;
10538 factor=exp(-thebsqorho/bsqorholimit);
10540 *kappaes *= factor;
10542 *kappaemit *= factor;
10546 *kappanemit *= factor;
10547 *nlambda *= factor;
10561 calc_Gu(pp, ptrgeom, q, GG, Tgas, Trad, chieffreturn,ndotffreturn,ndotffabsreturn,Gabs);
10562 indices_21(GG, GG, ptrgeom);
10573 FTYPE ndotff,ndotffabs;
10575 FTYPE chilocal,Tgaslocal,Tradlocal;
10577 if(q==NULL){ q=&qlocal; computestate=1; }
10578 if(chi==NULL) chi=&chilocal;
10579 if(Tgas==NULL) Tgas=&Tgaslocal;
10580 if(Trad==NULL) Trad=&Tradlocal;
10591 if(computestate)
get_state(pr,ptrgeom,q);
10593 calc_Gd(pr, ptrgeom, q, Gd, Tgas, Trad, chi, &ndotff, &ndotffabs, Gdabs);
10595 PLOOP(pliter,pl) Gdpl[pl] = 0.0;
10601 #define SIGNGD (1.0)
10608 PLOOP(pliter,pl) Gdplabs[pl] = 0.0;
10609 DLOOPA(jj) Gdplabs[UU+jj] = Gdabs[jj];
10610 DLOOPA(jj) Gdplabs[URAD0+jj] = Gdabs[jj];
10618 #if(DOENTROPY!=DONOENTROPY && ENTROPY!=-100)
10619 if(computeentropy){
10625 DLOOPA(jj) Gdplentropycontribs[jj] = (-Gdpl[UU+jj])*(q->
ucon[jj])/(*Tgas);
10628 DLOOPA(jj) Gdpl[pl] += Gdplentropycontribs[jj];
10632 DLOOPA(jj) Gdplabs[pl] += fabs(Gdplentropycontribs[jj]);
10645 Gdplabs[pl] = ndotffabs;
10655 FTYPE Gdplabs[NPR];
10656 FTYPE chi,Tgas,Trad;
10659 int computestate=1;
10660 int computeentropy=1;
10665 get_dtsub(method, pr, &q, Ui, Uf, dUother, CUf, CUimp, Gdpl, chi, Gdplabs, ptrgeom, dtsub);
10693 FTYPE gammaradgas = 0.0;
10705 FTYPE Tradff,nradff,expfactorradff;
10706 FTYPE kappa,kappan;
10707 FTYPE kappaemit,kappanemit;
10709 FTYPE lambda,nlambda;
10710 calc_Tandopacityandemission(pp,ptrgeom,q,Ruu,gammaradgas,B,&Tgas,&Tradff,&nradff,&expfactorradff,&kappa,&kappan,&kappaemit,&kappanemit,&kappaes, &lambda, &nlambda);
10712 FTYPE chi=kappa+kappaes;
10740 FTYPE Ruuss=0.;
DLOOP(i,j)
if(i!=TT && j!=TT) Ruuss+=Rij[
i][
j]*ucov[
i]*ucon[
j];
10742 FTYPE fact=(-ptrgeom->gcov[
GIND(TT,TT)])*(-ptrgeom->gcon[
GIND(TT,TT)]);
10743 FTYPE fact2=1.0-fact;
10744 FTYPE utildecon[
NDIM]={0.0,pp[URAD1],pp[URAD2],pp[URAD3]};
10745 FTYPE utsq = 0.0,utildecov[
NDIM]; lower_vec(utildecon,ptrgeom,utildecov);
SLOOPA(j) utsq+=utildecon[
j]*utildecov[
j];
10746 FTYPE ucontucovt = ( fact2 - utsq*fact + ucon[
TT]*(ucon[1]*ptrgeom->gcov[
GIND(TT,1)]+ucon[2]*ptrgeom->gcov[
GIND(TT,2)]+ucon[3]*ptrgeom->gcov[
GIND(TT,3)]));
10763 FTYPE Ru,Ruuu,Ruuuabs,term1a,term1b,term2,term2abs,term3;
10765 Ru=0.;
DLOOPA(j) Ru+=Rij[
i][
j]*ucon[
j];
10767 Ruuu=(Ru + Ruu*ucon[
i]);
10768 Ruuuabs=fabs(Ru) + fabs(Ruu*ucon[i]);
10770 if(i!=TT) Ruuu=(Ru + Ruu*ucon[
i]);
10772 Rus=0.;
DLOOPA(j)
if(j!=TT) Rus+=Rij[
i][
j]*ucon[
j];
10773 Ruuu=Ruuss + Rus + Rut;
10775 Ruuuabs=fabs(Ru) + fabs(Ruu*ucon[i]);
10779 term1a = -(kappa*Ru);
10780 term1b = -(lambda*ucon[
i]);
10782 term2 = -kappaes*Ruuu;
10783 term2abs = fabs(kappaes*Ruuuabs);
10786 term3 = preterm3*ucon[
i];
10793 Gu[
i] = term1a + term1b + term2 + term3;
10796 Gabs[
i] = fabs(term1a) + fabs(term1b) + fabs(term2abs) + fabs(term3);
10800 if(ptrgeom->i==3 && ptrgeom->j==26){
10801 dualfprintf(fail_file,
"i=%d term1a=%g term1b=%g term2=%g kappa=%g lambda=%g kappaes=%g ucon=%g Gu=%g Gabs=%g\n",i,term1a,term1b,term2,kappa,lambda,kappaes,ucon[i],Gu[i],Gabs[i]);
10812 *Tradreturn=Tradff;
10815 *chieffreturn=chi + lambda/(
ERADLIMIT+fabs(pp[PRAD0]));
10822 #if(EVOLVENRAD&&NRAD>0)
10823 FTYPE ndotff,ndotffabs;
10825 ndotff = -(kappan*nradff - nlambda);
10826 ndotffabs = fabs(kappan*nradff) + fabs(nlambda);
10828 *ndotffreturn=ndotff;
10829 *ndotffabsreturn=ndotffabs;
10844 calc_Trad(pp,ptrgeom,&q,Trad,nrad,expfactorrad);
10853 FTYPE Tradff,nradff,expfactorradff;
10860 expfactorradff=1.0;
10879 FTYPE gammaradgas = 0.0;
10889 *expfactorrad=expfactorradff;
10896 FTYPE Tradff,nradff,expfactorradff;
10906 expfactorradff=1.0;
10909 nradff = pp[NRAD]*gammaradgas;
10918 Tradff = Ruu/(nradff*
EBAR0);
10919 expfactorradff = 1.0;
10924 FTYPE EBAR1=3.0-BB*nradff*nradff*nradff*nradff/(CRAD*Ruu*Ruu*Ruu+
SMALL);
10927 Tradff = Ruu/(SMALL+nradff*EBAR1);
10929 Tradff = (Ruu*(0.333333333327962 + 0.060724957534625555/(0.6467556546674441 + (0.12198190033984817*CRAD*
Power(Ruu,3))/
Power(SMALL+nradff,4))))/(SMALL+nradff);
10930 expfactorradff = 1.6467556546674442/(0.6467556546674441 + (0.12198190033984817*CRAD*
Power(Ruu,3))/
Power(SMALL+nradff,4));
10931 if(expfactorradff>1.0) expfactorradff=1.0;
10940 *expfactorrad=expfactorradff;
10961 FTYPE ratchangeRtt=SMALL+fabs(chieff * ucon0 * ucon0 * realdt * 1.0);
10966 return(ratchangeRtt);
10991 FTYPE vrad2limited;
11002 FTYPE tautotsq,vrad2tau;
11007 tautotsq = tautot[dir]*tautot[dir];
11014 vrad2tau=(4.0/3.0)*(4.0/3.0)/tautotsq;
11015 vrad2limited=
MIN(vrad2,vrad2tau);
11023 vrad2limited=vrad2;
11032 FTYPE ftemp=1.0/sqrt(fabs(geom->gcov[
GIND(dir,dir)]));
11065 ucon[ii]=q->
ucon[ii];
11066 ucov[ii]=q->
ucov[ii];
11076 q->
ucon[ii]=ucon[ii];
11077 q->
ucov[ii]=ucov[ii];
11084 dxdxprim_ijk(geom->i, geom->j, geom->k, geom->p, dxdxp);
11086 *vmin=-1.0/dxdxp[dir][dir];
11087 *vmax=+1.0/dxdxp[dir][dir];
11117 mhd_calc_rad( pr, jj, ptrgeom, q, &(radstressdir[jj][0]) , NULL );
11120 else DLOOP(jj,kk) radstressdir[jj][kk]=0.0;
11135 radstressdir[jj]=term1[jj]+term2[jj];
11136 if(radstressdirabs!=NULL) radstressdirabs[jj]=fabs(term1[jj])+fabs(term2[jj]);
11143 radstressdir[jj]=term1[jj]+term2[jj];
11144 if(radstressdirabs!=NULL) radstressdirabs[jj]=fabs(term1[jj])+fabs(term2[jj]);
11150 radstressdir[jj]=0.0;
11151 if(radstressdirabs!=NULL) radstressdirabs[jj]=0.0;
11162 FTYPE F[NDIM-1]={pp[PRAD1],pp[PRAD2],pp[PRAD3]};
11164 FTYPE nx,ny,nz,nlen,f;
11169 nlen=sqrt(nx*nx+ny*ny+nz*nz);
11179 else f=(3.+4.*(nx*nx+ny*ny+nz*nz))/(5.+2.*sqrt(4.-3.*(nx*nx+ny*ny+nz*nz)));
11185 dualfprintf(fail_file,
"1 No Such EOMRADTYPE=%d\n",
EOMRADTYPE);
11194 Rij[0][1]=Rij[1][0]=0.0;
11195 Rij[0][2]=Rij[2][0]=0.0;
11196 Rij[0][3]=Rij[3][0]=0.0;
11199 Rij[0][1]=Rij[1][0]=F[0];
11200 Rij[0][2]=Rij[2][0]=F[1];
11201 Rij[0][3]=Rij[3][0]=F[2];
11207 dualfprintf(fail_file,
"2 No Such EOMRADTYPE=%d\n",
EOMRADTYPE);
11222 Rij[1][1]=E*(.5*(1.-f) + .5*(3.*f - 1.)*nx*nx);
11223 Rij[1][2]=E*(.5*(3.*f - 1.)*nx*ny);
11224 Rij[1][3]=E*(.5*(3.*f - 1.)*nx*nz);
11226 Rij[2][1]=E*(.5*(3.*f - 1.)*ny*nx);
11227 Rij[2][2]=E*(.5*(1.-f) + .5*(3.*f - 1.)*ny*ny);
11228 Rij[2][3]=E*(.5*(3.*f - 1.)*ny*nz);
11230 Rij[3][1]=E*(.5*(3.*f - 1.)*nz*nx);
11231 Rij[3][2]=E*(.5*(3.*f - 1.)*nz*ny);
11232 Rij[3][3]=E*(.5*(1.-f) + .5*(3.*f - 1.)*nz*nz);
11241 if(aa<bb)
return aa;
11247 if(x>0.)
return 1.;
11248 if(x<0.)
return -1.;
11249 if(x==0.)
return 0.;
11261 int inverse_44matrix(
FTYPE aa[][NDIM],
FTYPE ia[][NDIM])
11263 FTYPE mat[16],dst[16];
11267 mat[i*4+j]=aa[i][j];
11271 for (i = 0; i <4; i++)
11274 src[i+4]=mat[i*4+1];
11275 src[i+8]=mat[i*4+2];
11276 src[i+12]=mat[i*4+3];
11279 tmp[0] = src[10] * src[15];
11280 tmp[1] = src[11] * src[14];
11281 tmp[2] = src[9] * src[15];
11282 tmp[3] = src[11] * src[13];
11283 tmp[4] = src[9] * src[14];
11284 tmp[5] = src[10] * src[13];
11285 tmp[6] = src[8] * src[15];
11286 tmp[7] = src[11] * src[12];
11287 tmp[8] = src[8] * src[14];
11288 tmp[9] = src[10] * src[12];
11289 tmp[10] = src[8] * src[13];
11290 tmp[11] = src[9] * src[12];
11292 dst[0] = tmp[0]*src[5] + tmp[3]*src[6] + tmp[4]*src[7];
11293 dst[0] -= tmp[1]*src[5] + tmp[2]*src[6] + tmp[5]*src[7];
11294 dst[1] = tmp[1]*src[4] + tmp[6]*src[6] + tmp[9]*src[7];
11295 dst[1] -= tmp[0]*src[4] + tmp[7]*src[6] + tmp[8]*src[7];
11296 dst[2] = tmp[2]*src[4] + tmp[7]*src[5] + tmp[10]*src[7];
11297 dst[2] -= tmp[3]*src[4] + tmp[6]*src[5] + tmp[11]*src[7];
11298 dst[3] = tmp[5]*src[4] + tmp[8]*src[5] + tmp[11]*src[6];
11299 dst[3] -= tmp[4]*src[4] + tmp[9]*src[5] + tmp[10]*src[6];
11300 dst[4] = tmp[1]*src[1] + tmp[2]*src[2] + tmp[5]*src[3];
11301 dst[4] -= tmp[0]*src[1] + tmp[3]*src[2] + tmp[4]*src[3];
11302 dst[5] = tmp[0]*src[0] + tmp[7]*src[2] + tmp[8]*src[3];
11303 dst[5] -= tmp[1]*src[0] + tmp[6]*src[2] + tmp[9]*src[3];
11304 dst[6] = tmp[3]*src[0] + tmp[6]*src[1] + tmp[11]*src[3];
11305 dst[6] -= tmp[2]*src[0] + tmp[7]*src[1] + tmp[10]*src[3];
11306 dst[7] = tmp[4]*src[0] + tmp[9]*src[1] + tmp[10]*src[2];
11307 dst[7] -= tmp[5]*src[0] + tmp[8]*src[1] + tmp[11]*src[2];
11309 tmp[0] = src[2]*src[7];
11310 tmp[1] = src[3]*src[6];
11311 tmp[2] = src[1]*src[7];
11312 tmp[3] = src[3]*src[5];
11313 tmp[4] = src[1]*src[6];
11314 tmp[5] = src[2]*src[5];
11315 tmp[6] = src[0]*src[7];
11316 tmp[7] = src[3]*src[4];
11317 tmp[8] = src[0]*src[6];
11318 tmp[9] = src[2]*src[4];
11319 tmp[10] = src[0]*src[5];
11320 tmp[11] = src[1]*src[4];
11322 dst[8] = tmp[0]*src[13] + tmp[3]*src[14] + tmp[4]*src[15];
11323 dst[8] -= tmp[1]*src[13] + tmp[2]*src[14] + tmp[5]*src[15];
11324 dst[9] = tmp[1]*src[12] + tmp[6]*src[14] + tmp[9]*src[15];
11325 dst[9] -= tmp[0]*src[12] + tmp[7]*src[14] + tmp[8]*src[15];
11326 dst[10] = tmp[2]*src[12] + tmp[7]*src[13] + tmp[10]*src[15];
11327 dst[10]-= tmp[3]*src[12] + tmp[6]*src[13] + tmp[11]*src[15];
11328 dst[11] = tmp[5]*src[12] + tmp[8]*src[13] + tmp[11]*src[14];
11329 dst[11]-= tmp[4]*src[12] + tmp[9]*src[13] + tmp[10]*src[14];
11330 dst[12] = tmp[2]*src[10] + tmp[5]*src[11] + tmp[1]*src[9];
11331 dst[12]-= tmp[4]*src[11] + tmp[0]*src[9] + tmp[3]*src[10];
11332 dst[13] = tmp[8]*src[11] + tmp[0]*src[8] + tmp[7]*src[10];
11333 dst[13]-= tmp[6]*src[10] + tmp[9]*src[11] + tmp[1]*src[8];
11334 dst[14] = tmp[6]*src[9] + tmp[11]*src[11] + tmp[3]*src[8];
11335 dst[14]-= tmp[10]*src[11] + tmp[2]*src[8] + tmp[7]*src[9];
11336 dst[15] = tmp[10]*src[10] + tmp[4]*src[8] + tmp[9]*src[9];
11337 dst[15]-= tmp[8]*src[9] + tmp[11]*src[10] + tmp[5]*src[8];
11339 det=src[0]*dst[0]+src[1]*dst[1]+src[2]*dst[2]+src[3]*dst[3];
11347 if(debugfail>=2) dualfprintf(fail_file,
"idet (det=%26.15g idet=%26.15g) in inverse 4x4 zero or nan\n",det,idet);
11352 for (j = 0; j < 16; j++)
11357 ia[i][j]= dst[i*4+j];
11369 static int inverse_33matrix(
int sj,
int ej,
FTYPE aa[][NDIM],
FTYPE ia[][NDIM])
11372 FTYPE det = +aa[sj+0][sj+0]*(aa[sj+1][sj+1]*aa[sj+2][sj+2]-aa[sj+2][sj+1]*aa[sj+1][sj+2])
11373 -aa[sj+0][sj+1]*(aa[sj+1][sj+0]*aa[sj+2][sj+2]-aa[sj+1][sj+2]*aa[sj+2][sj+0])
11374 +aa[sj+0][sj+2]*(aa[sj+1][sj+0]*aa[sj+2][sj+1]-aa[sj+1][sj+1]*aa[sj+2][sj+0]);
11375 FTYPE idet = 1.0/det;
11376 ia[sj+0][sj+0] = (aa[sj+1][sj+1]*aa[sj+2][sj+2]-aa[sj+2][sj+1]*aa[sj+1][sj+2])*idet;
11377 ia[sj+1][sj+0] = -(aa[sj+0][sj+1]*aa[sj+2][sj+2]-aa[sj+0][sj+2]*aa[sj+2][sj+1])*idet;
11378 ia[sj+2][sj+0] = (aa[sj+0][sj+1]*aa[sj+1][sj+2]-aa[sj+0][sj+2]*aa[sj+1][sj+1])*idet;
11379 ia[sj+0][sj+1] = -(aa[sj+1][sj+0]*aa[sj+2][sj+2]-aa[sj+1][sj+2]*aa[sj+2][sj+0])*idet;
11380 ia[sj+1][sj+1] = (aa[sj+0][sj+0]*aa[sj+2][sj+2]-aa[sj+0][sj+2]*aa[sj+2][sj+0])*idet;
11381 ia[sj+2][sj+1] = -(aa[sj+0][sj+0]*aa[sj+1][sj+2]-aa[sj+1][sj+0]*aa[sj+0][sj+2])*idet;
11382 ia[sj+0][sj+2] = (aa[sj+1][sj+0]*aa[sj+2][sj+1]-aa[sj+2][sj+0]*aa[sj+1][sj+1])*idet;
11383 ia[sj+1][sj+2] = -(aa[sj+0][sj+0]*aa[sj+2][sj+1]-aa[sj+2][sj+0]*aa[sj+0][sj+1])*idet;
11384 ia[sj+2][sj+2] = (aa[sj+0][sj+0]*aa[sj+1][sj+1]-aa[sj+1][sj+0]*aa[sj+0][sj+1])*idet;
11387 if(debugfail>=2) dualfprintf(fail_file,
"inverse_33matrix got singular det=%g idet=%g\n",det,idet);
11401 static int inverse_11matrix(
int sj,
int ej,
FTYPE aa[][NDIM],
FTYPE ia[][NDIM])
11406 ia[sj][sj]=1.0/aa[sj][sj];
11409 if(debugfail>=2) dualfprintf(fail_file,
"inverse 1x1 zero or nan\n",aa[sj][sj]);
11432 int prad_fforlab(
int *whichvel,
int *
whichcoord,
int whichdir,
int i,
int j,
int k,
int loc,
struct of_geom *ptrgeom,
FTYPE *pradffortho,
FTYPE *pin,
FTYPE *pout)
11435 if(whichdir==
FF2LAB)
prad_fftolab(whichvel, whichcoord, i, j, k, loc, ptrgeom, pradffortho, pin, pout);
11436 else if(whichdir==
LAB2FF)
prad_labtoff(whichvel, whichcoord, i, j, k, loc, ptrgeom, pradffortho, pin, pout);
11438 dualfprintf(fail_file,
"prad_fforlab() not yet setup for whichdir=%d.",whichdir);
11457 ptrgeom=&geomdontuse;
11474 #if(0) // STAY AS ZERO
11492 DLOOPA(jj) pradffortho[PRAD0+jj] = Uff[jj];
11500 indices_2122(Rijlab,Rijlab,ptrgeom);
11513 DLOOPA(jj) pradffortho[PRAD0+jj] = Rijff[
TT][jj];
11519 PLOOP(pliter,pl) pout[pl]=pin[pl];
11532 struct of_geom geomtousedontuse;
11533 struct of_geom *ptrgeomtouse=&geomtousedontuse;
11540 gset_genloc(getprim,*whichcoord,i,j,k,loc,ptrgeomtouse);
11548 ptrgeomtouse=ptrgeom;
11554 PLOOP(pliter,pl) pout[pl]=pin[pl];
11590 indices_2221(Rijlab,Rijlab,ptrgeomtouse);
11595 #if(0) // STAY ZERO NOW
11597 FTYPE alpha=ptrgeomtouse->alphalapse;
11598 U[URAD0]=Rijlab[
TT][
TT]/alpha;
11599 U[URAD1]=Rijlab[
TT][
RR]/alpha;
11600 U[URAD2]=Rijlab[
TT][
TH]/alpha;
11601 U[URAD3]=Rijlab[
TT][
PH]/alpha;
11603 U[URAD0]=Rijlab[
TT][
TT];
11604 U[URAD1]=Rijlab[
TT][
RR];
11605 U[URAD2]=Rijlab[
TT][
TH];
11606 U[URAD3]=Rijlab[
TT][
PH];
11615 int showmessages=1;
11616 int allowlocalfailurefixandnoreport=1;
11630 ucon2pr(*whichvel,uconback,ptrgeomtouse,pout);
11633 ucon2pr(*whichvel,uconback,ptrgeomtouse,&pout[URAD1-
U1]);
11642 dualfprintf(fail_file,
"Failed to invert during prad_fftolab(). Assuming fixups won't be applied: %d %d\n",lpflag,lpflagrad);
11643 dualfprintf(fail_file,
"ijk=%d %d %d : %d\n",ptrgeomtouse->i,ptrgeomtouse->j,ptrgeomtouse->k,ptrgeomtouse->p);
11644 PLOOP(pliter,pl) dualfprintf(fail_file,
"pl=%d pin=%g U=%g\n",pl,pin[pl],U[pl]);
11645 DLOOPA(jj) dualfprintf(fail_file,
"jj=%d ucon=%g\n",jj,ucon[jj]);
11646 DLOOP(jj,kk) dualfprintf(fail_file,
"jj=%d kk=%d Rijff=%g Rijlab=%g\n",jj,kk,Rijff[jj][kk],Rijlab[jj][kk]);
11647 DLOOP(jj,kk) dualfprintf(fail_file,
"jj=%d kk=%d gcov=%g gcon=%g\n",jj,kk,ptrgeomtouse->gcov[
GIND(jj,kk)],ptrgeomtouse->gcon[
GIND(jj,kk)]);
11648 PLOOP(pliter,pl) dualfprintf(fail_file,
"pl=%d pout=%g\n",pl,pout[pl]);
11660 dualfprintf(fail_file,
"Fixups applied during invert during prad_fftolab(): %d %d\n",lpflag,lpflagrad);
11661 dualfprintf(fail_file,
"ijk=%d %d %d : %d\n",ptrgeomtouse->i,ptrgeomtouse->j,ptrgeomtouse->k,ptrgeomtouse->p);
11690 int loc=ptrgeom->p;
11693 PLOOP(pliter,pl) pout[pl]=pin[pl];
11697 struct of_geom geomrealdontuse;
11698 struct of_geom *ptrgeomreal=&geomrealdontuse;
11699 gset_genloc(getprim,*whichcoord,i,j,k,loc,ptrgeomreal);
11707 if(*whichcoord!=
MCOORD){
11708 dualfprintf(fail_file,
"primefluid_EVrad_to_primeall() needs whichcoord (%d) to be MCOORD (%d)\n",whichcoord,
MCOORD);
11715 ucon2pr(
WHICHVEL,uradcon,ptrgeom,&pout[URAD1-
U1]);
11732 int i=ptrgeomprimecoords->i;
11733 int j=ptrgeomprimecoords->j;
11734 int k=ptrgeomprimecoords->k;
11735 int loc=ptrgeomprimecoords->p;
11741 PLOOP(pliter,pl) pout[pl]=pin[pl];
11751 struct of_geom geomrealraddontuse;
11752 struct of_geom *ptrgeomrealrad=&geomrealraddontuse;
11753 struct of_geom geomrealfluiddontuse;
11754 struct of_geom *ptrgeomrealfluid=&geomrealfluiddontuse;
11757 gset_genloc(getprim,*whichcoordrad,i,j,k,loc,ptrgeomrealrad);
11759 else ptrgeomrealrad=ptrgeomprimecoords;
11762 gset_genloc(getprim,*whichcoordfluid,i,j,k,loc,ptrgeomrealfluid);
11764 else ptrgeomrealfluid=ptrgeomprimecoords;
11769 if(*whichcoordfluid!=*whichcoordrad){
11774 if (pr2ucon(*whichvel,pout, ptrgeomrealfluid, ucon) >= 1)
FAILSTATEMENT(
"bounds.koral.c:bl2met2metp2v_genloc() for radiation",
"pr2ucon()", 2);
11788 coordtrans(*whichcoordfluid,*whichcoordrad,i,j,k,loc,ucon);
11792 ucon2pr(*whichvel,ucon,ptrgeomrealrad,pout);
11795 *whichcoordfluid=*whichcoordrad;
11810 int whichframedir=
FF2LAB;
11811 prad_fforlab(whichvel, whichcoordrad, whichframedir, i, j, k, loc, ptrgeomrealrad, pradffortho, pout, pout);
11822 if(*whichcoordrad==
MCOORD){
11825 FAILSTATEMENT(
"bounds.koral.c:bound_radatmbeaminflow()",
"bl2ks2ksp2v()", 1);
11846 for(i=0;i<
NDIM;i++)
11848 for(j=0;j<
NDIM;j++)
11851 for(k=0;k<
NDIM;k++)
11853 Tt[
i][
j]+=T1[
i][k]*ptrgeom->gcov[
GIND(k,j)];
11858 for(i=0;i<
NDIM;i++)
11860 for(j=0;j<
NDIM;j++)
11878 for(i=0;i<
NDIM;i++)
11880 for(j=0;j<
NDIM;j++)
11883 for(k=0;k<
NDIM;k++)
11885 Tt[
i][
j]+=T1[k][
j]*ptrgeom->gcov[
GIND(k,i)];
11890 for(i=0;i<
NDIM;i++)
11892 for(j=0;j<
NDIM;j++)
11907 for(i=0;i<
NDIM;i++)
11909 for(j=0;j<
NDIM;j++)
11912 for(k=0;k<
NDIM;k++)
11914 Tt[
i][
j]+=T1[
i][k]*ptrgeom->gcon[
GIND(k,j)];
11919 for(i=0;i<
NDIM;i++)
11921 for(j=0;j<
NDIM;j++)
11939 for(i=0;i<
NDIM;i++)
11942 for(k=0;k<
NDIM;k++)
11944 At[
i]+=A1[k]*ptrgeom->gcov[
GIND(i,k)];
11948 for(i=0;i<
NDIM;i++)
11965 for(i=0;i<
NDIM;i++)
11968 for(k=0;k<
NDIM;k++)
11970 At[
i]+=A1[k]*ptrgeom->gcon[
GIND(i,k)];
11974 for(i=0;i<
NDIM;i++)
11987 int u2p_rad_orig(
int showmessages,
int allowlocalfailurefixandnoreport,
FTYPE gammamaxrad,
FTYPE *uu,
FTYPE *pin,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
PFTYPE *lpflagrad);
11988 int u2p_rad_new_pre(
int showmessages,
int allowlocalfailurefixandnoreport,
FTYPE gammamaxrad,
FTYPE *uu,
FTYPE *pin,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
PFTYPE *lpflagrad);
12001 if(fabs(uu[URAD0]<=2.0*10.0*
ERADLIMIT)){
12006 SLOOPA(jj) pin[URAD1+jj-1] = 0.0;
12020 PLOOP(pliter,pl) prorig[pl] = pin[pl];
12022 #if(WHICHU2PRAD==0)
12023 toreturn=u2p_rad_orig(showmessages, allowlocalfailurefixandnoreport, gammamaxrad, uu, pin, ptrgeom,lpflag, lpflagrad);
12026 toreturn=
u2p_rad_new(showmessages, allowlocalfailurefixandnoreport, gammamaxrad, whichcap, uu, pin, ptrgeom,lpflag, lpflagrad);
12038 if(!finite(pin[URAD0]) || !finite(pin[URAD1]) || !finite(pin[URAD2]) || !finite(pin[URAD3])){
12046 dualfprintf(fail_file,
"u2p_rad() generated nan result: %d %d %g %d\n",showmessages, allowlocalfailurefixandnoreport, gammamaxrad, whichcap);
12047 PLOOP(pliter,pl) dualfprintf(fail_file,
"u2p_rad: pl=%d prorig=%21.15g uu=%21.15g pin=%21.15g\n",pl,prorig[pl],uu[pl],pin[pl]);
12056 SLOOPA(jj) pin[URAD1+jj-1] = 0.0;
12076 int u2p_rad_new_pre(
int showmessages,
int allowlocalfailurefixandnoreport,
FTYPE gammamaxrad,
FTYPE *uu,
FTYPE *pin,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
PFTYPE *lpflagrad)
12078 static long long int numyvarneg,numyvarbig,numErneg,nummod;
12079 int recomputegamma=0;
12081 #if(WHICHVEL!=VELREL4)
12082 dualfprintf(fail_file,
"u2p_rad() only setup for relative 4-velocity, currently.\n");
12090 PLOOP(pliter,pl) pp[pl]=pin[pl];
12100 FTYPE Er,Utildesq,Utildecon[NDIM];
12113 yvar = Utildesq / (ERADLIMIT*ERADLIMIT + Ersq);
12126 FTYPE gammasq,gamma;
12127 FTYPE gammamax=gammamaxrad;
12128 FTYPE gammamaxsq=gammamax*gammamax;
12129 FTYPE ylimit = 16.0*gammamaxsq*(gammamaxsq-1.0)/((4.0*gammamaxsq-1.0)*(4.0*gammamaxsq-1.0));
12138 else if(yvar>ylimit){
12140 gammasq = gammamaxsq;
12147 gammasq = (2.0 - yvar + sqrt(4.0-3.0*yvar))/ (4.0*(1.0-yvar));
12148 gamma=sqrt(gammasq);
12158 FTYPE pr = Er/(4.0*gammasq-1.0);
12164 SLOOPA(jj) urfconrel[jj] = (Utildecon[jj]/(4.0*pr*gamma));
12171 SLOOPA(jj) urfconrel[jj] = 0.0;
12183 pin[PRAD1]=urfconrel[1];
12184 pin[PRAD2]=urfconrel[2];
12185 pin[PRAD3]=urfconrel[3];
12195 FTYPE gammanew,qsqnew;
12200 FTYPE fvar=sqrt((gamma*gamma-1.0)/(gammanew*gammanew-1.0));
12202 SLOOPA(jj) urfconrel[jj] *= fvar;
12205 SLOOPA(jj) urfconrel[jj] *= 0.0;
12213 pin[PRAD1]=urfconrel[1];
12214 pin[PRAD2]=urfconrel[2];
12215 pin[PRAD3]=urfconrel[3];
12225 FTYPE Ernew,Utildesqnew,Utildeconnew;
12226 compute_ZAMORAD(&Rtnu[0-URAD0], ptrgeom, &Ernew, &Utildesqnew, &Utildeconnew);
12227 Erf = Erf*
MIN(1.0,Er/Ernew);
12243 pin[PRAD1]=urfconrel[1];
12244 pin[PRAD2]=urfconrel[2];
12245 pin[PRAD3]=urfconrel[3];
12253 #if(EVOLVENRAD&&NRAD>0)
12255 FTYPE gammafinal,qsqfinal;
12257 else gammafinal=gamma;
12258 FTYPE uradt=gammafinal/(ptrgeom->alphalapse);
12259 pin[NRAD] = uu[NRAD]/uradt;
12271 static long int nstepold=-1;
12272 if(nstep!=nstepold && nstep%100==0 && ptrgeom->i==0 && ptrgeom->j==0 && ptrgeom->k==0 && steppart==0){
12274 dualfprintf(fail_file,
"numyvarneg=%lld numyvarbig=%lld numErneg=%lld nummod=%lld : nstep=%ld\n",numyvarneg,numyvarbig,numErneg,nummod,nstep);
12279 if(
DORADFIXUPS==1 || allowlocalfailurefixandnoreport==0){
12302 static long long int numyvarneg,numyvarbig,numErneg,nummod;
12303 int recomputegamma=0;
12305 #if(WHICHVEL!=VELREL4)
12306 dualfprintf(fail_file,
"u2p_rad() only setup for relative 4-velocity, currently.\n");
12314 PLOOP(pliter,pl) pp[pl]=pin[pl];
12328 FTYPE gammasq,gamma,qsq;
12329 FTYPE gammamax=gammamaxrad;
12330 FTYPE gammamaxsq=gammamax*gammamax;
12331 FTYPE ylimit = 16.0*gammamaxsq*(gammamaxsq-1.0)/((4.0*gammamaxsq-1.0)*(4.0*gammamaxsq-1.0));
12335 int didmodEr=0,didmody=0,gotbigy=0;
12368 if(didmodEr) didmod=didmody=1;
12371 pr = Er/(4.0*gammasq-1.0);
12373 Erf = pr/(4.0/3.0-1.0);
12375 else if(yvar>ylimit){
12376 gammasq = gammamaxsq;
12383 pr = Er/(4.0*gammasq-1.0);
12385 Erf = pr/(4.0/3.0-1.0);
12389 gammasq = (2.0 - yvar + sqrt(4.0-3.0*yvar))/ (4.0*(1.0-yvar));
12390 gamma=sqrt(gammasq);
12392 pr = Er/(4.0*gammasq-1.0);
12394 Erf = pr/(4.0/3.0-1.0);
12407 if(didmody==0 && didmodEr==0){
12410 SLOOPA(jj) urfconrel[jj] = gamma*(Utildecon[jj]/(4.0*pr*gammasq));
12424 SLOOPA(jj) urfconrel[jj] = 0.0;
12432 SLOOPA(jj) urfconrel[jj] = gamma*(Utildecon[jj]/(4.0*pr*gammasq));
12433 if(yvar>=1.0)
SLOOPA(jj) urfconrel[jj]*=gamma;
12439 SLOOPA(jj) urfconrel[jj] = gamma*Utildecon[jj]/Utildeabs;
12443 FTYPE gammanew,qsqnew;
12452 FTYPE fvar=sqrt((gammamax*gammamax-1.0)/(gammanew*gammanew-1.0));
12453 SLOOPA(jj) urfconrel[jj] *= fvar;
12455 FTYPE gammaneworig=gammanew;
12459 gammasq=gammanew*gammanew;
12463 SLOOPA(jj) urfconrel[jj] *= 0.0;
12476 Er =
ERADLIMIT + sqrt(fabs(Utildesq)/ylimit);
12477 pr=Er/(4.0*gammasq-1.0);
12480 Erf = pr/(4.0/3.0-1.0);
12483 if(Erforig<Erf && whichcap==
CAPTYPEFIX1) Erf=Erforig;
12497 SLOOPA(jj) urfconrel[jj] = 0.0;
12501 SLOOPA(jj) urfconrel[jj] = gamma*(Utildecon[jj]/(4.0*pr*gammasq));
12504 FTYPE gammanew,qsqnew;
12511 FTYPE fvar=sqrt((gammasq-1.0)/(gammanew*gammanew-1.0));
12512 SLOOPA(jj) urfconrel[jj] *= fvar;
12515 SLOOPA(jj) urfconrel[jj] *= 0.0;
12529 dualfprintf(fail_file,
"No such whichcap=%d\n",whichcap);
12547 pin[PRAD1]=urfconrel[1];
12548 pin[PRAD2]=urfconrel[2];
12549 pin[PRAD3]=urfconrel[3];
12558 #if(EVOLVENRAD&&NRAD>0)
12560 FTYPE gammafinal,qsqfinal;
12562 else gammafinal=gamma;
12564 FTYPE uradt=gammafinal/(ptrgeom->alphalapse);
12565 pin[NRAD] = uu[NRAD]/uradt;
12580 #if(DOYFL==2 && (YFL4>=0 || YFL5>=0))
12584 FTYPE gammafinal,qsqfinal;
12586 else gammafinal=gamma;
12587 FTYPE uradt=gammafinal/(ptrgeom->alphalapse);
12589 pin[YFL4] = -uu[YFL4]/uradt;
12592 if(YFL5>=0) pin[YFL5] = uu[YFL5]/uradt;
12622 static long int nstepold=-1;
12623 if(nstep!=nstepold && nstep%100==0 && ptrgeom->i==0 && ptrgeom->j==0 && ptrgeom->k==0 && steppart==0){
12625 dualfprintf(fail_file,
"numyvarneg=%lld numyvarbig=%lld numErneg=%lld nummod=%lld : nstep=%ld\n",numyvarneg,numyvarbig,numErneg,nummod,nstep);
12635 if(
DORADFIXUPS==1 || allowlocalfailurefixandnoreport==0){
12662 etacov[
TT] = -ptrgeom->alphalapse;
12663 SLOOPA(jj) etacov[jj]=0.0;
12665 raise_vec(etacov,ptrgeom,etacon);
12668 DLOOPA(jj) Ucov[jj] = ptrgeom->alphalapse*uu[URAD0+jj];
12670 raise_vec(Ucov,ptrgeom,Ucon);
12673 DLOOPA(jj) Utildecon[jj]=0.0;
12674 DLOOP(jj,kk) Utildecon[jj] += (
delta(jj,kk) + etacon[jj]*etacov[kk])*Ucon[kk];
12676 lower_vec(Utildecon,ptrgeom,Utildecov);
12680 DLOOPA(jj) *Utildesq += Utildecon[jj]*Utildecov[jj];
12684 DLOOPA(jj) *Er += -Ucov[jj]*etacon[jj];
12729 int u2p_rad_orig(
int showmessages,
int allowlocalfailurefixandnoreport,
FTYPE gammamaxrad,
FTYPE *uu,
FTYPE *pin,
struct of_geom *ptrgeom,
PFTYPE *lpflag,
PFTYPE *lpflagrad)
12735 PLOOP(pliter,pl) globaluu[pl]=uu[pl];
12736 PLOOP(pliter,pl) globalpin[pl]=pin[pl];
12739 dualfprintf(fail_file,
"u2p_rad() only setup for relative 4-velocity, currently.\n");
12745 PLOOP(pliter,pl) pp[pl]=pin[pl];
12757 FTYPE Avcov[
NDIM]={uu[URAD0],uu[URAD1],uu[URAD2],uu[URAD3]};
12760 indices_12(Avcov,Avcon,ptrgeom);
12772 urfconrel[1]=pp[PRAD1]=pp[
U1];
12773 urfconrel[2]=pp[PRAD2]=pp[
U2];
12774 urfconrel[3]=pp[PRAD3]=pp[
U3];
12777 FTYPE gammarel,qsq;
12779 gammarel2=gammarel*gammarel;
12781 FTYPE alpha=ptrgeom->alphalapse;
12783 Erf=3.*Avcon[0]*alpha*alpha/(4.*gammarel2-1.0);
12793 FTYPE Avconnew[
NDIM]={Avcon[0],Avcon[1],Avcon[2],Avcon[3]};
12795 FTYPE gammarel2new,deltanew,numeratornew,divisornew,Erfnew;
12807 if(
CASECHOICE==
JONCHOICE)
get_m1closure_urfconrel(showmessages,allowlocalfailurefixandnoreport,ptrgeom,pp,Avcon,Avcov,gammarel2,delta,numerator,divisor,&Erf,urfconrel,lpflag,lpflagrad);
12808 else if(
CASECHOICE==
OLEKCHOICE)
get_m1closure_urfconrel_olek(showmessages,allowlocalfailurefixandnoreport,ptrgeom,pp,Avcon,Avcov,gammarel2,delta,&Erf,urfconrel,lpflag,lpflagrad);
12813 get_m1closure_urfconrel_olek(showmessages,allowlocalfailurefixandnoreport,ptrgeom,pp,Avcon,Avcov,gammarel2,delta,&Erf2,urfconrel2,lpflag,lpflagrad);
12816 if( fabs(Erf2-Erf)/(fabs(Erf2)+fabs(Erf))>ERRORCHECK || fabs(urfconrel2[1]-urfconrel[1])/(fabs(urfconrel2[1])+fabs(urfconrel[1]))>ERRORCHECK || fabs(urfconrel2[2]-urfconrel[2])/(fabs(urfconrel2[2])+fabs(urfconrel[2]))>ERRORCHECK || fabs(urfconrel2[3]-urfconrel[3])/(fabs(urfconrel2[3])+fabs(urfconrel[3]))>ERRORCHECK){
12817 dualfprintf(fail_file,
"JONVSOLEK: ijk=%d %d %d : nstep=%ld steppart=%d : %g %g %g %g : %g %g %g %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,Erf,urfconrel[1],urfconrel[2],urfconrel[3],Erf2,urfconrel2[1],urfconrel2[2],urfconrel2[3]);
12820 if( fabs(Erf2-Erf)/(fabs(Erf2)+fabs(Erf))>ERRORCHECK || fabs(urfconrel2[1]-urfconrel[1])/(fabs(urfconrel2[1])+fabs(urfconrel[1]))>ERRORCHECK || fabs(urfconrel2[2]-urfconrel[2])/(fabs(urfconrel2[2])+fabs(urfconrel[2]))>ERRORCHECK || fabs(urfconrel2[3]-urfconrel[3])/(fabs(urfconrel2[3])+fabs(urfconrel[3]))>ERRORCHECK){
12821 dualfprintf(fail_file,
"JONVSOLEK: ijk=%d %d %d : nstep=%ld steppart=%d : %g %g %g %g : %g %g %g %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,Erf,urfconrel[1],urfconrel[2],urfconrel[3],Erf2,urfconrel2[1],urfconrel2[2],urfconrel2[3]);
12827 dualfprintf(fail_file,
"No such EOMRADTYPE=%d in u2p_rad()\n",
EOMRADTYPE);
12834 pin[PRAD1]=urfconrel[1];
12835 pin[PRAD2]=urfconrel[2];
12836 pin[PRAD3]=urfconrel[3];
12843 #if(EVOLVENRAD&&NRAD>0)
12845 FTYPE gammafinal,qsqfinal;
12847 FTYPE uradt=gammafinal/(ptrgeom->alphalapse);
12848 pin[NRAD] = uu[NRAD]/uradt;
12863 #if(DOYFL==2 && (YFL4>=0 || YFL5>=0))
12867 FTYPE gammafinal,qsqfinal;
12869 FTYPE uradt=gammafinal/(ptrgeom->alphalapse);
12871 pin[YFL4] = -uu[YFL4]/uradt;
12874 if(YFL5>=0) pin[YFL5] = uu[YFL5]/uradt;
12884 if(
DORADFIXUPS==1 || allowlocalfailurefixandnoreport==0){
12904 FTYPE alpha=ptrgeom->alphalapse;
12908 FTYPE gammafluid,gammarel2fluid,qsqfluid,Erffluid;
12910 gammarel2fluid=gammafluid*gammafluid;
12914 FTYPE gammarad,gammarel2rad,qsqrad,Erfrad;
12916 gammarel2rad=gammarad*gammarad;
12924 FTYPE tautotmaxlim=(1.0 - 1.0/(1.0+fabs(tautotmax)));
12926 *Erfnew = (1.0-tautotmaxlim)*Erfrad + tautotmaxlim*Erffluid;
12927 SLOOPA(jj) urfconrel[jj] = (1.0-tautotmaxlim)*pp[URAD1+jj-1] + tautotmaxlim*pp[
U1+jj-1];
12929 dualfprintf(fail_file,
"i=%d tautotmax=%g tautotmaxlim=%g\n",ptrgeom->i,tautotmax,tautotmaxlim);
12930 SLOOPA(jj) dualfprintf(fail_file,
"jj=%d Erfrad=%g Erffluid=%g gammarad=%g gammafluid=%g Erfnew=%g urfconrel=%g\n",jj,Erfrad,Erffluid,gammarad,gammafluid,*Erfnew,urfconrel[jj]);
12938 static int get_m1closure_gammarel2_old(
int showmessages,
struct of_geom *ptrgeom,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE *gammarel2return,
FTYPE *deltareturn,
FTYPE *numeratorreturn,
FTYPE *divisorreturn)
12940 FTYPE gamma2,gammarel2,
delta,numerator,divisor;
12948 DLOOP(jj,kk) gRR += ptrgeom->
gcov[
GIND(jj,kk)]*Avcon[jj]*Avcon[kk];
12955 b=8.*(gRR*ptrgeom->
gcon[
GIND(0,0)]+Avcon[0]*Avcon[0]);
12956 c=ptrgeom->
gcon[GIND(0,0)]*(gRR*ptrgeom->
gcon[GIND(0,0)]-Avcon[0]*Avcon[0]);
12959 numerator=0.5*(-b-sqrt(delta));
12962 gamma2=numerator/divisor;
12965 numerator=0.5*(-b+sqrt(delta));
12967 gamma2= numerator/divisor;
12970 *numeratorreturn=numerator;
12971 *divisorreturn=divisor;
12980 static FTYPE gctt, gv11, gv12, gv13, gv14, gv22, gv23, gv24, gv33, gv34, gv44, Rtt, Rtx, Rty, Rtz;
12981 gv11=ptrgeom->gcov[
GIND(0,0)];
12982 gv12=ptrgeom->gcov[
GIND(0,1)];
12983 gv13=ptrgeom->gcov[
GIND(0,2)];
12984 gv14=ptrgeom->gcov[
GIND(0,3)];
12985 gv22=ptrgeom->gcov[
GIND(1,1)];
12986 gv23=ptrgeom->gcov[
GIND(1,2)];
12987 gv24=ptrgeom->gcov[
GIND(1,3)];
12988 gv33=ptrgeom->gcov[
GIND(2,2)];
12989 gv34=ptrgeom->gcov[
GIND(2,3)];
12990 gv44=ptrgeom->gcov[
GIND(3,3)];
12995 gctt=ptrgeom->gcon[
GIND(0,0)];
12997 delta = (1. + 3.*gctt*gv11)*((Rtt)*(Rtt)) +
12998 6.*gctt*Rtt*(gv12*Rtx + gv13*Rty + gv14*Rtz) +
12999 3.*gctt*(gv22*((Rtx)*(Rtx)) + 2.*gv23*Rtx*Rty + gv33*((Rty)*(Rty)) +
13000 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*((Rtz)*(Rtz)));
13002 divisor=(gv11*((Rtt)*(Rtt)) + 2.*gv12*Rtt*Rtx + gv22*((Rtx)*(Rtx)) + 2.*gv13*Rtt*Rty +
13003 2.*gv23*Rtx*Rty + gv33*((Rty)*(Rty)) + 2.*(gv14*Rtt + gv24*Rtx + gv34*Rty)*Rtz +
13004 gv44*((Rtz)*(Rtz)));
13006 numerator=(-0.25*((1. + gctt*gv11)*((Rtt)*(Rtt)) +
13007 gctt*(gv22*((Rtx)*(Rtx)) + 2.*gv23*Rtx*Rty + gv33*((Rty)*(Rty)) +
13008 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*((Rtz)*(Rtz))) +
13009 Rtt*(2.*gctt*(gv12*Rtx + gv13*Rty + gv14*Rtz) +
13012 gamma2 = numerator/divisor;
13021 FTYPE alpha=ptrgeom->alphalapse;
13025 gammarel2 = gamma2*alpha*alpha;
13035 *gammarel2return=gammarel2;
13036 *deltareturn=
delta;
13037 *numeratorreturn=numerator;
13038 *divisorreturn=divisor;
13057 FTYPE gamma2,gammarel2,
delta,numerator,divisor;
13058 FTYPE gamma2a,gamma2b;
13063 static FTYPE gctt, gn11, gn12, gn13, gn14, gn22, gn23, gn24, gn33, gn34, gn44, Rtt, Rtx, Rty, Rtz, Rdtt, Rdtx, Rdty, Rdtz;
13064 gn11=ptrgeom->gcon[
GIND(0,0)];
13065 gn12=ptrgeom->gcon[
GIND(0,1)];
13066 gn13=ptrgeom->gcon[
GIND(0,2)];
13067 gn14=ptrgeom->gcon[
GIND(0,3)];
13068 gn22=ptrgeom->gcon[
GIND(1,1)];
13069 gn23=ptrgeom->gcon[
GIND(1,2)];
13070 gn24=ptrgeom->gcon[
GIND(1,3)];
13071 gn33=ptrgeom->gcon[
GIND(2,2)];
13072 gn34=ptrgeom->gcon[
GIND(2,3)];
13073 gn44=ptrgeom->gcon[
GIND(3,3)];
13085 gamma2a=(-0.25*(2.*
Power(gn11,2)*
Power(Rdtt,2) + (gn12*Rdtx + gn13*Rdty + gn14*Rdtz)*
13086 (gn12*Rdtx + gn13*Rdty + gn14*Rdtz +
Sqrt(4.*
Power(gn11,2)*
Power(Rdtt,2) +
Power(gn12*Rdtx + gn13*Rdty + gn14*Rdtz,2) +
13087 gn11*(8.*gn12*Rdtt*Rdtx + 3.*gn22*
Power(Rdtx,2) + 8.*gn13*Rdtt*Rdty + 6.*gn23*Rdtx*Rdty + 3.*gn33*
Power(Rdty,2) +
13088 8.*gn14*Rdtt*Rdtz + 6.*gn24*Rdtx*Rdtz + 6.*gn34*Rdty*Rdtz + 3.*gn44*
Power(Rdtz,2)))) +
13089 gn11*(4.*gn12*Rdtt*Rdtx + gn22*
Power(Rdtx,2) + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) + 2.*gn24*Rdtx*Rdtz +
13090 2.*gn34*Rdty*Rdtz + gn44*
Power(Rdtz,2) + Rdtt*
13091 (4.*gn13*Rdty + 4.*gn14*Rdtz +
Sqrt(4.*
Power(gn11,2)*
Power(Rdtt,2) +
Power(gn12*Rdtx + gn13*Rdty + gn14*Rdtz,2) +
13092 gn11*(8.*gn12*Rdtt*Rdtx + 3.*gn22*
Power(Rdtx,2) + 8.*gn13*Rdtt*Rdty + 6.*gn23*Rdtx*Rdty + 3.*gn33*
Power(Rdty,2) +
13093 8.*gn14*Rdtt*Rdtz + 6.*gn24*Rdtx*Rdtz + 6.*gn34*Rdty*Rdtz + 3.*gn44*
Power(Rdtz,2)))))))/
13094 (gn11*
Power(Rdtt,2) + 2.*gn12*Rdtt*Rdtx + gn22*
Power(Rdtx,2) + 2.*gn13*Rdtt*Rdty + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) +
13095 2.*(gn14*Rdtt + gn24*Rdtx + gn34*Rdty)*Rdtz + gn44*
Power(Rdtz,2));
13099 gamma2b=(0.25*(-2.*
Power(gn11,2)*
Power(Rdtt,2) - 1.*gn11*(4.*gn12*Rdtt*Rdtx + gn22*
Power(Rdtx,2) +
13100 Rdty*(4.*gn13*Rdtt + 2.*gn23*Rdtx + gn33*Rdty) + 2.*(2.*gn14*Rdtt + gn24*Rdtx + gn34*Rdty)*Rdtz + gn44*
Power(Rdtz,2)) +
13101 gn11*Rdtt*
Sqrt(4.*
Power(gn11,2)*
Power(Rdtt,2) +
Power(gn12*Rdtx + gn13*Rdty + gn14*Rdtz,2) +
13102 gn11*(8.*gn12*Rdtt*Rdtx + 3.*gn22*
Power(Rdtx,2) + 8.*gn13*Rdtt*Rdty + 6.*gn23*Rdtx*Rdty + 3.*gn33*
Power(Rdty,2) +
13103 8.*gn14*Rdtt*Rdtz + 6.*gn24*Rdtx*Rdtz + 6.*gn34*Rdty*Rdtz + 3.*gn44*
Power(Rdtz,2))) +
13104 (gn12*Rdtx + gn13*Rdty + gn14*Rdtz)*(-1.*gn12*Rdtx - 1.*gn13*Rdty - 1.*gn14*Rdtz +
13106 gn11*(8.*gn12*Rdtt*Rdtx + 3.*gn22*
Power(Rdtx,2) + 8.*gn13*Rdtt*Rdty + 6.*gn23*Rdtx*Rdty + 3.*gn33*
Power(Rdty,2) +
13107 8.*gn14*Rdtt*Rdtz + 6.*gn24*Rdtx*Rdtz + 6.*gn34*Rdty*Rdtz + 3.*gn44*
Power(Rdtz,2))))))/
13108 (gn11*
Power(Rdtt,2) + 2.*gn12*Rdtt*Rdtx + gn22*
Power(Rdtx,2) + 2.*gn13*Rdtt*Rdty + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) +
13109 2.*(gn14*Rdtt + gn24*Rdtx + gn34*Rdty)*Rdtz + gn44*
Power(Rdtz,2));
13122 FTYPE alpha=ptrgeom->alphalapse;
13126 gammarel2 = gamma2*alpha*alpha;
13136 *gammarel2return=gammarel2;
13137 *deltareturn=delta=0;
13138 *numeratorreturn=numerator=0;
13139 *divisorreturn=divisor=0;
13153 FTYPE alpha=ptrgeom->alphalapse;
13161 *Erfreturn = 3.*Avcon[0]*alpha*alpha/(4.*gammarel2-1.0);
13169 static int get_m1closure_urfconrel_old(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE numerator,
FTYPE divisor,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad)
13171 FTYPE Erf=*Erfreturn;
13193 int failure1=Avcon[0]<0.0 || (gammarel2>0.0 && gammarel2<=0.25L && delta>=0.0 && divisor!=0.0) || numerator==0.0 || gammarel2>=1.0 && delta>=0.0 && divisor!=0.0 && Erf<
ERADLIMIT;
13195 int failure2=gammarel2<1.0 && gammarel2>0.0 && delta>=0.0;
13197 int failure3=gammarel2>gammamax*gammamax && Erf>=ERADLIMIT || gammarel2<0.0 || delta<0. || divisor==0.0 && numerator==0.0 || divisor==0.0 && numerator!=0.0;
13203 FTYPE gammarel=sqrt(gammarel2);
13204 FTYPE alpha=ptrgeom->alphalapse;
13206 SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->
gcon[
GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13222 SLOOPA(jj) urfconrel[jj] = 0.0;
13225 if(showmessages && debugfail>=2) dualfprintf(fail_file,"CASE3A: normal gamma, but Erf<ERADLIMIT. ijk=%d %d %d : %ld %d %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,
t);
13234 FTYPE gammarel2orig=gammarel2;
13237 FTYPE gammarel=1.0;
13243 SLOOPA(jj) urfconrel[jj] = 0.0;
13247 if(showmessages && debugfail>=2) dualfprintf(fail_file,"CASE2A: normal gamma, but Erf<ERADLIMIT. ijk=%d %d %d : %ld %d %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13251 gammarel2=gammamax*gammamax;
13254 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE1A: gammarel>gammamax (cold): gammarel2=%g Erf=%g : i=%d j=%d k=%d : %ld %d %g\n",gammarel2,Erf,ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13257 FTYPE gammarel2orig=gammarel2;
13258 FTYPE gammarel=gammamax;
13259 gammarel2=gammamax*gammamax;
13272 SLOOPA(jj) urfconrel[jj] = 0.0;
13274 if(showmessages && debugfail>=2) dualfprintf(fail_file,"CASE1A: gammarel>gammamax and Erf<ERADLIMIT: gammarel2=%g : i=%d j=%d k=%d : %ld %d %g\n",gammarel2,ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13280 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE1B: gammarel>gammamax and Erf normal: gammarel2=%g : i=%d j=%d k=%d : %ld %d %g\n",gammarel2,ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13284 FTYPE alpha=ptrgeom->alphalapse;
13285 SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->
gcon[GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13288 FTYPE gammatemp,qsqtemp;
13293 SLOOPA(jj) urfconrel[jj] =0.0;
13295 else if(0&&gammatemp<=gammamax){
13300 SLOOPA(jj) urfconrel[jj] *= (gammamax/gammatemp);
13305 FTYPE gammatemp2,qsqtemp2;
13306 MYFUN(
gamma_calc_fromuconrel(urfconrel,ptrgeom,&gammatemp2,&qsqtemp2),
"ucon_calc_rel4vel_fromuconrel: gamma_calc_fromuconrel failed\n",
"phys.tools.rad.c",1);
13307 if(showmessages) dualfprintf(fail_file,
"CASE1B: gammarel>gammamax and Erf normal: gammarel2orig=%g gammamax=%g gammatemp=%g gammatemp2=%g ijk=%d %d %d : %ld %d %g\n",gammarel2orig,gammamax,gammatemp,gammatemp2,ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13322 SLOOPA(jj) pp[PRAD1+jj-1] = urfconrel[jj];
13349 static int get_m1closure_urfconrel(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE numerator,
FTYPE divisor,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad)
13351 FTYPE Erf=*Erfreturn;
13367 int failure1=Avcon[0]<0.0 || (gammarel2>0.0 && gammarel2<=0.25L && delta>=0.0 && divisor!=0.0) || numerator==0.0 || gammarel2>=1.0 && delta>=0.0 && divisor!=0.0 && Erf<
ERADLIMIT;
13369 int failure2=gammarel2<1.0 && gammarel2>0.0 && delta>=0.0;
13371 int failure3=gammarel2>gammamax*gammamax && Erf>=ERADLIMIT || gammarel2<0.0 || delta<0. || divisor==0.0 && numerator==0.0 || divisor==0.0 && numerator!=0.0;
13376 if(failure && (failure1==0 && failure2==0 && failure3==0)){
13377 if(debugfail>=2) dualfprintf(fail_file,
"Undetected failure, now considered\n");
13384 FTYPE gammarel=sqrt(gammarel2);
13385 FTYPE alpha=ptrgeom->alphalapse;
13387 SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->gcon[
GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13392 if(Erf<ERADLIMIT) Erf=Erf0;
13403 Avconorig[jj]=Avcon[jj];
13404 Avcovorig[jj]=Avcov[jj];
13406 FTYPE gammarel2orig;
13407 gammarel2orig=gammarel2;
13415 Avconslow[jj]=Avcon[jj];
13416 Avcovslow[jj]=Avcov[jj];
13419 get_m1closure_gammarel2_cold(showmessages,ptrgeom,Avconslow,Avcovslow,&gammarel2slow,&delta,&numerator,&divisor,&Erfslow,urfconrelslow);
13422 FTYPE gammarel2fast=gammamax*gammamax;
13425 Avconfast[jj]=Avcon[jj];
13426 Avcovfast[jj]=Avcov[jj];
13429 get_m1closure_gammarel2_cold(showmessages,ptrgeom,Avconfast,Avcovfast,&gammarel2fast,&delta,&numerator,&divisor,&Erffast,urfconrelfast);
13435 if( fabs(Avconslow[0]-Avcon[0])>fabs(Avconfast[0]-Avcon[0]) ){
13438 gammarel2=gammarel2fast;
13440 Avcon[jj]=Avconfast[jj];
13441 Avcov[jj]=Avcovfast[jj];
13442 urfconrel[jj]=urfconrelfast[jj];
13448 gammarel2=gammarel2slow;
13450 Avcon[jj]=Avconslow[jj];
13451 Avcov[jj]=Avcovslow[jj];
13452 urfconrel[jj]=urfconrelslow[jj];
13457 if(Avcovorig[TT]>0.0){
13458 SLOOPA(jj) urfconrel[jj]=0.0;
13461 else if(Avcov[TT]>0.0){
13464 SLOOPA(jj) urfconrel[jj]=0.0;
13471 Erf=
MAX(
MIN(Erf,Erforig),Erf0);
13475 #define AVCOVRELDIFFALLOWED 1E-2 // KORALTODO: only use new "cold" solution if relatively close Avcov.
13476 else if(fabs(Avcovorig[TT]-Avcov[TT])/fabs(fabs(Avcovorig[TT])+fabs(Avcov[TT]))<
AVCOVRELDIFFALLOWED ){
13478 Erf=
MAX(
MIN(Erf,Erf*(-Avcovorig[TT])/(ERADLIMIT+fabs(-Avcov[TT]))),Erf0);
13479 Erf=
MAX(
MIN(Erf,Erf*(-Avcov[TT])/(ERADLIMIT+fabs(-Avcovorig[TT]))),Erf0);
13491 if(gammarel2orig<=0.0){
13492 dualfprintf(fail_file,
"THIS ONE6\n");
13504 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASEGEN: gammarel>gammamax (cold, usingfast=%d): gammarel2=%g Erf=%g : i=%d j=%d k=%d : %ld %d %g\n",usingfast,gammarel2,Erf,ptrgeom->i,ptrgeom->j,ptrgeom->k,nstep,steppart,t);
13513 SLOOPA(jj) pp[PRAD1+jj-1] = urfconrel[jj];
13522 static long long int failnum=0;
13525 FTYPE fakeCUimp[1]={0};
13526 FTYPE dUother[NPR]={0};
13529 globalpin[ENTROPY]=0.0;
13530 globaluu[ENTROPY]=0.0;
13533 globalpin[PRAD0] = Erf;
13534 SLOOPA(jj) globalpin[PRAD1+jj-1] = urfconrel[jj];
13537 mathematica_report_check(0, 3, failnum, *lpflagrad,
BIG, -1, -1, fakedt, ptrgeom, pp, pp, pp, globalpin, globalpin, globalpin, globaluu, globaluu, globaluu, globaluu, fakeCUf, fakeCUimp, qptr, dUother);
13566 SLOOPA(jj) urfconrel[jj]=0.0;
13575 dualfprintf(fail_file,
"JONNAN: ijk=%d %d %d : %g %g : %g %g %g : %d %d %d %d : %g %g %g %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,Erf,gammarel2,urfconrel[1],urfconrel[2],urfconrel[3],failure1,failure2,failure3,failure,Avcon[0],Avcon[1],Avcon[2],Avcon[3]);
13587 static int get_m1closure_urfconrel_olek(
int showmessages,
int allowlocalfailurefixandnoreport,
struct of_geom *ptrgeom,
FTYPE *pp,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE gammarel2,
FTYPE delta,
FTYPE *Erfreturn,
FTYPE *urfconrel,
PFTYPE *lpflag,
PFTYPE *lpflagrad)
13589 FTYPE Erf=*Erfreturn;
13601 int failure1=gammarel2>1.01*gammamax*gammamax || gammarel2<0. || delta<0.;
13602 int failure2=gammarel2<1. || delta<0. || !
isfinite(gammarel2);
13609 FTYPE gammarel=gammamax;
13610 gammarel2=gammamax*gammamax;
13617 if(Erf<ERADLIMIT || !
isfinite(Erf)){
13623 SLOOPA(jj) urfconrel[jj] = 0.0;
13625 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE1A: gammarel>gammamax and Erf<ERADLIMIT: gammarel2=%g : i=%d j=%d k=%d\n",gammarel2,ptrgeom->i,ptrgeom->j,ptrgeom->k);
13630 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE1B: gammarel>gammamax and Erf normal: gammarel2=%g : i=%d j=%d k=%d\n",gammarel2,ptrgeom->i,ptrgeom->j,ptrgeom->k);
13634 FTYPE alpha=ptrgeom->alphalapse;
13635 SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->gcon[
GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13638 FTYPE gammatemp,qsqtemp;
13640 MYFUN(
gamma_calc_fromuconrel(urfconrel,ptrgeom,&gammatemp,&qsqtemp),
"ucon_calc_rel4vel_fromuconrel: gamma_calc_fromuconrel failed\n",
"phys.tools.rad.c",1);
13643 SLOOPA(jj) urfconrel[jj] *= (gammamax/gammatemp);
13647 FTYPE gammatemp2,qsqtemp2;
13648 MYFUN(
gamma_calc_fromuconrel(urfconrel,ptrgeom,&gammatemp2,&qsqtemp2),
"ucon_calc_rel4vel_fromuconrel: gamma_calc_fromuconrel failed\n",
"phys.tools.rad.c",1);
13649 if(showmessages) dualfprintf(fail_file,
"CASE1B: gammarel>gammamax and Erf normal: gammamax=%g gammatemp=%g gammatemp2=%g ijk=%d %d %d\n",gammamax,gammatemp,gammatemp2,ptrgeom->i,ptrgeom->j,ptrgeom->k);
13663 FTYPE gammarel2orig=gammarel2;
13666 FTYPE gammarel=1.0;
13670 SLOOPA(jj) urfconrel[jj] = 0.0;
13673 if(Erf<ERADLIMIT || !
isfinite(Erf)){
13677 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE2A: gamma<1 or delta<0 and Erf<ERADLIMIT : gammarel2=%g : i=%d j=%d k=%d\n",gammarel2,ptrgeom->i,ptrgeom->j,ptrgeom->k);
13682 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"CASE2B: gamma<1 or delta<0 and Erf normal : gammamax=%g gammarel2orig=%21.15g gammarel2=%21.15g delta=%g : i=%d j=%d k=%d\n",gammamax,gammarel2orig,gammarel2,delta,ptrgeom->i,ptrgeom->j,ptrgeom->k);
13695 if(Erf<ERADLIMIT || !
isfinite(Erf)){
13697 SLOOPA(jj) urfconrel[jj] = 0.0;
13702 FTYPE gammarel=sqrt(gammarel2);
13703 FTYPE alpha=ptrgeom->alphalapse;
13706 SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->gcon[
GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13716 dualfprintf(fail_file,
"OLEKNAN: ijk=%d %d %d : %g %g : %g %g %g : %d %d : %g %g %g %g\n",ptrgeom->i,ptrgeom->j,ptrgeom->k,Erf,gammarel2,urfconrel[1],urfconrel[2],urfconrel[3],failure1,failure2,Avcon[0],Avcon[1],Avcon[2],Avcon[3]);
13732 static int get_m1closure_gammarel2_cold_old(
int showmessages,
struct of_geom *ptrgeom,
FTYPE *Avcon,
FTYPE *Avcov,
FTYPE *gammarel2return,
FTYPE *deltareturn,
FTYPE *numeratorreturn,
FTYPE *divisorreturn,
FTYPE *Erfreturn,
FTYPE *urfconrel)
13736 FTYPE alpha=ptrgeom->alphalapse;
13739 static FTYPE gctt, gv11, gv12, gv13, gv14, gv22, gv23, gv24, gv33, gv34, gv44, Rtt, Rtx, Rty, Rtz;
13740 gv11=ptrgeom->gcov[
GIND(0,0)];
13741 gv12=ptrgeom->gcov[
GIND(0,1)];
13742 gv13=ptrgeom->gcov[
GIND(0,2)];
13743 gv14=ptrgeom->gcov[
GIND(0,3)];
13744 gv22=ptrgeom->gcov[
GIND(1,1)];
13745 gv23=ptrgeom->gcov[
GIND(1,2)];
13746 gv24=ptrgeom->gcov[
GIND(1,3)];
13747 gv33=ptrgeom->gcov[
GIND(2,2)];
13748 gv34=ptrgeom->gcov[
GIND(2,3)];
13749 gv44=ptrgeom->gcov[
GIND(3,3)];
13750 FTYPE Rttold=Avcon[0];
13754 gctt=ptrgeom->gcon[
GIND(0,0)];
13758 if(gammarel2return==NULL){
13761 gammarel2=gammamax*gammamax;
13763 else gammarel2=*gammarel2return;
13765 FTYPE utsq=gammarel2/(alpha*alpha);
13771 8.*gctt*gv11*gv22*
Power(Rtx,2) - 16.*gctt*gv12*gv13*Rtx*Rty +
13772 16.*gv23*Rtx*Rty + 16.*gctt*gv11*gv23*Rtx*Rty -
13774 8.*gctt*gv11*gv33*
Power(Rty,2) - 16.*gctt*gv12*gv14*Rtx*Rtz +
13775 16.*gv24*Rtx*Rtz + 16.*gctt*gv11*gv24*Rtx*Rtz -
13776 16.*gctt*gv13*gv14*Rty*Rtz + 16.*gv34*Rty*Rtz +
13777 16.*gctt*gv11*gv34*Rty*Rtz - 8.*gctt*
Power(gv14,2)*
Power(Rtz,2) +
13778 8.*gv44*
Power(Rtz,2) + 8.*gctt*gv11*gv44*
Power(Rtz,2) -
13780 8.*gctt*gv11*gv22*
Power(Rtx,2) + 16.*gctt*gv12*gv13*Rtx*Rty -
13781 16.*gv23*Rtx*Rty - 16.*gctt*gv11*gv23*Rtx*Rty +
13783 8.*gctt*gv11*gv33*
Power(Rty,2) + 16.*gctt*gv12*gv14*Rtx*Rtz -
13784 16.*gv24*Rtx*Rtz - 16.*gctt*gv11*gv24*Rtx*Rtz +
13785 16.*gctt*gv13*gv14*Rty*Rtz - 16.*gv34*Rty*Rtz -
13786 16.*gctt*gv11*gv34*Rty*Rtz + 8.*gctt*
Power(gv14,2)*
Power(Rtz,2) -
13787 8.*gv44*
Power(Rtz,2) - 8.*gctt*gv11*gv44*
Power(Rtz,2),2) -
13789 32.*gv12*gv13*Rtx*Rty - 32.*gv11*gv23*Rtx*Rty +
13791 32.*gv12*gv14*Rtx*Rtz - 32.*gv11*gv24*Rtx*Rtz +
13792 32.*gv13*gv14*Rty*Rtz - 32.*gv11*gv34*Rty*Rtz +
13796 2.*
Power(gctt,2)*gv12*gv13*Rtx*Rty + 2.*gctt*gv23*Rtx*Rty -
13797 2.*
Power(gctt,2)*gv11*gv23*Rtx*Rty +
13800 2.*
Power(gctt,2)*gv12*gv14*Rtx*Rtz + 2.*gctt*gv24*Rtx*Rtz -
13801 2.*
Power(gctt,2)*gv11*gv24*Rtx*Rtz +
13802 2.*
Power(gctt,2)*gv13*gv14*Rty*Rtz + 2.*gctt*gv34*Rty*Rtz -
13803 2.*
Power(gctt,2)*gv11*gv34*Rty*Rtz +
13805 1.*
Power(gctt,2)*gv11*gv44*
Power(Rtz,2)))))/
13807 32.*gv12*gv13*Rtx*Rty - 32.*gv11*gv23*Rtx*Rty +
13809 32.*gv12*gv14*Rtx*Rtz - 32.*gv11*gv24*Rtx*Rtz + 32.*gv13*gv14*Rty*Rtz -
13810 32.*gv11*gv34*Rty*Rtz + 16.*
Power(gv14,2)*
Power(Rtz,2) -
13811 16.*gv11*gv44*
Power(Rtz,2));
13814 8.*gctt*gv11*gv22*
Power(Rtx,2) - 16.*gctt*gv12*gv13*Rtx*Rty +
13815 16.*gv23*Rtx*Rty + 16.*gctt*gv11*gv23*Rtx*Rty -
13817 8.*gctt*gv11*gv33*
Power(Rty,2) - 16.*gctt*gv12*gv14*Rtx*Rtz +
13818 16.*gv24*Rtx*Rtz + 16.*gctt*gv11*gv24*Rtx*Rtz -
13819 16.*gctt*gv13*gv14*Rty*Rtz + 16.*gv34*Rty*Rtz +
13820 16.*gctt*gv11*gv34*Rty*Rtz - 8.*gctt*
Power(gv14,2)*
Power(Rtz,2) +
13821 8.*gv44*
Power(Rtz,2) + 8.*gctt*gv11*gv44*
Power(Rtz,2) +
13823 8.*gctt*gv11*gv22*
Power(Rtx,2) + 16.*gctt*gv12*gv13*Rtx*Rty -
13824 16.*gv23*Rtx*Rty - 16.*gctt*gv11*gv23*Rtx*Rty +
13826 8.*gctt*gv11*gv33*
Power(Rty,2) + 16.*gctt*gv12*gv14*Rtx*Rtz -
13827 16.*gv24*Rtx*Rtz - 16.*gctt*gv11*gv24*Rtx*Rtz +
13828 16.*gctt*gv13*gv14*Rty*Rtz - 16.*gv34*Rty*Rtz -
13829 16.*gctt*gv11*gv34*Rty*Rtz + 8.*gctt*
Power(gv14,2)*
Power(Rtz,2) -
13830 8.*gv44*
Power(Rtz,2) - 8.*gctt*gv11*gv44*
Power(Rtz,2),2) -
13832 32.*gv12*gv13*Rtx*Rty - 32.*gv11*gv23*Rtx*Rty +
13834 32.*gv12*gv14*Rtx*Rtz - 32.*gv11*gv24*Rtx*Rtz +
13835 32.*gv13*gv14*Rty*Rtz - 32.*gv11*gv34*Rty*Rtz +
13839 2.*
Power(gctt,2)*gv12*gv13*Rtx*Rty + 2.*gctt*gv23*Rtx*Rty -
13840 2.*
Power(gctt,2)*gv11*gv23*Rtx*Rty +
13843 2.*
Power(gctt,2)*gv12*gv14*Rtx*Rtz + 2.*gctt*gv24*Rtx*Rtz -
13844 2.*
Power(gctt,2)*gv11*gv24*Rtx*Rtz +
13845 2.*
Power(gctt,2)*gv13*gv14*Rty*Rtz + 2.*gctt*gv34*Rty*Rtz -
13846 2.*
Power(gctt,2)*gv11*gv34*Rty*Rtz +
13848 1.*
Power(gctt,2)*gv11*gv44*
Power(Rtz,2)))))/
13850 32.*gv12*gv13*Rtx*Rty - 32.*gv11*gv23*Rtx*Rty +
13852 32.*gv12*gv14*Rtx*Rtz - 32.*gv11*gv24*Rtx*Rtz + 32.*gv13*gv14*Rty*Rtz -
13853 32.*gv11*gv34*Rty*Rtz + 16.*
Power(gv14,2)*
Power(Rtz,2) -
13854 16.*gv11*gv44*
Power(Rtz,2));
13856 dualfprintf(fail_file,
"utsq=%g utsqmina=%g utsqminb=%g\n",utsq,utsqmina,utsqminb);
13858 if(utsq<utsqmina && utsqmina>utsqminb) utsq=utsqmina;
13859 if(utsq<utsqminb && utsqminb>utsqmina) utsq=utsqminb;
13863 DLOOPA(jj) Avcovorig[jj]=Avcov[jj];
13868 Avcon[0]=(-1.*(gctt + 4.*utsq)*(gctt*(gv12*Rtx + gv13*Rty + gv14*Rtz) + 4.*(gv12*Rtx + gv13*Rty + gv14*Rtz)*utsq +
13869 0.16666666666666666*
Sqrt(36.*
Power(gv12*Rtx + gv13*Rty + gv14*Rtz,2)*
Power(gctt + 4.*utsq,2) -
13870 36.*(gv22*
Power(Rtx,2) + 2.*gv23*Rtx*Rty + gv33*
Power(Rty,2) + 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*
Power(Rtz,2))*
13871 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq)))))/
13872 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq));
13874 Erf=(-3.*(gctt*(gv12*Rtx + gv13*Rty + gv14*Rtz) + 4.*(gv12*Rtx + gv13*Rty + gv14*Rtz)*utsq +
13875 0.16666666666666666*
Sqrt(36.*
Power(gv12*Rtx + gv13*Rty + gv14*Rtz,2)*
Power(gctt + 4.*utsq,2) -
13876 36.*(gv22*
Power(Rtx,2) + 2.*gv23*Rtx*Rty + gv33*
Power(Rty,2) + 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*
Power(Rtz,2))*
13877 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq)))))/
13878 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq));
13881 dualfprintf(fail_file,"NOR SOL: Avcon0new=%g Avcon0old=%g Erf=%g :: %g %g %g\n",Avcon[0],Rttold,Erf,Rtx,Rty,Rtz);
13883 FTYPE Avcovnew[NDIM];
13884 indices_21(Avcon,Avcovnew,ptrgeom);
13885 DLOOPA(jj) dualfprintf(fail_file,"jj=%d Avcovorig=%g Avcovnew=%g\n",jj,Avcovorig[jj],Avcovnew[jj]);
13892 FTYPE Avalt=(-1.*(gctt + 4.*utsq)*(gctt*(gv12*Rtx + gv13*Rty + gv14*Rtz) + 4.*(gv12*Rtx + gv13*Rty + gv14*Rtz)*utsq -
13893 0.16666666666666666*
Sqrt(36.*
Power(gv12*Rtx + gv13*Rty + gv14*Rtz,2)*
Power(gctt + 4.*utsq,2) -
13894 36.*(gv22*
Power(Rtx,2) + 2.*gv23*Rtx*Rty + gv33*
Power(Rty,2) + 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*
Power(Rtz,2))*
13895 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq)))))/
13896 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq));
13899 FTYPE Erfalt=(-3.*gctt*(gv12*Rtx + gv13*Rty + gv14*Rtz) - 12.*(gv12*Rtx + gv13*Rty + gv14*Rtz)*utsq +
13900 0.5*
Sqrt(36.*
Power(gv12*Rtx + gv13*Rty + gv14*Rtz,2)*
Power(gctt + 4.*utsq,2) -
13901 36.*(gv22*
Power(Rtx,2) + 2.*gv23*Rtx*Rty + gv33*
Power(Rty,2) + 2.*gv24*Rtx*Rtz + 2.*gv34*Rty*Rtz + gv44*
Power(Rtz,2))*
13902 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq))))/
13903 (
Power(gctt,2)*gv11 + 8.*utsq*(1. + 2.*gv11*utsq) + gctt*(-1. + 8.*gv11*utsq));
13905 dualfprintf(fail_file,
"ALT SOL: Avalt=%g Av0old=%g Erfalt=%g : %g %g %g\n",Avalt,Rttold,Erfalt,Rtx,Rty,Rtz);
13909 *gammarel2return=gammarel2;
13910 *deltareturn=
delta;
13913 FTYPE gammarel=sqrt(gammarel2);
13916 if(Erf>0.0)
SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->
gcon[GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
13917 else
SLOOPA(jj) urfconrel[jj] = 0.0;
13919 dualfprintf(fail_file,"NORM ROOT 4-vel: %g %g %g : %g\n",urfconrel[1],urfconrel[2],urfconrel[3],ptrgeom->gdet);
13943 FTYPE alpha=ptrgeom->alphalapse;
13946 static FTYPE gctt, gn11, gn12, gn13, gn14, gn22, gn23, gn24, gn33, gn34, gn44, Rtt, Rtx, Rty, Rtz, Rdtt, Rdtx, Rdty, Rdtz;
13947 gn11=ptrgeom->gcon[
GIND(0,0)];
13948 gn12=ptrgeom->gcon[
GIND(0,1)];
13949 gn13=ptrgeom->gcon[
GIND(0,2)];
13950 gn14=ptrgeom->gcon[
GIND(0,3)];
13951 gn22=ptrgeom->gcon[
GIND(1,1)];
13952 gn23=ptrgeom->gcon[
GIND(1,2)];
13953 gn24=ptrgeom->gcon[
GIND(1,3)];
13954 gn33=ptrgeom->gcon[
GIND(2,2)];
13955 gn34=ptrgeom->gcon[
GIND(2,3)];
13956 gn44=ptrgeom->gcon[
GIND(3,3)];
13970 if(gammarel2return==NULL){
13973 gammarel2=gammamax*gammamax;
13975 else gammarel2=*gammarel2return;
13977 FTYPE utsq=gammarel2/(alpha*alpha);
13981 DLOOPA(jj) Avcovorig[jj]=Avcov[jj];
13982 DLOOPA(jj) Avconorig[jj]=Avcon[jj];
13987 Avcov[0]=(0.25*(-4.*(gn12*Rdtx + gn13*Rdty + gn14*Rdtz)*utsq*(gn11 + utsq) +
13988 Sqrt((
Power(gn12,2)*
Power(Rdtx,2) + 2.*gn12*Rdtx*(gn13*Rdty + gn14*Rdtz) +
Power(gn13*Rdty + gn14*Rdtz,2) -
13989 1.*gn11*(gn22*
Power(Rdtx,2) + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) + 2.*gn24*Rdtx*Rdtz + 2.*gn34*Rdty*Rdtz +
13990 gn44*
Power(Rdtz,2)))*utsq*(gn11 + utsq)*
Power(gn11 + 4.*utsq,2))))/(gn11*utsq*(gn11 + utsq));
13992 Erf=(0.75*
Sqrt((
Power(gn12,2)*
Power(Rdtx,2) + 2.*gn12*Rdtx*(gn13*Rdty + gn14*Rdtz) +
Power(gn13*Rdty + gn14*Rdtz,2) -
13993 1.*gn11*(gn22*
Power(Rdtx,2) + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) + 2.*gn24*Rdtx*Rdtz + 2.*gn34*Rdty*Rdtz +
13994 gn44*
Power(Rdtz,2)))*utsq*(gn11 + utsq)*
Power(gn11 + 4.*utsq,2)))/(utsq*(gn11 + utsq)*(gn11 + 4.*utsq));
13996 if(0&&showmessages && debugfail>=2) dualfprintf(fail_file,
"NOR SOL: Avcov0new=%g Avcov0old=%g Erf=%g :: %g %g %g\n",Avcov[0],Avcovorig[0],Erf,Rtx,Rty,Rtz);
13999 indices_12(Avcov,Avcon,ptrgeom);
14000 if(0&&showmessages && debugfail>=2)
DLOOPA(jj) dualfprintf(fail_file,
"jj=%d Avconorig=%g Avconnew=%g\n",jj,Avconorig[jj],Avcon[jj]);
14005 if(0&&showmessages && debugfail>=2){
14008 FTYPE Avcovalt = (-0.25*(4.*(gn12*Rdtx + gn13*Rdty + gn14*Rdtz)*utsq*(gn11 + utsq) +
14009 Sqrt((
Power(gn12,2)*
Power(Rdtx,2) + 2.*gn12*Rdtx*(gn13*Rdty + gn14*Rdtz) +
Power(gn13*Rdty + gn14*Rdtz,2) -
14010 1.*gn11*(gn22*
Power(Rdtx,2) + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) + 2.*gn24*Rdtx*Rdtz + 2.*gn34*Rdty*Rdtz +
14011 gn44*
Power(Rdtz,2)))*utsq*(gn11 + utsq)*
Power(gn11 + 4.*utsq,2))))/(gn11*utsq*(gn11 + utsq));
14013 FTYPE Erfalt=(-0.75*
Sqrt((
Power(gn12,2)*
Power(Rdtx,2) + 2.*gn12*Rdtx*(gn13*Rdty + gn14*Rdtz) +
Power(gn13*Rdty + gn14*Rdtz,2) -
14014 1.*gn11*(gn22*
Power(Rdtx,2) + 2.*gn23*Rdtx*Rdty + gn33*
Power(Rdty,2) + 2.*gn24*Rdtx*Rdtz + 2.*gn34*Rdty*Rdtz +
14015 gn44*
Power(Rdtz,2)))*utsq*(gn11 + utsq)*
Power(gn11 + 4.*utsq,2)))/(utsq*(gn11 + utsq)*(gn11 + 4.*utsq));
14017 if(showmessages && debugfail>=2) dualfprintf(fail_file,
"ALT SOL: Avcovalt=%g Avcov0old=%g Erfalt=%g : %g %g %g\n",Avcovalt,Avcovorig[0],Erfalt,Rdtx,Rdty,Rdtz);
14021 *gammarel2return=gammarel2;
14022 *deltareturn=
delta;
14025 FTYPE gammarel=sqrt(gammarel2);
14028 if(Erf>0.0)
SLOOPA(jj) urfconrel[jj] = alpha * (Avcon[jj] + 1./3.*Erf*ptrgeom->gcon[
GIND(0,jj)]*(4.0*gammarel2-1.0) )/(4./3.*Erf*gammarel);
14029 else SLOOPA(jj) urfconrel[jj] = 0.0;
14031 if(0&&showmessages && debugfail>=2) dualfprintf(fail_file,
"NORM ROOT 4-vel: %g %g %g : %g\n",urfconrel[1],urfconrel[2],urfconrel[3],ptrgeom->gdet);
14089 FTYPE ujjsq,gammasq;
14104 ujjsq = fabs(q->
ucon[jj]*q->
ucov[jj]);
14107 gammasq = fabs(-q->
ucon[TT]*q->
ucov[TT]);
14108 gammasq =
MAX(1.0,gammasq);
14109 gamma = sqrt(gammasq);
14112 top=gamma +
MAX(1.0,gammasq - ujjsq);
14115 FTYPE vjj = ujj/gamma;
14116 vjj =
MIN(1.0,vjj);
14117 bottom = (1.0+gamma)*gamma*(1.0+vjj);
14118 bottom =
MAX(2.0,bottom);
14127 dxorthoff[jj] = (
dx[jj]*orthofactor[jj]) * (top/bottom);
14128 tautot[jj]=chi * dxorthoff[jj];
14130 *tautotmax=
MAX(*tautotmax,tautot[jj]*NxNOT1[jj]);
14150 FTYPE kappa,kappaes,chi;
14151 calc_kappa(pp,ptrgeom,q,&kappa);
14152 calc_kappaes(pp,ptrgeom,&kappaes);
14170 FTYPE u=u_rho0_T_simple(0, 0, 0,
CENT, rho, T);
14176 FTYPE T=compute_temp_simple(0, 0, 0,
CENT, rho, u);
14204 return (sqrt(sqrt((E/(SMALL+
ARAD_CODE)))));
14210 FTYPE T=compute_temp_simple(0, 0, 0,
CENT, rho, u);
14220 FTYPE ncondefault[
NDIM]={0.0,-1.0, 0.0, 0.0};
14224 if(ncon==NULL) nconuse=ncondefault;
14228 FTYPE gammatemp,qsq;
14233 SLOOPA(ii) prtemp[
U1+ii-1] = nconuse[ii]*(gammamax/gammatemp);
14241 FTYPE prtemp2[NPR];
14242 ucon2pr(whichvel,uconlab,ptrgeom,prtemp2);
14244 SLOOPA(jj) uconwhichvel[jj] = prtemp2[
U1+jj-1];