Ice Sheet System Model  4.18
Code documentation
Public Member Functions
EsaAnalysis Class Reference

#include <EsaAnalysis.h>

Inheritance diagram for EsaAnalysis:
Analysis

Public Member Functions

void CreateConstraints (Constraints *constraints, IoModel *iomodel)
 
void CreateLoads (Loads *loads, IoModel *iomodel)
 
void CreateNodes (Nodes *nodes, IoModel *iomodel, bool isamr=false)
 
int DofsPerNode (int **doflist, int domaintype, int approximation)
 
void UpdateElements (Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type)
 
void UpdateParameters (Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum)
 
void Core (FemModel *femmodel)
 
ElementVectorCreateDVector (Element *element)
 
ElementMatrixCreateJacobianMatrix (Element *element)
 
ElementMatrixCreateKMatrix (Element *element)
 
ElementVectorCreatePVector (Element *element)
 
void GetSolutionFromInputs (Vector< IssmDouble > *solution, Element *element)
 
void GradientJ (Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)
 
void InputUpdateFromSolution (IssmDouble *solution, Element *element)
 
void UpdateConstraints (FemModel *femmodel)
 
- Public Member Functions inherited from Analysis
virtual ~Analysis ()
 

Detailed Description

Definition at line 11 of file EsaAnalysis.h.

Member Function Documentation

◆ CreateConstraints()

void EsaAnalysis::CreateConstraints ( Constraints constraints,
IoModel iomodel 
)
virtual

Implements Analysis.

Definition at line 8 of file EsaAnalysis.cpp.

8  {/*{{{*/
9  /*No constraints*/
10 }/*}}}*/

◆ CreateLoads()

void EsaAnalysis::CreateLoads ( Loads loads,
IoModel iomodel 
)
virtual

Implements Analysis.

Definition at line 11 of file EsaAnalysis.cpp.

11  {/*{{{*/
12  /*No loads*/
13 }/*}}}*/

◆ CreateNodes()

void EsaAnalysis::CreateNodes ( Nodes nodes,
IoModel iomodel,
bool  isamr = false 
)
virtual

Implements Analysis.

Definition at line 14 of file EsaAnalysis.cpp.

14  {/*{{{*/
15  ::CreateNodes(nodes,iomodel,EsaAnalysisEnum,P1Enum);
16 }/*}}}*/

◆ DofsPerNode()

int EsaAnalysis::DofsPerNode ( int **  doflist,
int  domaintype,
int  approximation 
)
virtual

Implements Analysis.

Definition at line 17 of file EsaAnalysis.cpp.

17  {/*{{{*/
18  return 1;
19 }/*}}}*/

◆ UpdateElements()

void EsaAnalysis::UpdateElements ( Elements elements,
Inputs2 inputs2,
IoModel iomodel,
int  analysis_counter,
int  analysis_type 
)
virtual

Implements Analysis.

Definition at line 20 of file EsaAnalysis.cpp.

20  {/*{{{*/
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 }/*}}}*/

◆ UpdateParameters()

void EsaAnalysis::UpdateParameters ( Parameters parameters,
IoModel iomodel,
int  solution_enum,
int  analysis_enum 
)
virtual

Implements Analysis.

Definition at line 37 of file EsaAnalysis.cpp.

37  {/*{{{*/
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 }/*}}}*/

◆ Core()

void EsaAnalysis::Core ( FemModel femmodel)
virtual

Implements Analysis.

Definition at line 188 of file EsaAnalysis.cpp.

188  {/*{{{*/
189  _error_("not implemented");
190 }/*}}}*/

◆ CreateDVector()

ElementVector * EsaAnalysis::CreateDVector ( Element element)
virtual

Implements Analysis.

Definition at line 191 of file EsaAnalysis.cpp.

191  {/*{{{*/
192  /*Default, return NULL*/
193  return NULL;
194 }/*}}}*/

◆ CreateJacobianMatrix()

ElementMatrix * EsaAnalysis::CreateJacobianMatrix ( Element element)
virtual

Implements Analysis.

Definition at line 195 of file EsaAnalysis.cpp.

195  {/*{{{*/
196 _error_("Not implemented");
197 }/*}}}*/

◆ CreateKMatrix()

ElementMatrix * EsaAnalysis::CreateKMatrix ( Element element)
virtual

Implements Analysis.

Definition at line 198 of file EsaAnalysis.cpp.

198  {/*{{{*/
199  _error_("not implemented yet");
200 }/*}}}*/

◆ CreatePVector()

ElementVector * EsaAnalysis::CreatePVector ( Element element)
virtual

Implements Analysis.

Definition at line 201 of file EsaAnalysis.cpp.

201  {/*{{{*/
202 _error_("not implemented yet");
203 }/*}}}*/

◆ GetSolutionFromInputs()

void EsaAnalysis::GetSolutionFromInputs ( Vector< IssmDouble > *  solution,
Element element 
)
virtual

Implements Analysis.

Definition at line 204 of file EsaAnalysis.cpp.

204  {/*{{{*/
205  _error_("not implemented yet");
206 }/*}}}*/

◆ GradientJ()

void EsaAnalysis::GradientJ ( Vector< IssmDouble > *  gradient,
Element element,
int  control_type,
int  control_index 
)
virtual

Implements Analysis.

Definition at line 207 of file EsaAnalysis.cpp.

207  {/*{{{*/
208  _error_("Not implemented yet");
209 }/*}}}*/

◆ InputUpdateFromSolution()

void EsaAnalysis::InputUpdateFromSolution ( IssmDouble solution,
Element element 
)
virtual

Implements Analysis.

Definition at line 210 of file EsaAnalysis.cpp.

210  {/*{{{*/
211  /*Default, do nothing*/
212  return;
213 
214 }/*}}}*/

◆ UpdateConstraints()

void EsaAnalysis::UpdateConstraints ( FemModel femmodel)
virtual

Implements Analysis.

Definition at line 215 of file EsaAnalysis.cpp.

215  {/*{{{*/
216  /*Default, do nothing*/
217  return;
218 }/*}}}*/

The documentation for this class was generated from the following files:
IssmDouble
double IssmDouble
Definition: types.h:37
EsaTransitionsEnum
@ EsaTransitionsEnum
Definition: EnumDefinitions.h:1055
EsaHElasticEnum
@ EsaHElasticEnum
Definition: EnumDefinitions.h:131
EsaDeltathicknessEnum
@ EsaDeltathicknessEnum
Definition: EnumDefinitions.h:559
MaskIceLevelsetEnum
@ MaskIceLevelsetEnum
Definition: EnumDefinitions.h:641
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
GetOwnershipBoundariesFromRange
void GetOwnershipBoundariesFromRange(int *plower_row, int *pupper_row, int range, ISSM_MPI_Comm comm)
Definition: GetOwnershipBoundariesFromRange.cpp:16
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
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
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
SolidearthPlanetAreaEnum
@ SolidearthPlanetAreaEnum
Definition: EnumDefinitions.h:304
IoModel::FetchData
void FetchData(bool *pboolean, const char *data_name)
Definition: IoModel.cpp:933
PI
const double PI
Definition: constants.h:11
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
_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
IoModel::FetchDataToInput
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
Definition: IoModel.cpp:1651
EsaRequestedOutputsEnum
@ EsaRequestedOutputsEnum
Definition: EnumDefinitions.h:133
SolidearthSettingsElasticEnum
@ SolidearthSettingsElasticEnum
Definition: EnumDefinitions.h:308
DoubleMatArrayParam
Definition: DoubleMatArrayParam.h:20