ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ProblemBase Class Referenceabstract

#include <ERF_ProbCommon.H>

Collaboration diagram for ProblemBase:

Public Member Functions

virtual ~ProblemBase ()=default
 
virtual void erf_init_dens_hse (amrex::MultiFab &, std::unique_ptr< amrex::MultiFab > &, std::unique_ptr< amrex::MultiFab > &, amrex::Geometry const &)
 
virtual void erf_init_dens_hse_moist (amrex::MultiFab &, std::unique_ptr< amrex::MultiFab > &, amrex::Geometry const &)
 
virtual void init_custom_pert (const amrex::Box &, const amrex::Box &, const amrex::Box &, const amrex::Box &, amrex::Array4< amrex::Real const > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real > const &, amrex::Array4< amrex::Real const > const &, amrex::Array4< amrex::Real const > const &, amrex::GeometryData const &, amrex::Array4< amrex::Real const > const &, amrex::Array4< amrex::Real const > const &, amrex::Array4< amrex::Real const > const &, const SolverChoice &)
 
virtual void update_rhotheta_sources (const amrex::Real &, amrex::Vector< amrex::Real > &src, amrex::Gpu::DeviceVector< amrex::Real > &d_src, const amrex::Geometry &geom, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
 
virtual void update_rhoqt_sources (const amrex::Real &, amrex::Vector< amrex::Real > &qsrc, amrex::Gpu::DeviceVector< amrex::Real > &d_qsrc, const amrex::Geometry &geom, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
 
virtual void update_w_subsidence (const amrex::Real &, amrex::Vector< amrex::Real > &wbar, amrex::Gpu::DeviceVector< amrex::Real > &d_wbar, const amrex::Geometry &geom, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
 
virtual void update_geostrophic_profile (const amrex::Real &, amrex::Vector< amrex::Real > &u_geos, amrex::Gpu::DeviceVector< amrex::Real > &d_u_geos, amrex::Vector< amrex::Real > &v_geos, amrex::Gpu::DeviceVector< amrex::Real > &d_v_geos, const amrex::Geometry &geom, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
 
void init_terrain_surface (const amrex::Geometry &geom, amrex::FArrayBox &terrain_fab, const amrex::Real &time)
 
void read_custom_terrain (const std::string &fname, const bool is_usgs, const amrex::Geometry &geom, amrex::FArrayBox &terrain_fab, const amrex::Real &)
 
virtual void init_custom_terrain (const amrex::Geometry &, amrex::FArrayBox &terrain_fab, const amrex::Real &)
 
virtual void erf_init_rayleigh (amrex::Vector< amrex::Vector< amrex::Real > > &, amrex::Geometry const &, std::unique_ptr< amrex::MultiFab > &, amrex::Real)
 
void init_uniform (const amrex::Box &bx, amrex::Array4< amrex::Real > const &state)
 

Protected Member Functions

void init_base_parms (amrex::Real rho_0, amrex::Real T_0)
 
virtual std::string name ()=0
 

Protected Attributes

ProbParmDefaults base_parms
 

Detailed Description

Class to hold problem-specific routines

Constructor & Destructor Documentation

◆ ~ProblemBase()

virtual ProblemBase::~ProblemBase ( )
virtualdefault

Virtual destructor to avoid data leakage with derived class

Member Function Documentation

◆ erf_init_dens_hse()

virtual void ProblemBase::erf_init_dens_hse ( amrex::MultiFab &  ,
std::unique_ptr< amrex::MultiFab > &  ,
std::unique_ptr< amrex::MultiFab > &  ,
amrex::Geometry const &   
)
inlinevirtual

Function to initialize the hydrostatic reference density

Parameters
[out]rho_hsehydrostatic reference density
[in]z_phys_ndheight coordinate at nodes
[in]z_phys_ccheight coordinate at cell centers
[in]geomcontainer for geometric information
65  {
66  amrex::Print() << "Hydrostatically balanced density was NOT set"
67  << " -- an appropriate init_type should probably have been specified"
68  << " (e.g., input_sounding, WRFInput, or Metgrid)"
69  << std::endl;
70  amrex::Error("Should never call erf_init_dens_hse for "+name()+" problem");
71  }
virtual std::string name()=0
Here is the call graph for this function:

◆ erf_init_dens_hse_moist()

virtual void ProblemBase::erf_init_dens_hse_moist ( amrex::MultiFab &  ,
std::unique_ptr< amrex::MultiFab > &  ,
amrex::Geometry const &   
)
inlinevirtual
77  {
78 
79  }

◆ erf_init_rayleigh()

virtual void ProblemBase::erf_init_rayleigh ( amrex::Vector< amrex::Vector< amrex::Real > > &  ,
amrex::Geometry const &  ,
std::unique_ptr< amrex::MultiFab > &  ,
amrex::Real   
)
inlinevirtual

Function to define the quantities needed to impose Rayleigh damping

Parameters
[out]rayleigh_ptrs= {strength of Rayleigh damping, reference values for xvel/yvel/zvel/theta used to define Rayleigh damping}
[in]geomcontainer for geometric information
[in]z_phys_ccheight coordinate at cell centers
614  {
615  amrex::Error("Should never call erf_init_rayleigh for "+name()+" problem");
616  }
Here is the call graph for this function:

◆ init_base_parms()

void ProblemBase::init_base_parms ( amrex::Real  rho_0,
amrex::Real  T_0 
)
inlineprotected

Function to update default base parameters, currently only used for init_type == InitType::Uniform

645  {
646  base_parms.rho_0 = rho_0;
647  base_parms.T_0 = T_0;
648  }
ProbParmDefaults base_parms
Definition: ERF_ProbCommon.H:639
amrex::Real T_0
Definition: ERF_ProbCommon.H:16
amrex::Real rho_0
Definition: ERF_ProbCommon.H:15

◆ init_custom_pert()

virtual void ProblemBase::init_custom_pert ( const amrex::Box &  ,
const amrex::Box &  ,
const amrex::Box &  ,
const amrex::Box &  ,
amrex::Array4< amrex::Real const > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real > const &  ,
amrex::Array4< amrex::Real const > const &  ,
amrex::Array4< amrex::Real const > const &  ,
amrex::GeometryData const &  ,
amrex::Array4< amrex::Real const > const &  ,
amrex::Array4< amrex::Real const > const &  ,
amrex::Array4< amrex::Real const > const &  ,
const SolverChoice  
)
inlinevirtual

Function to perform custom initialization of a test problem

Parameters
[in]bxcell-centered box on which to initialize scalars
[in]xbxbox on which to initialize x-component of velocity
[in]ybxbox on which to initialize y-component of velocity
[in]zbxbox on which to initialize z-component of velocity
[out]statecell-centered variables to be filled in this routine
[out]x_velocityx-component of velocity to be filled in this routine
[out]y_velocityy-component of velocity to be filled in this routine
[out]z_velocityz-component of velocity to be filled in this routine
[out]r_hsehydrostatic reference density
[out]p_hsehydrostatic reference pressure
[in]z_ndheight coordinate at nodes
[in]z_ccheight coordinate at cell centers
[in]qvwater vapor
[in]qccloud water
[in]qicloud ice
[in]mf_mmap factor on cell centers
[in]mf_umap factor on x-faces
[in]mf_vmap factor on y-faces
[in]scSolverChoice structure that carries parameters
123  {
124  amrex::Print() << "No perturbation to background fields supplied for "
125  << name() << " problem" << std::endl;
126  }
Here is the call graph for this function:

◆ init_custom_terrain()

virtual void ProblemBase::init_custom_terrain ( const amrex::Geometry &  ,
amrex::FArrayBox &  terrain_fab,
const amrex::Real &   
)
inlinevirtual

Function to perform custom initialization of terrain

Note: Terrain functionality can also be used to provide grid stretching.

Parameters
[in]geomcontainer for geometric information
[out]terrain_mfheight coordinate at nodes
[in]timecurrent time
584  {
585  amrex::Print() << "Initializing flat terrain" << std::endl;
586 
587  if (SolverChoice::mesh_type == MeshType::VariableDz) {
588  SolverChoice::set_mesh_type(MeshType::StretchedDz);
589  amrex::Print() << "Resetting mesh type to StretchedDz" << std::endl;
590  }
591 
592  terrain_fab.template setVal<amrex::RunOn::Device>(0.0);
593  }
static MeshType mesh_type
Definition: ERF_DataStruct.H:665
static void set_mesh_type(MeshType new_mesh_type)
Definition: ERF_DataStruct.H:668

Referenced by init_terrain_surface().

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

◆ init_terrain_surface()

void ProblemBase::init_terrain_surface ( const amrex::Geometry &  geom,
amrex::FArrayBox &  terrain_fab,
const amrex::Real &  time 
)
inline

Function to perform custom initialization of terrain

Parameters
[in]geomcontainer for geometric information
[out]z_phys_ndheight coordinate at nodes
[in]timecurrent time
294  {
295  // Check if a valid text file exists for the terrain
296  std::string fname, fname_usgs;
297  amrex::ParmParse pp("erf");
298  auto valid_fname = pp.query("terrain_file_name",fname);
299  auto valid_fname_USGS = pp.query("terrain_file_name_USGS",fname_usgs);
300 
301  bool is_usgs;
302 
303  if (valid_fname) {
304  is_usgs = false;
305  read_custom_terrain(fname,is_usgs,geom,terrain_fab,time);
306 
307  } else if (valid_fname_USGS) {
308  is_usgs = true;
309  read_custom_terrain(fname_usgs,is_usgs,geom,terrain_fab,time);
310 
311  } else {
312  init_custom_terrain (geom, terrain_fab, time);
313  }
314  }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:219
void read_custom_terrain(const std::string &fname, const bool is_usgs, const amrex::Geometry &geom, amrex::FArrayBox &terrain_fab, const amrex::Real &)
Definition: ERF_ProbCommon.H:317
virtual void init_custom_terrain(const amrex::Geometry &, amrex::FArrayBox &terrain_fab, const amrex::Real &)
Definition: ERF_ProbCommon.H:581
Here is the call graph for this function:

◆ init_uniform()

void ProblemBase::init_uniform ( const amrex::Box &  bx,
amrex::Array4< amrex::Real > const &  state 
)
inline

Function to set uniform background density and pressure fields

623  {
624  amrex::Real rho_0 = base_parms.rho_0;
625  amrex::Real T_0 = base_parms.T_0;
626  amrex::Print() << "Initializing uniform fields"
627  << " rho=" << rho_0 << " theta=" << T_0
628  << std::endl;
629 
630  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
631  {
632  state(i, j, k, Rho_comp) = rho_0;
633  state(i, j, k, RhoTheta_comp) = rho_0 * T_0;
634  });
635  }
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37

◆ name()

virtual std::string ProblemBase::name ( )
protectedpure virtual

◆ read_custom_terrain()

void ProblemBase::read_custom_terrain ( const std::string &  fname,
const bool  is_usgs,
const amrex::Geometry &  geom,
amrex::FArrayBox &  terrain_fab,
const amrex::Real &   
)
inline
322  {
323  amrex::Vector<amrex::Real> m_xterrain,m_yterrain,m_zterrain;
324 
325  int nx = 0; int ny = 0;
326 
327  if (amrex::ParallelDescriptor::IOProcessor()) {
328  // Read terrain file
329  amrex::Print()<<"Reading terrain file: "<< fname<< std::endl;
330  std::ifstream file(fname);
331 
332  if (!file.is_open()) {
333  amrex::Abort("Error: Could not open the file " + fname+ "\n");
334  }
335 
336  // Check if file is empty
337  if (file.peek() == std::ifstream::traits_type::eof()) {
338  amrex::Abort("Error: The file " + fname+ " is empty.\n");
339  }
340 
341  amrex::Real value1,value2,value3;
342 
343  if (is_usgs) {
344  amrex::Real lat_min, lon_min;
345 
346  file >> lon_min >> lat_min;
347  if(std::fabs(lon_min) > 180.0) {
348  amrex::Error("The value of longitude for entry in the first line in " + fname
349  + " should not exceed 180. It is " + std::to_string(lon_min));
350  }
351  if(std::fabs(lat_min) > 90.0) {
352  amrex::Error("The value of latitude for entry in the first line in " + fname
353  + " should not exceed 90. It is " + std::to_string(lat_min));
354  }
355 
356  file >> nx >> ny;
357 
358  int counter = 0;
359  while (file >> value1 >> value2 >> value3) {
360  m_xterrain.push_back(value1);
361  if(counter%nx==0) {
362  m_yterrain.push_back(value2);
363  }
364  m_zterrain.push_back(value3);
365  counter += 1;
366  }
367  AMREX_ASSERT(m_xterrain.size() == static_cast<long int>(nx*ny));
368  AMREX_ASSERT(m_yterrain.size() == static_cast<long int>(ny));
369  AMREX_ASSERT(m_zterrain.size() == static_cast<long int>(nx*ny));
370 
371  } else {
372  int cnt = 1;
373  nx = erf_get_single_value<int>(file,cnt); cnt++;
374  ny = erf_get_single_value<int>(file,cnt); cnt++;
375  amrex::Print()<<"Expecting " << nx << " values of x, " <<
376  ny << " values of y, and " <<
377  nx*ny << " values of z" << std::endl;
378  AMREX_ALWAYS_ASSERT(nx > 0);
379  AMREX_ALWAYS_ASSERT(ny > 0);
380  m_xterrain.resize(nx);
381  m_yterrain.resize(ny);
382  m_zterrain.resize(nx * ny);
383  for (int n = 0; n < nx; n++) {
384  m_xterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
385  cnt++;
386  }
387  for (int n = 0; n < ny; n++) {
388  m_yterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
389  cnt++;
390  }
391  for (int n = 0; n < nx * ny; n++) {
392  m_zterrain[n] = erf_get_single_value<amrex::Real>(file,cnt);
393  cnt++;
394  }
395  }
396 
397  // Close the file after reading
398  file.close();
399  }
400 
401  amrex::ParallelDescriptor::Bcast(&nx,1,amrex::ParallelDescriptor::IOProcessorNumber());
402  amrex::ParallelDescriptor::Bcast(&ny,1,amrex::ParallelDescriptor::IOProcessorNumber());
403 
404  int nz = nx * ny;
405 
406  m_xterrain.resize(nx);
407  m_yterrain.resize(ny);
408  m_zterrain.resize(nz);
409 
410  amrex::ParallelDescriptor::Bcast(m_xterrain.data(),nx,amrex::ParallelDescriptor::IOProcessorNumber());
411  amrex::ParallelDescriptor::Bcast(m_yterrain.data(),ny,amrex::ParallelDescriptor::IOProcessorNumber());
412  amrex::ParallelDescriptor::Bcast(m_zterrain.data(),nz,amrex::ParallelDescriptor::IOProcessorNumber());
413 
414  // Copy data to the GPU
415  amrex::Gpu::DeviceVector<amrex::Real> d_xterrain(nx),d_yterrain(ny),d_zterrain(nz);
416  amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_xterrain.begin(), m_xterrain.end(), d_xterrain.begin());
417  amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_yterrain.begin(), m_yterrain.end(), d_yterrain.begin());
418  amrex::Gpu::copy(amrex::Gpu::hostToDevice, m_zterrain.begin(), m_zterrain.end(), d_zterrain.begin());
419 
420  amrex::Real* d_xt = d_xterrain.data();
421  amrex::Real* d_yt = d_yterrain.data();
422  amrex::Real* d_zt = d_zterrain.data();
423 
424  auto dx = geom.CellSizeArray();
425  auto ProbLoArr = geom.ProbLoArray();
426 
427  int ilo = geom.Domain().smallEnd(0);
428  int jlo = geom.Domain().smallEnd(1);
429  int klo = geom.Domain().smallEnd(2);
430  int ihi = geom.Domain().bigEnd(0) + 1;
431  int jhi = geom.Domain().bigEnd(1) + 1;
432 
433  amrex::Box zbx = terrain_fab.box();
434  amrex::Array4<amrex::Real> const& z_arr = terrain_fab.array();
435 
436  amrex::ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int /*k*/)
437  {
438  // Clip indices for ghost cells
439  int ii = amrex::min(amrex::max(i,ilo),ihi);
440  int jj = amrex::min(amrex::max(j,jlo),jhi);
441 
442  // Location of nodes
443  amrex::Real x = ProbLoArr[0] + ii * dx[0] + 1e-3;
444  amrex::Real y = ProbLoArr[1] + jj * dx[1] + 1e-3;
445 
446  int ind11, ind12, ind21, ind22;
447  amrex::Real x1, x2, y1, y2;
448 
449  int iindex_terrain=-1;
450  int jindex_terrain=-1;
451  // *******************************************************************
452  // NOTE: usgs-format is contiguous in x
453  // *******************************************************************
454  if (is_usgs) {
455 
456  for (int it = 0; it < ny && jindex_terrain == -1; it++) {
457  if (d_yt[it] > y) {
458  jindex_terrain = it-1;
459  }
460  }
461  if (jindex_terrain == -1) {
462  jindex_terrain = ny-1;
463  }
464 
465  int gstart = (jindex_terrain )*nx;
466  int gend = (jindex_terrain+1)*nx-1;
467  for (int it = gstart; it <= gend && iindex_terrain == -1; it++) {
468  if (d_xt[it] > x) {
469  iindex_terrain = it-gstart;
470  }
471  }
472 
473  // Define the four values to interpolate between
474  ind11 = jindex_terrain*nx + iindex_terrain; // (x1,y1)
475  ind12 = ind11+nx; // (x1,y2)
476  ind21 = ind11+1; // (x2,y1)
477  ind22 = ind12+1; // (x2,y2)
478 
479  x1 = d_xt[ind11];
480  x2 = d_xt[ind21];
481  y1 = d_yt[jindex_terrain];
482  y2 = d_yt[jindex_terrain+1];
483 
484  amrex::Real denom = (x2-x1)*(y2-y1);
485  amrex::Real w_11 = (x2-x)*(y2-y)/denom; // (x1,y1)
486  amrex::Real w_12 = (x2-x)*(y-y1)/denom; // (x1,y2)
487  amrex::Real w_21 = (x-x1)*(y2-y)/denom; // (x2,y1)
488  amrex::Real w_22 = (x-x1)*(y-y1)/denom; // (x2,y2)
489 
490  // Do bilinear interpolation
491  z_arr(i,j,klo) = w_11*d_zt[ind11] + w_12*d_zt[ind12] + w_21*d_zt[ind21] + w_22*d_zt[ind22];
492 
493  } else {
494 
495  for (int it = 0; it < ny && jindex_terrain == -1; it++) {
496  if (d_yt[it] > y) {
497  jindex_terrain = it-1;
498  }
499  }
500  if (jindex_terrain == -1) {
501  jindex_terrain = ny-1;
502  }
503 
504  for (int it = 0; it < nx && iindex_terrain == -1; it++) {
505  if (d_xt[it] > x) {
506  iindex_terrain = it-1;
507  }
508  }
509  if (iindex_terrain == -1) {
510  iindex_terrain = nx-1;
511  }
512 
513  // Define the four values to interpolate between
514  x1 = d_xt[iindex_terrain];
515  x2 = d_xt[iindex_terrain+1];
516  y1 = d_yt[jindex_terrain];
517  y2 = d_yt[jindex_terrain+1];
518 
519 #if 1
520  // *******************************************************************
521  // NOTE: this format is contiguous in y to match the AMR-Wind read
522  // *******************************************************************
523  ind11 = iindex_terrain * ny + jindex_terrain; // (x1,y1)
524  ind21 = std::min(iindex_terrain+1,nx-1) * ny + jindex_terrain; // (x2,y1)
525 
526  ind12 = iindex_terrain * ny + std::min(jindex_terrain+1,ny-1); // (x1,y2)
527  ind22 = std::min(iindex_terrain+1,nx-1) * ny + std::min(jindex_terrain+1,ny-1); // (x1,y2)
528 #else
529  // *******************************************************************
530  // NOTE: this format is contiguous in x as an alternative
531  // *******************************************************************
532 
533  ind11 = jindex_terrain * nx + iindex_terrain; // (x1,y1)
534  ind12 = std::min(jindex_terrain+1,ny-1) * nx + iindex_terrain; // (x1,y2)
535 
536  ind21 = jindex_terrain * nx + std::min(iindex_terrain+1,nx-1); // (x2,y1)
537  ind22 = std::min(jindex_terrain+1,ny-1) * nx + std::min(iindex_terrain+1,nx-1); // (x2,y2)
538 #endif
539 
540  if (iindex_terrain == nx-1 && jindex_terrain == ny-1)
541  {
542  z_arr(i,j,klo) = d_zt[ind11];
543  }
544  else if (iindex_terrain != nx-1 && jindex_terrain == ny-1)
545  {
546  amrex::Real w_11 = (x2-x); // (x1,y1)
547  amrex::Real w_21 = (x-x1); // (x2,y1)
548  amrex::Real denom = (x2-x1);
549  z_arr(i,j,klo) = (w_11*d_zt[ind11] + w_21*d_zt[ind21])/denom;
550  }
551  else if (iindex_terrain == nx-1 && jindex_terrain != ny-1)
552  {
553  amrex::Real w_11 = (y2-y); // (x1,y1)
554  amrex::Real w_12 = (y-y1); // (x1,y2)
555  amrex::Real denom = (y2-y1);
556  z_arr(i,j,klo) = (w_11*d_zt[ind11] + w_12*d_zt[ind12])/denom;
557  }
558  else
559  {
560  amrex::Real w_11 = (x2-x)*(y2-y); // (x1,y1)
561  amrex::Real w_21 = (x-x1)*(y2-y); // (x2,y1)
562  amrex::Real w_12 = (x2-x)*(y-y1); // (x1,y2)
563  amrex::Real w_22 = (x-x1)*(y-y1); // (x2,y2)
564  amrex::Real denom = (x2-x1)*(y2-y1);
565  z_arr(i,j,klo) = (w_11*d_zt[ind11] + w_12*d_zt[ind12] + w_21*d_zt[ind21] + w_22*d_zt[ind22]) / denom;
566  }
567  } // usgs?
568  });
569  }

