Skip to content

Release of VIC 4.1.2

Compare
Choose a tag to compare
@jhamman jhamman released this 20 Aug 19:45
· 2688 commits to master since this release

***** Description of changes from VIC 4.1.2 to VIC 4.1.2.a *****

Bug Fixes:

Incorrect timing of disaggregated radiation and air temperature when daily
forcings are supplied and off_gmt is 0.

Files Affected:

initialize_atmos.c

Description:

VIC was double-shifting the timeseries of subdaily radiation and
temperature in cases in which VIC was *not* given sub-daily incoming
shortwave as an input forcing *and* soil parameter "off_gmt" was not
set to the local time zone offset (i.e. not set to longitude*24/360).
This caused incorrect timing of the diurnal cycle of radiation and
air temperature.

This has been fixed.

Disaggregated radiation is constant throughout the day when daily incoming
shortwave radiation is supplied as an input forcing.

Files Affected:

initialize_atmos.c
mtclim_constants_vic.h
mtclim_vic.c
mtclim_wrapper.c

Description:

When VIC was supplied with *daily* incoming shortwave as an input
forcing variable, VIC would fail to disaggregate this correctly to
sub-daily time steps; it would simply repeat the daily average for
every sub-daily time step.  This has been fixed.  Now VIC will
compute a diurnal cycle whose daily average matches the supplied daily
average.

***** Description of changes from VIC 4.1.1 to VIC 4.1.2 *****

New Features:

Cleaned up the sample global parameter file

Files Affected:

get_global_param.c
global.param.sample
initialize_global.c

Description:

The large number of options available in VIC 4.1.2 has begun
to clutter the global parameter file, making it difficult for
users to determine which options need to be set.

Now the sample global parameter file groups the various options
into several categories, making a clear distinction between
those options that need to be changed by the user for each
simulation, and those that rarely need to be changed.  Those
options that rarely need to be changed are commented out, and VIC
now sets those options to the most commonly-used default values.

Removal of obsolete model options

    Files Affected:

    arno_evap.c
    canopy_evap.c
    close_files.c
    cmd_proc.c
    compute_zwt.c
    display_current_settings.c
    dist_prec.c
    frozen_soil.c
    full_energy.c
    func_canopy_energy_bal.c
    func_surf_energy_bal.c
    get_global_param.c
    global.h
    global.param.sample
    initialize_global.c
    initialize_lake.c
    initialize_model_state.c
    initialize_snow.c
    Makefile
    open_debug.c (removed)
    put_data.c
    read_lakeparam.c
    read_soilparam_arc.c
    read_soilparam.c
    read_veglib.c
    read_vegparam.c
    runoff.c
    store_moisture_for_debug.c (removed)
    surface_fluxes.c
    user_def.h
    vicerror.c
    vicNl.c
    vicNl_def.h
    vicNl.h
    write_atmosdata.c (removed)
    write_data.c
    write_debug.c (removed)

    Description:

We have removed some of the available model simulation options, due
to their being unrealistic or rarely used.  These include:

  GF_FULL value of GRND_FLUX_TYPE option.  This setting double-counted
    the effect of canopy attenuation of radiation.
  AR_COMBO value of AERO_RESIST_CANSNOW option.  This setting double-
    counted the effects of canopy snow on aerodynamic resistance.
  LINK_DEBUG option.  This user_def.h option would print out values of
    various water balance terms for debugging purposes, but was rarely
    used and difficult to maintain.

Overhaul of meteorological forcing processing

    Files Affected:

    alloc_atmos.c
    CalcBlowingSnow.c
calc_air_temperature.c
calc_longwave.c
display_current_settings.c
    get_force_type.c
    get_global_param.c
    global.param.sample
    initialize_atmos.c
    initialize_global.c
    Makefile
    mtclim_constants_vic.h (was mtclim42_vic.h)
    mtclim_parameters_vic.h (new file)
    mtclim_wrapper.c (was mtclim42_wrapper.c)
    mtclim_vic.c (was mtclim42_vic.c)
    output_list_utils.c
    put_data.c
    read_atmos_data.c
    read_soilparam.c
    vicNl_def.h
    vicNl.h
    write_forcing_file.c

    Description:

Numerous bug fixes and improvements to VIC's meteorological forcing
processing.

Bug fixes:

Two main bugs fixed, both primarily affecting high-latitude grid
cells:

1. On days having only 1 hour of darkness, the diurnal cycle
   of temperature was incorrect, skipping that day's minimum
   temperature and smoothly transitioning to the next day's
   maximum.

