Changeset 16940


Ignore:
Timestamp:
11/25/13 20:06:23 (11 years ago)
Author:
seroussi
Message:

CHG: Added Pvector coupling SSAFS viscous and friction

Location:
issm/trunk-jpl/src/c/analyses
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r16936 r16940  
    855855                case HOFSApproximationEnum:
    856856                        return CreatePVectorHOFS(element);
     857                case SSAFSApproximationEnum:
     858                        return CreatePVectorSSAFS(element);
    857859                case NoneApproximationEnum:
    858860                        return NULL;
     
    33563358        return pe;
    33573359}/*}}}*/
     3360ElementVector* 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}/*}}}*/
    33583383ElementVector* StressbalanceAnalysis::CreatePVectorHOFS(Element* element){/*{{{*/
    33593384
     
    35433568        return pe;
    35443569}/*}}}*/
     3570ElementVector* 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}/*}}}*/
     3582ElementVector* 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}/*}}}*/
     3662ElementVector* 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}/*}}}*/
    35453727void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    35463728        /*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  
    7878                ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element);
    7979                ElementVector* CreatePVectorSSAHO(Element* element);
     80                ElementVector* CreatePVectorSSAFS(Element* element);
     81                ElementVector* CreatePVectorCouplingSSAFS(Element* element);
     82                ElementVector* CreatePVectorCouplingSSAFSFriction(Element* element);
     83                ElementVector* CreatePVectorCouplingSSAFSViscous(Element* element);
    8084                ElementVector* CreatePVectorHOFS(Element* element);
    8185                ElementVector* CreatePVectorCouplingHOFS(Element* element);
Note: See TracChangeset for help on using the changeset viewer.