Ice Sheet System Model  4.18
Code documentation
EsaAnalysis.cpp
Go to the documentation of this file.
1 #include "./EsaAnalysis.h"
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 EsaAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
9  /*No constraints*/
10 }/*}}}*/
11 void EsaAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
12  /*No loads*/
13 }/*}}}*/
14 void EsaAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr){/*{{{*/
15  ::CreateNodes(nodes,iomodel,EsaAnalysisEnum,P1Enum);
16 }/*}}}*/
17 int EsaAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
18  return 1;
19 }/*}}}*/
20 void EsaAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
21 
22  /*Update elements: */
23  int counter=0;
24  for(int i=0;i<iomodel->numberofelements;i++){
25  if(iomodel->my_elements[i]){
26  Element* element=(Element*)elements->GetObjectByOffset(counter);
27  element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
28  counter++;
29  }
30  }
31 
32  /*Create inputs: */
33  iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
34  iomodel->FetchDataToInput(inputs2,elements,"md.esa.deltathickness",EsaDeltathicknessEnum);
35 
36 }/*}}}*/
37 void EsaAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
38 
39  int nl;
40  IssmDouble* love_h=NULL;
41  IssmDouble* love_l=NULL;
42 
43  IssmDouble* U_elastic = NULL;
44  IssmDouble* U_elastic_local = NULL;
45  IssmDouble* H_elastic = NULL;
46  IssmDouble* H_elastic_local = NULL;
47  int M,m,lower_row,upper_row;
48  IssmDouble degacc=.01;
49  IssmDouble planetradius=0;
50  IssmDouble planetarea=0;
51 
52  int numoutputs;
53  char** requestedoutputs = NULL;
54 
55  /*transition vectors: */
56  IssmDouble **transitions = NULL;
57  int *transitions_M = NULL;
58  int *transitions_N = NULL;
59  int ntransitions;
60 
61  /*some constant parameters: */
62  parameters->AddObject(iomodel->CopyConstantObject("md.esa.hemisphere",EsaHemisphereEnum));
63  parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.rigid",SolidearthSettingsRigidEnum));
64  parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.horiz",SolidearthSettingsHorizEnum));
65  parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.elastic",SolidearthSettingsElasticEnum));
66  parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.rotation",SolidearthSettingsRotationEnum));
67 
68  /*deal with planet radius and area: */
69  parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.planetradius",SolidearthPlanetRadiusEnum));
70  iomodel->FetchData(&planetradius,"md.solidearth.planetradius");
71  planetarea=4*PI*planetradius*planetradius;
72  parameters->AddObject(new DoubleParam(SolidearthPlanetAreaEnum,planetarea));
73 
74  /*love numbers: */
75  iomodel->FetchData(&love_h,&nl,NULL,"md.solidearth.lovenumbers.h");
76  iomodel->FetchData(&love_l,&nl,NULL,"md.solidearth.lovenumbers.l");
77 
78  /*compute elastic green function for a range of angles*/
79  iomodel->FetchData(&degacc,"md.esa.degacc");
80  M=reCast<int,IssmDouble>(180./degacc+1.);
81  U_elastic=xNew<IssmDouble>(M);
82  H_elastic=xNew<IssmDouble>(M);
83 
84  /*compute combined legendre + love number (elastic green function:*/
86  GetOwnershipBoundariesFromRange(&lower_row,&upper_row,m,IssmComm::GetComm());
87  U_elastic_local=xNew<IssmDouble>(m);
88  H_elastic_local=xNew<IssmDouble>(m);
89 
90  /*compute U_elastic_local and H_elastic_local {{{ */
91  for(int i=lower_row;i<upper_row;i++){
92  IssmDouble alpha,x;
93  alpha= reCast<IssmDouble>(i)*degacc * PI / 180.0;
94 
95  U_elastic_local[i-lower_row]= (love_h[nl-1])/2.0/sin(alpha/2.0);
96  H_elastic_local[i-lower_row]= 0;
97  //IssmDouble Pn,Pn1,Pn2;
98  //IssmDouble Pn_p,Pn_p1,Pn_p2;
99  IssmDouble Pn = 0.;
100  IssmDouble Pn1 = 0.;
101  IssmDouble Pn2 = 0.;
102  IssmDouble Pn_p = 0.;
103  IssmDouble Pn_p1 = 0.;
104  IssmDouble Pn_p2 = 0.;
105 
106  for (int n=0;n<nl;n++) {
107  IssmDouble deltalove_U;
108 
109  deltalove_U = (love_h[n]-love_h[nl-1]);
110 
111  /*compute legendre polynomials: P_n(cos\theta) & d P_n(cos\theta)/ d\theta: */
112  if(n==0){
113  Pn=1;
114  Pn_p=0;
115  }
116  else if(n==1){
117  Pn = cos(alpha);
118  Pn_p = 1;
119  }
120  else{
121  Pn = ( (2*n-1)*cos(alpha)*Pn1 - (n-1)*Pn2 ) /n;
122  Pn_p = ( (2*n-1)*(Pn1+cos(alpha)*Pn_p1) - (n-1)*Pn_p2 ) /n;
123  }
124  Pn2=Pn1; Pn1=Pn;
125  Pn_p2=Pn_p1; Pn_p1=Pn_p;
126 
127  U_elastic_local[i-lower_row] += deltalove_U*Pn; // vertical (up) displacement
128  H_elastic_local[i-lower_row] += sin(alpha)*love_l[n]*Pn_p; // horizontal displacements
129  }
130  }
131  /* }}} */
132 
133  /*merge U_elastic_local into U_elastic; H_elastic_local to H_elastic:{{{*/
134  int* recvcounts=xNew<int>(IssmComm::GetSize());
135  int* displs=xNew<int>(IssmComm::GetSize());
136 
137  //recvcounts:
139 
140  /*displs: */
142 
143  /*All gather:*/
144  ISSM_MPI_Allgatherv(U_elastic_local, m, ISSM_MPI_DOUBLE, U_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
145  ISSM_MPI_Allgatherv(H_elastic_local, m, ISSM_MPI_DOUBLE, H_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
146  /*free ressources: */
147  xDelete<int>(recvcounts);
148  xDelete<int>(displs);
149 
150  /*}}}*/
151 
152  /*Avoid singularity at 0: */
153  U_elastic[0]=U_elastic[1];
154  parameters->AddObject(new DoubleVecParam(EsaUElasticEnum,U_elastic,M));
155  H_elastic[0]=H_elastic[1];
156  parameters->AddObject(new DoubleVecParam(EsaHElasticEnum,H_elastic,M));
157 
158  /*free ressources: */
159  xDelete<IssmDouble>(love_h);
160  xDelete<IssmDouble>(love_l);
161  xDelete<IssmDouble>(U_elastic);
162  xDelete<IssmDouble>(U_elastic_local);
163  xDelete<IssmDouble>(H_elastic);
164  xDelete<IssmDouble>(H_elastic_local);
165 
166  /*Transitions: */
167  iomodel->FetchData(&transitions,&transitions_M,&transitions_N,&ntransitions,"md.esa.transitions");
168  if(transitions){
169  parameters->AddObject(new DoubleMatArrayParam(EsaTransitionsEnum,transitions,ntransitions,transitions_M,transitions_N));
170 
171  for(int i=0;i<ntransitions;i++){
172  IssmDouble* transition=transitions[i];
173  xDelete<IssmDouble>(transition);
174  }
175  xDelete<IssmDouble*>(transitions);
176  xDelete<int>(transitions_M);
177  xDelete<int>(transitions_N);
178  }
179 
180  /*Requested outputs*/
181  iomodel->FindConstant(&requestedoutputs,&numoutputs,"md.esa.requested_outputs");
182  if(numoutputs)parameters->AddObject(new StringArrayParam(EsaRequestedOutputsEnum,requestedoutputs,numoutputs));
183  iomodel->DeleteData(&requestedoutputs,numoutputs,"md.esa.requested_outputs");
184 
185 }/*}}}*/
186 
187 /*Finite Element Analysis*/
189  _error_("not implemented");
190 }/*}}}*/
192  /*Default, return NULL*/
193  return NULL;
194 }/*}}}*/
196 _error_("Not implemented");
197 }/*}}}*/
199  _error_("not implemented yet");
200 }/*}}}*/
202 _error_("not implemented yet");
203 }/*}}}*/
205  _error_("not implemented yet");
206 }/*}}}*/
207 void EsaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
208  _error_("Not implemented yet");
209 }/*}}}*/
211  /*Default, do nothing*/
212  return;
213 
214 }/*}}}*/
216  /*Default, do nothing*/
217  return;
218 }/*}}}*/
EsaAnalysis::CreateDVector
ElementVector * CreateDVector(Element *element)
Definition: EsaAnalysis.cpp:191
EsaAnalysis::UpdateConstraints
void UpdateConstraints(FemModel *femmodel)
Definition: EsaAnalysis.cpp:215
IssmDouble
double IssmDouble
Definition: types.h:37
Nodes
Declaration of Nodes class.
Definition: Nodes.h:19
EsaAnalysis::Core
void Core(FemModel *femmodel)
Definition: EsaAnalysis.cpp:188
EsaAnalysis::InputUpdateFromSolution
void InputUpdateFromSolution(IssmDouble *solution, Element *element)
Definition: EsaAnalysis.cpp:210
EsaAnalysis::UpdateElements
void UpdateElements(Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type)
Definition: EsaAnalysis.cpp:20
EsaTransitionsEnum
@ EsaTransitionsEnum
Definition: EnumDefinitions.h:1055
EsaHElasticEnum
@ EsaHElasticEnum
Definition: EnumDefinitions.h:131
Parameters
Declaration of Parameters class.
Definition: Parameters.h:18
EsaDeltathicknessEnum
@ EsaDeltathicknessEnum
Definition: EnumDefinitions.h:559
MaskIceLevelsetEnum
@ MaskIceLevelsetEnum
Definition: EnumDefinitions.h:641
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
Constraints
Declaration of Constraints class.
Definition: Constraints.h:13
EsaAnalysis::CreatePVector
ElementVector * CreatePVector(Element *element)
Definition: EsaAnalysis.cpp:201
Elements
Declaration of Elements class.
Definition: Elements.h:17
GetOwnershipBoundariesFromRange
void GetOwnershipBoundariesFromRange(int *plower_row, int *pupper_row, int range, ISSM_MPI_Comm comm)
Definition: GetOwnershipBoundariesFromRange.cpp:16
EsaAnalysis::GradientJ
void GradientJ(Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)
Definition: EsaAnalysis.cpp:207
EsaHemisphereEnum
@ EsaHemisphereEnum
Definition: EnumDefinitions.h:132
IoModel::my_elements
bool * my_elements
Definition: IoModel.h:66
EsaAnalysisEnum
@ EsaAnalysisEnum
Definition: EnumDefinitions.h:1053
SolidearthSettingsRigidEnum
@ SolidearthSettingsRigidEnum
Definition: EnumDefinitions.h:329
SolidearthSettingsHorizEnum
@ SolidearthSettingsHorizEnum
Definition: EnumDefinitions.h:323
EsaUElasticEnum
@ EsaUElasticEnum
Definition: EnumDefinitions.h:134
Parameters::AddObject
void AddObject(Param *newparam)
Definition: Parameters.cpp:67
EsaAnalysis::CreateNodes
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
Definition: EsaAnalysis.cpp:14
EsaAnalysis::CreateConstraints
void CreateConstraints(Constraints *constraints, IoModel *iomodel)
Definition: EsaAnalysis.cpp:8
DetermineLocalSize
int DetermineLocalSize(int global_size, ISSM_MPI_Comm comm)
Definition: DetermineLocalSize.cpp:9
Element
Definition: Element.h:41
P1Enum
@ P1Enum
Definition: EnumDefinitions.h:662
ISSM_MPI_DOUBLE
#define ISSM_MPI_DOUBLE
Definition: issmmpi.h:125
ISSM_MPI_INT
#define ISSM_MPI_INT
Definition: issmmpi.h:127
IoModel::DeleteData
void DeleteData(int num,...)
Definition: IoModel.cpp:500
IoModel::numberofelements
int numberofelements
Definition: IoModel.h:96
SolidearthPlanetRadiusEnum
@ SolidearthPlanetRadiusEnum
Definition: EnumDefinitions.h:303
DoubleParam
Definition: DoubleParam.h:20
IoModel::CopyConstantObject
Param * CopyConstantObject(const char *constant_name, int param_enum)
Definition: IoModel.cpp:418
EsaAnalysis::GetSolutionFromInputs
void GetSolutionFromInputs(Vector< IssmDouble > *solution, Element *element)
Definition: EsaAnalysis.cpp:204
IssmComm::GetSize
static int GetSize(void)
Definition: IssmComm.cpp:46
alpha
IssmDouble alpha(IssmDouble x, IssmDouble y, IssmDouble z, int testid)
Definition: fsanalyticals.cpp:221
IoModel::FindConstant
void FindConstant(bool *pvalue, const char *constant_name)
Definition: IoModel.cpp:2362
StringArrayParam
Definition: StringArrayParam.h:20
EsaAnalysis::DofsPerNode
int DofsPerNode(int **doflist, int domaintype, int approximation)
Definition: EsaAnalysis.cpp:17
SolidearthPlanetAreaEnum
@ SolidearthPlanetAreaEnum
Definition: EnumDefinitions.h:304
EsaAnalysis::UpdateParameters
void UpdateParameters(Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum)
Definition: EsaAnalysis.cpp:37
EsaAnalysis::CreateJacobianMatrix
ElementMatrix * CreateJacobianMatrix(Element *element)
Definition: EsaAnalysis.cpp:195
IoModel::FetchData
void FetchData(bool *pboolean, const char *data_name)
Definition: IoModel.cpp:933
Inputs2
Declaration of Inputs class.
Definition: Inputs2.h:23
PI
const double PI
Definition: constants.h:11
FemModel
Definition: FemModel.h:31
ISSM_MPI_Allgather
int ISSM_MPI_Allgather(void *sendbuf, int sendcount, ISSM_MPI_Datatype sendtype, void *recvbuf, int recvcount, ISSM_MPI_Datatype recvtype, ISSM_MPI_Comm comm)
Definition: issmmpi.cpp:45
Loads
Declaration of Loads class.
Definition: Loads.h:16
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
SolidearthSettingsRotationEnum
@ SolidearthSettingsRotationEnum
Definition: EnumDefinitions.h:330
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
DoubleVecParam
Definition: DoubleVecParam.h:20
Element::Update
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
ISSM_MPI_Allgatherv
int ISSM_MPI_Allgatherv(void *sendbuf, int sendcount, ISSM_MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, ISSM_MPI_Datatype recvtype, ISSM_MPI_Comm comm)
Definition: issmmpi.cpp:79
EsaAnalysis::CreateKMatrix
ElementMatrix * CreateKMatrix(Element *element)
Definition: EsaAnalysis.cpp:198
IoModel::FetchDataToInput
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
Definition: IoModel.cpp:1651
ElementVector
Definition: ElementVector.h:20
EsaRequestedOutputsEnum
@ EsaRequestedOutputsEnum
Definition: EnumDefinitions.h:133
IoModel
Definition: IoModel.h:48
SolidearthSettingsElasticEnum
@ SolidearthSettingsElasticEnum
Definition: EnumDefinitions.h:308
ElementMatrix
Definition: ElementMatrix.h:19
EsaAnalysis.h
: header file for generic external result object
Vector< IssmDouble >
DoubleMatArrayParam
Definition: DoubleMatArrayParam.h:20
EsaAnalysis::CreateLoads
void CreateLoads(Loads *loads, IoModel *iomodel)
Definition: EsaAnalysis.cpp:11
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16