Changeset 20666


Ignore:
Timestamp:
05/30/16 12:00:16 (9 years ago)
Author:
Mathieu Morlighem
Message:

CHG: use diffusion equation to extrude from top

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

Legend:

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

    r18929 r20666  
    4949ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrix(Element* element){/*{{{*/
    5050
    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 }/*}}}*/
    63 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
    64 
    6551        /*Intermediaries */
    66         int         dim;
    6752        IssmDouble  Jdet,D;
    6853        IssmDouble *xyz_list = NULL;
    6954
    7055        /*Get dimension*/
     56        int dim;
    7157        element->FindParam(&dim,DomainDimensionEnum);
    7258
     
    7662        /*Initialize Element vector and other vectors*/
    7763        ElementMatrix* Ke     = element->NewElementMatrix();
    78         IssmDouble*    B      = xNew<IssmDouble>(numnodes);
    79         IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
     64        IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
    8065
    8166        /*Retrieve all inputs and parameters*/
     
    8873
    8974                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    90                 element->NodalFunctions(Bprime,gauss);
    91                 GetB(B,element,dim,xyz_list,gauss);
    9275                D=gauss->weight*Jdet;
     76                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    9377
    94                 TripleMultiply(B,1,numnodes,1,
    95                                         &D,1,1,0,
    96                                         Bprime,1,numnodes,0,
    97                                         &Ke->values[0],1);
     78                for(int i=0;i<numnodes;i++){
     79                        for(int j=0;j<numnodes;j++){
     80                                Ke->values[i*numnodes+j] += gauss->weight*Jdet*(dbasis[(dim-1)*numnodes+i]*dbasis[(dim-1)*numnodes+j]);
     81                        }
     82                }
    9883        }
    9984
    10085        /*Clean up and return*/
    10186        xDelete<IssmDouble>(xyz_list);
    102         xDelete<IssmDouble>(B);
    103         xDelete<IssmDouble>(Bprime);
    10487        delete gauss;
    10588        return Ke;
    106 }
    107 /*}}}*/
    108 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/
    109 
    110         if(!element->IsOnSurface()) return NULL;
    111 
    112         /*Intermediaries */
    113         int         dim;
    114         IssmDouble  Jdet,D,normal[2];
    115         IssmDouble *xyz_list_top = NULL;
    116 
    117         /*Get dimension*/
    118         element->FindParam(&dim,DomainDimensionEnum);
    119 
    120         /*Fetch number of nodes and dof for this finite element*/
    121         int numnodes = element->GetNumberOfNodes();
    122 
    123         /*Initialize Element vector and other vectors*/
    124         ElementMatrix* Ke    = element->NewElementMatrix();
    125         IssmDouble*    basis = xNew<IssmDouble>(numnodes);
    126 
    127         /*Retrieve all inputs and parameters*/
    128         element->GetVerticesCoordinatesTop(&xyz_list_top);
    129         element->NormalTop(&normal[0],xyz_list_top);
    130 
    131         /* Start  looping on the number of gaussian points: */
    132         Gauss* gauss=element->NewGaussTop(2);
    133         for(int ig=gauss->begin();ig<gauss->end();ig++){
    134                 gauss->GaussPoint(ig);
    135 
    136                 element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss);
    137                 element->NodalFunctions(basis,gauss);
    138                 D = - gauss->weight*Jdet*normal[dim-1];
    139 
    140                 TripleMultiply(basis,1,numnodes,1,
    141                                         &D,1,1,0,
    142                                         basis,1,numnodes,0,
    143                                         &Ke->values[0],1);
    144         }
    145 
    146         /*Clean up and return*/
    147         xDelete<IssmDouble>(xyz_list_top);
    148         xDelete<IssmDouble>(basis);
    149         delete gauss;
    150         return Ke;
    151 }
    152 /*}}}*/
    153 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixBed(Element* element){/*{{{*/
    154 
    155         if(!element->IsOnBase()) return NULL;
    156 
    157         /*Intermediaries */
    158         int         dim;
    159         IssmDouble  Jdet,D,normal[3];
    160         IssmDouble *xyz_list_base = NULL;
    161 
    162         /*Get dimension*/
    163         element->FindParam(&dim,DomainDimensionEnum);
    164 
    165         /*Fetch number of nodes and dof for this finite element*/
    166         int numnodes = element->GetNumberOfNodes();
    167 
    168         /*Initialize Element vector and other vectors*/
    169         ElementMatrix* Ke    = element->NewElementMatrix();
    170         IssmDouble*    basis = xNew<IssmDouble>(numnodes);
    171 
    172         /*Retrieve all inputs and parameters*/
    173         element->GetVerticesCoordinatesBase(&xyz_list_base);
    174         element->NormalBase(&normal[0],xyz_list_base);
    175 
    176         /* Start  looping on the number of gaussian points: */
    177         Gauss* gauss=element->NewGaussBase(2);
    178         for(int ig=gauss->begin();ig<gauss->end();ig++){
    179                 gauss->GaussPoint(ig);
    180 
    181                 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
    182                 element->NodalFunctions(basis,gauss);
    183                 D = - gauss->weight*Jdet*normal[dim-1];
    184 
    185                 TripleMultiply(basis,1,numnodes,1,
    186                                         &D,1,1,0,
    187                                         basis,1,numnodes,0,
    188                                         &Ke->values[0],1);
    189         }
    190 
    191         /*Clean up and return*/
    192         xDelete<IssmDouble>(xyz_list_base);
    193         xDelete<IssmDouble>(basis);
    194         delete gauss;
    195         return Ke;
    196 }
    197 /*}}}*/
     89}/*}}}*/
    19890ElementVector* ExtrudeFromTopAnalysis::CreatePVector(Element* element){/*{{{*/
    19991        return NULL;
    20092}/*}}}*/
    201 void           ExtrudeFromTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    202         /*      Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
    203                 where hi is the interpolation function for node i.*/
    204 
    205         /*Fetch number of nodes for this finite element*/
    206         int numnodes = element->GetNumberOfNodes();
    207 
    208         /*Get nodal functions derivatives*/
    209         IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
    210         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    211 
    212         /*Build B: */
    213         for(int i=0;i<numnodes;i++){
    214                 B[i] = dbasis[(dim-1)*numnodes+i];
    215         }
    216 
    217         /*Clean-up*/
    218         xDelete<IssmDouble>(dbasis);
    219 }
    220 /*}}}*/
    22193void           ExtrudeFromTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    22294           _error_("not implemented yet");
  • issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h

    r18929 r20666  
    2525                ElementMatrix* CreateJacobianMatrix(Element* element);
    2626                ElementMatrix* CreateKMatrix(Element* element);
    27                 ElementMatrix* CreateKMatrixBed(Element* element);
    28                 ElementMatrix* CreateKMatrixSurface(Element* element);
    29                 ElementMatrix* CreateKMatrixVolume(Element* element);
    3027                ElementVector* CreatePVector(Element* element);
    31                 void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
    3228                void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    3329                void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
Note: See TracChangeset for help on using the changeset viewer.