/[MITgcm]/MITgcm/pkg/flt/flt_bilinear.F
ViewVC logotype

Contents of /MITgcm/pkg/flt/flt_bilinear.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download)
Sun Feb 1 21:10:51 2009 UTC (15 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +1 -1 lines
FILE REMOVED
- clean-up & simplify linear interpolation S/R :
  (move flt_bilinear.F -> flt_interp_linear.F ; add arg. myThid ; add
   option for var @ corner position)
- fix some indices (mainly vertical index)
- uses IMPLICIT NONE

1 C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_bilinear.F,v 1.4 2009/01/04 00:58:23 jmc Exp $
2 C $Name: $
3
4 #include "FLT_OPTIONS.h"
5
6 C-- Contents
7 C-- o FLT_BILINEAR
8 C-- o FLT_TRILINEAR
9 C-- o FLT_BILINEAR2D
10
11 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
12
13 SUBROUTINE FLT_BILINEAR (
14 I xp,
15 I yp,
16 O uu,
17 I kp,
18 I u,
19 I nu,
20 I bi,
21 I bj
22 & )
23
24 C ==================================================================
25 C SUBROUTINE flt_bilinear
26 C ==================================================================
27 C
28 C o Bilinear scheme to find u of particle at given xp,yp location
29 C
30 C ==================================================================
31 C SUBROUTINE flt_bilinear
32 C ==================================================================
33
34 C == global variables ==
35
36 #include "SIZE.h"
37
38 C == routine arguments ==
39
40 _RL xp, yp
41 _RL uu
42 INTEGER nu, kp, bi, bj
43 _RL u (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
44
45 C == local variables ==
46
47 INTEGER nnx, nny, nfx, nfy, nfxp, nfyp
48 _RL dx, dy, ddx, ddy
49 _RL u11, u12, u22, u21
50
51 C == end of interface ==
52
53 IF ( kp.LT.1 .OR. kp.GT.Nr ) THEN
54 c WRITE(msgbuf,'(A,I8)')
55 c & ' FLT_BILINEAR: illegal value for kp=',kp
56 c CALL PRINT_ERROR( msgbuf, myThid )
57 STOP 'ABNORMAL END: S/R FLT_BILINEAR'
58 ENDIF
59 nnx = int(xp)
60 nny = int(yp)
61 dx = xp - float(nnx)
62 dy = yp - float(nny)
63
64 C to choose the u box in which the particle is found
65 C nu=1 for T, S
66 C nu=2 for u
67 C nu=3 for v
68 C nu=4 for w
69
70 IF (nu.EQ.1.OR.nu.EQ.4) THEN
71 nfx = nnx
72 nfy = nny
73 ddx = dx
74 ddy = dy
75 ENDIF
76
77 IF (nu.EQ.2) THEN
78 IF (dx.LE.0.5) THEN
79 nfx = nnx
80 ddx = dx + 0.5
81 ELSE
82 nfx = nnx + 1
83 ddx = dx - 0.5
84 ENDIF
85 nfy = nny
86 ddy = dy
87 ENDIF
88
89 IF (nu.EQ.3) THEN
90 IF (dy.LE.0.5) THEN
91 nfy = nny
92 ddy = dy + 0.5
93 ELSE
94 nfy = nny + 1
95 ddy = dy - 0.5
96 ENDIF
97 nfx = nnx
98 ddx = dx
99 ENDIF
100
101 Cab change start
102 C was correct only for global?
103 c IF (nfx.GT.nx) nfx=nfx-nx
104 IF (nfx.GT.nx) nfx=nx
105 Cab change end
106 IF (nfy.GT.ny) nfy=ny
107 nfxp = nfx + 1
108 nfyp = nfy + 1
109 Cab change start
110 c IF (nfx.EQ.nx) nfxp = 1
111 IF (nfx.EQ.nx) nfxp = nfx
112 Cab change end
113 IF (nfy.EQ.ny) nfyp = nfy
114
115 IF (nu.LT.4) THEN
116 u11 = u(nfx,nfy,kp,bi,bj)
117 u21 = u(nfxp,nfy,kp,bi,bj)
118 u22 = u(nfxp,nfyp,kp,bi,bj)
119 u12 = u(nfx,nfyp,kp,bi,bj)
120 ENDIF
121 IF (nu.EQ.4) THEN
122 Caw This may be incorrect.
123 u11 = u(nfx,nfy,kp,bi,bj)+u(nfx,nfy,kp-1,bi,bj)
124 u21 = u(nfxp,nfy,kp,bi,bj)+u(nfxp,nfy,kp-1,bi,bj)
125 u22 = u(nfxp,nfyp,kp,bi,bj)+u(nfxp,nfyp,kp-1,bi,bj)
126 u12 = u(nfx,nfyp,kp,bi,bj)+u(nfx,nfyp,kp-1,bi,bj)
127 ENDIF
128
129 C bilinear interpolation (from numerical recipes)
130 uu = (1-ddx)*(1-ddy)*u11 + ddx*(1-ddy)*u21 + ddx*ddy*u22
131 . + (1-ddx)*ddy*u12
132
133 RETURN
134 END
135
136 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
137
138 SUBROUTINE FLT_TRILINEAR(
139 I xp,
140 I yp,
141 I zp,
142 O uu,
143 I u,
144 I nu,
145 I bi,
146 I bj
147 & )
148
149 C ==================================================================
150 C SUBROUTINE flt_trilinear
151 C ==================================================================
152 C
153 C o Trilinear scheme to find u of particle at a given xp,yp,zp
154 C location. This routine is a straight forward generalization of the
155 C bilinear interpolation scheme.
156 C
157 C started: 2004.05.28 Antti Westerlund (antti.westerlund@fimr.fi)
158 C and Sergio Jaramillo (sju@eos.ubc.ca).
159 C (adopted from SUBROUTINE bilinear by Arne Biastoch)
160 C
161 C ==================================================================
162 C SUBROUTINE flt_trilinear
163 C ==================================================================
164
165 C == global variables ==
166
167 #include "SIZE.h"
168
169 C == routine arguments ==
170
171 _RL xp, yp, zp
172 _RL uu
173 INTEGER nu, bi, bj
174 _RL u (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
175
176 C == local variables ==
177
178 INTEGER nnx, nny, nnz, nfx, nfy, nfz, nfxp, nfyp, nfzp
179 _RL dx, dy, dz, ddx, ddy, ddz
180 _RL u111, u121, u221, u211, u112, u122, u222, u212
181
182 C == end of interface ==
183
184 C Round xp,yp,zp down to find a grid point.
185 nnx = int(xp)
186 nny = int(yp)
187 nnz = int(zp)
188
189 C Find out the distance from the gridpoint.
190 dx = xp - float(nnx)
191 dy = yp - float(nny)
192 dz = zp - float(nnz)
193
194 C to choose the u box in which the particle is found
195 C nu=1 for T, S
196 C nu=2 for u
197 C nu=3 for v
198 C nu=4 for w
199
200 C Velocities are face quantities and must therefore be treated differently
201
202 C If the variable is T,S
203 IF (nu.EQ.1) THEN
204 nfx = nnx
205 ddx = dx
206 nfy = nny
207 ddy = dy
208 nfz = nnz
209 ddz = dz
210 ENDIF
211 C If the variable is u
212 IF (nu.EQ.2) THEN
213 IF (dx.LE.0.5) THEN
214 nfx = nnx
215 ddx = dx + 0.5
216 ELSE
217 nfx = nnx + 1
218 ddx = dx - 0.5
219 ENDIF
220 nfy = nny
221 ddy = dy
222 nfz = nnz
223 ddz = dz
224 ENDIF
225 C If the variable is v
226 IF (nu.EQ.3) THEN
227 nfx = nnx
228 ddx = dx
229 IF (dy.LE.0.5) THEN
230 nfy = nny
231 ddy = dy + 0.5
232 ELSE
233 nfy = nny + 1
234 ddy = dy - 0.5
235 ENDIF
236 nfz = nnz
237 ddz = dz
238 ENDIF
239 C If the variable is w
240 IF (nu.EQ.4) THEN
241 nfx = nnx
242 ddx = dx
243 nfy = nny
244 ddy = dy
245 IF (dz.LE.0.5) THEN
246 nfz = nnz
247 ddz = dz + 0.5
248 ELSE
249 nfz = nnz + 1
250 ddz = dz - 0.5
251 ENDIF
252 ENDIF
253
254 C If we are near or over the edge, limit nfx/y/z
255 IF (nfx.GT.nx) nfx=nx
256 IF (nfy.GT.ny) nfy=ny
257 IF (nfz.GT.nr) nfz=nr
258 IF (nfz.LE.1) nfz=1
259 C We should possibly check something else too...
260
261 C the coordinates for the other grid points
262 nfxp = nfx + 1
263 nfyp = nfy + 1
264 nfzp = nfz + 1
265 C If we are near the edge, also limit nf?p
266 IF (nfx.EQ.nx) nfxp = nfx
267 IF (nfy.EQ.ny) nfyp = nfy
268 IF (nfz.EQ.nr) nfzp = nfz
269
270 C Values of the field at relevant grid points
271 u111 = u(nfx,nfy,nfz,bi,bj)
272 u211 = u(nfxp,nfy,nfz,bi,bj)
273 u221 = u(nfxp,nfyp,nfz,bi,bj)
274 u121 = u(nfx,nfyp,nfz,bi,bj)
275 u112 = u(nfx,nfy,nfzp,bi,bj)
276 u212 = u(nfxp,nfy,nfzp,bi,bj)
277 u222 = u(nfxp,nfyp,nfzp,bi,bj)
278 u122 = u(nfx,nfyp,nfzp,bi,bj)
279
280 C Trilinear interpolation, a straight forward generalization
281 C of the bilinear interpolation scheme.
282 uu = (1-ddx)*(1-ddy)*(1-ddz)*u111 + ddx*(1-ddy)*(1-ddz)*u211
283 & + ddx*ddy*(1-ddz)*u221 + (1-ddx)*ddy*(1-ddz)*u121
284 & + (1-ddx)*(1-ddy)*ddz*u112 + ddx*(1-ddy)*ddz*u212
285 & + ddx*ddy*ddz*u222 + (1-ddx)*ddy*ddz*u122
286
287 RETURN
288 END
289
290 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
291
292 SUBROUTINE FLT_BILINEAR2D(
293 I xp,
294 I yp,
295 O uu,
296 I u,
297 I nu,
298 I bi,
299 I bj
300 & )
301
302 C ==================================================================
303 C SUBROUTINE flt_bilinear2d
304 C ==================================================================
305 C
306 C o Bilinear scheme to find u of particle at given xp,yp location
307 C o For 2D fields
308 C
309 C started: Arne Biastoch abiastoch@ucsd.edu 13-Jan-2000
310 C (adopted from SUBROUTINE bilinear)
311 C
312 C ==================================================================
313 C SUBROUTINE flt_bilinear2d
314 C ==================================================================
315
316 C == global variables ==
317
318 #include "SIZE.h"
319
320 C == routine arguments ==
321
322 _RL xp, yp
323 _RL uu
324 INTEGER nu, bi, bj
325 _RL u (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
326
327 C == local variables ==
328
329 INTEGER nnx, nny, nfx, nfy, nfxp, nfyp
330 _RL dx, dy, ddx, ddy
331 _RL u11, u12, u22, u21
332
333 C == end of interface ==
334
335 nnx = int(xp)
336 nny = int(yp)
337 dx = xp - float(nnx)
338 dy = yp - float(nny)
339
340 C to choose the u box in which the particle is found
341 C nu=1 for T, S
342 C nu=2 for u
343 C nu=3 for v
344 C nu=4 for w
345
346 IF (nu.EQ.1.OR.nu.EQ.4) THEN
347 nfx = nnx
348 nfy = nny
349 ddx = dx
350 ddy = dy
351 ENDIF
352
353 IF (nu.EQ.2) THEN
354 IF (dx.LE.0.5) THEN
355 nfx = nnx
356 ddx = dx + 0.5
357 ELSE
358 nfx = nnx + 1
359 ddx = dx - 0.5
360 ENDIF
361 nfy = nny
362 ddy = dy
363 ENDIF
364
365 IF (nu.EQ.3) THEN
366 IF (dy.LE.0.5) THEN
367 nfy = nny
368 ddy = dy + 0.5
369 ELSE
370 nfy = nny + 1
371 ddy = dy - 0.5
372 ENDIF
373 nfx = nnx
374 ddx = dx
375 ENDIF
376
377 Cab change start
378 C was correct only for global?
379 c IF (nfx.GT.nx) nfx=nfx-nx
380 IF (nfx.GT.nx) nfx=nx
381 Cab change end
382 IF (nfy.GT.ny) nfy=ny
383 nfxp = nfx + 1
384 nfyp = nfy + 1
385 Cab change start
386 c IF (nfx.EQ.nx) nfxp = 1
387 IF (nfx.EQ.nx) nfxp = nfx
388 Cab change end
389 IF (nfy.EQ.ny) nfyp = nfy
390
391 IF (nu.LT.4) THEN
392 u11 = u(nfx,nfy,bi,bj)
393 u21 = u(nfxp,nfy,bi,bj)
394 u22 = u(nfxp,nfyp,bi,bj)
395 u12 = u(nfx,nfyp,bi,bj)
396 ENDIF
397 IF (nu.EQ.4) THEN
398 Caw This may be incorrect.
399 u11 = u(nfx,nfy,bi,bj)+u(nfx,nfy,bi,bj)
400 u21 = u(nfxp,nfy,bi,bj)+u(nfxp,nfy,bi,bj)
401 u22 = u(nfxp,nfyp,bi,bj)+u(nfxp,nfyp,bi,bj)
402 u12 = u(nfx,nfyp,bi,bj)+u(nfx,nfyp,bi,bj)
403 ENDIF
404
405 C bilinear interpolation (from numerical recipes)
406 uu = (1-ddx)*(1-ddy)*u11 + ddx*(1-ddy)*u21 + ddx*ddy*u22
407 . + (1-ddx)*ddy*u12
408
409 RETURN
410 END

  ViewVC Help
Powered by ViewVC 1.1.22