BISICLES AMR ice sheet model  0.9
CalvingModel.H
Go to the documentation of this file.
1 
2 #ifdef CH_LANG_CC
3 /*
4 * _______ __
5 * / ___/ / ___ __ _ / / ___
6 * / /__/ _ \/ _ \/ V \/ _ \/ _ \
7 * \___/_//_/\___/_/_/_/_.__/\___/
8 * Please refer to Copyright.txt, in Chombo's root directory.
9 */
10 #endif
11 
12 #ifndef _CALVINGMODEL_H_
13 #define _CALVINGMODEL_H_
14 
15 #include "LevelSigmaCS.H"
16 #include "ParmParse.H"
17 #include "SurfaceFlux.H"
18 #include "NamespaceHeader.H"
19 
20 class AmrIce;
21 
24 {
25 
26 public:
27 
29 
30  static void updateCalvedIce(const Real& a_thck, const Real a_prevThck, const int a_mask, Real& a_added, Real& a_calved, Real& a_removed);
31 
32 
33  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
34  LevelData<FArrayBox>& a_calvedIce,
35  LevelData<FArrayBox>& a_addedIce,
36  LevelData<FArrayBox>& a_removedIce,
37  LevelData<FArrayBox>& a_iceFrac,
38  const AmrIce& a_amrIce,
39  int a_level,
40  Stage a_stage) = 0;
41 
42 
43  virtual ~CalvingModel(){};
44 
45  static CalvingModel* parseCalvingModel(const char* a_prefix);
46 
48  virtual CalvingModel* new_CalvingModel() = 0;
49 
51  virtual void getCalvingRate(LevelData<FArrayBox>& a_calvingRate,
52  const AmrIce& a_amrIce,int a_level);
53 
55  virtual void getWaterDepth(LevelData<FArrayBox>& a_waterDepth,
56  const AmrIce& a_amrIce,int a_level);
57 
58 };
59 
62 {
63 
64 public:
65 
66  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
67  LevelData<FArrayBox>& a_calvedIce,
68  LevelData<FArrayBox>& a_addedIce,
69  LevelData<FArrayBox>& a_removedIce,
70  LevelData<FArrayBox>& a_iceFrac,
71  const AmrIce& a_amrIce,
72  int a_level,
73  Stage a_stage)
74  {
75 
76  }
77 
79  {
80  return new NoCalvingModel( *this);
81  }
82 
83 
84 };
85 
86 
87 // A Deglaciation-only calving model which
88 // i. Makes calving irreversible : if a cell mask is open sea / land, set thickness
89 // there to zero. No need to worry about the velocity fields in cells
90 // which were previously calved.
91 // ii. Sets any floating ice below a given thickness and in a given depth of
92 // ocean to zero thickness
93 // iii. prevents thickness from dropping below a given thickness
95 {
96 
97 public:
98 
99 
100  //alter the thickness field at the end of a time step
101  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
102  LevelData<FArrayBox>& a_calvedIce,
103  LevelData<FArrayBox>& a_addedIce,
104  LevelData<FArrayBox>& a_removedIce,
105  LevelData<FArrayBox>& a_iceFrac,
106  const AmrIce& a_amrIce,
107  int a_level,
108  Stage a_stage);
109 
110 
111 
112  DeglaciationCalvingModelA(const Real& a_calvingThickness,
113  const Real& a_calvingOceanDepth,
114  const Real& a_minThickness,
115  const Real& a_startTime,
116  const Real& a_endTime)
117  : m_calvingThickness(a_calvingThickness),
118  m_calvingOceanDepth(a_calvingOceanDepth),
119  m_minThickness(a_minThickness),
120  m_startTime(a_startTime),
121  m_endTime(a_endTime)
122  {
123  ;
124  }
125 
127  {
128  return new DeglaciationCalvingModelA( *this);
129  }
130 
131 
132 
133 protected:
134  Real m_calvingThickness, m_calvingOceanDepth, m_minThickness, m_startTime, m_endTime;
135 
136 private:
138 };
139 
142 {
143 
144 public:
145 
146  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
147  LevelData<FArrayBox>& a_calvedIce,
148  LevelData<FArrayBox>& a_addedIce,
149  LevelData<FArrayBox>& a_removedIce,
150  LevelData<FArrayBox>& a_iceFrac,
151  const AmrIce& a_amrIce,
152  int a_level,
153  Stage a_stage);
154 
155  DomainEdgeCalvingModel(const Vector<int>& a_frontLo,
156  const Vector<int>& a_frontHi,
157  bool a_preserveSea,
158  bool a_preserveLand)
159 
160  :m_frontLo(a_frontLo),m_frontHi(a_frontHi),
161  m_preserveSea(a_preserveSea),m_preserveLand(a_preserveLand)
162  {
163  ;
164  }
165 
166 
168  {
169  return new DomainEdgeCalvingModel( *this);
170  }
171 
172 
173 
174 protected:
175  Vector<int> m_frontLo;
176  Vector<int> m_frontHi;
177  bool m_preserveSea, m_preserveLand;
178 private:
180 };
181 
182 
185 {
186 
187  Real m_proximity, m_velocity, m_startTime, m_endTime;
188 
189 public:
190  ProximityCalvingModel(const Real& a_proximity,
191  const Real& a_velocity,
192  const Real& a_startTime,
193  const Real& a_endTime)
194  : m_proximity(a_proximity),
195  m_velocity(a_velocity),
196  m_startTime(a_startTime),
197  m_endTime(a_endTime)
198  {
199  }
200 
201  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
202  LevelData<FArrayBox>& a_calvedIce,
203  LevelData<FArrayBox>& a_addedIce,
204  LevelData<FArrayBox>& a_removedIce,
205  LevelData<FArrayBox>& a_iceFrac,
206  const AmrIce& a_amrIce,
207  int a_level,
208  Stage a_stage);
209 
210 
211 
213  {
214  return new ProximityCalvingModel( *this);
215  }
216 
217 };
218 
219 
220 
221 // A Deglacation-only calving model which
222 // i. Makes calving irreversible : if a cell mask is open sea / land, set thickness
223 // there to zero. No need to worry about the velocity fields in cells
224 // which were previously calved.
225 // ii. Sets any floating ice below a given thickness to the min thickness in (iii) (this is where it differs from ModelA, which doesn't actually use the CalvingThickness)
226 // iii. prevents thickness from dropping below a given thickness
228 {
229 
230 public:
231 
232  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
233  LevelData<FArrayBox>& a_calvedIce,
234  LevelData<FArrayBox>& a_addedIce,
235  LevelData<FArrayBox>& a_removedIce,
236  LevelData<FArrayBox>& a_iceFrac,
237  const AmrIce& a_amrIce,
238  int a_level,
239  Stage a_stage);
240 
241 
242  DeglaciationCalvingModelB(const Real& a_calvingThickness,
243  const Real& a_calvingOceanDepth,
244  const Real& a_minThickness,
245  const Real& a_startTime,
246  const Real& a_endTime)
247  : m_calvingThickness(a_calvingThickness),
248  m_calvingOceanDepth(a_calvingOceanDepth),
249  m_minThickness(a_minThickness),
250  m_startTime(a_startTime),
251  m_endTime(a_endTime)
252  {
253  ;
254  }
256  {
257  return new DeglaciationCalvingModelB (*this);
258  }
259 
260 protected:
261  Real m_calvingThickness, m_calvingOceanDepth, m_minThickness, m_startTime, m_endTime;
262 
263 private:
265 };
266 
267 
268 
270 
277 {
278 
279 public:
280 
281  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
282  LevelData<FArrayBox>& a_calvedIce,
283  LevelData<FArrayBox>& a_addedIce,
284  LevelData<FArrayBox>& a_removedIce,
285  LevelData<FArrayBox>& a_iceFrac,
286  const AmrIce& a_amrIce,
287  int a_level,
288  Stage a_stage);
289 
290 
291  ThicknessCalvingModel(const Real& a_calvingThickness,
292  const Real& a_calvingOceanDepth,
293  const Real& a_minThickness,
294  const Real& a_startTime,
295  const Real& a_endTime,
296  const bool& a_factorMuCoef)
297  : m_calvingThickness(a_calvingThickness),
298  m_calvingOceanDepth(a_calvingOceanDepth),
299  m_minThickness(a_minThickness),
300  m_startTime(a_startTime),
301  m_endTime(a_endTime),
302  m_factorMuCoef(a_factorMuCoef)
303  {
304  ;
305  }
307  {
308  return new ThicknessCalvingModel( *this);
309  }
310 protected:
311  Real m_calvingThickness, m_calvingOceanDepth, m_minThickness, m_startTime, m_endTime;
312  bool m_factorMuCoef; // test muCoef*thickness rather than thickness?
313 private:
315 };
316 
317 
320 {
321 
322 public:
323 
324  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
325  LevelData<FArrayBox>& a_calvedIce,
326  LevelData<FArrayBox>& a_addedIce,
327  LevelData<FArrayBox>& a_removedIce,
328  LevelData<FArrayBox>& a_iceFrac,
329  const AmrIce& a_amrIce,
330  int a_level,
331  Stage a_stage);
332 
333  MaximumExtentCalvingModel(const RealVect& a_highLoc,
334  const RealVect& a_lowLoc,
335  const Real& a_startTime,
336  const Real& a_endTime)
337  : m_startTime(a_startTime),
338  m_endTime(a_endTime),
339  m_highLoc(a_highLoc),
340  m_lowLoc(a_lowLoc)
341  {
342  ;
343  }
344 
346  {
347  return new MaximumExtentCalvingModel ( *this);
348  }
349 
350 
351 protected:
352  Real m_startTime, m_endTime;
353  RealVect m_highLoc, m_lowLoc;
354 
355 private:
357 };
358 
359 
360 
362 
365 {
366 
367 public:
368 
369  CompositeCalvingModel(Vector<CalvingModel*> a_vectModels)
370  : m_vectModels(a_vectModels)
371  {
372  m_vectModels.resize(a_vectModels.size());
373  for (int i =0; i < m_vectModels.size(); i++)
374  {
375  m_vectModels[i] = a_vectModels[i]->new_CalvingModel();
376  }
377  }
378 
379  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
380  LevelData<FArrayBox>& a_calvedIce,
381  LevelData<FArrayBox>& a_addedIce,
382  LevelData<FArrayBox>& a_removedIce,
383  LevelData<FArrayBox>& a_iceFrac,
384  const AmrIce& a_amrIce,
385  int a_level,
386  Stage a_stage);
387 
388 
389  virtual ~CompositeCalvingModel();
390 
391  // this is public for simplicity
392  Vector<CalvingModel*> m_vectModels;
393 
395  {
396  return new CompositeCalvingModel (*this);
397  }
398 
400  {
401  m_vectModels.resize(a.m_vectModels.size());
402  for (int i =0; i < a.m_vectModels.size(); i++)
403  {
404  m_vectModels[i] = a.m_vectModels[i]->new_CalvingModel();
405  }
406  }
407 
408 
409 };
410 
411 
414 {
415 
416 public:
417 
418 
419  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
420  LevelData<FArrayBox>& a_calvedIce,
421  LevelData<FArrayBox>& a_addedIce,
422  LevelData<FArrayBox>& a_removedIce,
423  LevelData<FArrayBox>& a_iceFrac,
424  const AmrIce& a_amrIce,
425  int a_level,
426  Stage a_stage);
427 
428  FlotationCalvingModel (const Vector<int>& a_frontLo,
429  const Vector<int>& a_frontHi,
430  bool a_preserveSea,
431  bool a_preserveLand)
432  : m_domainEdgeCalvingModel(a_frontLo,a_frontHi,
433  a_preserveSea, a_preserveLand)
434  {
435 
436  }
437 
439  {
440  return new FlotationCalvingModel (*this);
441  }
442 
443 
444 private:
445  DomainEdgeCalvingModel m_domainEdgeCalvingModel ;
446 
447 
448 };
449 
451 
458 {
459 
460 public:
461 
462  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
463  LevelData<FArrayBox>& a_calvedIce,
464  LevelData<FArrayBox>& a_addedIce,
465  LevelData<FArrayBox>& a_removedIce,
466  LevelData<FArrayBox>& a_iceFrac,
467  const AmrIce& a_amrIce,
468  int a_level,
469  Stage a_stage);
470 
471 
472  CliffCollapseCalvingModel(const Real& a_maxCliffThickness,
473  const Real& a_recessionRate,
474  const Real& a_startTime,
475  const Real& a_endTime)
476  : m_maxCliffThickness(a_maxCliffThickness),
477  m_recessionRate(a_recessionRate),
478  m_startTime(a_startTime),
479  m_endTime(a_endTime)
480  {
481  ;
482  }
483 
485  {
486  return new CliffCollapseCalvingModel (*this);
487  }
488 
489 
490 protected:
491  Real m_maxCliffThickness, m_recessionRate, m_startTime, m_endTime;
492 
493 private:
495 
496 };
497 
498 
500 
506 {
507 
508  Real m_startTime, m_endTime;
509  DomainEdgeCalvingModel* m_domainEdgeCalvingModel;
510  SurfaceFlux* m_calvingRate;
511 
512 public:
513 
514  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
515  LevelData<FArrayBox>& a_calvedIce,
516  LevelData<FArrayBox>& a_addedIce,
517  LevelData<FArrayBox>& a_removedIce,
518  LevelData<FArrayBox>& a_iceFrac,
519  const AmrIce& a_amrIce,
520  int a_level,
521  Stage a_stage);
522 
523  VariableRateCalvingModel (ParmParse& a_pp);
524 
525  virtual ~VariableRateCalvingModel();
526 
527  virtual CalvingModel* new_CalvingModel();
528 
529  virtual void getCalvingRate(LevelData<FArrayBox>& a_calvingRate,
530  const AmrIce& a_amrIce,int a_level);
531 
532 };
533 
534 
536 
541 {
542 
543  Real m_startTime, m_endTime;
544  DomainEdgeCalvingModel* m_domainEdgeCalvingModel;
545  SurfaceFlux* m_proportion;
546 
547 public:
548 
549  virtual void applyCriterion(LevelData<FArrayBox>& a_thickness,
550  LevelData<FArrayBox>& a_calvedIce,
551  LevelData<FArrayBox>& a_addedIce,
552  LevelData<FArrayBox>& a_removedIce,
553  LevelData<FArrayBox>& a_iceFrac,
554  const AmrIce& a_amrIce,
555  int a_level,
556  Stage a_stage);
557 
558  RateProportionalToSpeedCalvingModel (ParmParse& a_pp);
559 
561 
562  virtual CalvingModel* new_CalvingModel();
563 
564  virtual void getCalvingRate(LevelData<FArrayBox>& a_calvingRate,
565  const AmrIce& a_amrIce,int a_level);
566 
567 };
568 
569 
570 #include "NamespaceFooter.H"
571 
572 #endif
calving model which removes all floating ice.
Definition: CalvingModel.H:413
virtual void applyCriterion(LevelData< FArrayBox > &a_thickness, LevelData< FArrayBox > &a_calvedIce, LevelData< FArrayBox > &a_addedIce, LevelData< FArrayBox > &a_removedIce, LevelData< FArrayBox > &a_iceFrac, const AmrIce &a_amrIce, int a_level, Stage a_stage)
Definition: CalvingModel.H:66
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:78
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:126
Real m_startTime
Definition: CalvingModel.H:261
Definition: CalvingModel.H:28
A thickness-based calving model which should permit advance and retreat.
Definition: CalvingModel.H:276
static void updateCalvedIce(const Real &a_thck, const Real a_prevThck, const int a_mask, Real &a_added, Real &a_calved, Real &a_removed)
Definition: CalvingModel.cpp:755
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:167
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:306
RealVect m_lowLoc
Definition: CalvingModel.H:353
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:438
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:345
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:212
bool m_factorMuCoef
Definition: CalvingModel.H:312
Ensure open ocean on one or more domain edges.
Definition: CalvingModel.H:141
static CalvingModel * parseCalvingModel(const char *a_prefix)
Definition: CalvingModel.cpp:281
MaximumExtentCalvingModel(const RealVect &a_highLoc, const RealVect &a_lowLoc, const Real &a_startTime, const Real &a_endTime)
Definition: CalvingModel.H:333
virtual void getWaterDepth(LevelData< FArrayBox > &a_waterDepth, const AmrIce &a_amrIce, int a_level)
water depth for crevasse calving.
Definition: CalvingModel.cpp:34
Definition: CalvingModel.H:28
bool m_preserveSea
Definition: CalvingModel.H:177
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:255
ThicknessCalvingModel(const Real &a_calvingThickness, const Real &a_calvingOceanDepth, const Real &a_minThickness, const Real &a_startTime, const Real &a_endTime, const bool &a_factorMuCoef)
Definition: CalvingModel.H:291
class to manage non-subcycled AMR ice-sheet model
Definition: AmrIce.H:40
virtual void applyCriterion(LevelData< FArrayBox > &a_thickness, LevelData< FArrayBox > &a_calvedIce, LevelData< FArrayBox > &a_addedIce, LevelData< FArrayBox > &a_removedIce, LevelData< FArrayBox > &a_iceFrac, const AmrIce &a_amrIce, int a_level, Stage a_stage)=0
Definition: CalvingModel.H:28
A Calving model that provides a rate proportional to speed: the constant of proportionality can vary ...
Definition: CalvingModel.H:540
CompositeCalvingModel(const CompositeCalvingModel &a)
Definition: CalvingModel.H:399
Calving model which lets us compose multiple calving models.
Definition: CalvingModel.H:364
Definition: CalvingModel.H:28
Vector< int > m_frontLo
Definition: CalvingModel.H:175
virtual CalvingModel * new_CalvingModel()=0
factory method
DomainEdgeCalvingModel(const Vector< int > &a_frontLo, const Vector< int > &a_frontHi, bool a_preserveSea, bool a_preserveLand)
Definition: CalvingModel.H:155
Real m_startTime
Definition: CalvingModel.H:352
CliffCollapseCalvingModel(const Real &a_maxCliffThickness, const Real &a_recessionRate, const Real &a_startTime, const Real &a_endTime)
Definition: CalvingModel.H:472
abstract class defining the surface flux interface
Definition: SurfaceFlux.H:39
Definition: CalvingModel.H:28
A calving model which enforces a maximum extent of the ice shelf.
Definition: CalvingModel.H:319
Definition: CalvingModel.H:227
FlotationCalvingModel(const Vector< int > &a_frontLo, const Vector< int > &a_frontHi, bool a_preserveSea, bool a_preserveLand)
Definition: CalvingModel.H:428
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:394
Calve ice based on proximity to the grounding line.
Definition: CalvingModel.H:184
Stage
Definition: CalvingModel.H:28
A calving model which implements the Pollard and DeConto cliff-collapse mechanism using the ice mask...
Definition: CalvingModel.H:457
Vector< CalvingModel * > m_vectModels
Definition: CalvingModel.H:392
A Calving model that provides a simple rate.
Definition: CalvingModel.H:505
virtual CalvingModel * new_CalvingModel()
factory method
Definition: CalvingModel.H:484
DeglaciationCalvingModelA(const Real &a_calvingThickness, const Real &a_calvingOceanDepth, const Real &a_minThickness, const Real &a_startTime, const Real &a_endTime)
Definition: CalvingModel.H:112
virtual ~CalvingModel()
Definition: CalvingModel.H:43
Vector< int > m_frontHi
Definition: CalvingModel.H:176
virtual base for calving models
Definition: CalvingModel.H:23
Real m_startTime
Definition: CalvingModel.H:134
ProximityCalvingModel(const Real &a_proximity, const Real &a_velocity, const Real &a_startTime, const Real &a_endTime)
Definition: CalvingModel.H:190
the simplest calving model : don&#39;t do anything
Definition: CalvingModel.H:61
Definition: CalvingModel.H:94
CompositeCalvingModel(Vector< CalvingModel *> a_vectModels)
Definition: CalvingModel.H:369
DeglaciationCalvingModelB(const Real &a_calvingThickness, const Real &a_calvingOceanDepth, const Real &a_minThickness, const Real &a_startTime, const Real &a_endTime)
Definition: CalvingModel.H:242
virtual void getCalvingRate(LevelData< FArrayBox > &a_calvingRate, const AmrIce &a_amrIce, int a_level)
frontal ablation rate.
Definition: CalvingModel.cpp:24
Real m_startTime
Definition: CalvingModel.H:491
Real m_startTime
Definition: CalvingModel.H:311