 |
Ice Sheet System Model
4.18
Code documentation
|
#include <StressbalanceSIAAnalysis.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 * | CreateKMatrix2D (Element *element) |
|
ElementMatrix * | CreateKMatrix3D (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
ElementVector * | CreatePVector2D (Element *element) |
|
ElementVector * | CreatePVector3D (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 () |
|
Definition at line 11 of file StressbalanceSIAAnalysis.h.
◆ CreateConstraints()
void StressbalanceSIAAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 9 of file StressbalanceSIAAnalysis.cpp.
12 bool isSIA,isSSA,isL1L2,isHO,isFS,iscoupling;
25 if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
37 iomodel->
FetchData(3,
"md.stressbalance.spcvx",
"md.stressbalance.spcvy",
"md.flowequation.vertex_equation");
55 if (!xIsNan<IssmDouble>(iomodel->
Data(
"md.stressbalance.spcvx")[i])){
60 if (!xIsNan<IssmDouble>(iomodel->
Data(
"md.stressbalance.spcvy")[i])){
70 iomodel->
DeleteData(3,
"md.stressbalance.spcvx",
"md.stressbalance.spcvy",
"md.flowequation.vertex_equation");
◆ CreateLoads()
void StressbalanceSIAAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void StressbalanceSIAAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 78 of file StressbalanceSIAAnalysis.cpp.
91 iomodel->
FetchData(4,
"md.flowequation.borderSSA",
"md.flowequation.borderFS",
"md.flowequation.vertex_equation",
"md.stressbalance.referential");
93 iomodel->
FetchData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
97 for(
int i=0;i<nodes->
Size();i++){
99 int sid = node->
Sid();
103 iomodel->
DeleteData(6,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface",
"md.flowequation.borderSSA",
"md.flowequation.borderFS",
"md.flowequation.vertex_equation",
"md.stressbalance.referential");
◆ DofsPerNode()
int StressbalanceSIAAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void StressbalanceSIAAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
◆ UpdateParameters()
void StressbalanceSIAAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
◆ Core()
void StressbalanceSIAAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
◆ CreateKMatrix2D()
Definition at line 205 of file StressbalanceSIAAnalysis.cpp.
218 for(
int iv=0;iv<numvertices;iv++){
220 Ke->
values[(2*iv+0)*2*numvertices+(2*iv+0)]=1./connectivity;
221 Ke->
values[(2*iv+1)*2*numvertices+(2*iv+1)]=1./connectivity;
◆ CreateKMatrix3D()
Definition at line 227 of file StressbalanceSIAAnalysis.cpp.
233 int i0,i1,j0,j1,nodeup,nodedown,numsegments;
234 IssmDouble slope[2],connectivity[2],one0,one1;
235 int *pairindices = NULL;
239 int numdof = 2*numvertices;
245 for(
int is=0;is<numsegments;is++){
246 nodedown = pairindices[is*2+0];
247 nodeup = pairindices[is*2+1];
250 one0=1./connectivity[0];
251 one1=1./connectivity[1];
254 i0=2*nodedown; i1=2*nodedown+1;
256 j0=2*nodeup; j1=2*nodeup+1;
260 Ke->
values[i0*numdof+i0] = +one0;
261 Ke->
values[i1*numdof+i1] = +one0;
262 Ke->
values[j0*numdof+i0] = -one1;
263 Ke->
values[j0*numdof+j0] = +one1;
264 Ke->
values[j1*numdof+i1] = -one1;
265 Ke->
values[j1*numdof+j1] = +one1;
268 Ke->
values[i0*numdof+i0] = one0;
269 Ke->
values[i1*numdof+i1] = one0;
270 Ke->
values[j0*numdof+i0] = -2.*one1;
271 Ke->
values[j0*numdof+j0] = +2.*one1;
272 Ke->
values[j1*numdof+i1] = -2.*one1;
273 Ke->
values[j1*numdof+j1] = +2.*one1;
276 Ke->
values[j0*numdof+i0] = -one1;
277 Ke->
values[j0*numdof+j0] = +one1;
278 Ke->
values[j1*numdof+i1] = -one1;
279 Ke->
values[j1*numdof+j1] = +one1;
282 Ke->
values[j0*numdof+i0] = -2.*one1;
283 Ke->
values[j0*numdof+j0] = +2.*one1;
284 Ke->
values[j1*numdof+i1] = -2.*one1;
285 Ke->
values[j1*numdof+j1] = +2.*one1;
290 xDelete<int>(pairindices);
◆ CreatePVector()
◆ CreatePVector2D()
Definition at line 308 of file StressbalanceSIAAnalysis.cpp.
315 IssmDouble ub,vb,slope2,drag,thickness,surface,connectivity;
334 Input2* drag_input = NULL;
335 if(frictionlaw!=5 && frictionlaw!=1){
340 for(
int iv=0;iv<numvertices;iv++){
351 slope2=slope[0]*slope[0]+slope[1]*slope[1];
356 ub=-1.58*1.e-10*rho_ice*gravity*thickness*slope[0];
357 vb=-1.58*1.e-10*rho_ice*gravity*thickness*slope[1];
362 ub=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[0]/sqrt(slope2);
363 vb=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[1]/sqrt(slope2);
368 ub=-drag*rho_ice*gravity*thickness*slope[0];
369 vb=-drag*rho_ice*gravity*thickness*slope[1];
373 drag = -4e-15 * surface + 8.6e-12;
374 ub=-drag*rho_ice*gravity*thickness*slope[0];
375 vb=-drag*rho_ice*gravity*thickness*slope[1];
386 pe->
values[2*iv+0]=(ub-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n+1.)/(pow(B,n)*(n+2))*slope[0])/connectivity;
387 pe->
values[2*iv+1]=(vb-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n+1.)/(pow(B,n)*(n+2))*slope[1])/connectivity;
◆ CreatePVector3D()
Definition at line 394 of file StressbalanceSIAAnalysis.cpp.
401 int nodeup,nodedown,numsegments;
402 IssmDouble ub,vb,slope2,drag,surface,thickness,constant_part,z,Jdet;
403 IssmDouble slope[2],connectivity[2],xyz_list_line[2][3];
405 int *pairindices = NULL;
424 Input2* drag_input = NULL;
426 if(frictionlaw!=5 && frictionlaw!=1){
429 else if(frictionlaw==5){
435 for(
int is=0;is<numsegments;is++){
436 nodedown = pairindices[is*2+0];
437 nodeup = pairindices[is*2+1];
440 for(
int i=0;i<3;i++){
441 xyz_list_line[0][i]=xyz_list[nodedown*3+i];
442 xyz_list_line[1][i]=xyz_list[nodeup*3+i];
446 for(
int ig=gauss->
begin();ig<gauss->
end();ig++){
456 slope2=slope[0]*slope[0]+slope[1]*slope[1];
457 constant_part=-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.));
463 pe->
values[2*nodeup+0]+=constant_part*pow((surface-z)/B,n)*slope[0]*Jdet*gauss->
weight/connectivity[1];
464 pe->
values[2*nodeup+1]+=constant_part*pow((surface-z)/B,n)*slope[1]*Jdet*gauss->
weight/connectivity[1];
467 pe->
values[2*nodeup+0]+=constant_part*pow((surface-z)/B,n)*slope[0]*Jdet*gauss->
weight*2./connectivity[1];
468 pe->
values[2*nodeup+1]+=constant_part*pow((surface-z)/B,n)*slope[1]*Jdet*gauss->
weight*2./connectivity[1];
475 delete gauss; gauss=element->
NewGauss();
480 ub=-1.58*1.e-10*rho_ice*gravity*thickness*slope[0];
481 vb=-1.58*1.e-10*rho_ice*gravity*thickness*slope[1];
486 ub=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[0]/sqrt(slope2);
487 vb=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[1]/sqrt(slope2);
492 ub=-drag*rho_ice*gravity*thickness*slope[0];
493 vb=-drag*rho_ice*gravity*thickness*slope[1];
498 drag = -4e-15 * surface + 8.6e-12;
499 ub=-drag*rho_ice*gravity*thickness*slope[0];
500 vb=-drag*rho_ice*gravity*thickness*slope[1];
504 ub = -1./drag * rho_ice*gravity*thickness*slope[0];
505 vb = -1./drag * rho_ice*gravity*thickness*slope[1];
512 pe->
values[2*nodedown+0]+=ub/connectivity[0];
513 pe->
values[2*nodedown+1]+=vb/connectivity[0];
519 xDelete<int>(pairindices);
520 xDelete<IssmDouble>(xyz_list);
521 if(frictionlaw==5)
delete friction;
◆ GetSolutionFromInputs()
Implements Analysis.
Definition at line 525 of file StressbalanceSIAAnalysis.cpp.
532 int numdof = numnodes*2;
533 IssmDouble* values = xNew<IssmDouble>(numdof);
542 for(
int i=0;i<numnodes;i++){
555 xDelete<int>(doflist);
556 xDelete<IssmDouble>(values);
◆ GradientJ()
void StressbalanceSIAAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolution()
void StressbalanceSIAAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 561 of file StressbalanceSIAAnalysis.cpp.
570 int numdof = numnodes*2;
574 IssmDouble* values = xNew<IssmDouble>(numdof);
579 IssmDouble* pressure = xNew<IssmDouble>(numdof);
580 IssmDouble* thickness = xNew<IssmDouble>(numdof);
581 IssmDouble* surface = xNew<IssmDouble>(numnodes);
584 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
590 for(i=0;i<numnodes;i++){
595 if(xIsNan<IssmDouble>(vx[i]))
_error_(
"NaN found in solution vector");
596 if(xIsInf<IssmDouble>(vx[i]))
_error_(
"Inf found in solution vector");
597 if(xIsNan<IssmDouble>(vy[i]))
_error_(
"NaN found in solution vector");
598 if(xIsInf<IssmDouble>(vy[i]))
_error_(
"Inf found in solution vector");
603 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
613 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
618 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
630 xDelete<IssmDouble>(thickness);
631 xDelete<IssmDouble>(surface);
632 xDelete<IssmDouble>(pressure);
633 xDelete<IssmDouble>(vel);
634 xDelete<IssmDouble>(vz);
635 xDelete<IssmDouble>(vy);
636 xDelete<IssmDouble>(vx);
637 xDelete<IssmDouble>(values);
638 xDelete<IssmDouble>(xyz_list);
639 xDelete<int>(doflist);
◆ UpdateConstraints()
void StressbalanceSIAAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
The documentation for this class was generated from the following files:
@ FrictionCoefficientEnum
void GetInputListOnNodes(IssmDouble *pvalue, int enumtype)
void TransformSolutionCoord(IssmDouble *solution, int cs_enum)
void GetDofList(int **pdoflist, int approximation_enum, int setenum)
virtual int GetNumberOfNodes(void)=0
#define _printf0_(StreamArgs)
void FindParam(bool *pvalue, int paramenum)
ElementMatrix * CreateKMatrix3D(Element *element)
int AddObject(Object *object)
virtual void VerticalSegmentIndices(int **pindices, int *pnumseg)=0
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
int IoCodeToEnumElementEquation(int enum_in)
IssmDouble GetZcoord(IssmDouble *xyz_list, Gauss *gauss)
void solutionsequence_linear(FemModel *femmodel)
@ MaterialsRheologyBbarEnum
virtual Input2 * GetInput2(int inputenum)=0
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
void SetValues(int ssize, int *list, doubletype *values, InsMode mode)
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
virtual Gauss * NewGauss(void)=0
const char * EnumToStringx(int enum_in)
void FindConstant(bool *pvalue, const char *constant_name)
void GetVerticesCoordinates(IssmDouble **xyz_list)
void FetchData(bool *pboolean, const char *data_name)
virtual Gauss * NewGaussLine(int vertex1, int vertex2, int order)=0
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
ElementVector * CreatePVector3D(Element *element)
virtual void GaussVertex(int iv)=0
@ StressbalanceSIAAnalysisEnum
IssmDouble * Data(const char *data_name)
#define _error_(StreamArgs)
void SetActiveNodesLSMx(FemModel *femmodel)
virtual int begin(void)=0
bool VerboseSolution(void)
Object * GetObjectByOffset(int offset)
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 FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
virtual int VertexConnectivity(int vertexindex)=0
void IoModelToConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
void GetAlpha2WeertmanTemp(IssmDouble *palpha2, Gauss *gauss)
int IoCodeToEnumVertexEquation(int enum_in)
ElementVector * CreatePVector2D(Element *element)
virtual int GetNumberOfVertices(void)=0
virtual void JacobianDeterminantLine(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
ElementMatrix * CreateKMatrix2D(Element *element)
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)