Changeset 17331
- Timestamp:
- 02/21/14 09:21:47 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r17277 r17331 261 261 /*Intermediaries */ 262 262 int stabilization; 263 int meshtype ;263 int meshtype,dim; 264 264 IssmDouble Jdet,D_scalar,dt,h; 265 265 IssmDouble vel,vx,vy,dvxdx,dvydy; … … 267 267 IssmDouble* xyz_list = NULL; 268 268 269 /*Get problem dimension*/ 270 element->FindParam(&meshtype,MeshTypeEnum); 271 switch(meshtype){ 272 case Mesh2DverticalEnum: dim = 1; break; 273 case Mesh2DhorizontalEnum: dim = 2; break; 274 case Mesh3DEnum: dim = 2; break; 275 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 276 } 277 269 278 /*Fetch number of nodes and dof for this finite element*/ 270 279 int numnodes = element->GetNumberOfNodes(); … … 273 282 ElementMatrix* Ke = element->NewElementMatrix(); 274 283 IssmDouble* basis = xNew<IssmDouble>(numnodes); 275 IssmDouble* B = xNew<IssmDouble>( 2*numnodes);276 IssmDouble* Bprime = xNew<IssmDouble>( 2*numnodes);277 IssmDouble D[2][2]={0.};284 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 285 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 286 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 278 287 279 288 /*Retrieve all inputs and parameters*/ … … 290 299 else{ 291 300 vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input); 292 vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input); 301 if(dim==2) vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input); 302 293 303 } 294 304 h = element->CharacteristicLength(); … … 303 313 304 314 vxaverage_input->GetInputValue(&vx,gauss); 305 vyaverage_input->GetInputValue(&vy,gauss);306 315 vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 307 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 316 if(dim==2){ 317 vyaverage_input->GetInputValue(&vy,gauss); 318 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 319 } 308 320 309 321 D_scalar=gauss->weight*Jdet; … … 313 325 &Ke->values[0],1); 314 326 315 GetB(B,element, xyz_list,gauss);316 GetBprime(Bprime,element, xyz_list,gauss);327 GetB(B,element,dim,xyz_list,gauss); 328 GetBprime(Bprime,element,dim,xyz_list,gauss); 317 329 318 330 dvxdx=dvx[0]; 319 dvydy=dvy[1];331 if(dim==2) dvydy=dvy[1]; 320 332 D_scalar=dt*gauss->weight*Jdet; 321 333 322 D[0][0]=D_scalar*dvxdx; 323 D[1][1]=D_scalar*dvydy; 324 TripleMultiply(B,2,numnodes,1, 325 &D[0][0],2,2,0, 326 B,2,numnodes,0, 334 D[0*dim+0]=D_scalar*dvxdx; 335 if(dim==2) D[1*dim+1]=D_scalar*dvydy; 336 337 TripleMultiply(B,dim,numnodes,1, 338 D,dim,dim,0, 339 B,dim,numnodes,0, 327 340 &Ke->values[0],1); 328 341 329 D[0][0]=D_scalar*vx; 330 D[1][1]=D_scalar*vy; 331 TripleMultiply(B,2,numnodes,1, 332 &D[0][0],2,2,0, 333 Bprime,2,numnodes,0, 342 D[0*dim+0]=D_scalar*vx; 343 if(dim==2) D[1*dim+1]=D_scalar*vy; 344 345 TripleMultiply(B,dim,numnodes,1, 346 D,dim,dim,0, 347 Bprime,dim,numnodes,0, 334 348 &Ke->values[0],1); 335 349 336 350 if(stabilization==2){ 337 /*Streamline upwinding*/ 338 vel=sqrt(vx*vx+vy*vy)+1.e-8; 339 D[0][0]=h/(2*vel)*vx*vx; 340 D[1][0]=h/(2*vel)*vy*vx; 341 D[0][1]=h/(2*vel)*vx*vy; 342 D[1][1]=h/(2*vel)*vy*vy; 351 if(dim==1){ 352 vel=fabs(vx)+1.e-8; 353 D[0]=h/(2*vel)*vx*vx; 354 } 355 else{ 356 /*Streamline upwinding*/ 357 vel=sqrt(vx*vx+vy*vy)+1.e-8; 358 D[0*dim+0]=h/(2*vel)*vx*vx; 359 D[1*dim+0]=h/(2*vel)*vy*vx; 360 D[0*dim+1]=h/(2*vel)*vx*vy; 361 D[1*dim+1]=h/(2*vel)*vy*vy; 362 } 343 363 } 344 364 else if(stabilization==1){ 345 365 /*SSA*/ 346 366 vxaverage_input->GetInputAverage(&vx); 347 vyaverage_input->GetInputAverage(&vy);348 D[0 ][0]=h/2.0*fabs(vx);349 D[1][1]=h/2.0*fabs(vy);367 if(dim==2) vyaverage_input->GetInputAverage(&vy); 368 D[0*dim+0]=h/2.0*fabs(vx); 369 if(dim==2) D[1*dim+1]=h/2.0*fabs(vy); 350 370 } 351 371 if(stabilization==1 || stabilization==2){ 352 D[0][0]=D_scalar*D[0][0]; 353 D[1][0]=D_scalar*D[1][0]; 354 D[0][1]=D_scalar*D[0][1]; 355 D[1][1]=D_scalar*D[1][1]; 356 TripleMultiply(Bprime,2,numnodes,1, 357 &D[0][0],2,2,0, 358 Bprime,2,numnodes,0, 372 if(dim==1) D[0]=D_scalar*D[0]; 373 else{ 374 D[0*dim+0]=D_scalar*D[0*dim+0]; 375 D[1*dim+0]=D_scalar*D[1*dim+0]; 376 D[0*dim+1]=D_scalar*D[0*dim+1]; 377 D[1*dim+1]=D_scalar*D[1*dim+1]; 378 } 379 380 TripleMultiply(Bprime,dim,numnodes,1, 381 D,dim,dim,0, 382 Bprime,dim,numnodes,0, 359 383 &Ke->values[0],1); 360 384 } … … 366 390 xDelete<IssmDouble>(B); 367 391 xDelete<IssmDouble>(Bprime); 392 xDelete<IssmDouble>(D); 368 393 delete gauss; 369 394 return Ke; … … 422 447 423 448 /*WARNING: B and Bprime are inverted compared to CG*/ 424 GetB(Bprime,element, xyz_list,gauss);425 GetBprime(B,element, xyz_list,gauss);449 GetB(Bprime,element,2,xyz_list,gauss); 450 GetBprime(B,element,2,xyz_list,gauss); 426 451 427 452 D_scalar = - dt*gauss->weight*Jdet; … … 568 593 return pe; 569 594 }/*}}}*/ 570 void MasstransportAnalysis::GetB(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/595 void MasstransportAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 571 596 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 572 597 * For node i, Bi can be expressed in the actual coordinate system … … 588 613 /*Build B: */ 589 614 for(int i=0;i<numnodes;i++){ 590 B[numnodes*0+i] = basis[i]; 591 B[numnodes*1+i] = basis[i]; 615 for(int j=0;j<dim;j++){ 616 B[numnodes*j+i] = basis[i]; 617 } 592 618 } 593 619 … … 595 621 xDelete<IssmDouble>(basis); 596 622 }/*}}}*/ 597 void MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/623 void MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 598 624 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 599 625 * For node i, Bi' can be expressed in the actual coordinate system … … 610 636 611 637 /*Get nodal functions derivatives*/ 612 IssmDouble* dbasis=xNew<IssmDouble>( 2*numnodes);638 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes); 613 639 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 614 640 615 641 /*Build B': */ 616 642 for(int i=0;i<numnodes;i++){ 617 Bprime[numnodes*0+i] = dbasis[0*numnodes+i]; 618 Bprime[numnodes*1+i] = dbasis[1*numnodes+i]; 643 for(int j=0;j<dim;j++){ 644 Bprime[numnodes*j+i] = dbasis[j*numnodes+i]; 645 } 619 646 } 620 647 -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h
r17212 r17331 30 30 ElementVector* CreatePVectorCG(Element* element); 31 31 ElementVector* CreatePVectorDG(Element* element); 32 void GetB(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss);33 void GetBprime(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss);32 void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 33 void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 34 34 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 35 35 void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note:
See TracChangeset
for help on using the changeset viewer.