Skip to content

Commit bdf8576

Browse files
committed
++
1 parent 7929635 commit bdf8576

File tree

8 files changed

+165
-74
lines changed

8 files changed

+165
-74
lines changed

src/amr/data/electromag/electromag_initializer.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#ifndef _PHARE_AMR_DATA_ELECTROMAG_ELECTROMAG_INITIALIZER_HPP_
22
#define _PHARE_AMR_DATA_ELECTROMAG_ELECTROMAG_INITIALIZER_HPP_
33

4-
// #include "core/data/electromag/electromag.hpp"
5-
64
#include "core/data/vecfield/vecfield_initializer.hpp"
75
#include "amr/data/field/initializers/samrai_hdf5_field_initializer.hpp"
86
#include "initializer/data_provider.hpp"

src/amr/data/field/initializers/samrai_hdf5_field_initializer.hpp

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,64 @@ class SamraiHDF5FieldInitializer // no virtual classes needed (yet)
4040
};
4141

4242

43-
4443
template<typename Field_t, typename GridLayout>
4544
void SamraiHDF5FieldInitializer<Field_t, GridLayout>::load(Field_t& field,
4645
GridLayout const& layout) const
4746
{
48-
PHARE_LOG_LINE_STR("SamraiHDF5FieldInitializer::loadParticles");
47+
bool static constexpr c_ordering = false;
48+
49+
auto const local_cell = [&](auto const& box, auto const& point) {
50+
core::Point<std::uint32_t, dimension> localPoint;
51+
auto localStart = layout.physicalStartIndex(core::QtyCentering::dual, core::Direction::X);
52+
for (std::size_t i = 0; i < dimension; ++i)
53+
localPoint[i] = point[i] - (box.lower[i] - localStart);
54+
return localPoint;
55+
};
56+
57+
PHARE_LOG_LINE_STR("SamraiHDF5FieldInitializer::load");
58+
59+
auto const& dest_box = grow(layout.AMRBox(), GridLayout::nbrGhosts());
60+
auto const& overlaps = SamraiH5Interface<GridLayout>::INSTANCE().box_intersections(dest_box);
61+
62+
PHARE_LOG_LINE_STR(layout.AMRBox());
63+
for (auto const& [h5FilePtr, pdataptr] : overlaps)
64+
{
65+
auto& h5File = *h5FilePtr;
66+
auto& pdata = *pdataptr;
67+
PHARE_LOG_LINE_STR(pdata.box);
68+
auto const src_box = grow(pdata.box, GridLayout::nbrGhosts());
69+
70+
std::vector<double> data;
71+
std::string const fieldpath
72+
= pdata.base_path + "/" + field.name() + "##default/field_" + field.name();
73+
h5File.file().getDataSet(fieldpath).read(data);
74+
75+
core::Box<std::uint32_t, GridLayout::dimension> const lcl_src_box{
76+
core::Point{core::ConstArray<std::uint32_t, GridLayout::dimension>()},
77+
core::Point{
78+
core::for_N<GridLayout::dimension, core::for_N_R_mode::make_array>([&](auto i) {
79+
return static_cast<std::uint32_t>(src_box.upper[i] - src_box.lower[i] + 1);
80+
})}};
81+
82+
auto data_view = core::make_array_view<c_ordering>(data.data(), *lcl_src_box.shape());
83+
auto dst_iter = dest_box.begin();
84+
auto src_iter = src_box.begin();
85+
for (; src_iter != src_box.end(); ++src_iter)
86+
{
87+
if (isIn(core::Point{*src_iter}, dest_box))
88+
{
89+
while (*dst_iter != *src_iter)
90+
++dst_iter;
91+
field(local_cell(dest_box, *dst_iter)) = data_view(local_cell(src_box, *src_iter));
92+
93+
PHARE_LOG_LINE_STR(*src_iter);
94+
PHARE_LOG_LINE_STR(*dst_iter);
95+
96+
PHARE_LOG_LINE_STR(field(local_cell(dest_box, *dst_iter)));
97+
PHARE_LOG_LINE_STR(data_view(local_cell(src_box, *src_iter)));
98+
}
99+
}
100+
}
49101
}
50102

51103

