ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
erf_sbm::SBMBulkProjection Class Reference

#include <ERF_SBMBulkProjection.H>

Collaboration diagram for erf_sbm::SBMBulkProjection:

Public Member Functions

 SBMBulkProjection (const SBMLayout &layout)
 
BulkProjection apply (const std::vector< amrex::Real > &auxiliary) const
 
void apply_to_core (const amrex::Box &box, const amrex::Array4< const amrex::Real > &auxiliary, const amrex::Array4< amrex::Real > &core, int qc_component, int qr_component) const
 
int cloud_offset () const noexcept
 
int cloud_count () const noexcept
 
int rain_offset () const noexcept
 
int rain_count () const noexcept
 

Private Attributes

int m_cloud_offset {0}
 
int m_cloud_count {0}
 
int m_rain_offset {0}
 
int m_rain_count {0}
 

Detailed Description

Fixed cloud/rain projection from the liquid population's mass bins.

Constructor & Destructor Documentation

◆ SBMBulkProjection()

erf_sbm::SBMBulkProjection::SBMBulkProjection ( const SBMLayout &  layout)
explicit
13 {
14  const auto& projection = layout.liquid_projection();
15  const auto p = std::find_if(layout.populations().begin(), layout.populations().end(),
16  [&](const PopulationLayout& candidate) {
17  return candidate.population_id == projection.population_id;
18  });
19  if (p == layout.populations().end()) {
20  throw std::invalid_argument("SBM liquid projection references an unknown population");
21  }
22  m_cloud_offset = p->mass_offset;
23  m_cloud_count = projection.cloud_rain_split;
25  m_rain_count = p->grid.nbins() - m_cloud_count;
26 }
int m_rain_count
Definition: ERF_SBMBulkProjection.H:37
int m_rain_offset
Definition: ERF_SBMBulkProjection.H:36
int m_cloud_count
Definition: ERF_SBMBulkProjection.H:35
int m_cloud_offset
Definition: ERF_SBMBulkProjection.H:34
@ p
Definition: ERF_WSM6.H:280
Here is the call graph for this function:

Member Function Documentation

◆ apply()

BulkProjection erf_sbm::SBMBulkProjection::apply ( const std::vector< amrex::Real > &  auxiliary) const
29 {
30  if (m_rain_offset + m_rain_count > static_cast<int>(auxiliary.size())) {
31  throw std::invalid_argument("auxiliary state is smaller than SBM projection");
32  }
33  BulkProjection result;
34  for (int b = 0; b < m_cloud_count; ++b) {
35  result.qc += auxiliary[static_cast<std::size_t>(m_cloud_offset + b)];
36  }
37  for (int b = 0; b < m_rain_count; ++b) {
38  result.qr += auxiliary[static_cast<std::size_t>(m_rain_offset + b)];
39  }
40  return result;
41 }

◆ apply_to_core()

void erf_sbm::SBMBulkProjection::apply_to_core ( const amrex::Box &  box,
const amrex::Array4< const amrex::Real > &  auxiliary,
const amrex::Array4< amrex::Real > &  core,
int  qc_component,
int  qr_component 
) const
48 {
49  const int cloud_offset = m_cloud_offset;
50  const int cloud_count = m_cloud_count;
51  const int rain_offset = m_rain_offset;
52  const int rain_count = m_rain_count;
53  amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept {
54  amrex::Real qc = amrex::Real(0.0);
55  amrex::Real qr = amrex::Real(0.0);
56  for (int b = 0; b < cloud_count; ++b) qc += auxiliary(i,j,k,cloud_offset+b);
57  for (int b = 0; b < rain_count; ++b) qr += auxiliary(i,j,k,rain_offset+b);
58  core(i,j,k,qc_component) = qc;
59  core(i,j,k,qr_component) = qr;
60  });
61 }
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
int cloud_count() const noexcept
Definition: ERF_SBMBulkProjection.H:29
int cloud_offset() const noexcept
Definition: ERF_SBMBulkProjection.H:28
int rain_count() const noexcept
Definition: ERF_SBMBulkProjection.H:31
int rain_offset() const noexcept
Definition: ERF_SBMBulkProjection.H:30
@ qc
Definition: ERF_SatAdj.H:42
@ qr
Definition: ERF_AdvanceWDM6.cpp:271

Referenced by erf_sbm::SBMStateManager::project_to_core(), and erf_sbm::restart_projection_matches().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cloud_count()

int erf_sbm::SBMBulkProjection::cloud_count ( ) const
inlinenoexcept
29 { return m_cloud_count; }

Referenced by apply_to_core().

Here is the caller graph for this function:

◆ cloud_offset()

int erf_sbm::SBMBulkProjection::cloud_offset ( ) const
inlinenoexcept
28 { return m_cloud_offset; }

Referenced by apply_to_core().

Here is the caller graph for this function:

◆ rain_count()

int erf_sbm::SBMBulkProjection::rain_count ( ) const
inlinenoexcept
31 { return m_rain_count; }

Referenced by apply_to_core().

Here is the caller graph for this function:

◆ rain_offset()

int erf_sbm::SBMBulkProjection::rain_offset ( ) const
inlinenoexcept
30 { return m_rain_offset; }

Referenced by apply_to_core().

Here is the caller graph for this function:

Member Data Documentation

◆ m_cloud_count

int erf_sbm::SBMBulkProjection::m_cloud_count {0}
private

◆ m_cloud_offset

int erf_sbm::SBMBulkProjection::m_cloud_offset {0}
private

◆ m_rain_count

int erf_sbm::SBMBulkProjection::m_rain_count {0}
private

◆ m_rain_offset

int erf_sbm::SBMBulkProjection::m_rain_offset {0}
private

The documentation for this class was generated from the following files: