-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathComputeDt.h
63 lines (48 loc) · 2.54 KB
/
ComputeDt.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma once
#include "SimInfo.h"
#include "ThermalConduction.h"
#include "Viscosity.h"
namespace fv2d {
class ComputeDtFunctor {
public:
Params params;
ComputeDtFunctor(const Params ¶ms)
: params(params) {};
~ComputeDtFunctor() = default;
real_t computeDt(Array Q, real_t max_dt, real_t t, bool diag) const {
using DtArray = Kokkos::Array<real_t, 3>;
DtArray inv_dts {0,0,0};
auto params = this->params;
real_t inv_dt_hyp = 0.0;
real_t inv_dt_par_tc = 0.0;
real_t inv_dt_par_visc = 0.0;
Kokkos::parallel_reduce("Computing DT",
params.range_dom,
KOKKOS_LAMBDA(int i, int j, real_t &inv_dt_hyp, real_t &inv_dt_par_tc, real_t &inv_dt_par_visc) {
// Hydro time-step
State q = getStateFromArray(Q, i, j);
real_t cs = speedOfSound(q, params);
real_t inv_dt_hyp_loc = (cs + fabs(q[IU]))/params.dx + (cs + fabs(q[IV]))/params.dx;
real_t inv_dt_par_tc_loc = params.epsilon;
if (params.thermal_conductivity_active)
inv_dt_par_tc_loc = fmax(2.0*computeKappa(i, j, params) / (params.dx*params.dx),
2.0*computeKappa(i, j, params) / (params.dy*params.dy));
real_t inv_dt_par_visc_loc = params.epsilon;
if (params.viscosity_active)
inv_dt_par_visc_loc = fmax(2.0*computeMu(i, j, params) / (params.dx*params.dx),
2.0*computeMu(i, j, params) / (params.dy*params.dy));
inv_dt_hyp = fmax(inv_dt_hyp, inv_dt_hyp_loc);
inv_dt_par_tc = fmax(inv_dt_par_tc, inv_dt_par_tc_loc);
inv_dt_par_visc = fmax(inv_dt_par_visc, inv_dt_par_visc_loc);
}, Kokkos::Max<real_t>(inv_dt_hyp),
Kokkos::Max<real_t>(inv_dt_par_tc),
Kokkos::Max<real_t>(inv_dt_par_visc));
if (diag) {
std::cout << "Computing dts at (t=" << t << ") : dt_hyp=" << 1.0/inv_dt_hyp
<< "; dt_TC=" << 1.0/inv_dt_par_tc
<< "; dt_visc=" << 1.0/inv_dt_par_visc << std::endl;
}
return params.CFL / std::max({inv_dt_hyp, inv_dt_par_tc, inv_dt_par_visc});
}
};
}