Skip to content

Commit 8d6b133

Browse files
committed
added time refinement for E
1 parent 46a9458 commit 8d6b133

File tree

9 files changed

+119
-243
lines changed

9 files changed

+119
-243
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/data/field/coarsening/electric_field_coarsener.hpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
#include <SAMRAI/hier/Box.h>
10+
#include <cstddef>
1011
#include <stdexcept>
1112

1213
namespace PHARE::amr
@@ -35,7 +36,7 @@ class ElectricFieldCoarsener
3536
ElectricFieldCoarsener(std::array<core::QtyCentering, dimension> const centering,
3637
SAMRAI::hier::Box const& sourceBox,
3738
SAMRAI::hier::Box const& destinationBox,
38-
SAMRAI::hier::IntVector const& ratio)
39+
SAMRAI::hier::IntVector const& /*ratio*/)
3940
: centering_{centering}
4041
, sourceBox_{sourceBox}
4142
, destinationBox_{destinationBox}
@@ -52,15 +53,9 @@ class ElectricFieldCoarsener
5253

5354
core::Point<int, dimension> fineStartIndex;
5455

55-
fineStartIndex[dirX] = coarseIndex[dirX] * this->ratio_;
56-
57-
if constexpr (dimension > 1)
56+
for (auto i = std::size_t{0}; i < dimension; ++i)
5857
{
59-
fineStartIndex[dirY] = coarseIndex[dirY] * this->ratio_;
60-
if constexpr (dimension > 2)
61-
{
62-
fineStartIndex[dirZ] = coarseIndex[dirZ] * this->ratio_;
63-
}
58+
fineStartIndex[i] = coarseIndex[i] * this->ratio_;
6459
}
6560

6661
fineStartIndex = AMRToLocal(fineStartIndex, sourceBox_);

src/amr/data/field/coarsening/magnetic_field_coarsener.hpp

Lines changed: 0 additions & 140 deletions
This file was deleted.

src/amr/messengers/hybrid_hybrid_messenger_strategy.hpp

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "synchronizer_pool.hpp"
1717
#include "amr/data/field/coarsening/field_coarsen_operator.hpp"
1818
#include "amr/data/field/coarsening/default_field_coarsener.hpp"
19-
#include "amr/data/field/coarsening/magnetic_field_coarsener.hpp"
2019
#include "amr/data/field/coarsening/electric_field_coarsener.hpp"
2120
#include "amr/data/field/refine/field_refiner.hpp"
2221
#include "amr/data/field/refine/magnetic_field_refiner.hpp"
@@ -117,7 +116,6 @@ namespace amr
117116

118117
template<typename Policy>
119118
using BaseCoarsenOp = FieldCoarsenOperator<GridLayoutT, GridT, Policy>;
120-
using MagneticCoarsenOp = BaseCoarsenOp<MagneticFieldCoarsener<dimension>>;
121119
using DefaultCoarsenOp = BaseCoarsenOp<DefaultFieldCoarsener<dimension>>;
122120
using ElectricFieldCoarsenOp = BaseCoarsenOp<ElectricFieldCoarsener<dimension>>;
123121

@@ -343,22 +341,6 @@ namespace amr
343341
domainParticlesRefiners_.regrid(hierarchy, levelNumber, oldLevel, initDataTime);
344342

345343

346-
// regriding will fill the new level wherever it has points that overlap
347-
// old level. This will include its level border points.
348-
// These new level border points will thus take values that where previous
349-
// domain values. Magnetic flux is thus not necessarily consistent with
350-
// the Loring et al. method to sync the induction between coarse and fine faces.
351-
// Specifically, we need all fine faces to have equal magnetic field and also
352-
// equal to that of the shared coarse face.
353-
// This means that we now need to fill ghosts and border included
354-
355-
if (!isRegriddingL0)
356-
{
357-
auto& E = hybridModel.state.electromag.E;
358-
359-
elecGhostsRefiners_.fill(E, levelNumber, initDataTime);
360-
}
361-
362344
// we now call only levelGhostParticlesOld.fill() and not .regrid()
363345
// regrid() would refine from next coarser in regions of level not overlaping
364346
// oldLevel, but copy from domain particles of oldLevel where there is an
@@ -703,19 +685,23 @@ namespace amr
703685
for (auto& patch : level)
704686
{
705687
auto dataOnPatch = resourcesManager_->setOnPatch(
706-
*patch, hybridModel.state.J, hybridModel.state.ions, Jold_, NiOld_, ViOld_);
688+
*patch, hybridModel.state.electromag, hybridModel.state.J,
689+
hybridModel.state.ions, Jold_, NiOld_, ViOld_, Eold_);
707690

708691
resourcesManager_->setTime(Jold_, *patch, currentTime);
709692
resourcesManager_->setTime(NiOld_, *patch, currentTime);
710693
resourcesManager_->setTime(ViOld_, *patch, currentTime);
694+
resourcesManager_->setTime(Eold_, *patch, currentTime);
711695

