Changeset 19267


Ignore:
Timestamp:
04/07/15 15:51:47 (10 years ago)
Author:
seroussi
Message:

CHG: computing vertical velocities from the surface

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

Legend:

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

    r19113 r19267  
    112112        iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
    113113        iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum);
     114        iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
    114115        iomodel->FetchDataToInput(elements,VxEnum,0.);
    115116        iomodel->FetchDataToInput(elements,VyEnum,0.);
     
    137138ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrix(Element* element){/*{{{*/
    138139
     140        bool hack = false;
     141
    139142        /*compute all stiffness matrices for this element*/
    140143        ElementMatrix* Ke1=CreateKMatrixVolume(element);
    141         ElementMatrix* Ke2=CreateKMatrixSurface(element);
     144        ElementMatrix* Ke2=NULL;
     145        if(hack) Ke2=CreateKMatrixBase(element);
     146        else Ke2=CreateKMatrixSurface(element);
    142147        ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
    143148
     
    147152        return Ke;
    148153
     154}/*}}}*/
     155ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixBase(Element* element){/*{{{*/
     156
     157
     158        if(!element->IsOnBase()) return NULL;
     159
     160        /*Intermediaries*/
     161        IssmDouble  D,Jdet,normal[3];
     162        IssmDouble *xyz_list = NULL;
     163
     164        /*Fetch number of nodes and dof for this finite element*/
     165        int numnodes = element->GetNumberOfNodes();
     166
     167        /*Initialize Element matrix and vectors*/
     168        ElementMatrix* Ke    = element->NewElementMatrix(NoneApproximationEnum);
     169        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     170
     171        /*Retrieve all inputs and parameters*/
     172        element->GetVerticesCoordinatesBase(&xyz_list);
     173
     174        /* Start  looping on the number of gaussian points: */
     175        Gauss* gauss = element->NewGaussBase(2);
     176        element->NormalBase(&normal[0],xyz_list);
     177        for(int ig=gauss->begin();ig<gauss->end();ig++){
     178                gauss->GaussPoint(ig);
     179
     180                element->JacobianDeterminantBase(&Jdet,xyz_list,gauss);
     181                element->NodalFunctions(basis,gauss);
     182                D = -gauss->weight*Jdet*normal[2];
     183
     184                TripleMultiply( basis,1,numnodes,1,
     185                                        &D,1,1,0,
     186                                        basis,1,numnodes,0,
     187                                        &Ke->values[0],1);
     188        }
     189
     190        /*Clean up and return*/
     191        delete gauss;
     192        xDelete<IssmDouble>(xyz_list);
     193        xDelete<IssmDouble>(basis);
     194        return Ke;
    149195}/*}}}*/
    150196ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/
     
    232278ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/
    233279
     280        bool hack = false;
     281
    234282        /*compute all load vectors for this element*/
    235283        ElementVector* pe1=CreatePVectorVolume(element);
    236         ElementVector* pe2=CreatePVectorBase(element);
     284        ElementVector* pe2=NULL;
     285        if(hack) pe2=CreatePVectorSurface(element);
     286        else     pe2=CreatePVectorBase(element);
    237287        ElementVector* pe =new ElementVector(pe1,pe2);
    238288
     
    308358        return pe;
    309359}/*}}}*/
     360ElementVector* StressbalanceVerticalAnalysis::CreatePVectorSurface(Element* element){/*{{{*/
     361
     362        /*Intermediaries */
     363        int         approximation;
     364        IssmDouble *xyz_list      = NULL;
     365        IssmDouble *xyz_list_surface= NULL;
     366        IssmDouble  Jdet,slope[3];
     367        IssmDouble  vx,vy,vz=0.,dsdx,dsdy;
     368        IssmDouble  smb,smbvalue;
     369
     370        if(!element->IsOnSurface()) return NULL;
     371
     372        /*Fetch number of nodes for this finite element*/
     373        int numnodes = element->GetNumberOfNodes();
     374
     375        /*Initialize Element vector*/
     376        ElementVector* pe    = element->NewElementVector();
     377        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     378
     379        /*Retrieve all inputs and parameters*/
     380        element->GetVerticesCoordinates(&xyz_list);
     381        element->GetVerticesCoordinatesTop(&xyz_list_surface);
     382        element->GetInputValue(&approximation,ApproximationEnum);
     383        Input* surface_input    =element->GetInput(SurfaceEnum);               _assert_(surface_input);
     384        Input* smb_input=element->GetInput(SurfaceforcingsMassBalanceEnum);    _assert_(smb_input);
     385        Input* vx_input=element->GetInput(VxEnum);                             _assert_(vx_input);
     386        Input* vy_input=element->GetInput(VyEnum);                             _assert_(vy_input);
     387        Input* vzFS_input=NULL;
     388        if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     389                vzFS_input=element->GetInput(VzFSEnum);       _assert_(vzFS_input);
     390        }
     391
     392        /* Start  looping on the number of gaussian points: */
     393        Gauss* gauss=element->NewGaussTop(2);
     394        for(int ig=gauss->begin();ig<gauss->end();ig++){
     395                gauss->GaussPoint(ig);
     396
     397                smb_input->GetInputValue(&smb,gauss);
     398                surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
     399                vx_input->GetInputValue(&vx,gauss);
     400                vy_input->GetInputValue(&vy,gauss);
     401                if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
     402                        vzFS_input->GetInputValue(&vz,gauss);
     403                }
     404                dsdx=slope[0];
     405                dsdy=slope[1];
     406
     407                element->JacobianDeterminantTop(&Jdet,xyz_list_surface,gauss);
     408                element->NodalFunctions(basis,gauss);
     409
     410                for(int i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dsdx+vy*dsdy-vz+smb)*basis[i];
     411        }
     412
     413        /*Clean up and return*/
     414        delete gauss;
     415        xDelete<IssmDouble>(basis);
     416        xDelete<IssmDouble>(xyz_list);
     417        xDelete<IssmDouble>(xyz_list_surface);
     418        return pe;
     419}/*}}}*/
    310420ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
    311421
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h

    r18930 r19267  
    2525                ElementMatrix* CreateJacobianMatrix(Element* element);
    2626                ElementMatrix* CreateKMatrix(Element* element);
     27                ElementMatrix* CreateKMatrixBase(Element* element);
    2728                ElementMatrix* CreateKMatrixSurface(Element* element);
    2829                ElementMatrix* CreateKMatrixVolume(Element* element);
    2930                ElementVector* CreatePVector(Element* element);
    3031                ElementVector* CreatePVectorBase(Element* element);
     32                ElementVector* CreatePVectorSurface(Element* element);
    3133                ElementVector* CreatePVectorVolume(Element* element);
    3234                void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
Note: See TracChangeset for help on using the changeset viewer.