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