11 use oops_variables_mod
20 type(oops_variables),
public :: geovars
21 type(oops_variables),
public :: obsvars
33 character(max_string) :: err_msg
35 integer :: ivar, nvars
37 nvars = self%obsvars%nvars()
39 write(err_msg,*)
'ufo_marinevertinterp_setup error: only variables size 1 supported!'
40 call abor1_ftn(err_msg)
45 call self%geovars%push_back(self%obsvars%variable(ivar))
47 call self%geovars%push_back(
"sea_water_cell_thickness")
63 real(c_double),
intent(inout) :: hofx(:)
64 type(c_ptr),
value,
intent(in) :: obss
66 character(len=*),
parameter :: myname_=
"ufo_marinevertinterp_simobs"
67 character(max_string) :: err_msg
69 integer :: iobs, ilev, nlev, nlocs
71 real (kind_real),
allocatable :: depth(:,:)
72 real(kind_real) :: deptho
73 real(kind_real),
allocatable :: obs_depth(:)
75 real(kind_real) :: wf, sp, prs
79 if (geovals%nlocs /=
size(hofx,1))
then
80 write(err_msg,*) myname_,
' error: nlocs inconsistent!'
81 call abor1_ftn(err_msg)
89 obss_nlocs = obsspace_get_nlocs(obss)
90 allocate(obs_depth(obss_nlocs))
91 call obsspace_get_db(obss,
"MetaData",
"depth", obs_depth)
95 allocate(depth(nlev,nlocs))
96 do iobs = 1,
size(hofx,1)
98 depth(1,iobs)=0.5*h%vals(1,iobs)
100 depth(ilev,iobs)=sum(h%vals(1:ilev-1,iobs))+0.5*h%vals(ilev,iobs)
106 do iobs = 1,
size(hofx,1)
108 deptho = obs_depth(iobs)
119 deallocate(obs_depth)
subroutine, public ufo_geovals_get_var(self, varname, geoval)
Fortran marinevertinterp module for observation operator.
subroutine ufo_marinevertinterp_simobs(self, geovals, hofx, obss)
subroutine ufo_marinevertinterp_setup(self)
integer, parameter max_string
character(len=maxvarlen), public var_ocn_lay_thick
Fortran module to perform linear interpolation.
subroutine vert_interp_weights(nlev, obl, vec, wi, wf)
subroutine vert_interp_apply(nlev, fvec, f, wi, wf)
type to hold interpolated field for one variable, one observation
type to hold interpolated fields required by the obs operators
Fortran derived type for the observation type.