FV3-JEDI
fv3jedi_increment_mod.F90
Go to the documentation of this file.
1 ! (C) Copyright 2017-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 use atlas_module, only: atlas_field, atlas_fieldset, atlas_real
9 use iso_c_binding
10 use fckit_configuration_module, only: fckit_configuration
11 use datetime_mod
12 use oops_variables_mod, only: oops_variables
13 
14 use random_mod
15 use fckit_mpi_module
16 
18 
25 
26 use wind_vt_mod, only: d2a
27 
28 use mpp_domains_mod, only: mpp_global_sum, bitwise_efp_sum, center, east, north, center
29 
30 implicit none
31 private
33 
35 contains
36  procedure, public :: ones
37  procedure, public :: random
38  procedure, public :: set_atlas
39  procedure, public :: to_atlas
40  procedure, public :: from_atlas
41  procedure, public :: self_add
42  procedure, public :: self_schur
43  procedure, public :: self_sub
44  procedure, public :: self_mul
45  procedure, public :: dot_prod
46  procedure, public :: diff_incr
47  procedure, public :: dirac
48  procedure, public :: getpoint
49  procedure, public :: setpoint
50 end type fv3jedi_increment
51 
52 ! --------------------------------------------------------------------------------------------------
53 
54 #define LISTED_TYPE fv3jedi_increment
55 
56 !> Linked list interface - defines registry_t type
57 #include "oops/util/linkedList_i.f"
58 
59 !> Global registry
60 type(registry_t) :: fv3jedi_increment_registry
61 
62 ! --------------------------------------------------------------------------------------------------
63 
64 contains
65 
66 ! --------------------------------------------------------------------------------------------------
67 
68 !> Linked list implementation
69 #include "oops/util/linkedList_c.f"
70 
71 ! --------------------------------------------------------------------------------------------------
72 
73 subroutine ones(self)
74 
75 implicit none
76 class(fv3jedi_increment), intent(inout) :: self
77 
78 integer :: var
79 
80 do var = 1,self%nf
81  self%fields(var)%array = 1.0_kind_real
82 enddo
83 
84 end subroutine ones
85 
86 ! --------------------------------------------------------------------------------------------------
87 
88 subroutine random(self)
89 
90 implicit none
91 class(fv3jedi_increment), intent(inout) :: self
92 
93 integer :: var
94 integer, parameter :: rseed = 7
95 
96 do var = 1,self%nf
97  call normal_distribution(self%fields(var)%array, 0.0_kind_real, 1.0_kind_real, rseed)
98 enddo
99 
100 end subroutine random
101 
102 ! --------------------------------------------------------------------------------------------------
103 
104 subroutine set_atlas(self, geom, vars, afieldset)
105 
106 implicit none
107 class(fv3jedi_increment), intent(in) :: self
108 type(fv3jedi_geom), intent(in) :: geom
109 type(oops_variables), intent(in) :: vars
110 type(atlas_fieldset), intent(inout) :: afieldset
111 
112 integer :: jvar, jf
113 logical :: var_found
114 type(atlas_field) :: afield
115 
116 do jvar = 1,vars%nvars()
117  var_found = .false.
118  do jf = 1,self%nf
119  if (trim(vars%variable(jvar))==trim(self%fields(jf)%short_name)) then
120  if (.not.afieldset%has_field(vars%variable(jvar))) then
121  ! Create field
122  afield = geom%afunctionspace%create_field(name=vars%variable(jvar),&
123  kind=atlas_real(kind_real),levels=self%fields(jvar)%npz)
124 
125  ! Add field
126  call afieldset%add(afield)
127 
128  ! Release pointer
129  call afield%final()
130  endif
131 
132  ! Set flag
133  var_found = .true.
134  exit
135  endif
136  enddo
137  if (.not.var_found) call abor1_ftn('Field '//trim(vars%variable(jvar))//' not found in increment')
138 enddo
139 
140 end subroutine set_atlas
141 
142 ! --------------------------------------------------------------------------------------------------
143 
144 subroutine to_atlas(self, geom, vars, afieldset)
145 
146 implicit none
147 class(fv3jedi_increment), intent(in) :: self
148 type(fv3jedi_geom), intent(in) :: geom
149 type(oops_variables), intent(in) :: vars
150 type(atlas_fieldset), intent(inout) :: afieldset
151 
152 integer :: jvar, jf, jl
153 real(kind=kind_real), pointer :: real_ptr_2(:,:)
154 logical :: var_found
155 type(atlas_field) :: afield
156 
157 do jvar = 1,vars%nvars()
158  var_found = .false.
159  do jf = 1,self%nf
160  if (trim(vars%variable(jvar))==trim(self%fields(jf)%short_name)) then
161  if (afieldset%has_field(vars%variable(jvar))) then
162  ! Get field
163  afield = afieldset%field(vars%variable(jvar))
164  else
165  ! Create field
166  afield = geom%afunctionspace%create_field(name=vars%variable(jvar),&
167  kind=atlas_real(kind_real),levels=self%fields(jvar)%npz)
168 
169  ! Add field
170  call afieldset%add(afield)
171  endif
172 
173  ! Copy data
174  call afield%data(real_ptr_2)
175  do jl=1,self%fields(jf)%npz
176  real_ptr_2(jl,:) = pack(self%fields(jf)%array(geom%isc:geom%iec,geom%jsc:geom%jec,jl),.true.)
177  enddo
178 
179  ! Release pointer
180  call afield%final()
181 
182  ! Set flag
183  var_found = .true.
184  exit
185  endif
186  enddo
187  if (.not.var_found) call abor1_ftn('Field '//trim(vars%variable(jvar))//' not found in increment')
188 enddo
189 
190 end subroutine to_atlas
191 
192 ! --------------------------------------------------------------------------------------------------
193 
194 subroutine from_atlas(self, geom, vars, afieldset)
195 
196 implicit none
197 class(fv3jedi_increment), intent(inout) :: self
198 type(fv3jedi_geom), intent(in) :: geom
199 type(oops_variables), intent(in) :: vars
200 type(atlas_fieldset), intent(in) :: afieldset
201 
202 integer :: jvar, jf, jl
203 real(kind=kind_real), pointer :: real_ptr_2(:,:)
204 logical :: umask(geom%isc:geom%iec,geom%jsc:geom%jec),var_found
205 type(atlas_field) :: afield
206 
207 ! Initialization
208 umask = .true.
209 
210 do jvar = 1,vars%nvars()
211  var_found = .false.
212  do jf = 1,self%nf
213  if (trim(vars%variable(jvar))==trim(self%fields(jf)%short_name)) then
214  ! Get field
215  afield = afieldset%field(vars%variable(jvar))
216 
217  ! Copy data
218  call afield%data(real_ptr_2)
219  do jl=1,self%fields(jf)%npz
220  self%fields(jf)%array(geom%isc:geom%iec,geom%jsc:geom%jec,jl) = unpack(real_ptr_2(jl,:), &
221  & umask,self%fields(jf)%array(geom%isc:geom%iec,geom%jsc:geom%jec,jl))
222  enddo
223 
224  ! Release pointer
225  call afield%final()
226 
227  ! Set flag
228  var_found = .true.
229  exit
230  endif
231  enddo
232  if (.not.var_found) call abor1_ftn('Field '//trim(vars%variable(jvar))//' not found in increment')
233 enddo
234 
235 end subroutine from_atlas
236 
237 ! --------------------------------------------------------------------------------------------------
238 
239 subroutine self_add(self,rhs)
240 
241 implicit none
242 class(fv3jedi_increment), intent(inout) :: self
243 class(fv3jedi_increment), intent(in) :: rhs
244 
245 integer :: var
246 
247 call checksame(self%fields,rhs%fields,"fv3jedi_increment_mod.self_add")
248 
249 do var = 1,self%nf
250  self%fields(var)%array = self%fields(var)%array + rhs%fields(var)%array
251 enddo
252 
253 end subroutine self_add
254 
255 ! --------------------------------------------------------------------------------------------------
256 
257 subroutine self_schur(self,rhs)
258 
259 implicit none
260 class(fv3jedi_increment), intent(inout) :: self
261 class(fv3jedi_increment), intent(in) :: rhs
262 
263 integer :: var
264 
265 call checksame(self%fields,rhs%fields,"fv3jedi_increment_mod.self_schur")
266 
267 do var = 1,self%nf
268  self%fields(var)%array = self%fields(var)%array * rhs%fields(var)%array
269 enddo
270 
271 end subroutine self_schur
272 
273 ! --------------------------------------------------------------------------------------------------
274 
275 subroutine self_sub(self,rhs)
276 
277 implicit none
278 class(fv3jedi_increment), intent(inout) :: self
279 class(fv3jedi_increment), intent(in) :: rhs
280 
281 integer :: var
282 
283 call checksame(self%fields,rhs%fields,"fv3jedi_increment_mod.self_sub")
284 
285 do var = 1,self%nf
286  self%fields(var)%array = self%fields(var)%array - rhs%fields(var)%array
287 enddo
288 
289 end subroutine self_sub
290 
291 ! --------------------------------------------------------------------------------------------------
292 
293 subroutine self_mul(self,zz)
294 
295 implicit none
296 class(fv3jedi_increment), intent(inout) :: self
297 real(kind=kind_real), intent(in) :: zz
298 
299 integer :: var
300 
301 do var = 1,self%nf
302  self%fields(var)%array = zz * self%fields(var)%array
303 enddo
304 
305 end subroutine self_mul
306 
307 ! --------------------------------------------------------------------------------------------------
308 
309 subroutine dot_prod(self,other,zprod)
310 
311 implicit none
312 class(fv3jedi_increment), intent(in) :: self
313 class(fv3jedi_increment), intent(in) :: other
314 real(kind=kind_real), intent(inout) :: zprod
315 
316 real(kind=kind_real) :: zp
317 integer :: i,j,k
318 integer :: var
319 
320 call checksame(self%fields,other%fields,"fv3jedi_increment_mod.dot_prod")
321 
322 zp=0.0_kind_real
323 do var = 1,self%nf
324  do k = 1,self%fields(var)%npz
325  do j = self%jsc,self%jec
326  do i = self%isc,self%iec
327  zp = zp + self%fields(var)%array(i,j,k) * other%fields(var)%array(i,j,k)
328  enddo
329  enddo
330  enddo
331 enddo
332 
333 !Get global dot product
334 call self%f_comm%allreduce(zp,zprod,fckit_mpi_sum())
335 
336 !For debugging print result:
337 !if (self%f_comm%rank() == 0) print*, "Dot product test result: ", zprod
338 
339 end subroutine dot_prod
340 
341 ! --------------------------------------------------------------------------------------------------
342 
343 subroutine diff_incr(self, x1_fields, x2_fields, geom)
344 
345 implicit none
346 class(fv3jedi_increment), intent(inout) :: self
347 type(fv3jedi_field), intent(in) :: x1_fields(:)
348 type(fv3jedi_field), intent(in) :: x2_fields(:)
349 type(fv3jedi_geom), intent(inout) :: geom
350 
351 integer :: var, isc, iec, jsc, jec, npz
352 type(fv3jedi_field), pointer :: x1p, x2p
353 real(kind=kind_real), allocatable :: x1_ua(:,:,:), x1_va(:,:,:)
354 real(kind=kind_real), allocatable :: x2_ua(:,:,:), x2_va(:,:,:)
355 real(kind=kind_real), pointer :: x1_ud(:,:,:), x1_vd(:,:,:)
356 real(kind=kind_real), pointer :: x2_ud(:,:,:), x2_vd(:,:,:)
357 real(kind=kind_real), pointer :: x1_delp(:,:,:)
358 real(kind=kind_real), pointer :: x2_delp(:,:,:)
359 real(kind=kind_real), allocatable :: x1_ps(:,:,:), x2_ps(:,:,:)
360 
361 ! Make sure two states have same fields and in same position
362 call checksame(x1_fields, x2_fields, "fv3jedi_increment_mod.diff_incr x1 vs x2")
363 
364 ! Convenience
365 isc = geom%isc
366 iec = geom%iec
367 jsc = geom%jsc
368 jec = geom%jec
369 npz = geom%npz
370 
371 
372 !D-Grid to A-Grid (if needed)
373 if (self%has_field('ua')) then
374  allocate(x1_ua(isc:iec,jsc:jec,1:npz))
375  allocate(x1_va(isc:iec,jsc:jec,1:npz))
376  allocate(x2_ua(isc:iec,jsc:jec,1:npz))
377  allocate(x2_va(isc:iec,jsc:jec,1:npz))
378  if (has_field(x1_fields, 'ua')) then
379  call get_field(x1_fields, 'ua', x1_ua)
380  call get_field(x1_fields, 'va', x1_va)
381  call get_field(x2_fields, 'ua', x2_ua)
382  call get_field(x2_fields, 'va', x2_va)
383  elseif (has_field(x1_fields, 'ud')) then
384  call get_field(x1_fields, 'ud', x1_ud)
385  call get_field(x1_fields, 'vd', x1_vd)
386  call get_field(x2_fields, 'ud', x2_ud)
387  call get_field(x2_fields, 'vd', x2_vd)
388  call d2a(geom, x1_ud, x1_vd, x1_ua, x1_va)
389  call d2a(geom, x2_ud, x2_vd, x2_ua, x2_va)
390  else
391  call abor1_ftn("fv3jedi_increment_mod.diff_incr: no way to determine A grid winds")
392  endif
393 endif
394 
395 !delp to ps
396 if (self%has_field('ps')) then
397 
398  allocate(x1_ps(isc:iec,jsc:jec,1))
399  allocate(x2_ps(isc:iec,jsc:jec,1))
400 
401  if (has_field(x1_fields, 'delp')) then
402  call get_field(x1_fields, 'delp', x1_delp)
403  x1_ps(:,:,1) = sum(x1_delp,3)
404  elseif (has_field(x1_fields, 'ps')) then
405  call get_field(x1_fields, 'ps', x1_ps)
406  else
407  call abor1_ftn("fv3jedi_increment_mod.diff_incr: problem getting ps from state x1")
408  endif
409 
410  if (has_field(x2_fields, 'delp')) then
411  call get_field(x2_fields, 'delp', x2_delp)
412  x2_ps(:,:,1) = sum(x2_delp,3)
413  elseif (has_field(x2_fields, 'ps')) then
414  call get_field(x2_fields, 'ps', x2_ps)
415  else
416  call abor1_ftn("fv3jedi_increment_mod.diff_incr: problem getting ps from state x2")
417  endif
418 
419 endif
420 
421 do var = 1,self%nf
422 
423  !A-Grid winds can be a special case
424  if (self%fields(var)%fv3jedi_name == 'ua') then
425 
426  self%fields(var)%array = x1_ua - x2_ua
427 
428  elseif (self%fields(var)%fv3jedi_name == 'va') then
429 
430  self%fields(var)%array = x1_va - x2_va
431 
432  !Ps can be a special case
433  elseif (self%fields(var)%fv3jedi_name == 'ps') then
434 
435  self%fields(var)%array = x1_ps - x2_ps
436 
437  else
438 
439  !Get pointer to states
440  call get_field(x1_fields, self%fields(var)%fv3jedi_name, x1p)
441  call get_field(x2_fields, self%fields(var)%fv3jedi_name, x2p)
442 
443  !inc = state - state
444  self%fields(var)%array = x1p%array - x2p%array
445 
446  !Nullify pointers
447  nullify(x1p,x2p)
448 
449  endif
450 
451 enddo
452 
453 if (allocated(x1_ua)) deallocate(x1_ua)
454 if (allocated(x1_va)) deallocate(x1_va)
455 if (allocated(x2_ua)) deallocate(x2_ua)
456 if (allocated(x2_va)) deallocate(x2_va)
457 if (allocated(x1_ps)) deallocate(x1_ps)
458 if (allocated(x2_ps)) deallocate(x2_ps)
459 
460 end subroutine diff_incr
461 
462 ! --------------------------------------------------------------------------------------------------
463 
464 subroutine dirac(self, c_conf, geom)
465 
466 implicit none
467 class(fv3jedi_increment), intent(inout) :: self
468 type(c_ptr), intent(in) :: c_conf
469 type(fv3jedi_geom), intent(in) :: geom
470 
471 integer :: ndir,idir,var
472 
473 integer, allocatable :: ixdir(:),iydir(:),ildir(:),itdir(:)
474 character(len=32), allocatable :: ifdir(:)
475 
476 logical :: found
477 type(fckit_configuration) :: f_conf
478 character(len=:), allocatable :: str
479 character(len=:), allocatable :: str_array(:)
480 
481 f_conf = fckit_configuration(c_conf)
482 
483 ! Get Diracs positions
484 call f_conf%get_or_die("ndir",ndir)
485 
486 allocate(ixdir(ndir))
487 allocate(iydir(ndir))
488 allocate(ildir(ndir))
489 allocate(itdir(ndir))
490 
491 if ((f_conf%get_size("ixdir")/=ndir) .or. &
492  (f_conf%get_size("iydir")/=ndir) .or. &
493  (f_conf%get_size("ildir")/=ndir) .or. &
494  (f_conf%get_size("itdir")/=ndir) .or. &
495  (f_conf%get_size("ifdir")/=ndir)) &
496  call abor1_ftn("fv3jedi_increment_mod.diracL=: dimension inconsistency")
497 
498 call f_conf%get_or_die("ixdir",ixdir)
499 call f_conf%get_or_die("iydir",iydir)
500 call f_conf%get_or_die("ildir",ildir)
501 call f_conf%get_or_die("itdir",itdir)
502 
503 call f_conf%get_or_die("ifdir",str_array)
504 ifdir = str_array
505 deallocate(str_array)
506 
507 ! Setup Diracs
508 call self%zero()
509 
510 ! only u, v, T, ps and tracers allowed
511 do idir=1,ndir
512 
513  found = .false.
514 
515  ! is specified grid point, tile number on this processor
516  if (geom%ntile == itdir(idir) .and. &
517  ixdir(idir) >= self%isc .and. ixdir(idir) <= self%iec .and. &
518  iydir(idir) >= self%jsc .and. iydir(idir) <= self%jec) then
519 
520  ! If so, perturb desired increment and level
521  do var = 1,self%nf
522  if (trim(self%fields(var)%fv3jedi_name) == trim(ifdir(idir))) then
523  found = .true.
524  self%fields(var)%array(ixdir(idir),iydir(idir),ildir) = 1.0
525  endif
526  enddo
527 
528  if (.not.found) call abor1_ftn("fv3jedi_increment_mod.dirac: dirac not found")
529 
530  endif
531 
532 enddo
533 
534 end subroutine dirac
535 
536 ! --------------------------------------------------------------------------------------------------
537 
538 subroutine getpoint(self, geoiter, values)
539 
540 implicit none
541 
542 class(fv3jedi_increment), intent(in) :: self
543 type(fv3jedi_geom_iter), intent(in) :: geoiter
544 real(kind=kind_real), intent(inout) :: values(:)
545 
546 integer :: var, nz, ii
547 
548 ii = 0
549 do var = 1,self%nf
550  nz = self%fields(var)%npz
551  values(ii+1:ii+nz) = self%fields(var)%array(geoiter%iind, geoiter%jind,:)
552  ii = ii + nz
553 enddo
554 
555 end subroutine getpoint
556 
557 ! --------------------------------------------------------------------------------------------------
558 
559 subroutine setpoint(self, geoiter, values)
560 
561 implicit none
562 
563 ! Passed variables
564 class(fv3jedi_increment), intent(inout) :: self
565 type(fv3jedi_geom_iter), intent(in) :: geoiter
566 real(kind=kind_real), intent(in) :: values(:)
567 
568 integer :: var, nz, ii
569 
570 ii = 0
571 do var = 1,self%nf
572  nz = self%fields(var)%npz
573  self%fields(var)%array(geoiter%iind, geoiter%jind,:) = values(ii+1:ii+nz)
574  ii = ii + nz
575 enddo
576 
577 end subroutine setpoint
578 
579 ! --------------------------------------------------------------------------------------------------
580 
581 end module fv3jedi_increment_mod
fv3jedi_field_mod::checksame
subroutine, public checksame(fields1, fields2, calling_method)
Definition: fv3jedi_field_mod.f90:212
fv3jedi_increment_mod::ones
subroutine ones(self)
Linked list implementation.
Definition: fv3jedi_increment_mod.F90:74
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
fv3jedi_increment_mod::self_mul
subroutine self_mul(self, zz)
Definition: fv3jedi_increment_mod.F90:294
fv3jedi_field_mod::has_field
logical function, public has_field(fields, field_name, field_index)
Definition: fv3jedi_field_mod.f90:58
fv3jedi_increment_mod::self_sub
subroutine self_sub(self, rhs)
Definition: fv3jedi_increment_mod.F90:276
fv3jedi_constants_mod::cp
real(kind=kind_real), parameter, public cp
Definition: fv3jedi_constants_mod.f90:40
fv3jedi_geom_iter_mod
Definition: fv3jedi_geom_iter_mod.F90:7
fv3jedi_increment_mod::self_schur
subroutine self_schur(self, rhs)
Definition: fv3jedi_increment_mod.F90:258
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_increment_mod::self_add
subroutine self_add(self, rhs)
Definition: fv3jedi_increment_mod.F90:240
fv3jedi_geom_iter_mod::fv3jedi_geom_iter
Definition: fv3jedi_geom_iter_mod.F90:22
fv3jedi_constants_mod::alhl
real(kind=kind_real), parameter, public alhl
Definition: fv3jedi_constants_mod.f90:25
fv3jedi_increment_mod
Definition: fv3jedi_increment_mod.F90:6
fv3jedi_constants_mod::rgas
real(kind=kind_real), parameter, public rgas
Definition: fv3jedi_constants_mod.f90:39
fields_metadata_mod::field_metadata
Definition: fields_metadata_mod.f90:28
fv3jedi_field_mod::get_field
Definition: fv3jedi_field_mod.f90:25
fields_metadata_mod
Definition: fields_metadata_mod.f90:6
fv3jedi_increment_mod::random
subroutine random(self)
Definition: fv3jedi_increment_mod.F90:89
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_increment_mod::setpoint
subroutine setpoint(self, geoiter, values)
Definition: fv3jedi_increment_mod.F90:560
wind_vt_mod
Definition: wind_variables_mod.f90:6
fv3jedi_constants_mod
Definition: fv3jedi_constants_mod.f90:6
fv3jedi_increment_mod::dot_prod
subroutine dot_prod(self, other, zprod)
Definition: fv3jedi_increment_mod.F90:310
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_increment_mod::dirac
subroutine dirac(self, c_conf, geom)
Definition: fv3jedi_increment_mod.F90:465
fv3jedi_increment_mod::from_atlas
subroutine from_atlas(self, geom, vars, afieldset)
Definition: fv3jedi_increment_mod.F90:195
wind_vt_mod::d2a
subroutine, public d2a(geom, u_comp, v_comp, ua_comp, va_comp)
Definition: wind_variables_mod.f90:1456
fv3jedi_increment_mod::diff_incr
subroutine diff_incr(self, x1_fields, x2_fields, geom)
Definition: fv3jedi_increment_mod.F90:344
fv3jedi_field_mod::fv3jedi_field
Definition: fv3jedi_field_mod.f90:36
fv3jedi_fields_mod
Definition: fv3jedi_fields_mod.f90:6
fv3jedi_increment_mod::getpoint
subroutine getpoint(self, geoiter, values)
Definition: fv3jedi_increment_mod.F90:539
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_increment_mod::set_atlas
subroutine set_atlas(self, geom, vars, afieldset)
Definition: fv3jedi_increment_mod.F90:105
fv3jedi_increment_mod::to_atlas
subroutine to_atlas(self, geom, vars, afieldset)
Definition: fv3jedi_increment_mod.F90:145
fv3jedi_constants_mod::constoz
real(kind=kind_real), parameter, public constoz
Definition: fv3jedi_constants_mod.f90:59
fv3jedi_increment_mod::fv3jedi_increment_registry
type(registry_t), public fv3jedi_increment_registry
Linked list interface - defines registry_t type.
Definition: fv3jedi_increment_mod.F90:60
fv3jedi_increment_mod::fv3jedi_increment
Definition: fv3jedi_increment_mod.F90:34
fv3jedi_fields_mod::fv3jedi_fields
Definition: fv3jedi_fields_mod.f90:34