*IF DEF,C96_1A,OR,DEF,C96_1B GPB3F403.284
*IF DEF,MPP GPB3F403.285
C *****************************COPYRIGHT****************************** GTALBC1A.3
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. GTALBC1A.4
C GTALBC1A.5
C Use, duplication or disclosure of this code is subject to the GTALBC1A.6
C restrictions as set forth in the contract. GTALBC1A.7
C GTALBC1A.8
C Meteorological Office GTALBC1A.9
C London Road GTALBC1A.10
C BRACKNELL GTALBC1A.11
C Berkshire UK GTALBC1A.12
C RG12 2SZ GTALBC1A.13
C GTALBC1A.14
C If no contract has been raised with this copy of the code, the use, GTALBC1A.15
C duplication or disclosure of it is strictly prohibited. Permission GTALBC1A.16
C to do so must first be obtained in writing from the Head of Numerical GTALBC1A.17
C Modelling at the above address. GTALBC1A.18
C ******************************COPYRIGHT****************************** GTALBC1A.19
!+ Gathers in atmosphere partial LBCs from boundaries to create GTALBC1A.20
! global LBC GTALBC1A.21
! GTALBC1A.22
! Subroutine Interface GTALBC1A.23
SUBROUTINE GATHER_ATMOS_LBCS(FULL_LBC,FULL_LENRIMDATA, 1GTALBC1A.24
& PART_LBC,PART_LENRIMDATA, GTALBC1A.25
& GATHER_PE, GTALBC1A.26
& ICODE,CMESSAGE) GTALBC1A.27
IMPLICIT NONE GTALBC1A.28
! GTALBC1A.29
! Description: GTALBC1A.30
! Gathers atmosphere LBCs from relevant processors and assembles GTALBC1A.31
! a global LBC on processor GATHER_PE GTALBC1A.32
! GTALBC1A.33
! Method: GTALBC1A.34
! The code loops around over all the processors. For each GTALBC1A.35
! processor there is then a loop over the four boundaries GTALBC1A.36
! (North, East, South and West) and if the processor is on GTALBC1A.37
! that particular boundary region, the appropriate data GTALBC1A.38
! is sent from that processor's PART_LBC array to GTALBC1A.39
! GATHER_PE's FULL_LBC array. GTALBC1A.40
! The data is transferred via two arrays, buf (the data to be GTALBC1A.41
! sent) and buf_expand (the data being received) which are both GTALBC1A.42
! on COMMON, to make the comms work with CRAY shmem correctly. GTALBC1A.43
! GTALBC1A.44
! The data structure of the PART_LBC array is a little different GTALBC1A.45
! from the "standard" LBC data structure as described in GTALBC1A.46
! documentation paper C7. The East and West boundarys are both GTALBC1A.47
! dimensioned to have P_ROWS of data on all grids. Not all GTALBC1A.48
! of the rows are used (rows are used starting from the top, so GTALBC1A.49
! some of the lower rows may not contain meaningful data on GTALBC1A.50
! some processors) GTALBC1A.51
! GTALBC1A.52
! Current code owner : Paul Burton GTALBC1A.53
! GTALBC1A.54
! History GTALBC1A.55
! Model Date Modification history from model version 4.1 GTALBC1A.56
! version GTALBC1A.57
! 4.1 3/1/96 New Deck for MPP code P.Burton GTALBC1A.58
! 4.2 18/11/96 Tidy up use of COMMON blocks. P.Burton GPB3F402.24
! 4.2 23/10/96 Use GC_SETOPT to use PUTs under GCOM_shmem GPB2F402.343
! P.Burton GPB2F402.344
! 4.4 08/12/97 Extend to cope with QCF prognostic if mixed ARB1F404.161
! phase precip scheme in use. R.T.H.Barnes. ARB1F404.162
! 4.5 13/01/98 Removed SHMEM COMMON block and replaced by GPB2F405.65
! dynamic arrays. P.Burton GPB2F405.66
! 4.5 26/05/98 Corrected routine name in error message GPB0F405.110
! P. Burton GPB0F405.111
! 4.5 27/08/98 Corrected indexing for tracer variable GPB0F405.112
! P.Burton GPB0F405.113
! 4.5 15/09/98 Replaced L_LSPICE by L_LSPICE_BDY to correct GPB0F405.114
! sizes for non-mixed phase boundary condition GPB0F405.115
! fields in mixed phase dump. R.Rawlins GPB0F405.116
! GTALBC1A.59
! Subroutine Arguments: GTALBC1A.60
GTALBC1A.61
INTEGER GTALBC1A.62
& FULL_LENRIMDATA ! IN size of the FULL_LBC array GTALBC1A.63
&, PART_LENRIMDATA ! IN size of the PART_LBC array GTALBC1A.64
&, GATHER_PE ! IN processor to scatter data from GTALBC1A.65
&, ICODE ! OUT error code GTALBC1A.66
GTALBC1A.67
CHARACTER*(80) GTALBC1A.68
& CMESSAGE ! OUT error message GTALBC1A.69
GTALBC1A.70
REAL GTALBC1A.71
& FULL_LBC(FULL_LENRIMDATA) ! IN full LBC (only on GATHER-_PE) GTALBC1A.72
&, PART_LBC(PART_LENRIMDATA) ! OUT local part of LBC GTALBC1A.73
GTALBC1A.74
! Parameters and COMMON GTALBC1A.75
GTALBC1A.76
*CALL PARVARS
GTALBC1A.77
*CALL GCCOM
GPB2F402.345
GTALBC1A.78
REAL GPB2F405.67
& local_buf(FULL_LENRIMDATA) GPB2F405.68
&, buf_expand(FULL_LENRIMDATA) GPB2F405.69
GTALBC1A.81
! TYPESIZE contains information about the tracers, and also GTALBC1A.82
! P_LEVELS, Q_LEVELS and RIMWIDTHA which we require GTALBC1A.83
*CALL TYPSIZE
GTALBC1A.84
! CNTLATM contains L_LSPICE to say whether LBC file needs QCF ARB1F404.163
*CALL CNTLATM
ARB1F404.164
GTALBC1A.85
! Local variables GTALBC1A.86
GTALBC1A.87
INTEGER GTALBC1A.88
& global_ROW_LENGTH ! length of row on global P grid GTALBC1A.89
&, global_P_ROWS ! number of rows on global P grid GTALBC1A.90
&, local_ROW_LENGTH ! length of row on local P grid (no halos) GTALBC1A.91
&, local_U_ROW_LENGTH ! length of row on local U grid (no halos) GTALBC1A.92
&, local_P_ROWS ! number of rows on local P grid (no halos) GTALBC1A.93
&, global_P_LENRIM ! size of boundary data for single GTALBC1A.94
! ! level on P grid for global data GTALBC1A.95
&, global_U_LENRIM ! size of boundary data for single GTALBC1A.96
! ! level on U grid for global data GTALBC1A.97
&, local_P_LENRIM ! size of boundary data for single GTALBC1A.98
! ! level on P grid for local data GTALBC1A.99
&, local_U_LENRIM ! size of boundary data for single GTALBC1A.100
! ! level on U grid for local data GTALBC1A.101
GTALBC1A.102
&, global_FIRST_SIDE_ROW ! first row for side LBC section GTALBC1A.103
&, global_LAST_P_SIDE_ROW ! last row for side LBC section GTALBC1A.104
&, global_LAST_U_SIDE_ROW ! last row for side LBC section GTALBC1A.105
GTALBC1A.106
&, global_START_ROW ! first row in global data in boundary GTALBC1A.107
&, local_START_ROW ! first row in local data in boundary GTALBC1A.108
&, global_START_POINT ! first point in row in global boundary GTALBC1A.109
&, local_START_POINT ! first point in row in local boundary GTALBC1A.110
&, N_P_ROWS ! number of rows on P grid in boundary GTALBC1A.111
&, N_P_POINTS ! number of points in row on P grid GTALBC1A.112
&, N_U_ROWS ! number of rows on U grid in boundary GTALBC1A.113
&, N_U_POINTS ! number of points in row on U grid GTALBC1A.114
&, global_P_ROW_LEN ! length of row on P grid in boundary GTALBC1A.115
&, global_U_ROW_LEN ! length of row on U grid in boundary GTALBC1A.116
&, local_P_ROW_LEN ! length of row on P grid in boundary GTALBC1A.117
&, local_U_ROW_LEN ! length of row on U grid in boundary GTALBC1A.118
&, global_P_bound_off ! offset of a P grid boundary GTALBC1A.119
&, local_P_bound_off ! offset of a P grid boundary GTALBC1A.120
&, global_U_bound_off ! offset of a U grid boundary GTALBC1A.121
&, local_U_bound_off ! offset of a U grid boundary GTALBC1A.122
GTALBC1A.123
GTALBC1A.124
&, global_PSTAR_START ! Start addresses of variables GTALBC1A.125
&, global_U_START ! in the global LBC data GTALBC1A.126
&, global_V_START ! GTALBC1A.127
&, global_THETA_START ! GTALBC1A.128
&, global_Q_START ! GTALBC1A.129
&, global_TR_START ! (Tracer variables) GTALBC1A.130
&, global_QCF_START ! cloud ice if mixed phase scheme ARB1F404.165
&, global_P_EAST_DATA_off ! offset of East P data in global LBC GTALBC1A.131
&, global_U_EAST_DATA_off ! offset of East U data in global LBC GTALBC1A.132
&, global_P_SOUTH_DATA_off ! offset of South P data in global LBC GTALBC1A.133
&, global_U_SOUTH_DATA_off ! offset of South U data in global LBC GTALBC1A.134
&, global_P_WEST_DATA_off ! offset of West P data in global LBC GTALBC1A.135
&, global_U_WEST_DATA_off ! offset of West U data in global LBC GTALBC1A.136
GTALBC1A.137
&, local_PSTAR_START ! Start addresses of variables GTALBC1A.138
&, local_U_START ! in the local LBC data GTALBC1A.139
&, local_V_START ! GTALBC1A.140
&, local_THETA_START ! GTALBC1A.141
&, local_Q_START ! GTALBC1A.142
&, local_TR_START ! (Tracer variables) GTALBC1A.143
&, local_QCF_START ! cloud ice if mixed phase scheme ARB1F404.166
&, local_P_EAST_DATA_off ! offset of East P data in local LBC GTALBC1A.144
&, local_U_EAST_DATA_off ! offset of East U data in local LBC GTALBC1A.145
&, local_P_SOUTH_DATA_off ! offset of South P data in local LBC GTALBC1A.146
&, local_U_SOUTH_DATA_off ! offset of South U data in local LBC GTALBC1A.147
&, local_P_WEST_DATA_off ! offset of West P data in local LBC GTALBC1A.148
&, local_U_WEST_DATA_off ! offset of West U data in local LBC GTALBC1A.149
GTALBC1A.150
INTEGER GTALBC1A.151
& iproc ! processor index GTALBC1A.152
&, bound_type ! loop index for loop over boundary types GTALBC1A.153
&, data_size ! size of message to be sent GTALBC1A.154
&, buf_pt ! pointer to position in buffer array GTALBC1A.155
&, ROW ! loop index indicating row number GTALBC1A.156
&, POINT ! loop index indicating point along row GTALBC1A.157
&, LEVEL ! loop index indicating level GTALBC1A.158
&, TVAR ! loop index indicating tracer variable GTALBC1A.159
&, info ! return code from communications routines GTALBC1A.160
GTALBC1A.161
INTEGER ! magic numbers for boundary types GTALBC1A.162
& bt_top ! top boundary GTALBC1A.163
&, bt_right ! right boundary GTALBC1A.164
&, bt_base ! bottom boundary GTALBC1A.165
&, bt_left ! left boundary GTALBC1A.166
PARAMETER(bt_top=1,bt_right=2,bt_base=3,bt_left=4) GTALBC1A.167
GTALBC1A.168
LOGICAL GTALBC1A.169
& iproc_at_left ! processor at left of LPG GTALBC1A.170
&, iproc_at_right ! processor at right of LPG GTALBC1A.171
&, iproc_at_top ! processor at top of LPG GTALBC1A.172
&, iproc_at_base ! processor at base of LPG GTALBC1A.173
GTALBC1A.174
!-------------------------------------------------------------------- GTALBC1A.175
!-------------------------------------------------------------------- GTALBC1A.176
GTALBC1A.177
! 1.0 Set up sizes and addresses for global data GTALBC1A.178
GTALBC1A.179
! Set up some sizes for the global data GTALBC1A.180
GTALBC1A.181
global_ROW_LENGTH=glsize(1) GTALBC1A.182
global_P_ROWS=glsize(2) GTALBC1A.183
global_P_LENRIM=(global_ROW_LENGTH+global_P_ROWS-2*RIMWIDTHA)* GTALBC1A.184
& 2*RIMWIDTHA GTALBC1A.185
global_U_LENRIM=global_P_LENRIM-4*RIMWIDTHA GTALBC1A.186
GTALBC1A.187
! Set up some addresses GTALBC1A.188
GTALBC1A.189
global_PSTAR_START=1 GTALBC1A.190
global_U_START=global_P_LENRIM+1 GTALBC1A.191
global_V_START=global_U_START+global_U_LENRIM*P_LEVELS GTALBC1A.192
global_THETA_START=global_V_START+global_U_LENRIM*P_LEVELS GTALBC1A.193
global_Q_START=global_THETA_START+global_P_LENRIM*P_LEVELS GTALBC1A.194
global_TR_START=global_Q_START+global_P_LENRIM*Q_LEVELS GTALBC1A.195
global_QCF_START= ARB1F404.167
& global_TR_START+global_P_LENRIM*TR_LEVELS*TR_VARS ARB1F404.168
GTALBC1A.196
global_P_EAST_DATA_off=global_ROW_LENGTH*RIMWIDTHA GTALBC1A.197
global_U_EAST_DATA_off=(global_ROW_LENGTH-1)*RIMWIDTHA GTALBC1A.198
global_P_SOUTH_DATA_off=global_P_EAST_DATA_off+ GTALBC1A.199
& (global_P_ROWS-2*RIMWIDTHA)*RIMWIDTHA GTALBC1A.200
global_U_SOUTH_DATA_off=global_U_EAST_DATA_off+ GTALBC1A.201
& (global_P_ROWS-2*RIMWIDTHA-1)*RIMWIDTHA GTALBC1A.202
global_P_WEST_DATA_off=global_P_SOUTH_DATA_off+ GTALBC1A.203
& global_ROW_LENGTH*RIMWIDTHA GTALBC1A.204
global_U_WEST_DATA_off=global_U_SOUTH_DATA_off+ GTALBC1A.205
& (global_ROW_LENGTH-1)*RIMWIDTHA GTALBC1A.206
GTALBC1A.207
global_FIRST_SIDE_ROW=RIMWIDTHA+1 GTALBC1A.208
global_LAST_P_SIDE_ROW=global_P_ROWS-RIMWIDTHA GTALBC1A.209
global_LAST_U_SIDE_ROW=global_LAST_P_SIDE_ROW-1 GTALBC1A.210
GTALBC1A.211
!-------------------------------------------------------------------- GTALBC1A.212
GTALBC1A.213
! 2.0 Loop over processors GTALBC1A.214
GTALBC1A.215
DO iproc=first_comp_pe,last_comp_pe ! loop over all processors GTALBC1A.216
GTALBC1A.217
GTALBC1A.218
! 2.1 Set up logicals, sizes and addresses for local data GTALBC1A.219
GTALBC1A.220
! set up logicals indicating position on LPG GTALBC1A.221
iproc_at_left=.FALSE. GTALBC1A.222
iproc_at_right=.FALSE. GTALBC1A.223
iproc_at_top=.FALSE. GTALBC1A.224
iproc_at_base=.FALSE. GTALBC1A.225
IF (g_gridpos(1,iproc) .EQ. 0) iproc_at_left=.TRUE. GTALBC1A.226
IF (g_gridpos(1,iproc) .EQ. nproc_x-1) iproc_at_right=.TRUE. GTALBC1A.227
IF (g_gridpos(2,iproc) .EQ. 0) iproc_at_top=.TRUE. GTALBC1A.228
IF (g_gridpos(2,iproc) .EQ. nproc_y-1) iproc_at_base=.TRUE. GTALBC1A.229
GTALBC1A.230
! Set up the local data for this processor GTALBC1A.231
local_ROW_LENGTH=g_blsizep(1,iproc) ! no halos GTALBC1A.232
IF (iproc_at_right) THEN GTALBC1A.233
! ! This processor at right of LPG so one less point on GTALBC1A.234
! ! U grid GTALBC1A.235
local_U_ROW_LENGTH=local_ROW_LENGTH-1 GTALBC1A.236
ELSE GTALBC1A.237
local_U_ROW_LENGTH=local_ROW_LENGTH GTALBC1A.238
ENDIF GTALBC1A.239
GTALBC1A.240
local_P_ROWS=g_blsizep(2,iproc) ! again, no halos GTALBC1A.241
local_P_LENRIM=(local_ROW_LENGTH+local_P_ROWS)* GTALBC1A.242
& 2*RIMWIDTHA GTALBC1A.243
local_U_LENRIM=(local_U_ROW_LENGTH+local_P_ROWS)* GTALBC1A.244
& 2*RIMWIDTHA GTALBC1A.245
GTALBC1A.246
! Set up some addresses GTALBC1A.247
local_PSTAR_START=1 GTALBC1A.248
local_U_START=local_P_LENRIM+1 GTALBC1A.249
local_V_START=local_U_START+local_U_LENRIM*P_LEVELS GTALBC1A.250
local_THETA_START=local_V_START+local_U_LENRIM*P_LEVELS GTALBC1A.251
local_Q_START=local_THETA_START+local_P_LENRIM*P_LEVELS GTALBC1A.252
local_TR_START=local_Q_START+local_P_LENRIM*Q_LEVELS GTALBC1A.253
local_QCF_START= ARB1F404.169
& local_TR_START+local_P_LENRIM*TR_LEVELS*TR_VARS ARB1F404.170
GTALBC1A.254
local_P_EAST_DATA_off=local_ROW_LENGTH*RIMWIDTHA GTALBC1A.255
local_U_EAST_DATA_off=local_U_ROW_LENGTH*RIMWIDTHA GTALBC1A.256
local_P_SOUTH_DATA_off=local_P_EAST_DATA_off+ GTALBC1A.257
& local_P_ROWS*RIMWIDTHA GTALBC1A.258
local_U_SOUTH_DATA_off=local_U_EAST_DATA_off+ GTALBC1A.259
& local_P_ROWS*RIMWIDTHA GTALBC1A.260
local_P_WEST_DATA_off=local_P_SOUTH_DATA_off+ GTALBC1A.261
& local_ROW_LENGTH*RIMWIDTHA GTALBC1A.262
local_U_WEST_DATA_off=local_U_SOUTH_DATA_off+ GTALBC1A.263
& local_U_ROW_LENGTH*RIMWIDTHA GTALBC1A.264
GTALBC1A.265
GTALBC1A.266
!-------------------------------------------------------------------- GTALBC1A.267
GTALBC1A.268
! 2.2 Loop over boundaries: North, East, South and West GTALBC1A.269
GTALBC1A.270
DO bound_type=bt_top,bt_left ! loop over all boundaries GTALBC1A.271
GTALBC1A.272
IF (((bound_type .EQ. bt_top) .AND. (iproc_at_top)) .OR. GTALBC1A.273
& ((bound_type .EQ. bt_right) .AND. (iproc_at_right)) .OR. GTALBC1A.274
& ((bound_type .EQ. bt_base) .AND. (iproc_at_base)) .OR. GTALBC1A.275
& ((bound_type .EQ. bt_left) .AND. (iproc_at_left))) THEN GTALBC1A.276
! Processor iproc has a boundary of type bound_type GTALBC1A.277
GTALBC1A.278
GTALBC1A.279
! 2.2.1 Set up data pointers and sizes for this boundary GTALBC1A.280
GTALBC1A.281
IF ((bound_type .EQ. bt_top) .OR. ! What type of GTALBC1A.282
& (bound_type .EQ. bt_base)) THEN ! boundary is it? GTALBC1A.283
GTALBC1A.284
! Northern or Southern boundary GTALBC1A.285
GTALBC1A.286
global_START_ROW=1 GTALBC1A.287
local_START_ROW=1 GTALBC1A.288
GTALBC1A.289
global_START_POINT=g_datastart(1,iproc) GTALBC1A.290
local_START_POINT=1 GTALBC1A.291
GTALBC1A.292
N_P_ROWS=RIMWIDTHA GTALBC1A.293
N_P_POINTS=local_ROW_LENGTH GTALBC1A.294
N_U_ROWS=RIMWIDTHA GTALBC1A.295
N_U_POINTS=local_U_ROW_LENGTH GTALBC1A.296
GTALBC1A.297
global_P_ROW_LEN=global_ROW_LENGTH GTALBC1A.298
global_U_ROW_LEN=global_ROW_LENGTH-1 GTALBC1A.299
local_P_ROW_LEN=local_ROW_LENGTH GTALBC1A.300
local_U_ROW_LEN=local_U_ROW_LENGTH GTALBC1A.301
GTALBC1A.302
IF (bound_type .EQ. bt_top) THEN ! Northern boundary GTALBC1A.303
global_P_bound_off=0 GTALBC1A.304
local_P_bound_off=0 GTALBC1A.305
global_U_bound_off=0 GTALBC1A.306
local_U_bound_off=0 GTALBC1A.307
ELSE ! Southern boundary GTALBC1A.308
global_P_bound_off=global_P_SOUTH_DATA_off GTALBC1A.309
local_P_bound_off=local_P_SOUTH_DATA_off GTALBC1A.310
global_U_bound_off=global_U_SOUTH_DATA_off GTALBC1A.311
local_U_bound_off=local_U_SOUTH_DATA_off GTALBC1A.312
ENDIF GTALBC1A.313
GTALBC1A.314
ELSE ! Eastern or Western boundary GTALBC1A.315
GTALBC1A.316
global_START_ROW=MAX(g_datastart(2,iproc), GTALBC1A.317
& global_FIRST_SIDE_ROW)- GTALBC1A.318
& RIMWIDTHA GTALBC1A.319
local_START_ROW=1 GTALBC1A.320
GTALBC1A.321
global_START_POINT=1 GTALBC1A.322
local_START_POINT=1 GTALBC1A.323
GTALBC1A.324
N_P_ROWS=MIN(g_datastart(2,iproc)+local_P_ROWS-1, GTALBC1A.325
& global_LAST_P_SIDE_ROW) - GTALBC1A.326
& (global_START_ROW+RIMWIDTHA) + 1 GTALBC1A.327
N_P_POINTS=RIMWIDTHA GTALBC1A.328
N_U_ROWS=MIN(g_datastart(2,iproc)+local_P_ROWS-1, GTALBC1A.329
& global_LAST_U_SIDE_ROW) - GTALBC1A.330
& (global_START_ROW+RIMWIDTHA) + 1 GTALBC1A.331
N_U_POINTS=RIMWIDTHA GTALBC1A.332
GTALBC1A.333
global_P_ROW_LEN=RIMWIDTHA GTALBC1A.334
global_U_ROW_LEN=RIMWIDTHA GTALBC1A.335
local_P_ROW_LEN=RIMWIDTHA GTALBC1A.336
local_U_ROW_LEN=RIMWIDTHA GTALBC1A.337
GTALBC1A.338
IF (bound_type .EQ. bt_right) THEN ! Eastern boundary GTALBC1A.339
global_P_bound_off=global_P_EAST_DATA_off GTALBC1A.340
local_P_bound_off=local_P_EAST_DATA_off GTALBC1A.341
global_U_bound_off=global_U_EAST_DATA_off GTALBC1A.342
local_U_bound_off=local_U_EAST_DATA_off GTALBC1A.343
ELSE ! Western boundary GTALBC1A.344
global_P_bound_off=global_P_WEST_DATA_off GTALBC1A.345
local_P_bound_off=local_P_WEST_DATA_off GTALBC1A.346
global_U_bound_off=global_U_WEST_DATA_off GTALBC1A.347
local_U_bound_off=local_U_WEST_DATA_off GTALBC1A.348
ENDIF GTALBC1A.349
GTALBC1A.350
ENDIF ! What type of boundary is it? GTALBC1A.351
GTALBC1A.352
data_size=(1+P_LEVELS+Q_LEVELS+(TR_VARS*TR_LEVELS))* GTALBC1A.353
& N_P_ROWS*N_P_POINTS + GTALBC1A.354
& 2*P_LEVELS*N_U_ROWS*N_U_POINTS GTALBC1A.355
if (L_LSPICE_BDY) then ! Mixed phase boundary conds. in GPB0F405.119
data_size=data_size+Q_LEVELS*N_P_ROWS*N_P_POINTS ARB1F404.172
end if ARB1F404.173
! the size of the data to be sent from processor iproc GTALBC1A.356
GTALBC1A.357
! Check the buffer is big enough GTALBC1A.358
IF (FULL_LENRIMDATA .LT. GPB2F405.70
& data_size) THEN GTALBC1A.360
WRITE(6,*) 'ERROR Buffer not big enough in GATHER_LBCS' GTALBC1A.361
WRITE(6,*) 'Buffer size is ',FULL_LENRIMDATA GPB2F405.71
WRITE(6,*) 'Required size is ',data_size GTALBC1A.363
ICODE=1 GTALBC1A.364
CMESSAGE='GATHER_LBCS BUFFER TOO SMALL' GPB0F405.117
GOTO 9999 GTALBC1A.366
ENDIF GTALBC1A.367
GTALBC1A.368
GTALBC1A.369
! 2.2.2 Pack all the data for this boundary into the buf array GTALBC1A.370
GTALBC1A.371
CALL GC_SETOPT(
GC_SHM_DIR,GC_SHM_PUT,info) ! gather GPB2F402.346
info=GC_NONE GPB2F402.347
GPB2F402.348
IF (mype .EQ. iproc) THEN ! I'm processor iproc GTALBC1A.372
GTALBC1A.373
buf_pt=1 GTALBC1A.374
GTALBC1A.375
! --- PSTAR --- GTALBC1A.376
GTALBC1A.377
DO ROW=local_START_ROW,local_START_ROW+N_P_ROWS-1 GTALBC1A.378
DO POINT=local_START_POINT, GTALBC1A.379
& local_START_POINT+N_P_POINTS-1 GTALBC1A.380
local_buf(buf_pt)=PART_LBC(local_PSTAR_START-1+ GPB3F402.28
& local_P_bound_off+ GTALBC1A.382
& POINT+ GTALBC1A.383
& (ROW-1)*local_P_ROW_LEN) GTALBC1A.384
buf_pt=buf_pt+1 GTALBC1A.385
ENDDO GTALBC1A.386
ENDDO GTALBC1A.387
GTALBC1A.388
GTALBC1A.389
! --- U and V winds --- GTALBC1A.390
GTALBC1A.391
DO LEVEL=1,P_LEVELS GTALBC1A.392
DO ROW=local_START_ROW,local_START_ROW+N_U_ROWS-1 GTALBC1A.393
DO POINT=local_START_POINT, GTALBC1A.394
& local_START_POINT+N_U_POINTS-1 GTALBC1A.395
local_buf(buf_pt)=PART_LBC(local_U_START-1+ GPB3F402.29
& local_U_bound_off+ GTALBC1A.397
& POINT+ GTALBC1A.398
& (ROW-1)*local_U_ROW_LEN+ GTALBC1A.399
& (LEVEL-1)*local_U_LENRIM) GTALBC1A.400
buf_pt=buf_pt+1 GTALBC1A.401
local_buf(buf_pt)=PART_LBC(local_V_START-1+ GPB3F402.30
& local_U_bound_off+ GTALBC1A.403
& POINT+ GTALBC1A.404
& (ROW-1)*local_U_ROW_LEN+ GTALBC1A.405
& (LEVEL-1)*local_U_LENRIM) GTALBC1A.406
buf_pt=buf_pt+1 GTALBC1A.407
ENDDO GTALBC1A.408
ENDDO GTALBC1A.409
ENDDO GTALBC1A.410
GTALBC1A.411
GTALBC1A.412
! --- Theta --- GTALBC1A.413
GTALBC1A.414
DO LEVEL=1,P_LEVELS GTALBC1A.415
DO ROW=local_START_ROW,local_START_ROW+N_P_ROWS-1 GTALBC1A.416
DO POINT=local_START_POINT, GTALBC1A.417
& local_START_POINT+N_P_POINTS-1 GTALBC1A.418
local_buf(buf_pt)=PART_LBC(local_THETA_START-1+ GPB3F402.31
& local_P_bound_off+ GTALBC1A.420
& POINT+ GTALBC1A.421
& (ROW-1)*local_P_ROW_LEN+ GTALBC1A.422
& (LEVEL-1)*local_P_LENRIM) GTALBC1A.423
buf_pt=buf_pt+1 GTALBC1A.424
ENDDO GTALBC1A.425
ENDDO GTALBC1A.426
ENDDO GTALBC1A.427
GTALBC1A.428
GTALBC1A.429
! --- Q --- GTALBC1A.430
GTALBC1A.431
DO LEVEL=1,Q_LEVELS GTALBC1A.432
DO ROW=local_START_ROW,local_START_ROW+N_P_ROWS-1 GTALBC1A.433
DO POINT=local_START_POINT, GTALBC1A.434
& local_START_POINT+N_P_POINTS-1 GTALBC1A.435
local_buf(buf_pt)=PART_LBC(local_Q_START-1+ GPB3F402.32
& local_P_bound_off+ GTALBC1A.437
& POINT+ GTALBC1A.438
& (ROW-1)*local_P_ROW_LEN+ GTALBC1A.439
& (LEVEL-1)*local_P_LENRIM) GTALBC1A.440
buf_pt=buf_pt+1 GTALBC1A.441
ENDDO GTALBC1A.442
ENDDO GTALBC1A.443
ENDDO GTALBC1A.444
GTALBC1A.445
! --- Tracer Variables --- GTALBC1A.446
GTALBC1A.447
DO TVAR=1,TR_VARS GTALBC1A.448
DO LEVEL=1,TR_LEVELS GTALBC1A.449
DO ROW=local_START_ROW,local_START_ROW+N_P_ROWS-1 GTALBC1A.450
DO POINT=local_START_POINT, GTALBC1A.451
& local_START_POINT+N_P_POINTS-1 GTALBC1A.452
local_buf(buf_pt)=PART_LBC(local_TR_START-1+ GPB0F405.118
& local_P_bound_off+ GTALBC1A.454
& POINT+ GTALBC1A.455
& (ROW-1)*local_P_ROW_LEN+ GTALBC1A.456
& (LEVEL-1)*local_P_LENRIM+ GTALBC1A.457
& (TVAR-1)*TR_LEVELS*local_P_LENRIM) GTALBC1A.458
buf_pt=buf_pt+1 GTALBC1A.459
ENDDO GTALBC1A.460
ENDDO GTALBC1A.461
ENDDO GTALBC1A.462
ENDDO GTALBC1A.463
ARB1F404.174
IF (L_LSPICE_BDY) THEN ! Mixed phase boundary conds. in GPB0F405.120
! --- QCF --- ARB1F404.176
ARB1F404.177
DO LEVEL=1,Q_LEVELS ARB1F404.178
DO ROW=local_START_ROW,local_START_ROW+N_P_ROWS-1 ARB1F404.179
DO POINT=local_START_POINT, ARB1F404.180
& local_START_POINT+N_P_POINTS-1 ARB1F404.181
local_buf(buf_pt)=PART_LBC(local_QCF_START-1+ ARB1F404.182
& local_P_bound_off+ ARB1F404.183
& POINT+ ARB1F404.184
& (ROW-1)*local_P_ROW_LEN+ ARB1F404.185
& (LEVEL-1)*local_P_LENRIM) ARB1F404.186
buf_pt=buf_pt+1 ARB1F404.187
ENDDO ARB1F404.188
ENDDO ARB1F404.189
ENDDO ARB1F404.190
END IF ARB1F404.191
GTALBC1A.464
GTALBC1A.465
! 2.2.3 Send local_buf array to processor GATHER_PE GPB3F402.34
! into array buf_expand GPB3F402.35
GTALBC1A.467
CALL GC_RSEND(
iproc+1000*bound_type,data_size, GTALBC1A.468
& GATHER_PE,info,buf_expand,local_buf) GPB3F402.36
GTALBC1A.470
ENDIF ! If I'm processor iproc GTALBC1A.471
GTALBC1A.472
CALL GC_SSYNC(
nproc,info) GTALBC1A.473
GTALBC1A.474
GTALBC1A.475
GPB2F402.349
CALL GC_SETOPT(
GC_SHM_DIR,GC_SHM_PUT,info) ! gather GPB2F402.350
info=GC_NONE GPB2F402.351
IF (mype .EQ. GATHER_PE) THEN GTALBC1A.476
! I'm the processor who will gather together all the local GTALBC1A.477
! LBCs and assemble them into a global version GTALBC1A.478
GTALBC1A.479
CALL GC_RRECV(
iproc+1000*bound_type,data_size, GTALBC1A.480
& iproc,info,buf_expand,local_buf) GPB3F402.37
GTALBC1A.482
! 2.2.5 Unpack buf_expand into the FULL_LBC array GTALBC1A.483
GTALBC1A.484
buf_pt=1 GTALBC1A.485
GTALBC1A.486
! --- PSTAR --- GTALBC1A.487
GTALBC1A.488
DO ROW=global_START_ROW,global_START_ROW+N_P_ROWS-1 GTALBC1A.489
DO POINT=global_START_POINT, GTALBC1A.490
& global_START_POINT+N_P_POINTS-1 GTALBC1A.491
FULL_LBC(global_PSTAR_START-1+ GTALBC1A.492
& global_P_bound_off+ GTALBC1A.493
& POINT+ GTALBC1A.494
& (ROW-1)*global_P_ROW_LEN)= GTALBC1A.495
& buf_expand(buf_pt) GTALBC1A.496
buf_pt=buf_pt+1 GTALBC1A.497
ENDDO GTALBC1A.498
ENDDO GTALBC1A.499
GTALBC1A.500
GTALBC1A.501
! --- U and V winds --- GTALBC1A.502
GTALBC1A.503
DO LEVEL=1,P_LEVELS GTALBC1A.504
DO ROW=global_START_ROW,global_START_ROW+N_U_ROWS-1 GTALBC1A.505
DO POINT=global_START_POINT, GTALBC1A.506
& global_START_POINT+N_U_POINTS-1 GTALBC1A.507
FULL_LBC(global_U_START-1+ GTALBC1A.508
& global_U_bound_off+ GTALBC1A.509
& POINT+ GTALBC1A.510
& (ROW-1)*global_U_ROW_LEN+ GTALBC1A.511
& (LEVEL-1)*global_U_LENRIM)= GTALBC1A.512
& buf_expand(buf_pt) GTALBC1A.513
buf_pt=buf_pt+1 GTALBC1A.514
FULL_LBC(global_V_START-1+ GTALBC1A.515
& global_U_bound_off+ GTALBC1A.516
& POINT+ GTALBC1A.517
& (ROW-1)*global_U_ROW_LEN+ GTALBC1A.518
& (LEVEL-1)*global_U_LENRIM)= GTALBC1A.519
& buf_expand(buf_pt) GTALBC1A.520
buf_pt=buf_pt+1 GTALBC1A.521
ENDDO GTALBC1A.522
ENDDO GTALBC1A.523
ENDDO GTALBC1A.524
GTALBC1A.525
GTALBC1A.526
! -- Theta --- GTALBC1A.527
GTALBC1A.528
DO LEVEL=1,P_LEVELS GTALBC1A.529
DO ROW=global_START_ROW,global_START_ROW+N_P_ROWS-1 GTALBC1A.530
DO POINT=global_START_POINT, GTALBC1A.531
& global_START_POINT+N_P_POINTS-1 GTALBC1A.532
FULL_LBC(global_THETA_START-1+ GTALBC1A.533
& global_P_bound_off+ GTALBC1A.534
& POINT+ GTALBC1A.535
& (ROW-1)*global_P_ROW_LEN+ GTALBC1A.536
& (LEVEL-1)*global_P_LENRIM)= GTALBC1A.537
& buf_expand(buf_pt) GTALBC1A.538
buf_pt=buf_pt+1 GTALBC1A.539
ENDDO GTALBC1A.540
ENDDO GTALBC1A.541
ENDDO GTALBC1A.542
GTALBC1A.543
GTALBC1A.544
! --- Q --- GTALBC1A.545
GTALBC1A.546
DO LEVEL=1,Q_LEVELS GTALBC1A.547
DO ROW=global_START_ROW,global_START_ROW+N_P_ROWS-1 GTALBC1A.548
DO POINT=global_START_POINT, GTALBC1A.549
& global_START_POINT+N_P_POINTS-1 GTALBC1A.550
FULL_LBC(global_Q_START-1+ GTALBC1A.551
& global_P_bound_off+ GTALBC1A.552
& POINT+ GTALBC1A.553
& (ROW-1)*global_P_ROW_LEN+ GTALBC1A.554
& (LEVEL-1)*global_P_LENRIM)= GTALBC1A.555
& buf_expand(buf_pt) GTALBC1A.556
buf_pt=buf_pt+1 GTALBC1A.557
ENDDO GTALBC1A.558
ENDDO GTALBC1A.559
ENDDO GTALBC1A.560
GTALBC1A.561
GTALBC1A.562
! --- Tracer Variables --- GTALBC1A.563
GTALBC1A.564
DO TVAR=1,TR_VARS GTALBC1A.565
DO LEVEL=1,TR_LEVELS GTALBC1A.566
DO ROW=global_START_ROW,global_START_ROW+N_P_ROWS-1 GTALBC1A.567
DO POINT=global_START_POINT, GTALBC1A.568
& global_START_POINT+N_P_POINTS-1 GTALBC1A.569
FULL_LBC(global_TR_START-1+ GTALBC1A.570
& global_P_bound_off+ GTALBC1A.571
& POINT+ GTALBC1A.572
& (ROW-1)*global_P_ROW_LEN+ GTALBC1A.573
& (LEVEL-1)*global_P_LENRIM+ GTALBC1A.574
& (TVAR-1)*TR_LEVELS*global_P_LENRIM)= GTALBC1A.575
& buf_expand(buf_pt) GTALBC1A.576
buf_pt=buf_pt+1 GTALBC1A.577
ENDDO GTALBC1A.578
ENDDO GTALBC1A.579
ENDDO GTALBC1A.580
ENDDO GTALBC1A.581
ARB1F404.192
IF (L_LSPICE_BDY) THEN ! Mixed phase boundary conds. in GPB0F405.121
! --- QCF --- ARB1F404.194
ARB1F404.195
DO LEVEL=1,Q_LEVELS ARB1F404.196
DO ROW=global_START_ROW,global_START_ROW+N_P_ROWS-1 ARB1F404.197
DO POINT=global_START_POINT, ARB1F404.198
& global_START_POINT+N_P_POINTS-1 ARB1F404.199
FULL_LBC(global_QCF_START-1+ ARB1F404.200
& global_P_bound_off+ ARB1F404.201
& POINT+ ARB1F404.202
& (ROW-1)*global_P_ROW_LEN+ ARB1F404.203
& (LEVEL-1)*global_P_LENRIM)= ARB1F404.204
& buf_expand(buf_pt) ARB1F404.205
buf_pt=buf_pt+1 ARB1F404.206
ENDDO ARB1F404.207
ENDDO ARB1F404.208
ENDDO ARB1F404.209
END IF ARB1F404.210
ARB1F404.211
ENDIF ! If I'm processor GATHER_PE GTALBC1A.582
GTALBC1A.583
CALL GC_SSYNC(
nproc,info) GTALBC1A.584
GTALBC1A.585
ENDIF ! If this processor has boundary type bound_type GTALBC1A.586
GTALBC1A.587
ENDDO ! bound_type: loop over boundary types GTALBC1A.588
GTALBC1A.589
ENDDO ! iproc : loop over processors GTALBC1A.590
GTALBC1A.591
GTALBC1A.592
9999 CONTINUE ! point to jump to if failure GTALBC1A.593
GTALBC1A.594
RETURN GTALBC1A.595
END GTALBC1A.596
*ENDIF GTALBC1A.597
*ENDIF GPB3F403.286