Skip to content

Commit

Permalink
Multiple moist models (erf-model#1303)
Browse files Browse the repository at this point in the history
* Does not compile with templated Microphysics.H but does compile with the case select version (commented out).

* Remove buffer files.

* Use inheritance through NullMoist class to reset ptr in Microphysics.
  • Loading branch information
AMLattanzi authored Nov 16, 2023
1 parent 00c1513 commit accb442
Show file tree
Hide file tree
Showing 19 changed files with 316 additions and 189 deletions.
16 changes: 9 additions & 7 deletions CMake/BuildERFExe.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,13 @@ function(build_erf_lib erf_lib_name)

if(ERF_ENABLE_MOISTURE)
target_sources(${erf_lib_name} PRIVATE
${SRC_DIR}/Microphysics/Init.cpp
${SRC_DIR}/Microphysics/Cloud.cpp
${SRC_DIR}/Microphysics/IceFall.cpp
${SRC_DIR}/Microphysics/Precip.cpp
${SRC_DIR}/Microphysics/PrecipFall.cpp
${SRC_DIR}/Microphysics/Diagnose.cpp
${SRC_DIR}/Microphysics/Update.cpp)
${SRC_DIR}/Microphysics/SAM/Init.cpp
${SRC_DIR}/Microphysics/SAM/Cloud.cpp
${SRC_DIR}/Microphysics/SAM/IceFall.cpp
${SRC_DIR}/Microphysics/SAM/Precip.cpp
${SRC_DIR}/Microphysics/SAM/PrecipFall.cpp
${SRC_DIR}/Microphysics/SAM/Diagnose.cpp
${SRC_DIR}/Microphysics/SAM/Update.cpp)
target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_MOISTURE)
endif()

Expand Down Expand Up @@ -184,6 +184,8 @@ function(build_erf_lib erf_lib_name)

if(ERF_ENABLE_MOISTURE)
target_include_directories(${erf_lib_name} PUBLIC ${SRC_DIR}/Microphysics)
target_include_directories(${erf_lib_name} PUBLIC ${SRC_DIR}/Microphysics/Null)
target_include_directories(${erf_lib_name} PUBLIC ${SRC_DIR}/Microphysics/SAM)
endif()

if(ERF_ENABLE_RRTMGP)
Expand Down
10 changes: 10 additions & 0 deletions Exec/Make.ERF
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,16 @@ ifeq ($(USE_MOISTURE), TRUE)
include $(ERF_MOISTURE_DIR)/Make.package
VPATH_LOCATIONS += $(ERF_MOISTURE_DIR)
INCLUDE_LOCATIONS += $(ERF_MOISTURE_DIR)

ERF_MOISTURE_NULL_DIR = $(ERF_SOURCE_DIR)/Microphysics/Null
include $(ERF_MOISTURE_NULL_DIR)/Make.package
VPATH_LOCATIONS += $(ERF_MOISTURE_NULL_DIR)
INCLUDE_LOCATIONS += $(ERF_MOISTURE_NULL_DIR)

ERF_MOISTURE_SAM_DIR = $(ERF_SOURCE_DIR)/Microphysics/SAM
include $(ERF_MOISTURE_SAM_DIR)/Make.package
VPATH_LOCATIONS += $(ERF_MOISTURE_SAM_DIR)
INCLUDE_LOCATIONS += $(ERF_MOISTURE_SAM_DIR)
endif

ifeq ($(USE_WARM_NO_PRECIP), TRUE)
Expand Down
2 changes: 2 additions & 0 deletions Exec/RegTests/WPS_Test/inputs_real_ChisholmView
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ erf.use_gravity = true
erf.use_terrain = true
erf.use_terrain = false

erf.moisture_model = "SAM"

erf.les_type = "None"
erf.molec_diff_type = "Constant"
erf.dynamicViscosity = 5.0
Expand Down
1 change: 1 addition & 0 deletions Source/ERF.H
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,7 @@ private:
amrex::Vector<amrex::MultiFab> rW_new;

#if defined(ERF_USE_MOISTURE)
std::string moisture_model = "NullMoist";
Microphysics micro;
amrex::Vector<amrex::MultiFab> qmoist; // This has 6 components: qv, qc, qi, qr, qs, qg
#endif
Expand Down
10 changes: 10 additions & 0 deletions Source/ERF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,16 @@ ERF::ReadParameters ()
pp.query("use_tracer_particles", use_tracer_particles);
#endif

#ifdef ERF_USE_MOISTURE
// What type of moisture model to use
pp.query("moisture_model", moisture_model);
if (moisture_model == "SAM") {
micro.SetModel<SAM>();
} else {
amrex::Print() << "WARNING: Compiled with moisture but using NullMoist model!\n";
}
#endif

