Changeset 16899


Ignore:
Timestamp:
11/22/13 16:15:01 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: preparing KMatrix Hydrology DC

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

Legend:

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

    r16864 r16899  
    138138/*Finite Element Analysis*/
    139139ElementMatrix* HydrologyDCInefficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
    140         _error_("not implemented yet");
    141 }/*}}}*/
    142 ElementVector* HydrologyDCInefficientAnalysis::CreatePVector(Element* element){/*{{{*/
    143140
    144141        /*Intermediaries*/
     
    160157
    161158        /*Intermediaries */
     159        IssmDouble  D_scalar,Jdet,dt;
     160        IssmDouble *xyz_list  = NULL;
     161
     162        /*Fetch number of nodes and dof for this finite element*/
     163        int numnodes = basalelement->GetNumberOfNodes();
     164
     165        /*Initialize Element vector*/
     166        ElementMatrix* Ke     = basalelement->NewElementMatrix();
     167        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     168        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     169        IssmDouble     D[2][2]={0.};
     170
     171        /*Retrieve all inputs and parameters*/
     172        basalelement->GetVerticesCoordinates(&xyz_list);
     173        IssmDouble sediment_storing       = SedimentStoring(basalelement);
     174        IssmDouble sediment_transmitivity = basalelement->GetMaterialParameter(HydrologydcSedimentTransmitivityEnum);
     175        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
     176
     177        /* Start  looping on the number of gaussian points: */
     178        Gauss* gauss=basalelement->NewGauss(2);
     179        for(int ig=gauss->begin();ig<gauss->end();ig++){
     180                gauss->GaussPoint(ig);
     181
     182                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     183
     184                /*Diffusivity*/
     185                D_scalar=sediment_transmitivity*gauss->weight*Jdet;
     186                if(dt!=0.) D_scalar=D_scalar*dt;
     187                D[0][0]=D_scalar;
     188                D[1][1]=D_scalar;
     189                GetB(B,element,xyz_list,gauss);
     190                TripleMultiply(B,2,numnodes,1,
     191                                        &D[0][0],2,2,0,
     192                                        B,2,numnodes,0,
     193                                        &Ke->values[0],1);
     194
     195                /*Transient*/
     196                if(dt!=0.){
     197                        basalelement->NodalFunctions(&basis[0],gauss);
     198                        D_scalar=sediment_storing*gauss->weight*Jdet;
     199                        TripleMultiply(basis,numnodes,1,0,
     200                                                &D_scalar,1,1,0,
     201                                                basis,1,numnodes,0,
     202                                                &Ke->values[0],1);
     203                }
     204        }
     205
     206        /*Clean up and return*/
     207        xDelete<IssmDouble>(xyz_list);
     208        xDelete<IssmDouble>(B);
     209        xDelete<IssmDouble>(basis);
     210        delete gauss;
     211        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     212        return Ke;
     213}/*}}}*/
     214ElementVector* HydrologyDCInefficientAnalysis::CreatePVector(Element* element){/*{{{*/
     215
     216        /*Intermediaries*/
     217        int      meshtype;
     218        Element* basalelement;
     219
     220        /*Get basal element*/
     221        element->FindParam(&meshtype,MeshTypeEnum);
     222        switch(meshtype){
     223                case Mesh2DhorizontalEnum:
     224                        basalelement = element;
     225                        break;
     226                case Mesh3DEnum:
     227                        if(!element->IsOnBed()) return NULL;
     228                        basalelement = element->SpawnBasalElement();
     229                        break;
     230                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     231        }
     232
     233        /*Intermediaries */
    162234        IssmDouble dt,scalar,water_head;
    163235        IssmDouble water_load,transfer;
     
    210282        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    211283        return pe;
     284}/*}}}*/
     285void HydrologyDCInefficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     286        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
     287         * For node i, Bi can be expressed in the actual coordinate system
     288         * by:
     289         *       Bi=[ dN/dx ]
     290         *          [ dN/dy ]
     291         * where N is the finiteelement function for node i.
     292         *
     293         * We assume B has been allocated already, of size: 3x(NDOF2*numnodes)
     294         */
     295
     296        /*Fetch number of nodes for this finite element*/
     297        int numnodes = element->GetNumberOfNodes();
     298
     299        /*Get nodal functions derivatives*/
     300        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     301        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     302
     303        /*Build B: */
     304        for(int i=0;i<numnodes;i++){
     305                B[numnodes*0+i] = dbasis[0*numnodes+i];
     306                B[numnodes*1+i] = dbasis[1*numnodes+i];
     307        }
     308
     309        /*Clean-up*/
     310        xDelete<IssmDouble>(dbasis);
    212311}/*}}}*/
    213312void HydrologyDCInefficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h

    r16864 r16899  
    2727
    2828                /*Intermediaries*/
     29                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    2930                IssmDouble SedimentStoring(Element* element);
    3031                void ElementizeEplMask(FemModel* femmodel);
  • issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp

    r16853 r16899  
    7171/*Finite Element Analysis*/
    7272ElementMatrix* L2ProjectionEPLAnalysis::CreateKMatrix(Element* element){/*{{{*/
    73         _error_("not implemented yet");
     73
     74        /*Intermediaries*/
     75        int      meshtype;
     76        Element* basalelement;
     77
     78        /*Get basal element*/
     79        element->FindParam(&meshtype,MeshTypeEnum);
     80        switch(meshtype){
     81                case Mesh2DhorizontalEnum:
     82                        basalelement = element;
     83                        break;
     84                case Mesh2DverticalEnum:
     85                        if(!element->IsOnBed()) return NULL;
     86                        basalelement = element->SpawnBasalElement();
     87                        break;
     88                case Mesh3DEnum:
     89                        if(!element->IsOnBed()) return NULL;
     90                        basalelement = element->SpawnBasalElement();
     91                        break;
     92                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     93        }
     94
     95        /*Intermediaries */
     96        IssmDouble  D,Jdet;
     97        IssmDouble *xyz_list  = NULL;
     98
     99        /*Fetch number of nodes and dof for this finite element*/
     100        int numnodes = basalelement->GetNumberOfNodes();
     101
     102        /*Initialize Element vector*/
     103        ElementMatrix* Ke    = basalelement->NewElementMatrix(NoneApproximationEnum);
     104        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     105
     106        /*Retrieve all inputs and parameters*/
     107        basalelement->GetVerticesCoordinates(&xyz_list);
     108
     109        /* Start  looping on the number of gaussian points: */
     110        Gauss* gauss=basalelement->NewGauss(2);
     111        for(int ig=gauss->begin();ig<gauss->end();ig++){
     112                gauss->GaussPoint(ig);
     113
     114                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     115                basalelement->NodalFunctions(basis,gauss);
     116                D=gauss->weight*Jdet;
     117
     118                TripleMultiply(basis,1,numnodes,1,
     119                                        &D,1,1,0,
     120                                        basis,1,numnodes,0,
     121                                        &Ke->values[0],1);
     122        }
     123
     124        /*Clean up and return*/
     125        xDelete<IssmDouble>(xyz_list);
     126        xDelete<IssmDouble>(basis);
     127        delete gauss;
     128        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     129        return Ke;
    74130}/*}}}*/
    75131ElementVector* L2ProjectionEPLAnalysis::CreatePVector(Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r16892 r16899  
    47904790
    47914791        /* Start  looping on the number of gaussian points: */
    4792         gauss=new GaussPenta(2,3);
     4792        gauss=new GaussPenta(3,3);
    47934793        for(int ig=gauss->begin();ig<gauss->end();ig++){
    47944794
  • issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp

    r16853 r16899  
    260260                case HydrologydcEplCompressibilityEnum:     return this->epl_compressibility;
    261261                case HydrologydcWaterCompressibilityEnum:   return this->water_compressibility;
     262                case HydrologydcSedimentTransmitivityEnum:  return this->sediment_transmitivity;
    262263                case ConstantsGEnum:                        return this->g;
    263264                default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
Note: See TracChangeset for help on using the changeset viewer.