source: issm/oecreview/Archive/16554-17801/ISSM-16858-16859.diff@ 17802

Last change on this file since 17802 was 17802, checked in by Mathieu Morlighem, 11 years ago

Added archives

File size: 6.6 KB
RevLine 
[17802]1Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
2===================================================================
3--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 16858)
4+++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 16859)
5@@ -37,6 +37,9 @@
6 void GetBSSAprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
7 void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
8 /*L1L2*/
9+ ElementVector* CreatePVectorL1L2(Element* element);
10+ ElementVector* CreatePVectorL1L2DrivingStress(Element* element);
11+ ElementVector* CreatePVectorL1L2Front(Element* element);
12 void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
13 /*HO*/
14 ElementMatrix* CreateKMatrixHO(Element* element);
15Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
16===================================================================
17--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16858)
18+++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16859)
19@@ -838,6 +838,8 @@
20 return NULL;
21 case SSAApproximationEnum:
22 return CreatePVectorSSA(element);
23+ case L1L2ApproximationEnum:
24+ return CreatePVectorL1L2(element);
25 case HOApproximationEnum:
26 return CreatePVectorHO(element);
27 case FSApproximationEnum:
28@@ -1338,6 +1340,144 @@
29 }/*}}}*/
30
31 /*L1L2*/
32+ElementVector* StressbalanceAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
33+
34+ /*Intermediaries*/
35+ int meshtype;
36+ Element* basalelement;
37+
38+ /*Get basal element*/
39+ element->FindParam(&meshtype,MeshTypeEnum);
40+ switch(meshtype){
41+ case Mesh2DhorizontalEnum:
42+ basalelement = element;
43+ break;
44+ case Mesh3DEnum:
45+ if(!element->IsOnBed()) return NULL;
46+ basalelement = element->SpawnBasalElement();
47+ break;
48+ default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
49+ }
50+
51+ /*compute all load vectors for this element*/
52+ ElementVector* pe1=CreatePVectorL1L2DrivingStress(basalelement);
53+ ElementVector* pe2=CreatePVectorL1L2Front(basalelement);
54+ ElementVector* pe =new ElementVector(pe1,pe2);
55+
56+ /*clean-up and return*/
57+ if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
58+ delete pe1;
59+ delete pe2;
60+ return pe;
61+}/*}}}*/
62+ElementVector* StressbalanceAnalysis::CreatePVectorL1L2DrivingStress(Element* element){/*{{{*/
63+
64+ /*Intermediaries */
65+ IssmDouble thickness,Jdet,slope[2];
66+ IssmDouble* xyz_list = NULL;
67+
68+ /*Fetch number of nodes and dof for this finite element*/
69+ int numnodes = element->GetNumberOfNodes();
70+
71+ /*Initialize Element vector and vectors*/
72+ ElementVector* pe = element->NewElementVector(L1L2ApproximationEnum);
73+ IssmDouble* basis = xNew<IssmDouble>(numnodes);
74+
75+ /*Retrieve all inputs and parameters*/
76+ element->GetVerticesCoordinates(&xyz_list);
77+ Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
78+ Input* surface_input =element->GetInput(SurfaceEnum); _assert_(surface_input);
79+ IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
80+
81+ /* Start looping on the number of gaussian points: */
82+ Gauss* gauss=element->NewGauss(2);
83+ for(int ig=gauss->begin();ig<gauss->end();ig++){
84+
85+ gauss->GaussPoint(ig);
86+
87+ element->JacobianDeterminant(&Jdet,xyz_list,gauss);
88+ element->NodalFunctions(basis, gauss);
89+
90+ thickness_input->GetInputValue(&thickness,gauss);
91+ surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
92+
93+ for(int i=0;i<numnodes;i++){
94+ pe->values[i*2+0]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i];
95+ pe->values[i*2+1]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i];
96+ }
97+ }
98+
99+ /*Transform coordinate system*/
100+ element->TransformLoadVectorCoord(pe,XYEnum);
101+
102+ /*Clean up and return*/
103+ xDelete<IssmDouble>(xyz_list);
104+ xDelete<IssmDouble>(basis);
105+ delete gauss;
106+ return pe;
107+}/*}}}*/
108+ElementVector* StressbalanceAnalysis::CreatePVectorL1L2Front(Element* element){/*{{{*/
109+
110+ /*If no front, return NULL*/
111+ if(!element->IsZeroLevelset(MaskIceLevelsetEnum)) return NULL;
112+
113+ /*Intermediaries*/
114+ IssmDouble Jdet,thickness,bed,water_pressure,ice_pressure;
115+ IssmDouble surface_under_water,base_under_water,pressure;
116+ IssmDouble *xyz_list = NULL;
117+ IssmDouble *xyz_list_front = NULL;
118+ IssmDouble normal[2];
119+
120+ /*Fetch number of nodes for this finite element*/
121+ int numnodes = element->GetNumberOfNodes();
122+
123+ /*Initialize Element vector and other vectors*/
124+ ElementVector* pe = element->NewElementVector(L1L2ApproximationEnum);
125+ IssmDouble* basis = xNew<IssmDouble>(numnodes);
126+
127+ /*Retrieve all inputs and parameters*/
128+ Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
129+ Input* bed_input = element->GetInput(BedEnum); _assert_(bed_input);
130+ IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoWaterEnum);
131+ IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
132+ IssmDouble gravity = element->GetMaterialParameter(ConstantsGEnum);
133+ element->GetVerticesCoordinates(&xyz_list);
134+ element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
135+ element->NormalSection(&normal[0],xyz_list_front);
136+
137+ /*Start looping on Gaussian points*/
138+ Gauss* gauss=element->NewGauss(xyz_list,xyz_list_front,3);
139+ for(int ig=gauss->begin();ig<gauss->end();ig++){
140+
141+ gauss->GaussPoint(ig);
142+ thickness_input->GetInputValue(&thickness,gauss);
143+ bed_input->GetInputValue(&bed,gauss);
144+ element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
145+ element->NodalFunctions(basis,gauss);
146+
147+ surface_under_water = min(0.,thickness+bed); // 0 if the top of the glacier is above water level
148+ base_under_water = min(0.,bed); // 0 if the bottom of the glacier is above water level
149+ water_pressure = 1.0/2.0*gravity*rho_water*(surface_under_water*surface_under_water - base_under_water*base_under_water);
150+ ice_pressure = 1.0/2.0*gravity*rho_ice*thickness*thickness;
151+ pressure = ice_pressure + water_pressure;
152+
153+ for (int i=0;i<numnodes;i++){
154+ pe->values[2*i+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i];
155+ pe->values[2*i+1]+= pressure*Jdet*gauss->weight*normal[1]*basis[i];
156+ }
157+ }
158+
159+ /*Transform coordinate system*/
160+ element->TransformLoadVectorCoord(pe,XYEnum);
161+
162+ /*Clean up and return*/
163+ xDelete<IssmDouble>(xyz_list);
164+ xDelete<IssmDouble>(xyz_list_front);
165+ xDelete<IssmDouble>(basis);
166+ delete gauss;
167+ return pe;
168+ return NULL;
169+}/*}}}*/
170 void StressbalanceAnalysis::InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element){/*{{{*/
171
172 int i,meshtype;
Note: See TracBrowser for help on using the repository browser.