89 struct of_geom *ptrgeom=&geomdontuse;
107 get_odirs(dir,&odir1,&odir2);
108 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
111 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) nowait // nowait valid because each next loop writes to independent memory regions (or to local temporary variables like igdetgnosing that is overwritten for each iteration and so doesn't matter). And also don't require result of one loop for next loop (this is often not true!)
116 MACP0A1(ufield,i,j,k,
B1) = +(
AVGCORN_1(A[3],i,
jp1mac(j),k)-
AVGCORN_1(A[3],i,j,k))/(
dx[2]);
117 MACP0A1(ufield,i,j,k,
B1) += -(
AVGCORN_1(A[2],i,j,
kp1mac(k))-
AVGCORN_1(A[2],i,j,k))/(
dx[3]);
120 igdetgnosing =
sign(ptrgeom->gdet)/(fabs(ptrgeom->gdet)+
SMALL);
133 get_odirs(dir,&odir1,&odir2);
134 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
137 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) nowait
141 MACP0A1(ufield,i,j,k,
B2) = +(
AVGCORN_2(A[1],i,j,
kp1mac(k))-
AVGCORN_2(A[1],i,j,k))/(
dx[3]);
142 MACP0A1(ufield,i,j,k,
B2) += -(
AVGCORN_2(A[3],
ip1mac(i),j,k)-
AVGCORN_2(A[3],i,j,k))/(
dx[1]);
145 igdetgnosing =
sign(ptrgeom->gdet)/(fabs(ptrgeom->gdet)+
SMALL);
158 get_odirs(dir,&odir1,&odir2);
159 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
162 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) nowait
166 MACP0A1(ufield,i,j,k,
B3) = +(
AVGCORN_3(A[2],
ip1mac(i),j,k)-
AVGCORN_3(A[2],i,j,k))/(
dx[1]);
167 MACP0A1(ufield,i,j,k,
B3) += -(
AVGCORN_3(A[1],i,
jp1mac(j),k)-
AVGCORN_3(A[1],i,j,k))/(
dx[2]);
170 igdetgnosing =
sign(ptrgeom->gdet)/(fabs(ptrgeom->gdet)+
SMALL);
191 int flux_ct(
int stage,
192 int initialstep,
int finalstep,
193 FTYPE (*pb)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*emf)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vconemf)[
NSTORE2][
NSTORE3][
NDIM-1],
FTYPE (*dq1)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*dq2)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*dq3)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*F1)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F2)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F3)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*vpot)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
int *Nvec,
FTYPE *CUf,
FTYPE *CUnew,
SFTYPE fluxdt,
SFTYPE fluxtime)
204 MYFUN(flux_ct_computeemf(stage, pb, emf, vconemf, dq1, dq2, dq3, F1, F2, F3),
"step_ch.c:advance()",
"flux_ct",1);
206 MYFUN(flux_ct_diffusivecorrections(stage, pb, emf, vconemf, dq1, dq2, dq3, F1, F2, F3),
"step_ch.c:advance()",
"flux_ct",1);
213 evolve_vpotgeneral(
FLUXB, stage, initialstep, finalstep, pb, Nvec, NULL, emf, CUf, CUnew, fluxdt, fluxtime, vpot);
216 int fluxvpot_modifyemfsuser=0;
219 if(fluxvpot_modifyemfsuser==0){
221 adjust_fluxcttoth_emfs(fluxtime,pb,emf);
229 MYFUN(flux_ct_emf2flux(stage, pb, emf, vconemf, dq1, dq2, dq3, F1, F2, F3),
"step_ch.c:advance()",
"flux_ct",1);
247 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
259 dualfprintf(
fail_file,
"Makes no sense to call flux_ct with FLUXB==FLUXCTHLL\n");
281 struct of_geom geomcfulldontuse;
282 struct of_geom *ptrgeomcfull=&geomcfulldontuse;
289 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
296 MYFUN(
ucon_calc(
MAC(pb,i,j,k), ptrgeomcfull, ucon, others),
"fluxct.c:flux_ct()",
"ucon_calc() dir=0", 1);
303 for(l=
U1;l<=
U3;l++)
MACP0A1(vconemf,i,j,k,l)=(ucon[l-
U1+1]/ucon[
TT])*(ptrgeomcfull->EOMFUNCMAC(l));
332 struct of_gdetgeom geomf1dontuse,geomf2dontuse,geomf3dontuse;
333 struct of_gdetgeom *ptrgeomf1=&geomf1dontuse,*ptrgeomf2=&geomf2dontuse,*ptrgeomf3=&geomf3dontuse;
338 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
348 MACP0A1(F1,i,j,k,
B1)*=(ptrgeomf1->IEOMFUNCNOSINGMAC(
B1));
349 MACP0A1(F1,i,j,k,
B2)*=(ptrgeomf1->IEOMFUNCNOSINGMAC(
B2));
350 MACP0A1(F1,i,j,k,
B3)*=(ptrgeomf1->IEOMFUNCNOSINGMAC(
B3));
358 MACP0A1(F2,i,j,k,
B1)*=(ptrgeomf2->IEOMFUNCNOSINGMAC(
B1));
359 MACP0A1(F2,i,j,k,
B2)*=(ptrgeomf2->IEOMFUNCNOSINGMAC(
B2));
360 MACP0A1(F2,i,j,k,
B3)*=(ptrgeomf2->IEOMFUNCNOSINGMAC(
B3));
368 MACP0A1(F3,i,j,k,
B1)*=(ptrgeomf3->IEOMFUNCNOSINGMAC(
B1));
369 MACP0A1(F3,i,j,k,
B2)*=(ptrgeomf3->IEOMFUNCNOSINGMAC(
B2));
370 MACP0A1(F3,i,j,k,
B3)*=(ptrgeomf3->IEOMFUNCNOSINGMAC(
B3));
377 #endif // end if CORNGDETVERSION
385 if((
N2>1)&&(
N3>1)) coefemf[1]=0.25;
387 if((
N1>1)&&(
N3>1)) coefemf[2]=0.25;
389 if((
N1>1)&&(
N2>1)) coefemf[3]=0.25;
413 #pragma omp parallel // globalprivate stuff needed for final CORNGDET setting if doing that method
417 struct of_gdetgeom geomf1dontuse,geomf2dontuse,geomf3dontuse;
418 struct of_gdetgeom *ptrgeomf1=&geomf1dontuse,*ptrgeomf2=&geomf2dontuse,*ptrgeomf3=&geomf3dontuse;
430 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
448 #else // end if doing EMF1
450 #endif // end if not doing EMF1
452 #if(CORNGDETVERSION)// then tack on geometry
455 MACP1A0(emf,1,i,j,k) *= (ptrgeomf1->EOMFUNCMAC(
B2));
456 #endif // end if CORNGDETVERSION
473 #else // end if doing EMF2
475 #endif // end if not doing EMF2
477 #if(CORNGDETVERSION)// then tack on geometry
480 MACP1A0(emf,2,i,j,k) *=(ptrgeomf2->EOMFUNCMAC(
B1));
481 #endif // end if CORNGDETVERSION
499 #else // end if doing EMF3
501 #endif // end if not doing EMF3
503 #if(CORNGDETVERSION)// then tack on geometry
506 MACP1A0(emf,3,i,j,k) *=(ptrgeomf3->EOMFUNCMAC(
B1));
507 #endif // end if CORNGDETVERSION
541 #pragma omp parallel // globalprivate stuff needed for final CORNGDET setting if doing that method
557 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
572 #if(CORNGDETVERSION)// then tack on geometry
575 MACP1A0(emf,1,i,j,k) *=(ptrgeomc->EOMFUNCMAC(
B2));
576 #endif // end if CORNGDETVERSION
578 #endif // end if doing EMF1
593 #if(CORNGDETVERSION)// then tack on geometry
596 MACP1A0(emf,2,i,j,k) *=(ptrgeomc->EOMFUNCMAC(
B1));
597 #endif // end if CORNGDETVERSION
599 #endif // end if doing EMF2
613 #if(CORNGDETVERSION)// then tack on geometry
616 MACP1A0(emf,3,i,j,k) *=(ptrgeomc->EOMFUNCMAC(
B1));
617 #endif // end if CORNGDETVERSION
619 #endif // end if doing EMF3
657 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
691 struct of_gdetgeom geomf1dontuse,geomf2dontuse,geomf3dontuse;
692 struct of_gdetgeom *ptrgeomf1=&geomf1dontuse,*ptrgeomf2=&geomf2dontuse,*ptrgeomf3=&geomf3dontuse;
700 ptrgeomf1=&geomf1dontuse;
701 ptrgeomf2=&geomf2dontuse;
702 ptrgeomf3=&geomf3dontuse;
705 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
768 diffusiveterm[l]= 0.25*(emfmp[l] + emfmm[l] + emfpm[l] + emfpp[l]);
771 #if(CORNGDETVERSION)// then tack on geometry
778 diffusiveterm[1] *=(ptrgeomf1->EOMFUNCMAC(
B2));
780 diffusiveterm[2] *=(ptrgeomf2->EOMFUNCMAC(
B1));
782 diffusiveterm[3] *=(ptrgeomf3->EOMFUNCMAC(
B1));
788 MACP1A0(emf,l,i,j,k) = 2.0*
MACP1A0(emf,l,i,j,k) - diffusiveterm[l];
812 if(
LIMADJUST>0 ||
DODQMEMORY==0 || choose_limiter(1, 0,0,0,
RHO)>=
PARA || choose_limiter(2, 0,0,0,
RHO)>=
PARA || choose_limiter(3, 0,0,0,
RHO)>=
PARA){
813 dualfprintf(
fail_file,
"Cannot use Athena2 with limadjust since dq's not defined\n");
828 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOM // requires full copyin()
832 int i,
j,k,l,pl,pliter;
834 struct of_gdetgeom geomf1dontuse,geomf2dontuse,geomf3dontuse;
835 struct of_gdetgeom *ptrgeomf1=&geomf1dontuse,*ptrgeomf2=&geomf2dontuse,*ptrgeomf3=&geomf3dontuse;
839 FTYPE B1pp,B1pm,B1mp,B1mm;
840 FTYPE B2pp,B2pm,B2mp,B2mm ;
841 FTYPE B3pp,B3pm,B3mp,B3mm ;
842 FTYPE U1pp,U1pm,U1mp,U1mm;
843 FTYPE U2pp,U2pm,U2mp,U2mm ;
844 FTYPE U3pp,U3pm,U3mp,U3mm ;
846 FTYPE B1d,B1u,B1l,B1r;
847 FTYPE B2d,B2u,B2l,B2r;
848 FTYPE B3d,B3u,B3l,B3r;
852 FTYPE cmax1,cmin1,cmax2,cmin2,ctop1,ctop2;
853 struct of_geom geomco1dontuse,geomco2dontuse,geomco3dontuse;
854 struct of_geom *ptrgeomco1=&geomco1dontuse,*ptrgeomco2=&geomco2dontuse,*ptrgeomco3=&geomco3dontuse;
861 ptrgeomf1=&geomf1dontuse;
862 ptrgeomf2=&geomf2dontuse;
863 ptrgeomf3=&geomf3dontuse;
864 ptrgeomco1=&geomco1dontuse;
865 ptrgeomco2=&geomco2dontuse;
866 ptrgeomco3=&geomco3dontuse;
868 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
923 PLOOP(pliter,pl) pbavg[pl]=0.25*(
MACP0A1(pb,i,j,k,pl)+
MACP0A1(pb,i,
jm1mac(j),k,pl)+
MACP0A1(pb,i,j,
km1mac(k),pl)+
MACP0A1(pb,i,
jm1mac(j),
km1mac(k),pl));
927 dir=2;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco1, &cmax1, &cmin1,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=1", 1);
928 dir=3;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco1, &cmax2, &cmin2,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=2", 2);
929 ctop1 =
max(fabs(cmax1), fabs(cmin1));
930 ctop2 =
max(fabs(cmax2), fabs(cmin2));
942 diffusiveterm[1] = 0.125*(
944 + B2d - B2mm - B2u + B2mp
945 + B2d - B2pm - B2u + B2pp
948 + B3r - B3pm - B3l + B3mm
949 + B3r - B3pp - B3l + B3mp
998 PLOOP(pliter,pl) pbavg[pl]=0.25*(
MACP0A1(pb,i,j,k,pl)+
MACP0A1(pb,
im1mac(i),j,k,pl)+
MACP0A1(pb,i,j,
km1mac(k),pl)+
MACP0A1(pb,
im1mac(i),j,
km1mac(k),pl));
1000 MYFUN(get_state(pbavg, ptrgeomco2, &state),"
step_ch.c:flux_ct()", "get_state()", 1);
1001 dir=3;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco2, &cmax1, &cmin1,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=1", 1);
1002 dir=1;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco2, &cmax2, &cmin2,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=2", 2);
1003 ctop1 =
max(fabs(cmax1), fabs(cmin1));
1004 ctop2 =
max(fabs(cmax2), fabs(cmin2));
1016 diffusiveterm[2] = 0.125*(
1018 + B3d - B3mm - B3u + B3mp
1019 + B3d - B3pm - B3u + B3pp
1022 + B1r - B1pm - B1l + B1mm
1023 + B1r - B1pp - B1l + B1mp
1072 PLOOP(pliter,pl) pbavg[pl]=0.25*(
MACP0A1(pb,i,j,k,pl)+
MACP0A1(pb,i,
jm1mac(j),k,pl)+
MACP0A1(pb,
im1mac(i),j,k,pl)+
MACP0A1(pb,
im1mac(i),
jm1mac(j),k,pl));
1074 MYFUN(get_state(pbavg, ptrgeomco3, &state),"
step_ch.c:flux_ct()", "get_state()", 1);
1075 dir=1;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco3, &cmax1, &cmin1,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=1", 1);
1076 dir=2;
MYFUN(
vchar(pbavg, &state, dir, ptrgeomco3, &cmax2, &cmin2,&ignorecourant),"
step_ch.c:flux_ct()", "
vchar() dir=2", 2);
1077 ctop1 =
max(fabs(cmax1), fabs(cmin1));
1078 ctop2 =
max(fabs(cmax2), fabs(cmin2));
1090 diffusiveterm[3] = 0.125*(
1092 + B1d - B1mm - B1u + B1mp
1093 + B1d - B1pm - B1u + B1pp
1096 + B2r - B2pm - B2l + B2mm
1097 + B2r - B2pp - B2l + B2mp
1117 diffusiveterm[1] *=(ptrgeomf1->EOMFUNCMAC(
B2));
1119 diffusiveterm[2] *=(ptrgeomf2->EOMFUNCMAC(
B1));
1121 diffusiveterm[3] *=(ptrgeomf3->EOMFUNCMAC(
B1));
1129 MACP1A0(emf,l,i,j,k)+= - diffusiveterm[l];
1165 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
1192 #pragma omp parallel // no copyin() needed since not calling any functions that use global vars
1208 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) // not needed with just 1 loop: nowait // Can "nowait" since each F1,F2,F3 set independently on successive loops
1218 MACP0A1(F1,i,j,k,
B2) = 0.5 * (
MACP1A0(emf,3,i,j,k) +
MACP1A0(emf,3,i,
jp1mac(j),k));
1219 MACP0A1(F1,i,j,k,
B3) = - 0.5 * (
MACP1A0(emf,2,i,j,k) +
MACP1A0(emf,2,i,j,
kp1mac(k)));
1228 MACP0A1(F2,i,j,k,
B1) = - 0.5 * (
MACP1A0(emf,3,i,j,k) +
MACP1A0(emf,3,
ip1mac(i),j,k));
1231 MACP0A1(F2,i,j,k,
B3) = 0.5 * (
MACP1A0(emf,1,i,j,k) +
MACP1A0(emf,1,i,j,
kp1mac(k)));
1238 MACP0A1(F3,i,j,k,
B1) = 0.5 * (
MACP1A0(emf,2,i,j,k) +
MACP1A0(emf,2,
ip1mac(i),j,k));
1239 MACP0A1(F3,i,j,k,
B2) = - 0.5 * (
MACP1A0(emf,1,i,j,k) +
MACP1A0(emf,1,i,
jp1mac(j),k));
1260 #pragma omp parallel // no copyin() required
1272 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) // nowait // Can "nowait" since each successive loop sets F1,F2,F3 independently
1284 #endif // end if doing F1
1296 #endif // end if doing F2
1308 #endif // end if doing F3