modules_sbsm (06/04/08)

CRHM Borland

sbsm (Richard Essery,  Long Li and John Pomeroy, 1999)

Defined in Classsbsm. This module is a simplified blowing snow model which can reproduce PBSM results very closely with much less computational effort. The snowfall observation can be a daily total or the actual interval snowfall.  The former case  is handled by assuming that the snowfall is uniformly distributed over every interval of the day. The transport and sublimation of blowing snow are calculated every interval using the interval wind speed, air temperature and relative humidity. The model has been extended to handle the transport of snow between HRUs. At the end of a day when snow transport has occurred,  snow transported from HRUs with low roughness is distributed over the HRUs with greater roughness according to the fractions specified in the distribution parameter. No transported snow enters the HRU with the lowest roughness. When HRUs with lower vegetative height fill to their maximum,  the excess is distributed over the remaining unfilled HRUs.

Observations

  • none

Variables

  • SWE (mm) - snow water equivalent. State variable.
  • wet_snow (mm) - wet snow mass
  • Subl (mm Dt) - the mass of snow lost from an HRU by sublimation in time step,  Dt – expressed as an equivalent average depth of water over an HRU.
  • cumSubl (mm/day) - daily sublimation.
  • Drift (mm Dt) - the mass of snow lost from an HRU by snow transport in time step,  Dt – expressed as an equivalent average depth of water over an HRU.
  • cumDrift (mm/day) - daily transport.
  • cumDriftIn (mm/day) - cumulative transport to HRU. (local variable).
  • cumSno (mm) - snow (net_snow) accumulation from beginning of winter.
  • Prob () - interval probability of blowing snow.
  • snow_age (hr) - snow age. (local variable).
  • BasinSnowLoss (mm Dt) - transport out of basin.
  • cumBasinSnowLoss (mm) - cumulative transport out of basin.
  • cumBasinSnowGain (mm) - cumulative transport into basin.

Parameters

  • fetch (m) - fetch distance.
  • Ht (m) - crop height.
  • Zr (m) - Ratio of aerodynamic roughness length to vegetation height. See below for typical values.
  • distrib () - distribution fractions.  Value for HRU 1 controls snow transport into the basin.
  • basin_area (km2) - basin area.
  • hru_area (km2) - hru_area.
  • inhibit_evap (flag) - an output parameter set true when the SWE is greater than zero. It is used to inhibit evaporation from the evaporation modules.

Variable Inputs

  • hru_t (°C) - air temperature from module obs.
  • hru_rh (%) - relative humidity from module obs.
  • hru_u (m/s) - wind speed from module obs.
  • newsnow () - 0/1 for no/yes from module obs.
  • net_snow (mm Dt) - snow fall from wild module - intcp, brushintcp etc.

Notes

  1. The parameter fetch cannot be less than 300m.
  2. The parameter distrib need not be set for the first HRU, i.e. the lowest vegetation height. When the snow is redistributed,  the distrib values for the HRU's not filled to their vegetation height are summed and each HRU receives its share.  The sum of distributions need not add to 1.0.

E.g. if the transport D is redistributed over HRUs: A, B and C with their distrib parameter having values of a, b and c respectively.  The snow transport would be distributed as:

a*D/(a + b +c),  b*D/(a + b +c) and c*D/(a + b +c).  Note that any excess from a HRU filling to its vegetation height is deposited in the last HRU, i.e. the one having the tallest vegetation.

    3.  If the value of distrib is less than 0 for an HRU, all snow transport to its capacity is assumed to be caught by this HRU. The next HRU is the beginning of a new blowing snow regime.

    4.  This module can have a none zero value for transport and sublimation even if the vegetation height is greater than the snow cover depth.

    5.  Cumulative drift from the last HRU is not removed from the HRU and is redistributed within the HRU.

Typical values fo Zr.

landcover ice soil open tundra sparse shrub tundra shrub tundra dense shrub tundra sparse forest
vegetation height (ht) 0.01 0.01 0.08 0.08 1.0 1.0 3.0
Zr 0.1 0.1 0.05 0.05 0.05 0.05 0.08

 

Code.

 

float Classsbsm::sublimation(void){

return 137.6*pow(hru_u[hh]/25.0, 5)/1000.0;

}

 

float Classsbsm::scale(void){

float

cond, // Thermal conductivity of air (W/m/K)

diff, // Diffusivity of water vapour in air (m2/s)

rsat, // Saturation density of water vapour (kg/m3)

tk; // Temperature (K)

float const ls = 2.838e6; // Latent heat of sublimation (J/kg)

float const m = 18.01; // Molecular weight of water (kg/kmole)

float const r = 8313.0; // Universal gas constant (J/kmole/K)

tk = hru_t[hh] + 273.0;

diff = 2.06e-5*pow(tk/273.0, 1.75);

rsat = m*611.15*exp(22.45*hru_t[hh]/tk)/(r*tk);

cond = 0.00063*tk + 0.0673;

return ((ls*m/(r*tk)) - 1.0)/(cond*(hru_t[hh]+273.0)) + 1.0/(ls*diff*rsat);

}

 

