*IF DEF,MPP,AND,DEF,OCEAN OCNPASS.2
C *****************************COPYRIGHT****************************** OCNPASS.3
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. OCNPASS.4
C OCNPASS.5
C Use, duplication or disclosure of this code is subject to the OCNPASS.6
C restrictions as set forth in the contract. OCNPASS.7
C OCNPASS.8
C Meteorological Office OCNPASS.9
C London Road OCNPASS.10
C BRACKNELL OCNPASS.11
C Berkshire UK OCNPASS.12
C RG12 2SZ OCNPASS.13
C OCNPASS.14
C If no contract has been raised with this copy of the code, the use, OCNPASS.15
C duplication or disclosure of it is strictly prohibited. Permission OCNPASS.16
C to do so must first be obtained in writing from the Head of Numerical OCNPASS.17
C Modelling at the above address. OCNPASS.18
C ******************************COPYRIGHT****************************** OCNPASS.19
! Subroutine interface: ORH3F403.85
SUBROUTINE O_SMARTPASS( 9ORH3F403.86
& IFIELDIN, IFIELDOUT, ORH3F403.87
& RFIELDIN, RFIELDOUT, ORH3F403.88
& ISIZEIN, ISIZEOUT, ORH3F403.89
& ISTART,TYPE) ORH3F403.90
ORH3F403.91
IMPLICIT NONE ORH3F403.92
! ORH3F403.93
! Description: ORH3F403.94
! This routine receives a real array which has been decomposed ORH3F403.95
! across several parallel processes and ensures that all processes ORH3F403.96
! receive an up to date version of the entire array. ORH3F403.97
! ORH3F403.98
! Current Code Owner: Richard Hill ORH3F403.99
! ORH3F403.100
! History: ORH3F403.101
! Model Date Modification history: ORH3F403.102
! version ORH3F403.103
! 4.1 24/04/96 New DECK created for the Parallel Unified ORH3F403.104
! Ocean Model. R.Hill ORH3F403.105
! 4.3 12/03/97 Tidy up communications and correct syntax ORH3F403.106
! of GC_BCASTS to allow shmem use and for ORH3F403.107
! efficiency. ORH3F403.108
! Subroutine Arguments: ORH3F403.109
ORH3F403.110
ORH3F403.111
*CALL PARVARS
ORH3F403.112
*CALL COCNINDX
ORH3F403.113
ORH3F403.114
INTEGER ISTART ! Start index of sub-array ORH3F403.115
&, ISIZEIN ! Size of sub array passed in ORH3F403.116
&, TYPE ! 1 = integer, 2 = REAL ORH3F403.117
&, I ORH3F403.118
ORH3F403.119
ORH3F403.120
INTEGER ISIZEOUT ! Size of global array passed out ORH3F403.121
&, IPROC ! Index for processes ORH3F403.122
&, INFO ORH3F403.123
&, MTAG ! message tag helps to ensure correct comms ORH3F403.124
ORH3F403.125
REAL RFIELDIN(ISIZEIN) ORH3F403.126
&, RFIELDOUT(ISIZEOUT) ORH3F403.127
ORH3F403.128
INTEGER IFIELDIN(ISIZEIN) ORH3F403.129
&, IFIELDOUT(ISIZEOUT) ORH3F403.130
ORH3F403.131
ORH3F403.132
! Now send these details to all other processes ORH3F403.133
DO I = 1,ISIZEIN ORH3F403.134
IF (TYPE.EQ.1) THEN ORH3F403.135
IFIELDOUT(ISTART+I-1) = IFIELDIN(I) ORH3F403.136
ELSE ORH3F403.137
RFIELDOUT(ISTART+I-1) = RFIELDIN(I) ORH3F403.138
ENDIF ORH3F403.139
ENDDO ORH3F403.140
ORH3F403.141
IF (O_MYPE.NE.0) THEN ORH3F403.142
MTAG = 6000 + O_MYPE ORH3F403.143
IF (TYPE.EQ.1) THEN ORH3F403.144
CALL GC_ISEND (
MTAG,g_blsizep(2,O_MYPE),0,INFO, ORH3F403.145
& IFIELDOUT,IFIELDIN) ORH3F403.146
ELSE ORH3F403.147
CALL GC_RSEND (
MTAG,g_blsizep(2,O_MYPE),0,INFO, ORH3F403.148
& RFIELDOUT,RFIELDIN) ORH3F403.149
ENDIF ORH3F403.150
ENDIF ORH3F403.151
ORH3F403.152
CALL GC_GSYNC(
NPROC,INFO) ORH3F403.153
ORH3F403.154
IF (O_MYPE.EQ.0) THEN ORH3F403.155
ORH3F403.156
! For each process in turn ORH3F403.157
DO IPROC = 1, NPROC - 1 ORH3F403.158
ORH3F403.159
! Receive size of input array ORH3F403.160
MTAG = 6000 + IPROC ORH3F403.161
IF (TYPE.EQ.1) THEN ORH3F403.162
CALL GC_IRECV (
MTAG,g_blsizep(2,IPROC),IPROC,INFO, ORH3F403.163
& IFIELDOUT(g_datastart(2,IPROC)),IFIELDIN) ORH3F403.164
ELSE ORH3F403.165
CALL GC_RRECV (
MTAG,g_blsizep(2,IPROC),IPROC,INFO, ORH3F403.166
& RFIELDOUT(g_datastart(2,IPROC)),RFIELDIN) ORH3F403.167
ENDIF ORH3F403.168
ENDDO ORH3F403.169
ORH3F403.170
! Now we have the full field, broadcast to all other Pes ORH3F403.171
ENDIF ORH3F403.172
ORH3F403.173
MTAG = 8000 ORH3F403.174
IF (TYPE.EQ.1) THEN ORH3F403.175
CALL GC_IBCAST (
MTAG,JMT_GLOBAL,0,NPROC,INFO,IFIELDOUT) ORH3F403.176
ELSE ORH3F403.177
CALL GC_RBCAST (
MTAG,JMT_GLOBAL,0,NPROC,INFO,RFIELDOUT) ORH3F403.178
ENDIF ORH3F403.179
ORH3F403.180
ORH3F403.181
! FIELDOUT should now contain a full copy of the ORH3F403.182
! sub arrays concatenated from FIELDIN. ORH3F403.183
ORH3F403.184
RETURN ORH3F403.185
ORH3F403.186
END ORH3F403.187
*ENDIF OCNPASS.154