18 FTYPE vminmhd,vmaxmhd;
19 FTYPE vminrad,vmaxrad;
20 FTYPE vminrad2,vmaxrad2;
22 vchar_each(pr, q, dir, geom, &vmaxmhd, &vminmhd, &vmaxrad, &vminrad, &vmaxrad2, &vminrad2, ignorecourant);
24 *vminall=
MIN(vminmhd,vminrad2);
25 *vmaxall=
MAX(vmaxmhd,vmaxrad2);
31 int vchar_each(
FTYPE *
pr,
struct of_state *q,
int dir,
struct of_geom *geom,
FTYPE *vmaxmhd,
FTYPE *vminmhd,
FTYPE *vmaxrad,
FTYPE *vminrad,
FTYPE *vmaxrad2,
FTYPE *vminrad2,
int *ignorecourant)
34 vchar(pr, q, dir, geom, vmaxmhd, vminmhd,ignorecourant);
36 vchar_rad(pr, q, dir, geom, vmaxrad, vminrad, vmaxrad2, vminrad2, ignorecourant);
39 *vmaxrad2=*vmaxrad=*vmaxmhd;
40 *vminrad2=*vminrad=*vminmhd;
50 int get_wavespeeds(
int dir,
struct of_geom *ptrgeom,
FTYPE *p_l,
FTYPE *p_r,
FTYPE *U_l,
FTYPE *U_r,
FTYPE *F_l,
FTYPE *F_r,
struct of_state *state_l,
struct of_state * state_r,
FTYPE *cminmax_l,
FTYPE *cminmax_r,
FTYPE *cminmax,
FTYPE *ctopptr,
FTYPE *cminmaxrad_l,
FTYPE *cminmaxrad_r,
FTYPE *cminmaxrad,
FTYPE *ctopradptr,
FTYPE *cminmaxrad2_l,
FTYPE *cminmaxrad2_r,
FTYPE *cminmaxrad2,
FTYPE *ctoprad2ptr)
61 void get_roe_averaged_state(
int dir,
FTYPE *p_l,
struct of_state *state_l,
FTYPE *Ul,
FTYPE * p_r,
struct of_state *state_r,
FTYPE *Ur,
struct of_geom *geom,
FTYPE * p_roe,
FTYPE *Hroe,
FTYPE *cminnonrel_roe,
FTYPE*cmaxnonrel_roe);
73 #if(USEGLOBALWAVE==0 || STOREWAVESPEEDS==2)
76 MYFUN(
vchar_each(p_l, state_l, dir, ptrgeom, &cminmax_l[
CMAX], &cminmax_l[
CMIN], &cminmaxrad_l[CMAX], &cminmaxrad_l[CMIN], &cminmaxrad2_l[CMAX], &cminmaxrad2_l[CMIN],&ignorecourant),
"step_ch.c:fluxcalc()",
"vchar() dir=1or2", 1);
77 MYFUN(
vchar_each(p_r, state_r, dir, ptrgeom, &cminmax_r[CMAX], &cminmax_r[CMIN], &cminmaxrad_r[CMAX], &cminmaxrad_r[CMIN], &cminmaxrad2_r[CMAX], &cminmaxrad2_r[CMIN],&ignorecourant),
"step_ch.c:fluxcalc()",
"vchar() dir=1or2", 2);
79 cminmax_calc(cminmax_l[CMIN],cminmax_r[CMIN],cminmax_l[CMAX],cminmax_r[CMAX],&cminmax[CMIN],&cminmax[CMAX],ctopptr);
82 cminmax_calc(cminmaxrad_l[CMIN],cminmaxrad_r[CMIN],cminmaxrad_l[CMAX],cminmaxrad_r[CMAX],&cminmaxrad[CMIN],&cminmaxrad[CMAX],ctopradptr);
84 cminmax_calc(cminmaxrad2_l[CMIN],cminmaxrad2_r[CMIN],cminmaxrad2_l[CMAX],cminmaxrad2_r[CMAX],&cminmaxrad2[CMIN],&cminmaxrad2[CMAX],ctoprad2ptr);
89 #if(STOREWAVESPEEDS==2)
117 cminmax[
CMIN] = fabs(
max(0., -cminmax[CMIN]));
118 cminmax[
CMAX] = fabs(
max(0., cminmax[CMAX]));
119 *ctopptr=
max(cminmax[CMIN],cminmax[CMAX]);
122 cminmaxrad[
CMIN] = fabs(
max(0., -cminmaxrad[CMIN]));
123 cminmaxrad[
CMAX] = fabs(
max(0., cminmaxrad[CMAX]));
124 *ctopradptr=
max(cminmaxrad[CMIN],cminmaxrad[CMAX]);
126 cminmaxrad2[
CMIN] = fabs(
max(0., -cminmaxrad2[CMIN]));
127 cminmaxrad2[
CMAX] = fabs(
max(0., cminmaxrad2[CMAX]));
128 *ctoprad2ptr=
max(cminmaxrad2[CMIN],cminmaxrad2[CMAX]);
141 #if(ROEAVERAGEDWAVESPEED)
144 dualfprintf(
fail_file,
"ROEAVERAGE not setup for radiation\n");
149 get_roe_averaged_state(dir, p_l, state_l, U_l, p_r, state_r, U_r, ptrgeom, p_roe, &Hroe, &cminmaxnonrel_roe[CMIN], &cminmaxnonrel_roe[CMAX]);
152 #if(ATHENAROE==0) // doing Jon method
155 MYFUN(
get_state(p_roe, ptrgeom, &state_roe),
"flux.c:p2SFUevolve",
"get_state()", 1);
157 MYFUN(
vchar(p_roe, &state_roe, dir, ptrgeom, &cminmax_roe[CMAX], &cminmax_roe[CMIN],&ignorecourant),
"step_ch.c:fluxcalc()",
"vchar() dir=1or2", 3);
160 #if(1) // Jon's version of MIN/MAXing
162 for(q=0;q<
NUMCS;q++){
164 cminmax[q]=
MINMAX(q,cminmax_roe[q],
MINMAX(q,cminmax_l[q],cminmax_r[q]));
168 #else // doing Athena-like method of min/maxing (fails to work for some tests)
181 for(q=0;q<
NUMCS;q++){
182 cminmax[q]=
MINMAX(q,cminmax_roe[q],cminmax[q]);
189 #else // else if ATHENAROE==1 (fails to work for some tests)
192 for(q=0;q<
NUMCS;q++){
193 cminmax_roe[q]=cminmaxnonrel_roe[q];
199 cminmax[
CMAX]=
MAX(cminmax_roe[CMAX],cminmax_r[CMAX]);
200 cminmax[
CMIN]=
MIN(cminmax_roe[CMIN],cminmax_l[CMIN]);
202 #else // testing way (same as Athena right now)
214 for(q=0;q<
NUMCS;q++){
216 cminmax[q]=
MINMAX(q,cminmax_roe[q],
MINMAX(q,cminmax_l[q],cminmax_r[q]));
222 #endif // end over ATHENAROE=0/1
232 cminmax[
CMIN] = fabs(
max(0., -cminmax[CMIN]));
233 cminmax[
CMAX] = fabs(
max(0., cminmax[CMAX]));
234 *ctopptr=
max(cminmax[CMIN],cminmax[CMAX]);
237 #endif // end over ROEAVERAGEDWAVESPEED=1
248 void get_roe_averaged_state(
int dir,
FTYPE *p_l,
struct of_state *state_l,
FTYPE *Ul,
FTYPE * p_r,
struct of_state *state_r,
FTYPE *Ur,
struct of_geom *geom,
FTYPE * p_roe,
FTYPE *Hroe,
FTYPE *cminnonrel_roe,
FTYPE*cmaxnonrel_roe)
250 FTYPE sqrtrhol,sqrtrhor,isqrtrholr;
252 FTYPE Pl, Pr, Hl, Hr;
261 Pl=pressure_rho0_u_simple(ii,jj,kk,loc,p_l[
RHO],p_l[
UU]);
262 Pr=pressure_rho0_u_simple(ii,jj,kk,loc,p_r[
RHO],p_r[
UU]);
266 sqrtrhol=sqrt(p_l[
RHO]);
267 sqrtrhor=sqrt(p_r[
RHO]);
268 isqrtrholr=1.0/(sqrtrhol+sqrtrhor);
271 p_roe[
RHO] = sqrtrhol*sqrtrhor;
274 p_roe[
UU] = p_roe[
RHO] * ( p_l[
UU] / sqrtrhol + p_r[
UU] / sqrtrhor ) * isqrtrholr;
277 SLOOPA(j) p_roe[
UU+j] = (sqrtrhol*p_l[
UU+j] + sqrtrhor*p_r[
UU+j])*isqrtrholr;
280 SLOOPA(j) p_roe[
B1-1+j] = (sqrtrhor*p_l[
B1-1+j] + sqrtrhol*p_r[
B1-1+j])*isqrtrholr;
285 bsqr =
dot(state_r->bcon, state_r->bcov);
290 Hl = (p_l[
UU] + Pl + 0.5*bsql)/p_l[
RHO];
291 Hr = (p_r[
UU] + Pr + 0.5*bsqr)/p_r[
RHO];
292 *Hroe=(sqrtrhol*Hl + sqrtrhor*Hr)*isqrtrholr;
295 *Hroe = ((Ul[
UU] + Pl + 0.5*bsql)/sqrtrhol + (Ur[
UU] + Pr + 0.5*bsqr)/sqrtrhor)*isqrtrholr;
308 croe=sqrt( (
gam-1.0)*(*Hroe - 0.5*vsqroe));
309 *cminnonrel_roe = p_roe[
UU+dir] - croe;
310 *cmaxnonrel_roe = p_roe[
UU+dir] + croe;
322 int get_global_wavespeeds_full(
int dir,
int is,
int ie,
int js,
int je,
int ks,
int ke,
int idel,
int jdel,
int kdel,
FTYPE (*prim)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*finalwspeed)[
COMPDIM][
NUMCS][
NSTORE1][
NSTORE2][
NSTORE3])
332 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM
338 struct of_geom *ptrgeom=&geomdontuse;
342 ptrgeom=&geomdontuse;
344 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
351 MYFUN(
get_global_wavespeeds(dir,ptrgeom,
MAC(prim,i,j,k),GLOBALMACP1A0(wspeedtemp,
EOMSETMHD,i,j,k),GLOBALMACP1A0(wspeedtemp,
EOMSETRAD,i,j,k),GLOBALMACP1A0(wspeedtemp,
EOMSETRADFORDT,i,j,k)),
"flux.c:fluxcalc_standard()",
"get_global_wavespeeds()", 0);
358 global_vchar(
GLOBALPOINT(wspeedtemp), dir, is, ie, js, je, ks, ke, idel, jdel, kdel,
POINT(finalwspeed));
379 MYFUN(
vchar_each(pr, qptr, dir, ptrgeom, &output[
CMAX], &output[
CMIN], &outputrad[CMAX], &outputrad[CMIN], &outputrad2[CMAX], &outputrad2[CMIN],&ignorecourant),
"wavespeeds.c:get_global_wavespeeds()",
"vchar() dir=1or2", 0);
394 int global_vchar(
FTYPE (*pointspeed)[
NSTORE1][
NSTORE2][
NSTORE3][
NUMCS],
int dir,
int is,
int ie,
int js,
int je,
int ks,
int ke,
int idel,
int jdel,
int kdel,
FTYPE (*wspeed)[
COMPDIM][NUMCS][
NSTORE1][
NSTORE2][
NSTORE3])
404 FTYPE ctop,ctoprad,ctoprad2;
405 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
416 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
421 #if(VCHARTYPE==VERYLOCALVCHAR) // then get maximum around interface
434 MACP3A0(wspeed,
EOMSETMHD,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETMHD,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETMHD,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
435 MACP3A0(wspeed,
EOMSETMHD,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETMHD,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETMHD,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
439 MACP3A0(wspeed,
EOMSETRAD,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETRAD,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETRAD,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
440 MACP3A0(wspeed,
EOMSETRAD,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETRAD,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETRAD,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
441 MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETRADFORDT,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
442 MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETRADFORDT,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
446 #elif(VCHARTYPE==LOCALVCHAR)
448 reallim=choose_limiter(dir,i,j,k,
RHO);
455 for(m=-reallim/2;m<=reallim/2-1;m++){
456 MACP3A0(wspeed,
EOMSETMHD,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETMHD,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETMHD,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
457 MACP3A0(wspeed,
EOMSETMHD,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETMHD,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETMHD,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
460 for(m=-reallim/2;m<=reallim/2-1;m++){
461 MACP3A0(wspeed,
EOMSETRAD,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETRAD,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETRAD,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
462 MACP3A0(wspeed,
EOMSETRAD,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETRAD,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETRAD,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
463 MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMIN,i,j,k)=
MIN(
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMIN,i,j,k),
MACP1A1(pointspeed,
EOMSETRADFORDT,i+idel*m,j+jdel*m,k+kdel*m,
CMIN));
464 MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMAX,i,j,k)=
MAX(
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMAX,i,j,k),
MACP1A1(pointspeed,
EOMSETRADFORDT,i+idel*m,j+jdel*m,k+kdel*m,
CMAX));
468 #elif(VCHARTYPE==GLOBALVCHAR)
470 dualfprintf(
fail_file,
"VCHARTYPE==GLOBALVCHAR deprecated\n");
485 cminmax_calc_2(&
MACP3A0(wspeed,
EOMSETMHD,dir,
CMIN,i,j,k),&
MACP3A0(wspeed,
EOMSETMHD,dir,
CMAX,i,j,k),&ctop);
487 cminmax_calc_2(&
MACP3A0(wspeed,
EOMSETRAD,dir,
CMIN,i,j,k),&
MACP3A0(wspeed,
EOMSETRAD,dir,
CMAX,i,j,k),&ctoprad);
488 cminmax_calc_2(&
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMIN,i,j,k),&
MACP3A0(wspeed,
EOMSETRADFORDT,dir,
CMAX,i,j,k),&ctoprad2);
511 cminmax_calc_1(cmin_l,cmin_r,cmax_l,cmax_r,cmin,cmax);
512 cminmax_calc_2(cmin,cmax,ctop);
521 FTYPE lmin,lmax,ltop;
542 lmin=
min(cmin_l,cmin_r);
543 lmax=
max(cmax_l,cmax_r);
548 lmin=2.0*cmin_l*cmin_r/(cmin_l+cmin_r);
549 lmax=2.0*cmax_l*cmax_r/(cmax_l+cmax_r);
573 lmin = fabs(
max(0., -lmin));
574 lmax = fabs(
max(0., lmax));
577 #define HYPERFUN(c,x0) (0.5*( (c)+(M_SQRT2l-1.0)*sqrt(2.0*(M_SQRT2l+1.0)*(x0)*(x0)+(3.0+2.0*M_SQRT2l)*(c)*(c)) ) )
583 lmin=HYPERFUN(-lmin,1
E-4);
584 lmax=HYPERFUN(lmax,1
E-4);
590 *ctop=
max(lmax,lmin);