Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
amrex::EBFluxRegister Class Reference

#include <AMReX_EBFluxRegister.H>

Inheritance diagram for amrex::EBFluxRegister:
amrex::YAFluxRegisterT< MultiFab >

Public Member Functions

 EBFluxRegister ()=default
 
 EBFluxRegister (const BoxArray &fba, const BoxArray &cba, const DistributionMapping &fdm, const DistributionMapping &cdm, const Geometry &fgeom, const Geometry &cgeom, const IntVect &ref_ratio, int fine_lev, int nvar)
 Construct and immediately define the register geometry.
 
void define (const BoxArray &fba, const BoxArray &cba, const DistributionMapping &fdm, const DistributionMapping &cdm, const Geometry &fgeom, const Geometry &cgeom, const IntVect &ref_ratio, int fine_lev, int nvar)
 Define the register geometry and allocate storage.
 
void clear ()
 Deallocate all data and reset to default-constructed state.
 
void CrseAdd (const MFIter &mfi, const std::array< FArrayBox const *, 3 > &flux, const Real *dx, Real dt, const FArrayBox &volfrac, const std::array< FArrayBox const *, 3 > &areafrac, RunOn runon)
 Add coarse fluxes for tiles containing cut cells (all components).
 
void CrseAdd (const MFIter &mfi, const std::array< FArrayBox const *, 3 > &flux, const Real *dx, Real dt, const FArrayBox &volfrac, const std::array< FArrayBox const *, 3 > &areafrac, int srccomp, int destcomp, int numcomp, RunOn runon)
 Component-selective version of CrseAdd described above.
 
void FineAdd (const MFIter &mfi, const std::array< FArrayBox const *, 3 > &flux, const Real *dx, Real dt, const FArrayBox &volfrac, const std::array< FArrayBox const *, 3 > &areafrac, const FArrayBox &dm, RunOn runon)
 Add fine-level fluxes for tiles with cut cells.
 
void FineAdd (const MFIter &mfi, const std::array< FArrayBox const *, 3 > &flux, const Real *dx, Real dt, const FArrayBox &volfrac, const std::array< FArrayBox const *, 3 > &areafrac, const FArrayBox &dm, int srccomp, int destcomp, int numcomp, RunOn runon)
 Component-selective version of the re-redistributing FineAdd.
 
void FineAdd (const MFIter &mfi, const std::array< FArrayBox const *, 3 > &flux, const Real *dx, Real dt, const FArrayBox &volfrac, const std::array< FArrayBox const *, 3 > &areafrac, int srccomp, int destcomp, int numcomp, RunOn runon)
 This version does not do re-redistribution.
 
void Reflux (MultiFab &crse_state, const amrex::MultiFab &crse_vfrac, MultiFab &fine_state, const amrex::MultiFab &fine_vfrac)
 Perform reflux and re-redistribution using accumulated data.
 
void Reflux (MultiFab &crse_state, const amrex::MultiFab &crse_vfrac, MultiFab &fine_state, const amrex::MultiFab &fine_vfrac, int srccomp, int destcomp, int numcomp)
 Component-selective version of the reflux described above.
 
void Reflux (MultiFab &crse_state, const amrex::MultiFab &crse_vfrac, int srccomp, int destcomp, int numcomp)
 This version does not do re-redistribution.
 
FArrayBox * getCrseData (const MFIter &mfi)
 Access coarse accumulation buffer for the tile referenced by mfi.
 
const IArrayBox * getCrseFlag (const MFIter &mfi) const
 Flag FAB describing which coarse cells are covered/boundary/genuine.
 
void defineExtra (const BoxArray &fba, const DistributionMapping &fdm)
 Allocate auxiliary masks/data structures required on GPUs.
 
