Changeset 16926
- Timestamp:
- 11/25/13 11:28:46 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp ¶
r16922 r16926 851 851 case SSAHOApproximationEnum: 852 852 return CreatePVectorSSAHO(element); 853 case HOFSApproximationEnum: 854 return CreatePVectorHOFS(element); 853 855 case NoneApproximationEnum: 854 856 return NULL; … … 3101 3103 int i,j; 3102 3104 IssmDouble Jdet2d,alpha2; 3103 IssmDouble *xyz_list_tria =NULL;3104 IssmDouble* L = xNewZeroInit<IssmDouble>(2*numdof);3105 IssmDouble DL[2][2] ={{ 0,0 },{0,0}}; //for basal drag3105 IssmDouble *xyz_list_tria = NULL; 3106 IssmDouble* L = xNewZeroInit<IssmDouble>(2*numdof); 3107 IssmDouble DL[2][2] = {{ 0,0 },{0,0}}; //for basal drag 3106 3108 IssmDouble DL_scalar; 3107 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdof*numdof);3108 Node *node_list[2*numnodes];3109 int* cs_list = xNew<int>(2*numnodes);3109 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdof*numdof); 3110 Node **node_list = xNew<Node*>(2*numnodes); 3111 int* cs_list = xNew<int>(2*numnodes); 3110 3112 3111 3113 /*Initialize Element matrix and return if necessary*/ … … 3163 3165 delete friction; 3164 3166 xDelete<int>(cs_list); 3167 xDelete<Node*>(node_list); 3165 3168 xDelete<IssmDouble>(xyz_list_tria); 3166 3169 xDelete<IssmDouble>(Ke_gg); … … 3184 3187 IssmDouble D_scalar; 3185 3188 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdofp*numdofm); 3186 Node *node_list[2*numnodes];3189 Node **node_list = xNew<Node*>(2*numnodes); 3187 3190 int* cs_list= xNew<int>(2*numnodes); 3188 3191 … … 3249 3252 xDelete<IssmDouble>(Ke_gg); 3250 3253 xDelete<IssmDouble>(xyz_list); 3254 xDelete<Node*>(node_list); 3251 3255 xDelete<int>(cs_list); 3252 3256 return Ke; … … 3265 3269 return pe; 3266 3270 }/*}}}*/ 3271 ElementVector* StressbalanceAnalysis::CreatePVectorHOFS(Element* element){/*{{{*/ 3272 3273 /*compute all load vectors for this element*/ 3274 int init = element->FiniteElement(); 3275 element->SetTemporaryElementType(P1Enum); 3276 ElementVector* pe1=CreatePVectorHO(element); 3277 element->SetTemporaryElementType(init); 3278 ElementVector* pe2=CreatePVectorFS(element); 3279 int indices[3]={18,19,20}; 3280 element->SetTemporaryElementType(MINIcondensedEnum); 3281 ElementMatrix* Ke = CreateKMatrixFS(element); 3282 element->SetTemporaryElementType(init); 3283 pe2->StaticCondensation(Ke,3,&indices[0]); 3284 delete Ke; 3285 ElementVector* pe3=CreatePVectorCouplingHOFS(element); 3286 ElementVector* pe =new ElementVector(pe1,pe2,pe3); 3287 3288 /*clean-up and return*/ 3289 delete pe1; 3290 delete pe2; 3291 delete pe3; 3292 return pe; 3293 }/*}}}*/ 3294 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingHOFS(Element* element){/*{{{*/ 3295 3296 /*compute all load vectors for this element*/ 3297 ElementVector* pe1=CreatePVectorCouplingHOFSViscous(element); 3298 ElementVector* pe2=CreatePVectorCouplingHOFSFriction(element); 3299 ElementVector* pe =new ElementVector(pe1,pe2); 3300 3301 /*clean-up and return*/ 3302 delete pe1; 3303 delete pe2; 3304 return pe; 3305 }/*}}}*/ 3306 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingHOFSFriction(Element* element){/*{{{*/ 3307 3308 /*Intermediaries*/ 3309 int i,j,approximation; 3310 IssmDouble Jdet,Jdet2d,FSreconditioning; 3311 IssmDouble bed_normal[3]; 3312 IssmDouble viscosity, w, alpha2_gauss; 3313 IssmDouble dw[3]; 3314 IssmDouble *xyz_list_tria = NULL; 3315 IssmDouble *xyz_list = NULL; 3316 IssmDouble basis[6]; //for the six nodes of the penta 3317 3318 /*Initialize Element vector and return if necessary*/ 3319 if(!element->IsOnBed() || element->IsFloating()) return NULL; 3320 element->GetInputValue(&approximation,ApproximationEnum); 3321 if(approximation!=HOFSApproximationEnum) return NULL; 3322 3323 int vnumnodes = element->GetNumberOfNodesVelocity(); 3324 int pnumnodes = element->GetNumberOfNodesPressure(); 3325 int numnodes = vnumnodes+pnumnodes; 3326 3327 /*Prepare coordinate system list*/ 3328 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3329 Node **node_list = xNew<Node*>(vnumnodes+pnumnodes); 3330 for(i=0;i<vnumnodes;i++){ 3331 cs_list[i] = XYZEnum; 3332 node_list[i] = element->GetNode(i); 3333 } 3334 for(i=0;i<pnumnodes;i++){ 3335 cs_list[vnumnodes+i] = PressureEnum; 3336 node_list[vnumnodes+i] = element->GetNode(vnumnodes+i); 3337 } 3338 3339 ElementVector* pe=element->NewElementVector(FSvelocityEnum); 3340 3341 /*Retrieve all inputs and parameters*/ 3342 element->GetVerticesCoordinates(&xyz_list); 3343 element->GetVerticesCoordinatesBase(&xyz_list_tria); 3344 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3345 Input* vx_input= element->GetInput(VxEnum); _assert_(vx_input); 3346 Input* vy_input= element->GetInput(VyEnum); _assert_(vy_input); 3347 Input* vz_input= element->GetInput(VzEnum); _assert_(vz_input); 3348 Input* vzHO_input=element->GetInput(VzHOEnum); _assert_(vzHO_input); 3349 3350 /*build friction object, used later on: */ 3351 Friction* friction=new Friction(element,3); 3352 3353 /* Start looping on the number of gauss 2d (nodes on the bedrock) */ 3354 Gauss* gauss=element->NewGaussBase(2); 3355 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3356 3357 gauss->GaussPoint(ig); 3358 3359 element->JacobianDeterminantBase(&Jdet2d,xyz_list_tria,gauss); 3360 element->NodalFunctionsP1(basis, gauss); 3361 3362 vzHO_input->GetInputValue(&w, gauss); 3363 vzHO_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss); 3364 3365 element->NormalBase(&bed_normal[0],xyz_list_tria); 3366 element->ViscosityFS(&viscosity,xyz_list,gauss,vx_input,vy_input,vz_input); 3367 friction->GetAlpha2(&alpha2_gauss, gauss,vx_input,vy_input,vz_input); 3368 3369 for(i=0;i<3;i++){ 3370 pe->values[i*3+0]+=Jdet2d*gauss->weight*(alpha2_gauss*w*bed_normal[0]*bed_normal[2]+2*viscosity*dw[2]*bed_normal[0])*basis[i]; 3371 pe->values[i*3+1]+=Jdet2d*gauss->weight*(alpha2_gauss*w*bed_normal[1]*bed_normal[2]+2*viscosity*dw[2]*bed_normal[1])*basis[i]; 3372 pe->values[i*3+2]+=Jdet2d*gauss->weight*2*viscosity*(dw[0]*bed_normal[0]+dw[1]*bed_normal[1]+dw[2]*bed_normal[2])*basis[i]; 3373 } 3374 } 3375 3376 /*Transform coordinate system*/ 3377 element->TransformLoadVectorCoord(pe,node_list,vnumnodes+pnumnodes,cs_list); 3378 3379 pe->Echo(); 3380 element->CreatePVector(); 3381 /*Clean up and return*/ 3382 xDelete<int>(cs_list); 3383 xDelete<Node*>(node_list); 3384 xDelete<IssmDouble>(xyz_list); 3385 xDelete<IssmDouble>(xyz_list_tria); 3386 delete gauss; 3387 delete friction; 3388 return pe; 3389 }/*}}}*/ 3390 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingHOFSViscous(Element* element){/*{{{*/ 3391 3392 /*Intermediaries */ 3393 int i,approximation; 3394 IssmDouble viscosity,Jdet,FSreconditioning; 3395 IssmDouble dw[3]; 3396 IssmDouble *xyz_list = NULL; 3397 IssmDouble basis[6]; //for the six nodes of the penta 3398 IssmDouble dbasis[3][6]; //for the six nodes of the penta 3399 3400 /*Initialize Element vector and return if necessary*/ 3401 element->GetInputValue(&approximation,ApproximationEnum); 3402 if(approximation!=HOFSApproximationEnum) return NULL; 3403 int vnumnodes = element->GetNumberOfNodesVelocity(); 3404 int pnumnodes = element->GetNumberOfNodesPressure(); 3405 3406 /*Prepare coordinate system list*/ 3407 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3408 Node **node_list = xNew<Node*>(vnumnodes+pnumnodes); 3409 for(i=0;i<vnumnodes;i++){ 3410 cs_list[i] = XYZEnum; 3411 node_list[i] = element->GetNode(i); 3412 } 3413 for(i=0;i<pnumnodes;i++){ 3414 cs_list[vnumnodes+i] = PressureEnum; 3415 node_list[vnumnodes+i] = element->GetNode(vnumnodes+i); 3416 } 3417 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 3418 3419 /*Retrieve all inputs and parameters*/ 3420 element->GetVerticesCoordinates(&xyz_list); 3421 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3422 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 3423 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input); 3424 Input* vz_input =element->GetInput(VzEnum); _assert_(vz_input); 3425 Input* vzHO_input=element->GetInput(VzHOEnum); _assert_(vzHO_input); 3426 3427 /* Start looping on the number of gaussian points: */ 3428 Gauss* gauss=element->NewGauss(5); 3429 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3430 3431 gauss->GaussPoint(ig); 3432 3433 element->JacobianDeterminant(&Jdet, xyz_list,gauss); 3434 element->NodalFunctionsP1(&basis[0],gauss); 3435 element->NodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list,gauss); 3436 3437 element->ViscosityFS(&viscosity,xyz_list,gauss,vx_input,vy_input,vz_input); 3438 vzHO_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss); 3439 3440 for(i=0;i<vnumnodes;i++){ 3441 pe->values[i*3+0]+=-Jdet*gauss->weight*viscosity*dw[0]*dbasis[2][i]; 3442 pe->values[i*3+1]+=-Jdet*gauss->weight*viscosity*dw[1]*dbasis[2][i]; 3443 pe->values[i*3+2]+=-Jdet*gauss->weight*viscosity*(dw[0]*dbasis[0][i]+dw[1]*dbasis[1][i]+2*dw[2]*dbasis[2][i]); 3444 pe->values[3*vnumnodes+i]+=Jdet*gauss->weight*FSreconditioning*dw[2]*basis[i]; 3445 } 3446 } 3447 3448 /*Transform coordinate system*/ 3449 element->TransformLoadVectorCoord(pe,node_list,vnumnodes+pnumnodes,cs_list); 3450 3451 /*Clean up and return*/ 3452 xDelete<int>(cs_list); 3453 xDelete<Node*>(node_list); 3454 xDelete<IssmDouble>(xyz_list); 3455 delete gauss; 3456 return pe; 3457 }/*}}}*/ 3458 3267 3459 void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 3268 3460 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2. -
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h ¶
r16907 r16926 76 76 ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element); 77 77 ElementVector* CreatePVectorSSAHO(Element* element); 78 ElementVector* CreatePVectorHOFS(Element* element); 79 ElementVector* CreatePVectorCouplingHOFS(Element* element); 80 ElementVector* CreatePVectorCouplingHOFSFriction(Element* element); 81 ElementVector* CreatePVectorCouplingHOFSViscous(Element* element); 78 82 void GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 79 83 void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.cpp ¶
r16922 r16926 314 314 ::TransformSolutionCoord(values,this->nodes,numnodes,transformenum_list); 315 315 }/*}}}*/ 316 void Element::TransformLoadVectorCoord(ElementVector* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/ 317 ::TransformLoadVectorCoord(Ke,nodes_list,numnodes,transformenum_list); 318 }/*}}}*/ 316 319 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/ 317 320 ::TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.h ¶
r16922 r16926 77 77 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");}; /*Tiling only*/ 78 78 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");}; /*Tiling only*/ 79 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes_list,int numnodes,int* transformenum_list); 79 80 void TransformSolutionCoord(IssmDouble* values,int transformenum); 80 81 void TransformSolutionCoord(IssmDouble* values,int* transformenum_list); … … 106 107 virtual IssmDouble MinEdgeLength(IssmDouble* xyz_list)=0; 107 108 virtual void NodalFunctions(IssmDouble* basis,Gauss* gauss)=0; 109 virtual void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss)=0; 108 110 virtual void NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss)=0; 109 111 virtual void NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss)=0; 110 112 virtual void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0; 113 virtual void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0; 111 114 virtual void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0; 112 115 virtual void NormalSection(IssmDouble* normal,IssmDouble* xyz_list)=0; … … 193 196 virtual void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0; 194 197 virtual void ResetCoordinateSystem()=0; 198 virtual void SetTemporaryElementType(int element_type_in)=0; 195 199 virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0; 196 200 virtual void ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss)=0; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.cpp ¶
r16921 r16926 2506 2506 } 2507 2507 /*}}}*/ 2508 /*FUNCTION Penta::NodalFunctionsP1{{{*/ 2509 void Penta::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){ 2510 2511 _assert_(gauss->Enum()==GaussPentaEnum); 2512 this->GetNodalFunctionsP1(basis,(GaussPenta*)gauss); 2513 2514 } 2515 /*}}}*/ 2508 2516 /*FUNCTION Penta::NodalFunctionsDerivatives{{{*/ 2509 2517 void Penta::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){ … … 2511 2519 _assert_(gauss->Enum()==GaussPentaEnum); 2512 2520 this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss); 2521 2522 } 2523 /*}}}*/ 2524 /*FUNCTION Penta::NodalFunctionsP1Derivatives{{{*/ 2525 void Penta::NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){ 2526 2527 _assert_(gauss->Enum()==GaussPentaEnum); 2528 this->GetNodalFunctionsP1Derivatives(dbasis,xyz_list,(GaussPenta*)gauss); 2513 2529 2514 2530 } … … 2847 2863 if (this->hnodes[analysis_counter]) this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp(); 2848 2864 else this->nodes=NULL; 2865 } 2866 /*}}}*/ 2867 /*FUNCTION Penta::SetTemporaryElementType{{{*/ 2868 void Penta::SetTemporaryElementType(int element_type_in){ 2869 this->element_type=element_type_in; 2849 2870 } 2850 2871 /*}}}*/ … … 8234 8255 ::TransformLoadVectorCoord(pe,nodes,vnumnodes+pnumnodes,cs_list); 8235 8256 8257 pe->Echo(); 8258 _error_("stop"); 8236 8259 /*Clean up and return*/ 8237 8260 xDelete<int>(cs_list); … … 8396 8419 /*compute all load vectors for this element*/ 8397 8420 int init = this->element_type; 8421 printf("init init %i\n",init); 8398 8422 this->element_type=P1Enum; 8399 8423 ElementVector* pe1=CreatePVectorStressbalanceHO(); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.h ¶
r16916 r16926 115 115 void ResetCoordinateSystem(void); 116 116 void SmbGradients(); 117 void SetTemporaryElementType(int element_type_in); 117 118 Element* SpawnBasalElement(void); 118 119 IssmDouble SurfaceArea(void); … … 257 258 ElementMatrix* NewElementMatrix(int approximation_enum); 258 259 void NodalFunctions(IssmDouble* basis,Gauss* gauss); 260 void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss); 259 261 void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 262 void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 260 263 void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 261 264 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h ¶
r16916 r16926 108 108 IssmDouble MinEdgeLength(IssmDouble* xyz_list){_error_("not implemented yet");}; 109 109 void NodalFunctions(IssmDouble* basis,Gauss* gauss); 110 void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 110 111 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 111 112 void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 112 113 void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 114 void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");}; 113 115 void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");}; 114 116 bool NoIceInElement(){_error_("not implemented yet");}; … … 181 183 void ResetCoordinateSystem(void){_error_("not implemented yet");}; 182 184 void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){_error_("not implemented yet");}; 185 void SetTemporaryElementType(int element_type_in){_error_("not implemented yet");}; 183 186 void SmbGradients(){_error_("not implemented yet");}; 184 187 IssmDouble SurfaceArea(void){_error_("not implemented yet");}; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h ¶
r16916 r16926 288 288 ElementMatrix* NewElementMatrix(int approximation_enum); 289 289 void NodalFunctions(IssmDouble* basis,Gauss* gauss); 290 void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 290 291 void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 292 void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");}; 291 293 void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss); 292 294 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss); 293 295 void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss); 294 296 void SetClone(int* minranks); 297 void SetTemporaryElementType(int element_type_in){_error_("not implemented yet");}; 295 298 Seg* SpawnSeg(int index1,int index2); 296 299 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
Note:
See TracChangeset
for help on using the changeset viewer.