ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SurfaceTemperature.H
Go to the documentation of this file.
1 #ifndef ERF_SURFACE_TEMPERATURE_H_
2 #define ERF_SURFACE_TEMPERATURE_H_
3 
4 #include <AMReX_Math.H>
5 
6 #include <ERF_Constants.H>
7 #include <ERF_EOS.H>
8 
10 
11 /**
12  * Pressure at a boundary face from the adjacent atmospheric cell state.
13  *
14  * The state pressure is diagnosed at the cell centre. Adding rho*g*delta_z
15  * gives the pressure at the boundary face, where delta_z is the signed
16  * distance from the face to the cell centre.
17  */
18 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
21  const amrex::Real rho_theta,
22  const amrex::Real qv,
23  const amrex::Real delta_z)
24 {
25  return getPgivenRTh(rho_theta, qv) + rho * CONST_GRAV * delta_z;
26 }
27 
28 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
31  const amrex::Real rho_theta,
32  const amrex::Real qv,
33  const amrex::Real delta_z)
34 {
35  return pressure_at_boundary_from_cell(rho, rho_theta, qv, delta_z);
36 }
37 
38 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
39 bool
40 valid_pressure (const amrex::Real pressure)
41 {
42  return amrex::Math::isfinite(pressure) && pressure > amrex::Real(0.0);
43 }
44 
45 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
46 bool
47 valid_temperature (const amrex::Real temperature)
48 {
49  return amrex::Math::isfinite(temperature) && temperature > amrex::Real(0.0);
50 }
51 
52 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
53 bool
55  const amrex::Real pressure,
56  const amrex::Real rdOcp,
57  amrex::Real& temperature)
58 {
59  if (!valid_pressure(pressure) || !valid_temperature(theta) ||
60  !amrex::Math::isfinite(rdOcp) || rdOcp <= amrex::Real(0.0)) {
61  return false;
62  }
63  const amrex::Real result = getTgivenPandTh(pressure, theta, rdOcp);
64  if (!valid_temperature(result)) {
65  return false;
66  }
67  temperature = result;
68  return true;
69 }
70 
71 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
72 bool
73 temperature_to_theta (const amrex::Real temperature,
74  const amrex::Real pressure,
75  const amrex::Real rdOcp,
77 {
78  if (!valid_pressure(pressure) || !valid_temperature(temperature) ||
79  !amrex::Math::isfinite(rdOcp) || rdOcp <= amrex::Real(0.0)) {
80  return false;
81  }
82  const amrex::Real result = getThgivenTandP(temperature, pressure, rdOcp);
83  if (!valid_temperature(result)) {
84  return false;
85  }
86  theta = result;
87  return true;
88 }
89 
90 } // namespace erf_surface_temperature
91 
92 #endif
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:56
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getThgivenTandP(const amrex::Real T, const amrex::Real P, const amrex::Real rdOcp)
Definition: ERF_EOS.H:18
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenPandTh(const amrex::Real P, const amrex::Real th, const amrex::Real rdOcp)
Definition: ERF_EOS.H:32
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ theta
Definition: ERF_SLM.H:19
@ rho
Definition: ERF_Kessler.H:25
@ qv
Definition: ERF_Kessler.H:31
Definition: ERF_SurfaceTemperature.H:9
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pressure_at_surface(const amrex::Real rho, const amrex::Real rho_theta, const amrex::Real qv, const amrex::Real delta_z)
Definition: ERF_SurfaceTemperature.H:30
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool temperature_to_theta(const amrex::Real temperature, const amrex::Real pressure, const amrex::Real rdOcp, amrex::Real &theta)
Definition: ERF_SurfaceTemperature.H:73
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pressure_at_boundary_from_cell(const amrex::Real rho, const amrex::Real rho_theta, const amrex::Real qv, const amrex::Real delta_z)
Definition: ERF_SurfaceTemperature.H:20
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool valid_pressure(const amrex::Real pressure)
Definition: ERF_SurfaceTemperature.H:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool theta_to_temperature(const amrex::Real theta, const amrex::Real pressure, const amrex::Real rdOcp, amrex::Real &temperature)
Definition: ERF_SurfaceTemperature.H:54
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool valid_temperature(const amrex::Real temperature)
Definition: ERF_SurfaceTemperature.H:47