src/amr/data/initializers/samrai_hdf5_initializer.hpp

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,32 @@
2525
namespace PHARE::amr
2626
{
2727

28-
/*
29-
example paths
28+
template<std::size_t dim>
29+
struct SamraiH5PatchDataInfo
30+
{
31+
using Box_t = core::Box<int, dim>;
3032

31-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/d_box
32-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/d_ghost_box
33-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/d_ghosts
34-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/d_timestamp
35-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/domainParticles_charge
36-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/domainParticles_delta
37-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/domainParticles_iCell
38-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/domainParticles_v
39-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/protons##default/domainParticles_weight
33+
SamraiH5PatchDataInfo(Box_t const& b, std::string const& p)
34+
: box{b}
35+
, base_path{p}
36+
{
37+
}
4038

4139

42-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_y##default/d_box
43-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_x##default/field_EM_B_x
44-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_y##default/field_EM_B_y
45-
/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_z##default/field_EM_B_z
46-
*/
40+
Box_t const box;
41+
std::string const base_path;
42+
};
43+
4744

4845

49-
template<typename ParticleArray, typename GridLayout>
46+
template<typename GridLayout>
5047
class SamraiH5Interface
5148
{
52-
struct SamraiHDF5File; // : PHARE::hdf5::h5::HighFiveFile;
49+
struct SamraiHDF5File;
5350

5451
public:
52+
using Box_t = core::Box<int, GridLayout::dimension>;
53+
5554
static SamraiH5Interface& INSTANCE()
5655
{
5756
static SamraiH5Interface i;
@@ -69,18 +68,29 @@ class SamraiH5Interface
6968
+ "/proc." + SAMRAI::tbox::Utilities::processorToString(rank);
7069
}
7170

71+
auto box_intersections(Box_t const& box)
72+
{
73+
using Pair = std::pair<SamraiHDF5File const* const,
74+
SamraiH5PatchDataInfo<GridLayout::dimension> const* const>;
75+
std::vector<Pair> overlaps;
76+
for (auto const& h5File : restart_files)
77+
for (auto const& patch : h5File->patches)
78+
if (auto const intersection = box * patch.box)
79+
overlaps.emplace_back(h5File.get(), &patch);
80+
return overlaps;
81+
}
82+
7283

7384

7485
private:
7586
std::vector<std::unique_ptr<SamraiHDF5File>> restart_files;
7687
std::unordered_map<std::string, std::string> box2dataset;
7788
};
7889

79-
template<typename ParticleArray, typename GridLayout>
80-
struct SamraiH5Interface<ParticleArray, GridLayout>::SamraiHDF5File : public hdf5::h5::HighFiveFile
90+
template<typename GridLayout>
91+
struct SamraiH5Interface<GridLayout>::SamraiHDF5File : public hdf5::h5::HighFiveFile
8192
{
8293
using Super = hdf5::h5::HighFiveFile;
83-
using Box_t = core::Box<int, ParticleArray::dimension>;
8494

8595
SamraiHDF5File(std::string const& filepath)
8696
: Super{filepath, HighFive::File::ReadOnly, /*para=*/false}
@@ -119,6 +129,8 @@ struct SamraiH5Interface<ParticleArray, GridLayout>::SamraiHDF5File : public hdf
119129
}
120130
*/
121131

132+
133+
122134
struct BoxData
123135
{
124136
std::int32_t dim;
@@ -149,43 +161,38 @@ struct SamraiH5Interface<ParticleArray, GridLayout>::SamraiHDF5File : public hdf
149161
assert(boxes.size() == 1);
150162

151163
// auto const& bx = boxes[0];
152-
// return Box_t{core::as_sized_array<ParticleArray::dimension>(bx.lo0, bx.lo1, bx.lo2),
153-
// core::as_sized_array<ParticleArray::dimension>(bx.hi0, bx.hi1, bx.hi2)};
164+
// return Box_t{core::as_sized_array<GridLayout::dimension>(bx.lo0, bx.lo1, bx.lo2),
165+
// core::as_sized_array<GridLayout::dimension>(bx.hi0, bx.hi1, bx.hi2)};
154166

155-
return Box_t{core::sized_array<ParticleArray::dimension>(boxes[0].lo),
156-
core::sized_array<ParticleArray::dimension>(boxes[0].hi)};
167+
return Box_t{core::sized_array<GridLayout::dimension>(boxes[0].lo),
168+
core::sized_array<GridLayout::dimension>(boxes[0].hi)};
157169
}
170+
171+
std::vector<SamraiH5PatchDataInfo<GridLayout::dimension>> patches;
158172
};
159173

