/[MITgcm]/MITgcm/eesupp/src/exch_z_rx_cube.template
ViewVC logotype

Contents of /MITgcm/eesupp/src/exch_z_rx_cube.template

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


Revision 1.6 - (show annotations) (download)
Wed May 19 01:56:54 2010 UTC (14 years ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +1 -1 lines
FILE REMOVED
remove old version (renamed exch1_* without argument "simulationMode")

1 C $Header: /u/gcmpack/MITgcm/eesupp/src/exch_z_rx_cube.template,v 1.5 2010/05/04 00:39:52 jmc Exp $
2 C $Name: $
3
4 #include "CPP_EEOPTIONS.h"
5
6 CBOP
7
8 C !ROUTINE: EXCH_Z_RX_CUBE
9
10 C !INTERFACE:
11 SUBROUTINE EXCH_Z_RX_CUBE(
12 U array,
13 I myOLw, myOLe, myOLn, myOLs, myNz,
14 I exchWidthX, exchWidthY,
15 I simulationMode, cornerMode, myThid )
16 IMPLICIT NONE
17 C !DESCRIPTION:
18 C *==========================================================*
19 C | SUBROUTINE EXCH_Z_RX_CUBE
20 C | o Control edge exchanges for RX zeta point array on CS
21 C *==========================================================*
22 C |
23 C | Controlling routine for exchange of XY edges of an array
24 C | distributed in X and Y. The routine interfaces to
25 C | communication routines that can use messages passing
26 C | exchanges, put type exchanges or get type exchanges.
27 C | This allows anything from MPI to raw memory channel to
28 C | memmap segments to be used as a inter-process and/or
29 C | inter-thread communiation and synchronisation
30 C | mechanism.
31 C | Notes --
32 C | 1. Some low-level mechanisms such as raw memory-channel
33 C | or SGI/CRAY shmem put do not have direct Fortran bindings
34 C | and are invoked through C stub routines.
35 C | 2. Although this routine is fairly general but it does
36 C | require nSx and nSy are the same for all innvocations.
37 C | There are many common data structures ( myByLo,
38 C | westCommunicationMode, mpiIdW etc... ) tied in with
39 C | (nSx,nSy). To support arbitray nSx and nSy would require
40 C | general forms of these.
41 C | 3. zeta coord exchange operation for cube sphere grid
42 C |
43 C *==========================================================*
44
45 C !USES:
46 C == Global data ==
47 #include "SIZE.h"
48 #include "EEPARAMS.h"
49 #include "EESUPPORT.h"
50 #include "EXCH.h"
51
52 C !INPUT/OUTPUT PARAMETERS:
53 C == Routine arguments ==
54 C array :: Array with edges to exchange.
55 C myOLw :: West, East, North and South overlap region sizes.
56 C myOLe
57 C myOLn
58 C myOLs
59 C exchWidthX :: Width of data region exchanged in X.
60 C exchWidthY :: Width of data region exchanged in Y.
61 C Note --
62 C 1. In theory one could have a send width and
63 C a receive width for each face of each tile. The only
64 C restriction woul be that the send width of one
65 C face should equal the receive width of the sent to
66 C tile face. Dont know if this would be useful. I
67 C have left it out for now as it requires additional
68 C bookeeping.
69 C simulationMode :: Forward or reverse mode exchange ( provides
70 C support for adjoint integration of code. )
71 C cornerMode :: Flag indicating whether corner updates are
72 C needed.
73 C myThid :: Thread number of this instance of S/R EXCH...
74 INTEGER myOLw
75 INTEGER myOLe
76 INTEGER myOLs
77 INTEGER myOLn
78 INTEGER myNz
79 INTEGER exchWidthX
80 INTEGER exchWidthY
81 INTEGER simulationMode
82 INTEGER cornerMode
83 INTEGER myThid
84 _RX array(1-myOLw:sNx+myOLe,
85 & 1-myOLs:sNy+myOLn,
86 & myNZ, nSx, nSy)
87
88 C !LOCAL VARIABLES:
89 C == Local variables ==
90 C theSimulationMode :: Holds working copy of simulation mode
91 C theCornerMode :: Holds working copy of corner mode
92 C I,J,K,repeat :: Loop counters and index
93 C bl,bt,bn,bs,be,bw
94 CHARACTER*(MAX_LEN_MBUF) msgBuf
95 c INTEGER theSimulationMode
96 c INTEGER theCornerMode
97 INTEGER I,J,K,repeat
98 INTEGER bl,bt,bn,bs,be,bw
99 C == Statement function ==
100 INTEGER tilemod
101 tilemod(I)=1+mod(I-1+6,6)
102 CEOP
103
104 IF ( simulationMode.EQ.REVERSE_SIMULATION ) THEN
105 WRITE(msgBuf,'(A)') 'EXCH_Z_RX_CUBE: AD mode not implemented'
106 CALL PRINT_ERROR( msgBuf, myThid )
107 STOP 'ABNORMAL END: EXCH_Z_RX_CUBE: no AD code'
108 ENDIF
109 IF ( sNx.NE.sNy .OR.
110 & nSx.NE.6 .OR. nSy.NE.1 .OR.
111 & nPx.NE.1 .OR. nPy.NE.1 ) THEN
112 WRITE(msgBuf,'(2A)') 'EXCH_Z_RX_CUBE: Wrong Tiling'
113 CALL PRINT_ERROR( msgBuf, myThid )
114 WRITE(msgBuf,'(2A)') 'EXCH_Z_RX_CUBE: ',
115 & 'works only with sNx=sNy & nSx=6 & nSy=nPx=nPy=1'
116 CALL PRINT_ERROR( msgBuf, myThid )
117 STOP 'ABNORMAL END: EXCH_Z_RX_CUBE: Wrong Tiling'
118 ENDIF
119
120 c theSimulationMode = simulationMode
121 c theCornerMode = cornerMode
122
123 C For now tile<->tile exchanges are sequentialised through
124 C thread 1. This is a temporary feature for preliminary testing until
125 C general tile decomposistion is in place (CNH April 11, 2001)
126 CALL BAR2( myThid )
127 IF ( myThid .EQ. 1 ) THEN
128
129 DO repeat=1,2
130
131 DO bl = 1, 5, 2
132
133 bt = bl
134 bn=tilemod(bt+2)
135 bs=tilemod(bt-1)
136 be=tilemod(bt+1)
137 bw=tilemod(bt-2)
138
139 DO K = 1, myNz
140 DO J = 1, sNy+1
141 DO I = 0, exchWidthX-1
142
143 C Tile Odd:Odd+2 [get] [North<-West]
144 array(J,sNy+I+1,K,bt,1) = array(I+1,sNy+2-J,K,bn,1)
145 C Tile Odd:Odd+1 [get] [East<-West]
146 array(sNx+I+1,J,K,bt,1) = array(I+1,J,K,be,1)
147
148 cs- these above loop should really have the same range the lower one
149 ENDDO
150 DO I = 1, exchWidthX-0
151 cs- but this replaces the missing I/O routines for now
152
153 C Tile Odd:Odd-1 [get] [South<-North]
154 array(J,1-I,K,bt,1) = array(J,sNy+1-I,K,bs,1)
155 C Tile Odd:Odd-2 [get] [West<-North]
156 array(1-I,J,K,bt,1) = array(sNx+2-J,sNy+1-I,K,bw,1)
157
158 ENDDO
159 ENDDO
160 ENDDO
161
162 bt = bl+1
163 bn=tilemod(bt+1)
164 bs=tilemod(bt-2)
165 be=tilemod(bt+2)
166 bw=tilemod(bt-1)
167
168 DO K = 1, myNz
169 DO J = 1, sNy+1
170 DO I = 0, exchWidthX-1
171
172 C Tile Even:Even+1 [get] [North<-South]
173 array(J,sNy+I+1,K,bt,1) = array(J,I+1,K,bn,1)
174 C Tile Even:Even+2 [get] [East<-South]
175 array(sNx+I+1,J,K,bt,1) = array(sNx+2-J,I+1,K,be,1)
176
177 cs- these above loop should really have the same range the lower one
178 ENDDO
179 DO I = 1, exchWidthX-0
180 cs- but this replaces the missing I/O routines for now
181
182 C Tile Even:Even-2 [get] [South<-East]
183 array(J,1-I,K,bt,1) = array(sNx+1-I,sNy+2-J,K,bs,1)
184 C Tile Even:Even-1 [get] [West<-East]
185 array(1-I,J,K,bt,1) = array(sNx+1-I,J,K,bw,1)
186
187 ENDDO
188 ENDDO
189 ENDDO
190
191 ENDDO
192
193 ENDDO
194
195 ENDIF
196 CALL BAR2(myThid)
197
198 RETURN
199 END

  ViewVC Help
Powered by ViewVC 1.1.22