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)
276 if (.not.
allocated(t_d%vals))
then
277 t_d%nlocs = self%nlocs
279 allocate(t_d%vals(t_d%nval,t_d%nlocs))
280 t_d%vals = 0.0_kind_real
283 if (.not.
allocated(prs_d%vals))
then
284 prs_d%nlocs = self%nlocs
285 prs_d%nval = self%nval
286 allocate(prs_d%vals(prs_d%nval,prs_d%nlocs))
287 prs_d%vals = 0.0_kind_real
290 if (.not.
allocated(q_d%vals))
then
291 q_d%nlocs = self%nlocs
293 allocate(q_d%vals(q_d%nval,q_d%nlocs))
294 q_d%vals = 0.0_kind_real
297 if (.not. geovals%linit ) geovals%linit=.true.
302 allocate(gph_d_zero(nlev))
306 allocate(obslon(nlocs))
307 allocate(obslat(nlocs))
308 allocate(obsimpp(nlocs))
309 allocate(obslocr(nlocs))
310 allocate(obsgeoid(nlocs))
312 call obsspace_get_db(obss,
"MetaData",
"longitude", obslon)
313 call obsspace_get_db(obss,
"MetaData",
"latitude", obslat)
314 call obsspace_get_db(obss,
"MetaData",
"impact_parameter", obsimpp)
315 call obsspace_get_db(obss,
"MetaData",
"earth_radius_of_curvature", obslocr)
316 call obsspace_get_db(obss,
"MetaData",
"geoid_height_above_reference_ellipsoid", obsgeoid)
318 missing = missing_value(missing)
322 obs_loop:
do iobs = 1, nlocs
324 if (hofx(iobs) .gt. missing)
then
336 self%gph_sfc(1,iobs),&
344 prs_d%vals(:,iobs), &
351 x_ad%temp(:) = 0.0_wp
352 x_ad%pres(:) = 0.0_wp
353 x_ad%shum(:) = 0.0_wp
354 x_ad%geop(:) = 0.0_wp
366 y_ad%bangle(:) = 0.0_wp
369 y_ad%bangle(nvprof) = y_ad%bangle(nvprof) + hofx(iobs)
370 call ropp_fm_bangle_1d_ad(x,x_ad,y,y_ad)
374 prs_d%vals(:,iobs), &
376 nlev, x_ad, self%iflip)
391 deallocate(gph_d_zero)
394 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp1d_simobs_ad: complete"
395 call fckit_log%info(err_msg)
407 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp_tlad_delete"
410 if (
allocated(self%prs))
deallocate(self%prs)
411 if (
allocated(self%t))
deallocate(self%t)
412 if (
allocated(self%q))
deallocate(self%q)
413 if (
allocated(self%gph))
deallocate(self%gph)
414 if (
allocated(self%gph_sfc))
deallocate(self%gph_sfc)