@@ -5590,26 +5590,30 @@ void Element::SmbGemb(IssmDouble timeinputs, int count, int steps){/*{{{*/
55905590 parameters->FindParam (&elevation,&N,SmbMappedforcingelevationEnum); _assert_ (elevation);
55915591
55925592 // Variables for downscaling
5593- IssmDouble taparam, dlwrfparam, rhparam, eaparam;
5593+ IssmDouble taparam, dlwrfparam, rhparam, eaparam, pparam;
5594+ IssmDouble pscale = -8400 ;
55945595 parameters->FindParam (&taparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbTaParamEnum);
55955596 parameters->FindParam (&dlwrfparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDlwrfParamEnum);
55965597 parameters->FindParam (&eaparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbEAirParamEnum);
5598+ parameters->FindParam (&pparam, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPAirParamEnum);
55975599
55985600 // Variables not downscaled
55995601 parameters->FindParam (&V, Mappedpoint-1 , timeinputs, timestepping, dt, SmbVParamEnum);
56005602 parameters->FindParam (&dsw, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDswrfParamEnum);
56015603 parameters->FindParam (&dswdiff, Mappedpoint-1 , timeinputs, timestepping, dt, SmbDswdiffrfParamEnum);
56025604 parameters->FindParam (&P, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPParamEnum);
5603- parameters->FindParam (&pAir, Mappedpoint-1 , timeinputs, timestepping, dt, SmbPAirParamEnum);
56045605
56055606 Ta = taparam + (currentsurface - elevation[Mappedpoint-1 ])*tlapse;
56065607 dlw = fmax (dlwrfparam + (currentsurface - elevation[Mappedpoint-1 ])*dlwlapse,0.0 );
5607-
5608- // Hold reltive humidity constant and calculte new saturation vapor pressure with the new temperature
5609- // ea = 100.*10.^(-7.90298 .* (373.16 ./ ta - 1) + 5.02808 .* log10(373.16 ./ ta) - 1.3816E-7 .* (10.^(11.344 .* (1 - ta ./ 373.16))-1)
5610- // + 8.1328E-3*(10.^(-3.49149.*(373.16./ta-1))-1) + log10(1013.246)).*(rh/100);
5611- rhparam = fmin ( fmax ( 100 * eaparam / ( 100 *pow (10 ,(-7.90298 * (373.16 / taparam - 1 ) + 5.02808 * log10 (373.16 / taparam) - 1.3816E-7 * (pow (10 ,(11.344 * (1 - taparam / 373.16 )))-1 ) + 8.1328E-3 *(pow (10 ,(-3.49149 *(373.16 /taparam-1 )))-1 ) + log10 (1013.246 ))) ), 0.0 ), 100.0 );
5612- eAir = ( 100 *pow (10 ,(-7.90298 * (373.16 / Ta - 1 ) + 5.02808 * log10 (373.16 / Ta) - 1.3816E-7 * (pow (10 ,(11.344 * (1 - Ta / 373.16 )))-1 ) + 8.1328E-3 *(pow (10 ,(-3.49149 *(373.16 /Ta-1 )))-1 ) + log10 (1013.246 ))) ) * (rhparam/100 );
5608+ if (dlwlapse!=0 || tlapse!=0 ) pAir=pparam*exp ((currentsurface - elevation[Mappedpoint-1 ])/pscale);
5609+
5610+ // Hold reltive humidity constant and calculte new saturation vapor pressure
5611+ // https://cran.r-project.org/web/packages/humidity/vignettes/humidity-measures.html
5612+ // es over ice calculation
5613+ // Ding et al., 2019 after Bolton, 1980
5614+ // ea37 = rh37*100*6.112.*exp((17.67*(t237-273.15))./(t237-29.65));
5615+ rhparam=eaparam/6.112 /exp ((17.67 *(taparam-273.15 ))/(taparam-29.65 ));
5616+ eAir=rhparam*6.112 *exp ((17.67 *(Ta-273.15 ))/(Ta-29.65 ));
56135617
56145618 xDelete<IssmDouble>(elevation);
56155619 }
0 commit comments