@@ -5578,6 +5578,9 @@ void Element::SmbGemb(IssmDouble timeinputs, int count, int steps){/*{{{*/
55785578 pAir_input->GetInputValue (&pAir,gauss); // screen level air pressure [Pa]
55795579 // _printf_("Time: " << t << " Ta: " << Ta << " V: " << V << " dlw: " << dlw << " dsw: " << dsw << " P: " << P << " eAir: " << eAir << " pAir: " << pAir << "\n");
55805580 } else {
5581+ IssmDouble Dtol = 1e-11 ;
5582+ IssmDouble gravity;
5583+ parameters->FindParam (&gravity,ConstantsGEnum);
55815584
55825585 int timestepping;
55835586 IssmDouble dt;
@@ -5587,38 +5590,61 @@ void Element::SmbGemb(IssmDouble timeinputs, int count, int steps){/*{{{*/
55875590 Input *currentsurface_input = this ->GetInput (SurfaceEnum); _assert_ (currentsurface_input);
55885591 currentsurface_input->GetInputAverage (¤tsurface);
55895592
5593+ bool isprecipmap=true ;
5594+ parameters->FindParam (&isprecipmap,SmbIsprecipforcingremappedEnum);
5595+
55905596 parameters->FindParam (&tlapse,SmbLapseTaValueEnum);
55915597 parameters->FindParam (&dlwlapse,SmbLapsedlwrfValueEnum);
55925598
55935599 IssmDouble* elevation = NULL ;
55945600 parameters->FindParam (&elevation,&N,SmbMappedforcingelevationEnum); _assert_ (elevation);
55955601
55965602 // Variables for downscaling
5597- IssmDouble taparam, dlwrfparam, rhparam, eaparam, pparam;
5598- IssmDouble pscale = -8400 ;
5603+ IssmDouble taparam, dlwrfparam, rhparam, eaparam, pparam, prparam;
55995604 parameters->FindParam (&taparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbTaParamEnum);
56005605 parameters->FindParam (&dlwrfparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDlwrfParamEnum);
56015606 parameters->FindParam (&eaparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbEAirParamEnum);
56025607 parameters->FindParam (&pparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPAirParamEnum);
5608+ parameters->FindParam (&prparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPParamEnum);
56035609
56045610 // Variables not downscaled
56055611 parameters->FindParam (&V, Mappedpoint-1 , timeinputs, timestepping, dt, SmbVParamEnum);
56065612 parameters->FindParam (&dsw, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDswrfParamEnum);
56075613 parameters->FindParam (&dswdiff, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDswdiffrfParamEnum);
5608- parameters->FindParam (&P, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPParamEnum);
56095614
56105615 Ta = taparam + (currentsurface - elevation[Mappedpoint-1 ])*tlapse;
5611- dlw = fmax (dlwrfparam + (currentsurface - elevation[Mappedpoint-1 ])*dlwlapse,0.0 );
5612- if (dlwlapse!=0 || tlapse!=0 ) pAir=pparam*exp ((currentsurface - elevation[Mappedpoint-1 ])/pscale);
5616+ if (fabs (dlwlapse) > Dtol) dlw = fmax (dlwrfparam + (currentsurface - elevation[Mappedpoint-1 ])*dlwlapse,0.0 );
5617+ else {
5618+ // adjust downward longwave, holding emissivity equal (Glover et al, 1999)
5619+ IssmDouble SB = 5.67e-8 ; // Stefan-Boltzmann constant (W m-2 K-4)
5620+ IssmDouble effe = 1 .;
5621+ effe = dlwrfparam/(SB * pow (taparam,4.0 ));
5622+ dlw = fmax (effe*SB*pow (Ta,4.0 ),0.0 );
5623+ }
56135624
5614- // Hold reltive humidity constant and calculte new saturation vapor pressure
5625+ if ( (fabs (dlwlapse) > Dtol) || (fabs (tlapse) > Dtol)){
5626+ IssmDouble Rg = 8.314 ; // gas constant (J mol-1 K-1)
5627+ IssmDouble dAir = 0.0 ;
5628+ // calculated air density [kg/m3]
5629+ // dAir = 0.029 * pAir /(R * Ta);
5630+ dAir=0.029 * pparam /(Rg * Ta);
5631+ pAir=pparam-gravity*dAir*(currentsurface - elevation[Mappedpoint-1 ]);
5632+ }
5633+ else pAir=pparam;
5634+
5635+ // Hold relative humidity constant and calculte new saturation vapor pressure
56155636 // https://cran.r-project.org/web/packages/humidity/vignettes/humidity-measures.html
56165637 // es over ice calculation
56175638 // Ding et al., 2019 after Bolton, 1980
56185639 // ea37 = rh37*100*6.112.*exp((17.67*(t237-273.15))./(t237-29.65));
56195640 rhparam=eaparam/6.112 /exp ((17.67 *(taparam-273.15 ))/(taparam-29.65 ));
56205641 eAir=rhparam*6.112 *exp ((17.67 *(Ta-273.15 ))/(Ta-29.65 ));
56215642
5643+ if (isprecipmap && (eaparam>0 )){
5644+ P=prparam*eAir/eaparam;
5645+ }
5646+ else P=prparam;
5647+
56225648 xDelete<IssmDouble>(elevation);
56235649 }
56245650 /* }}}*/
0 commit comments