*IF DEF,CONTROL,OR,DEF,RECON ST_PROC1.2
C ******************************COPYRIGHT****************************** GTS2F400.12871
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.12872
C GTS2F400.12873
C Use, duplication or disclosure of this code is subject to the GTS2F400.12874
C restrictions as set forth in the contract. GTS2F400.12875
C GTS2F400.12876
C Meteorological Office GTS2F400.12877
C London Road GTS2F400.12878
C BRACKNELL GTS2F400.12879
C Berkshire UK GTS2F400.12880
C RG12 2SZ GTS2F400.12881
C GTS2F400.12882
C If no contract has been raised with this copy of the code, the use, GTS2F400.12883
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.12884
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.12885
C Modelling at the above address. GTS2F400.12886
C GTS2F400.12887
!+Control routine for processing of basis library STASH file ST_PROC1.3
! ST_PROC1.4
! Subroutine Interface: ST_PROC1.5
ST_PROC1.6
SUBROUTINE STASH_PROC(NFTPPXREF,NFTSTMSTU ,L_RECONF, 2,20ST_PROC1.7
*IF DEF,RECON ST_PROC1.8
*CALL ARGPPX
ST_PROC1.9
*ENDIF ST_PROC1.10
*IF -DEF,RECON GSS1F400.654
& ppxRecs, GSS1F400.655
*ENDIF GSS1F400.656
& ErrorStatus,CMESSAGE) ST_PROC1.11
IMPLICIT NONE ST_PROC1.12
ST_PROC1.13
! Description: ST_PROC1.14
! ST_PROC1.15
! Method: ST_PROC1.16
! ST_PROC1.17
! Current code owner: S.J.Swarbrick ST_PROC1.18
! ST_PROC1.19
! History: ST_PROC1.20
! Version Date Comment ST_PROC1.21
! ======= ==== ======= ST_PROC1.22
! 3.5 Mar. 95 Original code. S.J.Swarbrick ST_PROC1.23
! 4.1 Apr. 96 Generalise & incorporate GSS1F401.8
! wave model S.J.Swarbrick GSS1F401.9
! 4.2 28/11/96 MPP code: Initialised new global_LPRIM and GPB1F402.619
! global_LDUMP variables. P.Burton GPB1F402.620
! vn4.4 9/4/97 Null string in argument list in call to GETPPX UIE2F404.28
! padded out to 13 characters (defined as UIE2F404.29
! CHARACTER*13 in GETPPX) to allow NAG f90 compiled UIE2F404.30
! code to run. IEdmond UIE2F404.31
! ST_PROC1.24
! Code description: ST_PROC1.25
! FORTRAN 77 + common Fortran 90 extensions. ST_PROC1.26
! Written to UM programming standards version 7. ST_PROC1.27
! ST_PROC1.28
! System component covered: ST_PROC1.29
! System task: Sub-Models Project ST_PROC1.30
! ST_PROC1.31
! Global variables: ST_PROC1.32
ST_PROC1.33
*CALL LENFIL
ST_PROC1.34
*CALL CSUBMODL
ST_PROC1.35
*CALL CPPXREF
GSS1F401.10
*CALL PPXLOOK
GSS1F401.11
*CALL TYPSIZE
GSS1F401.12
*CALL MODEL
ST_PROC1.37
*CALL CSTASH
GRB0F401.14
*CALL STEXTEND
ST_PROC1.39
*IF DEF,RECON ST_PROC1.44
*CALL NRECON
ST_PROC1.45
*ENDIF ST_PROC1.46
*CALL C_MDI
GSS2F401.381
ST_PROC1.47
! Subroutine arguments ST_PROC1.48
ST_PROC1.49
! Scalar arguments with intent(in): ST_PROC1.50
INTEGER NFTPPXREF ! Unit no. for PPXREF file ST_PROC1.51
INTEGER NFTSTMSTU ! Unit no. for user STASH master ST_PROC1.52
LOGICAL L_RECONF ! Not used (but may be some day) GSS2F401.382
ST_PROC1.55
! Array arguments with intent(out): ST_PROC1.56
CHARACTER*(80) CMESSAGE ! Error return message ST_PROC1.57
ST_PROC1.58
! Error status: ST_PROC1.59
INTEGER ErrorStatus ! +ve = fatal error GSS1F400.657
ST_PROC1.61
! Local scalars ST_PROC1.62
INTEGER I,J,L,II GSS2F401.383
INTEGER RI ! Row Index GSS1F400.659
INTEGER Model GSS1F400.660
INTEGER Section GSS1F400.661
INTEGER Item GSS1F400.662
INTEGER RowNumber ! Row no. counter for PPXI, PPXC arrays GSS2F401.384
INTEGER NLEVELS ST_PROC1.67
INTEGER NRECS ST_PROC1.68
INTEGER NTIMES ST_PROC1.70
INTEGER NPROFDP6 ST_PROC1.71
PARAMETER(NPROFDP6=NPROFDP*6) ST_PROC1.72
ST_PROC1.73
! Function and subroutine calls: ST_PROC1.77
EXTERNAL GETPPX,ADDRES,SETMODL ST_PROC1.78
*IF -DEF,RECON ST_PROC1.79
&,PRELIM ,ORDER ,SINDX ,DUPLIC,INACTR,TIMSER, GSS1F400.663
& POINTR ,OUTPTL ,INPUTL,WSTLST,RDBASIS ST_PROC1.81
*ENDIF ST_PROC1.82
ST_PROC1.83
!- End of Header --------------------------------------------------- ST_PROC1.84
ST_PROC1.85
!Initialisation GSS1F400.664
NPSLISTS =0 ! Counter for no. of pseudo levels lists GSS1F400.665
NSERIES =0 ! Time series block counter GSS1F400.666
NSERREC_S =0 ! Total no. of time series records GSS1F400.667
NSERBLK_S =0 ! Total no. of time series blocks GSS1F400.668
ErrorStatus =0 GSS1F400.669
GSS1F400.670
DO I=1,NPROFDP GSS1F400.671
NRECS_TS(I)=0 GSS1F400.672
NPOS_TS(I)=0 GSS1F400.673
END DO GSS1F400.674
ST_PROC1.92
! Initialisation of data length arrays GSS1F401.13
DO I=1,N_SUBMODEL_PARTITION_MAX GSS1F401.14
LPRIM(I)=0 ! LENGTH OF PRIMARY DATA GSS1F401.15
LDUMP(I)=0 ! LENGTH OF DUMP EXTENSION (DIAGNOSTIC) GSS1F401.16
*IF DEF,MPP GPB1F402.621
global_LPRIM(I)=0 ! LENGTH OF global PRIMARY DATA GPB1F402.622
global_LDUMP(I)=0 ! LENGTH OF global DUMP EXTENSION GPB1F402.623
*ENDIF GPB1F402.624
LSECD(I)=0 ! LENGTH OF SECONDARY ATMOS GSS1F401.17
LEXTRA(I)=0 ! LENGTH OF SPACE THAT IS ADDRESSED IN MODEL GSS1F401.18
LWORK(I)=0 ! LENGTH OF WORK GSS1F401.19
NHeadSub(I)=0! No. of pp headers for each submodel GSS1F401.20
END DO GSS1F401.21
DO I=1,N_INTERNAL_MODEL_MAX GSS1F401.22
NHEAD (I)=0 ! NUMBER OF PP HEADERS for each internal model GSS1F401.23
LPrimIM(I)=0 ! Primary data length for each internal model GSS1F401.24
LDumpIM(I)=0 ! Diagnostic do. GSS1F401.25
*IF DEF,MPP GPB1F402.625
global_LPrimIM(I)=0 ! GLOBAL Primary data length for each GPB1F402.626
! ! internal model GPB1F402.627
global_LDumpIM(I)=0 ! GLOBAL Diagnostic do. GPB1F402.628
*ENDIF GPB1F402.629
LSecdIM(I)=0 ! Secondary do. GSS1F401.26
END DO GSS1F401.27
LPRIM_O2=0 ! LENGTH OF PRIMARY DATA OCEAN, SECOND TIME LEVEL GSS1F401.28
ST_PROC1.100
DO I=OUTFILE_S,OUTFILE_E GSS1F401.29
PPlen2LkUp(I)=4096 GSS1F401.30
FTOutUnit (I)=' ' GSS1F401.31
END DO GSS1F401.32
GSS1F401.33
ST_PROC1.108
DO I=1,NPROFDP6 GSS1F401.34
LLISTTY(I)=' ' GSS1F401.35
END DO GSS1F401.36
GSS1F401.37
ST_PROC1.123
DO J=1,NLEVP_S ST_PROC1.124
DO I=1,NLEVLSTSP ST_PROC1.125
RLEVLST_S(J,I)=RMDI GSS2F401.385
LEVLST_S(J,I)=IMDI GSS2F401.386
END DO ST_PROC1.128
END DO ST_PROC1.129
ST_PROC1.130
DO L=1,N_INTERNAL_MODEL_MAX ST_PROC1.131
DO J=0,NSECTP ST_PROC1.132
DO I=1,NITEMP ST_PROC1.133
IN_S(1,L,J,I)=0 ST_PROC1.134
IN_S(2,L,J,I)=0 ST_PROC1.135
INDX_S(1,L,J,I)=0 ST_PROC1.136
INDX_S(2,L,J,I)=0 ST_PROC1.137
END DO ST_PROC1.138
END DO ST_PROC1.139
END DO ST_PROC1.140
ST_PROC1.141
DO J=1,NELEMP+1 ST_PROC1.142
DO I=1,NRECDP ST_PROC1.143
LIST_S(J,I)=0 ST_PROC1.144
END DO ST_PROC1.145
END DO ST_PROC1.146
ST_PROC1.147
DO J=1, NTIMEP ST_PROC1.148
DO I=1,2*NPROFTP+2 ST_PROC1.149
ITIM_S(J,I)=-1 ST_PROC1.150
END DO ST_PROC1.151
END DO ST_PROC1.152
ST_PROC1.153
DO J=1,N_INTERNAL_MODEL_MAX ST_PROC1.154
DO I=1,NITEMP ST_PROC1.155
PPIND_S(J,I)=0 ST_PROC1.156
END DO ST_PROC1.157
END DO ST_PROC1.158
ST_PROC1.159
DO I=1,NPROFDP ST_PROC1.160
NRECS_TS(I)=0 ST_PROC1.161
NPOS_TS(I)=0 ST_PROC1.162
END DO ST_PROC1.163
ST_PROC1.164
DO I=1,NPSLISTP ST_PROC1.165
LENPLST(I)=0 ST_PROC1.166
END DO ST_PROC1.167
ST_PROC1.168
DO I=OUTFILE_S,OUTFILE_E ST_PROC1.169
NHEAD_FILE(I)=0 ST_PROC1.170
END DO ST_PROC1.171
ST_PROC1.172
DO I=1,N_INTERNAL_MODEL_MAX ST_PROC1.173
DO J=0,NSECTP ST_PROC1.174
H_VERS(I,J)=0 ST_PROC1.175
END DO ST_PROC1.176
END DO ST_PROC1.177
GSS2F401.387
DO I=1,MAX_AOBS GSS2F401.388
AOBINC(I)=0 GSS2F401.389
AOBGRP(I)=0 GSS2F401.390
END DO GSS2F401.391
GSS2F401.392
*IF -DEF,RECON GSS1F400.676
! Read stash basis file from job library GSS1F400.677
CALL RDBASIS
(4,CMESSAGE,ErrorStatus) GSS2F401.393
! Adjust stash time series records (if any) GSS1F400.679
IF (NSERIES.GT.0) THEN GSS1F400.680
CALL TIMSER
(CMESSAGE,ErrorStatus) GSS1F400.681
END IF GSS1F400.682
IF (ErrorStatus .NE. 0) GO TO 9999 GSS1F400.683
*ENDIF GSS1F400.684
ST_PROC1.178
! Read STASHmaster files into look-up arrays PPXI, PPXC GSS2F401.394
ErrorStatus = 0 GSS2F401.395
RowNumber = 0 GSS2F401.396
! Initialise arrays GSS2F401.397
*IF DEF,RECON GSS2F401.398
DO I = 1,NDIAGP GSS2F401.399
*ELSE GSS2F401.400
DO I = 1,ppxRecs GSS2F401.401
*ENDIF GSS2F401.402
DO J = 1,PPXREF_CODELEN GSS2F401.403
PPXI(I,J) = 0 GSS2F401.404
END DO GSS2F401.405
DO J = 1,PPXREF_CHARLEN GSS2F401.406
PPXC(I,J) = ' ' GSS2F401.407
END DO GSS2F401.408
END DO GSS2F401.409
DO I = 1,NDIAGP GSS2F401.410
OriginFlag(I) =' ' GSS2F401.411
RowIndex (I) = 0 GSS2F401.412
END DO GSS2F401.413
*IF DEF,RECON GSS2F401.414
DO II = 1,N_INTERNAL_MODEL_MAX GSS2F401.415
*ELSE GSS2F401.416
DO II = 1,N_INTERNAL_MODEL GSS2F401.417
*ENDIF GSS2F401.418
DO I = 0,PPXREF_SECTIONS GSS2F401.419
DO J = 1,PPXREF_ITEMS GSS2F401.420
PPXPTR(II,I,J) = 0 GSS2F401.421
END DO GSS2F401.422
END DO GSS2F401.423
END DO GSS2F401.424
ST_PROC1.181
IF (INTERNAL_MODEL_INDEX(A_IM).GT.0) THEN GSS2F401.425
CALL GETPPX
(NFTPPXREF,NFTSTMSTU,'STASHmaster_A',RowNumber, GSS2F401.426
*CALL ARGPPX
GSS2F401.427
& ErrorStatus,CMESSAGE) GSS2F401.428
END IF GSS2F401.429
IF (INTERNAL_MODEL_INDEX(O_IM).GT.0) THEN GSS2F401.430
CALL GETPPX
(NFTPPXREF,NFTSTMSTU,'STASHmaster_O',RowNumber, GSS2F401.431
*CALL ARGPPX
GSS2F401.432
& ErrorStatus,CMESSAGE) GSS2F401.433
END IF GSS2F401.434
IF (INTERNAL_MODEL_INDEX(S_IM).GT.0) THEN GSS2F401.435
CALL GETPPX
(NFTPPXREF,NFTSTMSTU,'STASHmaster_S',RowNumber, GSS2F401.436
*CALL ARGPPX
GSS2F401.437
& ErrorStatus,CMESSAGE) GSS2F401.438
END IF GSS2F401.439
IF (INTERNAL_MODEL_INDEX(W_IM).GT.0) THEN GSS2F401.440
CALL GETPPX
(NFTPPXREF,NFTSTMSTU,'STASHmaster_W',RowNumber, GSS2F401.441
*CALL ARGPPX
GSS2F401.442
& ErrorStatus,CMESSAGE) GSS2F401.443
END IF GSS2F401.444
!Read user STASHmaster files (which may be empty) GSS2F401.445
CALL GETPPX
(0,NFTSTMSTU,' ',RowNumber, UIE2F404.32
*CALL ARGPPX
ST_PROC1.187
& ErrorStatus,CMESSAGE) ST_PROC1.188
ST_PROC1.189
IF (ErrorStatus .NE. 0) GO TO 9999 ST_PROC1.190
ST_PROC1.191
! Define submodel and section/version configuration ST_PROC1.192
CALL SETMODL
(ErrorStatus,CMESSAGE) GSS2F401.447
IF (ErrorStatus .NE. 0) GO TO 9999 GSS2F401.448
ST_PROC1.197
NRECS=0 ST_PROC1.198
NTIMES=0 ST_PROC1.199
NLEVELS=0 ST_PROC1.200
DO I=1,NPSLISTP ST_PROC1.202
LENPLST(I)=0 ST_PROC1.203
END DO ST_PROC1.204
ST_PROC1.205
*IF -DEF,RECON ST_PROC1.206
ST_PROC1.208
! Construct preliminary STASH list GSS2F401.449
CALL PRELIM
(NRECS, ST_PROC1.212
*CALL ARGPPX
ST_PROC1.213
& NTIMES,NLEVELS,ErrorStatus,CMESSAGE) GSS1F400.685
IF (ErrorStatus.GT.0) GO TO 9999 GSS1F400.686
ST_PROC1.215
! REORDER STASH LIST & SET UP INDEX GSS2F401.450
ST_PROC1.222
CALL ORDER
(NRECS) ST_PROC1.223
CALL SINDX
(NRECS) ST_PROC1.224
ST_PROC1.225
! DELETE DUPLIC ENTRIES, CONCATONATE OVERLAP LEVELS ETC GSS2F401.451
! DELETE DUPLICATE STASH_TIMES, REORDER GSS2F401.452
ST_PROC1.228
CALL DUPLIC
(NRECS,NTIMES,NLEVELS) ST_PROC1.229
ST_PROC1.230
! ADD INACTIVE AND IMPLIED RECORDS GSS2F401.453
ST_PROC1.232
CALL INACTR
( ST_PROC1.233
*CALL ARGPPX
ST_PROC1.234
& NRECS,ErrorStatus,CMESSAGE) GSS2F401.454
IF (ErrorStatus .NE. 0) GO TO 9999 GSS2F401.455
ST_PROC1.236
! REORDER STASH LIST & SET UP INDEX GSS2F401.456
ST_PROC1.238
CALL ORDER
(NRECS) ST_PROC1.239
CALL SINDX
(NRECS) ST_PROC1.240
ST_PROC1.241
! CHANGE POINTER SYSTEM, ADD ADDRESSES, LENGTHS AND INPUT LEVELS GSS2F401.457
CALL POINTR
(NRECS) ST_PROC1.245
ST_PROC1.246
! OUTPUT LENGTH ST_PROC1.247
CALL OUTPTL
( ST_PROC1.248
*CALL ARGPPX
ST_PROC1.249
& NRECS,ErrorStatus,CMESSAGE) ST_PROC1.250
IF (ErrorStatus .NE. 0) GO TO 9999 GSS2F401.458
ST_PROC1.251
! INPUT LENGTH AND INPUT LEVELS, SET STLIST(NELEMP+1,I) TO MODEL_ST ST_PROC1.252
! ALSO INPUT PSEUDO LEVELS ST_PROC1.253
CALL INPUTL
(NRECS, ST_PROC1.254
*CALL ARGPPX
ST_PROC1.255
& NLEVELS,ErrorStatus,CMESSAGE) GSS2F401.459
IF (ErrorStatus .NE. 0) GO TO 9999 GSS2F401.460
ST_PROC1.257
*ENDIF ST_PROC1.259
ST_PROC1.260
! ADDRESSING ST_PROC1.261
CALL ADDRES
( GSS1F401.38
*CALL ARGPPX
ST_PROC1.263
& NRECS,ErrorStatus,CMESSAGE) GSS2F401.461
IF (ErrorStatus .NE. 0) GO TO 9999 GSS2F401.462
ST_PROC1.265
! SET RETURN VALUES FOR OTHER FILES & write out STASH list GSS2F401.463
ST_PROC1.267
*IF -DEF,RECON ST_PROC1.268
NRECS_S=NRECS ST_PROC1.272
NTIMES_S=NTIMES ST_PROC1.273
NLEVL_S=NLEVELS ST_PROC1.274
ITEM_MAX_ALL=NITEMP ST_PROC1.275
! ITEM_MAX_REQ IS DONE IN WSTLIST ST_PROC1.276
NMAXLEV_S=1 ST_PROC1.277
DO I =1,NLEVELS ST_PROC1.278
NMAXLEV_S=MAX(NMAXLEV_S,LEVLST_S(1,I)) ST_PROC1.279
END DO ST_PROC1.280
ST_PROC1.281
NPSLISTS_S=NPSLISTS ST_PROC1.282
NMAXPSL_S=1 ST_PROC1.283
DO I =1,NPSLISTS ST_PROC1.284
NMAXPSL_S=MAX(NMAXPSL_S,LENPLST(I)) ST_PROC1.285
END DO ST_PROC1.286
! LSTUSER=NUSERD.GE.1 ST_PROC1.287
ST_PROC1.288
! Assign values for STSIZES common block. ST_PROC1.289
! Write output file (for checking purposes). ST_PROC1.290
ST_PROC1.291
CALL WSTLST
(NRECS,NTIMES,NLEVELS) GSS1F400.687
*ENDIF ST_PROC1.295
ST_PROC1.296
DO I=1,NUM_DIAG_MAX GSS1F400.688
IF (OriginFlag(I).EQ.'P'.OR.OriginFlag(I).EQ.'U') THEN GSS1F400.689
! Determine model,section,item values for this row GSS1F400.690
RI=RowIndex(I) GSS1F400.691
Model = RI/100000 GSS1F400.692
Section=(RI-(RI/100000)*100000)/1000 GSS1F400.693
Item =(RI-(RI/1000 )*1000 ) GSS1F400.694
IF (IN_S(1,Model,Section,Item) .EQ. 0) THEN GSS1F400.695
! No entry in stash address list - overwrite this entry GSS1F400.696
OriginFlag(I)=' ' GSS1F400.697
END IF GSS1F400.698
END IF GSS1F400.699
END DO GSS1F400.700
DO J=1,NUM_DIAG_MAX GSS1F400.701
IF (Originflag(J).NE.' ') THEN GSS1F400.702
RI=RowIndex(J) GSS1F400.703
Model = RI/100000 GSS1F400.704
Section=(RI-(RI/100000)*100000)/1000 GSS1F400.705
Item =(RI-(RI/1000 )*1000 ) GSS1F400.706
END IF GSS1F400.707
END DO GSS1F400.708
! Close up gaps in OriginFlag array GSS1F400.709
DO I=1,NUM_DIAG_MAX GSS1F400.710
IF (OriginFlag(I).EQ.' ') THEN GSS1F400.711
DO J=I+1,NUM_DIAG_MAX GSS1F400.712
IF (OriginFlag(J).NE.' '.AND. GSS1F400.713
& OriginFlag(I).EQ.' ') THEN GSS1F400.714
OriginFlag(I) = OriginFlag(J) GSS1F400.715
Originflag(J) = ' ' GSS1F400.716
END IF GSS1F400.717
END DO GSS1F400.718
END IF GSS1F400.719
END DO GSS1F400.720
GSS1F400.721
9999 RETURN ST_PROC1.297
END ST_PROC1.298
ST_PROC1.299
!- End of Subroutine Code ---------------------------------------------- ST_PROC1.300
*ENDIF ST_PROC1.301