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

driver for creating parameters dataset, for control 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 CreateParametersControl (Parameters *parameters, IoModel *iomodel, int solution_type)
 

Detailed Description

driver for creating parameters dataset, for control analysis.

Definition in file CreateParametersControl.cpp.

Function Documentation

◆ CreateParametersControl()

void CreateParametersControl ( Parameters parameters,
IoModel iomodel,
int  solution_type 
)

Definition at line 10 of file CreateParametersControl.cpp.

10  {
11 
12  bool control_analysis;
13  int inversiontype;
14  int nsteps;
15  int num_controls;
16  int num_costfunc;
17  char** controls = NULL;
18  int *maxiter = NULL;
19  char** cm_responses = NULL;
20  IssmDouble *cm_jump = NULL;
21  IssmDouble *optscal = NULL;
22  IssmDouble *control_scaling_factors = NULL;
23 
24  /*retrieve some parameters: */
25  iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol");
26  iomodel->FindConstant(&inversiontype,"md.inversion.type");
27 
28  if(control_analysis){
29 
30  switch(inversiontype){
31  {
32  case 0:/*Brent Search*/
33  case 1:/*TAO*/
34  case 2:/*M1QN3*/
35  case 3:/*Validation*/
36  /*How many controls and how many responses?*/
37  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_control_parameters",InversionNumControlParametersEnum));
38  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_cost_functions",InversionNumCostFunctionsEnum));
39 
40  /*recover controls and convert to Enums*/
41  iomodel->FindConstant(&controls,&num_controls,"md.inversion.control_parameters");
42  if(num_controls<1) _error_("no controls found");
43  int* control_enums=xNew<int>(num_controls);
44  for(int i=0;i<num_controls;i++){
45  control_enums[i]=StringToEnumx(controls[i]);
46  xDelete<char>(controls[i]);
47  }
48  xDelete<char*>(controls);
49  parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_enums,num_controls));
50 
51  iomodel->FindConstant(&cm_responses,&num_costfunc,"md.inversion.cost_functions");
52  if(num_costfunc<1) _error_ ("no cost functions found");
53  int* costfunc_enums=xNew<int>(num_costfunc);
54  for(int i=0;i<num_costfunc;i++){
55  costfunc_enums[i]=StringToEnumx(cm_responses[i]);
56  xDelete<char>(cm_responses[i]);
57  }
58  xDelete<char*>(cm_responses);
59  parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc));
60 
61  xDelete<int>(control_enums);
62  xDelete<int>(costfunc_enums);
63 
64  break;
65  }
66  case 4:/*AD M1QN3*/
67  {
68  /*Intermediaries*/
69  int num_independent_objects,M;
70  char** names = NULL;
71 
72  /*this is done somewhere else*/
73  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.num_independent_objects",InversionNumControlParametersEnum));
74  parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.num_dependent_objects",InversionNumCostFunctionsEnum));
75 
76  /*Step1: create controls (independents)*/
77  iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
78  _assert_(num_independent_objects>0);
79  iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names");
80  _assert_(M==num_independent_objects);
81  int* ind_enums=xNew<int>(num_independent_objects);
82  for(int i=0;i<num_independent_objects;i++){
83  ind_enums[i]=StringToEnumx(names[i]);
84  xDelete<char>(names[i]);
85  }
86 
87  parameters->AddObject(new IntVecParam(InversionControlParametersEnum,ind_enums,num_independent_objects));
88  iomodel->FindConstant(&cm_responses,&num_costfunc,"md.autodiff.dependent_object_names");
89  _assert_(num_costfunc>0);
90  if(num_costfunc<1) _error_ ("no cost functions found");
91  int* costfunc_enums=xNew<int>(num_costfunc);
92  for(int i=0;i<num_costfunc;i++){
93  costfunc_enums[i]=StringToEnumx(cm_responses[i]);
94  xDelete<char>(cm_responses[i]);
95  }
96  xDelete<char*>(cm_responses);
97  parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc));
98 
99  iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.autodiff.independent_scaling_factors");
100  parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects));
101 
102  /*cleanup*/
103  for(int i=0;i<num_independent_objects;i++){
104  xDelete<char>(names[i]);
105  }
106  xDelete<char*>(names);
107  xDelete<int>(ind_enums);
108  xDelete<int>(costfunc_enums);
109  break;
110  }
111  default:
112  _error_("not supported");
113  }
114 
115  /*Inversion type specifics*/
116  switch(inversiontype){
117  case 0:/*Brent Search*/
118  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.incomplete_adjoint",InversionIncompleteAdjointEnum));
119  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.nsteps",InversionNstepsEnum));
120  iomodel->FetchData(&cm_jump,&nsteps,NULL,"md.inversion.step_threshold");
121  iomodel->FetchData(&optscal,NULL,NULL,"md.inversion.gradient_scaling");
122  iomodel->FetchData(&maxiter,NULL,NULL,"md.inversion.maxiter_per_step");
123  parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_controls));
124  parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps));
125  parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));
126  break;
127  case 1:/*TAO*/
128  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.incomplete_adjoint",InversionIncompleteAdjointEnum));
129  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gatol",InversionGatolEnum));
130  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.grtol",InversionGrtolEnum));
131  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum));
132  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum));
133  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxiter",InversionMaxiterEnum));
134  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.algorithm",InversionAlgorithmEnum));
135  break;
136  case 2:/*M1QN3*/
137  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.incomplete_adjoint",InversionIncompleteAdjointEnum));
138  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.dxmin",InversionDxminEnum));
139  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum));
140  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum));
141  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxiter",InversionMaxiterEnum));
142  iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors");
143  parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
144  break;
145  case 3:/*Validation*/
146  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.incomplete_adjoint",InversionIncompleteAdjointEnum));
147  iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors");
148  parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
149  break;
150  case 4:/*AD M1QN3*/
151  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.dxmin",InversionDxminEnum));
152  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum));
153  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum));
154  parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxiter",InversionMaxiterEnum));
155  break;
156  default:
157  _error_("not supported");
158  }
159 
160  xDelete<int>(maxiter);
161  xDelete<IssmDouble>(control_scaling_factors);
162  iomodel->DeleteData(cm_jump,"md.inversion.step_threshold");
163  iomodel->DeleteData(optscal,"md.inversion.gradient_scaling");
164  }
165 }
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
IssmDouble
double IssmDouble
Definition: types.h:37
InversionNumControlParametersEnum
@ InversionNumControlParametersEnum
Definition: EnumDefinitions.h:223
InversionNstepsEnum
@ InversionNstepsEnum
Definition: EnumDefinitions.h:222
InversionControlParametersEnum
@ InversionControlParametersEnum
Definition: EnumDefinitions.h:209
InversionMaxstepsEnum
@ InversionMaxstepsEnum
Definition: EnumDefinitions.h:221
IntVecParam
Definition: IntVecParam.h:20
InversionMaxiterPerStepEnum
@ InversionMaxiterPerStepEnum
Definition: EnumDefinitions.h:220
Parameters::AddObject
void AddObject(Param *newparam)
Definition: Parameters.cpp:67
InversionIncompleteAdjointEnum
@ InversionIncompleteAdjointEnum
Definition: EnumDefinitions.h:217
IoModel::DeleteData
void DeleteData(int num,...)
Definition: IoModel.cpp:500
IoModel::CopyConstantObject
Param * CopyConstantObject(const char *constant_name, int param_enum)
Definition: IoModel.cpp:418
InversionCostFunctionsEnum
@ InversionCostFunctionsEnum
Definition: EnumDefinitions.h:211
IoModel::FindConstant
void FindConstant(bool *pvalue, const char *constant_name)
Definition: IoModel.cpp:2362
IoModel::FetchData
void FetchData(bool *pboolean, const char *data_name)
Definition: IoModel.cpp:933
StringToEnumx
int StringToEnumx(const char *string_in, bool notfounderror=true)
Definition: StringToEnumx.cpp:14
InversionStepThresholdEnum
@ InversionStepThresholdEnum
Definition: EnumDefinitions.h:225
InversionGradientScalingEnum
@ InversionGradientScalingEnum
Definition: EnumDefinitions.h:214
InversionControlScalingFactorsEnum
@ InversionControlScalingFactorsEnum
Definition: EnumDefinitions.h:210
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DoubleVecParam
Definition: DoubleVecParam.h:20
InversionNumCostFunctionsEnum
@ InversionNumCostFunctionsEnum
Definition: EnumDefinitions.h:224
InversionMaxiterEnum
@ InversionMaxiterEnum
Definition: EnumDefinitions.h:219
InversionGatolEnum
@ InversionGatolEnum
Definition: EnumDefinitions.h:213
InversionDxminEnum
@ InversionDxminEnum
Definition: EnumDefinitions.h:212
DoubleMatParam
Definition: DoubleMatParam.h:20
InversionGttolEnum
@ InversionGttolEnum
Definition: EnumDefinitions.h:216
InversionAlgorithmEnum
@ InversionAlgorithmEnum
Definition: EnumDefinitions.h:208
InversionGrtolEnum
@ InversionGrtolEnum
Definition: EnumDefinitions.h:215