da_data_distribution.inc
References to this file elsewhere.
1 subroutine da_data_distribution(ob_name, num_obs, min_val, max_val, &
2 bin_width, ob)
3
4 !---------------------------------------------------------------------------
5 ! Purpose: Bin ob data to get distribution.
6 !---------------------------------------------------------------------------
7
8 implicit none
9
10 character (len=*), intent(in) :: ob_name ! Data description.
11 integer, intent(in) :: num_obs ! Number of obs.
12 real, intent(in) :: min_val ! Minimum bin value.
13 real, intent(in) :: max_val ! Maximum bin value.
14 real, intent(in) :: bin_width ! Bin width.
15 real, intent(in) :: ob(:) ! Ob data.
16
17 integer :: num_bins ! Number of bins
18 integer :: bin ! Bin counter.
19 integer :: n ! Data counter.
20 integer :: num_missing ! Number of missing data.
21
22 real, allocatable :: bin_val(:) ! Central value of bin.
23 real, allocatable :: bin_min(:) ! Minimum value of bin.
24 integer, allocatable :: num_in_bin(:) ! Number of values in bin.
25
26 !---------------------------------------------------------------------------
27 ! [1.0] Initialise bins:
28 !---------------------------------------------------------------------------
29
30 num_bins = inT((max_val - min_val) / bin_width) + 1
31
32 allocate(bin_val(1:num_bins))
33 bin_val(1) = min_val
34 do bin = 2, num_bins
35 bin_val(bin) = bin_val(bin-1) + bin_width
36 end do
37
38 allocate(bin_min(1:num_bins+1))
39 bin_min(1:num_bins) = bin_val(1:num_bins) - 0.5 * bin_width
40 bin_min(num_bins+1) = bin_val(num_bins) + 0.5 * bin_width
41
42 allocate(num_in_bin(0:num_bins+1))
43 num_in_bin(0:num_bins+1) = 0
44 num_missing = 0
45
46 !---------------------------------------------------------------------------
47 ! [2.0] Assign data to bins:
48 !---------------------------------------------------------------------------
49
50 do n = 1, num_obs
51 if (ob(n) == missing_r) then
52 num_missing = num_missing + 1
53 else if (ob(n) < bin_min(1) .AND. ob(n) /= missing_r) then
54 num_in_bin(0) = num_in_bin(0) + 1
55 else if (ob(n) >= bin_min(num_bins+1)) then
56 num_in_bin(num_bins+1) = num_in_bin(num_bins+1) + 1
57 else
58 do bin = 1, num_bins
59 if (ob(n) >= bin_min(bin) .AND. ob(n) < bin_min(bin+1)) then
60 num_in_bin(bin) = num_in_bin(bin) + 1
61 exit
62 end if
63 end do
64 end if
65 end do
66
67 !---------------------------------------------------------------------------
68 ! [3.0] Output statistics:
69 !---------------------------------------------------------------------------
70
71 write(unit=stdout,fmt='(A,A,A,I8)')' Number of ', trim(ob_name), &
72 ' obs = ', num_obs
73 write(unit=stdout,fmt='(A,I8)')' Number with missing data indicator = ', &
74 num_missing
75 write(unit=stdout,fmt='(A,f12.5,A,I8)')' Number below minimum O-B(', &
76 min_val-0.5*bin_width, ') = ', num_in_bin(0)
77 do bin = 1, num_bins
78 write(unit=stdout,fmt='(I4,f12.5,I8)')bin, bin_val(bin), num_in_bin(bin)
79 end do
80 write(unit=stdout,fmt='(A,f12.5,A,I8)')' Number above maximum O-B(', &
81 max_val+0.5*bin_width, ') = ', num_in_bin(num_bins+1)
82
83 !---------------------------------------------------------------------------
84 ! [4.0] Tidy up:
85 !---------------------------------------------------------------------------
86
87 deallocate(bin_val)
88 deallocate(bin_min)
89 deallocate(num_in_bin)
90
91 end subroutine da_data_distribution
92
93