53 auto grid = ice_thickness.
grid();
54 auto config = grid->ctx()->config();
56 double dt_max = config->get_number(
"time_stepping.maximum_time_step",
"seconds");
60 bool has_no_model_mask;
61 if (no_model_mask !=
nullptr) {
62 has_no_model_mask =
true;
63 list.add(*no_model_mask);
65 has_no_model_mask =
false;
70 one_over_dx = 1.0 / grid->dx(),
71 one_over_dy = 1.0 / grid->dy();
73 double u_max = 0.0, v_max = 0.0, w_max = 0.0;
76 for (
auto p : grid->points()) {
77 const int i = p.i(), j = p.j();
79 bool is_modeled =
true;
80 if (has_no_model_mask) {
81 if ((*no_model_mask)(i, j) == 1) {
86 if ((cell_type.
icy(i, j)) && is_modeled) {
87 const int ks = grid->kBelowHeight(ice_thickness(i, j));
93 for (
int k = 0;
k <= ks; ++
k) {
97 u_max = std::max(u_max, u_abs);
98 v_max = std::max(v_max, v_abs);
99 const double denom = fabs(u_abs * one_over_dx) + fabs(v_abs * one_over_dy);
102 if (denom > std::numeric_limits<double>::min()) {
103 dt_max = std::min(dt_max, 1.0 / denom);
107 for (
int k = 0;
k <= ks; ++
k) {
108 w_max = std::max(w_max, fabs(w[
k]));
119 std::vector<double> data = {u_max, v_max, w_max}, tmp(3, 0.0);
120 GlobalMax(grid->com, data.data(), tmp.data(), 3);
121 result.
u_max = tmp[0];
122 result.
v_max = tmp[1];
123 result.
w_max = tmp[2];
144 auto grid = ice_thickness.
grid();
145 auto config = grid->ctx()->config();
147 double dt_max = config->get_number(
"time_stepping.maximum_time_step",
"seconds");
155 bool has_no_model_mask;
156 if (no_model_mask !=
nullptr) {
157 has_no_model_mask =
true;
158 list.add(*no_model_mask);
160 has_no_model_mask =
false;
163 double u_max = 0.0, v_max = 0.0;
164 for (
auto p : grid->points()) {
165 const int i = p.i(), j = p.j();
167 bool is_modeled =
true;
168 if (has_no_model_mask) {
169 if ((*no_model_mask)(i, j) == 1) {
174 if ((cell_type.
icy(i, j)) && is_modeled) {
176 u_abs = fabs(velocity(i, j).u),
177 v_abs = fabs(velocity(i, j).v);
179 u_max = std::max(u_max, u_abs);
180 v_max = std::max(v_max, v_abs);
182 const double denom = u_abs / dx + v_abs / dy;
183 if (denom > std::numeric_limits<double>::min()) {
184 dt_max = std::min(dt_max, 1.0 / denom);
191 std::vector<double> data = {u_max, v_max}, tmp(2, 0.0);
192 GlobalMax(grid->com, data.data(), tmp.data(), 2);
193 result.
u_max = tmp[0];
194 result.
v_max = tmp[1];
CFLData max_timestep_cfl_2d(const array::Scalar &ice_thickness, const array::CellType &cell_type, const array::Scalar1 *no_model_mask, 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::Scalar1 *no_model_mask, const array::Array3D &u3, const array::Array3D &v3, const array::Array3D &w3)
Compute the maximum velocities for time-stepping and reporting to user.