source: issm/trunk-jpl/src/c/modules/ModelProcessorx/Stressbalance/UpdateElementsStressbalance.cpp@ 15771

Last change on this file since 15771 was 15771, checked in by Mathieu Morlighem, 12 years ago

CHG: Diagnostic is now Stressbalance

File size: 6.0 KB
Line 
1/*
2 * UpdateElementsStressbalance:
3 */
4#ifdef HAVE_CONFIG_H
5 #include <config.h>
6#else
7#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
8#endif
9
10#include "../../../toolkits/toolkits.h"
11#include "../../../classes/classes.h"
12#include "../../../shared/shared.h"
13#include "../../MeshPartitionx/MeshPartitionx.h"
14#include "../ModelProcessorx.h"
15
16void UpdateElementsStressbalance(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
17
18 int materials_type,finiteelement,temp;
19 int approximation;
20 int* finiteelement_list=NULL;
21 bool isSSA,isL1L2,isHO,isFS,iscoupling;
22 bool control_analysis;
23 bool dakota_analysis;
24
25 /*Fetch constants needed: */
26 iomodel->Constant(&isSSA,FlowequationIsSSAEnum);
27 iomodel->Constant(&isL1L2,FlowequationIsL1L2Enum);
28 iomodel->Constant(&isHO,FlowequationIsHOEnum);
29 iomodel->Constant(&isFS,FlowequationIsFSEnum);
30 iomodel->Constant(&control_analysis,InversionIscontrolEnum);
31 iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
32 iomodel->Constant(&materials_type,MaterialsEnum);
33
34 /*Now, is the flag macayaealHO on? otherwise, do nothing: */
35 if(!isSSA & !isL1L2 & !isHO & !isFS) return;
36
37 /*Fetch data needed and allocate vectors: */
38 iomodel->FetchData(1,FlowequationElementEquationEnum);
39 finiteelement_list=xNewZeroInit<int>(iomodel->numberofelements);
40
41
42 /*Do we have coupling*/
43 if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
44 iscoupling = true;
45 else
46 iscoupling = false;
47
48 /*Get finite element type*/
49 if(!iscoupling){
50 if(isSSA){
51 iomodel->Constant(&temp,FlowequationFeSSAEnum);
52 switch(temp){
53 case 0 : finiteelement = P1Enum; break;
54 case 1 : finiteelement = P2Enum; break;
55 case 2 : finiteelement = P1bubblecondensedEnum; break;
56 case 3 : finiteelement = P1bubbleEnum; break;
57 default: _error_("finite element "<<temp<<" not supported");
58 }
59 }
60 else if(isL1L2){
61 finiteelement = P1Enum;
62 }
63 else if(isHO){
64 iomodel->Constant(&temp,FlowequationFeHOEnum);
65 switch(temp){
66 case 0 : finiteelement = P1Enum; break;
67 case 1 : finiteelement = P1xP2Enum; break;
68 case 2 : finiteelement = P2xP1Enum; break;
69 case 3 : finiteelement = P2Enum; break;
70 case 4 : finiteelement = P1bubblecondensedEnum; break;
71 case 5 : finiteelement = P1bubbleEnum; break;
72 default: _error_("finite element "<<temp<<" not supported");
73 }
74 }
75 else if(isFS){
76 iomodel->Constant(&temp,FlowequationFeFSEnum);
77 switch(temp){
78 case 0 : finiteelement = P1P1Enum; break;
79 case 1 : finiteelement = P1P1GLSEnum; break;
80 case 2 : finiteelement = MINIcondensedEnum; break;
81 case 3 : finiteelement = MINIEnum; break;
82 case 4 : finiteelement = TaylorHoodEnum; break;
83 default: _error_("finite element "<<temp<<" not supported");
84 }
85 }
86 for(int i=0;i<iomodel->numberofelements;i++){
87 finiteelement_list[i]=finiteelement;
88 }
89 }
90 else{
91 if(isFS){
92 for(int i=0;i<iomodel->numberofelements;i++){
93 approximation=reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[i]);
94 if(approximation==FSApproximationEnum || approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
95 finiteelement_list[i]=MINIcondensedEnum;
96 }
97 else{
98 finiteelement_list[i]=P1Enum;
99 }
100 }
101 }
102 else{
103 finiteelement = P1Enum;
104 for(int i=0;i<iomodel->numberofelements;i++){
105 finiteelement_list[i]=finiteelement;
106 }
107 }
108 }
109
110 /*Update elements: */
111 int counter=0;
112 for(int i=0;i<iomodel->numberofelements;i++){
113 if(iomodel->my_elements[i]){
114 Element* element=(Element*)elements->GetObjectByOffset(counter);
115 element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
116 counter++;
117 }
118 }
119
120 /*Create inputs: */
121 iomodel->FetchDataToInput(elements,ThicknessEnum);
122 iomodel->FetchDataToInput(elements,GeometryHydrostaticRatioEnum);
123 iomodel->FetchDataToInput(elements,SurfaceEnum);
124 iomodel->FetchDataToInput(elements,BedEnum);
125 iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
126 iomodel->FetchDataToInput(elements,FrictionPEnum);
127 iomodel->FetchDataToInput(elements,FrictionQEnum);
128 iomodel->FetchDataToInput(elements,MaskElementonfloatingiceEnum);
129 iomodel->FetchDataToInput(elements,MaskIcelevelsetEnum);
130 iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
131 iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
132 iomodel->FetchDataToInput(elements,VxEnum);
133 iomodel->FetchDataToInput(elements,VyEnum);
134 iomodel->FetchDataToInput(elements,LoadingforceXEnum);
135 iomodel->FetchDataToInput(elements,LoadingforceYEnum);
136 if(materials_type==MatdamageiceEnum){
137 iomodel->FetchDataToInput(elements,MaterialsRheologyZEnum);
138 }
139 if(iomodel->dim==3){
140 iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
141 iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
142 iomodel->FetchDataToInput(elements,VzEnum);
143 iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
144 iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
145 iomodel->FetchDataToInput(elements,FlowequationBorderFSEnum);
146 iomodel->FetchDataToInput(elements,LoadingforceZEnum);
147 }
148
149 if(control_analysis){
150 iomodel->FetchDataToInput(elements,InversionVxObsEnum);
151 iomodel->FetchDataToInput(elements,InversionVyObsEnum);
152 }
153
154 /*Post-process: */
155 elements->InputDuplicate(VxEnum,VxPicardEnum);
156 elements->InputDuplicate(VxEnum,InversionVxObsEnum);
157 if(dakota_analysis)elements->InputDuplicate(VxEnum,QmuVxEnum);
158
159 #ifdef _HAVE_ANDROID_
160 elements->InputDuplicate(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
161 #endif
162
163 elements->InputDuplicate(VyEnum,VyPicardEnum);
164 elements->InputDuplicate(VyEnum,InversionVyObsEnum);
165 if(dakota_analysis)elements->InputDuplicate(VyEnum,QmuVyEnum);
166
167 if(iomodel->dim==3){
168 elements->InputDuplicate(VzEnum,VzPicardEnum);
169 elements->InputDuplicate(VzEnum,InversionVzObsEnum);
170 if(dakota_analysis)elements->InputDuplicate(VzEnum,QmuVzEnum);
171 }
172
173 /*Free data: */
174 iomodel->DeleteData(1,FlowequationElementEquationEnum);
175 xDelete<int>(finiteelement_list);
176}
Note: See TracBrowser for help on using the repository browser.