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

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

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


Revision 1.1 - (hide annotations) (download)
Tue May 12 19:40:32 2009 UTC (15 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62e, checkpoint62d, checkpoint61o, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q, checkpoint61z, checkpoint61x, checkpoint61y
new code to set-up W2-Exch2 topology (replace matlab-topology-generator)
 read parameter file "data.exch2" if it exist ; otherwise try default
 regular cube without blank-tile.

1 jmc 1.1 C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_e2setup.F,v 1.3 2008/07/29 20:25:23 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 toplogy 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 meesage 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