160174

161175

162-
template<typename ParticleArray, typename GridLayout>
163-
void SamraiH5Interface<ParticleArray, GridLayout>::populate_from(std::string const& dir,
164-
int const& idx,
165-
int const& mpi_size)
176+
177+
template<typename GridLayout>
178+
void SamraiH5Interface<GridLayout>::populate_from(std::string const& dir, int const& idx,
179+
int const& mpi_size)
166180
{
181+
Box_t const mock{{0}, {99}};
167182
for (int rank = 0; rank < mpi_size; ++rank)
168183
{
169184
auto const hdf5_filepath = getRestartFileFullPath(dir, idx, mpi_size, rank);
170-
171-
hdf5::h5::HighFiveFile h5File{hdf5_filepath, HighFive::File::ReadOnly, /*para=*/false};
172-
173-
PHARE_LOG_LINE_STR("SamraiH5Interface::populate_from");
174-
175-
auto groups = h5File.scan_for_groups({"level_0000", "domainParticles_charge"});
176-
177-
for (auto const& g : groups)
185+
auto& h5File = *restart_files.emplace_back(std::make_unique<SamraiHDF5File>(hdf5_filepath));
186+
for (auto const& group : h5File.scan_for_groups({"level_0000", "field_EM_B_x"}))
178187
{
179-
PHARE_LOG_LINE_STR(g);
188+
auto const em_path = group.substr(0, group.rfind("/"));
189+
h5File.patches.emplace_back(mock, em_path.substr(0, em_path.rfind("/")));
180190
}
181-
182-
restart_files.emplace_back(std::make_unique<SamraiHDF5File>(hdf5_filepath));
183191
}
184192
}
185193

186194

187195

188-
189196
} // namespace PHARE::amr
190197

191198

src/amr/data/particles/initializers/particle_initializer_factory.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ namespace amr
9494
int const mpi_size = dict["mpi_size"].template to<int>();
9595

9696
// scan restart files for later use
97-
SamraiH5Interface<ParticleArray, GridLayout>::INSTANCE().populate_from(dir, index,
98-
mpi_size);
97+
SamraiH5Interface<GridLayout>::INSTANCE().populate_from(dir, index, mpi_size);
9998

10099
return std::make_unique<SamraiHDF5ParticleInitializer<ParticleArray, GridLayout>>();
101100
}

src/amr/data/particles/initializers/samrai_hdf5_particle_initializer.hpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,23 @@
66
#include <cassert>
77
#include <functional>
88

9+
#include "core/def.hpp"
10+
#include "core/logger.hpp"
11+
#include "core/utilities/box/box.hpp"
12+
913
#include "core/data/grid/gridlayoutdefs.hpp"
1014
#include "core/hybrid/hybrid_quantities.hpp"
1115
#include "core/utilities/types.hpp"
1216
#include "core/data/ions/particle_initializers/particle_initializer.hpp"
1317
#include "core/data/particles/particle.hpp"
1418
#include "initializer/data_provider.hpp"
1519
#include "core/utilities/point/point.hpp"
16-
#include "core/def.hpp"
17-
#include "core/logger.hpp"
1820

19-
#include "hdf5/detail/h5/h5_file.hpp"
2021

22+
#include "hdf5/detail/h5/h5_file.hpp"
2123

22-
#include "SAMRAI/hier/PatchDataRestartManager.h"
24+
#include "core/data/particles/particle_packer.hpp"
25+
#include "amr/data/field/initializers/samrai_hdf5_field_initializer.hpp"
2326

2427

