Ice Sheet System Model  4.18
Code documentation
Functions
hydrology_core.cpp File Reference

: core of the hydrology solution More...

#include "./cores.h"
#include "../toolkits/toolkits.h"
#include "../classes/classes.h"
#include "../shared/shared.h"
#include "../modules/modules.h"
#include "../solutionsequences/solutionsequences.h"

Go to the source code of this file.

Functions

void hydrology_core (FemModel *femmodel)
 

Detailed Description

: core of the hydrology solution

Definition in file hydrology_core.cpp.

Function Documentation

◆ hydrology_core()

void hydrology_core ( FemModel femmodel)

Definition at line 12 of file hydrology_core.cpp.

12  {
13 
14  /*Start profiler*/
16 
17  /*intermediary*/
18  int hydrology_model;
19  int solution_type;
20  int numoutputs = 0;
21  bool save_results;
22  bool modify_loads = true;
23  char **requested_outputs = NULL;
24  IssmDouble ThawedNodes;
25 
26  /*first recover parameters common to all solutions*/
28  femmodel->parameters->FindParam(&hydrology_model,HydrologyModelEnum);
31  if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,HydrologyRequestedOutputsEnum);
32 
33  /*Using the Shreve based Model*/
34  if (hydrology_model==HydrologyshreveEnum){
35  if(VerboseSolution()) _printf0_(" computing water heads\n");
36  /*first compute slopes: */
39  /*and then go to water column*/
40  if(VerboseSolution()) _printf0_(" computing water column\n");
43  /*transfer water column thickness to old water column thickness: */
45 
46  }
47 
48  /*Using the double continuum model*/
49  else if (hydrology_model==HydrologydcEnum){
50  /*intermediary: */
51  bool isefficientlayer;
52  /*recover parameters: */
54 
55  /*first we exclude frozen nodes of the solved nodes*/
57  femmodel->HydrologyIDSupdateDomainx(&ThawedNodes);
58 
59  if(ThawedNodes>0){
60  /*check if we need sub steps*/
61  int dtslices;
63 
64  if(dtslices>1){
65  int substep, numaveragedinput, hydro_averaging;
66  IssmDouble global_time, subtime, yts;
67  IssmDouble dt, subdt;
68 
69  femmodel->parameters->FindParam(&global_time,TimeEnum);
73 
74  subtime=global_time-dt; //getting the time back to the start of the timestep
75  subdt=dt/dtslices; //computing hydro dt from dt and a divider
76  substep=0;
79 
80  /*intermiedaries to deal with averaging*/
84  std::vector<int> substepinput;
85  std::vector<int> transientinput;
86  std::vector<int> averagedinput;
87 
88  if (isefficientlayer){
89  /*define which variable needs to be averaged on the sub-timestep and initialize as needed*/
90  numaveragedinput = 4;
91  substepinput.assign(substeplist,substeplist+4);
92  transientinput.assign(transientlist,transientlist+4);
93  averagedinput.assign(averagelist,averagelist+4);
94  }
95  else{
96  numaveragedinput = 2;
97  substepinput.assign(substeplist,substeplist+2);
98  transientinput.assign(transientlist,transientlist+2);
99  averagedinput.assign(averagelist,averagelist+2);
100  }
101  femmodel->InitTransientInputx(&transientinput[0],numaveragedinput);
102  while(substep<dtslices){ //loop on hydro dts
103  substep+=1;
104  subtime+=subdt;
105  /*Setting substep time as global time*/
107  if(VerboseSolution()) _printf0_("sub iteration " << substep << "/" << dtslices << " time [yr]: " << setprecision(4) << subtime/yts << " (time step: " << subdt/yts << ")\n");
108  if(VerboseSolution()) _printf0_(" computing water heads\n");
109  /*save preceding timestep*/
111  if (isefficientlayer){
114  }
115  /*Proceed now to heads computations*/
117  /*If we have a sub-timestep we store the substep inputs in a transient input here*/
118  femmodel->StackTransientInputx(&substepinput[0],&transientinput[0],subtime,numaveragedinput);
119  }
120  /*averaging the stack*/
121  femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,hydro_averaging);
122  /*And reseting to global time*/
124  femmodel->parameters->SetParam(global_time,TimeEnum);
125  }
126  else{
128  if (isefficientlayer){
131  }
132  /*Proceed now to heads computations*/
133  if(VerboseSolution()) _printf0_(" computing water heads\n");
135  /*If no substeps are present we want to duplicate the results for coupling purposes*/
138  if (isefficientlayer){
141  }
142  }
143  }
144  if(VerboseSolution())_printf0_(" hydroDC done\n");
145  }
146 
147  /*Using the SHAKTI model*/
148  else if (hydrology_model==HydrologyshaktiEnum){
152  if(VerboseSolution()) _printf0_(" updating gap height\n");
154  analysis->UpdateGapHeight(femmodel);
155  delete analysis;
156  }
157 
158  /*Using the GlaDS model*/
159  else if (hydrology_model==HydrologyGlaDSEnum){
162 
163  /*Set fields as old*/
167 
168  /*Solve for new potential*/
170 
171  if(VerboseSolution()) _printf0_(" updating effective pressure\n");
173  delete analysis;
174  }
175 
176  /*Using the PISM hydrology model*/
177  else if (hydrology_model==HydrologypismEnum){
179  if(VerboseSolution()) _printf0_(" updating water column\n");
182  analysis->UpdateWaterColumn(femmodel);
183  delete analysis;
184  }
185  else{
186  _error_("Hydrology model "<< EnumToStringx(hydrology_model) <<" not supported yet");
187  }
188  if(save_results){
189  if(VerboseSolution()) _printf0_(" saving hydrology results \n");
190  if(hydrology_model==HydrologydcEnum && ThawedNodes==0){
191  if(VerboseSolution()) _printf0_(" No thawed node hydro is skiped \n");}
192  else{
193  femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
194  }
195  }
196  /*Free ressources:*/
197  if(numoutputs){
198  for(int i=0;i<numoutputs;i++){
199  xDelete<char>(requested_outputs[i]);
200  }
201  xDelete<char*>(requested_outputs);
202  }
203  /*End profiler*/
205 }
SedimentHeadOldEnum
@ SedimentHeadOldEnum
Definition: EnumDefinitions.h:699
EffectivePressureSubstepEnum
@ EffectivePressureSubstepEnum
Definition: EnumDefinitions.h:549
SaveResultsEnum
@ SaveResultsEnum
Definition: EnumDefinitions.h:302
HydrologyShaktiAnalysis::UpdateGapHeight
void UpdateGapHeight(FemModel *femmodel)
Definition: HydrologyShaktiAnalysis.cpp:457
IssmDouble
double IssmDouble
Definition: types.h:37
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
HydrologySheetThicknessOldEnum
@ HydrologySheetThicknessOldEnum
Definition: EnumDefinitions.h:622
HydrologydcEnum
@ HydrologydcEnum
Definition: EnumDefinitions.h:1106
HydrologyRequestedOutputsEnum
@ HydrologyRequestedOutputsEnum
Definition: EnumDefinitions.h:173
FemModel::InitTransientInputx
void InitTransientInputx(int *transientinput_enum, int numoutputs)
Definition: FemModel.cpp:5202
HydraulicPotentialEnum
@ HydraulicPotentialEnum
Definition: EnumDefinitions.h:597
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
TimeEnum
@ TimeEnum
Definition: EnumDefinitions.h:427
TimesteppingTimeStepEnum
@ TimesteppingTimeStepEnum
Definition: EnumDefinitions.h:433
HydrologyShaktiAnalysis
Definition: HydrologyShaktiAnalysis.h:11
HydrologydcIsefficientlayerEnum
@ HydrologydcIsefficientlayerEnum
Definition: EnumDefinitions.h:185
FemModel::results
Results * results
Definition: FemModel.h:48
HydrologydcEplThicknessSubstepEnum
@ HydrologydcEplThicknessSubstepEnum
Definition: EnumDefinitions.h:605
HydrologyHeadOldEnum
@ HydrologyHeadOldEnum
Definition: EnumDefinitions.h:616
HydrologyShaktiAnalysisEnum
@ HydrologyShaktiAnalysisEnum
Definition: EnumDefinitions.h:1103
HydrologydcEplThicknessTransientEnum
@ HydrologydcEplThicknessTransientEnum
Definition: EnumDefinitions.h:606
ConstantsYtsEnum
@ ConstantsYtsEnum
Definition: EnumDefinitions.h:104
HydrologyPismAnalysisEnum
@ HydrologyPismAnalysisEnum
Definition: EnumDefinitions.h:1102
HydrologydcEplThicknessOldEnum
@ HydrologydcEplThicknessOldEnum
Definition: EnumDefinitions.h:604
EplHeadEnum
@ EplHeadEnum
Definition: EnumDefinitions.h:553
solutionsequence_nonlinear
void solutionsequence_nonlinear(FemModel *femmodel, bool conserve_loads)
Definition: solutionsequence_nonlinear.cpp:11
solutionsequence_shakti_nonlinear
void solutionsequence_shakti_nonlinear(FemModel *femmodel)
Definition: solutionsequence_shakti_nonlinear.cpp:11
HydrologyDCInefficientAnalysisEnum
@ HydrologyDCInefficientAnalysisEnum
Definition: EnumDefinitions.h:1099
HydrologyGlaDSAnalysisEnum
@ HydrologyGlaDSAnalysisEnum
Definition: EnumDefinitions.h:1100
HydrologyGlaDSAnalysis::UpdateEffectivePressure
void UpdateEffectivePressure(FemModel *femmodel)
Definition: HydrologyGlaDSAnalysis.cpp:547
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
SedimentHeadTransientEnum
@ SedimentHeadTransientEnum
Definition: EnumDefinitions.h:701
FemModel::HydrologyIDSupdateDomainx
void HydrologyIDSupdateDomainx(IssmDouble *pIDScount)
Definition: FemModel.cpp:5072
EplHeadTransientEnum
@ EplHeadTransientEnum
Definition: EnumDefinitions.h:558
solutionsequence_glads_nonlinear
void solutionsequence_glads_nonlinear(FemModel *femmodel)
Definition: solutionsequence_glads_nonlinear.cpp:11
HydrologySheetThicknessEnum
@ HydrologySheetThicknessEnum
Definition: EnumDefinitions.h:621
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
HydrologyPismAnalysis
Definition: HydrologyPismAnalysis.h:11
FemModel::AverageTransientInputx
void AverageTransientInputx(int *transientinput_enum, int *averagedinput_enum, IssmDouble init_time, IssmDouble end_time, int numoutputs, int averaging_method)
Definition: FemModel.cpp:5246
InputDuplicatex
void InputDuplicatex(FemModel *femmodel, int original_enum, int new_enum)
Definition: InputDuplicatex.cpp:10
SolutionTypeEnum
@ SolutionTypeEnum
Definition: EnumDefinitions.h:398
WaterColumnOldEnum
@ WaterColumnOldEnum
Definition: EnumDefinitions.h:858
HydrologyAveragingEnum
@ HydrologyAveragingEnum
Definition: EnumDefinitions.h:162
Profiler::Stop
void Stop(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:179
HydrologyNumRequestedOutputsEnum
@ HydrologyNumRequestedOutputsEnum
Definition: EnumDefinitions.h:170
FemModel::StackTransientInputx
void StackTransientInputx(int *input_enum, int *transientinput_enum, IssmDouble hydrotime, int numoutputs)
Definition: FemModel.cpp:5213
HydrologyShreveAnalysisEnum
@ HydrologyShreveAnalysisEnum
Definition: EnumDefinitions.h:1104
surfaceslope_core
void surfaceslope_core(FemModel *femmodel)
Definition: surfaceslope_core.cpp:12
SedimentHeadSubstepEnum
@ SedimentHeadSubstepEnum
Definition: EnumDefinitions.h:700
HydrologydcEplThicknessEnum
@ HydrologydcEplThicknessEnum
Definition: EnumDefinitions.h:603
HydrologyshaktiEnum
@ HydrologyshaktiEnum
Definition: EnumDefinitions.h:1108
HydrologyModelEnum
@ HydrologyModelEnum
Definition: EnumDefinitions.h:169
HydrologyPismAnalysis::UpdateWaterColumn
void UpdateWaterColumn(FemModel *femmodel)
Definition: HydrologyPismAnalysis.cpp:92
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
Profiler::Start
void Start(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:139
VerboseSolution
bool VerboseSolution(void)
Definition: Verbosity.cpp:24
HydrologypismEnum
@ HydrologypismEnum
Definition: EnumDefinitions.h:1107
WatercolumnEnum
@ WatercolumnEnum
Definition: EnumDefinitions.h:859
FemModel::RequestedOutputsx
void RequestedOutputsx(Results **presults, char **requested_outputs, int numoutputs, bool save_results=true)
Definition: FemModel.cpp:2267
FemModel::SetCurrentConfiguration
void SetCurrentConfiguration(int configuration_type)
Definition: FemModel.cpp:634
HydrologyGlaDSAnalysis
Definition: HydrologyGlaDSAnalysis.h:11
HydrologyStepsPerStepEnum
@ HydrologyStepsPerStepEnum
Definition: EnumDefinitions.h:175
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
bedslope_core
void bedslope_core(FemModel *femmodel)
Definition: bedslope_core.cpp:12
HydrologyGlaDSEnum
@ HydrologyGlaDSEnum
Definition: EnumDefinitions.h:1101
solutionsequence_hydro_nonlinear
void solutionsequence_hydro_nonlinear(FemModel *femmodel)
Definition: solutionsequence_hydro_nonlinear.cpp:12
EplHeadOldEnum
@ EplHeadOldEnum
Definition: EnumDefinitions.h:554
EffectivePressureEnum
@ EffectivePressureEnum
Definition: EnumDefinitions.h:548
HydrologyHeadEnum
@ HydrologyHeadEnum
Definition: EnumDefinitions.h:615
SedimentHeadEnum
@ SedimentHeadEnum
Definition: EnumDefinitions.h:698
EplHeadSubstepEnum
@ EplHeadSubstepEnum
Definition: EnumDefinitions.h:557
HydrologyshreveEnum
@ HydrologyshreveEnum
Definition: EnumDefinitions.h:1109
FemModel::profiler
Profiler * profiler
Definition: FemModel.h:42
HydrologyGlaDSAnalysis::SetChannelCrossSectionOld
void SetChannelCrossSectionOld(FemModel *femmodel)
Definition: HydrologyGlaDSAnalysis.cpp:444
HYDROLOGYCORE
#define HYDROLOGYCORE
Definition: Profiler.h:19
EffectivePressureTransientEnum
@ EffectivePressureTransientEnum
Definition: EnumDefinitions.h:550
HydraulicPotentialOldEnum
@ HydraulicPotentialOldEnum
Definition: EnumDefinitions.h:598
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16