source: issm/oecreview/Archive/21724-22754/ISSM-21793-21794.diff@ 22755

Last change on this file since 22755 was 22755, checked in by Mathieu Morlighem, 7 years ago

CHG: added 21724-22754

File size: 4.3 KB
  • ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

     
    469469
    470470        /*Intermediaries */
    471471        IssmDouble  Jdet,dt;
    472         IssmDouble  ms,mb,gmb,fmb,thickness,phi;
     472        IssmDouble  ms,mb,gmb,fmb,thickness;
     473        IssmDouble  gllevelset,phi=1.;
    473474        IssmDouble* xyz_list = NULL;
    474475
    475476        /*Fetch number of nodes and dof for this finite element*/
     
    484485        element->FindParam(&dt,TimesteppingTimeStepEnum);
    485486        Input* gmb_input           = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
    486487        Input* fmb_input           = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
    487         Input* groundedice_input   = element->GetInput(MaskGroundediceLevelsetEnum);              _assert_(groundedice_input);
     488        Input* gllevelset_input   = element->GetInput(MaskGroundediceLevelsetEnum);              _assert_(gllevelset_input);
    488489        Input* ms_input            = element->GetInput(SmbMassBalanceEnum);                       _assert_(ms_input);
    489490        Input* thickness_input     = element->GetInput(ThicknessEnum);                            _assert_(thickness_input);
    490491
     
    499500                ms_input->GetInputValue(&ms,gauss);
    500501                gmb_input->GetInputValue(&gmb,gauss);
    501502                fmb_input->GetInputValue(&fmb,gauss);
    502                 groundedice_input->GetInputValue(&phi,gauss);
     503                gllevelset_input->GetInputValue(&phi,gauss);
    503504                thickness_input->GetInputValue(&thickness,gauss);
    504505                if(phi>0.) mb=gmb;
    505506                else mb=fmb;
     
    519520        if(!element->IsIceInElement()) return NULL;
    520521
    521522        /*Intermediaries */
    522         IssmDouble  Jdet,dt;
    523         IssmDouble  ms,mb,gmb,fmb,thickness,phi;
     523        int         migration_style,point1;
     524        bool        mainlyfloating;
     525        IssmDouble  Jdet,fraction1,fraction2;
     526        IssmDouble  dt,gllevelset;
     527        IssmDouble  ms,mb,gmb,fmb,thickness,phi=1.;
    524528        IssmDouble* xyz_list = NULL;
     529        Gauss*      gauss     = NULL;
    525530
    526531        /*Fetch number of nodes and dof for this finite element*/
    527532        int numnodes = element->GetNumberOfNodes();
     
    536541        Input* gmb_input           = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(gmb_input);
    537542        Input* fmb_input           = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fmb_input);
    538543        Input* ms_input            = element->GetInput(SmbMassBalanceEnum);          _assert_(ms_input);
    539         Input* groundedice_input   = element->GetInput(MaskGroundediceLevelsetEnum);             _assert_(groundedice_input);
     544        Input* gllevelset_input   = element->GetInput(MaskGroundediceLevelsetEnum);             _assert_(gllevelset_input);
    540545        Input* thickness_input     = element->GetInput(ThicknessEnum);                           _assert_(thickness_input);
    541546
     547        /*Recover portion of element that is grounded*/
     548        phi=element->GetGroundedPortion(xyz_list);
     549        if(migration_style==SubelementMigration2Enum){
     550                gllevelset_input=element->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
     551                element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
     552           gauss = element->NewGauss(point1,fraction1,fraction2,mainlyfloating,3);
     553        }
     554        else{
     555                gauss = element->NewGauss(3);
     556        }
     557
    542558        /* Start  looping on the number of gaussian points: */
    543         Gauss* gauss=element->NewGauss(2);
    544559        for(int ig=gauss->begin();ig<gauss->end();ig++){
    545560                gauss->GaussPoint(ig);
    546561
     
    550565                ms_input->GetInputValue(&ms,gauss);
    551566                gmb_input->GetInputValue(&gmb,gauss);
    552567                fmb_input->GetInputValue(&fmb,gauss);
    553                 groundedice_input->GetInputValue(&phi,gauss);
     568                gllevelset_input->GetInputValue(&gllevelset,gauss);
    554569                thickness_input->GetInputValue(&thickness,gauss);
    555                 if(phi>0) mb=gmb;
    556                 else mb=fmb;
     570                if(migration_style==SubelementMigrationEnum){
     571                        if (phi<0.00000001) mb=gmb;
     572                        else mb=(1-phi)*fmb+phi*gmb; // phi is the fraction of grounded ice so (1-phi) is floating
     573                }
     574                else if(migration_style==SubelementMigration2Enum){
     575                        if(gllevelset>0.) mb=gmb;
     576                        else mb=fmb;
     577                }
     578                else if(migration_style==SubelementMigration3Enum){
     579                        if (phi<0.00000001) mb=gmb;
     580                        else mb=gmb;
     581                }
     582                else{
     583                        if(gllevelset>0) mb=gmb;
     584                        else mb=fmb;
     585                }
    557586
    558587                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*basis[i];
    559588        }
Note: See TracBrowser for help on using the repository browser.