Ice Sheet System Model  4.18
Code documentation
Functions
Gradjx.h File Reference

header file for inverse methods gradient computation More...

#include "../../classes/classes.h"
#include "../../analyses/analyses.h"

Go to the source code of this file.

Functions

void Gradjx (Vector< IssmDouble > **pgrad_g, IssmDouble **pgrad_norm, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
 
void Gradjx (IssmDouble **pgrad_g, IssmDouble **pgrad_norm, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
 

Detailed Description

header file for inverse methods gradient computation

Definition in file Gradjx.h.

Function Documentation

◆ Gradjx() [1/2]

void Gradjx ( Vector< IssmDouble > **  pgrad_g,
IssmDouble **  pgrad_norm,
Elements elements,
Nodes nodes,
Vertices vertices,
Loads loads,
Materials materials,
Parameters parameters 
)

Definition at line 9 of file Gradjx.cpp.

9  {
10 
11  int numberofvertices;
12  int num_controls,analysisenum;
13  IssmDouble norm_inf;
14  IssmDouble *norm_list = NULL;
15  int *control_type = NULL;
16  Vector<IssmDouble> *gradient = NULL;
17  Vector<IssmDouble> **gradient_list = NULL;
18 
19  /*Display message*/
20  if(VerboseModule()) _printf0_(" Computing cost function gradient\n");
21 
22  /*retrieve some parameters: */
23  parameters->FindParam(&num_controls,InversionNumControlParametersEnum); _assert_(num_controls);
24  parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
25  numberofvertices=vertices->NumberOfVertices();
26 
27  /*Get current analysis*/
28  parameters->FindParam(&analysisenum,AnalysisTypeEnum);
29  Analysis* analysis = EnumToAnalysis(analysisenum);
30 
31  /*Allocate gradient_list */
32  gradient_list = xNew<Vector<IssmDouble>*>(num_controls);
33  norm_list = xNew<IssmDouble>(num_controls);
34  for(int i=0;i<num_controls;i++){
35  gradient_list[i]=new Vector<IssmDouble>(num_controls*numberofvertices);
36  }
37  gradient=new Vector<IssmDouble>(num_controls*numberofvertices);
38 
39  /*Compute all gradient_list*/
40  for(int i=0;i<num_controls;i++){
41  for(int j=0;j<elements->Size();j++){
42  Element* element=(Element*)elements->GetObjectByOffset(j);
43  analysis->GradientJ(gradient_list[i],element,control_type[i],i);
44  }
45  gradient_list[i]->Assemble();
46  norm_list[i]=gradient_list[i]->Norm(NORM_INF);
47  }
48 
49  /*Add all gradient_list together*/
50  for(int i=0;i<num_controls;i++){
51  gradient->AXPY(gradient_list[i],1.0);
52  delete gradient_list[i];
53  }
54 
55  /*Check that gradient is clean*/
56  norm_inf=gradient->Norm(NORM_INF);
57  if(norm_inf<=0) _error_("||dJ/dk|| = 0 gradient norm is zero");
58  if(xIsNan<IssmDouble>(norm_inf))_error_("||dJ/dk|| = NaN gradient norm is NaN");
59 
60  /*Clean-up and assign output pointer*/
61  delete analysis;
62  xDelete<Vector<IssmDouble>*>(gradient_list);
63  xDelete<int>(control_type);
64  if(pnorm_list){
65  *pnorm_list=norm_list;
66  }
67  else{
68  xDelete<IssmDouble>(norm_list);
69  }
70  if(pgradient) *pgradient=gradient;
71 
72 }

◆ Gradjx() [2/2]

void Gradjx ( IssmDouble **  pgrad_g,
IssmDouble **  pgrad_norm,
Elements elements,
Nodes nodes,
Vertices vertices,
Loads loads,
Materials materials,
Parameters parameters 
)

Definition at line 73 of file Gradjx.cpp.

73  {
74 
75  /*output: */
76  IssmDouble* gradient=NULL;
77 
78  /*intermediary: */
79  Vector<IssmDouble>* vec_gradient=NULL;
80 
81  Gradjx(&vec_gradient,pnorm_list,elements,nodes, vertices,loads,materials,parameters);
82  gradient=vec_gradient->ToMPISerial();
83 
84  /*Free ressources:*/
85  delete vec_gradient;
86 
87  /*Assign output pointers:*/
88  *pgradient=gradient;
89 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
IssmDouble
double IssmDouble
Definition: types.h:37
InversionNumControlParametersEnum
@ InversionNumControlParametersEnum
Definition: EnumDefinitions.h:223
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
InversionControlParametersEnum
@ InversionControlParametersEnum
Definition: EnumDefinitions.h:209
Vertices::NumberOfVertices
int NumberOfVertices(void)
Definition: Vertices.cpp:255
NORM_INF
@ NORM_INF
Definition: toolkitsenums.h:15
VerboseModule
bool VerboseModule(void)
Definition: Verbosity.cpp:23
Vector::Norm
doubletype Norm(NormMode norm_type)
Definition: Vector.h:342
Element
Definition: Element.h:41
Vector::AXPY
void AXPY(Vector *X, doubletype a)
Definition: Vector.h:256
Analysis::GradientJ
virtual void GradientJ(Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)=0
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
Vector::Assemble
void Assemble(void)
Definition: Vector.h:142
EnumToAnalysis
Analysis * EnumToAnalysis(int analysis_enum)
Definition: EnumToAnalysis.cpp:13
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
AnalysisTypeEnum
@ AnalysisTypeEnum
Definition: EnumDefinitions.h:36
Vector::ToMPISerial
doubletype * ToMPISerial(void)
Definition: Vector.h:277
Vector< IssmDouble >
Analysis
Definition: Analysis.h:30