Go to the documentation of this file.
19 use missing_values_mod
22 use fckit_log_module,
only : fckit_log
43 use fckit_configuration_module,
only: fckit_configuration
46 type(fckit_configuration),
intent(in) :: f_conf
61 real(kind_real),
intent(inout) :: hofx(:)
62 type(c_ptr),
value,
intent(in) :: obss
64 character(len=*),
parameter :: myname_ =
"ufo_groundgnss_metoffice_simobs"
65 integer,
parameter :: max_string = 800
67 character(max_string) :: err_msg
68 character(max_string) :: message
76 real(kind_real),
allocatable :: zStation(:)
78 write(err_msg,*)
"TRACE: ufo_groundgnss_metoffice_simobs: begin"
79 call fckit_log%info(err_msg)
82 if (geovals%nlocs /=
size(hofx))
then
83 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
84 call abor1_ftn(err_msg)
94 nobs = obsspace_get_nlocs(obss)
95 allocate(zstation(nobs))
97 call obsspace_get_db(obss,
"MetaData",
"station_height", zstation)
99 write(err_msg,*)
"TRACE: ufo_groundgnss_metoffice_simobs: begin observation loop, nobs = ", nobs
100 call fckit_log%info(err_msg)
102 obs_loop:
do iobs = 1, nobs
106 rho_heights % vals(:,iobs), &
107 theta_heights % vals(:,iobs), &
108 prs % vals(:,iobs), &
114 write(message,
'(A,10I6)')
"Size of hofx = ", shape(hofx)
115 call fckit_log%info(message)
116 write(message,
'(A,1F2.4)')
"hofx(iobs) = ", hofx(iobs)
117 call fckit_log%info(message)
120 write(err_msg,*)
"TRACE: ufo_groundgnss_metoffice_simobs: completed"
121 call fckit_log%info(err_msg)
137 INTEGER,
INTENT(IN) :: nlevP
138 INTEGER,
INTENT(IN) :: nlevq
139 REAL(kind_real),
INTENT(IN) :: za(1:nlevP)
140 REAL(kind_real),
INTENT(IN) :: zb(1:nlevq)
141 REAL(kind_real),
INTENT(IN) :: pressure(1:nlevP)
142 REAL(kind_real),
INTENT(IN) :: humidity(1:nlevq)
143 INTEGER,
INTENT(IN) :: nobs
145 REAL(kind_real),
INTENT(IN) :: zStation
146 REAL(kind_real),
INTENT(INOUT) :: Model_ZTD
152 REAL(kind_real) :: pN(nlevq)
153 REAL(kind_real) :: refrac(nlevq)
156 REAL(kind_real) :: TopCorrection
160 integer,
parameter :: max_string = 800
161 character(len=*),
parameter :: myname_ =
"Ops_Groundgnss_ForwardModel"
166 REAL(kind_real) :: x(1:nlevP+nlevQ)
167 character(max_string) :: err_msg
168 character(max_string) :: message
171 IF (nlevp /= nlevq + 1)
THEN
172 write(err_msg,*) myname_ //
':' //
' Data must be on a staggered grid nlevp, nlevq = ', nlevp, nlevq
173 call fckit_log % warning(err_msg)
174 write(err_msg,*) myname_ //
':' //
' error: number of levels inconsistent!'
175 call abor1_ftn(err_msg)
178 nstate = nlevp + nlevq
179 x(1:nlevp) = pressure
180 x(nlevp+1:nstate) = humidity
201 model_ztd = model_ztd + topcorrection
203 write(message,
'(A,F10.4)')
"Model_ZTD = ", model_ztd
204 call fckit_log%info(message)
subroutine ufo_groundgnss_metoffice_setup(self, f_conf)
character(len=maxvarlen), parameter, public var_zi
Fortran derived type for groundgnss trajectory.
subroutine, public ops_groundgnss_ztd(nlevq, refrac, zb, zStation, Model_ZTD)
subroutine, public ops_groundgnss_topcorrection(pN, nlevq, TopCorrection)
subroutine, public ufo_refractivity(nlevq, nlevP, za, zb, x, pN, refracerr, refrac)
subroutine ops_groundgnss_forwardmodel(nlevP, nlevq, za, zb, pressure, humidity, nobs, zStation, Model_ZTD)
character(len=maxvarlen), parameter, public var_prsi
Fortran module for ground based gnss Met Office forward operator.
character(len=maxvarlen), parameter, public var_z
subroutine, public ufo_geovals_get_var(self, varname, geoval)
character(len=maxvarlen), parameter, public var_q
subroutine ufo_groundgnss_metoffice_simobs(self, geovals, hofx, obss)
type to hold interpolated fields required by the obs operators
type to hold interpolated field for one variable, one observation
type(registry_t), public ufo_geovals_registry
Linked list interface - defines registry_t type.