FV3-JEDI
fv3jedi_getvalues_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 ! fckit
9 use fckit_mpi_module, only: fckit_mpi_comm
10 
11 ! oops
12 use datetime_mod, only: datetime
13 use type_bump, only: bump_type
14 use unstructured_interpolation_mod, only: unstrc_interp
15 
16 ! ufo
17 use ufo_locs_mod, only: ufo_locs, ufo_locs_time_mask
18 use ufo_geovals_mod, only: ufo_geovals
19 
20 ! fv3jedi uses
28 
29 ! --------------------------------------------------------------------------------------------------
30 
31 implicit none
32 private
34 
35 type, abstract :: fv3jedi_getvalues_base
36  integer :: isc, iec, jsc, jec, npz, ngrid
37  character(len=2048) :: interp_method
38  integer :: nnear = 4
39  type(unstrc_interp) :: unsinterp
40  type(fckit_mpi_comm) :: comm
41  type(fv3jedi_bump_interp) :: bump
42  contains
43  procedure, public :: create
44  procedure, public :: delete
45  procedure, public :: fill_geovals
46  generic, public :: set_trajectory => fill_geovals
47  generic, public :: fill_geovals_tl => fill_geovals
49 
51 end type fv3jedi_getvalues
52 
53 ! --------------------------------------------------------------------------------------------------
54 
55 contains
56 
57 ! --------------------------------------------------------------------------------------------------
58 
59 subroutine create(self, geom, locs)
60 
61 class(fv3jedi_getvalues_base), intent(inout) :: self
62 type(fv3jedi_geom), intent(in) :: geom
63 type(ufo_locs), intent(in) :: locs
64 
65 ! Geometry
66 ! --------
67 self%isc = geom%isc
68 self%iec = geom%iec
69 self%jsc = geom%jsc
70 self%jec = geom%jec
71 self%npz = geom%npz
72 self%ngrid = geom%ngrid
73 self%comm = geom%f_comm
74 
75 ! Create interpolation weights
76 ! ----------------------------
77 self%interp_method = trim(geom%interp_method)
78 if (trim(self%interp_method) == 'bump') then
79  call self%bump%setup(geom%f_comm, geom%isc, geom%iec, geom%jsc, geom%jec, geom%npz, &
80  geom%grid_lon(geom%isc:geom%iec, geom%jsc:geom%jec), &
81  geom%grid_lat(geom%isc:geom%iec, geom%jsc:geom%jec), &
82  locs%nlocs, locs%lon, locs%lat, 55555)
83 endif
84 
85 ! Always create unstructured interpolation as it is used for special case fields, e.g. integers
86 call self%unsinterp%create( geom%f_comm, self%nnear, 'barycent', &
87  self%ngrid, rad2deg*geom%lat_us, rad2deg*geom%lon_us, &
88  locs%nlocs, locs%lat, locs%lon )
89 
90 end subroutine create
91 
92 ! --------------------------------------------------------------------------------------------------
93 
94 subroutine delete(self)
95 
96 class(fv3jedi_getvalues_base), intent(inout) :: self
97 
98 if (trim(self%interp_method) == 'bump') call self%bump%delete()
99 
100 call self%unsinterp%delete()
101 
102 end subroutine delete
103 
104 ! --------------------------------------------------------------------------------------------------
105 
106 subroutine fill_geovals(self, geom, fields, t1, t2, locs, geovals)
107 
108 class(fv3jedi_getvalues_base), intent(inout) :: self
109 type(fv3jedi_geom), intent(in) :: geom
110 type(fv3jedi_field), intent(in) :: fields(:)
111 type(datetime), intent(in) :: t1
112 type(datetime), intent(in) :: t2
113 type(ufo_locs), intent(in) :: locs
114 type(ufo_geovals), intent(inout) :: geovals
115 
116 integer :: gv, n, ji, jj, jlev
117 type(fv3jedi_field), pointer :: field
118 character(len=field_clen) :: fv3jedi_name
119 logical, allocatable :: time_mask(:)
120 real(kind=kind_real), allocatable :: field_us(:)
121 real(kind=kind_real), allocatable :: geovals_all(:,:), geovals_tmp(:)
122 
123 ! Get mask for locations in this time window
124 ! ------------------------------------------
125 call ufo_locs_time_mask(locs, t1, t2, time_mask)
126 
127 
128 ! Allocate geovals
129 ! ----------------
130 if (.not. geovals%linit) then
131  do gv = 1, geovals%nvar
132  geovals%geovals(gv)%nval = fields(gv)%npz
133  allocate(geovals%geovals(gv)%vals(geovals%geovals(gv)%nval, geovals%geovals(gv)%nlocs))
134  geovals%geovals(gv)%vals = 0.0_kind_real
135  enddo
136 endif
137 geovals%linit = .true.
138 
139 
140 ! Loop over GeoVaLs
141 ! -----------------
142 allocate(field_us(self%ngrid))
143 allocate(geovals_all(locs%nlocs, self%npz+1))
144 allocate(geovals_tmp(locs%nlocs))
145 
146 do gv = 1, geovals%nvar
147 
148  ! Get GeoVaLs field
149  ! -----------------
150  call long_name_to_fv3jedi_name(fields, trim(geovals%variables(gv)), fv3jedi_name)
151  call get_field(fields, fv3jedi_name, field)
152 
153  ! Interpolation
154  ! -------------
155  geovals_all = 0.0_kind_real
156 
157  ! Can optionally interpolate real valued magnitude fields with bump
158  ! -----------------------------------------------------------------
159  if ( trim(self%interp_method) == 'bump' .and. &
160  .not.field%integerfield .and. trim(field%space)=='magnitude' ) then
161 
162  call self%bump%apply(field%npz, field%array, locs%nlocs, geovals_all(:,1:field%npz))
163 
164  else ! Otherwise use unstructured interpolation
165 
166  do jlev = 1, field%npz
167  n = 0
168  do jj = field%jsc, field%jec
169  do ji = field%isc, field%iec
170  n = n + 1
171  field_us(n) = field%array(ji, jj, jlev)
172  enddo
173  enddo
174 
175  ! Conditions for integer and directional fields
176  ! ---------------------------------------------
177  if (.not. field%integerfield .and. trim(field%space)=='magnitude') then
178  call self%unsinterp%apply(field_us, geovals_tmp)
179  elseif (field%integerfield) then
180  call unsinterp_integer_apply(self%unsinterp, field_us, geovals_tmp)
181  elseif (trim(field%space)=='direction') then
182  call unsinterp_nearest_apply(self%unsinterp, field_us, geovals_tmp)
183  else
184  call abor1_ftn("fv3jedi_getvalues_mod.fill_geovals: interpolation for this kind of "// &
185  "field is not supported. FieldName: "// trim(field%fv3jedi_name))
186  endif
187  geovals_all(1:locs%nlocs, jlev) = geovals_tmp(1:locs%nlocs)
188  enddo
189 
190  endif
191 
192  ! Fill GeoVaLs relevant to this window
193  ! ------------------------------------
194  do n = 1,locs%nlocs
195  if (time_mask(n)) geovals%geovals(gv)%vals(1:field%npz, n) = geovals_all(n, 1:field%npz)
196  enddo
197 
198 enddo
199 
200 deallocate(field_us)
201 deallocate(geovals_all)
202 deallocate(geovals_tmp)
203 deallocate(time_mask)
204 
205 end subroutine fill_geovals
206 
207 ! --------------------------------------------------------------------------------------------------
208 
209 end module fv3jedi_getvalues_mod
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
fv3jedi_getvalues_mod::delete
subroutine delete(self)
Definition: fv3jedi_getvalues_mod.f90:95
fv3jedi_getvalues_mod
Definition: fv3jedi_getvalues_mod.f90:6
fv3jedi_bump_interp_mod::fv3jedi_bump_interp
Definition: fv3jedi_bump_interp_mod.f90:31
fv3jedi_constants_mod::rad2deg
real(kind=kind_real), parameter, public rad2deg
Definition: fv3jedi_constants_mod.f90:13
fv3jedi_interpolation_mod
Definition: fv3jedi_interpolation_mod.f90:6
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_interpolation_mod::unsinterp_nearest_apply
subroutine, public unsinterp_nearest_apply(unsinterp, field_in, field_ou)
Definition: fv3jedi_interpolation_mod.f90:341
fv3jedi_field_mod::get_field
Definition: fv3jedi_field_mod.f90:25
fv3jedi_getvalues_mod::create
subroutine create(self, geom, locs)
Definition: fv3jedi_getvalues_mod.f90:60
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_constants_mod
Definition: fv3jedi_constants_mod.f90:6
fv3jedi_interpolation_mod::unsinterp_integer_apply
subroutine, public unsinterp_integer_apply(unsinterp, field_in, field_ou)
Definition: fv3jedi_interpolation_mod.f90:289
fv3jedi_field_mod::long_name_to_fv3jedi_name
subroutine, public long_name_to_fv3jedi_name(fields, long_name, fv3jedi_name)
Definition: fv3jedi_field_mod.f90:268
fv3jedi_getvalues_mod::fill_geovals
subroutine fill_geovals(self, geom, fields, t1, t2, locs, geovals)
Definition: fv3jedi_getvalues_mod.f90:107
fv3jedi_getvalues_mod::fv3jedi_getvalues_base
Definition: fv3jedi_getvalues_mod.f90:35
fv3jedi_bump_interp_mod
Definition: fv3jedi_bump_interp_mod.f90:7
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_field_mod::fv3jedi_field
Definition: fv3jedi_field_mod.f90:36
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_getvalues_mod::fv3jedi_getvalues
Definition: fv3jedi_getvalues_mod.f90:50
fv3jedi_field_mod::field_clen
integer, parameter, public field_clen
Definition: fv3jedi_field_mod.f90:31