Changeset 17427


Ignore:
Timestamp:
03/12/14 16:10:59 (11 years ago)
Author:
jbondzio
Message:

CHG: adaptation of LSM to 3D

File:
1 edited

Legend:

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

    r17371 r17427  
    2929                }
    3030        }
    31 
     31       
    3232        iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
    3333        iomodel->FetchDataToInput(elements,VxEnum);
     
    3535        iomodel->FetchDataToInput(elements,MasstransportCalvingrateEnum);
    3636       
     37        if(iomodel->meshtype==Mesh3DEnum){
     38                iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
     39        }
    3740}
    3841/*}}}*/
    3942void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
    4043        int finiteelement=P1Enum;
     44        if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
    4145        ::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement);
     46        iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
    4247}
    4348/*}}}*/
     
    9297ElementMatrix* LevelsetAnalysis::CreateKMatrix(Element* element){/*{{{*/
    9398
     99        if(!element->IsOnBed()) return NULL;
     100        Element* basalelement = element->SpawnBasalElement();
     101
    94102        /*Intermediaries */
    95         int  dim = 2; // solve for LSF in horizontal plane only
     103        int  dim, meshtype; // solve for LSF in horizontal plane only
    96104        int i, row, col;
    97105        IssmDouble kappa;
     
    102110        IssmDouble* xyz_list = NULL;
    103111
     112        /*Get problem dimension*/
     113        basalelement->FindParam(&meshtype,MeshTypeEnum);
     114        switch(meshtype){
     115                case Mesh2DverticalEnum:   dim = 1; break;
     116                case Mesh2DhorizontalEnum: dim = 2; break;
     117                case Mesh3DEnum:           dim = 2; break;
     118                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     119        }
     120
    104121        /*Fetch number of nodes and dof for this finite element*/
    105         int numnodes    = element->GetNumberOfNodes();
     122        int numnodes    = basalelement->GetNumberOfNodes();
    106123
    107124        /*Initialize Element vector and other vectors*/
    108         ElementMatrix* Ke       = element->NewElementMatrix();
     125        ElementMatrix* Ke       = basalelement->NewElementMatrix();
    109126        IssmDouble*    basis    = xNew<IssmDouble>(numnodes);
    110127        IssmDouble*    B        = xNew<IssmDouble>(dim*numnodes);
     
    117134
    118135        /*Retrieve all inputs and parameters*/
    119         element->GetVerticesCoordinates(&xyz_list);
    120         element->FindParam(&dt,TimesteppingTimeStepEnum);
    121         Input* vx_input  = element->GetInput(VxEnum);     _assert_(vx_input);
    122         Input* vy_input  = element->GetInput(VyEnum);     _assert_(vy_input);
    123         Input* lsf_slopex_input  = element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
    124         Input* lsf_slopey_input  = element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
    125         Input* calvingrate_input  = element->GetInput(MasstransportCalvingrateEnum);     _assert_(calvingrate_input);
     136        basalelement->GetVerticesCoordinates(&xyz_list);
     137        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
     138        Input* vx_input  = NULL;
     139        Input* vy_input  = NULL;
     140        Input* lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
     141        Input* lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
     142        Input* calvingrate_input  = basalelement->GetInput(MasstransportCalvingrateEnum);     _assert_(calvingrate_input);
     143
     144        if(meshtype==Mesh2DhorizontalEnum){
     145                vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
     146                vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
     147        }
     148        else{
     149                if(dim==1){
     150                        vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
     151                }
     152                if(dim==2){
     153                        vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
     154                        vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
     155                }
     156        }
    126157       
    127158        /* Start  looping on the number of gaussian points: */
    128         Gauss* gauss=element->NewGauss(2);
     159        Gauss* gauss=basalelement->NewGauss(2);
    129160        for(int ig=gauss->begin();ig<gauss->end();ig++){
    130161                gauss->GaussPoint(ig);
    131162
    132                 element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     163                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
    133164                D_scalar=gauss->weight*Jdet;
    134165
    135166                /* Transient */
    136167                if(dt!=0.){
    137                         element->NodalFunctions(basis,gauss);
     168                        basalelement->NodalFunctions(basis,gauss);
    138169                        TripleMultiply(basis,numnodes,1,0,
    139170                                                &D_scalar,1,1,0,
     
    144175
    145176                /* Advection */
    146                 GetB(B,element,xyz_list,gauss);
    147                 GetBprime(Bprime,element,xyz_list,gauss);
     177                GetB(B,basalelement,xyz_list,gauss);
     178                GetBprime(Bprime,basalelement,xyz_list,gauss);
    148179                vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity
    149180                vy_input->GetInputValue(&v[1],gauss);
     
    186217                        case 1:
    187218                                /* Artificial Diffusion */
    188                                 element->ElementSizes(&hx,&hy,&hz);
     219                                basalelement->ElementSizes(&hx,&hy,&hz);
    189220                                h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) );
    190221                                kappa=h*vel/2.;
     
    203234                        case 2:
    204235                                /* Streamline Upwinding */
    205                                 element->ElementSizes(&hx,&hy,&hz);
     236                                basalelement->ElementSizes(&hx,&hy,&hz);
    206237                                h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) );
    207238                                for(row=0;row<dim;row++)
     
    229260        xDelete<IssmDouble>(c);
    230261        xDelete<IssmDouble>(dlsf);
     262        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    231263        delete gauss;
    232264        return Ke;
    233265}/*}}}*/
    234266ElementVector* LevelsetAnalysis::CreatePVector(Element* element){/*{{{*/
     267       
     268        if(!element->IsOnBed()) return NULL;
     269        Element* basalelement = element->SpawnBasalElement();
    235270
    236271        /*Intermediaries */
    237         const int dim = 2;
    238         int i, ig, k;
     272        int i, ig, meshtype;
    239273        IssmDouble  Jdet,dt;
    240274        IssmDouble  lsf;
     
    242276       
    243277        /*Fetch number of nodes and dof for this finite element*/
    244         int numnodes = element->GetNumberOfNodes();
     278        int numnodes = basalelement->GetNumberOfNodes();
    245279
    246280        /*Initialize Element vector*/
    247         ElementVector* pe = element->NewElementVector();
    248         element->FindParam(&dt,TimesteppingTimeStepEnum);
     281        ElementVector* pe = basalelement->NewElementVector();
     282        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
    249283       
    250284        if(dt!=0.){
     
    253287
    254288                /*Retrieve all inputs and parameters*/
    255                 element->GetVerticesCoordinates(&xyz_list);
    256                 Input* levelset_input     = element->GetInput(MaskIceLevelsetEnum);                    _assert_(levelset_input);
     289                basalelement->GetVerticesCoordinates(&xyz_list);
     290                Input* levelset_input     = basalelement->GetInput(MaskIceLevelsetEnum);                    _assert_(levelset_input);
    257291
    258292                /* Start  looping on the number of gaussian points: */
    259                 Gauss* gauss=element->NewGauss(2);
     293                Gauss* gauss=basalelement->NewGauss(2);
    260294                for(ig=gauss->begin();ig<gauss->end();ig++){
    261295                        gauss->GaussPoint(ig);
    262296
    263                         element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    264                         element->NodalFunctions(basis,gauss);
     297                        basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     298                        basalelement->NodalFunctions(basis,gauss);
    265299
    266300                        /* old function value */
     
    277311                for(i=0;i<numnodes;i++)
    278312                        pe->values[i]=0.;
     313        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    279314        return pe;
    280315}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.