1 #ifndef ERF_RRTMGP_UTILS_H
2 #define ERF_RRTMGP_UTILS_H
4 #include "rrtmgp_const.h"
8 #include "YAKL_Bounds_fortran.h"
15 using yakl::intrinsics::maxval;
16 using yakl::intrinsics::minval;
17 using yakl::intrinsics::count;
18 using yakl::intrinsics::sum;
21 template<
class T,
int myMem,
int myStyle>
24 yakl::Array<T,2,myMem,myStyle>
const &cloud_fraction,
25 yakl::Array<T,2,myMem,myStyle>
const &
rho ,
26 yakl::Array<T,2,myMem,myStyle>
const &dz ,
27 yakl::Array<T,2,myMem,myStyle> &cloud_mass)
29 int ncol = mixing_ratio.dimension[0];
30 int nlay = mixing_ratio.dimension[1];
31 yakl::fortran::parallel_for(yakl::fortran::SimpleBounds<2>(nlay, ncol), YAKL_LAMBDA(
int ilay,
int icol)
37 if (cloud_fraction(icol,ilay) > 0) {
39 auto incloud_mixing_ratio = std::min(mixing_ratio(icol,ilay) / std::max(0.0001, cloud_fraction(icol,ilay)), 0.005);
40 cloud_mass(icol,ilay) = incloud_mixing_ratio *
rho(icol,ilay) * dz(icol,ilay);
42 cloud_mass(icol,ilay) = 0;
48 template<
class S,
class T>
55 yakl::c::parallel_for(arr_in.totElems(), YAKL_LAMBDA(
int i)
57 arr_out.data()[i] = std::min(std::max(arr_in.data()[i], lower), upper);
72 template <
class T,
int myMem,
int myStyle>
75 yakl::Array<T,2,myMem,myStyle>
const &flux_dn,
76 yakl::Array<T,2,myMem,myStyle>
const &
rho ,
77 yakl::Array<T,2,myMem,myStyle>
const &dz ,
78 yakl::Array<T,2,myMem,myStyle> &heating_rate)
80 auto ncol = flux_up.dimension[0];
81 auto nlay = flux_up.dimension[1]-1;
82 yakl::fortran::parallel_for(yakl::fortran::SimpleBounds<2>(nlay,ncol), YAKL_LAMBDA(
int ilay,
int icol)
84 heating_rate(icol,ilay) = ( flux_up(icol,ilay+1) - flux_up(icol,ilay)
85 - flux_dn(icol,ilay+1) + flux_dn(icol,ilay) )
86 / ( -
rho(icol,ilay) * dz(icol,ilay) *
Cp_d );
103 return ( (nstep == 0) || (nstep % irad == 0) );
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:12
@ rho
Definition: ERF_Kessler.H:22
@ T
Definition: ERF_IndexDefines.H:110
Definition: ERF_RRTMGP_Interface.cpp:15
void mixing_ratio_to_cloud_mass(yakl::Array< T, 2, myMem, myStyle > const &mixing_ratio, yakl::Array< T, 2, myMem, myStyle > const &cloud_fraction, yakl::Array< T, 2, myMem, myStyle > const &rho, yakl::Array< T, 2, myMem, myStyle > const &dz, yakl::Array< T, 2, myMem, myStyle > &cloud_mass)
Definition: ERF_RRTMGP_Utils.H:23
bool radiation_do(const int irad, const int nstep)
Definition: ERF_RRTMGP_Utils.H:93
void compute_heating_rate(yakl::Array< T, 2, myMem, myStyle > const &flux_up, yakl::Array< T, 2, myMem, myStyle > const &flux_dn, yakl::Array< T, 2, myMem, myStyle > const &rho, yakl::Array< T, 2, myMem, myStyle > const &dz, yakl::Array< T, 2, myMem, myStyle > &heating_rate)
Definition: ERF_RRTMGP_Utils.H:74
void limit_to_bounds(S const &arr_in, T const lower, T const upper, S &arr_out)
Definition: ERF_RRTMGP_Utils.H:50