FV3-JEDI
fv3jedi_lvc_model2geovals_mod.f90
Go to the documentation of this file.
1 ! (C) Copyright 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 iso_c_binding
9 
10 use fckit_configuration_module, only: fckit_configuration
11 use fckit_log_module, only: fckit_log
12 
13 use datetime_mod
14 
22 
23 use height_vt_mod
28 use wind_vt_mod
29 
30 implicit none
31 
32 private
34 
36  integer :: isc, iec, jsc, jec, npz
37  real(kind=kind_real), allocatable :: t(:,:,:)
38  real(kind=kind_real), allocatable :: q(:,:,:)
39  real(kind=kind_real), allocatable :: o3(:,:,:)
40  contains
41  procedure, public :: create
42  procedure, public :: delete
43  procedure, public :: multiply
44  procedure, public :: multiplyadjoint
46 
47 ! --------------------------------------------------------------------------------------------------
48 
49 contains
50 
51 ! --------------------------------------------------------------------------------------------------
52 
53 subroutine create(self, geom, bg, fg, dummyconf)
54 
55 class(fv3jedi_lvc_model2geovals), intent(inout) :: self
56 type(fv3jedi_geom), intent(in) :: geom
57 type(fv3jedi_state), intent(in) :: bg
58 type(fv3jedi_state), intent(in) :: fg
59 type(fckit_configuration), intent(in) :: dummyconf
60 
61 !!! DO NOT USE CONF !!!
62 
63 ! Grid convenience
64 self%isc = geom%isc
65 self%iec = geom%iec
66 self%jsc = geom%jsc
67 self%jec = geom%jec
68 self%npz = geom%npz
69 
70 ! Trajectory fields
71 if (bg%has_field('t' )) call bg%get_field('t' , self%t )
72 if (bg%has_field('sphum' )) call bg%get_field('sphum' , self%q )
73 if (bg%has_field('o3mr' )) call bg%get_field('o3mr' , self%o3)
74 if (bg%has_field('o3ppmv')) call bg%get_field('o3ppmv', self%o3)
75 
76 end subroutine create
77 
78 ! --------------------------------------------------------------------------------------------------
79 
80 subroutine delete(self)
81 
82 class(fv3jedi_lvc_model2geovals), intent(inout) :: self
83 
84 if (allocated(self%t )) deallocate(self%t )
85 if (allocated(self%q )) deallocate(self%q )
86 if (allocated(self%o3)) deallocate(self%o3)
87 
88 end subroutine delete
89 
90 ! --------------------------------------------------------------------------------------------------
91 
92 subroutine multiply(self, geom, dxm, dxg)
93 
94 class(fv3jedi_lvc_model2geovals), intent(inout) :: self
95 type(fv3jedi_geom), intent(inout) :: geom
96 type(fv3jedi_increment), intent(in) :: dxm
97 type(fv3jedi_increment), intent(inout) :: dxg
98 
99 integer :: f, ji, jj, jk, nf2do
100 character(len=field_clen), allocatable :: fields_to_do_(:)
101 character(len=field_clen), allocatable :: fields_to_do(:)
102 real(kind=kind_real), pointer :: field_ptr(:,:,:)
103 
104 !Winds
105 logical :: have_winds
106 real(kind=kind_real), allocatable :: ua(:,:,:) !A-grid wind u component
107 real(kind=kind_real), allocatable :: va(:,:,:) !A-grid wind v component
108 real(kind=kind_real), pointer :: ud(:,:,:) !D-grid wind u component
109 real(kind=kind_real), pointer :: vd(:,:,:) !D-grid wind v component
110 
111 !Virtual temperature
112 logical :: have_tv
113 real(kind=kind_real), pointer :: q(:,:,:) !Specific humidity
114 real(kind=kind_real), pointer :: t(:,:,:) !Temperature
115 real(kind=kind_real), allocatable :: tv(:,:,:) !Virtual temperature
116 
117 !Humidity mixing ratio
118 logical :: have_qmr
119 real(kind=kind_real), allocatable :: qmr(:,:,:) !Humidity mixing ratio
120 
121 !Ozone mixing ratio
122 logical :: have_o3
123 real(kind=kind_real), allocatable :: o3(:,:,:) !Ozone mixing ratio
124 
125 !Surface pressure
126 logical :: have_ps
127 real(kind=kind_real), allocatable :: ps(:,:,:) !Surface pressure
128 real(kind=kind_real), pointer :: delp(:,:,:) !Pressure thickness
129 
130 
131 ! Identity part of the change of fields
132 ! -------------------------------------
133 call copy_subset(dxm%fields, dxg%fields, fields_to_do_)
134 
135 
136 ! Winds are always special case
137 ! -----------------------------
138 nf2do = 0
139 if (allocated(fields_to_do_)) nf2do = size(fields_to_do_)
140 
141 if (dxg%has_field('ua')) then
142  allocate(fields_to_do(nf2do+2))
143  if (allocated(fields_to_do_)) fields_to_do(1:nf2do) = fields_to_do_
144  fields_to_do(nf2do+1) = 'ua'
145  fields_to_do(nf2do+2) = 'va'
146 else
147  if (allocated(fields_to_do_)) then
148  allocate(fields_to_do(nf2do))
149  fields_to_do(1:nf2do) = fields_to_do_
150  endif
151 endif
152 
153 
154 ! If variable change is the identity early exit
155 ! ---------------------------------------------
156 if (.not.allocated(fields_to_do)) return
157 
158 
159 ! Assertion on D-Grid winds
160 ! -------------------------
161 if (dxg%has_field('ud')) call abor1_ftn("GeoVaLs state should not have D-Grid winds")
162 
163 
164 ! Winds
165 ! -----
166 have_winds = .false.
167 if (dxm%has_field('ud')) then
168  call dxm%get_field('ud', ud)
169  call dxm%get_field('vd', vd)
170  allocate(ua(self%isc:self%iec,self%jsc:self%jec,self%npz))
171  allocate(va(self%isc:self%iec,self%jsc:self%jec,self%npz))
172  call d2a(geom, ud, vd, ua, va)
173  have_winds = .true.
174 elseif (dxm%has_field('ua')) then
175  call dxm%get_field('ua', ua)
176  call dxm%get_field('va', va)
177  have_winds = .true.
178 endif
179 
180 
181 ! Virtual temperature
182 ! -------------------
183 have_tv = .false.
184 if (allocated(self%t) .and. allocated(self%t) .and. &
185  dxm%has_field('t') .and. dxm%has_field('sphum')) then
186  call dxm%get_field('t', t)
187  call dxm%get_field('sphum', q)
188  allocate(tv(self%isc:self%iec,self%jsc:self%jec,self%npz))
189  call t_to_tv_tl(geom, self%t, t, self%q, q, tv )
190  have_tv = .true.
191 endif
192 
193 
194 ! Humidity mixing ratio
195 ! ---------------------
196 have_qmr = .false.
197 if (allocated(self%q) .and. dxm%has_field('sphum')) then
198  call dxm%get_field('sphum', q)
199  allocate(qmr(self%isc:self%iec,self%jsc:self%jec,self%npz))
200  call crtm_mixratio_tl(geom, self%q, q, qmr)
201  have_qmr = .true.
202 endif
203 
204 
205 ! Ozone
206 ! -----
207 have_o3 = .false.
208 if (allocated(self%o3) .and. dxm%has_field( 'o3mr') ) then
209  call dxm%get_field('o3mr', o3)
210  have_o3 = .true.
211  do jk = 1, self%npz
212  do jj = self%jsc, self%jec
213  do ji = self%isc, self%iec
214  if (self%o3(ji,jj,jk) >= 0.0_kind_real) then
215  o3(ji,jj,jk) = o3(ji,jj,jk) * constoz
216  else
217  o3(ji,jj,jk) = 0.0_kind_real
218  endif
219  enddo
220  enddo
221  enddo
222 endif
223 if (allocated(self%o3) .and. dxm%has_field( 'o3ppmv') ) then
224  call dxm%get_field('o3ppmv', o3)
225  have_o3 = .true.
226  do jk = 1, self%npz
227  do jj = self%jsc, self%jec
228  do ji = self%isc, self%iec
229  if (self%o3(ji,jj,jk) >= 0.0_kind_real) then
230  continue
231  else
232  o3(ji,jj,jk) = 0.0_kind_real
233  endif
234  enddo
235  enddo
236  enddo
237 endif
238 
239 
240 
241 
242 ! Surface pressure
243 ! ----------------
244 have_ps = .false.
245 if (dxm%has_field( 'ps')) then
246  call dxm%get_field('ps', ps)
247  have_ps = .true.
248 elseif (dxm%has_field('delp')) then
249  call dxm%get_field('delp', delp)
250  allocate(ps(self%isc:self%iec,self%jsc:self%jec,1))
251  ps(:,:,1) = sum(delp,3)
252  have_ps = .true.
253 endif
254 
255 
256 ! Loop over the fields not found in the input state and work through cases
257 ! ------------------------------------------------------------------------
258 do f = 1, size(fields_to_do)
259 
260  call dxg%get_field(trim(fields_to_do(f)), field_ptr)
261 
262  select case (trim(fields_to_do(f)))
263 
264  case ("ua")
265 
266  if (.not. have_winds) call field_fail(fields_to_do(f))
267  field_ptr = ua
268 
269  case ("va")
270 
271  if (.not. have_winds) call field_fail(fields_to_do(f))
272  field_ptr = va
273 
274  case ("tv")
275 
276  if (.not. have_tv) call field_fail(fields_to_do(f))
277  field_ptr = tv
278 
279  case ("ps")
280 
281  if (.not. have_ps) call field_fail(fields_to_do(f))
282  field_ptr = ps
283 
284  case ("humidity_mixing_ratio")
285 
286  if (.not. have_qmr) call field_fail(fields_to_do(f))
287  field_ptr = qmr
288 
289  case ("mole_fraction_of_ozone_in_air")
290  if (.not. have_o3) call field_fail(fields_to_do(f))
291  field_ptr = o3
292 
293  ! Simulated but not assimilated
294  case ("mass_content_of_cloud_liquid_water_in_atmosphere_layer")
295  case ("mass_content_of_cloud_ice_in_atmosphere_layer")
296  case ("pe")
297  case ("p")
298 
299  case default
300 
301  call abor1_ftn("fv3jedi_lvc_model2geovals_mod.multiply unknown field: "//trim(fields_to_do(f)) &
302  //". Not in input field and no transform case specified.")
303 
304  end select
305 
306 enddo
307 
308 ! Copy calendar infomation
309 ! ------------------------
310 dxg%calendar_type = dxm%calendar_type
311 dxg%date_init = dxm%date_init
312 
313 end subroutine multiply
314 
315 ! --------------------------------------------------------------------------------------------------
316 
317 subroutine multiplyadjoint(self, geom, dxg, dxm)
318 
319 class(fv3jedi_lvc_model2geovals), intent(inout) :: self
320 type(fv3jedi_geom), intent(inout) :: geom
321 type(fv3jedi_increment), intent(in) :: dxg
322 type(fv3jedi_increment), intent(inout) :: dxm
323 
324 integer :: fg, fm, ji, jj, jk, dxg_index, num_not_copied
325 real(kind=kind_real), pointer :: field_ptr(:,:,:)
326 character(len=field_clen), allocatable :: fields_to_do(:)
327 character(len=field_clen) :: not_copied_(10000)
328 logical, allocatable :: field_passed(:)
329 integer :: noassim_index
330 
331 !Winds
332 logical :: have_awinds, have_dwinds
333 integer :: ua_index, va_index
334 real(kind=kind_real), pointer :: ua(:,:,:) !A-grid wind u component
335 real(kind=kind_real), pointer :: va(:,:,:) !A-grid wind v component
336 real(kind=kind_real), allocatable :: ud(:,:,:) !D-grid wind u component
337 real(kind=kind_real), allocatable :: vd(:,:,:) !D-grid wind v component
338 
339 !Virtual temperature
340 logical :: have_tv
341 integer :: tv_index
342 real(kind=kind_real), pointer :: tv(:,:,:) !Virtual temperature
343 real(kind=kind_real), allocatable :: q_tv(:,:,:) !Specific humidity
344 real(kind=kind_real), allocatable :: t_tv(:,:,:) !Temperature
345 real(kind=kind_real), pointer :: tptr(:,:,:) !Temperature
346 
347 !Humidity mixing ratio
348 logical :: have_qmr
349 integer :: qmr_index
350 real(kind=kind_real), pointer :: qmr(:,:,:) !Virtual temperature
351 real(kind=kind_real), allocatable :: q_qmr(:,:,:) !Specific humidity
352 real(kind=kind_real), pointer :: qptr(:,:,:) !Specific humidity
353 
354 !Ozone mixing ratio
355 logical :: have_o3, have_o3_mass, have_o3_ppmv, have_mfo3
356 integer :: mfo3_index
357 real(kind=kind_real), pointer :: mfo3(:,:,:) !Ozone mole frac
358 real(kind=kind_real), allocatable :: o3(:,:,:) !Ozone mixing ratio
359 
360 !Surface pressure
361 logical :: have_ps
362 integer :: ps_index
363 real(kind=kind_real), pointer :: ps(:,:,:) !Surface pressure
364 real(kind=kind_real), allocatable :: delp(:,:,:) !Pressure thickness
365 
366 
367 ! ! Print information
368 ! if (geom%f_comm%rank()==0) then
369 ! do fg = 1, size(dxg%fields)
370 ! print*, "Model2GeoVaLs.multiplyAD, GeoVaLs fields IN: ", trim(dxg%fields(fg)%fv3jedi_name), minval(dxg%fields(fg)%array), maxval(dxg%fields(fg)%array)
371 ! enddo
372 ! do fm = 1, size(dxm%fields)
373 ! print*, "Model2GeoVaLs.multiplyAD, Model fields IN: ", trim(dxm%fields(fm)%fv3jedi_name), minval(dxm%fields(fg)%array), maxval(dxm%fields(fg)%array)
374 ! enddo
375 ! endif
376 
377 
378 ! Keep track of input fields passed to output
379 allocate(field_passed(size(dxg%fields)))
380 field_passed = .false.
381 
382 ! Loop over model fields
383 num_not_copied = 0
384 do fm = 1, size(dxm%fields)
385  ! Identity if found and not winds
386  if (.not.trim(dxm%fields(fm)%fv3jedi_name) == 'ua' .and. &
387  .not.trim(dxm%fields(fm)%fv3jedi_name) == 'va' .and. &
388  dxg%has_field( dxm%fields(fm)%fv3jedi_name, dxg_index)) then
389  call dxg%get_field(dxm%fields(fm)%fv3jedi_name, field_ptr)
390  dxm%fields(fm)%array = dxm%fields(fm)%array + field_ptr
391  field_passed(dxg_index) = .true.
392  else
393  num_not_copied = num_not_copied + 1
394  not_copied_(num_not_copied) = dxm%fields(fm)%fv3jedi_name
395  endif
396 enddo
397 
398 allocate(fields_to_do(num_not_copied))
399 fields_to_do(1:num_not_copied) = not_copied_(1:num_not_copied)
400 
401 
402 ! Winds
403 ! -----
404 have_awinds = .false.
405 have_dwinds = .false.
406 if (dxg%has_field( "ua", ua_index) .and. dxg%has_field( "va", va_index)) then
407  call dxg%get_field('ua', ua)
408  call dxg%get_field('va', va)
409  if (dxm%has_field('ud')) then
410  allocate(ud(self%isc:self%iec ,self%jsc:self%jec+1,self%npz))
411  allocate(vd(self%isc:self%iec+1,self%jsc:self%jec ,self%npz))
412  ud = 0.0_kind_real
413  vd = 0.0_kind_real
414  call d2a_ad(geom, ud, vd, ua, va)
415  have_dwinds = .true.
416  elseif (dxm%has_field('ua')) then
417  have_awinds = .true.
418  else
419  call abor1_ftn("fv3jedi_lvc_model2geovals_mod.multiplyadjoint: Winds found in GeoVaLs but"// &
420  " not in the model.")
421  endif
422 endif
423 
424 
425 ! Virtual temperature
426 ! -------------------
427 have_tv = .false.
428 if (allocated(self%t) .and. allocated(self%t) .and. dxg%has_field('tv', tv_index)) then
429  call dxg%get_field('tv', tv)
430  allocate(t_tv(self%isc:self%iec,self%jsc:self%jec,self%npz))
431  allocate(q_tv(self%isc:self%iec,self%jsc:self%jec,self%npz))
432  t_tv = 0.0_kind_real
433  q_tv = 0.0_kind_real
434  call t_to_tv_ad(geom, self%t, t_tv, self%q, q_tv, tv )
435  have_tv = .true.
436 endif
437 
438 
439 ! Humidity mixing ratio
440 ! ---------------------
441 have_qmr = .false.
442 if (allocated(self%q) .and. dxg%has_field('humidity_mixing_ratio', qmr_index)) then
443  call dxg%get_field('humidity_mixing_ratio', qmr)
444  allocate(q_qmr(self%isc:self%iec,self%jsc:self%jec,self%npz))
445  q_qmr = 0.0_kind_real
446  call crtm_mixratio_ad(geom, self%q, q_qmr, qmr)
447  have_qmr = .true.
448 endif
449 
450 
451 ! Pressure
452 ! --------
453 have_ps = .false.
454 if (dxg%has_field( "ps", ps_index)) then
455  call dxg%get_field('ps', ps)
456  allocate(delp(self%isc:self%iec,self%jsc:self%jec,self%npz))
457  delp = 0.0_kind_real
458  do jk = 1, self%npz
459  delp(:,:,jk) = delp(:,:,jk) + ps(:,:,1)
460  enddo
461  have_ps = .true.
462 endif
463 
464 
465 ! Ozone
466 ! -----
467 !!!
468 ! Ozone
469 ! -----
470 have_o3 = .false.
471 have_o3_mass = .false.
472 have_o3_ppmv = .false.
473 have_mfo3 = .false.
474 have_o3_mass = dxm%has_field( 'o3mr')
475 have_o3_ppmv = dxm%has_field( 'o3ppmv')
476 have_mfo3 = dxg%has_field( "mole_fraction_of_ozone_in_air", mfo3_index)
477 
478 if (allocated(self%o3) .and. have_mfo3 .and. (have_o3_mass .or. have_o3_ppmv) ) then
479  call dxg%get_field('mole_fraction_of_ozone_in_air', mfo3)
480  allocate(o3(self%isc:self%iec,self%jsc:self%jec,self%npz))
481  o3 = mfo3
482  do jk = 1, self%npz
483  do jj = self%jsc, self%jec
484  do ji = self%isc, self%iec
485  if (self%o3(ji,jj,jk) >= 0.0_kind_real .and. have_o3_mass) then
486  o3(ji,jj,jk) = o3(ji,jj,jk) * constoz ! I think this needs to be division if you want to go from mole fraction expressed in ppmv (what is used in UFOs) to kg/kg (Model) here
487  else if (have_o3_ppmv .and. self%o3(ji,jj,jk) >= 0.0_kind_real ) then
488  continue
489  else
490  o3(ji,jj,jk) = 0.0_kind_real
491  endif
492  enddo
493  enddo
494  enddo
495  have_o3 = .true.
496 endif
497 
498 ! Simulated but not assimilated
499 if (dxg%has_field( "mass_content_of_cloud_liquid_water_in_atmosphere_layer", noassim_index)) &
500  field_passed(noassim_index) = .true.
501 if (dxg%has_field( "mass_content_of_cloud_ice_in_atmosphere_layer", noassim_index)) &
502  field_passed(noassim_index) = .true.
503 if (dxg%has_field( "p", noassim_index)) &
504  field_passed(noassim_index) = .true.
505 if (dxg%has_field( "pe", noassim_index)) &
506  field_passed(noassim_index) = .true.
507 
508 
509 ! ! Print information
510 ! if (geom%f_comm%rank()==0) then
511 ! do fg = 1, size(dxg%fields)
512 ! print*, "Model2GeoVaLs.multiplyAD, GeoVaLs fields: ", trim(dxg%fields(fg)%fv3jedi_name), &
513 ! ", passed: ", field_passed(fg)
514 ! enddo
515 ! endif
516 
517 
518 ! Loop over the fields not obtainable from the input
519 ! --------------------------------------------------
520 do fm = 1, size(fields_to_do)
521 
522  call dxm%get_field(trim(fields_to_do(fm)), field_ptr)
523 
524  select case(trim(fields_to_do(fm)))
525 
526  case ("ud")
527 
528  if (have_dwinds) then
529  field_passed(ua_index) = .true.
530  field_ptr = field_ptr + ud
531  endif
532 
533  case ("vd")
534 
535  if (have_dwinds) then
536  field_passed(va_index) = .true.
537  field_ptr = field_ptr + vd
538  endif
539 
540  case ("ua")
541 
542  if (have_awinds) then
543  field_passed(ua_index) = .true.
544  field_ptr = field_ptr + ua
545  endif
546 
547  case ("va")
548 
549  if (have_awinds) then
550  field_passed(va_index) = .true.
551  field_ptr = field_ptr + va
552  endif
553 
554  case ("delp")
555 
556  if (have_ps) then
557  field_passed(ps_index) = .true.
558  field_ptr = field_ptr + delp
559  endif
560 
561  case ("o3mr")
562 
563  if (have_o3) then
564  field_passed(mfo3_index) = .true.
565  field_ptr = field_ptr + o3
566  endif
567  case ("o3ppmv")
568 
569  if (have_o3) then
570  field_passed(mfo3_index) = .true.
571  field_ptr = field_ptr + o3
572  endif
573 
574 
575  end select
576 
577 enddo
578 
579 ! ! Print information
580 ! if (geom%f_comm%rank()==0) then
581 ! do fg = 1, size(dxg%fields)
582 ! print*, "Model2GeoVaLs.multiplyAD, GeoVaLs fields: ", trim(dxg%fields(fg)%fv3jedi_name), &
583 ! "Passed: ", field_passed(fg)
584 ! enddo
585 ! endif
586 
587 
588 ! Loop over fields in input not yet assigned an output field
589 do fg = 1, size(dxg%fields)
590 
591  if (.not. field_passed(fg)) then
592 
593  select case(trim(dxg%fields(fg)%fv3jedi_name))
594 
595  case ("tv")
596 
597  if (.not. have_tv) call field_fail(trim(dxg%fields(fg)%fv3jedi_name))
598  field_passed(tv_index) = .true.
599  call dxm%get_field("t", tptr)
600  call dxm%get_field("sphum", qptr)
601  tptr = tptr + t_tv
602  qptr = qptr + q_tv
603 
604  case ("humidity_mixing_ratio")
605 
606  if (.not. have_qmr) call field_fail(trim(dxg%fields(fg)%fv3jedi_name))
607  field_passed(qmr_index) = .true.
608  call dxm%get_field("sphum", qptr)
609  qptr = qptr + q_qmr
610 
611  case default
612 
613  call abor1_ftn("GeoVaLs field "//trim(dxg%fields(fg)%fv3jedi_name)//" has no known link "// &
614  "to fields in model state")
615 
616  end select
617 
618  endif
619 
620 enddo
621 
622 
623 ! Check all fields have been linked to an output field
624 do fg = 1, size(dxg%fields)
625  if (.not. field_passed(fg)) then
626  call abor1_ftn("fv3jedi_lvc_model2geovals_mod.multiplyadjoint failed to send all geoval "// &
627  "fields to a model field")
628  endif
629 enddo
630 
631 
632 ! Copy calendar infomation
633 ! ------------------------
634 dxm%calendar_type = dxg%calendar_type
635 dxm%date_init = dxg%date_init
636 
637 ! ! Print information
638 ! if (geom%f_comm%rank()==0) then
639 ! do fg = 1, size(dxg%fields)
640 ! print*, "Model2GeoVaLs.multiplyAD, GeoVaLs fields OUT: ", trim(dxg%fields(fg)%fv3jedi_name), minval(dxg%fields(fg)%array), maxval(dxg%fields(fg)%array)
641 ! enddo
642 ! do fm = 1, size(dxm%fields)
643 ! print*, "Model2GeoVaLs.multiplyAD, Model fields OUT: ", trim(dxm%fields(fm)%fv3jedi_name), minval(dxm%fields(fg)%array), maxval(dxm%fields(fg)%array)
644 ! enddo
645 ! endif
646 
647 end subroutine multiplyadjoint
648 
649 ! --------------------------------------------------------------------------------------------------
650 
fv3jedi_state_mod::fv3jedi_state
Fortran derived type to hold FV3JEDI state.
Definition: fv3jedi_state_mod.F90:30
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
moisture_vt_mod
Definition: moisture_variables_mod.f90:6
fv3jedi_lvc_model2geovals_mod::create
subroutine create(self, geom, bg, fg, dummyconf)
Definition: fv3jedi_lvc_model2geovals_mod.f90:54
fv3jedi_fieldfail_mod::field_fail
subroutine, public field_fail(field)
Definition: fv3jedi_fieldfail_mod.f90:14
surface_vt_mod
Definition: surface_variables_mod.f90:6
moisture_vt_mod::crtm_mixratio_tl
subroutine, public crtm_mixratio_tl(geom, q, q_tl, qmr_tl)
Definition: moisture_variables_mod.f90:220
temperature_vt_mod::t_to_tv_tl
subroutine, public t_to_tv_tl(geom, t, t_tl, q, q_tl, tv_tl)
Definition: temperature_variables_mod.f90:41
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_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_lvc_model2geovals_mod::multiply
subroutine multiply(self, geom, dxm, dxg)
Definition: fv3jedi_lvc_model2geovals_mod.f90:93
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
wind_vt_mod::d2a_ad
subroutine, public d2a_ad(geom, u_ad_comp, v_ad_comp, ua_ad_comp, va_ad_comp)
Definition: wind_variables_mod.f90:1607
fv3jedi_fieldfail_mod
Definition: fv3jedi_fieldfail_mod.f90:1
wind_vt_mod
Definition: wind_variables_mod.f90:6
fv3jedi_lvc_model2geovals_mod::fv3jedi_lvc_model2geovals
Definition: fv3jedi_lvc_model2geovals_mod.f90:35
temperature_vt_mod
Definition: temperature_variables_mod.f90:6
fv3jedi_constants_mod
Definition: fv3jedi_constants_mod.f90:6
moisture_vt_mod::crtm_mixratio_ad
subroutine, public crtm_mixratio_ad(geom, q, q_ad, qmr_ad)
Definition: moisture_variables_mod.f90:274
pressure_vt_mod
Definition: pressure_variables_mod.f90:6
fv3jedi_lvc_model2geovals_mod::delete
subroutine delete(self)
Definition: fv3jedi_lvc_model2geovals_mod.f90:81
fv3jedi_lvc_model2geovals_mod::multiplyadjoint
subroutine multiplyadjoint(self, geom, dxg, dxm)
Definition: fv3jedi_lvc_model2geovals_mod.f90:318
fv3jedi_lvc_model2geovals_mod
Definition: fv3jedi_lvc_model2geovals_mod.f90:6
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
height_vt_mod
Definition: height_variables_mod.f90:6
wind_vt_mod::d2a
subroutine, public d2a(geom, u_comp, v_comp, ua_comp, va_comp)
Definition: wind_variables_mod.f90:1456
temperature_vt_mod::t_to_tv_ad
subroutine, public t_to_tv_ad(geom, t, t_ad, q, q_ad, tv_ad)
Definition: temperature_variables_mod.f90:57
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_constants_mod::constoz
real(kind=kind_real), parameter, public constoz
Definition: fv3jedi_constants_mod.f90:59
fv3jedi_increment_mod::fv3jedi_increment
Definition: fv3jedi_increment_mod.F90:34
fv3jedi_field_mod::field_clen
integer, parameter, public field_clen
Definition: fv3jedi_field_mod.f90:31