// If this is set, it must be even
if (fixed_mri_dt_ratio > 0 && (fixed_mri_dt_ratio%2 != 0) )
{
Expand Down
7 changes: 0 additions & 7 deletions Source/Microphysics/Make.package
Original file line number Diff line number Diff line change
@@ -1,9 +1,2 @@
CEXE_sources += Cloud.cpp
CEXE_sources += Init.cpp
CEXE_sources += Diagnose.cpp
CEXE_sources += Update.cpp
CEXE_sources += IceFall.cpp
CEXE_sources += Precip.cpp
CEXE_sources += PrecipFall.cpp
CEXE_headers += Microphysics.H

202 changes: 47 additions & 155 deletions Source/Microphysics/Microphysics.H
Original file line number Diff line number Diff line change
@@ -1,163 +1,55 @@
/*
* Implementation 1-moment microphysics model
* NOTE: this model is based on the SAM code, and the Klemp's paper
* 1): Joseph, Klemp, the simulation of three-dimensional convective storm dynamics,
* Journal of the atmospheric sciences, vol35, p1070
* 2): Marat Khairoutdinov and David Randall, cloud resolving modeling of the ARM summer 1997 IOP:
* model formulation, results, unvertainties, and sensitivities, Journal of the atmospheric sciences, vol60, p607
*/
#ifndef MICROPHYSICS_H
#define MICROPHYSICS_H

#include <string>
#include <vector>
#include <memory>
#include <NullMoist.H>
#include <SAM.H>

#include <AMReX_FArrayBox.H>
#include <AMReX_Geometry.H>
#include <AMReX_TableData.H>
#include <AMReX_MultiFabUtil.H>

#include "ERF_Constants.H"
#include "Microphysics_Utils.H"
#include "IndexDefines.H"
#include "DataStruct.H"

namespace MicVar {
enum {
// independent variables
qt = 0,
qp,
theta, // liquid/ice water potential temperature
tabs, // temperature
rho, // density
pres, // pressure
// derived variables
qr, // rain water
qv, // water vapor
qn, // cloud condensate (liquid+ice), initial to zero
qci, // cloud ice
qcl, // cloud water
qpl, // precip rain
qpi, // precip ice
// temporary variable
omega,
NumVars
};
}

//
// use MultiFab for 3D data, but table for 1D data
//
class Microphysics {

using FabPtr = std::shared_ptr<amrex::MultiFab>;

public:
// constructor
Microphysics () {}

// Set up for first time
void define (SolverChoice& sc)
{
docloud = sc.do_cloud;
doprecip = sc.do_precip;
m_fac_cond = lcond / sc.c_p;
m_fac_fus = lfus / sc.c_p;
m_fac_sub = lsub / sc.c_p;
m_gOcp = CONST_GRAV / sc.c_p;
m_axis = sc.ave_plane;
}

// destructor
~Microphysics () = default;

// cloud physics
void Cloud ();

// ice physics
void IceFall ();

// precip
void Precip ();

// precip fall
void PrecipFall (int hydro_type);

// micro interface for precip fall
void MicroPrecipFall ();

// init
void Init (const amrex::MultiFab& cons_in,
amrex::MultiFab& qmoist,
const amrex::BoxArray& grids,
const amrex::Geometry& geom,
const amrex::Real& dt_advance);

// update ERF variables
void Update (amrex::MultiFab& cons_in,
amrex::MultiFab& qmoist);

// diagnose
void Diagnose ();

// process microphysics
void Proc ();

private:
// geometry
amrex::Geometry m_geom;
// valid boxes on which to evolve the solution
amrex::BoxArray m_gtoe;

// timestep
amrex::Real dt;

// number of vertical levels
int nlev, zlo, zhi;

// plane average axis
int m_axis;

// model options
bool docloud, doprecip;

// constants
amrex::Real m_fac_cond;
amrex::Real m_fac_fus;
amrex::Real m_fac_sub;
amrex::Real m_gOcp;

// microphysics parameters/coefficients
amrex::TableData<amrex::Real, 1> accrrc;
amrex::TableData<amrex::Real, 1> accrsi;
amrex::TableData<amrex::Real, 1> accrsc;
amrex::TableData<amrex::Real, 1> coefice;
amrex::TableData<amrex::Real, 1> evaps1;
amrex::TableData<amrex::Real, 1> evaps2;
amrex::TableData<amrex::Real, 1> accrgi;
amrex::TableData<amrex::Real, 1> accrgc;
amrex::TableData<amrex::Real, 1> evapg1;
amrex::TableData<amrex::Real, 1> evapg2;
amrex::TableData<amrex::Real, 1> evapr1;
amrex::TableData<amrex::Real, 1> evapr2;

// vertical plane average data
amrex::TableData<amrex::Real, 1> rho1d;
amrex::TableData<amrex::Real, 1> pres1d;
amrex::TableData<amrex::Real, 1> tabs1d;
amrex::TableData<amrex::Real, 1> qt1d;
amrex::TableData<amrex::Real, 1> qv1d;
amrex::TableData<amrex::Real, 1> qn1d;

// independent variables
amrex::Array<FabPtr, MicVar::NumVars> mic_fab_vars;

amrex::TableData<amrex::Real, 1> gamaz;
amrex::TableData<amrex::Real, 1> zmid; // mid value of vertical coordinate in physical domain

// data (output)
amrex::TableData<amrex::Real, 1> qifall;
amrex::TableData<amrex::Real, 1> tlatqi;
public:

Microphysics () { }

~Microphysics () = default;

template<class NewMoistModel>
void
SetModel ()
{
m_moist_model = std::make_unique<NewMoistModel>();
}

void
define (SolverChoice& sc)
{
m_moist_model->define(sc);
}

void
Init (const amrex::MultiFab& cons_in,
amrex::MultiFab& qmoist,
const amrex::BoxArray& grids,
const amrex::Geometry& geom,
const amrex::Real& dt_advance)
{
m_moist_model->Init(cons_in, qmoist, grids, geom, dt_advance);
}

void
Advance ( )
{
m_moist_model->Advance();
}

void
Update (amrex::MultiFab& cons_in,
amrex::MultiFab& qmoist)
{
m_moist_model->Update(cons_in, qmoist);
}


private:
std::unique_ptr<NullMoist> m_moist_model;
};
#endif
2 changes: 2 additions & 0 deletions Source/Microphysics/Null/Make.package
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CEXE_headers += NullMoist.H

35 changes: 35 additions & 0 deletions Source/Microphysics/Null/NullMoist.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef NULLMOIST_H
#define NULLMOIST_H

#include <AMReX_MultiFabUtil.H>
#include <AMReX_Geometry.H>
#include <DataStruct.H>

class NullMoist {

public:
NullMoist () {}

virtual ~NullMoist () = default;

virtual void
define (SolverChoice& /*sc*/) { };

virtual
void Init (const amrex::MultiFab& /*cons_in*/,
amrex::MultiFab& /*qmoist*/,
const amrex::BoxArray& /*grids*/,
const amrex::Geometry& /*geom*/,
const amrex::Real& /*dt_advance*/) { };

virtual void
Advance ( ) { };

virtual void
Update (amrex::MultiFab& /*cons_in*/,
amrex::MultiFab& /*qmoist*/) { };

private:

};
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ using namespace amrex;
/**
* Compute Cloud-related Microphysics quantities.
*/
void Microphysics::Cloud () {
void SAM::Cloud () {

constexpr Real an = 1.0/(tbgmax-tbgmin);
constexpr Real bn = tbgmin*an;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Computes diagnostic quantities like cloud ice/liquid and precipitation ice/liquid
* from the existing Microphysics variables.
*/
void Microphysics::Diagnose () {
void SAM::Diagnose () {

auto qt = mic_fab_vars[MicVar::qt];
auto qp = mic_fab_vars[MicVar::qp];
Expand Down Expand Up @@ -44,7 +44,7 @@ void Microphysics::Diagnose () {
/**
* Wrapper for the PrecipFall, Cloud, Precipitation, and Diagnostics routines.
*/
void Microphysics::Proc () {
void SAM::Proc () {

MicroPrecipFall();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ using namespace amrex;
/**
* Computes contributions to Microphysics and thermodynamic variables from falling cloud ice in each column.
*/
void Microphysics::IceFall () {
void SAM::IceFall () {

Real dz = m_geom.CellSize(2);
Real dtn = dt;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ using namespace amrex;
* @param[in] geom Geometry associated with these MultiFabs and grids
* @param[in] dt_advance Timestep for the advance
*/
void Microphysics::Init (const MultiFab& cons_in, MultiFab& qmoist,
const BoxArray& grids,
const Geometry& geom,
const Real& dt_advance)
void SAM::Init (const MultiFab& cons_in, MultiFab& qmoist,
const BoxArray& grids,
const Geometry& geom,
const Real& dt_advance)
{
m_geom = geom;
m_gtoe = grids;
Expand Down
Loading

0 comments on commit accb442

Please sign in to comment.