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

: core of the control solution More...

#include "./cores.h"
#include "../toolkits/toolkits.h"
#include "../classes/classes.h"
#include "../shared/shared.h"
#include "../modules/modules.h"

Go to the source code of this file.

Functions

void controlvalidation_core (FemModel *femmodel)
 

Detailed Description

: core of the control solution

Definition in file controlvalidation_core.cpp.

Function Documentation

◆ controlvalidation_core()

void controlvalidation_core ( FemModel femmodel)

Definition at line 155 of file controlvalidation_core.cpp.

155  {
156 
157  int solution_type,n;
158  int num_responses;
159  IssmDouble j0,j;
160  IssmDouble Ialpha,exponent,alpha;
161  IssmDouble* scaling_factors = NULL;
162  IssmDouble* jlist = NULL;
163  int my_rank=IssmComm::GetRank();
164 
165  /*Recover parameters used throughout the solution*/
166  femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
170 
171  /*Get initial guess*/
172  IssmPDouble* X0 = NULL;
174 
175  /*Allocate vectors*/
176  IssmDouble* X = xNew<IssmDouble>(n);
177  IssmPDouble* G = xNew<IssmPDouble>(n);
178 
179  /*out of solution_type, figure out solution core and adjoint function pointer*/
180  void (*solutioncore)(FemModel*)=NULL;
181  CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
182 
183  #if defined(_HAVE_ADOLC_)
184  /*{{{*/
185  IssmDouble* aX=xNew<IssmDouble>(n);
186  if(my_rank==0){
187  for(int i=0;i<n;i++){
188  aX[i]<<=X0[i];
189  }
190  }
191  _error_("not implemented yet...");
192  /*}}}*/
193  #elif defined(_HAVE_CODIPACK_)
194  simul_starttrace2(femmodel);
195  IssmDouble* aX=xNew<IssmDouble>(n);
196  auto& tape_codi = IssmDouble::getGlobalTape();
197  codi_global.input_indices.clear();
198  if(my_rank==0){
199  for (int i=0;i<n;i++) {
200  aX[i]=X0[i];
201  tape_codi.registerInput(aX[i]);
202  codi_global.input_indices.push_back(aX[i].getGradientData());
203  }
204  }
206  xDelete(aX);
207 
208  if(VerboseControl()) _printf0_(" Compute Initial cost function\n");
209  solutioncore(femmodel);
210 
211  /*Get Dependents*/
212  IssmDouble output_value;
213  int num_dependents;
214  IssmPDouble *dependents;
215  DataSet* dependent_objects=NULL;
216  IssmDouble J=0.;
219 
220  /*Go through our dependent variables, and compute the response:*/
221  dependents=xNew<IssmPDouble>(num_dependents);
222  codi_global.output_indices.clear();
223  for(int i=0;i<dependent_objects->Size();i++){
224  DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
225  if(solution_type==TransientSolutionEnum){
226  output_value = dep->GetValue();
227  }
228  else{
229  dep->Responsex(&output_value,femmodel);
230  }
231  _printf0_("=== output ="<<output_value<<" \n");
232  if(my_rank==0) {
233  tape_codi.registerOutput(output_value);
234  dependents[i] = output_value.getValue();
235  codi_global.output_indices.push_back(output_value.getGradientData());
236  J+=output_value;
237  }
238  }
239  j0 = J;
240  _printf0_("Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<"\n");
241  _assert_(j0>0.);
242  simul_stoptrace2();
243  /*initialize direction index in the weights vector: */
244  if(my_rank==0){
245  tape_codi.setGradient(codi_global.output_indices[0],1.0);
246  }
247  tape_codi.evaluate();
248 
249  /*Get gradient for this dependent */
250  auto in_size = codi_global.input_indices.size();
251  for(size_t i = 0; i < in_size; ++i) {
252  G[i] = tape_codi.getGradient(codi_global.input_indices[i]);
253  }
254  #else
255  /*{{{*/
256  void (*adjointcore)(FemModel*) = NULL;
257  AdjointCorePointerFromSolutionEnum(&adjointcore,solution_type);
258 
259  if(VerboseControl()) _printf0_(" Compute Initial solution\n");
260  solutioncore(femmodel);
261  if(VerboseControl()) _printf0_(" Compute Adjoint\n");
262  adjointcore(femmodel);
263 
264  if(VerboseControl()) _printf0_(" Compute Initial cost function\n");
265  femmodel->CostFunctionx(&j0,&jlist,NULL);
266  _printf0_("Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<"\n");
267  xDelete<IssmDouble>(jlist);
268 
269  if(VerboseControl()) _printf0_(" Compute Gradient\n");
271  for(int i=0;i<n;i++) G[i] = -G[i];
272  /*}}}*/
273  #endif
274 
275  /*Allocate output*/
276  int num = 26;
277  IssmDouble* output = xNew<IssmDouble>(2*num);
278 
279  /*Start loop*/
280  _printf0_(" alpha Ialpha \n");
281  _printf0_("_________________________\n");
282  for(int m=0;m<num;m++){
283 
284  /*Create new vector*/
285  alpha = pow(2.,-m);
286  for(int i=0;i<n;i++) X[i] = X0[i] + alpha*scaling_factors[0];
287 
288  /*Calculate j(k+alpha delta k) */
290  solutioncore(femmodel);
291 
292  #if defined(_HAVE_CODIPACK_)
293  j=0.;
294  for(int i=0;i<dependent_objects->Size();i++){
295  DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
296  if(solution_type==TransientSolutionEnum){
297  output_value = dep->GetValue();
298  }
299  else{
300  dep->Responsex(&output_value,femmodel);
301  }
302  j+=output_value;
303  }
304  #else
305  femmodel->CostFunctionx(&j,NULL,NULL);
306  #endif
307 
308  IssmDouble Den = 0.;
309  for(int i=0;i<n;i++) Den += alpha* G[i] * scaling_factors[0];
310  Ialpha = fabs((j - j0)/Den - 1.);
311  _assert_(fabs(Den)>0.);
312 
313  _printf0_(" " << setw(11) << setprecision (5)<<alpha<<" " << setw(11) << setprecision (5)<<Ialpha<<"\n");
314  output[m*2+0] = alpha;
315  output[m*2+1] = Ialpha;
316  }
317 
318  /*output*/
319  #ifdef _HAVE_AD_
320  IssmPDouble* J_passive=xNew<IssmPDouble>(2*num);
321  for(int i=0;i<2*num;i++) J_passive[i]=reCast<IssmPDouble>(output[i]);
323  xDelete<IssmPDouble>(J_passive);
324  IssmDouble* aG=xNew<IssmDouble>(n);
325  for(int i=0;i<n;i++) aG[i] = G[i];
327  xDelete<IssmDouble>(aG);
328  #else
331  #endif
333 
334  /*Clean up and return*/
335  xDelete<IssmDouble>(output);
336  xDelete<IssmPDouble>(G);
337  xDelete<IssmDouble>(X);
338  xDelete<double>(X0);
339  xDelete<IssmDouble>(scaling_factors);
340 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
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
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
FemModel::vertices
Vertices * vertices
Definition: FemModel.h:49
GetPassiveVectorFromControlInputsx
void GetPassiveVectorFromControlInputsx(IssmPDouble **pvector, int *pN, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters, const char *data)
Definition: GetVectorFromControlInputsx.cpp:127
IssmDouble
double IssmDouble
Definition: types.h:37
AutodiffDependentObjectsEnum
@ AutodiffDependentObjectsEnum
Definition: EnumDefinitions.h:43
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
DataSet::AddObject
int AddObject(Object *object)
Definition: DataSet.cpp:252
AdjointCorePointerFromSolutionEnum
void AdjointCorePointerFromSolutionEnum(void(**padjointcore)(FemModel *), int solutiontype)
Definition: AdjointCorePointerFromSolutionEnum.cpp:18
TransientSolutionEnum
@ TransientSolutionEnum
Definition: EnumDefinitions.h:1317
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
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
JEnum
@ JEnum
Definition: EnumDefinitions.h:1134
FemModel::results
Results * results
Definition: FemModel.h:48
FemModel::OutputControlsx
void OutputControlsx(Results **presults)
Definition: FemModel.cpp:2171
Parameters::SetParam
void SetParam(bool boolean, int enum_type)
Definition: Parameters.cpp:441
DependentObject
Definition: DependentObject.h:15
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
xDelete
void xDelete(T **&aT_pp)
Definition: MemOps.h:97
FemModel::materials
Materials * materials
Definition: FemModel.h:45
alpha
IssmDouble alpha(IssmDouble x, IssmDouble y, IssmDouble z, int testid)
Definition: fsanalyticals.cpp:221
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
DependentObject::Responsex
void Responsex(IssmDouble *poutput_value, FemModel *femmodel)
Definition: DependentObject.cpp:93
FemModel
Definition: FemModel.h:31
GenericExternalResult
Definition: GenericExternalResult.h:21
IssmComm::GetRank
static int GetRank(void)
Definition: IssmComm.cpp:34
InversionControlScalingFactorsEnum
@ InversionControlScalingFactorsEnum
Definition: EnumDefinitions.h:210
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
InversionNumCostFunctionsEnum
@ InversionNumCostFunctionsEnum
Definition: EnumDefinitions.h:224
AutodiffNumDependentsEnum
@ AutodiffNumDependentsEnum
Definition: EnumDefinitions.h:52
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
SetControlInputsFromVectorx
void SetControlInputsFromVectorx(FemModel *femmodel, IssmDouble *vector)
Definition: SetControlInputsFromVectorx.cpp:9
DependentObject::GetValue
IssmDouble GetValue(void)
Definition: DependentObject.cpp:102
IssmPDouble
IssmDouble IssmPDouble
Definition: types.h:38
DataSet
Declaration of DataSet class.
Definition: DataSet.h:14
VerboseControl
bool VerboseControl(void)
Definition: Verbosity.cpp:27
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16