@@ -56,7 +56,8 @@ namespace
56
56
}
57
57
58
58
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)
60
61
{
61
62
ReadParameters ();
62
63
}
@@ -83,7 +84,6 @@ void BTDiagnostics::DerivedInitData ()
83
84
m_old_z_boost.resize (m_num_buffers);
84
85
m_buffer_counter.resize (m_num_buffers);
85
86
m_snapshot_ncells_lab.resize (m_num_buffers);
86
- m_cell_centered_data.resize (nmax_lev);
87
87
m_cell_center_functors.resize (nmax_lev);
88
88
m_max_buffer_multifabs.resize (m_num_buffers);
89
89
m_buffer_flush_counter.resize (m_num_buffers);
@@ -519,7 +519,10 @@ BTDiagnostics::DefineCellCenteredMultiFab(int lev)
519
519
#else
520
520
const int ncomps = static_cast <int >(m_cellcenter_varnames.size ());
521
521
#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);
523
526
524
527
}
525
528
@@ -540,12 +543,14 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
540
543
#else
541
544
542
545
auto & warpx = WarpX::GetInstance ();
546
+ auto & fields = warpx.m_fields ;
547
+
543
548
// Clear any pre-existing vector to release stored data
544
549
// This ensures that when domain is load-balanced, the functors point
545
550
// to the correct field-data pointers
546
551
m_all_field_functors[lev].clear ();
547
552
// 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.
549
554
// Therefore, size of functors at all levels is 1.
550
555
const int num_BT_functors = 1 ;
551
556
m_all_field_functors[lev].resize (num_BT_functors);
@@ -554,11 +559,11 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
554
559
// Create an object of class BackTransformFunctor
555
560
for (int i = 0 ; i < num_BT_functors; ++i)
556
561
{
557
- // coarsening ratio is not provided since the source MultiFab, m_cell_centered_data
562
+ // coarsening ratio is not provided since the source MultiFab
558
563
// is coarsened based on the user-defined m_crse_ratio
559
564
const int nvars = static_cast <int >(m_varnames.size ());
560
565
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,
562
567
nvars, m_num_buffers, m_varnames, m_varnames_fields);
563
568
}
564
569
@@ -570,23 +575,23 @@ BTDiagnostics::InitializeFieldFunctors (int lev)
570
575
m_cell_center_functors.at (lev).size ());
571
576
for (int comp=0 ; comp<m_cell_center_functors_at_lev_size; comp++){
572
577
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);
574
579
} 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);
576
581
} 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);
578
583
} 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);
580
585
} 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);
582
587
} 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);
584
589
} 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);
586
591
} 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);
588
593
} 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);
590
595
} else if ( m_cellcenter_varnames[comp] == " rho" ){
591
596
m_cell_center_functors[lev][comp] = std::make_unique<RhoFunctor>(lev, m_crse_ratio);
592
597
}
@@ -601,8 +606,9 @@ BTDiagnostics::UpdateVarnamesForRZopenPMD ()
601
606
{
602
607
#ifdef WARPX_DIM_RZ
603
608
auto & warpx = WarpX::GetInstance ();
609
+ auto & fields = warpx.m_fields ;
604
610
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 ();
606
612
const int ncomp = ncomp_multimodefab;
607
613
608
614
@@ -663,21 +669,22 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev)
663
669
using ablastr::fields::Direction;
664
670
665
671
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 ();
667
674
const int ncomp = ncomp_multimodefab;
668
675
// Clear any pre-existing vector to release stored data
669
676
// This ensures that when domain is load-balanced, the functors point
670
677
// to the correct field-data pointers
671
678
m_all_field_functors[lev].clear ();
672
679
// 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 .
674
681
// Therefore, size of functors at all levels is 1
675
682
const int num_BT_functors = 1 ;
676
683
m_all_field_functors[lev].resize (num_BT_functors);
677
684
for (int i = 0 ; i < num_BT_functors; ++i) {
678
685
const int nvars = static_cast <int >(m_varnames.size ());
679
686
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,
681
688
nvars, m_num_buffers, m_varnames,
682
689
m_varnames_fields);
683
690
}
@@ -689,23 +696,23 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev)
689
696
const auto m_cell_center_functors_at_lev_size = static_cast <int >(m_cell_center_functors.at (lev).size ());
690
697
for (int comp=0 ; comp<m_cell_center_functors_at_lev_size; comp++){
691
698
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);
693
700
} 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);
695
702
} 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);
697
704
} 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);
699
706
} 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);
701
708
} 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);
703
710
} 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);
705
712
} 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);
707
714
} 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);
709
716
} else if ( m_cellcenter_varnames_fields[comp] == " rho" ){
710
717
m_cell_center_functors[lev][comp] = std::make_unique<RhoFunctor>(lev, m_crse_ratio, false , -1 , false , ncomp);
711
718
}
@@ -795,6 +802,8 @@ BTDiagnostics::PrepareFieldDataForOutput ()
795
802
if (!m_do_back_transformed_fields) { return ; }
796
803
797
804
auto & warpx = WarpX::GetInstance ();
805
+ auto & fields = warpx.m_fields ;
806
+
798
807
// In this function, we will get cell-centered data for every level, lev,
799
808
// using the cell-center functors and their respective operators()
800
809
// Call m_cell_center_functors->operator
@@ -804,21 +813,23 @@ BTDiagnostics::PrepareFieldDataForOutput ()
804
813
for (int icomp = 0 ; icomp<m_cell_center_fuctors_at_lev_size; ++icomp) {
805
814
// Call all the cell-center functors in m_cell_center_functors.
806
815
// 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);
809
818
icomp_dst += m_cell_center_functors[lev][icomp]->nComp ();
810
819
}
811
820
// Check that the proper number of user-requested components are cell-centered
812
821
AMREX_ALWAYS_ASSERT ( icomp_dst == m_cellcenter_varnames.size () );
813
822
// fill boundary call is required to average_down (flatten) data to
814
823
// 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,
816
826
warpx.Geom (lev).periodicity ());
817
827
}
818
828
// Flattening out MF over levels
819
829
820
830
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 ,
822
833
static_cast <int >(m_cellcenter_varnames.size ()), 0 , WarpX::RefRatio (lev-1 ) );
823
834
}
824
835
0 commit comments