Changeset 19267
- Timestamp:
- 04/07/15 15:51:47 (10 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
r19113 r19267 112 112 iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum); 113 113 iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum); 114 iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum); 114 115 iomodel->FetchDataToInput(elements,VxEnum,0.); 115 116 iomodel->FetchDataToInput(elements,VyEnum,0.); … … 137 138 ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrix(Element* element){/*{{{*/ 138 139 140 bool hack = false; 141 139 142 /*compute all stiffness matrices for this element*/ 140 143 ElementMatrix* Ke1=CreateKMatrixVolume(element); 141 ElementMatrix* Ke2=CreateKMatrixSurface(element); 144 ElementMatrix* Ke2=NULL; 145 if(hack) Ke2=CreateKMatrixBase(element); 146 else Ke2=CreateKMatrixSurface(element); 142 147 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2); 143 148 … … 147 152 return Ke; 148 153 154 }/*}}}*/ 155 ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixBase(Element* element){/*{{{*/ 156 157 158 if(!element->IsOnBase()) return NULL; 159 160 /*Intermediaries*/ 161 IssmDouble D,Jdet,normal[3]; 162 IssmDouble *xyz_list = NULL; 163 164 /*Fetch number of nodes and dof for this finite element*/ 165 int numnodes = element->GetNumberOfNodes(); 166 167 /*Initialize Element matrix and vectors*/ 168 ElementMatrix* Ke = element->NewElementMatrix(NoneApproximationEnum); 169 IssmDouble* basis = xNew<IssmDouble>(numnodes); 170 171 /*Retrieve all inputs and parameters*/ 172 element->GetVerticesCoordinatesBase(&xyz_list); 173 174 /* Start looping on the number of gaussian points: */ 175 Gauss* gauss = element->NewGaussBase(2); 176 element->NormalBase(&normal[0],xyz_list); 177 for(int ig=gauss->begin();ig<gauss->end();ig++){ 178 gauss->GaussPoint(ig); 179 180 element->JacobianDeterminantBase(&Jdet,xyz_list,gauss); 181 element->NodalFunctions(basis,gauss); 182 D = -gauss->weight*Jdet*normal[2]; 183 184 TripleMultiply( basis,1,numnodes,1, 185 &D,1,1,0, 186 basis,1,numnodes,0, 187 &Ke->values[0],1); 188 } 189 190 /*Clean up and return*/ 191 delete gauss; 192 xDelete<IssmDouble>(xyz_list); 193 xDelete<IssmDouble>(basis); 194 return Ke; 149 195 }/*}}}*/ 150 196 ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/ … … 232 278 ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/ 233 279 280 bool hack = false; 281 234 282 /*compute all load vectors for this element*/ 235 283 ElementVector* pe1=CreatePVectorVolume(element); 236 ElementVector* pe2=CreatePVectorBase(element); 284 ElementVector* pe2=NULL; 285 if(hack) pe2=CreatePVectorSurface(element); 286 else pe2=CreatePVectorBase(element); 237 287 ElementVector* pe =new ElementVector(pe1,pe2); 238 288 … … 308 358 return pe; 309 359 }/*}}}*/ 360 ElementVector* StressbalanceVerticalAnalysis::CreatePVectorSurface(Element* element){/*{{{*/ 361 362 /*Intermediaries */ 363 int approximation; 364 IssmDouble *xyz_list = NULL; 365 IssmDouble *xyz_list_surface= NULL; 366 IssmDouble Jdet,slope[3]; 367 IssmDouble vx,vy,vz=0.,dsdx,dsdy; 368 IssmDouble smb,smbvalue; 369 370 if(!element->IsOnSurface()) return NULL; 371 372 /*Fetch number of nodes for this finite element*/ 373 int numnodes = element->GetNumberOfNodes(); 374 375 /*Initialize Element vector*/ 376 ElementVector* pe = element->NewElementVector(); 377 IssmDouble* basis = xNew<IssmDouble>(numnodes); 378 379 /*Retrieve all inputs and parameters*/ 380 element->GetVerticesCoordinates(&xyz_list); 381 element->GetVerticesCoordinatesTop(&xyz_list_surface); 382 element->GetInputValue(&approximation,ApproximationEnum); 383 Input* surface_input =element->GetInput(SurfaceEnum); _assert_(surface_input); 384 Input* smb_input=element->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(smb_input); 385 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 386 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 387 Input* vzFS_input=NULL; 388 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 389 vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input); 390 } 391 392 /* Start looping on the number of gaussian points: */ 393 Gauss* gauss=element->NewGaussTop(2); 394 for(int ig=gauss->begin();ig<gauss->end();ig++){ 395 gauss->GaussPoint(ig); 396 397 smb_input->GetInputValue(&smb,gauss); 398 surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss); 399 vx_input->GetInputValue(&vx,gauss); 400 vy_input->GetInputValue(&vy,gauss); 401 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 402 vzFS_input->GetInputValue(&vz,gauss); 403 } 404 dsdx=slope[0]; 405 dsdy=slope[1]; 406 407 element->JacobianDeterminantTop(&Jdet,xyz_list_surface,gauss); 408 element->NodalFunctions(basis,gauss); 409 410 for(int i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dsdx+vy*dsdy-vz+smb)*basis[i]; 411 } 412 413 /*Clean up and return*/ 414 delete gauss; 415 xDelete<IssmDouble>(basis); 416 xDelete<IssmDouble>(xyz_list); 417 xDelete<IssmDouble>(xyz_list_surface); 418 return pe; 419 }/*}}}*/ 310 420 ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/ 311 421 -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
r18930 r19267 25 25 ElementMatrix* CreateJacobianMatrix(Element* element); 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 ElementMatrix* CreateKMatrixBase(Element* element); 27 28 ElementMatrix* CreateKMatrixSurface(Element* element); 28 29 ElementMatrix* CreateKMatrixVolume(Element* element); 29 30 ElementVector* CreatePVector(Element* element); 30 31 ElementVector* CreatePVectorBase(Element* element); 32 ElementVector* CreatePVectorSurface(Element* element); 31 33 ElementVector* CreatePVectorVolume(Element* element); 32 34 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
Note:
See TracChangeset
for help on using the changeset viewer.