/[MITgcm]/MITgcm/pkg/mom_common/mom_calc_hfacz.F
ViewVC logotype

Contents of /MITgcm/pkg/mom_common/mom_calc_hfacz.F

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


Revision 1.10 - (show annotations) (download)
Thu Oct 23 15:57:36 2014 UTC (9 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65g, HEAD
Changes since 1.9: +3 -5 lines
fix type of local arrays hFacZOpenI & hFacZOpenJ

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_calc_hfacz.F,v 1.9 2014/04/04 20:08:11 jmc Exp $
2 C $Name: $
3
4 #include "MOM_COMMON_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF
6 # include "AUTODIFF_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: MOM_CALC_HFACZ
11
12 C !INTERFACE: ==========================================================
13 SUBROUTINE MOM_CALC_HFACZ(
14 I bi, bj, k,
15 O hFacZ, r_hFacZ,
16 I myThid )
17
18 C !DESCRIPTION:
19 C Calculates the fractional thickness at vorticity points
20
21 C !USES: ===============================================================
22 IMPLICIT NONE
23 #include "SIZE.h"
24 #include "EEPARAMS.h"
25 #include "PARAMS.h"
26 #include "GRID.h"
27 #ifdef ALLOW_DEPTH_CONTROL
28 # ifdef ALLOW_AUTODIFF
29 # include "tamc.h"
30 # include "tamc_keys.h"
31 # endif
32 #else /* ALLOW_DEPTH_CONTROL */
33 # ifdef ALLOW_EXCH2
34 # include "W2_EXCH2_SIZE.h"
35 # include "W2_EXCH2_TOPOLOGY.h"
36 # endif
37 #endif /* ALLOW_DEPTH_CONTROL */
38
39 C !INPUT PARAMETERS: ===================================================
40 C bi,bj :: tile indices
41 C k :: vertical level
42 C myThid :: my Thread Id number
43 INTEGER bi, bj, k
44 INTEGER myThid
45
46 C !OUTPUT PARAMETERS: ==================================================
47 C hFacZ :: fractional thickness at vorticity points
48 C r_hFacZ :: reciprocal
49 _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
50 _RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
51
52 C !LOCAL VARIABLES: ====================================================
53 C i,j :: loop indices
54 C hZoption :: forward mode option to select the way hFacZ is computed:
55 C 0 : = minimum of 4 hFacW,hFacS arround (consistent with
56 C definition of partial cell & mask near topography)
57 C 1 : = minimum of 2 average (hFacW)_j,(hFacS)_i
58 C 2 : = average of 4 hFacW,hFacS arround (consistent with
59 C how free surface affects hFacW,hFacS it using r* and
60 C without topography)
61 INTEGER i,j
62 #ifdef ALLOW_DEPTH_CONTROL
63 _RS hFacZOpenI(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
64 _RS hFacZOpenJ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65 # ifdef USE_SMOOTH_MIN
66 _RS SMOOTHMIN_RS
67 EXTERNAL SMOOTHMIN_RS
68 # endif /* USE_SMOOTH_MIN */
69 #else /* ALLOW_DEPTH_CONTROL */
70 _RS hFacZOpen
71 INTEGER hZoption
72 LOGICAL northWestCorner, northEastCorner,
73 & southWestCorner, southEastCorner
74 INTEGER myFace
75 # ifdef ALLOW_EXCH2
76 INTEGER myTile
77 # endif /* ALLOW_EXCH2 */
78 PARAMETER ( hZoption = 0 )
79 #endif /* ALLOW_DEPTH_CONTROL */
80 CEOP
81
82 C-- Calculate open water fraction at vorticity points
83
84 #ifdef ALLOW_DEPTH_CONTROL
85
86 #ifdef ALLOW_AUTODIFF_TAMC
87 act1 = bi - myBxLo(myThid)
88 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
89 act2 = bj - myByLo(myThid)
90 max2 = myByHi(myThid) - myByLo(myThid) + 1
91 act3 = myThid - 1
92 max3 = nTx*nTy
93 act4 = ikey_dynamics - 1
94 ikey = (act1 + 1) + act2*max1
95 & + act3*max1*max2
96 & + act4*max1*max2*max3
97 kkey = (ikey-1)*Nr + k
98 #endif /* ALLOW_AUTODIFF_TAMC */
99
100 DO j=1-OLy,sNy+OLy
101 DO i=1-OLx,sNx+OLx
102 hFacZ(i,j) =0.
103 r_hFacZ(i,j) =0.
104 hFacZOpenI(i,j)=0.
105 hFacZOpenJ(i,j)=0.
106 ENDDO
107 ENDDO
108
109 #ifdef ALLOW_AUTODIFF_TAMC
110 CADJ STORE hFacZ(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
111 CADJ STORE r_hFacZ(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
112 #endif /* ALLOW_AUTODIFF_TAMC */
113 DO j=2-OLy,sNy+OLy
114 DO i=2-OLx,sNx+OLx
115 hFacZOpenJ(i,j)=
116 #ifdef USE_SMOOTH_MIN
117 & SMOOTHMIN_RS(_hFacW(i ,j ,k,bi,bj),
118 #else
119 & MIN(_hFacW(i ,j ,k,bi,bj),
120 #endif /* USE_SMOOTH_MIN */
121 & _hFacW(i ,j-1,k,bi,bj))
122 & *maskW(i,j,k,bi,bj)*maskW(i,j-1,k,bi,bj)
123 hFacZOpenI(i,j)=
124 #ifdef USE_SMOOTH_MIN
125 & SMOOTHMIN_RS(_hFacS(i ,j ,k,bi,bj),
126 #else
127 & MIN(_hFacS(i ,j ,k,bi,bj),
128 #endif /* USE_SMOOTH_MIN */
129 & _hFacS(i-1,j ,k,bi,bj))
130 & *maskS(i,j,k,bi,bj)*maskS(i-1,j,k,bi,bj)
131 ENDDO
132 ENDDO
133 #ifdef ALLOW_AUTODIFF_TAMC
134 CADJ STORE hFacZOpenI(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
135 CADJ STORE hFacZOpenJ(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
136 #endif /* ALLOW_AUTODIFF_TAMC */
137 DO j=2-OLy,sNy+OLy
138 DO i=2-OLx,sNx+OLx
139 hFacZ(i,j) =
140 #ifdef USE_SMOOTH_MIN
141 & SMOOTHMIN_RS(hFacZOpenI(i,j),hFacZOpenJ(i,j))
142 #else
143 & MIN(hFacZOpenI(i,j),hFacZOpenJ(i,j))
144 #endif /* USE_SMOOTH_MIN */
145 & *maskW(i,j,k,bi,bj)*maskW(i,j-1,k,bi,bj)
146 & *maskS(i,j,k,bi,bj)*maskS(i-1,j,k,bi,bj)
147 ENDDO
148 ENDDO
149 #ifdef ALLOW_AUTODIFF_TAMC
150 CADJ STORE hFacZ(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
151 #endif /* ALLOW_AUTODIFF_TAMC */
152 DO j=2-OLy,sNy+OLy
153 DO i=2-OLx,sNx+OLx
154 IF (hFacZ(i,j).EQ.0.) THEN
155 r_hFacZ(i,j) = 0. _d 0
156 ELSE
157 r_hFacZ(i,j) = 1. _d 0/hFacZ(i,j)
158 ENDIF
159 ENDDO
160 ENDDO
161 #ifdef ALLOW_AUTODIFF_TAMC
162 CADJ STORE r_hFacZ(:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
163 #endif /* ALLOW_AUTODIFF_TAMC */
164
165 #else /* not ALLOW_DEPTH_CONTROL */
166
167 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
168
169 C- Initialize hFacZ:
170 c DO j=1-OLy,sNy+OLy
171 c DO i=1-OLx,sNx+OLx
172 c hFacZ(i,j)=0.
173 c ENDDO
174 c ENDDO
175
176 C-- 1rst row & column are not computed: fill with zero
177 DO i=1-OLx,sNx+OLx
178 hFacZ(i,1-OLy)=0.
179 ENDDO
180 DO j=2-OLy,sNy+OLy
181 hFacZ(1-OLx,j)=0.
182 ENDDO
183
184 C-- Calculate open water fraction at vorticity points
185
186 IF ( hZoption.EQ.2 ) THEN
187 DO j=2-OLy,sNy+OLy
188 DO i=2-OLx,sNx+OLx
189 c hFacZOpen=
190 c & ( _hFacW(i, j ,k,bi,bj)*rAw(i, j ,bi,bj)
191 c & +_hFacW(i,j-1,k,bi,bj)*rAw(i,j-1,bi,bj) )
192 c & + ( _hFacS( i ,j,k,bi,bj)*rAs( i ,j,bi,bj)
193 c & +_hFacS(i-1,j,k,bi,bj)*rAs(i-1,j,bi,bj) )
194 c hFacZ(i,j) = 0.25 _d 0 * hFacZOpen*recip_rAz(i,j,bi,bj)
195 hFacZOpen=
196 & ( _hFacW(i, j ,k,bi,bj)
197 & +_hFacW(i,j-1,k,bi,bj) )
198 & + ( _hFacS( i ,j,k,bi,bj)
199 & +_hFacS(i-1,j,k,bi,bj) )
200 hFacZ(i,j) = 0.25 _d 0 * hFacZOpen
201 ENDDO
202 ENDDO
203 ELSEIF ( hZoption.EQ.1 ) THEN
204 DO j=2-OLy,sNy+OLy
205 DO i=2-OLx,sNx+OLx
206 c hFacZOpen=MIN(
207 c & _hFacW(i, j ,k,bi,bj)*rAw(i, j ,bi,bj)
208 c & + _hFacW(i,j-1,k,bi,bj)*rAw(i,j-1,bi,bj)
209 c & , _hFacS( i ,j,k,bi,bj)*rAs( i ,j,bi,bj)
210 c & + _hFacS(i-1,j,k,bi,bj)*rAs(i-1,j,bi,bj)
211 c & )
212 c hFacZ(i,j) = 0.5 _d 0 * hFacZOpen*recip_rAz(i,j,bi,bj)
213 hFacZOpen=MIN(
214 & _hFacW(i, j ,k,bi,bj)
215 & + _hFacW(i,j-1,k,bi,bj)
216 & , _hFacS( i ,j,k,bi,bj)
217 & + _hFacS(i-1,j,k,bi,bj)
218 & )
219 hFacZ(i,j) = 0.5 _d 0 * hFacZOpen
220 ENDDO
221 ENDDO
222 ELSE
223 DO j=2-OLy,sNy+OLy
224 DO i=2-OLx,sNx+OLx
225 hFacZOpen=MIN(_hFacW(i,j,k,bi,bj),
226 & _hFacW(i,j-1,k,bi,bj))
227 hFacZOpen=MIN(_hFacS(i,j,k,bi,bj),hFacZOpen)
228 hFacZOpen=MIN(_hFacS(i-1,j,k,bi,bj),hFacZOpen)
229 hFacZ(i,j)=hFacZOpen
230 ENDDO
231 ENDDO
232 ENDIF
233
234 C-----------------------------------------
235 C Special stuff for Cubed Sphere
236 IF ( useCubedSphereExchange .AND. hZoption.GE.1 ) THEN
237
238 #ifdef ALLOW_EXCH2
239 myTile = W2_myTileList(bi,bj)
240 myFace = exch2_myFace(myTile)
241 southWestCorner = exch2_isWedge(myTile).EQ.1
242 & .AND. exch2_isSedge(myTile).EQ.1
243 southEastCorner = exch2_isEedge(myTile).EQ.1
244 & .AND. exch2_isSedge(myTile).EQ.1
245 northEastCorner = exch2_isEedge(myTile).EQ.1
246 & .AND. exch2_isNedge(myTile).EQ.1
247 northWestCorner = exch2_isWedge(myTile).EQ.1
248 & .AND. exch2_isNedge(myTile).EQ.1
249 #else
250 myFace = bi
251 southWestCorner = .TRUE.
252 southEastCorner = .TRUE.
253 northWestCorner = .TRUE.
254 northEastCorner = .TRUE.
255 #endif /* ALLOW_EXCH2 */
256
257 IF ( southWestCorner ) THEN
258 i=1
259 j=1
260 IF ( hZoption.EQ.1 ) THEN
261 hFacZOpen=MIN(_hFacW(i,j,k,bi,bj),
262 & _hFacW(i,j-1,k,bi,bj))
263 hFacZOpen=MIN(_hFacS(i,j,k,bi,bj),hFacZOpen)
264 hFacZ(i,j)=hFacZOpen
265 ELSE
266 IF ( MOD(myFace,2).EQ.1 ) THEN
267 hFacZOpen=
268 & ( _hFacW(i,j-1,k,bi,bj)
269 & +_hFacS( i ,j,k,bi,bj) )
270 & + _hFacW(i, j ,k,bi,bj)
271 ELSE
272 hFacZOpen=
273 & ( _hFacW(i, j ,k,bi,bj)
274 & +_hFacW(i,j-1,k,bi,bj) )
275 & + _hFacS( i ,j,k,bi,bj)
276 ENDIF
277 hFacZ(i,j) = hFacZOpen / 3. _d 0
278 ENDIF
279 ENDIF
280
281 IF ( southEastCorner ) THEN
282 i=sNx+1
283 j=1
284 C- to get the same truncation, independent from the face Nb:
285 IF ( hZoption.EQ.1 ) THEN
286 hFacZOpen=MIN(_hFacW(i,j,k,bi,bj),
287 & _hFacW(i,j-1,k,bi,bj))
288 hFacZOpen=MIN(_hFacS(i-1,j,k,bi,bj),hFacZOpen)
289 hFacZ(i,j)=hFacZOpen
290 ELSE
291 IF ( myFace.EQ.4 ) THEN
292 hFacZOpen=
293 & ( _hFacS(i-1,j,k,bi,bj)
294 & +_hFacW(i,j-1,k,bi,bj) )
295 & + _hFacW(i, j ,k,bi,bj)
296 ELSEIF ( myFace.EQ.6 ) THEN
297 hFacZOpen=
298 & ( _hFacW(i,j-1,k,bi,bj)
299 & +_hFacW(i, j ,k,bi,bj) )
300 & + _hFacS(i-1,j,k,bi,bj)
301 ELSE
302 hFacZOpen=
303 & ( _hFacW(i, j ,k,bi,bj)
304 & +_hFacS(i-1,j,k,bi,bj) )
305 & + _hFacW(i,j-1,k,bi,bj)
306 ENDIF
307 hFacZ(i,j) = hFacZOpen / 3. _d 0
308 ENDIF
309 ENDIF
310
311 IF ( northWestCorner ) THEN
312 i=1
313 j=sNy+1
314 C- to get the same truncation, independent from the face Nb:
315 IF ( hZoption.EQ.1 ) THEN
316 hFacZOpen=MIN(_hFacW(i,j,k,bi,bj),
317 & _hFacW(i,j-1,k,bi,bj))
318 hFacZOpen=MIN(_hFacS(i,j,k,bi,bj),hFacZOpen)
319 hFacZ(i,j)=hFacZOpen
320 ELSE
321 IF ( myFace.EQ.1 ) THEN
322 hFacZOpen=
323 & ( _hFacS( i ,j,k,bi,bj)
324 & +_hFacW(i, j ,k,bi,bj) )
325 & + _hFacW(i,j-1,k,bi,bj)
326 ELSEIF ( myFace.EQ.5 ) THEN
327 hFacZOpen=
328 & ( _hFacW(i, j ,k,bi,bj)
329 & +_hFacW(i,j-1,k,bi,bj) )
330 & + _hFacS( i ,j,k,bi,bj)
331 ELSE
332 hFacZOpen=
333 & ( _hFacW(i,j-1,k,bi,bj)
334 & +_hFacS( i ,j,k,bi,bj) )
335 & + _hFacW(i, j ,k,bi,bj)
336 ENDIF
337 hFacZ(i,j) = hFacZOpen / 3. _d 0
338 ENDIF
339 ENDIF
340
341 IF ( northEastCorner ) THEN
342 i=sNx+1
343 j=sNy+1
344 IF ( hZoption.EQ.1 ) THEN
345 hFacZOpen=MIN(_hFacW(i,j,k,bi,bj),
346 & _hFacW(i,j-1,k,bi,bj))
347 hFacZOpen=MIN(_hFacS(i-1,j,k,bi,bj),hFacZOpen)
348 hFacZ(i,j)=hFacZOpen
349 ELSE
350 IF ( MOD(myFace,2).EQ.1 ) THEN
351 hFacZOpen=
352 & ( _hFacW(i,j-1,k,bi,bj)
353 & +_hFacW(i, j ,k,bi,bj) )
354 & + _hFacS(i-1,j,k,bi,bj)
355 ELSE
356 hFacZOpen=
357 & ( _hFacW(i, j ,k,bi,bj)
358 & +_hFacS(i-1,j,k,bi,bj) )
359 & + _hFacW(i,j-1,k,bi,bj)
360 ENDIF
361 hFacZ(i,j) = hFacZOpen / 3. _d 0
362 ENDIF
363 ENDIF
364
365 ENDIF
366 C Special Cubed Sphere block ends here
367 C-----------------------------------------
368
369 C-- Calculate reciprol:
370 DO j=1-OLy,sNy+OLy
371 DO i=1-OLx,sNx+OLx
372 IF (hFacZ(i,j).EQ.0.) THEN
373 r_hFacZ(i,j) = 0.
374 ELSE
375 r_hFacZ(i,j) = 1. _d 0/hFacZ(i,j)
376 ENDIF
377 ENDDO
378 ENDDO
379
380 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
381 #endif /* ALLOW_DEPTH_CONTROL */
382
383 RETURN
384 END

  ViewVC Help
Powered by ViewVC 1.1.22