- Public Member Functions inherited from amrex::YAFluxRegisterT< MultiFab >
 YAFluxRegisterT ()=default
 Construct an empty register; call define() before use.
 
 YAFluxRegisterT (const BoxArray &fba, const BoxArray &cba, const DistributionMapping &fdm, const DistributionMapping &cdm, const Geometry &fgeom, const Geometry &cgeom, const IntVect &ref_ratio, int fine_lev, int nvar)
 Fully construct the register for a fine level.
 
void define (const BoxArray &fba, const BoxArray &cba, const DistributionMapping &fdm, const DistributionMapping &cdm, const Geometry &fgeom, const Geometry &cgeom, const IntVect &ref_ratio, int fine_lev, int nvar)
 Define the register using the same arguments as the constructor.
 
void reset ()
 Reset stored fluxes and flags before a coarse advance.
 
void clear ()
 Deallocate all data and reset to default-constructed state.
 
void CrseAdd (const MFIter &mfi, const std::array< FAB const *, 3 > &flux, const Real *dx, Real dt, RunOn runon) noexcept
 Add coarse-level fluxes for the tile indicated by mfi.
 
void CrseAdd (const MFIter &mfi, const std::array< FAB const *, 3 > &flux, const Real *dx, Real dt, int srccomp, int destcomp, int numcomp, RunOn runon) noexcept
 Add coarse-level fluxes with component slicing.
 
void FineAdd (const MFIter &mfi, const std::array< FAB const *, 3 > &flux, const Real *dx, Real dt, RunOn runon) noexcept
 Add fine-level fluxes for the tile identified by mfi.
 
void FineAdd (const MFIter &mfi, const std::array< FAB const *, 3 > &a_flux, const Real *dx, Real dt, int srccomp, int destcomp, int numcomp, RunOn runon) noexcept
 Add fine-level fluxes with component slicing.
 
void Reflux (MultiFab &state, int dc=0)
 Apply the accumulated flux divergence to the coarse MultiFab state.
 
void Reflux (MultiFab &state, int srccomp, int destcomp, int numcomp)
 Component-aware version of Reflux writing components [destcomp,destcomp+numcomp).
 
bool CrseHasWork (const MFIter &mfi) const noexcept
 Return true if coarse tile mfi abuts a coarse/fine boundary.
 
bool FineHasWork (const MFIter &mfi) const noexcept
 Return true if fine tile mfi has flux registers to update.
 
MultiFab & getFineData ()
 Mutable access to fine-side accumulation data.
 
MultiFab & getCrseData ()
 Mutable access to coarse-side accumulation data.
 
void setCrseVolume (MultiFab const *cvol)
 
void setDeterministic (bool flag)
 Enable deterministic mode for GPU operations via flag (uses deterministic reductions).
 
bool getDeterministic () const
 

Additional Inherited Members

- Public Types inherited from amrex::YAFluxRegisterT< MultiFab >
enum  CellType
 
using T = typename MF::value_type
 
using FAB = typename MF::fab_type
 
- Protected Attributes inherited from amrex::YAFluxRegisterT< MultiFab >
MultiFab m_crse_data
 
iMultiFab m_crse_flag
 
Vector< int > m_crse_fab_flag
 
MultiFab m_cfpatch
 This is built on crse/fine patches.
 
MultiFab m_cfp_mask
 
