da_correlation_coeff1d.inc

References to this file elsewhere.
1 subroutine da_correlation_coeff1d(field1, field2, corr_coeff, &
2                                    rel_acc)
3    
4    !---- -------------------------------------------------------------------------
5    ! Purpose: Calculate correlation coefficient between two fields.  
6    !------------------------------------------------------------------------------
7    
8    implicit none
9    
10    real, intent(in)           :: field1(:)       ! input field 1.
11    real, intent(in)           :: field2(:)       ! input field 2.
12    real, intent(out)          :: corr_coeff      ! correlation coefficient
13    real, intent(out)          :: rel_acc       ! relative error.
14    
15    integer                    :: jx              ! 2nd dimension of field.
16    real                       :: j_inv           ! 1/(jx)
17    real                       :: coeff0          ! coefficient.
18    real                       :: coeff1          ! coefficient.
19    real                       :: coeff2          ! coefficient.
20    real                       :: coeff3          ! coefficient.
21    real                       :: field_mean      ! mean of field.
22    real, allocatable          :: data1(:)
23    real, allocatable          :: data2(:)
24    
25    ! [1.0] Set up scalars:
26    
27    jx = size(field1(:))
28    
29    j_inv = 1.0 / real(jx)
30    
31    ! [2.0] Calculate mean and remove from field:
32    
33    field_mean = sum(field1(:)) * j_inv
34    allocate(data1(1:jx))
35    data1(:) = field1(:) - field_mean
36    
37    field_mean = sum(field2(:)) * j_inv
38    allocate(data2(1:jx))
39    data2(:) = field2(:) - field_mean
40    
41    ! [3.0] Calculate correlation coefficient:
42    
43    coeff0 = sum(data1(:) * data2(:))
44    coeff1 = sum(data1(:) * data1(:))
45    coeff2 = sum(data2(:) * data2(:))
46    
47    if (coeff1 /= 0.0 .and. coeff2 /= 0.0) then
48       corr_coeff = coeff0 /  sqrt(coeff1 * coeff2)
49    else
50       corr_coeff = 0.0
51    end if
52    
53    ! [4.0] Calculate accuracy:
54    
55    coeff3 = sum((data2(:) - data1(:))**2)
56    if (coeff2 /= 0.0) then
57       rel_acc = 1.0 - min(coeff3/coeff2,1.0)
58    else
59       rel_acc = 0.0
60    end if
61    
62    deallocate(data1)
63    deallocate(data2)
64    
65 end subroutine da_correlation_coeff1d
66 
67