Changeset 15621 for issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
- Timestamp:
- 07/25/13 14:54:51 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
r15567 r15621 45 45 /*FUNCTION PentaRef::SetElementType{{{*/ 46 46 void PentaRef::SetElementType(int type,int type_counter){ 47 48 _assert_(type==P1Enum || type==P1DGEnum);49 47 50 48 /*initialize element type*/ … … 143 141 * where h is the interpolation function for node i. 144 142 * 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); 152 153 153 154 /*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); 171 170 } 172 171 /*}}}*/ 173 172 /*FUNCTION PentaRef::GetBprimeHO {{{*/ 174 void PentaRef::GetBprimeHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss_coord){173 void PentaRef::GetBprimeHO(IssmDouble* B,IssmDouble* xyz_list,GaussPenta* gauss){ 175 174 /*Compute B prime matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 176 175 * For node i, Bi can be expressed in the actual coordinate system 177 176 * by: 178 177 * Bi=[ 2*dh/dx dh/dy ] 179 * 180 * 181 * 182 * 178 * [ dh/dx 2*dh/dy ] 179 * [ dh/dy dh/dx ] 180 * [ dh/dz 0 ] 181 * [ 0 dh/dz ] 183 182 * where h is the interpolation function for node i. 184 183 * 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); 191 193 192 194 /*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); 209 210 } 210 211 /*}}}*/ … … 1183 1184 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]; 1184 1185 } 1186 1187 /*Clean up*/ 1188 xDelete<IssmDouble>(dbasis_ref); 1185 1189 1186 1190 } … … 1622 1626 switch(this->element_type){ 1623 1627 case P1Enum: return NUMNODESP1; 1628 case P2Enum: return NUMNODESP2; 1624 1629 case MINIEnum: return NUMNODESP1b; 1625 1630 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");
Note:
See TracChangeset
for help on using the changeset viewer.