FV3-JEDI
fv3jedi_linvarcha_c2a_mod.f90
Go to the documentation of this file.
1 ! (C) Copyright 2018-2020 UCAR
2 !
3 ! This software is licensed under the terms of the Apache Licence Version 2.0
4 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5 
7 
8 ! fckit
9 use fckit_configuration_module, only: fckit_configuration
10 
11 ! fv3jedi
18 
22 use wind_vt_mod
23 
24 implicit none
25 private
26 
27 public :: fv3jedi_linvarcha_c2a
28 public :: create
29 public :: delete
30 public :: multiply
31 public :: multiplyadjoint
32 public :: multiplyinverse
33 public :: multiplyinverseadjoint
34 
35 !> Fortran derived type to hold configuration data for the B mat variable change
37  real(kind=kind_real), allocatable :: ttraj(:,:,:)
38  real(kind=kind_real), allocatable :: tvtraj(:,:,:)
39  real(kind=kind_real), allocatable :: qtraj(:,:,:)
40  real(kind=kind_real), allocatable :: qsattraj(:,:,:)
41 end type fv3jedi_linvarcha_c2a
42 
43 ! --------------------------------------------------------------------------------------------------
44 
45 contains
46 
47 ! --------------------------------------------------------------------------------------------------
48 
49 subroutine create(self, geom, bg, fg, conf)
50 
51 implicit none
52 type(fv3jedi_linvarcha_c2a), intent(inout) :: self
53 type(fv3jedi_geom), target, intent(in) :: geom
54 type(fv3jedi_state), target, intent(in) :: bg
55 type(fv3jedi_state), target, intent(in) :: fg
56 type(fckit_configuration), intent(in) :: conf
57 
58 real(kind=kind_real), pointer :: t(:,:,:)
59 real(kind=kind_real), pointer :: q(:,:,:)
60 real(kind=kind_real), pointer :: delp(:,:,:)
61 
62 !> Pointers to the background state
63 call bg%get_field('t' , t)
64 call bg%get_field('sphum' , q)
65 call bg%get_field('delp', delp)
66 
67 !> Virtual temperature trajectory
68 allocate(self%tvtraj (geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz))
69 call t_to_tv(geom,t,q,self%tvtraj)
70 
71 !> Temperature trajectory
72 allocate(self%ttraj (geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz))
73 self%ttraj = t
74 
75 !> Specific humidity trajecotory
76 allocate(self%qtraj (geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz))
77 self%qtraj = q
78 
79 !> Compute saturation specific humidity for q to RH transform
80 allocate(self%qsattraj(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz))
81 
82 !> Compute saturation specific humidity
83 call get_qsat(geom,delp,t,q,self%qsattraj)
84 
85 end subroutine create
86 
87 ! --------------------------------------------------------------------------------------------------
88 
89 subroutine delete(self)
90 
91 implicit none
92 type(fv3jedi_linvarcha_c2a), intent(inout) :: self
93 
94 if (allocated(self%tvtraj)) deallocate(self%tvtraj)
95 if (allocated(self%ttraj)) deallocate(self%ttraj)
96 if (allocated(self%qtraj)) deallocate(self%qtraj)
97 if (allocated(self%qsattraj)) deallocate(self%qsattraj)
98 
99 end subroutine delete
100 
101 ! --------------------------------------------------------------------------------------------------
102 
103 subroutine multiply(self, geom, dxc, dxa)
104 
105 implicit none
106 type(fv3jedi_linvarcha_c2a), intent(in) :: self
107 type(fv3jedi_geom), intent(inout) :: geom
108 type(fv3jedi_increment), intent(in) :: dxc
109 type(fv3jedi_increment), intent(inout) :: dxa
110 
111 integer :: f
112 character(len=field_clen), allocatable :: fields_to_do(:)
113 real(kind=kind_real), pointer :: field_ptr(:,:,:)
114 
115 ! Winds
116 logical :: have_uava
117 real(kind=kind_real), pointer, dimension(:,:,:) :: psip
118 real(kind=kind_real), pointer, dimension(:,:,:) :: chip
119 real(kind=kind_real), allocatable, dimension(:,:,:) :: psi
120 real(kind=kind_real), allocatable, dimension(:,:,:) :: chi
121 real(kind=kind_real), allocatable, dimension(:,:,:) :: ua
122 real(kind=kind_real), allocatable, dimension(:,:,:) :: va
123 
124 ! Specific humidity
125 logical :: have_q
126 real(kind=kind_real), pointer, dimension(:,:,:) :: rh
127 real(kind=kind_real), allocatable, dimension(:,:,:) :: q
128 
129 ! Temperature
130 logical :: have_t
131 real(kind=kind_real), pointer, dimension(:,:,:) :: tv
132 real(kind=kind_real), allocatable, dimension(:,:,:) :: t
133 
134 ! Identity part of the change of fields
135 ! -------------------------------------
136 call copy_subset(dxc%fields, dxa%fields, fields_to_do)
137 
138 ! If variable change is the identity early exit
139 ! ---------------------------------------------
140 if (.not.allocated(fields_to_do)) return
141 
142 ! Winds
143 ! -----
144 have_uava = .false.
145 if (dxc%has_field('psi') .and. dxc%has_field('chi')) then
146  call dxc%get_field('psi', psip)
147  call dxc%get_field('chi', chip)
148  allocate(psi(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
149  allocate(chi(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
150  psi = 0.0_kind_real
151  chi = 0.0_kind_real
152  psi(geom%isc:geom%iec,geom%jsc:geom%jec,:) = psip(geom%isc:geom%iec,geom%jsc:geom%jec,:)
153  chi(geom%isc:geom%iec,geom%jsc:geom%jec,:) = chip(geom%isc:geom%iec,geom%jsc:geom%jec,:)
154  allocate(ua(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
155  allocate(va(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
156  call psichi_to_uava(geom, psi, chi, ua, va)
157  have_uava = .true.
158 endif
159 
160 ! Specific humidity
161 !------------------
162 have_q = .false.
163 if (dxc%has_field('rh')) then
164  call dxc%get_field('rh', rh)
165  allocate(q(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
166  call rh_to_q_tl(geom, self%qsattraj, rh, q)
167  have_q = .true.
168 endif
169 
170 ! Temperature
171 ! -----------
172 have_t = .false.
173 if (dxc%has_field('t')) then
174  call dxc%get_field('t', t)
175  have_t = .true.
176 elseif (dxc%has_field('tv') .and. have_q) then
177  call dxc%get_field('tv', tv)
178  allocate(t(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
179  call tv_to_t_tl(geom, self%tvtraj, tv, self%qtraj, q, t)
180  have_t = .true.
181 endif
182 
183 
184 ! Loop over the fields not found in the input state and work through cases
185 ! ------------------------------------------------------------------------
186 do f = 1, size(fields_to_do)
187 
188  call dxa%get_field(trim(fields_to_do(f)), field_ptr)
189 
190  select case (trim(fields_to_do(f)))
191 
192  case ("ua")
193 
194  if (.not. have_uava) call field_fail(fields_to_do(f))
195  field_ptr(geom%isc:geom%iec,geom%jsc:geom%jec,:) = ua(geom%isc:geom%iec,geom%jsc:geom%jec,:)
196 
197  case ("va")
198 
199  if (.not. have_uava) call field_fail(fields_to_do(f))
200  field_ptr(geom%isc:geom%iec,geom%jsc:geom%jec,:) = va(geom%isc:geom%iec,geom%jsc:geom%jec,:)
201 
202  case ("t")
203 
204  if (.not. have_t) call field_fail(fields_to_do(f))
205  field_ptr = t
206 
207  case ("sphum")
208 
209  if (.not. have_q) call field_fail(fields_to_do(f))
210  field_ptr = q
211 
212  case default
213 
214  call abor1_ftn("fv3jedi_lvc_model2geovals_mod.multiply unknown field: "//trim(fields_to_do(f)) &
215  //". Not in input field and no transform case specified.")
216 
217  end select
218 
219 enddo
220 
221 ! Copy calendar infomation
222 ! ------------------------
223 dxa%calendar_type = dxc%calendar_type
224 dxa%date_init = dxc%date_init
225 
226 end subroutine multiply
227 
228 ! --------------------------------------------------------------------------------------------------
229 
230 subroutine multiplyadjoint(self,geom,dxa,dxc)
231 
232 implicit none
233 type(fv3jedi_linvarcha_c2a), intent(in) :: self
234 type(fv3jedi_geom), intent(inout) :: geom
235 type(fv3jedi_increment), intent(inout) :: dxa
236 type(fv3jedi_increment), intent(inout) :: dxc
237 
238 integer :: f
239 character(len=field_clen), allocatable :: fields_to_do(:)
240 real(kind=kind_real), pointer :: field_ptr(:,:,:)
241 
242 ! Winds
243 logical :: have_psichi
244 real(kind=kind_real), pointer, dimension(:,:,:) :: ua
245 real(kind=kind_real), pointer, dimension(:,:,:) :: va
246 real(kind=kind_real), allocatable, dimension(:,:,:) :: psi
247 real(kind=kind_real), allocatable, dimension(:,:,:) :: chi
248 
249 ! Relative humidity
250 logical :: have_rh
251 real(kind=kind_real), pointer, dimension(:,:,:) :: q
252 real(kind=kind_real), allocatable, dimension(:,:,:) :: rh
253 
254 ! Virtual temperature
255 logical :: have_tv
256 real(kind=kind_real), pointer, dimension(:,:,:) :: t
257 real(kind=kind_real), allocatable, dimension(:,:,:) :: tv
258 
259 ! Zero output
260 ! -----------
261 call dxc%zero()
262 
263 ! Identity part of the change of fields
264 ! -------------------------------------
265 call copy_subset(dxa%fields, dxc%fields, fields_to_do)
266 
267 ! If variable change is the identity early exit
268 ! ---------------------------------------------
269 if (.not.allocated(fields_to_do)) return
270 
271 ! Virtual temperature
272 ! -------------------
273 have_tv = .false.
274 if (dxa%has_field('t') .and. dxa%has_field('sphum')) then
275  call dxa%get_field('t', t)
276  call dxa%get_field('sphum', q)
277  allocate(tv(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
278  tv = 0.0_kind_real
279  call tv_to_t_ad(geom, self%tvtraj, tv, self%qtraj, q, t)
280  have_tv = .true.
281 endif
282 
283 ! Relative humidity
284 !------------------
285 have_rh = .false.
286 if (dxa%has_field('sphum')) then
287  call dxa%get_field('sphum', q)
288  allocate(rh(geom%isc:geom%iec,geom%jsc:geom%jec,geom%npz))
289  rh = 0.0_kind_real
290  call rh_to_q_ad(geom, self%qsattraj, rh, q)
291  have_rh = .true.
292 endif
293 
294 ! Winds
295 ! -----
296 have_psichi = .false.
297 if (dxa%has_field('ua') .and. dxa%has_field('va')) then
298  call dxa%get_field('ua', ua)
299  call dxa%get_field('va', va)
300  allocate(psi(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
301  allocate(chi(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
302  psi = 0.0_kind_real
303  chi = 0.0_kind_real
304  call psichi_to_uava_adm(geom, psi, chi, ua, va)
305  have_psichi = .true.
306 endif
307 
308 ! Loop over the fields not found in the input state and work through cases
309 ! ------------------------------------------------------------------------
310 do f = 1, size(fields_to_do)
311 
312  call dxc%get_field(trim(fields_to_do(f)), field_ptr)
313 
314  select case (trim(fields_to_do(f)))
315 
316  case ("psi")
317 
318  if (.not. have_psichi) call field_fail(fields_to_do(f))
319  field_ptr(geom%isc:geom%iec,geom%jsc:geom%jec,:) = psi(geom%isc:geom%iec,geom%jsc:geom%jec,:)
320 
321  case ("chi")
322 
323  if (.not. have_psichi) call field_fail(fields_to_do(f))
324  field_ptr(geom%isc:geom%iec,geom%jsc:geom%jec,:) = chi(geom%isc:geom%iec,geom%jsc:geom%jec,:)
325 
326  case ("tv")
327 
328  if (.not. have_tv) call field_fail(fields_to_do(f))
329  field_ptr = tv
330 
331  case ("rh")
332 
333  if (.not. have_rh) call field_fail(fields_to_do(f))
334  field_ptr = rh
335 
336  case default
337 
338  call abor1_ftn("fv3jedi_lvc_model2geovals_mod.multiplyadjoint unknown field: "//trim(fields_to_do(f)) &
339  //". Not in input field and no transform case specified.")
340 
341  end select
342 
343 enddo
344 
345 ! Copy calendar infomation
346 ! ------------------------
347 dxc%calendar_type = dxa%calendar_type
348 dxc%date_init = dxa%date_init
349 
350 end subroutine multiplyadjoint
351 
352 ! --------------------------------------------------------------------------------------------------
353 
354 subroutine multiplyinverse(self,geom,dxa,dxc)
355 
356 implicit none
357 type(fv3jedi_linvarcha_c2a), intent(in) :: self
358 type(fv3jedi_geom), intent(inout) :: geom
359 type(fv3jedi_increment), intent(in) :: dxa
360 type(fv3jedi_increment), intent(inout) :: dxc
361 
362 integer :: f
363 
364 ! Forced identity
365 ! ---------------
366 do f = 1, size(dxc%fields)
367  dxc%fields(f)%array = dxa%fields(f)%array
368 enddo
369 
370 ! Copy calendar infomation
371 ! ------------------------
372 dxc%calendar_type = dxa%calendar_type
373 dxc%date_init = dxa%date_init
374 
375 end subroutine multiplyinverse
376 
377 ! --------------------------------------------------------------------------------------------------
378 
379 subroutine multiplyinverseadjoint(self,geom,dxc,dxa)
380 
381 implicit none
382 type(fv3jedi_linvarcha_c2a), intent(in) :: self
383 type(fv3jedi_geom), intent(inout) :: geom
384 type(fv3jedi_increment), intent(in) :: dxc
385 type(fv3jedi_increment), intent(inout) :: dxa
386 
387 integer :: f
388 
389 ! Forced identity
390 ! ---------------
391 do f = 1, size(dxc%fields)
392  dxa%fields(f)%array = dxc%fields(f)%array
393 enddo
394 
395 ! Copy calendar infomation
396 ! ------------------------
397 dxa%calendar_type = dxc%calendar_type
398 dxa%date_init = dxc%date_init
399 
400 end subroutine multiplyinverseadjoint
401 
402 ! --------------------------------------------------------------------------------------------------
403 
404 subroutine control_to_analysis_tlm(geom,psi, chi, tv, rh, &
405  ua , va , t , q, &
406  tvt, qt, qsat)
407 
408  implicit none
409  type(fv3jedi_geom), intent(inout) :: geom
410 
411  !Input: control variables
412  real(kind=kind_real), intent(in) :: psi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Stream function
413  real(kind=kind_real), intent(in) :: chi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Velocity potential
414  real(kind=kind_real), intent(in) :: tv(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Virtual temp
415  real(kind=kind_real), intent(in) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity
416 
417  !Output: analysis variables
418  real(kind=kind_real), intent(inout) :: ua(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !A-grid winds (ua)
419  real(kind=kind_real), intent(inout) :: va(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !A-grid winds (va)
420  real(kind=kind_real), intent(inout) :: t(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Dry temperature
421  real(kind=kind_real), intent(inout) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity
422 
423  !Trajectory for virtual temperature to temperature
424  real(kind=kind_real), intent(in) :: tvt(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !VTemperature traj
425  real(kind=kind_real), intent(in) :: qt(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity traj
426  real(kind=kind_real), intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Sat spec hum
427 
428  real(kind=kind_real), allocatable, dimension(:,:,:) :: psi_dom, chi_dom
429 
430  ua = 0.0_kind_real
431  va = 0.0_kind_real
432  t = 0.0_kind_real
433  q = 0.0_kind_real
434 
435  !psi and chi to A-grid u and v
436  !-----------------------------
437  allocate(psi_dom(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
438  allocate(chi_dom(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
439  psi_dom = 0.0_kind_real
440  chi_dom = 0.0_kind_real
441 
442  psi_dom(geom%isc:geom%iec,geom%jsc:geom%jec,:) = psi
443  chi_dom(geom%isc:geom%iec,geom%jsc:geom%jec,:) = chi
444 
445  call psichi_to_uava(geom,psi_dom,chi_dom,ua,va)
446 
447  deallocate(psi_dom, chi_dom)
448 
449  !Relative humidity to specific humidity
450  !--------------------------------------
451  call rh_to_q_tl(geom,qsat,rh,q)
452 
453  !Virtual temperature to temperature
454  !----------------------------------
455  call tv_to_t_tl(geom,tvt,tv,qt,q,t)
456 
457 endsubroutine control_to_analysis_tlm
458 
459 ! --------------------------------------------------------------------------------------------------
460 
461 !> Control variables to state variables - Adjoint
462 
463 subroutine control_to_analysis_adm(geom,psi, chi, tv, rh, &
464  ua , va , t , q, &
465  tvt, qt, qsat)
466 
467  implicit none
468  type(fv3jedi_geom), intent(inout) :: geom
469 
470  !Output: control variables
471  real(kind=kind_real), intent(inout) :: psi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Stream function
472  real(kind=kind_real), intent(inout) :: chi(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Velocity potential
473  real(kind=kind_real), intent(inout) :: tv(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Virtual temp
474  real(kind=kind_real), intent(inout) :: rh(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity
475 
476  !Input: analysis variables
477  real(kind=kind_real), intent(inout) :: ua(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Dgrid winds (u)
478  real(kind=kind_real), intent(inout) :: va(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Dgrid winds (v)
479  real(kind=kind_real), intent(inout) :: t(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Dry temperature
480  real(kind=kind_real), intent(inout) :: q(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity
481 
482  !Trajectory for virtual temperature to temperaturc
483  real(kind=kind_real), intent(in) :: tvt(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !VTemperature traj
484  real(kind=kind_real), intent(in) :: qt(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Specific humidity traj
485  real(kind=kind_real), intent(in) :: qsat(geom%isc:geom%iec,geom%jsc:geom%jec,1:geom%npz) !Sat spec hum
486 
487  real(kind=kind_real), allocatable, dimension(:,:,:) :: psi_dom, chi_dom
488 
489  psi = 0.0_kind_real
490  chi = 0.0_kind_real
491  tv = 0.0_kind_real
492  rh = 0.0_kind_real
493 
494  !Virtual temperature to temperature
495  !----------------------------------
496  call tv_to_t_ad(geom,tvt,tv,qt,q,t)
497 
498  !Relative humidity to specific humidity
499  !--------------------------------------
500  call rh_to_q_ad(geom,qsat,rh,q)
501 
502  !psi and chi to D-grid u and v
503  !-----------------------------
504  allocate(psi_dom(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
505  allocate(chi_dom(geom%isd:geom%ied,geom%jsd:geom%jed,1:geom%npz))
506  psi_dom = 0.0_kind_real
507  chi_dom = 0.0_kind_real
508 
509  call psichi_to_uava_adm(geom,psi_dom,chi_dom,ua,va)
510 
511  psi = psi_dom(geom%isc:geom%iec,geom%jsc:geom%jec,:)
512  chi = chi_dom(geom%isc:geom%iec,geom%jsc:geom%jec,:)
513 
514  deallocate(psi_dom, chi_dom)
515 
516 endsubroutine control_to_analysis_adm
517 
518 ! --------------------------------------------------------------------------------------------------
519 
520 end module fv3jedi_linvarcha_c2a_mod
fv3jedi_state_mod::fv3jedi_state
Fortran derived type to hold FV3JEDI state.
Definition: fv3jedi_state_mod.F90:30
fv3jedi_linvarcha_c2a_mod::delete
subroutine, public delete(self)
Definition: fv3jedi_linvarcha_c2a_mod.f90:90
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
moisture_vt_mod
Definition: moisture_variables_mod.f90:6
fv3jedi_fieldfail_mod::field_fail
subroutine, public field_fail(field)
Definition: fv3jedi_fieldfail_mod.f90:14
temperature_vt_mod::t_to_tv
subroutine, public t_to_tv(geom, t, q, tv)
Definition: temperature_variables_mod.f90:27
fv3jedi_linvarcha_c2a_mod::multiply
subroutine, public multiply(self, geom, dxc, dxa)
Definition: fv3jedi_linvarcha_c2a_mod.f90:104
fv3jedi_state_mod
Definition: fv3jedi_state_mod.F90:6
fv3jedi_field_mod::copy_subset
subroutine, public copy_subset(field_in, field_ou, not_copied)
Definition: fv3jedi_field_mod.f90:236
fv3jedi_linvarcha_c2a_mod::multiplyadjoint
subroutine, public multiplyadjoint(self, geom, dxa, dxc)
Definition: fv3jedi_linvarcha_c2a_mod.f90:231
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_linvarcha_c2a_mod::fv3jedi_linvarcha_c2a
Fortran derived type to hold configuration data for the B mat variable change.
Definition: fv3jedi_linvarcha_c2a_mod.f90:36
fv3jedi_linvarcha_c2a_mod::create
subroutine, public create(self, geom, bg, fg, conf)
Definition: fv3jedi_linvarcha_c2a_mod.f90:50
fv3jedi_increment_mod
Definition: fv3jedi_increment_mod.F90:6
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_fieldfail_mod
Definition: fv3jedi_fieldfail_mod.f90:1
wind_vt_mod
Definition: wind_variables_mod.f90:6
temperature_vt_mod
Definition: temperature_variables_mod.f90:6
fv3jedi_linvarcha_c2a_mod::control_to_analysis_tlm
subroutine control_to_analysis_tlm(geom, psi, chi, tv, rh, ua, va, t, q, tvt, qt, qsat)
Definition: fv3jedi_linvarcha_c2a_mod.f90:407
wind_vt_mod::psichi_to_uava
subroutine, public psichi_to_uava(geom, psi, chi, ua, va)
Definition: wind_variables_mod.f90:111
pressure_vt_mod
Definition: pressure_variables_mod.f90:6
fv3jedi_linvarcha_c2a_mod::multiplyinverseadjoint
subroutine, public multiplyinverseadjoint(self, geom, dxc, dxa)
Definition: fv3jedi_linvarcha_c2a_mod.f90:380
temperature_vt_mod::tv_to_t_ad
subroutine, public tv_to_t_ad(geom, tv, tv_ad, q, q_ad, t_ad)
Definition: temperature_variables_mod.f90:107
wind_vt_mod::psichi_to_uava_adm
subroutine, public psichi_to_uava_adm(geom, psi_ad, chi_ad, ua_ad, va_ad)
Definition: wind_variables_mod.f90:264
moisture_vt_mod::get_qsat
subroutine, public get_qsat(geom, delp, t, q, qsat)
Definition: moisture_variables_mod.f90:486
moisture_vt_mod::rh_to_q_ad
subroutine, public rh_to_q_ad(geom, qsat, rh, q)
Definition: moisture_variables_mod.f90:373
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_linvarcha_c2a_mod::control_to_analysis_adm
subroutine control_to_analysis_adm(geom, psi, chi, tv, rh, ua, va, t, q, tvt, qt, qsat)
Control variables to state variables - Adjoint.
Definition: fv3jedi_linvarcha_c2a_mod.f90:466
fv3jedi_linvarcha_c2a_mod::multiplyinverse
subroutine, public multiplyinverse(self, geom, dxa, dxc)
Definition: fv3jedi_linvarcha_c2a_mod.f90:355
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
moisture_vt_mod::rh_to_q_tl
subroutine, public rh_to_q_tl(geom, qsat, rh, q)
Definition: moisture_variables_mod.f90:359
temperature_vt_mod::tv_to_t_tl
subroutine, public tv_to_t_tl(geom, tv, tv_tl, q, q_tl, t_tl)
Definition: temperature_variables_mod.f90:91
fv3jedi_increment_mod::fv3jedi_increment
Definition: fv3jedi_increment_mod.F90:34
fv3jedi_linvarcha_c2a_mod
Definition: fv3jedi_linvarcha_c2a_mod.f90:6
fv3jedi_field_mod::field_clen
integer, parameter, public field_clen
Definition: fv3jedi_field_mod.f90:31