2. The seasonal evolution of the diurnal cycle of solar radiation
   was always 366 days long, so that the number of daylight hours got
   increasingly out of phase with the time of year (by one day per
   non-leap year) as the simulation progressed.  After 20-30 years,
   the diurnal cycle was substantially different from what it should
   be.  Above 60 N, the number of days having no sunlight was
   substantially longer than it should be.

Also fixed inconsistencies in the timing of meteorological variables
when sub-daily met variables were supplied by the user.  Now, we have
adopted the following convention:
      daily supplied forcings are assumed to start/end at midnight in
    local time; for these forcings, off_gmt in the soil parameter file
    is ignored
  sub-daily supplied forcings are assumed to occur relative to the time
    zone indicated by off_gmt in the soil parameter file

New features:

    Updated VIC's internal version of the MTCLIM forcing disaggregation
    functions from version 4.2 (Thornton and Running, 1999) to include
elements of version 4.3 (Thornton et al 2000).  

    This update includes 6 main changes to the forcing estimation scheme:

    1. Optional correction of downward shortwave for the effect of snow.
   In the presence of snow, incoming shortwave radiation has been
   observed to be higher than MTCLIM 4.2's estimates, due to
   scattering of light from the snow back into the atmosphere (and
   ultimately back to the ground again).  This correction is optional
   and is controlled by the new global parameter option MTCLIM_SWE_CORR.
   If this is set to TRUE, the correction is performed when snow is
   present on the ground (estimated by a simple degree-day model in
   the forcing pre-processor).  If FALSE, the correction is not
   performed (and shortwave is estimated as in previous versions of
   VIC).  The default value of MTCLIM_SWE_CORR is TRUE.

    2. Optional changes in the iteration between shortwave and VP
   estimates.  The algorithm for estimating shortwave requires
   observed VP as an input; the algorithm for estimating VP requires
   observed shortwave as an input.  Therefore, when neither quantity is
   observed, MTCLIM 4.2 (and previous versions of VIC) used the
   Tdew = Tmin approximation to supply the shortwave estimate with
   an estimate of daily vapor pressure.  Then the resulting shortwave
   estimate was used to compute a more accurate estimate of Tdew and
   vapor pressure.  MTCLIM 4.3 imposes an annual aridity criterion for
   performing this final step; for humid environments (annual PET <
   2.5 * annual precip) the scheme simply assumes daily Tdew = daily
   Tmin.  We have found that this behavior introduces a strong
   positive bias into vapor pressure, and have chosen to make it
   optional.  Therefore, we have introduced the new global
   parameter option VP_ITER to control the shortwave-vp iteration.  It
   can take on the following values:

     VP_ITER_NEVER = never perform the final update of Tdew and VP
     VP_ITER_ALWAYS = always perform the final update of Tdew and VP
     VP_ITER_ANNUAL = use the annual aridity criterion (annual PET <
                          2.5 * annual precip) do decide whether to perform
                      the final update
     VP_ITER_CONVERGE = continue iterating between shortwave and vp
                        until the two values stabilize (this tends
                        to give almost identical results to
                        VP_ITER_ALWAYS)

   The default value of VP_ITER is VP_ITER_ALWAYS.

3. To make the sub-daily values of VP more accurate, we have introduced
   another global parameter option: VP_INTERP.  If set to TRUE, VIC will
   assign the daily VP value computed by the MTCLIM functions to the
   time of sunrise on that day, and interpolate linearly between sunrise
   vapor pressure values of adjacent days.  If set to FALSE, VIC will
   hold vapor pressure constant over the entire day as in previous
   versions.  The default value of VP_INTERP is TRUE.

4. Alternative clear-sky longwave algorithms.  We have introduced a
   new global parameter option: LW_TYPE.  This option determines which
   algorithm is used to compute clear-sky longwave radiation.
   Choices are:

     LW_TVA = algorithm of Tennessee Valley Authority (TVA, 1972)
    (This is what all previous versions of VIC have used.  Our tests
    indicate that this algorithm is still the best when observed
    cloud fractions are unavailable and are estimated by MTCLIM,
    which is the current situation for VIC.)
     LW_ANDERSON = algorithm of Anderson (1964)
     LW_BRUTSAERT = algorithm of Brutseart (1975)
     LW_SATTERLUND = algorithm of Satterlund (1979)
     LW_IDSO = algorithm of Idso (1981)
     LW_PRATA = algorithm of Prata (1996) (Our tests indicate that
    this algorithm is best when observed cloud fractions are
    supplied as a forcing.)

   Default is set to LW_TVA.

