39template<
class Tvec,
template<
class>
class SPHKernel>
42 if (solver.solver_config.scheduler_conf.split_load_value == 0) {
44 "Scheduler load value should be greater than 0");
47 solver.init_required_fields();
49 solver.solver_config.scheduler_conf.split_load_value,
50 solver.solver_config.scheduler_conf.merge_load_value);
52 using namespace shamrock::patch;
58 shamlog_debug_ln(
"Sys",
"build local scheduler tables");
64 solver.init_ghost_layout();
66 solver.init_solver_graph();
68 solver.ensure_time_state_edges();
71template<
class Tvec,
template<
class>
class SPHKernel>
72u64 shammodels::gsph::Model<Tvec, SPHKernel>::get_total_part_count() {
74 return shamalgs::collective::allreduce_sum(sched.get_rank_count());
77template<
class Tvec,
template<
class>
class SPHKernel>
78f64 shammodels::gsph::Model<Tvec, SPHKernel>::total_mass_to_part_mass(
f64 totmass) {
79 return totmass / get_total_part_count();
82template<
class Tvec,
template<
class>
class SPHKernel>
83auto shammodels::gsph::Model<Tvec, SPHKernel>::get_ideal_fcc_box(
84 Tscal dr, std::pair<Tvec, Tvec> box) -> std::pair<Tvec, Tvec> {
86 auto [a, b] = generic::setup::generators::get_ideal_fcc_box<Tscal>(
87 dr, std::make_tuple(box.first, box.second));
91template<
class Tvec,
template<
class>
class SPHKernel>
92auto shammodels::gsph::Model<Tvec, SPHKernel>::get_ideal_hcp_box(
93 Tscal dr, std::pair<Tvec, Tvec> box) -> std::pair<Tvec, Tvec> {
95 auto [a, b] = generic::setup::generators::get_ideal_fcc_box<Tscal>(
96 dr, std::make_tuple(box.first, box.second));
100template<
class Tvec,
template<
class>
class SPHKernel>
101void shammodels::gsph::Model<Tvec, SPHKernel>::add_cube_fcc_3d(
102 Tscal dr, std::pair<Tvec, Tvec> _box) {
107 using namespace shamrock::patch;
111 std::string log =
"";
113 auto make_sliced = [&]() {
114 std::vector<Tvec> vec_lst;
115 generic::setup::generators::add_particles_fcc(
117 std::make_tuple(box.lower, box.upper),
119 return box.contain_pos(r);
121 [&](Tvec r, Tscal h) {
122 vec_lst.push_back(r);
125 std::vector<std::vector<Tvec>> sliced_buf;
129 std::vector<Tvec> cur_buf;
130 for (
u32 i = 0; i < vec_lst.size(); i++) {
131 cur_buf.push_back(vec_lst[i]);
133 if (cur_buf.size() > sz_buf) {
134 sliced_buf.push_back(std::exchange(cur_buf, std::vector<Tvec>{}));
138 if (cur_buf.size() > 0) {
139 sliced_buf.push_back(std::exchange(cur_buf, std::vector<Tvec>{}));
145 std::vector<std::vector<Tvec>> sliced_buf = make_sliced();
147 for (std::vector<Tvec> to_ins : sliced_buf) {
151 = sched.get_sim_box().template get_patch_transform<Tvec>();
155 std::vector<Tvec> vec_acc;
156 for (Tvec r : to_ins) {
157 if (patch_coord.contain_pos(r)) {
158 vec_acc.push_back(r);
162 if (vec_acc.size() == 0) {
166 log += shambase::format(
167 "\n rank = {} patch id={}, add N={} particles, coords = {} {}",
175 tmp.resize(vec_acc.size());
179 u32 len = vec_acc.size();
181 sched.pdl_old().template get_field_idx<Tvec>(
"xyz"));
182 sycl::buffer<Tvec> buf(vec_acc.data(), len);
183 f.override(buf, len);
188 sched.pdl_old().template get_field_idx<Tscal>(
"hpart"));
189 using Kernel = SPHKernel<Tscal>;
190 f.override(Kernel::hfactd * dr);
193 pdat.insert_elements(tmp);
196 sched.check_patchdata_locality_correctness();
202 sched.update_local_load_value([&](
Patch p) {
206 shamlog_debug_ln(
"setup", log);
209template<
class Tvec,
template<
class>
class SPHKernel>
210void shammodels::gsph::Model<Tvec, SPHKernel>::add_cube_hcp_3d(
211 Tscal dr, std::pair<Tvec, Tvec> _box) {
216 using namespace shamrock::patch;
220 std::string log =
"";
222 auto make_sliced = [&]() {
223 std::vector<Tvec> vec_lst;
224 generic::setup::generators::add_particles_fcc(
226 std::make_tuple(box.lower, box.upper),
228 return box.contain_pos(r);
230 [&](Tvec r, Tscal h) {
231 vec_lst.push_back(r);
234 std::vector<std::vector<Tvec>> sliced_buf;
238 std::vector<Tvec> cur_buf;
239 for (
u32 i = 0; i < vec_lst.size(); i++) {
240 cur_buf.push_back(vec_lst[i]);
242 if (cur_buf.size() > sz_buf) {
243 sliced_buf.push_back(std::exchange(cur_buf, std::vector<Tvec>{}));
247 if (cur_buf.size() > 0) {
248 sliced_buf.push_back(std::exchange(cur_buf, std::vector<Tvec>{}));
254 std::vector<std::vector<Tvec>> sliced_buf = make_sliced();
256 for (std::vector<Tvec> to_ins : sliced_buf) {
260 = sched.get_sim_box().template get_patch_transform<Tvec>();
264 std::vector<Tvec> vec_acc;
265 for (Tvec r : to_ins) {
266 if (patch_coord.contain_pos(r)) {
267 vec_acc.push_back(r);
271 if (vec_acc.size() == 0) {
275 log += shambase::format(
276 "\n rank = {} patch id={}, add N={} particles, coords = {} {}",
284 tmp.resize(vec_acc.size());
288 u32 len = vec_acc.size();
290 sched.pdl_old().template get_field_idx<Tvec>(
"xyz"));
291 sycl::buffer<Tvec> buf(vec_acc.data(), len);
292 f.override(buf, len);
297 sched.pdl_old().template get_field_idx<Tscal>(
"hpart"));
298 using Kernel = SPHKernel<Tscal>;
299 f.override(Kernel::hfactd * dr);
302 pdat.insert_elements(tmp);
305 sched.check_patchdata_locality_correctness();
311 sched.update_local_load_value([&](
Patch p) {
315 shamlog_debug_ln(
"setup", log);
Header file describing a Node Instance.
double f64
Alias for double.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
SchedulerPatchData patch_data
handle the data of the patches of the scheduler
u64 crit_patch_split
splitting limit (if load value > crit_patch_split => patch split)
void scheduler_step(bool do_split_merge, bool do_load_balancing)
scheduler step
SchedulerPatchList patch_list
handle the list of the patches of the scheduler
std::unordered_set< u64 > owned_patch_id
(owned_patch_id = patch_list.build_local())
void add_root_patch()
add patch to the scheduler
std::unordered_set< u64 > build_local()
select owned patches owned by the node to rebuild local
void build_local_idx_map()
recompute id_patch_to_local_idx
void init()
Initialise the model and all the related data structures (patch scheduler in particular).
PatchDataLayer container class, the layout is described in patchdata_layout.
shambase::DistributedData< PatchData > owned_data
map container for patchdata owned by the current node (layout : id_patch,data)
This header file contains utility functions related to exception handling in the code.
GSPH Model class - high-level interface for GSPH simulations.
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
ExcptTypes make_except_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Create an exception with a message and a location.
i32 world_rank()
Gives the rank of the current process in the MPI communicator.
This file contains the definition for the stacktrace related functionality.
shambase::details::BasicStackEntry StackEntry
Alias for shambase::details::BasicStackEntry.
Patch object that contain generic patch information.