PLUTO
TagCells.cpp
Go to the documentation of this file.
1 #include <cstdio>
2 #include <string>
3 using std::string;
4 
5 #include "PatchPluto.H"
6 #include "LoHiSide.H"
7 
8 /* ************************************************************************* */
9 //void PatchPluto::computeRefGradient(FArrayBox& gFab, FArrayBox& UFab, const Box& b)
10 void PatchPluto::computeRefGradient(FArrayBox& gFab, FArrayBox& UFab,
11  const FArrayBox& a_dV, const Box& b)
12 /*
13  *
14  * PURPOSE
15  *
16  * Tag cells for refinement by computing grad[k][j][i].
17  * By default a convex combination of the first and second
18  * derivative of the total energy density is used.
19  * alpha = 0 --> triggers refinement towards the 2nd derivative
20  * alpha = 1 --> triggers refinement towards the 1st derivative
21  *
22  *
23  *
24  *************************************************************************** */
25 {
26  CH_assert(m_isDefined);
27 
28  int nv, i, j, k;
29  int Uib, Uie, Ujb=0, Uje=0, Ukb=0, Uke=0;
30  int Gib, Gie, Gjb=0, Gje=0, Gkb=0, Gke=0;
31 
32  double rp, rm, r;
33  double x, dqx_p, dqx_m, d2qx, den_x;
34  double y, dqy_p, dqy_m, d2qy, den_y;
35  double z, dqz_p, dqz_m, d2qz, den_z;
36 
37  double alpha, qref, gr1, gr2;
38 
39  double eps = 0.01;
40  double ***UU[NVAR], ***q, ***grad;
41 
42  double us[NVAR], vs[NVAR], mu;
43  static double **T;
44 
45  rp = rm = r = 1.0;
46 
47 /* -----------------------------------------------
48  The solution array U is defined on the box
49  [Uib, Uie] x [Ujb, Uje] x [Ukb, Uke], which
50  differs from that of gFab ([Gib,...Gke]),
51  typically one point larger in each direction.
52  ----------------------------------------------- */
53 
54  D_EXPAND(Uib = UFab.loVect()[IDIR]; Uie = UFab.hiVect()[IDIR]; ,
55  Ujb = UFab.loVect()[JDIR]; Uje = UFab.hiVect()[JDIR]; ,
56  Ukb = UFab.loVect()[KDIR]; Uke = UFab.hiVect()[KDIR]; );
57 
58  D_EXPAND(Gib = gFab.loVect()[IDIR]; Gie = gFab.hiVect()[IDIR]; ,
59  Gjb = gFab.loVect()[JDIR]; Gje = gFab.hiVect()[JDIR]; ,
60  Gkb = gFab.loVect()[KDIR]; Gke = gFab.hiVect()[KDIR]; );
61 
62  for (nv=0 ; nv<NVAR ; nv ++){
63  UU[nv] = ArrayBoxMap(Ukb, Uke, Ujb, Uje, Uib, Uie, UFab.dataPtr(nv));
64  }
65  grad = ArrayBoxMap(Gkb, Gke, Gjb, Gje, Gib, Gie,gFab.dataPtr(0));
66 
67 /* -----------------------------------------------
68  the parameter alpha controls the bias towards
69  1st derivative criterion (alpha = 1) or 2nd
70  derivative (alpha = 0)
71  ----------------------------------------------- */
72 
73  alpha = 0.0;
74  #if (EOS != ISOTHERMAL) && (AMR_EN_SWITCH == NO)
75  q = UU[ENG];
76  #else
77  q = UU[RHO];
78  #endif
79 
80  for (k = Gkb; k <= Gke; k++) { z = k*m_dx + g_domBeg[KDIR];
81  for (j = Gjb; j <= Gje; j++) { y = j*m_dx + g_domBeg[JDIR];
82  for (i = Gib; i <= Gie; i++) { x = i*m_dx + g_domBeg[IDIR];
83 
84  #if GEOMETRY == CYLINDRICAL
85  rp = (i+0.5)/(i+1.5);
86  rm = (i+0.5)/(i-0.5);
87  #endif
88 
89  D_EXPAND(dqx_p = q[k][j][i+1]*rp - q[k][j][i];
90  dqx_m = -(q[k][j][i-1]*rm - q[k][j][i]); ,
91  dqy_p = q[k][j+1][i] - q[k][j][i];
92  dqy_m = -(q[k][j-1][i] - q[k][j][i]); ,
93  dqz_p = q[k+1][j][i] - q[k][j][i];
94  dqz_m = -(q[k-1][j][i] - q[k][j][i]);)
95 
96  /* --------------------------------------------------------------
97  Physical boundary values are not up to date and should be
98  excluded from gradient computation.
99  In this case, left and right derivatives are set equal to
100  each other. This will not trigger refinement in the leftmost
101  and rightmost internal zones (using 2nd derivative) but we
102  really don't care since buffer size will do the job.
103  -------------------------------------------------------------- */
104 
105  D_EXPAND(if (i == 0) dqx_m = dqx_p; ,
106  if (j == 0) dqy_m = dqy_p; ,
107  if (k == 0) dqz_m = dqz_p;)
108 
109  D_EXPAND(if (i == m_domain.size(IDIR)-1) dqx_p = dqx_m; ,
110  if (j == m_domain.size(JDIR)-1) dqy_p = dqy_m; ,
111  if (k == m_domain.size(KDIR)-1) dqz_p = dqz_m;)
112 
113  /* ---------------------------------------------------
114  New version
115  --------------------------------------------------- */
116 /*
117  D_EXPAND(d2qx = dqx_p - dqx_m; ,
118  d2qy = dqy_p - dqy_m; ,
119  d2qz = dqz_p - dqz_m;)
120 
121  D_EXPAND(
122  den_x = 2.0*fabs(q[k][j][i]) + fabs(q[k][j][i+1]) + fabs(q[k][j][i-1]);
123  den_x = fabs(dqx_p) + fabs(dqx_m) + eps*den_x; ,
124 
125  den_y = 2.0*fabs(q[k][j][i]) + fabs(q[k][j+1][i]) + fabs(q[k][j-1][i]);
126  den_y = fabs(dqy_p) + fabs(dqy_m) + eps*den_y; ,
127 
128  den_z = 2.0*fabs(q[k][j][i]) + fabs(q[k+1][j][i]) + fabs(q[k-1][j][i]);
129  den_z = fabs(dqz_p) + fabs(dqz_m) + eps*den_z;
130  )
131 
132  gr2 = D_EXPAND(d2qx*d2qx, + d2qy*d2qy, + d2qz*d2qz);
133  gr2 /= D_EXPAND(den_x*den_x, + den_y*den_y, + den_z*den_z);
134  grad[k][j][i] = sqrt(gr2);
135 
136  /* ---------------------------------------------------
137  Old version
138  --------------------------------------------------- */
139 
140  /* -- first derivative -- */
141 
142  eps = 0.05;
143  qref = fabs(q[k][j][i]);
144  gr1 = D_EXPAND( fabs(dqx_p + dqx_m)/qref ,
145  + fabs(dqy_p + dqy_m)/qref ,
146  + fabs(dqz_p + dqz_m)/qref);
147 
148  /* -- second derivative -- */
149 
150  gr2 = D_EXPAND( fabs(dqx_p - dqx_m)/(fabs(dqx_p) + fabs(dqx_m) + eps*qref) ,
151  + fabs(dqy_p - dqy_m)/(fabs(dqy_p) + fabs(dqy_m) + eps*qref) ,
152  + fabs(dqz_p - dqz_m)/(fabs(dqz_p) + fabs(dqz_m) + eps*qref));
153 
154  grad[k][j][i] = alpha*gr1 + (1.0 - alpha)*gr2;
155 
156  }}}
157 
158  for (nv=0 ; nv<NVAR ; nv ++){
159  FreeArrayBoxMap(UU[nv], Ukb, Uke, Ujb, Uje, Uib, Uie);
160  }
161  FreeArrayBoxMap(grad, Gkb, Gke, Gjb, Gje, Gib, Gie);
162 }
163 
static double alpha
Definition: init.c:3
tuple T
Definition: Sph_disk.py:33
#define RHO
Definition: mod_defs.h:19
#define KDIR
Definition: pluto.h:195
#define eps
#define IDIR
Definition: pluto.h:193
int j
Definition: analysis.c:2
if(divB==NULL)
Definition: analysis.c:10
int k
Definition: analysis.c:2
double g_domBeg[3]
Lower limits of the computational domain.
Definition: globals.h:125
double * x
Definition: structs.h:80
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;)
Definition: analysis.c:27
int i
Definition: analysis.c:2
double *** ArrayBoxMap(int nrl, int nrh, int ncl, int nch, int ndl, int ndh, double *uptr)
Definition: arrays.c:537
void FreeArrayBoxMap(double ***t, int nrl, int nrh, int ncl, int nch, int ndl, int ndh)
Definition: arrays.c:586
#define JDIR
Definition: pluto.h:194
#define NVAR
Definition: pluto.h:609
static Runtime q