Ice Sheet System Model  4.18
Code documentation
Functions
RheologyBAbsGradientx.cpp File Reference
#include "./RheologyBAbsGradientx.h"
#include "../../shared/shared.h"
#include "../../toolkits/toolkits.h"
#include "../../classes/Inputs2/DatasetInput2.h"

Go to the source code of this file.

Functions

void RheologyBAbsGradientx (IssmDouble *pJ, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
 
IssmDouble RheologyBAbsGradient (Element *element)
 
void RheologyBInitialguessMisfitx (IssmDouble *pJ, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
 
IssmDouble RheologyBInitialguessMisfit (Element *element)
 

Function Documentation

◆ RheologyBAbsGradientx()

void RheologyBAbsGradientx ( IssmDouble pJ,
Elements elements,
Nodes nodes,
Vertices vertices,
Loads loads,
Materials materials,
Parameters parameters 
)

Definition at line 11 of file RheologyBAbsGradientx.cpp.

11  {
12 
13  /*output: */
14  IssmDouble J=0.;
15  IssmDouble J_sum;
16 
17  /*Compute Misfit: */
18  for(int i=0;i<elements->Size();i++){
19  Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
20  J+=RheologyBAbsGradient(element);
21  }
22 
23  /*Sum all J from all cpus of the cluster:*/
26  J=J_sum;
27 
28  /*Assign output pointers: */
29  *pJ=J;
30 }

◆ RheologyBAbsGradient()

IssmDouble RheologyBAbsGradient ( Element element)

Definition at line 32 of file RheologyBAbsGradientx.cpp.

32  {
33 
34  int domaintype,numcomponents;
35  IssmDouble Jelem=0.;
36  IssmDouble misfit,Jdet;
37  IssmDouble dp[3],weight;
38  IssmDouble* xyz_list = NULL;
39 
40  /*If on water, return 0: */
41  if(!element->IsIceInElement()) return 0.;
42 
43  /*Get problem dimension*/
44  element->FindParam(&domaintype,DomainTypeEnum);
45  switch(domaintype){
46  case Domain2DverticalEnum: numcomponents = 1; break;
47  case Domain3DEnum: numcomponents = 2; break;
48  case Domain2DhorizontalEnum: numcomponents = 2; break;
49  default: _error_("not supported yet");
50  }
51 
52  /* Get node coordinates*/
53  element->GetVerticesCoordinates(&xyz_list);
54 
55  /*Retrieve all inputs we will be needing: */
56  DatasetInput2* weights_input=element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
57  Input2* rheologyb_input=element->GetInput2(MaterialsRheologyBEnum); _assert_(rheologyb_input);
58 
59  /* Start looping on the number of gaussian points: */
60  Gauss* gauss=element->NewGauss(2);
61  for(int ig=gauss->begin();ig<gauss->end();ig++){
62 
63  gauss->GaussPoint(ig);
64 
65  /* Get Jacobian determinant: */
66  element->JacobianDeterminant(&Jdet,xyz_list,gauss);
67 
68  /*Get all parameters at gaussian point*/
69  weights_input->GetInputValue(&weight,gauss,RheologyBAbsGradientEnum);
70  rheologyb_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
71 
72  /*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */
73  Jelem+=weight*1/2*(dp[0]*dp[0] + dp[1]*dp[1])*Jdet*gauss->weight;
74  }
75 
76  /*clean up and Return: */
77  xDelete<IssmDouble>(xyz_list);
78  delete gauss;
79  return Jelem;
80 }

◆ RheologyBInitialguessMisfitx()

void RheologyBInitialguessMisfitx ( IssmDouble pJ,
Elements elements,
Nodes nodes,
Vertices vertices,
Loads loads,
Materials materials,
Parameters parameters 
)

Definition at line 82 of file RheologyBAbsGradientx.cpp.

82  {
83 
84  /*output: */
85  IssmDouble J=0.;
86  IssmDouble J_sum;
87 
88  /*Compute Misfit: */
89  for(int i=0;i<elements->Size();i++){
90  Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
91  J+=RheologyBInitialguessMisfit(element);
92  }
93 
94  /*Sum all J from all cpus of the cluster:*/
97  J=J_sum;
98 
99  /*Assign output pointers: */
100  *pJ=J;
101 }

◆ RheologyBInitialguessMisfit()

IssmDouble RheologyBInitialguessMisfit ( Element element)

Definition at line 103 of file RheologyBAbsGradientx.cpp.

103  {
104 
105  int domaintype,numcomponents;
106  IssmDouble Jelem=0.;
107  IssmDouble misfit,Jdet;
108  IssmDouble B,B0,weight;
109  IssmDouble* xyz_list = NULL;
110 
111  /*If on water, return 0: */
112  if(!element->IsIceInElement()) return 0.;
113 
114  /*Get problem dimension*/
115  element->FindParam(&domaintype,DomainTypeEnum);
116  switch(domaintype){
117  case Domain2DverticalEnum: numcomponents = 1; break;
118  case Domain3DEnum: numcomponents = 2; break;
119  case Domain2DhorizontalEnum: numcomponents = 2; break;
120  default: _error_("not supported yet");
121  }
122 
123  /* Get node coordinates*/
124  element->GetVerticesCoordinates(&xyz_list);
125 
126  /*Retrieve all inputs we will be needing: */
127  DatasetInput2* weights_input=element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
128  Input2* rheologyb_input=element->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
129  Input2* rheologyb0_input=element->GetInput2(RheologyBInitialguessEnum); _assert_(rheologyb0_input);
130 
131  /* Start looping on the number of gaussian points: */
132  Gauss* gauss=element->NewGauss(2);
133  for(int ig=gauss->begin();ig<gauss->end();ig++){
134 
135  gauss->GaussPoint(ig);
136 
137  /* Get Jacobian determinant: */
138  element->JacobianDeterminant(&Jdet,xyz_list,gauss);
139 
140  /*Get all parameters at gaussian point*/
141  weights_input->GetInputValue(&weight,gauss,RheologyBInitialguessMisfitEnum);
142  rheologyb_input->GetInputValue(&B,gauss);
143  rheologyb0_input->GetInputValue(&B0,gauss);
144 
145  /*Tikhonov regularization: J = 1/2 (B-B0)^2 */
146  Jelem+=weight*1./2.*(B-B0)*(B-B0)*Jdet*gauss->weight;
147  }
148 
149  /*clean up and Return: */
150  xDelete<IssmDouble>(xyz_list);
151  delete gauss;
152  return Jelem;
153 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
IssmDouble
double IssmDouble
Definition: types.h:37
DatasetInput2
Definition: DatasetInput2.h:14
Element::FindParam
void FindParam(bool *pvalue, int paramenum)
Definition: Element.cpp:933
InversionCostFunctionsCoefficientsEnum
@ InversionCostFunctionsCoefficientsEnum
Definition: EnumDefinitions.h:629
ISSM_MPI_SUM
#define ISSM_MPI_SUM
Definition: issmmpi.h:134
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
DatasetInput2::GetInputValue
void GetInputValue(IssmDouble *pvalue, Gauss *gauss, int index)
Definition: DatasetInput2.cpp:199
Input2::GetInputDerivativeValue
virtual void GetInputDerivativeValue(IssmDouble *derivativevalues, IssmDouble *xyz_list, Gauss *gauss)
Definition: Input2.h:37
MaterialsRheologyBbarEnum
@ MaterialsRheologyBbarEnum
Definition: EnumDefinitions.h:644
Element::GetInput2
virtual Input2 * GetInput2(int inputenum)=0
Element
Definition: Element.h:41
Element::GetDatasetInput2
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
Definition: Element.h:250
Domain2DhorizontalEnum
@ Domain2DhorizontalEnum
Definition: EnumDefinitions.h:534
RheologyBInitialguessEnum
@ RheologyBInitialguessEnum
Definition: EnumDefinitions.h:672
ISSM_MPI_DOUBLE
#define ISSM_MPI_DOUBLE
Definition: issmmpi.h:125
RheologyBAbsGradient
IssmDouble RheologyBAbsGradient(Element *element)
Definition: RheologyBAbsGradientx.cpp:32
DomainTypeEnum
@ DomainTypeEnum
Definition: EnumDefinitions.h:124
Element::NewGauss
virtual Gauss * NewGauss(void)=0
Element::GetVerticesCoordinates
void GetVerticesCoordinates(IssmDouble **xyz_list)
Definition: Element.cpp:1446
RheologyBInitialguessMisfit
IssmDouble RheologyBInitialguessMisfit(Element *element)
Definition: RheologyBAbsGradientx.cpp:103
Domain3DEnum
@ Domain3DEnum
Definition: EnumDefinitions.h:536
ISSM_MPI_Bcast
int ISSM_MPI_Bcast(void *buffer, int count, ISSM_MPI_Datatype datatype, int root, ISSM_MPI_Comm comm)
Definition: issmmpi.cpp:162
Input2
Definition: Input2.h:18
Element::IsIceInElement
bool IsIceInElement()
Definition: Element.cpp:2021
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
MaterialsRheologyBEnum
@ MaterialsRheologyBEnum
Definition: EnumDefinitions.h:643
RheologyBAbsGradientEnum
@ RheologyBAbsGradientEnum
Definition: EnumDefinitions.h:671
Gauss::begin
virtual int begin(void)=0
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
Element::JacobianDeterminant
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
Gauss::GaussPoint
virtual void GaussPoint(int ig)=0
Input2::GetInputValue
virtual void GetInputValue(IssmDouble *pvalue, Gauss *gauss)
Definition: Input2.h:38
Gauss::weight
IssmDouble weight
Definition: Gauss.h:11
ISSM_MPI_Reduce
int ISSM_MPI_Reduce(void *sendbuf, void *recvbuf, int count, ISSM_MPI_Datatype datatype, ISSM_MPI_Op op, int root, ISSM_MPI_Comm comm)
Definition: issmmpi.cpp:373
Domain2DverticalEnum
@ Domain2DverticalEnum
Definition: EnumDefinitions.h:535
RheologyBInitialguessMisfitEnum
@ RheologyBInitialguessMisfitEnum
Definition: EnumDefinitions.h:673
Gauss
Definition: Gauss.h:8