Ignore:
Timestamp:
02/29/24 15:22:20 (13 months ago)
Author:
poinelli
Message:

NEW: Add IntrusionMelt module to include melt under grounding zones, edits after Robel, Wilson, Seroussi TC (2022)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

    r27869 r28115  
    156156        iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum);
    157157        iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum);
     158       
    158159        if(isgroundingline)     iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum);
    159160        /*Initialize ThicknessResidual input*/
     
    272273        parameters->AddObject(iomodel->CopyConstantObject("md.masstransport.min_thickness",MasstransportMinThicknessEnum));
    273274        parameters->AddObject(iomodel->CopyConstantObject("md.masstransport.penalty_factor",MasstransportPenaltyFactorEnum));
     275        parameters->AddObject(iomodel->CopyConstantObject("md.groundingline.intrusion_distance",GroundinglineIntrusionDistanceEnum));
    274276
    275277        iomodel->FindConstant(&requestedoutputs,&numoutputs,"md.masstransport.requested_outputs");
     
    622624        bool        mainlyfloating;
    623625        IssmDouble  fraction1,fraction2;
    624         IssmDouble  Jdet,dt;
    625         IssmDouble  ms,mb,gmb,fmb,thickness,fmb_pert;
     626        IssmDouble  Jdet,dt,intrusiondist;
     627        IssmDouble  ms,mb,gmb,fmb,thickness,fmb_pert,gldistance;
    626628        IssmDouble  vx,vy,vel,dvxdx,dvydy,xi,h,tau;
    627629        IssmDouble  dvx[2],dvy[2];
     
    652654        element->FindParam(&dt,TimesteppingTimeStepEnum);
    653655        element->FindParam(&stabilization,MasstransportStabilizationEnum);
     656        element->FindParam(&intrusiondist,GroundinglineIntrusionDistanceEnum);
     657
    654658        Input* gmb_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
    655659        Input* fmb_input        = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
     
    660664        Input* vxaverage_input  = element->GetInput(VxAverageEnum);                                                                             _assert_(vxaverage_input);
    661665        Input* vyaverage_input  = element->GetInput(VyAverageEnum);                                                                             _assert_(vyaverage_input);
    662 
     666        //Input* gldistance_input = element->GetInput(DistanceToGroundinglineEnum);              _assert_(gldistance_input);
    663667        h=element->CharacteristicLength();
    664668
     
    667671        if(melt_style==SubelementMelt2Enum){
    668672                element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
    669            gauss = element->NewGauss(point1,fraction1,fraction2,3);
     673            gauss = element->NewGauss(point1,fraction1,fraction2,3);
     674        }
     675        else if(melt_style==IntrusionMeltEnum){
     676            element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
     677       gauss = element->NewGauss(point1,fraction1,fraction2,3);
    670678        }
    671679        else{
     
    704712                        else mb=gmb;
    705713                }
     714        else if(melt_style==IntrusionMeltEnum){
     715                        Input* gldistance_input = element->GetInput(DistanceToGroundinglineEnum);              _assert_(gldistance_input);
     716                gldistance_input->GetInputValue(&gldistance,gauss);
     717                        if (intrusiondist==0)
     718                                if(gllevelset>0.) mb=gmb;
     719                                else mb=fmb;
     720                else if(gldistance>intrusiondist)
     721                                mb=gmb;
     722                        else if(gldistance<=intrusiondist && gldistance>0)
     723                                mb=fmb*(1-gldistance/intrusiondist);
     724                        else
     725                                mb=fmb;
     726        }
    706727                else  _error_("melt interpolation "<<EnumToStringx(melt_style)<<" not implemented yet");
    707728
     
    750771        bool mainlyfloating;
    751772        IssmDouble  fraction1,fraction2,gllevelset;
    752         IssmDouble  Jdet,dt;
    753         IssmDouble  ms,mb,gmb,fmb,thickness,phi=1.;
     773        IssmDouble  Jdet,dt,intrusiondist;
     774        IssmDouble  ms,mb,gmb,fmb,thickness,phi=1.,gldistance;
    754775        IssmDouble* xyz_list = NULL;
    755776
     
    765786        element->FindParam(&dt,TimesteppingTimeStepEnum);
    766787        element->FindParam(&melt_style,GroundinglineMeltInterpolationEnum);
     788        element->FindParam(&intrusiondist,GroundinglineIntrusionDistanceEnum);
     789
    767790        Input* gmb_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(gmb_input);
    768791        Input* fmb_input        = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fmb_input);
     
    778801      gauss = element->NewGauss(point1,fraction1,fraction2,3);
    779802   }
     803   else if(melt_style==IntrusionMeltEnum){
     804            element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
     805       gauss = element->NewGauss(point1,fraction1,fraction2,3);
     806        }
    780807   else{
    781808      gauss = element->NewGauss(3);
     
    798825         else mb=(1-phi)*fmb+phi*gmb; // phi is the fraction of grounded ice so (1-phi) is floating
    799826      }
    800       else if(melt_style==SubelementMelt2Enum){
     827        else if(melt_style==SubelementMelt2Enum){
    801828         if(gllevelset>0.) mb=gmb;
    802829         else mb=fmb;
    803830      }
    804       else if(melt_style==NoMeltOnPartiallyFloatingEnum){
     831        else if(melt_style==NoMeltOnPartiallyFloatingEnum){
    805832         if (phi<0.00000001) mb=fmb;
    806833         else mb=gmb;
    807834      }
    808       else if(melt_style==FullMeltOnPartiallyFloatingEnum){
     835        else if(melt_style==FullMeltOnPartiallyFloatingEnum){
    809836         if (phi<0.99999999) mb=fmb;
    810837         else mb=gmb;
    811       }
    812       else  _error_("melt interpolation "<<EnumToStringx(melt_style)<<" not implemented yet");
     838        }
     839                else if(melt_style==IntrusionMeltEnum){
     840                        Input* gldistance_input = element->GetInput(DistanceToGroundinglineEnum);              _assert_(gldistance_input);
     841                gldistance_input->GetInputValue(&gldistance,gauss);
     842                        if (intrusiondist==0)
     843                                if(gllevelset>0.) mb=gmb;
     844                                else mb=fmb;
     845                else if(gldistance>intrusiondist)
     846                                mb=gmb;
     847                        else if(gldistance<=intrusiondist && gldistance>0)
     848                                mb=fmb*(1-gldistance/intrusiondist);
     849                        else
     850                                mb=fmb;
     851        }
     852        else  _error_("melt interpolation "<<EnumToStringx(melt_style)<<" not implemented yet");
    813853
    814854                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*basis[i];
Note: See TracChangeset for help on using the changeset viewer.