Referenced by init_terrain_surface().

Here is the caller graph for this function:

◆ update_geostrophic_profile()

virtual void ProblemBase::update_geostrophic_profile ( const amrex::Real &  ,
amrex::Vector< amrex::Real > &  u_geos,
amrex::Gpu::DeviceVector< amrex::Real > &  d_u_geos,
amrex::Vector< amrex::Real > &  v_geos,
amrex::Gpu::DeviceVector< amrex::Real > &  d_v_geos,
const amrex::Geometry &  geom,
std::unique_ptr< amrex::MultiFab > &  z_phys_cc 
)
inlinevirtual

Function to update user-specified geostrophic wind profile.

Parameters
[in]timecurrent time
[out]u_geosgeostrophic wind profile
[out]v_geosgeostrophic wind profile
[in]geomcontainer for geometric information
[in]z_phys_ccheight coordinate at cell centers
259  {
260  if (u_geos.empty()) return;
261 
262  if (z_phys_cc) {
263  // use_terrain=1
264  amrex::Error("Geostrophic wind profile not defined for "+name()+" problem with terrain");
265  } else {
266  const int khi = geom.Domain().bigEnd()[2];
267  // const amrex::Real* prob_lo = geom.ProbLo();
268  // const auto dx = geom.CellSize();
269  for (int k = 0; k <= khi; k++)
270  {
271  // const amrex::Real z_cc = prob_lo[2] + (k+0.5)* dx[2];
272  // set RHS term of RhoTheta equation based on time, z_cc here
273  u_geos[k] = 0.0;
274  v_geos[k] = 0.0;
275  }
276  }
277 
278  // Copy from host version to device version
279  amrex::Gpu::copy(amrex::Gpu::hostToDevice, u_geos.begin(), u_geos.end(), d_u_geos.begin());
280  amrex::Gpu::copy(amrex::Gpu::hostToDevice, v_geos.begin(), v_geos.end(), d_v_geos.begin());
281  }
Here is the call graph for this function:

◆ update_rhoqt_sources()

virtual void ProblemBase::update_rhoqt_sources ( const amrex::Real &  ,
amrex::Vector< amrex::Real > &  qsrc,
amrex::Gpu::DeviceVector< amrex::Real > &  d_qsrc,
const amrex::Geometry &  geom,
std::unique_ptr< amrex::MultiFab > &  z_phys_cc 
)
inlinevirtual

Function to update user-specified moisture source terms that can vary with time and height.

Parameters
[in]timecurrent time
[out]rhoqt_sourcemoisture forcing profile
[in]geomcontainer for geometric information
[in]z_phys_ccheight coordinate at cell centers
180  {
181  if (qsrc.empty()) return;
182 
183  if (z_phys_cc) {
184  // use_terrain=1
185  amrex::Error("Moisture forcing not defined for "+name()+" problem with terrain");
186  } else {
187  const int khi = geom.Domain().bigEnd()[2];
188  // const amrex::Real* prob_lo = geom.ProbLo();
189  // const auto dx = geom.CellSize();
190  for (int k = 0; k <= khi; k++)
191  {
192  // const amrex::Real z_cc = prob_lo[2] + (k+0.5)* dx[2];
193  // set RHS term of RhoQ1 equation based on time, z_cc here
194  qsrc[k] = 0.0;
195  }
196  }
197 
198  // Copy from host version to device version
199  amrex::Gpu::copy(amrex::Gpu::hostToDevice, qsrc.begin(), qsrc.end(), d_qsrc.begin());
200  }
Here is the call graph for this function:

◆ update_rhotheta_sources()

virtual void ProblemBase::update_rhotheta_sources ( const amrex::Real &  ,
amrex::Vector< amrex::Real > &  src,
amrex::Gpu::DeviceVector< amrex::Real > &  d_src,
const amrex::Geometry &  geom,
std::unique_ptr< amrex::MultiFab > &  z_phys_cc 
)
inlinevirtual

Function to update user-specified temperature source terms that can vary with time and height.

Parameters
[in]timecurrent time
[out]rhotheta_sourceforcing profile
[in]geomcontainer for geometric information
[in]z_phys_ccheight coordinate at cell centers
143  {
144  if (src.empty()) return;
145 
146  if (z_phys_cc) {
147  // use_terrain=1
148  amrex::Error("Temperature forcing not defined for "+name()+" problem with terrain");
149  } else {
150  const int khi = geom.Domain().bigEnd()[2];
151  // const amrex::Real* prob_lo = geom.ProbLo();
152  // const auto dx = geom.CellSize();
153  for (int k = 0; k <= khi; k++)
154  {
155  // const amrex::Real z_cc = prob_lo[2] + (k+0.5)* dx[2];
156  // set RHS term of RhoTheta equation based on time, z_cc here
157  src[k] = 0.0;
158  }
159  }
160 
161  // Copy from host version to device version
162  amrex::Gpu::copy(amrex::Gpu::hostToDevice, src.begin(), src.end(), d_src.begin());
163  }
Here is the call graph for this function:

◆ update_w_subsidence()

virtual void ProblemBase::update_w_subsidence ( const amrex::Real &  ,
amrex::Vector< amrex::Real > &  wbar,
amrex::Gpu::DeviceVector< amrex::Real > &  d_wbar,
const amrex::Geometry &  geom,
std::unique_ptr< amrex::MultiFab > &  z_phys_nd 
)
inlinevirtual

Function to update the vertical velocity profile, used to add subsidence source terms for x-mom, y-mom, rho*theta, rho*Q1, and rho*Q2.

TODO: Currently, this is only called by InitData, so there is no time dependence.

Parameters
[in]timecurrent time
[out]wbarw vel forcing profile
[in]geomcontainer for geometric information
[in]z_phys_ccheight coordinate at cell centers
220  {
221  if (wbar.empty()) return;
222 
223  if (z_phys_nd) {
224  // use_terrain=1
225  amrex::Error("Moisture forcing not defined for "+name()+" problem with terrain");
226  } else {
227  const int khi = geom.Domain().bigEnd()[2];
228  // const amrex::Real* prob_lo = geom.ProbLo();
229  // const auto dx = geom.CellSize();
230  for (int k = 0; k <= khi; k++)
231  {
232  // const amrex::Real z_cc = prob_lo[2] + (k+0.5)* dx[2];
233  // set vertical velocity profile based on time, z_cc here
234  wbar[k] = 0.0;
235  }
236  }
237 
238  // Copy from host version to device version
239  amrex::Gpu::copy(amrex::Gpu::hostToDevice, wbar.begin(), wbar.end(), d_wbar.begin());
240  }
@ wbar
Definition: ERF_DataStruct.H:74
Here is the call graph for this function:

Member Data Documentation

◆ base_parms

ProbParmDefaults ProblemBase::base_parms
protected

Referenced by init_base_parms(), and init_uniform().


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