Vector< Vector< FAB * > > m_cfp_fab
 The size of this is (# of local fine grids (# of crse/fine patches for that grid))
 
Vector< int > m_cfp_localindex
 
Geometry m_fine_geom
 
Geometry m_crse_geom
 
IntVect m_ratio
 
int m_fine_level
 
int m_ncomp
 
MultiFab const * m_cvol
 
bool m_deterministic
 

Detailed Description

EBFluxRegister is used for refluxing, re-redistribution, re-refluxing, and re-re-redistribution. See Tutorials/EB/CNS for an example of using this class.

Reflux for EB is somewhat similar to non-EB. At the beginning of a coarse step, reset() is called. In MFIter for the coarse level advance, CrseAdd is called with coarse flux. There are two versions of CrseAdd, one for regular fab/tile and the other for fab/tile containing cutcells. For the cutcell version, the flux is is at centroid, not face center. The flux is not scaled. In MFIter for the fine level advance, FineAdd is called. There are also two version of FineAdd, one for regular and the other for fab/tile containing cutcells. The cutcell version also takes dm for re-redistribution explained below. After the fine level finished its time steps, Reflux is called to update the coarse cells next to the coarse/fine boundary. Note that re-redistribution is also performed in Reflux.

Re-redistribution is unfortunately more complicated. The coarse level needs to accumulate the density (e.g., g/cm^3 for mass density) loss of coarse/fine boundary cells (i.e., coarse cells on the coarse side of the coarse/fine boundary) due to redistribution from/to coarse cells covered by the fine level. If a coarse/fine boundary cell redistributes mass to a covered cell, this counts as a positive loss. Here covered means covered be the fine level, not EB. If a covered cell redistributes mass to a boundary cell, this counts as a negative loss for that boundary cell. The accumulation as the coarse level is performed on FArrayBox returned by EBFluxRegister::getCrseData(MFIter const&). EBFluxRegister also has getCrseFlag(MFIte cons&) function returning IArrayBox that contains flags for genuine coarse cell, coarse/fine boundary cells and covered cells.

The fine level in re-redistribution needs to accumulate the mass (e.g., g for density) gain of ghost cells due to redistribution from/to valid cells. The application code can use a local FArrayBox to store this and then EBFLuxRegister::FineAdd is called to add the part in ghost cells (excluding ghost cells covered by valid cells of other grids) to EBFluxRegister's internal data.

Constructor & Destructor Documentation

◆ EBFluxRegister() [1/2]

amrex::EBFluxRegister::EBFluxRegister ( )
default

◆ EBFluxRegister() [2/2]

amrex::EBFluxRegister::EBFluxRegister ( const BoxArray &  fba,
const BoxArray &  cba,
const DistributionMapping &  fdm,
const DistributionMapping &  cdm,
const Geometry &  fgeom,
const Geometry &  cgeom,
const IntVect &  ref_ratio,
int  fine_lev,
int  nvar 
)

Construct and immediately define the register geometry.

Parameters
fbaFine BoxArray.
cbaCoarse BoxArray.
fdmFine DistributionMapping.
cdmCoarse DistributionMapping.
fgeomFine Geometry.
cgeomCoarse Geometry.
ref_ratioRefinement ratio from coarse to fine.
fine_levFine level index.
nvarNumber of state components stored.

Member Function Documentation

◆ clear()

void amrex::EBFluxRegister::clear ( )

Deallocate all data and reset to default-constructed state.

◆ CrseAdd() [1/2]

void amrex::EBFluxRegister::CrseAdd ( const MFIter &  mfi,
const std::array< FArrayBox const *, 3 > &  flux,
const Real *  dx,
Real  dt,
const FArrayBox &  volfrac,
const std::array< FArrayBox const *, 3 > &  areafrac,
int  srccomp,
int  destcomp,
int  numcomp,
RunOn  runon 
)

Component-selective version of CrseAdd described above.

◆ CrseAdd() [2/2]

void amrex::EBFluxRegister::CrseAdd ( const MFIter &  mfi,
const std::array< FArrayBox const *, 3 > &  flux,
const Real *  dx,
Real  dt,
const FArrayBox &  volfrac,
const std::array< FArrayBox const *, 3 > &  areafrac,
RunOn  runon 
)

Add coarse fluxes for tiles containing cut cells (all components).

Parameters
mfiIterator identifying the coarse tile being processed.
fluxFace-centered flux arrays (centroid-centered if cut cells).
dxCell spacing.
dtCoarse time step.
volfracVolume fractions.
areafracArea-fraction arrays.
runonExecution target (CPU/GPU).

◆ define()

void amrex::EBFluxRegister::define ( const BoxArray &  fba,
const BoxArray &  cba,
const DistributionMapping &  fdm,
const DistributionMapping &  cdm,
const Geometry &  fgeom,
const Geometry &  cgeom,
const IntVect &  ref_ratio,
int  fine_lev,
int  nvar 
)

Define the register geometry and allocate storage.

Parameters mirror the constructor above.

◆ defineExtra()

void amrex::EBFluxRegister::defineExtra ( const BoxArray &  fba,
const DistributionMapping &  fdm 
)

Allocate auxiliary masks/data structures required on GPUs.

◆ FineAdd() [1/3]

void amrex::EBFluxRegister::FineAdd ( const MFIter &  mfi,
const std::array< FArrayBox const *, 3 > &  flux,
const Real *  dx,
Real  dt,
const FArrayBox &  volfrac,
const std::array< FArrayBox const *, 3 > &  areafrac,
const FArrayBox &  dm,
int  srccomp,
int  destcomp,
int  numcomp,
RunOn  runon 
)

Component-selective version of the re-redistributing FineAdd.

◆ FineAdd() [2/3]

void amrex::EBFluxRegister::FineAdd ( const MFIter &  mfi,
const std::array< FArrayBox const *, 3 > &  flux,
const Real *  dx,
Real  dt,
const FArrayBox &  volfrac,
const std::array< FArrayBox const *, 3 > &  areafrac,
const FArrayBox &  dm,
RunOn  runon 
)

Add fine-level fluxes for tiles with cut cells.

Parameters
mfiIterator identifying the fine tile being processed.
fluxCentroid fluxes on fine faces.
dxCell spacing.
dtFine time step.
volfracFine volume fractions.
areafracFine area fractions.
dmDensity/mass change (ghost-cell accumulation).
runonExecution target (CPU/GPU).

◆ FineAdd() [3/3]

void amrex::EBFluxRegister::FineAdd ( const MFIter &  mfi,
const std::array< FArrayBox const *, 3 > &  flux,
const Real *  dx,
Real  dt,
const FArrayBox &  volfrac,
const std::array< FArrayBox const *, 3 > &  areafrac,
int  srccomp,
int  destcomp,
int  numcomp,
RunOn  runon 
)

This version does not do re-redistribution.

◆ getCrseData()

FArrayBox * amrex::EBFluxRegister::getCrseData ( const MFIter &  mfi)
inline

Access coarse accumulation buffer for the tile referenced by mfi.

◆ getCrseFlag()

const IArrayBox * amrex::EBFluxRegister::getCrseFlag ( const MFIter &  mfi) const
inline

Flag FAB describing which coarse cells are covered/boundary/genuine.

◆ Reflux() [1/3]

void amrex::EBFluxRegister::Reflux ( MultiFab &  crse_state,
const amrex::MultiFab &  crse_vfrac,
int  srccomp,
int  destcomp,
int  numcomp 
)

This version does not do re-redistribution.

◆ Reflux() [2/3]

void amrex::EBFluxRegister::Reflux ( MultiFab &  crse_state,
const amrex::MultiFab &  crse_vfrac,
MultiFab &  fine_state,
const amrex::MultiFab &  fine_vfrac 
)

Perform reflux and re-redistribution using accumulated data.

Parameters
crse_stateCoarse state to be updated near coarse/fine boundaries.
crse_vfracCoarse volume fractions.
fine_stateFine state.
fine_vfracFine volume fractions.

◆ Reflux() [3/3]

void amrex::EBFluxRegister::Reflux ( MultiFab &  crse_state,
const amrex::MultiFab &  crse_vfrac,
MultiFab &  fine_state,
const amrex::MultiFab &  fine_vfrac,
int  srccomp,
int  destcomp,
int  numcomp 
)

Component-selective version of the reflux described above.


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