ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Morrison.H File Reference
#include <string>
#include <vector>
#include <memory>
#include <AMReX_FArrayBox.H>
#include <AMReX_Geometry.H>
#include <AMReX_TableData.H>
#include <AMReX_MultiFabUtil.H>
#include "ERF_Constants.H"
#include "ERF_MicrophysicsConstants.H"
#include "ERF_MicrophysicsUtils.H"
#include "ERF_IndexDefines.H"
#include "ERF_DataStruct.H"
#include "ERF_NullMoist.H"
#include "ERF_SurfacePrecipitation.H"
#include "ERF_MicrophysicsColumns.H"
#include <ERF_Morrison_Fortran_Interface.H>
Include dependency graph for ERF_Morrison.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  Morrison
 

Namespaces

 MicVar_Morr
 
 MorrSed
 

Enumerations

enum  {
  MicVar_Morr::rho =0 , MicVar_Morr::theta , MicVar_Morr::tabs , MicVar_Morr::pres ,
  MicVar_Morr::qt , MicVar_Morr::qn , MicVar_Morr::qv , MicVar_Morr::qcl ,
  MicVar_Morr::qci , MicVar_Morr::qp , MicVar_Morr::qpr , MicVar_Morr::qps ,
  MicVar_Morr::qpg , MicVar_Morr::nc , MicVar_Morr::nr , MicVar_Morr::ni ,
  MicVar_Morr::ns , MicVar_Morr::ng , MicVar_Morr::rain_accum , MicVar_Morr::snow_accum ,
  MicVar_Morr::graupel_accum , MicVar_Morr::precip_accum , MicVar_Morr::omega , MicVar_Morr::NumVars
}
 
enum  {
  MorrSed::qc = 0 , MorrSed::qi , MorrSed::qr , MorrSed::qs ,
  MorrSed::qg , MorrSed::nc , MorrSed::ni , MorrSed::nr ,
  MorrSed::ns , MorrSed::ng , MorrSed::NumComps
}
 

Functions

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void morrison_copy_state_to_micro_cell (const amrex::Array4< const amrex::Real > &states, const amrex::Array4< const amrex::Real > &base, const amrex::Array4< amrex::Real > &rho, const amrex::Array4< amrex::Real > &theta, const amrex::Array4< amrex::Real > &qv, const amrex::Array4< amrex::Real > &qc, const amrex::Array4< amrex::Real > &qi, const amrex::Array4< amrex::Real > &qn, const amrex::Array4< amrex::Real > &qt, const amrex::Array4< amrex::Real > &qpr, const amrex::Array4< amrex::Real > &qps, const amrex::Array4< amrex::Real > &qpg, const amrex::Array4< amrex::Real > &qp, const amrex::Array4< amrex::Real > &tabs, const amrex::Array4< amrex::Real > &pres, const amrex::Real rdOcp, const bool use_anelastic_reference_pressure, const int i, const int j, const int k) noexcept
 

Function Documentation

◆ morrison_copy_state_to_micro_cell()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void morrison_copy_state_to_micro_cell ( const amrex::Array4< const amrex::Real > &  states,
const amrex::Array4< const amrex::Real > &  base,
const amrex::Array4< amrex::Real > &  rho,
const amrex::Array4< amrex::Real > &  theta,
const amrex::Array4< amrex::Real > &  qv,
const amrex::Array4< amrex::Real > &  qc,
const amrex::Array4< amrex::Real > &  qi,
const amrex::Array4< amrex::Real > &  qn,
const amrex::Array4< amrex::Real > &  qt,
const amrex::Array4< amrex::Real > &  qpr,
const amrex::Array4< amrex::Real > &  qps,
const amrex::Array4< amrex::Real > &  qpg,
const amrex::Array4< amrex::Real > &  qp,
const amrex::Array4< amrex::Real > &  tabs,
const amrex::Array4< amrex::Real > &  pres,
const amrex::Real  rdOcp,
const bool  use_anelastic_reference_pressure,
const int  i,
const int  j,
const int  k 
)
noexcept
82 {
83  const amrex::Real rho_value = states(i,j,k,Rho_comp);
84  const amrex::Real rho_theta = states(i,j,k,RhoTheta_comp);
85  rho(i,j,k) = rho_value;
86  theta(i,j,k) = rho_theta / rho_value;
87  qv(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ1_comp) / rho_value);
88  qc(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ2_comp) / rho_value);
89  qi(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ3_comp) / rho_value);
90  qn(i,j,k) = qc(i,j,k) + qi(i,j,k);
91  qt(i,j,k) = qv(i,j,k) + qn(i,j,k);
92  qpr(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ4_comp) / rho_value);
93  qps(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ5_comp) / rho_value);
94  qpg(i,j,k) = amrex::max(amrex::Real(0.0), states(i,j,k,RhoQ6_comp) / rho_value);
95  qp(i,j,k) = qpr(i,j,k) + qps(i,j,k) + qpg(i,j,k);
96 
97  const amrex::Real p0 = use_anelastic_reference_pressure
98  ? base(i,j,k,BaseState::p0_comp) : amrex::Real(0.0);
100  rho_value, rho_theta, qv(i,j,k), rdOcp,
101  use_anelastic_reference_pressure, p0);
102  tabs(i,j,k) = thermo.temperature;
103  // Morrison's native pressure unit is Pa.
104  pres(i,j,k) = thermo.pressure_pa;
105 }
#define Rho_comp
Definition: ERF_IndexDefines.H:53
#define RhoQ4_comp
Definition: ERF_IndexDefines.H:69
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:54
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:67
#define RhoQ3_comp
Definition: ERF_IndexDefines.H:68
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:66
#define RhoQ6_comp
Definition: ERF_IndexDefines.H:71
#define RhoQ5_comp
Definition: ERF_IndexDefines.H:70
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE MicrophysicsThermoState diagnose_microphysics_thermo_state(const amrex::Real rho, const amrex::Real rho_theta, const amrex::Real qv, const amrex::Real rdOcp, const bool use_anelastic_reference_pressure, const amrex::Real p0) noexcept
Definition: ERF_MicrophysicsUtils.H:35
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ p0_comp
Definition: ERF_IndexDefines.H:98
@ qv
Definition: ERF_Morrison.H:37
@ qpg
Definition: ERF_Morrison.H:44
@ pres
Definition: ERF_Morrison.H:33
@ tabs
Definition: ERF_Morrison.H:32
@ theta
Definition: ERF_Morrison.H:31
@ qp
Definition: ERF_Morrison.H:41
@ qps
Definition: ERF_Morrison.H:43
@ qn
Definition: ERF_Morrison.H:36
@ rho
Definition: ERF_Morrison.H:30
@ qpr
Definition: ERF_Morrison.H:42
@ qt
Definition: ERF_Morrison.H:35
@ qi
Definition: ERF_Morrison.H:111
@ qc
Definition: ERF_Morrison.H:110
Definition: ERF_ConsoleIO.cpp:17
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40
Definition: ERF_MicrophysicsUtils.H:22
amrex::Real pressure_pa
Definition: ERF_MicrophysicsUtils.H:23
amrex::Real temperature
Definition: ERF_MicrophysicsUtils.H:24
Here is the call graph for this function: