Skip to content

Commit 3a16ee3

Browse files
committed
init any core restarts
1 parent 6fb6a68 commit 3a16ee3

File tree

4 files changed

+167
-9
lines changed

4 files changed

+167
-9
lines changed

src/core/data/electromag/electromag.hpp

+16-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "initializer/data_provider.hpp"
1010
#include "core/def.hpp"
1111

12+
#include "electromag_initializer.hpp"
1213

1314
namespace PHARE
1415
{
@@ -17,34 +18,36 @@ namespace core
1718
template<typename VecFieldT>
1819
class Electromag
1920
{
21+
using This = Electromag<VecFieldT>;
22+
2023
public:
21-
static constexpr std::size_t dimension = VecFieldT::dimension;
24+
using vecfield_type = VecFieldT;
25+
auto static constexpr dimension = VecFieldT::dimension;
2226

2327
explicit Electromag(std::string name)
2428
: E{name + "_E", HybridQuantity::Vector::E}
2529
, B{name + "_B", HybridQuantity::Vector::B}
26-
, Binit_{}
2730
{
2831
}
2932

33+
3034
explicit Electromag(initializer::PHAREDict const& dict)
3135
: E{dict["name"].template to<std::string>() + "_"
3236
+ dict["electric"]["name"].template to<std::string>(),
3337
HybridQuantity::Vector::E}
3438
, B{dict["name"].template to<std::string>() + "_"
3539
+ dict["magnetic"]["name"].template to<std::string>(),
3640
HybridQuantity::Vector::B}
37-
, Binit_{dict["magnetic"]["initializer"]}
41+
, dict_{dict}
3842
{
3943
}
4044

41-
using vecfield_type = VecFieldT;
42-
4345

4446
template<typename GridLayout>
4547
void initialize(GridLayout const& layout)
4648
{
47-
Binit_.initialize(B, layout);
49+
ElectromagInitializerFactory<This, GridLayout>::create(dict_)->init(*this, layout);
50+
// dict = initializer::PHAREDict{}; // clear ?
4851
}
4952

5053

@@ -78,8 +81,14 @@ namespace core
7881
VecFieldT B;
7982

8083
private:
81-
VecFieldInitializer<dimension> Binit_;
84+
initializer::PHAREDict dict_{};
8285
};
86+
87+
8388
} // namespace core
8489
} // namespace PHARE
90+
91+
92+
93+
8594
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#ifndef _PHARE_CORE_DATA_ELECTROMAG_ELECTROMAG_INITIALIZER_HPP_
2+
#define _PHARE_CORE_DATA_ELECTROMAG_ELECTROMAG_INITIALIZER_HPP_
3+
4+
#include "initializer/data_provider.hpp"
5+
6+
#include <array>
7+
8+
9+
namespace PHARE::core
10+
{
11+
12+
template<typename Electromag_t, typename GridLayout>
13+
class ElectromagInitializer
14+
{
15+
public:
16+
virtual void init(Electromag_t& /*em*/, GridLayout const& /*layout*/) const { /*noop*/ }
17+
virtual ~ElectromagInitializer() {}
18+
};
19+
20+
template<typename Electromag_t, typename GridLayout>
21+
class ElectromagUserFuncInitializer : public ElectromagInitializer<Electromag_t, GridLayout>
22+
{
23+
public:
24+
ElectromagUserFuncInitializer(initializer::PHAREDict const& dict)
25+
: Binit_{dict["magnetic"]["initializer"]}
26+
{
27+
}
28+
virtual ~ElectromagUserFuncInitializer() {}
29+
30+
void init(Electromag_t& em, GridLayout const& layout) const override
31+
{
32+
Binit_.initialize(em.B, layout);
33+
}
34+
35+
VecFieldInitializer<Electromag_t::dimension> Binit_;
36+
};
37+
38+
39+
template<typename Electromag_t, typename GridLayout>
40+
class ElectromagInitializerFactory
41+
{
42+
public:
43+
NO_DISCARD static std::unique_ptr<ElectromagInitializer<Electromag_t, GridLayout>>
44+
create(initializer::PHAREDict const& dict)
45+
{
46+
return std::make_unique<ElectromagUserFuncInitializer<Electromag_t, GridLayout>>(dict);
47+
// else
48+
// return std::make_unique<ElectromagInitializer<Electromag_t>>();
49+
}
50+
};
51+
52+
} // namespace PHARE::core
53+
54+
#endif // _PHARE_CORE_DATA_ELECTROMAG_ELECTROMAG_INITIALIZER_HPP_

