1 |
C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_mapping.F,v 1.3 2009/02/13 04:22:22 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "FLT_OPTIONS.h" |
5 |
|
6 |
C-- Contents |
7 |
C-- o FLT_MAP_XY2IJLOCAL |
8 |
C-- o FLT_MAP_IJLOCAL2XY |
9 |
C-- o FLT_MAP_R2K (Function) |
10 |
C-- o FLT_MAP_K2R (Function) |
11 |
|
12 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
13 |
|
14 |
SUBROUTINE FLT_MAP_XY2IJLOCAL( |
15 |
O ix, jy, |
16 |
I xx, yy, bi, bj, myThid ) |
17 |
|
18 |
C ================================================================== |
19 |
C SUBROUTINE FLT_MAP_XY2IJLOCAL |
20 |
C ================================================================== |
21 |
C o Converts global x,y-coordinates (grid) to corresponding |
22 |
C local fractional horizontal indices for specific tile |
23 |
C Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2] |
24 |
C Center (Tracer Pt) <-> integer , integer |
25 |
C U-velocity Pt <-> half integer , integer |
26 |
C V-velocity Pt <-> integer , half integer |
27 |
C Vorticity Pt <-> half integer , half integer |
28 |
C ================================================================== |
29 |
|
30 |
C !USES: |
31 |
IMPLICIT NONE |
32 |
|
33 |
C == global variables == |
34 |
#include "SIZE.h" |
35 |
#include "EEPARAMS.h" |
36 |
#include "GRID.h" |
37 |
#include "PARAMS.h" |
38 |
|
39 |
C == routine arguments == |
40 |
_RL ix, jy |
41 |
_RL xx, yy |
42 |
INTEGER bi, bj, myThid |
43 |
|
44 |
C == local variables == |
45 |
_RL fm, dist |
46 |
INTEGER i, j |
47 |
|
48 |
C == end of interface == |
49 |
|
50 |
IF ( usingCartesianGrid .OR. |
51 |
& usingSphericalPolarGrid .AND. .NOT.rotateGrid |
52 |
& ) THEN |
53 |
|
54 |
ix = -1. _d 0 |
55 |
jy = -1. _d 0 |
56 |
|
57 |
j = 1 |
58 |
DO i=0,sNx+1 |
59 |
IF ( ix.EQ.-1. _d 0 ) THEN |
60 |
IF ( xG(i,j,bi,bj).LE.xx .AND. xx.LT.xG(i+1,j,bi,bj) ) THEN |
61 |
dist = xG(i+1,j,bi,bj) - xG(i,j,bi,bj) |
62 |
fm = ( xx - xG(i,j,bi,bj) ) / dist |
63 |
ix = DFLOAT(i)+fm-0.5 _d 0 |
64 |
ENDIF |
65 |
ENDIF |
66 |
ENDDO |
67 |
|
68 |
i = 1 |
69 |
DO j=0,sNy+1 |
70 |
IF ( jy.EQ.-1. _d 0 ) THEN |
71 |
IF ( yG(i,j,bi,bj).LE.yy .AND. yy.LT.yG(i,j+1,bi,bj) ) THEN |
72 |
dist = yG(i,j+1,bi,bj) - yG(i,j,bi,bj) |
73 |
fm = ( yy - yG(i,j,bi,bj) ) / dist |
74 |
jy = DFLOAT(j)+fm-0.5 _d 0 |
75 |
ENDIF |
76 |
ENDIF |
77 |
ENDDO |
78 |
|
79 |
ELSE |
80 |
STOP 'FLT_MAP_XY2IJLOCAL: not yet coded for this grid' |
81 |
ENDIF |
82 |
|
83 |
RETURN |
84 |
END |
85 |
|
86 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
87 |
|
88 |
SUBROUTINE FLT_MAP_IJLOCAL2XY( |
89 |
O xx, yy, |
90 |
I ix, jy, bi, bj, myThid ) |
91 |
|
92 |
C ================================================================== |
93 |
C SUBROUTINE FLT_MAP_IJLOCAL2XY |
94 |
C ================================================================== |
95 |
C o Converts local fractional horizontal indices for specific tile |
96 |
C to corresponding global x,y-coordinates (grid) |
97 |
C Range: [1/2 , sNx+1/2] , [1/2 , sNy+1/2] |
98 |
C Center (Tracer Pt) <-> integer , integer |
99 |
C U-velocity Pt <-> half integer , integer |
100 |
C V-velocity Pt <-> integer , half integer |
101 |
C Vorticity Pt <-> half integer , half integer |
102 |
C ================================================================== |
103 |
|
104 |
C !USES: |
105 |
IMPLICIT NONE |
106 |
|
107 |
C == global variables == |
108 |
#include "SIZE.h" |
109 |
#include "EEPARAMS.h" |
110 |
#include "GRID.h" |
111 |
#include "PARAMS.h" |
112 |
|
113 |
C == routine arguments == |
114 |
_RL xx, yy |
115 |
_RL ix, jy |
116 |
INTEGER bi, bj, myThid |
117 |
|
118 |
C == local variables == |
119 |
_RL ddx, ddy |
120 |
INTEGER i, j |
121 |
|
122 |
C == end of interface == |
123 |
|
124 |
IF ( usingCartesianGrid .OR. |
125 |
& usingSphericalPolarGrid .AND. .NOT.rotateGrid |
126 |
& ) THEN |
127 |
|
128 |
i = NINT(ix) |
129 |
j = NINT(jy) |
130 |
ddx = 0.5 _d 0 + ix - DFLOAT(i) |
131 |
ddy = 0.5 _d 0 + jy - DFLOAT(j) |
132 |
|
133 |
xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) ) |
134 |
yy = yG(i,j,bi,bj) + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) ) |
135 |
|
136 |
ELSEIF ( usingCurvilinearGrid ) THEN |
137 |
|
138 |
i = NINT(ix) |
139 |
j = NINT(jy) |
140 |
ddx = 0.5 _d 0 + ix - DFLOAT(i) |
141 |
ddy = 0.5 _d 0 + jy - DFLOAT(j) |
142 |
|
143 |
C bilinear interpolation within grid cell (should use arcs instead?) |
144 |
xx = xG(i,j,bi,bj) + ddx*( xG(i+1,j,bi,bj) - xG(i,j,bi,bj) ) |
145 |
& + ddy*( xG(i,j+1,bi,bj) - xG(i,j,bi,bj) ) |
146 |
& + ddx*ddy*( xG(i+1,j+1,bi,bj) - xG(i+1,j,bi,bj) |
147 |
& - xG(i,j+1,bi,bj) + xG(i,j,bi,bj) ) |
148 |
yy = yG(i,j,bi,bj) + ddx*( yG(i+1,j,bi,bj) - yG(i,j,bi,bj) ) |
149 |
& + ddy*( yG(i,j+1,bi,bj) - yG(i,j,bi,bj) ) |
150 |
& + ddx*ddy*( yG(i+1,j+1,bi,bj) - yG(i+1,j,bi,bj) |
151 |
& - yG(i,j+1,bi,bj) + yG(i,j,bi,bj) ) |
152 |
|
153 |
ELSE |
154 |
STOP 'FLT_MAP_IJLOCAL2XY: not yet coded for this grid' |
155 |
ENDIF |
156 |
|
157 |
RETURN |
158 |
END |
159 |
|
160 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
161 |
|
162 |
_RL FUNCTION FLT_MAP_R2K( |
163 |
I rr, bi, bj, myThid ) |
164 |
|
165 |
C ================================================================== |
166 |
C FUNCTION FLT_MAP_R2K |
167 |
C ================================================================== |
168 |
C o Converts r-coordinate (grid) to corresponding |
169 |
C fractional vertical index |
170 |
C Range: [1/2 , Nr+1/2], |
171 |
C Center (Tracer Pt) <-> integer |
172 |
C Interface (wVel Pt) <-> half integer |
173 |
C ================================================================== |
174 |
|
175 |
C !USES: |
176 |
IMPLICIT NONE |
177 |
|
178 |
C == global variables == |
179 |
#include "SIZE.h" |
180 |
#include "EEPARAMS.h" |
181 |
#include "GRID.h" |
182 |
|
183 |
C == routine arguments == |
184 |
_RL rr |
185 |
INTEGER bi, bj, myThid |
186 |
|
187 |
C == local variables == |
188 |
_RL fm |
189 |
INTEGER k |
190 |
|
191 |
C == end of interface == |
192 |
|
193 |
FLT_MAP_R2K = 0. _d 0 |
194 |
DO k=1,Nr |
195 |
IF ( FLT_MAP_R2K .EQ. 0. _d 0 ) THEN |
196 |
C- r decreases when k increases (rkSign < 0): |
197 |
IF ( rF(k) .GE. rr .AND. rr.GT.rF(k+1) ) THEN |
198 |
fm = ( rr - rF(k) ) * recip_drF(k)*rkSign |
199 |
FLT_MAP_R2K = DFLOAT(k)+fm-0.5 _d 0 |
200 |
ENDIF |
201 |
ENDIF |
202 |
ENDDO |
203 |
|
204 |
RETURN |
205 |
END |
206 |
|
207 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
208 |
|
209 |
_RL FUNCTION FLT_MAP_K2R( |
210 |
I kr, bi, bj, myThid ) |
211 |
|
212 |
C ================================================================== |
213 |
C FUNCTION FLT_MAP_K2R |
214 |
C ================================================================== |
215 |
C o Converts fractional vertical index to corresponding |
216 |
C r-coordinate (grid) |
217 |
C Range: [1/2 , Nr+1/2], |
218 |
C Center (Tracer Pt) <-> integer |
219 |
C Interface (wVel Pt) <-> half integer |
220 |
C ================================================================== |
221 |
|
222 |
C !USES: |
223 |
IMPLICIT NONE |
224 |
|
225 |
C == global variables == |
226 |
#include "SIZE.h" |
227 |
#include "EEPARAMS.h" |
228 |
#include "GRID.h" |
229 |
|
230 |
C == routine arguments == |
231 |
_RL kr |
232 |
INTEGER bi, bj, myThid |
233 |
|
234 |
C == local variables == |
235 |
_RL ddz |
236 |
INTEGER k |
237 |
|
238 |
C == end of interface == |
239 |
|
240 |
k = NINT(kr) |
241 |
IF ( k.LT.1 ) THEN |
242 |
FLT_MAP_K2R = rF(1) |
243 |
ELSEIF ( k.GT.Nr ) THEN |
244 |
FLT_MAP_K2R = rF(Nr+1) |
245 |
ELSE |
246 |
ddz = 0.5 _d 0 + kr - DFLOAT(k) |
247 |
FLT_MAP_K2R = rF(k) + ddz*drF(k)*rkSign |
248 |
ENDIF |
249 |
|
250 |
RETURN |
251 |
END |