|
1 | 1 | function [results] = calc_McMillan_Groundwater(Q_mat, t_mat, P_mat, PET_mat, varargin) |
2 | 2 | %calc_McMillan_Groundwater calculates various groundwater signatures. |
3 | | -% Calculates 15 signatures from McMillan (2020), related to groundwater |
4 | | -% storage, groundwater dynamics and baseflow. These signatures come from |
5 | | -% previous experimental studies that link catchment or hillslope |
6 | | -% processes to streamflow response dynamics. Some signatures are |
| 3 | +% Calculates 15 signatures from McMillan (2020), related to groundwater |
| 4 | +% storage, groundwater dynamics and baseflow. These signatures come from |
| 5 | +% previous experimental studies that link catchment or hillslope |
| 6 | +% processes to streamflow response dynamics. Some signatures are |
7 | 7 | % implemented direct from the original papers, others are interpreted |
8 | 8 | % from a qualitative description in the paper. |
9 | 9 | % |
|
13 | 13 | % P_mat: precipitation [mm/timestep] matrix (cell array) |
14 | 14 | % PET_mat: pot. evapotranspiration [mm/timestep] matrix (cell array) |
15 | 15 | % OPTIONAL |
16 | | -% start_water_year: first month of water year, default = 10 (October) |
| 16 | +% start_water_year: first month of water year, default = 10 (October) |
17 | 17 | % plot_results: whether to plot results, default = false |
18 | 18 | % recession_length: min. length of recessions [days], default = 15 |
19 | 19 | % n_start: days to be removed after start of recession |
|
75 | 75 |
|
76 | 76 | % initialise arrays |
77 | 77 |
|
78 | | -% Section: Groundwater |
| 78 | +% Section: Groundwater |
79 | 79 | % Signatures referring to double peaks in streamflow are not coded due to |
80 | 80 | % subjectivity in identification of the peaks. |
81 | 81 | % Total runoff ratio describes overall water loss to deep groundwater. |
|
98 | 98 | % Seasonal variations in recession parameters (Shaw and Riha, 2012). |
99 | 99 | Recession_a_Seasonality = NaN(size(Q_mat,1),1); |
100 | 100 | Recession_a_Seasonality_error_str = strings(size(Q_mat,1),1); |
101 | | -% Average storage from average baseflow and storage-discharge relationship |
| 101 | +% Average storage from average baseflow and storage-discharge relationship |
102 | 102 | % (McNamara et al., 2011). |
103 | 103 | AverageStorage = NaN(size(Q_mat,1),1); |
104 | 104 | AverageStorage_error_str = strings(size(Q_mat,1),1); |
105 | 105 | % Recession analysis parameters approximate storage-discharge relationship. |
106 | 106 | % This fits a single relationship to the point cloud. |
107 | | -RecessionParameters = NaN(size(Q_mat,1),3); |
| 107 | +RecessionParameters_a = NaN(size(Q_mat,1),1); |
| 108 | +RecessionParameters_b = NaN(size(Q_mat,1),1); |
| 109 | +RecessionParameters_T0 = NaN(size(Q_mat,1),1); |
108 | 110 | RecessionParameters_error_str = strings(size(Q_mat,1),1); |
109 | | -% Changes of slope in a master recession curve (MRC) or recession analysis |
| 111 | +% Changes of slope in a master recession curve (MRC) or recession analysis |
110 | 112 | % plot indicate multiple linear reservoirs. |
111 | 113 | MRC_num_segments = NaN(size(Q_mat,1),1); |
112 | 114 | MRC_num_segments_error_str = strings(size(Q_mat,1),1); |
113 | 115 | % First: steep section of the master recession curve = storage that is |
114 | 116 | % quickly depleted (Estrany et al., 2010). |
115 | 117 | First_Recession_Slope = NaN(size(Q_mat,1),1); |
116 | | -% Second: mid section of the master recession curve = water retention |
| 118 | +% Second: mid section of the master recession curve = water retention |
117 | 119 | % capacity of the catchment (Estrany et al., 2010). |
118 | 120 | Mid_Recession_Slope = NaN(size(Q_mat,1),1); |
119 | 121 | % Non-uniqueness in the storage-discharge relationship (McMillan et al., |
120 | | -% 2011; Harman et al., 2009). Tested using Spearman rank correlation on Q |
| 122 | +% 2011; Harman et al., 2009). Tested using Spearman rank correlation on Q |
121 | 123 | % vs. dQ/dt. |
122 | 124 | Spearmans_rho = NaN(size(Q_mat,1),1); |
123 | 125 | Spearmans_rho_error_str = strings(size(Q_mat,1),1); |
124 | | -% Ratio between event and total runoff coefficient: low = large storage |
| 126 | +% Ratio between event and total runoff coefficient: low = large storage |
125 | 127 | % capacity (Blume et al., 2008). |
126 | 128 | EventRR_TotalRR_ratio = NaN(size(Q_mat,1),1); |
127 | | -% Variability index of flow. Low variability index shows higher water |
| 129 | +% Variability index of flow. Low variability index shows higher water |
128 | 130 | % storage (Estrany et al., 2010). |
129 | 131 | VariabilityIndex = NaN(size(Q_mat,1),1); |
130 | 132 | VariabilityIndex_error_str = strings(size(Q_mat,1),1); |
131 | 133 |
|
132 | | -% Section: Baseflow |
| 134 | +% Section: Baseflow |
133 | 135 | % Visual inspection of hydrograph for stable baseflow: not coded. |
134 | | -% Baseflow index indicates baseflow proportion and baseflow residence time |
| 136 | +% Baseflow index indicates baseflow proportion and baseflow residence time |
135 | 137 | % (Yilmaz et al., 2008; Bulygina et al., 2009; Hrachowitz et al., 2014). |
136 | 138 | BFI = NaN(size(Q_mat,1),1); |
137 | 139 | BFI_error_str = strings(size(Q_mat,1),1); |
138 | 140 | % Baseflow recession constant K (assuming exponential recession behaviour), |
139 | | -% slower recessions show greater groundwater influence and longer |
| 141 | +% slower recessions show greater groundwater influence and longer |
140 | 142 | % subsurface flow paths (Safeeq et al., 2013). |
141 | 143 | BaseflowRecessionK = NaN(size(Q_mat,1),1); |
142 | 144 | BaseflowRecessionK_error_str = strings(size(Q_mat,1),1); |
143 | 145 |
|
144 | 146 | % loop over all catchments |
145 | 147 | for i = 1:size(Q_mat,1) |
146 | | - |
| 148 | + |
147 | 149 | % Section: Groundwater |
148 | 150 | [TotalRR(i),~,TotalRR_error_str(i)] = sig_TotalRR(Q_mat{i},t_mat{i},P_mat{i}); |
149 | 151 | [RR_Seasonality(i),~,RR_Seasonality_error_str(i)] = sig_RR_Seasonality(Q_mat{i}, t_mat{i}, P_mat{i}, ... |
150 | 152 | 'summer_start', start_water_year-6); |
151 | 153 | [EventRR(i),~,EventRR_error_str(i)] = sig_EventRR(Q_mat{i},t_mat{i},P_mat{i}); |
152 | 154 | [StorageFraction(i,1),StorageFraction(i,2),StorageFraction(i,3),~,StorageFraction_error_str(i)] = ... |
153 | 155 | sig_StorageFraction(Q_mat{i},t_mat{i},P_mat{i},PET_mat{i},'plot_results',plot_results); |
154 | | - |
| 156 | + |
155 | 157 | % Section: Storage (especially groundwater) |
156 | 158 | [Recession_a_Seasonality(i),~,Recession_a_Seasonality_error_str(i)] = ... |
157 | 159 | sig_SeasonalVarRecessions(Q_mat{i},t_mat{i},'eps',eps,'recession_length',recession_length,'plot_results',plot_results,'n_start',n_start); |
158 | 160 | [AverageStorage(i),~,AverageStorage_error_str(i)] = ... |
159 | 161 | sig_StorageFromBaseflow(Q_mat{i},t_mat{i},P_mat{i},PET_mat{i},'start_water_year',start_water_year,'plot_results',plot_results,'recession_length',recession_length,'n_start',n_start,'eps',eps); |
160 | 162 | [RecessionParametersTemp,~,~,RecessionParameters_error_str_temp] = ... |
161 | 163 | sig_RecessionAnalysis(Q_mat{i},t_mat{i},'fit_individual',true,'plot_results',plot_results,'recession_length',recession_length,'n_start',n_start,'eps',eps); |
162 | | - RecessionParameters(i,1) = median((RecessionParametersTemp(:,1)),'omitnan'); |
163 | | - RecessionParameters(i,2) = median(RecessionParametersTemp(:,2),'omitnan'); |
| 164 | + |
| 165 | + % Post-processing of RecessionParameters (see sig_RecessionAnalysis |
| 166 | + % function description for the details) |
| 167 | + RecessionParameters_a(i) = median((RecessionParametersTemp(:,1)),'omitnan'); |
| 168 | + RecessionParameters_b(i) = median(RecessionParametersTemp(:,2),'omitnan'); |
164 | 169 | RecessionParametersT0Temp = 1./(RecessionParametersTemp(:,1).*median(Q_mat{i}(Q_mat{i}>0),'omitnan').^(RecessionParametersTemp(:,2)-1)); |
165 | 170 | ReasonableT0 = and(RecessionParametersTemp(:,2)>0.5,RecessionParametersTemp(:,2)<5); |
166 | | - RecessionParameters(i,3) = median(RecessionParametersT0Temp(ReasonableT0),'omitnan'); |
| 171 | + RecessionParameters_T0(i) = median(RecessionParametersT0Temp(ReasonableT0),'omitnan'); |
167 | 172 | RecessionParameters_error_str(i) = RecessionParameters_error_str_temp; |
| 173 | + |
168 | 174 | [MRC_num_segments(i),Segment_slopes,~,MRC_num_segments_error_str(i)] = ... |
169 | 175 | sig_MRC_SlopeChanges(Q_mat{i},t_mat{i},'plot_results',plot_results,'eps',eps,'recession_length',recession_length,'n_start',n_start); |
170 | 176 | First_Recession_Slope(i) = Segment_slopes(1); |
|
174 | 180 | [Spearmans_rho(i),~,Spearmans_rho_error_str(i)] = sig_RecessionUniqueness(Q_mat{i},t_mat{i},'eps',eps,'recession_length',recession_length,'n_start',n_start); |
175 | 181 | EventRR_TotalRR_ratio(i) = EventRR(i)/TotalRR(i); |
176 | 182 | [VariabilityIndex(i),~,VariabilityIndex_error_str(i)] = sig_VariabilityIndex(Q_mat{i},t_mat{i}); |
177 | | - |
| 183 | + |
178 | 184 | % Section: Baseflow |
179 | 185 | [BFI(i),~,BFI_error_str(i)] = sig_BFI(Q_mat{i},t_mat{i},'method','UKIH'); |
180 | 186 | [BaseflowRecessionK(i),~,BaseflowRecessionK_error_str(i)] = ... |
181 | | - sig_BaseflowRecessionK(Q_mat{i},t_mat{i},'eps',eps,'recession_length',recession_length,'n_start',n_start); |
182 | | - |
| 187 | + sig_BaseflowRecessionK(Q_mat{i},t_mat{i},'eps',eps,'recession_length',recession_length,'n_start',n_start); |
| 188 | + |
183 | 189 | end |
184 | 190 |
|
185 | 191 | % add results to struct array |
|
195 | 201 | results.Recession_a_Seasonality_error_str = Recession_a_Seasonality_error_str; |
196 | 202 | results.AverageStorage = AverageStorage; |
197 | 203 | results.AverageStorage_error_str = AverageStorage_error_str; |
198 | | -results.RecessionParameters = RecessionParameters; |
| 204 | +results.RecessionParameters_a = RecessionParameters_a; |
| 205 | +results.RecessionParameters_b = RecessionParameters_b; |
| 206 | +results.RecessionParameters_T0 = RecessionParameters_T0; |
199 | 207 | results.RecessionParameters_error_str = RecessionParameters_error_str; |
200 | 208 | results.MRC_num_segments = MRC_num_segments; |
201 | 209 | results.MRC_num_segments_error_str = MRC_num_segments_error_str; |
|
0 commit comments