1 |
jmc |
1.3 |
C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_mapping.F,v 1.2 2009/02/10 17:29:32 jmc Exp $ |
2 |
jmc |
1.1 |
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 |
jmc |
1.2 |
fm = ( xx - xG(i,j,bi,bj) ) / dist |
63 |
jmc |
1.1 |
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 |
jmc |
1.2 |
fm = ( yy - yG(i,j,bi,bj) ) / dist |
74 |
jmc |
1.1 |
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 |
|
|
ELSE |
137 |
|
|
STOP 'FLT_MAP_IJLOCAL2XY: not yet coded for this grid' |
138 |
|
|
ENDIF |
139 |
|
|
|
140 |
|
|
RETURN |
141 |
|
|
END |
142 |
|
|
|
143 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
144 |
|
|
|
145 |
|
|
_RL FUNCTION FLT_MAP_R2K( |
146 |
|
|
I rr, bi, bj, myThid ) |
147 |
|
|
|
148 |
|
|
C ================================================================== |
149 |
|
|
C FUNCTION FLT_MAP_R2K |
150 |
|
|
C ================================================================== |
151 |
|
|
C o Converts r-coordinate (grid) to corresponding |
152 |
|
|
C fractional vertical index |
153 |
|
|
C Range: [1/2 , Nr+1/2], |
154 |
|
|
C Center (Tracer Pt) <-> integer |
155 |
|
|
C Interface (wVel Pt) <-> half integer |
156 |
|
|
C ================================================================== |
157 |
|
|
|
158 |
|
|
C !USES: |
159 |
|
|
IMPLICIT NONE |
160 |
|
|
|
161 |
|
|
C == global variables == |
162 |
|
|
#include "SIZE.h" |
163 |
|
|
#include "EEPARAMS.h" |
164 |
|
|
#include "GRID.h" |
165 |
|
|
|
166 |
|
|
C == routine arguments == |
167 |
|
|
_RL rr |
168 |
|
|
INTEGER bi, bj, myThid |
169 |
|
|
|
170 |
|
|
C == local variables == |
171 |
|
|
_RL fm |
172 |
|
|
INTEGER k |
173 |
|
|
|
174 |
|
|
C == end of interface == |
175 |
|
|
|
176 |
|
|
FLT_MAP_R2K = 0. _d 0 |
177 |
|
|
DO k=1,Nr |
178 |
|
|
IF ( FLT_MAP_R2K .EQ. 0. _d 0 ) THEN |
179 |
|
|
C- r decreases when k increases (rkSign < 0): |
180 |
|
|
IF ( rF(k) .GE. rr .AND. rr.GT.rF(k+1) ) THEN |
181 |
|
|
fm = ( rr - rF(k) ) * recip_drF(k)*rkSign |
182 |
|
|
FLT_MAP_R2K = DFLOAT(k)+fm-0.5 _d 0 |
183 |
|
|
ENDIF |
184 |
|
|
ENDIF |
185 |
|
|
ENDDO |
186 |
|
|
|
187 |
|
|
RETURN |
188 |
|
|
END |
189 |
|
|
|
190 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
191 |
|
|
|
192 |
|
|
_RL FUNCTION FLT_MAP_K2R( |
193 |
|
|
I kr, bi, bj, myThid ) |
194 |
|
|
|
195 |
|
|
C ================================================================== |
196 |
|
|
C FUNCTION FLT_MAP_K2R |
197 |
|
|
C ================================================================== |
198 |
|
|
C o Converts fractional vertical index to corresponding |
199 |
|
|
C r-coordinate (grid) |
200 |
|
|
C Range: [1/2 , Nr+1/2], |
201 |
|
|
C Center (Tracer Pt) <-> integer |
202 |
|
|
C Interface (wVel Pt) <-> half integer |
203 |
|
|
C ================================================================== |
204 |
|
|
|
205 |
|
|
C !USES: |
206 |
|
|
IMPLICIT NONE |
207 |
|
|
|
208 |
|
|
C == global variables == |
209 |
|
|
#include "SIZE.h" |
210 |
|
|
#include "EEPARAMS.h" |
211 |
|
|
#include "GRID.h" |
212 |
|
|
|
213 |
|
|
C == routine arguments == |
214 |
|
|
_RL kr |
215 |
|
|
INTEGER bi, bj, myThid |
216 |
|
|
|
217 |
|
|
C == local variables == |
218 |
|
|
_RL ddz |
219 |
|
|
INTEGER k |
220 |
|
|
|
221 |
|
|
C == end of interface == |
222 |
|
|
|
223 |
|
|
k = NINT(kr) |
224 |
|
|
IF ( k.LT.1 ) THEN |
225 |
|
|
FLT_MAP_K2R = rF(1) |
226 |
|
|
ELSEIF ( k.GT.Nr ) THEN |
227 |
|
|
FLT_MAP_K2R = rF(Nr+1) |
228 |
|
|
ELSE |
229 |
|
|
ddz = 0.5 _d 0 + kr - DFLOAT(k) |
230 |
|
|
FLT_MAP_K2R = rF(k) + ddz*drF(k)*rkSign |
231 |
|
|
ENDIF |
232 |
|
|
|
233 |
|
|
RETURN |
234 |
|
|
END |