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

NEW: done with SSA 3d

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.