WarpX
ComputeDiagFunctor.H
Go to the documentation of this file.
1 #ifndef WARPX_COMPUTEDIAGFUNCTOR_H_
2 #define WARPX_COMPUTEDIAGFUNCTOR_H_
3 
5 #include "Utils/TextMsg.H"
6 
8 
9 #include <AMReX.H>
10 #include <AMReX_MultiFab.H>
11 
16 class
18 {
19 public:
20  ComputeDiagFunctor( int ncomp, amrex::IntVect crse_ratio) :
21  m_ncomp(ncomp), m_crse_ratio(crse_ratio) {}
22  //** Virtual Destructor to handle clean destruction of derived classes */
23  virtual ~ComputeDiagFunctor() = default;
31  virtual void operator() (amrex::MultiFab& mf_dst, int dcomp, int i_buffer = 0) const = 0;
34  int nComp () const { return m_ncomp; }
35 
52  virtual void PrepareFunctorData ( int i_buffer, bool z_slice_in_domain,
53  amrex::Real current_z_boost,
54  amrex::Box buffer_box, const int k_index_zlab,
55  const int snapshot_full) {
56  amrex::ignore_unused(i_buffer,
57  z_slice_in_domain,
58  current_z_boost, buffer_box,
59  k_index_zlab, snapshot_full);
60  }
61  virtual void InitData() {}
62 
64  amrex::MultiFab& mf_dst, const amrex::MultiFab& mf_src, int dcomp,
65  const amrex::DistributionMapping& dm, bool convertRZmodes2cartesian ) const
66  {
67 #ifdef WARPX_DIM_RZ
68  if (convertRZmodes2cartesian) {
69  // In cylindrical geometry, sum real part of all modes of mf_src in
70  // temporary MultiFab mf_dst_stag, and cell-center it to mf_dst
72  nComp()==1,
73  "The RZ averaging over modes must write into one single component");
74  amrex::MultiFab mf_dst_stag( mf_src.boxArray(), dm, 1, mf_src.nGrowVect() );
75  // Mode 0
76  amrex::MultiFab::Copy( mf_dst_stag, mf_src, 0, 0, 1, mf_src.nGrowVect() );
77  for (int ic=1 ; ic < mf_src.nComp() ; ic += 2) {
78  // Real part of all modes > 0
79  amrex::MultiFab::Add( mf_dst_stag, mf_src, ic, 0, 1, mf_src.nGrowVect() );
80  }
81  ablastr::coarsen::sample::Coarsen( mf_dst, mf_dst_stag, dcomp, 0, nComp(), 0, m_crse_ratio );
82  } else {
83  ablastr::coarsen::sample::Coarsen( mf_dst, mf_src, dcomp, 0, nComp(), 0, m_crse_ratio );
84  }
85 #else
86  // In Cartesian geometry, coarsen and interpolate from temporary MultiFab mf_src
87  // to output diagnostic MultiFab mf_dst
88  ablastr::coarsen::sample::Coarsen(mf_dst, mf_src, dcomp, 0, nComp(), mf_dst.nGrowVect(), m_crse_ratio );
89  amrex::ignore_unused(convertRZmodes2cartesian, dm);
90 #endif
91  }
92 
93 private:
95  int m_ncomp;
96 
97 protected:
100 };
101 
102 #endif // WARPX_COMPUTEDIAGFUNCTOR_H_
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition: TextMsg.H:13
Functor to compute a diagnostic and store the result in existing MultiFab.
Definition: ComputeDiagFunctor.H:18
int nComp() const
Definition: ComputeDiagFunctor.H:34
virtual void PrepareFunctorData(int i_buffer, bool z_slice_in_domain, amrex::Real current_z_boost, amrex::Box buffer_box, const int k_index_zlab, const int snapshot_full)
Prepare data required to process fields in the operator() Note that this function has parameters that...
Definition: ComputeDiagFunctor.H:52
void InterpolateMFForDiag(amrex::MultiFab &mf_dst, const amrex::MultiFab &mf_src, int dcomp, const amrex::DistributionMapping &dm, bool convertRZmodes2cartesian) const
Definition: ComputeDiagFunctor.H:63
amrex::IntVect m_crse_ratio
Definition: ComputeDiagFunctor.H:99
virtual void InitData()
Definition: ComputeDiagFunctor.H:61
ComputeDiagFunctor(int ncomp, amrex::IntVect crse_ratio)
Definition: ComputeDiagFunctor.H:20
virtual ~ComputeDiagFunctor()=default
int m_ncomp
Definition: ComputeDiagFunctor.H:95
IntVect nGrowVect() const noexcept
const BoxArray & boxArray() const noexcept
int nComp() const noexcept
static void Add(MultiFab &dst, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
static void Copy(MultiFab &dst, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
void Coarsen(amrex::MultiFab &mf_dst, const amrex::MultiFab &mf_src, const int dcomp, const int scomp, const int ncomp, const int ngrow, const amrex::IntVect crse_ratio)
Stores in the coarsened MultiFab mf_dst the values obtained by interpolating the data contained in th...
Definition: sample.cpp:82
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)