Ignore:
Timestamp:
07/25/13 14:54:51 (12 years ago)
Author:
Mathieu Morlighem
Message:

CHG: spcvx vy and vy need to be scaled before they are marshalled, removed unit conversion in CreateConstraintsDiagnosticHoriz and preparing HO with
quadratic elements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp

    r15567 r15621  
    4545/*FUNCTION PentaRef::SetElementType{{{*/
    4646void PentaRef::SetElementType(int type,int type_counter){
    47 
    48         _assert_(type==P1Enum || type==P1DGEnum);
    4947
    5048        /*initialize element type*/
     
    143141         * where h is the interpolation function for node i.
    144142         *
    145          * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
    146          */
    147 
    148         IssmDouble dbasis[3][NUMNODESP1];
    149 
    150         /*Get dbasis in actual coordinate system: */
    151         GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss);
     143         * We assume B has been allocated already, of size: 5x(NDOF2*numnodes)
     144         */
     145
     146
     147        /*Fetch number of nodes for this finite element*/
     148        int numnodes = this->NumberofNodes();
     149
     150        /*Get nodal functions derivatives*/
     151        IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
     152        GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    152153
    153154        /*Build B: */
    154         for (int i=0;i<NUMNODESP1;i++){
    155                 B[NDOF2*NUMNODESP1*0+NDOF2*i+0] = dbasis[0][i];
    156                 B[NDOF2*NUMNODESP1*0+NDOF2*i+1] = 0.;
    157 
    158                 B[NDOF2*NUMNODESP1*1+NDOF2*i+0] = 0.;
    159                 B[NDOF2*NUMNODESP1*1+NDOF2*i+1] = dbasis[1][i];
    160 
    161                 B[NDOF2*NUMNODESP1*2+NDOF2*i+0] = .5*dbasis[1][i];
    162                 B[NDOF2*NUMNODESP1*2+NDOF2*i+1] = .5*dbasis[0][i];
    163 
    164                 B[NDOF2*NUMNODESP1*3+NDOF2*i+0] = .5*dbasis[2][i];
    165                 B[NDOF2*NUMNODESP1*3+NDOF2*i+1] = 0.;
    166 
    167                 B[NDOF2*NUMNODESP1*4+NDOF2*i+0] = 0.;
    168                 B[NDOF2*NUMNODESP1*4+NDOF2*i+1] = .5*dbasis[2][i];
    169         }
    170 
     155        for(int i=0;i<numnodes;i++){
     156                B[NDOF2*numnodes*0+NDOF2*i+0] = dbasis[0*numnodes+i];
     157                B[NDOF2*numnodes*0+NDOF2*i+1] = 0.;
     158                B[NDOF2*numnodes*1+NDOF2*i+0] = 0.;
     159                B[NDOF2*numnodes*1+NDOF2*i+1] = dbasis[1*numnodes+i];
     160                B[NDOF2*numnodes*2+NDOF2*i+0] = .5*dbasis[1*numnodes+i];
     161                B[NDOF2*numnodes*2+NDOF2*i+1] = .5*dbasis[0*numnodes+i];
     162                B[NDOF2*numnodes*3+NDOF2*i+0] = .5*dbasis[2*numnodes+i];
     163                B[NDOF2*numnodes*3+NDOF2*i+1] = 0.;
     164                B[NDOF2*numnodes*4+NDOF2*i+0] = 0.;
     165                B[NDOF2*numnodes*4+NDOF2*i+1] = .5*dbasis[2*numnodes+i];
     166        }
     167
     168        /*Clean-up*/
     169        xDelete<IssmDouble>(dbasis);
    171170}
    172171/*}}}*/
    173172/*FUNCTION PentaRef::GetBprimeHO {{{*/
    174 void PentaRef::GetBprimeHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss_coord){
     173void PentaRef::GetBprimeHO(IssmDouble* B,IssmDouble* xyz_list,GaussPenta* gauss){
    175174        /*Compute B  prime matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2.
    176175         * For node i, Bi can be expressed in the actual coordinate system
    177176         * by:
    178177         *       Bi=[ 2*dh/dx     dh/dy   ]
    179          *                [   dh/dx    2*dh/dy  ]
    180          *                [ dh/dy      dh/dx    ]
    181          *                [ dh/dz         0     ]
    182          *                [  0         dh/dz    ]
     178         *          [   dh/dx    2*dh/dy  ]
     179         *          [ dh/dy      dh/dx    ]
     180         *          [ dh/dz         0     ]
     181         *          [  0         dh/dz    ]
    183182         * where h is the interpolation function for node i.
    184183         *
    185          * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
    186          */
    187         IssmDouble dbasis[3][NUMNODESP1];
    188 
    189         /*Get dbasis in actual coordinate system: */
    190         GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss_coord);
     184         * We assume B has been allocated already, of size: 5x(NDOF2*numnodes)
     185         */
     186
     187        /*Fetch number of nodes for this finite element*/
     188        int numnodes = this->NumberofNodes();
     189
     190        /*Get nodal functions derivatives*/
     191        IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
     192        GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    191193
    192194        /*Build BPrime: */
    193         for(int i=0;i<NUMNODESP1;i++){
    194                 B[NDOF2*NUMNODESP1*0+NDOF2*i+0]=2.*dbasis[0][i];
    195                 B[NDOF2*NUMNODESP1*0+NDOF2*i+1]=dbasis[1][i];
    196 
    197                 B[NDOF2*NUMNODESP1*1+NDOF2*i+0]=dbasis[0][i];
    198                 B[NDOF2*NUMNODESP1*1+NDOF2*i+1]=2.*dbasis[1][i];
    199 
    200                 B[NDOF2*NUMNODESP1*2+NDOF2*i+0]=dbasis[1][i];
    201                 B[NDOF2*NUMNODESP1*2+NDOF2*i+1]=dbasis[0][i];
    202 
    203                 B[NDOF2*NUMNODESP1*3+NDOF2*i+0]=dbasis[2][i];
    204                 B[NDOF2*NUMNODESP1*3+NDOF2*i+1]=0.;
    205 
    206                 B[NDOF2*NUMNODESP1*4+NDOF2*i+0]=0.;
    207                 B[NDOF2*NUMNODESP1*4+NDOF2*i+1]=dbasis[2][i];
    208         }
     195        for(int i=0;i<numnodes;i++){
     196                B[NDOF2*numnodes*0+NDOF2*i+0]=2.*dbasis[0*numnodes+i];
     197                B[NDOF2*numnodes*0+NDOF2*i+1]=dbasis[1*numnodes+i];
     198                B[NDOF2*numnodes*1+NDOF2*i+0]=dbasis[0*numnodes+i];
     199                B[NDOF2*numnodes*1+NDOF2*i+1]=2.*dbasis[1*numnodes+i];
     200                B[NDOF2*numnodes*2+NDOF2*i+0]=dbasis[1*numnodes+i];
     201                B[NDOF2*numnodes*2+NDOF2*i+1]=dbasis[0*numnodes+i];
     202                B[NDOF2*numnodes*3+NDOF2*i+0]=dbasis[2*numnodes+i];
     203                B[NDOF2*numnodes*3+NDOF2*i+1]=0.;
     204                B[NDOF2*numnodes*4+NDOF2*i+0]=0.;
     205                B[NDOF2*numnodes*4+NDOF2*i+1]=dbasis[2*numnodes+i];
     206        }
     207
     208        /*Clean-up*/
     209        xDelete<IssmDouble>(dbasis);
    209210}
    210211/*}}}*/
     
    11831184                dbasis[numnodes*2+i]=Jinv[2][0]*dbasis_ref[0*numnodes+i]+Jinv[2][1]*dbasis_ref[1*numnodes+i]+Jinv[2][2]*dbasis_ref[2*numnodes+i];
    11841185        }
     1186
     1187        /*Clean up*/
     1188        xDelete<IssmDouble>(dbasis_ref);
    11851189
    11861190}
     
    16221626        switch(this->element_type){
    16231627                case P1Enum:   return NUMNODESP1;
     1628                case P2Enum:   return NUMNODESP2;
    16241629                case MINIEnum: return NUMNODESP1b;
    16251630                default:       _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");
Note: See TracChangeset for help on using the changeset viewer.