*IF DEF,CONTROL INACTR1.2
C ******************************COPYRIGHT****************************** GTS2F400.12446
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.12447
C GTS2F400.12448
C Use, duplication or disclosure of this code is subject to the GTS2F400.12449
C restrictions as set forth in the contract. GTS2F400.12450
C GTS2F400.12451
C Meteorological Office GTS2F400.12452
C London Road GTS2F400.12453
C BRACKNELL GTS2F400.12454
C Berkshire UK GTS2F400.12455
C RG12 2SZ GTS2F400.12456
C GTS2F400.12457
C If no contract has been raised with this copy of the code, the use, GTS2F400.12458
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.12459
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.12460
C Modelling at the above address. GTS2F400.12461
C GTS2F400.12462
!+Add inactive records to STASH list, when space is required INACTR1.3
! INACTR1.4
! Subroutine Interface: INACTR1.5
INACTR1.6
SUBROUTINE INACTR( 1,11INACTR1.7
*CALL ARGPPX
INACTR1.8
& NRECS,ErrorStatus,CMESSAGE) GSS3F401.459
IMPLICIT NONE INACTR1.10
INACTR1.11
! Description: INACTR1.12
! INACTR1.13
! Method: INACTR1.14
! INACTR1.15
! Current code owner: S.J.Swarbrick INACTR1.16
! INACTR1.17
! History: INACTR1.18
! Version Date Comment INACTR1.19
! ======= ==== ======= INACTR1.20
! 3.5 Mar. 95 Original code. S.J.Swarbrick INACTR1.21
! 4.0 Oct. 95 S.J.Swarbrick GSS1F400.929
! 4.1 Apr. 96 Add ErrorStatus arguments & general GSS3F401.460
! improvements S.J.Swarbrick GSS3F401.461
! 4.5 Jul. 98 Clarify error message. S.D.Mullerworth GSM2F405.25
! INACTR1.22
! Code description: INACTR1.23
! FORTRAN 77 + common Fortran 90 extensions. INACTR1.24
! Written to UM programming standards version 7. INACTR1.25
! INACTR1.26
! System component covered: INACTR1.27
! System task: Sub-Models Project INACTR1.28
! INACTR1.29
! Global variables: INACTR1.30
*CALL CSUBMODL
INACTR1.32
*CALL CPPXREF
INACTR1.33
*CALL PPXLOOK
GSS3F401.462
*CALL TYPSIZE
GSS3F401.463
*CALL CSTASH
GRB0F401.15
*CALL STEXTEND
INACTR1.36
*CALL MODEL
INACTR1.37
*CALL STPARAM
INACTR1.38
INACTR1.40
! Subroutine arguments: INACTR1.41
! Scalar arguments with intent(in): INACTR1.43
INTEGER NRECS INACTR1.45
! Scalar arguments with intent(out): GSS3F401.464
CHARACTER*80 CMESSAGE GSS9F402.168
INACTR1.46
! ErrorStatus: INACTR1.47
INTEGER ErrorStatus INACTR1.48
INACTR1.49
! Local scalars INACTR1.50
LOGICAL LMASK INACTR1.52
LOGICAL LIMPLIED INACTR1.53
LOGICAL LDUM INACTR1.54
INTEGER I INACTR1.56
INTEGER ITEM INACTR1.57
INTEGER ISEC INACTR1.58
INTEGER Im_ident GSS1F400.930
INTEGER Im_index GSS1F400.931
INTEGER LBVC INACTR1.60
INACTR1.61
! Function and subroutine calls: INACTR1.62
INTEGER EXPPXI INACTR1.64
EXTERNAL EXPPXI,IMPLIED,TSTMSK,ADDIN INACTR1.65
INACTR1.66
!- End of Header ------------------------------------------------------ INACTR1.67
INACTR1.68
INACTR1.69
DO Im_ident=1,N_INTERNAL_MODEL_MAX GSS1F400.932
Im_index = INTERNAL_MODEL_INDEX(Im_ident) GSS1F400.933
IF (Im_index.GT.0) THEN GSS1F400.934
DO ISEC =0,PPXREF_SECTIONS GSS1F400.935
DO ITEM =1,PPXREF_ITEMS GSS1F400.936
INACTR1.73
IF ((INDX_S(2,Im_ident,ISEC,ITEM).EQ.0).AND. GSS1F400.937
& (PPXPTR( Im_index,ISEC,ITEM).NE.0)) THEN GSS1F400.938
INACTR1.76
! No requests for this diag; check whether it is an implied diag., INACTR1.77
! or one for which space is always required INACTR1.78
INACTR1.79
VMSK = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_version_mask, GSS1F400.939
*CALL ARGPPX
INACTR1.81
& ErrorStatus,CMESSAGE) INACTR1.82
ISPACE = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_space_code , GSS1F400.940
*CALL ARGPPX
INACTR1.84
& ErrorStatus,CMESSAGE) INACTR1.85
ILEV = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_lv_code , GSS1F400.941
*CALL ARGPPX
INACTR1.87
& ErrorStatus,CMESSAGE) INACTR1.88
IBOT = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_lb_code , GSS1F400.942
*CALL ARGPPX
INACTR1.90
& ErrorStatus,CMESSAGE) INACTR1.91
ITOP = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_lt_code , GSS1F400.943
*CALL ARGPPX
INACTR1.93
& ErrorStatus,CMESSAGE) INACTR1.94
IFLAG = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_lev_flag , GSS1F400.944
*CALL ARGPPX
INACTR1.96
& ErrorStatus,CMESSAGE) INACTR1.97
DO I=1,4 GSS3F401.466
IOPN(I) = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_opt_code+I-1, GSS3F401.467
*CALL ARGPPX
INACTR1.99
& ErrorStatus,CMESSAGE) INACTR1.100
END DO GSS3F401.468
LBVC = EXPPXI
(Im_ident ,ISEC ,ITEM ,ppx_lbvc_code , GSS1F400.946
*CALL ARGPPX
INACTR1.102
& ErrorStatus,CMESSAGE) INACTR1.103
INACTR1.104
! Check whether this diag is implied by any of INACTR1.105
! the other diags in LIST_S INACTR1.106
INACTR1.107
IF(ISPACE.EQ.6) THEN INACTR1.108
CALL IMPLIED
GSS3F401.469
& (Im_ident,ISEC,ITEM,LIMPLIED,ErrorStatus,CMESSAGE) GSS3F401.470
ELSE INACTR1.110
LIMPLIED=.FALSE. INACTR1.111
END IF INACTR1.112
INACTR1.113
IF((ISPACE.EQ.1).OR.LIMPLIED)THEN INACTR1.114
! Check availability of diag INACTR1.115
CALL TSTMSK
GSS3F401.471
& (Im_ident,ISEC,LMASK,LDUM,ErrorStatus,CMESSAGE) GSS3F401.472
IF(LMASK.AND.(NRECS.LT.NRECDP)) THEN INACTR1.117
! Diag to be included INACTR1.118
NRECS=NRECS+1 INACTR1.119
! Add diag to LIST_S INACTR1.120
CALL ADDIN
GSS3F401.473
& (NRECS,ITEM,ISEC,Im_ident,LBVC,ErrorStatus,CMESSAGE) GSS3F401.474
ELSE IF (NRECS.GE.NRECDP) THEN INACTR1.122
WRITE(6,*)'ERROR, INACTR: TOO MANY S_LIST ENTRIES ' GSS1F400.950
& ,'CANNOT ADD ENTRIES FOR ARRAYS REQUIRED BY THE MODEL' GSS1F400.951
END IF INACTR1.126
END IF INACTR1.127
INACTR1.128
END IF ! INDX_S INACTR1.129
INACTR1.130
END DO ! Items GSS1F400.952
END DO ! Sections GSS1F400.953
END IF ! Im_index>0 GSS1F400.954
END DO ! Models INACTR1.133
INACTR1.134
RETURN INACTR1.164
END INACTR1.165
INACTR1.166
INACTR1.167
!+Find whether ST_list entry (Im_ident,ISEC,ITEM) is an implied diag GSS1F400.955
! Subroutine Interface: INACTR1.169
INACTR1.170
SUBROUTINE IMPLIED 1,5GSS3F401.475
&(Im_ident,ISEC,ITEM,LIMPLIED,ErrorStatus,CMESSAGE) GSS3F401.476
IMPLICIT NONE INACTR1.172
! Description: INACTR1.173
! INACTR1.174
! Method: INACTR1.175
! INACTR1.176
! Current code owner: S.J.Swarbrick INACTR1.177
! INACTR1.178
! History: INACTR1.179
! Version Date Comment INACTR1.180
! ======= ==== ======= INACTR1.181
! 3.5 Mar. 95 Original code. S.J.Swarbrick INACTR1.182
! 4.5 09/12/97 Read the Implied data from PE 0 and GBCVF405.110
! distribute it. GBCVF405.111
! Author: Bob Carruthers GBCVF405.112
! INACTR1.183
! Code description: INACTR1.184
! FORTRAN 77 + common Fortran 90 extensions. INACTR1.185
! Written to UM programming standards version 7. INACTR1.186
! INACTR1.187
! System component covered: INACTR1.188
! System task: Sub-Models Project INACTR1.189
! INACTR1.190
! Global variables: INACTR1.191
*CALL CSUBMODL
INACTR1.193
*CALL VERSION
INACTR1.194
*CALL CSTASH
GRB0F401.16
*CALL STEXTEND
INACTR1.196
*CALL LENFIL
INACTR1.197
*CALL CHSUNITS
GSS1F400.957
*CALL CLFHIST
GSS1F400.958
*IF DEF,MPP,AND,DEF,T3E GBCVF405.113
*CALL PARVARS
GBCVF405.114
GBCVF405.115
integer info, msg GBCVF405.116
*ENDIF GBCVF405.117
INACTR1.198
! Subroutine arguments: INACTR1.199
! Scalar arguments with intent(in): INACTR1.201
INTEGER Im_ident GSS1F400.959
INTEGER ISEC INACTR1.204
INTEGER ITEM INACTR1.205
INTEGER ICODE,err ! return code GNF0F401.1
INACTR1.206
! Scalar argument with intent(out): INACTR1.207
LOGICAL LIMPLIED ! Set to T if diag is implied INACTR1.209
CHARACTER*80 CMESSAGE GSS9F402.169
INACTR1.210
! Local scalars: INACTR1.211
LOGICAL LSET ! Set to T when STASH_SET dir name has been obtained INACTR1.213
INTEGER I INACTR1.214
INTEGER J INACTR1.215
INTEGER IHOLD INACTR1.216
INTEGER N_IMPLICATORS INACTR1.217
CHARACTER*55 DIR GSS1F400.960
INACTR1.218
! Local arrays: INACTR1.219
INTEGER IMPLICS(100) INACTR1.221
GSS3F401.478
! ErrorStatus GSS3F401.479
INTEGER ErrorStatus GSS3F401.480
GSS3F401.481
GSS1F400.961
! External subroutine calls GSS1F400.962
INTEGER GETENV GSS1F400.963
INACTR1.222
! Function & Subroutine calls: GNF0F401.2
External GET_FILE,FORT_GET_ENV GNF0F401.3
!- End of Header ---------------------------------------------------- INACTR1.223
INACTR1.224
DATA LSET /.FALSE./ INACTR1.225
*IF DEF,MPP,AND,DEF,T3E GBCVF405.118
save lset, file, ihold, dir GBCVF405.119
*ELSE GBCVF405.120
SAVE FILE,IHOLD,LSET INACTR1.226
*ENDIF GBCVF405.121
INACTR1.227
! Construction of file name for "STASH sets" INACTR1.228
! (which specify implied diags) INACTR1.229
! On first call: assign directory name STASH_SET to FILE; add '/X' INACTR1.230
*IF DEF,MPP,AND,DEF,T3E GBCVF405.122
GBCVF405.123
if(.not.lset) then GBCVF405.124
dir = ' ' GBCVF405.125
stash_set = ' ' GBCVF405.126
call fort_get_env
('STASETS_DIR', 11, dir, 55, err) GBCVF405.127
*ELSE GBCVF405.128
INACTR1.231
DIR =' ' GSS1F400.964
STASH_SET =' ' GSS1F400.965
C Correction for reading in the ~ctldata/stasets directory (N Farnon) GNF0F401.4
CALL FORT_GET_ENV
('STASETS_DIR',11,DIR,55,err) GNF0F401.5
*ENDIF GBCVF405.129
IF (err .NE. 0) THEN GNF0F401.6
WRITE(6,*) 'Warning: Environment variable STASETS_DIR has GNF0F401.7
& not been set. Error code = ',err GNF0F401.8
*IF DEF,MPP,AND,DEF,T3E GBCVF405.130
call abort
() GBCVF405.131
*ENDIF GBCVF405.132
ENDIF GNF0F401.9
*IF DEF,MPP,AND,DEF,T3E GBCVF405.133
stash_set=dir GBCVF405.134
*ELSE GBCVF405.135
STASH_SET=DIR GSS1F400.967
INACTR1.233
IF(.NOT.LSET) THEN INACTR1.234
*ENDIF GBCVF405.136
FILE=STASH_SET GSS1F400.968
LSET=.TRUE. INACTR1.236
DO J=1,55 INACTR1.237
IF (FILE(J:J).EQ.' ') THEN INACTR1.238
I = J INACTR1.239
GOTO 102 INACTR1.240
END IF INACTR1.241
END DO INACTR1.242
102 FILE(I:I+1)='/X' INACTR1.243
I=I+2 INACTR1.244
IHOLD=I INACTR1.245
END IF INACTR1.246
INACTR1.247
! Append rest of file name to FILE INACTR1.248
WRITE(FILE(IHOLD:IHOLD+9),501) Im_ident,ISEC,ITEM GSS1F400.969
501 FORMAT(I2.2,2I3.3) INACTR1.250
INACTR1.251
! Open STASH sets file; read diags listed in file into IMPLICS INACTR1.252
! These diags are implied by the diag Im_ident, ISEC, ITEM GSS1F400.970
C Error message added (N.Farnon) GNF0F401.10
*IF DEF,MPP,AND,DEF,T3E GBCVF405.137
if(mype.eq.0) then GBCVF405.138
*ENDIF GBCVF405.139
OPEN (3,FILE=FILE,IOSTAT=ICODE) GNF0F401.11
IF (ICODE.NE.0) THEN GNF0F401.12
WRITE(6,*) 'Can not open stash_sets file, ICODE=',ICODE GNF0F401.13
call abort
() GBCVF405.140
ELSE GNF0F401.14
WRITE(6,*) 'OPEN: 3: ',FILE,': FILE EXISTS' GNF0F401.15
END IF GNF0F401.16
READ (3,600) N_IMPLICATORS INACTR1.255
600 FORMAT(I4) INACTR1.256
*IF DEF,MPP,AND,DEF,T3E GBCVF405.141
endif ! read on PE 0 GBCVF405.142
c GBCVF405.143
c--send the number of implicators to each PE GBCVF405.144
msg=7067 GBCVF405.145
call gc_ibcast(
msg, 1, 0, nproc, info, n_implicators) GBCVF405.146
*ENDIF GBCVF405.147
c GBCVF405.148
if(n_implicators.gt.100) then GBCVF405.149
write(6,*)'IMPLIED: Too Many Implicators', GBCVF405.150
2 ' - ',N_IMPLICATORS,' Requested, but there is Space', GBCVF405.151
3 ' for only 100' GBCVF405.152
call abort
() GBCVF405.153
endif GBCVF405.154
c GBCVF405.155
*IF DEF,MPP,AND,DEF,T3E GBCVF405.156
if(mype.eq.0) then GBCVF405.157
*ENDIF GBCVF405.158
READ (3,610) (IMPLICS(I),I=1,N_IMPLICATORS) INACTR1.257
610 FORMAT(10I4) INACTR1.258
*IF DEF,MPP,AND,DEF,T3E GBCVF405.159
endif ! read on PE 0 GBCVF405.160
c GBCVF405.161
msg=7068 GBCVF405.162
call gc_ibcast(
msg, n_implicators, 0, nproc, info, GBCVF405.163
2 implics) GBCVF405.164
*ENDIF GBCVF405.165
INACTR1.259
!Find out whether any of the diags listed in FILE are present in LIST_S. INACTR1.260
! (Any diag in the STASH list has a non-zero entry in SINDX). If one INACTR1.261
! or more of them are present, set LIMPLIED=T - indicating that INACTR1.262
! diag Im_ident,ISEC,ITEM is implied. GSS1F400.971
INACTR1.264
DO I=1,N_IMPLICATORS INACTR1.265
IF(INDX_S(2,Im_ident,ISEC,IMPLICS(I)).NE.0) THEN GSS1F400.972
LIMPLIED=.TRUE. INACTR1.267
GO TO 9999 INACTR1.268
END IF INACTR1.269
END DO INACTR1.270
INACTR1.271
LIMPLIED=.FALSE. INACTR1.272
CLOSE(UNIT=3) GSS1F400.973
INACTR1.273
9999 RETURN INACTR1.274
END INACTR1.275
INACTR1.276
INACTR1.277
!+Add diagnostic to the STASH list (LIST_S) INACTR1.278
! Subroutine Interface: INACTR1.279
INACTR1.280
SUBROUTINE ADDIN 1,3GSS3F401.482
&(NRECS,ITEM,ISEC,Im_ident,LBVC,ErrorStatus,CMESSAGE) GSS3F401.483
IMPLICIT NONE INACTR1.282
! Description: INACTR1.283
! INACTR1.284
! Method: INACTR1.285
! INACTR1.286
! Current code owner: S.J.Swarbrick INACTR1.287
! INACTR1.288
! History: INACTR1.289
! Version Date Comment INACTR1.290
! ======= ==== ======= INACTR1.291
! 3.5 Mar. 95 Original code. S.J.Swarbrick INACTR1.292
! 4.1 May. 96 Various improvements. S.J.Swarbrick GSS3F401.484
! INACTR1.293
! Code description: INACTR1.294
! FORTRAN 77 + common Fortran 90 extensions. INACTR1.295
! Written to UM programming standards version 7. INACTR1.296
! INACTR1.297
! System component covered: INACTR1.298
! System task: Sub-Models Project INACTR1.299
! INACTR1.300
! Global variables: INACTR1.301
*CALL CSUBMODL
INACTR1.303
*CALL VERSION
INACTR1.304
*CALL CSTASH
GRB0F401.17
*CALL STEXTEND
INACTR1.306
*CALL STPARAM
INACTR1.307
INACTR1.308
! Subroutine arguments: INACTR1.309
! Scalar arguments with intent(in): INACTR1.311
INTEGER NRECS INACTR1.313
INTEGER ITEM INACTR1.314
INTEGER ISEC INACTR1.315
INTEGER Im_ident GSS1F400.975
INTEGER LBVC INACTR1.317
INACTR1.318
! Scalar arguments with intent(out): GSS3F401.485
CHARACTER*80 CMESSAGE GSS9F402.170
GSS3F401.487
! Local scalars: INACTR1.319
LOGICAL MODEL_LEV GSS3F401.488
INTEGER IBOT1 INACTR1.321
INTEGER ITOP1 INACTR1.322
INACTR1.323
! ErrorStatus GSS3F401.489
INTEGER ErrorStatus GSS3F401.490
GSS3F401.491
! Function and subroutine calls: INACTR1.324
LOGICAL DISCT_LEV GSS3F401.492
EXTERNAL LEVCOD INACTR1.326
INACTR1.327
!- End of Header ---------------------------------------------------- INACTR1.328
INACTR1.329
INACTR1.330
LIST_S(st_item_code ,NRECS)=ITEM INACTR1.331
LIST_S(st_sect_no_code,NRECS)=ISEC INACTR1.332
LIST_S(st_model_code ,NRECS)=Im_ident GSS1F400.976
LIST_S(st_proc_no_code,NRECS)=0 INACTR1.334
INACTR1.335
IF(IFLAG.EQ.1)THEN GSS1F400.977
! Attempt to do vertical compression - not allowed GSS1F400.978
WRITE(6,*) GSS1F400.979
& 'INACTR: SPACECODE ',ISPACE,' INDICATES IMPLIED DIAGNOSTIC.' GSM2F405.26
WRITE(6,*) GSM2F405.27
& 'NOT ALLOWED WITH LEVEL COMPRESSION FLAG 1 - CHECK STASHMASTER' GSM2F405.28
WRITE(6,*) GSS1F400.981
& 'MODEL ',Im_ident,' SECTION ',ISEC,' ITEM ',ITEM GSS1F400.982
ELSE INACTR1.343
MODEL_LEV=DISCT_LEV
(ILEV,ErrorStatus,CMESSAGE) GSS3F401.493
IF (MODEL_LEV) THEN GSS3F401.494
! Model levels GSS3F401.495
! Set bottom level GSS3F401.496
CALL LEVCOD
(IBOT,IBOT1,ErrorStatus,CMESSAGE) GSS3F401.497
! Set top level GSS3F401.498
CALL LEVCOD
(ITOP,ITOP1,ErrorStatus,CMESSAGE) GSS3F401.499
LIST_S(st_input_bottom,NRECS)=IBOT1 INACTR1.351
LIST_S(st_input_top ,NRECS)=ITOP1 INACTR1.352
ELSE IF(ILEV.EQ.5) THEN GSS3F401.500
LIST_S(st_input_bottom,NRECS)=100 INACTR1.356
LIST_S(st_input_top ,NRECS)=LBVC INACTR1.357
ELSE GSS3F401.501
WRITE(6,*) GSS1F400.983
& 'INACTR: LEVEL TYPE ERROR ON IMPLIED DIAGNOSTIC ', GSS1F400.984
& ' - ONLY MODEL LEVELS OR SINGLE LEVEL ALLOWED ' GSS1F400.985
WRITE(6,*) 'MODEL ',Im_ident, GSS1F400.986
& ' SECT ',ISEC,' ITEM ',ITEM,' LEV CODE ',ILEV GSS1F400.987
END IF INACTR1.366
END IF INACTR1.367
INACTR1.368
LIST_S(st_freq_code ,NRECS)=1 INACTR1.369
LIST_S(st_start_time_code,NRECS)=0 INACTR1.370
LIST_S(st_end_time_code ,NRECS)=0 INACTR1.371
LIST_S(st_period_code ,NRECS)=0 INACTR1.372
LIST_S(st_gridpoint_code ,NRECS)=1 INACTR1.373
LIST_S(st_weight_code ,NRECS)=0 INACTR1.374
LIST_S(st_north_code ,NRECS)=0 INACTR1.375
LIST_S(st_south_code ,NRECS)=0 INACTR1.376
LIST_S(st_west_code ,NRECS)=0 INACTR1.377
LIST_S(st_east_code ,NRECS)=0 INACTR1.378
LIST_S(st_input_code ,NRECS)=1 INACTR1.379
LIST_S(st_input_length ,NRECS)=0 INACTR1.380
LIST_S(st_output_code ,NRECS)=0 INACTR1.381
LIST_S(st_output_length ,NRECS)=0 INACTR1.382
LIST_S(st_output_addr ,NRECS)=0 INACTR1.383
LIST_S(st_output_bottom ,NRECS)=0 INACTR1.384
LIST_S(st_output_top ,NRECS)=0 INACTR1.385
LIST_S(st_lookup_ptr ,NRECS)=-1 INACTR1.386
LIST_S(st_series_ptr ,NRECS)=0 INACTR1.387
LIST_S(st_macrotag ,NRECS)=0 INACTR1.388
LIST_S(st_pseudo_in ,NRECS)=0 INACTR1.389
LIST_S(st_pseudo_out ,NRECS)=0 INACTR1.390
LIST_S(NELEMP+1 ,NRECS)=NRECS INACTR1.391
INACTR1.392
RETURN INACTR1.393
END INACTR1.394
*ENDIF INACTR1.395