Ice Sheet System Model  4.18
Code documentation
DepthAverageAnalysis.cpp
Go to the documentation of this file.
2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
6 
7 /*Model processing*/
8 void DepthAverageAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
9 }/*}}}*/
10 void DepthAverageAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
11 }/*}}}*/
12 void DepthAverageAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr){/*{{{*/
13 
15 
16 }/*}}}*/
17 int DepthAverageAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
18  return 1;
19 }/*}}}*/
20 void DepthAverageAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
21 
22  int counter=0;
23  for(int i=0;i<iomodel->numberofelements;i++){
24  if(iomodel->my_elements[i]){
25  Element* element=(Element*)elements->GetObjectByOffset(counter);
26  element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
27  counter++;
28  }
29  }
30 
31  if(iomodel->domaintype==Domain2DverticalEnum){
32  iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
33  }
34 }/*}}}*/
35 void DepthAverageAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
36 }/*}}}*/
37 
38 /*Finite Element Analysis*/
40  _error_("not implemented");
41 }/*}}}*/
43  /*Default, return NULL*/
44  return NULL;
45 }/*}}}*/
47 _error_("Not implemented");
48 }/*}}}*/
50 
51  /*Intermediaries */
52  int dim;
53  IssmDouble Jdet,D,dt=1.e+9;
54  IssmDouble *xyz_list = NULL;
55 
56  /*Get dimension*/
57  element->FindParam(&dim,DomainDimensionEnum);
58 
59  /*Fetch number of nodes and dof for this finite element*/
60  int numnodes = element->GetNumberOfNodes();
61 
62  /*Initialize Element vector and other vectors*/
63  ElementMatrix* Ke = element->NewElementMatrix();
64  IssmDouble* B = xNew<IssmDouble>(numnodes);
65 
66  /*Retrieve all inputs and parameters*/
67  element->GetVerticesCoordinates(&xyz_list);
68 
69  /* Start looping on the number of gaussian points: */
70  Gauss* gauss=element->NewGauss(2);
71  for(int ig=gauss->begin();ig<gauss->end();ig++){
72  gauss->GaussPoint(ig);
73 
74  element->JacobianDeterminant(&Jdet,xyz_list,gauss);
75  GetB(B,element,dim,xyz_list,gauss);
76  D=gauss->weight*Jdet*dt;
77 
78  /*vertical diffusion*/
79  TripleMultiply(B,1,numnodes,1,
80  &D,1,1,0,
81  B,1,numnodes,0,
82  &Ke->values[0],1);
83 
84  /*Next value*/
85  D=gauss->weight*Jdet;
86  element->NodalFunctions(B,gauss);
87  TripleMultiply(B,numnodes,1,0,
88  &D,1,1,0,
89  B,1,numnodes,0,
90  &Ke->values[0],1);
91  }
92 
93  /*Clean up and return*/
94  xDelete<IssmDouble>(xyz_list);
95  xDelete<IssmDouble>(B);
96  delete gauss;
97  return Ke;
98 }/*}}}*/
100 
101  /*Intermediaries*/
102  int input_enum;
103  IssmDouble Jdet,scalar,value;
104  IssmDouble* xyz_list = NULL;
105 
106  /*Fetch number of nodes and dof for this finite element*/
107  int numnodes = element->GetNumberOfNodes();
108 
109  /*Initialize Element vector*/
110  ElementVector* pe = element->NewElementVector();
111  IssmDouble* basis = xNew<IssmDouble>(numnodes);
112 
113  /*Retrieve all inputs and parameters*/
114  element->GetVerticesCoordinates(&xyz_list);
115  element->FindParam(&input_enum,InputToDepthaverageInEnum);
116  Input2* input = element->GetInput2(input_enum); _assert_(input);
117 
118  /* Start looping on the number of gaussian points: */
119  Gauss* gauss=element->NewGauss(3);
120  for(int ig=gauss->begin();ig<gauss->end();ig++){
121  gauss->GaussPoint(ig);
122 
123  element->JacobianDeterminant(&Jdet,xyz_list,gauss);
124  element->NodalFunctions(basis,gauss);
125 
126  /* Build transient now */
127  input->GetInputValue(&value, gauss);
128  scalar=value*Jdet*gauss->weight;
129  for(int i=0;i<numnodes;i++) pe->values[i]+=scalar*basis[i];
130 
131  }
132 
133  /*Clean up and return*/
134  xDelete<IssmDouble>(basis);
135  xDelete<IssmDouble>(xyz_list);
136  delete gauss;
137  return pe;
138 }/*}}}*/
139 void DepthAverageAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
140  /* Compute B matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
141  where hi is the interpolation function for node i.*/
142 
143  /*Fetch number of nodes for this finite element*/
144  int numnodes = element->GetNumberOfNodes();
145 
146  /*Get nodal functions derivatives*/
147  IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
148  element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
149 
150  /*Build B: */
151  for(int i=0;i<numnodes;i++){
152  B[i] = dbasis[(dim-1)*numnodes+i];
153  }
154 
155  /*Clean-up*/
156  xDelete<IssmDouble>(dbasis);
157 }
158 /*}}}*/
160  _error_("not implemented yet");
161 }/*}}}*/
162 void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
163  _error_("Not implemented yet");
164 }/*}}}*/
166 
167  int inputenum;
168  element->FindParam(&inputenum,InputToDepthaverageOutEnum);
169  element->InputUpdateFromSolutionOneDof(solution,inputenum);
170 }/*}}}*/
172  /*Default, do nothing*/
173  return;
174 }/*}}}*/
DepthAverageAnalysis::CreateConstraints
void CreateConstraints(Constraints *constraints, IoModel *iomodel)
Definition: DepthAverageAnalysis.cpp:8
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
DepthAverageAnalysis::UpdateParameters
void UpdateParameters(Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum)
Definition: DepthAverageAnalysis.cpp:35
IssmDouble
double IssmDouble
Definition: types.h:37
Nodes
Declaration of Nodes class.
Definition: Nodes.h:19
InputToDepthaverageOutEnum
@ InputToDepthaverageOutEnum
Definition: EnumDefinitions.h:204
Element::GetNumberOfNodes
virtual int GetNumberOfNodes(void)=0
Element::FindParam
void FindParam(bool *pvalue, int paramenum)
Definition: Element.cpp:933
Parameters
Declaration of Parameters class.
Definition: Parameters.h:18
DepthAverageAnalysisEnum
@ DepthAverageAnalysisEnum
Definition: EnumDefinitions.h:1036
Constraints
Declaration of Constraints class.
Definition: Constraints.h:13
MeshVertexonbaseEnum
@ MeshVertexonbaseEnum
Definition: EnumDefinitions.h:653
Elements
Declaration of Elements class.
Definition: Elements.h:17
TripleMultiply
int TripleMultiply(IssmDouble *a, int nrowa, int ncola, int itrna, IssmDouble *b, int nrowb, int ncolb, int itrnb, IssmDouble *c, int nrowc, int ncolc, int itrnc, IssmDouble *d, int iaddd)
Definition: MatrixUtils.cpp:20
DepthAverageAnalysis::InputUpdateFromSolution
void InputUpdateFromSolution(IssmDouble *solution, Element *element)
Definition: DepthAverageAnalysis.cpp:165
ElementVector::values
IssmDouble * values
Definition: ElementVector.h:24
DepthAverageAnalysis::GetSolutionFromInputs
void GetSolutionFromInputs(Vector< IssmDouble > *solution, Element *element)
Definition: DepthAverageAnalysis.cpp:159
IoModel::my_elements
bool * my_elements
Definition: IoModel.h:66
DepthAverageAnalysis::CreateJacobianMatrix
ElementMatrix * CreateJacobianMatrix(Element *element)
Definition: DepthAverageAnalysis.cpp:46
DepthAverageAnalysis::CreateLoads
void CreateLoads(Loads *loads, IoModel *iomodel)
Definition: DepthAverageAnalysis.cpp:10
Element::GetInput2
virtual Input2 * GetInput2(int inputenum)=0
Element
Definition: Element.h:41
Element::NodalFunctions
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
P1Enum
@ P1Enum
Definition: EnumDefinitions.h:662
DepthAverageAnalysis::UpdateConstraints
void UpdateConstraints(FemModel *femmodel)
Definition: DepthAverageAnalysis.cpp:171
Element::NewElementVector
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
Definition: Element.cpp:2505
IoModel::numberofelements
int numberofelements
Definition: IoModel.h:96
DepthAverageAnalysis::CreateDVector
ElementVector * CreateDVector(Element *element)
Definition: DepthAverageAnalysis.cpp:42
DepthAverageAnalysis::CreateNodes
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
Definition: DepthAverageAnalysis.cpp:12
Element::NewGauss
virtual Gauss * NewGauss(void)=0
Element::InputUpdateFromSolutionOneDof
virtual void InputUpdateFromSolutionOneDof(IssmDouble *solution, int inputenum)=0
DomainDimensionEnum
@ DomainDimensionEnum
Definition: EnumDefinitions.h:123
Element::GetVerticesCoordinates
void GetVerticesCoordinates(IssmDouble **xyz_list)
Definition: Element.cpp:1446
Inputs2
Declaration of Inputs class.
Definition: Inputs2.h:23
DepthAverageAnalysis::GetB
void GetB(IssmDouble *B, Element *element, int dim, IssmDouble *xyz_list, Gauss *gauss)
Definition: DepthAverageAnalysis.cpp:139
DepthAverageAnalysis::CreatePVector
ElementVector * CreatePVector(Element *element)
Definition: DepthAverageAnalysis.cpp:99
DepthAverageAnalysis::GradientJ
void GradientJ(Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)
Definition: DepthAverageAnalysis.cpp:162
Input2
Definition: Input2.h:18
FemModel
Definition: FemModel.h:31
Loads
Declaration of Loads class.
Definition: Loads.h:16
InputToDepthaverageInEnum
@ InputToDepthaverageInEnum
Definition: EnumDefinitions.h:203
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
Gauss::begin
virtual int begin(void)=0
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
DepthAverageAnalysis::UpdateElements
void UpdateElements(Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type)
Definition: DepthAverageAnalysis.cpp:20
DepthAverageAnalysis.h
: header file for generic external result object
Element::JacobianDeterminant
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
Gauss::GaussPoint
virtual void GaussPoint(int ig)=0
Element::Update
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
DepthAverageAnalysis::Core
void Core(FemModel *femmodel)
Definition: DepthAverageAnalysis.cpp:39
IoModel::FetchDataToInput
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
Definition: IoModel.cpp:1651
ElementVector
Definition: ElementVector.h:20
Input2::GetInputValue
virtual void GetInputValue(IssmDouble *pvalue, Gauss *gauss)
Definition: Input2.h:38
Gauss::weight
IssmDouble weight
Definition: Gauss.h:11
IoModel
Definition: IoModel.h:48
IoModel::domaintype
int domaintype
Definition: IoModel.h:78
Domain2DverticalEnum
@ Domain2DverticalEnum
Definition: EnumDefinitions.h:535
ElementMatrix
Definition: ElementMatrix.h:19
Vector< IssmDouble >
DepthAverageAnalysis::DofsPerNode
int DofsPerNode(int **doflist, int domaintype, int approximation)
Definition: DepthAverageAnalysis.cpp:17
DepthAverageAnalysis::CreateKMatrix
ElementMatrix * CreateKMatrix(Element *element)
Definition: DepthAverageAnalysis.cpp:49
Gauss
Definition: Gauss.h:8
Element::NodalFunctionsDerivatives
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
ElementMatrix::values
IssmDouble * values
Definition: ElementMatrix.h:26
Element::NewElementMatrix
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)
Definition: Element.cpp:2497
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16