/[MITgcm]/MITgcm/pkg/exch2/w2_set_f2f_index.F
ViewVC logotype

Contents of /MITgcm/pkg/exch2/w2_set_f2f_index.F

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


Revision 1.2 - (show annotations) (download)
Fri Apr 23 20:21:06 2010 UTC (14 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint63, 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, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint62g, checkpoint62f, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x, HEAD
Changes since 1.1: +3 -3 lines
fix propagating typo (& others) in variable description

1 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_set_f2f_index.F,v 1.1 2009/05/12 19:40:32 jmc Exp $
2 C $Name: $
3
4 #include "CPP_EEOPTIONS.h"
5 #include "W2_OPTIONS.h"
6
7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
8 CBOP 0
9 C !ROUTINE: W2_SET_F2F_INDEX
10
11 C !INTERFACE:
12 SUBROUTINE W2_SET_F2F_INDEX( myThid )
13
14 C !DESCRIPTION:
15 C Set-up index correspondence matrix for connected Facet-Edges
16
17 C !USES:
18 IMPLICIT NONE
19
20 C Tile topology settings data structures
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "W2_EXCH2_SIZE.h"
24 #include "W2_EXCH2_PARAMS.h"
25 #include "W2_EXCH2_TOPOLOGY.h"
26
27 C !INPUT PARAMETERS:
28 C myThid :: my Thread Id number
29 C (Note: not relevant since threading has not yet started)
30 INTEGER myThid
31
32 C !LOCAL VARIABLES:
33 C === Local variables ===
34 C msgBuf :: Informational/error message buffer
35 CHARACTER*(MAX_LEN_MBUF) msgBuf
36 CHARACTER*1 edge(4)
37 INTEGER i, j, ii, jj, i1, j1, k, lo, ll
38 INTEGER errCnt
39 INTEGER chk1, chk2, chk3, chk4, chk5, chk6
40 LOGICAL prtFlag
41 CEOP
42 DATA edge / 'N' , 'S' , 'E' , 'W' /
43
44 WRITE(msgBuf,'(2A)') 'W2_SET_F2F_INDEX:',
45 & ' index matrix for connected Facet-Edges:'
46 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
47 prtFlag = ABS(W2_printMsg).GE.2
48 & .OR. ( W2_printMsg .NE.0 .AND. myProcId.EQ.0 )
49
50 C-- Check Topology
51 errCnt = 0
52 DO j=1,nFacets
53 DO i=1,4
54 C- connected to:
55 jj = INT(facet_link(i,j))
56 ii = MOD( NINT(facet_link(i,j)*10.), 10 )
57 IF ( facet_link(i,j).EQ. 0. ) THEN
58 WRITE(msgBuf,'(3A,I3,A,F6.2,A)')
59 & '** WARNING ** ', edge(i), '.Edge of facet #',
60 & j, ' disconnected (facet_link=',facet_link(i,j),')'
61 CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
62 CALL PRINT_MESSAGE( msgBuf,errorMessageUnit,SQUEEZE_RIGHT,1 )
63 ELSEIF ( jj.LT.1 .OR. jj.GT.nFacets
64 & .OR. ii.LT.1 .OR. ii.GT.4 ) THEN
65 WRITE(msgBuf,'(2A,I3,A,F6.2,A)') edge(i), '.Edge of facet #',
66 & j, ' : bad connection (facet_link=',facet_link(i,j),')'
67 CALL PRINT_ERROR( msgBuf, myThid )
68 errCnt = errCnt + 1
69 ELSE
70 C- check connection is set-up both ways:
71 j1 = INT(facet_link(ii,jj))
72 i1 = MOD( NINT(facet_link(ii,jj)*10.), 10 )
73 IF ( j1.NE.j .OR. i1.NE.i ) THEN
74 WRITE(msgBuf,'(2(2A,I3,A),F5.2,A)')
75 & edge(i), '.Edge facet #', j,' connect to: ',
76 & edge(ii),'.Edge facet #',jj,' (',facet_link(i,j),' )'
77 CALL PRINT_ERROR( msgBuf, myThid )
78 IF ( i1.GE.1 .AND. i1.LE.4 ) THEN
79 WRITE(msgBuf,'(A,2(2A,I3,A),F5.2,A)') ' but ',
80 & edge(ii),'.Edge facet #',jj,' connect to: ',
81 & edge(i1),'.Edge facet #',j1,' (',facet_link(ii,jj),' )'
82 ELSE
83 WRITE(msgBuf,'(A,2(2A,I3,A),F5.2,A)') ' but ',
84 & edge(ii),'.Edge facet #',jj,' connect to: ',
85 & '?' ,'.Edge facet #',j1,' (',facet_link(ii,jj),' )'
86 ENDIF
87 CALL PRINT_ERROR( msgBuf, myThid )
88 errCnt = errCnt + 1
89 ENDIF
90 ENDIF
91 ENDDO
92 ENDDO
93 IF ( errCnt.GT.0 ) THEN
94 WRITE(msgBuf,'(A,I3,A)')
95 & ' W2_SET_F2F_INDEX: found', errCnt, ' Topology errors'
96 CALL PRINT_ERROR( msgBuf, myThid )
97 STOP 'ABNORMAL END: S/R W2_SET_F2F_INDEX'
98 ENDIF
99
100 C-- Check length of connection (facet size) between connected facet-edges
101 errCnt = 0
102 DO j=1,nFacets
103 DO i=1,4
104 C- Length of N or S Edge = x-size, E or W Edge = y-size
105 lo = 2*(j-1) + (i+1)/2
106 lo = facet_dims( lo )
107 C- connected to:
108 jj = INT(facet_link(i,j))
109 ii = MOD( NINT(facet_link(i,j)*10.), 10 )
110 IF ( jj.GE.1 ) THEN
111 ll = 2*(jj-1)+(ii+1)/2
112 ll = facet_dims( ll )
113 IF ( lo.NE.ll ) THEN
114 WRITE(msgBuf,'(3A,I3,A,I8,A)') 'Length of connection: ',
115 & edge(i), '.Edge facet #', j, ' (=',lo,')'
116 CALL PRINT_ERROR( msgBuf, myThid )
117 WRITE(msgBuf,'(3A,I3,A,I8,A)') ' to: ',
118 & edge(ii),'.Edge facet #', jj, ' (=',ll,') are different'
119 CALL PRINT_ERROR( msgBuf, myThid )
120 errCnt = errCnt + 1
121 ENDIF
122 C-- Set indices correspondence matrix (facet_pij):
123 C suffix "so" for indices of source facet j ;
124 C suffix "tg" for indices of target facet jj= INT(facet_link(i,j))
125 C pij(:,i,j) : matrix which gives so indices when applied to tg indices
126 C iso = pij(1)*itg + pij(2)*jtg + oi
127 C jso = pij(3)*itg + pij(4)*jtg + oj
128
129 C- Default: Same orientation (works for N <-> S or E <-> W)
130 facet_pij(1,i,j) = 1
131 facet_pij(2,i,j) = 0
132 facet_pij(3,i,j) = 0
133 facet_pij(4,i,j) = 1
134 C-- 1rst: cases with same orientation
135 IF ( i.EQ.1 .AND. ii.EQ.2 ) THEN
136 C- N <-- S ; [:,jHi]_so <-- [:,0]_tg
137 facet_oi(i,j) = 0
138 facet_oj(i,j) = +facet_dims(2*j)
139 ELSEIF ( i.EQ.2 .AND. ii.EQ.1 ) THEN
140 C- S <-- N ; [:, 1 ]_so <-- [:,1+jHi]_tg
141 facet_oi(i,j) = 0
142 facet_oj(i,j) = -facet_dims(2*jj)
143 ELSEIF ( i.EQ.3 .AND. ii.EQ.4 ) THEN
144 C- E <-- W ; [iHi,:]_so <-- [0,:]_tg
145 facet_oi(i,j) = +facet_dims(2*j-1)
146 facet_oj(i,j) = 0
147 ELSEIF ( i.EQ.4 .AND. ii.EQ.3 ) THEN
148 C- W <-- E (i=4 & ii=3); [ 1 ,:]_so <-- [iHi,:]_tg
149 facet_oi(i,j) = -facet_dims(2*jj-1)
150 facet_oj(i,j) = 0
151 C-- 2nd : cases where orientation changes
152 ELSEIF ( i.EQ.1 .AND. ii.EQ.4 ) THEN
153 C- N <-- W ; mapping W.face target indices to N.face source indices
154 C- [:,jHi]_so <-- [0,:]_tg
155 facet_pij(1,i,j) = 0
156 facet_pij(2,i,j) =-1
157 facet_pij(3,i,j) = 1
158 facet_pij(4,i,j) = 0
159 facet_oi(i,j) = lo+1
160 facet_oj(i,j) = +facet_dims(2*j)
161 ELSEIF ( i.EQ.2 .AND. ii.EQ.3 ) THEN
162 C- S <-- E ; mapping E.face target indices to S.face source indices
163 C- [:,1]_so <-- [1+iHi,:]_tg
164 facet_pij(1,i,j) = 0
165 facet_pij(2,i,j) =-1
166 facet_pij(3,i,j) = 1
167 facet_pij(4,i,j) = 0
168 facet_oi(i,j) = lo+1
169 facet_oj(i,j) = -facet_dims(2*jj-1)
170 ELSEIF ( i.EQ.3 .AND. ii.EQ.2 ) THEN
171 C- E <-- S ; mapping S.face target indices to E.face source indices
172 C- [iHi,:]_so <-- [:,0]_tg
173 facet_pij(1,i,j) = 0
174 facet_pij(2,i,j) = 1
175 facet_pij(3,i,j) =-1
176 facet_pij(4,i,j) = 0
177 facet_oi(i,j) = +facet_dims(2*j-1)
178 facet_oj(i,j) = lo+1
179 ELSEIF ( i.EQ.4 .AND. ii.EQ.1 ) THEN
180 C- W <-- N ; mapping N.face target indices to W.face source indices
181 C- [ 1 ,:]_so <-- [:,1+jHi]_tg
182 facet_pij(1,i,j) = 0
183 facet_pij(2,i,j) = 1
184 facet_pij(3,i,j) =-1
185 facet_pij(4,i,j) = 0
186 facet_oi(i,j) = -facet_dims(2*jj)
187 facet_oj(i,j) = lo+1
188 ELSE
189 WRITE(msgBuf,'(2(3A,I3),A)') ' connect ',
190 & edge(i), '.Edge (facet#', j, ' ) to: ',
191 & edge(ii),'.Edge (facet#', jj,' )'
192 CALL PRINT_ERROR( msgBuf, myThid )
193 WRITE(msgBuf,'(A)')
194 & ' W2_SET_F2F_INDEX: Connection not supported'
195 CALL PRINT_ERROR( msgBuf, myThid )
196 errCnt = errCnt + 1
197 ENDIF
198 C-- Print resulting index matrix:
199 IF ( prtFlag ) WRITE(W2_oUnit,'(2(3A,I3),A,4I3,A,2I6)')
200 & ' ', edge(i), '.Edge Facet', j, ' <-- ',
201 & edge(ii),'.Edge Facet', jj,
202 & ' : pij=', (facet_pij(k,i,j),k=1,4),
203 & ' ; oi,oj=', facet_oi(i,j), facet_oj(i,j)
204 ENDIF
205 ENDDO
206 ENDDO
207 IF ( errCnt.GT.0 ) THEN
208 WRITE(msgBuf,'(A,I3,A)')
209 & ' W2_SET_F2F_INDEX: found', errCnt, ' Connection errors'
210 CALL PRINT_ERROR( msgBuf, myThid )
211 STOP 'ABNORMAL END: S/R W2_SET_F2F_INDEX'
212 ENDIF
213
214 C-- Check indices correspondence matrix reciprocity :
215 C This is not necessary (if code above is right) ; However:
216 C a) reciprocity is used later-on => good to check;
217 C b) easy to add an error in setting offset => worth to check.
218 errCnt = 0
219 DO j=1,nFacets
220 DO i=1,4
221 C- connected to:
222 jj = INT(facet_link(i,j))
223 ii = MOD( NINT(facet_link(i,j)*10.), 10 )
224 IF ( jj.GE.1 ) THEN
225 C iso = pij(1)*( Pij(1)*iso + Pij(2)*jso + Oi )
226 C + pij(2)*( Pij(3)*iso + Pij(4)*jso + Oj )
227 C + oi
228 C jso = pij(3)*( Pij(1)*iso + Pij(2)*jso + Oi )
229 C + pij(4)*( Pij(3)*iso + Pij(4)*jso + Oj )
230 C + oj
231 C- Matrix product:
232 chk1 = facet_pij(1,i,j)*facet_pij(1,ii,jj)
233 & + facet_pij(2,i,j)*facet_pij(3,ii,jj)
234 chk2 = facet_pij(1,i,j)*facet_pij(2,ii,jj)
235 & + facet_pij(2,i,j)*facet_pij(4,ii,jj)
236 chk3 = facet_pij(3,i,j)*facet_pij(1,ii,jj)
237 & + facet_pij(4,i,j)*facet_pij(3,ii,jj)
238 chk4 = facet_pij(3,i,j)*facet_pij(2,ii,jj)
239 & + facet_pij(4,i,j)*facet_pij(4,ii,jj)
240 C- Offsets:
241 chk5 = facet_pij(1,i,j)*facet_oi(ii,jj)
242 & + facet_pij(2,i,j)*facet_oj(ii,jj)
243 & + facet_oi(i,j)
244 chk6 = facet_pij(3,i,j)*facet_oi(ii,jj)
245 & + facet_pij(4,i,j)*facet_oj(ii,jj)
246 & + facet_oj(i,j)
247 IF ( chk1.NE.1 .OR. chk2.NE.0 .OR. chk5.NE.0 .OR.
248 & chk3.NE.0 .OR. chk4.NE.1 .OR. chk6.NE.0 ) THEN
249 WRITE(msgBuf,'(2(3A,I3),A)') ' connect ',
250 & edge(i), '.Edge (facet#', j, ' ) to: ',
251 & edge(ii),'.Edge (facet#', jj,' )'
252 CALL PRINT_ERROR( msgBuf, myThid )
253 WRITE(msgBuf,'(A,4I4,2I8)')
254 & ' Bug in Matrix Product:',chk1,chk2,chk3,chk4,chk5,chk6
255 CALL PRINT_ERROR( msgBuf, myThid )
256 errCnt = errCnt + 1
257 ENDIF
258 ENDIF
259 ENDDO
260 ENDDO
261 IF ( errCnt.GT.0 ) THEN
262 WRITE(msgBuf,'(A,I3,A)')
263 & ' W2_SET_F2F_INDEX: found', errCnt, ' bugs in Matrix product'
264 CALL PRINT_ERROR( msgBuf, myThid )
265 STOP 'ABNORMAL END: S/R W2_SET_F2F_INDEX'
266 ENDIF
267
268 RETURN
269 END

  ViewVC Help
Powered by ViewVC 1.1.22