 |
Ice Sheet System Model
4.18
Code documentation
|
Go to the documentation of this file.
2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
6 #include "../solutionsequences/solutionsequences.h"
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");
81 iomodel->
FetchData(3,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface",
"md.flowequation.vertex_equation");
83 iomodel->
DeleteData(3,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface",
"md.flowequation.vertex_equation");
98 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,
P1Enum);
117 int basalforcing_model;
118 iomodel->
FindConstant(&basalforcing_model,
"md.basalforcings.model");
119 switch(basalforcing_model){
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);
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);
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);
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);
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);
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);
508 _error_(
"Not implemented yet");
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);
@ BasalforcingsPicoBasinIdEnum
@ BasalforcingsOceanTempEnum
virtual int GetElementType(void)=0
void GetInputListOnNodes(IssmDouble *pvalue, int enumtype)
Declaration of Nodes class.
ElementMatrix * CreateJacobianMatrix(Element *element)
virtual int GetNumberOfNodes(void)=0
#define _printf0_(StreamArgs)
void FindParam(bool *pvalue, int paramenum)
void Core(FemModel *femmodel)
virtual Gauss * NewGaussBase(int order)=0
int AddObject(Object *object)
Declaration of Parameters class.
void CreateLoads(Loads *loads, IoModel *iomodel)
Declaration of Constraints class.
Declaration of Elements class.
void CreateConstraints(Constraints *constraints, IoModel *iomodel)
@ MismipFloatingMeltRateEnum
void InputUpdateFromSolution(IssmDouble *solution, Element *element)
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
ElementVector * CreateDVector(Element *element)
@ 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
void GradientJ(Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index)
@ 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
int DofsPerNode(int **doflist, int domaintype, int approximation)
virtual int ObjectEnum()=0
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
: header file for generic external result object
@ BasalforcingsIsmip6BasinIdEnum
ElementMatrix * CreateKMatrixSurface(Element *element)
IssmDouble * Data(const char *data_name)
Declaration of Loads class.
void GetSolutionFromInputsOneDof(Vector< IssmDouble > *solution, int solutionenum)
virtual void GetVerticesCoordinatesBase(IssmDouble **xyz_list)=0
@ StressbalanceVerticalAnalysisEnum
@ BasalforcingsDeepwaterElevationEnum
#define _error_(StreamArgs)
void SetActiveNodesLSMx(FemModel *femmodel)
void UpdateConstraints(FemModel *femmodel)
ElementVector * CreatePVectorBase(Element *element)
ElementVector * CreatePVector(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 UpdateParameters(Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum)
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
void GetSolutionFromInputs(Vector< IssmDouble > *solution, Element *element)
ElementMatrix * CreateKMatrix(Element *element)
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
void UpdateElements(Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type)
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)