Changeset 23985
- Timestamp:
- 06/04/19 16:51:10 (6 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r23959 r23985 285 285 IssmDouble Jdet,D_scalar,dt,h; 286 286 IssmDouble vel,vx,vy,dvxdx,dvydy; 287 IssmDouble lambda_x,lambda_y,tau; 287 288 IssmDouble dvx[2],dvy[2]; 288 289 IssmDouble* xyz_list = NULL; … … 389 390 } 390 391 break; 392 case 5: 393 /*SUPG*/ 394 if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2"); 395 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; 399 break; 391 400 default: 392 401 _error_("Stabilization "<<stabilization<<" not supported yet"); … … 405 414 Bprime,dim,numnodes,0, 406 415 &Ke->values[0],1); 416 } 417 if(stabilization==5){ 418 /*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); 426 427 /*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 /*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 407 444 } 408 445 } … … 516 553 517 554 /*Intermediaries */ 555 int stabilization,dim,domaintype; 518 556 int melt_style,point1; 519 557 bool mainlyfloating; … … 521 559 IssmDouble Jdet,dt; 522 560 IssmDouble ms,mb,gmb,fmb,thickness; 561 IssmDouble vx,vy,vel,lambda_x,lambda_y,h,tau; 523 562 IssmDouble gllevelset,phi=1.; 524 563 IssmDouble* xyz_list = NULL; 525 564 Gauss* gauss = NULL; 526 565 566 /*Get problem dimension*/ 567 element->FindParam(&domaintype,DomainTypeEnum); 568 switch(domaintype){ 569 case Domain2DverticalEnum: dim = 1; break; 570 case Domain2DhorizontalEnum: dim = 2; break; 571 case Domain3DEnum: dim = 2; break; 572 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 573 } 574 527 575 /*Fetch number of nodes and dof for this finite element*/ 528 576 int numnodes = element->GetNumberOfNodes(); … … 531 579 ElementVector* pe = element->NewElementVector(); 532 580 IssmDouble* basis = xNew<IssmDouble>(numnodes); 581 IssmDouble* dbasis= xNew<IssmDouble>(dim*numnodes); 533 582 534 583 /*Retrieve all inputs and parameters*/ … … 536 585 element->FindParam(&melt_style,GroundinglineMeltInterpolationEnum); 537 586 element->FindParam(&dt,TimesteppingTimeStepEnum); 587 element->FindParam(&stabilization,MasstransportStabilizationEnum); 538 588 Input* gmb_input = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(gmb_input); 539 589 Input* fmb_input = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fmb_input); … … 541 591 Input* ms_input = element->GetInput(SmbMassBalanceEnum); _assert_(ms_input); 542 592 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 543 593 Input* vxaverage_input = element->GetInput(VxAverageEnum); _assert_(vxaverage_input); 594 Input* vyaverage_input = element->GetInput(VyAverageEnum); _assert_(vyaverage_input); 595 596 h=element->CharacteristicLength(); 597 544 598 /*Recover portion of element that is grounded*/ 545 599 phi=element->GetGroundedPortion(xyz_list); … … 584 638 585 639 for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*basis[i]; 640 641 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 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 652 653 /*Force vector - part 2*/ 654 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]); 656 } 657 } 658 586 659 } 587 660 … … 589 662 xDelete<IssmDouble>(xyz_list); 590 663 xDelete<IssmDouble>(basis); 664 xDelete<IssmDouble>(dbasis); 591 665 delete gauss; 592 666 return pe; -
issm/trunk-jpl/src/m/classes/masstransport.m
r21049 r23985 92 92 md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]); 93 93 md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',{'Absolute' 'Incremental'}); 94 md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4 ]);94 md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4 5]); 95 95 md = checkfield(md,'fieldname','masstransport.min_thickness','>',0); 96 96 md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1); … … 103 103 fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]'); 104 104 fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' '); 105 fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport ');105 fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport, 5: streamline upwind Petrov-Galerkin (SUPG)'); 106 106 107 107 disp(sprintf('\n %s','Penalty options:'));
Note:
See TracChangeset
for help on using the changeset viewer.