Ice Sheet System Model  4.18
Code documentation
HydrologyPismAnalysis.cpp
Go to the documentation of this file.
2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
6 
7 /*Model processing*/
8 void HydrologyPismAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
9 
10  return;
11 
12 }/*}}}*/
13 void HydrologyPismAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
14 
15  return;
16 
17 }/*}}}*/
18 void HydrologyPismAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr){/*{{{*/
19  return;
20 }/*}}}*/
21 int HydrologyPismAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
22  return 0;
23 }/*}}}*/
24 void HydrologyPismAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
25 
26  /*Fetch data needed: */
27  int hydrology_model,frictionlaw;
28  iomodel->FindConstant(&hydrology_model,"md.hydrology.model");
29 
30  /*Now, do we really want Pism?*/
31  if(hydrology_model!=HydrologypismEnum) return;
32 
33  /*Add input to elements*/
34  iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
35  iomodel->FetchDataToInput(inputs2,elements,"md.mask.ocean_levelset",MaskOceanLevelsetEnum);
36  iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
37  iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.drainage_rate",HydrologyDrainageRateEnum);
38  iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.watercolumn_max",HydrologyWatercolumnMaxEnum);
39  iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",WatercolumnEnum,0.);
40 }/*}}}*/
41 void HydrologyPismAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
42 
43  /*retrieve some parameters: */
44  int hydrology_model;
45  int numoutputs;
46  char** requestedoutputs = NULL;
47  iomodel->FindConstant(&hydrology_model,"md.hydrology.model");
48 
49  /*Now, do we really want Pism?*/
50  if(hydrology_model!=HydrologypismEnum) return;
51  parameters->AddObject(new IntParam(HydrologyModelEnum,hydrology_model));
52 
53  /*Requested outputs*/
54  iomodel->FindConstant(&requestedoutputs,&numoutputs,"md.hydrology.requested_outputs");
55  parameters->AddObject(new IntParam(HydrologyNumRequestedOutputsEnum,numoutputs));
56  if(numoutputs)parameters->AddObject(new StringArrayParam(HydrologyRequestedOutputsEnum,requestedoutputs,numoutputs));
57  iomodel->DeleteData(&requestedoutputs,numoutputs,"md.hydrology.requested_outputs");
58 
59  /*Nothing else to add for now*/
60 }/*}}}*/
61 
62 /*Finite Element Analysis*/
64  _error_("not implemented");
65 }/*}}}*/
67  _error_("not implemented");
68 }/*}}}*/
70 _error_("Not implemented");
71 }/*}}}*/
73  _error_("not implemented");
74 }/*}}}*/
76  _error_("not implemented");
77 }/*}}}*/
79  _error_("not implemented");
80 }/*}}}*/
81 void HydrologyPismAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
82  _error_("Not implemented yet");
83 }/*}}}*/
85  _error_("not implemented");
86 }/*}}}*/
88  _error_("not implemented");
89 }/*}}}*/
90 
91 /*Additional methods*/
93 
94  for(int j=0;j<femmodel->elements->Size();j++){
96  this->UpdateWaterColumn(element);
97  }
98 
99 }/*}}}*/
101 
102  /*Skip if water or ice shelf element*/
103  if(element->IsFloating()) return;
104 
105  /*Intermediaries */
106  IssmDouble dt,drainage_rate,water_column;
107 
108  /*Retrieve all inputs and parameters*/
109  element->FindParam(&dt,TimesteppingTimeStepEnum);
110  IssmDouble rho_ice = element->FindParam(MaterialsRhoIceEnum);
111  IssmDouble rho_water = element->FindParam(MaterialsRhoFreshwaterEnum);
112 
113  /*Get water column and drainage rate*/
114  const int numvertices= element->GetNumberOfVertices();
115  IssmDouble* watercolumn = xNew<IssmDouble>(numvertices);
116  IssmDouble* drainagerate = xNew<IssmDouble>(numvertices);
117  IssmDouble* meltingrate = xNew<IssmDouble>(numvertices);
118  IssmDouble* watercolumn_max = xNew<IssmDouble>(numvertices);
119  element->GetInputListOnVertices(&watercolumn[0],WaterColumnOldEnum);
120  element->GetInputListOnVertices(&drainagerate[0],HydrologyDrainageRateEnum);
122  element->GetInputListOnVertices(&watercolumn_max[0],HydrologyWatercolumnMaxEnum);
123 
124  /*Add water*/
125  for(int i=0;i<numvertices;i++){
126  watercolumn[i] += (meltingrate[i]/rho_ice*rho_water-drainagerate[i])*dt;
127  /*Check that water column height is within 0 and upper bound, correct if needed*/
128  if(watercolumn[i]>watercolumn_max[i]) watercolumn[i]=watercolumn_max[i];
129  if(watercolumn[i]<0) watercolumn[i]=0.;
130  }
131 
132  /* Divide by connectivity, add degree of channelization as an input */
133  /*FIXME: should be changed to P1, this is due to the NR, IsFloating will return 0 on this element, but it should not be DG*/
134  element->AddInput2(WatercolumnEnum,&watercolumn[0],P1DGEnum);
135 
136  /*Clean up and return*/
137  xDelete<IssmDouble>(watercolumn);
138  xDelete<IssmDouble>(meltingrate);
139  xDelete<IssmDouble>(watercolumn_max);
140  xDelete<IssmDouble>(drainagerate);
141 }/*}}}*/
DataSet::Size
int Size()
Definition: DataSet.cpp:399
HydrologyPismAnalysis::GradientJ
void GradientJ(Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)
Definition: HydrologyPismAnalysis.cpp:81
IssmDouble
double IssmDouble
Definition: types.h:37
Nodes
Declaration of Nodes class.
Definition: Nodes.h:19
Element::FindParam
void FindParam(bool *pvalue, int paramenum)
Definition: Element.cpp:933
HydrologyRequestedOutputsEnum
@ HydrologyRequestedOutputsEnum
Definition: EnumDefinitions.h:173
HydrologyPismAnalysis::UpdateParameters
void UpdateParameters(Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum)
Definition: HydrologyPismAnalysis.cpp:41
MaskOceanLevelsetEnum
@ MaskOceanLevelsetEnum
Definition: EnumDefinitions.h:640
Parameters
Declaration of Parameters class.
Definition: Parameters.h:18
MaskIceLevelsetEnum
@ MaskIceLevelsetEnum
Definition: EnumDefinitions.h:641
MaterialsRhoFreshwaterEnum
@ MaterialsRhoFreshwaterEnum
Definition: EnumDefinitions.h:263
TimesteppingTimeStepEnum
@ TimesteppingTimeStepEnum
Definition: EnumDefinitions.h:433
Constraints
Declaration of Constraints class.
Definition: Constraints.h:13
HydrologyPismAnalysis::CreateDVector
ElementVector * CreateDVector(Element *element)
Definition: HydrologyPismAnalysis.cpp:66
Elements
Declaration of Elements class.
Definition: Elements.h:17
MaterialsRhoIceEnum
@ MaterialsRhoIceEnum
Definition: EnumDefinitions.h:264
P1DGEnum
@ P1DGEnum
Definition: EnumDefinitions.h:1215
Element::IsFloating
bool IsFloating()
Definition: Element.cpp:1987
HydrologyPismAnalysis::CreateConstraints
void CreateConstraints(Constraints *constraints, IoModel *iomodel)
Definition: HydrologyPismAnalysis.cpp:8
HydrologyPismAnalysis::DofsPerNode
int DofsPerNode(int **doflist, int domaintype, int approximation)
Definition: HydrologyPismAnalysis.cpp:21
Parameters::AddObject
void AddObject(Param *newparam)
Definition: Parameters.cpp:67
Element
Definition: Element.h:41
IoModel::DeleteData
void DeleteData(int num,...)
Definition: IoModel.cpp:500
HydrologyPismAnalysis::Core
void Core(FemModel *femmodel)
Definition: HydrologyPismAnalysis.cpp:63
BasalforcingsGroundediceMeltingRateEnum
@ BasalforcingsGroundediceMeltingRateEnum
Definition: EnumDefinitions.h:478
Element::AddInput2
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
Definition: Element.h:216
HydrologyPismAnalysis.h
: header file for generic external result object
HydrologyPismAnalysis::CreateJacobianMatrix
ElementMatrix * CreateJacobianMatrix(Element *element)
Definition: HydrologyPismAnalysis.cpp:69
IoModel::FindConstant
void FindConstant(bool *pvalue, const char *constant_name)
Definition: IoModel.cpp:2362
StringArrayParam
Definition: StringArrayParam.h:20
HydrologyPismAnalysis::UpdateConstraints
void UpdateConstraints(FemModel *femmodel)
Definition: HydrologyPismAnalysis.cpp:87
HydrologyPismAnalysis::CreatePVector
ElementVector * CreatePVector(Element *element)
Definition: HydrologyPismAnalysis.cpp:75
IntParam
Definition: IntParam.h:20
WaterColumnOldEnum
@ WaterColumnOldEnum
Definition: EnumDefinitions.h:858
HydrologyDrainageRateEnum
@ HydrologyDrainageRateEnum
Definition: EnumDefinitions.h:612
Inputs2
Declaration of Inputs class.
Definition: Inputs2.h:23
HydrologyPismAnalysis::CreateLoads
void CreateLoads(Loads *loads, IoModel *iomodel)
Definition: HydrologyPismAnalysis.cpp:13
HydrologyNumRequestedOutputsEnum
@ HydrologyNumRequestedOutputsEnum
Definition: EnumDefinitions.h:170
HydrologyPismAnalysis::CreateNodes
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
Definition: HydrologyPismAnalysis.cpp:18
FemModel::elements
Elements * elements
Definition: FemModel.h:44
FemModel
Definition: FemModel.h:31
HydrologyPismAnalysis::InputUpdateFromSolution
void InputUpdateFromSolution(IssmDouble *solution, Element *element)
Definition: HydrologyPismAnalysis.cpp:84
Loads
Declaration of Loads class.
Definition: Loads.h:16
HydrologyModelEnum
@ HydrologyModelEnum
Definition: EnumDefinitions.h:169
HydrologyPismAnalysis::UpdateWaterColumn
void UpdateWaterColumn(FemModel *femmodel)
Definition: HydrologyPismAnalysis.cpp:92
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
HydrologyWatercolumnMaxEnum
@ HydrologyWatercolumnMaxEnum
Definition: EnumDefinitions.h:623
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
HydrologypismEnum
@ HydrologypismEnum
Definition: EnumDefinitions.h:1107
WatercolumnEnum
@ WatercolumnEnum
Definition: EnumDefinitions.h:859
IoModel::FetchDataToInput
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
Definition: IoModel.cpp:1651
HydrologyPismAnalysis::GetSolutionFromInputs
void GetSolutionFromInputs(Vector< IssmDouble > *solution, Element *element)
Definition: HydrologyPismAnalysis.cpp:78
ElementVector
Definition: ElementVector.h:20
IoModel
Definition: IoModel.h:48
Element::GetNumberOfVertices
virtual int GetNumberOfVertices(void)=0
Element::GetInputListOnVertices
void GetInputListOnVertices(IssmDouble *pvalue, int enumtype)
Definition: Element.cpp:1131
ElementMatrix
Definition: ElementMatrix.h:19
Vector< IssmDouble >
HydrologyPismAnalysis::UpdateElements
void UpdateElements(Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type)
Definition: HydrologyPismAnalysis.cpp:24
HydrologyPismAnalysis::CreateKMatrix
ElementMatrix * CreateKMatrix(Element *element)
Definition: HydrologyPismAnalysis.cpp:72
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16