37 using Tscal = shambase::VecComponent<Tvec>;
38 static constexpr u32 dim = shambase::VectorProperties<Tvec>::dimension;
41 using Solver = Solver<Tvec, TgridVec>;
56 solver.solver_config.scheduler_conf.split_load_value = crit_split;
57 solver.solver_config.scheduler_conf.merge_load_value = crit_merge;
61 inline f64 solver_logs_last_rate() {
return solver.solve_logs.get_last_rate(); }
62 inline u64 solver_logs_last_obj_count() {
return solver.solve_logs.get_last_obj_count(); }
64 return solver.solve_logs.get_last_system_metrics();
67 void make_base_grid(TgridVec bmin, TgridVec cell_size, u32_3 cell_count);
69 void dump_vtk(std::string filename);
72 inline void set_field_value_lambda(
73 std::string field_name,
74 const std::function<T(Tvec, Tvec)> pos_to_val,
79 using Block =
typename Solver::Config::AMRBlock;
83 shamrock::patch::PatchDataLayer &pdat) {
84 sham::DeviceBuffer<TgridVec> &buf_cell_min = pdat.get_field_buf_ref<TgridVec>(0);
85 sham::DeviceBuffer<TgridVec> &buf_cell_max = pdat.get_field_buf_ref<TgridVec>(1);
88 = pdat.template get_field<T>(sched.pdl_old().
get_field_idx<T>(field_name));
90 auto acc = f.get_buf().copy_to_stdvec();
92 auto f_nvar = f.get_nvar() / Block::block_size;
95 auto cell_max = buf_cell_max.copy_to_stdvec();
97 Tscal scale_factor = solver.solver_config.grid_coord_to_pos_fact;
99 Tvec block_min = cell_min[i].template convert<Tscal>() * scale_factor;
100 Tvec block_max = cell_max[i].template convert<Tscal>() * scale_factor;
101 Tvec delta_cell = (block_max - block_min) / Block::side_size;
103 Block::for_each_cell_in_block(delta_cell, [&](
u32 lid, Tvec delta) {
104 Tvec bmin = block_min + delta;
105 acc[(i * Block::block_size + lid) * f_nvar + offset]
106 = pos_to_val(bmin, bmin + delta_cell);
110 f.get_buf().copy_from_stdvec(acc);
114 inline std::pair<Tvec, Tvec> get_cell_coords(
115 std::pair<TgridVec, TgridVec> block_coords,
u32 lid) {
116 using Block =
typename Solver::Config::AMRBlock;
117 auto tmp = Block::utils_get_cell_coords(block_coords, lid);
118 tmp.first *= solver.solver_config.grid_coord_to_pos_fact;
119 tmp.second *= solver.solver_config.grid_coord_to_pos_fact;
123 inline f64 evolve_once_time_expl(
f64 t_curr,
f64 dt_input) {
124 return solver.evolve_once_time_expl(t_curr, dt_input);
127 inline void timestep() { solver.evolve_once(); }
129 inline void evolve_once() {
130 solver.evolve_once();
131 solver.print_timestep_logs();
134 inline bool evolve_until(Tscal target_time,
i32 niter_max) {
135 return solver.evolve_until(target_time, niter_max);
142 inline void dump(std::string fname) {
144 logger::info_ln(
"Godunov",
"Dumping state to", fname);
147 nlohmann::json metadata;
148 metadata[
"solver_config"] = solver.solver_config;
165 std::string metadata_user{};
168 nlohmann::json j = nlohmann::json::parse(metadata_user);
169 j.at(
"solver_config").get_to(solver.solver_config);
181 = std::find(sync_names.begin(), sync_names.end(),
"time") != sync_names.end();
184 solver.ensure_time_state_edges();
186 if (!had_time_edge) {
187 if (j.at(
"solver_config").contains(
"time_state")) {
191 "Migrated time/dt from solver_config.time_state into scheduler "
193 const auto &ts = j.at(
"solver_config").at(
"time_state");
194 solver.set_time(ts.at(
"time").get<Tscal>());
195 solver.set_next_dt(ts.at(
"dt").get<Tscal>());
198 "this should never happen: dump has neither time edges nor "
199 "solver_config.time_state");
203 shamlog_debug_ln(
"Sys",
"build local scheduler tables");