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

: core of the smb 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 smb_core (FemModel *femmodel)
 

Detailed Description

: core of the smb solution

Definition in file smb_core.cpp.

Function Documentation

◆ smb_core()

void smb_core ( FemModel femmodel)

Definition at line 12 of file smb_core.cpp.

12  {
13 
14  /*Start profiler*/
16 
17  /*parameters: */
18  Analysis* analysis=NULL;
19  int smb_model;
20  int numoutputs;
21  bool save_results;
22  int solution_type;
23  char** requested_outputs = NULL;
24 
25  /*activate configuration*/
27 
28  /*recover parameters: */
29  femmodel->parameters->FindParam(&smb_model,SmbEnum);
33  if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,SmbRequestedOutputsEnum);
34 
35  /*sub steping specifics*/
36  int dtslices;
37  int numaveragedinput;
39  /*intermediaries to deal with averaging*/
40  static const int substeplist[2] = {SmbMassBalanceSubstepEnum,SmbRunoffSubstepEnum};
41  static const int transientlist[2] = {SmbMassBalanceTransientEnum,SmbRunoffTransientEnum};
42  static const int averagelist[2] = {SmbMassBalanceEnum,SmbRunoffEnum};
43  std::vector<int> substepinput;
44  std::vector<int> transientinput;
45  std::vector<int> averagedinput;
46 
47  /*define which variable needs to be averaged on the sub-timestep and initialize as needed*/
48  if(smb_model==SMBgradientscomponentsEnum){
49  numaveragedinput = 2;
50  substepinput.assign(substeplist,substeplist+2);
51  transientinput.assign(transientlist,transientlist+2);
52  averagedinput.assign(averagelist,averagelist+2);
53  }
54 
55  /*if yes compute necessary intermediaries and start looping*/
56  if (dtslices>1){
57  int substep,smb_averaging;
58  IssmDouble global_time,subtime,yts;
59  IssmDouble dt,subdt;
60 
61  femmodel->parameters->FindParam(&global_time,TimeEnum);
65 
66  subtime=global_time-dt; //getting the time back to the start of the timestep
67  subdt=dt/dtslices; //computing substep from dt and a divider
68  substep=0;
70 
71  femmodel->InitTransientInputx(&transientinput[0],numaveragedinput);
72  analysis = new SmbAnalysis();
73  while(substep<dtslices){ //loop on sub dts
74  substep+=1;
75  subtime+=subdt;
77  if(VerboseSolution()) _printf0_("sub iteration " << substep << "/" << dtslices << " time [yr]: " << setprecision(4) << subtime/yts << " (time step: " << subdt/yts << ")\n");
78  if(VerboseSolution()) _printf0_(" computing smb\n");
79  if(VerboseSolution()) _printf0_(" Calling core\n");
80  analysis->Core(femmodel);
81  /*If we have a sub-timestep we store the substep inputs in a transient input here*/
82  femmodel->StackTransientInputx(&substepinput[0],&transientinput[0],subtime,numaveragedinput);
83  }
84  delete analysis;
85  /*averaging the transient input*/
86  femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,smb_averaging);
87  /*and reset timesteping variables to original*/
88  femmodel->parameters->SetParam(global_time,TimeEnum);
90  }
91  else{
92  if(VerboseSolution()) _printf0_(" computing smb \n");
93  analysis = new SmbAnalysis();
94  analysis->Core(femmodel);
95  /*If no substeps are present we want to duplicate the computed substep enum for coupling purposes*/
96  if(smb_model==SMBgradientscomponentsEnum){
97  for(int i=0;i<numaveragedinput;i++){
98  InputDuplicatex(femmodel,substepinput[i],averagedinput[i]);
99  }
100  }
101  delete analysis;
102  }
103 
104  if(save_results){
105  if(VerboseSolution()) _printf0_(" saving smb results\n");
106  femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
107  }
108 
109  if(solution_type==SmbSolutionEnum)femmodel->RequestedDependentsx();
110 
111  /*Free ressources:*/
112  if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
113 
114  /*End profiler*/
116 }
SmbRequestedOutputsEnum
@ SmbRequestedOutputsEnum
Definition: EnumDefinitions.h:382
SmbRunoffSubstepEnum
@ SmbRunoffSubstepEnum
Definition: EnumDefinitions.h:773
SaveResultsEnum
@ SaveResultsEnum
Definition: EnumDefinitions.h:302
SmbMassBalanceEnum
@ SmbMassBalanceEnum
Definition: EnumDefinitions.h:748
SmbEnum
@ SmbEnum
Definition: EnumDefinitions.h:358
SmbAnalysisEnum
@ SmbAnalysisEnum
Definition: EnumDefinitions.h:1274
Analysis::Core
virtual void Core(FemModel *femmodel)=0
IssmDouble
double IssmDouble
Definition: types.h:37
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
SmbAveragingEnum
@ SmbAveragingEnum
Definition: EnumDefinitions.h:349
FemModel::InitTransientInputx
void InitTransientInputx(int *transientinput_enum, int numoutputs)
Definition: FemModel.cpp:5202
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
TimeEnum
@ TimeEnum
Definition: EnumDefinitions.h:427
TimesteppingTimeStepEnum
@ TimesteppingTimeStepEnum
Definition: EnumDefinitions.h:433
SmbMassBalanceTransientEnum
@ SmbMassBalanceTransientEnum
Definition: EnumDefinitions.h:750
FemModel::results
Results * results
Definition: FemModel.h:48
ConstantsYtsEnum
@ ConstantsYtsEnum
Definition: EnumDefinitions.h:104
FemModel::RequestedDependentsx
void RequestedDependentsx(void)
Definition: FemModel.cpp:2220
SmbStepsPerStepEnum
@ SmbStepsPerStepEnum
Definition: EnumDefinitions.h:389
SmbSolutionEnum
@ SmbSolutionEnum
Definition: EnumDefinitions.h:1275
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
SMBCORE
#define SMBCORE
Definition: Profiler.h:24
SmbMassBalanceSubstepEnum
@ SmbMassBalanceSubstepEnum
Definition: EnumDefinitions.h:749
SMBgradientscomponentsEnum
@ SMBgradientscomponentsEnum
Definition: EnumDefinitions.h:1248
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
Profiler::Stop
void Stop(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:179
FemModel::StackTransientInputx
void StackTransientInputx(int *input_enum, int *transientinput_enum, IssmDouble hydrotime, int numoutputs)
Definition: FemModel.cpp:5213
SmbRunoffEnum
@ SmbRunoffEnum
Definition: EnumDefinitions.h:772
SmbAnalysis
Definition: SmbAnalysis.h:11
Profiler::Start
void Start(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:139
VerboseSolution
bool VerboseSolution(void)
Definition: Verbosity.cpp:24
SmbRunoffTransientEnum
@ SmbRunoffTransientEnum
Definition: EnumDefinitions.h:774
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
SmbNumRequestedOutputsEnum
@ SmbNumRequestedOutputsEnum
Definition: EnumDefinitions.h:379
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
FemModel::profiler
Profiler * profiler
Definition: FemModel.h:42
Analysis
Definition: Analysis.h:30
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16