Skip to content

Commit 553d24e

Browse files
committed
cleaner magnetic ghost filling, and ssprk4_5 fix
1 parent c54cf01 commit 553d24e

File tree

7 files changed

+88
-32
lines changed

7 files changed

+88
-32
lines changed

src/amr/messengers/hybrid_hybrid_messenger_strategy.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ namespace amr
782782
for (size_t i = 0; i < info->ghostMagnetic.size(); ++i)
783783
{
784784
magGhostsRefiners_.addStaticRefiner(
785-
info->ghostMagnetic[i], BfieldRefineOp_, info->ghostMagnetic[i],
785+
info->ghostMagnetic[i], BfieldRegridOp_, info->ghostMagnetic[i],
786786
nonOverwriteInteriorTFfillPattern, magneticPatchStratPerGhostRefiner_[i]);
787787
}
788788

src/amr/messengers/mhd_messenger.hpp

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace amr
6060
using GridLayoutT = MHDModel::gridlayout_type;
6161
using GridT = MHDModel::grid_type;
6262
using ResourcesManagerT = MHDModel::resources_manager_type;
63-
using TensorFieldDataT = TensorFieldData<1, GridLayoutT, GridT, core::MHDQuantity>;
63+
using VectorFieldDataT = TensorFieldData<1, GridLayoutT, GridT, core::MHDQuantity>;
6464

6565
static constexpr auto dimension = MHDModel::dimension;
6666

@@ -320,6 +320,8 @@ namespace amr
320320
magFluxesYGhostRefiners_.registerLevel(hierarchy, level);
321321
magFluxesZGhostRefiners_.registerLevel(hierarchy, level);
322322

323+
magGhostsRefiners_.registerLevel(hierarchy, level);
324+
323325
if (levelNumber != rootLevelNumber)
324326
{
325327
// refluxing
@@ -491,6 +493,14 @@ namespace amr
491493
elecGhostsRefiners_.fill(E, level.getLevelNumber(), fillTime);
492494
}
493495

496+
void fillMagneticGhosts(VecFieldT& B, level_t const& level, double const fillTime)
497+
{
498+
PHARE_LOG_SCOPE(3, "HybridHybridMessengerStrategy::fillMagneticGhosts");
499+
500+
setNaNsOnVecfieldGhosts(B, level);
501+
magGhostsRefiners_.fill(B, level.getLevelNumber(), fillTime);
502+
}
503+
494504
void fillCurrentGhosts(VecFieldT& J, level_t const& level, double const fillTime)
495505
{
496506
setNaNsOnVecfieldGhosts(J, level);
@@ -553,6 +563,37 @@ namespace amr
553563
magFluxesZGhostRefiners_.addStaticRefiners(
554564
info->ghostMagneticFluxesZ, mhdVecFluxRefineOp_, info->ghostMagneticFluxesZ,
555565
nonOverwriteInteriorTFfillPattern);
566+
567+
// we need a separate patch strategy for each refiner so that each one can register
568+
// their required ids
569+
magneticPatchStratPerGhostRefiner_ = [&]() {
570+
std::vector<std::shared_ptr<
571+
MagneticRefinePatchStrategy<ResourcesManagerT, VectorFieldDataT>>>
572+
result;
573+
574+
result.reserve(info->ghostMagnetic.size());
575+
576+
for (auto const& key : info->ghostMagnetic)
577+
{
578+
auto&& [id] = resourcesManager_->getIDsList(key);
579+
580+
auto patch_strat = std::make_shared<
581+
MagneticRefinePatchStrategy<ResourcesManagerT, VectorFieldDataT>>(
582+
*resourcesManager_);
583+
584+
patch_strat->registerIDs(id);
585+
586+
result.push_back(patch_strat);
587+
}
588+
return result;
589+
}();
590+
591+
for (size_t i = 0; i < info->ghostMagnetic.size(); ++i)
592+
{
593+
magGhostsRefiners_.addStaticRefiner(
594+
info->ghostMagnetic[i], BfieldRegridOp_, info->ghostMagnetic[i],
595+
nonOverwriteInteriorTFfillPattern, magneticPatchStratPerGhostRefiner_[i]);
596+
}
556597
}
557598

558599

