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

Annotation 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 - (hide annotations) (download)
Wed May 19 01:56:54 2010 UTC (13 years, 11 months 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 jmc 1.6 C $Header: /u/gcmpack/MITgcm/eesupp/src/exch_z_rx_cube.template,v 1.5 2010/05/04 00:39:52 jmc Exp $
2 cnh 1.3 C $Name: $
3 adcroft 1.2
4     #include "CPP_EEOPTIONS.h"
5    
6 cnh 1.3 CBOP
7    
8     C !ROUTINE: EXCH_Z_RX_CUBE
9    
10     C !INTERFACE:
11 jmc 1.4 SUBROUTINE EXCH_Z_RX_CUBE(
12 adcroft 1.2 U array,
13     I myOLw, myOLe, myOLn, myOLs, myNz,
14     I exchWidthX, exchWidthY,
15     I simulationMode, cornerMode, myThid )
16     IMPLICIT NONE
17 cnh 1.3 C !DESCRIPTION:
18     C *==========================================================*
19 jmc 1.4 C | SUBROUTINE EXCH_Z_RX_CUBE
20     C | o Control edge exchanges for RX zeta point array on CS
21 cnh 1.3 C *==========================================================*
22 jmc 1.4 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 cnh 1.3 C *==========================================================*
44 adcroft 1.2
45 cnh 1.3 C !USES:
46 adcroft 1.2 C == Global data ==
47     #include "SIZE.h"
48     #include "EEPARAMS.h"
49     #include "EESUPPORT.h"
50     #include "EXCH.h"
51    
52 cnh 1.3 C !INPUT/OUTPUT PARAMETERS:
53 adcroft 1.2 C == Routine arguments ==
54 cnh 1.3 C array :: Array with edges to exchange.
55     C myOLw :: West, East, North and South overlap region sizes.
56 adcroft 1.2 C myOLe
57     C myOLn
58     C myOLs
59 cnh 1.3 C exchWidthX :: Width of data region exchanged in X.
60     C exchWidthY :: Width of data region exchanged in Y.
61 jmc 1.4 C Note --
62 cnh 1.3 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 jmc 1.4 C tile face. Dont know if this would be useful. I
67     C have left it out for now as it requires additional
68 cnh 1.3 C bookeeping.
69 jmc 1.4 C simulationMode :: Forward or reverse mode exchange ( provides
70 cnh 1.3 C support for adjoint integration of code. )
71 jmc 1.4 C cornerMode :: Flag indicating whether corner updates are
72 cnh 1.3 C needed.
73     C myThid :: Thread number of this instance of S/R EXCH...
74 adcroft 1.2 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 jmc 1.4 & 1-myOLs:sNy+myOLn,
86 adcroft 1.2 & myNZ, nSx, nSy)
87    
88 cnh 1.3 C !LOCAL VARIABLES:
89 adcroft 1.2 C == Local variables ==
90 cnh 1.3 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 jmc 1.4 CHARACTER*(MAX_LEN_MBUF) msgBuf
95 jmc 1.5 c INTEGER theSimulationMode
96     c INTEGER theCornerMode
97 adcroft 1.2 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 cnh 1.3 CEOP
103 adcroft 1.2
104 jmc 1.5 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 jmc 1.4 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 jmc 1.5 c theSimulationMode = simulationMode
121     c theCornerMode = cornerMode
122 adcroft 1.2
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