da_ao_stats_pseudo.inc

References to this file elsewhere.
1 subroutine da_ao_stats_pseudo  (stats_unit, oi, re)
2 
3    !-----------------------------------------------------------------------
4    ! Purpose: TBD
5    !-----------------------------------------------------------------------
6 
7    implicit none
8 
9    integer,        intent (in)      :: stats_unit    ! Output unit for stats.
10    type (ob_type), intent (in)      :: oi            ! O-B
11    type  (y_type), intent (in)      :: re            ! O-A
12 
13    type (stats_pseudo_type)         :: pseudo
14    integer                          :: nu, nv, nt, np, nq
15    integer                          :: n
16    real                             :: o_minus_b, o_minus_a, sigma_o, sigma_b
17 
18    nu = 0
19    nv = 0
20    nt = 0
21    np = 0
22    nq = 0
23    
24    pseudo%maximum%u = maxmin_type (missing_r, 0, 0)
25    pseudo%maximum%v = maxmin_type (missing_r, 0, 0)
26    pseudo%maximum%t = maxmin_type (missing_r, 0, 0)
27    pseudo%maximum%p = maxmin_type (missing_r, 0, 0)
28    pseudo%maximum%q = maxmin_type (missing_r, 0, 0)
29    pseudo%minimum%u = maxmin_type(-missing_r, 0, 0)
30    pseudo%minimum%v = maxmin_type(-missing_r, 0, 0)
31    pseudo%minimum%t = maxmin_type(-missing_r, 0, 0)
32    pseudo%minimum%p = maxmin_type(-missing_r, 0, 0)
33    pseudo%minimum%q = maxmin_type(-missing_r, 0, 0)
34    pseudo%average = residual_pseudo1_type(0.0, 0.0, 0.0, 0.0, 0.0)
35    pseudo%rms_err = pseudo%average
36 
37    if (oi%num_pseudo > 0) then
38       do n=1, oi%num_pseudo
39          if (oi%pseudo(n)%loc%proc_domain) then
40 
41             call da_stats_calculate (n, 0, oi%pseudo(n)%u%qc, & 
42                                re%pseudo(n)%u, nu, & 
43                                pseudo%minimum%u, pseudo%maximum%u, &
44                                pseudo%average%u, pseudo%rms_err%u)
45             call da_stats_calculate (n, 0, oi%pseudo(n)%v%qc, & 
46                                re%pseudo(n)%v, nv, & 
47                                pseudo%minimum%v, pseudo%maximum%v, &
48                                pseudo%average%v, pseudo%rms_err%v)
49             call da_stats_calculate (n, 0, oi%pseudo(n)%t%qc, & 
50                                re%pseudo(n)%t, nt, & 
51                                pseudo%minimum%t, pseudo%maximum%t, &
52                                pseudo%average%t, pseudo%rms_err%t)
53             call da_stats_calculate (n, 0, oi%pseudo(n)%p%qc, & 
54                                re%pseudo(n)%p, np, & 
55                                pseudo%minimum%p, pseudo%maximum%p, &
56                                pseudo%average%p, pseudo%rms_err%p)
57             call da_stats_calculate (n, 0, oi%pseudo(n)%q%qc, & 
58                                re%pseudo(n)%q, nq, & 
59                                pseudo%minimum%q, pseudo%maximum%q, &
60                                pseudo%average%q, pseudo%rms_err%q)
61 
62             if (nu > 0) then
63                o_minus_b = oi%pseudo(n)%u%inv
64                o_minus_a = re%pseudo(n)%u
65                sigma_o   = oi%pseudo(n)%u%error
66             else if (nv > 0) then
67                o_minus_b = oi%pseudo(n)%v%inv
68                o_minus_a = re%pseudo(n)%v
69                sigma_o   = oi%pseudo(n)%v%error
70             else if (nt > 0) then
71                o_minus_b = oi%pseudo(n)%t%inv
72                o_minus_a = re%pseudo(n)%t
73                sigma_o   = oi%pseudo(n)%t%error
74             else if (np > 0) then
75                o_minus_b = oi%pseudo(n)%p%inv
76                o_minus_a = re%pseudo(n)%p
77                sigma_o   = oi%pseudo(n)%p%error
78             else if (nq > 0) then
79                o_minus_b = oi%pseudo(n)%q%inv
80                o_minus_a = re%pseudo(n)%q
81                sigma_o   = oi%pseudo(n)%q%error
82             end if
83 
84             write(stats_unit,'(/A,A1,A,e15.5)')' Pseudo ', pseudo_var, ' O-B: ', o_minus_b
85             write(stats_unit,' (A,A1,A,e15.5)')' Pseudo ', pseudo_var, ' O-A: ', o_minus_a
86             write(stats_unit,' (A,A1,A,e15.5)')' Pseudo ', pseudo_var, ' sigma_o: ', sigma_o
87 
88             !        Calculate equivalent sigma_b using O-A=(O-B)*sigma_o/(sigma_o+sigma_b)
89             sigma_b = sqrt ((o_minus_b - o_minus_a) / o_minus_a) * sigma_o
90             write(stats_unit,'(A,A1,A,e15.5)')' Pseudo ', pseudo_var, ' sigma_b: ', sigma_b
91          end if    ! end if (oi%pseudo(n)%loc%proc_domain)
92       end do     
93    end if
94 
95    ! Do inter-processor communication to gather statistics.
96    call da_proc_sum_int (nu)
97    call da_proc_sum_int (nv)
98    call da_proc_sum_int (nt)
99    call da_proc_sum_int (np)
100    call da_proc_sum_int (nq)
101    
102    call da_proc_stats_combine(Pseudo%average%u, Pseudo%rms_err%u, &
103                            Pseudo%minimum%u%value, Pseudo%maximum%u%value, &
104                            Pseudo%minimum%u%n, Pseudo%maximum%u%n, &
105                            Pseudo%minimum%u%l, Pseudo%maximum%u%l)
106    call da_proc_stats_combine(Pseudo%average%v, Pseudo%rms_err%v, &
107                            Pseudo%minimum%v%value, Pseudo%maximum%v%value, &
108                            Pseudo%minimum%v%n, Pseudo%maximum%v%n, &
109                            Pseudo%minimum%v%l, Pseudo%maximum%v%l)
110    call da_proc_stats_combine(Pseudo%average%t, Pseudo%rms_err%t, &
111                            Pseudo%minimum%t%value, Pseudo%maximum%t%value, &
112                            Pseudo%minimum%t%n, Pseudo%maximum%t%n, &
113                            Pseudo%minimum%t%l, Pseudo%maximum%t%l)
114    call da_proc_stats_combine(Pseudo%average%p, Pseudo%rms_err%p, &
115                            Pseudo%minimum%p%value, Pseudo%maximum%p%value, &
116                            Pseudo%minimum%p%n, Pseudo%maximum%p%n, &
117                            Pseudo%minimum%p%l, Pseudo%maximum%p%l)
118    call da_proc_stats_combine(Pseudo%average%q, Pseudo%rms_err%q, &
119                            Pseudo%minimum%q%value, Pseudo%maximum%q%value, &
120                            Pseudo%minimum%q%n, Pseudo%maximum%q%n, &
121                            Pseudo%minimum%q%l, Pseudo%maximum%q%l)
122    
123    if (rootproc) then 
124       if (nu /= 0 .or. nv /= 0 .OR. nt /= 0 .or. np /= 0 .OR. nq /= 0) then
125          write(unit=stats_unit, fmt='(/a/)') ' O-A Diagnostics for pseudo'
126          call da_print_stats_pseudo (stats_unit, nu, nv, nt, np, nq, pseudo)
127       end if
128    end if
129 
130 end subroutine da_ao_stats_pseudo
131 
132