12 use kinds,
only: kind_real
13 use missing_values_mod,
only: missing_value
14 use fckit_log_module,
only: fckit_log
31 GPSRO_vert_interp_ops, &
32 GPSRO_min_temp_grad, &
33 GPSRO_cost_funct_test, & ! Threshold value for the cost function convergence test
34 GPSRO_y_test, & ! Threshold value for the yobs-ysol tes
35 GPSRO_n_iteration_test, & ! Maximum number of iterations
36 GPSRO_Delta_factor, & ! Delta
37 GPSRO_Delta_ct2, & ! Delta observations
38 GPSRO_OB_test, & ! Threshold value for the O-B test
59 INTEGER,
INTENT(IN) :: nlevp
60 INTEGER,
INTENT(IN) :: nlevq
61 REAL(kind_real),
INTENT(IN) :: bm1(:,:)
62 REAL(kind_real),
INTENT(IN) :: bsig(:)
65 LOGICAL,
INTENT(IN) :: gpsro_pseudo_ops
66 LOGICAL,
INTENT(IN) :: gpsro_vert_interp_ops
67 REAL(kind_real),
INTENT(IN) :: gpsro_min_temp_grad
68 REAL(kind_real),
INTENT(IN) :: gpsro_cost_funct_test
69 REAL(kind_real),
INTENT(IN) :: gpsro_y_test
70 INTEGER,
INTENT(IN) :: gpsro_n_iteration_test
71 REAL(kind_real),
INTENT(IN) :: gpsro_delta_ct2
72 REAL(kind_real),
INTENT(IN) :: gpsro_delta_factor
73 REAL(kind_real),
INTENT(IN) :: gpsro_ob_test
74 LOGICAL,
INTENT(IN) :: capsupersat
75 LOGICAL,
INTENT(OUT) :: baerr
76 REAL(kind_real),
INTENT(INOUT) :: tb(nlevq)
77 REAL(kind_real),
INTENT(INOUT) :: ts(nlevq)
78 REAL(kind_real),
INTENT(INOUT) :: o_bdiff
79 REAL(kind_real),
INTENT(INOUT) :: dfs
82 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSRO_Do1DVar_BA"
83 INTEGER,
PARAMETER :: max_string = 800
92 LOGICAL :: do1dvar_error
93 LOGICAL :: ran_iteration
94 REAL(kind_real) :: j_pen
95 REAL(kind_real) :: xb(nlevp+nlevq)
96 REAL(kind_real) :: x(nlevp+nlevq)
97 REAL(kind_real) :: amat(nlevp+nlevq,nlevp+nlevq)
98 REAL(kind_real),
ALLOCATABLE :: zobs(:)
99 REAL(kind_real),
ALLOCATABLE :: yobs(:)
100 REAL(kind_real),
ALLOCATABLE :: yb(:)
101 REAL(kind_real),
ALLOCATABLE :: ycalc(:)
102 REAL(kind_real),
ALLOCATABLE :: om1(:,:)
103 INTEGER,
ALLOCATABLE :: index_packed(:)
104 REAL(kind_real),
ALLOCATABLE :: model_heights(:)
105 REAL(kind_real),
ALLOCATABLE :: refractivity(:)
106 INTEGER :: nreflevels
107 CHARACTER(LEN=max_string) :: message
109 REAL(kind_real) :: temp_rad_curv
110 REAL(kind_real) :: temp_latitude
111 REAL(kind_real) :: temp_undulation
117 do1dvar_error = .false.
119 ran_iteration = .false.
124 ob % BendingAngle(:) % PGEFinal = 1.0
136 gpsro_vert_interp_ops, &
137 gpsro_min_temp_grad, &
144 xb(1:nlevp) = 1.0e-2 * back % p(:)
145 xb(nlevp + 1:nlevp+nlevq) = 1.0e3 * back % q(:)
149 nobs = count(ob % BendingAngle(:) % value /= missing_value(ob % BendingAngle(1) % value) .AND. &
150 ob % ImpactParam(:) % value /= missing_value(ob % ImpactParam(1) % value) .AND. &
151 ob % qc_flags(:) == 0)
153 WRITE (message,
'(A,I0)')
'size of input obs vector ',
SIZE (ob % BendingAngle(:) % value)
154 CALL fckit_log % info(message)
155 WRITE (message,
'(A,I0)')
'size of packed obs vector ', nobs
156 CALL fckit_log % info(message)
163 ALLOCATE (index_packed(nobs))
164 index_packed = missing_value(index_packed(1))
167 ALLOCATE (om1(nobs,nobs))
168 ALLOCATE (yobs(nobs))
169 ALLOCATE (zobs(nobs))
171 ALLOCATE (ycalc(nobs))
180 DO i = 1,
SIZE (ob % BendingAngle(:) % Value)
181 IF (ob % BendingAngle(i) % Value /= missing_value(ob % BendingAngle(i) % Value) .AND. &
182 ob % ImpactParam(i) % value /= missing_value(ob % ImpactParam(i) % value) .AND. &
183 ob % qc_flags(i) == 0)
THEN
185 zobs(j) = ob % ImpactParam(i) % value
186 yobs(j) = ob % BendingAngle(i) % Value
187 om1(j,j) = (ob % BendingAngle(i) % oberr)**(-2)
196 IF (all(zobs(:) /= missing_value(zobs(1))) .AND. &
197 all(yobs(:) /= missing_value(yobs(1))) .AND. &
198 .NOT. om1_error)
THEN
200 temp_rad_curv = ob % RO_Rad_Curv % Value
201 temp_latitude = ob % Latitude
202 temp_undulation = ob % RO_geoid_und % value
225 gpsro_n_iteration_test, &
226 gpsro_delta_factor, &
229 gpsro_vert_interp_ops, &
230 gpsro_min_temp_grad, &
239 ran_iteration = .true.
242 do1dvar_error = .true.
244 ob % BendingAngle(:) % PGEFinal = 0.99
248 IF (.NOT. do1dvar_error)
THEN
254 ob % Jcost = 2.0_kind_real * j_pen / real(nobs)
258 ob % p(:) % Value = 1.0e2 * x(1:nlevp)
262 ob % p(i) % ObErr = 1.0e2 * sqrt(amat(i,i))
266 ob % q(:) % Value = 1.0e-3 * x(nlevp + 1:nlevp+nlevq)
272 ob % q(i) % ObErr = 1.0e-3 * sqrt(amat(j,j))
278 ob % SolutBendingAngle(index_packed) = ycalc(1:nobs)
286 IF (j_pen > gpsro_cost_funct_test * real(nobs, kind=kind_real))
THEN
291 ob % BendingAngle(:) % PGEFinal = 0.8
300 IF (abs(ob % BendingAngle(index_packed(i)) % Value - ob % SolutBendingAngle(index_packed(i))) < &
301 (gpsro_y_test * ob % BendingAngle(index_packed(i)) % ObErr))
THEN
302 ob % BendingAngle(index_packed(i)) % PGEFinal = 0.1
304 ob % BendingAngle(index_packed(i)) % PGEFinal = 0.7
312 IF (o_bdiff > gpsro_ob_test)
THEN
313 ob % BendingAngle(:) % PGEFinal = 0.6
318 ob % BendingAngle(:) % PGEFinal = 0.58
323 IF (ran_iteration)
THEN
324 ob % BendingAngle(:) % PGEFinal = 0.9
327 ob % SolutBendingAngle(index_packed) = ycalc(1:nobs)
330 ob % p(:) % Value = 1.0e2 * x(1:nlevp)
331 ob % q(:) % Value = 1.0e-3 * x(nlevp + 1:nlevp+nlevq)
335 ob % Jcost = 2.0_kind_real * j_pen / nobs
337 ELSE IF (om1_error)
THEN
339 ob % BendingAngle(:) % PGEFinal = 0.85
347 WRITE (message,
'(A)')
'nobs is less than 10: exit Ops_GPSRO_Do1DVar_BA'
348 CALL fckit_log % info(message)
349 ob % BendingAngle(:) % PGEFinal = 0.55
353 WRITE (message,
'(A)')
'Error in Ops_Refractivity: exit Ops_GPSRO_Do1DVar_BA'
354 CALL fckit_log % info(message)
355 ob % BendingAngle(:) % PGEFinal = 0.58
Fortran module for gnssro bending angle Met Office forward operator.
subroutine, public ops_gpsro_do1dvar_ba(nlevp, nlevq, BM1, Bsig, Back, Ob, GPSRO_pseudo_ops, GPSRO_vert_interp_ops, GPSRO_min_temp_grad, GPSRO_cost_funct_test, GPSRO_y_test, GPSRO_n_iteration_test, GPSRO_Delta_factor, GPSRO_Delta_ct2, GPSRO_OB_test, capsupersat, BAerr, Tb, Ts, O_Bdiff, DFS)
Fortran module for gnssro bending angle Met Office forward operator.
subroutine, public ops_gpsro_rootsolv_ba(nstate, nlevp, nb, nlevq, Nobs, za, zb, xb, yobs, zobs, Bsig, Bm1, Om1, it, x, yb, ycalc, J_pen, Amat, converged, BAerr, Do1DVar_error, Iter_max, Delta, Delta_ct2, GPSRO_pseudo_ops, GPSRO_vert_interp_ops, GPSRO_min_temp_grad, capsupersat, O_Bdiff, RO_Rad_Curv, Latitude, RO_geoid_und, Tb, Ts, DFS)
Module for containing a general refractivity forward operator and its K-matrix.
subroutine, public ufo_calculate_refractivity(nlevP, nlevq, za, zb, P, q, vert_interp_ops, pseudo_ops, min_temp_grad, refracerr, nRefLevels, refractivity, model_heights, temperature, interp_pressure)
Calculation of the refractivity from the pressure and specific humidity.