📄 snow_intercept.c
字号:
/* physical depth */
MaxWaterInt = LIQUID_WATER_CAPACITY * (*IntSnow) + MaxInt;
if ((*IntRain + *RainFall) <= MaxWaterInt) {
/* physical depth */
*IntRain += *RainFall;
/* pixel depth */
RainThroughFall = *RainFall * (1 - F);
}
else {
/* pixel depth */
RainThroughFall = (*IntRain + *RainFall - MaxWaterInt) * F +
(*RainFall * (1 - F));
/* physical depth */
*IntRain = MaxWaterInt;
}
/* at this point we have calculated the amount of snowfall intercepted and
the amount of rainfall intercepted. These values have been
appropriately subtracted from SnowFall and RainFall to determine
SnowThroughfall and RainThroughfall. However, we can end up with the
condition that the total intercepted rain plus intercepted snow is
greater than the maximum bearing capacity of the tree regardless of air
temp (Imax1). The following routine will adjust *IntRain and *IntSnow
by triggering mass release due to overloading. Of course since *IntRain
and *IntSnow are mixed, we need to slough them of as fixed fractions */
if (*IntRain + *IntSnow > Imax1) { /*then trigger structural unloading*/
Overload = (*IntSnow + *IntRain) - Imax1;
IntRainFract= *IntRain/(*IntRain + *IntSnow);
IntSnowFract = *IntSnow/(*IntRain + *IntSnow);
*IntRain = *IntRain - Overload*IntRainFract;
*IntSnow = *IntSnow - Overload*IntSnowFract;
RainThroughFall = RainThroughFall + (Overload*IntRainFract)*F;
SnowThroughFall = SnowThroughFall + (Overload*IntSnowFract)*F;
}
/* The canopy temperature is assumed to be equal to the air temperature if
the air temperature is below 0C, otherwise the canopy temperature is
equal to 0C */
if (Tair > 0.)
*Tcanopy = 0.;
else
*Tcanopy = Tair;
/* Calculate the net radiation at the canopy surface, using the canopy
temperature. The outgoing longwave is subtracted twice, because the
canopy radiates in two directions */
Tmp = *Tcanopy + 273.15;
LongOut = STEFAN_B * (Tmp * Tmp * Tmp * Tmp);
NetRadiation = (1.-NEW_SNOW_ALB)*Shortwave + Longwave - 2 * F * LongOut;
NetRadiation /= F;
/* Calculate the vapor mass flux between the canopy and the surrounding
air mass */
EsSnow = svp(*Tcanopy);
/** Added division by 10 to incorporate change in canopy resistance due
to smoothing by intercepted snow **/
*VaporMassFlux = AirDens * (0.622/Press) * (EactAir - EsSnow) / Ra / 10.;
*VaporMassFlux /= RHO_W;
if (Vpd == 0.0 && *VaporMassFlux < 0.0)
*VaporMassFlux = 0.0;
/* Calculate the latent heat flux */
Ls = (677. - 0.07 * *Tcanopy) * 4.1868 * 1000.;
LatentHeat = Ls * *VaporMassFlux * RHO_W;
/* Calculate the sensible heat flux */
SensibleHeat = AirDens * Cp * (Tair - *Tcanopy)/Ra;
/* Calculate the advected energy */
AdvectedEnergy = (4186.8 * Tair * *RainFall)/(Dt * SECPHOUR);
/* Calculate the amount of energy available for refreezing */
RefreezeEnergy = SensibleHeat + LatentHeat + NetRadiation + AdvectedEnergy;
RefreezeEnergy *= Dt * SECPHOUR;
/* if RefreezeEnergy is positive it means energy is available to melt the
intercepted snow in the canopy. If it is negative, it means that
intercepted water will be refrozen */
/* Update maximum water interception storage */
MaxWaterInt = LIQUID_WATER_CAPACITY * (*IntSnow) + MaxInt;
/* Convert the vapor mass flux from a flux to a depth per interval */
*VaporMassFlux *= Dt * SECPHOUR;
if (RefreezeEnergy > 0.0) {
if (-(*VaporMassFlux) > *IntRain) {
*VaporMassFlux = -(*IntRain);
*IntRain = 0.;
}
else
*IntRain += *VaporMassFlux;
PotSnowMelt = min((RefreezeEnergy/Lf/RHO_W), *IntSnow);
*MeltEnergy -= (Lf * PotSnowMelt * RHO_W) / (Dt *SECPHOUR);
if ((*IntRain + PotSnowMelt) <= MaxWaterInt) {
*IntSnow -= PotSnowMelt;
*IntRain += PotSnowMelt;
PotSnowMelt = 0.0;
}
else {
ExcessSnowMelt = PotSnowMelt + *IntRain - MaxWaterInt;
*IntSnow -= MaxWaterInt - (*IntRain);
*IntRain = MaxWaterInt;
if (*IntSnow < 0.0)
*IntSnow = 0.0;
if (SnowThroughFall > 0.0 &&
InitialSnowInt <= MIN_INTERCEPTION_STORAGE) {
/* Water in excess of MaxWaterInt has been generated. If it is
snowing and there was little intercepted snow at the beginning
of the time step ( <= MIN_INTERCEPTION_STORAGE), then allow the
snow to melt as it is intercepted */
Drip += ExcessSnowMelt;
*IntSnow -= ExcessSnowMelt;
if (*IntSnow < 0.0)
*IntSnow = 0.0;
}
else
/* Else, SnowThroughFall = 0.0 or SnowThroughFall > 0.0 and there is a
substantial amount of intercepted snow at the beginning of the time
step ( > MIN_INTERCEPTION_STORAGE). Snow melt may generate mass
release. */
*TempIntStorage += ExcessSnowMelt;
MassRelease(IntSnow, TempIntStorage, &ReleasedMass, &Drip);
}
/* If intercepted snow has melted, add the water it held to drip */
MaxWaterInt = LIQUID_WATER_CAPACITY * (*IntSnow) + MaxInt;
if (*IntRain > MaxWaterInt) {
Drip += *IntRain - MaxWaterInt;
*IntRain = MaxWaterInt;
}
}
else /* else (RefreezeEnergy <= 0.0) */ {
/* Reset *TempIntStorage to 0.0 when energy balance is negative */
*TempIntStorage = 0.0;
/* Refreeze as much surface water as you can */
if (RefreezeEnergy > - (*IntRain) * Lf) {
*IntSnow += fabs(RefreezeEnergy) / Lf;
*IntRain -= fabs(RefreezeEnergy) / Lf;
*MeltEnergy += (fabs(RefreezeEnergy) * RHO_W) / (Dt *SECPHOUR);
RefreezeEnergy = 0.0;
}
else {
/* All of the water in the surface layer has been frozen. */
*IntSnow += *IntRain;
/* Added on April 8 as a test */
/* RefreezeEnergy += *IntRain*Lf; */
/* *VaporMassFlux = MAX(*VaporMassFlux, */
/* RefreezeEnergy/(Ls * RHO_W)); */
/* Energy released by freezing of intercepted water is added to the
MeltEnergy */
*MeltEnergy += (Lf * *IntRain * RHO_W) / (Dt *SECPHOUR);
*IntRain = 0.0;
}
if (-(*VaporMassFlux) > *IntSnow) {
*VaporMassFlux = -(*IntSnow);
*IntSnow = 0.0;
}
else
*IntSnow += *VaporMassFlux;
}
*IntSnow *= F;
*IntRain *= F;
*MeltEnergy *= F;
*VaporMassFlux *= F;
Drip *= F;
ReleasedMass *= F;
/* Calculate intercepted H2O balance. */
MassBalanceError = (InitialWaterInt - (*IntSnow + *IntRain))
+ (*SnowFall + *RainFall) - (SnowThroughFall
+ RainThroughFall + Drip + ReleasedMass)
+ *VaporMassFlux;
*RainFall = RainThroughFall + Drip;
*SnowFall = SnowThroughFall + ReleasedMass;
/* Convert Units to VIC (m -> mm) */
*VaporMassFlux *= -1.;
*RainFall *= 1000.;
*SnowFall *= 1000.;
*IntRain *= 1000.;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -