Homework
Exercise 1
- Download module4_model.zip into a new project folder and extract its content.
- Review the folder structure and files of the model. It should be as follows:
module4_modeldata
├── .dfs0
│ ├── flow_meter_A_2020_09.dfs0
│ ├── flow_meter_B_2020_09.dfs0
│ └── rainfall_events_2020-09.mupp
├── Dyrup_uncalibrated.sqlite
├── Dyrup_uncalibrated
├── LTS.MJL
│ └── rainfall_events_LTS_2020_09
└── results.res1d
├── rainfallBaseDefault_Network_HD.res1d └── rainfallBaseDefault_Surface_runoff
- Open
Dyrup_uncalibrated.mupp
in MIKE+ and familiarize yourself with the model.- Review the boundary conditions. Can you see where the rainfall is applied?
- Find the system’s only node outlet: G60F360.
- Locate the two flow meters (A and B). Which reach IDs are they associated with?
- Review the simulation setup.
- Make a new LTS job list for the simulation. How does it compare with
LTS/rainfall_events_LTS_2020_09.MJL
? - Run a simulation. Do you get the same results as those in the
results
folder?
Exercise 2
- Create a new Jupyter Notebook and save it in your project folder.
- Create a
PointObservation
object for “Flow Meter A” usingdata/flow_meter_A_2020_09.dfs0
. - Create a
PointObservation
object for “Flow Meter B” usingdata/flow_meter_B_2020_09.dfs0
. - For both
obs_A
andobs_B
:- Print their objects and inspect the data.
- Plot their time series.
Exercise 3
- Use the model network results from Exercise 1 (or the provided reference results).
- For “Flow Meter A” (model reach
G60F380_G60F360_l1
), extract its ‘Discharge’ quantity to adfs0
file. - Create a
PointModelResult
object from thedfs0
file created above. - For “Flow Meter B” (model reach
G62F070_G62F060_l1
), extract its ‘Discharge’ quantity to adfs0
file. - Create a
PointModelResult
object from thedfs0
file created above. - For both
mod_A
andmod_B
:- Print the object summary.
- Plot the model result time series.
Exercise 4
- Match
obs_A
withmod_A
usingms.match()
. Store incomparer_A
. - Match
obs_B
withmod_B
. Store incomparer_B
. - For
comparer_A
:- Generate time series plot:
comparer_A.plot.timeseries()
. - Generate scatter plot:
comparer_A.plot.scatter()
. - Calculate and display skill table:
comparer_A.skill()
.
- Generate time series plot:
- Repeat step 3 for
comparer_B
. - Examine the skill tables. Qualitatively, which metrics suggest better or worse performance for each location?
Exercise 5
- Create a
ComparerCollection
namedcc
fromcomparer_A
andcomparer_B
. - Display
cc
. Checkcc.obs_names
andcc.mod_names
. - Make a temporal coverage plot:
cc.plot.temporal_coverage()
. - Make a scatter plot:
cc.plot.scatter()
. - Make a residual histogram:
cc.plot.residual_hist()
. - Calculate and display the skill table for the collection:
cc.skill()
.- Modify to show only ‘rmse’, ‘bias’, ‘nse’, and ‘kge’ metrics.
- Calculate and display the mean skill table:
cc.mean_skill()
.- Modify to show only ‘rmse’, ‘bias’, ‘nse’, and ‘kge’.
- Using
cc.score()
, retrieve and print the mean ‘kge’ score for the model.
Exercise 6
- Repeat Exercise 4 and 5, but using the
max_model_gap
parameter ofms.match()
. Use a value of 600 seconds. - How do the number of observation points in each Comparer change?
- How does the temporal coverage plot change?
- How does this approach impact the skill assessment?
- Review ModelSkill’s documentation on ‘nse’. How do both flow meters, and the overall model perform on this metric?