*IF DEF,C96_1A,OR,DEF,C96_1B SCTZON1A.2
*IF DEF,MPP SCTZON1A.3
C ******************************COPYRIGHT****************************** SCTZON1A.4
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. SCTZON1A.5
C SCTZON1A.6
C Use, duplication or disclosure of this code is subject to the SCTZON1A.7
C restrictions as set forth in the contract. SCTZON1A.8
C SCTZON1A.9
C Meteorological Office SCTZON1A.10
C London Road SCTZON1A.11
C BRACKNELL SCTZON1A.12
C Berkshire UK SCTZON1A.13
C RG12 2SZ SCTZON1A.14
C SCTZON1A.15
C If no contract has been raised with this copy of the code, the use, SCTZON1A.16
C duplication or disclosure of it is strictly prohibited. Permission SCTZON1A.17
C to do so must first be obtained in writing from the Head of Numerical SCTZON1A.18
C Modelling at the above address. SCTZON1A.19
C ******************************COPYRIGHT****************************** SCTZON1A.20
C SCTZON1A.21
! SCTZON1A.22
! + Scatters zonal field from one processor to many processors SCTZON1A.23
! SCTZON1A.24
! Subroutine interface: SCTZON1A.25
SCTZON1A.26
SUBROUTINE SCATTER_ZONAL_FIELD ( 1SCTZON1A.27
& LOCAL_FIELD , GLOBAL_FIELD , SCTZON1A.28
& LOCAL_SIZE , GLOBAL_SIZE , SCTZON1A.29
& LEVELS, GRID_TYPE , SCTZON1A.30
& SCATTER_PE) SCTZON1A.31
SCTZON1A.32
IMPLICIT NONE SCTZON1A.33
SCTZON1A.34
! Description: SCTZON1A.35
! Takes a zonal field on a single processor, and decomposes it over SCTZON1A.36
! many processors. SCTZON1A.37
! SCTZON1A.38
! Current code owner : P.Burton SCTZON1A.39
! SCTZON1A.40
! History SCTZON1A.41
! Model Date Modification history from model version 4.3 SCTZON1A.42
! version SCTZON1A.43
! 4.4 20/05/97 New DECK created for MPP code. P.Burton SCTZON1A.44
! Added special case for gridtype=43+44, SCTZON1A.45
! ocean Mead diagnostics - no halos P.Burton SCTZON1A.46
! SCTZON1A.47
! Subroutine arguments: SCTZON1A.48
SCTZON1A.49
INTEGER SCTZON1A.50
& LOCAL_SIZE ! IN: size of level of LOCAL_FIELD SCTZON1A.51
&, GLOBAL_SIZE ! IN: size of level of GLOBAL FIELD SCTZON1A.52
&, LEVELS ! IN: number of levels in field SCTZON1A.53
&, GRID_TYPE ! IN: grid type of field SCTZON1A.54
&, SCATTER_PE ! IN: PE on which GLOBAL_FIELD resides SCTZON1A.55
SCTZON1A.56
REAL SCTZON1A.57
& GLOBAL_FIELD(GLOBAL_SIZE,LEVELS) ! IN : field to scatter SCTZON1A.58
&, LOCAL_FIELD(LOCAL_SIZE,LEVELS) ! OUT : local part of field SCTZON1A.59
SCTZON1A.60
! Parameters and common blocks SCTZON1A.61
SCTZON1A.62
*CALL CPPXREF
SCTZON1A.63
*CALL GCCOM
SCTZON1A.64
SCTZON1A.65
*CALL PARVARS
SCTZON1A.66
SCTZON1A.67
! Local variables SCTZON1A.68
SCTZON1A.69
INTEGER SCTZON1A.70
& fld_type ! type (P or U) of field SCTZON1A.71
&, info ! GCOM return code SCTZON1A.72
&, send_map(7,MAXPROC) ! send map SCTZON1A.73
&, receive_map(7,1) ! receive map SCTZON1A.74
&, flag ! GCOM dummy argument SCTZON1A.75
&, n_mess_to_send ! number of messages to send SCTZON1A.76
&, k,iproc ! loop counter SCTZON1A.77
SCTZON1A.78
LOGICAL SCTZON1A.79
& mead_fld ! indicates an ocean Mead diagnostic field SCTZON1A.80
SCTZON1A.81
!==================================================================== SCTZON1A.82
SCTZON1A.83
IF ((grid_type .EQ. ppx_atm_tzonal) .OR. SCTZON1A.84
& (grid_type .EQ. ppx_ocn_tzonal)) THEN SCTZON1A.85
fld_type=fld_type_p SCTZON1A.86
ELSE SCTZON1A.87
fld_type=fld_type_u SCTZON1A.88
ENDIF SCTZON1A.89
SCTZON1A.90
mead_fld=((grid_type .EQ. ppx_ocn_uzonal) .OR. SCTZON1A.91
& (grid_type .EQ. ppx_ocn_tzonal)) SCTZON1A.92
SCTZON1A.93
!-------------------------------------------------------------------- SCTZON1A.94
SCTZON1A.95
n_mess_to_send=0 SCTZON1A.96
SCTZON1A.97
IF (mype .EQ. SCATTER_PE) THEN SCTZON1A.98
DO iproc=0,nproc-1 SCTZON1A.99
send_map(S_DESTINATION_PE,iproc+1) = iproc SCTZON1A.100
send_map(S_BASE_ADDRESS_IN_SEND_ARRAY,iproc+1) = SCTZON1A.101
& g_datastart(2,iproc) SCTZON1A.102
send_map(S_NUMBER_OF_ELEMENTS_IN_ITEM,iproc+1) = 1 SCTZON1A.103
send_map(S_STRIDE_IN_SEND_ARRAY,iproc+1) = 0 SCTZON1A.104
IF (fld_type .EQ. fld_type_p) THEN SCTZON1A.105
send_map(S_ELEMENT_LENGTH,iproc+1) = g_blsizep(2,iproc) SCTZON1A.106
ELSE SCTZON1A.107
send_map(S_ELEMENT_LENGTH,iproc+1) = g_blsizeu(2,iproc) SCTZON1A.108
ENDIF SCTZON1A.109
IF (mead_fld) THEN SCTZON1A.110
send_map(S_BASE_ADDRESS_IN_RECV_ARRAY,iproc+1) = 1 SCTZON1A.111
ELSE SCTZON1A.112
send_map(S_BASE_ADDRESS_IN_RECV_ARRAY,iproc+1) = Offy+1 SCTZON1A.113
ENDIF SCTZON1A.114
send_map(S_STRIDE_IN_RECV_ARRAY,iproc+1) = 0 SCTZON1A.115
ENDDO SCTZON1A.116
n_mess_to_send=nproc SCTZON1A.117
ENDIF SCTZON1A.118
SCTZON1A.119
receive_map(R_SOURCE_PE,1) = SCATTER_PE SCTZON1A.120
IF (mead_fld) THEN SCTZON1A.121
receive_map(R_BASE_ADDRESS_IN_RECV_ARRAY,1) = 1 SCTZON1A.122
ELSE SCTZON1A.123
receive_map(R_BASE_ADDRESS_IN_RECV_ARRAY,1) = Offy+1 SCTZON1A.124
ENDIF SCTZON1A.125
receive_map(R_NUMBER_OF_ELEMENTS_IN_ITEM,1) = 1 SCTZON1A.126
receive_map(R_STRIDE_IN_RECV_ARRAY,1) = 0 SCTZON1A.127
IF (fld_type .EQ. fld_type_p) THEN SCTZON1A.128
receive_map(R_ELEMENT_LENGTH,1) = blsizep(2) SCTZON1A.129
ELSE SCTZON1A.130
receive_map(R_ELEMENT_LENGTH,1) = blsizeu(2) SCTZON1A.131
ENDIF SCTZON1A.132
receive_map(R_BASE_ADDRESS_IN_SEND_ARRAY,1) = datastart(2) SCTZON1A.133
receive_map(R_STRIDE_IN_SEND_ARRAY,1) = 0 SCTZON1A.134
SCTZON1A.135
info=GC_NONE SCTZON1A.136
SCTZON1A.137
CALL GC_SETOPT(
GC_SHM_DIR,GC_SHM_GET,info) ! set as scatter SCTZON1A.138
SCTZON1A.139
DO k=1,LEVELS SCTZON1A.140
SCTZON1A.141
info=GC_NONE SCTZON1A.142
flag=GC_NONE SCTZON1A.143
SCTZON1A.144
IF (fld_type .EQ. fld_type_p) THEN SCTZON1A.145
CALL GCG_RALLTOALLE(
SCTZON1A.146
& GLOBAL_FIELD(1,k),send_map,n_mess_to_send,glsize(2), SCTZON1A.147
& LOCAL_FIELD(1,k), receive_map,1,lasize(2), SCTZON1A.148
& GC_ALL_PROC_GROUP,flag,info) SCTZON1A.149
ELSE SCTZON1A.150
CALL GCG_RALLTOALLE(
SCTZON1A.151
& GLOBAL_FIELD(1,k),send_map,n_mess_to_send,glsize(2)-1, SCTZON1A.152
& LOCAL_FIELD(1,k), receive_map,1,lasize(2), SCTZON1A.153
& GC_ALL_PROC_GROUP,flag,info) SCTZON1A.154
ENDIF SCTZON1A.155
SCTZON1A.156
ENDDO SCTZON1A.157
SCTZON1A.158
RETURN SCTZON1A.159
SCTZON1A.160
END SCTZON1A.161
*ENDIF SCTZON1A.162
*ENDIF SCTZON1A.163