 |
Ice Sheet System Model
4.18
Code documentation
|
#include <BalancethicknessAnalysis.h>
|
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) |
|
ElementVector * | CreateDVector (Element *element) |
|
ElementMatrix * | CreateJacobianMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrixCG (Element *element) |
|
ElementMatrix * | CreateKMatrixDG (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
ElementVector * | CreatePVectorCG (Element *element) |
|
ElementVector * | CreatePVectorDG (Element *element) |
|
void | GetB (IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetBprime (IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss) |
|
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) |
|
virtual | ~Analysis () |
|
Definition at line 11 of file BalancethicknessAnalysis.h.
◆ CreateConstraints()
void BalancethicknessAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateLoads()
void BalancethicknessAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void BalancethicknessAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int BalancethicknessAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void BalancethicknessAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
◆ UpdateParameters()
void BalancethicknessAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
◆ Core()
void BalancethicknessAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
◆ CreateKMatrixCG()
Definition at line 151 of file BalancethicknessAnalysis.cpp.
166 IssmDouble* basis = xNew<IssmDouble>(numnodes);
167 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
174 Input2* vxaverage_input=NULL;
175 Input2* vyaverage_input=NULL;
188 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
201 D_scalar=gauss->
weight*Jdet;
203 for(
int i=0;i<numnodes;i++){
204 for(
int j=0;j<numnodes;j++){
206 Ke->
values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy);
208 Ke->
values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]);
212 if(stabilization==1){
214 vel=sqrt(vx*vx+vy*vy);
215 D[0][0]=h/(2*vel)*vx*vx;
216 D[1][0]=h/(2*vel)*vy*vx;
217 D[0][1]=h/(2*vel)*vx*vy;
218 D[1][1]=h/(2*vel)*vy*vy;
220 else if(stabilization==2){
224 D[0][0]=h/2.0*fabs(vx);
227 D[1][1]=h/2.0*fabs(vy);
229 if(stabilization==1 || stabilization==2){
230 D[0][0]=D_scalar*D[0][0];
231 D[1][0]=D_scalar*D[1][0];
232 D[0][1]=D_scalar*D[0][1];
233 D[1][1]=D_scalar*D[1][1];
235 for(
int i=0;i<numnodes;i++){
236 for(
int j=0;j<numnodes;j++){
237 Ke->
values[i*numnodes+j] += (
238 dbasis[0*numnodes+i] *(D[0][0]*dbasis[0*numnodes+j] + D[0][1]*dbasis[1*numnodes+j]) +
239 dbasis[1*numnodes+i] *(D[1][0]*dbasis[0*numnodes+j] + D[1][1]*dbasis[1*numnodes+j])
247 xDelete<IssmDouble>(xyz_list);
248 xDelete<IssmDouble>(basis);
249 xDelete<IssmDouble>(dbasis);
◆ CreateKMatrixDG()
Definition at line 253 of file BalancethicknessAnalysis.cpp.
257 IssmDouble Jdet,D_scalar,vx,vy,dvxdx,dvydy,vel;
267 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes);
273 Input2* vxaverage_input=NULL;
274 Input2* vyaverage_input=NULL;
286 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
294 D_scalar=gauss->
weight*Jdet;
297 GetB(Bprime,element,xyz_list,gauss);
300 D_scalar = - gauss->
weight*Jdet;
301 D[0][0] = D_scalar*vx;
304 D[1][1] = D_scalar*vy;
313 xDelete<IssmDouble>(xyz_list);
314 xDelete<IssmDouble>(B);
315 xDelete<IssmDouble>(Bprime);
◆ CreatePVector()
◆ CreatePVectorCG()
Definition at line 341 of file BalancethicknessAnalysis.cpp.
352 IssmDouble* basis = xNew<IssmDouble>(numnodes);
363 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
373 for(
int i=0;i<numnodes;i++) pe->
values[i]+=Jdet*gauss->
weight*(ms-mb-dhdt)*basis[i];
377 xDelete<IssmDouble>(xyz_list);
378 xDelete<IssmDouble>(basis);
◆ CreatePVectorDG()
Definition at line 382 of file BalancethicknessAnalysis.cpp.
393 IssmDouble* basis = xNew<IssmDouble>(numnodes);
404 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
414 for(
int i=0;i<numnodes;i++) pe->
values[i]+=Jdet*gauss->
weight*(ms-mb-dhdt)*basis[i];
418 xDelete<IssmDouble>(xyz_list);
419 xDelete<IssmDouble>(basis);
◆ GetB()
Definition at line 423 of file BalancethicknessAnalysis.cpp.
442 for(
int i=0;i<numnodes;i++){
443 B[numnodes*0+i] = basis[i];
444 B[numnodes*1+i] = basis[i];
448 xDelete<IssmDouble>(basis);
◆ GetBprime()
Definition at line 450 of file BalancethicknessAnalysis.cpp.
465 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
469 for(
int i=0;i<numnodes;i++){
470 Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
471 Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
475 xDelete<IssmDouble>(dbasis);
◆ GetSolutionFromInputs()
◆ GradientJ()
void BalancethicknessAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 481 of file BalancethicknessAnalysis.cpp.
489 IssmDouble thickness,thicknessobs,dH[3],dp[3];
490 IssmDouble vx,vy,vel,dvx[2],dvy[2],dhdt,basal_melting,surface_mass_balance;
494 int *responses = NULL;
495 int num_responses,resp,solution;
506 IssmDouble* basis = xNew<IssmDouble>(numvertices);
507 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices);
508 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
509 int* vertexpidlist = xNew<int>(numvertices);
525 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
537 for(resp=0;resp<num_responses;resp++){
541 switch(responses[resp]){
543 for(
int i=0;i<numvertices;i++) ge[i]+= (thicknessobs-thickness)*weight*Jdet*gauss->
weight*basis[i];
546 for(
int i=0;i<numvertices;i++) ge[i]+= - weight*dH[0]*dbasis[0*numvertices+i]*Jdet*gauss->
weight;
547 for(
int i=0;i<numvertices;i++) ge[i]+= - weight*dH[1]*dbasis[1*numvertices+i]*Jdet*gauss->
weight;
552 vel = sqrt(vx*vx+vy*vy);
555 for(
int i=0;i<numvertices;i++) ge[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numvertices+i]*vx+dbasis[1*numvertices+i]*vy)*Jdet*gauss->
weight;
560 vel = sqrt(vx*vx+vy*vy);
563 for(
int i=0;i<numvertices;i++) ge[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numvertices+i]*(-vy)+dbasis[1*numvertices+i]*vx)*Jdet*gauss->
weight;
566 surface_mass_balance_input->
GetInputValue(&surface_mass_balance,gauss);
573 for(
int i=0;i<numvertices;i++){
574 ge[i]+= - weight*Jdet*gauss->
weight*(
575 (vx*dH[0]+vy*dH[1] + thickness*(dvx[0]+dvy[1]))*(vx*dbasis[0*numvertices+i]+ vy*dbasis[1*numvertices+i] + basis[i]*(dvx[0]+dvy[1]))
576 -(surface_mass_balance-basal_melting-dhdt)*(vx*dbasis[0*numvertices+i]+ vy*dbasis[1*numvertices+i] + basis[i]*(dvx[0]+dvy[1]))
588 xDelete<IssmDouble>(xyz_list);
589 xDelete<IssmDouble>(basis);
590 xDelete<IssmDouble>(ge);
591 xDelete<int>(vertexpidlist);
592 xDelete<int>(responses);
◆ InputUpdateFromSolution()
void BalancethicknessAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
◆ UpdateConstraints()
void BalancethicknessAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
The documentation for this class was generated from the following files:
@ BalancethicknessAnalysisEnum
@ InversionThicknessObsEnum
virtual int GetNumberOfNodes(void)=0
void FindParam(bool *pvalue, int paramenum)
@ BalancethicknessThickeningRateEnum
int AddObject(Object *object)
@ BalancethicknessMisfitEnum
@ InversionCostFunctionsCoefficientsEnum
@ BalancethicknessSoftSolutionEnum
virtual Element * SpawnBasalElement(void)=0
ElementMatrix * CreateKMatrixDG(Element *element)
int TripleMultiply(IssmDouble *a, int nrowa, int ncola, int itrna, IssmDouble *b, int nrowb, int ncolb, int itrnb, IssmDouble *c, int nrowc, int ncolc, int itrnc, IssmDouble *d, int iaddd)
virtual void NodalFunctionsP1Derivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
void GetBprime(IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss)
void AddObject(Param *newparam)
virtual Input2 * GetInput2(int inputenum)=0
void DeleteMaterials(void)
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
virtual void NodalFunctionsP1(IssmDouble *basis, Gauss *gauss)=0
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
Param * CopyConstantObject(const char *constant_name, int param_enum)
@ BasalforcingsGroundediceMeltingRateEnum
void SetValues(int ssize, int *list, doubletype *values, InsMode mode)
virtual Gauss * NewGauss(void)=0
@ InversionCostFunctionsEnum
ElementMatrix * CreateKMatrixCG(Element *element)
virtual void InputUpdateFromSolutionOneDof(IssmDouble *solution, int inputenum)=0
const char * EnumToStringx(int enum_in)
@ ThicknessAlongGradientEnum
void FindConstant(bool *pvalue, const char *constant_name)
void GetVerticesCoordinates(IssmDouble **xyz_list)
void GetB(IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss)
void FetchData(bool *pboolean, const char *data_name)
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
#define _error_(StreamArgs)
virtual int begin(void)=0
Object * GetObjectByOffset(int offset)
virtual IssmDouble CharacteristicLength(void)=0
@ MeshVertexonsurfaceEnum
@ InversionNumCostFunctionsEnum
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
virtual void GaussPoint(int ig)=0
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
virtual int FiniteElement(void)=0
ElementVector * CreatePVectorDG(Element *element)
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
void IoModelToConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
void CreateFaces(IoModel *iomodel)
ElementVector * CreatePVectorCG(Element *element)
@ ThicknessAbsGradientEnum
virtual int GetNumberOfVertices(void)=0
@ BalancethicknessStabilizationEnum
void GradientIndexing(int *indexing, int control_index)
virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble *solution, int inputenum)=0
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
@ ThicknessAcrossGradientEnum
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)