Changeset 24000
- Timestamp:
- 06/07/19 13:46:04 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp ¶
r23985 r24000 285 285 IssmDouble Jdet,D_scalar,dt,h; 286 286 IssmDouble vel,vx,vy,dvxdx,dvydy; 287 IssmDouble lambda_x,lambda_y,tau;287 IssmDouble xi,tau; 288 288 IssmDouble dvx[2],dvy[2]; 289 289 IssmDouble* xyz_list = NULL; … … 304 304 ElementMatrix* Ke = element->NewElementMatrix(); 305 305 IssmDouble* basis = xNew<IssmDouble>(numnodes); 306 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 306 307 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 307 308 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); … … 367 368 switch(stabilization){ 368 369 case 0: 369 /*Nothing to be onde*/370 /*Nothing to be done*/ 370 371 break; 371 372 case 1: … … 393 394 /*SUPG*/ 394 395 if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2"); 396 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 397 vxaverage_input->GetInputAverage(&vx); 398 vyaverage_input->GetInputAverage(&vy); 395 399 vel=sqrt(vx*vx+vy*vy)+1.e-8; 396 tau=0.25;397 lambda_x=tau*h*vx/vel;398 lambda_y=tau*h*vy/vel;400 //xi=0.3130; 401 xi=1; 402 tau=xi*h/(2*vel); 399 403 break; 400 404 default: … … 415 419 &Ke->values[0],1); 416 420 } 417 if(stabilization==5){ 421 if(stabilization==5){/*{{{*/ 418 422 /*Mass matrix - part 2*/ 419 D_scalar=gauss->weight*Jdet; 420 D[0*dim+0]=D_scalar*lambda_x; 421 D[1*dim+1]=D_scalar*lambda_y; 422 TripleMultiply(Bprime,dim,numnodes,1, 423 D,dim,dim,0, 424 B,dim,numnodes,0, 425 &Ke->values[0],1); 423 for(int i=0;i<numnodes;i++){ 424 for(int j=0;j<numnodes;j++){ 425 Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]); 426 } 427 } 428 /*Mass matrix - part 3*/ 429 for(int i=0;i<numnodes;i++){ 430 for(int j=0;j<numnodes;j++){ 431 Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(basis[i]*dvxdx+basis[i]*dvydy); 432 } 433 } 426 434 427 435 /*Advection matrix - part 2, A*/ 428 D_scalar=dt*gauss->weight*Jdet; 429 D[0*dim+0]=D_scalar*dvxdx*lambda_x; 430 D[1*dim+1]=D_scalar*dvydy*lambda_y; 431 TripleMultiply(Bprime,dim,numnodes,1, 432 D,dim,dim,0, 433 B,dim,numnodes,0, 434 &Ke->values[0],1); 435 436 for(int i=0;i<numnodes;i++){ 437 for(int j=0;j<numnodes;j++){ 438 Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j])*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]); 439 } 440 } 441 /*Advection matrix - part 3, A*/ 442 for(int i=0;i<numnodes;i++){ 443 for(int j=0;j<numnodes;j++){ 444 Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j])*(basis[i]*dvxdx+basis[i]*dvydy); 445 } 446 } 447 436 448 /*Advection matrix - part 2, B*/ 437 D[0*dim+0]=D_scalar*vx*lambda_x; 438 D[1*dim+1]=D_scalar*vy*lambda_y; 439 TripleMultiply(Bprime,dim,numnodes,1, 440 D,dim,dim,0, 441 Bprime,dim,numnodes,0, 442 &Ke->values[0],1); 443 444 } 449 for(int i=0;i<numnodes;i++){ 450 for(int j=0;j<numnodes;j++){ 451 Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]); 452 } 453 } 454 /*Advection matrix - part 3, B*/ 455 for(int i=0;i<numnodes;i++){ 456 for(int j=0;j<numnodes;j++){ 457 Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(basis[i]*dvxdx+basis[i]*dvydy); 458 } 459 } 460 }/*}}}*/ 445 461 } 446 462 … … 448 464 xDelete<IssmDouble>(xyz_list); 449 465 xDelete<IssmDouble>(basis); 466 xDelete<IssmDouble>(dbasis); 450 467 xDelete<IssmDouble>(B); 451 468 xDelete<IssmDouble>(Bprime); … … 559 576 IssmDouble Jdet,dt; 560 577 IssmDouble ms,mb,gmb,fmb,thickness; 561 IssmDouble vx,vy,vel,lambda_x,lambda_y,h,tau; 578 IssmDouble vx,vy,vel,dvxdx,dvydy,xi,h,tau; 579 IssmDouble dvx[2],dvy[2]; 562 580 IssmDouble gllevelset,phi=1.; 563 581 IssmDouble* xyz_list = NULL; … … 640 658 641 659 if(stabilization==5){ //SUPG 642 /*Prepare coefficients*/643 vxaverage_input->GetInputValue(&vx,gauss);644 vxaverage_input->GetInputValue(&vy,gauss);645 vel = sqrt(vx*vx+vy*vy)+1.e-8;646 tau=0.25;647 lambda_x = tau*h*vx/vel;648 lambda_y = tau*h*vy/vel;649 650 /*Get nodal derivatives*/651 660 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 661 vxaverage_input->GetInputAverage(&vx); 662 vyaverage_input->GetInputAverage(&vy); 663 vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 664 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 665 vel=sqrt(vx*vx+vy*vy)+1.e-8; 666 dvxdx=dvx[0]; 667 dvydy=dvy[1]; 668 //xi=0.3130; 669 xi=1; 670 tau=xi*h/(2*vel); 652 671 653 672 /*Force vector - part 2*/ 654 673 for(int i=0;i<numnodes;i++){ 655 pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(lambda_x*dbasis[numnodes*0+i]+lambda_y*dbasis[numnodes*1+i]); 674 pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(tau*vx*dbasis[0*numnodes+i]+tau*vy*dbasis[1*numnodes+i]); 675 } 676 /*Force vector - part 3*/ 677 for(int i=0;i<numnodes;i++){ 678 pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*(tau*basis[i]*dvxdx+tau*basis[i]*dvydy); 656 679 } 657 680 }
Note:
See TracChangeset
for help on using the changeset viewer.