@@ -50,7 +50,6 @@ class SolverMHD : public ISolver<AMR_Types>
50
50
public:
51
51
SolverMHD (PHARE::initializer::PHAREDict const & dict)
52
52
: ISolver<AMR_Types>{" MHDSolver" }
53
-
54
53
, fluxes_{{" rho_fx" , MHDQuantity::Scalar::ScalarFlux_x},
55
54
{" rhoV_fx" , MHDQuantity::Vector::VecFlux_x},
56
55
{" B_fx" , MHDQuantity::Vector::VecFlux_x},
@@ -73,26 +72,24 @@ class SolverMHD : public ISolver<AMR_Types>
73
72
74
73
std::string modelName () const override { return MHDModel::model_name; }
75
74
76
- void fillMessengerInfo (std::unique_ptr<amr::IMessengerInfo> const & /* info*/ ) const override {}
75
+ void fillMessengerInfo (std::unique_ptr<amr::IMessengerInfo> const & info) const override ;
77
76
78
- void registerResources (IPhysicalModel<AMR_Types>& /* model*/ ) override {}
77
+ void registerResources (IPhysicalModel<AMR_Types>& model) override ;
79
78
80
79
// TODO make this a resourcesUser
81
- void allocate (IPhysicalModel<AMR_Types>& /* model*/ , patch_t & /* patch*/ ,
82
- double const /* allocateTime*/ ) const override
83
- {
84
- }
80
+ void allocate (IPhysicalModel<AMR_Types>& model, patch_t & patch,
81
+ double const allocateTime) const override ;
85
82
86
83
void advanceLevel (hierarchy_t const & hierarchy, int const levelNumber, ISolverModelView& view,
87
84
IMessenger& fromCoarserMessenger, double const currentTime,
88
85
double const newTime) override ;
89
86
87
+ void onRegrid () override {}
90
88
91
89
std::shared_ptr<ISolverModelView> make_view (level_t & level, IPhysicalModel_t& model) override
92
90
{
93
91
/* return std::make_shared<ModelViews_t>(level, dynamic_cast<MHDModel&>(model));*/
94
- throw std::runtime_error (" no MHD model yet" );
95
- return nullptr ;
92
+ throw std::runtime_error (" SolverMHD::make_view not implemented" );
96
93
}
97
94
98
95
NO_DISCARD auto getCompileTimeResourcesViewList ()
@@ -108,19 +105,107 @@ class SolverMHD : public ISolver<AMR_Types>
108
105
private:
109
106
struct TimeSetter
110
107
{
111
- /* template <typename QuantityAccessor>*/
112
- /* void operator()(QuantityAccessor accessor) {*/
113
- /* for (auto& state : views)*/
114
- /* views.model().resourcesManager->setTime(accessor(state), *state.patch, newTime);*/
115
- /* }*/
116
- /* */
117
- /* ModelViews_t& views;*/
118
- /* double newTime;*/
108
+ template <typename QuantityAccessor>
109
+ void operator ()(QuantityAccessor accessor)
110
+ {
111
+ for (auto & state : views)
112
+ views.model ().resourcesManager ->setTime (accessor (state), *state.patch , newTime);
113
+ }
114
+
115
+ ModelViews_t& views;
116
+ double newTime;
119
117
};
120
118
};
121
119
122
120
// -----------------------------------------------------------------------------
123
121
122
+ template <typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy, typename Messenger,
123
+ typename ModelViews_t>
124
+ void SolverMHD<MHDModel, AMR_Types, TimeIntegratorStrategy, Messenger,
125
+ ModelViews_t>::registerResources(IPhysicalModel_t& model)
126
+ {
127
+ auto & mhdmodel = dynamic_cast <MHDModel&>(model);
128
+
129
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rho_fx );
130
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rhoV_fx );
131
+ mhdmodel.resourcesManager ->registerResources (fluxes_.B_fx );
132
+ mhdmodel.resourcesManager ->registerResources (fluxes_.Etot_fx );
133
+
134
+ if constexpr (dimension >= 2 )
135
+ {
136
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rho_fy );
137
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rhoV_fy );
138
+ mhdmodel.resourcesManager ->registerResources (fluxes_.B_fy );
139
+ mhdmodel.resourcesManager ->registerResources (fluxes_.Etot_fy );
140
+
141
+ if constexpr (dimension == 3 )
142
+ {
143
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rho_fz );
144
+ mhdmodel.resourcesManager ->registerResources (fluxes_.rhoV_fz );
145
+ mhdmodel.resourcesManager ->registerResources (fluxes_.B_fz );
146
+ mhdmodel.resourcesManager ->registerResources (fluxes_.Etot_fz );
147
+ }
148
+ }
149
+
150
+ evolve_.registerResources (mhdmodel);
151
+ }
152
+
153
+ template <typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy, typename Messenger,
154
+ typename ModelViews_t>
155
+ void SolverMHD<MHDModel, AMR_Types, TimeIntegratorStrategy, Messenger, ModelViews_t>::allocate(
156
+ IPhysicalModel_t& model, patch_t & patch, double const allocateTime) const
157
+
158
+ {
159
+ auto & mhdmodel = dynamic_cast <MHDModel&>(model);
160
+
161
+ mhdmodel.resourcesManager ->allocate (fluxes_.rho_fx , patch, allocateTime);
162
+ mhdmodel.resourcesManager ->allocate (fluxes_.rhoV_fx , patch, allocateTime);
163
+ mhdmodel.resourcesManager ->allocate (fluxes_.B_fx , patch, allocateTime);
164
+ mhdmodel.resourcesManager ->allocate (fluxes_.Etot_fx , patch, allocateTime);
165
+
166
+ if constexpr (dimension >= 2 )
167
+ {
168
+ mhdmodel.resourcesManager ->allocate (fluxes_.rho_fy , patch, allocateTime);
169
+ mhdmodel.resourcesManager ->allocate (fluxes_.rhoV_fy , patch, allocateTime);
170
+ mhdmodel.resourcesManager ->allocate (fluxes_.B_fy , patch, allocateTime);
171
+ mhdmodel.resourcesManager ->allocate (fluxes_.Etot_fy , patch, allocateTime);
172
+
173
+ if constexpr (dimension == 3 )
174
+ {
175
+ mhdmodel.resourcesManager ->allocate (fluxes_.rho_fz , patch, allocateTime);
176
+ mhdmodel.resourcesManager ->allocate (fluxes_.rhoV_fz , patch, allocateTime);
177
+ mhdmodel.resourcesManager ->allocate (fluxes_.B_fz , patch, allocateTime);
178
+ mhdmodel.resourcesManager ->allocate (fluxes_.Etot_fz , patch, allocateTime);
179
+ }
180
+ }
181
+
182
+ evolve_.allocate (mhdmodel, patch, allocateTime);
183
+ }
184
+
185
+ template <typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy, typename Messenger,
186
+ typename ModelViews_t>
187
+ void SolverMHD<MHDModel, AMR_Types, TimeIntegratorStrategy, Messenger,
188
+ ModelViews_t>::fillMessengerInfo(std::unique_ptr<amr::IMessengerInfo> const & info)
189
+ const
190
+
191
+ {
192
+ auto & mhdInfo = dynamic_cast <amr::MHDMessengerInfo&>(*info);
193
+
194
+ mhdInfo.ghostMagneticFluxesX .emplace_back (core::VecFieldNames (fluxes_.B_fx ));
195
+
196
+ if constexpr (dimension >= 2 )
197
+ {
198
+ mhdInfo.ghostMagneticFluxesY .emplace_back (core::VecFieldNames (fluxes_.B_fy ));
199
+
200
+ if constexpr (dimension == 3 )
201
+ {
202
+ mhdInfo.ghostMagneticFluxesZ .emplace_back (core::VecFieldNames (fluxes_.B_fz ));
203
+ }
204
+ }
205
+
206
+ evolve_.fillMessengerInfo (mhdInfo);
207
+ }
208
+
124
209
template <typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy, typename Messenger,
125
210
typename ModelViews_t>
126
211
void SolverMHD<MHDModel, AMR_Types, TimeIntegratorStrategy, Messenger, ModelViews_t>::advanceLevel(
0 commit comments