95 MODULE PROCEDURE mad_sp, mad_dp, mad_val_dp, mad_val_sp
106 FUNCTION mad_dp(arr, z, mask, deriv)
110 REAL(dp),
DIMENSION(:),
INTENT(IN) :: arr
111 REAL(dp),
OPTIONAL,
INTENT(IN) :: z
112 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
113 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: deriv
114 LOGICAL,
DIMENSION(size(arr)) :: mad_dp
116 LOGICAL,
DIMENSION(size(arr)) :: maske
117 REAL(dp),
DIMENSION(size(arr)) :: d
118 LOGICAL,
DIMENSION(size(arr)) :: dmask
119 INTEGER(i4) :: n, ideriv
121 REAL(dp) :: iz, med, mabsdev, thresh
125 if (
present(mask))
then
126 if (
size(mask) /= n) stop
'Error mad_dp: size(mask) /= size(arr)'
134 if (
present(deriv))
then
143 med =
median(arr,mask=maske)
144 mabsdev =
median(abs(arr-med),mask=maske)
145 thresh = mabsdev * iz/0.6745_dp
146 mad_dp = (arr .ge. (med-thresh)) .and. (arr .le. (med+thresh)) .and. maske
149 d(1:n-1) = arr(2:n) - arr(1:n-1)
150 dmask(1:n-1) = maske(2:n) .and. maske(1:n-1)
152 med =
median(d(1:n-1),mask=dmask(1:n-1))
153 mabsdev =
median(abs(d(1:n-1)-med),mask=dmask(1:n-1))
154 thresh = mabsdev * iz/0.6745_dp
156 mad_dp(1:n-1) = (d(1:n-1) .ge. (med-thresh)) .and. (d(1:n-1) .le. (med+thresh)) .and. dmask(1:n-1)
158 d(1:n-2) = arr(2:n-1) + arr(2:n-1) - arr(1:n-2) - arr(3:n)
159 dmask(1:n-2) = maske(2:n-1) .and. maske(1:n-2) .and. maske(3:n)
161 med =
median(d(1:n-2),mask=dmask(1:n-2))
162 mabsdev =
median(abs(d(1:n-2)-med),mask=dmask(1:n-2))
163 thresh = mabsdev * iz/0.6745_dp
166 mad_dp(2:n-1) = (d(1:n-2) .ge. (med-thresh)) .and. (d(1:n-2) .le. (med+thresh)) .and. dmask(1:n-2)
168 stop
'Unimplemented option in mad_dp'
174 FUNCTION mad_sp(arr, z, mask, deriv)
178 REAL(sp),
DIMENSION(:),
INTENT(IN) :: arr
179 REAL(sp),
OPTIONAL,
INTENT(IN) :: z
180 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
181 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: deriv
182 LOGICAL,
DIMENSION(size(arr)) :: mad_sp
184 LOGICAL,
DIMENSION(size(arr)) :: maske
185 REAL(sp),
DIMENSION(size(arr)) :: d
186 LOGICAL,
DIMENSION(size(arr)) :: dmask
187 INTEGER(i4) :: n, ideriv
189 REAL(sp) :: iz, med, mabsdev, thresh
193 if (
present(mask))
then
194 if (
size(mask) /= n) stop
'Error mad_sp: size(mask) /= size(arr)'
202 if (
present(deriv))
then
211 med =
median(arr,mask=maske)
212 mabsdev =
median(abs(arr-med),mask=maske)
213 thresh = mabsdev * iz/0.6745_sp
214 mad_sp = (arr .ge. (med-thresh)) .and. (arr .le. (med+thresh)) .and. maske
217 d(1:n-1) = arr(2:n) - arr(1:n-1)
218 dmask(1:n-1) = maske(2:n) .and. maske(1:n-1)
220 med =
median(d(1:n-1),mask=dmask(1:n-1))
221 mabsdev =
median(abs(d(1:n-1)-med),mask=dmask(1:n-1))
222 thresh = mabsdev * iz/0.6745_sp
224 mad_sp(1:n-1) = (d(1:n-1) .ge. (med-thresh)) .and. (d(1:n-1) .le. (med+thresh)) .and. dmask(1:n-1)
226 d(1:n-2) = arr(2:n-1) + arr(2:n-1) - arr(1:n-2) - arr(3:n)
227 dmask(1:n-2) = maske(2:n-1) .and. maske(1:n-2) .and. maske(3:n)
229 med =
median(d(1:n-2),mask=dmask(1:n-2))
230 mabsdev =
median(abs(d(1:n-2)-med),mask=dmask(1:n-2))
231 thresh = mabsdev * iz/0.6745_sp
234 mad_sp(2:n-1) = (d(1:n-2) .ge. (med-thresh)) .and. (d(1:n-2) .le. (med+thresh)) .and. dmask(1:n-2)
236 stop
'Unimplemented option in mad_sp'
243 FUNCTION mad_val_dp(arr, z, mask, tout, mval)
247 REAL(dp),
DIMENSION(:),
INTENT(IN) :: arr
248 REAL(dp),
OPTIONAL,
INTENT(IN) :: z, mval
249 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
250 REAL(dp),
DIMENSION(size(arr)) :: mad_val_dp
254 LOGICAL,
DIMENSION(size(arr)) :: maske
256 REAL(dp) :: iz, med, mabsdev, thresh
260 if (
present(mask))
then
261 if (
size(mask) /= n) stop
'Error mad_val_dp: size(mask) /= size(arr)'
270 if (
present(mval))
then
271 where (abs(arr - mval) .lt. tiny(1._dp) ) maske = .false.
273 if (.not. any(maske))
then
274 where ( abs(arr - mval) .lt. tiny(1._dp) ) maske = .true.
278 med =
median(arr,mask=maske)
279 mabsdev =
median(abs(arr-med),mask=maske)
280 thresh = mabsdev * iz/0.6745_dp
286 where ((mad_val_dp .gt. (med+thresh)) &
287 .and. maske) mad_val_dp = med+thresh
290 where ((mad_val_dp .lt. (med-thresh)) &
291 .and. maske) mad_val_dp = med-thresh
294 where ((mad_val_dp .gt. (med+thresh)) &
295 .and. maske) mad_val_dp = med+thresh
296 where ((mad_val_dp .lt. (med-thresh)) &
297 .and. maske) mad_val_dp = med-thresh
299 stop
'Unimplemented option in mad_val_dp'
302 END FUNCTION mad_val_dp
306 FUNCTION mad_val_sp(arr, z, mask, tout, mval)
310 REAL(sp),
DIMENSION(:),
INTENT(IN) :: arr
311 REAL(sp),
OPTIONAL,
INTENT(IN) :: z, mval
312 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
313 REAL(sp),
DIMENSION(size(arr)) :: mad_val_sp
317 LOGICAL,
DIMENSION(size(arr)) :: maske
319 REAL(sp) :: iz, med, mabsdev, thresh
323 if (
present(mask))
then
324 if (
size(mask) /= n) stop
'Error mad_val_sp: size(mask) /= size(arr)'
333 if (
present(mval))
then
334 where (abs(arr - mval) .lt. tiny(1._sp)) maske = .false.
336 if (.not. any(maske))
then
337 where ( abs(arr - mval) .lt. tiny(1._dp) ) maske = .true.
341 med =
median(arr,mask=maske)
342 mabsdev =
median(abs(arr-med),mask=maske)
343 thresh = mabsdev * iz/0.6745_sp
347 print *,
"The threshold is set to", med,
"+", thresh
348 where ((mad_val_sp .gt. (med+thresh)) &
349 .and. maske) mad_val_sp = med+thresh
351 print *,
"The threshold is set to", med,
"-", thresh
352 where ((mad_val_sp .lt. (med-thresh)) &
353 .and. maske) mad_val_sp = med-thresh
355 print *,
"The threshold is set to", med,
"+/-", thresh
356 where ((mad_val_sp .gt. (med+thresh)) &
357 .and. maske) mad_val_sp = med+thresh
358 where ((mad_val_sp .lt. (med-thresh)) &
359 .and. maske) mad_val_sp = med-thresh
361 stop
'Unimplemented option in mad_val_sp'
364 END FUNCTION mad_val_sp
Mean absolute deviation test.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
Median absolute deviation test.