FloatKill.cc (2722B)
1 /* Copyright (C) 2013, 2014, 2015, 2016, 2017 PISM Authors 2 * 3 * This file is part of PISM. 4 * 5 * PISM is free software; you can redistribute it and/or modify it under the 6 * terms of the GNU General Public License as published by the Free Software 7 * Foundation; either version 3 of the License, or (at your option) any later 8 * version. 9 * 10 * PISM is distributed in the hope that it will be useful, but WITHOUT ANY 11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 13 * details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with PISM; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 #include "FloatKill.hh" 21 22 #include "pism/util/Mask.hh" 23 #include "pism/util/iceModelVec.hh" 24 #include "pism/util/IceGrid.hh" 25 #include "pism/util/pism_utilities.hh" 26 #include "pism/util/IceModelVec2CellType.hh" 27 28 namespace pism { 29 namespace calving { 30 31 FloatKill::FloatKill(IceGrid::ConstPtr g) 32 : Component(g) { 33 m_margin_only = m_config->get_flag("calving.float_kill.margin_only"); 34 m_calve_near_grounding_line = m_config->get_flag("calving.float_kill.calve_near_grounding_line"); 35 } 36 37 FloatKill::~FloatKill() { 38 // empty 39 } 40 41 void FloatKill::init() { 42 m_log->message(2, 43 "* Initializing calving using the floatation criterion (float_kill)...\n"); 44 45 if (m_margin_only) { 46 m_log->message(2, 47 " [only cells at the ice margin are calved during a given time step]\n"); 48 } 49 50 if (not m_calve_near_grounding_line) { 51 m_log->message(2, 52 " [keeping floating cells near the grounding line]\n"); 53 } 54 } 55 56 /** 57 * Updates ice cover mask and the ice thickness using the calving rule 58 * removing all floating ice. 59 * 60 * @param[in,out] pism_mask ice cover (cell type) mask 61 * @param[in,out] ice_thickness ice thickness 62 * 63 * @return 0 on success 64 */ 65 void FloatKill::update(IceModelVec2CellType &mask, IceModelVec2S &ice_thickness) { 66 67 IceModelVec::AccessList list{&mask, &ice_thickness}; 68 69 const bool dont_calve_near_grounded_ice = not m_calve_near_grounding_line; 70 71 for (Points p(*m_grid); p; p.next()) { 72 const int i = p.i(), j = p.j(); 73 74 if (mask.floating_ice(i, j)) { 75 if (m_margin_only and not mask.next_to_ice_free_ocean(i, j)) { 76 continue; 77 } 78 79 if (dont_calve_near_grounded_ice and mask.next_to_grounded_ice(i, j)) { 80 continue; 81 } 82 83 ice_thickness(i, j) = 0.0; 84 mask(i, j) = MASK_ICE_FREE_OCEAN; 85 } 86 } 87 88 mask.update_ghosts(); 89 ice_thickness.update_ghosts(); 90 } 91 92 } // end of namespace calving 93 } // end of namespace pism