@@ -697,6 +738,8 @@ namespace amr
697738
GhostRefinerPool magFluxesYGhostRefiners_{resourcesManager_};
698739
GhostRefinerPool magFluxesZGhostRefiners_{resourcesManager_};
699740

741+
GhostRefinerPool magGhostsRefiners_{resourcesManager_};
742+
700743
InitRefinerPool densityInitRefiners_{resourcesManager_};
701744
InitRefinerPool momentumInitRefiners_{resourcesManager_};
702745
InitRefinerPool totalEnergyInitRefiners_{resourcesManager_};
@@ -772,8 +815,12 @@ namespace amr
772815
CoarsenOp_ptr mhdVecFluxCoarseningOp_{std::make_shared<MHDVecFluxCoarsenOp>()};
773816
CoarsenOp_ptr electricFieldCoarseningOp_{std::make_shared<ElectricFieldCoarsenOp>()};
774817

775-
MagneticRefinePatchStrategy<ResourcesManagerT, TensorFieldDataT>
818+
MagneticRefinePatchStrategy<ResourcesManagerT, VectorFieldDataT>
776819
magneticRefinePatchStrategy_{*resourcesManager_};
820+
821+
std::vector<
822+
std::shared_ptr<MagneticRefinePatchStrategy<ResourcesManagerT, VectorFieldDataT>>>
823+
magneticPatchStratPerGhostRefiner_;
777824
};
778825

779826
} // namespace amr

src/amr/solvers/time_integrator/euler_using_computed_flux.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class EulerUsingComputedFlux
2828

2929
faraday_(level, model, state, E, statenew, dt);
3030

31+
bc.fillMagneticGhosts(statenew.B, level, newTime);
32+
3133
bc.fillMomentsGhosts(statenew, level, newTime);
3234
}
3335

src/amr/solvers/time_integrator/ssprk4_5_integrator.hpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,40 +111,46 @@ class SSPRK4_5Integrator : public BaseMHDTimestepper<MHDModel>
111111
Super::registerResources(model);
112112
model.resourcesManager->registerResources(state1_);
113113
model.resourcesManager->registerResources(state2_);
114+
model.resourcesManager->registerResources(state3_);
115+
model.resourcesManager->registerResources(state4_);
114116
}
115117

116118
void allocate(MHDModel& model, auto& patch, double const allocateTime) const
117119
{
118120
Super::allocate(model, patch, allocateTime);
119121
model.resourcesManager->allocate(state1_, patch, allocateTime);
120122
model.resourcesManager->allocate(state2_, patch, allocateTime);
123+
model.resourcesManager->allocate(state3_, patch, allocateTime);
124+
model.resourcesManager->allocate(state4_, patch, allocateTime);
121125
}
122126

123127
void fillMessengerInfo(auto& info) const
124128
{
125-
info.ghostDensity.push_back(state1_.rho.name());
126-
info.ghostMomentum.push_back(state1_.rhoV.name());
127-
info.ghostTotalEnergy.push_back(state1_.Etot.name());
128-
info.ghostElectric.push_back(state1_.E.name());
129-
info.ghostCurrent.push_back(state1_.J.name());
130-
131-
info.ghostDensity.push_back(state2_.rho.name());
132-
info.ghostMomentum.push_back(state2_.rhoV.name());
133-
info.ghostTotalEnergy.push_back(state2_.Etot.name());
134-
info.ghostElectric.push_back(state2_.E.name());
135-
info.ghostCurrent.push_back(state2_.J.name());
129+
auto fill_info = [&](auto& state) {
130+
info.ghostDensity.push_back(state.rho.name());
131+
info.ghostMomentum.push_back(state.rhoV.name());
132+
info.ghostTotalEnergy.push_back(state.Etot.name());
133+
info.ghostElectric.push_back(state.E.name());
134+
info.ghostMagnetic.push_back(state.B.name());
135+
info.ghostCurrent.push_back(state.J.name());
136+
};
137+
138+
fill_info(state1_);
139+
fill_info(state2_);
140+
fill_info(state3_);
141+
fill_info(state4_);
136142
}
137143

