9 use fckit_mpi_module,
only: fckit_mpi_comm
12 use datetime_mod,
only: datetime
13 use type_bump,
only: bump_type
14 use unstructured_interpolation_mod,
only: unstrc_interp
17 use ufo_locs_mod,
only: ufo_locs, ufo_locs_time_mask
18 use ufo_geovals_mod,
only: ufo_geovals
36 integer :: isc, iec, jsc, jec, npz, ngrid
37 character(len=2048) :: interp_method
39 type(unstrc_interp) :: unsinterp
40 type(fckit_mpi_comm) :: comm
63 type(ufo_locs),
intent(in) :: locs
72 self%ngrid = geom%ngrid
73 self%comm = geom%f_comm
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)
86 call self%unsinterp%create( geom%f_comm, self%nnear,
'barycent', &
88 locs%nlocs, locs%lat, locs%lon )
98 if (trim(self%interp_method) ==
'bump')
call self%bump%delete()
100 call self%unsinterp%delete()
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
116 integer :: gv, n, ji, jj, jlev
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(:)
125 call ufo_locs_time_mask(locs, t1, t2, time_mask)
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
137 geovals%linit = .true.
142 allocate(field_us(self%ngrid))
143 allocate(geovals_all(locs%nlocs, self%npz+1))
144 allocate(geovals_tmp(locs%nlocs))
146 do gv = 1, geovals%nvar
151 call get_field(fields, fv3jedi_name, field)
155 geovals_all = 0.0_kind_real
159 if ( trim(self%interp_method) ==
'bump' .and. &
160 .not.field%integerfield .and. trim(field%space)==
'magnitude' )
then
162 call self%bump%apply(field%npz, field%array, locs%nlocs, geovals_all(:,1:field%npz))
166 do jlev = 1, field%npz
168 do jj = field%jsc, field%jec
169 do ji = field%isc, field%iec
171 field_us(n) = field%array(ji, jj, jlev)
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
181 elseif (trim(field%space)==
'direction')
then
184 call abor1_ftn(
"fv3jedi_getvalues_mod.fill_geovals: interpolation for this kind of "// &
185 "field is not supported. FieldName: "// trim(field%fv3jedi_name))
187 geovals_all(1:locs%nlocs, jlev) = geovals_tmp(1:locs%nlocs)
195 if (time_mask(n)) geovals%geovals(gv)%vals(1:field%npz, n) = geovals_all(n, 1:field%npz)
201 deallocate(geovals_all)
202 deallocate(geovals_tmp)
203 deallocate(time_mask)