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

driver for creating parameters dataset, for autodiff analysis. More...

#include "../../../toolkits/toolkits.h"
#include "../../../classes/classes.h"
#include "../../../shared/shared.h"
#include "../ModelProcessorx.h"

Go to the source code of this file.

Functions

void CreateParametersAutodiff (Parameters *parameters, IoModel *iomodel)
 

Detailed Description

driver for creating parameters dataset, for autodiff analysis.

Definition in file CreateParametersAutodiff.cpp.

Function Documentation

◆ CreateParametersAutodiff()

void CreateParametersAutodiff ( Parameters parameters,
IoModel iomodel 
)

Definition at line 10 of file CreateParametersAutodiff.cpp.

10  {
11 
12  int i;
13  bool isautodiff;
14  int num_dependent_objects;
15  int num_dep=0;
16  char** names=NULL;
17  int* types=NULL;
18  int dummy;
19  char* autodiff_driver=NULL;
20  int* indices=NULL;
21  int num_indices;
22  char* options=NULL;
23  char* toolkit=NULL;
24 
25  IssmDouble* xp=NULL;
26  IssmDouble* xp_backup=NULL;
27  int num_ind,local_num_ind;
28  DataSet* dependent_objects=NULL;
29 
30  /*retrieve some parameters: */
31  iomodel->FindConstant(&isautodiff,"md.autodiff.isautodiff");
32 
33  #ifdef _HAVE_ADOLC_
34  /*initialize a placeholder to store solver pointers: {{{*/
36 
37  /*Solver pointers depend on what type of solver we are implementing: */
38  options=OptionsFromAnalysis(&toolkit,parameters,DefaultAnalysisEnum);
39  ToolkitOptions::Init(toolkit,options);
40  xDelete<char>(toolkit);
41 
43  case MumpsEnum:{
44  #ifdef _HAVE_MUMPS_
45  theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(mumpsSolveEDF);
46  #else
47  _error_("requesting mumps solver without MUMPS being compiled in!");
48  #endif
49  break;
50  }
51  case GslEnum: {
52  #ifdef _HAVE_GSL_
53  theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(EDF_for_solverx);
54  #else
55  _error_("requesting GSL solver without GSL being compiled in!");
56  #endif
57  break;
58  }
59  default:
60  _error_("solver type not supported yet!");
61  }
62 
63  // to save some space:
64  // we know we won't use adolc inside of the solver:
65  theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p->nestedAdolc=false;
66  // the solution vector is just allocated and doesn't have a meaningful prior value
67  theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p->dp_y_priorRequired=false;
68  // the solver wrapper makes sure the matrix and the right hand side don't change
69  theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p->dp_x_changes=false;
70  parameters->AddObject(theAdolcEDF_p);
71 
72  /*Free ressources: */
73  xDelete<char>(options);
74  /*}}}*/
75  #elif _HAVE_CODIPACK_
76  //fprintf(stderr, "*** Codipack CreateParametersAutodiff()\n");
77  /*initialize a placeholder to store solver pointers: {{{*/
78  /*Solver pointers depend on what type of solver we are implementing: */
79  options=OptionsFromAnalysis(&toolkit,parameters,DefaultAnalysisEnum);
80  ToolkitOptions::Init(toolkit,options);
81  xDelete<char>(toolkit);
82 
84  case MumpsEnum:{
85  #ifndef _HAVE_MUMPS_
86  _error_("CoDiPack: requesting mumps solver without MUMPS being compiled in!");
87  #endif
88  break;
89  }
90  case GslEnum: {
91  #ifndef _HAVE_GSL_
92  _error_("CoDiPack: requesting GSL solver without GSL being compiled in!");
93  #endif
94  break;
95  }
96  default:
97  _error_("solver type not supported yet!");
98  }
99  /*Free ressources: */
100  xDelete<char>(options);
101  #endif
102  #if defined(_HAVE_AD_)
103 
104  if(isautodiff){
105  #if defined(_HAVE_ADOLC_)
106  /*Copy some parameters from IoModel to parameters dataset*/
107  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.obufsize",AutodiffObufsizeEnum));
108  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.cbufsize",AutodiffCbufsizeEnum));
109  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.lbufsize",AutodiffLbufsizeEnum));
110  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.tbufsize",AutodiffTbufsizeEnum));
111  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.gcTriggerRatio",AutodiffGcTriggerRatioEnum));
112  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.gcTriggerMaxSize",AutodiffGcTriggerMaxSizeEnum));
113 
114  #elif defined(_HAVE_CODIPACK_)
115  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.tapeAlloc",AutodiffTapeAllocEnum));
116 
117  #else
118  _error_("not supported yet");
119  #endif
120 
121  /*retrieve driver: {{{*/
122  iomodel->FindConstant(&autodiff_driver,"md.autodiff.driver");
123  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.driver",AutodiffDriverEnum));
124 
125  if(strcmp(autodiff_driver,"fos_forward")==0){
126 #if _HAVE_CODIPACK_
127  // FIXME codi support Foward Mode (scalar)
128  _error_("Foward Mode (scalar) not supported yet!");
129 #endif
130  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.fos_forward_index",AutodiffFosForwardIndexEnum));
131  }
132  else if(strcmp(autodiff_driver,"fos_reverse")==0){
133  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.fos_reverse_index",AutodiffFosReverseIndexEnum));
134  }
135  else if(strcmp(autodiff_driver,"fov_forward")==0){
136 #if _HAVE_CODIPACK_
137  // FIXME codi support Foward Mode (vector)
138  _error_("Foward Mode (vector) not supported yet!");
139 #endif
140  /*Retrieve list of indices: */
141  iomodel->FetchData(&indices,&num_indices,&dummy,"md.autodiff.fov_forward_indices");
142  parameters->AddObject(new IntMatParam(AutodiffFovForwardIndicesEnum,indices,num_indices,1));
143  xDelete<int>(indices);
144  }
145  xDelete<char>(autodiff_driver);
146  /*}}}*/
147  /*Deal with dependents first: {{{*/
148  iomodel->FindConstant(&num_dependent_objects,"md.autodiff.num_dependent_objects");
149  dependent_objects=new DataSet();
150  num_dep=0;
151 
152  if(num_dependent_objects){
153  iomodel->FindConstant(&names,&dummy,"md.autodiff.dependent_object_names");
154  iomodel->FetchData(&types,&dummy,&dummy,"md.autodiff.dependent_object_types");
155  iomodel->FetchData(&indices,&dummy,&dummy,"md.autodiff.dependent_object_indices");
156 
157  for(i=0;i<num_dependent_objects;i++){
158  DependentObject* dep=new DependentObject(names[i],types[i],indices[i]);
159  dependent_objects->AddObject(dep);
160  num_dep+=dep->NumDependents();
161  }
162 
163  /*Free ressources:*/
164  for(i=0;i<num_dependent_objects;i++){
165  char* string=names[i]; xDelete<char>(string);
166  }
167  xDelete<char*>(names);
168  xDelete<int>(types);
169  xDelete<int>(indices);
170  }
171  parameters->AddObject(new DataSetParam(AutodiffDependentObjectsEnum,dependent_objects));
172  parameters->AddObject(new IntParam(AutodiffNumDependentsEnum,num_dep));
173 
174  delete dependent_objects;
175  /*}}}*/
176  /*Deal with independents: {{{*/
177 
178  /*Independents have already been recovered in iomodel->DeclareIndependents. Just do some more processing.
179  *In particular, figure out num_independents, and create the state vector xp, or size num_independents x 1 :*/
180  num_ind=iomodel->NumIndependents();
181  parameters->AddObject(new IntParam(AutodiffNumIndependentsEnum,num_ind));
182 
183  if(num_ind){
184  xp=xNew<IssmDouble>(num_ind);
185  iomodel->FillIndependents(xp);
186  parameters->AddObject(new DoubleVecParam(AutodiffXpEnum,xp,num_ind));
187  xDelete<IssmDouble>(xp);
188  }
189  /*}}}*/
190  }
191  #endif
192 }
IssmDouble
double IssmDouble
Definition: types.h:37
AutodiffDependentObjectsEnum
@ AutodiffDependentObjectsEnum
Definition: EnumDefinitions.h:43
DataSet::AddObject
int AddObject(Object *object)
Definition: DataSet.cpp:252
AutodiffXpEnum
@ AutodiffXpEnum
Definition: EnumDefinitions.h:57
AutodiffObufsizeEnum
@ AutodiffObufsizeEnum
Definition: EnumDefinitions.h:54
AutodiffFosForwardIndexEnum
@ AutodiffFosForwardIndexEnum
Definition: EnumDefinitions.h:45
OptionsFromAnalysis
char * OptionsFromAnalysis(char **pouttoolkit, Parameters *parameters, int analysis_type)
Definition: Parameters.cpp:595
AutodiffDriverEnum
@ AutodiffDriverEnum
Definition: EnumDefinitions.h:44
AutodiffFovForwardIndicesEnum
@ AutodiffFovForwardIndicesEnum
Definition: EnumDefinitions.h:47
Parameters::AddObject
void AddObject(Param *newparam)
Definition: Parameters.cpp:67
DefaultAnalysisEnum
@ DefaultAnalysisEnum
Definition: EnumDefinitions.h:1032
IssmSolverTypeFromToolkitOptions
int IssmSolverTypeFromToolkitOptions(void)
Definition: IssmToolkitUtils.cpp:86
GenericParam::GetParameterValue
P & GetParameterValue()
Definition: GenericParam.h:62
DependentObject
Definition: DependentObject.h:15
IntMatParam
Definition: IntMatParam.h:20
IoModel::CopyConstantObject
Param * CopyConstantObject(const char *constant_name, int param_enum)
Definition: IoModel.cpp:418
AutodiffLbufsizeEnum
@ AutodiffLbufsizeEnum
Definition: EnumDefinitions.h:51
MumpsEnum
@ MumpsEnum
Definition: EnumDefinitions.h:1195
IoModel::FindConstant
void FindConstant(bool *pvalue, const char *constant_name)
Definition: IoModel.cpp:2362
AutodiffFosReverseIndexEnum
@ AutodiffFosReverseIndexEnum
Definition: EnumDefinitions.h:46
IntParam
Definition: IntParam.h:20
AutodiffCbufsizeEnum
@ AutodiffCbufsizeEnum
Definition: EnumDefinitions.h:42
IoModel::FetchData
void FetchData(bool *pboolean, const char *data_name)
Definition: IoModel.cpp:933
DataSetParam
Definition: DataSetParam.h:20
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DoubleVecParam
Definition: DoubleVecParam.h:20
IoModel::NumIndependents
int NumIndependents()
Definition: IoModel.cpp:2448
AdolcParamEnum
@ AdolcParamEnum
Definition: EnumDefinitions.h:12
AutodiffNumDependentsEnum
@ AutodiffNumDependentsEnum
Definition: EnumDefinitions.h:52
DependentObject::NumDependents
int NumDependents(void)
Definition: DependentObject.cpp:81
AutodiffGcTriggerRatioEnum
@ AutodiffGcTriggerRatioEnum
Definition: EnumDefinitions.h:49
AutodiffTapeAllocEnum
@ AutodiffTapeAllocEnum
Definition: EnumDefinitions.h:55
DataSet
Declaration of DataSet class.
Definition: DataSet.h:14
AutodiffNumIndependentsEnum
@ AutodiffNumIndependentsEnum
Definition: EnumDefinitions.h:53
AutodiffGcTriggerMaxSizeEnum
@ AutodiffGcTriggerMaxSizeEnum
Definition: EnumDefinitions.h:48
ToolkitOptions::Init
static void Init(void)
Definition: ToolkitOptions.cpp:25
GslEnum
@ GslEnum
Definition: EnumDefinitions.h:1094
AutodiffTbufsizeEnum
@ AutodiffTbufsizeEnum
Definition: EnumDefinitions.h:56
IoModel::FillIndependents
void FillIndependents(IssmDouble *xp)
Definition: IoModel.cpp:2334
GenericParam
Definition: GenericParam.h:26