11 use missing_values_mod
32 INTEGER,
INTENT(IN) :: nobs
33 REAL(kind_real),
INTENT(IN) :: zobs(:)
34 REAL(kind_real),
INTENT(IN) :: yobs(:)
36 REAL(kind_real),
INTENT(OUT) :: osigma(:)
37 REAL(kind_real),
INTENT(OUT) :: om1(:,:)
38 LOGICAL,
INTENT(OUT) :: om1_error
41 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSRO_setOM1"
45 REAL(kind_real) :: frac_err
46 REAL(kind_real) :: omat(nobs,nobs)
47 REAL(kind_real),
ALLOCATABLE :: gradient(:)
49 IF (rmatrix % satid <= 0)
THEN
55 ALLOCATE (gradient(rmatrix % num_heights - 1))
57 DO i = 1, rmatrix % num_heights - 1
61 gradient(i) = (rmatrix % frac_err(i + 1) - rmatrix % frac_err(i)) / &
62 (rmatrix % height(i + 1) - rmatrix % height(i))
80 IF (zobs(n) < rmatrix % height(i + 1) .OR. &
81 i + 1 >= rmatrix % num_heights)
THEN
91 frac_err = rmatrix % frac_err(i) + &
92 gradient(i) * (zobs(n) - rmatrix % height(i))
96 osigma(n) = max(frac_err * yobs(n), rmatrix % min_error)
100 omat(n,n) = osigma(n) ** 2
110 omat(n,i) = sqrt(omat(n,n) * omat(i,i)) * &
111 exp(-rmatrix % clen * abs(zobs(i) - zobs(n)))
113 omat(i,n) = omat(n,i)
130 IF (returncode /= 0) om1_error = .true.
132 DEALLOCATE (gradient)
subroutine, public ops_gpsro_setom1(nobs, zobs, yobs, Rmatrix, OSigma, OM1, OM1_error)
Fortran module for utility routines used in calculating the observation uncertainties,...
Fortran module with various useful routines.
subroutine, public invertmatrix(n, m, a, status, matrix)