PLUTO  4.4-patch2
plm_coeffs.h
Go to the documentation of this file.
1 /* ///////////////////////////////////////////////////////////////////// */
21 /* ///////////////////////////////////////////////////////////////////// */
22 
23 #ifndef UNIFORM_CARTESIAN_GRID
24  #if GEOMETRY == CARTESIAN
25  #define UNIFORM_CARTESIAN_GRID YES
26  #else
27  #define UNIFORM_CARTESIAN_GRID NO
28  #endif
29 #endif
30 
31 #define CHECK_MONOTONICITY NO
32 
33 /* ********************************************************************* */
38 typedef struct PLM_COEFFS{
39  double *cp;
40  double *cm;
41  double *wp;
42  double *wm;
43  double *dp;
44  double *dm;
45 } PLM_Coeffs;
46 
47 void PLM_CoefficientsSet(Grid *grid);
49 
50 /* ---------------------------------------------------------------------
51  Set macro for limiter functions
52  --------------------------------------------------------------------- */
53 
72 #define SET_FL_LIMITER(dv, dvp, dvm, cp, cm) \
73  dv = 0.0
74 
76 #define SET_MM_LIMITER(dv, dvp, dvm, cp, cm) \
77  dv = ( (dvp)*(dvm) > 0.0 ? ABS_MIN((dvp), (dvm)): 0.0)
78 
80 #define SET_VA_LIMITER(dv, dvp, dvm, cp, cm)\
81  if ((dvp)*(dvm) > 0.0) { \
82  double _dpp= (dvp)*(dvp), _dmm = (dvm)*(dvm); \
83  dv = ( (dvp)*(_dmm + 1.e-18) + (dvm)*(_dpp + 1.e-18))/(_dpp + _dmm + 1.e-18); \
84  }else dv = 0.0;
85 
87 #define SET_UM_LIMITER(dv, dvp, dvm, cp, cm)\
88  if ( (dvp)*(dvm) > 0.0){ \
89  double _ddp = 0.25*( (dvp) + 3.0*(dvm)), _ddm = 0.25*((dvm) + 3.0*(dvp)); \
90  double _d2 = 2.0*ABS_MIN( (dvp), (dvm) );\
91  _d2 = ABS_MIN(_d2, _ddp);\
92  dv = ABS_MIN(_d2, _ddm);\
93  }else dv = 0.0;
94 
96 #define SET_GM_LIMITER(dv, dvp, dvm, cp, cm) \
97  if (dvp*dvm > 0.0) { \
98  double _qc = 0.5*(dvm + dvp), _scrh = ABS_MIN((dvp)*(cp), (dvm)*(cm)); \
99  dv = ABS_MIN(_qc, _scrh); \
100  }else dv = 0.0;
101 
102 /* -------------------------------------------------------------
103  Limiters on uniform Cartesian grid
104  ------------------------------------------------------------- */
105 
106 #if UNIFORM_CARTESIAN_GRID == YES
107 
109  #define SET_OS_LIMITER(dv, dvp, dvm, cp, cm)\
110  dv = ( (dvp)*(dvm) > 0.0? \
111  dv = 1.5*(dvp)*(dvm)*((dvm) + (dvp))/((dvp)*(dvp) + (dvm)*(dvm) + (dvp)*(dvm)): 0.0);
112 
114  #define SET_VL_LIMITER(dv, dvp, dvm, cp, cm)\
115  dv = ( (dvp)*(dvm) > 0.0 ? 2.0*(dvp)*(dvm)/((dvp) + (dvm)) :0.0)
116 
119  #define SET_MC_LIMITER(dv, dvp, dvm, cp, cm) \
120  if ( (dvp)*(dvm) > 0.0) { \
121  double _qc = 0.5*( (dvm) + (dvp) ), _scrh = 2.0*ABS_MIN( (dvp), (dvm) ); \
122  dv = ABS_MIN(_qc, _scrh); \
123  }else dv = 0.0;
124 
125 /* -------------------------------------------------------------
126  Limiters on irregular or non-Cartesian grids
127  ------------------------------------------------------------- */
128 
129 #else
130 
132  #define SET_OS_LIMITER(dv, dvp, dvm, cp, cm)\
133  if (dvp*dvm > 0.0){ \
134  double _den = 2.0*(dvp)*(dvp) + 2.0*(dvm)*(dvm) + (cp + cm - 2.0)*(dvp)*(dvm);\
135  dv = dvp*dvm*((1.0+cp)*(dvm) + (1.0+cm)*(dvp))/_den; \
136  }else dv = 0.0;
137 
138 /* -- van Leer limiter (general grid) -- */
139 
140  #define SET_VL_LIMITER(dv, dvp, dvm, cp, cm)\
141  dv = (dvp*dvm > 0.0 ? (dvp)*(dvm)*(cp*(dvm) + cm*(dvp)) \
142  /((dvp)*(dvp) + (dvm)*(dvm) + (cp + cm - 2.0)*(dvp)*(dvm)) :0.0)
143 
144 /* -- monotonized central (general grid) -- */
145 
146  #define SET_MC_LIMITER(dv, dvp, dvm, cp, cm) \
147  if (dvp*dvm > 0.0) { \
148  double _qc = 0.5*((dvm) + (dvp)), _scrh = ABS_MIN((dvp)*cp, (dvm)*cm); \
149  dv = ABS_MIN(_qc, _scrh); \
150  }else dv = 0.0;
151 
152 #endif
153 
154 /* -------------------------------------------------------------------
155  when a single limiter is specified, use SET_LIMITER as
156  a shortcut to the actual limiter macro
157  ------------------------------------------------------------------- */
158 
159 #ifdef LIMITER /* May not be defined when using finite difference schemes */
160  #if LIMITER == FLAT_LIM
161  #define SET_LIMITER SET_FL_LIMITER
162  #elif LIMITER == MINMOD_LIM
163  #define SET_LIMITER SET_MM_LIMITER
164  #elif LIMITER == VANALBADA_LIM
165  #define SET_LIMITER SET_VA_LIMITER
166  #elif LIMITER == OSPRE_LIM
167  #define SET_LIMITER SET_OS_LIMITER
168  #elif LIMITER == UMIST_LIM
169  #define SET_LIMITER SET_UM_LIMITER
170  #elif LIMITER == VANLEER_LIM
171  #define SET_LIMITER SET_VL_LIMITER
172  #elif LIMITER == MC_LIM
173  #define SET_LIMITER SET_MC_LIMITER
174  #endif
175 #endif
176 
177 
178 #ifndef SET_LIMITER
179  #define SET_LIMITER SET_VL_LIMITER
180 #endif
void PLM_CoefficientsGet(PLM_Coeffs *, int)
Definition: plm_coeffs.c:82
Definition: structs.h:124
Definition: plm_coeffs.h:38
void PLM_CoefficientsSet(Grid *grid)
Definition: plm_coeffs.c:30