11 use fckit_configuration_module,
only: fckit_configuration
20 use missing_values_mod
21 use fckit_log_module,
only : fckit_log
23 integer,
parameter :: max_string=800
28 integer :: nval, nlocs
29 real(kind_real),
allocatable :: prs(:,:), t(:,:), q(:,:), gph(:,:), gph_sfc(:,:)
33 real(kind_real),
allocatable :: obslon2d(:), obslat2d(:)
48 type(fckit_configuration),
intent(in) :: f_conf
60 type(c_ptr),
value,
intent(in) :: obss
61 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp2d_tlad_settraj"
62 character(max_string) :: err_msg
63 type(
ufo_geoval),
pointer :: t, q, prs, gph, gph_sfc
66 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp2d_tlad_settraj: begin"
67 call fckit_log%info(err_msg)
79 self%nlocs = obsspace_get_nlocs(obss)
81 allocate(self%t(self%nval,self%nlocs))
82 allocate(self%q(self%nval,self%nlocs))
83 allocate(self%prs(self%nval,self%nlocs))
84 allocate(self%gph(self%nval,self%nlocs))
103 real(kind_real),
intent(inout) :: hofx(:)
104 type(c_ptr),
value,
intent(in) :: obss
106 integer :: iobs,nlev, nlocs, nvprof
108 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp2d_simobs_tl"
109 character(max_string) :: err_msg
113 real(kind_real),
allocatable :: gph_d_zero(:)
114 real(kind_real) :: gph_sfc_d_zero
115 real(kind_real),
allocatable :: obslat(:), obslon(:), obsimpp(:), obslocr(:), obsgeoid(:)
119 n_horiz = self%roconf%n_horiz
121 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp2d_simobs_tl_stub: begin"
122 call fckit_log%info(err_msg)
125 if (.not. self%ltraj)
then
126 write(err_msg,*) myname_,
' trajectory wasnt set!'
127 call abor1_ftn(err_msg)
131 if (geovals%nlocs /=
size(hofx)*n_horiz)
then
132 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
133 call abor1_ftn(err_msg)
144 allocate(gph_d_zero(nlev))
149 allocate(obslon(nlocs))
150 allocate(obslat(nlocs))
151 allocate(obsimpp(nlocs))
152 allocate(obslocr(nlocs))
153 allocate(obsgeoid(nlocs))
154 call obsspace_get_db(obss,
"MetaData",
"longitude", obslon)
155 call obsspace_get_db(obss,
"MetaData",
"latitude", obslat)
156 call obsspace_get_db(obss,
"MetaData",
"impact_parameter", obsimpp)
157 call obsspace_get_db(obss,
"MetaData",
"earth_radius_of_curvature", obslocr)
158 call obsspace_get_db(obss,
"MetaData",
"geoid_height_above_reference_ellipsoid", obsgeoid)
169 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp2d_simobs_tl_stub: complete"
170 call fckit_log%info(err_msg)
183 real(kind_real),
intent(in) :: hofx(:)
184 type(c_ptr),
value,
intent(in) :: obss
185 real(c_double) :: missing
189 real(kind_real),
parameter :: gph_sfc_d_zero = 0.0
190 real(kind_real),
allocatable :: gph_d_zero(:)
192 real(kind_real),
allocatable :: obslat(:), obslon(:), obsimpp(:), obslocr(:), obsgeoid(:)
193 integer :: iobs,nlev, nlocs, nvprof
195 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp2d_simobs_ad"
196 character(max_string) :: err_msg
199 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp2d_simobs_ad_stub: begin"
200 call fckit_log%info(err_msg)
203 if (.not. self%ltraj)
then
204 write(err_msg,*) myname_,
' trajectory wasnt set!'
205 call abor1_ftn(err_msg)
208 n_horiz = self%roconf%n_horiz
211 if (geovals%nlocs /=
size(hofx)*n_horiz)
then
212 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
213 call abor1_ftn(err_msg)
224 allocate(gph_d_zero(nlev))
228 allocate(obslon(nlocs))
229 allocate(obslat(nlocs))
230 allocate(obsimpp(nlocs))
231 allocate(obslocr(nlocs))
232 allocate(obsgeoid(nlocs))
234 call obsspace_get_db(obss,
"MetaData",
"longitude", obslon)
235 call obsspace_get_db(obss,
"MetaData",
"latitude", obslat)
236 call obsspace_get_db(obss,
"MetaData",
"impact_parameter", obsimpp)
237 call obsspace_get_db(obss,
"MetaData",
"earth_radius_of_curvature", obslocr)
238 call obsspace_get_db(obss,
"MetaData",
"geoid_height_above_reference_ellipsoid", obsgeoid)
240 missing = missing_value(missing)
248 deallocate(gph_d_zero)
250 write(err_msg,*)
"TRACE: ufo_gnssro_bndropp2d_simobs_ad_stub: complete"
251 call fckit_log%info(err_msg)
263 character(len=*),
parameter :: myname_=
"ufo_gnssro_bndropp_tlad_delete"
266 if (
allocated(self%prs))
deallocate(self%prs)
267 if (
allocated(self%t))
deallocate(self%t)
268 if (
allocated(self%q))
deallocate(self%q)
269 if (
allocated(self%gph))
deallocate(self%gph)
subroutine, public gnssro_conf_setup(roconf, f_conf)
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 ropp2d tangent linear and adjoint following the ROPP (2018 Au...
subroutine ufo_gnssro_bndropp2d_simobs_ad(self, geovals, hofx, obss)
subroutine ufo_gnssro_bndropp2d_tlad_settraj(self, geovals, obss)
subroutine ufo_gnssro_bndropp2d_tlad_delete(self)
subroutine ufo_gnssro_bndropp2d_simobs_tl(self, geovals, hofx, obss)
subroutine ufo_gnssro_bndropp2d_tlad_setup(self, f_conf)
character(len=maxvarlen), parameter, public var_prs
character(len=maxvarlen), parameter, public var_q
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.