Skip to content

Commit f177c5c

Browse files
UCaromelnicolasaunai
authored andcommitted
PR comments nico
1 parent 222f4ef commit f177c5c

File tree

32 files changed

+688
-671
lines changed

32 files changed

+688
-671
lines changed

pyphare/pyphare/mock_mhd_simulator/__init__.py

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,4 @@
1-
import numpy as np
2-
3-
4-
def is_scalar(arg):
5-
return not isinstance(arg, (list, tuple)) and not is_nd_array(arg)
6-
7-
8-
def is_nd_array(arg):
9-
return isinstance(arg, np.ndarray)
10-
11-
12-
# converts scalars to array of expected size
13-
# converts lists to arrays
14-
class py_fn_wrapper:
15-
def __init__(self, fn):
16-
self.fn = fn
17-
18-
def __call__(self, *xyz):
19-
args = [np.asarray(arg) for arg in xyz]
20-
ret = self.fn(*args)
21-
if isinstance(ret, list):
22-
ret = np.asarray(ret)
23-
if is_scalar(ret):
24-
ret = np.full(len(args[-1]), ret)
25-
return ret
26-
27-
28-
# Wrap calls to user init functions to turn C++ vectors to ndarrays,
29-
# and returned ndarrays to C++ span
30-
class fn_wrapper(py_fn_wrapper):
31-
def __init__(self, fn):
32-
super().__init__(fn)
33-
34-
def __call__(self, *xyz):
35-
from pyphare.cpp import cpp_etc_lib
36-
37-
# convert numpy array to C++ SubSpan
38-
# couples vector init functions to C++
39-
return cpp_etc_lib().makePyArrayWrapper(super().__call__(*xyz))
40-
41-
42-
def clearDict():
43-
"""
44-
dict may contain dangling references from a previous simulation unless cleared
45-
"""
46-
import pybindlibs.dictator as pp
47-
48-
pp.stop()
1+
from pyphare.pharein import clearDict, fn_wrapper
492

503

514
def populateDict():

res/cmake/test.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ if (test AND ${PHARE_EXEC_LEVEL_MIN} GREATER 0) # 0 = no tests
6565
add_subdirectory(tests/functional/conservation)
6666
add_subdirectory(tests/functional/harris)
6767

68+
add_subdirectory(tests/functional/mhd_alfven2d)
69+
add_subdirectory(tests/functional/mhd_convergence)
70+
add_subdirectory(tests/functional/mhd_dispersion)
71+
add_subdirectory(tests/functional/mhd_harris)
72+
add_subdirectory(tests/functional/mhd_orszagtang)
73+
add_subdirectory(tests/functional/mhd_rotor)
74+
add_subdirectory(tests/functional/mhd_shock)
75+
6876
add_subdirectory(pyphare/pyphare_tests/test_pharesee/)
6977
add_subdirectory(pyphare/pyphare_tests/pharein/)
7078
add_subdirectory(pyphare/pyphare_tests/test_core/)

src/amr/physical_models/mhd_model.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class MHDModel : public IPhysicalModel<AMR_Types>
2929
using field_type = typename VecFieldT::field_type;
3030
using gridlayout_type = GridLayoutT;
3131

32-
static const inline std::string model_name = "MHDModel";
32+
static inline std::string const model_name = "MHDModel";
3333
static constexpr auto dimension = gridlayout_type::dimension;
3434
using resources_manager_type = amr::ResourcesManager<gridlayout_type, Grid_t>;
3535

src/amr/solvers/solver_mhd.hpp

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <type_traits>
99
#include <vector>
1010

