PLUTO
plm_coeffs.h
Go to the documentation of this file.
1 /* ///////////////////////////////////////////////////////////////////// */
2 /*!
3  \file
4  \brief Reconstruction coefficients header file
5 
6  Define some useful macros for the computation of slope limiters
7  in the piecewise linear method.
8 
9  The macro ::UNIFORM_CARTESIAN_GRID can be set to YES to
10  enable faster computation when the grid is uniform and Cartesian.
11  In the general case (non-uniform and/or non-Cartesian), set it to NO.
12 
13  \authors A. Mignone (mignone@ph.unito.it)
14  \date May 19, 2014
15 
16  \b References
17  - "High-order conservative reconstruction schemes for finite
18  volume methods in cylindrical and spherical coordinates"
19  A. Mignone, JCP (2014), 270, 784.
20 */
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 /* ********************************************************************* */
34 /*! Simple structure used to retrieve 1D reconstruction weights
35  (c, w, d) used by piecewise linear interpolation (see states_plm.c)
36  ********************************************************************* */
37 
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 
54 /*! \name Limiter macros.
55  The following macros define a few limiter functions that can be
56  used for piecewise linear reconstruction.
57  Each limiter has the form \c SET_XX_LIMITER(dv, dvp, dvm, cp, cm)
58  where \c dvp and \c dvm are the geometrically weighted forward and
59  backward slopes (\f$\Delta Q^{F}\f$ and \f$\Delta Q^{B}\f$ in Eq. [29]),
60  \c cp and \c cm are weight coefficients depending on the distance
61  between the cell interfaces and the centroid of volume (Eq. [33] in
62  the reference paper).
63  The limited slope (used in Eq. [30]) is returned in \c dv.
64 
65  Usually \c cp and \c cm are used only for a few limiters and
66  when the grid is either non-uniform or the geometry is not Cartesian.
67  For this reason, the OSPRE (OS), van Leer (VL) and monotonized central
68  (MC) are
69 */
70 
71 /*! Set flat (zero slope) reconstruction (also non-uniform). */
72 #define SET_FL_LIMITER(dv, dvp, dvm, cp, cm) \
73  dv = 0.0
74 
75 /*! Set Minmod limiter. */
76 #define SET_MM_LIMITER(dv, dvp, dvm, cp, cm) \
77  dv = (dvp*dvm > 0.0 ? ABS_MIN(dvp, dvm): 0.0)
78 
79 /*! Van Albada limiter */
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 
86 /*! Umist limiter */
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 
95 /*! Generalised minmod limiter */
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 
108 /*! OSPRE limiter (uniform Cart. grid) */
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 
113 /*! Van Leer limiter (uniform Cartesian grid) */
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 
117 /*! Monotonized central limiter (uniform cart. grid).
118  Here \c cp and \c cm are useless. */
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 
131 /*! OSPRE limiter (general grid case) */
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 
void PLM_CoefficientsGet(PLM_Coeffs *, int)
Definition: plm_coeffs.c:79
double * cm
Definition: plm_coeffs.h:40
Definition: structs.h:78
void PLM_CoefficientsSet(Grid *grid)
Definition: plm_coeffs.c:30
double * cp
Definition: plm_coeffs.h:39
double * dm
Definition: plm_coeffs.h:44
double * dp
Definition: plm_coeffs.h:43
double * wm
Definition: plm_coeffs.h:42
double * wp
Definition: plm_coeffs.h:41
struct PLM_COEFFS PLM_Coeffs