51 auto grid = ice_thickness.
grid();
54 double dt_max = config->get_number(
"time_stepping.maximum_time_step",
"seconds");
60 one_over_dx = 1.0 / grid->dx(),
61 one_over_dy = 1.0 / grid->dy();
63 double u_max = 0.0, v_max = 0.0, w_max = 0.0;
66 for (
auto p = grid->points(); p; p.next()) {
67 const int i = p.i(), j = p.j();
69 if (cell_type.
icy(i, j)) {
70 const int ks = grid->kBelowHeight(ice_thickness(i, j));
76 for (
int k = 0;
k <= ks; ++
k) {
80 u_max = std::max(u_max, u_abs);
81 v_max = std::max(v_max, v_abs);
82 const double denom = fabs(u_abs * one_over_dx) + fabs(v_abs * one_over_dy);
84 dt_max = std::min(dt_max, 1.0 / denom);
88 for (
int k = 0;
k <= ks; ++
k) {
89 w_max = std::max(w_max, fabs(w[
k]));
100 std::vector<double> data = {u_max, v_max, w_max}, tmp(3, 0.0);
101 GlobalMax(grid->com, data.data(), tmp.data(), 3);
102 result.
u_max = tmp[0];
103 result.
v_max = tmp[1];
104 result.
w_max = tmp[2];
124 auto grid = ice_thickness.
grid();
127 double dt_max = config->get_number(
"time_stepping.maximum_time_step",
"seconds");
135 double u_max = 0.0, v_max = 0.0;
136 for (
auto p = grid->points(); p; p.next()) {
137 const int i = p.i(), j = p.j();
139 if (cell_type.
icy(i, j)) {
141 u_abs = fabs(velocity(i, j).u),
142 v_abs = fabs(velocity(i, j).v);
144 u_max = std::max(u_max, u_abs);
145 v_max = std::max(v_max, v_abs);
147 const double denom = u_abs / dx + v_abs / dy;
149 dt_max = std::min(dt_max, 1.0 / denom);
156 std::vector<double> data = {u_max, v_max}, tmp(2, 0.0);
157 GlobalMax(grid->com, data.data(), tmp.data(), 2);
158 result.
u_max = tmp[0];
159 result.
v_max = tmp[1];
CFLData max_timestep_cfl_2d(const array::Scalar &ice_thickness, const array::CellType &cell_type, const array::Vector &velocity)
Compute the CFL constant associated to first-order upwinding for the sliding contribution to mass con...
CFLData max_timestep_cfl_3d(const array::Scalar &ice_thickness, const array::CellType &cell_type, const array::Array3D &u3, const array::Array3D &v3, const array::Array3D &w3)
Compute the maximum velocities for time-stepping and reporting to user.