ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_MaterialProperties.H
Go to the documentation of this file.
1 #ifndef MATERIALPROPERTIES_H
2 #define MATERIALPROPERTIES_H
3 
4 #include <AMReX_Enum.H>
5 #include <AMReX_REAL.H>
6 #include <AMReX_Gpu.H>
7 #include <AMReX_MultiFab.H>
8 #include "ERF_Constants.H"
9 
10 /*! Materials */
11 namespace Species
12 {
13  AMREX_ENUM(Name,
14  H2O,
15  NaCl,
16  NH42SO4,
17  NH4HSO4,
18  soil,
19  water, // same as H2O, to test multispecies SDM
20  agua, // same as H2O, to test multispecies SDM
21  none
22  );
23 }
24 
25 /*! Functions for computing saturation pressure and vapour fraction */
26 namespace saturation_funcs
27 {
28  /*! \brief Null function for saturation pressure */
29  AMREX_GPU_HOST
30  void compute_saturation_pressure_null ( amrex::MultiFab&, const amrex::MultiFab& );
31  /*! \brief Compute saturation pressure for moist air */
32  AMREX_GPU_HOST
33  void compute_saturation_pressure_H2O ( amrex::MultiFab&, const amrex::MultiFab& );
34 
35  /*! \brief Null function for saturation vapour fraction */
36  AMREX_GPU_HOST
37  void compute_saturation_vapfrac_null ( amrex::MultiFab&,
38  const amrex::MultiFab&,
39  const amrex::MultiFab& );
40  /*! \brief Compute saturation vapour fraction for moist air */
41  AMREX_GPU_HOST
42  void compute_saturation_vapfrac_H2O ( amrex::MultiFab&,
43  const amrex::MultiFab&,
44  const amrex::MultiFab& );
45 }
46 
47 struct MaterialPropertiesCore { // For GPU
48 
49  static constexpr amrex::Real s_N_av = 6.02214076e23; /*!< Avogadro's number */
50  static constexpr amrex::Real s_kb = 1.380649e-23; /*!< Boltzmann constant [J K^{-1}] */
51 
52  /*! Molecular weight of air [kg mol^{-1}] */
53  static constexpr amrex::Real s_mol_weight_air = 0.0289647;
54  /*! Molecular length scale of air [m] */
55  static constexpr amrex::Real s_sigma_air = 3.62e-10;
56  /*! Temperature parameter for air [K] */
57  static constexpr amrex::Real s_eps_air_k = 97;
58 
59  amrex::Real m_density = DBL_MAX; /*!< density */
60  amrex::Real m_ionization = DBL_MAX; /*!< ionization */
61  amrex::Real m_mol_weight = DBL_MAX; /*!< molecular weight (condensate) */
62  amrex::Real m_lat_vap = DBL_MAX; /*!< latent heat of vaporization */
63  amrex::Real m_Rv = DBL_MAX; /*!< gas constant for vapour of this material */
64  amrex::Real m_Tc = DBL_MAX; /*!< critical temperature for surface tension */
65  amrex::Real m_Tb = DBL_MAX; /*!< boiling temperature */
66  amrex::Real m_Nav_by_molweight = DBL_MAX; /*!< Avogadro number by vapour mol. weight */
67  /*! vector of molar heat capacity polynomial coeffs */
69  amrex::Real(DBL_MAX),
70  amrex::Real(DBL_MAX),
71  amrex::Real(DBL_MAX),
72  amrex::Real(DBL_MAX),
73  amrex::Real(DBL_MAX),
74  amrex::Real(DBL_MAX) };
75  bool m_is_soluble = false; /*!< is soluble in water? */
76  bool m_is_water = false; /*!< is this water? */
77 
78  /*! \brief Return the molar heat capacity */
79  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
81  {
82  auto retval = 0.0;
83  auto term = 1.0;
84  for (auto i = 0; i < 7; i++) {
85  retval += (m_mol_Cp_coeffs[i] * term);
86  term *= a_T;
87  }
88  return retval;
89  }
90 
91  /*! \brief Compute the surface tension coeff given temperature */
92  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
94  {
95  if (m_is_water) {
96  return amrex::Real(0.076148325); // N m^{-1}
97  } else {
98  auto term1 = 6.0 * std::cbrt(s_N_av);
99  auto term2 = std::cbrt((m_density/m_mol_weight)*(m_density/m_mol_weight));
100  auto retval = molarHeatCapacity(a_T)*(term2/term1)*(m_Tc - a_T);
101  return retval;
102  }
103  }
104 
105  /*! \brief Return the coeff of curvature given the temperature */
106  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
107  amrex::Real coeffCurv( const amrex::Real a_T ) const
108  {
109  auto surf_tens = surfaceTension(a_T);
110  auto retval = 2 * surf_tens / (m_Rv * m_density);
111  return retval;
112  }
113 
114  /*! \brief Return the vapour pressure coefficient */
115  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
117  {
118  auto retval = (0.75/PI)*(m_mol_weight/m_density);
119  if (m_is_water) {
120  retval = 4.3e-06;
121  }
122  return retval;
123  }
124 
125  /*! \brief Return the molecular diffusion coefficient given temperature and pressure */
126  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
128  {
129  if (m_is_water) {
130 
131  return diffelq; // from ERF_Constants.H (2.21e-05 [m^2 s^{-1}])
132 
133  } else {
134 
135  auto mol_weight_v = s_N_av/m_Nav_by_molweight;
136  auto sigma = 1.18e-8 * std::cbrt(mol_weight_v/m_density);
137  auto sigma_v_air = 0.5 * (sigma + s_sigma_air);
138 
139  auto eps_v = 1.15 * m_Tb * s_kb;
140  auto eps_v_air = std::sqrt( eps_v * s_eps_air_k * s_kb);
141  auto T_star = a_T / (eps_v_air/s_kb);
142 
143  auto omegaD = 1.06036 / std::pow(T_star, 0.1561)
144  + 0.193 / std::exp(0.47635*T_star)
145  + 1.03587 / std::exp(1.52996*T_star)
146  + 1.76474 / std::exp(3.89411*T_star);
147 
148  auto term1 = 3 * std::sqrt( s_kb*a_T * s_kb*a_T * s_kb*a_T);
149  auto term2 = 8.0 * std::sqrt(2*PI) * a_P * sigma_v_air*sigma_v_air * omegaD;
150  auto term3 = std::sqrt( m_Nav_by_molweight + s_N_av/s_mol_weight_air );
151 
152  auto retval = term1*term3/term2;
153  return retval;
154  }
155  }
156 
157 };
158 
159 /*! Class for material properties */
161 
162  Species::Name m_name = Species::Name::none; /*!< name */
163 
164  /*! pointer to function to compute saturation pressure */
166  /*! pointer to function to compute vapour fraction */
168 
169  /*! \brief Constructor */
170  AMREX_GPU_HOST_DEVICE
171  MaterialProperties ( const Species::Name& a_name );
172 
173  /*! \brief Copy constructor */
174  AMREX_GPU_HOST_DEVICE
175  MaterialProperties ( const MaterialProperties& a_matprop );
176 
177  /*! \brief Default destructor */
178  AMREX_GPU_HOST_DEVICE
179  ~MaterialProperties () = default;
180 
181  /*! \brief Print parameters */
182  AMREX_GPU_HOST
183  void print() const {
184  amrex::Print() << "Material properties of " << amrex::getEnumNameString(m_name) << ":\n";
185  amrex::Print() << " density: " << m_density << "\n";
186  amrex::Print() << " ionization: " << m_ionization << "\n";
187  amrex::Print() << " mol. weight: " << m_mol_weight << "\n";
188  amrex::Print() << " latent heat (vap.): " << m_lat_vap << "\n";
189  amrex::Print() << " Rv: " << m_Rv << "\n";
190  amrex::Print() << " Tc: " << m_Tc << "\n";
191  amrex::Print() << " Tb: " << m_Tb << "\n";
192  amrex::Print() << " N_av/mol.weight: " << m_Nav_by_molweight << "\n";
193  amrex::Print() << " mol. Cp coeffs: ";
194  for (int i = 0; i < 7; i++) { amrex::Print() << m_mol_Cp_coeffs[i] << ", "; }
195  amrex::Print() << "\n";
196  }
197 
198  /*! \brief Set this material to H20 */
199  AMREX_GPU_HOST_DEVICE
200  void setProperties_H2O();
201  /*! \brief Set this material to water */
202  AMREX_GPU_HOST_DEVICE
203  void setProperties_water();
204  /*! \brief Set this material to agua */
205  AMREX_GPU_HOST_DEVICE
206  void setProperties_agua();
207  /*! \brief Set this material to NaCl */
208  AMREX_GPU_HOST_DEVICE
209  void setProperties_NaCl();
210  /*! \brief Set this material to ammonium sulfate */
211  AMREX_GPU_HOST_DEVICE
212  void setProperties_NH42SO4();
213  /*! \brief Set this material to ammonium bisulfate */
214  AMREX_GPU_HOST_DEVICE
215  void setProperties_NH4HSO4();
216  /*! \brief Set this material to soil */
217  AMREX_GPU_HOST_DEVICE
218  void setProperties_soil();
219 
220  /*! \brief Compute saturation pressure */
221  AMREX_GPU_HOST AMREX_FORCE_INLINE
222  void computeSaturationPressure ( amrex::MultiFab& a_e, const amrex::MultiFab& a_T) const
223  {
224  m_saturation_pressure_func(a_e, a_T);
225  }
226 
227  /*! \brief Compute saturation vapour fraction */
228  AMREX_GPU_HOST AMREX_FORCE_INLINE
229  void computeSaturationVapFrac ( amrex::MultiFab& a_S,
230  const amrex::MultiFab& a_T,
231  const amrex::MultiFab& a_p ) const
232  {
233  m_saturation_vapfrac_func(a_S, a_T, a_p);
234  }
235 };
236 
237 #endif
constexpr amrex::Real diffelq
Definition: ERF_Constants.H:73
constexpr amrex::Real PI
Definition: ERF_Constants.H:6
amrex::Real sigma
Definition: ERF_InitCustomPert_IsentropicVortex.H:11
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_MaterialProperties.H:12
AMREX_ENUM(Name, H2O, NaCl, NH42SO4, NH4HSO4, soil, water, agua, none)
Definition: ERF_MaterialProperties.cpp:7
AMREX_GPU_HOST void compute_saturation_pressure_null(MultiFab &, const MultiFab &)
Definition: ERF_MaterialProperties.cpp:9
AMREX_GPU_HOST void compute_saturation_vapfrac_H2O(MultiFab &a_mf_sat_vapfrac, const MultiFab &a_mf_temperature, const MultiFab &a_mf_pressure)
Definition: ERF_MaterialProperties.cpp:32
AMREX_GPU_HOST void compute_saturation_vapfrac_null(MultiFab &, const MultiFab &)
Definition: ERF_MaterialProperties.cpp:29
AMREX_GPU_HOST void compute_saturation_pressure_H2O(MultiFab &a_mf_sat_pressure, const MultiFab &a_mf_temperature)
Definition: ERF_MaterialProperties.cpp:12
Definition: ERF_MaterialProperties.H:47
amrex::Real m_mol_weight
Definition: ERF_MaterialProperties.H:61
bool m_is_water
Definition: ERF_MaterialProperties.H:76
static constexpr amrex::Real s_sigma_air
Definition: ERF_MaterialProperties.H:55
amrex::Real m_mol_Cp_coeffs[7]
Definition: ERF_MaterialProperties.H:68
static constexpr amrex::Real s_mol_weight_air
Definition: ERF_MaterialProperties.H:53
static constexpr amrex::Real s_kb
Definition: ERF_MaterialProperties.H:50
amrex::Real m_Rv
Definition: ERF_MaterialProperties.H:63
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real molarHeatCapacity(const amrex::Real a_T) const
Return the molar heat capacity.
Definition: ERF_MaterialProperties.H:80
static constexpr amrex::Real s_eps_air_k
Definition: ERF_MaterialProperties.H:57
amrex::Real m_Nav_by_molweight
Definition: ERF_MaterialProperties.H:66
amrex::Real m_ionization
Definition: ERF_MaterialProperties.H:60
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real coeffCurv(const amrex::Real a_T) const
Return the coeff of curvature given the temperature.
Definition: ERF_MaterialProperties.H:107
amrex::Real m_Tb
Definition: ERF_MaterialProperties.H:65
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real coeffMolecularDiffusion(const amrex::Real a_T, const amrex::Real a_P) const
Return the molecular diffusion coefficient given temperature and pressure.
Definition: ERF_MaterialProperties.H:127
amrex::Real m_density
Definition: ERF_MaterialProperties.H:59
bool m_is_soluble
Definition: ERF_MaterialProperties.H:75
static constexpr amrex::Real s_N_av
Definition: ERF_MaterialProperties.H:49
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real coeffVPSolute() const
Return the vapour pressure coefficient.
Definition: ERF_MaterialProperties.H:116
amrex::Real m_lat_vap
Definition: ERF_MaterialProperties.H:62
amrex::Real m_Tc
Definition: ERF_MaterialProperties.H:64
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real surfaceTension(const amrex::Real a_T) const
Compute the surface tension coeff given temperature.
Definition: ERF_MaterialProperties.H:93
Definition: ERF_MaterialProperties.H:160
AMREX_GPU_HOST_DEVICE ~MaterialProperties()=default
Default destructor.
AMREX_GPU_HOST_DEVICE void setProperties_water()
Set this material to water.
Definition: ERF_MaterialProperties.cpp:122
AMREX_GPU_HOST AMREX_FORCE_INLINE void computeSaturationVapFrac(amrex::MultiFab &a_S, const amrex::MultiFab &a_T, const amrex::MultiFab &a_p) const
Compute saturation vapour fraction.
Definition: ERF_MaterialProperties.H:229
decltype(saturation_funcs::compute_saturation_pressure_null) * m_saturation_pressure_func
Definition: ERF_MaterialProperties.H:165
AMREX_GPU_HOST AMREX_FORCE_INLINE void computeSaturationPressure(amrex::MultiFab &a_e, const amrex::MultiFab &a_T) const
Compute saturation pressure.
Definition: ERF_MaterialProperties.H:222
AMREX_GPU_HOST_DEVICE void setProperties_NH4HSO4()
Set this material to ammonium bisulfate.
Definition: ERF_MaterialProperties.cpp:158
AMREX_GPU_HOST_DEVICE void setProperties_soil()
Set this material to soil.
Definition: ERF_MaterialProperties.cpp:170
AMREX_GPU_HOST_DEVICE void setProperties_NH42SO4()
Set this material to ammonium sulfate.
Definition: ERF_MaterialProperties.cpp:146
AMREX_GPU_HOST_DEVICE MaterialProperties(const Species::Name &a_name)
Constructor.
Definition: ERF_MaterialProperties.cpp:56
AMREX_GPU_HOST void print() const
Print parameters.
Definition: ERF_MaterialProperties.H:183
AMREX_GPU_HOST_DEVICE void setProperties_NaCl()
Set this material to NaCl.
Definition: ERF_MaterialProperties.cpp:134
AMREX_GPU_HOST_DEVICE void setProperties_H2O()
Set this material to H20.
Definition: ERF_MaterialProperties.cpp:102
AMREX_GPU_HOST_DEVICE void setProperties_agua()
Set this material to agua.
Definition: ERF_MaterialProperties.cpp:128
Species::Name m_name
Definition: ERF_MaterialProperties.H:162
decltype(saturation_funcs::compute_saturation_vapfrac_null) * m_saturation_vapfrac_func
Definition: ERF_MaterialProperties.H:167