diff options
Diffstat (limited to 'src/GRHydro_Con2PrimM_pt.c')
-rw-r--r-- | src/GRHydro_Con2PrimM_pt.c | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/src/GRHydro_Con2PrimM_pt.c b/src/GRHydro_Con2PrimM_pt.c index f5ffd56..cfcf4c0 100644 --- a/src/GRHydro_Con2PrimM_pt.c +++ b/src/GRHydro_Con2PrimM_pt.c @@ -71,23 +71,26 @@ ***************************************************/ /* Local Globals */ -static CCTK_REAL Bsq,QdotBsq,Qtsq,Qdotn,D,half_Bsq ; +struct LocGlob { + CCTK_REAL Bsq,QdotBsq,Qtsq,Qdotn,D,half_Bsq ; +} ; // Declarations: -static CCTK_REAL vsq_calc(CCTK_REAL W); +static CCTK_REAL vsq_calc(CCTK_REAL W, struct LocGlob *lgp); -static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, +static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, struct LocGlob *lgp, void (*funcd) (CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], CCTK_REAL [][2], - CCTK_REAL *, CCTK_REAL *, CCTK_REAL) ); + CCTK_REAL *, CCTK_REAL *, CCTK_REAL, struct LocGlob *) ); static void func_vsq( CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], CCTK_REAL [][2], - CCTK_REAL *f, CCTK_REAL *df, CCTK_REAL gammaeos); -static CCTK_REAL x1_of_x0(CCTK_REAL x0 ) ; + CCTK_REAL *f, CCTK_REAL *df, CCTK_REAL gammaeos, struct LocGlob *lgp); + +static CCTK_REAL x1_of_x0(CCTK_REAL x0, struct LocGlob *lgp ) ; // EOS STUFF: -static CCTK_REAL eos_info(CCTK_REAL W, CCTK_REAL vsq, CCTK_REAL *dpdw, CCTK_REAL *dpdvsq, CCTK_REAL gammaeos); +static CCTK_REAL eos_info(CCTK_REAL W, CCTK_REAL vsq, CCTK_REAL *dpdw, CCTK_REAL *dpdvsq, CCTK_REAL gammaeos, struct LocGlob *lgp); /* pressure as a function of rho0 and u */ static CCTK_REAL pressure_rho0_u(CCTK_REAL rho0, CCTK_REAL u, CCTK_REAL gammaeos) { @@ -213,6 +216,8 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( CCTK_REAL sqrt_detg = sqrt(detg); CCTK_REAL inv_sqrt_detg = 1./sqrt_detg; CCTK_INT i,j, i_increase ; + + struct LocGlob lg; gammaeos = *gamma_eos; @@ -268,7 +273,7 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( // Calculate various scalars (Q.B, Q^2, etc) from the conserved variables: - Bsq = + lg.Bsq = (*gxx) * (*Bx) * (*Bx) + (*gyy) * (*By) * (*By) + (*gzz) * (*Bz) * (*Bz) + @@ -278,15 +283,15 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( (*gyz) * (*By) * (*Bz) ); QdotB = (sx * (*Bx) + sy * (*By) + sz * (*Bz)) ; - QdotBsq = QdotB*QdotB ; + lg.QdotBsq = QdotB*QdotB ; - Qdotn = -(tau + dens) ; + lg.Qdotn = -(tau + dens) ; - Qtsq = (usx * sx + usy * sy + usz * sz) ; + lg.Qtsq = (usx * sx + usy * sy + usz * sz) ; - D = dens; + lg.D = dens; - half_Bsq = 0.5*Bsq; + lg.half_Bsq = 0.5*lg.Bsq; /* calculate W from last timestep and use for guess */ vsq = @@ -311,7 +316,7 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( // Always calculate rho from D and gamma so that using D in EOS remains consistent // i.e. you don't get positive values for dP/d(vsq) . - rho0 = D / gamma ; + rho0 = lg.D / gamma ; u = (*epsilon) * rho0; p = pressure_rho0_u(rho0,u,gammaeos) ; // EOS w = rho0 + u + p ; @@ -321,8 +326,8 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( // Make sure that W is large enough so that v^2 < 1 : i_increase = 0; - while( (( W_last*W_last*W_last * ( W_last + 2.*Bsq ) - - QdotBsq*(2.*W_last + Bsq) ) <= W_last*W_last*(Qtsq-Bsq*Bsq)) + while( (( W_last*W_last*W_last * ( W_last + 2.*lg.Bsq ) + - lg.QdotBsq*(2.*W_last + lg.Bsq) ) <= W_last*W_last*(lg.Qtsq-lg.Bsq*lg.Bsq)) && (i_increase < 10) ) { W_last *= 10.; i_increase++; @@ -330,8 +335,8 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( // Calculate W and vsq: x_2d[0] = fabs( W_last ); - x_2d[1] = x1_of_x0( W_last ) ; - *retval = 1.0*twod_newton_raphson( x_2d, gammaeos, func_vsq ) ; + x_2d[1] = x1_of_x0( W_last, &lg ) ; + *retval = 1.0*twod_newton_raphson( x_2d, gammaeos, &lg, func_vsq ) ; W = x_2d[0]; vsq = x_2d[1]; @@ -357,7 +362,7 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( // Recover the primitive variables from the scalars and conserved variables: gtmp = sqrt(1. - vsq); gamma = 1./gtmp ; - rho0 = D * gtmp; + rho0 = lg.D * gtmp; w = W * (1. - vsq) ; p = pressure_rho0_w(rho0,w,gammaeos) ; // EOS @@ -375,9 +380,9 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( *w_lorentz = gamma; *pressure = p ; - g_o_WBsq = 1./(W+Bsq); + g_o_WBsq = 1./(W+lg.Bsq); QdB_o_W = QdotB / W; - *bsq = Bsq * (1.-vsq) + QdB_o_W*QdB_o_W; + *bsq = lg.Bsq * (1.-vsq) + QdB_o_W*QdB_o_W; *velx = g_o_WBsq * ( usx + QdB_o_W*(*Bx) ) ; *vely = g_o_WBsq * ( usy + QdB_o_W*(*By) ) ; @@ -411,15 +416,15 @@ void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_pt) ( W = \gamma^2 w ****************************************************************************/ -static CCTK_REAL vsq_calc(CCTK_REAL W) +static CCTK_REAL vsq_calc(CCTK_REAL W, struct LocGlob *lgp) { CCTK_REAL Wsq,Xsq,Bsq_W; Wsq = W*W ; - Bsq_W = (Bsq + W); + Bsq_W = (lgp->Bsq + W); Xsq = Bsq_W * Bsq_W; - return( ( Wsq * Qtsq + QdotBsq * (Bsq_W + W)) / (Wsq*Xsq) ); + return( ( Wsq * lgp->Qtsq + lgp->QdotBsq * (Bsq_W + W)) / (Wsq*Xsq) ); } @@ -433,12 +438,12 @@ static CCTK_REAL vsq_calc(CCTK_REAL W) *********************************************************************/ -static CCTK_REAL x1_of_x0(CCTK_REAL x0 ) +static CCTK_REAL x1_of_x0(CCTK_REAL x0, struct LocGlob *lgp ) { CCTK_REAL x1,vsq; CCTK_REAL dv = 1.e-15; - vsq = fabs(vsq_calc(x0)) ; // guaranteed to be positive + vsq = fabs(vsq_calc(x0,lgp)) ; // guaranteed to be positive return( ( vsq > 1. ) ? (1.0 - dv) : vsq ); @@ -478,10 +483,10 @@ static void validate_x(CCTK_REAL x[2], CCTK_REAL x0[2] ) -- inspired in part by Num. Rec.'s routine newt(); *****************************************************************/ -static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, +static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, struct LocGlob *lgp, void (*funcd) (CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], CCTK_REAL [][2], CCTK_REAL *, - CCTK_REAL *, CCTK_REAL) ) + CCTK_REAL *, CCTK_REAL, struct LocGlob *) ) { CCTK_REAL f, df, dx[2], x_old[2]; CCTK_REAL resid[2], jac[2][2]; @@ -507,7 +512,7 @@ static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, keep_iterating = 1; while( keep_iterating ) { - (*funcd) (x, dx, resid, jac, &f, &df, gammaeos); /* returns with new dx, f, df */ + (*funcd) (x, dx, resid, jac, &f, &df, gammaeos, lgp); /* returns with new dx, f, df */ /* Save old values before calculating the new: */ @@ -599,7 +604,7 @@ static CCTK_INT twod_newton_raphson( CCTK_REAL x[], CCTK_REAL gammaeos, *********************************************************************************/ static void func_vsq(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], - CCTK_REAL jac[][2], CCTK_REAL *f, CCTK_REAL *df, CCTK_REAL gammaeos) + CCTK_REAL jac[][2], CCTK_REAL *f, CCTK_REAL *df, CCTK_REAL gammaeos, struct LocGlob *lgp) { @@ -612,22 +617,22 @@ static void func_vsq(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], Wsq = W*W; - p_tmp = eos_info(W, vsq, &dPdW, &dPdvsq, gammaeos); + p_tmp = eos_info(W, vsq, &dPdW, &dPdvsq, gammaeos, lgp); // These expressions were calculated using Mathematica, but made into efficient // code using Maple. Since we know the analytic form of the equations, we can // explicitly calculate the Newton-Raphson step: - t2 = -half_Bsq+dPdvsq; - t3 = Bsq+W; + t2 = -lgp->half_Bsq+dPdvsq; + t3 = lgp->Bsq+W; t4 = t3*t3; t23 = 1/W; - t16 = QdotBsq*t23*t23; - t11 = Qtsq-vsq*t4+t16*(Bsq+W+W); - t18 = -Qdotn-half_Bsq*(1.0+vsq)+0.5*t16-W+p_tmp; + t16 = lgp->QdotBsq*t23*t23; + t11 = lgp->Qtsq-vsq*t4+t16*(lgp->Bsq+W+W); + t18 = -lgp->Qdotn-lgp->half_Bsq*(1.0+vsq)+0.5*t16-W+p_tmp; t24 = t16*t23; t25 = -1.0+dPdW-t24; - t35 = t25*t3+(Bsq-2.0*dPdvsq)*(t16+vsq*W)*t23; + t35 = t25*t3+(lgp->Bsq-2.0*dPdvsq)*(t16+vsq*W)*t23; // t21 = 1/t3; // t36 = 1/t35; t21 = 1/(t3*t35); @@ -666,7 +671,7 @@ static void func_vsq(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], -- returns with all the EOS-related values needed; **********************************************************************/ -static CCTK_REAL eos_info(CCTK_REAL W, CCTK_REAL vsq, CCTK_REAL *dpdw, CCTK_REAL *dpdvsq, CCTK_REAL gammaeos) +static CCTK_REAL eos_info(CCTK_REAL W, CCTK_REAL vsq, CCTK_REAL *dpdw, CCTK_REAL *dpdvsq, CCTK_REAL gammaeos, struct LocGlob *lgp) { register double ftmp,gtmp; @@ -676,9 +681,9 @@ static CCTK_REAL eos_info(CCTK_REAL W, CCTK_REAL vsq, CCTK_REAL *dpdw, CCTK_REAL double gam_m1_o_gam = ((gammaeos-1.)/gammaeos); *dpdw = gam_m1_o_gam * ftmp ; - *dpdvsq = gam_m1_o_gam * ( 0.5 * D/gtmp - W ) ; + *dpdvsq = gam_m1_o_gam * ( 0.5 * lgp->D/gtmp - W ) ; - return( gam_m1_o_gam * ( W * ftmp - D * gtmp ) ); // p + return( gam_m1_o_gam * ( W * ftmp - lgp->D * gtmp ) ); // p } |