*IF DEF,A05_2A,OR,DEF,A05_2C,OR,DEF,A05_3B,OR,DEF,A05_3C LBCONV1A.2
*IF DEF,MPP,AND,DEF,T3E LBCONV1A.3
C ******************************COPYRIGHT****************************** LBCONV1A.4
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. LBCONV1A.5
C LBCONV1A.6
C Use, duplication or disclosure of this code is subject to the LBCONV1A.7
C restrictions as set forth in the contract. LBCONV1A.8
C LBCONV1A.9
C Meteorological Office LBCONV1A.10
C London Road LBCONV1A.11
C BRACKNELL LBCONV1A.12
C Berkshire UK LBCONV1A.13
C RG12 2SZ LBCONV1A.14
C LBCONV1A.15
C If no contract has been raised with this copy of the code, the use, LBCONV1A.16
C duplication or disclosure of it is strictly prohibited. Permission LBCONV1A.17
C to do so must first be obtained in writing from the Head of Numerical LBCONV1A.18
C Modelling at the above address. LBCONV1A.19
C ******************************COPYRIGHT****************************** LBCONV1A.20
! LBCONV1A.21
! + Redistributes data allowing load balancing for convection (T3E only) LBCONV1A.22
! LBCONV1A.23
! Subroutine interface: LBCONV1A.24
LBCONV1A.25
SUBROUTINE T3E_LOAD_BAL_CONV( 1,2LBCONV1A.26
& N_SEGS,MAX_SEG,MAX_P_FIELD,SEG_START,SEG_LEN, LBCONV1A.27
& P_FIELD,Q_LEVELS,BL_LEVELS, LBCONV1A.28
& THETA,Q,PSTAR,BLAND, LBCONV1A.29
& U,V,TRACER, LBCONV1A.30
& DTHBYDT,DQBYDT, LBCONV1A.31
& DUBYDT,DVBYDT,RAIN,SNOW, LBCONV1A.32
& CCA,ICCB,ICCT,CCLWP, LBCONV1A.33
& CCW,ICCBPxCCA,ICCTPxCCA,GBMCCWP,GBMCCW, LBCONV1A.34
& LCBASE,LCTOP,LCCA,LCCLWP,CAPE, LBCONV1A.35
& EXNER,AK,BK,AKM12,BKM12, LBCONV1A.36
& DELAK,DELBK, LBCONV1A.37
& TIMESTEP, LBCONV1A.38
& T1_SD,Q1_SD, LBCONV1A.39
& L_MOM,L_TRACER,L_CAPE,NTRA,TRLEV,L_XSCOMP,L_SDXS, LBCONV1A.40
& L_HALO, LBCONV1A.41
& N_CCA_LEV,L_3D_CCA,L_CCW,MPARWTR,ANVIL_FACTOR,TOWER_FACTOR, LBCONV1A.42
& UD_FACTOR, LBCONV1A.43
& L_CLOUD_DEEP, L_PHASE_LIM, LBCONV1A.44
& UP_FLUX,FLG_UP_FLUX, LBCONV1A.45
& DWN_FLUX,FLG_DWN_FLUX, LBCONV1A.46
& ENTRAIN_UP, FLG_ENTR_UP, LBCONV1A.47
& DETRAIN_UP,FLG_DETR_UP, LBCONV1A.48
& ENTRAIN_DWN, FLG_ENTR_DWN, LBCONV1A.49
& DETRAIN_DWN,FLG_DETR_DWN LBCONV1A.50
& ) LBCONV1A.51
LBCONV1A.52
IMPLICIT NONE LBCONV1A.53
LBCONV1A.54
! Description: LBCONV1A.55
! Load balances the convection. LBCONV1A.56
! LBCONV1A.57
! Method: LBCONV1A.58
! The data on each processor is split into "N_SEGS" segments. LBCONV1A.59
! Each processor keeps a counter "remote_next_seg_to_do" which is LBCONV1A.60
! the next segment on that processor which needs to be passed LBCONV1A.61
! to the convection code. LBCONV1A.62
! Each processor performs a loop, over all processors, starting with LBCONV1A.63
! itself, and looks at the value of "remote_next_seg_to_do" on each LBCONV1A.64
! processor. When it finds a processor in which "remote_next_seg_to_do" LBCONV1A.65
! is less than or equal ot "N_SEGS" (ie. there is still at least one LBCONV1A.66
! segment to do on that processor), the loop is stopped, and one of LBCONV1A.67
! two possible courses of action is taken LBCONV1A.68
! If this is the local processor, then the data is simply passed LBCONV1A.69
! to the convection routines. If it is a remote processor, the data LBCONV1A.70
! is shmem_getted from the remote processor into temporary arrays on LBCONV1A.71
! the local processor, processed, and then shmem_putted back to the LBCONV1A.72
! remote processor. LBCONV1A.73
! The routine is exited, via a call to barrier (to ensure everyone LBCONV1A.74
! has completed) when the above loop completes without any processor LBCONV1A.75
! having any segments left to compute. LBCONV1A.76
! LBCONV1A.77
! Note on adding new arguments to the convection routines: LBCONV1A.78
! Any new arguments should be added in a similar fashion to the LBCONV1A.79
! existing arguments. For examples: LBCONV1A.80
! Single dimensional input argument: PSTAR LBCONV1A.81
! Multi dimensional input argument: DTHBYDT LBCONV1A.82
! Multi dimensional input/output argument: THETA LBCONV1A.83
! Note, for every new argument added, you will need to increase LBCONV1A.84
! the parameter "number_of_vars" by one, and include a new LBCONV1A.85
! var_"variable_name" parameter which has a specific id for the LBCONV1A.86
! new variable. LBCONV1A.87
! LBCONV1A.88
! Current code owner: P.Burton LBCONV1A.89
! LBCONV1A.90
! History LBCONV1A.91
! Model Date Modification history from model version 4.5 LBCONV1A.92
! version LBCONV1A.93
! 4.5 30/01/98 New DECK created for MPP code. P.Burton LBCONV1A.94
! LBCONV1A.95
LBCONV1A.96
LBCONV1A.97
! Subroutine arguments: LBCONV1A.98
LBCONV1A.99
INTEGER LBCONV1A.100
& N_SEGS ! IN: number of segments LBCONV1A.101
&, MAX_SEG ! IN: maximum segment size LBCONV1A.102
&, MAX_P_FIELD ! IN: maximum value of P_FIELD LBCONV1A.103
&, SEG_START(N_SEGS) ! IN: first element of segment LBCONV1A.104
&, SEG_LEN(N_SEGS) ! IN: segment size LBCONV1A.105
&, P_FIELD ! IN: horizontal field size LBCONV1A.106
&, Q_LEVELS ! IN: number of moist levels LBCONV1A.107
&, BL_LEVELS ! IN: number of b.l. levels LBCONV1A.108
&, NTRA ! IN: number of tracer fields LBCONV1A.109
&, TRLEV ! IN: number of tracer levels LBCONV1A.110
&, N_CCA_LEV ! IN: number of convective layers LBCONV1A.111
LBCONV1A.112
REAL LBCONV1A.113
& THETA(P_FIELD,Q_LEVELS) ! INOUT: potential temperature LBCONV1A.114
&, Q(P_FIELD,Q_LEVELS) ! INOUT: mixing ratio LBCONV1A.115
&, PSTAR(P_FIELD) ! IN: surface pressure LBCONV1A.116
&, U(P_FIELD,Q_LEVELS) ! IN: U field (on P grid) LBCONV1A.117
&, V(P_FIELD,Q_LEVELS) ! IN: V field (on P grid) LBCONV1A.118
&, TRACER(P_FIELD,TRLEV,NTRA) ! INOUT: tracer fields LBCONV1A.119
&, DTHBYDT(P_FIELD,Q_LEVELS) ! OUT: increment to pot. temp. LBCONV1A.120
&, DQBYDT(P_FIELD,Q_LEVELS) ! OUT: increment to mix. ratio LBCONV1A.121
&, DUBYDT(P_FIELD,Q_LEVELS) ! OUT: increments to U field LBCONV1A.122
&, DVBYDT(P_FIELD,Q_LEVELS) ! OUT: increments to V field LBCONV1A.123
&, RAIN(P_FIELD) ! OUT: surface convective rain LBCONV1A.124
&, SNOW(P_FIELD) ! OUT: surface convective snow LBCONV1A.125
&, CCA(P_FIELD,N_CCA_LEV) ! OUT: convective cloud amount LBCONV1A.126
&, CCLWP(P_FIELD) ! OUT: condensed water path LBCONV1A.127
&, CCW(P_FIELD,Q_LEVELS) ! OUT: liquid water amount LBCONV1A.128
&, ICCBPxCCA(P_FIELD) ! OUT: cld base pressure x CCA LBCONV1A.129
&, ICCTPxCCA(P_FIELD) ! OUT: cld top pressure x CCA LBCONV1A.130
&, GBMCCWP(P_FIELD) ! OUT: gridbox mean CCWP LBCONV1A.131
&, GBMCCW(P_FIELD,Q_LEVELS) ! OUT: gridbox mean CCW LBCONV1A.132
&, LCCA(P_FIELD) ! OUT: lowest conv. cloud amnt LBCONV1A.133
&, LCCLWP(P_FIELD) ! OUT: condensed water path LBCONV1A.134
&, CAPE(P_FIELD) ! OUT: conv. avail. pot. energy LBCONV1A.135
&, EXNER(P_FIELD,Q_LEVELS+1) ! IN: exner ratio LBCONV1A.136
&, AK(Q_LEVELS) ! IN: hybrid vertical co-ord. LBCONV1A.137
&, BK(Q_LEVELS) ! IN: hybrid vertical co-ord. LBCONV1A.138
&, AKM12(Q_LEVELS+1) ! IN: hybrid vertical co-ord. LBCONV1A.139
&, BKM12(Q_LEVELS+1) ! IN: hybrid vertical co-ord. LBCONV1A.140
&, DELAK(Q_LEVELS) ! IN: diff. of AK over layer LBCONV1A.141
&, DELBK(Q_LEVELS) ! IN: diff. of BK over layer LBCONV1A.142
&, TIMESTEP ! IN: model timestep LBCONV1A.143
&, T1_SD(P_FIELD) ! IN: s.d. of temp. at layer1 LBCONV1A.144
&, Q1_SD(P_FIELD) ! IN: s.d. of humid. at layer1 LBCONV1A.145
&, MPARWTR ! IN: res. of ccw left after conv. LBCONV1A.146
&, ANVIL_FACTOR ! IN: used in calc. of cld. amt. LBCONV1A.147
&, TOWER_FACTOR ! IN: used in calc. of cld. amt. LBCONV1A.148
&, UD_FACTOR ! IN: updraught factor LBCONV1A.149
&, UP_FLUX(P_FIELD,Q_LEVELS) ! OUT: upward flux diagnostic LBCONV1A.150
&, DWN_FLUX(P_FIELD,Q_LEVELS) ! OUT: downward flux diagnostic LBCONV1A.151
&, ENTRAIN_UP(P_FIELD,Q_LEVELS) ! OUT: upward entrainment diag. LBCONV1A.152
&, DETRAIN_UP(P_FIELD,Q_LEVELS) ! OUT: upward detrainment diag. LBCONV1A.153
&, ENTRAIN_DWN(P_FIELD,Q_LEVELS) ! OUT: downward entrainment diag. LBCONV1A.154
&, DETRAIN_DWN(P_FIELD,Q_LEVELS) ! OUT: downward detrainment diag. LBCONV1A.155
LBCONV1A.156
INTEGER LBCONV1A.157
& ICCB(P_FIELD) ! OUT: convective cloud base lev. LBCONV1A.158
&, ICCT(P_FIELD) ! OUT: convective clout top lev. LBCONV1A.159
&, LCBASE(P_FIELD) ! OUT: lowest conv. cloud base LBCONV1A.160
&, LCTOP(P_FIELD) ! OUT: lowest conv. cloud top LBCONV1A.161
LBCONV1A.162
LBCONV1A.163
LOGICAL LBCONV1A.164
& BLAND(P_FIELD) ! IN: land/sea mask LBCONV1A.165
&, L_HALO(P_FIELD) ! IN: halo mask LBCONV1A.166
&, L_MOM ! IN: momentum transport switch LBCONV1A.167
&, L_TRACER ! IN: tracer inclusion switch LBCONV1A.168
&, L_CAPE ! IN: CAPE closure switch LBCONV1A.169
&, L_XSCOMP ! IN: compensation switch LBCONV1A.170
&, L_SDXS ! IN: parcel excess switch LBCONV1A.171
&, L_3D_CCA ! IN: use 3D or 2D cld amt LBCONV1A.172
&, L_CCW ! IN: precip. not inc. in ccw path LBCONV1A.173
&, L_CLOUD_DEEP ! IN: depth criterion for anvils LBCONV1A.174
&, L_PHASE_LIM ! IN: phase change limiter LBCONV1A.175
&, FLG_UP_FLUX ! IN: output upward flux diag. LBCONV1A.176
&, FLG_DWN_FLUX ! IN: output downward flux diag. LBCONV1A.177
&, FLG_ENTR_UP ! IN: output upward entr. diag. LBCONV1A.178
&, FLG_DETR_UP ! IN: output upward detr. diag. LBCONV1A.179
&, FLG_ENTR_DWN ! IN: output downward entr. diag. LBCONV1A.180
&, FLG_DETR_DWN ! IN: output downward entr. diag. LBCONV1A.181
LBCONV1A.182
! Comdecks LBCONV1A.183
*CALL PARVARS
LBCONV1A.184
LBCONV1A.185
! Local variables LBCONV1A.186
LBCONV1A.187
! Copies of segments of arrays on other PEs: LBCONV1A.188
REAL LBCONV1A.189
& local_THETA(MAX_SEG,Q_LEVELS) LBCONV1A.190
&, local_Q(MAX_SEG,Q_LEVELS) LBCONV1A.191
&, local_PSTAR(MAX_SEG) LBCONV1A.192
&, local_U(MAX_SEG,Q_LEVELS) LBCONV1A.193
&, local_V(MAX_SEG,Q_LEVELS) LBCONV1A.194
&, local_TRACER(MAX_SEG,TRLEV,NTRA) LBCONV1A.195
&, local_DTHBYDT(MAX_SEG,Q_LEVELS) LBCONV1A.196
&, local_DQBYDT(MAX_SEG,Q_LEVELS) LBCONV1A.197
&, local_DUBYDT(MAX_SEG,Q_LEVELS) LBCONV1A.198
&, local_DVBYDT(MAX_SEG,Q_LEVELS) LBCONV1A.199
&, local_RAIN(MAX_SEG) LBCONV1A.200
&, local_SNOW(MAX_SEG) LBCONV1A.201
&, local_CCA(MAX_SEG,N_CCA_LEV) LBCONV1A.202
&, local_CCLWP(MAX_SEG) LBCONV1A.203
&, local_CCW(MAX_SEG,Q_LEVELS) LBCONV1A.204
&, local_ICCBPxCCA(MAX_SEG) LBCONV1A.205
&, local_ICCTPxCCA(MAX_SEG) LBCONV1A.206
&, local_GBMCCWP(MAX_SEG) LBCONV1A.207
&, local_GBMCCW(MAX_SEG,Q_LEVELS) LBCONV1A.208
&, local_LCCA(MAX_SEG) LBCONV1A.209
&, local_LCCLWP(MAX_SEG) LBCONV1A.210
&, local_CAPE(MAX_SEG) LBCONV1A.211
&, local_EXNER(MAX_SEG,Q_LEVELS+1) LBCONV1A.212
&, local_T1_SD(MAX_SEG) LBCONV1A.213
&, local_Q1_SD(MAX_SEG) LBCONV1A.214
&, local_UP_FLUX(MAX_SEG,Q_LEVELS) LBCONV1A.215
&, local_DWN_FLUX(MAX_SEG,Q_LEVELS) LBCONV1A.216
&, local_ENTRAIN_UP(MAX_SEG,Q_LEVELS) LBCONV1A.217
&, local_DETRAIN_UP(MAX_SEG,Q_LEVELS) LBCONV1A.218
&, local_ENTRAIN_DWN(MAX_SEG,Q_LEVELS) LBCONV1A.219
&, local_DETRAIN_DWN(MAX_SEG,Q_LEVELS) LBCONV1A.220
LBCONV1A.221
INTEGER LBCONV1A.222
& local_ICCB(MAX_SEG) LBCONV1A.223
&, local_ICCT(MAX_SEG) LBCONV1A.224
&, local_LCBASE(MAX_SEG) LBCONV1A.225
&, local_LCTOP(MAX_SEG) LBCONV1A.226
LBCONV1A.227
LOGICAL LBCONV1A.228
& local_BLAND(MAX_SEG) LBCONV1A.229
&, local_L_HALO(MAX_SEG) LBCONV1A.230
LBCONV1A.231
INTEGER LBCONV1A.232
& copy_remote_P_FIELD ! value of P_FIELD on remote PE LBCONV1A.233
&, copy_remote_SEG_START ! segment start on remote PE LBCONV1A.234
&, copy_remote_SEG_LEN ! segment length on remote PE LBCONV1A.235
LBCONV1A.236
! Dummy versions of arrays used for generating addresses required LBCONV1A.237
! by the SHMEM calls LBCONV1A.238
REAL LBCONV1A.239
& remote_THETA(MAX_P_FIELD*Q_LEVELS) LBCONV1A.240
&, remote_Q(MAX_P_FIELD*Q_LEVELS) LBCONV1A.241
&, remote_PSTAR(MAX_P_FIELD) LBCONV1A.242
&, remote_U(MAX_P_FIELD*Q_LEVELS) LBCONV1A.243
&, remote_V(MAX_P_FIELD*Q_LEVELS) LBCONV1A.244
&, remote_TRACER(MAX_P_FIELD*TRLEV*NTRA) LBCONV1A.245
&, remote_DTHBYDT(MAX_P_FIELD*Q_LEVELS) LBCONV1A.246
&, remote_DQBYDT(MAX_P_FIELD*Q_LEVELS) LBCONV1A.247
&, remote_DUBYDT(MAX_P_FIELD*Q_LEVELS) LBCONV1A.248
&, remote_DVBYDT(MAX_P_FIELD*Q_LEVELS) LBCONV1A.249
&, remote_RAIN(MAX_P_FIELD) LBCONV1A.250
&, remote_SNOW(MAX_P_FIELD) LBCONV1A.251
&, remote_CCA(MAX_P_FIELD*N_CCA_LEV) LBCONV1A.252
&, remote_CCLWP(MAX_P_FIELD) LBCONV1A.253
&, remote_CCW(MAX_P_FIELD*Q_LEVELS) LBCONV1A.254
&, remote_ICCBPxCCA(MAX_P_FIELD) LBCONV1A.255
&, remote_ICCTPxCCA(MAX_P_FIELD) LBCONV1A.256
&, remote_GBMCCWP(MAX_P_FIELD) LBCONV1A.257
&, remote_GBMCCW(MAX_P_FIELD*Q_LEVELS) LBCONV1A.258
&, remote_LCCA(MAX_P_FIELD) LBCONV1A.259
&, remote_LCCLWP(MAX_P_FIELD) LBCONV1A.260
&, remote_CAPE(MAX_P_FIELD) LBCONV1A.261
&, remote_EXNER(MAX_P_FIELD*(Q_LEVELS+1)) LBCONV1A.262
&, remote_T1_SD(MAX_P_FIELD) LBCONV1A.263
&, remote_Q1_SD(MAX_P_FIELD) LBCONV1A.264
&, remote_UP_FLUX(MAX_P_FIELD*Q_LEVELS) LBCONV1A.265
&, remote_DWN_FLUX(MAX_P_FIELD*Q_LEVELS) LBCONV1A.266
&, remote_ENTRAIN_UP(MAX_P_FIELD*Q_LEVELS) LBCONV1A.267
&, remote_DETRAIN_UP(MAX_P_FIELD*Q_LEVELS) LBCONV1A.268
&, remote_ENTRAIN_DWN(MAX_P_FIELD*Q_LEVELS) LBCONV1A.269
&, remote_DETRAIN_DWN(MAX_P_FIELD*Q_LEVELS) LBCONV1A.270
LBCONV1A.271
INTEGER LBCONV1A.272
& remote_ICCB(MAX_P_FIELD) LBCONV1A.273
&, remote_ICCT(MAX_P_FIELD) LBCONV1A.274
&, remote_LCBASE(MAX_P_FIELD) LBCONV1A.275
&, remote_LCTOP(MAX_P_FIELD) LBCONV1A.276
LBCONV1A.277
LOGICAL LBCONV1A.278
& remote_BLAND(MAX_P_FIELD) LBCONV1A.279
&, remote_L_HALO(MAX_P_FIELD) LBCONV1A.280
LBCONV1A.281
INTEGER LBCONV1A.282
& remote_P_FIELD LBCONV1A.283
&, remote_SEG_START(N_SEGS) LBCONV1A.284
&, remote_SEG_LEN(N_SEGS) LBCONV1A.285
LBCONV1A.286
! Pointers pointing to the remote addresses of the arrays LBCONV1A.287
LBCONV1A.288
POINTER LBCONV1A.289
& (ptr_THETA,remote_THETA) LBCONV1A.290
&, (ptr_Q,remote_Q) LBCONV1A.291
&, (ptr_PSTAR,remote_PSTAR) LBCONV1A.292
&, (ptr_U,remote_U) LBCONV1A.293
&, (ptr_V,remote_V) LBCONV1A.294
&, (ptr_TRACER,remote_TRACER) LBCONV1A.295
&, (ptr_DTHBYDT,remote_DTHBYDT) LBCONV1A.296
&, (ptr_DQBYDT,remote_DQBYDT) LBCONV1A.297
&, (ptr_DUBYDT,remote_DUBYDT) LBCONV1A.298
&, (ptr_DVBYDT,remote_DVBYDT) LBCONV1A.299
&, (ptr_RAIN,remote_RAIN) LBCONV1A.300
&, (ptr_SNOW,remote_SNOW) LBCONV1A.301
&, (ptr_CCA,remote_CCA) LBCONV1A.302
&, (ptr_CCLWP,remote_CCLWP) LBCONV1A.303
&, (ptr_CCW,remote_CCW) LBCONV1A.304
&, (ptr_ICCBPxCCA,remote_ICCBPxCCA) LBCONV1A.305
&, (ptr_ICCTPxCCA,remote_ICCTPxCCA) LBCONV1A.306
&, (ptr_GBMCCWP,remote_GBMCCWP) LBCONV1A.307
&, (ptr_GBMCCW,remote_GBMCCW) LBCONV1A.308
&, (ptr_LCCA,remote_LCCA) LBCONV1A.309
&, (ptr_LCCLWP,remote_LCCLWP) LBCONV1A.310
&, (ptr_CAPE,remote_CAPE) LBCONV1A.311
&, (ptr_EXNER,remote_EXNER) LBCONV1A.312
&, (ptr_T1_SD,remote_T1_SD) LBCONV1A.313
&, (ptr_Q1_SD,remote_Q1_SD) LBCONV1A.314
&, (ptr_ICCB,remote_ICCB) LBCONV1A.315
&, (ptr_ICCT,remote_ICCT) LBCONV1A.316
&, (ptr_LCBASE,remote_LCBASE) LBCONV1A.317
&, (ptr_LCTOP,remote_LCTOP) LBCONV1A.318
&, (ptr_BLAND,remote_BLAND) LBCONV1A.319
&, (ptr_L_HALO,remote_L_HALO) LBCONV1A.320
&, (ptr_P_FIELD,remote_P_FIELD) LBCONV1A.321
&, (ptr_SEG_START,remote_SEG_START) LBCONV1A.322
&, (ptr_SEG_LEN,remote_SEG_LEN) LBCONV1A.323
&, (ptr_UP_FLUX,remote_UP_FLUX) LBCONV1A.324
&, (ptr_DWN_FLUX,remote_DWN_FLUX) LBCONV1A.325
&, (ptr_ENTRAIN_UP,remote_ENTRAIN_UP) LBCONV1A.326
&, (ptr_DETRAIN_UP,remote_DETRAIN_UP) LBCONV1A.327
&, (ptr_ENTRAIN_DWN,remote_ENTRAIN_DWN) LBCONV1A.328
&, (ptr_DETRAIN_DWN,remote_DETRAIN_DWN) LBCONV1A.329
LBCONV1A.330
LBCONV1A.331
! Array containg start address of each variable LBCONV1A.332
INTEGER LBCONV1A.333
& number_of_vars LBCONV1A.334
PARAMETER LBCONV1A.335
& (number_of_vars=40) LBCONV1A.336
LBCONV1A.337
INTEGER LBCONV1A.338
& address(number_of_vars) LBCONV1A.339
&, remote_address(number_of_vars) ! copy of address on remote pe LBCONV1A.340
LBCONV1A.341
&, status ! indicates if this processor is ready for comms. LBCONV1A.342
&, next_seg_to_do ! next segment to calculate on this PE LBCONV1A.343
LBCONV1A.344
LBCONV1A.345
COMMON /shmem_LBCONV_align/ ! make sure arrays are aligned on LBCONV1A.346
& address,status,next_seg_to_do ! each PE LBCONV1A.347
LBCONV1A.348
! And magic numbers for each variables location in address array LBCONV1A.349
LBCONV1A.350
INTEGER LBCONV1A.351
& var_THETA,var_Q,var_PSTAR,var_U,var_V,var_TRACER, LBCONV1A.352
& var_DTHBYDT,var_DQBYDT,var_DUBYDT,var_DVBYDT,var_RAIN, LBCONV1A.353
& var_SNOW,var_CCA,var_CCLWP,var_CCW,var_ICCBPxCCA, LBCONV1A.354
& var_ICCTPxCCA,var_GBMCCWP,var_GBMCCW,var_LCCA,var_LCCLWP, LBCONV1A.355
& var_CAPE,var_EXNER,var_T1_SD,var_Q1_SD,var_ICCB,var_ICCT, LBCONV1A.356
& var_LCBASE,var_LCTOP,var_BLAND,var_L_HALO, LBCONV1A.357
& var_P_FIELD,var_SEG_START,var_SEG_LEN, LBCONV1A.358
& var_UP_FLUX,var_DWN_FLUX, LBCONV1A.359
& var_ENTRAIN_UP,var_DETRAIN_UP, LBCONV1A.360
& var_ENTRAIN_DWN,var_DETRAIN_DWN LBCONV1A.361
LBCONV1A.362
PARAMETER( LBCONV1A.363
& var_THETA=1 LBCONV1A.364
&, var_Q=2 LBCONV1A.365
&, var_PSTAR=3 LBCONV1A.366
&, var_U=4 LBCONV1A.367
&, var_V=5 LBCONV1A.368
&, var_TRACER=6 LBCONV1A.369
&, var_DTHBYDT=7 LBCONV1A.370
&, var_DQBYDT=8 LBCONV1A.371
&, var_DUBYDT=9 LBCONV1A.372
&, var_DVBYDT=10 LBCONV1A.373
&, var_RAIN=11 LBCONV1A.374
&, var_SNOW=12 LBCONV1A.375
&, var_CCA=13 LBCONV1A.376
&, var_CCLWP=14 LBCONV1A.377
&, var_CCW=15 LBCONV1A.378
&, var_ICCBPxCCA=16 LBCONV1A.379
&, var_ICCTPxCCA=17 LBCONV1A.380
&, var_GBMCCWP=18 LBCONV1A.381
&, var_GBMCCW=19 LBCONV1A.382
&, var_LCCA=20 LBCONV1A.383
&, var_LCCLWP=21 LBCONV1A.384
&, var_CAPE=22 LBCONV1A.385
&, var_EXNER=23 LBCONV1A.386
&, var_T1_SD=24 LBCONV1A.387
&, var_Q1_SD=25 LBCONV1A.388
&, var_ICCB=26 LBCONV1A.389
&, var_ICCT=27 LBCONV1A.390
&, var_LCBASE=28 LBCONV1A.391
&, var_LCTOP=29 LBCONV1A.392
&, var_BLAND=30 LBCONV1A.393
&, var_L_HALO=31 LBCONV1A.394
&, var_P_FIELD=32 LBCONV1A.395
&, var_SEG_START=33 LBCONV1A.396
&, var_SEG_LEN=34 LBCONV1A.397
&, var_UP_FLUX=35 LBCONV1A.398
&, var_DWN_FLUX=36 LBCONV1A.399
&, var_ENTRAIN_UP=37 LBCONV1A.400
&, var_DETRAIN_UP=38 LBCONV1A.401
&, var_ENTRAIN_DWN=39 LBCONV1A.402
&, var_DETRAIN_DWN=40 LBCONV1A.403
& ) LBCONV1A.404
LBCONV1A.405
! Parameters LBCONV1A.406
INTEGER LBCONV1A.407
& locked LBCONV1A.408
PARAMETER (locked=-1) LBCONV1A.409
LBCONV1A.410
! Other variables LBCONV1A.411
LBCONV1A.412
INTEGER LBCONV1A.413
& iproc ! loop counter over virtual PEs LBCONV1A.414
&, remote_pe ! processor I'm communicating with LBCONV1A.415
&, i ! loop counter over horizontal field LBCONV1A.416
&, k ! loop counter for loop over levels LBCONV1A.417
&, fp ! first point in remote var. to start copying from LBCONV1A.418
&, len ! number of points to copy from remote variable LBCONV1A.419
&, fld ! loop counter for loop over tracer fields LBCONV1A.420
&, remote_status ! value of status on remote pe LBCONV1A.421
&, iseg ! segment of data to process LBCONV1A.422
&, remote_next_seg_to_do ! value on remote pe LBCONV1A.423
LBCONV1A.424
LOGICAL LBCONV1A.425
& found_work ! if any work could be found to do LBCONV1A.426
LBCONV1A.427
! Functions LBCONV1A.428
INTEGER LBCONV1A.429
& shmem_swap LBCONV1A.430
LBCONV1A.431
!----------------------------------------------------------------- LBCONV1A.432
! 1.0 Set up the address array with the start address of all the LBCONV1A.433
! variables that will require transfer between processors. LBCONV1A.434
LBCONV1A.435
address(var_THETA)=LOC(THETA) LBCONV1A.436
address(var_Q)=LOC(Q) LBCONV1A.437
address(var_PSTAR)=LOC(PSTAR) LBCONV1A.438
address(var_U)=LOC(U) LBCONV1A.439
address(var_V)=LOC(V) LBCONV1A.440
address(var_TRACER)=LOC(TRACER) LBCONV1A.441
address(var_DTHBYDT)=LOC(DTHBYDT) LBCONV1A.442
address(var_DQBYDT)=LOC(DQBYDT) LBCONV1A.443
address(var_DUBYDT)=LOC(DUBYDT) LBCONV1A.444
address(var_DVBYDT)=LOC(DVBYDT) LBCONV1A.445
address(var_RAIN)=LOC(RAIN) LBCONV1A.446
address(var_SNOW)=LOC(SNOW) LBCONV1A.447
address(var_CCA)=LOC(CCA) LBCONV1A.448
address(var_CCLWP)=LOC(CCLWP) LBCONV1A.449
address(var_CCW)=LOC(CCW) LBCONV1A.450
address(var_ICCBPxCCA)=LOC(ICCBPxCCA) LBCONV1A.451
address(var_ICCTPxCCA)=LOC(ICCTPxCCA) LBCONV1A.452
address(var_GBMCCWP)=LOC(GBMCCWP) LBCONV1A.453
address(var_GBMCCW)=LOC(GBMCCW) LBCONV1A.454
address(var_LCCA)=LOC(LCCA) LBCONV1A.455
address(var_LCCLWP)=LOC(LCCLWP) LBCONV1A.456
address(var_CAPE)=LOC(CAPE) LBCONV1A.457
address(var_EXNER)=LOC(EXNER) LBCONV1A.458
address(var_T1_SD)=LOC(T1_SD) LBCONV1A.459
address(var_Q1_SD)=LOC(Q1_SD) LBCONV1A.460
address(var_ICCB)=LOC(ICCB) LBCONV1A.461
address(var_ICCT)=LOC(ICCT) LBCONV1A.462
address(var_LCBASE)=LOC(LCBASE) LBCONV1A.463
address(var_LCTOP)=LOC(LCTOP) LBCONV1A.464
address(var_BLAND)=LOC(BLAND) LBCONV1A.465
address(var_L_HALO)=LOC(L_HALO) LBCONV1A.466
address(var_P_FIELD)=LOC(P_FIELD) LBCONV1A.467
address(var_SEG_START)=LOC(SEG_START) LBCONV1A.468
address(var_SEG_LEN)=LOC(SEG_LEN) LBCONV1A.469
address(var_UP_FLUX)=LOC(UP_FLUX) LBCONV1A.470
address(var_DWN_FLUX)=LOC(DWN_FLUX) LBCONV1A.471
address(var_ENTRAIN_UP)=LOC(ENTRAIN_UP) LBCONV1A.472
address(var_DETRAIN_UP)=LOC(DETRAIN_UP) LBCONV1A.473
address(var_ENTRAIN_DWN)=LOC(ENTRAIN_DWN) LBCONV1A.474
address(var_DETRAIN_DWN)=LOC(DETRAIN_DWN) LBCONV1A.475
LBCONV1A.476
! Set up variables required for the snooping algorithm LBCONV1A.477
LBCONV1A.478
found_work=.TRUE. LBCONV1A.479
next_seg_to_do=0 LBCONV1A.480
LBCONV1A.481
! Synchronize to ensure everyone has a value address array... LBCONV1A.482
LBCONV1A.483
CALL barrier(
) LBCONV1A.484
LBCONV1A.485
!----------------------------------------------------------------- LBCONV1A.486
LBCONV1A.487
! Loop until there is no work left to do LBCONV1A.488
DO WHILE (found_work) LBCONV1A.489
LBCONV1A.490
found_work=.FALSE. ! default - set to TRUE when some LBCONV1A.491
! work has been found LBCONV1A.492
iproc=mype LBCONV1A.493
LBCONV1A.494
! Loop over processors looking for work to be done LBCONV1A.495
DO WHILE (.NOT.((iproc .GT. (mype + nproc-1)) .OR. LBCONV1A.496
& (found_work))) LBCONV1A.497
LBCONV1A.498
remote_pe=MOD(iproc,nproc) LBCONV1A.499
iproc=iproc+1 LBCONV1A.500
LBCONV1A.501
! Set lock on remote_pe, and find value of next_seg_to_do on that PE LBCONV1A.502
remote_next_seg_to_do=locked LBCONV1A.503
DO WHILE (remote_next_seg_to_do .EQ. locked) LBCONV1A.504
remote_next_seg_to_do= LBCONV1A.505
& shmem_swap(next_seg_to_do,locked,remote_pe) LBCONV1A.506
ENDDO LBCONV1A.507
LBCONV1A.508
! Increment counter for next segment to do on remote_pe LBCONV1A.509
remote_next_seg_to_do=remote_next_seg_to_do+1 LBCONV1A.510
LBCONV1A.511
! Write the incremented counter back to remote_pe, and remove LBCONV1A.512
! the lock LBCONV1A.513
status=shmem_swap(next_seg_to_do, LBCONV1A.514
& remote_next_seg_to_do,remote_pe) LBCONV1A.515
LBCONV1A.516
IF (status .NE. locked) THEN LBCONV1A.517
WRITE(6,*) 'Error unlocking PE ',remote_pe LBCONV1A.518
ENDIF LBCONV1A.519
LBCONV1A.520
! If there is some work to do on remote_pe: LBCONV1A.521
IF (remote_next_seg_to_do .LE. N_SEGS) THEN LBCONV1A.522
found_work=.TRUE. LBCONV1A.523
iseg=remote_next_seg_to_do LBCONV1A.524
ENDIF LBCONV1A.525
LBCONV1A.526
! If the data is local, we can just call the convection routines LBCONV1A.527
! without copying any data LBCONV1A.528
LBCONV1A.529
IF (found_work) THEN LBCONV1A.530
IF (remote_pe .EQ. mype) THEN LBCONV1A.531
LBCONV1A.532
fp=SEG_START(iseg) LBCONV1A.533
LBCONV1A.534
CALL GLUE_CONV
( LBCONV1A.535
& P_FIELD,SEG_LEN(iseg),Q_LEVELS,BL_LEVELS, LBCONV1A.536
& THETA(fp,1),Q(fp,1), LBCONV1A.537
& PSTAR(fp),BLAND(fp), LBCONV1A.538
& U(fp,1),V(fp,1), LBCONV1A.539
& TRACER(fp,1,1), LBCONV1A.540
& DTHBYDT(fp,1), LBCONV1A.541
& DQBYDT(fp,1), LBCONV1A.542
& DUBYDT(fp,1),DVBYDT(fp,1), LBCONV1A.543
& RAIN(fp),SNOW(fp), LBCONV1A.544
& CCA(fp,1),ICCB(fp),ICCT(fp),CCLWP(fp), LBCONV1A.545
& CCW(fp,1),ICCBPxCCA(fp),ICCTPxCCA(fp), LBCONV1A.546
& GBMCCWP(fp),GBMCCW(fp,1), LBCONV1A.547
& LCBASE(fp),LCTOP(fp),LCCA(fp), LBCONV1A.548
& LCCLWP(fp),CAPE(fp), LBCONV1A.549
& EXNER(fp,1), LBCONV1A.550
& AK,BK,AKM12,BKM12, LBCONV1A.551
& DELAK,DELBK, LBCONV1A.552
& TIMESTEP, LBCONV1A.553
& T1_SD(fp),Q1_SD(fp), LBCONV1A.554
& L_MOM,L_TRACER,L_CAPE,NTRA,TRLEV,L_XSCOMP,L_SDXS, LBCONV1A.555
& L_HALO(fp), LBCONV1A.556
& N_CCA_LEV,L_3D_CCA,L_CCW,MPARWTR, LBCONV1A.557
& ANVIL_FACTOR,TOWER_FACTOR, LBCONV1A.558
& UD_FACTOR, LBCONV1A.559
& L_CLOUD_DEEP,L_PHASE_LIM, LBCONV1A.560
& UP_FLUX(fp,1),FLG_UP_FLUX, LBCONV1A.561
& DWN_FLUX(fp,1),FLG_DWN_FLUX, LBCONV1A.562
& ENTRAIN_UP(fp,1),FLG_ENTR_UP, LBCONV1A.563
& DETRAIN_UP(fp,1),FLG_DETR_UP, LBCONV1A.564
& ENTRAIN_DWN(fp,1),FLG_DETR_DWN, LBCONV1A.565
& DETRAIN_DWN(fp,1),FLG_DETR_DWN LBCONV1A.566
& ) LBCONV1A.567
LBCONV1A.568
! If the data is remote, then we need to get the data into LBCONV1A.569
! temporary arrays, process it, and put it back LBCONV1A.570
ELSE LBCONV1A.571
LBCONV1A.572
! Get the address array from remote_pe. remote_address will contain LBCONV1A.573
! the start address of each array on the remote processor. LBCONV1A.574
LBCONV1A.575
CALL shmem_get(
remote_address,address, LBCONV1A.576
& number_of_vars,remote_pe) LBCONV1A.577
LBCONV1A.578
! Find out the remote P_FIELD, the size of the segment, and its LBCONV1A.579
! start location LBCONV1A.580
LBCONV1A.581
ptr_P_FIELD=remote_address(var_P_FIELD) LBCONV1A.582
ptr_SEG_START=remote_address(var_SEG_START) LBCONV1A.583
ptr_SEG_LEN=remote_address(var_SEG_LEN) LBCONV1A.584
LBCONV1A.585
CALL shmem_get(
copy_remote_P_FIELD,remote_P_FIELD, LBCONV1A.586
& 1,remote_pe) LBCONV1A.587
CALL shmem_get(
copy_remote_SEG_START, LBCONV1A.588
& remote_SEG_START(iseg),1,remote_pe) LBCONV1A.589
CALL shmem_get(
copy_remote_SEG_LEN, LBCONV1A.590
& remote_SEG_LEN(iseg),1,remote_pe) LBCONV1A.591
LBCONV1A.592
! Set up all the pointers, so that the remote_??? variables can LBCONV1A.593
! be used to generate valid addresses on remote_pe LBCONV1A.594
LBCONV1A.595
ptr_THETA=remote_address(var_THETA) LBCONV1A.596
ptr_Q=remote_address(var_Q) LBCONV1A.597
ptr_PSTAR=remote_address(var_PSTAR) LBCONV1A.598
ptr_U=remote_address(var_U) LBCONV1A.599
ptr_V=remote_address(var_V) LBCONV1A.600
ptr_TRACER=remote_address(var_TRACER) LBCONV1A.601
ptr_DTHBYDT=remote_address(var_DTHBYDT) LBCONV1A.602
ptr_DQBYDT=remote_address(var_DQBYDT) LBCONV1A.603
ptr_DUBYDT=remote_address(var_DUBYDT) LBCONV1A.604
ptr_DVBYDT=remote_address(var_DVBYDT) LBCONV1A.605
ptr_RAIN=remote_address(var_RAIN) LBCONV1A.606
ptr_SNOW=remote_address(var_SNOW) LBCONV1A.607
ptr_CCA=remote_address(var_CCA) LBCONV1A.608
ptr_CCLWP=remote_address(var_CCLWP) LBCONV1A.609
ptr_CCW=remote_address(var_CCW) LBCONV1A.610
ptr_ICCBPxCCA=remote_address(var_ICCBPxCCA) LBCONV1A.611
ptr_ICCTPxCCA=remote_address(var_ICCTPxCCA) LBCONV1A.612
ptr_GBMCCWP=remote_address(var_GBMCCWP) LBCONV1A.613
ptr_GBMCCW=remote_address(var_GBMCCW) LBCONV1A.614
ptr_LCCA=remote_address(var_LCCA) LBCONV1A.615
ptr_LCCLWP=remote_address(var_LCCLWP) LBCONV1A.616
ptr_CAPE=remote_address(var_CAPE) LBCONV1A.617
ptr_EXNER=remote_address(var_EXNER) LBCONV1A.618
ptr_T1_SD=remote_address(var_T1_SD) LBCONV1A.619
ptr_Q1_SD=remote_address(var_Q1_SD) LBCONV1A.620
ptr_ICCB=remote_address(var_ICCB) LBCONV1A.621
ptr_ICCT=remote_address(var_ICCT) LBCONV1A.622
ptr_LCBASE=remote_address(var_LCBASE) LBCONV1A.623
ptr_LCTOP=remote_address(var_LCTOP) LBCONV1A.624
ptr_BLAND=remote_address(var_BLAND) LBCONV1A.625
ptr_L_HALO=remote_address(var_L_HALO) LBCONV1A.626
ptr_UP_FLUX=remote_address(var_UP_FLUX) LBCONV1A.627
ptr_DWN_FLUX=remote_address(var_DWN_FLUX) LBCONV1A.628
ptr_ENTRAIN_UP=remote_address(var_ENTRAIN_UP) LBCONV1A.629
ptr_DETRAIN_UP=remote_address(var_DETRAIN_UP) LBCONV1A.630
ptr_ENTRAIN_DWN=remote_address(var_ENTRAIN_DWN) LBCONV1A.631
ptr_DETRAIN_DWN=remote_address(var_DETRAIN_DWN) LBCONV1A.632
LBCONV1A.633
! Now get all the data required for the call to convection LBCONV1A.634
LBCONV1A.635
len=copy_remote_seg_len LBCONV1A.636
LBCONV1A.637
! Single level fields LBCONV1A.638
LBCONV1A.639
fp=copy_remote_seg_start LBCONV1A.640
LBCONV1A.641
CALL shmem_get(
local_PSTAR,remote_PSTAR(fp), LBCONV1A.642
& len,remote_pe) LBCONV1A.643
CALL shmem_get(
local_T1_SD,remote_T1_SD(fp), LBCONV1A.644
& len,remote_pe) LBCONV1A.645
CALL shmem_get(
local_Q1_SD,remote_Q1_SD(fp), LBCONV1A.646
& len,remote_pe) LBCONV1A.647
CALL shmem_get(
local_BLAND,remote_BLAND(fp), LBCONV1A.648
& len,remote_pe) LBCONV1A.649
CALL shmem_get(
local_L_HALO,remote_L_HALO(fp), LBCONV1A.650
& len,remote_pe) LBCONV1A.651
CALL shmem_get(
local_LCCLWP,remote_LCCLWP(fp), LBCONV1A.652
& len,remote_pe) LBCONV1A.653
LBCONV1A.654
! A few fields require initialisation to zeros (the source fields have LBCONV1A.655
! been initialised in conv_ctl). Convection routine only sets LBCONV1A.656
! convecting points, so we need to ensure other points have valid LBCONV1A.657
! values. LBCONV1A.658
LBCONV1A.659
DO i=1,len LBCONV1A.660
local_LCCA(i)=0.0 LBCONV1A.661
local_LCBASE(i)=0 LBCONV1A.662
local_LCTOP(i)=0 LBCONV1A.663
ENDDO LBCONV1A.664
LBCONV1A.665
! Multi level fields LBCONV1A.666
LBCONV1A.667
! Normal multi-level fields: THETA,Q LBCONV1A.668
LBCONV1A.669
DO k=1,Q_LEVELS LBCONV1A.670
LBCONV1A.671
fp=copy_remote_seg_start+ LBCONV1A.672
& copy_remote_P_FIELD*(k-1) LBCONV1A.673
LBCONV1A.674
CALL shmem_get(
local_THETA(1,k),remote_THETA(fp), LBCONV1A.675
& len,remote_pe) LBCONV1A.676
CALL shmem_get(
local_Q(1,k),remote_Q(fp), LBCONV1A.677
& len,remote_pe) LBCONV1A.678
LBCONV1A.679
ENDDO LBCONV1A.680
LBCONV1A.681
! EXNER which has an extra level LBCONV1A.682
LBCONV1A.683
DO k=1,Q_LEVELS+1 LBCONV1A.684
LBCONV1A.685
fp=copy_remote_seg_start+ LBCONV1A.686
& copy_remote_P_FIELD*(k-1) LBCONV1A.687
LBCONV1A.688
CALL shmem_get(
local_EXNER(1,k),remote_EXNER(fp), LBCONV1A.689
& len,remote_pe) LBCONV1A.690
LBCONV1A.691
ENDDO LBCONV1A.692
LBCONV1A.693
! Optional fields LBCONV1A.694
LBCONV1A.695
! Tracers LBCONV1A.696
LBCONV1A.697
IF (L_TRACER) THEN LBCONV1A.698
LBCONV1A.699
DO fld=1,NTRA LBCONV1A.700
LBCONV1A.701
DO k=1,TRLEV LBCONV1A.702
LBCONV1A.703
fp=copy_remote_seg_start+ LBCONV1A.704
& (copy_remote_P_FIELD*(k-1))+ LBCONV1A.705
& (copy_remote_P_FIELD*TRLEV*(fld-1)) LBCONV1A.706
LBCONV1A.707
CALL shmem_get(
local_TRACER(1,k,fld), LBCONV1A.708
& remote_TRACER(fp), LBCONV1A.709
& len,remote_pe) LBCONV1A.710
LBCONV1A.711
ENDDO LBCONV1A.712
ENDDO LBCONV1A.713
ENDIF LBCONV1A.714
LBCONV1A.715
! Convective momentum transfer fields LBCONV1A.716
LBCONV1A.717
IF (L_MOM) THEN LBCONV1A.718
LBCONV1A.719
DO k=1,Q_LEVELS LBCONV1A.720
LBCONV1A.721
fp=copy_remote_seg_start+ LBCONV1A.722
& copy_remote_P_FIELD*(k-1) LBCONV1A.723
LBCONV1A.724
CALL shmem_get(
local_U(1,k),remote_U(fp), LBCONV1A.725
& len,remote_pe) LBCONV1A.726
CALL shmem_get(
local_V(1,k),remote_V(fp), LBCONV1A.727
& len,remote_pe) LBCONV1A.728
LBCONV1A.729
ENDDO LBCONV1A.730
ENDIF LBCONV1A.731
LBCONV1A.732
! Now call convection routine with the copies of the remote LBCONV1A.733
! variables (local_???). LBCONV1A.734
LBCONV1A.735
CALL GLUE_CONV
( LBCONV1A.736
& MAX_SEG,len,Q_LEVELS,BL_LEVELS, LBCONV1A.737
& local_THETA,local_Q, LBCONV1A.738
& local_PSTAR,local_BLAND, LBCONV1A.739
& local_U,local_V, LBCONV1A.740
& local_TRACER, LBCONV1A.741
& local_DTHBYDT, LBCONV1A.742
& local_DQBYDT, LBCONV1A.743
& local_DUBYDT,local_DVBYDT, LBCONV1A.744
& local_RAIN,local_SNOW, LBCONV1A.745
& local_CCA,local_ICCB,local_ICCT,local_CCLWP, LBCONV1A.746
& local_CCW,local_ICCBPxCCA,local_ICCTPxCCA, LBCONV1A.747
& local_GBMCCWP,local_GBMCCW, LBCONV1A.748
& local_LCBASE,local_LCTOP,local_LCCA, LBCONV1A.749
& local_LCCLWP,local_CAPE, LBCONV1A.750
& local_EXNER, LBCONV1A.751
& AK,BK,AKM12,BKM12, LBCONV1A.752
& DELAK,DELBK, LBCONV1A.753
& TIMESTEP, LBCONV1A.754
& local_T1_SD,local_Q1_SD, LBCONV1A.755
& L_MOM,L_TRACER,L_CAPE,NTRA,TRLEV,L_XSCOMP,L_SDXS, LBCONV1A.756
& local_L_HALO, LBCONV1A.757
& N_CCA_LEV,L_3D_CCA,L_CCW,MPARWTR, LBCONV1A.758
& ANVIL_FACTOR,TOWER_FACTOR, LBCONV1A.759
& UD_FACTOR, LBCONV1A.760
& L_CLOUD_DEEP,L_PHASE_LIM, LBCONV1A.761
& local_UP_FLUX,FLG_UP_FLUX, LBCONV1A.762
& local_DWN_FLUX,FLG_DWN_FLUX, LBCONV1A.763
& local_ENTRAIN_UP,FLG_ENTR_UP, LBCONV1A.764
& local_DETRAIN_UP,FLG_DETR_UP, LBCONV1A.765
& local_ENTRAIN_DWN,FLG_DETR_DWN, LBCONV1A.766
& local_DETRAIN_DWN,FLG_DETR_DWN LBCONV1A.767
& ) LBCONV1A.768
LBCONV1A.769
! And now put all the relevant data from the local_??? arrays LBCONV1A.770
! to the remote_??? arrays on remote_pe LBCONV1A.771
LBCONV1A.772
! Single level fields LBCONV1A.773
LBCONV1A.774
fp=copy_remote_seg_start LBCONV1A.775
LBCONV1A.776
CALL shmem_put(
remote_T1_SD(fp),local_T1_SD, LBCONV1A.777
& len,remote_pe) LBCONV1A.778
CALL shmem_put(
remote_T1_SD(fp),local_Q1_SD, LBCONV1A.779
& len,remote_pe) LBCONV1A.780
CALL shmem_put(
remote_RAIN(fp),local_RAIN, LBCONV1A.781
& len,remote_pe) LBCONV1A.782
CALL shmem_put(
remote_SNOW(fp),local_SNOW, LBCONV1A.783
& len,remote_pe) LBCONV1A.784
CALL shmem_put(
remote_CCLWP(fp),local_CCLWP, LBCONV1A.785
& len,remote_pe) LBCONV1A.786
CALL shmem_put(
remote_ICCBPxCCA(fp),local_ICCBPxCCA, LBCONV1A.787
& len,remote_pe) LBCONV1A.788
CALL shmem_put(
remote_ICCTPxCCA(fp),local_ICCTPxCCA, LBCONV1A.789
& len,remote_pe) LBCONV1A.790
CALL shmem_put(
remote_GBMCCWP(fp),local_GBMCCWP, LBCONV1A.791
& len,remote_pe) LBCONV1A.792
CALL shmem_put(
remote_LCCA(fp),local_LCCA, LBCONV1A.793
& len,remote_pe) LBCONV1A.794
CALL shmem_put(
remote_LCCLWP(fp),local_LCCLWP, LBCONV1A.795
& len,remote_pe) LBCONV1A.796
CALL shmem_put(
remote_CAPE(fp),local_CAPE, LBCONV1A.797
& len,remote_pe) LBCONV1A.798
CALL shmem_put(
remote_ICCB(fp),local_ICCB, LBCONV1A.799
& len,remote_pe) LBCONV1A.800
CALL shmem_put(
remote_ICCT(fp),local_ICCT, LBCONV1A.801
& len,remote_pe) LBCONV1A.802
CALL shmem_put(
remote_LCBASE(fp),local_LCBASE, LBCONV1A.803
& len,remote_pe) LBCONV1A.804
CALL shmem_put(
remote_LCTOP(fp),local_LCTOP, LBCONV1A.805
& len,remote_pe) LBCONV1A.806
LBCONV1A.807
! Multi level fields LBCONV1A.808
LBCONV1A.809
DO k=1,N_CCA_LEV LBCONV1A.810
LBCONV1A.811
fp=copy_remote_seg_start+ LBCONV1A.812
& copy_remote_P_FIELD*(k-1) LBCONV1A.813
LBCONV1A.814
CALL shmem_put(
remote_CCA(fp),local_CCA(1,k), LBCONV1A.815
& len,remote_pe) LBCONV1A.816
LBCONV1A.817
ENDDO LBCONV1A.818
LBCONV1A.819
DO k=1,Q_LEVELS LBCONV1A.820
LBCONV1A.821
fp=copy_remote_seg_start+ LBCONV1A.822
& copy_remote_P_FIELD*(k-1) LBCONV1A.823
LBCONV1A.824
CALL shmem_put(
remote_THETA(fp),local_THETA(1,k), LBCONV1A.825
& len,remote_pe) LBCONV1A.826
CALL shmem_put(
remote_Q(fp),local_Q(1,k), LBCONV1A.827
& len,remote_pe) LBCONV1A.828
CALL shmem_put(
remote_DTHBYDT(fp),local_DTHBYDT(1,k), LBCONV1A.829
& len,remote_pe) LBCONV1A.830
CALL shmem_put(
remote_DQBYDT(fp),local_DQBYDT(1,k), LBCONV1A.831
& len,remote_pe) LBCONV1A.832
CALL shmem_put(
remote_CCW(fp),local_CCW(1,k), LBCONV1A.833
& len,remote_pe) LBCONV1A.834
CALL shmem_put(
remote_GBMCCW(fp),local_GBMCCW(1,k), LBCONV1A.835
& len,remote_pe) LBCONV1A.836
ENDDO LBCONV1A.837
LBCONV1A.838
! Optional fields LBCONV1A.839
LBCONV1A.840
! Tracers LBCONV1A.841
LBCONV1A.842
IF (L_TRACER) THEN LBCONV1A.843
LBCONV1A.844
DO fld=1,NTRA LBCONV1A.845
LBCONV1A.846
DO k=1,TRLEV LBCONV1A.847
LBCONV1A.848
fp=copy_remote_seg_start+ LBCONV1A.849
& (copy_remote_P_FIELD*(k-1))+ LBCONV1A.850
& (copy_remote_P_FIELD*TRLEV*(fld-1)) LBCONV1A.851
LBCONV1A.852
CALL shmem_put(
remote_TRACER(fp), LBCONV1A.853
& local_TRACER(1,k,fld), LBCONV1A.854
& len,remote_pe) LBCONV1A.855
LBCONV1A.856
ENDDO LBCONV1A.857
ENDDO LBCONV1A.858
ENDIF LBCONV1A.859
LBCONV1A.860
! Convective momentum transfer fields LBCONV1A.861
LBCONV1A.862
IF (L_MOM) THEN LBCONV1A.863
LBCONV1A.864
DO k=1,Q_LEVELS LBCONV1A.865
LBCONV1A.866
fp=copy_remote_seg_start+ LBCONV1A.867
& copy_remote_P_FIELD*(k-1) LBCONV1A.868
LBCONV1A.869
CALL shmem_put(
remote_DUBYDT(fp),local_DUBYDT(1,k), LBCONV1A.870
& len,remote_pe) LBCONV1A.871
CALL shmem_put(
remote_DVBYDT(fp),local_DVBYDT(1,k), LBCONV1A.872
& len,remote_pe) LBCONV1A.873
LBCONV1A.874
ENDDO LBCONV1A.875
ENDIF LBCONV1A.876
LBCONV1A.877
! Diagnostic output LBCONV1A.878
LBCONV1A.879
DO k=1,Q_LEVELS LBCONV1A.880
LBCONV1A.881
fp=copy_remote_seg_start+ LBCONV1A.882
& copy_remote_P_FIELD*(k-1) LBCONV1A.883
LBCONV1A.884
IF (FLG_UP_FLUX) THEN LBCONV1A.885
CALL shmem_put(
remote_UP_FLUX(fp), LBCONV1A.886
& local_UP_FLUX(1,k), LBCONV1A.887
& len,remote_pe) LBCONV1A.888
ENDIF LBCONV1A.889
LBCONV1A.890
IF (FLG_DWN_FLUX) THEN LBCONV1A.891
CALL shmem_put(
remote_DWN_FLUX(fp), LBCONV1A.892
& local_DWN_FLUX(1,k), LBCONV1A.893
& len,remote_pe) LBCONV1A.894
ENDIF LBCONV1A.895
LBCONV1A.896
IF (FLG_ENTR_UP) THEN LBCONV1A.897
CALL shmem_put(
remote_ENTRAIN_UP(fp), LBCONV1A.898
& local_ENTRAIN_UP(1,k), LBCONV1A.899
& len,remote_pe) LBCONV1A.900
ENDIF LBCONV1A.901
LBCONV1A.902
IF (FLG_DETR_UP) THEN LBCONV1A.903
CALL shmem_put(
remote_DETRAIN_UP(fp), LBCONV1A.904
& local_DETRAIN_UP(1,k), LBCONV1A.905
& len,remote_pe) LBCONV1A.906
ENDIF LBCONV1A.907
LBCONV1A.908
IF (FLG_ENTR_DWN) THEN LBCONV1A.909
CALL shmem_put(
remote_ENTRAIN_DWN(fp), LBCONV1A.910
& local_ENTRAIN_DWN(1,k), LBCONV1A.911
& len,remote_pe) LBCONV1A.912
ENDIF LBCONV1A.913
LBCONV1A.914
IF (FLG_DETR_DWN) THEN LBCONV1A.915
CALL shmem_put(
remote_DETRAIN_DWN(fp), LBCONV1A.916
& local_DETRAIN_DWN(1,k), LBCONV1A.917
& len,remote_pe) LBCONV1A.918
ENDIF LBCONV1A.919
LBCONV1A.920
ENDDO LBCONV1A.921
LBCONV1A.922
LBCONV1A.923
ENDIF ! If this segment is on another PE LBCONV1A.924
LBCONV1A.925
ENDIF ! If there is some work to be done on this processor LBCONV1A.926
LBCONV1A.927
ENDDO ! loop over processors looking for work LBCONV1A.928
LBCONV1A.929
ENDDO ! loop looking for work LBCONV1A.930
LBCONV1A.931
! Wait for everyone to finish, so that I am sure all my segments have LBCONV1A.932
! been updated. LBCONV1A.933
LBCONV1A.934
CALL barrier(
) LBCONV1A.935
LBCONV1A.936
RETURN LBCONV1A.937
LBCONV1A.938
END LBCONV1A.939
*ENDIF LBCONV1A.940
*ENDIF LBCONV1A.941