11+
#include "core/numerics/godunov_fluxes/godunov_utils.hpp"
12+
#include "initializer/data_provider.hpp"
1113
#include "core/mhd/mhd_quantities.hpp"
1214
#include "amr/messengers/messenger.hpp"
1315
#include "amr/messengers/mhd_messenger.hpp"
@@ -23,7 +25,7 @@ namespace PHARE::solver
2325
{
2426
template<typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy,
2527
typename Messenger = amr::MHDMessenger<MHDModel>,
26-
typename ModelViews_t = MHDModelView<MHDModel>>
28+
typename ModelViews_t = Dispatchers<typename MHDModel::gridlayout_type>>
2729
class SolverMHD : public ISolver<AMR_Types>
2830
{
2931
private:
@@ -41,26 +43,28 @@ class SolverMHD : public ISolver<AMR_Types>
4143
using IPhysicalModel_t = IPhysicalModel<AMR_Types>;
4244
using IMessenger = amr::IMessenger<IPhysicalModel_t>;
4345

44-
FieldT rho_fx{"rho_fx", MHDQuantity::Scalar::ScalarFlux_x};
45-
VecFieldT rhoV_fx{"rhoV_fx", MHDQuantity::Vector::VecFlux_x};
46-
VecFieldT B_fx{"B_fx", MHDQuantity::Vector::VecFlux_x};
47-
FieldT Etot_fx{"Etot_fx", MHDQuantity::Scalar::ScalarFlux_x};
48-
49-
FieldT rho_fy{"rho_fy", MHDQuantity::Scalar::ScalarFlux_y};
50-
VecFieldT rhoV_fy{"rhoV_fy", MHDQuantity::Vector::VecFlux_y};
51-
VecFieldT B_fy{"B_fy", MHDQuantity::Vector::VecFlux_y};
52-
FieldT Etot_fy{"Etot_fy", MHDQuantity::Scalar::ScalarFlux_y};
53-
54-
FieldT rho_fz{"rho_fz", MHDQuantity::Scalar::ScalarFlux_z};
55-
VecFieldT rhoV_fz{"rhoV_fz", MHDQuantity::Vector::VecFlux_z};
56-
VecFieldT B_fz{"B_fz", MHDQuantity::Vector::VecFlux_z};
57-
FieldT Etot_fz{"Etot_fz", MHDQuantity::Scalar::ScalarFlux_z};
46+
core::AllFluxes<FieldT, VecFieldT> fluxes_;
5847

5948
TimeIntegratorStrategy evolve_;
6049

6150
public:
6251
SolverMHD(PHARE::initializer::PHAREDict const& dict)
6352
: ISolver<AMR_Types>{"MHDSolver"}
53+
54+
, fluxes_{{"rho_fx", MHDQuantity::Scalar::ScalarFlux_x},
55+
{"rhoV_fx", MHDQuantity::Vector::VecFlux_x},
56+
{"B_fx", MHDQuantity::Vector::VecFlux_x},
57+
{"Etot_fx", MHDQuantity::Scalar::ScalarFlux_x},
58+
59+
{"rho_fy", MHDQuantity::Scalar::ScalarFlux_y},
60+
{"rhoV_fy", MHDQuantity::Vector::VecFlux_y},
61+
{"B_fy", MHDQuantity::Vector::VecFlux_y},
62+
{"Etot_fy", MHDQuantity::Scalar::ScalarFlux_y},
63+
64+
{"rho_fz", MHDQuantity::Scalar::ScalarFlux_z},
65+
{"rhoV_fz", MHDQuantity::Vector::VecFlux_z},
66+
{"B_fz", MHDQuantity::Vector::VecFlux_z},
67+
{"Etot_fz", MHDQuantity::Scalar::ScalarFlux_z}}
6468
, evolve_{dict}
6569
{
6670
}
@@ -80,8 +84,8 @@ class SolverMHD : public ISolver<AMR_Types>
8084
}
8185

8286
void advanceLevel(hierarchy_t const& hierarchy, int const levelNumber, ISolverModelView& view,
83-
IMessenger& fromCoarserMessenger, const double currentTime,
84-
const double newTime) override;
87+
IMessenger& fromCoarserMessenger, double const currentTime,
88+
double const newTime) override;
8589

8690

8791
std::shared_ptr<ISolverModelView> make_view(level_t& level, IPhysicalModel_t& model) override
@@ -93,14 +97,12 @@ class SolverMHD : public ISolver<AMR_Types>
9397

