ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_NOAHMP_ResultPolicy.H
Go to the documentation of this file.
1 #ifndef ERF_NOAHMP_RESULT_POLICY_H_
2 #define ERF_NOAHMP_RESULT_POLICY_H_
3 
4 #include <cmath>
5 
6 #include <AMReX_GpuQualifiers.H>
7 #include <AMReX_Math.H>
8 #include <AMReX_REAL.H>
9 
10 #include "ERF_Constants.H"
11 #include "ERF_NOAHMP_Fields.H"
12 
14 {
15 
17 {
22 };
23 
24 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
25 bool result_is_valid (amrex::Real value) noexcept
26 {
27  // Noah-MP uses approximately -9999 for unprocessed cells. ERF also
28  // rejects nonfinite values before storing provider data.
29  return amrex::Math::isfinite(value) && value > amrex::Real(-9990.0) &&
30  value < amrex::Real(0.5) * lsm_undefined;
31 }
32 
33 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
34 bool result_is_valid_for_output (amrex::Real value, int output_comp) noexcept
35 {
36  if (!result_is_valid(value)) {
37  return false;
38  }
39  if (output_comp == NoahmpOutputComp::o_noahmp_q2m_veg ||
40  output_comp == NoahmpOutputComp::o_noahmp_q2m_bare) {
41  return value >= amrex::Real(0.0);
42  }
43  if (output_comp == NoahmpOutputComp::o_noahmp_fveg) {
44  return value >= amrex::Real(0.0) && value <= amrex::Real(1.0);
45  }
46  return true;
47 }
48 
49 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
50 amrex::Real select_result (bool cell_processed,
51  amrex::Real value,
52  amrex::Real undefined_value,
53  int output_comp) noexcept
54 {
55  return cell_processed && result_is_valid_for_output(value, output_comp)
56  ? value : undefined_value;
57 }
58 
59 struct CellPolicy
60 {
62  bool processed;
63 
64  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
65  explicit CellPolicy (amrex::Real hfx_value) noexcept
66  : hfx(hfx_value), processed(result_is_valid(hfx_value)) {}
67 
68  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
70  amrex::Real undefined_value,
71  int output_comp) const noexcept
72  {
73  return select_result(processed, value, undefined_value, output_comp);
74  }
75 
76  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
78  amrex::Real tau_ew_value,
79  amrex::Real tau_ns_value,
80  amrex::Real density,
81  amrex::Real cp_d,
82  amrex::Real latent_heat,
83  amrex::Real undefined_value) const noexcept
84  {
85  if (!processed) {
86  return {undefined_value, undefined_value, undefined_value, undefined_value};
87  }
88  return {hfx / (density * cp_d),
89  latent_heat_flux / (density * latent_heat),
90  tau_ew_value / density,
91  tau_ns_value / density};
92  }
93 };
94 
95 } // namespace noahmp_result_policy
96 
97 #endif
constexpr amrex::Real lsm_undefined
Definition: ERF_Constants.H:26
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NOAHMP_ResultPolicy.H:14
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real select_result(bool cell_processed, amrex::Real value, amrex::Real undefined_value, int output_comp) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool result_is_valid_for_output(amrex::Real value, int output_comp) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:34
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool result_is_valid(amrex::Real value) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:25
Definition: ERF_NOAHMP_ResultPolicy.H:60
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real select(amrex::Real value, amrex::Real undefined_value, int output_comp) const noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:69
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CellPolicy(amrex::Real hfx_value) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:65
amrex::Real hfx
Definition: ERF_NOAHMP_ResultPolicy.H:61
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE FluxSelection select_fluxes(amrex::Real latent_heat_flux, amrex::Real tau_ew_value, amrex::Real tau_ns_value, amrex::Real density, amrex::Real cp_d, amrex::Real latent_heat, amrex::Real undefined_value) const noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:77
bool processed
Definition: ERF_NOAHMP_ResultPolicy.H:62
Definition: ERF_NOAHMP_ResultPolicy.H:17
amrex::Real tau_ew
Definition: ERF_NOAHMP_ResultPolicy.H:20
amrex::Real tau_ns
Definition: ERF_NOAHMP_ResultPolicy.H:21
amrex::Real mixing_ratio
Definition: ERF_NOAHMP_ResultPolicy.H:19
amrex::Real temperature
Definition: ERF_NOAHMP_ResultPolicy.H:18