Changeset 18281
- Timestamp:
- 07/22/14 12:50:33 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
r18262 r18281 31 31 if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,VzEnum,0.); 32 32 iomodel->FetchDataToInput(elements,PressureEnum,0.); 33 iomodel->FetchDataToInput(elements,SigmaNNEnum,0.); 33 34 }/*}}}*/ 34 35 void UzawaPressureAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ … … 171 172 int *doflist = NULL; 172 173 IssmDouble rholambda,un,vx,vy,vz,sigmann; 173 IssmDouble bed_normal[3];174 174 IssmDouble *xyz_list_base = NULL; 175 175 176 176 /*Fetch number of nodes and dof for this finite element*/ 177 int numnodes = element->GetNumberOfNodes(); 178 //int numnodessigma = element->NumberofNodes(P2Enum); 179 int numnodessigma; 177 int numnodes = element->GetNumberOfNodes(); 178 int numnodessigma = element->GetNumberOfNodes(P2Enum); 180 179 181 180 element->FindParam(&dim,DomainDimensionEnum); 182 if(dim==2) numnodessigma=3;183 else numnodessigma=6;184 181 185 182 /*Fetch dof list and allocate solution vector*/ 186 183 element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 187 IssmDouble* values = xNew<IssmDouble>(numnodes); 188 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 189 Input* vx_input= element->GetInput(VxEnum); _assert_(vx_input); 190 Input* vy_input= element->GetInput(VyEnum); _assert_(vy_input); 191 Input* vz_input = NULL; 192 if(dim==3){vz_input =element->GetInput(VzEnum); _assert_(vz_input);} 193 Input* sigmann_input=element->GetInput(SigmaNNEnum); _assert_(vy_input); 184 IssmDouble* values = xNew<IssmDouble>(numnodes); 185 IssmDouble* valueslambda = xNewZeroInit<IssmDouble>(numnodessigma); 186 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 187 Input* sigmann_input = element->GetInput(SigmaNNEnum); _assert_(sigmann_input); 188 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 189 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 190 Input* vz_input = NULL; 191 if(dim==3){vz_input = element->GetInput(VzEnum); _assert_(vz_input);} 194 192 element->GetInputListOnNodes(&pressure[0],PressureEnum); 195 193 196 194 /*Update pressure enum first*/ 197 195 for(int i=0;i<numnodes;i++){ 198 values[i] 196 values[i] = pressure[i] + solution[doflist[i]]; 199 197 } 200 198 element->AddInput(PressureEnum,values,element->GetElementType()); … … 202 200 /*Now compute sigmann if on base*/ 203 201 if(element->IsOnBase()){ 204 202 if(dim==3) _error_("not implemented yet"); 203 204 int baselist[3]; 205 int onbase=0; 206 IssmDouble Jdet; 207 IssmDouble bed_normal[3]; 208 IssmDouble Jlambda[3][3] = {0.0}; 209 IssmDouble Cuk[3] = {0.0}; 210 IssmDouble deltalambda[3] = {0.0}; 211 IssmDouble* vertexonbase = xNew<IssmDouble>(numnodessigma); 212 Input* vertexonbase_input = element->GetInput(MeshVertexonbaseEnum); _assert_(vertexonbase_input); 213 Gauss* gauss = element->NewGauss(); 214 215 IssmDouble* basis = xNewZeroInit<IssmDouble>(numnodessigma); 205 216 element->GetVerticesCoordinatesBase(&xyz_list_base); 206 217 element->NormalBase(&bed_normal[0],xyz_list_base); 207 218 element->FindParam(&rholambda,AugmentedLagrangianRholambdaEnum); 208 219 209 Gauss* gauss = element->NewGauss();210 220 for(int i=0;i<numnodessigma;i++){ 211 221 gauss->GaussNode(P2Enum,i); 212 213 sigmann_input->GetInputValue(&sigmann, gauss); 222 vertexonbase_input->GetInputValue(&vertexonbase[i], gauss); 223 if(vertexonbase[i]==1){ 224 baselist[onbase]=i; 225 onbase += 1; 226 } 227 } 228 if(!onbase==3) _error_("basal nodes of element not found"); 229 230 delete gauss; 231 gauss = element->NewGaussBase(3); 232 for(int ig=gauss->begin();ig<gauss->end();ig++){ 233 gauss->GaussPoint(ig); 234 235 /*Compute Jlambda*/ 236 element->NodalFunctionsP2(basis,gauss); 237 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 238 for(int i=0;i<3;i++){ 239 for(int j=0;j<3;j++){ 240 Jlambda[i][j] += Jdet*gauss->weight*basis[baselist[i]]*basis[baselist[j]]; 241 } 242 } 243 244 /*Compute rho_lambd C u^k*/ 214 245 vx_input->GetInputValue(&vx, gauss); 215 246 vy_input->GetInputValue(&vy, gauss); 216 247 un=bed_normal[0]*vx + bed_normal[1]*vy; 217 if(dim==3){ 218 vz_input->GetInputValue(&vz, gauss); 219 un = un + bed_normal[2]*vz; 220 } 221 values[i] = sigmann + rholambda*un; 222 } 248 for(int i=0;i<3;i++) Cuk[i] += - un*rholambda*Jdet*gauss->weight*basis[baselist[i]]; 249 } 250 251 /*Now update sigmann*/ 252 Matrix3x3Solve(&deltalambda[0],&Jlambda[0][0],&Cuk[0]); 223 253 delete gauss; 254 gauss = element->NewGauss(); 255 for(int i=0;i<3;i++){ 256 gauss->GaussNode(P2Enum,baselist[i]); 257 sigmann_input->GetInputValue(&sigmann, gauss); 258 valueslambda[baselist[i]] = sigmann + deltalambda[i]; 259 } 260 261 delete gauss; 262 xDelete<IssmDouble>(vertexonbase); 224 263 xDelete<IssmDouble>(xyz_list_base); 225 } 226 element->AddInput(SigmaNNEnum,values,P2Enum); 264 xDelete<IssmDouble>(basis); 265 } 266 element->AddInput(SigmaNNEnum,valueslambda,P2Enum); 227 267 228 268 /*Free ressources:*/ 229 269 xDelete<IssmDouble>(values); 270 xDelete<IssmDouble>(valueslambda); 230 271 xDelete<IssmDouble>(pressure); 231 272 xDelete<int>(doflist); 232 233 273 }/*}}}*/ 234 274 void UzawaPressureAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.