Ice Sheet System Model  4.18
Code documentation
Functions
FloatingiceMeltingRatex.h File Reference

header file for Floatingice melting rate More...

#include "../../classes/classes.h"
#include "../FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.h"

Go to the source code of this file.

Functions

void FloatingiceMeltingRatex (FemModel *femmodel)
 
void LinearFloatingiceMeltingRatex (FemModel *femmodel)
 
void SpatialLinearFloatingiceMeltingRatex (FemModel *femmodel)
 
void MismipFloatingiceMeltingRatex (FemModel *femmodel)
 
void FloatingiceMeltingRateIsmip6x (FemModel *femmodel)
 
void BeckmannGoosseFloatingiceMeltingRatex (FemModel *femmodel)
 

Detailed Description

header file for Floatingice melting rate

Definition in file FloatingiceMeltingRatex.h.

Function Documentation

◆ FloatingiceMeltingRatex()

void FloatingiceMeltingRatex ( FemModel femmodel)

Definition at line 10 of file FloatingiceMeltingRatex.cpp.

10  {/*{{{*/
11 
12  /*Intermediaties*/
13  int basalforcing_model;
14 
15  /*First, get BMB model from parameters*/
16  femmodel->parameters->FindParam(&basalforcing_model,BasalforcingsEnum);
17 
18  /*branch to correct module*/
19  switch(basalforcing_model){
22  /*Nothing to be done*/
23  break;
25  if(VerboseSolution())_printf0_(" call Linear Floating melting rate module\n");
27  break;
29  if(VerboseSolution())_printf0_(" call Mismip Floating melting rate module\n");
31  break;
33  if(VerboseSolution())_printf0_(" call Spatial Linear Floating melting rate module\n");
35  break;
37  if(VerboseSolution())_printf0_(" call Pico Floating melting rate module\n");
39  break;
41  if(VerboseSolution())_printf0_(" call ISMIP 6 Floating melting rate module\n");
43  break;
45  if(VerboseSolution())_printf0_(" call BeckmannGoosse Floating melting rate module\n");
47  break;
48  default:
49  _error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
50  }
51 
52 }/*}}}*/

◆ LinearFloatingiceMeltingRatex()

void LinearFloatingiceMeltingRatex ( FemModel femmodel)

Definition at line 54 of file FloatingiceMeltingRatex.cpp.

54  {/*{{{*/
55 
56  for(int i=0;i<femmodel->elements->Size();i++){
57  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
59  }
60 
61 }/*}}}*/

◆ SpatialLinearFloatingiceMeltingRatex()

void SpatialLinearFloatingiceMeltingRatex ( FemModel femmodel)

Definition at line 62 of file FloatingiceMeltingRatex.cpp.

62  {/*{{{*/
63 
64  for(int i=0;i<femmodel->elements->Size();i++){
65  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
67  }
68 
69 }/*}}}*/

◆ MismipFloatingiceMeltingRatex()

void MismipFloatingiceMeltingRatex ( FemModel femmodel)

Definition at line 70 of file FloatingiceMeltingRatex.cpp.

70  {/*{{{*/
71 
72  for(int i=0;i<femmodel->elements->Size();i++){
73  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
75  }
76 }

◆ FloatingiceMeltingRateIsmip6x()

void FloatingiceMeltingRateIsmip6x ( FemModel femmodel)

Definition at line 78 of file FloatingiceMeltingRatex.cpp.

