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

header file for inverse methods misfit computation More...

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

Go to the source code of this file.

Functions

void ThicknessAcrossGradientx (IssmDouble *pJ, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters)
 
IssmDouble ThicknessAcrossGradient (Element *element)
 

Detailed Description

header file for inverse methods misfit computation

Definition in file ThicknessAcrossGradientx.h.

Function Documentation

◆ ThicknessAcrossGradientx()

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

Definition at line 11 of file ThicknessAcrossGradientx.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+=ThicknessAcrossGradient(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 }

◆ ThicknessAcrossGradient()

IssmDouble ThicknessAcrossGradient ( Element element)

Definition at line 32 of file ThicknessAcrossGradientx.cpp.

32  {
33 
34  IssmDouble thickness,thicknessobs,weight;
35  IssmDouble Jelem=0.;
36  IssmDouble misfit,Jdet;
37  IssmDouble* xyz_list = NULL;
38  IssmDouble dp[3];
39  IssmDouble vx,vy,vel;
40 
41  /*If on water, return 0: */
42  if(!element->IsIceInElement()) return 0.;
43 
44  /* Get node coordinates*/
45  element->GetVerticesCoordinates(&xyz_list);
46 
47  /*Retrieve all inputs we will be needing: */
48  DatasetInput2* weights_input =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
49  Input2* thickness_input =element->GetInput2(ThicknessEnum); _assert_(thickness_input);
50  Input2* vx_input =element->GetInput2(VxEnum); _assert_(vx_input);
51  Input2* vy_input =element->GetInput2(VyEnum); _assert_(vy_input);
52 
53  /* Start looping on the number of gaussian points: */
54  Gauss* gauss=element->NewGauss(2);
55  for(int ig=gauss->begin();ig<gauss->end();ig++){
56 
57  gauss->GaussPoint(ig);
58 
59  /* Get Jacobian determinant: */
60  element->JacobianDeterminant(&Jdet,xyz_list,gauss);
61 
62  /*Get all parameters at gaussian point*/
63  weights_input->GetInputValue(&weight,gauss,ThicknessAcrossGradientEnum);
64  thickness_input->GetInputValue(&thickness,gauss);
65  thickness_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
66  vx_input->GetInputValue(&vx,gauss);
67  vy_input->GetInputValue(&vy,gauss);
68  vel = sqrt(vx*vx+vy*vy);
69  vx = vx/(vel+1.e-9);
70  vy = vy/(vel+1.e-9);
71 
72  /*J = 1/2 ( -vy*dH/dx + vx*dH/dy )^2 */
73  Jelem+=weight*1/2*(-vy*dp[0] + vx*dp[1])*(-vy*dp[0] + vx*dp[1])*Jdet*gauss->weight;
74  }
75 
76  /*clean up and Return: */
77  xDelete<IssmDouble>(xyz_list);
78  delete gauss;
79  return Jelem;
80 }
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
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
VyEnum
@ VyEnum
Definition: EnumDefinitions.h:850
Input2::GetInputDerivativeValue
virtual void GetInputDerivativeValue(IssmDouble *derivativevalues, IssmDouble *xyz_list, Gauss *gauss)
Definition: Input2.h:37
Element::GetInput2
virtual Input2 * GetInput2(int inputenum)=0
Element
Definition: Element.h:41
Element::GetDatasetInput2
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
Definition: Element.h:250
ThicknessAcrossGradient
IssmDouble ThicknessAcrossGradient(Element *element)
Definition: ThicknessAcrossGradientx.cpp:32
ISSM_MPI_DOUBLE
#define ISSM_MPI_DOUBLE
Definition: issmmpi.h:125
Element::NewGauss
virtual Gauss * NewGauss(void)=0
Element::GetVerticesCoordinates
void GetVerticesCoordinates(IssmDouble **xyz_list)
Definition: Element.cpp:1446
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
Gauss::begin
virtual int begin(void)=0
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
VxEnum
@ VxEnum
Definition: EnumDefinitions.h:846
Element::JacobianDeterminant
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
Gauss::GaussPoint
virtual void GaussPoint(int ig)=0
ThicknessEnum
@ ThicknessEnum
Definition: EnumDefinitions.h:840
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
Gauss
Definition: Gauss.h:8
ThicknessAcrossGradientEnum
@ ThicknessAcrossGradientEnum
Definition: EnumDefinitions.h:838