138144
NO_DISCARD auto getCompileTimeResourcesViewList()
139145
{
140146
return std::tuple_cat(Super::getCompileTimeResourcesViewList(),
141-
std::forward_as_tuple(state1_, state2_));
147+
std::forward_as_tuple(state1_, state2_, state3_, state4_));
142148
}
143149

144150
NO_DISCARD auto getCompileTimeResourcesViewList() const
145151
{
146152
return std::tuple_cat(Super::getCompileTimeResourcesViewList(),
147-
std::forward_as_tuple(state1_, state2_));
153+
std::forward_as_tuple(state1_, state2_, state3_, state4_));
148154
}
149155

150156
using Super::exposeFluxes;
@@ -173,8 +179,8 @@ class SSPRK4_5Integrator : public BaseMHDTimestepper<MHDModel>
173179

174180
MHDStateT state1_{"state1"};
175181
MHDStateT state2_{"state2"};
176-
MHDStateT state3_{"state2"};
177-
MHDStateT state4_{"state2"};
182+
MHDStateT state3_{"state3"};
183+
MHDStateT state4_{"state4"};
178184
};
179185

180186
} // namespace PHARE::solver

src/amr/solvers/time_integrator/tvdrk2_integrator.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class TVDRK2Integrator : public BaseMHDTimestepper<MHDModel>
7575
info.ghostMomentum.push_back(state1_.rhoV.name());
7676
info.ghostTotalEnergy.push_back(state1_.Etot.name());
7777
info.ghostElectric.push_back(state1_.E.name());
78+
info.ghostMagnetic.push_back(state1_.B.name());
7879
info.ghostCurrent.push_back(state1_.J.name());
7980
}
8081

src/amr/solvers/time_integrator/tvdrk3_integrator.hpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,17 @@ class TVDRK3Integrator : public BaseMHDTimestepper<MHDModel>
8484

8585
void fillMessengerInfo(auto& info) const
8686
{
87-
info.ghostDensity.push_back(state1_.rho.name());
88-
info.ghostMomentum.push_back(state1_.rhoV.name());
89-
info.ghostTotalEnergy.push_back(state1_.Etot.name());
90-
info.ghostElectric.push_back(state1_.E.name());
91-
info.ghostCurrent.push_back(state1_.J.name());
92-
93-
info.ghostDensity.push_back(state2_.rho.name());
94-
info.ghostMomentum.push_back(state2_.rhoV.name());
95-
info.ghostTotalEnergy.push_back(state2_.Etot.name());
96-
info.ghostElectric.push_back(state2_.E.name());
97-
info.ghostCurrent.push_back(state2_.J.name());
87+
auto fill_info = [&](auto& state) {
88+
info.ghostDensity.push_back(state.rho.name());
89+
info.ghostMomentum.push_back(state.rhoV.name());
90+
info.ghostTotalEnergy.push_back(state.Etot.name());
91+
info.ghostElectric.push_back(state.E.name());
92+
info.ghostMagnetic.push_back(state.B.name());
93+
info.ghostCurrent.push_back(state.J.name());
94+
};
95+
96+
fill_info(state1_);
97+
fill_info(state2_);
9898
}
9999

100100
NO_DISCARD auto getCompileTimeResourcesViewList()

src/core/numerics/faraday/faraday.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ class Faraday_ref
5959
auto& Bynew = Bnew(Component::Y);
6060
auto& Bznew = Bnew(Component::Z);
6161

62-
layout_->evalOnBox(Bxnew, [&](auto&... args) mutable { BxEq_(Bx, E, Bxnew, args...); });
63-
layout_->evalOnBox(Bynew, [&](auto&... args) mutable { ByEq_(By, E, Bynew, args...); });
64-
layout_->evalOnBox(Bznew, [&](auto&... args) mutable { BzEq_(Bz, E, Bznew, args...); });
62+
layout_.evalOnBox(Bxnew, [&](auto&... args) mutable { BxEq_(Bx, E, Bxnew, args...); });
63+
layout_.evalOnBox(Bynew, [&](auto&... args) mutable { ByEq_(By, E, Bynew, args...); });
64+
layout_.evalOnBox(Bznew, [&](auto&... args) mutable { BzEq_(Bz, E, Bznew, args...); });
6565
}
6666

6767
private:

0 commit comments

Comments
 (0)