5. Alternative cloud longwave emission algorithms.  We have introduced
   a new global parameter option: LW_CLOUD.  This option
   determines which algorithm is used to simulate the effect of
   cloudiness on incoming longwave radiation.  Choices are:

     LW_CLOUD_BRAS = algorithm composed of equations 2.29 and 2.43
    from the Bras textbook (Bras, R. L., "Hydrology, an
    introduction to hydrologic science", Addison-Wesley, Reading,
    Massachusetts, 1990).  This was the algorithm used in all
    previous releases of VIC. (Our tests indicate that this
    algorithm introduces substantial temperature-dependent biases
    in longwave estimates outside of the temperate zone)
     LW_CLOUD_DEARDORFF = algorithm used in Deardorff (1978) in which
    cloud_fraction is assumed equal to
        (1 - actual_shortwave/theoretical_clear_sky_shortwave)
    and total sky emissivity is represented as the weighted average:
        cloud_fraction * cloud_emissivity
        + (1-cloud_fraction) * clear_sky_emissivity
    (Our tests indicate that this algorithm is superior)

   Default is set to LW_CLOUD_DEARDORFF.

6. Optional threshold for daily precipitation to cause dimming of
   incoming shortwave radiation.  Previously, any precipitation would
   cause estimated daily incoming shortwave radiation to dim by 25%.
   Because the smoothing/resampling methods used in creating gridded
   forcings can artificially "bleed" trace amounts of precipitation
   into neighboring grid cells, we introduced this threshold to
   counteract any resulting low biases in shortwave.  This is
   controlled by the global parameter file option SW_PREC_THRESH,
   which is the minimum amount of daily precipitation (in mm) that
   must be exceeded for shortwave to dim.  The default value is set to
   0.1 mm.

Added the ability to simulate organic soil.

Files Affected:

display_current_settings.c
frozen_soil.c
full_energy.c
func_surf_energy_bal.c
get_global_param.c
global.param.sample
initialize_global.c
initialize_model_state.c
lakes.eb.c
prepare_full_energy.c
read_soilparam_arc.c
read_soilparam.c
runoff.c
soil_conduction.c
vicNl_def.h
vicNl.h

Description:

Added logic to handle organic soil properties.  Added a new global
parameter file option, ORGANIC_FRACT. If ORGANIC_FRACT is TRUE, VIC
assumes that there are 3*Nlayer extra columns in the soil parameter
file, containing for each layer the organic fraction and bulk and soil
densities of the organic matter.  If ORGANIC_FRACT is FALSE or is
omitted, VIC assumes that the soil param file does not contain these
extra columns, and assumes that the soil contains 0 organic matter (as
in previous versions of VIC).

The organic fraction in the soil parameter file is the fraction of
soil (by volume) that is organic matter.  If this fraction is > 0,
then the quartz content and the original bulk and soil densities are
assumed to apply only to the mineral portion of the soil.  Internally,
VIC will compute the aggregate bulk and soil densities of the combined
mineral and organic portions of the soil and compute an aggregate soil
porosity.

VIC now uses equations taken from Farouki 1986 to compute the thermal
conductivity and heat capacity of the soil containing organic matter.
As organic fraction approaches 0, the soil properties approach those
of the mineral portion of the soil.

Extended computation of soil temperatures and ground heat flux to all modes of
operation.

Files Affected:

calc_soil_thermal_eqn.c
calc_surf_energy_bal.c
display_current_settings.c
frozen_soil.c
full_energy.c
func_surf_energy_bal.c
get_global_param.c
initialize_global.c
initialize_model_state.c
soil_conduction.c
surface_fluxes.c
vicNl_def.h
vicNl.h

Description:

Extended computation of soil temperatures and ground heat flux to all
modes of model operation.  Previously these quantities were only
computed when FROZEN_SOIL was TRUE.

Now soil temperatures, ice content, and ground heat flux are computed
as follows:

1. If FROZEN_SOIL is TRUE, there is no change to previous model
    behavior.  By default, soil temperature profile is computed via
    the finite element method of Cherkauer and Lettenmaier (1999),
    taking account of the phase change of ice.  (To use the Liang
    et al (1999) approximation, set QUICK_FLUX to TRUE; however
    this is not recommended because it doesn't handle the phase
    change of ice.)  If FULL_ENERGY is also TRUE, the surface
    temperature is computed via iteration over the surface energy
    balance; if FULL_ENERGY is FALSE, the surface temperature is
    set to air temperature.  Soil layer average temperatures and
    ice contents are computed and available for output.

