Changeset 20156
- Timestamp:
- 02/13/16 22:17:14 (9 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r20155 r20156 673 673 IssmDouble* newthickness = xNew<IssmDouble>(numnodes); 674 674 IssmDouble* deltathickness = xNew<IssmDouble>(numnodes); 675 IssmDouble* newb ed= xNew<IssmDouble>(numnodes);675 IssmDouble* newbase = xNew<IssmDouble>(numnodes); 676 676 IssmDouble* newsurface = xNew<IssmDouble>(numnodes); 677 677 IssmDouble* oldthickness = xNew<IssmDouble>(numnodes); 678 IssmDouble* oldb ed= xNew<IssmDouble>(numnodes);678 IssmDouble* oldbase = xNew<IssmDouble>(numnodes); 679 679 IssmDouble* oldsurface = xNew<IssmDouble>(numnodes); 680 680 IssmDouble* phi = xNew<IssmDouble>(numnodes); 681 IssmDouble* sealevel = xNew<IssmDouble>(numnodes); 681 682 682 683 /*Use the dof list to index into the solution vector: */ … … 689 690 } 690 691 691 /*Get previous b ed, thickness and surface*/692 basalelement->GetInputListOnNodes(&oldb ed[0],BaseEnum);692 /*Get previous base, thickness, surfac and current sealevel:*/ 693 basalelement->GetInputListOnNodes(&oldbase[0],BaseEnum); 693 694 basalelement->GetInputListOnNodes(&oldsurface[0],SurfaceEnum); 694 695 basalelement->GetInputListOnNodes(&oldthickness[0],ThicknessEnum); 695 696 basalelement->GetInputListOnNodes(&phi[0],MaskGroundediceLevelsetEnum); 696 697 698 /*What is the delta thickness , useful for Sea-level rise:*/697 basalelement->GetInputListOnNodes(&sealevel[0],SealevelEnum); 698 699 /*What is the delta thickness forcing the sea-level rise core: */ 699 700 for(i=0;i<numnodes;i++) deltathickness[i]=newthickness[i]-oldthickness[i]; 700 701 … … 705 706 706 707 for(i=0;i<numnodes;i++) { 707 /*If shelf: hydrostatic equilibrium*/ 708 if (phi[i]>0.){ 709 newsurface[i] = oldbed[i]+newthickness[i]; //surface = oldbed + newthickness 710 newbed[i] = oldbed[i]; //same bed: do nothing 711 } 712 else{ //this is an ice shelf 708 if (phi[i]>0.){ //this is an ice sheet: just add thickness to base. 709 newsurface[i] = oldbase[i]+newthickness[i]; //surface = oldbase + newthickness 710 newbase[i] = oldbase[i]; //same base: do nothing 711 } 712 else{ //this is an ice shelf: hydrostatic equilibrium*/ 713 713 if(hydroadjustment==AbsoluteEnum){ 714 newsurface[i] = newthickness[i]*(1-rho_ice/rho_water) ;715 newb ed[i] = newthickness[i]*(-rho_ice/rho_water);714 newsurface[i] = newthickness[i]*(1-rho_ice/rho_water)+sealevel[i]; 715 newbase[i] = newthickness[i]*(-rho_ice/rho_water)+sealevel[i]; 716 716 } 717 717 else if(hydroadjustment==IncrementalEnum){ 718 newsurface[i] = oldsurface[i]+(1.0-rho_ice/rho_water)*(newthickness[i]-oldthickness[i]) ; //surface = oldsurface + (1-di) * dH719 newb ed[i] = oldbed[i]-rho_ice/rho_water*(newthickness[i]-oldthickness[i]); //bed= oldbed + di * dH718 newsurface[i] = oldsurface[i]+(1.0-rho_ice/rho_water)*(newthickness[i]-oldthickness[i])+sealevel[i]; //surface = oldsurface + (1-di) * dH 719 newbase[i] = oldbase[i]-rho_ice/rho_water*(newthickness[i]-oldthickness[i])+sealevel[i]; //base = oldbed + di * dH 720 720 } 721 721 else _error_("Hydrostatic adjustment " << hydroadjustment << " (" << EnumToStringx(hydroadjustment) << ") not supported yet"); … … 727 727 element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum); 728 728 element->AddBasalInput(SurfaceEnum,newsurface,P1Enum); 729 element->AddBasalInput(BaseEnum,newb ed,P1Enum);729 element->AddBasalInput(BaseEnum,newbase,P1Enum); 730 730 731 731 /*Free ressources:*/ 732 732 xDelete<IssmDouble>(newthickness); 733 xDelete<IssmDouble>(newb ed);733 xDelete<IssmDouble>(newbase); 734 734 xDelete<IssmDouble>(newsurface); 735 735 xDelete<IssmDouble>(oldthickness); 736 736 xDelete<IssmDouble>(deltathickness); 737 xDelete<IssmDouble>(oldb ed);737 xDelete<IssmDouble>(oldbase); 738 738 xDelete<IssmDouble>(oldsurface); 739 739 xDelete<IssmDouble>(phi); -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r20155 r20156 1610 1610 /*Intermediaries*/ 1611 1611 int dim,domaintype; 1612 IssmDouble Jdet,thickness,b ed,water_pressure,ice_pressure;1612 IssmDouble Jdet,thickness,base,sealevel,water_pressure,ice_pressure; 1613 1613 IssmDouble surface_under_water,base_under_water,pressure; 1614 1614 IssmDouble *xyz_list = NULL; … … 1635 1635 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 1636 1636 Input* base_input = element->GetInput(BaseEnum); _assert_(base_input); 1637 Input* sealevel_input = element->GetInput(SealevelEnum); _assert_(sealevel_input); 1637 1638 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); 1638 1639 IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); … … 1648 1649 gauss->GaussPoint(ig); 1649 1650 thickness_input->GetInputValue(&thickness,gauss); 1650 base_input->GetInputValue(&bed,gauss); 1651 sealevel_input->GetInputValue(&sealevel,gauss); 1652 base_input->GetInputValue(&base,gauss); 1651 1653 element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss); 1652 1654 element->NodalFunctions(basis,gauss); 1653 1655 1654 surface_under_water = min(0.,thickness+b ed); // 0 if the top of the glacier is above water level1655 base_under_water = min(0.,b ed); // 0 if the bottom of the glacier is above water level1656 surface_under_water = min(0.,thickness+base-sealevel); // 0 if the top of the glacier is above water level 1657 base_under_water = min(0.,base-sealevel); // 0 if the bottom of the glacier is above water level 1656 1658 water_pressure = 1.0/2.0*gravity*rho_water*(surface_under_water*surface_under_water - base_under_water*base_under_water); 1657 1659 ice_pressure = 1.0/2.0*gravity*rho_ice*thickness*thickness; … … 2070 2072 2071 2073 /*Intermediaries*/ 2072 IssmDouble Jdet,thickness,bed, water_pressure,ice_pressure;2074 IssmDouble Jdet,thickness,bed,sealevel,water_pressure,ice_pressure; 2073 2075 IssmDouble surface_under_water,base_under_water,pressure; 2074 2076 IssmDouble *xyz_list = NULL; … … 2086 2088 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 2087 2089 Input* base_input = element->GetInput(BaseEnum); _assert_(base_input); 2090 Input* sealevel_input = element->GetInput(SealevelEnum); _assert_(sealevel_input); 2088 2091 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); 2089 2092 IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); … … 2100 2103 thickness_input->GetInputValue(&thickness,gauss); 2101 2104 base_input->GetInputValue(&bed,gauss); 2105 sealevel_input->GetInputValue(&sealevel,gauss); 2102 2106 element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss); 2103 2107 element->NodalFunctions(basis,gauss); 2104 2108 2105 surface_under_water = min(0.,thickness+bed ); // 0 if the top of the glacier is above water level2106 base_under_water = min(0.,bed ); // 0 if the bottom of the glacier is above water level2109 surface_under_water = min(0.,thickness+bed-sealevel); // 0 if the top of the glacier is above water level 2110 base_under_water = min(0.,bed-sealevel); // 0 if the bottom of the glacier is above water level 2107 2111 water_pressure = 1.0/2.0*gravity*rho_water*(surface_under_water*surface_under_water - base_under_water*base_under_water); 2108 2112 ice_pressure = 1.0/2.0*gravity*rho_ice*thickness*thickness; … … 2584 2588 /*Intermediaries*/ 2585 2589 int dim; 2586 IssmDouble Jdet,surface, z,water_pressure,ice_pressure;2590 IssmDouble Jdet,surface,sealevel,z,water_pressure,ice_pressure; 2587 2591 IssmDouble surface_under_water,base_under_water,pressure; 2588 2592 IssmDouble* xyz_list = NULL; … … 2604 2608 /*Retrieve all inputs and parameters*/ 2605 2609 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 2610 Input* sealevel_input = element->GetInput(SealevelEnum); _assert_(sealevel_input); 2606 2611 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); 2607 2612 IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); … … 2622 2627 gauss->GaussPoint(ig); 2623 2628 surface_input->GetInputValue(&surface,gauss); 2629 sealevel_input->GetInputValue(&sealevel,gauss); 2624 2630 if(dim==3) z=element->GetZcoord(xyz_list,gauss); 2625 2631 else z=element->GetYcoord(xyz_list,gauss); … … 2627 2633 element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss); 2628 2634 2629 water_pressure = rho_water*gravity*min(0.,z );//0 if the gaussian point is above water level2635 water_pressure = rho_water*gravity*min(0.,z-sealevel);//0 if the gaussian point is above water level 2630 2636 ice_pressure = rho_ice*gravity*(surface-z); 2631 2637 pressure = ice_pressure + water_pressure; … … 3811 3817 /*Intermediaries*/ 3812 3818 int i,dim; 3813 IssmDouble Jdet,pressure,surface, z;3819 IssmDouble Jdet,pressure,surface,sealevel,z; 3814 3820 IssmDouble normal[3]; 3815 3821 IssmDouble *xyz_list = NULL; … … 3843 3849 element->NormalSection(&normal[0],xyz_list_front); 3844 3850 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 3851 Input* sealevel_input = element->GetInput(SealevelEnum); _assert_(sealevel_input); 3845 3852 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); 3846 3853 IssmDouble gravity = element->GetMaterialParameter(ConstantsGEnum); … … 3859 3866 element->NodalFunctionsVelocity(vbasis,gauss); 3860 3867 surface_input->GetInputValue(&surface,gauss); 3868 sealevel_input->GetInputValue(&sealevel,gauss); 3861 3869 if(dim==3) z=element->GetZcoord(xyz_list,gauss); 3862 3870 else z=element->GetYcoord(xyz_list,gauss); 3863 pressure = rho_water*gravity*min(0.,z );//0 if the gaussian point is above water level3871 pressure = rho_water*gravity*min(0.,z-sealevel);//0 if the gaussian point is above water level 3864 3872 3865 3873 for (int i=0;i<vnumnodes;i++){ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r20154 r20156 1653 1653 IssmDouble* b = xNew<IssmDouble>(numvertices); 1654 1654 IssmDouble* r = xNew<IssmDouble>(numvertices); 1655 IssmDouble* sl = xNew<IssmDouble>(numvertices); 1655 1656 1656 1657 /*Recover info at the vertices: */ … … 1661 1662 GetInputListOnVertices(&b[0],BaseEnum); 1662 1663 GetInputListOnVertices(&r[0],BedEnum); 1664 GetInputListOnVertices(&sl[0],SealevelEnum); 1663 1665 GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum); 1664 1666 rho_water = matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum); … … 1684 1686 /*Change only if AggressiveMigration or if the ice sheet is in contact with the ocean*/ 1685 1687 else{ // phi>0 1686 bed_hydro=-density*h[i] ;1688 bed_hydro=-density*h[i]+sl[i]; 1687 1689 if (bed_hydro>r[i]){ 1688 1690 /*Unground only if the element is connected to the ice shelf*/ 1689 1691 if(migration_style==AggressiveMigrationEnum || migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){ 1690 s[i] = (1-density)*h[i] ;1691 b[i] = -density*h[i] ;1692 s[i] = (1-density)*h[i]+sl[i]; 1693 b[i] = -density*h[i]+sl[i]; 1692 1694 } 1693 1695 else if(migration_style==SoftMigrationEnum && phi_ungrounding[vertices[i]->Pid()]<0.){ 1694 s[i] = (1-density)*h[i] ;1695 b[i] = -density*h[i] ;1696 s[i] = (1-density)*h[i]+sl[i]; 1697 b[i] = -density*h[i]+sl[i]; 1696 1698 } 1697 1699 else{ … … 1705 1707 for(i=0;i<numvertices;i++){ 1706 1708 if(migration_style==SoftMigrationEnum){ 1707 bed_hydro=-density*h[i] ;1709 bed_hydro=-density*h[i]+sl[i]; 1708 1710 if(phi[i]<0. || bed_hydro<=r[i] || phi_ungrounding[vertices[i]->Pid()]<0.){ 1709 phi[i]=h[i]+ r[i]/density;1711 phi[i]=h[i]+(r[i]-sl[i])/density; 1710 1712 } 1711 1713 } 1712 else if(migration_style!=ContactEnum) phi[i]=h[i]+ r[i]/density;1714 else if(migration_style!=ContactEnum) phi[i]=h[i]+(r[i]-sl[i])/density; 1713 1715 else{ 1714 1716 /*do nothing*/ … … 1727 1729 xDelete<IssmDouble>(b); 1728 1730 xDelete<IssmDouble>(s); 1731 xDelete<IssmDouble>(sl); 1729 1732 xDelete<IssmDouble>(h); 1730 1733 -
issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
r19740 r20156 67 67 IssmDouble Neff; 68 68 IssmDouble drag_coefficient; 69 IssmDouble bed,thickness ;69 IssmDouble bed,thickness,sealevel; 70 70 IssmDouble alpha_complement; 71 71 … … 75 75 element->GetInputValue(&thickness, gauss,ThicknessEnum); 76 76 element->GetInputValue(&bed, gauss,BaseEnum); 77 element->GetInputValue(&sealevel, gauss,SealevelEnum); 77 78 element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum); 78 79 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); … … 85 86 86 87 //From bed and thickness, compute effective pressure when drag is viscous: 87 Neff=gravity*(rho_ice*thickness+rho_water* bed);88 Neff=gravity*(rho_ice*thickness+rho_water*(bed-sealevel)); 88 89 if(Neff<0)Neff=0; 89 90 … … 231 232 IssmDouble drag_p, drag_q; 232 233 IssmDouble Neff; 233 IssmDouble thickness,base,bed,floatation_thickness ;234 IssmDouble thickness,base,bed,floatation_thickness,sealevel; 234 235 IssmDouble vx,vy,vz,vmag; 235 236 IssmDouble drag_coefficient,drag_coefficient_coulomb; … … 241 242 element->GetInputValue(&thickness, gauss,ThicknessEnum); 242 243 element->GetInputValue(&base, gauss,BaseEnum); 244 element->GetInputValue(&sealevel, gauss,SealevelEnum); 243 245 element->GetInputValue(&bed, gauss,BedEnum); 244 246 element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum); … … 253 255 254 256 //From base and thickness, compute effective pressure when drag is viscous: 255 Neff=gravity*(rho_ice*thickness+rho_water* base);257 Neff=gravity*(rho_ice*thickness+rho_water*(base-sealevel)); 256 258 if(Neff<0)Neff=0; 257 259 … … 407 409 IssmDouble drag_p, drag_q; 408 410 IssmDouble Neff; 409 IssmDouble thickness,b ed;411 IssmDouble thickness,base,sealevel; 410 412 IssmDouble vx,vy,vz,vmag; 411 413 IssmDouble drag_coefficient; … … 416 418 element->GetInputValue(&drag_q,FrictionQEnum); 417 419 element->GetInputValue(&thickness, gauss,ThicknessEnum); 418 element->GetInputValue(&bed, gauss,BaseEnum); 420 element->GetInputValue(&base, gauss,BaseEnum); 421 element->GetInputValue(&sealevel, gauss,SealevelEnum); 419 422 element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum); 420 423 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); … … 426 429 s=1./drag_p; 427 430 428 //From b edand thickness, compute effective pressure when drag is viscous:429 Neff=gravity*(rho_ice*thickness+rho_water* bed);431 //From base and thickness, compute effective pressure when drag is viscous: 432 Neff=gravity*(rho_ice*thickness+rho_water*(base-sealevel)); 430 433 if(Neff<0)Neff=0; 431 434 … … 467 470 IssmDouble drag_p, drag_q; 468 471 IssmDouble Neff,F; 469 IssmDouble thickness,bed ;472 IssmDouble thickness,bed,sealevel; 470 473 IssmDouble vx,vy,vz,vmag; 471 474 IssmDouble drag_coefficient,water_layer; … … 478 481 element->GetInputValue(&thickness, gauss,ThicknessEnum); 479 482 element->GetInputValue(&bed, gauss,BaseEnum); 483 element->GetInputValue(&sealevel, gauss,SealevelEnum); 480 484 element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum); 481 485 element->GetInputValue(&water_layer, gauss,FrictionWaterLayerEnum); … … 490 494 //From bed and thickness, compute effective pressure when drag is viscous: 491 495 if(bed>0) bed=0; 492 if(water_layer==0) Neff=gravity*rho_ice*thickness+gravity*rho_water* bed;496 if(water_layer==0) Neff=gravity*rho_ice*thickness+gravity*rho_water*(bed-sealevel); 493 497 else if(water_layer>0) Neff=gravity*rho_ice*thickness*F; 494 498 else _error_("negative water layer thickness"); … … 599 603 IssmDouble Neff; 600 604 IssmDouble drag_coefficient; 601 IssmDouble bed,thickness,head ;605 IssmDouble bed,thickness,head,sealevel; 602 606 IssmDouble alpha2; 603 607 … … 606 610 element->GetInputValue(&bed, gauss,BaseEnum); 607 611 element->GetInputValue(&head, gauss,HydrologyHeadEnum); 612 element->GetInputValue(&sealevel, gauss,SealevelEnum); 608 613 element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum); 609 614 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum); … … 613 618 //From bed and thickness, compute effective pressure when drag is viscous: 614 619 pressure_ice = rho_ice*gravity*thickness; 615 pressure_water = rho_water*gravity*(head-bed );620 pressure_water = rho_water*gravity*(head-bed+sealevel); 616 621 Neff=pressure_ice-pressure_water; 617 622 if(Neff<0.) Neff=0.;
Note:
See TracChangeset
for help on using the changeset viewer.