Skip to content

Commit 013e644

Browse files
committed
added time refinement for E
1 parent b918929 commit 013e644

File tree

5 files changed

+46
-19
lines changed

5 files changed

+46
-19
lines changed

src/amr/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ set( SOURCES_INC
1111
data/field/coarsening/field_coarsen_index_weight.hpp
1212
data/field/coarsening/coarsen_weighter.hpp
1313
data/field/coarsening/default_field_coarsener.hpp
14-
data/field/coarsening/magnetic_field_coarsener.hpp
1514
data/field/coarsening/electric_field_coarsener.hpp
1615
data/field/field_data.hpp
1716
data/field/field_data_factory.hpp

src/amr/messengers/hybrid_hybrid_messenger_strategy.hpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ namespace amr
100100

101101
template<typename Policy>
102102
using BaseCoarsenOp = FieldCoarsenOperator<GridLayoutT, GridT, Policy>;
103-
using MagneticCoarsenOp = BaseCoarsenOp<MagneticFieldCoarsener<dimension>>;
104103
using DefaultCoarsenOp = BaseCoarsenOp<DefaultFieldCoarsener<dimension>>;
105104
using ElectricFieldCoarsenOp = BaseCoarsenOp<ElectricFieldCoarsener<dimension>>;
106105

@@ -118,6 +117,7 @@ namespace amr
118117
resourcesManager_->registerResources(Jold_);
119118
resourcesManager_->registerResources(NiOld_);
120119
resourcesManager_->registerResources(ViOld_);
120+
resourcesManager_->registerResources(Eold_);
121121
}
122122

123123
virtual ~HybridHybridMessengerStrategy() = default;
@@ -138,6 +138,7 @@ namespace amr
138138
resourcesManager_->allocate(Jold_, patch, allocateTime);
139139
resourcesManager_->allocate(NiOld_, patch, allocateTime);
140140
resourcesManager_->allocate(ViOld_, patch, allocateTime);
141+
resourcesManager_->allocate(Eold_, patch, allocateTime);
141142
}
142143

143144

@@ -337,11 +338,11 @@ namespace amr
337338
// equal to that of the shared coarse face.
338339
// This means that we now need to fill ghosts and border included
339340

340-
if (!isRegriddingL0)
341-
{
342-
auto& E = hybridModel.state.electromag.E;
343-
elecGhostsRefiners_.fill(E, levelNumber, initDataTime);
344-
}
341+
// if (!isRegriddingL0)
342+
// {
343+
// auto& E = hybridModel.state.electromag.E;
344+
// elecGhostsRefiners_.fill(E, levelNumber, initDataTime);
345+
// }
345346

346347
// we now call only levelGhostParticlesOld.fill() and not .regrid()
347348
// regrid() would refine from next coarser in regions of level not overlaping
@@ -638,19 +639,23 @@ namespace amr
638639
for (auto& patch : level)
639640
{
640641
auto dataOnPatch = resourcesManager_->setOnPatch(
641-
*patch, hybridModel.state.J, hybridModel.state.ions, Jold_, NiOld_, ViOld_);
642+
*patch, hybridModel.state.electromag, hybridModel.state.J,
643+
hybridModel.state.ions, Jold_, NiOld_, ViOld_, Eold_);
642644

643645
resourcesManager_->setTime(Jold_, *patch, currentTime);
644646
resourcesManager_->setTime(NiOld_, *patch, currentTime);
645647
resourcesManager_->setTime(ViOld_, *patch, currentTime);
648+
resourcesManager_->setTime(Eold_, *patch, currentTime);
646649

647650
auto& J = hybridModel.state.J;
648651
auto& Vi = hybridModel.state.ions.velocity();
649652
auto& Ni = hybridModel.state.ions.chargeDensity();
653+
auto& E = hybridModel.state.electromag.E;
650654

651655
Jold_.copyData(J);
652656
ViOld_.copyData(Vi);
653657
NiOld_.copyData(Ni);
658+
Eold_.copyData(E);
654659
}
655660
}
656661

@@ -707,7 +712,7 @@ namespace amr
707712
double const syncTime) override
708713
{
709714
refluxSchedules[fineLevelNumber]->coarsenData();
710-
ghostRefluxedSchedules[coarserLevelNumber]->fillData(syncTime);
715+
patchGhostRefluxedSchedules[coarserLevelNumber]->fillData(syncTime);
711716
}
712717

713718
// after coarsening, domain nodes have been updated and therefore patch ghost nodes
@@ -751,11 +756,13 @@ namespace amr
751756
return keys;
752757
};
753758

754-
elecSharedNodesRefiners_.addStaticRefiners(info->ghostElectric, EfieldNodeRefineOp_,
755-
makeKeys(info->ghostElectric));
759+
elecSharedNodesRefiners_.addTimeRefiners(info->ghostElectric, info->ghostElectric,
760+
core::VecFieldNames{Jold_},
761+
EfieldNodeRefineOp_, fieldTimeOp_);
756762

757-
elecGhostsRefiners_.addStaticRefiners(info->ghostElectric, EfieldRefineOp_,
758-
makeKeys(info->ghostElectric));
763+
elecGhostsRefiners_.addTimeRefiners(info->ghostElectric, info->ghostElectric,
764+
core::VecFieldNames{Jold_}, EfieldRefineOp_,
765+
fieldTimeOp_);
759766