9498
NO_DISCARD auto getCompileTimeResourcesViewList()
9599
{
96-
return std::forward_as_tuple(rho_fx, rhoV_fx, B_fx, Etot_fx, rho_fy, rhoV_fy, B_fy, Etot_fy,
97-
rho_fz, rhoV_fz, B_fz, Etot_fz, evolve_);
100+
return std::forward_as_tuple(fluxes_, evolve_);
98101
}
99102

100103
NO_DISCARD auto getCompileTimeResourcesViewList() const
101104
{
102-
return std::forward_as_tuple(rho_fx, rhoV_fx, B_fx, Etot_fx, rho_fy, rhoV_fy, B_fy, Etot_fy,
103-
rho_fz, rhoV_fz, B_fz, Etot_fz, evolve_);
105+
return std::forward_as_tuple(fluxes_, evolve_);
104106
}
105107

106108
private:
@@ -123,18 +125,15 @@ template<typename MHDModel, typename AMR_Types, typename TimeIntegratorStrategy,
123125
typename ModelViews_t>
124126
void SolverMHD<MHDModel, AMR_Types, TimeIntegratorStrategy, Messenger, ModelViews_t>::advanceLevel(
125127
hierarchy_t const& hierarchy, int const levelNumber, ISolverModelView& view,
126-
IMessenger& fromCoarserMessenger, const double currentTime, const double newTime)
128+
IMessenger& fromCoarserMessenger, double const currentTime, double const newTime)
127129
{
128130
PHARE_LOG_SCOPE(1, "SolverMHD::advanceLevel");
129131

130132
auto& modelView = dynamic_cast<ModelViews_t&>(view);
131133
auto& fromCoarser = dynamic_cast<Messenger&>(fromCoarserMessenger);
132134
auto level = hierarchy.getPatchLevel(levelNumber);
133135

134-
auto&& fluxes = std::forward_as_tuple(rho_fx, rhoV_fx, B_fx, Etot_fx, rho_fy, rhoV_fy, B_fy,
135-
Etot_fy, rho_fz, rhoV_fz, B_fz, Etot_fz);
136-
137-
evolve_(modelView.layouts, modelView.model().state, fluxes, fromCoarser, *level, currentTime,
136+
evolve_(modelView.layouts, modelView.model().state, fluxes_, fromCoarser, *level, currentTime,
138137
newTime);
139138
}
140139

src/amr/solvers/solver_mhd_model_view.hpp

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#include "core/numerics/constrained_transport/constrained_transport.hpp"
66
#include "core/numerics/primite_conservative_converter/to_conservative_converter.hpp"
77
#include "core/numerics/primite_conservative_converter/to_primitive_converter.hpp"
8-
#include "core/numerics/time_integrator/finite_volume_euler.hpp"
98
#include "core/numerics/ampere/ampere.hpp"
109
#include "core/numerics/faraday/faraday.hpp"
11-
#include "core/numerics/time_integrator/time_integrator_utils.hpp"
10+
#include "core/numerics/finite_volume_euler/finite_volume_euler.hpp"
11+
#include "core/numerics/time_integrator_utils.hpp"
1212

1313
namespace PHARE::solver
1414
{
@@ -56,13 +56,13 @@ class FVMethodTransformer
5656
using core_type = FVMethod<GridLayout>;
5757

5858
public:
59-
template<typename Layouts, typename StateViews, typename... Fluxes>
60-
void operator()(Layouts const& layouts, StateViews& states, Fluxes&... fluxes)
59+
template<typename Layouts, typename StateViews, typename Fluxes>
60+
void operator()(Layouts const& layouts, StateViews& states, Fluxes& fluxes)
6161
{
6262
for (std::size_t i = 0; i < layouts.size(); ++i)
6363
{
6464
auto _ = core::SetLayout(layouts[i], fvm_);
65-
fvm_(states, fluxes...);
65+
fvm_(states, fluxes);
6666
}
6767
}
6868

@@ -76,14 +76,14 @@ class FiniteVolumeEulerTransformer
7676
using core_type = PHARE::core::FiniteVolumeEuler<GridLayout>;
7777

7878
public:
79-
template<typename Layouts, typename StateViews, typename... Fluxes>
79+
template<typename Layouts, typename StateViews, typename Fluxes>
8080
void operator()(Layouts const& layouts, StateViews const& states, StateViews statesnew,
81-
double const dt, Fluxes const&... fluxes)
81+
double const dt, Fluxes const& fluxes)
8282
{
8383
for (std::size_t i = 0; i < layouts.size(); ++i)
8484
{
8585
auto _ = core::SetLayout(layouts[i], euler_);
86-
euler_(states, statesnew, dt, fluxes...);
86+
euler_(states, statesnew, dt, fluxes);
8787
}
8888
}
8989

@@ -96,13 +96,13 @@ class ConstrainedTransportTransformer
9696
using core_type = PHARE::core::ConstrainedTransport<GridLayout>;
9797

9898
public:
99-
template<typename Layout, typename StateViews, typename... Fluxes>
100-
void operator()(Layout const& layouts, StateViews& states, Fluxes const&... fluxes)
99+
template<typename Layout, typename StateViews, typename Fluxes>
100+
void operator()(Layout const& layouts, StateViews& states, Fluxes const& fluxes)
101101
{
102102
for (std::size_t i = 0; i < layouts.size(); ++i)
103103
{
104104
auto _ = core::SetLayout(layouts[i], constrained_transport_);
105-
constrained_transport_(states.E, fluxes...);
105+
constrained_transport_(states.E, fluxes);
106106
}
107107
}
108108

@@ -149,18 +149,15 @@ class RKUtilsTransformer
149149
};
150150