78  {/*{{{*/
79 
80  int num_basins, basinid, num_depths, domaintype;
81  IssmDouble area, tf, base, time;
82  bool islocal;
83  IssmDouble* tf_depths = NULL;
84 
86  femmodel->parameters->FindParam(&tf_depths,&num_depths,BasalforcingsIsmip6TfDepthsEnum); _assert_(tf_depths);
88 
89  /*Binary search works for vectors that are sorted in increasing order only, make depths positive*/
90  for(int i=0;i<num_depths;i++) tf_depths[i] = -tf_depths[i];
91 
92  IssmDouble* tf_weighted_avg = xNewZeroInit<IssmDouble>(num_basins);
93  IssmDouble* tf_weighted_avg_cpu = xNewZeroInit<IssmDouble>(num_basins);
94  IssmDouble* areas_summed = xNewZeroInit<IssmDouble>(num_basins);
95  IssmDouble* areas_summed_cpu = xNewZeroInit<IssmDouble>(num_basins);
96 
97  /*Get TF at each ice shelf point - linearly intepolate in depth and time*/
98  for(int i=0;i<femmodel->elements->Size();i++){
99  Element* element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
100  int numvertices = element->GetNumberOfVertices();
101 
102  /*Set melt to 0 if non floating*/
103  if(!element->IsIceInElement() || !element->IsFloating() || !element->IsOnBase()){
104  IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
107  xDelete<IssmDouble>(values);
108  continue;
109  }
110 
111  /*Get TF on all vertices*/
112  IssmDouble* tf_test = xNew<IssmDouble>(numvertices);
113  IssmDouble* depth_vertices = xNew<IssmDouble>(numvertices);
114  DatasetInput2* tf_input = element->GetDatasetInput2(BasalforcingsIsmip6TfEnum); _assert_(tf_input);
115 
116  element->GetInputListOnVertices(&depth_vertices[0],BaseEnum);
117 
118  Gauss* gauss=element->NewGauss();
119  for(int iv=0;iv<numvertices;iv++){
120  gauss->GaussVertex(iv);
121 
122  /*Find out where the ice shelf base is within tf_depths*/
123  IssmDouble depth = -depth_vertices[iv]; /*NOTE: make sure we are dealing with depth>0*/
124  int offset;
125  int found=binary_search(&offset,depth,tf_depths,num_depths);
126  if(!found) _error_("depth not found");
127 
128  if (offset==-1){
129  /*get values for the first depth: */
130  _assert_(depth<=tf_depths[0]);
131  tf_input->GetInputValue(&tf_test[iv],gauss,0);
132  }
133  else if(offset==num_depths-1){
134  /*get values for the last time: */
135  _assert_(depth>=tf_depths[num_depths-1]);
136  tf_input->GetInputValue(&tf_test[iv],gauss,num_depths-1);
137  }
138  else {
139  /*get values between two times [offset:offset+1], Interpolate linearly*/
140  _assert_(depth>=tf_depths[offset] && depth<tf_depths[offset+1]);
141  IssmDouble deltaz=tf_depths[offset+1]-tf_depths[offset];
142  IssmDouble alpha2=(depth-tf_depths[offset])/deltaz;
143  IssmDouble alpha1=(1.-alpha2);
144  IssmDouble tf1,tf2;
145  tf_input->GetInputValue(&tf1,gauss,offset);
146  tf_input->GetInputValue(&tf2,gauss,offset+1);
147  tf_test[iv] = alpha1*tf1 + alpha2*tf2;
148  }
149  }
150 
152  xDelete<IssmDouble>(tf_test);
153  xDelete<IssmDouble>(depth_vertices);
154  delete gauss;
155  }
156 
157  if(!islocal) {
158  /*Compute sums of tf*area and shelf-area per cpu*/
159  for(int i=0;i<femmodel->elements->Size();i++){
160  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
161  if(!element->IsOnBase() || !element->IsIceInElement() || !element->IsFloating()) continue;
162  /*Spawn basal element if on base to compute element area*/
163  Element* basalelement = element->SpawnBasalElement();
164  Input2* tf_input=basalelement->GetInput2(BasalforcingsIsmip6TfShelfEnum); _assert_(tf_input);
165  basalelement->GetInputValue(&basinid,BasalforcingsIsmip6BasinIdEnum);
166  Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0);
167  tf_input->GetInputValue(&tf,gauss);
168  delete gauss;
169  area=basalelement->GetHorizontalSurfaceArea();
170  tf_weighted_avg[basinid]+=tf*area;
171  areas_summed[basinid] +=area;
172  /*Delete spawned element if we are in 3D*/
173  basalelement->FindParam(&domaintype,DomainTypeEnum);
174  if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
175  }
176 
177  /*Syncronize across cpus*/
178  ISSM_MPI_Allreduce(tf_weighted_avg,tf_weighted_avg_cpu,num_basins,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
179  ISSM_MPI_Allreduce(areas_summed,areas_summed_cpu,num_basins,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
180 
181  /*Compute weighted means and save*/
182  for(int k=0;k<num_basins;k++){tf_weighted_avg_cpu[k] = tf_weighted_avg_cpu[k]/areas_summed_cpu[k];}
183  femmodel->parameters->AddObject(new DoubleVecParam(BasalforcingsIsmip6AverageTfEnum,tf_weighted_avg_cpu,num_basins));
184  }
185 
186  /*Compute meltrates*/
187  for(int i=0;i<femmodel->elements->Size();i++){
188  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
189  element->Ismip6FloatingiceMeltingRate();
190  }
191 
192  /*Cleanup and return */
193  xDelete<IssmDouble>(tf_weighted_avg);
194  xDelete<IssmDouble>(tf_weighted_avg_cpu);
195  xDelete<IssmDouble>(areas_summed);
196  xDelete<IssmDouble>(areas_summed_cpu);
197  xDelete<IssmDouble>(tf_depths);
198 }

◆ BeckmannGoosseFloatingiceMeltingRatex()

void BeckmannGoosseFloatingiceMeltingRatex ( FemModel femmodel)

Definition at line 200 of file FloatingiceMeltingRatex.cpp.

200  {/*{{{*/
201 
202  for(int i=0;i<femmodel->elements->Size();i++){
203  Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
205  }
206 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
BaseEnum
@ BaseEnum
Definition: EnumDefinitions.h:495
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
IssmDouble
double IssmDouble
Definition: types.h:37
Element::IsOnBase
bool IsOnBase()
Definition: Element.cpp:1984
DatasetInput2
Definition: DatasetInput2.h:14
BasalforcingsIsmip6IsLocalEnum
@ BasalforcingsIsmip6IsLocalEnum
Definition: EnumDefinitions.h:69
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
ISSM_MPI_Allreduce
int ISSM_MPI_Allreduce(void *sendbuf, void *recvbuf, int count, ISSM_MPI_Datatype datatype, ISSM_MPI_Op op, ISSM_MPI_Comm comm)
Definition: issmmpi.cpp:116
Element::FindParam
void FindParam(bool *pvalue, int paramenum)
Definition: Element.cpp:933
BasalforcingsEnum
@ BasalforcingsEnum
Definition: EnumDefinitions.h:64
ISSM_MPI_SUM
#define ISSM_MPI_SUM
Definition: issmmpi.h:134
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
BasalforcingsIsmip6TfDepthsEnum
@ BasalforcingsIsmip6TfDepthsEnum
Definition: EnumDefinitions.h:71
Element::SpawnBasalElement
virtual Element * SpawnBasalElement(void)=0
MismipFloatingMeltRateEnum
@ MismipFloatingMeltRateEnum
Definition: EnumDefinitions.h:1190
P1DGEnum
@ P1DGEnum
Definition: EnumDefinitions.h:1215
BasalforcingsPicoEnum
@ BasalforcingsPicoEnum
Definition: EnumDefinitions.h:990
FloatingiceMeltingRateIsmip6x
void FloatingiceMeltingRateIsmip6x(FemModel *femmodel)
Definition: FloatingiceMeltingRatex.cpp:78
Element::IsFloating
bool IsFloating()
Definition: Element.cpp:1987
DatasetInput2::GetInputValue
void GetInputValue(IssmDouble *pvalue, Gauss *gauss, int index)
Definition: DatasetInput2.cpp:199
BasalforcingsIsmip6NumBasinsEnum
@ BasalforcingsIsmip6NumBasinsEnum
Definition: EnumDefinitions.h:70
Parameters::AddObject
void AddObject(Param *newparam)
Definition: Parameters.cpp:67
Element::GetInput2
virtual Input2 * GetInput2(int inputenum)=0
Element::DeleteMaterials
void DeleteMaterials(void)
Definition: Element.cpp:429
Element::GetHorizontalSurfaceArea
virtual IssmDouble GetHorizontalSurfaceArea(void)
Definition: Element.h:245
Element
Definition: Element.h:41
Element::GetDatasetInput2
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
Definition: Element.h:250
Domain2DhorizontalEnum
@ Domain2DhorizontalEnum
Definition: EnumDefinitions.h:534
ISSM_MPI_DOUBLE
#define ISSM_MPI_DOUBLE
Definition: issmmpi.h:125
Element::MismipFloatingiceMeltingRate
void MismipFloatingiceMeltingRate()
Definition: Element.cpp:2331
Element::Ismip6FloatingiceMeltingRate
void Ismip6FloatingiceMeltingRate()
Definition: Element.cpp:2041
DomainTypeEnum
@ DomainTypeEnum
Definition: EnumDefinitions.h:124
Element::AddInput2
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
Definition: Element.h:216
Element::NewGauss
virtual Gauss * NewGauss(void)=0
FloatingMeltRateEnum
@ FloatingMeltRateEnum
Definition: EnumDefinitions.h:1069
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
LinearFloatingMeltRateEnum
@ LinearFloatingMeltRateEnum
Definition: EnumDefinitions.h:1143
BeckmannGoosseFloatingMeltRateEnum
@ BeckmannGoosseFloatingMeltRateEnum
Definition: EnumDefinitions.h:991
MantlePlumeGeothermalFluxEnum
@ MantlePlumeGeothermalFluxEnum
Definition: EnumDefinitions.h:1158
BasalforcingsFloatingiceMeltingRateEnum
@ BasalforcingsFloatingiceMeltingRateEnum
Definition: EnumDefinitions.h:476
Element::BeckmannGoosseFloatingiceMeltingRate
void BeckmannGoosseFloatingiceMeltingRate()
Definition: Element.cpp:2360
SpatialLinearFloatingMeltRateEnum
@ SpatialLinearFloatingMeltRateEnum
Definition: EnumDefinitions.h:1278
Element::SpatialLinearFloatingiceMeltingRate
void SpatialLinearFloatingiceMeltingRate()
Definition: Element.cpp:2146
BasalforcingsIsmip6Enum
@ BasalforcingsIsmip6Enum
Definition: EnumDefinitions.h:989
MismipFloatingiceMeltingRatex
void MismipFloatingiceMeltingRatex(FemModel *femmodel)
Definition: FloatingiceMeltingRatex.cpp:70
FemModel::elements
Elements * elements
Definition: FemModel.h:44
Input2
Definition: Input2.h:18
BasalforcingsIsmip6TfEnum
@ BasalforcingsIsmip6TfEnum
Definition: EnumDefinitions.h:481
Gauss::GaussVertex
virtual void GaussVertex(int iv)=0
BasalforcingsIsmip6BasinIdEnum
@ BasalforcingsIsmip6BasinIdEnum
Definition: EnumDefinitions.h:480
Element::IsIceInElement
bool IsIceInElement()
Definition: Element.cpp:2021
Element::LinearFloatingiceMeltingRate
void LinearFloatingiceMeltingRate()
Definition: Element.cpp:2106
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
VerboseSolution
bool VerboseSolution(void)
Definition: Verbosity.cpp:24
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
DoubleVecParam
Definition: DoubleVecParam.h:20
FloatingiceMeltingRatePicox
void FloatingiceMeltingRatePicox(FemModel *femmodel)
Definition: FloatingiceMeltingRatePicox.cpp:10
Gauss::GaussPoint
virtual void GaussPoint(int ig)=0
Element::GetInputValue
void GetInputValue(bool *pvalue, int enum_type)
Definition: Element.cpp:1177
SpatialLinearFloatingiceMeltingRatex
void SpatialLinearFloatingiceMeltingRatex(FemModel *femmodel)
Definition: FloatingiceMeltingRatex.cpp:62
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
BasalforcingsIsmip6TfShelfEnum
@ BasalforcingsIsmip6TfShelfEnum
Definition: EnumDefinitions.h:482
Input2::GetInputValue
virtual void GetInputValue(IssmDouble *pvalue, Gauss *gauss)
Definition: Input2.h:38
binary_search
int binary_search(int *poffset, int target, int *sorted_integers, int num_integers)
Definition: binary_search.cpp:14
BasalforcingsIsmip6AverageTfEnum
@ BasalforcingsIsmip6AverageTfEnum
Definition: EnumDefinitions.h:65
Element::GetNumberOfVertices
virtual int GetNumberOfVertices(void)=0
Element::GetInputListOnVertices
void GetInputListOnVertices(IssmDouble *pvalue, int enumtype)
Definition: Element.cpp:1131
BeckmannGoosseFloatingiceMeltingRatex
void BeckmannGoosseFloatingiceMeltingRatex(FemModel *femmodel)
Definition: FloatingiceMeltingRatex.cpp:200
Gauss
Definition: Gauss.h:8
LinearFloatingiceMeltingRatex
void LinearFloatingiceMeltingRatex(FemModel *femmodel)
Definition: FloatingiceMeltingRatex.cpp:54
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16