Changeset 16811


Ignore:
Timestamp:
11/16/13 21:34:25 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: PVEctor Balance thickness

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

Legend:

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

    r16782 r16811  
    118118}/*}}}*/
    119119ElementVector* BalancethicknessAnalysis::CreatePVector(Element* element){/*{{{*/
    120 _error_("not implemented yet");
     120
     121        if(!element->IsOnBed()) return NULL;
     122        Element* basalelement = element->SpawnBasalElement();
     123
     124        switch(element->FiniteElement()){
     125                case P1Enum: case P2Enum:
     126                        return CreatePVectorCG(basalelement);
     127                case P1DGEnum:
     128                        return CreatePVectorDG(basalelement);
     129                default:
     130                        _error_("Element type " << EnumToStringx(element->FiniteElement()) << " not supported yet");
     131        }
     132
     133}/*}}}*/
     134ElementVector* BalancethicknessAnalysis::CreatePVectorCG(Element* element){/*{{{*/
     135
     136        /*Intermediaries */
     137        IssmDouble  dhdt,mb,ms,Jdet;
     138        IssmDouble* xyz_list;
     139
     140        /*Fetch number of nodes and dof for this finite element*/
     141        int numnodes = element->GetNumberOfNodes();
     142
     143        /*Initialize Element vector and other vectors*/
     144        ElementVector* pe    = element->NewElementVector();
     145        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     146
     147        /*Retrieve all inputs and parameters*/
     148        element->GetVerticesCoordinates(&xyz_list);
     149        Input* mb_input   = element->GetInput(BasalforcingsMeltingRateEnum);       _assert_(mb_input);
     150        Input* ms_input   = element->GetInput(SurfaceforcingsMassBalanceEnum);     _assert_(ms_input);
     151        Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
     152
     153        /*Initialize mb_correction to 0, do not forget!:*/
     154        /* Start  looping on the number of gaussian points: */
     155        Gauss* gauss=element->NewGauss(2);
     156        for(int ig=gauss->begin();ig<gauss->end();ig++){
     157                gauss->GaussPoint(ig);
     158
     159                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     160                element->NodalFunctions(basis,gauss);
     161
     162                ms_input->GetInputValue(&ms,gauss);
     163                mb_input->GetInputValue(&mb,gauss);
     164                dhdt_input->GetInputValue(&dhdt,gauss);
     165
     166                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt)*basis[i];
     167        }
     168
     169        /*Clean up and return*/
     170        xDelete<IssmDouble>(xyz_list);
     171        xDelete<IssmDouble>(basis);
     172        delete gauss;
     173        return pe;
     174}/*}}}*/
     175ElementVector* BalancethicknessAnalysis::CreatePVectorDG(Element* element){/*{{{*/
     176
     177        /*Intermediaries */
     178        IssmDouble  dhdt,mb,ms,Jdet;
     179        IssmDouble* xyz_list;
     180
     181        /*Fetch number of nodes and dof for this finite element*/
     182        int numnodes = element->GetNumberOfNodes();
     183
     184        /*Initialize Element vector and other vectors*/
     185        ElementVector* pe    = element->NewElementVector();
     186        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     187
     188        /*Retrieve all inputs and parameters*/
     189        element->GetVerticesCoordinates(&xyz_list);
     190        Input* mb_input   = element->GetInput(BasalforcingsMeltingRateEnum);       _assert_(mb_input);
     191        Input* ms_input   = element->GetInput(SurfaceforcingsMassBalanceEnum);     _assert_(ms_input);
     192        Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
     193
     194        /*Initialize mb_correction to 0, do not forget!:*/
     195        /* Start  looping on the number of gaussian points: */
     196        Gauss* gauss=element->NewGauss(2);
     197        for(int ig=gauss->begin();ig<gauss->end();ig++){
     198                gauss->GaussPoint(ig);
     199
     200                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     201                element->NodalFunctions(basis,gauss);
     202
     203                ms_input->GetInputValue(&ms,gauss);
     204                mb_input->GetInputValue(&mb,gauss);
     205                dhdt_input->GetInputValue(&dhdt,gauss);
     206
     207                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt)*basis[i];
     208        }
     209
     210        /*Clean up and return*/
     211        xDelete<IssmDouble>(xyz_list);
     212        xDelete<IssmDouble>(basis);
     213        delete gauss;
     214        return pe;
    121215}/*}}}*/
    122216void BalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • TabularUnified issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h

    r16782 r16811  
    2323                ElementMatrix* CreateKMatrix(Element* element);
    2424                ElementVector* CreatePVector(Element* element);
     25                ElementVector* CreatePVectorCG(Element* element);
     26                ElementVector* CreatePVectorDG(Element* element);
    2527                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2628                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note: See TracChangeset for help on using the changeset viewer.