20 use missing_values_mod
22 use fckit_log_module,
only : fckit_log
29 integer :: nval, nlocs, iflip
30 real(kind_real),
allocatable :: prs(:,:), t(:,:), q(:,:), gph(:,:), gph_sfc(:,:)
47 type(c_ptr),
value,
intent(in) :: obss
48 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp1d_tlad_settraj"
49 character(max_string) :: err_msg
50 type(
ufo_geoval),
pointer :: t, q, prs, gph, gph_sfc
52 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_tlad_settraj: begin"
53 call fckit_log%info(err_msg)
66 self%nlocs = obsspace_get_nlocs(obss)
68 if (self%nlocs > 0)
then
70 if (prs%vals(1,1) .lt. prs%vals(prs%nval,1) )
then
72 write(err_msg,
'(a)')
' ufo_gnssro_bndropp1d_tlad_settraj:'//new_line(
'a')// &
73 ' Model vertical height profile is in descending order,'//new_line(
'a')// &
74 ' but ROPP requires it to be ascending order, need flip'
75 call fckit_log%info(err_msg)
78 allocate(self%t(self%nval,self%nlocs))
79 allocate(self%q(self%nval,self%nlocs))
80 allocate(self%prs(self%nval,self%nlocs))
81 allocate(self%gph(self%nval,self%nlocs))
82 allocate(self%gph_sfc(1,self%nlocs))
87 self%gph_sfc = gph_sfc%vals
97 use ropp_fm_types,
only: state1dfm
98 use ropp_fm_types,
only: obs1dbangle
99 use datetimetypes,
only: dp
103 real(kind_real),
intent(inout) :: hofx(:)
104 type(c_ptr),
value,
intent(in) :: obss
106 type(state1dfm) :: x,x_tl
107 type(obs1dbangle) :: y,y_tl
109 integer :: iobs,nlev, nlocs
112 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp1d_simobs_tl"
113 character(max_string) :: err_msg
114 real(kind=dp) :: ob_time
118 real(kind_real),
allocatable :: gph_d_zero(:)
119 real(kind_real) :: gph_sfc_d_zero
120 real(kind_real),
allocatable :: obsLat(:), obsLon(:), obsImpP(:), obsLocR(:), obsGeoid(:)
123 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_simobs_tl: begin"
124 call fckit_log%info(err_msg)
127 if (.not. self%ltraj)
then
128 write(err_msg,*) myname_,
' trajectory wasnt set!'
129 call abor1_ftn(err_msg)
133 if (geovals%nlocs /=
size(hofx))
then
134 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
135 call abor1_ftn(err_msg)
146 allocate(gph_d_zero(nlev))
151 allocate(obslon(nlocs))
152 allocate(obslat(nlocs))
153 allocate(obsimpp(nlocs))
154 allocate(obslocr(nlocs))
155 allocate(obsgeoid(nlocs))
156 call obsspace_get_db(obss,
"MetaData",
"longitude", obslon)
157 call obsspace_get_db(obss,
"MetaData",
"latitude", obslat)
158 call obsspace_get_db(obss,
"MetaData",
"impact_parameter", obsimpp)
159 call obsspace_get_db(obss,
"MetaData",
"earth_radius_of_curvature", obslocr)
160 call obsspace_get_db(obss,
"MetaData",
"geoid_height_above_reference_ellipsoid", obsgeoid)
165 obs_loop:
do iobs = 1, nlocs
177 self%gph_sfc(1,iobs), &
181 where(x%shum .le. 1e-8) x%shum = 1e-8
189 prs_d%vals(:,iobs), &
204 call ropp_fm_bangle_1d_tl(x,x_tl,y, y_tl%bangle(nvprof))
205 hofx(iobs) = y_tl%bangle(nvprof)
219 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_simobs_tl: complete"
220 call fckit_log%info(err_msg)
230 use ropp_fm_types,
only: state1dfm
231 use ropp_fm_types,
only: obs1dbangle
232 use typesizes,
only: wp => eightbytereal
233 use datetimetypes,
only: dp
238 real(kind_real),
intent(in) :: hofx(:)
239 type(c_ptr),
value,
intent(in) :: obss
240 real(c_double) :: missing
244 real(kind_real),
parameter :: gph_sfc_d_zero = 0.0
245 real(kind_real),
allocatable :: gph_d_zero(:)
247 real(kind_real),
allocatable :: obsLat(:), obsLon(:), obsImpP(:), obsLocR(:), obsGeoid(:)
248 type(state1dfm) :: x,x_ad
249 type(obs1dbangle) :: y,y_ad
250 integer :: iobs,nlev, nlocs
252 real(kind=dp) :: ob_time
253 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp1d_simobs_ad"
254 character(max_string) :: err_msg
256 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_simobs_ad: begin"
257 call fckit_log%info(err_msg)
258 if (self%nlocs > 0)
then
260 if (.not. self%ltraj)
then
261 write(err_msg,*) myname_,
' trajectory wasnt set!'
262 call abor1_ftn(err_msg)
265 if (geovals%nlocs /=
size(hofx))
then
266 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
267 call abor1_ftn(err_msg)
278 allocate(gph_d_zero(nlev))
282 allocate(obslon(nlocs))
283 allocate(obslat(nlocs))
284 allocate(obsimpp(nlocs))
285 allocate(obslocr(nlocs))
286 allocate(obsgeoid(nlocs))
288 call obsspace_get_db(obss,
"MetaData",
"longitude", obslon)
289 call obsspace_get_db(obss,
"MetaData",
"latitude", obslat)
290 call obsspace_get_db(obss,
"MetaData",
"impact_parameter", obsimpp)
291 call obsspace_get_db(obss,
"MetaData",
"earth_radius_of_curvature", obslocr)
292 call obsspace_get_db(obss,
"MetaData",
"geoid_height_above_reference_ellipsoid", obsgeoid)
294 missing = missing_value(missing)
298 obs_loop:
do iobs = 1, nlocs
300 if (hofx(iobs) .gt. missing)
then
312 self%gph_sfc(1,iobs),&
320 prs_d%vals(:,iobs), &
327 x_ad%temp(:) = 0.0_wp
328 x_ad%pres(:) = 0.0_wp
329 x_ad%shum(:) = 0.0_wp
330 x_ad%geop(:) = 0.0_wp
342 y_ad%bangle(:) = 0.0_wp
345 y_ad%bangle(nvprof) = y_ad%bangle(nvprof) + hofx(iobs)
346 call ropp_fm_bangle_1d_ad(x,x_ad,y,y_ad)
350 prs_d%vals(:,iobs), &
352 nlev, x_ad, self%iflip)
367 deallocate(gph_d_zero)
370 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_simobs_ad: complete"
371 call fckit_log%info(err_msg)
383 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp_tlad_delete"
386 if (
allocated(self%prs))
deallocate(self%prs)
387 if (
allocated(self%t))
deallocate(self%t)
388 if (
allocated(self%q))
deallocate(self%q)
389 if (
allocated(self%gph))
deallocate(self%gph)
390 if (
allocated(self%gph_sfc))
deallocate(self%gph_sfc)
type(registry_t), public ufo_geovals_registry
Linked list interface - defines registry_t type.
subroutine, public ufo_geovals_get_var(self, varname, geoval)
Fortran module for gnssro bending angle ropp1d tangent linear and adjoint following the ROPP (2018 Au...
subroutine ufo_gnssro_bndropp1d_simobs_ad(self, geovals, hofx, obss)
integer, parameter max_string
subroutine ufo_gnssro_bndropp1d_tlad_settraj(self, geovals, obss)
subroutine ufo_gnssro_bndropp1d_tlad_delete(self)
subroutine ufo_gnssro_bndropp1d_simobs_tl(self, geovals, hofx, obss)
Fortran module to handle gnssro bending angle observations following the ROPP (2018 Aug) implementati...
subroutine, public init_ropp_1d_statevec_ad(temp_d, shum_d, pres_d, phi_d, lm, x_ad, iflip)
subroutine, public init_ropp_1d_statevec(step_time, rlon, rlat, temp, shum, pres, phi, lm, phi_sfc, x, iflip)
subroutine, public ropp_tidy_up_tlad_1d(x, x_p, y, y_p)
subroutine, public init_ropp_1d_obvec_tlad(iloop, nvprof, obs_impact, rlat, rlon, roc, undulat, y, y_p)
character(len=maxvarlen), parameter, public var_prs
character(len=maxvarlen), parameter, public var_q
character(len=maxvarlen), parameter, public var_sfc_geomz
character(len=maxvarlen), parameter, public var_z
character(len=maxvarlen), parameter, public var_ts
Fortran module to perform linear interpolation.
type to hold interpolated field for one variable, one observation
type to hold interpolated fields required by the obs operators
Fortran derived type for gnssro trajectory.