Changeset 15314
- Timestamp:
- 06/22/13 09:20:42 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp
r15313 r15314 63 63 */ 64 64 65 int i; 66 IssmDouble dbasis[NDOF2][NUMNODESP1]; 67 68 /*Get dh1dh2dh3 in actual coordinate system: */ 69 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); 65 /*Fetch number of nodes for this finite element*/ 66 int numnodes = this->NumberofNodes(); 67 68 /*Get nodal functions*/ 69 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 70 GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss); 70 71 71 72 /*Build B: */ 72 for (i=0;i<NUMNODESP1;i++){ 73 B[NDOF1*NUMNODESP1*0+NDOF1*i]=dbasis[0][i]; 74 B[NDOF1*NUMNODESP1*1+NDOF1*i]=dbasis[1][i]; 75 } 73 for(int i=0;i<numnodes;i++){ 74 B[numnodes*0+i]=dbasis[0*numnodes+i]; 75 B[numnodes*1+i]=dbasis[1*numnodes+i]; 76 } 77 78 /*Clean-up*/ 79 xDelete<IssmDouble>(dbasis); 76 80 } 77 81 /*}}}*/ … … 132 136 /*Build B': */ 133 137 for (int i=0;i<NUMNODESP1;i++){ 134 *(B+NDOF2*NUMNODESP1*0+NDOF2*i)=dbasis[0][i];135 *(B+NDOF2*NUMNODESP1*0+NDOF2*i+1)=0;136 *(B+NDOF2*NUMNODESP1*1+NDOF2*i)=0;137 *(B+NDOF2*NUMNODESP1*1+NDOF2*i+1)=dbasis[1][i];138 *(B+NDOF2*NUMNODESP1*2+NDOF2*i)=0.5*dbasis[1][i];139 *(B+NDOF2*NUMNODESP1*2+NDOF2*i+1)=0.5*dbasis[0][i];138 B[NDOF2*NUMNODESP1*0+NDOF2*i+0]=dbasis[0][i]; 139 B[NDOF2*NUMNODESP1*0+NDOF2*i+1]=0.; 140 B[NDOF2*NUMNODESP1*1+NDOF2*i+0]=0.; 141 B[NDOF2*NUMNODESP1*1+NDOF2*i+1]=dbasis[1][i]; 142 B[NDOF2*NUMNODESP1*2+NDOF2*i+0]=0.5*dbasis[1][i]; 143 B[NDOF2*NUMNODESP1*2+NDOF2*i+1]=0.5*dbasis[0][i]; 140 144 } 141 145 } … … 150 154 */ 151 155 152 IssmDouble l1l3[NUMNODESP1]; 153 154 GetNodalFunctions(&l1l3[0],gauss); 155 156 B[0] = +l1l3[index1]; 157 B[1] = +l1l3[index2]; 158 B[2] = -l1l3[index1]; 159 B[3] = -l1l3[index2]; 156 IssmDouble basis[NUMNODESP1]; 157 GetNodalFunctions(&basis[0],gauss); 158 159 B[0] = +basis[index1]; 160 B[1] = +basis[index2]; 161 B[2] = -basis[index1]; 162 B[3] = -basis[index2]; 160 163 } 161 164 /*}}}*/ … … 169 172 */ 170 173 171 IssmDouble l1l3[NUMNODESP1]; 172 173 GetNodalFunctions(&l1l3[0],gauss); 174 175 Bprime[0] = l1l3[index1]; 176 Bprime[1] = l1l3[index2]; 177 Bprime[2] = l1l3[index1]; 178 Bprime[3] = l1l3[index2]; 174 IssmDouble basis[NUMNODESP1]; 175 GetNodalFunctions(&basis[0],gauss); 176 177 Bprime[0] = basis[index1]; 178 Bprime[1] = basis[index2]; 179 Bprime[2] = basis[index1]; 180 Bprime[3] = basis[index2]; 179 181 } 180 182 /*}}}*/ 181 183 /*FUNCTION TriaRef::GetBPrognostic{{{*/ 182 void TriaRef::GetBPrognostic(IssmDouble* B _prog, IssmDouble* xyz_list, GaussTria* gauss){184 void TriaRef::GetBPrognostic(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){ 183 185 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 184 186 * For node i, Bi can be expressed in the actual coordinate system … … 196 198 GetNodalFunctions(&basis[0],gauss); 197 199 198 /*Build B _prog: */200 /*Build B: */ 199 201 for (int i=0;i<NUMNODESP1;i++){ 200 *(B_prog+NDOF1*NUMNODESP1*0+NDOF1*i)=basis[i];201 *(B_prog+NDOF1*NUMNODESP1*1+NDOF1*i)=basis[i];202 B[NUMNODESP1*0+i]=basis[i]; 203 B[NUMNODESP1*1+i]=basis[i]; 202 204 } 203 205 } … … 220 222 int numnodes = this->NumberofNodes(); 221 223 222 /*Get nodal functions */224 /*Get nodal functions derivatives*/ 223 225 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 224 226 GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss); … … 260 262 261 263 /*Build Bprime: */ 262 for 263 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i)=dbasis[0][i];264 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i+1)=0;265 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i)=0;266 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i+1)=dbasis[1][i];267 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i)=dbasis[1][i];268 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i+1)=dbasis[0][i];269 *(Bprime+NDOF2*NUMNODESP1*3+NDOF2*i)=dbasis[0][i];270 *(Bprime+NDOF2*NUMNODESP1*3+NDOF2*i+1)=dbasis[1][i];264 for(int i=0;i<NUMNODESP1;i++){ 265 Bprime[NDOF2*NUMNODESP1*0+NDOF2*i+0]=dbasis[0][i]; 266 Bprime[NDOF2*NUMNODESP1*0+NDOF2*i+1]=0.; 267 Bprime[NDOF2*NUMNODESP1*1+NDOF2*i+0]=0.; 268 Bprime[NDOF2*NUMNODESP1*1+NDOF2*i+1]=dbasis[1][i]; 269 Bprime[NDOF2*NUMNODESP1*2+NDOF2*i+0]=dbasis[1][i]; 270 Bprime[NDOF2*NUMNODESP1*2+NDOF2*i+1]=dbasis[0][i]; 271 Bprime[NDOF2*NUMNODESP1*3+NDOF2*i+0]=dbasis[0][i]; 272 Bprime[NDOF2*NUMNODESP1*3+NDOF2*i+1]=dbasis[1][i]; 271 273 } 272 274 } 273 275 /*}}}*/ 274 276 /*FUNCTION TriaRef::GetBprimePrognostic{{{*/ 275 void TriaRef::GetBprimePrognostic(IssmDouble* Bprime _prog, IssmDouble* xyz_list, GaussTria* gauss){277 void TriaRef::GetBprimePrognostic(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){ 276 278 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 277 279 * For node i, Bi' can be expressed in the actual coordinate system … … 291 293 292 294 /*Build B': */ 293 for 294 *(Bprime_prog+NDOF1*NUMNODESP1*0+NDOF1*i)=dbasis[0][i];295 *(Bprime_prog+NDOF1*NUMNODESP1*1+NDOF1*i)=dbasis[1][i];296 } 297 } 298 /*}}}*/ 299 /*FUNCTION TriaRef::Get L{{{*/295 for(int i=0;i<NUMNODESP1;i++){ 296 Bprime[NUMNODESP1*0+i]=dbasis[0][i]; 297 Bprime[NUMNODESP1*1+i]=dbasis[1][i]; 298 } 299 } 300 /*}}}*/ 301 /*FUNCTION TriaRef::GetBMacAyealFriction{{{*/ 300 302 void TriaRef::GetBMacAyealFriction(IssmDouble* B, IssmDouble* xyz_list,GaussTria* gauss){ 301 303 /*Compute B matrix. B=[B1 B2 B3] where Bi is square and of size 2. … … 317 319 /*Build L: */ 318 320 for (i=0;i<NUMNODESP1;i++){ 319 *(B+2*NUMNODESP1*0+2*i)=basis[i]; //L[0][NDOF2*i]=dbasis[0][i];320 *(B+2*NUMNODESP1*0+2*i+1)=0;321 *(B+2*NUMNODESP1*1+2*i)=0;322 *(B+2*NUMNODESP1*1+2*i+1)=basis[i];321 B[2*NUMNODESP1*0+2*i+0]=basis[i]; //L[0][NDOF2*i]=dbasis[0][i]; 322 B[2*NUMNODESP1*0+2*i+1]=0.; 323 B[2*NUMNODESP1*1+2*i+0]=0.; 324 B[2*NUMNODESP1*1+2*i+1]=basis[i]; 323 325 } 324 326 } … … 328 330 /*The Jacobian is constant over the element, discard the gaussian points. 329 331 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 330 IssmDouble x1,y1,x2,y2,x3,y3; 331 332 x1=*(xyz_list+NUMNODESP1*0+0); 333 y1=*(xyz_list+NUMNODESP1*0+1); 334 x2=*(xyz_list+NUMNODESP1*1+0); 335 y2=*(xyz_list+NUMNODESP1*1+1); 336 x3=*(xyz_list+NUMNODESP1*2+0); 337 y3=*(xyz_list+NUMNODESP1*2+1); 338 339 *(J+NDOF2*0+0)=0.5*(x2-x1); 340 *(J+NDOF2*1+0)=SQRT3/6.0*(2*x3-x1-x2); 341 *(J+NDOF2*0+1)=0.5*(y2-y1); 342 *(J+NDOF2*1+1)=SQRT3/6.0*(2*y3-y1-y2); 332 333 IssmDouble x1 = xyz_list[3*0+0]; 334 IssmDouble y1 = xyz_list[3*0+1]; 335 IssmDouble x2 = xyz_list[3*1+0]; 336 IssmDouble y2 = xyz_list[3*1+1]; 337 IssmDouble x3 = xyz_list[3*2+0]; 338 IssmDouble y3 = xyz_list[3*2+1]; 339 340 J[2*0+0] = 0.5*(x2-x1); 341 J[2*1+0] = SQRT3/6.0*(2*x3-x1-x2); 342 J[2*0+1] = 0.5*(y2-y1); 343 J[2*1+1] = SQRT3/6.0*(2*y3-y1-y2); 343 344 } 344 345 /*}}}*/ … … 347 348 /*The Jacobian determinant is constant over the element, discard the gaussian points. 348 349 * J is assumed to have been allocated*/ 349 IssmDouble x1,y1,x2,y2; 350 351 x1=*(xyz_list+3*0+0); 352 y1=*(xyz_list+3*0+1); 353 x2=*(xyz_list+3*1+0); 354 y2=*(xyz_list+3*1+1); 355 356 *Jdet=1.0/2.0*sqrt(pow(x2-x1,2.) + pow(y2-y1,2.)); 350 351 IssmDouble x1 = xyz_list[3*0+0]; 352 IssmDouble y1 = xyz_list[3*0+1]; 353 IssmDouble x2 = xyz_list[3*1+0]; 354 IssmDouble y2 = xyz_list[3*1+1]; 355 356 *Jdet = .5*sqrt(pow(x2-x1,2) + pow(y2-y1,2)); 357 357 if(*Jdet<0) _error_("negative jacobian determinant!"); 358 358 … … 391 391 void TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss){ 392 392 /*This routine returns the values of the nodal functions at the gaussian point.*/ 393 394 _assert_(basis); 393 395 394 396 switch(this->element_type){ … … 483 485 /*This routine returns the values of the nodal functions derivatives (with respect to the 484 486 * natural coordinate system) at the gaussian point. */ 487 488 _assert_(dbasis && gauss); 485 489 486 490 switch(this->element_type){
Note:
See TracChangeset
for help on using the changeset viewer.