Skip to content

Commit 284287d

Browse files
dpgroteax3l
andauthored
Remove m_cell_centered_data from multifab map (#5322)
* Remove m_cell_centered_data from multifab map * Register cell_centered_data MultiFab * Cleaning & Member Variable Convention * Shorten: fields as variable Prepares to remove `WarpX` class altogether from here. --------- Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
1 parent d9935f4 commit 284287d

File tree

2 files changed

+45
-34
lines changed

2 files changed

+45
-34
lines changed

Source/Diagnostics/BTDiagnostics.H

+2-2
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private:
241241
* will be used by all snapshots to obtain lab-frame data at the respective
242242
* z slice location.
243243
*/
244-
amrex::Vector<std::unique_ptr<amrex::MultiFab> > m_cell_centered_data;
244+
std::string const m_cell_centered_data_name;
245245
/** Vector of pointers to compute cell-centered data, per level, per component
246246
* using the coarsening-ratio provided by the user.
247247
*/
@@ -346,7 +346,7 @@ private:
346346
* \param[in] i_buffer snapshot index
347347
*/
348348
void SetSnapshotFullStatus (int i_buffer);
349-
/** Vector of field-data stored in the cell-centered multifab, m_cell_centered_data.
349+
/** Vector of field-data stored in the cell-centered MultiFab.
350350
* All the fields are stored regardless of the specific fields to plot selected
351351
* by the user.
352352
*/

Source/Diagnostics/BTDiagnostics.cpp

+43-32
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ namespace
5656
}
5757

5858
BTDiagnostics::BTDiagnostics (int i, const std::string& name)
59-
: Diagnostics{i, name}
59+
: Diagnostics{i, name},
60+
m_cell_centered_data_name("BTD_cell_centered_data_" + name)
6061
{
6162
ReadParameters();
6263
}
@@ -83,7 +84,6 @@ void BTDiagnostics::DerivedInitData ()
8384
m_old_z_boost.resize(m_num_buffers);
8485
m_buffer_counter.resize(m_num_buffers);
8586
m_snapshot_ncells_lab.resize(m_num_buffers);
86-
m_cell_centered_data.resize(nmax_lev);
8787
m_cell_center_functors.resize(nmax_lev);
8888
m_max_buffer_multifabs.resize(m_num_buffers);
8989
m_buffer_flush_counter.resize(m_num_buffers);
@@ -519,7 +519,10 @@ BTDiagnostics::DefineCellCenteredMultiFab(int lev)
519519
#else
520520
const int ncomps = static_cast<int>(m_cellcenter_varnames.size());
521521
#endif
522-
WarpX::AllocInitMultiFab(m_cell_centered_data[lev], ba, dmap, ncomps, amrex::IntVect(ngrow), lev, "cellcentered_BTD", 0._rt);
522+
bool const remake = false;
523+
bool const redistribute_on_remake = false;
524+
warpx.m_fields.alloc_init(m_cell_centered_data_name, lev, ba, dmap, ncomps, amrex::IntVect(ngrow), 0.0_rt,
525+
remake, redistribute_on_remake);
523526

524527
}
525528

@@ -540,12 +543,14 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
540543
#else
541544

542545
auto & warpx = WarpX::GetInstance();
546+
auto & fields = warpx.m_fields;
547+
543548
// Clear any pre-existing vector to release stored data
544549
// This ensures that when domain is load-balanced, the functors point
545550
// to the correct field-data pointers
546551
m_all_field_functors[lev].clear();
547552
// For back-transformed data, all the components are cell-centered and stored
548-
// in a single multifab, m_cell_centered_data.
553+
// in a single multifab.
549554
// Therefore, size of functors at all levels is 1.
550555
const int num_BT_functors = 1;
551556
m_all_field_functors[lev].resize(num_BT_functors);
@@ -554,11 +559,11 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
554559
// Create an object of class BackTransformFunctor
555560
for (int i = 0; i < num_BT_functors; ++i)
556561
{
557-
// coarsening ratio is not provided since the source MultiFab, m_cell_centered_data
562+
// coarsening ratio is not provided since the source MultiFab
558563
// is coarsened based on the user-defined m_crse_ratio
559564
const int nvars = static_cast<int>(m_varnames.size());
560565
m_all_field_functors[lev][i] = std::make_unique<BackTransformFunctor>(
561-
m_cell_centered_data[lev].get(), lev,
566+
fields.get(m_cell_centered_data_name, lev), lev,
562567
nvars, m_num_buffers, m_varnames, m_varnames_fields);
563568
}
564569

