Ice Sheet System Model  4.18
Code documentation
controltao_core.cpp
Go to the documentation of this file.
1 
4 #include <config.h>
5 #include "./cores.h"
6 #include "../toolkits/toolkits.h"
7 #include "../classes/classes.h"
8 #include "../shared/shared.h"
9 #include "../modules/modules.h"
10 #include "../solutionsequences/solutionsequences.h"
11 
12 #if defined (_HAVE_TAO_)
13 #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
14 #include <tao.h>
15 #else
16 #include <petsctao.h>
17 #endif
18 
19 /*Local prototype*/
20 #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
21 int FormFunctionGradient(TaoSolver,Vec,IssmDouble*,Vec,void*);
22 int IssmMonitor(TaoSolver,void*);
23 #else
24 int FormFunctionGradient(Tao,Vec,IssmDouble*,Vec,void*);
25 int IssmMonitor(Tao,void*);
26 #endif
27 typedef struct {
29  double* J;
30 } AppCtx;
31 
33 
34  /*TAO*/
35  int ierr;
36  int num_controls,solution_type;
37  int maxsteps,maxiter;
38  IssmDouble gatol,grtol,gttol;
39  AppCtx user;
40  #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
41  TaoSolver tao = 0;
42  #else
43  Tao tao = 0;
44  #endif
45  int *control_list = NULL;
46  char *algorithm = NULL;
47  Vector<IssmDouble> *X = NULL;
48  Vector<IssmDouble> *G = NULL;
49  Vector<IssmDouble> *XL = NULL;
50  Vector<IssmDouble> *XU = NULL;
51 
52  /*Initialize TAO*/
53  #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
54  int argc; char **args=NULL;
55  PetscGetArgs(&argc,&args);
56  ierr = TaoInitialize(&argc,&args,(char*)0,"");
57  if(ierr) _error_("Could not initialize Tao");
58  #endif
59 
60  /*Recover some parameters*/
71 
72  /*Prepare Toolkit*/
74 
75  /*Initialize TAO*/
76  TaoCreate(IssmComm::GetComm(),&tao);
77  if(VerboseControl()) _printf0_(" Initializing the Toolkit for Advanced Optimization (TAO)\n");
78  TaoSetFromOptions(tao);
79  TaoSetType(tao,algorithm);
80 
81  /*Prepare all TAO parameters*/
82  TaoSetMonitor(tao,IssmMonitor,&user,NULL);
83  TaoSetMaximumFunctionEvaluations(tao,maxiter);
84  TaoSetMaximumIterations(tao,maxsteps);
85  #if (_PETSC_MAJOR_==3) && (_PETSC_MINOR_<7)
86  TaoSetTolerances(tao,0,0,gatol,grtol,gttol);
87  #else
88  TaoSetTolerances(tao,gatol,grtol,gttol);
89  #endif
90 
94  TaoSetInitialVector(tao,X->pvector->vector);
95  TaoSetVariableBounds(tao,XL->pvector->vector,XU->pvector->vector);
96  delete XL;
97  delete XU;
98 
99  user.J=xNewZeroInit<double>(maxiter+5);
100  user.femmodel=femmodel;
101  TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user);
102 
103  /*Solver optimization problem*/
104  if(VerboseControl()) _printf0_(" Starting optimization\n");
105  TaoSolve(tao);
106  TaoView(tao,PETSC_VIEWER_STDOUT_WORLD);
107 
108  /*Save results*/
109  TaoGetSolutionVector(tao,&X->pvector->vector);
110  G=new Vector<IssmDouble>(0); VecFree(&G->pvector->vector);
111  TaoGetGradientVector(tao,&G->pvector->vector);
115  femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,user.J,maxiter+3,1,0,0));
116 
117  /*Finalize*/
118  if(VerboseControl()) _printf0_(" preparing final solution\n");
120  void (*solutioncore)(FemModel*)=NULL;
121  CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
122  solutioncore(femmodel);
123 
124  /*Clean up and return*/
125  xDelete<int>(control_list);
126  xDelete<char>(algorithm);
127  xDelete<double>(user.J);
128  delete X;
129  TaoDestroy(&tao);
130  #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
131  TaoFinalize();
132  #endif
133  G->pvector->vector = NULL;
134  delete G;
135 }
136 
137 #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
138 int FormFunctionGradient(TaoSolver tao, Vec Xpetsc, IssmDouble *fcn,Vec G,void *uservoid){
139 #else
140 int FormFunctionGradient(Tao tao, Vec Xpetsc, IssmDouble *fcn,Vec G,void *uservoid){
141 #endif
142 
143  /*Retreive arguments*/
144  int solution_type;
145  AppCtx *user = (AppCtx *)uservoid;
146  FemModel *femmodel = user->femmodel;
147  Vector<IssmDouble> *gradient = NULL;
148  Vector<IssmDouble> *X = NULL;
149 
150  /*Convert input to Vec*/
151  X=new Vector<IssmDouble>(Xpetsc);
152 
153  /*Set new variable*/
154  //VecView(X,PETSC_VIEWER_STDOUT_WORLD);
156  delete X;
157 
158  /*Recover some parameters*/
159  femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
160 
161  /*Compute solution and adjoint*/
162  void (*solutioncore)(FemModel*)=NULL;
163  void (*adjointcore)(FemModel*)=NULL;
164  CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
165  AdjointCorePointerFromSolutionEnum(&adjointcore,solution_type);
166  solutioncore(femmodel);
167  adjointcore(femmodel);
168 
169  /*Compute objective function*/
170  femmodel->CostFunctionx(fcn,NULL,NULL);
171 
172  /*Compute gradient*/
174  VecCopy(gradient->pvector->vector,G); delete gradient;
175  VecScale(G,-1.);
176 
177  /*Clean-up and return*/
178  return 0;
179 }
180 #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
181 int IssmMonitor(TaoSolver tao, void *userCtx){
182 #else
183 int IssmMonitor(Tao tao, void *userCtx){
184 #endif
185 
186  int its,num_responses;
187  IssmDouble f,gnorm,cnorm,xdiff;
188  AppCtx *user = (AppCtx *)userCtx;
189  FemModel *femmodel = user->femmodel;
190  int *responses = NULL;
191 
192  femmodel->parameters->FindParam(&responses,&num_responses,InversionCostFunctionsEnum);
193 
194  TaoGetSolutionStatus(tao, &its, &f, &gnorm, &cnorm, &xdiff, NULL);
195  if(its==0) _printf0_("Iter Function Residual | List of contributions\n");
196  if(its==0) _printf0_("___________________________________________________________\n");
197  _printf0_(setw(4)<<its<<" "<<setw(12)<<setprecision(7)<<f<<" "<<setw(12)<<setprecision(7)<<gnorm<<" | ");
198  user->J[its]=f;
199 
200  /*Retrieve objective functions independently*/
201  for(int i=0;i<num_responses;i++){
202  femmodel->Responsex(&f,EnumToStringx(responses[i]));
203  _printf0_(" "<<setw(12)<<setprecision(7)<<f);
204  }
205  _printf0_("\n");
206 
207  /*Clean-up and return*/
208  xDelete<int>(responses);
209  return 0;
210 }
211 
212 #else
214  _error_("TAO not installed or PETSc version not supported");
215 }
216 #endif //_HAVE_TAO_
DataSet::Size
int Size()
Definition: DataSet.cpp:399
GetVectorFromControlInputsx
void GetVectorFromControlInputsx(Vector< IssmDouble > **pvector, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters, const char *data)
Definition: GetVectorFromControlInputsx.cpp:9
SaveResultsEnum
@ SaveResultsEnum
Definition: EnumDefinitions.h:302
ControlInputSetGradientx
void ControlInputSetGradientx(Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters, IssmDouble *gradient)
Definition: ControlInputSetGradientx.cpp:9
FemModel::vertices
Vertices * vertices
Definition: FemModel.h:49
IssmDouble
double IssmDouble
Definition: types.h:37
InversionNumControlParametersEnum
@ InversionNumControlParametersEnum
Definition: EnumDefinitions.h:223
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
AppCtx
Definition: control_core.cpp:16
DataSet::AddObject
int AddObject(Object *object)
Definition: DataSet.cpp:252
InversionControlParametersEnum
@ InversionControlParametersEnum
Definition: EnumDefinitions.h:209
AdjointCorePointerFromSolutionEnum
void AdjointCorePointerFromSolutionEnum(void(**padjointcore)(FemModel *), int solutiontype)
Definition: AdjointCorePointerFromSolutionEnum.cpp:18
cores.h
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
CorePointerFromSolutionEnum
void CorePointerFromSolutionEnum(void(**psolutioncore)(FemModel *), Parameters *parameters, int solutiontype)
Definition: CorePointerFromSolutionEnum.cpp:18
FemModel::CostFunctionx
void CostFunctionx(IssmDouble *pJ, IssmDouble **pJlist, int *pn)
Definition: FemModel.cpp:1062
ToolkitsOptionsFromAnalysis
void ToolkitsOptionsFromAnalysis(Parameters *parameters, int analysis_type)
JEnum
@ JEnum
Definition: EnumDefinitions.h:1134
FemModel::results
Results * results
Definition: FemModel.h:48
InversionMaxstepsEnum
@ InversionMaxstepsEnum
Definition: EnumDefinitions.h:221
FemModel::OutputControlsx
void OutputControlsx(Results **presults)
Definition: FemModel.cpp:2171
VecFree
void VecFree(Vec *pvec)
Definition: VecFree.cpp:16
DefaultAnalysisEnum
@ DefaultAnalysisEnum
Definition: EnumDefinitions.h:1032
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
InversionCostFunctionsEnum
@ InversionCostFunctionsEnum
Definition: EnumDefinitions.h:211
FemModel::materials
Materials * materials
Definition: FemModel.h:45
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
Gradjx
void Gradjx(Vector< IssmDouble > **pgradient, IssmDouble **pnorm_list, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
Definition: Gradjx.cpp:9
SolutionTypeEnum
@ SolutionTypeEnum
Definition: EnumDefinitions.h:398
FemModel::loads
Loads * loads
Definition: FemModel.h:54
FemModel::elements
Elements * elements
Definition: FemModel.h:44
FemModel::Responsex
void Responsex(IssmDouble *presponse, int response_descriptor_enum)
Definition: FemModel.cpp:2558
FemModel
Definition: FemModel.h:31
controltao_core
void controltao_core(FemModel *femmodel)
Definition: controltao_core.cpp:213
GenericExternalResult
Definition: GenericExternalResult.h:21
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
InversionMaxiterEnum
@ InversionMaxiterEnum
Definition: EnumDefinitions.h:219
AppCtx::femmodel
FemModel * femmodel
Definition: control_core.cpp:17
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
InversionGatolEnum
@ InversionGatolEnum
Definition: EnumDefinitions.h:213
SetControlInputsFromVectorx
void SetControlInputsFromVectorx(FemModel *femmodel, IssmDouble *vector)
Definition: SetControlInputsFromVectorx.cpp:9
FormFunctionGradient
IssmDouble FormFunctionGradient(IssmDouble **pG, IssmDouble *X, void *usr)
Definition: control_core.cpp:197
InversionGttolEnum
@ InversionGttolEnum
Definition: EnumDefinitions.h:216
InversionAlgorithmEnum
@ InversionAlgorithmEnum
Definition: EnumDefinitions.h:208
InversionGrtolEnum
@ InversionGrtolEnum
Definition: EnumDefinitions.h:215
VerboseControl
bool VerboseControl(void)
Definition: Verbosity.cpp:27
Vector< IssmDouble >
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16