9 use fckit_configuration_module,
only: fckit_configuration
13 use oops_variables_mod
14 use missing_values_mod
16 use fckit_log_module,
only : fckit_log
26 character(len=max_string) :: variable
27 character(len=max_string) :: errmodel
28 type(oops_variables),
public :: obsvar
38 use oops_variables_mod
41 type(c_ptr),
value,
intent(in) :: obspace
42 type(fckit_configuration),
intent(in) :: f_conf
43 character(len=:),
allocatable :: str
45 self%errmodel =
"NBAM"
46 if (f_conf%has(
"errmodel"))
then
47 call f_conf%get_or_die(
"errmodel",str)
64 use fckit_log_module,
only : fckit_log
68 real(kind_real),
allocatable :: obsz(:), obslat(:)
69 real(kind_real),
allocatable :: obsimph(:),obsimpp(:),obsgeoid(:),obslocr(:)
70 real(kind_real),
allocatable :: obsvalue(:)
71 real(kind_real),
allocatable :: obserr(:)
72 integer(c_int),
allocatable :: obssaid(:)
73 integer(c_int),
allocatable :: qcflags(:)
75 character(max_string) :: err_msg
78 nobs = obsspace_get_nlocs(self%obsdb)
79 allocate(qcflags(nobs))
80 allocate(obserr(nobs))
84 call obsspace_get_db(self%obsdb,
"FortranQC", trim(self%variable),qcflags )
87 select case (trim(self%variable))
90 case (
"bending_angle")
92 allocate(obsimpp(nobs))
93 allocate(obsgeoid(nobs))
94 allocate(obslocr(nobs))
95 allocate(obsimph(nobs))
96 call obsspace_get_db(self%obsdb,
"MetaData",
"impact_parameter", obsimpp)
97 call obsspace_get_db(self%obsdb,
"MetaData",
"geoid_height_above_reference_ellipsoid",obsgeoid)
98 call obsspace_get_db(self%obsdb,
"MetaData",
"earth_radius_of_curvature", obslocr)
99 obsimph(:) = obsimpp(:) - obsgeoid(:) - obslocr(:)
101 select case (trim(self%errmodel))
103 allocate(obssaid(nobs))
104 allocate(obslat(nobs))
105 call obsspace_get_db(self%obsdb,
"MetaData",
"occulting_sat_id", obssaid)
106 call obsspace_get_db(self%obsdb,
"MetaData",
"latitude", obslat)
108 write(err_msg,*)
"ufo_roobserror_mod: setting up bending_angle obs error with NBAM method"
109 call fckit_log%info(err_msg)
113 call obsspace_put_db(self%obsdb,
"FortranERR", trim(self%variable), obserr)
116 allocate(obsvalue(nobs))
117 call obsspace_get_db(self%obsdb,
"ObsValue",
"bending_angle", obsvalue)
119 write(err_msg,*)
"ufo_roobserror_mod: setting up bending_angle obs error with ECMWF method"
120 call fckit_log%info(err_msg)
123 call obsspace_put_db(self%obsdb,
"FortranERR", trim(self%variable), obserr)
125 allocate(obsvalue(nobs))
126 allocate(obslat(nobs))
127 call obsspace_get_db(self%obsdb,
"ObsValue",
"bending_angle", obsvalue)
128 call obsspace_get_db(self%obsdb,
"MetaData",
"latitude", obslat)
130 write(err_msg,*)
"ufo_roobserror_mod: setting up bending_angle obs error with NRL method"
131 call fckit_log%info(err_msg)
135 call obsspace_put_db(self%obsdb,
"FortranERR", trim(self%variable), obserr)
138 write(err_msg,*)
"ufo_roobserror_mod: bending_angle error model must be NBAM, ECMWF, or NRL"
139 call fckit_log%info(err_msg)
140 call fckit_log%info(err_msg)
148 case (
"refractivity")
150 select case (trim(self%errmodel))
155 allocate(obslat(nobs))
156 call obsspace_get_db(self%obsdb,
"MetaData",
"altitude", obsz)
157 call obsspace_get_db(self%obsdb,
"MetaData",
"latitude", obslat)
159 write(err_msg,*)
"ufo_roobserror_mod: setting up refractivity obs error with NBAM method"
160 call fckit_log%info(err_msg)
164 call obsspace_put_db(self%obsdb,
"FortranERR", trim(self%variable), obserr)
167 write(err_msg,*)
"ufo_roobserror_mod: ECMWF refractivity error model is not available now"
168 call fckit_log%info(err_msg)
171 write(err_msg,*)
"ufo_roobserror_mod: only NBAM refractivity model is available now"
172 call fckit_log%info(err_msg)
176 call abor1_ftn(
"ufo_roobserror_prior: variable has to be bending_angle or refractivity")