@@ -570,23 +575,23 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
570575
m_cell_center_functors.at(lev).size());
571576
for (int comp=0; comp<m_cell_center_functors_at_lev_size; comp++){
572577
if ( m_cellcenter_varnames[comp] == "Ex" ){
573-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{0}, lev), lev, m_crse_ratio);
578+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{0}, lev), lev, m_crse_ratio);
574579
} else if ( m_cellcenter_varnames[comp] == "Ey" ){
575-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{1}, lev), lev, m_crse_ratio);
580+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{1}, lev), lev, m_crse_ratio);
576581
} else if ( m_cellcenter_varnames[comp] == "Ez" ){
577-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{2}, lev), lev, m_crse_ratio);
582+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{2}, lev), lev, m_crse_ratio);
578583
} else if ( m_cellcenter_varnames[comp] == "Bx" ){
579-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{0}, lev), lev, m_crse_ratio);
584+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{0}, lev), lev, m_crse_ratio);
580585
} else if ( m_cellcenter_varnames[comp] == "By" ){
581-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{1}, lev), lev, m_crse_ratio);
586+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{1}, lev), lev, m_crse_ratio);
582587
} else if ( m_cellcenter_varnames[comp] == "Bz" ){
583-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{2}, lev), lev, m_crse_ratio);
588+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{2}, lev), lev, m_crse_ratio);
584589
} else if ( m_cellcenter_varnames[comp] == "jx" ){
585-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp,Direction{0}, lev), lev, m_crse_ratio);
590+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp,Direction{0}, lev), lev, m_crse_ratio);
586591
} else if ( m_cellcenter_varnames[comp] == "jy" ){
587-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp,Direction{1}, lev), lev, m_crse_ratio);
592+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp,Direction{1}, lev), lev, m_crse_ratio);
588593
} else if ( m_cellcenter_varnames[comp] == "jz" ){
589-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp,Direction{2}, lev), lev, m_crse_ratio);
594+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp,Direction{2}, lev), lev, m_crse_ratio);
590595
} else if ( m_cellcenter_varnames[comp] == "rho" ){
591596
m_cell_center_functors[lev][comp] = std::make_unique<RhoFunctor>(lev, m_crse_ratio);
592597
}
@@ -601,8 +606,9 @@ BTDiagnostics::UpdateVarnamesForRZopenPMD ()
601606
{
602607
#ifdef WARPX_DIM_RZ
603608
auto & warpx = WarpX::GetInstance();
609+
auto & fields = warpx.m_fields;
604610
using ablastr::fields::Direction;
605-
const int ncomp_multimodefab = warpx.m_fields.get(FieldType::Efield_aux, Direction{0}, 0)->nComp();
611+
const int ncomp_multimodefab = fields.get(FieldType::Efield_aux, Direction{0}, 0)->nComp();
606612
const int ncomp = ncomp_multimodefab;
607613

608614

@@ -663,21 +669,22 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev)
663669
using ablastr::fields::Direction;
664670