760767
currentSharedNodesRefiners_.addTimeRefiners(info->ghostCurrent, info->modelCurrent,
761768
core::VecFieldNames{Jold_},
@@ -814,9 +821,6 @@ namespace amr
814821

815822
void registerSyncComms(std::unique_ptr<HybridMessengerInfo> const& info)
816823
{
817-
magnetoSynchronizers_.add(info->modelMagnetic, magneticCoarseningOp_,
818-
info->modelMagnetic.vecName);
819-
820824
electroSynchronizers_.add(info->modelElectric, electricFieldCoarseningOp_,
821825
info->modelElectric.vecName);
822826

@@ -1057,6 +1061,7 @@ namespace amr
10571061
VecFieldT Jold_{stratName + "_Jold", core::HybridQuantity::Vector::J};
10581062
VecFieldT ViOld_{stratName + "_VBulkOld", core::HybridQuantity::Vector::V};
10591063
FieldT NiOld_{stratName + "_NiOld", core::HybridQuantity::Scalar::rho};
1064+
VecFieldT Eold_{stratName + "_Eold", core::HybridQuantity::Vector::E};
10601065

10611066

10621067
//! ResourceManager shared with other objects (like the HybridModel)
@@ -1154,7 +1159,6 @@ namespace amr
11541159

11551160
using CoarsenOperator_ptr = std::shared_ptr<SAMRAI::hier::CoarsenOperator>;
11561161
CoarsenOperator_ptr fieldCoarseningOp_{std::make_shared<DefaultCoarsenOp>()};
1157-
CoarsenOperator_ptr magneticCoarseningOp_{std::make_shared<MagneticCoarsenOp>()};
11581162
CoarsenOperator_ptr electricFieldCoarseningOp_{std::make_shared<ElectricFieldCoarsenOp>()};
11591163

11601164
MagneticRefinePatchStrategy<ResourcesManagerT, FieldDataT> magneticRefinePatchStrategy_{

src/amr/messengers/refiner_pool.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ namespace amr
6666
std::shared_ptr<SAMRAI::hier::TimeInterpolateOperator>& timeOp);
6767

6868

69+
void addTimeRefiners(std::vector<core::VecFieldNames> const& ghostVecs,
70+
std::vector<core::VecFieldNames> const& modelVecs,
71+
core::VecFieldNames const& oldModelVec,
72+
std::shared_ptr<RefineOperator>& refineOp,
73+
std::shared_ptr<SAMRAI::hier::TimeInterpolateOperator>& timeOp);
6974

7075
/**
7176
* add a refiner that will use time and spatial interpolation.
@@ -126,7 +131,7 @@ namespace amr
126131

127132
/** @brief executes a regridding for all quantities in the pool.*/
128133
virtual void regrid(std::shared_ptr<SAMRAI::hier::PatchHierarchy> const& hierarchy,
129-
const int levelNumber,
134+
int const levelNumber,
130135
std::shared_ptr<SAMRAI::hier::PatchLevel> const& oldLevel,
131136
double const initDataTime)
132137
{
@@ -215,6 +220,20 @@ namespace amr
215220
}
216221
}
217222

223+
template<typename ResourcesManager, RefinerType Type>
224+
void RefinerPool<ResourcesManager, Type>::addTimeRefiners(
225+
std::vector<core::VecFieldNames> const& ghostVecs,
226+
std::vector<core::VecFieldNames> const& modelVecs, core::VecFieldNames const& oldModelVec,
227+
std::shared_ptr<RefineOperator>& refineOp,
228+
std::shared_ptr<SAMRAI::hier::TimeInterpolateOperator>& timeOp)
229+
{
230+
for (std::size_t i = 0; i < ghostVecs.size(); ++i)
231+
{
232+
addTimeRefiner(ghostVecs[i], modelVecs[i], oldModelVec, refineOp, timeOp,
233+
ghostVecs[i].vecName);
234+
}
235+
}
236+
218237
template<typename ResourcesManager, RefinerType Type>
219238
void RefinerPool<ResourcesManager, Type>::addTimeRefiner(
220239
core::VecFieldNames const& ghost, core::VecFieldNames const& model,

src/amr/solvers/solver_ppc.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,12 +535,17 @@ void SolverPPC<HybridModel, AMR_Types>::average_(level_t& level, ModelViews_t& v
535535
{
536536
PHARE_LOG_SCOPE(1, "SolverPPC::average_");
537537

538+
TimeSetter setTime{views, newTime};
539+
538540
for (auto& state : views)
539541
{
540542
PHARE::core::average(state.electromag.B, state.electromagPred.B, state.electromagAvg.B);
541543
PHARE::core::average(state.electromag.E, state.electromagPred.E, state.electromagAvg.E);
542544
}
543545

546+
setTime([](auto& state) -> auto& { return state.electromagAvg.B; });
547+
setTime([](auto& state) -> auto& { return state.electromagAvg.E; });
548+
544549
// the following will fill E on all edges of all ghost cells, including those
545550
// on domain border. For level ghosts, electric field will be obtained from
546551
// next coarser level E average

tests/simulator/test_advance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ def _test_field_coarsening_via_subcycles(
437437
)
438438

439439
qties = ["rho"]
440-
qties += [f"{qty}{xyz}" for qty in ["E", "B", "V"] for xyz in ["x", "y", "z"]]
440+
qties += [f"{qty}{xyz}" for qty in ["E", "V"] for xyz in ["x", "y", "z"]]
441441
lvl_steps = global_vars.sim.level_time_steps
442442
print("LEVELSTEPS === ", lvl_steps)
443443
assert len(lvl_steps) > 1, "this test makes no sense with only 1 level"

0 commit comments

Comments
 (0)