112
113
115
116
117
118 integer, intent(in) :: ng, Imin, Imax, Jmin, Jmax
119 integer, intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
120 integer, intent(in) :: Mobs
121
122 real(r8), intent(in) :: Xmin, Xmax, Ymin, Ymax
123
124# ifdef ASSUMED_SHAPE
125 real(r8), intent(in) :: obs_scale(:)
126 real(r8), intent(in) :: Xobs(:)
127 real(r8), intent(in) :: Yobs(:)
128 real(r8), intent(in) :: Zobs(:)
129 real(r8), intent(in) :: z(LBi:,LBj:,LBk:)
130
131 real(r8), intent(out) :: obs_depths(:)
132# else
133 real(r8), intent(in) :: obs_scale(Mobs)
134 real(r8), intent(in) :: Xobs(Mobs)
135 real(r8), intent(in) :: Yobs(Mobs)
136 real(r8), intent(in) :: Zobs(Mobs)
137 real(r8), intent(in) :: z(LBi:UBi,LBj:UBj,LBk:UBk)
138
139 real(r8), intent(out) :: obs_depths(Mobs)
140# endif
141
142
143
144 logical :: Linterpolate
145
146 integer :: i, ic, iobs, i1, i2, j1, j2, k, k1, k2
147
148 real(r8) :: Zbot, Ztop, dz, p1, p2, q1, q2, r1, r2
149 real(r8) :: w11, w12, w21, w22
150
151 real(r8), dimension(8) :: Hmat
152
153
154
155
156
157 DO iobs=1,mobs
158 IF (((xmin.le.xobs(iobs)).and.(xobs(iobs).lt.xmax)).and. &
159 & ((ymin.le.yobs(iobs)).and.(yobs(iobs).lt.ymax))) THEN
160 i1=int(xobs(iobs))
161 j1=int(yobs(iobs))
162 i2=i1+1
163 j2=j1+1
164 IF (i2.gt.imax) THEN
165 i2=i1
166 END IF
167 IF (j2.gt.jmax) THEN
168 j2=j1
169 END IF
170 p2=real(i2-i1,r8)*(xobs(iobs)-real(i1,r8))
171 q2=real(j2-j1,r8)*(yobs(iobs)-real(j1,r8))
172 p1=1.0_r8-p2
173 q1=1.0_r8-q2
174 w11=p1*q1
175 w21=p2*q1
176 w22=p2*q2
177 w12=p1*q2
178 IF (zobs(iobs).gt.0.0_r8) THEN
179 IF (abs(real(ubk,r8)-zobs(iobs)).lt.1.0e-8_r8) THEN
180 linterpolate=.false.
181 obs_depths(iobs)=0.0_r8
182 ELSE
183 linterpolate=.true.
184 k1=max(lbk,int(zobs(iobs)-0.5_r8))
185 k2=min(k1+1,ubk)
186 r2=real(k2-k1,r8)*(zobs(iobs)-real(k1,r8))
187 r1=1.0_r8-r2
188 END IF
189 ELSE
190 linterpolate=.false.
191 obs_depths(iobs)=zobs(iobs)
192 END IF
193 IF (linterpolate) THEN
194 IF ((r1+r2).gt.0.0_r8) THEN
195 hmat(1)=w11*r1
196 hmat(2)=w21*r1
197 hmat(3)=w22*r1
198 hmat(4)=w12*r1
199 hmat(5)=w11*r2
200 hmat(6)=w21*r2
201 hmat(7)=w22*r2
202 hmat(8)=w12*r2
203 obs_depths(iobs)=hmat(1)*z(i1,j1,k1)+ &
204 & hmat(2)*z(i2,j1,k1)+ &
205 & hmat(3)*z(i2,j2,k1)+ &
206 & hmat(4)*z(i1,j2,k1)+ &
207 & hmat(5)*z(i1,j1,k2)+ &
208 & hmat(6)*z(i2,j1,k2)+ &
209 & hmat(7)*z(i2,j2,k2)+ &
210 & hmat(8)*z(i1,j2,k2)
211 END IF
212 END IF
213 END IF
214 END DO
215
216 RETURN