6.2. Sensitivity Analysis

6.2.1. Melt rate parameter

Calibration involves the adjustment of one or more parameter values such that model outputs become similar (or almost similar) to obervations (measurements) of these outputs. Here we have only one measurement: the streamflow and how it changes over time. In the following we will calibrate the melt rate parameter using the streamflow measurements.

But first we need to do a sensitivity analysis. Before calibrating parameters, it is wise to perform a sensitivity analysis. In a sensitivity analysis we explore how model outputs change when a certain parameter is changed. This is informative for calibration as it tells us whether the parameter that we calibrate anyway has effect on the model output that we use for calibration (here: streamflow).

Sensitivity analysis can be done in an exact manner by calculating for instance a sensitivity index. Here we follow a more exploratory way.

Open runoff_sens_melt_rate.py. It is exactly the same script as runoff.py, but the reports to disk have been removed. We will use this script to create a model scenario with an increased meltrate and compare its output with the default model (runoff.py).

In runoff_sens_melt_rate.py change three things:

  1. Change the meltRateParameter, defined at the bottom part of the script to 0.004.

  2. When we run this script, we want to store outputs in another folder, melt_rate_high, it has already been created. And we want to compare the scenario with the original run. To do so, add the following lines at the bottom of the dynamic section:

# sensitivity analysis
# snow cover
# read the snow cover from the default run
snow_default = self.readmap('snow')
# calculate the difference with the default run
snowDiff = self.snow - snow_default
# report in the melt_rate_low folder
self.report(snowDiff, 'melt_rate_high/snowD')
  1. Item 2) above compared the snow cover of the scenario with the original run. Do the same for streamflow.

Now, first run the default model runoff.py. When finished, run runoff_sens_melt_rate.py.

When finished, you can plot results stored in the scenarion directory, combined with the difference between modelled and observed streamflow from the previous section (dMmO):

aguila --timesteps=[1,1461,1] melt_rate_high/disD melt_rate_high/snowD dMmO

Question: What is the effect of an increased melt rate parameter?

  1. The snow accumulation in autumn is higher causing higher streamflows throughout the year.

  2. The snow accumulation in autumn is less causing lower streamflows throughout the year.

  3. The snow disappears more slowly in spring causing more streamflow in summer.

  4. The snow disappears more quickly in spring causing more streamflow in spring.

Correct answers: d.

Feedback:

A higher meltrate causes more rapid melt of snow in spring resulting in more streamflow in that season. With lower meltrates, the snow melts later in the year and in addition more snow is lost due to sublimation of snow in summer. The bottom part of the dynamic section should look like this:

        # sensitivity analysis
        # snow cover
        # read the snow cover from the default run
        snow_default = self.readmap('snow')
        # calculate the difference with the default run
        snowDiff = self.snow - snow_default
        # report in the melt_rate_low folder
        self.report(snowDiff, 'melt_rate_high/snowD')

        # discharge
        # read the discharge from the default run
        dis_default = self.readmap('dis')
        # calculate the difference with the default run
        disDiff = dischargeMetrePerSecond - dis_default
        # report in the melt_rate_low folder
        self.report(disDiff, 'melt_rate_high/disD')




nrOfTimeSteps=1461

# read the observed streamflow from disk and store in numpy array
streamFlowObservedFile = open("streamflow.txt", "r")
streamFlowObserved = numpy.zeros(nrOfTimeSteps)
streamFlowObservedFileContent = streamFlowObservedFile.readlines()
for i in range(0,nrOfTimeSteps):
    splitted = str.split(streamFlowObservedFileContent[i])
    dischargeModelled = splitted[1]
    streamFlowObserved[i]=float(dischargeModelled)
streamFlowObservedFile.close()


# run the model with a particular value of the meltrate parameter
# for brute force calibration put the code below in a loop
# increased melt rate
#meltRateParameter = 0.003
meltRateParameter = 0.004


Question: In the next section we will calibrate the melt rate parameter. Do you think it should be higher than the value currently used or lower?

  1. Higher, streamflow was too high in summer and this will reduce.

  2. Lower, streamflow was too low in summer and this will reduce.

  3. Higher, streamflow was throughout the year too high and this will reduce.

  4. Lower, streamflow was throughout the year too low and this will reduce.

Correct answers: a.

Feedback:

The streamflow was too low in spring and too high in summer. With higher melt rates, the melt will start earlier in the year resulting in an increase in streamflow in spring. This will lead to a better fit between observed and modelled streamflow. In the next section you will determine how much exactly streamflow has to be increased.