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

Last change on this file since 15952 was 15952, checked in by seroussi, 12 years ago

CHG: updated model processors for GroundediceLevelset

File size: 5.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;
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) iomodel->Constant(&finiteelement,FlowequationFeSSAEnum);
51 else if(isL1L2) finiteelement = P1Enum;
52 else if(isHO) iomodel->Constant(&finiteelement,FlowequationFeHOEnum);
53 else if(isFS) iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
54 for(int i=0;i<iomodel->numberofelements;i++){
55 finiteelement_list[i]=finiteelement;
56 }
57 }
58 else{
59 if(isFS){
60 for(int i=0;i<iomodel->numberofelements;i++){
61 approximation=reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[i]);
62 if(approximation==FSApproximationEnum || approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
63 finiteelement_list[i]=MINIcondensedEnum;
64 }
65 else{
66 finiteelement_list[i]=P1Enum;
67 }
68 }
69 }
70 else{
71 finiteelement = P1Enum;
72 for(int i=0;i<iomodel->numberofelements;i++){
73 finiteelement_list[i]=finiteelement;
74 }
75 }
76 }
77
78 /*Update elements: */
79 int counter=0;
80 for(int i=0;i<iomodel->numberofelements;i++){
81 if(iomodel->my_elements[i]){
82 Element* element=(Element*)elements->GetObjectByOffset(counter);
83 element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
84 counter++;
85 }
86 }
87
88 /*Create inputs: */
89 iomodel->FetchDataToInput(elements,ThicknessEnum);
90 iomodel->FetchDataToInput(elements,GeometryHydrostaticRatioEnum);
91 iomodel->FetchDataToInput(elements,SurfaceEnum);
92 iomodel->FetchDataToInput(elements,BedEnum);
93 iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
94 iomodel->FetchDataToInput(elements,FrictionPEnum);
95 iomodel->FetchDataToInput(elements,FrictionQEnum);
96 iomodel->FetchDataToInput(elements,MaskElementonfloatingiceEnum);
97 iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
98 iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
99 iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
100 iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
101 iomodel->FetchDataToInput(elements,VxEnum);
102 iomodel->FetchDataToInput(elements,VyEnum);
103 iomodel->FetchDataToInput(elements,LoadingforceXEnum);
104 iomodel->FetchDataToInput(elements,LoadingforceYEnum);
105 if(materials_type==MatdamageiceEnum){
106 iomodel->FetchDataToInput(elements,MaterialsRheologyZEnum);
107 }
108 if(iomodel->dim==3){
109 iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
110 iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
111 iomodel->FetchDataToInput(elements,VzEnum);
112 iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
113 iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
114 iomodel->FetchDataToInput(elements,FlowequationBorderFSEnum);
115 iomodel->FetchDataToInput(elements,LoadingforceZEnum);
116 }
117
118 if(control_analysis){
119 iomodel->FetchDataToInput(elements,InversionVxObsEnum);
120 iomodel->FetchDataToInput(elements,InversionVyObsEnum);
121 }
122
123 /*Post-process: */
124 elements->InputDuplicate(VxEnum,VxPicardEnum);
125 elements->InputDuplicate(VxEnum,InversionVxObsEnum);
126 if(dakota_analysis)elements->InputDuplicate(VxEnum,QmuVxEnum);
127
128 #ifdef _HAVE_ANDROID_
129 elements->InputDuplicate(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
130 #endif
131
132 elements->InputDuplicate(VyEnum,VyPicardEnum);
133 elements->InputDuplicate(VyEnum,InversionVyObsEnum);
134 if(dakota_analysis)elements->InputDuplicate(VyEnum,QmuVyEnum);
135
136 if(iomodel->dim==3){
137 elements->InputDuplicate(VzEnum,VzPicardEnum);
138 elements->InputDuplicate(VzEnum,InversionVzObsEnum);
139 if(dakota_analysis)elements->InputDuplicate(VzEnum,QmuVzEnum);
140 }
141
142 /*Free data: */
143 iomodel->DeleteData(1,FlowequationElementEquationEnum);
144 xDelete<int>(finiteelement_list);
145}
Note: See TracBrowser for help on using the repository browser.