21 static int ifileglobal,jfileglobal,kfileglobal,pfileglobal;
31 static void ncov_calc_fromlapse(
FTYPE lapse,
FTYPE ncov[]) ;
37 static FTYPE vsq_calc(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
38 static FTYPE dvsq_dW(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
39 static FTYPE Eprime_Wp(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
40 static int Psq_Wp(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE *resid,
FTYPE *norm);
41 static FTYPE dPsqdWp_Wp(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
42 static FTYPE utsq_calc(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
43 static FTYPE gammasq_calc_W(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
44 static FTYPE utsq_calc(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
47 static void validate_Wp(
FTYPE Wpold,
FTYPE *Wpnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
48 static int validate_vsq(
FTYPE vsqold,
FTYPE *vsqnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
49 static void check_utsq_fail(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
70 static int find_root_1D_gen(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
71 static int find_root_1D_gen_scn(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
72 static int find_root_1D_gen_Eprime(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
73 static int find_root_1D_gen_Psq(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
74 static int find_root_3D_gen_Palpha(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
75 static int find_root_2D_gen(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
76 static int find_root_1D_gen_Sc(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
79 static int general_newton_raphson(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x[],
int n,
int do_line_search,
80 void (*funcd) (
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [][
NEWT_DIM],
FTYPE *,
FTYPE *,
int,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
81 FTYPE (*res_func) (
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
83 static void func_1d_orig(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
84 static FTYPE res_sq_1d_orig(
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
85 static void func_1d_orig_scn(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
86 static FTYPE res_sq_1d_orig_scn(
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
87 static void func_1d_orig(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
88 static FTYPE res_sq_1d_orig(
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
89 static void func_1d_orig(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
90 static FTYPE res_sq_1d_orig(
FTYPE [] ,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
91 static void func_1d_orig(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
92 static FTYPE res_sq_1d_orig(
FTYPE [] ,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
93 static void func_vsq(
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [][NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
94 static void func_vsq2(
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [][NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
95 static FTYPE res_sq_vsq(
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
96 static FTYPE res_sq_vsq2(
FTYPE [] ,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
97 static int x1_of_x0(
FTYPE x0,
FTYPE *x1,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
99 FTYPE *f,
FTYPE TOLX,
FTYPE stpmax,
int *check,
FTYPE (*func) (
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
104 static int newt_cyclecheck(
int n,
FTYPE trueerror,
FTYPE errx,
FTYPE errx_old,
FTYPE errx_oldest,
FTYPE *dx,
FTYPE *dx_old,
FTYPE *x,
FTYPE *x_old,
FTYPE *x_older,
FTYPE *x_olderer,
int n_iter,
FTYPE (*xlist)[
MAX_NEWT_ITER+
EXTRA_NEWT_ITER_ULTRAREL+
EXTRA_NEWT_ITER],
FTYPE (*dxlist)[
MAX_NEWT_ITER+
EXTRA_NEWT_ITER_ULTRAREL+
EXTRA_NEWT_ITER],
FTYPE *errxlist,
FTYPE *trueerrorlist);
107 static void bin_newt_data(
FTYPE MAX_NEWT_ITER_VAR,
FTYPE errx,
int niters,
int conv_type,
int print_now ) ;
109 static void validate_x(
void (*ptr_validate_x)(
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
110 static void check_on_inversion(
int showmessages,
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats);
115 static int compute_setup_quantities(
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
FTYPE *Bsq,
FTYPE *QdotB,
FTYPE *QdotBsq,
FTYPE *Qtsq,
FTYPE *Qdotn,
FTYPE *Qdotnp,
FTYPE *D,
FTYPE *Sc,
int whicheos,
FTYPE *EOSextra);
116 static int compute_Wp(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *Wpabs,
FTYPE *etaabs,
FTYPE *gamma,
FTYPE *gammasq,
FTYPE *rho0,
FTYPE *u,
FTYPE *p,
FTYPE *wmrho0,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
117 static int set_guess_Wp(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
118 static int check_Wp(
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp_last,
FTYPE Wp,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
119 static int Wp2prim(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
FTYPE *pressure,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
120 static int verify_Wlast(
FTYPE u,
FTYPE p,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
124 static int forcefree_inversion(
int cleaned,
struct of_geom *ptrgeom,
FTYPE W,
FTYPE *Qtcon,
FTYPE Bsq,
FTYPE *Bcon,
FTYPE *Bcov,
FTYPE Qtsq,
FTYPE *U,
FTYPE *prim,
FTYPE *gammaret);
145 FTYPE U_tmp[NPR], U_tmp2[NPR], prim_tmp[NPR];
149 const int ltrace = 0;
152 int real_dimen_newton;
163 U[0]= 100.03640347219;
164 U[1]=-2.21974020354085e-25;
165 U[2]=-2.50158167405965e-12;
172 prim[0]= 99.8798655540244;
173 prim[1]= 9.6414760309742e-26;
174 prim[2]=-9.98706197921322e-14;
190 pickeos_eomtype(
WHICHEOS,eomtype,&whicheos);
199 dualfprintf(
fail_file,
"Guess for p is NAN\n");
205 dualfprintf(
fail_file,
"Value of U is NAN\n");
255 else real_dimen_newton=0;
259 #if( WHICHVEL != VELREL4 )
260 stderrfprintf(
"Utoprim_2d() Not implemented for WHICHVEL = %d \n",
WHICHVEL );
271 for(i =
BCON1; i <=
BCON3; i++) prim[i] = U[i] ;
284 alpha = ptrgeom->alphalapse;
287 U_tmp[
i] = alpha * U[
i] ;
290 #if(DOENTROPY!=DONOENTROPY)
292 U_tmp[
i] = alpha * U[
i] ;
297 if(ptrgeom->i==0 && ptrgeom->j==31 &&
nstep==9 &&
steppart==2){
313 for( i =
BCON1; i <=
BCON3; i++ ) prim_tmp[i] = alpha*prim[i];
322 ret = Utoprim_new_body(showmessages, eomtype, lpflag, whicheos,EOSextra, U_tmp, ptrgeom, prim_tmp,pressure,newtonstats);
333 for(i = 0; i <
NDIM; i++ ) {
334 for(j = 0; j <
NDIM; j++ ) {
335 gcov[
GIND(i,j)] = ptrgeom->gcov[
GIND(i,j)];
336 gcon[
GIND(i,j)] = ptrgeom->gcon[
GIND(i,j)];
337 dualfprintf(
fail_file,
"gcov,gcon %d %d = %21.15g %21.15g \n", i, j, gcov[
GIND(i,j)], gcon[
GIND(i,j)]);
340 dualfprintf(
fail_file,
"gdet = %21.15g \n", ptrgeom->g);
358 for( i = 0; i <=
U3; i++ ) prim[i] = prim_tmp[i];
359 #if(DOENTROPY!=DONOENTROPY)
362 prim[
i] = prim_tmp[
i];
429 FTYPE Qtcon[4],Bcon[4],Bcov[4];
430 FTYPE primother[NPR];
431 FTYPE W_last,W,Wp_last,Wp0,Wp,Wp1,Wp2,Wp3,Wpother;
432 int i,
j, retval0, retval, retval1,retval2, retval3 ;
433 int retvalother,retvalother2;
435 FTYPE Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc ;
437 int Wdependentsolution;
440 #if(0) // old globals used for debugging -- can't be used during OpenMP computations
441 static FTYPE Qcovorig[
NDIM],Qconorig[
NDIM],Qdotnorig,Qsqorig,Qtsqorig;
442 static FTYPE Qtsqnew;
449 ifileglobal=ptrgeom->i;
450 jfileglobal=ptrgeom->j;
451 kfileglobal=ptrgeom->k;
452 pfileglobal=ptrgeom->p;
455 const int ltrace = 0;
456 const int ltrace2 = 0;
464 for(i=0;i<NPR;i++) dualfprintf(
fail_file,
"%d %21.15g %21.15g\n",i,prim[i],U[i]) ;
486 compute_setup_quantities(prim, U, ptrgeom, Qtcon, Bcon, Bcov, &Bsq,&QdotB,&QdotBsq,&Qtsq,&Qdotn,&Qdotnp,&D,&Sc,whicheos,EOSextra);
494 DLOOPA(i) dualfprintf(
fail_file,"Qtcon[%d]=%21.15g Bcon[%d]=%21.15g Bcov[%d]=%21.15g\n",i,Qtcon[i],i,Bcon[i],i,Bcov[i]);
495 dualfprintf(fail_file,"Bsq=%21.15g QdotB=%21.15g QdotBsq=%21.15g Qtsq=%21.15g Qdotn=%21.15g Qdotnp=%21.15g D=%21.15g Sc=%21.15g\n",Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc);
510 Wdependentsolution=0;
515 if(
forcefree_inversion(cleaned, ptrgeom, W_last, Qtcon, Bsq, Bcon, Bcov, Qtsq, U, prim, &gammaret0)) retval++;
522 FTYPE gammasq,gamma,rho0,u,
p,wmrho0;
524 compute_Wp(showmessages, lpflag, eomtype, prim, ptrgeom, &W_last, &Wp_last, &Wpabs, &etaabs, &gamma, &gammasq, &rho0, &u, &p, &wmrho0, wglobal, Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
526 if(
forcefree_inversion(cleaned, ptrgeom, W_last, Qtcon, Bsq, Bcon, Bcov, Qtsq, U, prim, &gammaret0)) retval++;
531 FTYPE gammasq,gamma,rho0,u,
p,wmrho0;
533 compute_Wp(showmessages, lpflag, eomtype, prim, ptrgeom, &W_last, &Wp_last, &Wpabs, &etaabs, &gamma, &gammasq, &rho0, &u, &p, &wmrho0, wglobal, Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
539 PLOOP(pliter,pl) prim1[pl] = prim[pl];
540 int ret1=
forcefree_inversion(0, ptrgeom, W_last, Qtcon, Bsq, Bcon, Bcov, Qtsq, U, prim1, &gammaret1);
544 PLOOP(pliter,pl) prim2[pl] = prim[pl];
545 int ret2=forcefree_inversion(1, ptrgeom, W_last, Qtcon, Bsq, Bcon, Bcov, Qtsq, U, prim2, &gammaret2);
546 if(gammaret1>gammaret2){
547 PLOOP(pliter,pl) prim[pl] = prim2[pl];
551 PLOOP(pliter,pl) prim[pl] = prim1[pl];
557 Wdependentsolution=1;
564 retval+=
set_guess_Wp(showmessages, lpflag, eomtype, prim, ptrgeom, &W_last, &Wp_last,wglobal, Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
576 #if(WHICHHOTINVERTER==3)
577 retval+=
find_root_1D_gen_Eprime(showmessages, lpflag, eomtype, Wp_last, &Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
578 #elif(WHICHHOTINVERTER==2)
579 retval+= find_root_2D_gen(showmessages, lpflag, eomtype, Wp_last, &Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
580 #elif(WHICHHOTINVERTER==1)
581 retval+=
find_root_1D_gen(showmessages, lpflag, eomtype, Wp_last, &Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
589 retval = find_root_2D_gen(showmessages, lpflag, eomtype, Wp_last, &Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
590 retvalother =
find_root_1D_gen(showmessages, lpflag, eomtype, Wp_last, &Wpother, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
591 retvalother2=
find_root_1D_gen_scn(showmessages, lpflag, eomtype, W_last, &W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
594 if(retval!=retvalother || (fabs(Wp-Wpother)/(Wp+Wpother)>1
E-13)){
595 dualfprintf(fail_file,
"2D/1D: i=%d j=%d :: %d %d %d :: Wp_last=%21.15g Wp=%21.15g Wpother=%21.15g\n",ptrgeom->i,ptrgeom->j,retval,retvalother,retvalother2,Wp_last,Wp,Wpother);
596 dualfprintf(fail_file,
"scn W_last=%g W=%g D=%g Wp_last=%g Wp=%g\n",W_last,W,D,W_last-D,W-D);
597 dualfprintf(fail_file,
"rho0=%g u=%g p=%g gamma=%g gammasq=%g w=%g utsq=%g\n",rho0,u,p,gamma,gammasq,w,utsq);
599 #endif // end comparing SCN and Jon method
616 #if(WHICHCOLDINVERTER==0)
617 retval0 =
find_root_1D_gen(showmessages, lpflag, eomtype, Wp_last, &Wp0, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
634 #elif(WHICHCOLDINVERTER==1)
639 retval1 =
find_root_1D_gen_Eprime(showmessages, lpflag, eomtype, Wp_last, &Wp1, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
667 #elif(WHICHCOLDINVERTER==2)
671 #if(CRAZYDEBUG&&DEBUGINDEX)
672 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
673 dualfprintf(fail_file,
"Wp_last=%21.15g\n",Wp_last);
677 retval2 =
find_root_1D_gen_Psq(showmessages, lpflag, eomtype, Wp_last, &Wp2, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
693 #elif(WHICHCOLDINVERTER==3)
697 retval3 =
find_root_3D_gen_Palpha(showmessages, lpflag, eomtype, Wp_last, &Wp3, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
737 #if(WHICHENTROPYINVERTER==0)
738 retval+=
find_root_1D_gen_Sc(showmessages, lpflag, eomtype, Wp_last, &Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
761 check_on_inversion(showmessages, prim, U, ptrgeom, Wp, Qtcon, Bcon, Bcov,retval, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
765 if(retval==0 && Wdependentsolution==1){
767 retval+=
check_Wp(lpflag, eomtype, prim, U, ptrgeom, Wp_last, Wp, retval, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
768 if(retval)
return(retval);
772 retval+=
Wp2prim(showmessages, lpflag, eomtype,prim, pressure, U, ptrgeom, Wp, Qtcon, Bcon, Bcov, retval, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
773 if(retval)
return(retval);
789 static int compute_setup_quantities(
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
FTYPE *Bsq,
FTYPE *QdotB,
FTYPE *QdotBsq,
FTYPE *Qtsq,
FTYPE *Qdotn,
FTYPE *Qdotnp,
FTYPE *D,
FTYPE *Sc,
int whicheos,
FTYPE *EOSextra)
792 FTYPE Qcov[4],Qcon[4],Qcovp[4],Qconp[4],ncov[4],ncon[4],Qsq,Qtcov[4];
793 FTYPE alpha,alphasq,Dfactor;
802 #if(DOENTROPY!=DONOENTROPY)
807 for(i =
BCON1; i <=
BCON3; i++) prim[i] = U[i] ;
809 for(i=1;i<4;i++) Bcon[i] = U[
BCON1+i-1] ;
812 lower_vec(Bcon,ptrgeom,Bcov) ;
816 for(i=1;i<4;i++) *Bsq += Bcon[i]*Bcov[i] ;
819 ncov_calc_fromlapse(ptrgeom->alphalapse,ncov) ;
820 raise_vec(ncov,ptrgeom,ncon);
826 for(i=0;i<4;i++) Qcovp[i] = U[
QCOV0+i] ;
827 raise_vec(Qcovp,ptrgeom,Qconp) ;
850 lower_vec(Qtcon,ptrgeom,Qtcov);
852 for(i=0;i<4;i++) *Qtsq += Qtcov[i]*Qtcon[i] ;
855 DLOOPA(j) dualfprintf(fail_file,
"Qtcon[%d]=%21.15g Qtcov[%d]=%21.15g\n",j,Qtcon[j],j,Qtcov[j]);
863 if(i==0) Qcov[
i]=Qcovp[
i] - (*D);
864 else Qcov[
i]=Qcovp[
i];
866 raise_vec(Qcov,ptrgeom,Qcon) ;
880 for(i=1;i<4;i++) *QdotB += Qcov[i]*Bcon[i] ;
881 *QdotBsq = (*QdotB)*(*QdotB) ;
888 *Qdotnp = Qconp[0]*ncov[0] + (*D)*(1.0-1.0/fabs(ncov[
TT])) ;
901 alpha = ptrgeom->alphalapse;
902 alphasq = alpha*alpha;
904 Dfactor = (-ptrgeom->gcovpert[
TT] + alphasq*(ptrgeom->betasqoalphasq))/(alphasq+alpha);
907 *Qdotnp = Qconp[0]*ncov[0] + (*D)*(Dfactor) ;
911 *Qdotn = Qcon[0]*ncov[0] ;
919 for(i=0;i<4;i++) Qcovorig[i] = U[
QCOV0+i] ;
921 raise_vec(Qcovorig,ptrgeom,Qconorig) ;
922 Qdotnorig = Qconorig[0]*ncov[0] ;
924 for(i=0;i<4;i++) *Qsqorig += Qcovorig[i]*Qconorig[i] ;
925 *Qtsqorig = *Qsqorig + Qdotnorig*Qdotnorig ;
943 if(ptrgeom->i==0 && ptrgeom->j==31 &&
nstep==9 &&
steppart==2){
945 for(i=0;i<4;i++) *Qsq += Qcov[i]*Qcon[i] ;
946 for(i=0;i<4;i++) dualfprintf(fail_file,
"Qcon[%d]=%21.15g Qcov[%d]=%21.15g Qsq=%21.15g Qtsq=%21.15g\n",i,Qcon[i],i,Qcov[i],Qsq,Qtsq);
958 static int compute_Wp(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *Wpabs,
FTYPE *etaabs,
FTYPE *gamma,
FTYPE *gammasq,
FTYPE *rho0,
FTYPE *u,
FTYPE *p,
FTYPE *wmrho0,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
972 for(j=1;j<4;j++) utsq += ptrgeom->gcov[
GIND(i,j)]*prim[
UTCON1+i-1]*prim[
UTCON1+j-1] ;
975 if( (utsq < 0.) && (fabs(utsq) <
MAXNEGUTSQ) ) {
976 if(debugfail>=2) dualfprintf(fail_file,
"utsq was %21.15g now 0.0 @ i=%d j=%d k=%d\n",utsq,ptrgeom->i,ptrgeom->j,ptrgeom->k);
984 dualfprintf(fail_file,
"Utoprim_new(): utsq < 0 or utsq>UTSQ_TOO_BIG in utoprim_jon attempt. Resetting to utsq=0.0 from utsq = %21.15g @ i=%d j=%d k=%d\n", utsq,ptrgeom->i,ptrgeom->j,ptrgeom->k) ;
986 for(j=1;j<4;j++) dualfprintf(fail_file,
"i=%d j=%d :: gcov=%21.15g primi=%21.15g primj=%21.15g\n",i,j,ptrgeom->gcov[
GIND(i,j)],prim[
UTCON1+i-1],prim[
UTCON1+j-1]) ;
998 *gammasq = 1. + utsq ;
999 *gamma = sqrt(*gammasq);
1003 *rho0 = (D) / (*gamma) ;
1010 w = (*rho0) + (*wmrho0) ;
1016 *Wp_last = (D)*utsq/(1.0+(*gamma)) + ((*u) + (*p))*(*gammasq);
1017 *W_last = *Wp_last + (D);
1024 Bcon[
TT]=0.0;
SLOOPA(jj) Bcon[jj]=prim[
B1-1+jj];
1025 lower_vec(Bcon,ptrgeom,Bcov);
1026 bsq = 0.0;
SLOOPA(jj) bsq += Bcon[jj]*Bcov[jj];
1027 bsq *= ((ptrgeom->alphalapse * ptrgeom->alphalapse))/(*gammasq);
1030 *Wpabs = fabs((D)*utsq)/(1.0+fabs(*gamma)) + (fabs(*u)+fabs(*p))*fabs(*gammasq) +
SQRTMINNUMREPRESENT;
1031 nuabs = fabs(*u) + fabs(*p) + fabs(bsq);
1032 *etaabs = fabs(*rho0) + nuabs;
1046 static int set_guess_Wp(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1049 FTYPE gammasq,gamma,rho0,u,
p,wmrho0;
1050 FTYPE Wpabs, etaabs;
1053 int numattemptstofixguess;
1058 compute_Wp(showmessages, lpflag, eomtype, prim, ptrgeom, W_last, Wp_last, &Wpabs, &etaabs, &gamma, &gammasq, &rho0, &u, &p, &wmrho0, wglobal, Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1078 if(
coldgrhd(lpflag, Qtsq, D, &Wpcoldhd)){
1084 *wglobal=
MAX(
MAX(Wpcoldhd,*Wp_last),Wpabs);
1087 if(gotcold) *Wp_last=
MAX(2.0*Wpcoldhd,*Wp_last);
1105 #if(CRAZYDEBUG&&DEBUGINDEX)
1106 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
1107 dualfprintf(fail_file,
"pre verify\n");
1108 dualfprintf(fail_file,
"rho0=%21.15g u=%21.15g p=%21.15g\n",rho0,u,p);
1110 dualfprintf(fail_file,
"W_last=%21.15g Wp_last=%21.15g gammasq=%21.15g w=%21.15g\n",*W_last,*Wp_last,gammasq,w);
1116 verify_Wlast(u, p, ptrgeom, W_last, Wp_last, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1118 #if(CRAZYDEBUG&&DEBUGINDEX)
1119 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
1120 dualfprintf(fail_file,
"post verify\n");
1122 dualfprintf(fail_file,
"W_last=%21.15g Wp_last=%21.15g gammasq=%21.15g w=%21.15g\n",*W_last,*Wp_last,gammasq,w);
1133 #define MAXNUMGUESSCHANGES (1000)
1137 numattemptstofixguess=0;
1142 utsq=utsq_calc(*W_last, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1146 Ss=Ss_Wp_utsq(whicheos,EOSextra,*Wp_last,D,utsq);
1158 #define FRACSs0 (0.5) // want to have initial entropy not too far below previous entropy value
1162 if(numattemptstofixguess>0)
if(showmessages && debugfail>=3) dualfprintf(fail_file,
"GOOD Initial guess #%d/%d [i=%d j=%d k=%d] for W=%21.15g Wp=%21.15g Wp/D=%21.15g gives bad utsq=%21.15g Ss=%21.15g D=%21.15g u=%21.15g p=%21.15g gamma=%21.15g Ss0=%21.15g\n",numattemptstofixguess,
MAXNUMGUESSCHANGES,ptrgeom->i,ptrgeom->j,ptrgeom->k,*W_last,*Wp_last,*Wp_last/D,utsq,Ss,D,u,p,gamma,Ss0);
1167 if(showmessages && debugfail>=3) dualfprintf(fail_file,
"Initial guess #%d/%d [i=%d j=%d k=%d] for W=%21.15g Wp=%21.15g Wp/D=%21.15g gives bad utsq=%21.15g Ss=%21.15g D=%21.15g u=%21.15g p=%21.15g gamma=%21.15g Ss0=%21.15g\n",numattemptstofixguess,
MAXNUMGUESSCHANGES,ptrgeom->i,ptrgeom->j,ptrgeom->k,*W_last,*Wp_last,*Wp_last/D,utsq,Ss,D,u,p,gamma,Ss0);
1173 coldgrhd(&coldpflag, Qtsq, D, &coldWp);
1174 if(*Wp_last<coldWp) *Wp_last=coldWp;
1177 if(numattemptstofixguess>0){
1180 #define FACTORSHIFT (2.0)
1185 *W_last = *Wp_last + (D);
1196 numattemptstofixguess++;
1229 static int verify_Wlast(
FTYPE u,
FTYPE p,
struct of_geom *ptrgeom,
FTYPE *W_last,
FTYPE *Wp_last,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1237 if(*W_last<-(D) || *Wp_last<0){
1241 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
1242 dualfprintf(fail_file,
"W_last=%21.15g Wp_last=%21.15g\n",*W_last,*Wp_last);
1250 while(
vsqgtr1(*W_last,Bsq,QdotBsq,Qtsq) && (i_increase < 10) ) {
1256 *W_last = *Wp_last+(D);
1263 dualfprintf(fail_file,
"badval : W = %21.15g, i_increase = %d \n", *W_last, i_increase);
1267 if( i_increase >= 10 ) {
1268 dualfprintf(fail_file,
"i_increase is too large, i_increase = %d , W = %21.15g \n", i_increase, *W_last);
1275 dualfprintf(fail_file,
"u = %21.15g, p = %21.15g, Bsq = %21.15g, Qtsq = %21.15g \n",u,p,Bsq,Qtsq);
1276 dualfprintf(fail_file,
"Bcon[0-3] = %21.15g %21.15g %21.15g %21.15g \n", Bcon[0],Bcon[1],Bcon[2],Bcon[3]);
1277 dualfprintf(fail_file,
"Bcov[0-3] = %21.15g %21.15g %21.15g %21.15g \n", Bcov[0],Bcov[1],Bcov[2],Bcov[3]);
1278 dualfprintf(fail_file,
"Qcon[0-3] = %21.15g %21.15g %21.15g %21.15g \n", Qcon[0],Qcon[1],Qcon[2],Qcon[3]);
1279 dualfprintf(fail_file,
"Qcov[0-3] = %21.15g %21.15g %21.15g %21.15g \n", Qcov[0],Qcov[1],Qcov[2],Qcov[3]);
1280 dualfprintf(fail_file,
"call find_root\n") ;
1299 static int check_Wp(
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp_last,
FTYPE Wp,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1308 if( (retval != 0) || (Wp ==
FAIL_VAL) ) {
1309 if( debugfail>=2 ) {
1310 dualfprintf(fail_file,
"Failed to find a prim. var. solution!! Wp_last=%21.15g Bsq=%21.15g QdotBsq=%21.15g Qdotn=%21.15g D=%21.15g Qtsq=%21.15g \n",Wp_last,Bsq,QdotBsq,Qdotn,D,Qtsq);
1311 dualfprintf(fail_file,
"Utoprim_new_body(): bad newt failure, nstep,steppart :: t,i,j,k, p[0-%d], U[0-%d] = %ld %d :: %21.15g %d %d %d ", NPR, NPR,
nstep,
steppart,
t, ptrgeom->i, ptrgeom->j,ptrgeom->k );
1314 dualfprintf(fail_file,
"%21.15g ", prim[pl]);
1317 dualfprintf(fail_file,
"%21.15g ", U[pl]);
1319 dualfprintf(fail_file,
"\n");
1322 if(debugfail>=1) dualfprintf(fail_file,
"Got here Wp_last=%21.15g Wp=%21.15g retval=%d\n",Wp_last,Wp,retval);
1333 FTYPE Wpnewsmall=-3.0*
MAX(
MAX(
MAX(
MAX(
MAX(fabs(D),fabs(Qdotn)),fabs(Bsq)),fabs(Qdotnp)),fabs(wglobal[0])),fabs(wglobal[1]));
1335 if(Wtest<Wpnewsmall){
1337 dualfprintf(fail_file,
"Wtest1 failed :: Wp=%21.15g D=%21.15g wglobal=%21.15g\n",Wp,(D),wglobal[1]);
1338 dualfprintf(fail_file,
"nstep=%ld steppart=%d :: t=%21.15g :: i=%d j=%d k=%d p=%d\n",
nstep,
steppart,
t,ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p);
1353 if( debugfail>=2 ) {
1354 dualfprintf(fail_file,
"Wtest2 failure %21.15g %21.15g %21.15g %21.15g\n",Wtest,D,wglobal[1],
GAMMASQ_TOO_BIG) ;
1355 dualfprintf(fail_file,
"Utoprim_new_body(): Wtest<Wpnewsmall or Wtest=toobig failure, t,i,j,k, p[0-7], U[0-7] = %21.15g %d %d %d ",
t, ptrgeom->i, ptrgeom->j,ptrgeom->k );
1358 dualfprintf(fail_file,
"%21.15g ", prim[pl]);
1361 if(
isfinite(U[pl])) dualfprintf(fail_file,
"%21.15g ", U[pl]);
1362 else dualfprintf(fail_file,
"nan ");
1364 dualfprintf(fail_file,
"\n");
1375 dualfprintf(fail_file,
"(Wp,Wp_last,Bsq,Qtsq,QdotB,gammasq,Qdotn) %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g\n",
1377 Bsq,Qtsq,QdotB,gammasq,Qdotn) ;
1378 dualfprintf(fail_file,
"done find_root\n") ;
1381 dualfprintf(fail_file,
"\n <--------- %21.15g %21.15g %21.15g %21.15g %21.15g \n", Bsq,QdotBsq,Qdotn,D,Qtsq);
1404 static void check_utsq_fail(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1408 if(
steppart==1 &&
nstep==32 && ifileglobal==0 && jfileglobal==19){
1409 dualfprintf(fail_file,
"Qtsq=%21.15g Bsq=%21.15g D=%21.15g QdotB=%21.15g Wp=%21.15g\n",Qtsq,Bsq,D,QdotB,Wp);
1417 static void check_on_inversion(
int showmessages,
FTYPE *prim,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
1421 #if(CHECKONINVERSION)
1455 dualfprintf(fail_file,
"Not enough memory for invproperty: checki=%d NUMINVPROPERTY=%d\n",checki,
NUMINVPROPERTY);
1462 static int Wp2prim(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE *prim,
FTYPE *pressure,
FTYPE *U,
struct of_geom *ptrgeom,
FTYPE Wp,
FTYPE *Qtcon,
FTYPE *Bcon,
FTYPE *Bcov,
int retval,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1468 FTYPE gtmp,gamma,gammasq,w,wmrho0,
p,u,tmpdiff;
1503 for(i =
BCON1; i <=
BCON3; i++) prim[i] = U[i] ;
1536 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
1538 retvsq=
validate_vsq(vsq,&vsq, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1541 if( retvsq==1 || retvsq==2) {
1543 if( debugfail>=2 ) {
1544 dualfprintf(fail_file,
"vsq failure: vsq = %21.15g , W = %21.15g \n",vsq, W) ;
1545 dualfprintf(fail_file,
"Utoprim_new_body(): utsq==bad failure, t,i,j,k, p[0-7], U[0-7] = %21.15g %d %d %d ",
t, ptrgeom->i, ptrgeom->j,ptrgeom->k );
1547 dualfprintf(fail_file,
"%21.15g ", prim[pl]);
1550 dualfprintf(fail_file,
"%21.15g ", U[pl]);
1552 dualfprintf(fail_file,
"\n");
1556 check_utsq_fail(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1565 check_utsq_fail(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1571 gtmp = sqrt(1. - vsq);
1573 gammasq=gamma*gamma;
1578 wmrho0=wmrho0_compute_vsq(Wp,D,vsq,gamma,gammasq);
1581 #elif(PRIMFROMVSQ==0)
1583 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1586 gamma=sqrt(gammasq);
1588 wmrho0=wmrho0_compute_utsq(Wp,D,utsq,gamma,gammasq);
1622 if(showmessages && debugfail>=2 ) {
1624 dualfprintf(fail_file,
1625 "rho or uu < 0 failure: rho,w,(w-rho),p,u = %21.15g %21.15g %21.15g %21.15g %21.15g gamma,utsq = %21.15g %21.15g : nstep=%ld steppart=%d :: t=%21.15g :: i=%d j=%d k=%d p=%d\n",rho0,w,tmpdiff,p,u,gamma, utsq,
nstep,
steppart,
t,ptrgeom->i,ptrgeom->j,ptrgeom->k,ptrgeom->p);
1659 #if(DOENTROPY!=DONOENTROPY)
1661 prim[ENTROPY]=prim[
UU];
1669 for(i=1;i<4;i++) prim[
UTCON1+i-1] = gamma/(W+Bsq) * ( Qtcon[
i] + QdotB*Bcon[
i]/W ) ;
1695 if(debugfail>=2)
PLOOPALLINVERT(pl2) dualfprintf(fail_file,
"prim is nan: prim[%d]=%21.15g -> pr0[%d]=%21.15g\n",pl2,prim[pl2],pl2,pr0[pl2]);
1706 dualfprintf(fail_file,
" rho final = %21.15g , u final = %21.15g \n", rho0, u);
1721 static int forcefree_inversion(
int cleaned,
struct of_geom *ptrgeom,
FTYPE W,
FTYPE *Qtcon,
FTYPE Bsq,
FTYPE *Bcon,
FTYPE *Bcov,
FTYPE Qtsq,
FTYPE *U,
FTYPE *prim,
FTYPE *gammaret)
1737 prim[
RHO]=prim[
UU]=0.0;
1742 for(i=1;i<4;i++) vcon[i] = Qtcon[i]/Bsq ;
1747 for(i=1;i<4;i++) QtdotB += Qtcon[i]*Bcov[i];
1751 for(i=1;i<4;i++) Qtconclean[i] = Qtcon[i] - QtdotB*Bcon[i]/Bsq;
1755 for(i=1;i<4;i++) vconff[i] = Qtconclean[i]/Bsq;
1758 for(i=1;i<4;i++) Qtconclean[i] = Qtcon[i];
1762 for(i=1;i<4;i++) vconff[i] = (Qtconclean[i] + 0.0*QtdotB*Bcon[i]/fabs(W) )/(fabs(W) + fabs(Bsq));
1768 lower_vec(vconff,ptrgeom,vcovff) ;
1772 for(i=1;i<4;i++) vsq+=vconff[i]*vcovff[i];
1777 if( (vsq<0.0) || (vsq>1.0/alphasq) ){
1782 lower_vec(Qtconclean,ptrgeom,Qtcovclean) ;
1784 for(i=1;i<4;i++) Qtsqclean+=Qtconclean[i]*Qtcovclean[i];
1792 realBsq=sqrt(Qtsqclean*alphasq);
1795 for(i=1;i<4;i++) vconff[i] = Qtconclean[i]/realBsq ;
1798 for(i=1;i<4;i++) vconff[i] = (Qtconclean[i] + 0.0*QtdotB*Bcon[i]/fabs(W) )/(fabs(W) + fabs(realBsq));
1802 lower_vec(vconff,ptrgeom,vcovff) ;
1806 for(i=1;i<4;i++) vsq+=vconff[i]*vcovff[i];
1812 dualfprintf(fail_file,
"Failed to limit vcon\n");
1819 gamma=1.0/sqrt(1.0-vsq);
1822 for(i=1;i<4;i++) prim[
UTCON1+i-1] = gamma*vconff[i];
1825 for(i =
BCON1; i <=
BCON3; i++) prim[i] = U[i] ;
1845 return(W*W*W * ( W + 2.*Bsq ) - QdotBsq*(2.*W + Bsq) <= W*W*(Qtsq-Bsq*Bsq) );
1863 static FTYPE utsq_calc(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1865 FTYPE utsqtop,utsqbottom,utsq;
1871 utsqtop = Qtsq + (Bsq+2.0*W)*SoW*SoW;
1873 utsqbottom = (Bsq*Bsq-Qtsq) + 2.0*Bsq*W + W*W - SoW*SoW*(Bsq+2.0*W);
1875 utsq = utsqtop/utsqbottom;
1890 static FTYPE gammasq_calc_W(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1892 FTYPE gammatop,gammabottom,gammasq;
1900 gammabottom = W*W+2.0*Bsq*W + (Bsq*Bsq-Qtsq)-2.0*SoW*SoW*W - Bsq*SoW*SoW;
1902 gammasq = gammatop*gammatop/gammabottom;
1911 static FTYPE gamma_calc_W(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1913 FTYPE gammasq,gamma;
1915 gammasq =
gammasq_calc_W(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
1919 gamma=sqrt(gammasq);
1931 static FTYPE vsq_calc(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1937 Xsq = (Bsq + W) * (Bsq + W);
1945 return( (SoW*SoW*(2.0*W+Bsq) + Qtsq)/Xsq );
1952 static FTYPE dvsq_dW(
FTYPE W,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
1967 return( -2.0/X3 * ( Qtsq + QdotBsq * (3.0*W*X + Bsq*Bsq)/W3 ) );
1990 *Wp = Qtsq/(D+sqrt(det));
1993 *Wp = Qtsq/(D-sqrt(det));
2005 static FTYPE Psq_Wp_old(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2008 FTYPE S,W,W2,DoW,SoW;
2018 #if(CRAZYDEBUG&&DEBUGINDEX)
2019 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
2020 dualfprintf(fail_file,
"Qtsq=%21.15g Bsq=%21.15g D=%21.15g S=%21.15g\n",Qtsq,Bsq,D,S);
2026 result = -Qtsq + Wp*(D+W)*(1.0 + Bsq*Y/W2) - Y*SoW*SoW;
2036 static FTYPE dPsqdWp_Wp_old(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2046 result = 2.0*(Bsq+W)*(Bsq/W*DoW*DoW + SoW*SoW/W + 1.0);
2055 static int Psq_Wp(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE *resid,
FTYPE *norm)
2057 FTYPE S,W,W2,DoW,SoW;
2065 *resid = -Qtsq*W2 + Wp*(D+W)*(W2 + Bsq*Y) - Y*S*S;
2066 *norm = fabs(Qtsq*W2) + fabs(Wp*(D+W)*(W2)) + fabs(Wp*(D+W)*(Bsq*Y)) + fabs(Y*S*S);
2076 static FTYPE dPsqdWp_Wp(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2084 result = 2.0*(D*( (Bsq+D)*(Bsq+D) - Qtsq) - (S*S) + ((Bsq + D)*(Bsq + 5.0*D) - Qtsq)*Wp + 3.0*(Bsq + 2.0*D)*(Wp*Wp) + 2.0*(Wp*Wp*Wp));
2099 #define MINRESIDEPRIME(Wp) ( Bsq*0.5+Qdotnp+3.0/5.0*Wp+(Bsq*Qtsq-QdotBsq)/(2.0*(Bsq+D+Wp)*(Bsq+D+Wp)) )
2103 static int Eprime_Wp_unopt(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE *resid,
FTYPE *norm)
2111 X = Bsq + W +
SMALL;
2115 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2125 p_tmp=pressure_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2128 *resid = Qdotnp + Wp - p_tmp + 0.5*Bsq + 0.5*(Bsq*Qtsq-QdotBsq)/X2;
2129 *norm = fabs(Qdotnp) + fabs(Wp) + fabs(p_tmp) + fabs(0.5*Bsq) + fabs(0.5*(Bsq*Qtsq)/X2) + fabs(0.5*(QdotBsq)/X2);
2131 if(p_tmp!=p_tmp || *resid!=*resid) *resid=-
VERYBIG;
2145 static FTYPE dEprimedWp_unopt(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2150 FTYPE dvsq,dp1,dp2,dpdWp;
2154 X = Bsq + W +
SMALL;
2157 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2162 dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2163 dp1 = dpdWp_calc_utsq(whicheos,EOSextra,Wp,D,utsq);
2164 dp2 = dpdvsq_calc2_Wp(whicheos,EOSextra, Wp, D, utsq );
2165 dpdWp = dp1 + dp2*dvsq;
2167 result = (1.0 - dpdWp) - (Bsq*Qtsq - QdotBsq)/X3;
2170 if(dvsq!=dvsq || dp1!=dp1 || dp2!=dp2 || dpdWp!=dpdWp || result!=result) result=0.0;
2182 static FTYPE Eprime_Wp_new1(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2191 X = Bsq + W +
SMALL;
2194 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2199 p_tmp=pressure_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2201 result = X2*(Qdotnp + Wp - p_tmp + 0.5*Bsq) + 0.5*(Bsq*Qtsq-QdotBsq);
2203 if(p_tmp!=p_tmp || result!=result) result=0.0;
2221 static FTYPE dEprimedWp_new1(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2226 FTYPE dvsq,dp1,dp2,dpdWp;
2231 X = Bsq + W +
SMALL;
2234 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2240 dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2241 dp1 = dpdWp_calc_utsq(whicheos,EOSextra,Wp,D,utsq);
2242 dp2 = dpdvsq_calc2_Wp(whicheos,EOSextra, Wp, D, utsq );
2243 dpdWp = dp1 + dp2*dvsq;
2246 p_tmp=pressure_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2248 result = X*(2.0*(Qdotnp + Wp - p_tmp + 0.5*Bsq) + (1.0 - dpdWp)*
X );
2250 if(dvsq!=dvsq || dp1!=dp1 || dp2!=dp2 || dpdWp!=dpdWp || p_tmp!=p_tmp || result!=result) result=0.0;
2275 static FTYPE Sc_Wp_old(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2284 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2291 Ss_tmp=Ss_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2293 result = -Sc + D*Ss_tmp;
2295 if(Ss_tmp!=Ss_tmp || result!=result) result=-
VERYBIG;
2307 static int Sc_Wp_unopt(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE *resid,
FTYPE *norm)
2315 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2323 Ss_tmp=Ss_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2325 *resid = Wp*(-Sc + D*Ss_tmp);
2326 *norm = fabs(Wp)*fabs(Sc) + fabs(Wp)*fabs(D*Ss_tmp);
2328 if(Ss_tmp!=Ss_tmp || *resid!=*resid) *resid=-
VERYBIG;
2342 static FTYPE dScdWp_unopt(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2347 FTYPE dvsq,dSs1,dSs2,dSsdWp;
2351 utsq=utsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2356 dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2357 dSs1 = dSsdWp_calc_utsq(whicheos,EOSextra,Wp,D,utsq);
2358 dSs2 = dSsdvsq_calc2_Wp(whicheos,EOSextra, Wp, D, utsq );
2359 dSsdWp = dSs1 + dSs2*dvsq;
2360 Ss=Ss_Wp_utsq(whicheos,EOSextra,Wp,D,utsq);
2366 result = -Sc + D*(dSsdWp*Wp + Ss);
2369 if(dvsq!=dvsq || dSs1!=dSs1 || dSs2!=dSs2 || dSsdWp!=dSsdWp || result!=result) result=0.0;
2408 static int x1_of_x0(
FTYPE x0,
FTYPE *x1,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2420 vsq = fabs(vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra)) ;
2422 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
2425 retval=
validate_vsq(vsq,&vsq, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2453 static void validate_Wp(
FTYPE Wpold,
FTYPE *Wpnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2462 FTYPE Wpnewsmall=-3.0*
MAX(
MAX(
MAX(
MAX(
MAX(fabs(D),fabs(Qdotn)),fabs(Bsq)),fabs(Qdotnp)),fabs(wglobal[0])),fabs(wglobal[1]));
2464 if(Wpnew[0]<Wpnewsmall){
2474 dualfprintf(fail_file,
"Wpnew[0] changed from %21.15g to %21.15g (D=%21.15g Qtsq=%21.15g)\n",Wpold,Wpnew[0],D,Qtsq);
2482 Wpnew[0] = (fabs(Wpnew[0]/wglobal[1]) >
GAMMASQ_TOO_BIG) ? 0.5*(Wpold+Wpnew[0]) : Wpnew[0];
2492 static int validate_vsq(
FTYPE vsqold,
FTYPE *vsqnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2514 if( (vsqnew[0] < 0.) && (fabs(vsqnew[0]) <
MAXNEGVSQ) ) {
2519 #elif(VSQNEGCHECK==2)
2526 #elif(VSQNEGCHECK==3)
2541 static void validate_x_2d(
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2544 validate_Wp(x0[0], &x[0], wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2546 validate_vsq(x0[1], &x[1], wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2552 static void validate_x_1d_old(
FTYPE x[1],
FTYPE x0[1],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2558 FTYPE Wpnewsmall=-3.0*
MAX(
MAX(
MAX(
MAX(
MAX(fabs(D),fabs(Qdotn)),fabs(Bsq)),fabs(Qdotnp)),fabs(wglobal[0])),fabs(wglobal[1]));
2560 if(x[0]<Wpnewsmall) x[0]=D+dv;
2569 static void validate_x_1d(
FTYPE x[1],
FTYPE x0[1],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2572 validate_Wp(x0[0], &x[0], wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2578 static void pick_validate_x(
int eomtype,
void (**ptr_validate_x)(
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra))
2594 dualfprintf(fail_file,
"pick_validate_x: Shouldn't reach here\n");
2601 static void validate_x(
void (*ptr_validate_x)(
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE x[NEWT_DIM],
FTYPE x0[NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2603 (*ptr_validate_x)(x,x0,wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2623 static void func_1d_orig(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2625 FTYPE vsq,vsqfake,gamma,gamma_sq,rho0,w,W,Wp,drdW,dpdW,Wsq,p_tmp, dvsq,dp1,dp2,a_term,ap_term ;
2628 const int ltrace = 0;
2629 int retvalvalidatevsq;
2639 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
2646 retvalvalidatevsq=
validate_vsq(vsq,&vsqfake, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2651 vsqfake = ( vsq < -
MAXNEGVSQ ) ? 0.0 : fabs(vsq) ;
2657 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2664 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2671 if(retvalvalidatevsq==0){
2677 p_tmp = pressure_Wp_vsq(whicheos,EOSextra,Wp,D,vsqfake);
2686 dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2687 dp1 = dpdWp_calc_vsq(whicheos,EOSextra, Wp, D, vsq );
2688 dp2 = dpdvsq_calc_Wp(whicheos,EOSextra, Wp, D, vsq );
2689 dpdW = dp1 + dp2*dvsq;
2696 + 0.5 * Bsq * ( 1. + vsq )
2703 + fabs(0.5 * Bsq * ( 1. + vsq ))
2704 + fabs(0.5*QdotBsq/Wsq)
2708 jac[0][0] = drdW = 1. - dpdW + QdotBsq/(Wsq*W) + 0.5*Bsq*dvsq;
2722 resid[0] = Qdotnp + Wp - p_tmp + 0.5*Bsq + (Bsq*Qtsq - QdotBsq)/X2;
2723 norm[0] = fabs(Qdotnp) + fabs(Wp) + fabs(p_tmp) + fabs(0.5*Bsq) + fabs((Bsq*Qtsq)/X2) + fabs((QdotBsq)/X2);
2725 jac[0][0] = drdW = 1. - dpdW + (Bsq*Qtsq - QdotBsq)/X3*(-2.0);
2730 dx[0] = -resid[0]/drdW;
2732 *f = 0.5*resid[0]*resid[0];
2737 a_term = 0.5*Bsq*(1.+vsq) + Qdotnp - p_tmp;
2738 ap_term = dvsq * ( 0.5*Bsq - dp2 ) - dp1;
2740 dualfprintf(fail_file,
"func_1d_orig(): x = %21.15g, dx = %21.15g, resid = %21.15g, drdW = %21.15g \n", x[0], dx[0], resid[0], drdW);
2741 dualfprintf(fail_file,
"func_1d_orig(): dvsq = %21.15g, dp = %21.15g , dp1 = %21.15g , dp2 = %21.15g \n", dvsq, dpdW,dp1,dp2);
2742 dualfprintf(fail_file,
"func_1d_orig(): W = %21.15g , vsq = %21.15g , a = %21.15g, a_prime = %21.15g \n", x[0], vsq, a_term, ap_term);
2766 static FTYPE res_sq_1d_orig(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2768 FTYPE vsq,W,Wp,Wsq,p_tmp,resid[1],norm[1];
2772 const int ltrace = 0;
2773 int retvalvalidatevsq;
2782 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
2785 retvalvalidatevsq=
validate_vsq(vsq,&vsqfake, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2787 if(retvalvalidatevsq==0){
2796 vsqfake = ( vsq < 0.0 ) ? 0.0 : vsq ;
2802 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2809 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2816 p_tmp = pressure_Wp_vsq(whicheos,EOSextra,Wp,D,vsqfake);
2823 + 0.5 * Bsq * ( 1. + vsq )
2830 + fabs(0.5 * Bsq * ( 1. + vsq ))
2831 + fabs(0.5*QdotBsq/Wsq)
2837 resid[0] = Qdotnp + Wp - p_tmp + 0.5*Bsq + (Bsq*Qtsq - QdotBsq)/X2;
2838 norm[0] = fabs(Qdotnp) + fabs(Wp) + fabs(p_tmp) + fabs(0.5*Bsq) + fabs((Bsq*Qtsq)/X2) + fabs((QdotBsq)/X2);
2848 return( 0.5*resid[0]*resid[0] );
2864 static void func_1d_orig_scn(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2866 FTYPE vsq,vsqfake,gamma,gamma_sq,rho0,w,W,drdW,dpdW,Wsq,p_tmp, dvsq,dp1,dp2,a_term,ap_term ;
2868 const int ltrace = 0;
2875 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
2883 vsqfake = ( vsq < -
MAXNEGVSQ ) ? 0.0 : fabs(vsq) ;
2889 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2896 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2906 p_tmp = pressure_W_vsq_scn(whicheos,EOSextra, W,D,vsqfake);
2912 dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
2913 dp1 = dpdW_calc_vsq_scn(whicheos,EOSextra, W, D, vsq );
2914 dp2 = dpdvsq_calc_scn(whicheos,EOSextra, W, D, vsqfake );
2915 dpdW = dp1 + dp2*dvsq;
2919 + 0.5 * Bsq * ( 1. + vsq )
2926 + fabs(0.5 * Bsq * ( 1. + vsq ))
2927 + fabs(0.5*QdotBsq/Wsq)
2931 jac[0][0] = drdW = 1. - dpdW + QdotBsq/(Wsq*W) + 0.5*Bsq*dvsq;
2942 dx[0] = -resid[0]/drdW;
2944 *f = 0.5*resid[0]*resid[0];
2949 a_term = 0.5*Bsq*(1.+vsq) + Qdotn - p_tmp;
2950 ap_term = dvsq * ( 0.5*Bsq - dp2 ) - dp1;
2952 dualfprintf(fail_file,
"func_1d_orig(): x = %21.15g, dx = %21.15g, resid = %21.15g, drdW = %21.15g \n", x[0], dx[0], resid[0], drdW);
2953 dualfprintf(fail_file,
"func_1d_orig(): dvsq = %21.15g, dp = %21.15g , dp1 = %21.15g , dp2 = %21.15g \n", dvsq, dpdW,dp1,dp2);
2954 dualfprintf(fail_file,
"func_1d_orig(): W = %21.15g , vsq = %21.15g , a = %21.15g, a_prime = %21.15g \n", x[0], vsq, a_term, ap_term);
2965 static FTYPE res_sq_1d_orig_scn(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
2967 FTYPE vsq,vsqfake,W,Wsq,p_tmp,resid[1],norm[1];
2969 const int ltrace = 0;
2975 vsq = vsq_calc(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
2983 vsqfake = ( vsq < 0.0 ) ? 0.0 : vsq ;
2989 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
2996 dualfprintf(fail_file,
"func_1d_orig: vsq=%21.15g\n",vsq);
3002 p_tmp = pressure_W_vsq_scn(whicheos,EOSextra,W,D,vsqfake);
3007 + 0.5 * Bsq * ( 1. + vsq )
3014 + fabs(0.5 * Bsq * ( 1. + vsq ))
3015 + fabs(0.5*QdotBsq/Wsq)
3019 return( 0.5*resid[0]*resid[0] );
3031 static void func_Eprime_unopt(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3035 const int ltrace = 0;
3041 Eprime_Wp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid[0], &norm[0]);
3042 jac[0][0] = drdW =
dEprimedWp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
3045 dx[0] = -resid[0]/drdW;
3049 *f = 0.5*resid[0]*resid[0];
3057 static FTYPE res_sq_Eprime_unopt(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3063 Eprime_Wp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid, &norm);
3065 return( 0.5*resid*resid );
3075 static void get_kinetics_part1(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE *W,
FTYPE *X,
FTYPE *X2,
FTYPE *X3,
FTYPE *utsq,
FTYPE *gamma,
FTYPE *gammasq,
FTYPE *rho0,
FTYPE *wmrho0)
3086 *X = Bsq + *W +
SMALL;
3090 *utsq=utsq_calc(*W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
3093 *gammasq=1.0+ (*utsq);
3094 *gamma=sqrt(*gammasq);
3095 *wmrho0=wmrho0_compute_utsq(Wp, D, *utsq, *gamma, *gammasq);
3104 static void get_kinetics_part2(
FTYPE Wp,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
FTYPE W,
FTYPE X,
FTYPE X2,
FTYPE X3,
FTYPE utsq,
FTYPE gamma,
FTYPE gammasq,
FTYPE rho0,
FTYPE wmrho0,
FTYPE *dvsq,
FTYPE *dwmrho0dW,
FTYPE *drho0dW,
FTYPE *dwmrho0dvsq,
FTYPE *drho0dvsq)
3108 *dvsq = dvsq_dW(W, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
3110 *dwmrho0dW = 1.0/gammasq;
3113 *dwmrho0dvsq = (D*(gamma*0.5-1.0) - Wp);
3114 *drho0dvsq = -D*gamma*0.5;
3125 static void func_Eprime_opt(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3128 const int ltrace = 0;
3139 FTYPE gamma,gammasq;
3142 get_kinetics_part1(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra, &W, &X, &X2, &X3, &utsq, &gamma, &gammasq, &rho0, &wmrho0);
3151 FTYPE Eprime,dEprimedWp;
3158 jac[0][0]=dEprimedWp;
3160 *f = 0.5*(Eprime*Eprime);
3172 FTYPE pofchi,dpdrho,dpdchi;
3173 getall_forinversion(whicheos,
EOMGRMHD,CHIDIFF,EOSextra,rho0,wmrho0,&pofchi,&dpdrho,&dpdchi);
3181 Eprime = Qdotnp + Wp - pofchi + 0.5*Bsq + 0.5*(Bsq*Qtsq-QdotBsq)/X2;
3182 FTYPE normEprime = fabs(Qdotnp) + fabs(Wp) + fabs(pofchi) + fabs(0.5*Bsq) + fabs(0.5*(Bsq*Qtsq)/X2) + fabs(0.5*(QdotBsq)/X2);
3185 if(pofchi!=pofchi || Eprime!=Eprime) Eprime=-
VERYBIG;
3192 FTYPE dvsq,dwmrho0dW,drho0dW;
3193 FTYPE dwmrho0dvsq,drho0dvsq;
3194 get_kinetics_part2(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra, W, X, X2, X3, utsq, gamma, gammasq, rho0, wmrho0, &dvsq,&dwmrho0dW,&drho0dW,&dwmrho0dvsq,&drho0dvsq);
3201 FTYPE dpdW,dpdvsq,dpdWp;
3203 dpdW = drho0dW *dpdrho + dwmrho0dW *dpdchi;
3204 dpdvsq = drho0dvsq *dpdrho + dwmrho0dvsq *dpdchi;
3205 dpdWp = dpdW + dpdvsq*dvsq;
3212 dEprimedWp = (1.0 - dpdWp) - (Bsq*Qtsq - QdotBsq)/X3;
3216 if(dvsq!=dvsq || dpdW!=dpdW || dpdvsq!=dpdvsq || dpdWp!=dpdWp || dEprimedWp!=dEprimedWp) dEprimedWp=0.0;
3230 jac[0][0]=dEprimedWp;
3231 dx[0] = -Eprime/dEprimedWp;
3232 *f = 0.5*(Eprime*Eprime);
3259 static FTYPE res_sq_Eprime_opt(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3268 func_Eprime_opt(x, dx, resid, norm, jac, &f, &df, n, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra);
3270 return( 0.5*resid[0]*resid[0] );
3279 static void func_Psq(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3283 const int ltrace = 0;
3289 Psq_Wp(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid[0], &norm[0]);
3290 jac[0][0] = drdW =
dPsqdWp_Wp(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
3293 dx[0] = -resid[0]/drdW;
3294 *f = 0.5*resid[0]*resid[0];
3301 static FTYPE res_sq_Psq(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3307 Psq_Wp(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid, &norm);
3309 return( 0.5*resid*resid );
3316 static void func_Sc_unopt(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3320 const int ltrace = 0;
3326 Sc_Wp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid[0], &norm[0]);
3327 jac[0][0] = drdW =
dScdWp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
3330 dx[0] = -resid[0]/drdW;
3334 *f = 0.5*resid[0]*resid[0];
3341 static FTYPE res_sq_Sc_unopt(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3347 Sc_Wp_unopt(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra, &resid, &norm);
3349 return( 0.5*resid*resid );
3357 static void func_Sc_opt(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3369 FTYPE gamma,gammasq;
3372 get_kinetics_part1(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra, &W, &X, &X2, &X3, &utsq, &gamma, &gammasq, &rho0, &wmrho0);
3381 FTYPE Scprime,dScprimedWp;
3388 jac[0][0]=dScprimedWp;
3389 dx[0] = -Scprime/dScprimedWp;
3390 *f = 0.5*(Scprime*Scprime);
3402 FTYPE Ssofchi,dSsdrho,dSsdchi;
3403 getall_forinversion(whicheos,
EOMENTROPYGRMHD,CHIDIFF,EOSextra,rho0,wmrho0,&Ssofchi,&dSsdrho,&dSsdchi);
3411 Scprime = -Sc + D*Ssofchi;
3412 FTYPE Scprimenorm = fabs(Sc) + fabs(D*Ssofchi);
3419 if(Ssofchi!=Ssofchi || Scprime!=Scprime) Scprime=-
VERYBIG;
3426 FTYPE dvsq,dwmrho0dW,drho0dW;
3427 FTYPE dwmrho0dvsq,drho0dvsq;
3428 get_kinetics_part2(Wp, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra, W, X, X2, X3, utsq, gamma, gammasq, rho0, wmrho0, &dvsq,&dwmrho0dW,&drho0dW,&dwmrho0dvsq,&drho0dvsq);
3435 FTYPE dSsdW,dSsdvsq,dSsdWp;
3436 dSsdW = drho0dW *dSsdrho + dwmrho0dW *dSsdchi;
3437 dSsdvsq = drho0dvsq *dSsdrho + dwmrho0dvsq *dSsdchi;
3438 dSsdWp = dSsdW + dSsdvsq*dvsq;
3446 dScprimedWp = D*dSsdWp;
3452 if(dvsq!=dvsq || dSsdW!=dSsdW || dSsdvsq!=dSsdvsq || dSsdWp!=dSsdWp || dScprimedWp!=dScprimedWp) dScprimedWp=0.0;
3461 norm[0]=Scprimenorm;
3462 jac[0][0]=dScprimedWp;
3463 dx[0] = -Scprime/dScprimedWp;
3464 *f = 0.5*(Scprime*Scprime);
3476 static FTYPE res_sq_Sc_opt(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3485 func_Sc_opt(x, dx, resid, norm, jac, &f, &df, n, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc, whicheos, EOSextra);
3487 return( 0.5*resid[0]*resid[0] );
3508 static void func_vsq(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3512 FTYPE Wp,W, vsq, Wsq, p_tmp, dPdvsq, dPdW, temp, detJ,tmp2,tmp3;
3513 const int ltrace = 0;
3522 p_tmp = pressure_Wp_vsq(whicheos,EOSextra, Wp, D, vsq );
3523 dPdW = dpdWp_calc_vsq(whicheos,EOSextra, Wp, D, vsq );
3524 dPdvsq = dpdvsq_calc_Wp(whicheos,EOSextra, Wp, D, vsq );
3527 #if(CRAZYDEBUG&&DEBUGINDEX)
3528 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
3529 dualfprintf(fail_file,
"p_tmp=%21.15g dPdW=%21.15g dPdvsq=%21.15g\n",p_tmp,dPdW,dPdvsq);
3538 dx[0] = (-Bsq/2. + dPdvsq)*(Qtsq - vsq*((Bsq+W)*(Bsq+W)) +
3539 (QdotBsq*(Bsq + 2*W))/Wsq) +
3540 ((Bsq+W)*(Bsq+W))*(-Qdotnp - (Bsq*(1 + vsq))/2. + QdotBsq/(2.*Wsq) -Wp + p_tmp);
3542 dx[1] = -((-1 + dPdW - QdotBsq/(Wsq*W))*
3543 (Qtsq - vsq*((Bsq+W)*(Bsq+W)) + (QdotBsq*(Bsq + 2*W))/Wsq)) -
3544 2*(vsq + QdotBsq/(Wsq*W))*(Bsq + W)*
3545 (-Qdotnp - (Bsq*(1 + vsq))/2. + QdotBsq/(2.*Wsq) - Wp + p_tmp);
3547 detJ = (Bsq + W)*((-1 + dPdW - QdotBsq/(Wsq*W))*(Bsq + W) +
3548 ((Bsq - 2*dPdvsq)*(QdotBsq + vsq*(Wsq*W)))/(Wsq*W));
3553 jac[0][0] = -2*(vsq + QdotBsq/(Wsq*W))*(Bsq + W);
3554 jac[0][1] = -(Bsq + W)*(Bsq + W);
3555 jac[1][0] = -1 - QdotBsq/(Wsq*W) + dPdW;
3556 jac[1][1] = -Bsq/2. + dPdvsq;
3557 resid[0] = Qtsq - vsq*(Bsq + W)*(Bsq + W) + (QdotBsq*(Bsq + 2*W))/Wsq;
3558 resid[1] = -Qdotnp - (Bsq*(1 + vsq))/2. + QdotBsq/(2.*Wsq) - Wp + p_tmp;
3560 norm[0] = fabs(Qtsq) + fabs(vsq*(Bsq + W)*(Bsq + W)) + fabs((QdotBsq*(Bsq + 2*W))/Wsq);
3561 norm[1] = fabs(Qdotnp) + fabs((Bsq*(1 + vsq))/2.) + fabs(QdotBsq/(2.*Wsq)) + fabs(Wp) + fabs(p_tmp);
3563 *df = -resid[0]*resid[0] - resid[1]*resid[1];
3565 *f = -0.5 * ( *df );
3570 dualfprintf(fail_file,
"func_vsq(): x[0] = %21.15g , x[1] = %21.15g , dx[0] = %21.15g , dx[1] = %21.15g , f = %21.15g \n",
3571 x[0], x[1],dx[0], dx[1], *f);
3581 static void func_vsq2(
FTYPE x[],
FTYPE dx[],
FTYPE resid[],
FTYPE norm[],
FTYPE (*jac)[NEWT_DIM],
FTYPE *f,
FTYPE *df,
int n,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3585 FTYPE W, Wp,vsq, Wsq, p_tmp, dPdvsq, dPdW, temp, detJ,tmp2,tmp3;
3601 const int ltrace = 0;
3610 p_tmp = pressure_Wp_vsq(whicheos,EOSextra, Wp, D, vsq );
3611 dPdW = dpdWp_calc_vsq(whicheos,EOSextra, Wp, D, vsq );
3612 dPdvsq = dpdvsq_calc_Wp(whicheos,EOSextra, Wp, D, vsq );
3614 #if(CRAZYDEBUG&&DEBUGINDEX)
3615 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
3616 dualfprintf(fail_file,
"W=%21.15g D=%21.15g vsq=%21.15g\n",W,D,vsq);
3617 dualfprintf(fail_file,
"p_tmp=%21.15g dPdW=%21.15g dPdvsq=%21.15g\n",p_tmp,dPdW,dPdvsq);
3622 dualfprintf(fail_file,
"p_tmp=%21.15g dPdW=%21.15g dPdvsq=%21.15g\n",p_tmp,dPdW,dPdvsq);
3629 t2 = -0.5*Bsq+dPdvsq;
3633 t11 = Qtsq-vsq*t4+QdotBsq*(Bsq+2.0*W)*t9;
3634 FTYPE t11norm = fabs(Qtsq)+fabs(vsq*t4)+fabs(QdotBsq*(Bsq+2.0*W)*t9);
3636 t18 = -Qdotnp-0.5*Bsq*(1.0+vsq)+0.5*t16-Wp+p_tmp;
3637 FTYPE t18norm = fabs(Qdotnp)+fabs(0.5*Bsq*(1.0+vsq))+fabs(0.5*t16)+fabs(Wp)+fabs(p_tmp);
3642 t25 = -1.0+dPdW-t24;
3643 t35 = t25*t3+(Bsq-2.0*dPdvsq)*(QdotBsq+vsq*Wsq*W)*t9*t23;
3645 dx[0] = -(t2*t11+t4*t18)*t21*t36;
3648 dualfprintf(fail_file,
"Qdotn=%21.15g Qdotnp=%21.15g Wp=%21.15g p_tmp=%21.15g\n",Qdotn,Qdotnp,Wp,p_tmp);
3649 dualfprintf(fail_file,
"t2=%21.15g t3=%21.15g t4=%21.15g t9=%21.15g t11=%21.15g t16=%21.15g t18=%21.15g t21=%21.15g t23=%21.15g t24=%21.15g t25=%21.15g t35=%21.15g t36=%21.15g dx[0]=%21.15g\n",t2,t3,t4,t9,t11,t16,t18,t21,t23,t24,t25,t35,t36,dx[0]);
3653 dx[1] = -(-t25*t11-2.0*t40*t18)*t21*t36;
3655 jac[0][0] = -2.0*t40;
3664 *df = -resid[0]*resid[0] - resid[1]*resid[1];
3666 *f = -0.5 * ( *df );
3668 #if(CRAZYDEBUG&&DEBUGINDEX)
3669 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
3670 dualfprintf(fail_file,
"Qdotn=%21.15g QdotBsq=%21.15g Qtsq=%21.15g Bsq=%21.15g vsq=%21.15g W=%21.15g p_tmp=%21.15g -Qdotnp-Wp=%21.15g\n",Qdotn,QdotBsq,Qtsq,Bsq,vsq,W,p_tmp,-Qdotnp-Wp);
3672 dualfprintf(fail_file,
"t2=%21.15g\nt3=%21.15g\nt4=%21.15g\nt9=%21.15g\nt11=%21.15g\nt16=%21.15g\nt18=%21.15g\nt21=%21.15g\nt23=%21.15g\nt24=%21.15g\nt25=%21.15g\nt35=%21.15g\nt36=%21.15g\ndx[0]=%21.15g\nt40=%21.15g\ndx[1]=%21.15g\ndetJ=%21.15g\njac[0][0]=%21.15g\njac[0][1]=%21.15g\njac[1][0]=%21.15g\njac[1][1]=%21.15g\nresid[0]=%21.15g\nresid[1]=%21.15g\n",t2,t3,t4,t9,t11,t16,t18,t21,t23,t24,t25,t35,t36,dx[0],t40,dx[1],detJ,jac[0][0],jac[0][1],jac[1][0],jac[1][1],resid[0],resid[1]);
3674 dualfprintf(fail_file,
"*df=%21.15g *f=%21.15g Wp=%21.15g W=%21.15g\n",*df,*f,Wp,W);
3681 dualfprintf(fail_file,
"func_vsq2(): x[0] = %21.15g , x[1] = %21.15g , dx[0] = %21.15g , dx[1] = %21.15g , f = %21.15g \n",
3682 x[0], x[1],dx[0], dx[1], *f);
3692 static FTYPE res_sq_vsq(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3696 FTYPE W, Wp, vsq, Wsq, p_tmp, dPdvsq, dPdW, temp, detJ,tmp2,tmp3;
3697 FTYPE resid[2],norm[2];
3698 const int ltrace = 0;
3707 p_tmp = pressure_Wp_vsq(whicheos,EOSextra, Wp, D, vsq );
3715 resid[0] = Qtsq - vsq*(Bsq + W)*(Bsq + W) + (QdotBsq*(Bsq + 2*W))/Wsq;
3716 resid[1] = -Qdotnp - (Bsq*(1 + vsq))/2. + QdotBsq/(2.*Wsq) - Wp + p_tmp;
3718 norm[0] = fabs(Qtsq) + fabs(vsq*(Bsq + W)*(Bsq + W)) + fabs((QdotBsq*(Bsq + 2*W))/Wsq);
3719 norm[1] = fabs(Qdotnp) + fabs((Bsq*(1 + vsq))/2.) + fabs(QdotBsq/(2.*Wsq)) + fabs(Wp) + fabs(p_tmp);
3722 tmp3 = 0.5 * ( resid[0]*resid[0] + resid[1]*resid[1] ) ;
3726 dualfprintf(fail_file,
"res_sq_vsq(): W,vsq,resid0,resid1,f = %21.15g %21.15g %21.15g %21.15g %21.15g \n",
3727 W,vsq,resid[0],resid[1],tmp3);
3728 dualfprintf(fail_file,
"res_sq_vsq(): Qtsq, Bsq, QdotBsq, Qdotn = %21.15g %21.15g %21.15g %21.15g \n",
3729 Qtsq, Bsq, QdotBsq, Qdotn);
3739 static FTYPE res_sq_vsq2(
FTYPE x[],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
3742 FTYPE W, Wp, vsq, Wsq, p_tmp, dPdvsq, dPdW, temp, detJ,tmp2,tmp3;
3743 FTYPE resid[2],norm[2];
3750 const int ltrace = 0;
3759 p_tmp = pressure_Wp_vsq(whicheos,EOSextra, Wp, D, vsq );
3768 t11 = Qtsq-vsq*t4+QdotBsq*(Bsq+2.0*W)*t9;
3769 FTYPE t11norm = fabs(Qtsq)+fabs(vsq*t4)+fabs(QdotBsq*(Bsq+2.0*W)*t9);
3771 t18 = -Qdotnp-0.5*Bsq*(1.0+vsq)+0.5*t16-Wp+p_tmp;
3772 FTYPE t18norm = fabs(Qdotnp)+fabs(0.5*Bsq*(1.0+vsq))+fabs(0.5*t16)+fabs(Wp)+fabs(p_tmp);
3778 tmp3 = 0.5 * ( resid[0]*resid[0] + resid[1]*resid[1] ) ;
3782 dualfprintf(fail_file,
"res_sq_vsq(): W,vsq,resid0,resid1,f = %21.15g %21.15g %21.15g %21.15g %21.15g \n",
3783 W,vsq,resid[0],resid[1],tmp3);
3784 dualfprintf(fail_file,
"res_sq_vsq(): Qtsq, Bsq, QdotBsq, Qdotn = %21.15g %21.15g %21.15g %21.15g \n",
3785 Qtsq, Bsq, QdotBsq, Qdotn);
3789 #if(CRAZYDEBUG&&DEBUGINDEX)
3790 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
3791 dualfprintf(fail_file,
"res: W=%21.15g Wsq=%21.15g p_tmp=%21.15g t3=%21.15g t4=%21.15g t9=%21.15g t11=%21.15g t16=%21.15g t18=%21.15g resid[0]=%21.15g resid[1]=%21.15g tmp3=%21.15g\n",W,Wsq,p_tmp,t3,t4,t9,t11,t16,t18,resid[0],resid[1],tmp3);
3817 static int find_root_1D_gen(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3825 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_1d, 1,
USE_LINE_SEARCH, func_1d_orig, res_sq_1d_orig, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3827 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_1d[0] = %21.15g \n", x_1d[0] );
3838 static int find_root_1D_gen_scn(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3846 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_1d, 1,
USE_LINE_SEARCH,
func_1d_orig_scn,
res_sq_1d_orig_scn, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3848 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_1d[0] = %21.15g \n", x_1d[0] );
3859 static int find_root_1D_gen_Eprime(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3868 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_1d, 1,
USE_LINE_SEARCH,
func_Eprime_opt,
res_sq_Eprime_opt, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3870 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_1d[0] = %21.15g \n", x_1d[0] );
3880 static int find_root_1D_gen_Psq(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3888 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_1d, 1,
USE_LINE_SEARCH,
func_Psq,
res_sq_Psq, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3890 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_1d[0] = %21.15g \n", x_1d[0] );
3903 static int find_root_3D_gen_Palpha(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3913 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_3d, 3,
USE_LINE_SEARCH,
func_Psq,
res_sq_Psq, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3915 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_3d[0] = %21.15g x_3d[1] = %21.15g x_3d[2] = %21.15g \n", x_3d[0], x_3d[1], x_3d[2] );
3926 static int find_root_1D_gen_Sc(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3935 if( (retval=general_newton_raphson(showmessages, lpflag, eomtype, x_1d, 1,
USE_LINE_SEARCH,
func_Sc_opt,
res_sq_Sc_opt, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ) ) {
3937 if( debugfail>=2 ) dualfprintf(fail_file,
"GNR failed, x_1d[0] = %21.15g \n", x_1d[0] );
3969 static int find_root_2D_gen(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x0,
FTYPE *xnew,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
3972 FTYPE x[2], x_orig[2];
3977 const int ltrace = 0;
3980 x_orig[0] = x[0] = fabs(x0) ;
3981 x1_of_x0( x0, &x[1], wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
3984 #if(CRAZYDEBUG&&DEBUGINDEX)
3985 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
3986 dualfprintf(fail_file,
"x[0]=%21.15g W=%21.15g x[1]=%21.15g\n",x[0],x[0]+D,x[1]);
3992 dualfprintf(fail_file,
"find_root_2D_gen(): x[0] = %21.15g , x[1] = %21.15g \n", x[0], x[1]);
3998 for(it=0;it<n;it++) dualfprintf(fail_file,
"x[%d]=%21.15g xnew[%d]=%21.15g\n",it,x[it],it,xnew[it]);
4001 retval = general_newton_raphson(showmessages, lpflag, eomtype, x, n,
USE_LINE_SEARCH, func_vsq2, res_sq_vsq2, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ;
4007 for( it=0; it<ntries; it++) x[0] *= 10.0;
4008 x1_of_x0( x[0],&x[1], wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
4010 retval = general_newton_raphson(showmessages, lpflag, eomtype, x, n,
USE_LINE_SEARCH, func_vsq2, res_sq_vsq2, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats) ;
4014 dualfprintf(fail_file,
"find_root_2D_gen(): ntries, x[0,1] = %4i %21.15g %21.15g \n", ntries, x[0], x[1]);
4021 #if( MAX_NEWT_RETRIES > 0 )
4023 if( debugfail >= 2 ) {
4024 dualfprintf(fail_file,
"find_root_2D_gen(): Bad exit value from general_newton_raphson() !! \n");
4025 dualfprintf(fail_file,
"find_root_2D_gen(): ntries = %d , x[0] = %21.15g , x[1] = %21.15g \n", ntries, x[0], x[1]);
4047 static int general_newton_raphson(
int showmessages,
PFTYPE *lpflag,
int eomtype,
FTYPE x[],
int n,
int do_line_search,
4048 void (*funcd) (
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [],
FTYPE [][NEWT_DIM],
FTYPE *,
FTYPE *,
int,
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
4049 FTYPE (*res_func) (
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra,
struct of_newtonstats *newtonstats)
4051 FTYPE f, f_old, df, df_old, dx[
NEWT_DIM], dx_old[
NEWT_DIM], x_old[
NEWT_DIM], x_older[
NEWT_DIM], x_olderer[
NEWT_DIM], resid[
NEWT_DIM], norm[
NEWT_DIM], jac[
NEWT_DIM][
NEWT_DIM];
4053 int n_iter, id, jd, i_extra, doing_extra;
4055 FTYPE dW,dvsq,vsq_old,vsq,W,W_old;
4056 FTYPE resid_norm, resid_check, grad_check;
4058 FTYPE res_func_val, res_func_old, res_func_new;
4066 int keep_iterating, i_increase, retval2,retval = 0;
4067 const int ltrace = 0;
4068 const int ltrace2 = 1;
4073 void (*ptr_validate_x)(
FTYPE x[
NEWT_DIM],
FTYPE x0[
NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
4087 FTYPE NEWT_TOL_ULTRAREL_VAR;
4091 FTYPE MIN_NEWT_TOL_VAR;
4095 FTYPE MAX_NEWT_ITER_VAR;
4099 int EXTRA_NEWT_ITER_VAR;
4103 int EXTRA_NEWT_ITER_ULTRAREL_VAR;
4112 for(it=0;it<n;it++){
4114 xlist[it][listi]=errxlist[listi]=
BIG;
4115 dxlist[it][listi]=trueerrorlist[listi]=
BIG;
4130 df = df_old = f = f_old = 1.;
4131 i_extra = doing_extra = 0;
4132 for(
id = 0;
id < n ;
id++) x_olderer[
id]=x_older[
id]=x_old[
id] = x_orig[
id] = x[
id] ;
4133 vsq_old = vsq = W = W_old = 0.;
4135 for(
id = 0;
id < n ;
id++) DAMPFACTOR[
id]=1.0;
4136 for(
id = 0;
id < n ;
id++) dx_old[
id]=
VERYBIG;
4149 while( keep_iterating ) {
4154 for(
id = 0;
id < n ;
id++) DAMPFACTOR[
id]=0.5;
4159 #if(CRAZYDEBUG&&DEBUGINDEX)
4161 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
4162 for(it=0;it<n;it++) dualfprintf(fail_file,
"before funcd: x[%d]=%21.15g dx[%d]=%2.15g\n",it,x[it],it,dx[it]);
4168 (*funcd) (x,
dx, resid, norm, jac, &f, &df, n, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
4171 for(it=0;it<n;it++) trueerror[it]=fabs(resid[it]/(
SMALL+fabs(norm[it])));
4173 for(it=0;it<n;it++) trueerrortotal =
MAX(trueerrortotal,(1.0/(
FTYPE)(n))*(fabs(resid[it])/(
SMALL+fabs(norm[it]))));
4176 errxlist[n_iter] = errx;
4177 trueerrorlist[n_iter] = trueerrortotal;
4178 for(it=0;it<n;it++){
4179 dxlist[it][n_iter] = fabs(dx[it]);
4180 xlist[it][n_iter] = x[it];
4185 id=0;
if(resid[
id] <=-
VERYBIG || jac[0][
id]==0.0){
4196 for(it=0;it<n;it++) dualfprintf(fail_file,
"lntries=%d after funcd: x[%d]=%26.20g dx[%d]=%26.20g f=%26.20g df=%26.20g errx=%26.20g trueerror=%26.20g (%26.20g %26.20g) diddamp=%d dampfactor=%26.20g didcycle=%d : %g %g %g %g %g %g %g %g %g\n",(
int)(newtonstats->
lntries),it,x[it],it,dx[it],f,df,errx,resid[it]/norm[it],NEWT_TOL_VAR,NEWT_TOL_ULTRAREL_VAR,diddamp,DAMPFACTOR[it],didcycle,wglobal[2],Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc);
4201 #if(CRAZYDEBUG&&DEBUGINDEX)
4203 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
4204 for(it=0;it<n;it++) dualfprintf(fail_file,
"after funcd: x[%d]=%21.15g dx[%d]=%2.15g\n",it,x[it],it,dx[it]);
4211 if( (finite(f)==0) || (finite(df)==0) ) {
4212 if( debugfail >= 2 ) {
4213 dualfprintf(fail_file,
"general_newton_raphson(): nan encountered in f or df!! \n");
4214 dualfprintf(fail_file,
"gnr nan(): f, df, x0, dx0 = %21.15g %21.15g %21.15g %21.15g \n", f,df,x[0],dx[0]);
4224 randtmp = ( (1.*rand())/(1.*RAND_MAX) );
4225 for(
id = 0;
id < n ;
id++) dx[
id] *= randtmp;
4231 errx_oldest = errx_old;
4235 for(
id = 0;
id < n ;
id++) {
4236 x_olderer[id]=x_older[id];
4237 x_older[id]=x_old[id];
4253 if( do_line_search == 1 ) {
4258 for(
id = 0;
id < n ;
id++) {
4259 resid_norm += fabs(resid[
id]);
4261 resid_norm /= 1.0*n ;
4262 if( resid_norm == 0.0 ) resid_norm = 1.0;
4265 for(
id = 0;
id < n ;
id++) {
4267 for( jd = 0; jd < n ; jd++) {
4268 tmp += jac[jd][id] * resid[jd];
4272 for(
id = 0;
id < n ;
id++) {
4276 my_lnsrch(eomtype, n, x_old-1, f_old, del_f-1, dn-1, x-1, &f,
TOL_LINE_STEP,
SCALEMAX, &retval, res_func, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
4279 for(
id = 0;
id < n ;
id++) {
4280 dx[id] = x[id] - x_old[id];
4285 res_func_val = res_func(x, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc );
4286 res_func_old = res_func(x_old, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc );
4287 dualfprintf(fail_file,
"gnr(): f_old, f, res_func_old, res_func_val = %21.15g %21.15g %21.15g %21.15g \n",
4288 f_old, f, res_func_old, res_func_val );
4289 dualfprintf(fail_file,
"gnr(): x_old = ");
4290 for(
id = 0;
id < n ;
id++) {
4291 dualfprintf(fail_file,
" %21.15g ",x_old[
id]);
4293 dualfprintf(fail_file,
"\n ");
4294 dualfprintf(fail_file,
"gnr(): x = ");
4295 for(
id = 0;
id < n ;
id++) {
4296 dualfprintf(fail_file,
" %21.15g ",x[
id]);
4298 dualfprintf(fail_file,
"\n ");
4299 dualfprintf(fail_file,
"gnr(): dn = ");
4300 for(
id = 0;
id < n ;
id++) {
4301 dualfprintf(fail_file,
" %21.15g ",dn[
id]);
4303 dualfprintf(fail_file,
"\n ");
4304 dualfprintf(fail_file,
"gnr(): del_f = ");
4305 for(
id = 0;
id < n ;
id++) {
4306 dualfprintf(fail_file,
" %21.15g ",del_f[
id]);
4308 dualfprintf(fail_file,
"\n ");
4314 resid_check = 0.0e0;
4315 for(
id = 0;
id < n ;
id++) {
4316 resid_check += fabs(resid[
id]);
4318 resid_check /= 1.0*n;
4323 if( ltrace && retval ) {
4324 dualfprintf(fail_file,
"general_newton_raphson(): retval, resid_check = %4i %21.15g \n",retval, resid_check);
4329 if(debugfail>=2) dualfprintf(fail_file,
"bad first step\n");
4332 dualfprintf(fail_file,
"gnr(): bad first step: retval, f_old, f = %4i %21.15g %21.15g \n",retval,f_old,f);
4333 dualfprintf(fail_file,
"gnr: doing recursive call, retval, errx = %4i %21.15g \n", retval, errx );
4336 retval = general_newton_raphson(showmessages, lpflag, eomtype, x_orig, n, ((do_line_search+1)%2), funcd, res_func, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
4337 for(
id = 0;
id < n ;
id++) x[
id] = x_orig[
id] ;
4344 for(
id = 0;
id < n ;
id++) {
4345 resid_check = (x[id] == 0.) ? 1.0 : fabs(x[
id]) ;
4346 grad_check += del_f[id] * resid_check ;
4348 resid_check = (f == 0.) ? 1.0 : fabs(f) ;
4349 grad_check /= resid_check;
4356 dualfprintf(fail_file,
"general_newton_raphson(): retval, grad_check = %4i %21.15g \n",retval, grad_check);
4369 #if(JONGENNEWTSTUFF)
4371 for(
id=0;
id<n;
id++) {
4373 x_olderer[id]=x[id];
4383 for(
id=0;
id<n;
id++){
4385 if(resid[
id] <=-
VERYBIG || jac[0][
id]==0.0 ){
4387 if(1 || fabs(x_old[0])>wglobal[2]){
4389 DAMPFACTOR[id]=0.5*DAMPFACTOR[id];
4393 if(showmessages&&debugfail>=3) dualfprintf(fail_file,
"resetW: nstep=%ld steppart=%d :: lntries=%d :: id=%d :: x=%21.15g dx=%21.15g : x/D=%21.15g DAMPFACTOR=%21.15g errx=%21.15g eomtype=%d\n",
nstep,
steppart,(
int)(newtonstats->
lntries),
id,x[
id],dx[
id],x[
id]/D,DAMPFACTOR[
id],newtonstats->
lerrx,eomtype);
4402 (*funcd) (x,
dx, resid, norm, jac, &f, &df, n, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
4403 for(
id=0;
id<n;
id++){
4404 if(resid[
id] <=-
VERYBIG || jac[0][
id]==0.0 ){
4406 if(debugfail>=2) dualfprintf(fail_file,
"Old value failed too: resid[%d]=%26.20g jac[0][%d]=%26.20g\n",
id,resid[
id],
id,jac[0][
id]);
4412 x_olderer[id]=x[id];
4422 if(n_iter>4 && doing_extra==0){
4427 dualfprintf(fail_file,
"errx=%26.20g errx_old=%26.20g errx_oldest=%26.20g dx=%26.20g dx_old=%26.20g x=%26.20g x_old=%26.20g x_older=%26.20g x_olderer=%26.20g\n",errx,errx_old,errx_oldest,dx[0],dx_old[0],x[0],x_old[0],x_older[0],x_olderer[0]);
4428 dualfprintf(fail_file,
"differrx=%26.20g is=%d diffx=%26.20g is=%d\n",errx_old-errx_oldest,errx_old==errx_oldest,x[0]-x_olderer[0],x[0]==x_olderer[0]);
4432 if(
newt_cyclecheck(n, trueerrortotal, errx, errx_old, errx_oldest, dx, dx_old, x, x_old, x_older, x_olderer, n_iter, xlist,dxlist, errxlist, trueerrorlist)){
4434 if(debugfail>=2) dualfprintf(fail_file,
"Caught in cycle, trying to damp: n_iter=%d.\n",n_iter);
4436 for(
id=0;
id<n;
id++) DAMPFACTOR[
id]=0.1*DAMPFACTOR[
id];
4456 for(
id = 0;
id < n ;
id++) {
4457 x[id] =
MAX((x[
id]+DAMPFACTOR[
id]*dx[
id]),(x[
id]-0.0)/100.0);
4464 for(
id = 0;
id < n ;
id++) {
4465 x[id] +=DAMPFACTOR[id]*dx[id] ;
4475 for(
id = 0;
id < n ;
id++) {
4476 if(diddamp==0) DAMPFACTOR[id]=
MIN(1.0,2.0*DAMPFACTOR[
id]);
4480 #if(CRAZYDEBUG&&DEBUGINDEX)
4481 if(ifileglobal==0 && jfileglobal==63 &&
nstep==9 &&
steppart==2){
4482 dualfprintf(fail_file,
"no line search: x[0]=%21.15g dx[0]=%21.15g\n",x[0],dx[0]);
4503 #if( NEWCONVERGE == 1 )
4507 #if(JONGENNEWTSTUFF==0)
4513 errx = (wglobal[0]==0.) ? fabs(dx[0]) : fabs(dx[0]/
MAX(fabs(wglobal[0]),fabs(x[0])));
4515 #elif(JONGENNEWTSTUFF==1)
4519 errx = (wglobal[0]==0.) ? fabs(dx_old[0]) : fabs(dx_old[0]/
MAX(fabs(wglobal[0]),fabs(x[0])));
4526 #if(CRAZYDEBUG&&DEBUGINDEX)
4527 if(ifileglobal==0 && jfileglobal==31 &&
nstep==9 &&
steppart==2){
4528 dualfprintf(fail_file,
"x[0]=%21.15g dx[0]=%21.15g\n",x[0],dx[0]);
4535 for(
id = 0;
id < n ;
id++) {
4536 errx += (x[id]==0.) ? fabs(dx[
id]) : fabs(dx[id]/x[id]);
4546 newtonstats->
lerrx=errx;
4555 validate_x(ptr_validate_x, x, x_old, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra) ;
4561 #if( CHECK_FOR_STALL )
4562 if( ( (errx_old == errx) || (errx_oldest == errx) ) && (errx <= MIN_NEWT_TOL_VAR) ) errx = -errx;
4568 if( (retval == 1) || (retval == -1) ) errx = -errx;
4573 dualfprintf(fail_file,
" general_newton_raphson(): niter,f_old,f,errx_old,errx = %4i %21.15g %21.15g %21.15g %21.15g\n",
4574 n_iter,f_old,f,errx_old,errx );
4575 dualfprintf(fail_file,
"gnr(): x_old = ");
4576 for(
id = 0;
id < n ;
id++) {
4577 dualfprintf(fail_file,
" %21.15g ",x_old[
id]);
4579 dualfprintf(fail_file,
"\n ");
4580 dualfprintf(fail_file,
"gnr(): x = ");
4581 for(
id = 0;
id < n ;
id++) {
4582 dualfprintf(fail_file,
" %21.15g ",x[
id]);
4584 dualfprintf(fail_file,
"\n ");
4585 dualfprintf(fail_file,
"gnr(): dx = ");
4586 for(
id = 0;
id < n ;
id++) {
4587 dualfprintf(fail_file,
" %21.15g ",dx[
id]);
4589 dualfprintf(fail_file,
"\n ");
4597 for(
id = 0;
id < n ;
id++) dx_old[
id] = dx[
id] ;
4609 if(
newt_errorcheck(n, NEWT_TOL_VAR, NEWT_TOL_ULTRAREL_VAR, errx, trueerrortotal, x[0], dx[0], x, dx, wglobal) && (doing_extra == 0) && (
newt_extracheck(n, EXTRA_NEWT_ITER_VAR, EXTRA_NEWT_ITER_ULTRAREL_VAR, errx,x[0],dx[0],x, dx, wglobal) > 0) ) {
4614 if(doing_extra==0 &&
newt_repeatcheck(n,errx,errx_old,errx_oldest,dx,dx_old,x,x_old,x_older,x_olderer) ){
4615 if(debugfail>=2) dualfprintf(fail_file,
"Repeat found\n");
4620 if( doing_extra == 1 ) i_extra++ ;
4622 if( (
newt_errorcheck(n, NEWT_TOL_VAR, NEWT_TOL_ULTRAREL_VAR, errx, trueerrortotal, x[0], dx[0],x,dx, wglobal)&&(doing_extra == 0)) || (i_extra >
newt_extracheck(n, EXTRA_NEWT_ITER_VAR, EXTRA_NEWT_ITER_ULTRAREL_VAR, errx,x[0],dx[0],x,dx,wglobal)) || (n_iter >= (MAX_NEWT_ITER_VAR-1)) ) {
4635 #define CHECKDECREASE0 5
4636 #define CHECKDECREASEAVGNUM 3 // should be less than CHECKDECREASE0
4637 #define CHECKDECFACTOR (0.5) // i.e. should drop by this factor compared to older average
4638 if(0&&newtoniter>CHECKDECREASE0){
4643 avgerror/=(CHECKDECREASEAVGNUM);
4645 currenterror=errorlist[newtoniter];
4651 if(debugfail>=2) dualfprintf(fail_file,
"Error not decreasing properly: currenterror=%g avgerror=%g\n",currenterror,avgerror);
4662 #if(CRAZYDEBUG&&DEBUGINDEX)
4671 dualfprintf(fail_file,
"i=%d j=%d part=%d step=%ld :: n_iter=%d :: errx=%21.15g minerr=%21.15g :: x[0]=%21.15g dx[0]=%21.15g wglobal0=%21.15g\n",ifileglobal,jfileglobal,
steppart,
nstep,n_iter,errx,MIN_NEWT_TOL_VAR,x[0],dx[0],wglobal[0]);
4698 for(
id=0;
id<n;
id++){
4699 if(finite(x[
id])==0) foundnan=1;
4702 if( (finite(f)==0) || (finite(df)==0) ){
4708 #if(!OPTIMIZED || PRODUCTION==0)
4710 dualfprintf(fail_file,
"naninf: f=%21.15g df=%21.15g\n",f,df);
4711 for(
id=0;
id<n;
id++){
4712 dualfprintf(fail_file,
"naninf: x[%d]=%21.15g\n",
id,x[
id]);
4715 if( debugfail >= 2 ) {
4716 dualfprintf(fail_file,
"general_newton_raphson(): nan encountered in f or df!! \n");
4717 dualfprintf(fail_file,
"gnr nan(): f, df, x0, dx0 = %21.15g %21.15g %21.15g %21.15g \n", f,df,x[0],dx[0]);
4735 #if(JONGENNEWTSTUFF==1)
4736 for(
id=0;
id<n;
id++) {
4745 if(
newt_errorcheck(n, NEWT_TOL_VAR, NEWT_TOL_ULTRAREL_VAR, errx, trueerrortotal, x[0], dx[0], x,dx,wglobal) ){
4747 bin_newt_data(MAX_NEWT_ITER_VAR, errx, n_iter, 2, 0 );
4751 dualfprintf(fail_file,
" totalcount = %d 2 %d %d %d %21.15g \n",n_iter,retval,do_line_search,i_extra, errx);
4763 if( (fabs(errx) <= MIN_NEWT_TOL_VAR) &&
newt_errorcheck(n, NEWT_TOL_VAR, NEWT_TOL_ULTRAREL_VAR, errx, trueerrortotal, x[0], dx[0], x,dx,wglobal) ){
4765 bin_newt_data(MAX_NEWT_ITER_VAR, errx, n_iter, 1, 0 );
4769 dualfprintf(fail_file,
" totalcount = %d 1 %d %d %d %21.15g \n",n_iter,retval,do_line_search,i_extra,errx);
4773 dualfprintf(fail_file,
"general_newton_raphson(): found minimal solution \n");
4780 #if(JONGENNEWTSTUFF==1)
4781 for(
id=0;
id<n;
id++) {
4791 if( fabs(errx) > MIN_NEWT_TOL_VAR){
4794 bin_newt_data(MAX_NEWT_ITER_VAR, errx, n_iter, 0, 0 );
4798 dualfprintf(fail_file,
"fabs(errx)=%21.15g > MIN_NEWT_TOL_VAR=%21.15g n=%d n_iter=%d lntries=%d eomtype=%d\n",fabs(errx),MIN_NEWT_TOL_VAR,n,n_iter,newtonstats->
lntries,eomtype);
4807 dualfprintf(fail_file,
" totalcount = %d 0 %d %d %d %21.15g \n",n_iter,retval,do_line_search,i_extra,errx);
4810 dualfprintf(fail_file,
"general_newton_raphson(): did not find solution \n");
4811 if( retval == -1 ) {
4812 dualfprintf(fail_file,
"general_newton_raphson(): lnsrch converged: x = ");
4813 for(
id = 0;
id < n ;
id++) dualfprintf(fail_file,
" %21.15g ",x[
id]);
4814 dualfprintf(fail_file,
"\n");
4815 dualfprintf(fail_file,
"general_newton_raphson(): lnsrch converged: x_old = ");
4816 for(
id = 0;
id < n ;
id++) dualfprintf(fail_file,
" %21.15g ",x_old[
id]);
4817 dualfprintf(fail_file,
"\n");
4830 retval2 = general_newton_raphson(showmessages, lpflag, eomtype, x_orig, n, ((do_line_search+1)%2), funcd, res_func, wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra,newtonstats);
4831 for(
id = 0;
id < n ;
id++) x[
id] = x_orig[
id] ;
4834 if(debugfail>=2) dualfprintf(fail_file,
"fabs(errx) > MIN_NEWT_TOL_VAR: n_iter=%d lntries=%d\n",n_iter,newtonstats->
lntries);
4844 dualfprintf(fail_file,
"gnr retval6 = %4i \n", 0);
4868 ultrarel=( (fabs(wglobal[1])>wglobal[2]) || (fabs(x0)>wglobal[2]) );
4873 for(iter=0;iter<n;iter++) dxsmallcount += (fabs(dx[iter])<
NUMEPSILON*x[iter]);
4876 return(fabs(errx) <= NEWT_TOL_VAR || fabs(trueerrortotal) <= NEWT_TOL_VAR || dxsmallcount==n);
4879 return(fabs(errx) <= NEWT_TOL_ULTRAREL_VAR || fabs(trueerrortotal) <= NEWT_TOL_ULTRAREL_VAR || dxsmallcount==n);
4894 if( (x[i]==x_olderer[i] && fabs(dx[i])==fabs(dx_old[i])) && (errx_oldest==errx_old) ){
4899 if(repeat==n)
return(1);
4910 static int newt_cyclecheck(
int n,
FTYPE trueerror,
FTYPE errx,
FTYPE errx_old,
FTYPE errx_oldest,
FTYPE *dx,
FTYPE *dx_old,
FTYPE *x,
FTYPE *x_old,
FTYPE *x_older,
FTYPE *x_olderer,
int n_iter,
FTYPE (*xlist)[
MAX_NEWT_ITER+
EXTRA_NEWT_ITER_ULTRAREL+
EXTRA_NEWT_ITER],
FTYPE (*dxlist)[
MAX_NEWT_ITER+
EXTRA_NEWT_ITER_ULTRAREL+
EXTRA_NEWT_ITER],
FTYPE *errxlist,
FTYPE *trueerrorlist)
4918 if( (x[i]==x_olderer[i]) && (errx_oldest==errx_old && errx_old!=0.0) ){
4927 if(errx_old!=0.0 && errx_old==errxlist[ii]) cycle2++;
4928 if(trueerror!=0.0 && trueerror==trueerrorlist[ii]) cycle2++;
4930 if(x[i]==xlist[i][ii]) cycle2++;
4937 if(cycle>=n || cycle2>=
NUMCYCLES*n)
return(1);
4949 ultrarel=( (fabs(wglobal[1])>wglobal[2]) || (fabs(x0)>wglobal[2]) );
4954 for(iter=0;iter<n;iter++) dxsmallcount += (fabs(dx[iter])<
NUMEPSILON*x[iter]);
4956 if(dxsmallcount)
return(0);
4959 return(EXTRA_NEWT_ITER_VAR);
4962 return(EXTRA_NEWT_ITER_ULTRAREL_VAR);
4971 FTYPE *f,
FTYPE TOLX,
FTYPE stpmax,
int *check,
FTYPE (*func) (
FTYPE [],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra),
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra)
4974 FTYPE a,alam,alam2,alamin,b,disc,f2,fold2,rhs1,rhs2,slope,sum,temp,test,tmplam;
4977 FTYPE bad_step_factor = 2.0;
4978 const int ltrace = 0;
4979 void (*ptr_validate_x)(
FTYPE x[
NEWT_DIM],
FTYPE x0[
NEWT_DIM],
FTYPE *wglobal,
FTYPE Bsq,
FTYPE QdotB,
FTYPE QdotBsq,
FTYPE Qtsq,
FTYPE Qdotn,
FTYPE Qdotnp,
FTYPE D,
FTYPE Sc,
int whicheos,
FTYPE *EOSextra);
4989 for (sum=0.0,i=1;i<=n;i++) sum += p[i]*p[i];
4992 for (i=1;i<=n;i++) p[i] *= stpmax/sum;
4993 for (slope=0.0,i=1;i<=n;i++)
4996 for (i=1;i<=n;i++) {
4998 temp= (xold[
i] == 0.) ? fabs(p[i]) : fabs(p[i]/xold[i]);
4999 if (temp > test) test=temp;
5005 dualfprintf(fail_file,
"my_lnsrch(): sum, slope, test, alamin = %21.15g %21.15g %21.15g %21.15g \n",sum,slope,test,alamin);
5011 for (i=1;i<=n;i++) x[i]=xold[i]+alam*p[i];
5014 validate_x(ptr_validate_x, (x+1), (xold+1), wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
5016 *f=(*func)(x+1,wglobal,Bsq,QdotB,QdotBsq,Qtsq,Qdotn,Qdotnp,D,Sc,whicheos,EOSextra);
5020 if( finite(*f)==0 ) {
5031 dualfprintf(fail_file,
"my_lnsrch(): bad_step = 1, f = %21.15g , alam = %21.15g \n", *f, alam);
5032 for( i = 1; i <= n; i++ ) {
5033 dualfprintf(fail_file,
"my_lnsrch(): (xold[%d], x[%d], p[%d]) = %21.15g , %21.15g , %21.15g \n", i,i,i, xold[i],x[i],p[i]);
5039 if (alam < alamin) {
5040 for (i=1;i<=n;i++) x[i]=xold[i];
5044 dualfprintf(fail_file,
"my_lnsrch(): alam < alamin: alam, alamin = %21.15g %21.15g \n", alam,alamin);
5049 else if (*f <= fold+
ALF*alam*slope) {
5052 dualfprintf(fail_file,
"my_lnsrch(): good exit: alam, alamin, f, fold = %21.15g %21.15g %21.15g %21.15g \n", alam,alamin, *f, fold);
5059 tmplam = -slope/(2.0*(*f-fold-slope));
5062 dualfprintf(fail_file,
"my_lnsrch(): setting tmplam!! tmplam, alam = %21.15g %21.15g !!\n", tmplam, alam);
5067 rhs1 = *f-fold-alam*slope;
5068 rhs2=f2-fold2-alam2*slope;
5069 a=(rhs1/(alam*alam)-rhs2/(alam2*alam2))/(alam-alam2);
5070 b=(-alam2*rhs1/(alam*alam)+alam*rhs2/(alam2*alam2))/(alam-alam2);
5071 if (a == 0.0) tmplam = -slope/(2.0*b);
5073 disc=b*b-3.0*a*slope;
5076 if( disc < -1.e-10 ) {
5077 if( ltrace ) dualfprintf(fail_file,
"my_lnsrch(): Big Roundoff problem: disc = %21.15g \n", disc);
5082 else tmplam=(-b+sqrt(disc))/(3.0*a);
5084 if (tmplam>0.5*alam)
5088 dualfprintf(fail_file,
"my_lnsrch(): rhs1, rhs2, a, b, tmplam, alam = %21.15g %21.15g %21.15g %21.15g %21.15g %21.15g !!\n",
5089 rhs1, rhs2, a, b, tmplam, alam );
5097 alam=
max(tmplam,0.1*alam);
5100 dualfprintf(fail_file,
"my_lnsrch(): icount, alam, alam2, tmplam = %4i %21.15g %21.15g %21.15g \n",
5101 icount, alam, alam2, tmplam);
5110 #define N_CONV_TYPES 3
5111 #define N_NITER_BINS (MAX_NEWT_ITER + 3) // want to use MAX_NEWT_ITER_VAR, but not fixed, so constrain to be less.
5131 static void bin_newt_data(
FTYPE MAX_NEWT_ITER_VAR,
FTYPE errx,
int niters,
int conv_type,
int print_now ) {
5136 static int first_call = 1;
5137 static long int n_bin_calls = 0L;
5138 const long int n_output_freq = 128*128*100;
5142 static const FTYPE localerrx_min = -23.;
5143 static const FTYPE localerrx_max = 4.;
5144 static FTYPE d_errx;
5147 static long int n_beyond_range = 0L;
5155 if(omp_in_parallel()){
5156 dualfprintf(fail_file,
"bin_newt_data() called in parallel region\n");
5164 d_errx = ((localerrx_max - localerrx_min)/(1.*
NBINS));
5167 for( j = 0; j <
NBINS; j++ ) {
5175 for( j = 0; j <
NBINS; j++ ) {
5176 xbin[
j] = localerrx_min + (1.*j + 0.5)*d_errx;
5183 if( print_now != 1 ) {
5187 localerrx = log10(errx + 1.0e-2*pow(10.,localerrx_min));
5190 dualfprintf(fail_file,
"bin_newt_data(): bad value for niters = %d \n", niters );
5196 if( localerrx < localerrx_min ) {
5200 else if( localerrx >= localerrx_max ) {
5205 ibin = (int) ( ( localerrx - localerrx_min ) / d_errx );
5209 n_errx[ conv_type][ibin]++;
5210 n_niters[conv_type][niters]++;
5216 if( print_now || ( (n_bin_calls % n_output_freq) == 0 ) ) {
5218 dualfprintf(
log_file,
"t = %21.15g , n_beyond_range = %ld , n_bin_calls = %ld \n",
t, n_beyond_range, n_bin_calls);
5221 dualfprintf(
log_file,
"ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--\n");
5228 for( i = 0; i <
NBINS; i++ ) {
5229 dualfprintf(
log_file,
"%21.15g ",xbin[i]);
5231 dualfprintf(
log_file,
"%13ld ", n_errx[j][i]);
5235 dualfprintf(
log_file,
"ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--ERRX-HISTOGRAM--\n");
5240 dualfprintf(
log_file,
"NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--\n");
5250 dualfprintf(
log_file,
"%13ld ", n_niters[j][i]);
5254 dualfprintf(
log_file,
"NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--NITER-HISTOGRAM--\n");
5259 if( print_now != 1 ) n_bin_calls++;