12 use kinds,
only: kind_real
13 use missing_values_mod,
only: missing_value
21 Nobs, & ! size of obs vec.
22 x, & ! current estimate of soltution
24 yobs, & ! observed values
36 INTEGER,
INTENT(IN) :: nstate
37 INTEGER,
INTENT(IN) :: nobs
38 REAL(kind_real),
INTENT(IN) :: x(:)
39 REAL(kind_real),
INTENT(IN) :: xb(:)
40 REAL(kind_real),
INTENT(IN) :: yobs(:)
41 REAL(kind_real),
INTENT(IN) :: ycalc(:)
42 REAL(kind_real),
INTENT(IN) :: bm1(:,:)
43 REAL(kind_real),
INTENT(IN) :: om1(:,:)
44 REAL(kind_real),
INTENT(OUT) :: pen_ob
45 REAL(kind_real),
INTENT(OUT) :: pen_back
46 REAL(kind_real),
INTENT(OUT) :: pen_func
49 REAL(kind_real) :: dx(nstate)
50 REAL(kind_real) :: dy(nobs)
51 REAL(kind_real) :: bdx(nstate)
52 REAL(kind_real) :: ody(nobs)
53 REAL(kind_real) :: j_back
54 REAL(kind_real) :: j_obs
55 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSRO_pen"
63 bdx(:) = matmul(bm1(:,:), dx(:))
67 j_back = dot_product(dx(:), bdx(:))
71 dy(:) = yobs(:) - ycalc(:)
74 WHERE (ycalc(:) == missing_value(ycalc(1)) .OR. &
75 yobs(:) == missing_value(yobs(1)))
82 ody(:) = matmul(om1(:,:), dy(:))
86 j_obs = dot_product(dy(:), ody(:))
90 pen_func = 0.5 * (j_back + j_obs)
93 pen_back = 0.5 * j_back
Calculates GPSRO penalty.
subroutine, public ops_gpsro_pen(Nstate, Nobs, x, xb, yobs, ycalc, BM1, OM1, pen_ob, pen_back, pen_func)