5 #include "PatchPluto.H"
10 #if (EOS != ISOTHERMAL) && (CHOMBO_EN_SWITCH == NO)
11 #ifndef CHOMBO_REF_VAR
12 #define CHOMBO_REF_VAR ENG
15 #ifndef CHOMBO_REF_VAR
16 #define CHOMBO_REF_VAR RHO
25 void PatchPluto::computeRefGradient(FArrayBox& gFab, FArrayBox& UFab,
26 const FArrayBox& a_dV,
const Box& b)
53 CH_assert(m_isDefined);
56 double x1, dqx_p, dqx_m, dqx, d2qx, den_x;
57 double x2, dqy_p, dqy_m, dqy, d2qy, den_y;
58 double x3, dqz_p, dqz_m, dqz, d2qz, den_z;
59 double gr1, gr2,
eps = 0.01;
60 #if CHOMBO_REF_VAR == -1
68 #if REF_CRIT != 1 && REF_CRIT != 2
69 print (
"! TagCells.cpp: Refinement criterion not valid\n");
80 Ubox.
jb = Ubox.
je = Ubox.
kb = Ubox.
ke = 0;
81 Gbox.
jb = Gbox.
je = Gbox.
kb = Gbox.
ke = 0;
84 Ubox.
jb = UFab.loVect()[
JDIR]; Ubox.
je = UFab.hiVect()[
JDIR]; ,
85 Ubox.
kb = UFab.loVect()[
KDIR]; Ubox.
ke = UFab.hiVect()[
KDIR]; );
88 Gbox.
jb = gFab.loVect()[
JDIR]; Gbox.
je = gFab.hiVect()[
JDIR]; ,
89 Gbox.
kb = gFab.loVect()[
KDIR]; Gbox.
ke = gFab.hiVect()[
KDIR]; );
98 #if GEOMETRY != CARTESIAN
100 #if CHOMBO_REF_VAR >= 0
103 for (nv = 0; nv <
NVAR; nv++) UFab.divide(a_dV,0,nv);
106 #if (CHOMBO_CONS_AM == YES) && \
107 ((CHOMBO_REF_VAR == iMPHI) || (CHOMBO_REF_VAR == -1))
108 #if ROTATING_FRAME == YES
109 Box curBox = UFab.box();
110 for(BoxIterator bit(curBox); bit.ok(); ++bit) {
111 const IntVect& iv = bit();
112 UFab(iv,
iMPHI) /= a_dV(iv,1);
116 UFab.divide(a_dV,1,
iMPHI);
122 #if CHOMBO_REF_VAR >= 0
123 if (g_stretch_fact != 1.) UFab.divide(g_stretch_fact,
CHOMBO_REF_VAR);
125 if (g_stretch_fact != 1.) UFab.divide(g_stretch_fact);
134 #if CHOMBO_REF_VAR >= 0
139 for (nv = 0; nv <
NVAR; nv++)
142 Ubox.
ib, Ubox.
ie, UFab.dataPtr(nv));
149 Gbox.
ib, Gbox.
ie, gFab.dataPtr(0));
158 x2 = (j + 0.5)*m_dx*g_x2stretch + g_domBeg[
JDIR];
159 #if CHOMBO_LOGR == NO
160 x1 = (i + 0.5)*m_dx + g_domBeg[
IDIR];
162 double xl = g_domBeg[
IDIR] + i*m_dx;
163 double xr = xl + m_dx;
164 x1 = g_domBeg[
IDIR]*0.5*(exp(xr)+exp(xl));
167 D_EXPAND(dqx_p = q[k][j][i+1] - q[k][j][i];
168 dqx_m = - (q[
k][
j][i-1] - q[
k][
j][
i]); ,
169 dqy_p = q[
k][j+1][
i] - q[
k][
j][
i];
170 dqy_m = - (q[
k][j-1][
i] - q[
k][
j][
i]); ,
171 dqz_p = q[k+1][
j][
i] - q[
k][
j][
i];
172 dqz_m = - (q[k-1][
j][
i] - q[
k][
j][
i]);)
183 D_EXPAND(
if (i == 0) dqx_m = dqx_p; ,
184 if (j == 0) dqy_m = dqy_p; ,
185 if (k == 0) dqz_m = dqz_p;)
187 D_EXPAND(
if (i == m_domain.size(
IDIR)-1) dqx_p = dqx_m; ,
188 if (j == m_domain.size(
JDIR)-1) dqy_p = dqy_m; ,
189 if (k == m_domain.size(
KDIR)-1) dqz_p = dqz_m;)
197 dqy = dqy_p + dqy_m; ,
198 dqz = dqz_p + dqz_m;)
200 D_EXPAND(den_x = fabs(q[k][j][i+1]) + fabs(q[k][j][i-1]); ,
201 den_y = fabs(q[k][j+1][i]) + fabs(q[k][j-1][i]); ,
202 den_z = fabs(q[k+1][j][i]) + fabs(q[k-1][j][i]);)
204 gr1 =
D_EXPAND(dqx*dqx, + dqy*dqy, + dqz*dqz);
205 gr1 /=
D_EXPAND(den_x*den_x, + den_y*den_y, + den_z*den_z);
207 grad[
k][
j][
i] = sqrt(gr1);
216 d2qy = dqy_p - dqy_m; ,
217 d2qz = dqz_p - dqz_m;)
220 den_x = 2.0*fabs(q[k][j][i]) + fabs(q[k][j][i+1]) + fabs(q[k][j][i-1]);
221 den_x = fabs(dqx_p) + fabs(dqx_m) + eps*den_x; ,
223 den_y = 2.0*fabs(q[k][j][i]) + fabs(q[k][j+1][i]) + fabs(q[k][j-1][i]);
224 den_y = fabs(dqy_p) + fabs(dqy_m) + eps*den_y; ,
226 den_z = 2.0*fabs(q[k][j][i]) + fabs(q[k+1][j][i]) + fabs(q[k-1][j][i]);
227 den_z = fabs(dqz_p) + fabs(dqz_m) + eps*den_z;
230 gr2 =
D_EXPAND(d2qx*d2qx, + d2qy*d2qy, + d2qz*d2qz);
231 gr2 /=
D_EXPAND(den_x*den_x, + den_y*den_y, + den_z*den_z);
233 grad[
k][
j][
i] = sqrt(gr2);
236 #if GEOMETRY == CYLINDRICAL
237 double R= sqrt(x1*x1 + x2*x2);
238 if (R <= 1.0) grad[
k][
j][
i] = 1.e3;
239 if (i == 0) grad[
k][
j][
i] = 1.e3;
240 #elif GEOMETRY == CARTESIAN
241 double R= sqrt(x1*x1 + x2*x2 + x3*x3);
242 if (R <= 1.0) grad[
k][
j][
i] = 1.e3;
251 #if GEOMETRY != CARTESIAN
253 #if (CHOMBO_CONS_AM == YES) && ((CHOMBO_REF_VAR == iMPHI) || (CHOMBO_REF_VAR == -1))
254 #if ROTATING_FRAME == YES
255 for(BoxIterator bit(curBox); bit.ok(); ++bit) {
256 const IntVect& iv = bit();
258 UFab(iv,
iMPHI) *= a_dV(iv,1);
261 UFab.mult(a_dV,1,
iMPHI);
265 #if CHOMBO_REF_VAR >= 0
268 for (nv = 0; nv <
NVAR; nv++) UFab.mult(a_dV,0,nv);
273 #if CHOMBO_REF_VAR >= 0
274 if (g_stretch_fact != 1.) UFab.mult(g_stretch_fact,
CHOMBO_REF_VAR);
276 if (g_stretch_fact != 1.) UFab.mult(g_stretch_fact);
287 #if CHOMBO_REF_VAR >= 0
290 for (nv = 0; nv <
NVAR; nv++){
292 Ubox.
jb, Ubox.
je, Ubox.
ib, Ubox.
ie);
int jb
Lower corner index in the x2 direction.
#define BOX_LOOP(B, k, j, i)
int kb
Lower corner index in the x3 direction.
void FreeArrayBox(double ***t, long nrl, long ncl, long ndl)
double *** ArrayBox(long int nrl, long int nrh, long int ncl, long int nch, long int ndl, long int ndh)
int ib
Lower corner index in the x1 direction.
void print(const char *fmt,...)
double g_domBeg[3]
Lower limits of the computational domain.
D_EXPAND(tot/[n]=(double) grid[IDIR].np_int_glob;, tot/[n]=(double) grid[JDIR].np_int_glob;, tot/[n]=(double) grid[KDIR].np_int_glob;)
static void computeRefVar(double ***UU[], double ***q, double, RBox *Ubox)
int ie
Upper corner index in the x1 direction.
int ke
Upper corner index in the x3 direction.
int je
Upper corner index in the x2 direction.
double *** ArrayBoxMap(int nrl, int nrh, int ncl, int nch, int ndl, int ndh, double *uptr)
void FreeArrayBoxMap(double ***t, int nrl, int nrh, int ncl, int nch, int ndl, int ndh)
#define QUIT_PLUTO(e_code)