<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
<A NAME='DA_DATA_DISTRIBUTION'><A href='../../html_code/statistics/da_data_distribution.inc.html#DA_DATA_DISTRIBUTION' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>

subroutine da_data_distribution(ob_name, num_obs, min_val, max_val, bin_width, ob),2
   
   !---------------------------------------------------------------------------
   ! Purpose: Bin ob data to get distribution.
   !---------------------------------------------------------------------------

   implicit none
   
   character (len=*), intent(in) :: ob_name       ! Data description.
   integer,           intent(in) :: num_obs       ! Number of obs.
   real,              intent(in) :: min_val       ! Minimum bin value.
   real,              intent(in) :: max_val       ! Maximum bin value.
   real,              intent(in) :: bin_width     ! Bin width.
   real,              intent(in) :: ob(:)         ! Ob data.
   
   integer              :: num_bins      ! Number of bins
   integer              :: bin           ! Bin counter.
   integer              :: n             ! Data counter.
   integer              :: num_missing   ! Number of missing data.
   
   real, allocatable    :: bin_val(:)    ! Central value of bin.
   real, allocatable    :: bin_min(:)    ! Minimum value of bin.
   integer, allocatable :: num_in_bin(:) ! Number of values in bin. 

   if (trace_use) call da_trace_entry("da_data_distribution")      
   
   !---------------------------------------------------------------------------
   ! [1.0] Initialise bins:
   !---------------------------------------------------------------------------

   num_bins = int((max_val - min_val) / bin_width) + 1

   allocate(bin_val(1:num_bins))
   bin_val(1) = min_val
   do bin = 2, num_bins
      bin_val(bin) = bin_val(bin-1) + bin_width
   end do
   
   allocate(bin_min(1:num_bins+1))
   bin_min(1:num_bins) = bin_val(1:num_bins) - 0.5 * bin_width
   bin_min(num_bins+1) = bin_val(num_bins) + 0.5 * bin_width

   allocate(num_in_bin(0:num_bins+1))
   num_in_bin(0:num_bins+1) = 0
   num_missing = 0
   
   !---------------------------------------------------------------------------
   ! [2.0] Assign data to bins:
   !---------------------------------------------------------------------------
   
   do n = 1, num_obs
      if (ob(n) == missing_r) then
         num_missing = num_missing + 1
      else if (ob(n) &lt; bin_min(1) .AND. ob(n) /= missing_r) then
         num_in_bin(0) = num_in_bin(0) + 1
      else if (ob(n) &gt;= bin_min(num_bins+1)) then
         num_in_bin(num_bins+1) = num_in_bin(num_bins+1) + 1
      else
         do bin = 1, num_bins
            if (ob(n) &gt;= bin_min(bin) .AND. ob(n) &lt; bin_min(bin+1)) then
                 num_in_bin(bin) = num_in_bin(bin) + 1
               exit
            end if
         end do
      end if
   end do

   !---------------------------------------------------------------------------
   ! [3.0] Output statistics:
   !---------------------------------------------------------------------------
   
   write(unit=stdout,fmt='(A,A,A,I8)')' Number of ', trim(ob_name), &amp;
      ' obs = ', num_obs
   write(unit=stdout,fmt='(A,I8)')' Number with missing data indicator = ', &amp;
      num_missing
   write(unit=stdout,fmt='(A,f12.5,A,I8)')' Number below minimum O-B(', &amp;
      min_val-0.5*bin_width, ') = ', num_in_bin(0)
   do bin = 1, num_bins
      write(unit=stdout,fmt='(I4,f12.5,I8)')bin, bin_val(bin), num_in_bin(bin)
   end do
   write(unit=stdout,fmt='(A,f12.5,A,I8)')' Number above maximum O-B(', &amp;
      max_val+0.5*bin_width, ') = ', num_in_bin(num_bins+1)
                               
   !---------------------------------------------------------------------------
   ! [4.0] Tidy up:
   !---------------------------------------------------------------------------

   deallocate(bin_val)
   deallocate(bin_min)
   deallocate(num_in_bin)

   if (trace_use) call da_trace_exit("da_data_distribution")      

end subroutine da_data_distribution