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

Go to the source code of this file.

Functions

void SurfaceAverageVelMisfitx (IssmDouble *pJ, FemModel *femmodel)
 
IssmDouble SurfaceAverageVelMisfit (Element *element)
 

Function Documentation

◆ SurfaceAverageVelMisfitx()

void SurfaceAverageVelMisfitx ( IssmDouble pJ,
FemModel femmodel 
)

Definition at line 12 of file SurfaceAverageVelMisfitx.cpp.

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

◆ SurfaceAverageVelMisfit()

IssmDouble SurfaceAverageVelMisfit ( Element element)

Definition at line 33 of file SurfaceAverageVelMisfitx.cpp.

33  {
34 
35  int domaintype,numcomponents;
36  IssmDouble Jelem=0.;
37  IssmDouble misfit,S,Jdet;
38  IssmDouble vx,vy,vxobs,vyobs,weight;
39  IssmDouble* xyz_list = NULL;
40 
41  /*Get basal element*/
42  if(!element->IsOnSurface()) return 0.;
43 
44  /*If on water, return 0: */
45  if(!element->IsIceInElement()) return 0.;
46 
47  /*Get problem dimension*/
48  element->FindParam(&domaintype,DomainTypeEnum);
49  switch(domaintype){
51  numcomponents = 1;
52  break;
53  case Domain3DEnum:
54  numcomponents = 2;
55  break;
57  numcomponents = 2;
58  break;
59  default: _error_("not supported yet");
60  }
61 
62  /*Spawn surface element*/
63  Element* topelement = element->SpawnTopElement();
64 
65  /* Get node coordinates*/
66  topelement->GetVerticesCoordinates(&xyz_list);
67 
68  /*Retrieve all inputs we will be needing: */
69  DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
70  Input2* S_input = topelement->GetInput2(SurfaceAreaEnum); _assert_(S_input);
71  Input2* vx_input = topelement->GetInput2(VxEnum); _assert_(vx_input);
72  Input2* vxobs_input = topelement->GetInput2(InversionVxObsEnum); _assert_(vxobs_input);
73  Input2* vy_input = NULL;
74  Input2* vyobs_input = NULL;
75  if(numcomponents==2){
76  vy_input =topelement->GetInput2(VyEnum); _assert_(vy_input);
77  vyobs_input =topelement->GetInput2(InversionVyObsEnum); _assert_(vyobs_input);
78  }
79 
80  /* Start looping on the number of gaussian points: */
81  Gauss* gauss=topelement->NewGauss(3);
82  for(int ig=gauss->begin();ig<gauss->end();ig++){
83 
84  gauss->GaussPoint(ig);
85 
86  /* Get Jacobian determinant: */
87  topelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
88 
89  /*Get all parameters at gaussian point*/
90  weights_input->GetInputValue(&weight,gauss,SurfaceAverageVelMisfitEnum);
91  S_input->GetInputValue(&S,gauss);
92  vx_input->GetInputValue(&vx,gauss);
93  vxobs_input->GetInputValue(&vxobs,gauss);
94  if(numcomponents==2){
95  vy_input->GetInputValue(&vy,gauss);
96  vyobs_input->GetInputValue(&vyobs,gauss);
97  }
98 
99  /*Compute SurfaceAverageVelMisfitEnum:
100  *
101  * 1 2 2
102  * J = --- sqrt( (u - u ) + (v - v ) )
103  * S obs obs
104  */
105  if(numcomponents==1){
106  misfit=1/S*(vx-vxobs)*(vx-vxobs);
107  }
108  else{
109  misfit=1/S*sqrt( pow(vx-vxobs,2) + pow(vy-vyobs,2));
110  }
111 
112  /*Add to cost function*/
113  Jelem+=misfit*weight*Jdet*gauss->weight;
114  }
115 
116  /*clean up and Return: */
117  if(domaintype!=Domain2DhorizontalEnum){topelement->DeleteMaterials(); delete topelement;};
118  xDelete<IssmDouble>(xyz_list);
119  delete gauss;
120  return Jelem;
121 }
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
InversionVyObsEnum
@ InversionVyObsEnum
Definition: EnumDefinitions.h:634
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
Element::GetInput2
virtual Input2 * GetInput2(int inputenum)=0
Element::DeleteMaterials
void DeleteMaterials(void)
Definition: Element.cpp:429
Element
Definition: Element.h:41
Element::GetDatasetInput2
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
Definition: Element.h:250
Domain2DhorizontalEnum
@ Domain2DhorizontalEnum
Definition: EnumDefinitions.h:534
ISSM_MPI_DOUBLE
#define ISSM_MPI_DOUBLE
Definition: issmmpi.h:125
DomainTypeEnum
@ DomainTypeEnum
Definition: EnumDefinitions.h:124
Element::NewGauss
virtual Gauss * NewGauss(void)=0
SurfaceAreaEnum
@ SurfaceAreaEnum
Definition: EnumDefinitions.h:820
Element::GetVerticesCoordinates
void GetVerticesCoordinates(IssmDouble **xyz_list)
Definition: Element.cpp:1446
Domain3DEnum
@ Domain3DEnum
Definition: EnumDefinitions.h:536
FemModel::elements
Elements * elements
Definition: FemModel.h:44
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
Element::SpawnTopElement
virtual Element * SpawnTopElement(void)=0
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
SurfaceAverageVelMisfit
IssmDouble SurfaceAverageVelMisfit(Element *element)
Definition: SurfaceAverageVelMisfitx.cpp:33
Input2::GetInputValue
virtual void GetInputValue(IssmDouble *pvalue, Gauss *gauss)
Definition: Input2.h:38
InversionVxObsEnum
@ InversionVxObsEnum
Definition: EnumDefinitions.h:633
Gauss::weight
IssmDouble weight
Definition: Gauss.h:11
SurfaceAverageVelMisfitEnum
@ SurfaceAverageVelMisfitEnum
Definition: EnumDefinitions.h:821
Element::IsOnSurface
bool IsOnSurface()
Definition: Element.cpp:1981
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
Gauss
Definition: Gauss.h:8
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16