2. If FROZEN_SOIL is FALSE, the ice phase change is not accounted for
    and soil layer ice contents are all set to 0.  Unlike previous
    versions, the soil layer temperatures and ice contents (=0)
    are now available for output.  The default method of computing
    soil temperature profile depends on the setting of the
    QUICK_FLUX option:
    a. QUICK_FLUX FALSE: use approximation of Liang et al (1999).
       This is the default method, if QUICK_FLUX is not specified
       in the global param file.
    b. QUICK_FLUX TRUE: use finite element method of Cherkauer et
       al. (1999).

Now that soil temperatures, ice contents, and ground heat fluxes are
always computed, the GRND_FLUX option has been removed.

Added computation of water table position.

Files Affected:

compute_zwt.c (new)
initialize_lake.c
initialize_soil.c
lakes.eb.c
Makefile
output_list_utils.c
put_data.c
read_soilparam.c
read_soilparam_arc.c
runoff.c
user_def.h
vicNl_def.h
vicNl.c
vicNl.h

Description:

Added computation of the water table position, "zwt".  Units are [cm]
and the position is negative below the soil surface.  To monitor
the water table position, we have added the following output variables:

  OUT_ZWT  - water table position [cm] computed by requiring that all
         layers below it are saturated, i.e. the water table will
         appear only in the lowest unsaturated layer.
  OUT_ZWT_LUMPED - water table position [cm] computed by combining all soil
         layers into a single layer and assuming the soil below
         is completely saturated.

