10 use oops_variables_mod
18 type(oops_variables),
public :: obsvars
19 type(oops_variables),
public :: geovars
20 integer,
public,
allocatable :: nlevels(:)
21 real,
public,
allocatable :: coefficients(:)
32 use fckit_configuration_module,
only: fckit_configuration
35 type(fckit_configuration),
intent(in) :: conf
37 character(kind=c_char,len=:),
allocatable :: coord_name
38 character(kind=c_char,len=:),
allocatable :: gvars(:)
39 real(kind=c_double),
allocatable :: coefficients(:)
40 integer(kind=c_int),
allocatable :: nlevels(:)
42 integer :: ivar, nlevs=0, nvars=0, ngvars=0, ncoefs=0
45 if (
conf%has(
"geovals"))
then
46 ngvars =
conf%get_size(
"geovals")
47 call conf%get_or_die(
"geovals", gvars)
50 call self%geovars%push_back(gvars(ivar))
54 nvars = self%obsvars%nvars()
55 if (ngvars == 0 .and. nvars > 0)
then
56 allocate(self%coefficients(nvars))
58 call self%geovars%push_back(self%obsvars%variable(ivar))
59 self%coefficients(ivar) = 1.0
63 if (
conf%has(
"coefficients"))
then
64 ncoefs =
conf%get_size(
"coefficients")
65 call conf%get_or_die(
"coefficients", coefficients)
66 allocate(self%coefficients(ncoefs))
67 self%coefficients(1:ncoefs) = coefficients(1:ncoefs)
70 if (
conf%has(
"nlevels"))
then
71 nlevs =
conf%get_size(
"nlevels")
72 call conf%get_or_die(
"nlevels", nlevels)
73 allocate(self%nlevels(nlevs))
74 self%nlevels(1:nlevs) = nlevels(1:nlevs)
78 call self%geovars%push_back(
var_prsi)
90 integer,
intent(in) :: nvars, nlocs
92 real(c_double),
intent(inout) :: hofx(nvars, nlocs)
93 type(c_ptr),
value,
intent(in) :: obss
96 integer :: iobs, ivar, iprof
97 integer :: iz1, iz2, kk
99 integer :: nsig, nprof, nlev
100 real(kind_real),
dimension(:),
allocatable :: toppressure,botpressure,airpressure
102 type(
ufo_geoval),
pointer :: modelpressures, modelozone
103 character(len=MAXVARLEN) :: geovar
104 character(len=MAXVARLEN) :: var_zdir
105 real :: pob,delp4,delz,dz1
106 real(kind_real) :: rozcon, g
107 real(kind_real) :: topozp, botozp
123 call ufo_geovals_get_var(geovals,
var_prsi, modelpressures)
124 nsig = modelpressures%nval - 1
126 allocate(toppressure(nlocs))
127 allocate(botpressure(nlocs))
128 allocate(airpressure(nlocs))
131 write(6,*)
'ufo_atmvertinterplay_simobs: self%nlevels = ', self%nlevels
132 if (self%nlevels(ivar) == 1)
then
134 toppressure(iobs) = modelpressures%vals(nsig+1, iobs)
135 botpressure(iobs) = modelpressures%vals(1, iobs)
139 call obsspace_get_db(obss,
"MetaData",
"air_pressure", airpressure)
140 nlev = self%nlevels(ivar)
153 toppressure(iobs) = airpressure(k2)
154 botpressure(iobs) = airpressure(k1)
156 toppressure(iobs) =modelpressures%vals(nsig+1, iobs)
157 botpressure(iobs) = airpressure(1)
158 else if( kk == nlev)
then
159 toppressure(iobs) = modelpressures%vals(nsig+1, iobs)
160 botpressure(iobs) = modelpressures%vals(1, iobs)
167 geovar = self%geovars%variable(ivar)
170 call ufo_geovals_get_var(geovals, geovar, modelozone)
173 topozp = pindex(nsig+1, modelpressures%vals(1, iobs), toppressure(iobs))
174 botozp = pindex(nsig+1, modelpressures%vals(1, iobs), botpressure(iobs))
178 if (iz1>nsig) iz1=nsig
181 if(iz1 .eq. nsig .and. iz2 .lt.7)iz2 = 1
186 if(kk==iz1)delz=dz1-iz1
187 if (kk==iz2) delz=delz-pob+iz2
189 if(iz1 .eq. nsig .and. iz2 .eq. 1)delz = 1
191 delp4 = (modelpressures%vals(kk,iobs)-modelpressures%vals(kk+1,iobs))
192 g = g + modelozone%vals(kk,iobs)*self%coefficients(ivar)*(delz*delp4)
198 deallocate(toppressure)
199 deallocate(botpressure)