Changeset 16904


Ignore:
Timestamp:
11/23/13 09:20:22 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: KMatrix Hydrology DC Eff

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

Legend:

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

    r16858 r16904  
    9797/*Finite Element Analysis*/
    9898ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
    99         _error_("not implemented yet");
     99
     100        /*Intermediaries*/
     101        int      meshtype;
     102        Element* basalelement;
     103
     104        /*Get basal element*/
     105        element->FindParam(&meshtype,MeshTypeEnum);
     106        switch(meshtype){
     107                case Mesh2DhorizontalEnum:
     108                        basalelement = element;
     109                        break;
     110                case Mesh3DEnum:
     111                        if(!element->IsOnBed()) return NULL;
     112                        basalelement = element->SpawnBasalElement();
     113                        break;
     114                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     115        }
     116
     117        /*Check that all nodes are active, else return empty matrix*/
     118        if(!basalelement->AllActive()) return NULL;
     119
     120        /* Intermediaries */
     121        IssmDouble  D_scalar,Jdet,dt;
     122        IssmDouble  epl_thickness;
     123        IssmDouble *xyz_list = NULL;
     124
     125        /*Fetch number of nodes and dof for this finite element*/
     126        int numnodes = basalelement->GetNumberOfNodes();
     127
     128        /*Initialize Element vector*/
     129        ElementMatrix* Ke     = element->NewElementMatrix();
     130        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     131        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     132        IssmDouble     D[2][2]={0.};
     133
     134        /*Retrieve all inputs and parameters*/
     135        basalelement->GetVerticesCoordinates(&xyz_list);
     136        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
     137        Input* thickness_input=element->GetInput(HydrologydcEplThicknessEnum); _assert_(thickness_input);
     138        IssmDouble epl_specificstoring = EplSpecificStoring(basalelement);
     139        IssmDouble epl_conductivity    = element->GetMaterialParameter(HydrologydcEplConductivityEnum);
     140
     141        /* Start  looping on the number of gaussian points: */
     142        Gauss* gauss=element->NewGauss(2);
     143        for(int ig=gauss->begin();ig<gauss->end();ig++){
     144                gauss->GaussPoint(ig);
     145
     146                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     147                thickness_input->GetInputValue(&epl_thickness,gauss);
     148
     149                /*Diffusivity*/
     150                D_scalar=epl_conductivity*epl_thickness*gauss->weight*Jdet;
     151                if(dt!=0.) D_scalar=D_scalar*dt;
     152                D[0][0]=D_scalar;
     153                D[1][1]=D_scalar;
     154                GetB(B,element,xyz_list,gauss);
     155                TripleMultiply(B,2,numnodes,1,
     156                                        &D[0][0],2,2,0,
     157                                        B,2,numnodes,0,
     158                                        &Ke->values[0],1);
     159
     160                /*Transient*/
     161                if(dt!=0.){
     162                        element->NodalFunctions(basis,gauss);
     163                        D_scalar=epl_specificstoring*epl_thickness*gauss->weight*Jdet;
     164
     165                        TripleMultiply(basis,numnodes,1,0,
     166                                                &D_scalar,1,1,0,
     167                                                basis,1,numnodes,0,
     168                                                &Ke->values[0],1);
     169                }
     170        }
     171
     172        /*Clean up and return*/
     173        xDelete<IssmDouble>(xyz_list);
     174        xDelete<IssmDouble>(basis);
     175        xDelete<IssmDouble>(B);
     176        delete gauss;
     177        return Ke;
     178
     179
    100180}/*}}}*/
    101181ElementVector* HydrologyDCEfficientAnalysis::CreatePVector(Element* element){/*{{{*/
     
    200280        return rho_freshwater*g*epl_porosity*(water_compressibility+(epl_compressibility/epl_porosity));                 
    201281}/*}}}*/
     282void HydrologyDCEfficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     283        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
     284         * For node i, Bi can be expressed in the actual coordinate system
     285         * by:
     286         *       Bi=[ dN/dx ]
     287         *          [ dN/dy ]
     288         * where N is the finiteelement function for node i.
     289         *
     290         * We assume B has been allocated already, of size: 3x(NDOF2*numnodes)
     291         */
     292
     293        /*Fetch number of nodes for this finite element*/
     294        int numnodes = element->GetNumberOfNodes();
     295
     296        /*Get nodal functions derivatives*/
     297        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     298        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     299
     300        /*Build B: */
     301        for(int i=0;i<numnodes;i++){
     302                B[numnodes*0+i] = dbasis[0*numnodes+i];
     303                B[numnodes*1+i] = dbasis[1*numnodes+i];
     304        }
     305
     306        /*Clean-up*/
     307        xDelete<IssmDouble>(dbasis);
     308}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h

    r16853 r16904  
    2727
    2828                /*Intermediaries*/
     29                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    2930                IssmDouble EplSpecificStoring(Element* element);
    3031};
  • issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp

    r16903 r16904  
    259259                case HydrologydcEplPorosityEnum:             return this->epl_porosity;
    260260                case HydrologydcEplCompressibilityEnum:      return this->epl_compressibility;
     261                case HydrologydcEplConductivityEnum:         return this->epl_conductivity;
     262                case HydrologydcEplInitialThicknessEnum:     return this->epl_init_thickness;
    261263                case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
    262264                case HydrologydcSedimentTransmitivityEnum:   return this->sediment_transmitivity;
Note: See TracChangeset for help on using the changeset viewer.