Changeset 16907


Ignore:
Timestamp:
11/23/13 19:32:10 (11 years ago)
Author:
seroussi
Message:

CHG: moving coupling SSAHO in analysis

Location:
issm/trunk-jpl/src/c
Files:
7 edited

Legend:

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

    r16906 r16907  
    826826                case FSApproximationEnum:
    827827                        return CreateKMatrixFS(element);
     828                case SSAHOApproximationEnum:
     829                        return CreateKMatrixSSAHO(element);
    828830                case NoneApproximationEnum:
    829831                        return NULL;
     
    847849                case FSApproximationEnum:
    848850                        return CreatePVectorFS(element);
     851                case SSAHOApproximationEnum:
     852                        return CreatePVectorSSAHO(element);
    849853                case NoneApproximationEnum:
    850854                        return NULL;
     
    30593063
    30603064/*Coupling (Tiling)*/
     3065ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAHO(Element* element){/*{{{*/
     3066
     3067        /*compute all stiffness matrices for this element*/
     3068        ElementMatrix* Ke1=CreateKMatrixSSA(element);
     3069        ElementMatrix* Ke2=CreateKMatrixHO(element);
     3070        ElementMatrix* Ke3=CreateKMatrixCouplingSSAHO(element);
     3071        ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
     3072
     3073        /*clean-up and return*/
     3074        delete Ke1;
     3075        delete Ke2;
     3076        delete Ke3;
     3077        return Ke;
     3078}/*}}}*/
     3079ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHO(Element* element){/*{{{*/
     3080
     3081        /*compute all stiffness matrices for this element*/
     3082        ElementMatrix* Ke1=CreateKMatrixCouplingSSAHOViscous(element);
     3083        ElementMatrix* Ke2=CreateKMatrixCouplingSSAHOFriction(element);
     3084        ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
     3085
     3086        /*clean-up and return*/
     3087        delete Ke1;
     3088        delete Ke2;
     3089        return Ke;
     3090}/*}}}*/
     3091ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/
     3092        return NULL;
     3093
     3094}/*}}}*/
     3095ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/
     3096
     3097        /*Constants*/
     3098        int numnodes = 2*element->GetNumberOfNodes();
     3099        int numdofm     = 1 *numnodes; //*2/2
     3100        int numdofp     = 2 *numnodes;
     3101        int numdoftotal = 2 *2 *numnodes;//2 dof per nodes and 2 sets of nodes for HO and SSA
     3102
     3103        /*Intermediaries */
     3104        int         i,j;
     3105        IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
     3106        IssmDouble  *xyz_list      = NULL;
     3107        IssmDouble* B              = xNew<IssmDouble>(3*numdofp);
     3108        IssmDouble* Bprime         = xNew<IssmDouble>(3*numdofm);
     3109        IssmDouble  D[3][3]={0.0}; // material matrix, simple scalar matrix.
     3110        IssmDouble  D_scalar;
     3111        IssmDouble* Ke_gg          = xNewZeroInit<IssmDouble>(numdofp*numdofm);
     3112        IssmDouble* Ke_gg_gaussian = xNew<IssmDouble>(numdofp*numdofm);
     3113        Node        *node_list[numnodes];
     3114        int         cs_list[numnodes];
     3115
     3116        /*Find penta on bed as HO must be coupled to the dofs on the bed: */
     3117        Element* pentabase=element->GetBasalElement();
     3118        Element* basaltria=pentabase->SpawnBasalElement();
     3119
     3120        /*prepare node list*/
     3121        for(i=0;i<numnodes;i++){
     3122                node_list[i+0*numnodes] = pentabase->GetNode(i);
     3123                node_list[i+1*numnodes] = element  ->GetNode(i);
     3124                cs_list[i+0*numnodes] = XYEnum;
     3125                cs_list[i+1*numnodes] = XYEnum;
     3126        }
     3127
     3128        /*Initialize Element matrix*/
     3129        ElementMatrix* Ke1= pentabase->NewElementMatrix(SSAApproximationEnum);
     3130        ElementMatrix* Ke2= element  ->NewElementMatrix(HOApproximationEnum);
     3131        ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
     3132        delete Ke1; delete Ke2;
     3133
     3134        /* Get node coordinates and dof list: */
     3135        element->GetVerticesCoordinates(&xyz_list);
     3136        element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
     3137        Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
     3138        Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
     3139        Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
     3140        Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
     3141
     3142        /* Start  looping on the number of gaussian points: */
     3143        Gauss* gauss=element->NewGauss(5);
     3144        Gauss* gauss_tria=new GaussTria();
     3145        for(int ig=gauss->begin();ig<gauss->end();ig++){
     3146
     3147                gauss->GaussPoint(ig);
     3148                gauss->SynchronizeGaussBase(gauss_tria);
     3149
     3150                element->JacobianDeterminant(&Jdet, xyz_list,gauss);
     3151                this->GetBSSAHO(B, element,xyz_list, gauss);
     3152                //basaltria->GetBprimeSSA(Bprime, xyz_list, gauss_tria); /FIXME
     3153                this->GetBSSAprime(Bprime, basaltria,xyz_list, gauss_tria);
     3154                element->ViscosityHO(&viscosity,xyz_list,gauss,vx_input,vy_input);
     3155                element->ViscosityHO(&oldviscosity,xyz_list,gauss,vxold_input,vyold_input);
     3156
     3157                newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
     3158                D_scalar=2*newviscosity*gauss->weight*Jdet;
     3159                for (i=0;i<3;i++) D[i][i]=D_scalar;
     3160
     3161                TripleMultiply( B,3,numdofp,1,
     3162                                        &D[0][0],3,3,0,
     3163                                        Bprime,3,numdofm,0,
     3164                                        Ke_gg_gaussian,0);
     3165
     3166                for( i=0; i<numdofp; i++) for(j=0;j<numdofm; j++) Ke_gg[i*numdofp+j]+=Ke_gg_gaussian[i*numdofp+j];
     3167        }
     3168        for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofp+j];
     3169        for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofp+i];
     3170
     3171        /*Transform Coordinate System*/
     3172        element->TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
     3173
     3174        /*Clean-up and return*/
     3175        basaltria->DeleteMaterials(); delete basaltria;
     3176        delete gauss;
     3177        delete gauss_tria;
     3178        return Ke;
     3179
     3180}/*}}}*/
     3181ElementVector* StressbalanceAnalysis::CreatePVectorSSAHO(Element* element){/*{{{*/
     3182
     3183        /*compute all load vectors for this element*/
     3184        ElementVector* pe1=CreatePVectorSSA(element);
     3185        ElementVector* pe2=CreatePVectorHO(element);
     3186        ElementVector* pe =new ElementVector(pe1,pe2);
     3187
     3188        /*clean-up and return*/
     3189        delete pe1;
     3190        delete pe2;
     3191        return pe;
     3192}/*}}}*/
     3193void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     3194        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2.
     3195         * For node i, Bi can be expressed in the actual coordinate system
     3196         * by:
     3197         *       Bi=[ dh/dx          0      ]
     3198         *          [   0           dh/dy   ]
     3199         *          [ 1/2*dh/dy  1/2*dh/dx  ]
     3200         * where h is the interpolation function for node i.
     3201         *
     3202         * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
     3203         */
     3204
     3205        int numnodes = element->GetNumberOfNodes();
     3206        IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
     3207
     3208        /*Get dbasis in actual coordinate system: */
     3209        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     3210
     3211        /*Build B: */
     3212        for(int i=0;i<numnodes;i++){
     3213                B[2*numnodes*0+2*i+0] = dbasis[0*3+i];
     3214                B[2*numnodes*0+2*i+1] = 0.;
     3215                B[2*numnodes*1+2*i+0] = 0.;
     3216                B[2*numnodes*1+2*i+1] = dbasis[1*3+i];
     3217                B[2*numnodes*2+2*i+0] = .5*dbasis[1*3+i];
     3218                B[2*numnodes*2+2*i+1] = .5*dbasis[0*3+i];
     3219        }
     3220
     3221        /*Clean-up*/
     3222        xDelete<IssmDouble>(dbasis);
     3223}/*}}}*/
    30613224void StressbalanceAnalysis::InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element){/*{{{*/
    30623225
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r16892 r16907  
    7171                void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
    7272                /*Coupling*/
     73                ElementMatrix* CreateKMatrixSSAHO(Element* element);
     74                ElementMatrix* CreateKMatrixCouplingSSAHO(Element* element);
     75                ElementMatrix* CreateKMatrixCouplingSSAHOFriction(Element* element);
     76                ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element);
     77                ElementVector* CreatePVectorSSAHO(Element* element);
     78                void GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    7379                void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element);
    7480                void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element);
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r16892 r16907  
    8484                virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum)=0;
    8585                virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list)=0;
     86                virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list)=0;
    8687                virtual Element* GetBasalElement(void)=0;
    8788                virtual void    GetDofList(int** pdoflist,int approximation_enum,int setenum)=0;
     
    120121                virtual void   GetInputValue(IssmDouble* pvalue,int enum_type)=0;
    121122                virtual void   GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type)=0;
     123                virtual Node*  GetNode(int node_number)=0;
    122124                virtual void   GetVerticesCoordinates(IssmDouble** xyz_list)=0;
    123125                virtual void   GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
  • issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r16899 r16907  
    13261326}
    13271327/*}}}*/
     1328/*FUNCTION Penta::GetNode(int node_number) {{{*/
     1329Node* Penta::GetNode(int node_number){
     1330        return this->nodes[node_number];
     1331}
     1332/*}}}*/
    13281333/*FUNCTION Penta::GetMaterialInput(int inputenum) {{{*/
    13291334Input* Penta::GetMaterialInput(int inputenum){
     
    32293234
    32303235        ::TransformStiffnessMatrixCoord(Ke,this->nodes,this->NumberofNodes(),transformenum_list);
     3236
     3237}
     3238/*}}}*/
     3239/*FUNCTION Penta::TransformStiffnessMatrixCoord(ElementMatrix* pe,Node** nodes_list,int numnodesint* transformenum_list){{{*/
     3240void Penta::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){
     3241
     3242        ::TransformStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list);
    32313243
    32323244}
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r16892 r16907  
    244244                void           GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
    245245                void           GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype);
     246                Node*          GetNode(int node_number);
    246247                void             GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity);
    247248                void           GetStrainRate3dHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss, Input* vx_input, Input* vy_input);
     
    295296                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
    296297                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
     298                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list);
    297299                void           ViscosityFS(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
    298300                void           ViscosityHO(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r16892 r16907  
    155155                void        GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type){_error_("not implemented yet");};
    156156                void        GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");};
     157                Node*       GetNode(int node_number){_error_("Not implemented");};
    157158                IssmDouble  GetYcoord(Gauss* gauss){_error_("Not implemented");};
    158159                IssmDouble  GetZcoord(Gauss* gauss){_error_("not implemented yet");};
     
    226227                void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
    227228                void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
     229                void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){_error_("not implemented yet");};
    228230                void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
    229231                void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r16892 r16907  
    286286                void           GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
    287287                void           GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype);
     288                Node*          GetNode(int node_number){_error_("not implemented yet");};
    288289                void             InputChangeName(int enum_type,int enum_type_old);
    289290                void             InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type);
     
    326327                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
    327328                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
     329                void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){_error_("not implemented yet");};
    328330                void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
    329331                void           ViscosityFS(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
Note: See TracChangeset for help on using the changeset viewer.