void Classsbsm::prob(void){

float

mean // Mean of cummulative normal distribution

,var // Standard deviation

,rho // Snow density (kg/m3)

,sd // Snow depth (m)

,us;

bool dry_snow = hru_t[hh] < 0.0;

mean = 0.365*hru_t[hh] + 0.00706*sqr(hru_t[hh]) + 0.91*log(snow_age[hh]) + 11.0;

var = 0.145*hru_t[hh] + 0.00196*sqr(hru_t[hh]) + 4.23;

if (!dry_snow) {

mean = 21.0;

var = 7.0;

}

rho = 240.;

if (SWE[hh] > 145.45)

rho = 69.856*log(SWE[hh]) - 74.732;

sd = SWE[hh]/rho;

us = hru_u[hh];

if (sd < Ht[hh])

us = us / sqrt(1. + 170.0*2*zr[hh]*(Ht[hh] - sd));

Prob[hh] = 1.0/(1.0 + exp(1.7*(mean - us)/var));

 

if (SWE[hh] <= wet_snow[hh]) {

Prob[hh] = 1 / ( 1. + exp(1.7*(21.0 - us)/7.0));

if (us <= 7.0) Prob[hh] = 0.0;

}

if ( sd <= 0.01 ) Prob[hh] = 0.0;

if ( dry_snow ){

if (us <= 3.0)

Prob[hh] = 0.0;

}

else{

if (us <= 7.0)

Prob[hh] = 0.0;

}

}

void Classsbsm::run(void) {

float SumDrift, total, SWE_Max, trans;

for (hh = 0; hh < nhru; hh++) {

    if(net_snow[hh] > 0.0) {

    SWE[hh] = SWE[hh] + net_snow[hh];

    cumSno[hh] = cumSno[hh] + net_snow[hh];

    snow_age[hh] = 1.0;

}

else

    snow_age[hh] += dt/3600;

if(hru_t[hh] >= 0.0)

    wet_snow[hh] = SWE[hh];

else

    wet_snow[hh] = min<float> (SWE[hh], wet_snow[hh]);

Drift[hh] = 0.0;

Subl[hh] = 0.0;

if(hru_u[hh] > 3.0 && SWE[hh] > 0.0) {

    prob();

    if(Prob[hh] > 0.0) {

        Drift[hh] = Prob[hh]*transport()*dt/fetch[hh];

        Subl[hh] = Prob[hh]*((1.0 - hru_rh[hh])/scale())* sublimation()*dt;

// handle insufficient snow pack

        if(Drift[hh] + Subl[hh] > SWE[hh]) { Subl[hh] = SWE[hh] * Subl[hh]/(Subl[hh] + Drift[hh]); Drift[hh] = SWE[hh] - Subl[hh]; } // end if

        cumDrift[hh] += Drift[hh];

        cumSubl[hh] += Subl[hh];

    SWE[hh] = SWE[hh] - Subl[hh] - Drift[hh]; } }

} // for

// distribute drift

long LastN = 0;

for (int nn = 0; nn < nhru; ++nn) {

if(distrib[nn] >= 0.0 && nn+1 < nhru) continue;

SumDrift = 0.0;

for (int hh = LastN; hh <= nn; hh++)

if(distrib[nn] != 0.0)

    SumDrift += Drift[hh]*hru_basin[hh];

if(SumDrift > 0.0){

    for (int hh = LastN + 1; hh <= nn; hh++) {

        if(hh == nn){ // last HRU or last HRU of group

            SWE[hh] += SumDrift/hru_basin[hh];

            cumDriftIn[hh] += SumDrift/hru_basin[hh]; }

        else {

            SWE_Max = SWEfromDepth(Ht[hh]);

if(SWE_Max > SWE[hh] && distrib[hh] > 0.0) {

    total = 0.0;

    for (int jj = hh; jj <= nn; jj++)

        total = total + fabs(distrib[jj]);

    trans = SumDrift*fabs(distrib[hh])/total/hru_basin[hh];

    if(SWE_Max > SWE[hh] + trans)

        SWE[hh] += trans;

    else {

        trans = SWE_Max - SWE[hh];

        SWE[hh] = SWE_Max;

}

SumDrift -= trans*hru_basin[hh]; cumDriftIn[hh] += trans;

} // end if } // end if

} // end for (hh) LastN = nn; } // end if

} // end for (nn)

for (int hh = 0; hh < nhru; hh++) {

if(SWE[hh] > 0.0) const_cast<long*> (

    inhibit_evap)[hh] = 1;

else

    const_cast<long*> (inhibit_evap)[hh] = 0;

} // for

}