Changeset 16940
- Timestamp:
- 11/25/13 20:06:23 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16936 r16940 855 855 case HOFSApproximationEnum: 856 856 return CreatePVectorHOFS(element); 857 case SSAFSApproximationEnum: 858 return CreatePVectorSSAFS(element); 857 859 case NoneApproximationEnum: 858 860 return NULL; … … 3356 3358 return pe; 3357 3359 }/*}}}*/ 3360 ElementVector* StressbalanceAnalysis::CreatePVectorSSAFS(Element* element){/*{{{*/ 3361 3362 /*compute all load vectors for this element*/ 3363 int init = element->FiniteElement(); 3364 element->SetTemporaryElementType(P1Enum); // P1 needed for HO 3365 ElementVector* pe1=CreatePVectorSSA(element); 3366 element->SetTemporaryElementType(init); // P1 needed for HO 3367 ElementVector* pe2=CreatePVectorFS(element); 3368 int indices[3]={18,19,20}; 3369 element->SetTemporaryElementType(MINIcondensedEnum); // P1 needed for HO 3370 ElementMatrix* Ke = CreateKMatrixFS(element); 3371 element->SetTemporaryElementType(init); // P1 needed for HO 3372 pe2->StaticCondensation(Ke,3,&indices[0]); 3373 delete Ke; 3374 ElementVector* pe3=CreatePVectorCouplingSSAFS(element); 3375 ElementVector* pe =new ElementVector(pe1,pe2,pe3); 3376 3377 /*clean-up and return*/ 3378 delete pe1; 3379 delete pe2; 3380 delete pe3; 3381 return pe; 3382 }/*}}}*/ 3358 3383 ElementVector* StressbalanceAnalysis::CreatePVectorHOFS(Element* element){/*{{{*/ 3359 3384 … … 3543 3568 return pe; 3544 3569 }/*}}}*/ 3570 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingSSAFS(Element* element){/*{{{*/ 3571 3572 /*compute all load vectors for this element*/ 3573 ElementVector* pe1=CreatePVectorCouplingSSAFSViscous(element); 3574 ElementVector* pe2=CreatePVectorCouplingSSAFSFriction(element); 3575 ElementVector* pe =new ElementVector(pe1,pe2); 3576 3577 /*clean-up and return*/ 3578 delete pe1; 3579 delete pe2; 3580 return pe; 3581 }/*}}}*/ 3582 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingSSAFSFriction(Element* element){/*{{{*/ 3583 3584 /*Intermediaries*/ 3585 int i,j,approximation; 3586 int dim=3; 3587 IssmDouble Jdet,Jdet2d,FSreconditioning; 3588 IssmDouble bed_normal[3]; 3589 IssmDouble viscosity, w, alpha2_gauss; 3590 IssmDouble dw[3]; 3591 IssmDouble basis[6]; //for the six nodes of the penta 3592 IssmDouble *xyz_list_tria = NULL; 3593 IssmDouble *xyz_list = NULL; 3594 3595 /*Initialize Element vector and return if necessary*/ 3596 if(!element->IsOnBed() || element->IsFloating()) return NULL; 3597 element->GetInputValue(&approximation,ApproximationEnum); 3598 if(approximation!=SSAFSApproximationEnum) return NULL; 3599 int vnumnodes = element->GetNumberOfNodesVelocity(); 3600 int pnumnodes = element->GetNumberOfNodesPressure(); 3601 3602 /*Prepare coordinate system list*/ 3603 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3604 Node **node_list = xNew<Node*>(vnumnodes+pnumnodes); 3605 for(i=0;i<vnumnodes;i++){ 3606 cs_list[i] = XYZEnum; 3607 node_list[i] = element->GetNode(i); 3608 } 3609 for(i=0;i<pnumnodes;i++){ 3610 cs_list[vnumnodes+i] = PressureEnum; 3611 node_list[vnumnodes+i] = element->GetNode(vnumnodes+i); 3612 } 3613 ElementVector* pe=element->NewElementVector(FSvelocityEnum); 3614 3615 /*Retrieve all inputs and parameters*/ 3616 element->GetVerticesCoordinates(&xyz_list); 3617 element->GetVerticesCoordinatesBase(&xyz_list_tria); 3618 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3619 Input* vx_input= element->GetInput(VxEnum); _assert_(vx_input); 3620 Input* vy_input= element->GetInput(VyEnum); _assert_(vy_input); 3621 Input* vz_input= element->GetInput(VzEnum); _assert_(vz_input); 3622 Input* vzSSA_input=element->GetInput(VzSSAEnum); _assert_(vzSSA_input); 3623 3624 /*build friction object, used later on: */ 3625 Friction* friction=new Friction(element,3); 3626 3627 /* Start looping on the number of gauss 2d (nodes on the bedrock) */ 3628 Gauss* gauss=element->NewGaussBase(2); 3629 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3630 3631 gauss->GaussPoint(ig); 3632 3633 element->JacobianDeterminantBase(&Jdet2d,xyz_list_tria,gauss); 3634 element->NodalFunctionsP1(basis, gauss); 3635 3636 vzSSA_input->GetInputValue(&w, gauss); 3637 vzSSA_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss); 3638 3639 element->NormalBase(&bed_normal[0],xyz_list_tria); 3640 element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 3641 friction->GetAlpha2(&alpha2_gauss, gauss,vx_input,vy_input,vz_input); 3642 3643 for(i=0;i<3;i++){ 3644 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]; 3645 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]; 3646 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]; 3647 } 3648 } 3649 3650 /*Transform coordinate system*/ 3651 element->TransformLoadVectorCoord(pe,node_list,vnumnodes+pnumnodes,cs_list); 3652 3653 /*Clean up and return*/ 3654 xDelete<int>(cs_list); 3655 xDelete<IssmDouble>(xyz_list); 3656 xDelete<IssmDouble>(xyz_list_tria); 3657 xDelete<Node*>(node_list); 3658 delete gauss; 3659 delete friction; 3660 return pe; 3661 }/*}}}*/ 3662 ElementVector* StressbalanceAnalysis::CreatePVectorCouplingSSAFSViscous(Element* element){/*{{{*/ 3663 3664 /*Intermediaries */ 3665 int i,approximation; 3666 IssmDouble viscosity,Jdet,FSreconditioning; 3667 IssmDouble dw[3]; 3668 IssmDouble *xyz_list = NULL; 3669 IssmDouble basis[6]; //for the six nodes of the penta 3670 IssmDouble dbasis[3][6]; //for the six nodes of the penta 3671 3672 /*Initialize Element vector and return if necessary*/ 3673 element->GetInputValue(&approximation,ApproximationEnum); 3674 if(approximation!=SSAFSApproximationEnum) return NULL; 3675 int vnumnodes = element->GetNumberOfNodesVelocity(); 3676 int pnumnodes = element->GetNumberOfNodesPressure(); 3677 3678 /*Prepare coordinate system list*/ 3679 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3680 Node **node_list = xNew<Node*>(vnumnodes+pnumnodes); 3681 for(i=0;i<vnumnodes;i++){ 3682 cs_list[i] = XYZEnum; 3683 node_list[i] = element->GetNode(i); 3684 } 3685 for(i=0;i<pnumnodes;i++){ 3686 cs_list[vnumnodes+i] = PressureEnum; 3687 node_list[vnumnodes+i] = element->GetNode(vnumnodes+i); 3688 } 3689 ElementVector* pe=element->NewElementVector(FSvelocityEnum); 3690 3691 /*Retrieve all inputs and parameters*/ 3692 element->GetVerticesCoordinates(&xyz_list); 3693 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3694 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 3695 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input); 3696 Input* vz_input =element->GetInput(VzEnum); _assert_(vz_input); 3697 Input* vzSSA_input=element->GetInput(VzSSAEnum); _assert_(vzSSA_input); 3698 3699 /* Start looping on the number of gaussian points: */ 3700 Gauss* gauss=element->NewGauss(5); 3701 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3702 3703 gauss->GaussPoint(ig); 3704 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 3705 element->NodalFunctionsP1(&basis[0], gauss); 3706 element->NodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss); 3707 3708 vzSSA_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss); 3709 element->ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input); 3710 3711 for(i=0;i<6;i++){ 3712 pe->values[i*3+0]+=-Jdet*gauss->weight*viscosity*dw[0]*dbasis[2][i]; 3713 pe->values[i*3+1]+=-Jdet*gauss->weight*viscosity*dw[1]*dbasis[2][i]; 3714 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]); 3715 pe->values[3*vnumnodes+i]+=Jdet*gauss->weight*FSreconditioning*dw[2]*basis[i]; 3716 } 3717 } 3718 3719 /*Transform coordinate system*/ 3720 element->TransformLoadVectorCoord(pe,node_list,vnumnodes+pnumnodes,cs_list); 3721 3722 /*Clean up and return*/ 3723 xDelete<int>(cs_list); 3724 delete gauss; 3725 return pe; 3726 }/*}}}*/ 3545 3727 void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 3546 3728 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2. -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r16936 r16940 78 78 ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element); 79 79 ElementVector* CreatePVectorSSAHO(Element* element); 80 ElementVector* CreatePVectorSSAFS(Element* element); 81 ElementVector* CreatePVectorCouplingSSAFS(Element* element); 82 ElementVector* CreatePVectorCouplingSSAFSFriction(Element* element); 83 ElementVector* CreatePVectorCouplingSSAFSViscous(Element* element); 80 84 ElementVector* CreatePVectorHOFS(Element* element); 81 85 ElementVector* CreatePVectorCouplingHOFS(Element* element);
Note:
See TracChangeset
for help on using the changeset viewer.