151151

152-
template<typename MHDModel_>
153-
class MHDModelView : public ISolverModelView
152+
template<typename GridLayout>
153+
class Dispatchers
154154
{
155155
public:
156-
using MHDModel_t = MHDModel_;
157-
using GridLayout = typename MHDModel_t::gridlayout_type;
158-
159156
using ToPrimitiveConverter_t = ToPrimitiveTransformer<GridLayout>;
160157
using ToConservativeConverter_t = ToConservativeTransformer<GridLayout>;
161158

162-
template<template<typename> typename FVMethod>
163-
using FVMethod_t = FVMethodTransformer<GridLayout, FVMethod>;
159+
template<template<typename> typename FVMethodStrategy>
160+
using FVMethod_t = FVMethodTransformer<GridLayout, FVMethodStrategy>;
164161

165162
using FiniteVolumeEuler_t = FiniteVolumeEulerTransformer<GridLayout>;
166163
using ConstrainedTransport_t = ConstrainedTransportTransformer<GridLayout>;

src/core/numerics/time_integrator/euler.hpp renamed to src/amr/solvers/time_integrator/euler.hpp

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
#include "initializer/data_provider.hpp"
55
#include "amr/solvers/solver_mhd_model_view.hpp"
66

7-
namespace PHARE::core
7+
namespace PHARE::solver
88
{
9-
template<template<typename> typename FVMethod, typename MHDModel>
9+
template<template<typename> typename FVMethodStrategy, typename MHDModel>
1010
class Euler
1111
{
12-
using ModelView_t = solver::MHDModelView<MHDModel>;
12+
using Layout = typename MHDModel::gridlayout_type;
13+
using Dispatchers_t = Dispatchers<Layout>;
1314

14-
using FVMethod_t = ModelView_t::template FVMethod_t<FVMethod>;
15-
using FiniteVolumeEuler_t = ModelView_t::FiniteVolumeEuler_t;
16-
using ConstrainedTransport_t = ModelView_t::ConstrainedTransport_t;
17-
using Faraday_t = ModelView_t::Faraday_t;
15+
using FVMethod_t = Dispatchers_t::template FVMethod_t<FVMethodStrategy>;
16+
using FiniteVolumeEuler_t = Dispatchers_t::FiniteVolumeEuler_t;
17+
using ConstrainedTransport_t = Dispatchers_t::ConstrainedTransport_t;
18+
using Faraday_t = Dispatchers_t::Faraday_t;
1819

19-
using ToPrimitiveConverter_t = ModelView_t::ToPrimitiveConverter_t;
20-
using ToConservativeConverter_t = ModelView_t::ToConservativeConverter_t;
20+
using ToPrimitiveConverter_t = Dispatchers_t::ToPrimitiveConverter_t;
21+
using ToConservativeConverter_t = Dispatchers_t::ToConservativeConverter_t;
2122

2223
public:
2324
Euler(PHARE::initializer::PHAREDict const& dict)
@@ -37,41 +38,32 @@ class Euler
3738

3839
bc.fillMomentsGhosts(state, level, newTime);
3940

40-
std::apply(
41-
[&](auto&&... fluxArgs) {
42-
fvm_(layouts, state, std::forward<decltype(fluxArgs)>(fluxArgs)...);
41+
fvm_(layouts, state, fluxes);
4342

44-
// unecessary if we decide to store both primitive and conservative variables
45-
to_conservative_(layouts, state);
43+
// unecessary if we decide to store both primitive and conservative variables
44+
to_conservative_(layouts, state);
4645

47-
fv_euler_(layouts, state, statenew, dt,
48-
std::forward<decltype(fluxArgs)>(fluxArgs)...);
49-
},
50-
fluxes);
46+
fv_euler_(layouts, state, statenew, dt, fluxes);
5147

52-
auto& B_fx = std::get<2>(fluxes);
48+
auto& B_fx = fluxes.B_fx;
5349

5450
bc.fillMagneticFluxGhosts(B_fx, level, newTime);
5551

5652
if constexpr (MHDModel::dimension >= 2)
5753
{
58-
auto& B_fy = std::get<6>(fluxes);
54+
auto& B_fy = fluxes.B_fy;
5955

6056
bc.fillMagneticFluxGhosts(B_fy, level, newTime);
6157

6258
if constexpr (MHDModel::dimension == 3)
6359
{
64-
auto& B_fz = std::get<10>(fluxes);
60+
auto& B_fz = fluxes.B_fz;
6561

6662
bc.fillMagneticFluxGhosts(B_fz, level, newTime);
6763
}
6864
}
6965

70-
std::apply(
71-
[&](auto&&... fluxArgs) {
72-
ct_(layouts, state, std::forward<decltype(fluxArgs)>(fluxArgs)...);
73-
},
74-
fluxes);
66+
ct_(layouts, state, fluxes);
7567

7668
bc.fillElectricGhosts(state.E, level, newTime);
7769

@@ -86,6 +78,6 @@ class Euler
8678
ToPrimitiveConverter_t to_primitive_;
8779
ToConservativeConverter_t to_conservative_;
8880
};
89-
} // namespace PHARE::core
81+
} // namespace PHARE::solver
9082

9183
#endif

src/core/numerics/time_integrator/euler_integrator.hpp renamed to src/amr/solvers/time_integrator/euler_integrator.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
#define PHARE_CORE_NUMERICS_EULER_INTEGRATOR_HPP
33

44
#include "initializer/data_provider.hpp"
5-
#include "core/numerics/time_integrator/euler.hpp"
5+
#include "amr/solvers/time_integrator/euler.hpp"
66

7-
namespace PHARE::core
7+
namespace PHARE::solver
88
{
9-
template<template<typename> typename FVMethod, typename MHDModel>
9+
template<template<typename> typename FVMethodStrategy, typename MHDModel>
1010
class EulerIntegrator
1111
{
1212
public:
@@ -22,8 +22,8 @@ class EulerIntegrator
2222
}
2323

2424
private:
25-
Euler<FVMethod, MHDModel> euler_;
25+
Euler<FVMethodStrategy, MHDModel> euler_;
2626
};
27-
} // namespace PHARE::core
27+
} // namespace PHARE::solver
2828

2929
#endif

0 commit comments

Comments
 (0)