ROMS
Loading...
Searching...
No Matches
obs_k2z_mod Module Reference

Functions/Subroutines

subroutine obs_k2z (ng, imin, imax, jmin, jmax, lbi, ubi, lbj, ubj, lbk, ubk, xmin, xmax, ymin, ymax, mobs, xobs, yobs, zobs, obs_scale, z, obs_depths)
 

Function/Subroutine Documentation

◆ obs_k2z()

subroutine obs_k2z_mod::obs_k2z ( integer, intent(in) ng,
integer, intent(in) imin,
integer, intent(in) imax,
integer, intent(in) jmin,
integer, intent(in) jmax,
integer, intent(in) lbi,
integer, intent(in) ubi,
integer, intent(in) lbj,
integer, intent(in) ubj,
integer, intent(in) lbk,
integer, intent(in) ubk,
real(r8), intent(in) xmin,
real(r8), intent(in) xmax,
real(r8), intent(in) ymin,
real(r8), intent(in) ymax,
integer, intent(in) mobs,
real(r8), dimension(:), intent(in) xobs,
real(r8), dimension(:), intent(in) yobs,
real(r8), dimension(:), intent(in) zobs,
real(r8), dimension(:), intent(in) obs_scale,
real(r8), dimension(lbi:,lbj:,lbk:), intent(in) z,
real(r8), dimension(:), intent(out) obs_depths )

Definition at line 107 of file obs_k2z.F.

112!***********************************************************************
113!
114 USE mod_param
115!
116! Imported variable declarations.
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! Local variable declarations.
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! Interpolate vertical fractional coordinate to depths.
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 ! Observation at the eastern boundary
166 END IF
167 IF (j2.gt.jmax) THEN
168 j2=j1 ! Observation at the northern boundary
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. ! surface observation
181 obs_depths(iobs)=0.0_r8
182 ELSE
183 linterpolate=.true. ! fractional level
184 k1=max(lbk,int(zobs(iobs)-0.5_r8)) ! W-point
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. ! already depths in meters
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

Referenced by stats_modobs_mod::stats_modobs_nf90(), and stats_modobs_mod::stats_modobs_pio().

Here is the caller graph for this function: