127 & LBi, UBi, LBj, UBj, &
128 & ifield, Mobs, NobsSTR, NobsEND, &
129 & Xmin, Xmax, Ymin, Ymax, &
131 & ObsType, ObsVetting, &
132 & Tobs, Xobs, Yobs, &
145 integer,
intent(in) :: ng, imin, imax, jmin, jmax
146 integer,
intent(in) :: lbi, ubi, lbj, ubj
147 integer,
intent(in) :: ifield,
mobs, nobsstr, nobsend
149 real(
r8),
intent(in) :: xmin, xmax, ymin, ymax
150 real(
dp),
intent(in) :: time, dt
153 integer,
intent(in) ::
obstype(:)
155 real(
dp),
intent(in) ::
tobs(:)
156 real(
r8),
intent(in) ::
xobs(:)
157 real(
r8),
intent(in) ::
yobs(:)
158 real(
r8),
intent(in) :: a(lbi:,lbj:)
160 real(
r8),
intent(in) :: amask(lbi:,lbj:)
164 real(
r8),
intent(inout) :: aobs(:)
171 real(
r8),
intent(in) :: a(lbi:ubi,lbj:ubj)
173 real(
r8),
intent(in) :: amask(lbi:ubi,lbj:ubj)
176 real(
r8),
intent(inout) :: aobs(
mobs)
181 integer :: ic, iobs, i1, i2, j1, j2
183 real(
dp) :: timelb, timeub
185 real(
r8) :: p1, p2, q1, q2, wsum
187 real(
r8),
dimension(8) :: hmat
193 timelb=(time-0.5_dp*dt)/86400.0_dp
194 timeub=(time+0.5_dp*dt)/86400.0_dp
196 DO iobs=nobsstr,nobsend
197 IF ((
obstype(iobs).eq.ifield).and. &
198 & ((timelb.le.
tobs(iobs)).and.(
tobs(iobs).lt.timeub)).and. &
199 & ((xmin.le.
xobs(iobs)).and.(
xobs(iobs).lt.xmax)).and. &
200 & ((ymin.le.
yobs(iobs)).and.(
yobs(iobs).lt.ymax)))
THEN
202 i1=int(
xobs(iobs)+0.5_r8)
206 j1=int(
yobs(iobs)+0.5_r8)
219 p2=real(i2-i1,
r8)*(
xobs(iobs)-real(i1,
r8))
220 q2=real(j2-j1,
r8)*(
yobs(iobs)-real(j1,
r8))
228 hmat(1)=hmat(1)*amask(i1,j1)
229 hmat(2)=hmat(2)*amask(i2,j1)
230 hmat(3)=hmat(3)*amask(i2,j2)
231 hmat(4)=hmat(4)*amask(i1,j2)
236 IF (wsum.gt.0.0_r8)
THEN
239 hmat(ic)=hmat(ic)*wsum
243 aobs(iobs)=hmat(1)*a(i1,j1)+ &
244 & hmat(2)*a(i2,j1)+ &
245 & hmat(3)*a(i2,j2)+ &
262 & LBi, UBi, LBj, UBj, LBk, UBk, &
263 & ifield, Mobs, NobsSTR, NobsEND, &
264 & Xmin, Xmax, Ymin, Ymax, &
266 & ObsType, ObsVetting, &
267 & Tobs, Xobs, Yobs, Zobs, &
282 integer,
intent(in) :: ng, imin, imax, jmin, jmax
283 integer,
intent(in) :: lbi, ubi, lbj, ubj, lbk, ubk
284 integer,
intent(in) :: ifield,
mobs, nobsstr, nobsend
286 real(
r8),
intent(in) :: xmin, xmax, ymin, ymax
287 real(
dp),
intent(in) :: time, dt
290 integer,
intent(in) ::
obstype(:)
292 real(
dp),
intent(in) ::
tobs(:)
293 real(
r8),
intent(in) ::
xobs(:)
294 real(
r8),
intent(in) ::
yobs(:)
295 real(
r8),
intent(in) :: a(lbi:,lbj:,lbk:)
296 real(
r8),
intent(in) :: adepth(lbi:,lbj:,lbk:)
298 real(
r8),
intent(in) :: amask(lbi:,lbj:)
301 real(
r8),
intent(inout) ::
zobs(:)
302 real(
r8),
intent(inout) :: aobs(:)
309 real(
r8),
intent(in) :: a(lbi:ubi,lbj:ubj,lbk:ubk)
310 real(
r8),
intent(in) :: adepth(lbi:ubi,lbj:ubj,lbk:ubk)
312 real(
r8),
intent(in) :: amask(lbi:ubi,lbj:ubj)
316 real(
r8),
intent(inout) :: aobs(
mobs)
321 integer :: i, ic, iobs, i1, i2, j1, j2, k, k1, k2
323 real(
dp) :: timelb, timeub
325 real(
r8) :: zbot, ztop, dz, p1, p2, q1, q2, r1, r2
326 real(
r8) :: w11, w12, w21, w22, wsum
328 real(
r8),
dimension(8) :: hmat
334 timelb=(time-0.5_dp*dt)/86400.0_dp
335 timeub=(time+0.5_dp*dt)/86400.0_dp
337 DO iobs=nobsstr,nobsend
338 IF ((
obstype(iobs).eq.ifield).and. &
339 & ((timelb.le.
tobs(iobs)).and.(
tobs(iobs).lt.timeub)).and. &
340 & ((xmin.le.
xobs(iobs)).and.(
xobs(iobs).lt.xmax)).and. &
341 & ((ymin.le.
yobs(iobs)).and.(
yobs(iobs).lt.ymax)))
THEN
343 i1=int(
xobs(iobs)+0.5_r8)
347 j1=int(
yobs(iobs)+0.5_r8)
360 p2=real(i2-i1,
r8)*(
xobs(iobs)-real(i1,
r8))
361 q2=real(j2-j1,
r8)*(
yobs(iobs)-real(j1,
r8))
368 IF (
zobs(iobs).gt.0.0_r8)
THEN
369 k1=max(1,int(
zobs(iobs)))
370 k2=min(int(
zobs(iobs))+1,
n(ng))
371 r2=real(k2-k1,
r8)*(
zobs(iobs)-real(k1,
r8))
374 ztop=adepth(i1,j1,
n(ng))
375 zbot=adepth(i1,j1,1 )
376 IF (
zobs(iobs).ge.ztop)
THEN
382 ELSE IF (zbot.ge.
zobs(iobs))
THEN
388 ztop=adepth(i1,j1,k )
389 zbot=adepth(i1,j1,k-1)
390 IF ((ztop.gt.
zobs(iobs)).and.(
zobs(iobs).ge.zbot))
THEN
395 dz=adepth(i1,j1,k2)-adepth(i1,j1,k1)
396 r2=(
zobs(iobs)-adepth(i1,j1,k1))/dz
401 IF ((r1+r2).gt.0.0_r8)
THEN
411 hmat(1)=hmat(1)*amask(i1,j1)
412 hmat(2)=hmat(2)*amask(i2,j1)
413 hmat(3)=hmat(3)*amask(i2,j2)
414 hmat(4)=hmat(4)*amask(i1,j2)
415 hmat(5)=hmat(5)*amask(i1,j1)
416 hmat(6)=hmat(6)*amask(i2,j1)
417 hmat(7)=hmat(7)*amask(i2,j2)
418 hmat(8)=hmat(8)*amask(i1,j2)
423 IF (wsum.gt.0.0_r8)
THEN
426 hmat(ic)=hmat(ic)*wsum
430 aobs(iobs)=hmat(1)*a(i1,j1,k1)+ &
431 & hmat(2)*a(i2,j1,k1)+ &
432 & hmat(3)*a(i2,j2,k1)+ &
433 & hmat(4)*a(i1,j2,k1)+ &
434 & hmat(5)*a(i1,j1,k2)+ &
435 & hmat(6)*a(i2,j1,k2)+ &
436 & hmat(7)*a(i2,j2,k2)+ &
437 & hmat(8)*a(i1,j2,k2)
443# ifndef ALLOW_BOTTOM_OBS
450 IF ((
zobs(iobs).gt.0.0_r8).and.(
zobs(iobs).le.1.0_r8))
THEN