Skip to content

Commit ffccf14

Browse files
authored
single resource manager (#1072)
single resource manager
1 parent 20511e6 commit ffccf14

File tree

16 files changed

+120
-167
lines changed

16 files changed

+120
-167
lines changed

pyphare/pyphare/pharein/diagnostics.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66

77
def all_timestamps(sim):
8-
nbr_dump_step = int(sim.final_time / sim.time_step) + 1
9-
return sim.time_step * np.arange(nbr_dump_step)
8+
init_time = sim.start_time()
9+
nbr_dump_step = int((sim.final_time - init_time) / sim.time_step) + 1
10+
return (sim.time_step * np.arange(nbr_dump_step)) + init_time
1011

1112

1213
# ------------------------------------------------------------------------------

src/amr/messengers/hybrid_hybrid_messenger_strategy.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ namespace amr
116116
static constexpr std::size_t rootLevelNumber = 0;
117117

118118

119-
HybridHybridMessengerStrategy(std::shared_ptr<ResourcesManagerT> manager,
119+
HybridHybridMessengerStrategy(std::shared_ptr<ResourcesManagerT> const& manager,
120120
int const firstLevel)
121121
: HybridMessengerStrategy<HybridModel>{stratName}
122-
, resourcesManager_{std::move(manager)}
122+
, resourcesManager_{manager}
123123
, firstLevel_{firstLevel}
124124
{
125125
resourcesManager_->registerResources(Jold_);

src/amr/messengers/messenger_factory.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ class MessengerFactory
8484
{
8585
if (messengerName == HybridHybridMessengerStrategy_t::stratName)
8686
{
87-
auto resourcesManager = dynamic_cast<HybridModel const&>(coarseModel).resourcesManager;
87+
auto& resourcesManager = dynamic_cast<HybridModel const&>(coarseModel).resourcesManager;
8888

89-
auto messengerStrategy = std::make_unique<HybridHybridMessengerStrategy_t>(
90-
std::move(resourcesManager), firstLevel);
89+
auto messengerStrategy
90+
= std::make_unique<HybridHybridMessengerStrategy_t>(resourcesManager, firstLevel);
9191

9292
return std::make_unique<HybridMessenger<HybridModel>>(std::move(messengerStrategy));
9393
}
@@ -97,13 +97,15 @@ class MessengerFactory
9797
else if (messengerName == MHDHybridMessengerStrategy<MHDModel, HybridModel>::stratName)
9898
{
9999
// caution we move them so don't put a ref
100-
auto mhdResourcesManager = dynamic_cast<MHDModel const&>(coarseModel).resourcesManager;
101-
auto hybridResourcesManager
100+
auto& mhdResourcesManager = dynamic_cast<MHDModel const&>(coarseModel).resourcesManager;
101+
auto& hybridResourcesManager
102102
= dynamic_cast<HybridModel const&>(fineModel).resourcesManager;
103+
if (hybridResourcesManager.get() != mhdResourcesManager.get())
104+
throw std::runtime_error("Multiple ResourceManagers in use");
103105

104106
auto messengerStrategy
105107
= std::make_unique<MHDHybridMessengerStrategy<MHDModel, HybridModel>>(
106-
std::move(mhdResourcesManager), std::move(hybridResourcesManager), firstLevel);
108+
mhdResourcesManager, firstLevel);
107109

108110
return std::make_unique<HybridMessenger<HybridModel>>(std::move(messengerStrategy));
109111
}
@@ -113,10 +115,9 @@ class MessengerFactory
113115

114116
else if (messengerName == MHDMessenger<MHDModel>::stratName)
115117
{
116-
auto mhdResourcesManager = dynamic_cast<MHDModel const&>(coarseModel).resourcesManager;
118+
auto& mhdResourcesManager = dynamic_cast<MHDModel const&>(coarseModel).resourcesManager;
117119

118-
return std::make_unique<MHDMessenger<MHDModel>>(std::move(mhdResourcesManager),
119-
firstLevel);
120+
return std::make_unique<MHDMessenger<MHDModel>>(mhdResourcesManager, firstLevel);
120121
}
121122
else
122123
return {};

src/amr/messengers/mhd_hybrid_messenger_strategy.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@ namespace amr
1818
using VecFieldT = decltype(std::declval<HybridModel>().state.electromag.E);
1919
using IPhysicalModel = typename HybridModel::Interface;
2020

21+
using resources_manager_type = HybridModel::resources_manager_type;
22+
static_assert(
23+
std::is_same_v<resources_manager_type, typename MHDModel::resources_manager_type>);
24+
2125
public:
2226
static std::string const stratName;
2327

24-
MHDHybridMessengerStrategy(
25-
std::shared_ptr<typename MHDModel::resources_manager_type> mhdResourcesManager,
26-
std::shared_ptr<typename HybridModel::resources_manager_type> hybridResourcesManager,
27-
int const firstLevel)
28+
MHDHybridMessengerStrategy(std::shared_ptr<resources_manager_type> const& resourcesManager,
29+
int const firstLevel)
2830
: HybridMessengerStrategy<HybridModel>{stratName}
29-
, mhdResourcesManager_{std::move(mhdResourcesManager)}
30-
, hybridResourcesManager_{std::move(hybridResourcesManager)}
31+
, resourcesManager_{resourcesManager}
3132
, firstLevel_{firstLevel}
3233
{
33-
hybridResourcesManager_->registerResources(EM_old_);
34+
resourcesManager_->registerResources(EM_old_);
3435
}
3536

3637
/**
@@ -41,7 +42,7 @@ namespace amr
4142
{
4243
// hybModel.resourcesManager->allocate(EM_old_.E, patch, allocateTime);
4344
// hybModel.resourcesManager->allocate(EM_old_.B, patch, allocateTime);
44-
hybridResourcesManager_->allocate(EM_old_, patch, allocateTime);
45+
resourcesManager_->allocate(EM_old_, patch, allocateTime);
4546
}
4647

4748
void registerQuantities(
@@ -160,8 +161,7 @@ namespace amr
160161
private:
161162
using Electromag = decltype(std::declval<HybridModel>().state.electromag);
162163

163-
std::shared_ptr<typename MHDModel::resources_manager_type> mhdResourcesManager_;
164-
std::shared_ptr<typename HybridModel::resources_manager_type> hybridResourcesManager_;
164+
std::shared_ptr<resources_manager_type> resourcesManager_;
165165
int const firstLevel_;
166166
Electromag EM_old_{stratName + "_EM_old"};
167167
};

src/amr/messengers/mhd_messenger.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ namespace amr
2525
template<typename MHDModel>
2626
class MHDMessenger : public IMessenger<typename MHDModel::Interface>
2727
{
28+
using resources_manager_type = MHDModel::resources_manager_type;
29+
2830
public:
2931
using IPhysicalModel = typename MHDModel::Interface;
30-
MHDMessenger(std::shared_ptr<typename MHDModel::resources_manager_type> resourcesManager,
31-
int const firstLevel)
32-
: resourcesManager_{std::move(resourcesManager)}
32+
MHDMessenger(std::shared_ptr<resources_manager_type> resourcesManager, int const firstLevel)
33+
: resourcesManager_{resourcesManager}
3334
, firstLevel_{firstLevel}
3435
{
3536
}
@@ -131,7 +132,7 @@ namespace amr
131132

132133

133134
private:
134-
std::shared_ptr<typename MHDModel::resources_manager_type> resourcesManager_;
135+
std::shared_ptr<resources_manager_type> resourcesManager_;
135136
int const firstLevel_;
136137
};
137138

src/amr/physical_models/hybrid_model.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ class HybridModel : public IPhysicalModel<AMR_Types>
6262
}
6363

6464

65-
auto patch_data_ids() const { return resourcesManager->restart_patch_data_ids(*this); }
6665

6766

6867
/**
@@ -137,9 +136,6 @@ void HybridModel<GridLayoutT, Electromag, Ions, Electrons, AMR_Types, Grid_t>::i
137136

138137
state.electromag.initialize(layout);
139138
}
140-
141-
142-
resourcesManager->registerForRestarts(*this);
143139
}
144140

145141

src/amr/physical_models/mhd_model.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ namespace solver
6262
}
6363

6464

65+
6566
virtual ~MHDModel() override = default;
6667

6768
core::MHDState<VecFieldT> state;

src/amr/resources_manager/resources_manager.hpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -294,32 +294,27 @@ namespace amr
294294
}
295295

296296

297-
template<typename ResourcesView>
298-
void registerForRestarts(ResourcesView const& view) const
297+
void registerForRestarts() const
299298
{
300299
auto pdrm = SAMRAI::hier::PatchDataRestartManager::getManager();
301-
302-
for (auto const& id : restart_patch_data_ids(view))
300+
for (auto const& id : restart_patch_data_ids())
303301
pdrm->registerPatchDataForRestart(id);
304302
}
305303

306-
template<typename ResourcesView>
307-
NO_DISCARD auto restart_patch_data_ids(ResourcesView const& view) const
308-
{
309-
// true for now with https://github.com/PHAREHUB/PHARE/issues/664
310-
constexpr bool ALL_IDS = true;
311304

305+
NO_DISCARD auto restart_patch_data_ids() const
306+
{ // see https://github.com/PHAREHUB/PHARE/issues/664
312307
std::vector<int> ids;
308+
for (auto const& [key, info] : nameToResourceInfo_)
309+
ids.emplace_back(info.id);
310+
return ids;
311+
}
313312

314-
if constexpr (ALL_IDS)
315-
{ // get all registered ids to save
316-
for (auto const& [key, info] : nameToResourceInfo_)
317-
ids.emplace_back(info.id);
318-
}
319-
else
320-
{ // this is the case when transient datas not to be saved
321-
getIDs_(view, ids);
322-
}
313+
template<typename ResourcesView> // this function is never called
314+
NO_DISCARD auto restart_patch_data_ids(ResourcesView const& view) const
315+
{
316+
std::vector<int> ids;
317+
getIDs_(view, ids);
323318
return ids;
324319
}
325320

@@ -408,8 +403,6 @@ namespace amr
408403
}
409404
else
410405
{
411-
static_assert(has_sub_resources_v<ResourcesView>);
412-
413406
if constexpr (has_runtime_subresourceview_list<ResourcesView>::value)
414407
{
415408
for (auto& resourcesUser : obj.getRunTimeResourcesViewList())

src/restarts/detail/h5writer.hpp

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,52 @@
33

44

55
#include "core/utilities/mpi_utils.hpp"
6+
67
#include "restarts/restarts_props.hpp"
8+
#include "restarts/restarts_manager.hpp"
9+
710
#include "initializer/data_provider.hpp"
11+
812
#include "hdf5/detail/h5/h5_file.hpp"
913

1014
namespace PHARE::restarts::h5
1115
{
12-
template<typename ModelView>
16+
template<typename Hierarchy, typename ResourceManager_t>
1317
class Writer
1418
{
1519
public:
16-
using This = Writer<ModelView>;
20+
using This = Writer<Hierarchy, ResourceManager_t>;
21+
1722

18-
template<typename Hierarchy, typename Model>
19-
Writer(Hierarchy const& hier, Model const& model, std::string const filePath)
20-
: path_{filePath}
21-
, modelView_{hier, model}
23+
Writer(Hierarchy const& hier, ResourceManager_t const& resman, std::string const filePath)
24+
: hierarchy_{hier}
25+
, resman_{resman}
26+
, path_{filePath}
2227
{
2328
}
2429

2530
~Writer() {}
2631

2732

28-
template<typename Hierarchy, typename Model>
29-
static auto make_unique(Hierarchy const& hier, Model const& model,
33+
34+
static auto make_unique(Hierarchy const& hier, ResourceManager_t const& resman,
3035
initializer::PHAREDict const& dict)
3136
{
3237
std::string filePath = dict["filePath"].template to<std::string>();
33-
return std::make_unique<This>(hier, model, filePath);
38+
return std::make_unique<This>(hier, resman, filePath);
3439
}
3540

3641

3742
void dump(RestartsProperties const& properties, double timestamp)
3843
{
39-
auto restart_file
40-
= modelView_.writeRestartFile(ModelView::restartFilePathForTime(path_, timestamp));
44+
auto restart_file = writeRestartFile(restartFilePathForTime(path_, timestamp));
4145

4246
// write model patch_data_ids to file with highfive
4347
// SAMRAI restart files are PER RANK
4448
PHARE::hdf5::h5::HighFiveFile h5File{restart_file, HighFive::File::ReadWrite,
4549
/*para=*/false};
4650

47-
auto patch_ids = modelView_.patch_data_ids();
51+
auto const& patch_ids = patch_data_ids();
4852
h5File.create_data_set<int>("/phare/patch/ids", patch_ids.size());
4953
h5File.write_data_set("/phare/patch/ids", patch_ids);
5054

@@ -55,12 +59,27 @@ class Writer
5559
core::mpi::barrier();
5660
}
5761

58-
auto& modelView() { return modelView_; }
5962

6063

6164
private:
65+
NO_DISCARD auto writeRestartFile(std::string const& path) const
66+
{
67+
return hierarchy_.writeRestartFile(path);
68+
}
69+
70+
NO_DISCARD auto static restartFilePathForTime(std::string path, double timestamp)
71+
{
72+
return Hierarchy::restartFilePathForTime(path, timestamp);
73+
}
74+
75+
76+
NO_DISCARD auto patch_data_ids() const { return resman_.restart_patch_data_ids(); }
77+
78+
79+
80+
Hierarchy const& hierarchy_;
81+
ResourceManager_t const& resman_;
6282
std::string const path_;
63-
ModelView const modelView_;
6483
};
6584

