19#include "pism/icemodel/IceModel.hh"
21#include "pism/util/ConfigInterface.hh"
22#include "pism/util/Grid.hh"
24#include "pism/frontretreat/FrontRetreat.hh"
25#include "pism/frontretreat/calving/CalvingAtThickness.hh"
26#include "pism/frontretreat/calving/EigenCalving.hh"
27#include "pism/frontretreat/calving/FloatKill.hh"
28#include "pism/frontretreat/calving/HayhurstCalving.hh"
29#include "pism/frontretreat/calving/vonMisesCalving.hh"
31#include "pism/energy/EnergyModel.hh"
32#include "pism/coupler/FrontalMelt.hh"
33#include "pism/stressbalance/ShallowStressBalance.hh"
34#include "pism/hydrology/Hydrology.hh"
35#include "pism/frontretreat/util/remove_narrow_tongues.hh"
36#include "pism/frontretreat/PrescribedRetreat.hh"
37#include "pism/util/ScalarForcing.hh"
38#include "pism/util/connected_components/label_components.hh"
49 const int water_reachable_from_domain_edge = 2;
53 for (
auto p =
grid->points(); p; p.next()) {
54 const int i = p.i(), j = p.j();
60 result(i, j) = water_reachable_from_domain_edge;
74 for (
auto p =
grid->points(); p; p.next()) {
75 const int i = p.i(), j = p.j();
90 bool calving_is_active =
92 bool frontal_melt_only_open_ocean =
m_config->get_flag(
"frontal_melt.open_ocean_margins_only");
94 auto &open_ocean_mask = *
m_work2d[3];
95 if (calving_is_active or (
m_frontal_melt and frontal_melt_only_open_ocean)) {
98 open_ocean_mask.set(1.0);
154 if (frontal_melt_only_open_ocean) {
158 const int i = p.i(), j = p.j();
160 if (open_ocean_mask(i, j) < 0.5) {
161 retreat_rate(i, j) = 0.0;
171 bool add_values =
false;
182 if (calving_is_active) {
188 if (retreat_rate_based_calving) {
192 retreat_rate.
set(0.0);
217 const int i = p.i(), j = p.j();
219 if (open_ocean_mask(i, j) < 0.5) {
220 retreat_rate(i, j) = 0.0;
230 auto thickness_threshold =
m_config->get_number(
"stress_balance.ice_free_thickness_standard");
243 auto &modified_cell_type = *
m_work2d[2];
253 const int i = p.i(), j = p.j();
255 if (cell_type.ice_free_ocean(i, j) and open_ocean_mask(i, j) < 0.5) {
261 modified_cell_type(i, j) = cell_type(i, j);
276 bool add_values =
false;
296 bool add_values =
false;
315 bool add_values =
true;
345 &Href, &Href_old, &output};
347 for (
auto p =
m_grid->points(); p; p.next()) {
348 const int i = p.i(), j = p.j();
351 H_old = thickness_old(i, j) + Href_old(i, j),
352 H_new = thickness(i, j) + Href(i, j),
353 change = H_new - H_old;
356 output(i, j) += change;
358 output(i, j) = change;
array::Scalar1 sea_level_elevation
void ensure_consistency(double ice_free_thickness_threshold)
array::Scalar1 ice_area_specific_volume
array::CellType2 cell_type
array::Scalar2 ice_thickness
array::Scalar2 bed_elevation
void enforce_consistency_of_geometry(ConsistencyFlag flag)
Update the surface elevation and the flow-type mask when the geometry has changed.
void compute_geometry_change(const array::Scalar &thickness, const array::Scalar &Href, const array::Scalar &thickness_old, const array::Scalar &Href_old, bool add_values, array::Scalar &output)
std::shared_ptr< stressbalance::StressBalance > m_stress_balance
ThicknessChanges m_thickness_change
const Time::Ptr m_time
Time manager.
std::shared_ptr< frontalmelt::FrontalMelt > m_frontal_melt
std::shared_ptr< Grid > grid() const
Return the grid used by this model.
virtual void front_retreat_step()
std::shared_ptr< calving::EigenCalving > m_eigen_calving
std::unique_ptr< ScalarForcing > m_calving_rate_factor
std::vector< std::shared_ptr< array::Scalar2 > > m_work2d
std::shared_ptr< calving::CalvingAtThickness > m_thickness_threshold_calving
std::shared_ptr< calving::FloatKill > m_float_kill_calving
std::shared_ptr< PrescribedRetreat > m_prescribed_retreat
std::shared_ptr< calving::HayhurstCalving > m_hayhurst_calving
Config::Ptr m_config
Configuration flags and parameters.
array::Scalar1 m_ice_thickness_bc_mask
Mask prescribing locations where ice thickness is held constant.
std::unique_ptr< hydrology::Hydrology > m_subglacial_hydrology
std::shared_ptr< calving::vonMisesCalving > m_vonmises_calving
double m_dt
mass continuity time step, s
std::shared_ptr< energy::EnergyModel > m_energy_model
const std::shared_ptr< Grid > m_grid
Computational grid.
void identify_open_ocean(const array::CellType &cell_type, array::Scalar1 &result)
std::shared_ptr< FrontRetreat > m_front_retreat
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
void copy_from(const Array2D< T > &source)
void add(double alpha, const Array2D< T > &x)
void scale(double alpha)
Result: v <- v * alpha. Calls VecScale.
std::shared_ptr< const Grid > grid() const
void set(double c)
Result: v[j] <- c for all j.
void update_ghosts()
Updates ghost points.
bool ice_free_ocean(int i, int j) const
"Cell type" mask. Adds convenience methods to array::Scalar.
int as_int(int i, int j) const
void label_isolated(array::Scalar1 &mask, int reachable)
bool domain_edge(const Grid &grid, int i, int j)
void remove_narrow_tongues(const Geometry &geometry, array::Scalar &ice_thickness)
array::Scalar forced_retreat
array::Scalar frontal_melt