Changeset 16803


Ignore:
Timestamp:
11/16/13 13:36:32 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: done with SSA 3d

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

Legend:

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

    r16801 r16803  
    818818ElementVector* StressbalanceAnalysis::CreatePVectorSSA(Element* element){/*{{{*/
    819819
     820        /*Intermediaries*/
     821        int      meshtype;
     822        Element* basalelement;
     823
     824        /*Get basal element*/
     825        element->FindParam(&meshtype,MeshTypeEnum);
     826        switch(meshtype){
     827                case Mesh2DhorizontalEnum:
     828                        basalelement = element;
     829                        break;
     830                case Mesh3DEnum:
     831                        if(!element->IsOnBed()) return NULL;
     832                        basalelement = element->SpawnBasalElement();
     833                        break;
     834                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     835        }
     836
    820837        /*compute all load vectors for this element*/
    821         ElementVector* pe1=CreatePVectorSSADrivingStress(element);
    822         ElementVector* pe2=CreatePVectorSSAFront(element);
     838        ElementVector* pe1=CreatePVectorSSADrivingStress(basalelement);
     839        ElementVector* pe2=CreatePVectorSSAFront(basalelement);
    823840        ElementVector* pe =new ElementVector(pe1,pe2);
    824841
    825842        /*clean-up and return*/
     843        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    826844        delete pe1;
    827845        delete pe2;
     
    834852        IssmDouble  driving_stress_baseline,thickness;
    835853        IssmDouble  Jdet;
    836         IssmDouble* xyz_list=NULL;
    837854        IssmDouble  slope[2];
     855        IssmDouble* xyz_list     = NULL;
    838856
    839857        /*Fetch number of nodes and dof for this finite element*/
     
    881899}/*}}}*/
    882900ElementVector* StressbalanceAnalysis::CreatePVectorSSAFront(Element* element){/*{{{*/
     901
    883902        return NULL;
    884903}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp

    r16782 r16803  
    100100}/*}}}*/
    101101ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/
    102 _error_("not implemented yet");
     102
     103        /*compute all load vectors for this element*/
     104        ElementVector* pe1=CreatePVectorVolume(element);
     105        ElementVector* pe2=CreatePVectorBase(element);
     106        ElementVector* pe =new ElementVector(pe1,pe2);
     107
     108        /*clean-up and return*/
     109        delete pe1;
     110        delete pe2;
     111        return pe;
     112}/*}}}*/
     113ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
     114
     115        /*Intermediaries*/
     116        int         approximation;
     117        IssmDouble  Jdet;
     118        IssmDouble  dudx,dvdy,dwdz;
     119        IssmDouble  du[3],dv[3],dw[3];
     120        IssmDouble* xyz_list = NULL;
     121
     122        /*Fetch number of nodes for this finite element*/
     123        int numnodes = element->GetNumberOfNodes();
     124
     125        /*Initialize Element vector and basis functions*/
     126        ElementVector* pe    = element->NewElementVector();
     127        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     128
     129        /*Retrieve all inputs and parameters*/
     130        element->GetVerticesCoordinates(&xyz_list);
     131        element->GetInputValue(&approximation,ApproximationEnum);
     132        Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
     133        Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
     134        Input* vzFS_input=NULL;
     135        if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     136                vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input);
     137        }
     138
     139        /* Start  looping on the number of gaussian points: */
     140        Gauss* gauss=element->NewGauss(2);
     141        for(int ig=gauss->begin();ig<gauss->end();ig++){
     142                gauss->GaussPoint(ig);
     143
     144                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     145                element->NodalFunctions(basis,gauss);
     146
     147                vx_input->GetInputDerivativeValue(&du[0],xyz_list,gauss);
     148                vy_input->GetInputDerivativeValue(&dv[0],xyz_list,gauss);
     149                if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     150                        vzFS_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss);
     151                        dwdz=dw[2];
     152                }
     153                else dwdz=0;
     154                dudx=du[0];
     155                dvdy=dv[1];
     156
     157                for(int i=0;i<numnodes;i++) pe->values[i] += (dudx+dvdy+dwdz)*Jdet*gauss->weight*basis[i];
     158        }
     159
     160        /*Clean up and return*/
     161        delete gauss;
     162        xDelete<IssmDouble>(basis);
     163        xDelete<IssmDouble>(xyz_list);
     164        return pe;
     165}/*}}}*/
     166ElementVector* StressbalanceVerticalAnalysis::CreatePVectorBase(Element* element){/*{{{*/
     167
     168        /*Intermediaries */
     169        int         i,j,approximation;
     170        IssmDouble *xyz_list      = NULL;
     171        IssmDouble *xyz_list_base = NULL;
     172        IssmDouble  Jdet;
     173        IssmDouble  vx,vy,vz,dbdx,dbdy,basalmeltingvalue;
     174        IssmDouble  slope[3];
     175
     176        if(!element->IsOnBed()) return NULL;
     177
     178        /*Fetch number of nodes for this finite element*/
     179        int numnodes = element->GetNumberOfNodes();
     180
     181        /*Initialize Element vector*/
     182        ElementVector* pe    = element->NewElementVector();
     183        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     184
     185        /*Retrieve all inputs and parameters*/
     186        element->GetVerticesCoordinates(&xyz_list);
     187        element->GetVerticesCoordinatesBase(&xyz_list_base);
     188        element->GetInputValue(&approximation,ApproximationEnum);
     189        Input* bed_input=element->GetInput(BedEnum);                                _assert_(bed_input);
     190        Input* basal_melting_input=element->GetInput(BasalforcingsMeltingRateEnum); _assert_(basal_melting_input);
     191        Input* vx_input=element->GetInput(VxEnum);                                  _assert_(vx_input);
     192        Input* vy_input=element->GetInput(VyEnum);                                  _assert_(vy_input);
     193        Input* vzFS_input=NULL;
     194        if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     195                vzFS_input=element->GetInput(VzFSEnum);       _assert_(vzFS_input);
     196        }
     197
     198        /* Start  looping on the number of gaussian points: */
     199        Gauss* gauss=element->NewGaussBase(2);
     200        for(int ig=gauss->begin();ig<gauss->end();ig++){
     201                gauss->GaussPoint(ig);
     202
     203                basal_melting_input->GetInputValue(&basalmeltingvalue,gauss);
     204                bed_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
     205                vx_input->GetInputValue(&vx,gauss);
     206                vy_input->GetInputValue(&vy,gauss);
     207                if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     208                        vzFS_input->GetInputValue(&vz,gauss);
     209                }
     210                else vz=0.;
     211
     212                dbdx=slope[0];
     213                dbdy=slope[1];
     214
     215                element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
     216                element->NodalFunctions(basis,gauss);
     217
     218                for(i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i];
     219        }
     220
     221        /*Clean up and return*/
     222        delete gauss;
     223        xDelete<IssmDouble>(basis);
     224        xDelete<IssmDouble>(xyz_list);
     225        xDelete<IssmDouble>(xyz_list_base);
     226        return pe;
     227
    103228}/*}}}*/
    104229void StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h

    r16782 r16803  
    2323                ElementMatrix* CreateKMatrix(Element* element);
    2424                ElementVector* CreatePVector(Element* element);
     25                ElementVector* CreatePVectorVolume(Element* element);
     26                ElementVector* CreatePVectorBase(Element* element);
    2527                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2628                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r16800 r16803  
    6767                virtual void    GetDofListPressure(int** pdoflist,int setenum)=0;
    6868                virtual void   JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
     69                virtual void   JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
    6970                virtual void   GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0;
    7071                virtual int    GetNodeIndex(Node* node)=0;
     
    9091                virtual void   GetInputValue(IssmDouble* pvalue,int enum_type)=0;
    9192                virtual void   GetVerticesCoordinates(IssmDouble** xyz_list)=0;
     93                virtual void   GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
    9294                virtual void   GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
    9395
     
    110112                virtual Gauss* NewGauss(void)=0;
    111113                virtual Gauss* NewGauss(int order)=0;
    112                 virtual ElementVector*  NewElementVector(int approximation_enum)=0;
     114                virtual Gauss* NewGaussBase(int order)=0;
     115                virtual ElementVector*  NewElementVector(int approximation_enum=NoneApproximationEnum)=0;
    113116                virtual void   InputScale(int enum_type,IssmDouble scale_factor)=0;
    114117                virtual void   GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum)=0;
  • issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r16802 r16803  
    14461446
    14471447}/*}}}*/
     1448/*FUNCTION Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){{{*/
     1449void Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){
     1450
     1451        IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3);
     1452        ::GetVerticesCoordinates(xyz_list,this->vertices,NUMVERTICES2D);
     1453
     1454        /*Assign output pointer*/
     1455        *pxyz_list = xyz_list;
     1456
     1457}/*}}}*/
    14481458/*FUNCTION Penta::GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype) {{{*/
    14491459void Penta::GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype){
     
    24322442}
    24332443/*}}}*/
     2444/*FUNCTION Penta::JacobianDeterminantBase{{{*/
     2445void Penta::JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){
     2446
     2447        _assert_(gauss->Enum()==GaussPentaEnum);
     2448        this->GetTriaJacobianDeterminant(pJdet,xyz_list_base,(GaussPenta*)gauss);
     2449
     2450}
     2451/*}}}*/
    24342452/*FUNCTION Penta::NoIceInElement {{{*/
    24352453bool   Penta::NoIceInElement(){
     
    25082526Gauss* Penta::NewGauss(int order){
    25092527        return new GaussPenta(order,order);
     2528}
     2529/*}}}*/
     2530/*FUNCTION Penta::NewGaussBase(int order){{{*/
     2531Gauss* Penta::NewGaussBase(int order){
     2532        return new GaussPenta(0,1,2,order);
    25102533}
    25112534/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r16802 r16803  
    9999                void   GetVectorFromInputs(Vector<IssmDouble>* vector,int name_enum);
    100100                void   GetVerticesCoordinates(IssmDouble** pxyz_list);
     101                void   GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
    101102
    102103                int    Sid();
     
    239240                bool           IsNodeOnShelfFromFlags(IssmDouble* flags);
    240241                void           JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
     242                void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
    241243                bool           NoIceInElement(void);
    242244                Gauss*         NewGauss(void);
    243245                Gauss*         NewGauss(int order);
     246                Gauss*         NewGaussBase(int order);
    244247                ElementVector* NewElementVector(int approximation_enum);
    245248                void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r16800 r16803  
    102102                int         GetNumberOfVertices(void){_error_("not implemented yet");};
    103103                void        GetVerticesCoordinates(IssmDouble** pxyz_list){_error_("not implemented yet");};
     104                void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");};
    104105                int         Sid(){_error_("not implemented yet");};
    105106                void        InputChangeName(int input_enum, int enum_type_old){_error_("not implemented yet");};
     
    108109                bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
    109110                void        JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
     111                void        JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");};
    110112                void        NodalFunctions(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
    111113                bool        NoIceInElement(){_error_("not implemented yet");};
     
    125127                Gauss*      NewGauss(void){_error_("not implemented yet");};
    126128                Gauss*      NewGauss(int order){_error_("not implemented yet");};
     129                Gauss*      NewGaussBase(int order){_error_("not implemented yet");};
    127130                ElementVector* NewElementVector(int approximation_enum){_error_("not implemented yet");};
    128131                #ifdef _HAVE_THERMAL_
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r16800 r16803  
    110110                void        GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum);
    111111                void        GetVerticesCoordinates(IssmDouble** pxyz_list);
     112                void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");};
    112113                void        InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
    113114                void        InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum);
     
    267268                bool             IsInput(int name);
    268269                void           JacobianDeterminant(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
     270                void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");};
    269271                Gauss*         NewGauss(void);
    270272                Gauss*         NewGauss(int order);
     273                Gauss*         NewGaussBase(int order){_error_("not implemented yet");};
    271274                ElementVector* NewElementVector(int approximation_enum);
    272275                void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
Note: See TracChangeset for help on using the changeset viewer.