Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
Model.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
19#include "shambase/memory.hpp"
20#include "shambackends/vec.hpp"
26
27namespace shammodels::zeus {
28
37 template<class Tvec, class TgridVec>
38 class Model {
39 public:
40 using Tscal = shambase::VecComponent<Tvec>;
42 ShamrockCtx &ctx;
43
44 using Solver = Solver<Tvec, TgridVec>;
45 Solver solver;
46
47 Model(ShamrockCtx &ctx) : ctx(ctx), solver(ctx) {};
48
52
54 void init();
55
58 inline void init_scheduler(u32 crit_split, u32 crit_merge) {
59 solver.solver_config.scheduler_conf.split_load_value = crit_split;
60 solver.solver_config.scheduler_conf.merge_load_value = crit_merge;
61 init();
62 }
63
64 void make_base_grid(TgridVec bmin, TgridVec cell_size, u32_3 cell_count);
65
66 void dump_vtk(std::string filename);
67
68 Tscal evolve_once(Tscal t_current, Tscal dt_input);
69
70 template<class T>
71 inline void set_field_value_lambda(
72 std::string field_name, const std::function<T(Tvec, Tvec)> pos_to_val) {
73
74 StackEntry stack_loc{};
75
76 using Block = typename Solver::Config::AMRBlock;
77
78 PatchScheduler &sched = shambase::get_check_ref(ctx.sched);
79 sched.patch_data.for_each_patchdata([&](u64 patch_id,
81 sham::DeviceBuffer<TgridVec> &buf_cell_min = pdat.get_field_buf_ref<TgridVec>(0);
82 sham::DeviceBuffer<TgridVec> &buf_cell_max = pdat.get_field_buf_ref<TgridVec>(1);
83
85 = pdat.template get_field<T>(sched.pdl_old().get_field_idx<T>(field_name));
86
87 {
88 auto &buf = f.get_buf();
89 auto acc = buf.copy_to_stdvec();
90
91 auto cell_min = buf_cell_min.copy_to_stdvec();
92 auto cell_max = buf_cell_max.copy_to_stdvec();
93
94 Tscal scale_factor = solver.solver_config.grid_coord_to_pos_fact;
95 for (u32 i = 0; i < pdat.get_obj_cnt(); i++) {
96 Tvec block_min = cell_min[i].template convert<Tscal>() * scale_factor;
97 Tvec block_max = cell_max[i].template convert<Tscal>() * scale_factor;
98 Tvec delta_cell = (block_max - block_min) / Block::side_size;
99
100 Block::for_each_cell_in_block(delta_cell, [&](u32 lid, Tvec delta) {
101 Tvec bmin = block_min + delta;
102 acc[i * Block::block_size + lid] = pos_to_val(bmin, bmin + delta_cell);
103 });
104 }
105
106 buf.copy_from_stdvec(acc);
107 }
108 });
109 }
110
111 inline std::pair<Tvec, Tvec> get_cell_coords(
112 std::pair<TgridVec, TgridVec> block_coords, u32 lid) {
113 using Block = typename Solver::Config::AMRBlock;
114 auto tmp = Block::utils_get_cell_coords(block_coords, lid);
115 tmp.first *= solver.solver_config.grid_coord_to_pos_fact;
116 tmp.second *= solver.solver_config.grid_coord_to_pos_fact;
117 return tmp;
118 }
119 };
120
121} // namespace shammodels::zeus
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
The MPI scheduler.
SchedulerPatchData patch_data
handle the data of the patches of the scheduler
A buffer allocated in USM (Unified Shared Memory)
std::vector< T > copy_to_stdvec() const
Copy the content of the buffer to a std::vector.
Zeus scheme implementation in Shamrock (WIP)
Definition Model.hpp:38
void init_scheduler(u32 crit_split, u32 crit_merge)
Definition Model.hpp:58
void init()
Initialise the model and all the related data structures (patch scheduler in particular)
Definition Model.cpp:25
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
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...
Definition memory.hpp:110
namespace for the zeus model