12 use fckit_configuration_module,
only: fckit_configuration
31 character(len=10) :: filetype
52 type(fckit_configuration),
intent(in) :: conf
54 character(len=:),
allocatable :: str
57 call conf%get_or_die(
"filetype", str)
61 if (trim(self%filetype) ==
'gfs')
then
62 call self%gfs%setup_conf(conf)
63 elseif (trim(self%filetype) ==
'geos')
then
64 call self%geos%setup_conf(geom, conf)
66 call abor1_ftn(
"fv3jedi_varcha_a2m_mod: filetype must be geos or gfs")
78 if (trim(self%filetype) ==
'geos')
call self%geos%delete()
91 type(datetime),
intent(inout) :: vdt
93 integer :: index_ana, index_mod, index_ana_found
97 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_ua
98 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_va
99 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_ps
101 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_ud
102 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_vd
103 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_delp
105 do index_mod = 1, xmod%nf
111 do index_ana = 1, xana%nf
112 if (xmod%fields(index_mod)%fv3jedi_name == xana%fields(index_ana)%fv3jedi_name)
then
113 index_ana_found = index_ana
118 if (index_ana_found >= 0)
then
121 xmod%fields(index_mod)%array = xana%fields(index_ana_found)%array
123 if (xmod%f_comm%rank() == 0)
write(*,
"(A, A10, A, A10)") &
124 "A2M ChangeVar: analysis state "//xana%fields(index_ana_found)%fv3jedi_name(1:10)&
125 //
" => model state "//xmod%fields(index_mod)%fv3jedi_name(1:10)
127 elseif (xmod%fields(index_mod)%fv3jedi_name ==
'ud')
then
130 if (xana%has_field(
'ua'))
then
131 call xana%get_field(
'ua', xana_ua)
132 call xana%get_field(
'va', xana_va)
133 call xmod%get_field(
'ud', xmod_ud)
134 call xmod%get_field(
'vd', xmod_vd)
135 call a2d(geom, xana_ua, xana_va, xmod_ud, xmod_vd)
136 xmod_ud(:,geom%jec+1,:) = 0.0_kind_real
137 xmod_vd(geom%iec+1,:,:) = 0.0_kind_real
139 if (xmod%f_comm%rank() == 0)
write(*,
"(A)") &
140 "A2M ChangeVar: analysis state ua => model state ud"
143 elseif (xmod%fields(index_mod)%fv3jedi_name ==
'vd')
then
146 if (xana%has_field(
'ua'))
then
149 if (xmod%f_comm%rank() == 0)
write(*,
"(A)") &
150 "A2M ChangeVar: analysis state va => model state vd"
153 elseif (xmod%fields(index_mod)%fv3jedi_name ==
'delp')
then
156 if (xana%has_field(
'ps'))
then
157 call xana%get_field(
'ps', xana_ps)
158 call xmod%get_field(
'delp', xmod_delp)
160 xmod_delp(:,:,k) = (geom%ak(k+1)-geom%ak(k)) + (geom%bk(k+1)-geom%bk(k))*xana_ps(:,:,1)
163 if (xmod%f_comm%rank() == 0)
write(*,
"(A)") &
164 "A2M ChangeVar: analysis state ps => model state delp"
171 if (xmod%f_comm%rank() == 0)
write(*,
"(A)") &
172 "Found no way of getting "//trim(xmod%fields(index_mod)%fv3jedi_name)//
" from the analysis state."//&
173 "Attempting to read from file"
175 if (trim(self%filetype) ==
'gfs')
then
176 call self%gfs%setup_date(vdt)
177 call self%gfs%read_fields( geom, xmod%fields(index_mod:index_mod) )
178 elseif (trim(self%filetype) ==
'geos')
then
179 call self%geos%setup_date(vdt)
180 call self%geos%read_fields(geom, xmod%fields(index_mod:index_mod))
188 xmod%calendar_type = xana%calendar_type
189 xmod%date_init = xana%date_init
202 type(datetime),
intent(inout) :: vdt
204 integer :: index_ana, index_mod, index_mod_found
207 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_ua
208 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_va
209 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xana_ps
211 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_ud
212 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_vd
213 real(kind=
kind_real),
pointer,
dimension(:,:,:) :: xmod_delp
215 do index_ana = 1, xana%nf
221 do index_mod = 1, xmod%nf
222 if (xana%fields(index_ana)%fv3jedi_name == xmod%fields(index_mod)%fv3jedi_name)
then
223 index_mod_found = index_mod
228 if (index_mod_found >= 0)
then
232 xana%fields(index_ana)%array = xmod%fields(index_mod_found)%array
233 if (xana%f_comm%rank() == 0)
write(*,
"(A, A10, A, A10)") &
234 "A2M ChangeVarInverse: model state "//xmod%fields(index_mod_found)%fv3jedi_name(1:10)&
235 //
" => analysis state "//xana%fields(index_ana)%fv3jedi_name(1:10)
237 elseif (xana%fields(index_ana)%fv3jedi_name ==
'ua')
then
240 if (xmod%has_field(
'ud'))
then
241 call xana%get_field(
'ua', xana_ua)
242 call xana%get_field(
'va', xana_va)
243 call xmod%get_field(
'ud', xmod_ud)
244 call xmod%get_field(
'vd', xmod_vd)
245 xmod_ud(:,geom%jec+1,:) = 0.0_kind_real
246 xmod_vd(geom%iec+1,:,:) = 0.0_kind_real
247 call d2a(geom, xmod_ud, xmod_vd, xana_ua, xana_va)
249 if (xana%f_comm%rank() == 0)
write(*,
"(A)") &
250 "A2M ChangeVarInverse: model state ud => analysis state ua"
253 elseif (xana%fields(index_ana)%fv3jedi_name ==
'va')
then
256 if (xmod%has_field(
'ud'))
then
259 if (xana%f_comm%rank() == 0)
write(*,
"(A)") &
260 "A2M ChangeVarInverse: model state vd => analysis state va"
263 elseif (xana%fields(index_ana)%fv3jedi_name ==
'ps')
then
266 if (xmod%has_field(
'delp'))
then
267 call xana%get_field(
'ps', xana_ps)
268 call xmod%get_field(
'delp', xmod_delp)
269 xana_ps(:,:,1) = sum(xmod_delp,3)
271 if (xana%f_comm%rank() == 0)
write(*,
"(A)") &
272 "A2M ChangeVarInverse: model state delp => analysis state ps"
277 if (failed)
call abor1_ftn(
"fv3jedi_linvarcha_a2m_mod.changevarinverse: found no way of getting "//&
278 trim(xana%fields(index_ana)%fv3jedi_name)//
" from the model state" )
283 xana%calendar_type = xmod%calendar_type
284 xana%date_init = xmod%date_init