/[MITgcm]/MITgcm_contrib/exch3/ex3_send_rx2.template
ViewVC logotype

Annotation of /MITgcm_contrib/exch3/ex3_send_rx2.template

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


Revision 1.1 - (hide annotations) (download)
Thu Apr 6 20:36:26 2006 UTC (19 years, 2 months ago) by edhill
Branch: MAIN
CVS Tags: HEAD
move out of the model and into MITgcm_contrib

1 edhill 1.1 C $Header: /u/gcmpack/MITgcm/pkg/ex3/ex3_send_rx2.template,v 1.3 2006/02/06 21:09:54 edhill Exp $
2     C $Name: $
3    
4     #include "EX3_OPTIONS.h"
5    
6     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7     CBOP 0
8     C !ROUTINE: EX3_SEND_RX2
9    
10     C !INTERFACE:
11     SUBROUTINE EX3_SEND_RX2(
12     I bufftag, recvProc,
13     I along_i,
14     I prmat,
15     I il,ih,is, jl,jh,js, kl,kh,ks,
16     I io1,jo1,ko1, io2,jo2,ko2,
17     I idl1,idh1, jdl1,jdh1, kdl1,kdh1,
18     I array1,
19     I idl2,idh2, jdl2,jdh2, kdl2,kdh2,
20     I array2,
21     B buff, n_buff, msgID,
22     I commType,
23     I myThid )
24    
25     C !DESCRIPTION:
26     C Vector exchange routine which copies values from two input arrays,
27     C performs a rotation/permutation of the values, writes the values
28     C to two buffers in the specified order and then, if necessary,
29     C calls the appropriate MPI send functions.
30    
31     C !USES:
32     IMPLICIT NONE
33     #include "SIZE.h"
34     #include "EEPARAMS.h"
35     #include "EESUPPORT.h"
36    
37     C !INPUT PARAMETERS:
38     INTEGER bufftag, recvProc
39     LOGICAL along_i
40     INTEGER prmat(4)
41     INTEGER il,ih,is, jl,jh,js, kl,kh,ks
42     INTEGER io1,jo1,ko1, io2,jo2,ko2
43     INTEGER idl1,idh1, jdl1,jdh1, kdl1,kdh1
44     INTEGER idl2,idh2, jdl2,jdh2, kdl2,kdh2
45     _RX array1( idl1:idh1, jdl1:jdh1, kdl1:kdh1 )
46     _RX array2( idl2:idh2, jdl2:jdh2, kdl2:kdh2 )
47     INTEGER n_buff
48     _RX buff( n_buff )
49     INTEGER msgID(1)
50     CHARACTER commType
51     INTEGER myThid
52     CEOP
53    
54     C !LOCAL VARIABLES
55     INTEGER ii,jj,kk, ntb, nbv
56     #ifdef ALLOW_USE_MPI
57     INTEGER mpiid, mpirc
58     #endif
59     _RX prm(4), a1, a2
60     character*(100) msgbuf
61    
62     C Setup the affine (permute & rotate) matrix as a real of the same
63     C precision
64     DO ii = 1,4
65     prm(ii) = REAL(prmat(ii))
66     ENDDO
67    
68     C Calculate buffer sizes
69     nbv = IABS((ih-il+1)/is)
70     & * IABS((jh-jl+1)/js)
71     & * IABS((kh-kl+1)/ks)
72     IF ( nbv*2 .GT. n_buff ) THEN
73     WRITE(msgbuf,'(2a)') 'EX3_SEND_RX2 ERROR: buffer too small',
74     & '--please increase EX3_BUFF_FAC in ''EX3_SIZE.h'''
75     CALL print_error(msgbuf, mythid)
76     WRITE(msgbuf,'(a,i9)') ' current buffer length = ', n_buff
77     CALL print_error(msgbuf, mythid)
78     WRITE(msgbuf,'(a,i9)') ' requested buffer length = ', nbv*2
79     CALL print_error(msgbuf, mythid)
80     STOP 'ABNORMAL END: S/R EX3_SEND_RX2'
81     ENDIF
82    
83    
84     C Copy the values into the buffer in the specified order
85     ntb = 0
86     DO kk = kl, kh, ks
87     IF ( along_i ) THEN
88     C Here, the "i" dimension cycles fastest and it "measures" the
89     C overlap width
90     DO jj = jl, jh, js
91     DO ii = il, ih, is
92     ntb = ntb + 1
93     a1 = array1( ii+io1, jj+jo1, kk )
94     a2 = array2( ii+io2, jj+jo2, kk )
95     buff( ntb ) = prm(1)*a1 + prm(2)*a2
96     buff( nbv+ntb ) = prm(3)*a1 + prm(4)*a2
97     ENDDO
98     ENDDO
99     ELSE
100     C Here, the "j" dimension cycles fastest and it "measures" the
101     C overlap width
102     DO ii = il, ih, is
103     DO jj = jl, jh, js
104     ntb = ntb + 1
105     a1 = array1( ii+io1, jj+jo1, kk )
106     a2 = array2( ii+io2, jj+jo2, kk )
107     buff( ntb ) = prm(1)*a1 + prm(2)*a2
108     buff( nbv+ntb ) = prm(3)*a1 + prm(4)*a2
109     ENDDO
110     ENDDO
111     ENDIF
112     ENDDO
113    
114     IF ( commType .EQ. 'P' ) THEN
115     C We may eventually need (?) some sort of synchronization
116     C mechanism for multi-threaded mode
117     ELSEIF ( commType .EQ. 'M' ) THEN
118     #ifdef ALLOW_USE_MPI
119     nbv = nbv * 2
120     CALL MPI_Isend(
121     I buff, nbv, EX3_MPI_TYPE_RX, recvProc, bufftag,
122     I MPI_COMM_MODEL,
123     O mpiid, mpirc )
124     C Store MPI_Wait token in msgID.
125     msgID(1) = mpiid
126     #endif
127     ELSE
128     WRITE(msgbuf,'(3a)') 'EX3_SEND_RX2 ERROR: commType ''',
129     & commType, ''' is invalid'
130     CALL print_error(msgbuf, mythid)
131     STOP 'ABNORMAL END: S/R EX3_SEND_RX2'
132     ENDIF
133    
134     RETURN
135     END
136    
137     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
138    
139     CEH3 ;;; Local Variables: ***
140     CEH3 ;;; mode:fortran ***
141     CEH3 ;;; End: ***

  ViewVC Help
Powered by ViewVC 1.1.22