29 using Direction = shammodels::basegodunov::modules::Direction;
32 inline T slope_function_van_leer_f_form(T sL, T sR) {
35 auto vanleer = [](T f) {
36 return 4. * f * (1. - f);
39 auto slopelim = [&](T f) {
40 if constexpr (std::is_same_v<T, f64_3>) {
41 f.x() = (f.x() >= 0 && f.x() <= 1) ? f.x() : 0;
42 f.y() = (f.y() >= 0 && f.y() <= 1) ? f.y() : 0;
43 f.z() = (f.z() >= 0 && f.z() <= 1) ? f.z() : 0;
45 f = (f >= 0 && f <= 1) ? f : 0;
50 return slopelim(sL / st) * st * 0.5;
54 inline T slope_function_van_leer_symetric(T sL, T sR) {
56 if constexpr (std::is_same_v<T, f64_3>) {
58 shammath::van_leer_slope_symetric(sL[0], sR[0]),
59 shammath::van_leer_slope_symetric(sL[1], sR[1]),
60 shammath::van_leer_slope_symetric(sL[2], sR[2])};
62 return shammath::van_leer_slope_symetric(sL, sR);
67 inline T slope_function_van_leer_standard(T sL, T sR) {
69 if constexpr (std::is_same_v<T, f64_3>) {
80 inline T slope_function_minmod(T sL, T sR) {
82 if constexpr (std::is_same_v<T, f64_3>) {
84 shammath::minmod(sL[0], sR[0]),
85 shammath::minmod(sL[1], sR[1]),
86 shammath::minmod(sL[2], sR[2])};
88 return shammath::minmod(sL, sR);
94 template<
class T, SlopeMode mode>
95 inline T slope_function(T sL, T sR) {
96 if constexpr (mode == SlopeMode::None) {
100 if constexpr (mode == SlopeMode::VanLeer_f) {
101 return slope_function_van_leer_f_form(sL, sR);
104 if constexpr (mode == SlopeMode::VanLeer_std) {
105 return slope_function_van_leer_standard(sL, sR);
108 if constexpr (mode == SlopeMode::VanLeer_sym) {
109 return slope_function_van_leer_symetric(sL, sR);
112 if constexpr (mode == SlopeMode::Minmod) {
113 return slope_function_minmod(sL, sR);
135 template<
class Tfield,
class Tvec, SlopeMode mode,
class ACCField>
136 inline std::array<Tfield, 3> get_3d_grad(
137 const u32 cell_global_id,
138 const shambase::VecComponent<Tvec> delta_cell,
145 ACCField &&field_access) {
147 auto get_avg_neigh = [&](
auto &graph_links) -> Tfield {
149 u32 cnt = graph_links.for_each_object_link_cnt(cell_global_id, [&](
u32 id_b) {
150 acc += field_access(id_b);
155 Tfield W_i = field_access(cell_global_id);
156 Tfield W_xp = get_avg_neigh(graph_iter_xp);
157 Tfield W_xm = get_avg_neigh(graph_iter_xm);
158 Tfield W_yp = get_avg_neigh(graph_iter_yp);
159 Tfield W_ym = get_avg_neigh(graph_iter_ym);
160 Tfield W_zp = get_avg_neigh(graph_iter_zp);
161 Tfield W_zm = get_avg_neigh(graph_iter_zm);
163 Tfield delta_W_x_p = W_xp - W_i;
164 Tfield delta_W_y_p = W_yp - W_i;
165 Tfield delta_W_z_p = W_zp - W_i;
167 Tfield delta_W_x_m = W_i - W_xm;
168 Tfield delta_W_y_m = W_i - W_ym;
169 Tfield delta_W_z_m = W_i - W_zm;
171 Tfield fact = 1. / Tfield(delta_cell);
173 Tfield lim_slope_W_x = slope_function<Tfield, mode>(delta_W_x_m * fact, delta_W_x_p * fact);
174 Tfield lim_slope_W_y = slope_function<Tfield, mode>(delta_W_y_m * fact, delta_W_y_p * fact);
175 Tfield lim_slope_W_z = slope_function<Tfield, mode>(delta_W_z_m * fact, delta_W_z_p * fact);
177 return {lim_slope_W_x, lim_slope_W_y, lim_slope_W_z};
202 template<
class Tvec, SlopeMode mode,
class ACCField1,
class ACCField2,
class ACCField3>
203 inline std::array<shammath::ConsState<Tvec>, 3> get_3d_grad_cons(
204 const u32 cell_global_id,
205 const shambase::VecComponent<Tvec> delta_cell,
212 ACCField1 &&field_access_rho,
213 ACCField2 &&field_access_rho_vel,
214 ACCField3 &&field_access_rhoe) {
216 using Tscal = shambase::VecComponent<Tvec>;
222 u32 cnt = graph_links.for_each_object_link_cnt(cell_global_id, [&](
u32 id_b) {
223 acc_rho += field_access_rho(id_b);
224 acc_rho_vel += field_access_rho_vel(id_b);
225 acc_rhoe += field_access_rhoe(id_b);
237 res = {acc_rho, acc_rhoe, acc_rho_vel};
245 = {field_access_rho(cell_global_id),
246 field_access_rhoe(cell_global_id),
247 field_access_rho_vel(cell_global_id)};
264 Tscal fact = 1. / delta_cell;
267 = {slope_function<Tscal, mode>(delta_W_x_m.rho * fact, delta_W_x_p.rho * fact),
268 slope_function<Tscal, mode>(delta_W_x_m.rhoe * fact, delta_W_x_p.rhoe * fact),
269 slope_function<Tvec, mode>(delta_W_x_m.rhovel * fact, delta_W_x_p.rhovel * fact)};
272 = {slope_function<Tscal, mode>(delta_W_y_m.rho * fact, delta_W_y_p.rho * fact),
273 slope_function<Tscal, mode>(delta_W_y_m.rhoe * fact, delta_W_y_p.rhoe * fact),
274 slope_function<Tvec, mode>(delta_W_y_m.rhovel * fact, delta_W_y_p.rhovel * fact)};
277 = {slope_function<Tscal, mode>(delta_W_z_m.rho * fact, delta_W_z_p.rho * fact),
278 slope_function<Tscal, mode>(delta_W_z_m.rhoe * fact, delta_W_z_p.rhoe * fact),
279 slope_function<Tvec, mode>(delta_W_z_m.rhovel * fact, delta_W_z_p.rhovel * fact)};
281 return {lim_slope_W_x, lim_slope_W_y, lim_slope_W_z};
std::uint32_t u32
32 bit unsigned integer
T van_leer_slope(T f, T g)
Van leer slope limiter.
SlopeMode
Slope limiter modes.
From original version by Thomas Guillet (T.A.Guillet@exeter.ac.uk)
Math header to compute slope limiters.