da_setup_flow_predictors.inc

References to this file elsewhere.
1 subroutine da_setup_flow_predictors(ix, jy, kz, ne, ep)
2 
3    !------------------------------------------------------------------------------
4    ! Purpose: Setup structures for flow-dependent information and read it in.
5    !------------------------------------------------------------------------------
6 
7    implicit none
8 
9    integer, intent(in)         :: ix, jy, kz            ! EP grid dimensions.
10    integer, intent(in)         :: ne                    ! Ensemble size.
11    type (ep_type), intent(inout):: ep                   ! Flow-dependent info.
12 
13    character*10                :: ce                    ! Member index -> character.
14    character(len=filename_len) :: filename              ! Input filename.
15    character*10                :: var(1:5)              ! Variable name.
16    integer                     :: ni, nj, nk            ! Grid dimensions.
17    integer                     :: e                     ! Loop counter
18    logical                     :: ldum1, ldum2,nkdum    ! Dummy.
19    real                        :: temp3d(1:ix,1:jy,1:kz)! Temporary, real*4 array.
20    real                        :: temp2d(1:ix,1:jy)     ! Temporary, real*4 array.
21 
22    real                        :: ens_scaling_inv       ! Ensemble scaling of perturbations.
23 
24    integer                     :: ep_unit
25 
26    if (trace_use) call da_trace_entry("da_setup_flow_predictors")
27 
28    call da_get_unit(ep_unit)
29 
30    call da_message(&
31       (/"Setup structures for flow-dependent information and read in"/))
32 
33    ep % ne = ne
34 
35    ens_scaling_inv = 1.0
36    if (ne > 1) ens_scaling_inv = 1.0 / sqrt(real(ne-1))
37 
38    ! Decide which space we are introducing flow-dependence:
39    if (alphacv_method == alphacv_method_xa) then    ! xa space
40       var(1) = 'u'
41       var(2) = 'v'
42       var(3) = 't'
43       var(4) = 'q'
44       var(5) = 'ps'
45    else                               ! vp space (default)
46       var(1) = 'psi'
47       var(2) = 'chi_u'
48       var(3) = 't_u'
49       var(4) = 'rh'
50       var(5) = 'ps_u'
51    end if
52 
53    !---------------------------------------------------------------------------
54    ! Input ensemble perturbations
55    !---------------------------------------------------------------------------
56 
57    do e = 1, ne
58 
59       write(unit=ce,fmt='(i3.3)')e
60 
61       ! v1:
62       filename = 'ep/'//trim(var(1))//'/'//trim(var(1))//'.e'//trim(ce)
63       open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old')
64       read(unit=ep_unit) ni, nj, nk
65 
66       if (ni /= ix .or. nj /= jy .or. nk /= kz) then
67          write(unit=message(1),fmt='(a)') &
68             'Inconsistent grid dimensions'
69          write(unit=message(2),fmt='(a,3i6)') &
70             ' Grid dims for analysis grid: ', ix, jy
71          write(unit=message(3),fmt='(a,3i6)') &
72             ' Grid dims for flow predictors: ', ni, nj
73          call da_warning(__FILE__,__LINE__,message(1:3))
74       end if
75 
76       read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz)
77       close(unit=ep_unit)
78       ep % v1(1:ix,1:jy,1:kz,e) = ens_scaling_inv * temp3d(1:ix,1:jy,1:kz)
79 
80       ! v2:
81       filename = 'ep/'//trim(var(2))//'/'//trim(var(2))//'.e'//trim(ce)
82       open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old')
83       read(unit=ep_unit) ni, nj, nk
84       read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz)
85       ep % v2(1:ix,1:jy,1:kz,e) = ens_scaling_inv * temp3d(1:ix,1:jy,1:kz)
86       close(unit=ep_unit)
87 
88       ! v3:
89       filename = 'ep/'//trim(var(3))//'/'//trim(var(3))//'.e'//trim(ce)
90       open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old')
91       read(unit=ep_unit) ni, nj, nk
92       read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz)
93       ep % v3(1:ix,1:jy,1:kz,e) = ens_scaling_inv * temp3d(1:ix,1:jy,1:kz)
94       close(unit=ep_unit)
95 
96       ! v4:
97       filename = 'ep/'//trim(var(4))//'/'//trim(var(4))//'.e'//trim(ce)
98       open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old')
99       read(unit=ep_unit) ni, nj, nk
100       read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz)
101       ep % v4(1:ix,1:jy,1:kz,e) = ens_scaling_inv * temp3d(1:ix,1:jy,1:kz)
102       close(unit=ep_unit)
103 
104       ! v5:
105       filename = 'ep/'//trim(var(5))//'/'//trim(var(5))//'.e'//trim(ce)
106       open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old')
107       read(unit=ep_unit) ni, nj, nkdum
108       read(unit=ep_unit) ldum1, ldum2
109       read(unit=ep_unit) temp2d(1:ix,1:jy)
110       ep % v5(1:ix,1:jy,1,e) = ens_scaling_inv * temp2d(1:ix,1:jy)
111       close(unit=ep_unit)
112 
113    end do 
114 
115    call da_free_unit(ep_unit)
116 
117    if (trace_use) call da_trace_exit("da_setup_flow_predictors")
118 
119 end subroutine da_setup_flow_predictors
120 
121