78 dualfprintf(
fail_file,
"Set FIELDSTAGMEM==1 to do FLUXCTSTAG\n");
117 DLOOPA(jj) ptrgeomf[jj]=&(geomfdontuse[jj]);
122 get_odirs(dir,&odir1,&odir2);
123 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
125 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait
130 MACP0A1(ufield,i,j,k,
B1) = +(
NOAVGCORN_1(A[3],i,
jp1mac(j),k)-
NOAVGCORN_1(A[3],i,j,k))/(
dx[2]);
131 MACP0A1(ufield,i,j,k,
B1) += -(
NOAVGCORN_1(A[2],i,j,
kp1mac(k))-
NOAVGCORN_1(A[2],i,j,k))/(
dx[3]);
135 igdetgnosing[dir] = ptrgeomf[dir]->igdetnosing;
142 get_odirs(dir,&odir1,&odir2);
143 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
145 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait
149 MACP0A1(ufield,i,j,k,
B2) = +(
NOAVGCORN_2(A[1],i,j,
kp1mac(k))-
NOAVGCORN_2(A[1],i,j,k))/(
dx[3]);
150 MACP0A1(ufield,i,j,k,
B2) += -(
NOAVGCORN_2(A[3],
ip1mac(i),j,k)-
NOAVGCORN_2(A[3],i,j,k))/(
dx[1]);
154 igdetgnosing[dir] = ptrgeomf[dir]->igdetnosing;
161 get_odirs(dir,&odir1,&odir2);
162 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
164 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait
168 MACP0A1(ufield,i,j,k,
B3) = +(
NOAVGCORN_3(A[2],
ip1mac(i),j,k)-
NOAVGCORN_3(A[2],i,j,k))/(
dx[1]);
169 MACP0A1(ufield,i,j,k,
B3) += -(
NOAVGCORN_3(A[1],i,
jp1mac(j),k)-
NOAVGCORN_3(A[1],i,j,k))/(
dx[2]);
173 igdetgnosing[dir] = ptrgeomf[dir]->igdetnosing;
204 int initialstep,
int finalstep,
223 struct of_loop *cent2faceloop,
struct of_loop (*face2cornloop)[NDIM][NDIM],
227 int *Nvec,
FTYPE (*dqvec[NDIM])[
NSTORE2][NSTORE3][NPR2INTERP]);
229 int idel, jdel, kdel, face;
230 int is, ie, js, je, ks, ke;
231 int fluxcalc_fluxctstag_emf_1d(
int stage,
FTYPE (*
pr)[
NSTORE2][NSTORE3][NPR],
int dir,
int odir1,
int odir2,
int is,
int ie,
int js,
int je,
int ks,
int ke,
FTYPE (*fluxvec[NDIM])[
NSTORE2][NSTORE3][NPR+
NSPECIAL],
FTYPE CUf,
struct of_loop (*face2cornloop)[NDIM],
235 int edgedir, odir1,odir2;
256 interpolate_prim_face2corn(
pr, pl_ct, pr_ct, pvbcorn, cent2faceloop, face2cornloop,prc,pleft,pright,Nvec,dqvec);
275 get_odirs(dir,&odir1,&odir2);
278 if(Nvec[odir1]==1 && Nvec[odir2]==1){
302 MYFUN(
fluxcalc_fluxctstag_emf_1d(stage,
pr, dir, odir1, odir2, is, ie, js, je, ks, ke, fluxvec, CUf[2], face2cornloop[edgedir],pvbcorn,wspeed),
"flux.c:fluxcalc()",
"fluxcalc_fluxctstag_1d", dir);
305 trifprintf(
"%d",dir);
311 bound_flux(
STAGEM1,
t,fluxvec[1],fluxvec[2],fluxvec[3], 0);
323 dualfprintf(
fail_file,
"j=%d emf[0]=%21.15g emf[N1]=%21.15g diff=%21.15g\n",j,
MACP1A1(fluxvec,1,0,j,k,
B2),
MACP1A1(fluxvec,1,
N1,j,k,
B2),
MACP1A1(fluxvec,1,0,j,k,
B2)-
MACP1A1(fluxvec,1,
N1,j,k,
B2));
337 evolve_vpotgeneral(
FLUXB, stage, initialstep, finalstep,
pr, Nvec, fluxvec, NULL, CUf, CUnew, fluxdt, fluxtime, vpot);
341 int fluxvpot_modifyemfsuser=0;
344 if(fluxvpot_modifyemfsuser==0){
346 adjust_fluxctstag_emfs(fluxtime,
pr,Nvec,fluxvec);
394 int fluxcalc_fluxctstag_emf_1d(
int stage,
FTYPE (*
pr)[
NSTORE2][NSTORE3][NPR],
int dir,
int odir1,
int odir2,
int is,
int ie,
int js,
int je,
int ks,
int ke,
FTYPE (*fluxvec[NDIM])[
NSTORE2][NSTORE3][NPR+
NSPECIAL],
FTYPE CUf,
struct of_loop (*face2cornloop)[NDIM],
399 int idel1,jdel1,kdel1;
400 int idel2,jdel2,kdel2;
447 FTYPE geomcornodir1,geomcornodir2;
452 FTYPE cmaxfactorodir1;
453 FTYPE cmaxfactorodir2;
454 FTYPE cminfactorodir1;
455 FTYPE cminfactorodir2;
457 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
467 #if(OUTERRADIALSUPERFAST)
472 if(dir==3 && odir1==1 &&
startpos[1]+i==0){ fluxmethodlocal=
HLLFLUX; cmaxfactorodir1=0.0; }
473 if(dir==3 && odir2==1 &&
startpos[1]+i==0){ fluxmethodlocal=
HLLFLUX; cmaxfactorodir2=0.0; }
518 +
MACP1A3(pvbcorn,dir,i,j,k,odir2,NUMCS,m)*
MACP1A3(pvbcorn,dir,i,j,k,odir1,m,l)
519 -
MACP1A3(pvbcorn,dir,i,j,k,odir1,NUMCS,l)*
MACP1A3(pvbcorn,dir,i,j,k,odir2,m,l);
532 c2d[
CMIN][0] = fabs(
MAX(0.,
MAX(+
MACP3A0(wspeed,
EOMSETMHD,odir1,
CMIN,i,j,k),+
MACP3A0(wspeed,
EOMSETMHD,odir1,
CMIN,i-idel2,j-jdel2,k-kdel2))))*cminfactorodir1;
533 c2d[
CMAX][0] = fabs(
MAX(0.,
MAX(+
MACP3A0(wspeed,
EOMSETMHD,odir1,
CMAX,i,j,k),+
MACP3A0(wspeed,
EOMSETMHD,odir1,
CMAX,i-idel2,j-jdel2,k-kdel2))))*cmaxfactorodir1;
543 c2d[
CMIN][1] = fabs(
MAX(0.,
MAX(+
MACP3A0(wspeed,
EOMSETMHD,odir2,
CMIN,i,j,k),+
MACP3A0(wspeed,
EOMSETMHD,odir2,
CMIN,i-idel1,j-jdel1,k-kdel1))))*cminfactorodir2;
544 c2d[
CMAX][1] = fabs(
MAX(0.,
MAX(+
MACP3A0(wspeed,
EOMSETMHD,odir2,
CMAX,i,j,k),+
MACP3A0(wspeed,
EOMSETMHD,odir2,
CMAX,i-idel1,j-jdel1,k-kdel1))))*cmaxfactorodir2;
553 ctop[1] =
MAX(c2d[CMIN][1],c2d[CMAX][1]);
567 dB[0] =
MACP1A3(pvbcorn,dir,i,j,k,odir1,NUMCS,1) -
MACP1A3(pvbcorn,dir,i,j,k,odir1,NUMCS,0) ;
570 dB[1] =
MACP1A3(pvbcorn,dir,i,j,k,odir2,NUMCS,1) -
MACP1A3(pvbcorn,dir,i,j,k,odir2,NUMCS,0) ;
597 topwave[0]=c2d[
CMIN][0] + c2d[
CMAX][0];
598 topwave[1]=c2d[
CMIN][1] + c2d[
CMAX][1];
603 bottomwave[0]=1.0/topwave[0];
604 bottomwave[1]=1.0/topwave[1];
610 +c2d[
CMAX][0]*c2d[
CMAX][1]*emf2d[0][0]
611 +c2d[
CMAX][0]*c2d[
CMIN][1]*emf2d[0][1]
612 +c2d[
CMIN][0]*c2d[
CMAX][1]*emf2d[1][0]
613 +c2d[
CMIN][0]*c2d[
CMIN][1]*emf2d[1][1]
614 )*bottomwave[0]*bottomwave[1]
618 c2d[CMIN][0]*c2d[CMAX][0]*bottomwave[0]*dB[1]
622 c2d[
CMIN][1]*c2d[
CMAX][1]*bottomwave[1]*dB[0]
630 + 0.25*(emf2d[0][0]+emf2d[0][1]+emf2d[1][0]+emf2d[1][1])
649 #if(CORNGDETVERSION==1)
654 geomcornodir1=ptrgdetgeom->EOMFUNCMAC(
B1-1+odir1);
655 geomcornodir2=ptrgdetgeom->EOMFUNCMAC(
B1-1+odir2);
664 if(i==26 && j==40 && k==0){
665 dualfprintf(
fail_file,
"ORIG: emf2d[1][1]=%21.15g emf2d[1][0]=%21.15g emf2d[0][1]=%21.15g emf2d[0][0]=%21.15g ctop[0]=%21.15g ctop[1]=%21.15g dB[0]=%21.15g dB[1]=%21.15g emffinal=%21.15g gdetcorn3=%21.15g\n",emf2d[1][1],emf2d[1][0],emf2d[0][1],emf2d[0][0],ctop[0],ctop[1],dB[0],dB[1],emffinal,ptrgdetgeom->gdet);
666 dualfprintf(
fail_file,
"ORIG: c2d[CMIN][0]=%21.15g c2d[CMAX][0]=%21.15g c2d[CMIN][1]=%21.15g c2d[CMAX][1]=%21.15g\n",c2d[CMIN][0],c2d[CMAX][0],c2d[CMIN][1],c2d[CMAX][1]);
677 if(Nvec[odir1]>1)
MACP1A1(fluxvec,odir1,i,j,k,
B1-1+odir2) = + emffinal*geomcornodir2;
678 if(Nvec[odir2]>1)
MACP1A1(fluxvec,odir2,i,j,k,
B1-1+odir1) = - emffinal*geomcornodir1;
679 if(Nvec[dir]>1)
MACP1A1(fluxvec,dir,i,j,k,
B1-1+dir) = 0.0;
681 #if((WHICHEOM==WITHNOGDET)&&(NOGDETB1>0)||(NOGDETB2>0)||(NOGDETB3>0))
682 dualfprintf(
fail_file,
"Makes no sense to have field with different geometry factor since flux,emf mixes those factors\n");
696 bound_flux(
STAGEM1,
t,fluxvec[1],fluxvec[2],fluxvec[3], 0);
714 void slope_lim_continuous_e2z(
int realisinterp,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP],
struct of_loop *face2centloop)
716 extern void slope_lim_linetype_c2e(
int realisinterp,
int whichprimtype,
int interporflux,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*stencilvar)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP]);
717 extern void slope_lim_pointtype(
int interporflux,
int realisinterp,
int pl,
int dir,
int loc,
int continuous,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP]);
748 slope_lim_linetype_c2e(realisinterp,
ENOPRIMITIVE,
ENOINTERPTYPE, dir, idel, jdel, kdel, primreal, NULL, p2interp, pleft, pright);
768 slope_lim_pointtype(
ENOINTERPTYPE, realisinterp, pl, dir, loc, continuous, idel, jdel, kdel, primreal, p2interp, dq, pleft, pright);
816 struct of_loop face2cent[NDIM];
849 if(timeorder==numtimeorders-1) finalstep=1;
else finalstep=0;
863 bound_pstag(stage, finalstep, boundtime, preal, pstag, upoint, USEMPI);
907 #define USTAG2PSTAGCONSTRAINEDLOOP 1 // should be 1
935 extern void get_stag_startendindices(
int *loop,
int dir,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke);
948 DLOOPA(jj) ptrgdetgeomf[jj]=&(gdetgeomfdontuse[jj]);
951 #if(USTAG2PSTAGCONSTRAINEDLOOP==0)
960 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // "nowait" ok because each pstag[B1,B2,B3] set independently
967 igdetgnosing = ptrgdetgeomf[dir]->igdetnosing;
974 #else // else if constrained loops
983 get_stag_startendindices(
Uconsevolveloop, dir, &is,&ie,&js,&je,&ks,&ke);
987 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // "nowait" ok because each pstag[B1,B2,B3] set independently
999 get_stag_startendindices(
Uconsevolveloop, dir, &is,&ie,&js,&je,&ks,&ke);
1003 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait
1015 get_stag_startendindices(
Uconsevolveloop, dir, &is,&ie,&js,&je,&ks,&ke);
1019 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait
1057 DLOOPA(jj) ptrgdetgeomf[jj]=&(gdetgeomfdontuse[jj]);
1065 igdetgnosing = ptrgdetgeomf[dir]->igdetnosing;
1091 #define IFNOTRESCALETHENUSEGDET 1
1093 #define IFNOTRESCALETHENUSEGDETswitch(dir) (IFNOTRESCALETHENUSEGDET==1 || (IFNOTRESCALETHENUSEGDET==2 && (ISSPCMCOORD(MCOORD)==0 || ISSPCMCOORD(MCOORD)==1 && (dir==1 || dir==3))))
1098 static void rescale_calc_stagfield_full(
int *Nvec,
FTYPE (*pstag)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP])
1100 int nprlocalstart,nprlocalend;
1101 int nprlocallist[MAXNPR];
1115 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOMINTERPFULLNPR2INTERP // requires full copyin() changes npr2interp stuff
1120 struct of_geom geomfdontuse[NDIM];
1131 DLOOPA(jj) ptrgeomf[jj]=&(geomfdontuse[jj]);
1132 DLOOPA(jj) ptrgdetgeomf[jj]=&(gdetgeomfdontuse[jj]);
1141 if(Nvec[dir]==1)
continue;
1148 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) // NO, rescale() may set arbitrary p2interp's //nowait // p2interp[B1,B2,B3] set independently
1153 #if(RESCALEINTERPFLUXCTSTAG && RESCALEINTERP)
1156 rescale(
DORESCALE,dir,
MAC(pstag,i,j,k),ptrgeomf[dir],
MAC(p2interp,i,j,k));
1163 MACP0A1(p2interp,i,j,k,pl) *= (ptrgdetgeomf[dir]->gdet);
1176 #pragma omp parallel
1230 int nprlocalstart,nprlocalend;
1231 int nprlocallist[MAXNPR];
1266 rescale_calc_stagfield_full(Nvec, pstag,p2interp);
1283 #pragma omp parallel OPENMPGLOBALPRIVATEFORGEOMNPR2INTERP
1285 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
1286 void slope_lim_continuous_e2z(
int realisinterp,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP],
struct of_loop *face2centloop);
1292 FTYPE pstore_l[NPR2INTERP],pstore_r[NPR2INTERP];
1293 FTYPE *p2interp_l,*p2interp_r;
1294 FTYPE p_l[NPR2INTERP], p_r[NPR2INTERP];
1299 int is,ie,js,je,ks,ke;
1301 struct of_geom *ptrgeomc=&geomcdontuse;
1302 struct of_geom geomfdontuse[NDIM];
1305 struct of_gdetgeom *ptrgdetgeomc=&gdetgeomcdontuse;
1314 DLOOPA(jj) ptrgeomf[jj]=&(geomfdontuse[jj]);
1315 DLOOPA(jj) ptrgdetgeomf[jj]=&(gdetgeomfdontuse[jj]);
1318 #if(RESCALEINTERPFLUXCTSTAG && RESCALEINTERP)
1319 p2interp_l=pstore_l;
1320 p2interp_r=pstore_r;
1363 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // don't wait for each dir since independent and all memory written to (and used in later loops) is independent for each dir.
1375 MACP0A1(ucent,i,j,k,pl) =
MACP0A1(pstag,i,j,k,pl)*(ptrgdetgeomc->gdet);
1397 slope_lim_continuous_e2z(realisinterp, dir, idel, jdel, kdel, preal, p2interp, dqvec[dir], pleft, pright, &(face2centloop[dir]));
1412 locallim=choose_limiter(dir, 0,0,0,pl);
1418 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
1421 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1431 p2interp_l[pl] =
MACP0A1(p2interp,i,j,k,pl) + 0.5 *
MACP1A1(dqvec,dir,i,j,k,pl);
1432 p2interp_r[pl] =
MACP0A1(p2interp,i + idel,j + jdel,k + kdel,pl) - 0.5 *
MACP1A1(dqvec,dir,i + idel,j + jdel,k + kdel,pl);
1435 p2interp_l[pl] =
MACP0A1(pright,i,j,k,pl);
1436 p2interp_r[pl] =
MACP0A1(pleft,i+idel,j+jdel,k+kdel,pl);
1442 p2interp_r[pl] = p2interp_l[pl] =
MACP0A1(p2interp,i,j,k,pl) + 0.5 *
MACP1A1(dqvec,dir,i,j,k,pl);
1445 p2interp_r[pl] = p2interp_l[pl] =
MACP0A1(pright,i,j,k,pl);
1460 #if(RESCALEINTERPFLUXCTSTAG && RESCALEINTERP)
1462 rescale(
UNRESCALE,dir,p_l,ptrgeomc,p2interp_l);
1463 rescale(
UNRESCALE,dir,p_r,ptrgeomc,p2interp_r);
1465 if(ucent!=NULL)
MACP0A1(ucent,i,j,k,pl) = 0.5*(p_l[pl]+p_r[pl])*(ptrgeomc->gdet);
1467 #elif(IFNOTRESCALETHENUSEGDET)
1473 igdetgnosing=ptrgdetgeomc->igdetnosing;
1478 ucentgdet=(ptrgdetgeomc->gdet);
1482 if(ucent!=NULL)
MACP0A1(ucent,i,j,k,pl)=0.5*(p2interp_l[pl]+p2interp_r[pl])*ucentgdet;
1486 p_l[pl] = p2interp_l[pl]*igdetgnosing;
1487 p_r[pl] = p2interp_r[pl]*igdetgnosing;
1495 MACP0A1(ucent,i,j,k,pl) = 0.5*(p2interp_l[pl]+p2interp_r[pl])*(ptrgdetgeomc->gdet);
1506 MACP0A1(pcent,i,j,k,pl)=0.5*(p_l[pl]+p_r[pl]);
1524 #pragma omp parallel
1560 void slope_lim_face2corn(
int realisinterp,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP],
struct of_loop *face2cornloop)
1562 extern void slope_lim_linetype_c2e(
int realisinterp,
int whichprimtype,
int interporflux,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*stencilvar)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP]);
1563 extern void slope_lim_pointtype(
int interporflux,
int realisinterp,
int pl,
int dir,
int loc,
int continuous,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP]);
1582 slope_lim_linetype_c2e(realisinterp,
ENOPRIMITIVE, interporflux, dir, idel, jdel, kdel, primreal, NULL, p2interp, pleft, pright);
1585 int loc=
FACE1+dir-1;
1589 slope_lim_pointtype(interporflux,realisinterp, pl, dir, loc, continuous, idel, jdel, kdel, primreal, p2interp, dq, pleft, pright);
1675 #define INCLUDEGDETINTRANSVERSEINTERPLATIONOFFIELD 2
1691 #define INCLUDEGDETINTRANSVERSEINTERPLATIONOFFIELDswitchuniboth(facedir,interpdir) (INCLUDEGDETINTRANSVERSEINTERPLATIONOFFIELD==1 || (INCLUDEGDETINTRANSVERSEINTERPLATIONOFFIELD==2 && (ISSPCMCOORD(MCOORD)==0 || ISSPCMCOORD(MCOORD)==1 && (facedir==1 && (interpdir==1 || interpdir==3) || facedir==2 && (interpdir==1 || interpdir==3) || facedir==3 && (interpdir==1 || interpdir==3) )))) // GODMARK: Want to allow interpdir==2 with facedir==3, but not working yet.
1707 #define INCLUDEGDETINTRANSVERSEINTERPLATIONOFVELOCITY 0
1712 #define INCLUDEGDETINTRANSVERSEINTERPLATIONOFVELOCITYswitchuniboth(facedir,odir) (INCLUDEGDETINTRANSVERSEINTERPLATIONOFVELOCITY==1 || (INCLUDEGDETINTRANSVERSEINTERPLATIONOFVELOCITY==2 && (ISSPCMCOORD(MCOORD)==0 || ISSPCMCOORD(MCOORD)==1 && (odir==1 || odir==3) )))
1727 struct of_loop *cent2faceloop,
struct of_loop (*face2cornloop)[NDIM][NDIM],
1731 int *Nvec,
FTYPE (*dqvec[NDIM])[
NSTORE2][NSTORE3][NPR2INTERP])
1734 int nprlocalstart,nprlocalend;
1735 int nprlocallist[MAXNPR];
1811 #define NUMSTAGINTERP 6
1812 #define BFACEINTERP 0
1813 #define BFACEINTERPODIR1 0
1814 #define BLFACEINTERP 0 // same as BFACEINTERP
1815 #define BRFACEINTERP 1 // only used if Nvec[dir]==1 [No, but used to hold non-gdet applied version if required]
1816 #define BFACEINTERPODIR2 1 // used to hold standard B field, not gdet*B, in case required.
1817 #define VLODIR1INTERP 2
1818 #define VRODIR1INTERP 3
1819 #define VLODIR2INTERP 4
1820 #define VRODIR2INTERP 5
1823 #if(NUMSTAGINTERP>NPR2INTERP)
1824 #error "Cannot have NUMSTAGINTERP>NPR2INTERP. Create new memory space if have to."
1843 #pragma omp parallel OPENMPGLOBALPRIVATEFORUCONANDGEOMNPR2INTERP
1845 void slope_lim_face2corn(
int realisinterp,
int dir,
int idel,
int jdel,
int kdel,
FTYPE (*primreal)[
NSTORE2][NSTORE3][NPR],
FTYPE (*p2interp)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*dq)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pleft)[
NSTORE2][NSTORE3][NPR2INTERP],
FTYPE (*pright)[
NSTORE2][NSTORE3][NPR2INTERP],
struct of_loop *face2cornloop);
1848 int idel1,jdel1,kdel1;
1849 int idel2,jdel2,kdel2;
1853 struct of_geom *ptrgeomf=&geomfdontuse;
1856 struct of_gdetgeom *ptrgdetgeomf=&gdetgeomfdontuse;
1859 struct of_gdetgeom *ptrgdetgeomc=&gdetgeomcdontuse;
1862 struct of_gdetgeom *ptrgdetgeomcorn=&gdetgeomcorndontuse;
1864 int dir,interpdir,edgedir;
1866 FTYPE pstore_l[NPR2INTERP],pstore_r[NPR2INTERP];
1867 FTYPE *p2interp_l,*p2interp_r;
1868 FTYPE p_l[NPR2INTERP], p_r[NPR2INTERP];
1872 int EMFodir1,EMFodir2;
1875 FTYPE igdetgnosing,igdetgnosingvel;
1878 int BFACEINTERPCURRENT;
1883 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
1885 int is,ie,js,je,ks,ke;
1886 FTYPE *prface_l,*prface_r;
1897 p2interp_l=pstore_l;
1898 p2interp_r=pstore_r;
1914 get_odirs(dir,&odir1,&odir2);
1951 is=cent2faceloop[dir].
is +
SHIFT1*(dir==1);
1952 ie=cent2faceloop[dir].
ie;
1953 js=cent2faceloop[dir].
js +
SHIFT2*(dir==2);
1954 je=cent2faceloop[dir].
je;
1955 ks=cent2faceloop[dir].
ks +
SHIFT3*(dir==3);
1956 ke=cent2faceloop[dir].
ke;
1960 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1967 prface_l=
MACP1A0(primface_l,dir,i,j,k);
1968 prface_r=
MACP1A0(primface_r,dir,i,j,k);
1974 #if(STOREFLUXSTATE==0)
1979 MYFUN(
ucon_calc(prface_l, ptrgeomf, ptrql->
ucon, ptrql->
others) ,
"flux.c:interpolate_face2corn()",
"ucon_calc()", 1);
1981 MYFUN(
ucon_calc(prface_r, ptrgeomf, ptrqr->
ucon, ptrqr->
others) ,
"flux.c:interpolate_face2corn()",
"ucon_calc()", 2);
1989 ptrgeomf->p=
FACE1-1+dir;
2092 for(whichodir=0;whichodir<=1;whichodir++){
2144 get_odirs(edgedir,&EMFodir1,&EMFodir2);
2154 if(EMFodir1==interpdir){
2188 if(!(Nvec[interpdir]==1 || Nvec[dir]==1&&Nvec[interpdir]!=1 )){
2190 slope_lim_face2corn(realisinterp, interpdir,idel,jdel,kdel,
pr,p2interp,dqvec[interpdir],pleft,pright, &(face2cornloop[edgedir][EMFodir1][EMFodir2]));
2207 locallim=choose_limiter(interpdir, 0,0,0,
B1);
2214 if(!(Nvec[interpdir]==1|| Nvec[dir]==1&&Nvec[interpdir]!=1 )){
2215 is=face2cornloop[edgedir][EMFodir1][EMFodir2].
is +
SHIFT1*(interpdir==1);
2216 ie=face2cornloop[edgedir][EMFodir1][EMFodir2].
ie;
2217 js=face2cornloop[edgedir][EMFodir1][EMFodir2].
js +
SHIFT2*(interpdir==2);
2218 je=face2cornloop[edgedir][EMFodir1][EMFodir2].
je;
2219 ks=face2cornloop[edgedir][EMFodir1][EMFodir2].
ks +
SHIFT3*(interpdir==3);
2220 ke=face2cornloop[edgedir][EMFodir1][EMFodir2].
ke;
2225 is=cent2faceloop[interpdir].
is +
SHIFT1*(interpdir==1);
2226 ie=cent2faceloop[interpdir].
ie;
2227 js=cent2faceloop[interpdir].
js +
SHIFT2*(interpdir==2);
2228 je=cent2faceloop[interpdir].
je;
2229 ks=cent2faceloop[interpdir].
ks +
SHIFT3*(interpdir==3);
2230 ke=cent2faceloop[interpdir].
ke;
2244 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) //nowait // Don't wait since each direction is independent // NO: use of pleft, pright, and some use of p2interp (that depend on each dir) from loop above makes not possible to use "nowait"
2251 if(!(Nvec[interpdir]==1|| Nvec[dir]==1&&Nvec[interpdir]!=1 )){
2256 p2interp_l[pl] =
MACP0A1(p2interp,i - idel,j - jdel,k - kdel,pl) + 0.5 *
MACP1A1(dqvec,interpdir,i - idel,j - jdel,k - kdel,pl);
2257 p2interp_r[pl] =
MACP0A1(p2interp,i,j,k,pl) - 0.5 *
MACP1A1(dqvec,interpdir,i,j,k,pl);
2262 p2interp_l[pl] =
MACP0A1(pright,i-idel,j-jdel,k-kdel,pl);
2263 p2interp_r[pl] =
MACP0A1(pleft,i,j,k,pl);
2268 else if(Nvec[interpdir]==1){
2272 p2interp_r[pl] = p2interp_l[pl] =
MACP0A1(p2interp,i,j,k,pl);
2278 else if(Nvec[dir]==1&&Nvec[interpdir]!=1){
2289 prface_l=
MACP1A0(primface_l,interpdir,i,j,k);
2290 prface_r=
MACP1A0(primface_r,interpdir,i,j,k);
2294 #if(STOREFLUXSTATE==0)
2296 MYFUN(
ucon_calc(prface_l, ptrgeomf, ptrql->
ucon, ptrql->
others) ,
"flux.c:interpolate_face2corn()",
"ucon_calc()", 1);
2297 MYFUN(
ucon_calc(prface_r, ptrgeomf, ptrqr->
ucon, ptrqr->
others) ,
"flux.c:interpolate_face2corn()",
"ucon_calc()", 2);
2303 ptrgeomf->p=
FACE1-1+dir;
2316 p2interp_l[BFACEINTERPCURRENT] = prface_l[
B1-1+dir];
2317 p2interp_r[BFACEINTERPCURRENT] = prface_r[
B1-1+dir];
2320 p2interp_l[BFACEINTERPCURRENT] *= (ptrgdetgeomf->gdet);
2321 p2interp_r[BFACEINTERPCURRENT] *= (ptrgdetgeomf->gdet);
2328 p2interp_r[npr2interplist[1]] = p2interp_r[npr2interplist[2]] = (ptrqr->
ucon[interpdir])/(ptrqr->
ucon[
TT]);
2331 p2interp_l[npr2interplist[1]] *= (ptrgdetgeomf->gdet);
2332 p2interp_l[npr2interplist[2]] *= (ptrgdetgeomf->gdet);
2333 p2interp_r[npr2interplist[1]] *= (ptrgdetgeomf->gdet);
2334 p2interp_r[npr2interplist[2]] *= (ptrgdetgeomf->gdet);
2338 dualfprintf(
fail_file,
"Shouldn't reach here in fluxctstag.c\n");
2362 igdetgnosing = ptrgdetgeomcorn->igdetnosing;
2368 igdetgnosing = ptrgdetgeomcorn->gdet;
2398 igdetgnosingvel=igdetgnosing;
2403 igdetgnosingvel = ptrgdetgeomcorn->igdetnosing;
2406 else igdetgnosingvel=1.0;
2410 MACP1A3(pvbcorn,edgedir,i,j,k,interpdir,Aodir1,Aodir2) = p2interp_l[
npr2interplist[1]] *= igdetgnosingvel;
2411 MACP1A3(pvbcorn,edgedir,i,j,k,interpdir,Bodir1,Bodir2) = p2interp_r[npr2interplist[1]] *= igdetgnosingvel;
2412 MACP1A3(pvbcorn,edgedir,i,j,k,interpdir,Codir1,Codir2) = p2interp_l[npr2interplist[2]] *= igdetgnosingvel;
2413 MACP1A3(pvbcorn,edgedir,i,j,k,interpdir,Dodir1,Dodir2) = p2interp_r[npr2interplist[2]] *= igdetgnosingvel;
2435 #pragma omp parallel
2472 struct of_geom *ptrgeomc=&geomcdontuse;
2474 struct of_geom *ptrgeomf=&geomfdontuse;
2476 struct of_geom *ptrgeomfu=&geomfudontuse;
2482 #define MYOCOMPLOOPF3 for(k=SHIFTX3DN;k<=N3-1+SHIFT3+SHIFTX3UP;k++)
2483 #define MYOCOMPLOOPF2 for(j=SHIFTX2DN;j<=N2-1+SHIFT2+SHIFTX2UP;j++)
2484 #define MYOCOMPLOOPF1 for(i=SHIFTX1DN;i<=N1-1+SHIFT1+SHIFTX1UP;i++)
2485 #define MYOCOMPLOOPF MYOCOMPLOOPF3 MYOCOMPLOOPF2 MYOCOMPLOOPF1
2502 if(timeorder==numtimeorders-1) finalstep=1;
else finalstep=0;
2503 bound_pstag(stage, finalstep, boundtime, preal, pstag, upoint, USEMPI);
2515 int is,ie,js,je,ks,ke;
2516 get_inversion_startendindices(
Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
2538 if(ii==i && jj==j && kk==k){
2546 MACP0A1(pcent,i,j,k,pl)=0.5*(
MACP0A1(pstag,i,j,k,pl)*(ptrgeomf->gdet/ptrgeomc->gdet) +
MACP0A1(pstag,ii,jj,kk,pl)*(ptrgeomfu->gdet/ptrgeomc->gdet));
2550 MACP0A1(upoint,i,j,k,pl)=
MACP0A1(pcent,i,j,k,pl)*(ptrgeomc->gdet);