 |
Ice Sheet System Model
4.18
Code documentation
|
#include <StressbalanceVerticalAnalysis.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 * | CreateKMatrixBase (Element *element) |
|
ElementMatrix * | CreateKMatrixSurface (Element *element) |
|
ElementMatrix * | CreateKMatrixVolume (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
ElementVector * | CreatePVectorBase (Element *element) |
|
ElementVector * | CreatePVectorSurface (Element *element) |
|
ElementVector * | CreatePVectorVolume (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) |
|
virtual | ~Analysis () |
|
◆ CreateConstraints()
void StressbalanceVerticalAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 9 of file StressbalanceVerticalAnalysis.cpp.
12 bool isSIA,isSSA,isL1L2,isHO,isFS,iscoupling;
27 if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
38 iomodel->
FetchData(1,
"md.flowequation.borderFS");
40 iomodel->
FetchData(&spcvz,&Mz,&Nz,
"md.stressbalance.spcvz");
41 if(Nz>1)
_error_(
"not supported yet (needs to be coded)");
52 if (reCast<int,IssmDouble>(iomodel->
Data(
"md.flowequation.borderFS")[i])){
56 else if (!xIsNan<IssmDouble>(spcvz[i])){
66 iomodel->
DeleteData(1,
"md.flowequation.borderFS");
67 iomodel->
DeleteData(spcvz,
"md.stressbalance.spcvz");
◆ CreateLoads()
void StressbalanceVerticalAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void StressbalanceVerticalAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int StressbalanceVerticalAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void StressbalanceVerticalAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
◆ UpdateParameters()
void StressbalanceVerticalAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
◆ Core()
void StressbalanceVerticalAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
◆ CreateKMatrixBase()
Definition at line 190 of file StressbalanceVerticalAnalysis.cpp.
192 if(!element->
IsOnBase())
return NULL;
203 IssmDouble* basis = xNew<IssmDouble>(numnodes);
211 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
216 D = -gauss->
weight*Jdet*normal[2];
218 for(
int i=0;i<numnodes;i++)
for(
int j=0;j<numnodes;j++) Ke->
values[i*numnodes+j] += D*basis[i]*basis[j];
223 xDelete<IssmDouble>(xyz_list);
224 xDelete<IssmDouble>(basis);
◆ CreateKMatrixSurface()
Definition at line 227 of file StressbalanceVerticalAnalysis.cpp.
240 IssmDouble* basis = xNew<IssmDouble>(numnodes);
248 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
253 D = -gauss->
weight*Jdet*normal[2];
255 for(
int i=0;i<numnodes;i++)
for(
int j=0;j<numnodes;j++) Ke->
values[i*numnodes+j] += D*basis[i]*basis[j];
260 xDelete<IssmDouble>(xyz_list);
261 xDelete<IssmDouble>(basis);
◆ CreateKMatrixVolume()
Definition at line 264 of file StressbalanceVerticalAnalysis.cpp.
275 IssmDouble* basis = xNew<IssmDouble>(numnodes);
276 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
283 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
290 for(
int i=0;i<numnodes;i++){
291 for(
int j=0;j<numnodes;j++){
293 basis[j]*dbasis[2*numnodes+i]
301 xDelete<IssmDouble>(xyz_list);
302 xDelete<IssmDouble>(dbasis);
303 xDelete<IssmDouble>(basis);
◆ CreatePVector()
◆ CreatePVectorBase()
Definition at line 326 of file StressbalanceVerticalAnalysis.cpp.
336 if(!element->
IsOnBase())
return NULL;
343 IssmDouble* basis = xNew<IssmDouble>(numnodes);
362 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
376 if(phi>0.) basalmeltingvalue=gmb;
377 else basalmeltingvalue=fmb;
382 for(
int i=0;i<numnodes;i++) pe->
values[i]+=-Jdet*gauss->
weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i];
387 xDelete<IssmDouble>(basis);
388 xDelete<IssmDouble>(xyz_list);
389 xDelete<IssmDouble>(xyz_list_base);
◆ CreatePVectorSurface()
Definition at line 392 of file StressbalanceVerticalAnalysis.cpp.
409 IssmDouble* basis = xNew<IssmDouble>(numnodes);
426 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
442 for(
int i=0;i<numnodes;i++) pe->
values[i]+=-Jdet*gauss->
weight*(vx*dsdx+vy*dsdy-vz+smb)*basis[i];
447 xDelete<IssmDouble>(basis);
448 xDelete<IssmDouble>(xyz_list);
449 xDelete<IssmDouble>(xyz_list_surface);
◆ CreatePVectorVolume()
Definition at line 452 of file StressbalanceVerticalAnalysis.cpp.
465 IssmDouble* basis = xNew<IssmDouble>(numnodes);
479 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
495 for(
int i=0;i<numnodes;i++) pe->
values[i] += (dudx+dvdy+dwdz)*Jdet*gauss->
weight*basis[i];
500 xDelete<IssmDouble>(basis);
501 xDelete<IssmDouble>(xyz_list);
◆ GetSolutionFromInputs()
◆ GradientJ()
void StressbalanceVerticalAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolution()
void StressbalanceVerticalAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 510 of file StressbalanceVerticalAnalysis.cpp.
513 int numdof=numnodes*1;
530 IssmDouble* values = xNew<IssmDouble>(numdof);
534 IssmDouble* vzSSA = xNew<IssmDouble>(numnodes);
535 IssmDouble* vzHO = xNew<IssmDouble>(numnodes);
536 IssmDouble* vzFS = xNew<IssmDouble>(numnodes);
538 IssmDouble* pressure = xNew<IssmDouble>(numnodes);
539 IssmDouble* surface = xNew<IssmDouble>(numnodes);
542 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
543 for(i=0;i<numdof;i++){
547 if(xIsNan<IssmDouble>(vz[i]))
_error_(
"NaN found in solution vector");
548 if(xIsInf<IssmDouble>(vz[i]))
_error_(
"Inf found in solution vector");
562 else _error_(
"Cannot compute Vz as VzFS in not present in HOFS element");
563 for(i=0;i<numnodes;i++){
565 vz[i]=vzHO[i]+vzFS[i];
574 else _error_(
"Cannot compute Vz as VzFS in not present in SSAFS element");
575 for(i=0;i<numnodes;i++){
577 vz[i]=vzSSA[i]+vzFS[i];
582 for(i=0;i<numnodes;i++) vel[i]=pow( pow(vx[i],2.0) + pow(vy[i],2.0) + pow(vz[i],2.0) , 0.5);
590 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
605 xDelete<IssmDouble>(surface);
606 xDelete<IssmDouble>(pressure);
607 xDelete<IssmDouble>(vel);
608 xDelete<IssmDouble>(vz);
609 xDelete<IssmDouble>(vzSSA);
610 xDelete<IssmDouble>(vzHO);
611 xDelete<IssmDouble>(vzFS);
612 xDelete<IssmDouble>(vy);
613 xDelete<IssmDouble>(vx);
614 xDelete<IssmDouble>(values);
615 xDelete<IssmDouble>(xyz_list);
616 xDelete<int>(doflist);
◆ UpdateConstraints()
void StressbalanceVerticalAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
The documentation for this class was generated from the following files:
@ BasalforcingsPicoBasinIdEnum
@ BasalforcingsOceanTempEnum
virtual int GetElementType(void)=0
void GetInputListOnNodes(IssmDouble *pvalue, int enumtype)
virtual int GetNumberOfNodes(void)=0
#define _printf0_(StreamArgs)
void FindParam(bool *pvalue, int paramenum)
virtual Gauss * NewGaussBase(int order)=0
int AddObject(Object *object)
@ MismipFloatingMeltRateEnum
virtual void JacobianDeterminantBase(IssmDouble *Jdet, IssmDouble *xyz_list_base, Gauss *gauss)=0
virtual void JacobianDeterminantTop(IssmDouble *Jdet, IssmDouble *xyz_list_base, Gauss *gauss)=0
virtual void NormalBase(IssmDouble *normal, IssmDouble *xyz_list)=0
@ BasalforcingsUpperwaterElevationEnum
@ BasalforcingsDeepwaterMeltingRateEnum
void solutionsequence_linear(FemModel *femmodel)
virtual Input2 * GetInput2(int inputenum)=0
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
@ BasalforcingsGroundediceMeltingRateEnum
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
virtual Gauss * NewGauss(void)=0
ElementVector * CreatePVectorSurface(Element *element)
@ BasalforcingsOceanSalinityEnum
const char * EnumToStringx(int enum_in)
@ LinearFloatingMeltRateEnum
@ BeckmannGoosseFloatingMeltRateEnum
@ MantlePlumeGeothermalFluxEnum
@ BasalforcingsFloatingiceMeltingRateEnum
void FindConstant(bool *pvalue, const char *constant_name)
virtual void NormalTop(IssmDouble *normal, IssmDouble *xyz_list)=0
ElementMatrix * CreateKMatrixBase(Element *element)
void GetVerticesCoordinates(IssmDouble **xyz_list)
@ SpatialLinearFloatingMeltRateEnum
void FetchData(bool *pboolean, const char *data_name)
@ BasalforcingsIsmip6Enum
virtual int ObjectEnum()=0
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
@ BasalforcingsIsmip6BasinIdEnum
ElementMatrix * CreateKMatrixSurface(Element *element)
IssmDouble * Data(const char *data_name)
void GetSolutionFromInputsOneDof(Vector< IssmDouble > *solution, int solutionenum)
virtual void GetVerticesCoordinatesBase(IssmDouble **xyz_list)=0
@ StressbalanceVerticalAnalysisEnum
@ BasalforcingsDeepwaterElevationEnum
#define _error_(StreamArgs)
void SetActiveNodesLSMx(FemModel *femmodel)
ElementVector * CreatePVectorBase(Element *element)
virtual int begin(void)=0
bool VerboseSolution(void)
Object * GetObjectByOffset(int offset)
@ MeshVertexonsurfaceEnum
ElementVector * CreatePVectorVolume(Element *element)
ElementMatrix * CreateKMatrixVolume(Element *element)
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
void SetCurrentConfiguration(int configuration_type)
void GetInputValue(bool *pvalue, int enum_type)
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)
virtual void GetVerticesCoordinatesTop(IssmDouble **xyz_list)=0
virtual Gauss * NewGaussTop(int order)=0
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)