Changeset 17179


Ignore:
Timestamp:
01/28/14 08:06:20 (11 years ago)
Author:
Mathieu Morlighem
Message:

BUG: some fixes

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

Legend:

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

    r17005 r17179  
    4848}/*}}}*/
    4949ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrix(Element* element){/*{{{*/
    50         _error_("not implemented yet");
    51 }/*}}}*/
     50
     51        /*compute all stiffness matrices for this element*/
     52        ElementMatrix* Ke1=CreateKMatrixVolume(element);
     53        ElementMatrix* Ke2=CreateKMatrixSurface(element);
     54        ElementMatrix* Ke3=CreateKMatrixBed(element);
     55        ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
     56
     57        /*clean-up and return*/
     58        delete Ke1;
     59        delete Ke2;
     60        delete Ke3;
     61        return Ke;
     62}/*}}}*/
     63ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
     64
     65        /*Intermediaries */
     66        IssmDouble  Jdet,D;
     67        IssmDouble *xyz_list = NULL;
     68
     69        /*Fetch number of nodes and dof for this finite element*/
     70        int numnodes = element->GetNumberOfNodes();
     71
     72        /*Initialize Element vector and other vectors*/
     73        ElementMatrix* Ke     = element->NewElementMatrix();
     74        IssmDouble*    B      = xNew<IssmDouble>(numnodes);
     75        IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
     76
     77        /*Retrieve all inputs and parameters*/
     78        element->GetVerticesCoordinates(&xyz_list);
     79
     80        /* Start  looping on the number of gaussian points: */
     81        Gauss* gauss=element->NewGauss(2);
     82        for(int ig=gauss->begin();ig<gauss->end();ig++){
     83                gauss->GaussPoint(ig);
     84
     85                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     86                element->NodalFunctions(Bprime,gauss);
     87                GetB(B,element,xyz_list,gauss);
     88                D=gauss->weight*Jdet;
     89
     90                TripleMultiply(B,1,numnodes,1,
     91                                        &D,1,1,0,
     92                                        Bprime,1,numnodes,0,
     93                                        &Ke->values[0],1);
     94        }
     95
     96        /*Clean up and return*/
     97        xDelete<IssmDouble>(xyz_list);
     98        xDelete<IssmDouble>(B);
     99        xDelete<IssmDouble>(Bprime);
     100        delete gauss;
     101        return Ke;
     102}
     103/*}}}*/
     104ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/
     105
     106        if(!element->IsOnSurface()) return NULL;
     107
     108        /*Intermediaries */
     109        IssmDouble  Jdet,D,normal[2];
     110        IssmDouble *xyz_list_top = NULL;
     111
     112        /*Fetch number of nodes and dof for this finite element*/
     113        int numnodes = element->GetNumberOfNodes();
     114
     115        /*Initialize Element vector and other vectors*/
     116        ElementMatrix* Ke    = element->NewElementMatrix();
     117        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     118
     119        /*Retrieve all inputs and parameters*/
     120        element->GetVerticesCoordinatesTop(&xyz_list_top);
     121        element->NormalTop(&normal[0],xyz_list_top);
     122
     123        /* Start  looping on the number of gaussian points: */
     124        Gauss* gauss=element->NewGaussTop(2);
     125        for(int ig=gauss->begin();ig<gauss->end();ig++){
     126                gauss->GaussPoint(ig);
     127
     128                element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss);
     129                element->NodalFunctions(basis,gauss);
     130                D = - gauss->weight*Jdet*normal[1];
     131
     132                TripleMultiply(basis,1,numnodes,1,
     133                                        &D,1,1,0,
     134                                        basis,1,numnodes,0,
     135                                        &Ke->values[0],1);
     136        }
     137
     138        /*Clean up and return*/
     139        xDelete<IssmDouble>(xyz_list_top);
     140        xDelete<IssmDouble>(basis);
     141        delete gauss;
     142        return Ke;
     143}
     144/*}}}*/
     145ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixBed(Element* element){/*{{{*/
     146
     147        if(!element->IsOnBed()) return NULL;
     148
     149        /*Intermediaries */
     150        IssmDouble  Jdet,D,normal[2];
     151        IssmDouble *xyz_list_base = NULL;
     152
     153        /*Fetch number of nodes and dof for this finite element*/
     154        int numnodes = element->GetNumberOfNodes();
     155
     156        /*Initialize Element vector and other vectors*/
     157        ElementMatrix* Ke    = element->NewElementMatrix();
     158        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     159
     160        /*Retrieve all inputs and parameters*/
     161        element->GetVerticesCoordinatesBase(&xyz_list_base);
     162        element->NormalBase(&normal[0],xyz_list_base);
     163
     164        /* Start  looping on the number of gaussian points: */
     165        Gauss* gauss=element->NewGaussBase(2);
     166        for(int ig=gauss->begin();ig<gauss->end();ig++){
     167                gauss->GaussPoint(ig);
     168
     169                element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
     170                element->NodalFunctions(basis,gauss);
     171                D = - gauss->weight*Jdet*normal[1];
     172
     173                TripleMultiply(basis,1,numnodes,1,
     174                                        &D,1,1,0,
     175                                        basis,1,numnodes,0,
     176                                        &Ke->values[0],1);
     177        }
     178
     179        /*Clean up and return*/
     180        xDelete<IssmDouble>(xyz_list_base);
     181        xDelete<IssmDouble>(basis);
     182        delete gauss;
     183        return Ke;
     184}
     185/*}}}*/
    52186ElementVector* ExtrudeFromTopAnalysis::CreatePVector(Element* element){/*{{{*/
    53 _error_("not implemented yet");
    54 }/*}}}*/
     187        return NULL;
     188}/*}}}*/
     189void ExtrudeFromTopAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     190        /*      Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
     191                where hi is the interpolation function for node i.*/
     192
     193        /*Fetch number of nodes for this finite element*/
     194        int numnodes = element->GetNumberOfNodes();
     195
     196        /*Get nodal functions derivatives*/
     197        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     198        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     199
     200        /*Build B: */
     201        for(int i=0;i<numnodes;i++){
     202                B[i] = dbasis[1*numnodes+i]; 
     203        }
     204
     205        /*Clean-up*/
     206        xDelete<IssmDouble>(dbasis);
     207}
     208/*}}}*/
    55209void ExtrudeFromTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    56210           _error_("not implemented yet");
  • issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h

    r17005 r17179  
    2525                ElementMatrix* CreateJacobianMatrix(Element* element);
    2626                ElementMatrix* CreateKMatrix(Element* element);
     27                ElementMatrix* CreateKMatrixVolume(Element* element);
     28                ElementMatrix* CreateKMatrixSurface(Element* element);
     29                ElementMatrix* CreateKMatrixBed(Element* element);
    2730                ElementVector* CreatePVector(Element* element);
     31                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    2832                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2933                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note: See TracChangeset for help on using the changeset viewer.