src/core/data/vecfield/vecfield_initializer.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace core
2626

2727

2828
template<typename VecField, typename GridLayout>
29-
void initialize(VecField& v, GridLayout const& layout)
29+
void initialize(VecField& v, GridLayout const& layout) const
3030
{
3131
static_assert(GridLayout::dimension == VecField::dimension,
3232
"dimension mismatch between vecfield and gridlayout");
@@ -39,7 +39,7 @@ namespace core
3939
private:
4040
template<typename Field, typename GridLayout>
4141
void initializeComponent_(Field& field, GridLayout const& layout,
42-
initializer::InitFunction<dimension> const& init)
42+
initializer::InitFunction<dimension> const& init) const
4343
{
4444
auto const indices = layout.ghostStartToEndIndices(field, /*includeEnd=*/true);
4545
auto const coords = layout.template indexesToCoordVectors</*WithField=*/true>(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import copy
2+
3+
import time
4+
import h5py
5+
import datetime
6+
import unittest
7+
import numpy as np
8+
from pathlib import Path
9+
from datetime import timedelta
10+
11+
from ddt import ddt, data, unpack
12+
13+
from pyphare.cpp import cpp_lib
14+
15+
cpp = cpp_lib()
16+
17+
import pyphare.pharein as ph
18+
from pyphare.pharesee.run import Run
19+
from pyphare.simulator.simulator import Simulator
20+
21+
from tests.simulator import SimulatorTest
22+
from tests.diagnostic import dump_all_diags
23+
from pyphare.pharesee.hierarchy.patchdata import ParticleData
24+
from pyphare.pharesee.hierarchy.fromh5 import get_all_available_quantities_from_h5
25+
26+
# ./build/tests/simulator/phare_outputs/restarts/test/test_restarts_1/1/1/1/00000.00400/restore.000000/nodes.0000001/proc.0000000
27+
28+
29+
def setup_model(ppc=100):
30+
model = ph.MaxwellianFluidModel(protons={"nbr_part_per_cell": ppc})
31+
ph.ElectronModel(closure="isothermal", Te=0.12)
32+
return model
33+
34+
35+
timestep = 0.001
36+
out = "phare_outputs/parse_restarts"
37+
simArgs = dict(
38+
time_step_nbr=2,
39+
time_step=timestep,
40+
cells=200,
41+
dl=0.3,
42+
restart_options=dict(dir=out, mode="overwrite"),
43+
)
44+
45+
46+
def traverse_h5_for_groups_recursive(h5content: "H5Content", group, path=""):
47+
if "level_0000" in path:
48+
for key in group.attrs:
49+
h5content.attr[f"{path}/{key}"] = group.attrs[key]
50+
if isinstance(group, h5py._hl.group.Group):
51+
for key in group:
52+
kpath = f"{path}/{key}"
53+
traverse_h5_for_groups_recursive(h5content, group[key], path=kpath)
54+
else:
55+
if "level_0000" not in path:
56+
return
57+
h5content.data[path] = group
58+
59+
60+
class H5Content:
61+
def __init__(self, path):
62+
self.file = h5py.File(path, "r")
63+
self.data = {}
64+
self.attr = {}
65+
traverse_h5_for_groups_recursive(self, self.file)
66+
67+
68+
@ddt
69+
class RestartsParserTest(SimulatorTest):
70+
def __init__(self, *args, **kwargs):
71+
super(RestartsParserTest, self).__init__(*args, **kwargs)
72+
self.simulator = None
73+
74+
def tearDown(self):
75+
super(RestartsParserTest, self).tearDown()
76+
if self.simulator is not None:
77+
self.simulator.reset()
78+
self.simulator = None
79+
ph.global_vars.sim = None
80+
81+
def test_restart_parser(self):
82+
h5_filepath = "phare_outputs/restarts/test/test_restarts_1/1/1/1/00000.00400/restore.000000/nodes.0000001/proc.0000000"
83+
84+
h5 = H5Content(h5_filepath)
85+
print(
86+
h5.file[
87+
"/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EMAvg_B_x##default/d_ghost_box"
88+
][:]
89+
)
90+
for k in h5.data:
91+
print(k)
92+
93+
94+
if __name__ == "__main__":
95+
unittest.main()

0 commit comments

Comments
 (0)