Changeset 17426


Ignore:
Timestamp:
03/12/14 15:55:03 (11 years ago)
Author:
jbondzio
Message:

CHG: adaptation to LSM in 3D

File:
1 edited

Legend:

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

    r17425 r17426  
    3333void ExtrapolationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
    3434        int finiteelement=P1Enum;
     35        if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
    3536        ::CreateNodes(nodes,iomodel,ExtrapolationAnalysisEnum,finiteelement);
     37        iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
    3638}
    3739/*}}}*/
     
    7678ElementMatrix* ExtrapolationAnalysis::CreateKMatrix(Element* element){/*{{{*/
    7779
     80        if(!element->IsOnBed()) return NULL;
     81        Element* basalelement = element->SpawnBasalElement();
     82
    7883        /*Intermediaries */
    79         const int dim = 2;
     84        int               meshtype,dim;
    8085        int        i,row,col,stabilization;
    8186        bool       extrapolatebydiffusion = true;
    8287        IssmDouble Jdet,D_scalar,h;
    83         IssmDouble dlsf[dim],normal[dim];
    8488        IssmDouble norm_dlsf;
    8589        IssmDouble hx,hy,hz,kappa;
    8690        IssmDouble* xyz_list = NULL;
    8791
     92        /*Get problem dimension*/
     93        basalelement->FindParam(&meshtype,MeshTypeEnum);
     94        switch(meshtype){
     95                case Mesh2DverticalEnum:   dim = 1; break;
     96                case Mesh2DhorizontalEnum: dim = 2; break;
     97                case Mesh3DEnum:           dim = 2; break;
     98                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     99        }
     100
    88101        /*Fetch number of nodes and dof for this finite element*/
    89         int numnodes = element->GetNumberOfNodes();
     102        int numnodes = basalelement->GetNumberOfNodes();
    90103
    91104        /*Initialize Element vector and other vectors*/
    92         ElementMatrix* Ke     = element->NewElementMatrix();
     105        ElementMatrix* Ke     = basalelement->NewElementMatrix();
    93106        IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
    94107        IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
    95         IssmDouble     D[dim][dim];
     108        IssmDouble*             dlsf   = xNew<IssmDouble>(dim);
     109        IssmDouble*             normal = xNew<IssmDouble>(dim);
     110        IssmDouble*    D                 = xNew<IssmDouble>(dim*dim);
    96111
    97112        /*Retrieve all inputs and parameters*/
    98         Input* lsf_slopex_input=element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
    99         Input* lsf_slopey_input=element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
    100         element->GetVerticesCoordinates(&xyz_list);
    101         h = element->CharacteristicLength();
     113        Input* lsf_slopex_input=basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
     114        Input* lsf_slopey_input=basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
     115        basalelement->GetVerticesCoordinates(&xyz_list);
     116        h = basalelement->CharacteristicLength();
    102117
    103118        /* Start  looping on the number of gaussian points: */
    104         Gauss* gauss=element->NewGauss(2);
     119        Gauss* gauss=basalelement->NewGauss(2);
    105120        for(int ig=gauss->begin();ig<gauss->end();ig++){/*{{{*/
    106121                gauss->GaussPoint(ig);
    107122
    108                 element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    109                 GetB(B,element,xyz_list,gauss);
    110                 GetBprime(Bprime,element,xyz_list,gauss);
     123                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     124                GetB(B,basalelement,xyz_list,gauss);
     125                GetBprime(Bprime,basalelement,xyz_list,gauss);
    111126               
    112127                D_scalar=gauss->weight*Jdet;
     
    117132                                for(col=0;col<dim;col++)
    118133                                        if(row==col)
    119                                                 D[row][col] = D_scalar;
     134                                                D[row*dim+col] = D_scalar;
    120135                                        else
    121                                                 D[row][col] = 0.;
     136                                                D[row*dim+col] = 0.;
    122137
    123138                        TripleMultiply(Bprime,dim,numnodes,1,
    124                                         &D[0][0],dim,dim,0,
     139                                        D,dim,dim,0,
    125140                                        Bprime,dim,numnodes,0,
    126141                                        &Ke->values[0],1);
     
    143158                                for(col=0;col<dim;col++)
    144159                                        if(row==col)
    145                                                 D[row][col]=D_scalar*normal[row];
     160                                                D[row*dim+col] = D_scalar*normal[row];
    146161                                        else
    147                                                 D[row][col]=0.;
     162                                                D[row*dim+col] = 0.;
    148163                        TripleMultiply(B,dim,numnodes,1,
    149                                                 &D[0][0],dim,dim,0,
     164                                                D,dim,dim,0,
    150165                                                Bprime,dim,numnodes,0,
    151166                                                &Ke->values[0],1);
     
    156171                        else if(stabilization==1){
    157172                                /* Artificial Diffusion */
    158                                 element->ElementSizes(&hx,&hy,&hz);
     173                                basalelement->ElementSizes(&hx,&hy,&hz);
    159174                                h=sqrt( pow(hx*normal[0],2) + pow(hy*normal[1],2));
    160175                                kappa=h/2.+1.e-14;
    161                                 D[0][0]=D_scalar*kappa;
    162                                 D[0][1]=0.;
    163                                 D[1][0]=0.;
    164                                 D[1][1]=D_scalar*kappa;
     176                                for(row=0;row<dim;row++)
     177                                        for(col=0;col<dim;col++)
     178                                                if(row==col)
     179                                                        D[row*dim+col] = D_scalar*kappa;
     180                                                else
     181                                                        D[row*dim+col] = 0.;
    165182                                TripleMultiply(Bprime,dim,numnodes,1,
    166                                                         &D[0][0],dim,dim,0,
     183                                                        D,dim,dim,0,
    167184                                                        Bprime,dim,numnodes,0,
    168185                                                        &Ke->values[0],1);
     
    172189                                for(row=0;row<dim;row++)
    173190                                        for(col=0;col<dim;col++)
    174                                                 D[row][col]=h/(2.*1.)*normal[row]*normal[col];
     191                                                D[row*dim+col]=h/(2.*1.)*normal[row]*normal[col];
    175192
    176193                                TripleMultiply(Bprime,dim,numnodes,1,
    177                                                         &D[0][0],dim,dim,0,
     194                                                        D,dim,dim,0,
    178195                                                        Bprime,dim,numnodes,0,
    179196                                                        &Ke->values[0],1);
     
    181198                }
    182199        }/*}}}*/
     200
     201        //TESTING
     202        _printf_("in element: " << basalelement->Id() << "\n");
     203        Ke->Echo();
    183204
    184205        /*Clean up and return*/
     
    186207        xDelete<IssmDouble>(B);
    187208        xDelete<IssmDouble>(Bprime);
     209        xDelete<IssmDouble>(dlsf);
     210        xDelete<IssmDouble>(normal);
    188211        delete gauss;
    189212        return Ke;
     
    191214}/*}}}*/
    192215ElementVector* ExtrapolationAnalysis::CreatePVector(Element* element){/*{{{*/
     216
     217        if(!element->IsOnBed()) return NULL;
     218        Element* basalelement = element->SpawnBasalElement();
    193219
    194220        /*Intermediaries */
     
    196222       
    197223        /*Fetch number of nodes */
    198         int numnodes = element->GetNumberOfNodes();
     224        int numnodes = basalelement->GetNumberOfNodes();
    199225
    200226        /*Initialize Element vector*/
    201         ElementVector* pe = element->NewElementVector();
     227        ElementVector* pe = basalelement->NewElementVector();
    202228        for(i=0;i<numnodes;i++)
    203229                pe->values[i]=0.;
Note: See TracChangeset for help on using the changeset viewer.