/[MITgcm]/MITgcm/eesupp/src/fill_cs_corner_tr_rl.F
ViewVC logotype

Contents of /MITgcm/eesupp/src/fill_cs_corner_tr_rl.F

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


Revision 1.3 - (show annotations) (download)
Thu Aug 16 02:11:19 2007 UTC (16 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59g, checkpoint59f, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint61d, checkpoint61b, checkpoint61c, checkpoint61a
Changes since 1.2: +27 -21 lines
add argument "withSigns" (needed for SOM_xy moment)

1 C $Header: /u/gcmpack/MITgcm/eesupp/src/fill_cs_corner_tr_rl.F,v 1.2 2005/11/05 01:07:30 jmc Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_EEOPTIONS.h"
6
7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
8 CBOP
9 C !ROUTINE: FILL_CS_CORNER_TR_RL
10
11 C !INTERFACE:
12 SUBROUTINE FILL_CS_CORNER_TR_RL(
13 I fill4dirX, withSigns,
14 U trFld,
15 I bi,bj, myThid)
16
17 C !DESCRIPTION:
18 C *==========================================================*
19 C | SUBROUTINE FILL_CS_CORNER_TR_RL
20 C | o Fill the corner-halo region of CS-grid,
21 C | for a tracer variable (center of grid cell)
22 C *==========================================================*
23 C | o the corner halo region is filled with valid values
24 C | in order to compute (later on) gradient in X or Y
25 C | direction, on a wide stencil.
26 C *==========================================================*
27
28 C !USES:
29 IMPLICIT NONE
30
31 C == Global variables ==
32 #include "SIZE.h"
33 #include "EEPARAMS.h"
34 #ifdef ALLOW_EXCH2
35 #include "W2_EXCH2_TOPOLOGY.h"
36 #include "W2_EXCH2_PARAMS.h"
37 #endif /* ALLOW_EXCH2 */
38
39 C !INPUT/OUTPUT PARAMETERS:
40 C == Routine arguments ==
41 C
42 C fill4dirX :: True = prepare for X direction calculations
43 C otherwise, prepare for Y direction
44 C withSigns :: True = account for sign of X & Y directions
45 C trFld :: tracer field array with empty corners to fill
46 C bi,bj :: tile indices
47 C myThid :: thread number
48 LOGICAL fill4dirX
49 LOGICAL withSigns
50 _RL trFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
51 INTEGER bi,bj
52 INTEGER myThid
53
54 C !LOCAL VARIABLES:
55 C == Local variables ==
56 C i,j :: loop indices
57 C myTile :: tile number
58 INTEGER i,j
59 LOGICAL southWestCorner
60 LOGICAL southEastCorner
61 LOGICAL northWestCorner
62 LOGICAL northEastCorner
63 _RL negOne
64 #ifdef ALLOW_EXCH2
65 INTEGER myTile
66 #endif
67 CEOP
68
69 negOne = 1.
70 IF (withSigns) negOne = -1.
71
72 IF (useCubedSphereExchange) THEN
73
74 #ifdef ALLOW_EXCH2
75 myTile = W2_myTileList(bi)
76 southWestCorner = exch2_isWedge(myTile).EQ.1
77 & .AND. exch2_isSedge(myTile).EQ.1
78 southEastCorner = exch2_isEedge(myTile).EQ.1
79 & .AND. exch2_isSedge(myTile).EQ.1
80 northEastCorner = exch2_isEedge(myTile).EQ.1
81 & .AND. exch2_isNedge(myTile).EQ.1
82 northWestCorner = exch2_isWedge(myTile).EQ.1
83 & .AND. exch2_isNedge(myTile).EQ.1
84 #else
85 southWestCorner = .TRUE.
86 southEastCorner = .TRUE.
87 northWestCorner = .TRUE.
88 northEastCorner = .TRUE.
89 #endif
90
91 IF ( fill4dirX ) THEN
92 C-- Internal exchange for calculations in X
93
94 C- For cube face corners we need to duplicate the
95 C- i-1 and i+1 values into the null space as follows:
96 C
97 C
98 C o NW corner: copy T( 0,sNy ) into T( 0,sNy+1) e.g.
99 C |
100 C x T(0,sNy+1) |
101 C /\ |
102 C --||------------|-----------
103 C || |
104 C x T(0,sNy) | x T(1,sNy)
105 C |
106 C
107 C o SW corner: copy T(0,1) into T(0,0) e.g.
108 C |
109 C x T(0,1) | x T(1,1)
110 C || |
111 C --||------------|-----------
112 C \/ |
113 C x T(0,0) |
114 C |
115 C
116 C o NE corner: copy T(sNx+1,sNy ) into T(sNx+1,sNy+1) e.g.
117 C |
118 C | x T(sNx+1,sNy+1)
119 C | /\
120 C ----------------|--||-------
121 C | ||
122 C x T(sNx,sNy) | x T(sNx+1,sNy )
123 C |
124 C o SE corner: copy T(sNx+1,1 ) into T(sNx+1,0 ) e.g.
125 C |
126 C x T(sNx,1) | x T(sNx+1, 1)
127 C | ||
128 C ----------------|--||-------
129 C | \/
130 C | x T(sNx+1, 0)
131 IF ( southWestCorner ) THEN
132 DO j=1,OLy
133 DO i=1,OLx
134 trFld( 1-i , 1-j ) = negOne*trFld( 1-j , i )
135 ENDDO
136 ENDDO
137 ENDIF
138 IF ( southEastCorner ) THEN
139 DO j=1,OLy
140 DO i=1,OLx
141 trFld(sNx+i, 1-j ) = negOne*trFld(sNx+j, i )
142 ENDDO
143 ENDDO
144 ENDIF
145 IF ( northWestCorner ) THEN
146 DO j=1,OLy
147 DO i=1,OLx
148 trFld( 1-i ,sNy+j) = negOne*trFld( 1-j , sNy+1-i )
149 ENDDO
150 ENDDO
151 ENDIF
152 IF ( northEastCorner ) THEN
153 DO j=1,OLy
154 DO i=1,OLx
155 trFld(sNx+i,sNy+j) = negOne*trFld(sNx+j, sNy+1-i )
156 ENDDO
157 ENDDO
158 ENDIF
159
160 C-- End of X direction ; start Y direction case.
161
162 ELSE
163 C-- Internal exchange for calculations in Y
164
165 C- For cube face corners we need to duplicate the
166 C- j-1 and j+1 values into the null space as follows:
167 C
168 C o SW corner: copy T(0,1) into T(0,0) e.g.
169 C |
170 C | x T(1,1)
171 C |
172 C ----------------|-----------
173 C |
174 C x T(0,0)<====== x T(1,0)
175 C |
176 C
177 C o NW corner: copy T( 0,sNy ) into T( 0,sNy+1) e.g.
178 C |
179 C x T(0,sNy+1)<=== x T(1,sNy+1)
180 C |
181 C ----------------|-----------
182 C |
183 C | x T(1,sNy)
184 C |
185 C
186 C o NE corner: copy T(sNx+1,sNy ) into T(sNx+1,sNy+1) e.g.
187 C |
188 C x T(sNx,sNy+1)=====>x T(sNx+1,sNy+1)
189 C |
190 C ----------------|-----------
191 C |
192 C x T(sNx,sNy) |
193 C |
194 C o SE corner: copy T(sNx+1,1 ) into T(sNx+1,0 ) e.g.
195 C |
196 C x T(sNx,1) |
197 C |
198 C ----------------|-----------
199 C |
200 C x T(sNx,0) =====>x T(sNx+1, 0)
201 IF ( southWestCorner ) THEN
202 DO j=1,Oly
203 DO i=1,Olx
204 trFld( 1-i , 1-j ) = negOne*trFld( j , 1-i )
205 ENDDO
206 ENDDO
207 ENDIF
208 IF ( southEastCorner ) THEN
209 DO j=1,Oly
210 DO i=1,Olx
211 trFld(sNx+i, 1-j ) = negOne*trFld(sNx+1-j, 1-i )
212 ENDDO
213 ENDDO
214 ENDIF
215 IF ( northWestCorner ) THEN
216 DO j=1,Oly
217 DO i=1,Olx
218 trFld( 1-i ,sNy+j) = negOne*trFld( j ,sNy+i)
219 ENDDO
220 ENDDO
221 ENDIF
222 IF ( northEastCorner ) THEN
223 DO j=1,Oly
224 DO i=1,Olx
225 trFld(sNx+i,sNy+j) = negOne*trFld(sNx+1-j,sNy+i)
226 ENDDO
227 ENDDO
228 ENDIF
229
230 C- End of Y direction case.
231 ENDIF
232
233 C-- End useCubedSphereExchange
234 ENDIF
235
236 RETURN
237 END

  ViewVC Help
Powered by ViewVC 1.1.22