6685

src/restarts/restarts.hpp

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

1616
#if PHARE_HAS_HIGHFIVE
1717

18-
#include "restarts_model_view.hpp"
1918
#include "restarts/detail/h5writer.hpp"
2019

2120
#endif
@@ -32,14 +31,13 @@ struct NullOpRestartsManager : public IRestartsManager
3231

3332
struct RestartsManagerResolver
3433
{
35-
template<typename Hierarchy, typename Model>
34+
template<typename Hierarchy, typename ResourceManager_t>
3635
NO_DISCARD static std::unique_ptr<IRestartsManager>
37-
make_unique(Hierarchy& hier, Model& model, initializer::PHAREDict const& dict)
36+
make_unique(Hierarchy& hier, ResourceManager_t& resman, initializer::PHAREDict const& dict)
3837
{
3938
#if PHARE_HAS_HIGHFIVE
40-
using ModelView_t = ModelView<Hierarchy, Model>;
41-
using Writer_t = h5::Writer<ModelView_t>;
42-
return RestartsManager<Writer_t>::make_unique(hier, model, dict);
39+
using Writer_t = h5::Writer<Hierarchy, ResourceManager_t>;
40+
return RestartsManager<Writer_t>::make_unique(hier, resman, dict);
4341
#else
4442
return std::make_unique<NullOpRestartsManager>();
4543
#endif

0 commit comments

Comments
 (0)