665671
auto & warpx = WarpX::GetInstance();
666-
const int ncomp_multimodefab = warpx.m_fields.get(FieldType::Efield_aux, Direction{0}, 0)->nComp();
672+
auto & fields = warpx.m_fields;
673+
const int ncomp_multimodefab = fields.get(FieldType::Efield_aux, Direction{0}, 0)->nComp();
667674
const int ncomp = ncomp_multimodefab;
668675
// Clear any pre-existing vector to release stored data
669676
// This ensures that when domain is load-balanced, the functors point
670677
// to the correct field-data pointers
671678
m_all_field_functors[lev].clear();
672679
// For back-transformed data, all the components are cell-centered and stored
673-
// in a single multifab, m_cell_centered_data.
680+
// in a single MultiFab.
674681
// Therefore, size of functors at all levels is 1
675682
const int num_BT_functors = 1;
676683
m_all_field_functors[lev].resize(num_BT_functors);
677684
for (int i = 0; i < num_BT_functors; ++i) {
678685
const int nvars = static_cast<int>(m_varnames.size());
679686
m_all_field_functors[lev][i] = std::make_unique<BackTransformFunctor>(
680-
m_cell_centered_data[lev].get(), lev,
687+
fields.get(m_cell_centered_data_name, lev), lev,
681688
nvars, m_num_buffers, m_varnames,
682689
m_varnames_fields);
683690
}
@@ -689,23 +696,23 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev)
689696
const auto m_cell_center_functors_at_lev_size = static_cast<int>(m_cell_center_functors.at(lev).size());
690697
for (int comp=0; comp<m_cell_center_functors_at_lev_size; comp++){
691698
if ( m_cellcenter_varnames_fields[comp] == "Er" ){
692-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
699+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
693700
} else if ( m_cellcenter_varnames_fields[comp] == "Et" ){
694-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
701+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
695702
} else if ( m_cellcenter_varnames_fields[comp] == "Ez" ){
696-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Efield_aux, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
703+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Efield_aux, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
697704
} else if ( m_cellcenter_varnames_fields[comp] == "Br" ){
698-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
705+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
699706
} else if ( m_cellcenter_varnames_fields[comp] == "Bt" ){
700-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
707+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
701708
} else if ( m_cellcenter_varnames_fields[comp] == "Bz" ){
702-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::Bfield_aux, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
709+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::Bfield_aux, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
703710
} else if ( m_cellcenter_varnames_fields[comp] == "jr" ){
704-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
711+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp, Direction{0}, lev), lev, m_crse_ratio, false, ncomp);
705712
} else if ( m_cellcenter_varnames_fields[comp] == "jt" ){
706-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
713+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp, Direction{1}, lev), lev, m_crse_ratio, false, ncomp);
707714
} else if ( m_cellcenter_varnames_fields[comp] == "jz" ){
708-
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.m_fields.get(FieldType::current_fp, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
715+
m_cell_center_functors[lev][comp] = std::make_unique<CellCenterFunctor>(fields.get(FieldType::current_fp, Direction{2}, lev), lev, m_crse_ratio, false, ncomp);
709716
} else if ( m_cellcenter_varnames_fields[comp] == "rho" ){
710717
m_cell_center_functors[lev][comp] = std::make_unique<RhoFunctor>(lev, m_crse_ratio, false, -1, false, ncomp);
711718
}
@@ -795,6 +802,8 @@ BTDiagnostics::PrepareFieldDataForOutput ()
795802
if (!m_do_back_transformed_fields) { return; }
796803

797804
auto & warpx = WarpX::GetInstance();
805+
auto & fields = warpx.m_fields;
806+
798807
// In this function, we will get cell-centered data for every level, lev,
799808
// using the cell-center functors and their respective operators()
800809
// Call m_cell_center_functors->operator
@@ -804,21 +813,23 @@ BTDiagnostics::PrepareFieldDataForOutput ()
804813
for (int icomp = 0; icomp<m_cell_center_fuctors_at_lev_size; ++icomp) {
805814
// Call all the cell-center functors in m_cell_center_functors.
806815
// Each of them computes cell-centered data for a field and
807-
// stores it in cell-centered MultiFab, m_cell_centered_data[lev].
808-
m_cell_center_functors[lev][icomp]->operator()(*m_cell_centered_data[lev], icomp_dst);
816+
// stores it in cell-centered MultiFab.
817+
m_cell_center_functors[lev][icomp]->operator()(*fields.get(m_cell_centered_data_name, lev), icomp_dst);
809818
icomp_dst += m_cell_center_functors[lev][icomp]->nComp();
810819
}
811820
// Check that the proper number of user-requested components are cell-centered
812821
AMREX_ALWAYS_ASSERT( icomp_dst == m_cellcenter_varnames.size() );
813822
// fill boundary call is required to average_down (flatten) data to
814823
// the coarsest level.
815-
ablastr::utils::communication::FillBoundary(*m_cell_centered_data[lev], WarpX::do_single_precision_comms,
824+
ablastr::utils::communication::FillBoundary(*fields.get(m_cell_centered_data_name, lev),
825+
WarpX::do_single_precision_comms,
816826
warpx.Geom(lev).periodicity());
817827
}
818828
// Flattening out MF over levels
819829

820830
for (int lev = warpx.finestLevel(); lev > 0; --lev) {
821-
ablastr::coarsen::sample::Coarsen(*m_cell_centered_data[lev - 1], *m_cell_centered_data[lev], 0, 0,
831+
ablastr::coarsen::sample::Coarsen(*fields.get(m_cell_centered_data_name, lev - 1),
832+
*fields.get(m_cell_centered_data_name, lev), 0, 0,
822833
static_cast<int>(m_cellcenter_varnames.size()), 0, WarpX::RefRatio(lev-1) );
823834
}
824835

0 commit comments

Comments
 (0)