source: issm/oecreview/Archive/16554-17801/ISSM-16716-16717.diff

Last change on this file 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/L2ProjectionBaseAnalysis.cpp
2===================================================================
3--- ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp (revision 16716)
4+++ ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp (revision 16717)
5@@ -59,8 +59,17 @@
6 }/*}}}*/
7 void L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
8
9- int inputenum;
10+ int inputenum,meshtype;
11
12 element->FindParam(&inputenum,InputToL2ProjectEnum);
13- element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
14+ element->FindParam(&meshtype,MeshTypeEnum);
15+ switch(meshtype){
16+ case Mesh2DhorizontalEnum:
17+ element->InputUpdateFromSolutionOneDof(solution,inputenum);
18+ break;
19+ case Mesh3DEnum:
20+ element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
21+ break;
22+ default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
23+ }
24 }/*}}}*/
25Index: ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
26===================================================================
27--- ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp (revision 16716)
28+++ ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp (revision 16717)
29@@ -167,5 +167,84 @@
30 xDelete<IssmDouble>(values);
31 }/*}}}*/
32 void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
33- _error_("not implemented yet");
34+
35+ int i,meshtype;
36+ IssmDouble rho_ice,g;
37+ int* doflist=NULL;
38+ IssmDouble* xyz_list=NULL;
39+
40+ /*Fetch number of nodes and dof for this finite element*/
41+ int numnodes = element->GetNumberOfNodes();
42+ int numdof = numnodes*2;
43+
44+ /*Fetch dof list and allocate solution vectors*/
45+ element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
46+ IssmDouble* values = xNew<IssmDouble>(numdof);
47+ IssmDouble* vx = xNew<IssmDouble>(numdof);
48+ IssmDouble* vy = xNew<IssmDouble>(numdof);
49+ IssmDouble* vz = xNew<IssmDouble>(numdof);
50+ IssmDouble* vel = xNew<IssmDouble>(numdof);
51+ IssmDouble* pressure = xNew<IssmDouble>(numdof);
52+ IssmDouble* thickness = xNew<IssmDouble>(numdof);
53+ IssmDouble* surface = xNew<IssmDouble>(numnodes);
54+
55+ /*Use the dof list to index into the solution vector: */
56+ for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
57+
58+ /*Transform solution in Cartesian Space*/
59+ element->TransformSolutionCoord(&values[0],XYEnum);
60+
61+ /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
62+ for(i=0;i<numnodes;i++){
63+ vx[i]=values[i*NDOF2+0];
64+ vy[i]=values[i*NDOF2+1];
65+
66+ /*Check solution*/
67+ if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
68+ if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
69+ }
70+
71+ /*Get Vz and compute vel*/
72+ element->GetInputListOnNodes(&vz[0],VzEnum,0.);
73+ for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
74+
75+ /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D,
76+ *so the pressure is just the pressure at the bedrock: */
77+ rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
78+ g = element->GetMaterialParameter(ConstantsGEnum);
79+ switch(meshtype){
80+ case Mesh2DhorizontalEnum:
81+ element->GetInputListOnNodes(&thickness[0],ThicknessEnum);
82+ for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
83+ break;
84+ case Mesh3DEnum:
85+ element->GetVerticesCoordinates(&xyz_list);
86+ element->GetInputListOnNodes(&surface[0],SurfaceEnum);
87+ for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
88+ break;
89+ default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
90+ }
91+
92+ /*Now, we have to move the previous Vx and Vy inputs to old
93+ * status, otherwise, we'll wipe them off: */
94+ element->InputChangeName(VxEnum,VxPicardEnum);
95+ element->InputChangeName(VyEnum,VyPicardEnum);
96+ element->InputChangeName(PressureEnum,PressurePicardEnum);
97+
98+ /*Add vx and vy as inputs to the tria element: */
99+ element->AddInput(VxEnum,vx,P1Enum);
100+ element->AddInput(VyEnum,vy,P1Enum);
101+ element->AddInput(VelEnum,vel,P1Enum);
102+ element->AddInput(PressureEnum,pressure,P1Enum);
103+
104+ /*Free ressources:*/
105+ xDelete<IssmDouble>(thickness);
106+ xDelete<IssmDouble>(surface);
107+ xDelete<IssmDouble>(pressure);
108+ xDelete<IssmDouble>(vel);
109+ xDelete<IssmDouble>(vz);
110+ xDelete<IssmDouble>(vy);
111+ xDelete<IssmDouble>(vx);
112+ xDelete<IssmDouble>(values);
113+ xDelete<int>(doflist);
114 }/*}}}*/
115Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
116===================================================================
117--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16716)
118+++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16717)
119@@ -940,7 +940,7 @@
120 InputUpdateFromSolutionHoriz(solution,element);
121 return;
122 case L1L2ApproximationEnum:
123- //InputUpdateFromSolutionHoriz(solution,element);
124+ InputUpdateFromSolutionHoriz(solution,element);
125 return;
126 case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
127 /*the elements around will create the solution*/
128Index: ../trunk-jpl/src/c/classes/Elements/Element.h
129===================================================================
130--- ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16716)
131+++ ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16717)
132@@ -88,6 +88,7 @@
133 virtual void InputDuplicate(int original_enum,int new_enum)=0;
134 virtual void InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
135 virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
136+ virtual void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
137
138 virtual int NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
139 virtual int NumberofNodesVelocity(void)=0;
140Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
141===================================================================
142--- ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16716)
143+++ ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16717)
144@@ -55,6 +55,7 @@
145 /*Update virtual functions resolution: {{{*/
146 void InputUpdateFromSolution(IssmDouble* solution){_error_("not implemented yet");};
147 void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
148+ void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
149 void InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
150 #ifdef _HAVE_DAKOTA_
151 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
Note: See TracBrowser for help on using the repository browser.