*IF DEF,C96_1A,OR,DEF,C96_1B GENGAT1A.2
*IF DEF,MPP GENGAT1A.3
C ******************************COPYRIGHT****************************** GENGAT1A.4
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. GENGAT1A.5
C GENGAT1A.6
C Use, duplication or disclosure of this code is subject to the GENGAT1A.7
C restrictions as set forth in the contract. GENGAT1A.8
C GENGAT1A.9
C Meteorological Office GENGAT1A.10
C London Road GENGAT1A.11
C BRACKNELL GENGAT1A.12
C Berkshire UK GENGAT1A.13
C RG12 2SZ GENGAT1A.14
C GENGAT1A.15
C If no contract has been raised with this copy of the code, the use, GENGAT1A.16
C duplication or disclosure of it is strictly prohibited. Permission GENGAT1A.17
C to do so must first be obtained in writing from the Head of Numerical GENGAT1A.18
C Modelling at the above address. GENGAT1A.19
C ******************************COPYRIGHT****************************** GENGAT1A.20
C GENGAT1A.21
! GENGAT1A.22
! + Gathers any type of field from many processors to one processor GENGAT1A.23
! GENGAT1A.24
! Subroutine interface: GENGAT1A.25
GENGAT1A.26
SUBROUTINE GENERAL_GATHER_FIELD ( 3,7GENGAT1A.27
& LOCAL_FIELD , GLOBAL_FIELD , GENGAT1A.28
& LOCAL_SIZE , GLOBAL_SIZE , GENGAT1A.29
& ADDR_INFO , GENGAT1A.30
& GATHER_PE , GENGAT1A.31
& ICODE , CMESSAGE) GENGAT1A.32
GENGAT1A.33
IMPLICIT NONE GENGAT1A.34
GENGAT1A.35
! Description: GENGAT1A.36
! Takes a general decomposed field on many processors and gathers it GENGAT1A.37
! to a single processor. GENGAT1A.38
! GENGAT1A.39
! Current code owner : P.Burton GENGAT1A.40
! GENGAT1A.41
! History GENGAT1A.42
! Model Date Modification history from model version 4.3 GENGAT1A.43
! version GENGAT1A.44
! 4.4 20/05/97 New DECK created for MPP code. P.Burton GENGAT1A.45
! 4.5 13/01/98 Replaced SHMEM COMMON blocks by dynamic arrays GPB2F405.55
! P.Burton GPB2F405.56
! 4.5 21/08/98 Use local_land_field for fields on land points. GDR5F405.31
! D. Robinson. GDR5F405.32
! GENGAT1A.46
! Subroutine arguments: GENGAT1A.47
GENGAT1A.48
INTEGER GENGAT1A.49
& GLOBAL_SIZE ! IN: size of GLOBAL FIELD GENGAT1A.50
&, GATHER_PE ! IN: PE on which to collect GLOBAL_FIELD GENGAT1A.51
&, LOCAL_SIZE ! OUT: size of LOCAL_FIELD GENGAT1A.52
&, ICODE ! OUT: return code, 0=OK GENGAT1A.53
GENGAT1A.54
! Required for dimensioning ADDR_INFO GENGAT1A.55
*CALL D1_ADDR
GENGAT1A.56
GENGAT1A.57
INTEGER GENGAT1A.58
& ADDR_INFO(D1_LIST_LEN) ! IN: addressing info about field GENGAT1A.59
GENGAT1A.60
REAL GENGAT1A.61
& LOCAL_FIELD(*) ! IN: my local part of field GENGAT1A.62
&, GLOBAL_FIELD(GLOBAL_SIZE) ! OUT: array to gather field to GENGAT1A.63
GENGAT1A.64
GENGAT1A.65
CHARACTER*(80) GENGAT1A.66
& CMESSAGE ! OUT : Error message GENGAT1A.67
GENGAT1A.68
! Parameters and common blocks GENGAT1A.69
GENGAT1A.70
*CALL CPPXREF
GENGAT1A.71
*CALL STPARAM
GENGAT1A.72
*CALL AMAXSIZE
GENGAT1A.73
*CALL ATM_LSM
GPB2F405.57
GENGAT1A.75
*CALL GCCOM
GENGAT1A.76
GENGAT1A.77
*CALL TYPSIZE
GENGAT1A.78
*CALL PARVARS
GENGAT1A.79
GENGAT1A.80
! Local variables GENGAT1A.81
GENGAT1A.82
INTEGER GENGAT1A.83
& grid_type ! grid type of field being gathered GENGAT1A.84
&, info ! return code from GCOM routines GENGAT1A.85
&, dummy ! dummy variables - ignored return values GENGAT1A.86
&, north,south,east,west ! domain limits for STASH output GENGAT1A.87
&, fld_type ! P or U field GENGAT1A.88
&, mean_type ! spatial meaning type on diagnostic GENGAT1A.89
GENGAT1A.90
INTEGER GENGAT1A.91
& GET_FLD_TYPE ! function for finding field type GENGAT1A.92
GENGAT1A.93
REAL GENGAT1A.94
& buf_expand(Max2DFieldSize) GPB2F405.58
&, buf_expand_local(Max2DFieldSize) GPB2F405.59
GENGAT1A.96
!=================================================================== GENGAT1A.97
GENGAT1A.98
grid_type=ADDR_INFO(d1_grid_type) GENGAT1A.99
GENGAT1A.100
!------------------------------------------------------------------- GENGAT1A.101
GENGAT1A.102
! Timeseries data GENGAT1A.103
IF ((ADDR_INFO(d1_object_type) .EQ. diagnostic) .AND. GENGAT1A.104
& ((ADDR_INFO(d1_proc_no_code) .EQ. st_time_series_code).OR. GENGAT1A.105
& (ADDR_INFO(d1_proc_no_code) .EQ. st_time_series_mean))) THEN GENGAT1A.106
GENGAT1A.107
! Copy the data to GLOBAL_FIELD from PE 0 GENGAT1A.108
GENGAT1A.109
CALL GC_SSYNC(
nproc,info) GENGAT1A.110
GENGAT1A.111
CALL GC_SETOPT(
GC_SHM_DIR,GC_SHM_PUT,info) GENGAT1A.112
GENGAT1A.113
IF (mype .EQ. 0) THEN GENGAT1A.114
GENGAT1A.115
info=GC_NONE GENGAT1A.116
CALL GC_RSEND(
99,GLOBAL_SIZE,GATHER_PE,info,GLOBAL_FIELD, GENGAT1A.117
& LOCAL_FIELD) GENGAT1A.118
GENGAT1A.119
ENDIF GENGAT1A.120
GENGAT1A.121
IF (mype .EQ. GATHER_PE) THEN GENGAT1A.122
GENGAT1A.123
info=GC_NONE GENGAT1A.124
CALL GC_RRECV(
99,GLOBAL_SIZE,0,info,GLOBAL_FIELD,LOCAL_FIELD) GENGAT1A.125
GENGAT1A.126
ENDIF GENGAT1A.127
GENGAT1A.128
LOCAL_SIZE=GLOBAL_SIZE GENGAT1A.129
GENGAT1A.130
!------------------------------------------------------------------- GENGAT1A.131
GENGAT1A.132
! Surface (land points only) fields GENGAT1A.133
GENGAT1A.134
ELSEIF GENGAT1A.135
& (grid_type .EQ. ppx_atm_compressed) THEN GENGAT1A.136
GENGAT1A.137
! Unpack the local field out to full (local) field size and GENGAT1A.138
! put this into the array buf_expand_local GENGAT1A.139
GENGAT1A.140
CALL from_land_points
(buf_expand_local,LOCAL_FIELD, GENGAT1A.141
& atmos_landmask_local, GENGAT1A.142
& lasize(1)*lasize(2), GENGAT1A.143
& dummy) GENGAT1A.144
GENGAT1A.145
! Now gather in all the processors local fields into the global GENGAT1A.146
! field (array buf_expand) GENGAT1A.147
GENGAT1A.148
CALL GATHER_FIELD
(buf_expand_local,buf_expand, GENGAT1A.149
& lasize(1),lasize(2), GENGAT1A.150
& glsize(1),glsize(2), GENGAT1A.151
& GATHER_PE,GC_ALL_PROC_GROUP,info) GENGAT1A.152
GENGAT1A.153
! And now pack the global field (buf_expand) back to land points GENGAT1A.154
! and put into the array GLOBAL_FIELD. GENGAT1A.155
GENGAT1A.156
IF (mype .EQ. 0) THEN GENGAT1A.157
CALL to_land_points
(buf_expand,GLOBAL_FIELD,atmos_landmask, GENGAT1A.158
& glsize(1)*glsize(2),dummy) GENGAT1A.159
ENDIF GENGAT1A.160
GENGAT1A.161
local_size = local_land_field GDR5F405.33
GENGAT1A.163
!------------------------------------------------------------------- GENGAT1A.164
GENGAT1A.165
! Atmosphere Lateral boundary fields GENGAT1A.166
GENGAT1A.167
ELSEIF GENGAT1A.168
& (grid_type .EQ. ppx_atm_rim) THEN GENGAT1A.169
GENGAT1A.170
CALL GATHER_ATMOS_LBCS
(GLOBAL_FIELD,global_LENRIMDATA_A, GENGAT1A.171
& LOCAL_FIELD,LENRIMDATA_A, GENGAT1A.172
& GATHER_PE, GENGAT1A.173
& ICODE,CMESSAGE) GENGAT1A.174
GENGAT1A.175
LOCAL_SIZE=LENRIMDATA_A GENGAT1A.176
GENGAT1A.177
!------------------------------------------------------------------- GENGAT1A.178
GENGAT1A.179
! Ocean Lateral boundary fields GENGAT1A.180
GENGAT1A.181
ELSEIF GENGAT1A.182
& (grid_type .EQ. ppx_ocn_rim) THEN GENGAT1A.183
GENGAT1A.184
CALL GATHER_OCEAN_LBCS
(GLOBAL_FIELD,global_LENRIMDATA_O, GENGAT1A.185
& LOCAL_FIELD,LENRIMDATA_O, GENGAT1A.186
& GATHER_PE, GENGAT1A.187
& ICODE,CMESSAGE) GENGAT1A.188
GENGAT1A.189
LOCAL_SIZE=LENRIMDATA_O GENGAT1A.190
GENGAT1A.191
!------------------------------------------------------------------- GENGAT1A.192
! "Normal" fields GENGAT1A.193
GENGAT1A.194
ELSEIF GENGAT1A.195
! atmosphere grids GENGAT1A.196
& ((grid_type .EQ. ppx_atm_tall) .OR. ! Atmos T points GENGAT1A.197
& (grid_type .EQ. ppx_atm_tland) .OR. ! Atmos T land points GENGAT1A.198
& (grid_type .EQ. ppx_atm_tsea) .OR. ! Atmos T sea points GENGAT1A.199
& (grid_type .EQ. ppx_atm_uall) .OR. ! Atmos U points GENGAT1A.200
& (grid_type .EQ. ppx_atm_uland) .OR. ! Atmos U land points GENGAT1A.201
& (grid_type .EQ. ppx_atm_usea) .OR. ! Atmos U sea points GENGAT1A.202
& (grid_type .EQ. ppx_atm_cuall) .OR. ! Atmos C grid U pts GENGAT1A.203
& (grid_type .EQ. ppx_atm_cvall) .OR. ! Atmos C grid V pts GENGAT1A.204
& (grid_type .EQ. ppx_atm_ozone) .OR. ! Atmos ozone field GENGAT1A.205
& (grid_type .EQ. ppx_atm_tzonal) .OR. ! Atmos T zonal GENGAT1A.206
& (grid_type .EQ. ppx_atm_uzonal) .OR. ! Atmos U zonal GENGAT1A.207
! ocean grids GENGAT1A.208
& (grid_type .EQ. ppx_ocn_tcomp) .OR. ! Ocean "Compressed" T GENGAT1A.209
& (grid_type .EQ. ppx_ocn_ucomp) .OR. ! Ocean "Compressed" u GENGAT1A.210
& (grid_type .EQ. ppx_ocn_tall) .OR. ! Ocean T points (cyc) GENGAT1A.211
& (grid_type .EQ. ppx_ocn_uall) .OR. ! Ocean U points (cyc) GENGAT1A.212
& (grid_type .EQ. ppx_ocn_cuall) .OR. ! Ocean C grid U pts GENGAT1A.213
& (grid_type .EQ. ppx_ocn_cvall) .OR. ! Ocean C grid V pts GENGAT1A.214
& (grid_type .EQ. ppx_ocn_tfield) .OR.! Ocean T points GENGAT1A.215
& (grid_type .EQ. ppx_ocn_ufield) .OR. ! Ocean U points GENGAT1A.216
& (grid_type .EQ. ppx_ocn_tzonal) .OR. ! Ocean T zonal GENGAT1A.217
& (grid_type .EQ. ppx_ocn_uzonal)) ! Atmos U zonal GENGAT1A.218
& THEN GENGAT1A.219
GENGAT1A.220
LOCAL_SIZE=ADDR_INFO(d1_length)/ADDR_INFO(d1_no_levels) GENGAT1A.221
GENGAT1A.222
fld_type=GET_FLD_TYPE
(grid_type) GENGAT1A.223
GENGAT1A.224
IF (ADDR_INFO(d1_object_type) .EQ. diagnostic) THEN GENGAT1A.225
north=ADDR_INFO(d1_north_code) GENGAT1A.226
south=ADDR_INFO(d1_south_code) GENGAT1A.227
east=ADDR_INFO(d1_east_code) GENGAT1A.228
west=ADDR_INFO(d1_west_code) GENGAT1A.229
GENGAT1A.230
mean_type=ADDR_INFO(d1_gridpoint_code)/10 GENGAT1A.231
IF (mean_type .EQ. 2) THEN ! zonal mean GENGAT1A.232
east=west GENGAT1A.233
ELSEIF (mean_type .EQ. 3) THEN ! meridional mean GENGAT1A.234
south=north GENGAT1A.235
ELSEIF (mean_type .GE. 4) THEN ! field/global mean GENGAT1A.236
east=west GENGAT1A.237
south=north GENGAT1A.238
ENDIF GENGAT1A.239
GENGAT1A.240
ELSE GENGAT1A.241
north=1 GENGAT1A.242
west=1 GENGAT1A.243
east=glsize(1) GENGAT1A.244
IF (fld_type .EQ. fld_type_p) THEN GENGAT1A.245
south=glsize(2) GENGAT1A.246
ELSE GENGAT1A.247
south=glsize(2)-1 GENGAT1A.248
ENDIF GENGAT1A.249
ENDIF GENGAT1A.250
GENGAT1A.251
! STASH_GATHER_FIELD can distribute whole fields, or subarea GENGAT1A.252
! fields GENGAT1A.253
GENGAT1A.254
CALL STASH_GATHER_FIELD
( GENGAT1A.255
& LOCAL_FIELD,GLOBAL_FIELD, GENGAT1A.256
& LOCAL_SIZE,GLOBAL_SIZE,1, GENGAT1A.257
& north,east,south,west, GENGAT1A.258
& grid_type,GATHER_PE,.TRUE.,ICODE,CMESSAGE) GENGAT1A.259
GENGAT1A.260
!------------------------------------------------------------------- GENGAT1A.261
! Any other type of field GENGAT1A.262
ELSE GENGAT1A.263
GENGAT1A.264
ICODE=1 GENGAT1A.265
CMESSAGE='GENERAL_GATHER_FIELD : Field type not recognized' GENGAT1A.266
GENGAT1A.267
ENDIF GENGAT1A.268
GENGAT1A.269
9999 CONTINUE GENGAT1A.270
GENGAT1A.271
RETURN GENGAT1A.272
GENGAT1A.273
END GENGAT1A.274
GENGAT1A.275
*ENDIF GENGAT1A.276
*ENDIF GENGAT1A.277