- Timestamp:
- 11/12/13 13:54:57 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
r16684 r16717 168 168 }/*}}}*/ 169 169 void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 170 _error_("not implemented yet"); 171 }/*}}}*/ 170 171 int i,meshtype; 172 IssmDouble rho_ice,g; 173 int* doflist=NULL; 174 IssmDouble* xyz_list=NULL; 175 176 /*Fetch number of nodes and dof for this finite element*/ 177 int numnodes = element->GetNumberOfNodes(); 178 int numdof = numnodes*2; 179 180 /*Fetch dof list and allocate solution vectors*/ 181 element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 182 IssmDouble* values = xNew<IssmDouble>(numdof); 183 IssmDouble* vx = xNew<IssmDouble>(numdof); 184 IssmDouble* vy = xNew<IssmDouble>(numdof); 185 IssmDouble* vz = xNew<IssmDouble>(numdof); 186 IssmDouble* vel = xNew<IssmDouble>(numdof); 187 IssmDouble* pressure = xNew<IssmDouble>(numdof); 188 IssmDouble* thickness = xNew<IssmDouble>(numdof); 189 IssmDouble* surface = xNew<IssmDouble>(numnodes); 190 191 /*Use the dof list to index into the solution vector: */ 192 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]]; 193 194 /*Transform solution in Cartesian Space*/ 195 element->TransformSolutionCoord(&values[0],XYEnum); 196 197 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 198 for(i=0;i<numnodes;i++){ 199 vx[i]=values[i*NDOF2+0]; 200 vy[i]=values[i*NDOF2+1]; 201 202 /*Check solution*/ 203 if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector"); 204 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 205 } 206 207 /*Get Vz and compute vel*/ 208 element->GetInputListOnNodes(&vz[0],VzEnum,0.); 209 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 210 211 /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D, 212 *so the pressure is just the pressure at the bedrock: */ 213 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 214 g = element->GetMaterialParameter(ConstantsGEnum); 215 switch(meshtype){ 216 case Mesh2DhorizontalEnum: 217 element->GetInputListOnNodes(&thickness[0],ThicknessEnum); 218 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i]; 219 break; 220 case Mesh3DEnum: 221 element->GetVerticesCoordinates(&xyz_list); 222 element->GetInputListOnNodes(&surface[0],SurfaceEnum); 223 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]); 224 break; 225 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 226 } 227 228 /*Now, we have to move the previous Vx and Vy inputs to old 229 * status, otherwise, we'll wipe them off: */ 230 element->InputChangeName(VxEnum,VxPicardEnum); 231 element->InputChangeName(VyEnum,VyPicardEnum); 232 element->InputChangeName(PressureEnum,PressurePicardEnum); 233 234 /*Add vx and vy as inputs to the tria element: */ 235 element->AddInput(VxEnum,vx,P1Enum); 236 element->AddInput(VyEnum,vy,P1Enum); 237 element->AddInput(VelEnum,vel,P1Enum); 238 element->AddInput(PressureEnum,pressure,P1Enum); 239 240 /*Free ressources:*/ 241 xDelete<IssmDouble>(thickness); 242 xDelete<IssmDouble>(surface); 243 xDelete<IssmDouble>(pressure); 244 xDelete<IssmDouble>(vel); 245 xDelete<IssmDouble>(vz); 246 xDelete<IssmDouble>(vy); 247 xDelete<IssmDouble>(vx); 248 xDelete<IssmDouble>(values); 249 xDelete<int>(doflist); 250 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.