31 real(dp),
allocatable :: temp_d7(:)
32 logical,
allocatable :: temp_qmin_mask(:), temp_mask(:)
42 real(dp),
intent(in) :: discharge(:)
44 logical,
intent(in),
optional :: mask(:)
46 real(dp),
allocatable :: baseflow(:)
61 real(dp),
intent(in) :: discharge(:)
63 logical,
intent(in),
optional :: mask(:)
65 real(dp) :: alpha_out(1)
66 real(dp),
allocatable :: q_min(:), dummy(:)
67 logical,
dimension(size(discharge)) :: mask_
71 if (
present(mask) ) mask_ = mask
75 do i = 1,
size(temp_d7), 365
76 j = min(i+364,
size(temp_d7))
79 if ( any(mask_(i : j)) )
call append(q_min, minval(temp_d7(i : j), mask=mask_(i : j)))
81 if (
size(q_min) < 2 )
call error_message(
"Eckhardt filter: Less than 2 years of discharge observations! (min. 10 recommended)")
83 allocate(temp_qmin_mask(
size(discharge)))
84 allocate(temp_mask(
size(discharge)))
86 temp_qmin_mask = (temp_d7 <
percentile(q_min, 10.0_dp, mode_in=4))
87 temp_qmin_mask = temp_qmin_mask .and. temp_mask
90 allocate(dummy(count(.not.mask_)))
102 prange=reshape([0._dp, 1._dp], [1, 2]) &
106 deallocate(temp_qmin_mask)
107 deallocate(temp_mask)
118 real(dp),
intent(in) :: alpha
120 real(dp),
intent(in) :: discharge(:)
122 logical,
intent(in),
optional :: mask(:)
124 real(dp),
allocatable :: baseflow(:)
126 real(dp),
allocatable :: d7(:), d7_perc(:), d_temp(:), b_temp(:)
127 logical,
dimension(size(discharge)) :: mask_
132 if (
present(mask) ) mask_ = mask
134 allocate(baseflow(
size(discharge)))
135 allocate(d7_perc(
size(discharge)))
139 d7_perc(:) = percentile(d7, 20.0_dp, mask=mask, mode_in=4)
140 bfi_max =
bfi(d7_perc, discharge, mask=mask)
142 allocate(b_temp(count(mask_)))
143 allocate(d_temp(count(mask_)))
144 d_temp = pack(discharge, mask=mask_)
147 b_temp(1) = ((1 - alpha)*bfi_max * d_temp(1)) / (1 - alpha*bfi_max)
148 do i = 2,
size(d_temp)
149 b_temp(i) = ((1 - bfi_max)*alpha*b_temp(i-1) + (1 - alpha)*bfi_max*d_temp(i)) / (1 - alpha*bfi_max)
152 baseflow = unpack(vector=b_temp, mask=mask_, field=baseflow)
161 real(dp),
intent(in) :: discharge(:)
163 logical,
intent(in),
optional :: mask(:)
165 real(dp),
allocatable :: d7(:)
167 logical,
dimension(size(discharge)) :: mask_
168 integer(i4) :: i, n, m
171 if (
present(mask) ) mask_ = mask
173 allocate(d7(
size(discharge)))
176 do i = 1,
size(discharge)
178 m = min(
size(discharge),i+3)
180 if ( any(mask_(n : m)) ) d7(i) = mean(discharge(n : m), mask=mask_(n : m))
187 real(dp) function
bfi(baseflow, discharge, mask)
190 real(dp),
intent(in) :: baseflow(:)
192 real(dp),
intent(in) :: discharge(:)
194 logical,
intent(in),
optional :: mask(:)
196 logical,
dimension(size(discharge)) :: mask_
199 if (
present(mask) ) mask_ = mask
201 bfi = sum(baseflow, mask=mask_) / sum(discharge, mask=mask_)
209 real(dp),
dimension(:),
intent(in) :: pp
213 real(dp),
allocatable :: baseflow(:)
215 baseflow =
eckhardt_filter(alpha=pp(1), discharge=temp_d7, mask=temp_mask)
216 func = mean((baseflow/temp_d7 - 1)**2, mask=temp_qmin_mask)
Append (rows) scalars, vectors, and matrixes onto existing array.
Minimizes a user-specified function using the Nelder-Mead algorithm.
Append values on existing arrays.
Eckhardt filter for baseflow index calculation.
real(dp) function, dimension(:), allocatable, public eckhardt_filter_fit(discharge, mask)
Eckhardt filter for baseflow calculation from discharge time series with fitting.
real(dp) function, public fit_alpha(discharge, mask)
Fitted alpha parameter for the Eckhardt filter.
real(dp) function, dimension(:), allocatable, public weekly_average(discharge, mask)
This function returns the 7days-averaged discharge.
real(dp) function, public bfi(baseflow, discharge, mask)
Calculate the baseflow index as ratio between baseflow and discharge.
real(dp) function func(pp)
Target function for fitting Eckhardt filter.
real(dp) function, dimension(:), allocatable, public eckhardt_filter(alpha, discharge, mask)
Eckhardt filter for baseflow calculation from discharge time series.
Define number representations.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
Write out concatenated strings.
subroutine, public error_message(t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, uni, advance, show, raise, reset_format)
Write out an error message to stderr and call stop 1.