15 #define DOUSEPPMCONTACTSTEEP 1 // used alone is unstable
16 #define DOUSEPARAMONOCHECK 1 // above must be used with this
19 #define DOUSEPARAFLAT 1 // avoids oscillations in strong shocks
21 #define DOINGALLMCSTEEP (DOUSEPPMCONTACTSTEEP&&DOUSEPARAFLAT&&DOUSEPARAMONOCHECK)
23 #define WHICH3POINTLIMT MC
27 #define DQALLOWEXTREMUM 1 // assume USEPARAMONOCHECK enabled if using this!!! (otherwise crazy)
32 #define CONNECTUANDRHO (0 && (DOEVOLVERHO&&DOEVOLVEUU))
37 #define CONNECTBANDRHO (0 && (DOEVOLVERHO) )
40 #if(DQALLOWEXTREMUM==0)
41 #define MCSTEEPMINMOD(a,b) MINMOD(a,b)
43 #define MCSTEEPMINMOD(a,b) MINMODB(a,b)
55 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])
57 void slope_lim_point_c2e(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int pl,
int startorderi,
int endorderi,
FTYPE *yreal,
FTYPE*y,
FTYPE *dq,
FTYPE *left,
FTYPE *right);
58 void slope_lim_point_e2c_continuous(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int pl,
int startorderi,
int endorderi,
FTYPE *yreal,
FTYPE*y,
FTYPE *dq,
FTYPE *left,
FTYPE *right);
59 void slope_lim_point_allpl(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int startorderi,
int endorderi,
FTYPE **yreal,
FTYPE **y,
FTYPE *dq,
FTYPE *left,
FTYPE *right);
60 extern int choose_limiter(
int dir,
int i,
int j,
int k,
int pl);
67 int startorderi,endorderi;
69 int is,ie,js,je,ks,ke,di,dj,dk;
76 dualfprintf(
fail_file,
"Must have dq's when using MC or lower second order methods\n");
81 set_interppoint_loop_ranges(interporflux, dir, loc, continuous, &is, &ie, &js, &je, &ks, &ke, &di, &dj, &dk);
90 reallim=choose_limiter(dir, i,j,k,pl);
95 endorderi = - startorderi;
102 endorderi = - startorderi + 1;
120 #if( DOUSEPARAFLAT || DOUSEPPMCONTACTSTEEP)
121 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOMINTERP
129 FTYPE *ypl[NPR2INTERP];
130 FTYPE *yrealpl[NPR2INTERP];
142 ypl[plpl] = interplistpl[plpl] - startorderi;
147 yrealpl[plpl] = realinterplistpl[plpl] - startorderi;
151 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
156 PINTERPLOOP(pliter,plpl)
for(l=startorderi;l<=endorderi;l++){
158 ypl[plpl][l]=
MACP0A1(p2interp,i + l*idel,j + l*jdel,k + l*kdel,plpl);
164 PINTERPLOOP(pliter,plpl)
for(l=startorderi;l<=endorderi;l++){
165 yrealpl[plpl][l]=ypl[plpl][l];
171 yrealpl[plpl][l]=
MACP0A1(primreal,i + l*idel,j + l*jdel,k + l*kdel,plpl);
175 slope_lim_point_allpl(i, j, k, loc, realisinterp, dir,reallim,startorderi,endorderi,yrealpl,ypl,
176 &
MACP0A1(dq,i,j,k,0),&
MACP0A1(pleft,i,j,k,0),&
MACP0A1(pright,i,j,k,0)
191 #if( DOUSEPARAFLAT || DOUSEPPMCONTACTSTEEP)
192 #pragma omp parallel OPENMPGLOBALPRIVATEFORSTATEANDGEOMINTERP
210 y = interplist - startorderi;
211 yreal = realinterplist - startorderi;
213 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
218 for(l=startorderi;l<=endorderi;l++){
219 y[l]=
MACP0A1(p2interp,i + l*idel,j + l*jdel,k + l*kdel,pl);
222 for(l=startorderi;l<=endorderi;l++){
228 for(l=startorderi;l<=endorderi;l++){
229 yreal[l]=
MACP0A1(primreal,i + l*idel,j + l*jdel,k + l*kdel,pl);
236 slope_lim_point_c2e(i, j, k, loc, realisinterp, dir, reallim,pl,startorderi,endorderi,yreal,y,
237 &
MACP0A1(dq,i,j,k,pl),&
MACP0A1(pleft,i,j,k,pl),&
MACP0A1(pright,i,j,k,pl)
241 slope_lim_point_e2c_continuous(i, j, k, loc, realisinterp, dir, reallim,pl,startorderi,endorderi,yreal,y,
242 &
MACP0A1(dq,i,j,k,pl),&
MACP0A1(pleft,i,j,k,pl),&
MACP0A1(pright,i,j,k,pl)
254 dualfprintf(
fail_file,
"Can't use PARAFLAT with LIMADJUST!=LIMITERFIXED\n");
271 int set_interppoint_loop_ranges(
int interporflux,
int dir,
int loc,
int continuous,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
276 set_interppoint_loop_expanded(interporflux, dir, loc, is, ie, js, je, ks, ke, di, dj, dk);
283 set_interppoint_loop_expanded_face2cent(interporflux, dir, loc, is, ie, js, je, ks, ke, di, dj, dk);
292 int set_interppoint_loop_ranges_3Dextended(
int interporflux,
int loc,
int continuous,
int *maxis,
int *maxie,
int *maxjs,
int *maxje,
int *maxks,
int *maxke,
int *di,
int *dj,
int *dk)
296 int is,ie,js,je,ks,ke;
311 set_interppoint_loop_ranges(interporflux, dimen, loc, continuous, maxis, maxie, maxjs, maxje, maxks, maxke, di, dj, dk);
315 set_interppoint_loop_ranges(interporflux, dimen, loc, continuous, &is, &ie, &js, &je, &ks, &ke, di, dj, dk);
316 if(is<*maxis) *maxis=is;
317 if(ie>*maxie) *maxie=ie;
318 if(js<*maxjs) *maxjs=js;
319 if(je>*maxje) *maxje=je;
320 if(ks<*maxks) *maxks=ks;
321 if(ke>*maxke) *maxke=ke;
333 void set_interppoint_loop_ranges_2D_EMF_formerged(
int interporflux,
int corner,
int odir1,
int odir2,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
396 dualfprintf(
fail_file,
"No such dir=%d in set_interppoint_loop_ranges_2D_EMF_formerged()\n",corner);
406 void set_interppoint_loop_ranges_geomcorn_formerged(
int interporflux,
int corner,
int odir1,
int odir2,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
426 *je=myUconsloop[
FJE]+SHIFT2*2;
429 *ke=myUconsloop[
FKE]+SHIFT3*2;
438 *ie=myUconsloop[
FIE]+SHIFT1*2;
445 *ke=myUconsloop[
FKE]+SHIFT3*2;
454 *ie=myUconsloop[
FIE]+SHIFT1*2;
457 *je=myUconsloop[
FJE]+SHIFT2*2;
469 dualfprintf(
fail_file,
"No such dir=%d in set_interppoint_loop_ranges_geomcorn_formerged()\n",corner);
485 void set_interppoint_loop(
int interporflux,
int dir,
int loc,
int continuous,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
535 dualfprintf(
fail_file,
"No such dir=%d in set_interppoint_loop()\n",dir);
550 void set_interppoint_loop_expanded(
int interporflux,
int dir,
int loc,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
611 dualfprintf(
fail_file,
"No such dir=%d in set_interppoint_loop_expanded()\n",dir);
622 void set_interppoint_loop_expanded_face2cent(
int interporflux,
int dir,
int loc,
int *is,
int *ie,
int *js,
int *je,
int *ks,
int *ke,
int *di,
int *dj,
int *dk)
636 *is=myUconsloop[
FIS];
637 *ie=myUconsloop[
FIE];
654 *js=myUconsloop[
FJS];
655 *je=myUconsloop[
FJE];
672 *ks=myUconsloop[
FKS];
673 *ke=myUconsloop[
FKE];
681 dualfprintf(
fail_file,
"No such dir=%d in set_interppoint_loop_expanded_face2cent()\n",dir);
696 void slope_lim_point_c2e(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int pl,
int startorderi,
int endorderi,
FTYPE *yreal,
FTYPE*y,
FTYPE *dq,
FTYPE *left,
FTYPE *right)
702 extern void parajon(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int pl,
FTYPE *y,
FTYPE *lout,
FTYPE *rout);
715 #if(WHICHPARA==PARA1)
717 #elif(WHICHPARA==PARA2)
719 #elif(WHICHPARA==PARA3)
721 #elif(WHICHPARA==PARA4)
722 para4(realisinterp, pl,y,left,right);
723 #elif(WHICHPARA==PARAJON)
724 parajon(i,j,k,loc,realisinterp, dir, pl,y,left,right);
729 csslope(pl, y, &mydq);
730 *left =y[0] - 0.5* mydq;
731 *right=y[0] + 0.5* mydq;
752 *left =y[0] - 0.5* mydq;
753 *right=y[0] + 0.5* mydq;
766 void slope_lim_point_e2c_continuous(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int pl,
int startorderi,
int endorderi,
FTYPE *yreal,
FTYPE*y,
FTYPE *dq,
FTYPE *left,
FTYPE *right)
777 if(reallim>
MC) reallim=
MC;
780 if(reallim<=
MC || 1){
784 mydq=2.*(0.25*ddq - 1.*yc + 1.*yl - 0.5*(-1.*yc + yr));
785 *left =yc - 0.5* mydq;
788 mydq=-2.*(0.25*ddq - 0.5*(-1.*yc + yr));
789 *right=yc + 0.5* mydq;
794 dualfprintf(
fail_file,
"NOT SETUP YET FOR slope_lim_point_e2c_continuous\n");
807 void slope_lim_point_allpl(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
int reallim,
int startorderi,
int endorderi,
FTYPE **yreal,
FTYPE **y,
FTYPE *dq,
FTYPE *left,
FTYPE *right)
809 extern void parapl(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
FTYPE **yreal,
FTYPE **y,
FTYPE *lout,
FTYPE *rout);
810 void mcsteeppl(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
FTYPE **yreal,
FTYPE **y,
FTYPE *lout,
FTYPE *rout);
814 parapl(i, j, k, loc, realisinterp, dir,yreal,y,left,right);
817 mcsteeppl(i, j, k, loc, realisinterp, dir,yreal,y,left,right);
820 dualfprintf(
fail_file,
"No such allpl reallim=%d\n",reallim);
836 extern void get_limit_slopes(
int reallim,
int extremum,
FTYPE *dq1l,
FTYPE *dq1r,
FTYPE *dq2,
FTYPE *dqout);
839 dq1l = 1.0*(yc - yl);
840 dq1r = 1.0*(yr - yc);
843 get_limit_slopes(reallim, 0, &dq1l, &dq1r, &dq2, dq);
852 FTYPE ddq1l,ddq1r,ddq2;
853 extern void get_limit_slopes(
int reallim,
int extremum,
FTYPE *dq1l,
FTYPE *dq1r,
FTYPE *dq2,
FTYPE *dqout);
856 ddq1l=0.5*(-2.0*yc+yl+yr);
857 ddq1r=0.5*(yc-2.0*yr+yrr);
858 ddq2=
SIXTH*(-3.*yc + yl + 3.*yr - 1.*yrr) +
859 SIXTH*(3.*yc - 1.*yl - 3.*yr + yrr) +
860 0.5*(-1.*yc + yl - 1.*yr + yrr);
864 get_limit_slopes(reallim, 0, &ddq1l, &ddq1r, &ddq2, ddq);
870 void get_limit_slopes(
int reallim,
int extremum,
FTYPE *dq1l,
FTYPE *dq1r,
FTYPE *dq2,
FTYPE *dq)
872 FTYPE Dqc,Dqp,Dqm,s,theta;
890 if (s <= 0.) *dq= 0.;
891 else *dq= (2.0 * s / (Dqm + Dqp));
897 Dqm = theta * dq1l[0];
898 Dqp = theta * dq1r[0];
924 dualfprintf(
fail_file,
"unknown slope limiter: %d\n",reallim);
934 FTYPE Dqm, Dqp, Dqc, s;
937 Dqm = 2.0 * (yc - yl);
938 Dqp = 2.0 * (yr - yc);
939 Dqc = 0.5 * (yr - yl);
941 if (s <= 0.) *dq= 0.;
943 if (fabs(Dqm) < fabs(Dqp) && fabs(Dqm) < fabs(Dqc))
945 else if (fabs(Dqp) < fabs(Dqc))
952 else if (reallim ==
VANL) {
959 *dq= (2.0 * s / (Dqm + Dqp));
962 else if (reallim ==
MINM) {
966 if (s <= 0.) *dq= 0.;
968 if (fabs(Dqm) < fabs(Dqp)) *dq= Dqm;
972 else if (reallim ==
NLIM) {
973 Dqc = 0.5 * (yr - yl);
976 else if (reallim ==
DONOR) {
980 dualfprintf(
fail_file,
"unknown slope limiter: %d\n",reallim);
996 FTYPE Dql, Dqlm, Dqlp;
999 FTYPE Dqc, Dqcm, Dqcp;
1010 Dqc=0.5*(y[1]-y[-1]);
1011 Dqcm=0.5*(y[0]-y[-2]);
1012 Dqcp=0.5*(y[2]-y[0]);
1026 if(pl==
RHO) alpha=2.0;
1027 else if((pl>=
U1)&&(pl<=
U3)) alpha=1.25;
1028 else if(pl==
UU) alpha=1.0;
1029 else if((pl>=
B1)&&(pl<=
B3)) alpha=1.25;
1032 Dql=alpha*
min(fabs(Dqp),fabs(Dqm));
1033 Dqlp=alpha*
min(fabs(Dqpp),fabs(Dqp));
1034 Dqlm=alpha*
min(fabs(Dqm),fabs(Dqmm));
1036 Dqbp=sp*
min(Dqlp,fabs(Dqcp));
1037 Dqbm=sm*
min(Dqlm,fabs(Dqcm));
1049 void mcsteeppl(
int i,
int j,
int k,
int loc,
int realisinterp,
int dir,
FTYPE **yrealpl,
FTYPE **ypl,
FTYPE *loutpl,
FTYPE *routpl)
1051 FTYPE dqpl0[NPR2INTERP][8];
1052 FTYPE *dqpl[NPR2INTERP];
1067 void get_mcsteep_dqs(
int dqrange,
FTYPE *y,
FTYPE *dq);
1074 dualfprintf(
fail_file,
"mcsteppl not setup for koral\n");
1094 V = yrealpl[
U1+dir-1];
1098 dqpl[pl]=dqpl0[pl]+4;
1105 #if(1 && (CONNECTUANDRHO||CONNECTBANDRHO) )
1120 ypl[
B1+odir1-1][mm] /= (fabs(ypl[
RHO][mm])+
SMALL);
1121 ypl[
B1+odir2-1][mm] /= (fabs(ypl[
RHO][mm])+
SMALL);
1130 routpl[
B1+odir1-1] /= (fabs(routpl[
RHO])+
SMALL);
1131 loutpl[
B1+odir1-1] /= (fabs(loutpl[
RHO])+
SMALL);
1132 routpl[
B1+odir2-1] /= (fabs(routpl[
RHO])+
SMALL);
1133 loutpl[
B1+odir2-1] /= (fabs(loutpl[
RHO])+
SMALL);
1155 #if( DOUSEPARAFLAT || DOUSEPPMCONTACTSTEEP)
1164 #if( DOUSEPARAFLAT )
1165 Fi = Ficalc(dir,V,P);
1184 #if(DOINGALLMCSTEEP)
1185 get_mcsteep_dqs(dqrange, y, dq);
1190 #if(DOUSEPPMCONTACTSTEEP)
1195 #if(DOUSEPARAMONOCHECK)
1211 loutpl[pl] = y[0] - 0.5* dq[0];
1212 routpl[pl] = y[0] + 0.5* dq[0];
1222 #if(DOUSEPPMCONTACTSTEEP)
1223 parasteep(dir,pl,V,P,ypl[pl],dqpl[pl],&loutpl[pl],&routpl[pl]);
1234 paraflatten(dir,pl,ypl[pl],Fi,&loutpl[pl],&routpl[pl]);
1244 #if(DOUSEPARAMONOCHECK)
1245 for(mm=-dqrange/2+1;mm<=dqrange/2;mm++){
1246 ddq[mm] = dq[mm] - dq[mm-1];
1249 checkparamonotonicity(smooth, dqrange, pl, ypl[pl], ddq, dqpl[pl], &loutpl[pl], &routpl[pl], &loutpl[pl], &routpl[pl]);
1257 #if(1 && (CONNECTUANDRHO||CONNECTBANDRHO) )
1263 ypl[
UU][mm] *= fabs(ypl[
RHO][mm]);
1266 ypl[
B1+odir1-1][mm] *= fabs(ypl[
RHO][mm]);
1267 ypl[
B1+odir2-1][mm] *= fabs(ypl[
RHO][mm]);
1272 routpl[
UU] *= fabs(routpl[
RHO]);
1273 loutpl[
UU] *= fabs(loutpl[
RHO]);
1276 routpl[
B1+odir1-1] *= fabs(routpl[
RHO]);
1277 loutpl[
B1+odir1-1] *= fabs(loutpl[
RHO]);
1278 routpl[
B1+odir2-1] *= fabs(routpl[
RHO]);
1279 loutpl[
B1+odir2-1] *= fabs(loutpl[
RHO]);
1294 void get_mcsteep_dqs(
int dqrange,
FTYPE *y,
FTYPE *dq)
1297 FTYPE a_dq1[10],a_dq2[10];
1309 for(mm=-dqrange/2 ; mm<=dqrange/2 ; mm++) {
1310 dq1[mm] = (y[mm]-y[mm-1]);
1311 dq2[mm] = 0.5 *(y[mm+1]-y[mm-1]);
1314 dq1[mm] = (y[mm]-y[mm-1]);
1319 for(mm=-dqrange/2 ; mm<=dqrange/2 ; mm++) {
1323 #if(WHICH3POINTLIMT==MC)
1325 Dqm = 2.0 * dq1[mm];
1326 Dqp = 2.0 * dq1[mm+1];
1329 #elif(WHICH3POINTLIMT==MINM)
1335 #elif(WHICH3POINTLIMT==VANL)
1341 if (s <= 0.) dq[mm] = 0.;
1342 else dq[mm] = (2.0 * s / (Dqm + Dqp));
1351 #define MIN3(x,y,z) (min(min(x,y),z))
1352 #define MAX3(x,y,z) (max(max(x,y),z))
1354 #define MIN4(w,x,y,z) (min(w,MIN3(x,y,z)))
1355 #define MAX4(w,x,y,z) (max(w,MAX3(x,y,z)))
1357 #define MINMODMP5(x,y) (0.5*(sign(x)+sign(y))*min(fabs(x),fabs(y)))
1359 #define MINMOD4(w,x,y,z) (0.125*(sign(w)+sign(x))*fabs( (sign(w)+sign(y))*(sign(w)+sign(z)) ) * MIN4(fabs(w),fabs(x),fabs(y),fabs(z)) )
1361 #define MEDIAN(x,y,z) ((x) + MINMODMP5((y)-(x),(z)-(x)));
1379 mp5face(yll,yl,yc,yr,yrr,rout);
1380 mp5face(yrr,yr,yc,yl,yll,lout);
1393 FTYPE UL = 0.0078125*(90.*yc - 20.*yl + 3.*yll + 60.*yr - 5.*yrr);
1401 FTYPE fabsU=(1.0/5.0)*sqrt(yll*yll + yl*yl + yc*yc + yr*yr + yrr*yrr);
1402 int nolimit=(UL-yc)*(UL-UMP)<=epsilonmp5*fabsU;
1410 FTYPE Dm = yll - 2.0*yl + yc;
1411 FTYPE D0 = yl - 2.0*yc + yr;
1412 FTYPE Dp = yc - 2.0*yr + yrr;
1417 FTYPE UUL = yc + alpha*(yc-yr);
1418 FTYPE UAV = 0.5*(yc+yr);
1422 FTYPE UMD = UAV - 0.5*DM4p;
1423 FTYPE dd = 4.0*DM4m;
1424 FTYPE ULC = 0.75*yc + 0.375*(dd + 2.*yc - 1.*yl) - 0.125*yl;
1431 *out +=
MINMOD(UMIN-UL,UMAX-UL);