40 using Tscal = shambase::VecComponent<Tvec>;
44 using Solver = Solver<Tvec, TgridVec>;
59 solver.solver_config.scheduler_conf.split_load_value = crit_split;
60 solver.solver_config.scheduler_conf.merge_load_value = crit_merge;
64 void make_base_grid(TgridVec bmin, TgridVec cell_size, u32_3 cell_count);
66 void dump_vtk(std::string filename);
68 Tscal evolve_once(Tscal t_current, Tscal dt_input);
71 inline void set_field_value_lambda(
72 std::string field_name,
const std::function<T(Tvec, Tvec)> pos_to_val) {
76 using Block =
typename Solver::Config::AMRBlock;
85 = pdat.template get_field<T>(sched.pdl_old().
get_field_idx<T>(field_name));
88 auto &buf = f.get_buf();
89 auto acc = buf.copy_to_stdvec();
92 auto cell_max = buf_cell_max.copy_to_stdvec();
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;
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);
106 buf.copy_from_stdvec(acc);
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;
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...