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_REAL.H>
8 
9 #include "ERF_Constants.H"
10 #include "ERF_NOAHMP_Fields.H"
11 
13 {
14 
16 {
21 };
22 
23 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
25 {
26  // Noah-MP uses approximately -9999 for unprocessed cells. ERF also
27  // rejects nonfinite values before storing provider data.
28  return std::isfinite(value) && value > amrex::Real(-9990.0) &&
30 }
31 
32 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
33 bool result_is_valid_for_output (amrex::Real value, int output_comp) noexcept
34 {
35  if (!result_is_valid(value)) {
36  return false;
37  }
38  if (output_comp == NoahmpOutputComp::o_noahmp_q2m_veg ||
39  output_comp == NoahmpOutputComp::o_noahmp_q2m_bare) {
40  return value >= amrex::Real(0.0);
41  }
42  if (output_comp == NoahmpOutputComp::o_noahmp_fveg) {
43  return value >= amrex::Real(0.0) && value <= amrex::Real(1.0);
44  }
45  return true;
46 }
47 
48 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
49 amrex::Real select_result (bool cell_processed,
51  amrex::Real undefined_value,
52  int output_comp) noexcept
53 {
54  return cell_processed && result_is_valid_for_output(value, output_comp)
55  ? value : undefined_value;
56 }
57 
58 struct CellPolicy
59 {
61  bool processed;
62 
63  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
64  explicit CellPolicy (amrex::Real hfx_value) noexcept
65  : hfx(hfx_value), processed(result_is_valid(hfx_value)) {}
66 
67  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
69  amrex::Real undefined_value,
70  int output_comp) const noexcept
71  {
72  return select_result(processed, value, undefined_value, output_comp);
73  }
74 
75  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
77  amrex::Real tau_ew_value,
78  amrex::Real tau_ns_value,
79  amrex::Real density,
80  amrex::Real cp_d,
81  amrex::Real latent_heat,
82  amrex::Real undefined_value) const noexcept
83  {
84  if (!processed) {
85  return {undefined_value, undefined_value, undefined_value, undefined_value};
86  }
87  return {hfx / (density * cp_d),
88  latent_heat_flux / (density * latent_heat),
89  tau_ew_value / density,
90  tau_ns_value / density};
91  }
92 };
93 
94 } // namespace noahmp_result_policy
95 
96 #endif
constexpr amrex::Real lsm_undefined
Definition: ERF_Constants.H:35
Real value
Definition: ERF_HurricaneDiagnostics.cpp:30
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NOAHMP_ResultPolicy.H:13
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:49
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:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool result_is_valid(amrex::Real value) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:24
Definition: ERF_NOAHMP_ResultPolicy.H:59
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:68
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CellPolicy(amrex::Real hfx_value) noexcept
Definition: ERF_NOAHMP_ResultPolicy.H:64
amrex::Real hfx
Definition: ERF_NOAHMP_ResultPolicy.H:60
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:76
bool processed
Definition: ERF_NOAHMP_ResultPolicy.H:61
Definition: ERF_NOAHMP_ResultPolicy.H:16
amrex::Real tau_ew
Definition: ERF_NOAHMP_ResultPolicy.H:19
amrex::Real tau_ns
Definition: ERF_NOAHMP_ResultPolicy.H:20
amrex::Real mixing_ratio
Definition: ERF_NOAHMP_ResultPolicy.H:18
amrex::Real temperature
Definition: ERF_NOAHMP_ResultPolicy.H:17