Ice Sheet System Model  4.18
Code documentation
Functions
transient_core.cpp File Reference
#include <float.h>
#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 transient_core (FemModel *femmodel)
 

Function Documentation

◆ transient_core()

void transient_core ( FemModel femmodel)

Definition at line 19 of file transient_core.cpp.

19  {
20 
21  /*parameters: */
22  IssmDouble finaltime,dt,yts,starttime;
23  bool isstressbalance,ismasstransport,issmb,isFS,isthermal,isgroundingline,isgia,isesa,isslr,iscoupler,ismovingfront,isdamageevolution,ishydrology,isoceancoupling,iscontrol,isautodiff;
24  bool save_results,dakota_analysis;
25  int timestepping;
26  int output_frequency;
27  int sb_coupling_frequency;
28  int recording_frequency;
29  int domaintype,groundingline_migration,smb_model,amr_frequency,amr_restart;
30  int numoutputs;
31  Analysis *analysis = NULL;
32  char **requested_outputs = NULL;
33 
34  /*intermediary: */
35  int step;
36  IssmDouble time;
37 
38  /*first, figure out if there was a check point, if so, do a reset of the FemModel* femmodel structure. */
40  if(recording_frequency) femmodel->Restart();
41 
42  /*then recover parameters common to all solutions*/
49  femmodel->parameters->FindParam(&dakota_analysis,QmuIsdakotaEnum);
70  if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
72  if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
73 
74  #if defined(_HAVE_BAMG_) && !defined(_HAVE_AD_)
75  if(amr_frequency){
77  if(amr_restart) femmodel->ReMesh();
78  }
79  #endif
80 
81  #if defined(_HAVE_OCEAN_ )
82  if(isoceancoupling) OceanExchangeDatax(femmodel,true);
83  #endif
84 
85  IssmDouble output_value;
86  int num_dependents;
87  IssmPDouble *dependents;
88  DataSet* dependent_objects=NULL;
89  IssmDouble J=0.;
90 
91  if(iscontrol && isautodiff){
92 
93  femmodel->parameters->SetParam(starttime,TimeEnum);
96 
97  /*Go through our dependent variables, and compute the response:*/
98  dependents=xNew<IssmPDouble>(num_dependents);
99  }
100 
102 
103  while(time < finaltime - (yts*DBL_EPSILON)){ //make sure we run up to finaltime.
104 
105  /*Time Increment*/
106  switch(timestepping){
108  femmodel->TimeAdaptx(&dt);
109  if(time+dt>finaltime) dt=finaltime-time;
111  break;
114  break;
115  default:
116  _error_("Time stepping \""<<EnumToStringx(timestepping)<<"\" not supported yet");
117  }
118  step+=1;
119  time+=dt;
122 
123  if(VerboseSolution()) _printf0_("iteration " << step << "/" << ceil((finaltime-time)/dt)+step << " time [yr]: " << setprecision(4) << time/yts << " (time step: " << dt/yts << ")\n");
124  if(step%output_frequency==0 || (time >= finaltime - (yts*DBL_EPSILON)) || step==1)
125  save_results=true;
126  else
127  save_results=false;
129 
130  #if defined(_HAVE_OCEAN_ )
131  if(isoceancoupling) OceanExchangeDatax(femmodel,false);
132  #endif
133 
134  if(isthermal && domaintype==Domain3DEnum){
135  if(issmb){
136  bool isenthalpy;
138  femmodel->parameters->FindParam(&smb_model,SmbEnum);
139  if(isenthalpy){
140  if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){
143  }
144  }
145  else{
146  if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){
149  }
150  }
151  }
153  }
154  /* Using Hydrology dc coupled we need to compute smb in the hydrology inner time loop*/
155  if(issmb) {
156  if(VerboseSolution()) _printf0_(" computing smb\n");
158  }
159 
160  if(ishydrology){
161  if(VerboseSolution()) _printf0_(" computing hydrology\n");
162  int hydrology_model;
164  femmodel->parameters->FindParam(&hydrology_model,HydrologyModelEnum);
165  if(hydrology_model!=HydrologydcEnum && issmb)smb_core(femmodel);
166  }
167 
168  if(isstressbalance && (step%sb_coupling_frequency==0 || step==1) ) {
169  if(VerboseSolution()) _printf0_(" computing stress balance\n");
171  }
172 
173  if(isdamageevolution) {
174  if(VerboseSolution()) _printf0_(" computing damage\n");
176  }
177 
178  if(ismovingfront) {
179  if(VerboseSolution()) _printf0_(" computing moving front\n");
181  }
182 
183  /* from here on, prepare geometry for next time step*/
184  //if(issmb) smb_core(femmodel);
185 
186  if(ismasstransport){
187  if(VerboseSolution()) _printf0_(" computing mass transport\n");
191  }
192 
193  if(isgroundingline){
194 
195  /*Start profiler*/
197 
198  if(VerboseSolution()) _printf0_(" computing new grounding line position\n");
200 
207 
208  /*Stop profiler*/
210 
211  if(save_results){
212  int outputs[3] = {SurfaceEnum,BaseEnum,MaskOceanLevelsetEnum};
213  femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
214  }
215  }
216 
217  if(isgia){
218  if(VerboseSolution()) _printf0_(" computing glacial isostatic adjustment\n");
219  #ifdef _HAVE_GIA_
221  #else
222  _error_("ISSM was not compiled with gia capabilities. Exiting");
223  #endif
224  }
225 
226  /*esa: */
227  if(isesa) esa_core(femmodel);
228 
229  /*Sea level rise: */
230  if(isslr) sealevelchange_core(femmodel);
231 
232  /*unload results*/
233  if(VerboseSolution()) _printf0_(" computing requested outputs\n");
234  femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs,save_results);
235  if(isgroundingline && (groundingline_migration==AggressiveMigrationEnum || groundingline_migration==ContactEnum)){
236  int outputs[1] = {MaskOceanLevelsetEnum};
237  femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1,save_results);
238  }
239 
240  if(save_results){
241  if(VerboseSolution()) _printf0_(" saving temporary results\n");
243  }
244 
245  if(recording_frequency && (step%recording_frequency==0)){
246  if(VerboseSolution()) _printf0_(" checkpointing model \n");
247  femmodel->CheckPoint();
248  }
249 
250  /*Adaptive mesh refinement*/
251  if(amr_frequency){
252 
253  #if !defined(_HAVE_AD_)
254  if(save_results) femmodel->WriteMeshInResults();
255  if(step%amr_frequency==0 && time<finaltime){
256  if(VerboseSolution()) _printf0_(" refining mesh\n");
257  femmodel->ReMesh();//Do not refine the last step
258  }
259 
260  #else
261  _error_("AMR not suppored with AD");
262  #endif
263  }
264 
265  if (iscontrol && isautodiff) {
266  /*Go through our dependent variables, and compute the response:*/
267  for(int i=0;i<dependent_objects->Size();i++){
268  DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
269  dep->Responsex(&output_value,femmodel);
270  dep->AddValue(output_value);
271  }
272  }
273  }
274 
275  if(!iscontrol || !isautodiff) femmodel->RequestedDependentsx();
276  if(iscontrol && isautodiff) femmodel->parameters->SetParam(dependent_objects,AutodiffDependentObjectsEnum);
277 
278  /*Free ressources:*/
279  if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
280 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
TimesteppingFinalTimeEnum
@ TimesteppingFinalTimeEnum
Definition: EnumDefinitions.h:430
SaveResultsEnum
@ SaveResultsEnum
Definition: EnumDefinitions.h:302
movingfront_core
void movingfront_core(FemModel *femmodel)
Definition: movingfront_core.cpp:12
BaseEnum
@ BaseEnum
Definition: EnumDefinitions.h:495
EnthalpyAnalysisEnum
@ EnthalpyAnalysisEnum
Definition: EnumDefinitions.h:1052
SMBd18opddEnum
@ SMBd18opddEnum
Definition: EnumDefinitions.h:1243
TransientNumRequestedOutputsEnum
@ TransientNumRequestedOutputsEnum
Definition: EnumDefinitions.h:456
SmbEnum
@ SmbEnum
Definition: EnumDefinitions.h:358
FemModel::vertices
Vertices * vertices
Definition: FemModel.h:49
TransientIsmasstransportEnum
@ TransientIsmasstransportEnum
Definition: EnumDefinitions.h:449
IssmDouble
double IssmDouble
Definition: types.h:37
OutputResultsx
void OutputResultsx(FemModel *femmodel)
Definition: OutputResultsx.cpp:17
extrudefrombase_core
void extrudefrombase_core(FemModel *femmodel)
Definition: extrudefrombase_core.cpp:12
AutodiffDependentObjectsEnum
@ AutodiffDependentObjectsEnum
Definition: EnumDefinitions.h:43
GroundinglineMigrationEnum
@ GroundinglineMigrationEnum
Definition: EnumDefinitions.h:161
ContactEnum
@ ContactEnum
Definition: EnumDefinitions.h:1014
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
TransientRequestedOutputsEnum
@ TransientRequestedOutputsEnum
Definition: EnumDefinitions.h:457
StepEnum
@ StepEnum
Definition: EnumDefinitions.h:403
HydrologydcEnum
@ HydrologydcEnum
Definition: EnumDefinitions.h:1106
thermal_core
void thermal_core(FemModel *femmodel)
Definition: thermal_core.cpp:13
MaskOceanLevelsetEnum
@ MaskOceanLevelsetEnum
Definition: EnumDefinitions.h:640
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
TimeEnum
@ TimeEnum
Definition: EnumDefinitions.h:427
TimesteppingTimeStepEnum
@ TimesteppingTimeStepEnum
Definition: EnumDefinitions.h:433
AdaptiveTimesteppingEnum
@ AdaptiveTimesteppingEnum
Definition: EnumDefinitions.h:969
InversionIscontrolEnum
@ InversionIscontrolEnum
Definition: EnumDefinitions.h:218
GROUNDINGLINECORE
#define GROUNDINGLINECORE
Definition: Profiler.h:25
FemModel::results
Results * results
Definition: FemModel.h:48
TransientIsslrEnum
@ TransientIsslrEnum
Definition: EnumDefinitions.h:452
OceanExchangeDatax
void OceanExchangeDatax(FemModel *femmodel, bool init_stage)
Definition: OceanExchangeDatax.cpp:11
SettingsSbCouplingFrequencyEnum
@ SettingsSbCouplingFrequencyEnum
Definition: EnumDefinitions.h:339
esa_core
void esa_core(FemModel *femmodel)
Definition: esa_core.cpp:12
AmrRestartEnum
@ AmrRestartEnum
Definition: EnumDefinitions.h:29
ConstantsYtsEnum
@ ConstantsYtsEnum
Definition: EnumDefinitions.h:104
FemModel::TimeAdaptx
void TimeAdaptx(IssmDouble *pdt)
Definition: FemModel.cpp:2895
TransientIsgroundinglineEnum
@ TransientIsgroundinglineEnum
Definition: EnumDefinitions.h:447
FemModel::RequestedDependentsx
void RequestedDependentsx(void)
Definition: FemModel.cpp:2220
ResetBoundaryConditions
void ResetBoundaryConditions(FemModel *femmodel, int analysis_type)
Definition: ResetBoundaryConditions.cpp:9
hydrology_core
void hydrology_core(FemModel *femmodel)
Definition: hydrology_core.cpp:12
DependentObject::AddValue
void AddValue(IssmDouble in_value)
Definition: DependentObject.cpp:106
sealevelrise_core_geometry
void sealevelrise_core_geometry(FemModel *femmodel)
Definition: sealevelchange_core.cpp:351
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
DependentObject
Definition: DependentObject.h:15
sealevelchange_core
void sealevelchange_core(FemModel *femmodel)
Definition: sealevelchange_core.cpp:17
InputToExtrudeEnum
@ InputToExtrudeEnum
Definition: EnumDefinitions.h:205
TimesteppingTypeEnum
@ TimesteppingTypeEnum
Definition: EnumDefinitions.h:436
DomainTypeEnum
@ DomainTypeEnum
Definition: EnumDefinitions.h:124
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
FemModel::materials
Materials * materials
Definition: FemModel.h:45
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
TransientIssmbEnum
@ TransientIssmbEnum
Definition: EnumDefinitions.h:453
smb_core
void smb_core(FemModel *femmodel)
Definition: smb_core.cpp:12
ThermalIsenthalpyEnum
@ ThermalIsenthalpyEnum
Definition: EnumDefinitions.h:417
TransientIsgiaEnum
@ TransientIsgiaEnum
Definition: EnumDefinitions.h:446
TransientIsoceancouplingEnum
@ TransientIsoceancouplingEnum
Definition: EnumDefinitions.h:451
gia_core
void gia_core(FemModel *femmodel)
Definition: gia_core.cpp:13
QmuIsdakotaEnum
@ QmuIsdakotaEnum
Definition: EnumDefinitions.h:288
AutodiffIsautodiffEnum
@ AutodiffIsautodiffEnum
Definition: EnumDefinitions.h:50
FixedTimesteppingEnum
@ FixedTimesteppingEnum
Definition: EnumDefinitions.h:1066
SurfaceEnum
@ SurfaceEnum
Definition: EnumDefinitions.h:823
TransientIshydrologyEnum
@ TransientIshydrologyEnum
Definition: EnumDefinitions.h:448
TransientAmrFrequencyEnum
@ TransientAmrFrequencyEnum
Definition: EnumDefinitions.h:442
TransientIscouplerEnum
@ TransientIscouplerEnum
Definition: EnumDefinitions.h:443
FemModel::loads
Loads * loads
Definition: FemModel.h:54
Profiler::Stop
void Stop(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:179
SettingsRecordingFrequencyEnum
@ SettingsRecordingFrequencyEnum
Definition: EnumDefinitions.h:337
TransientIsthermalEnum
@ TransientIsthermalEnum
Definition: EnumDefinitions.h:455
Domain3DEnum
@ Domain3DEnum
Definition: EnumDefinitions.h:536
masstransport_core
void masstransport_core(FemModel *femmodel)
Definition: masstransport_core.cpp:12
FemModel::elements
Elements * elements
Definition: FemModel.h:44
DependentObject::Responsex
void Responsex(IssmDouble *poutput_value, FemModel *femmodel)
Definition: DependentObject.cpp:93
TransientIsstressbalanceEnum
@ TransientIsstressbalanceEnum
Definition: EnumDefinitions.h:454
TimesteppingStartTimeEnum
@ TimesteppingStartTimeEnum
Definition: EnumDefinitions.h:432
bmb_core
void bmb_core(FemModel *femmodel)
Definition: bmb_core.cpp:12
ThermalAnalysisEnum
@ ThermalAnalysisEnum
Definition: EnumDefinitions.h:1302
FemModel::CheckPoint
void CheckPoint(void)
Definition: FemModel.cpp:238
TransientIsesaEnum
@ TransientIsesaEnum
Definition: EnumDefinitions.h:445
HydrologyModelEnum
@ HydrologyModelEnum
Definition: EnumDefinitions.h:169
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
FlowequationIsFSEnum
@ FlowequationIsFSEnum
Definition: EnumDefinitions.h:138
Profiler::Start
void Start(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:139
VerboseSolution
bool VerboseSolution(void)
Definition: Verbosity.cpp:24
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
TransientIsmovingfrontEnum
@ TransientIsmovingfrontEnum
Definition: EnumDefinitions.h:450
FemModel::Restart
void Restart(void)
Definition: FemModel.cpp:549
SettingsOutputFrequencyEnum
@ SettingsOutputFrequencyEnum
Definition: EnumDefinitions.h:336
GroundinglineMigrationx
void GroundinglineMigrationx(Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
Definition: GroundinglineMigrationx.cpp:10
AutodiffNumDependentsEnum
@ AutodiffNumDependentsEnum
Definition: EnumDefinitions.h:52
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
damage_core
void damage_core(FemModel *femmodel)
Definition: damage_core.cpp:12
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
SMBpddSicopolisEnum
@ SMBpddSicopolisEnum
Definition: EnumDefinitions.h:1253
IssmPDouble
IssmDouble IssmPDouble
Definition: types.h:38
DataSet
Declaration of DataSet class.
Definition: DataSet.h:14
stressbalance_core
void stressbalance_core(FemModel *femmodel)
Definition: stressbalance_core.cpp:13
FemModel::WriteMeshInResults
void WriteMeshInResults(void)
Definition: FemModel.cpp:3610
FemModel::profiler
Profiler * profiler
Definition: FemModel.h:42
FemModel::ReMesh
void ReMesh(void)
Definition: FemModel.cpp:3101
AggressiveMigrationEnum
@ AggressiveMigrationEnum
Definition: EnumDefinitions.h:973
Analysis
Definition: Analysis.h:30
FemModel::UpdateVertexPositionsx
int UpdateVertexPositionsx(void)
Definition: FemModel.cpp:3055
SMBpddEnum
@ SMBpddEnum
Definition: EnumDefinitions.h:1252
TransientIsdamageevolutionEnum
@ TransientIsdamageevolutionEnum
Definition: EnumDefinitions.h:444
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16