1 #ifndef ERF_SURFACE_TEMPERATURE_H_
2 #define ERF_SURFACE_TEMPERATURE_H_
7 #include <AMReX_Math.H>
8 #include <AMReX_GpuAtomic.H>
9 #include <AMReX_ParallelDescriptor.H>
10 #include <AMReX_Print.H>
24 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
34 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
44 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
48 return amrex::Math::isfinite(pressure) && pressure >
amrex::Real(0.0);
51 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
55 return amrex::Math::isfinite(temperature) && temperature >
amrex::Real(0.0);
58 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
77 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
157 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
162 const int i,
const int j,
const int k,
172 amrex::Gpu::Atomic::Add(&fail->
halo_count, 1);
176 amrex::Gpu::Atomic::Add(&fail->
count, 1);
180 if (amrex::Gpu::Atomic::CAS(&fail->
code, unclaimed,
static_cast<int>(code)) != unclaimed) {
184 fail->
i = i; fail->
j = j; fail->
k = k;
200 return "the density or (rho theta) of the state cell is not usable";
202 return "the state carries no water vapor component to convert";
204 return "the (rho qv) of the state cell is not usable";
206 return "the water vapor mixing ratio derived from the state cell is not usable";
208 return "the surface potential temperature could not be converted to absolute temperature";
210 return "the surface temperature could not be converted to potential temperature";
212 return "the surface pressure derived from the state cell is not usable";
214 return "the skin temperature is not usable";
216 return "the reference-height water vapor mixing ratio is not usable";
218 return "the surface mixing ratio came out non-finite";
220 return "the conversion failed for a reason that was not recorded";
241 amrex::ParallelDescriptor::ReduceIntMax(any_failed);
242 if (any_failed == 0) {
return; }
250 const bool has_vapor = (is_conversion ||
255 const bool has_surface = (is_conversion ||
264 std::ostringstream msg;
265 msg << who <<
": surface conversion failed at level " << lev
266 <<
" [rank " << amrex::ParallelDescriptor::MyProc() <<
"]\n"
267 <<
" " << fail.
count <<
" of the cells this fill owns failed";
269 msg <<
" (and " << fail.
halo_count <<
" halo cells, which are not fatal)";
271 msg <<
"\n first failure at (" << fail.
i <<
"," << fail.
j <<
"," << fail.
k <<
"): "
275 msg << std::setprecision(10) <<
" rho = " << fail.
rho
277 if (has_vapor) { msg <<
" (rho qv) = " << fail.
rho_qv; }
278 if (has_q_air) { msg <<
" q_air = " << fail.
q_air; }
280 msg <<
"\n surface temperature = " << fail.
t_surf
282 <<
" delta_z = " << fail.
delta_z;
287 amrex::AllPrint() << msg.str() << std::flush;
291 amrex::ParallelDescriptor::Barrier();
292 amrex::Abort(std::string(who) +
": could not convert the surface state (see above)");
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:68
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
@ rho
Definition: ERF_Kessler.H:25
@ theta
Definition: ERF_Kessler.H:26
@ qv
Definition: ERF_Kessler.H:31
Definition: ERF_SurfaceTemperature.H:15
AMREX_FORCE_INLINE const char * conversion_error_text(const ConversionError code)
Definition: ERF_SurfaceTemperature.H:196
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:36
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:79
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void record_conversion_failure(ConversionFailure *fail, const bool fatal, const ConversionError code, const int i, const int j, const int k, const amrex::Real rho=amrex::Real(0.0), const amrex::Real rho_theta=amrex::Real(0.0), const amrex::Real rho_qv=amrex::Real(0.0), const amrex::Real t_surf=amrex::Real(0.0), const amrex::Real pressure=amrex::Real(0.0), const amrex::Real delta_z=amrex::Real(0.0), const amrex::Real q_air=amrex::Real(0.0))
Definition: ERF_SurfaceTemperature.H:159
ConversionError
Definition: ERF_SurfaceTemperature.H:105
@ bad_temperature_to_theta
@ bad_theta_to_temperature
void abort_on_conversion_failure(const char *who, const int lev, ConversionFailure const &fail)
Definition: ERF_SurfaceTemperature.H:236
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:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool valid_pressure(const amrex::Real pressure)
Definition: ERF_SurfaceTemperature.H:46
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:60
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool valid_temperature(const amrex::Real temperature)
Definition: ERF_SurfaceTemperature.H:53
Definition: ERF_SurfaceTemperature.H:130
int count
Definition: ERF_SurfaceTemperature.H:132
amrex::Real rho_qv
Definition: ERF_SurfaceTemperature.H:137
amrex::Real rho
Definition: ERF_SurfaceTemperature.H:135
int i
Definition: ERF_SurfaceTemperature.H:134
int code
Definition: ERF_SurfaceTemperature.H:131
amrex::Real pressure
Definition: ERF_SurfaceTemperature.H:139
amrex::Real rho_theta
Definition: ERF_SurfaceTemperature.H:136
int k
Definition: ERF_SurfaceTemperature.H:134
int j
Definition: ERF_SurfaceTemperature.H:134
amrex::Real t_surf
Definition: ERF_SurfaceTemperature.H:138
amrex::Real delta_z
Definition: ERF_SurfaceTemperature.H:140
int halo_count
Definition: ERF_SurfaceTemperature.H:133
amrex::Real q_air
Definition: ERF_SurfaceTemperature.H:141