The water table's position within a soil layer is computed from soil
water retention curves following Letts et al. (2000):

  w(z) = { ((zwt-z)/bubble)**(-1/b), z <  zwt-bubble
         { 1.0,                      z >= zwt-bubble
where
  z      = depth below surface [cm]
  w(z)   = relative moisture at depth z given by
           (moist(z) - resid_moist) / (max_moist - resid_moist)
  zwt    = depth of water table below surface [cm]
  bubble = bubbling pressure [cm]
  b      = 0.5*(expt-3)
Note that zwt-bubble = depth of the free water surface, i.e.
position below which soil is completely saturated.

This assumes water in unsaturated zone above water table
is always in equilibrium between gravitational and matric
tension (e.g., Frolking et al, 2002).

So, to find the soil moisture value in a layer corresponding
to a given water table depth zwt, we integrate w(z) over the
whole layer:

w_avg = average w over whole layer = (integral of w*dz) / layer depth

Then,
  layer moisture = w_avg * (max_moist - resid_moist) + resid_moist

Instead of the zwt defined above, we actually report free
water surface elevation zwt* = -(zwt-bubble).  I.e. zwt* < 0
below the soil surface, and marks the point of saturation
rather than pressure = 1 atm.

To store the (zwt,moisture) pairs in this relationship for each layer,
two new variables have been added to the soil_con_struct:
  zwtvmoist_zwt[MAX_LAYER][MAX_ZWTVMOIST]
  zwtvmoist_moist[MAX_LAYER][MAX_ZWTVMOIST]
These are computed in read_soilparam().  Then, in compute_zwt() VIC
interpolates between these points to estimate the water table depth
in each layer given the layer's current soil moisture.

Added channel inflow from upstream into the lake to the list of forcing
variables. Added lake water balance terms to input/output variables.

Files Affected:

alloc_atmos.c
full_energy.c
get_force_type.c
initialize_atmos.c
initialize_lake.c
initialize_model_state.c
LAKE.h
lakes.eb.c
output_list_utils.c
output.PILPS-2E.ALMA.template
output.TRADITIONAL.410.template
set_output_defaults.c
put_data.c
read_lakeparam.c
vicNl.c
vicNl_def.h
vicNl.h

Description:

Added forcing variable CHANNEL_IN to allow channel flow from
upstream grid cells to be an input into the lake.  This variable
is ignored if LAKES is set to FALSE or the lake/wetland tile has 0
area.  CHANNEL_IN must be in units of cubic meters [m3] per forcing
time step (or cubic meters per second [m3/s] if ALMA_INPUT is TRUE).

Several output variables have been added to aid in tracking the
lake water budget.  The complete set of lake water budget variables
is (in mm over grid cell area):

  OUT_LAKE_BF_IN    baseflow into lake from catchment
  OUT_LAKE_BF_OUT   baseflow out of lake
  OUT_LAKE_CHAN_IN  channel inflow into lake
  OUT_LAKE_CHAN_OUT channel outflow from lake
  OUT_LAKE_DSTOR    change in lake moisture storage (liquid plus
                ice cover)
  OUT_LAKE_DSWE     change in snowpack on top of lake ice
  OUT_LAKE_EVAP     (was OUT_EVAP_LAKE)
  OUT_PREC      (already existed)
  OUT_LAKE_RCHRG    recharge from lake to wetland
  OUT_LAKE_RO_IN    runoff into lake from catchment
  OUT_LAKE_VAPFLX   sublimation from lake snow
These same variables exist in units of volume (m**3):
  OUT_LAKE_BF_IN_V  baseflow into lake from catchment
  OUT_LAKE_BF_OUT_V baseflow out of lake
  OUT_LAKE_CHAN_IN_V    channel inflow into lake
  OUT_LAKE_CHAN_OUT_V   channel outflow from lake
  OUT_LAKE_DSTOR_V  change in lake moisture storage (liquid plus
                ice cover)
  OUT_LAKE_DSWE_V   change in snowpack on top of lake ice
  OUT_LAKE_EVAP_V   evap from lake
  OUT_LAKE_PREC_V   (note the "LAKE" in the name)
  OUT_LAKE_RCHRG_V  recharge from lake to wetland
  OUT_LAKE_RO_IN_V  runoff into lake from catchment
  OUT_LAKE_VAPFLX_V sublimation from lake snow

This change also involved changing how lake fluxes are represented
internally in VIC.  They are now represented as volumes (m3) per step.
This allows better handling of cases in which the lake shrinks to 0
area.

Added the output variable OUT_LAKE_AREA_FRAC, the lake surface area as a
fraction of the grid cell area.

Files Affected:

output_list_utils.c
put_data.c
vicNl_def.h

Description:

Added the output variable OUT_LAKE_AREA_FRAC, which tracks the lake
surface area as a fraction of the grid cell area.  This allows quick
comparison of VIC outputs with lake area observations (e.g. from
remote sensing).

Added validation of b_infilt

Files Affected:

read_soilparam.c

Description:

VIC now checks to make sure b_infilt > 0.  If the value is <= 0,
VIC exits with an error message.

Removed MIN_LIQ option.

Files Affected:

arno_evap.c
frozen_soil.c
get_global_param.c
global.param.sample
initialize_global.c
initialize_lake.c
initialize_model_state.c
initialize_soil.c
lakes.eb.c
runoff.c
soil_conduction.c
vicNl_def.h
vicNl.h

Description:

This option was intended to allow a dynamic (temperature-dependent)
lower bound on liquid soil moisture, based on the principle that, even
at very low temperatures, some moisture remains unfrozen.  However,
it ended up being unnecessary and its implementation introduced
undesirable complexity into the code.  In addition, it contained a bug
that allowed soil moisture to fall below residual moisture level.
Therefore this feature has been removed.

Bug Fixes:

Users can inadvertently choose an unstable soil temperature scheme

Files Affected:

get_global_param.c
initialize_global.c
initialize_model_state.c
newt_raph_func_fast.c

Description:

Previously VIC's default soil temperature scheme when
FROZEN_SOIL=TRUE was an explicit scheme whose stability
was not guaranteed.  VIC has had an optional implicit
scheme but this was not turned on unless the user chose
it.  This led to users inadvertently running VIC with
an unstable temperature scheme under certain combinations
of model time step and thermal node spacing.

This has been fixed.  Now the implicit scheme is turned
on by default (IMPLICIT=TRUE by default when FROZEN_SOIL
is TRUE).  The implicit scheme is stable for all combinations
of model time step and thermal node spacing.  Because this
can slow down VIC simulations in some cases, this option
can still be overridden by setting IMPLICIT to FALSE in the
global parameter file.  However, if the user does this,
VIC now checks to see if the simulation's model time step
and thermal node spacing are in the stable region; if not,
VIC aborts with an error message.

Clarified description and variable names in SPATIAL_SNOW option

Files Affected:

calc_snow_coverage.c
calc_surf_energy_bal.c
ice_melt.c
initialize_lake.c
initialize_snow.c
read_soilparam_arc.c
read_soilparam.c
solve_snow.c
vicNl_def.h
write_snow_data.c

Description:

The parameter for the snow pack depth distribution was previously
named "depth_full_snow_cover".  However, this parameter's function
was actually to represent the slope of the snow pack depth
distribution.  If we define "depth_thresh" to be the minimum snow
pack depth below which the coverage < 1, then
  depth_full_snow_cover MUST = 2*depth_thresh
This was very misleading and caused users some confusion.  Therefore
we have changed the name of the parameter to "max_snow_distrib_slope".
In addition, other associated variables in the snow_data structure
have been renamed accordingly (max_swq became max_snow_depth and
swq_slope became snow_distrib_slope).

Fixed incorrect diurnal radiation cycle at high latitudes

Files Affected:

See "Overhaul of meteorological forcing processing" under
new features

Description:

See "Overhaul of meteorological forcing processing" under
new features.  Two main bugs fixed, both primarily affecting
high-latitude grid cells:
  1. On days having only 1 hour of darkness, the diurnal cycle
     of temperature was incorrect, skipping that day's minimum
     temperature and smoothly transitioning to the next day's
     maximum.
  2. The seasonal evolution of the diurnal cycle of solar radiation
     was always 366 days long, so that the number of daylight hours got
     increasingly out of phase with the time of year (by one day per
     non-leap year) as the simulation progressed.  After 20-30 years,
     the diurnal cycle was substantially different from what it should
     be.  Above 60 N, the number of days having no sunlight was
     substantially longer than it should be.

Fixed incorrect computation of snow cover fraction over lake/wetland

Files Affected:

lakes.eb.c

Description:

Previously VIC didn't compute snow cover fraction correctly
over the lake/wetland tile.  This has been fixed.

Fixed VIC's inability to handle the case where some cells have lakes and
others don't.

Files Affected:

full_energy.c
read_initial_model_state.c
read_lakeparam.c
vicNl_def.h
write_model_state.c

Description:

VIC 4.1.1 and previous versions of 4.1.2 were unable to handle the
case in which some cells contain lakes and others don't.  If
options.LAKES was TRUE, all cells were required to have a valid
value of lake_idx to indicate which veg tile contained a lake,
even if no lakes existed in the cell.

This has been fixed.  Now, users can specify a cell that has no
lakes by setting lake_idx to -1 in the lake parameter file.  In
this case, VIC will ignore all other lake parameters for the cell
and set the cell's lake area permanently to 0.

Fixed bugs in declarations of frost_fract for SPATIAL_FROST TRUE

Files Affected:

lakes.eb.c
put_data.c
vicNl.h

Description:

Declarations for frost_fract were wrong or missing.  This has
been fixed.        

Fixed various lake water balance errors.

Files Affected:

initialize_lake.c
initialize_model_state.c
initialize_soil.c
LAKE.h
lakes.eb.c
runoff.c
vicNl.h

Description:

Now calls to get_depth() are all consistent, using *liquid* water
volume instead of total volume (thus ldepth is always the liquid water
depth).  Lake ice area is not allowed to increase if ice area > liquid
area.  Ice cover is now treated like a "skin" on top of the liquid
(regardless of its thickness).  Ice is assumed to be completely buoyant,
i.e. none of the ice is below the water line.  If ice completely covers
the lake and the liquid part of the lake shrinks, the ice is assumed to
bend like a blanket, so that the outer edges now rest on land but the
center rests on top of the liquid.  The lake "area" is still considered
to be the ice cover in this case.  Baseflow out of the lake is only
allowed in the area of the lake containing liquid.  The edges of the ice
sheet are assumed to be vertical, i.e. the surface area of the top of the
ice sheet is equal to the surface area of the bottom of the ice sheet.
This fixes water balance errors arising from inconsistent estimates of
lake ice area.  Also fixed bugs in computation of lake->recharge.                

Fixed incorrect snow albedo decay for southern hemisphere.

Files Affected:

LAKE.h
lakes.eb.c
solve_snow.c

Description:

Previously the computation of the USACE snow albedo decay would
only switch from accumulation to melt curves for dates between
March 1 and October 1.  These dates are only appropriate for the
northern hemisphere.  This has been fixed so that the reverse
condition must be met in the southern hemisphere.

Saturated area fraction incorrect for SPATIAL_FROST = TRUE.

Files Affected:

runoff.c

Description:

Previously the computation of cell.Asat occurred in the wrong
place in runoff.c so that it was only correct for SPATIAL_FROST
= FALSE.  This has been fixed.

State file handles are never closed.

Files Affected:

vicNl.c

Description:

Previously VIC was not closing the intial and final state files.
This has been fixed.

VIC aborts with soil temperature node moisture > max moisture.

Files Affected:

soil_conduction.c

Description:

Previously VIC would abort the simulation if soil temperature node
moisture ever became greater than the maximum allowable moisture.
This behavior has been replaced with a resetting of node moisture to
the maximum.  This is not intended to be a permanent fix; it simply
allows simulations to continue with minimal errors.  A more robust
fix is planned.

Initial lake depth < mindepth is reset to mindepth.

Files Affected:

read_lakeparam.c

Description:

The validation of initial lake depth was incorrectly resetting depth
to mindepth if initial depth < mindepth.  This has been fixed.

Soil moisture falls below residual moisture level in some cases.

Files Affected:

(see "Removed MIN_LIQ option" under "New Features")

Description:

The MIN_LIQ option contained a bug that allowed soil moisture to fall
below residual moisture level in some cases.  This feature has been
removed (see "Removed MIN_LIQ option" under "New Features").

Incorrect calculation of grnd_flux, deltaH, and fusion for EXP_TRANS=TRUE.

Files Affected:

arno_evap.c
calc_surf_energy_bal.c
frozen_soil.c
func_surf_energy_bal.c
get_global_param.c
initialize_model_state.c
modify_Ksat.c
solve_snow.c
surface_fluxes.c
vicNl.h

Description:

In 4.1.1, the calculation of grnd_flux, deltaH, and fusion involved
the assumption that soil thermal nodes 1 and 2 were at depths of
1*soil_con->depth[0] and 2*soil_con->depth[0], respectively.  This is
not true for exponential node spacing (EXP_TRANS=TRUE) or any other
node spacing scheme in general.  This has been fixed to allow
aribitrary node spacing.

The temperature profile given by the exponential node spacing is now
interpolated to find the temperatures at the same depths as for the
linear node spacing, i.e.  the boundary between the first and second
soil hydrologic layers.  This makes the computation of grnd_flux,
deltaH, and fusion consistent across all modes of operation (linear
and exponential node spacing AND the QUICK_FLUX approximation), since
now they all apply to the same control volume (first soil layer).

Simulation log messages appear out of order.

Files Affected:

display_current_settings.c
put_data.c

Description:

In 4.1.1, some messages sent to the screen would appear out of order
when saved to a log file.  This has been fixed by redirecting messages
from stdout to stderr.

Fixed typo in setting of fallback T value for the soil T profile.

Files Affected:

frozen_soil.c

Description:

In 4.1.1, the fallback temperature was erroneously set to "oldT",
which is the T value of the previous iteration, but not the value
from the beginning of the time step (except on the first iteration).
Now, "oldT" has been replaced by "T0".

Fixed typo in initialization of fallback counts for the soil T profile.

Files Affected:

frozen_soil.c

Description:

In 4.1.1, only the fallback counts for nodes 1 to Nnodes-2 were
initialized (to 0).  Now initialization is done for nodes 0 to
Nnodes-1.

Fixed various water balance errors in the lake model and added logic to handle
the case when lake area goes to 0.

Files Affected:

full_energy.c
lakes.eb.c
put_data.c
vicNl_def.h

Description:

In 4.1.1, the lake model would generate small water balance errors
when lake area would change, particularly in the presence of lake ice.
In addition, lake water balance terms would become NaN when lake
fraction went to 0.  These errors have been fixed.

Replaced "assert" statements with "if" statements.

Files Affected:

calc_atmos_energy_bal.c
calc_surf_energy_bal.c
ice_melt.c
snow_intercept.c
snow_melt.c
water_energy_balance.c
water_under_ice.c

Description:

Previous versions of these files contain "assert" statements, which
cause the model to abort if the assertions are not true.  These have
been replaced by "if" statements, so that the offending conditions can
be remedied and the simulation can continue.

Removed save_data structure initialization from initialize_model_state().

Files Affected:

initialize_model_state.c
put_data.c
vicNl.c
vicNl.h

Description:

For each time step, the initial values of the major moisture storage
terms are stored in the save_data structure, so that the difference
between final and initial states can be computed and written to
output.  In earlier versions, these variables needed to be initialized
in initialize_model_state() so that they contained valid values before
the first call to put_data().  This is no longer necessary, as the
model now initializes all output variables with an initial call to
put_data() before the simulation begins.  Thus, the initialization
has been removed from initialize_model_state().

Fixed typo in condition for reading Wdew values.

Files Affected:

read_initial_model_state.c

Description:

In 4.1.1, Wdew values were expected for even the bare soil veg tile,
despite the fact that these values are not saved for bare soil in the
function write_model_state().  This has been fixed; Wdew is no longer
expected for the bare soil tile.

Fixed bug in runoff computation when soil column is completely saturated.

Files Affected:

runoff.c

Description:

runoff() first computes total runoff for the timestep, and then computes
hourly vertical water movement through the soil column.  During the
hourly computations, if the entire soil column becomes saturated, some
downward-moving water may be "regurgitated" back up to the surface,
where it is added to the total runoff for the time step.

In 4.1.1, the hourly infiltration into the soil column is computed
using runoff[frost_area].  However, in the case of complete saturation,
the regurgitated excess water is added to runoff[frost_area] within
the hourly loop, so that the next hour's infiltration is computed
using a larger value of runoff[frost_area].  This leads to water
balance errors.  This has been fixed in 4.1.2.  Now, hourly
infiltration is only computed relative to the original estimate of
runoff[frost_area], before any regurgitated excess water is added to
it.

Fixed typo in writing of number of lake active nodes to ASCII-format state file.

Files Affected:

write_model_state.c

Description:

Fixed a typo in the writing of the number of lake active nodes to the
statefile, for ASCII format.  The error involved omitting a space that
would separate the active node number from the temperature of the
deepest soil thermal node, preventing the state file from being read
correctly in subsequent VIC runs.

Added TFALLBACK logic to soil thermal profile solution for case in which max
iterations are exceeded.

Files Affected:

frozen_soil.c

Description:

In 4.1.1, errors due to exceeding the maximum number of iterations in
the soil temperature profile computation in calc_soil_thermal_fluxes()
were not handled by the TFALLBACK option.  Logic to handle this case
has now been added.

Fixed bugs in initialization of various TFallback counts and flags.

Files Affected:

initialize_snow.c
frozen_soil.c

Description:

In 4.1.1, the number of Tfallbacks reported to the screen sometimes
came out negative; this has been fixed for fallbacks in snow surface
temperature and soil temperature profile.

Misc fixes to handling of aerodynamic resistance.

Files Affected:

func_surf_energy_bal.c
surface_fluxes.c

Description:

Replaced ra_under with Ra_used[0] in func_surf_energy_bal.c - this
should not change behavior; it simply cleans up the code a tad.

Added logic to surface_fluxes.c to handle cases when aero_cond and
aero_resist are 0 or very large.

Added hack to prevent runaway cold nose in soil temperature profile. This is
only enabled when options.TFALLBACK = TRUE.

Files Affected:

frozen_soil.c

Description:

In 4.1.1, the soil temprature computation could sometimes encounter a
runaway "cold nose", in which one node was colder than its neighbors
and continued to grow colder than its neighbors over time, due to
instabilities in the soil heat equation (in the presence of ice in the
soil).  A rigorous numerical solution to this problem has not yet been
implemented, but this hack causes the offending node to be reset to
the average of its neighbors' temperatures as soon as the runaway
behavior is detected.  We hope to implement a more rigorous solution
to this problem in future releases.

Simplified arguments lists of various functions.

Files Affected:

arno_evap.c
func_surf_energy_bal.c
initialize_atmos.c
snow_intercept.c
solve_snow.c
surface_fluxes.c
vicNl.c
vicNl.h

Description:

Replaced individual forcing and date/time variables in argument
lists of solve_snow() and snow_intercept() with the dmy and atmos
data structures.  Removed several unused variables from the arg list
of arno_evap().  Replaced individual soil_con variables in arg list
of initialize_atmos() with the soil_con structure.

Replaced GLOBAL_LAI option with 2 options: VEGPARAM_LAI and LAI_SRC.

Files Affected:

display_current_settings.c
get_global_param.c
global.param.sample
initialize_global.c
read_veglib.c
read_vegparam.c
vicNl_def.h

Description:

In previous versions, the GLOBAL_LAI option caused some confusion.
GLOBAL_LAI=TRUE indicated that LAI values should be read from the veg
parameter file (usually because they vary globally), and FALSE
indicated that LAI values should be read from the veg library (meaning
they were constant across the globe).  But the natural interpretation
of "GLOBAL_LAI=TRUE" is that LAI values are globally constant.  In
addition, the presence of LAI values in the veg param file was
dictated by the setting of GLOBAL_LAI.  If the user wanted to have VIC
read LAI values from the veg library, GLOBAL_LAI would need to be
FALSE, and the veg param file would need to have its LAI values
removed.  This linkage of veg param file format and where VIC was
looking for LAI values seemed unnecesary.

There are now 2 options controlling these 2 separate aspects of LAI.
VEGPARAM_LAI controls the *format* of the veg param file.  Independent
of this, LAI_SRC controls *where* VIC looks for LAI values.  This way,
1) the user can switch between the two sources of LAI values without
having to change the veg param file, and 2) the meanings of these
options are more clear than the old GLOBAL_LAI option.

The old GLOBAL_LAI setting has been maintained for backwards-
compatibility, i.e. if VIC encounters GLOBAL_LAI in the global
param file, it will set VEGPARAM_LAI and LAI_SRC appropriately.

Changed default number of soil layers from 2 to 3 (the most common
configuration).

Files Affected:

initialize_global.c

Description:

The default number of soil layers has been changed from 2 to 3 (the
most common configuration).  This will only affect users who have
omitted this setting from their global parameter files.