source: issm/oecreview/Archive/25834-26739/ISSM-26462-26463.diff

Last change on this file was 26740, checked in by Mathieu Morlighem, 3 years ago

CHG: added 25834-26739

File size: 15.2 KB
  • ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp

     
    408408        Input* enthalpy_input       = element->GetInput(enthalpy_enum);                   _assert_(enthalpy_input);
    409409        Input* pressure_input       = element->GetInput(PressureEnum);                    _assert_(pressure_input);
    410410        Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
    411         Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
    412         Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
    413         Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
    414411
    415412        /*Build friction element, needed later: */
    416         Friction* friction=new Friction(element,dim);
     413        Friction* friction=new Friction(element,3);
    417414
    418415        /******** MELTING RATES  ************************************//*{{{*/
    419416        element->NormalBase(&normal_base[0],xyz_list_base);
     
    469466
    470467                        /*basal friction*/
    471468                        friction->GetAlpha2(&alpha2,gauss);
    472                         vx_input->GetInputValue(&vx,gauss);             vy_input->GetInputValue(&vy,gauss);             vz_input->GetInputValue(&vz,gauss);
     469                        friction->GetBasalSlidingSpeeds(&vx, &vy, &vz, gauss);
    473470                        basalfriction=alpha2*(vx*vx + vy*vy + vz*vz);
    474471                        geothermalflux_input->GetInputValue(&geothermalflux,gauss);
    475472                        /* -Mb= Fb-(q-q_geo)/((1-w)*L*rho), and (1-w)*rho=rho_ice, cf Aschwanden 2012, eqs.1, 2, 66*/
     
    946943        element->GetInputValue(&converged,ConvergedEnum);
    947944        if(dt==0. && !converged) enthalpy_enum=EnthalpyPicardEnum; // use enthalpy from last iteration
    948945        else enthalpy_enum=EnthalpyEnum; // use enthalpy from last time step
    949         Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
    950         Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
    951         Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
    952946        Input* enthalpy_input            = element->GetInput(enthalpy_enum);                                     _assert_(enthalpy_input);
    953947        Input* pressure_input            = element->GetInput(PressureEnum);                                                      _assert_(pressure_input);
    954948        Input* watercolumn_input         = element->GetInput(WatercolumnEnum);                                                   _assert_(watercolumn_input);
     
    987981                                // although one node might have become temperate. So keep heat flux switched on.
    988982                                geothermalflux_input->GetInputValue(&geothermalflux,gauss);
    989983                                friction->GetAlpha2(&alpha2,gauss);
    990                                 vx_input->GetInputValue(&vx,gauss);
    991                                 vy_input->GetInputValue(&vy,gauss);
    992                                 vz_input->GetInputValue(&vz,gauss);
     984                                friction->GetBasalSlidingSpeeds(&vx, &vy, &vz, gauss);
    993985                                basalfriction=alpha2*(vx*vx+vy*vy+vz*vz);
    994986                                heatflux=(basalfriction+geothermalflux)/(rho_ice);
    995987                                scalar=gauss->weight*Jdet*heatflux;
  • ../trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp

     
    359359        IssmDouble g         = element->FindParam(ConstantsGEnum);
    360360        IssmDouble e_v       = element->FindParam(HydrologyEnglacialVoidRatioEnum);
    361361        Input* hr_input     = element->GetInput(HydrologyBumpHeightEnum);_assert_(hr_input);
    362         Input* vx_input     = element->GetInput(VxBaseEnum);_assert_(vx_input);
    363         Input* vy_input     = element->GetInput(VyBaseEnum);_assert_(vy_input);
    364362        Input* h_input      = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input);
    365363        Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
    366364        Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
     
    382380                element->NodalFunctions(basis,gauss);
    383381
    384382                /*Get input values at gauss points*/
    385                 vx_input->GetInputValue(&vx,gauss);
    386                 vy_input->GetInputValue(&vy,gauss);
    387383                h_input->GetInputValue(&h,gauss);
    388384                G_input->GetInputValue(&G,gauss);
    389385                B_input->GetInputValue(&B,gauss);
     
    394390                H_input->GetInputValue(&H,gauss);
    395391
    396392                /*Get basal velocity*/
     393                friction->GetBasalSlidingSpeeds(&vx, &vy ,gauss);
    397394                ub = sqrt(vx*vx + vy*vy);
    398395
    399396                /*Compute cavity opening w*/
  • ../trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp

     
    118118        iomodel->FetchDataToInput(inputs,elements,"md.hydrology.neumannflux",HydrologyNeumannfluxEnum);
    119119        iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum);
    120120        iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum);
     121        if(iomodel->domaintype==Domain2DhorizontalEnum){
     122                iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxBaseEnum);
     123                iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyBaseEnum);
     124        }
    121125        iomodel->FindConstant(&frictionlaw,"md.friction.law");
    122126
    123127        /*Friction law variables*/
     
    253257        Input* B_input              = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
    254258        Input* n_input              = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
    255259        Input* englacial_input      = element->GetInput(HydrologyEnglacialInputEnum);    _assert_(englacial_input);
    256         Input* vx_input             = element->GetInput(VxEnum);                         _assert_(vx_input);
    257         Input* vy_input             = element->GetInput(VyEnum);                         _assert_(vy_input);
    258260        Input* lr_input             = element->GetInput(HydrologyBumpSpacingEnum);       _assert_(lr_input);
    259261        Input* br_input             = element->GetInput(HydrologyBumpHeightEnum);        _assert_(br_input);
    260262   Input* headold_input        = element->GetInput(HydrologyHeadOldEnum);           _assert_(headold_input);
     
    286288                englacial_input->GetInputValue(&ieb,gauss);
    287289                lr_input->GetInputValue(&lr,gauss);
    288290                br_input->GetInputValue(&br,gauss);
    289                 vx_input->GetInputValue(&vx,gauss);
    290                 vy_input->GetInputValue(&vy,gauss);
    291291      headold_input->GetInputValue(&head_old,gauss);
    292292
    293293                /*Get ice A parameter*/
     
    303303
    304304                /*Compute frictional heat flux*/
    305305                friction->GetAlpha2(&alpha2,gauss);
    306                 vx_input->GetInputValue(&vx,gauss);
    307                 vy_input->GetInputValue(&vy,gauss);
     306                friction->GetBasalSlidingSpeeds(&vx, &vy, gauss);
    308307                frictionheat=alpha2*(vx*vx+vy*vy);
    309308
    310309                /*Get water and ice pressures*/
     
    493492        Input* base_input           = element->GetInput(BaseEnum);                       _assert_(base_input);
    494493        Input* B_input              = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
    495494        Input* n_input              = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
    496         Input* vx_input             = element->GetInput(VxEnum);                         _assert_(vx_input);
    497         Input* vy_input             = element->GetInput(VyEnum);                         _assert_(vy_input);
    498495        Input* lr_input             = element->GetInput(HydrologyBumpSpacingEnum);       _assert_(lr_input);
    499496        Input* br_input             = element->GetInput(HydrologyBumpHeightEnum);        _assert_(br_input);
    500497
     
    522519                head_input->GetInputDerivativeValue(&dh[0],xyz_list,gauss);
    523520                lr_input->GetInputValue(&lr,gauss);
    524521                br_input->GetInputValue(&br,gauss);
    525                 vx_input->GetInputValue(&vx,gauss);
    526                 vy_input->GetInputValue(&vy,gauss);
    527522
    528523                /*Get ice A parameter*/
    529524                B_input->GetInputValue(&B,gauss);
     
    538533
    539534                /*Compute frictional heat flux*/
    540535                friction->GetAlpha2(&alpha2,gauss);
    541                 vx_input->GetInputValue(&vx,gauss);
    542                 vy_input->GetInputValue(&vy,gauss);
     536                friction->GetBasalSlidingSpeeds(&vx, &vy, gauss);
    543537                frictionheat=alpha2*(vx*vx+vy*vy);
    544538
    545539                /*Get water and ice pressures*/
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    34883488
    34893489        /*build friction object, used later on: */
    34903490        /*dim=4 is special for HO, which is actually 2.5D*/
    3491         Friction* friction=new Friction(element,dim==3?4:1);
     3491        Friction* friction=new Friction(element,dim==3?2.5:1);
    34923492
    34933493        /*Recover portion of element that is grounded*/
    34943494        if(!(friction_style==SubelementFriction2Enum)) phi=element->GetGroundedPortion(xyz_list_base);
  • ../trunk-jpl/src/c/classes/Loads/Friction.cpp

     
    1717/*Constructors/destructors*/
    1818Friction::Friction(){/*{{{*/
    1919        this->element=NULL;
    20         this->dim=0;
    2120        this->law=0;
     21        this->apply_dim = 1;
     22        this->domaintype=-1;
     23        this->vx_input=NULL;
     24        this->vy_input=NULL;
     25        this->vz_input=NULL;
    2226}
    2327/*}}}*/
    24 Friction::Friction(Element* element_in,int dim_in){/*{{{*/
     28Friction::Friction(Element* element_in){/*{{{*/
     29        /* Determine the dimension according to the domain type automatically.
     30         * There are exceptions, e.g. HO, which needs the user to specify the dimension used in Friciton.*/
     31        this->element=element_in;
    2532
     33        /* Load necessary parameters */
     34        element_in->FindParam(&this->law,FrictionLawEnum);
     35        element_in->FindParam(&this->domaintype,DomainTypeEnum);
     36       
     37        /* Load VxBase and VyBase for this special case */
     38        switch(this->domaintype){
     39                case Domain2DhorizontalEnum:
     40                        this->apply_dim = 2;
     41                        this->vx_input = element_in->GetInput(VxBaseEnum);                      _assert_(this->vx_input);
     42                        this->vy_input = element_in->GetInput(VyBaseEnum);                      _assert_(this->vy_input);
     43                        this->vz_input = NULL;
     44                        break;
     45      case Domain2DverticalEnum:
     46                        this->apply_dim = 2;
     47                        this->vx_input = element_in->GetInput(VxEnum);                          _assert_(this->vx_input);
     48                        this->vy_input = element_in->GetInput(VyEnum);                          _assert_(this->vy_input);
     49                        this->vz_input = NULL;
     50                        break;
     51      case Domain3DEnum:           
     52                        this->apply_dim = 3;
     53                        this->vx_input = element_in->GetInput(VxEnum);                          _assert_(this->vx_input);
     54                        this->vy_input = element_in->GetInput(VyEnum);                          _assert_(this->vy_input);
     55                        this->vz_input = element_in->GetInput(VzEnum);                          _assert_(this->vz_input);
     56                        break;
     57      default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     58        }
     59}
     60/*}}}*/
     61Friction::Friction(Element* element_in, double dim){/*{{{*/
     62
    2663        this->element=element_in;
    27         this->dim=dim_in;
     64        this->apply_dim = dim;
     65
     66        /* Load necessary parameters */
    2867        element_in->FindParam(&this->law,FrictionLawEnum);
     68        element_in->FindParam(&this->domaintype,DomainTypeEnum);
     69       
     70        /* Load VxBase and VyBase for this special case */
     71        switch(this->domaintype){
     72                case Domain2DhorizontalEnum:
     73                        this->vx_input = element_in->GetInput(VxBaseEnum);                      _assert_(this->vx_input);
     74                        this->vy_input = element_in->GetInput(VyBaseEnum);                      _assert_(this->vy_input);
     75                        this->vz_input = NULL;
     76                        break;
     77      case Domain2DverticalEnum:
     78                        this->vx_input = element_in->GetInput(VxEnum);                          _assert_(this->vx_input);
     79                        this->vy_input = element_in->GetInput(VyEnum);                          _assert_(this->vy_input);
     80                        this->vz_input = NULL;
     81                        break;
     82      case Domain3DEnum:           
     83                        this->vx_input = element_in->GetInput(VxEnum);                          _assert_(this->vx_input);
     84                        this->vy_input = element_in->GetInput(VyEnum);                          _assert_(this->vy_input);
     85                        this->vz_input = element_in->GetInput(VzEnum);                          _assert_(this->vz_input);
     86                        break;
     87      default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     88        }
    2989}
    3090/*}}}*/
    3191Friction::~Friction(){/*{{{*/
     
    3595/*methods: */
    3696void Friction::Echo(void){/*{{{*/
    3797        _printf_("Friction:\n");
    38         _printf_("   dim: " << this->dim<< "\n");
     98        _printf_("   Domain type: " << this->domaintype<< "\n");
    3999}
    40100/*}}}*/
    41101void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
     
    854914
    855915        /*diverse*/
    856916        IssmDouble vx,vy,vz,vmag;
     917
     918        this->vx_input->GetInputValue(&vx, gauss);
     919        this->vy_input->GetInputValue(&vy, gauss);
     920
     921        if ((this->vz_input == NULL) || (this->apply_dim<3)) vz = 0.0;
     922        else this->vz_input->GetInputValue(&vz, gauss);
    857923       
    858         switch(dim){
    859                 case 1:
    860                         element->GetInputValue(&vx,gauss,VxEnum);
    861                         vmag=sqrt(vx*vx);
    862                         break;
    863                 case 2:
    864                         element->GetInputValue(&vx,gauss,VxBaseEnum);
    865                         element->GetInputValue(&vy,gauss,VyBaseEnum);
    866                         vmag=sqrt(vx*vx+vy*vy);
    867                         break;
    868                 case 3:
    869                         element->GetInputValue(&vx,gauss,VxEnum);
    870                         element->GetInputValue(&vy,gauss,VyEnum);
    871                         element->GetInputValue(&vz,gauss,VzEnum);
    872                         vmag=sqrt(vx*vx+vy*vy+vz*vz);
    873                         break;
    874                 case 4:
    875                         /* This is for HO 3D case, since it requires the horizontal velocities */
    876                         element->GetInputValue(&vx,gauss,VxEnum);
    877                         element->GetInputValue(&vy,gauss,VyEnum);
    878                         vmag=sqrt(vx*vx+vy*vy);
    879                         break;
    880                 default:
    881                         _error_("not supported");
    882         }
     924        if (this->apply_dim<2) vy = 0.0;
    883925
     926        vmag = sqrt(vx*vx+vy*vy+vz*vz);
    884927        return vmag;
     928}/*}}}*/
     929void Friction::GetBasalSlidingSpeeds(IssmDouble* pvx, Gauss* gauss){/*{{{*/
    885930
     931        this->vx_input->GetInputValue(pvx, gauss);
     932        /*Checks*/
     933        _assert_(!xIsNan<IssmDouble>(*pvx));
     934        _assert_(!xIsInf<IssmDouble>(*pvx));
    886935}/*}}}*/
     936void Friction::GetBasalSlidingSpeeds(IssmDouble* pvx, IssmDouble* pvy, Gauss* gauss){/*{{{*/
     937
     938        this->vx_input->GetInputValue(pvx, gauss);
     939        this->vy_input->GetInputValue(pvy, gauss);
     940        /*Checks*/
     941        _assert_(!xIsNan<IssmDouble>(*pvx));
     942        _assert_(!xIsInf<IssmDouble>(*pvx));
     943        _assert_(!xIsNan<IssmDouble>(*pvy));
     944        _assert_(!xIsInf<IssmDouble>(*pvy));
     945}/*}}}*/
     946void Friction::GetBasalSlidingSpeeds(IssmDouble* pvx, IssmDouble* pvy, IssmDouble* pvz, Gauss* gauss){/*{{{*/
     947
     948        this->vx_input->GetInputValue(pvx, gauss);
     949        this->vy_input->GetInputValue(pvy, gauss);
     950        this->vz_input->GetInputValue(pvz, gauss);
     951        /*Checks*/
     952        _assert_(!xIsNan<IssmDouble>(*pvx));
     953        _assert_(!xIsInf<IssmDouble>(*pvx));
     954        _assert_(!xIsNan<IssmDouble>(*pvy));
     955        _assert_(!xIsInf<IssmDouble>(*pvy));
     956        _assert_(!xIsNan<IssmDouble>(*pvz));
     957        _assert_(!xIsInf<IssmDouble>(*pvz));
     958}/*}}}*/
  • ../trunk-jpl/src/c/classes/Loads/Friction.h

     
    1414
    1515        public:
    1616                Element* element;
    17                 int      dim;
    1817                int      law;
     18                int      domaintype;
     19                double  apply_dim;
     20                Input*  vx_input;
     21                Input*  vy_input;
     22                Input*  vz_input;
    1923
    2024                /*methods: */
    2125                Friction();
    22                 Friction(Element* element_in,int dim_in);
     26                Friction(Element* element_in);
     27                Friction(Element* element_in, double dim);
    2328                ~Friction();
    2429
    2530                void  Echo(void);
     
    4651
    4752                IssmDouble EffectivePressure(Gauss* gauss);
    4853                IssmDouble VelMag(Gauss* gauss);
     54                void GetBasalSlidingSpeeds(IssmDouble* pvx, Gauss* gauss);
     55                void GetBasalSlidingSpeeds(IssmDouble* pvx, IssmDouble* pvy, Gauss* gauss);
     56                void GetBasalSlidingSpeeds(IssmDouble* pvx, IssmDouble* pvy, IssmDouble* pvz, Gauss* gauss);
    4957};
    5058
    5159#endif  /* _FRICTION_H_ */
Note: See TracBrowser for help on using the repository browser.