712696
auto& J = hybridModel.state.J;
713697
auto& Vi = hybridModel.state.ions.velocity();
714698
auto& Ni = hybridModel.state.ions.chargeDensity();
699+
auto& E = hybridModel.state.electromag.E;
715700

716701
Jold_.copyData(J);
717702
ViOld_.copyData(Vi);
718703
NiOld_.copyData(Ni);
704+
Eold_.copyData(E);
719705
}
720706
}
721707

@@ -768,7 +754,7 @@ namespace amr
768754
double const syncTime) override
769755
{
770756
refluxSchedules[fineLevelNumber]->coarsenData();
771-
ghostRefluxedSchedules[coarserLevelNumber]->fillData(syncTime);
757+
patchGhostRefluxedSchedules[coarserLevelNumber]->fillData(syncTime);
772758
}
773759

774760
// after coarsening, domain nodes have been updated and therefore patch ghost nodes
@@ -877,9 +863,6 @@ namespace amr
877863

878864
void registerSyncComms(std::unique_ptr<HybridMessengerInfo> const& info)
879865
{
880-
magnetoSynchronizers_.add(info->modelMagnetic, magneticCoarseningOp_,
881-
info->modelMagnetic.vecName);
882-
883866
electroSynchronizers_.add(info->modelElectric, electricFieldCoarseningOp_,
884867
info->modelElectric.vecName);
885868

@@ -1120,6 +1103,7 @@ namespace amr
11201103
VecFieldT Jold_{stratName + "_Jold", core::HybridQuantity::Vector::J};
11211104
VecFieldT ViOld_{stratName + "_VBulkOld", core::HybridQuantity::Vector::V};
11221105
FieldT NiOld_{stratName + "_NiOld", core::HybridQuantity::Scalar::rho};
1106+
VecFieldT Eold_{stratName + "_Eold", core::HybridQuantity::Vector::E};
11231107

11241108
TensorFieldT sumTensor_{"PHARE_sumTensor", core::HybridQuantity::Tensor::M};
11251109
VecFieldT sumVec_{"PHARE_sumVec", core::HybridQuantity::Vector::V};
@@ -1222,7 +1206,6 @@ namespace amr
12221206

12231207
using CoarsenOperator_ptr = std::shared_ptr<SAMRAI::hier::CoarsenOperator>;
12241208
CoarsenOperator_ptr fieldCoarseningOp_{std::make_shared<DefaultCoarsenOp>()};
1225-
CoarsenOperator_ptr magneticCoarseningOp_{std::make_shared<MagneticCoarsenOp>()};
12261209
CoarsenOperator_ptr electricFieldCoarseningOp_{std::make_shared<ElectricFieldCoarsenOp>()};
12271210

12281211
MagneticRefinePatchStrategy<ResourcesManagerT, FieldDataT> magneticRefinePatchStrategy_{

src/amr/messengers/refiner_pool.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ namespace amr
9797
std::shared_ptr<SAMRAI::xfer::VariableFillPattern> fillPattern = nullptr);
9898

9999

100-
101100
/**
102101
* add a refiner that will use time and spatial interpolation.
103102
* time interpolation will be done between data represented by model and oldModel

src/amr/multiphysics_integrator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,14 +575,15 @@ namespace solver
575575
toCoarser.synchronize(fineLevel);
576576

577577
// refluxing
578+
auto& fineSolver = getSolver_(ilvl);
578579
auto iCoarseLevel = ilvl - 1;
579580
auto& coarseLevel = *hierarchy->getPatchLevel(iCoarseLevel);
580581
auto& coarseSolver = getSolver_(iCoarseLevel);
581582
auto& coarseModel = getModel_(iCoarseLevel);
582583

583584
toCoarser.reflux(iCoarseLevel, ilvl, syncTime);
584585
coarseSolver.reflux(coarseModel, coarseLevel, syncTime);
585-
coarseSolver.resetFluxSum(coarseModel, fineLevel);
586+
fineSolver.resetFluxSum(coarseModel, fineLevel);
586587

587588
// recopy (patch) ghosts
588589
toCoarser.postSynchronize(coarseModel, coarseLevel, syncTime);

src/amr/solvers/solver_ppc.hpp

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

512+
TimeSetter setTime{views, newTime};
513+
512514
for (auto& state : views)
513515
{
514516
PHARE::core::average(state.electromag.B, state.electromagPred.B, state.electromagAvg.B);
515517
PHARE::core::average(state.electromag.E, state.electromagPred.E, state.electromagAvg.E);
516518
}
517519

520+
setTime([](auto& state) -> auto& { return state.electromagAvg.B; });
521+
setTime([](auto& state) -> auto& { return state.electromagAvg.E; });
522+
518523
// the following will fill E on all edges of all ghost cells, including those
519524
// on domain border. For level ghosts, electric field will be obtained from
520525
// next coarser level E average

0 commit comments

Comments
 (0)