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

Contents of /MITgcm_contrib/exch3/ex3_send_rx2.template

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


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

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