2528
namespace PHARE::amr
@@ -48,7 +51,38 @@ template<typename ParticleArray, typename GridLayout>
4851
void SamraiHDF5ParticleInitializer<ParticleArray, GridLayout>::loadParticles(
4952
ParticleArray& particles, GridLayout const& layout, std::string const& popname) const
5053
{
54+
using Packer = core::ParticlePacker<ParticleArray::dimension>;
5155
PHARE_LOG_LINE_STR("SamraiHDF5ParticleInitializer::loadParticles");
56+
PHARE_LOG_LINE_SS(popname << " " << layout.AMRBox());
57+
58+
auto const& dest_box = layout.AMRBox();
59+
60+
auto const& overlaps = SamraiH5Interface<GridLayout>::INSTANCE().box_intersections(dest_box);
61+
for (auto const& [h5FilePtr, pdataptr] : overlaps)
62+
{
63+
auto& h5File = *h5FilePtr;
64+
auto& pdata = *pdataptr;
65+
std::string const poppath = pdata.base_path + "/" + popname + "##default/domainParticles_";
66+
core::ContiguousParticles<ParticleArray::dimension> soa{0};
67+
68+
{
69+
std::size_t part_idx = 0;
70+
core::apply(soa.as_tuple(), [&](auto& arg) {
71+
auto const datapath = poppath + Packer::keys()[part_idx++];
72+
PHARE_LOG_LINE_STR("SamraiHDF5ParticleInitializer::loadParticles");
73+
PHARE_LOG_LINE_STR(datapath);
74+
h5File.file().getDataSet(datapath).read(arg);
75+
PHARE_LOG_LINE_STR("SamraiHDF5ParticleInitializer::loadParticles");
76+
});
77+
}
78+
79+
for (std::size_t i = 0; i < soa.size(); ++i)
80+
if (auto const p = soa.copy(i); core::isIn(core::Point{p.iCell}, dest_box))
81+
particles.push_back(p);
82+
83+
PHARE_LOG_LINE_STR("SamraiHDF5ParticleInitializer::loadParticles");
84+
PHARE_LOG_LINE_STR(particles.size());
85+
}
5286
}
5387

5488

src/core/data/grid/gridlayout.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ namespace core
826826
* This method only deals with **cell** indexes.
827827
*/
828828
template<typename T>
829-
NO_DISCARD auto AMRToLocal(Box<T, dimension> AMRBox) const
829+
NO_DISCARD auto AMRToLocal(Box<T, dimension> const& AMRBox) const
830830
{
831831
static_assert(std::is_integral_v<T>, "Error, must be MeshIndex (integral Point)");
832832
auto localBox = Box<std::uint32_t, dimension>{};

src/hdf5/detail/h5/group_scanner.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ struct GroupScanner
2828

2929
auto& scan(std::string const& from = "/")
3030
{
31-
scan(h5.file().getGroup(from), from);
31+
// prevent double / at start of full path
32+
scan(h5.file().getGroup(from), from == "/" ? "" : from);
3233
return groups;
3334
}
3435
void scan(HighFive::Group const& group, std::string const& path)

tests/simulator/test_samrai_restarts_parser.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,27 +84,27 @@ def tearDown(self):
8484
ph.global_vars.sim = None
8585

8686
def test_restart_parser(self):
87-
h5_filepath = "phare_outputs/restarts/test/test_restarts_1/1/1/1/00000.00400/restore.000000/nodes.0000001/proc.0000000"
88-
89-
h5 = H5Content(h5_filepath)
90-
print(
91-
h5.file[
92-
"/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EMAvg_B_x##default/d_ghost_box"
93-
][:]
94-
)
95-
for k in h5.data:
96-
print(k)
97-
98-
print(
99-
"h5.file[]",
100-
h5.file[
101-
"/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_y##default/d_box"
102-
][:],
103-
)
104-
105-
# sim = ph.Simulation(**dup())
106-
# model = setup_model()
107-
# Simulator(sim).initialize()
87+
# h5_filepath = "phare_outputs/restarts/test/test_restarts_1/1/1/1/00000.00400/restore.000000/nodes.0000001/proc.0000000"
88+
89+
# h5 = H5Content(h5_filepath)
90+
# print(
91+
# h5.file[
92+
# "/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EMAvg_B_x##default/d_ghost_box"
93+
# ][:]
94+
# )
95+
# for k in h5.data:
96+
# print(k)
97+
98+
# print(
99+
# "h5.file[]",
100+
# h5.file[
101+
# "/PHARE_hierarchy/level_0000/level_0000-patch_0000000-block_0000000/EM_B_y##default/d_box"
102+
# ][:],
103+
# )
104+
105+
sim = ph.Simulation(**dup())
106+
model = setup_model()
107+
Simulator(sim).initialize()
108108

109109

110110
if __name__ == "__main__":

0 commit comments

Comments
 (0)