@@ -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
0 commit comments