*IF DEF,CONTROL INITCTL1.2
C ******************************COPYRIGHT****************************** GTS2F400.4681
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.4682
C GTS2F400.4683
C Use, duplication or disclosure of this code is subject to the GTS2F400.4684
C restrictions as set forth in the contract. GTS2F400.4685
C GTS2F400.4686
C Meteorological Office GTS2F400.4687
C London Road GTS2F400.4688
C BRACKNELL GTS2F400.4689
C Berkshire UK GTS2F400.4690
C RG12 2SZ GTS2F400.4691
C GTS2F400.4692
C If no contract has been raised with this copy of the code, the use, GTS2F400.4693
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.4694
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.4695
C Modelling at the above address. GTS2F400.4696
C ******************************COPYRIGHT****************************** GTS2F400.4697
C GTS2F400.4698
CLL SUBROUTINE INITCTL------------------------------------------------- INITCTL1.3
CLL INITCTL1.4
CLL programmers of some or all of previous code & changes include: INITCTL1.5
CLL M J CARTER S TETT P.TREVELYAN C WILSON T JOHNS TJ140193.104
CLL INITCTL1.7
CLL Model Modification history from model version 3.0: INITCTL1.8
CLL version Date INITCTL1.9
CLL 3.1 16/02/93 Pass pseudo-level info to DIAGDESC for printout. TJ140193.105
CLL 3.1 03/02/93 : added comdeck CHSUNITS to define NUNITS for i/o. RS030293.117
CLL 3.2 27/03/93 Dynamic allocation of main data arrays. R. Rawlins @DYALLOC.1428
CLL 3.3 26/10/93 M. Carter. Part of an extensive mod that: MC261093.50
CLL 1.Removes the limit on primary STASH item numbers. MC261093.51
CLL 2.Removes the assumption that (section,item) MC261093.52
CLL defines the sub-model. MC261093.53
CLL 3.Thus allows for user-prognostics. MC261093.54
CLL Remove A_MAX_VARIABLES, Add read of PPINDEX. MC261093.55
CLL 3.4 07/12/94 M.Carter. Change to SI_LEN to calculate GMC2F304.1
CLL STASH_MAXLEN because of STOCGT and different GMC2F304.2
CLL lengths needed in SI_LEN and STASH_LIST GMC2F304.3
CLL 3.5 02/02/95 M.Carter. Correction to the calculation of GSS1F305.221
CLL MAX_STASH_LEVELS to properly account for levels GSS1F305.222
CLL and pseudo-levels. Bug Fix. GSS1F305.223
CLL 3.5 Apr. 95 Submodels project. GSS1F305.224
CLL Routine substantially modified. No longer reads GSS1F305.225
CLL from STASH control file; instead, the STASH list, GSS1F305.226
CLL STASH index, and STASH addresses and lengths are GSS1F305.227
CLL passed in via arrays set up by the STASH_PROC code GSS1F305.228
CLL PP_LEN2_LOOK, FT_OUTPUT values also passed in from GSS3F401.37
CLL STASH_PROC. GSS1F305.230
CLL S.J.Swarbrick GSS1F305.231
CLL 4.0 18/10/95 Remove GET_FILE from EXTERNAL statement. RTHBarnes GRB2F400.15
CLL 4.1 Apr. 96 Rationalise *CALLs & SI addressing for GSS3F401.38
CLL atmos items 4&5 and 10&11 S.J.Swarbrick GSS3F401.39
!LL 4.4 05/09/97 Step over space code 10 items S.D.Mullerworth GSM4F404.11
!LL 4.3-4.4 16/09/97 Added subroutine FILL_D1_ARRAY at 4.3. Plus GSM2F404.182
!LL minor correction at 4.4 S.D.Mullerworth GSM2F404.183
CLL INITCTL1.10
CLL INITCTL1.11
CLL PROGRAMMING STANDARD: UNIFIED MODEL DP NO. 3, VERSION 3 INITCTL1.12
CLL INITCTL1.13
CLL SYSTEM TASK: C4 INITCTL1.14
CLL INITCTL1.15
CLL SYSTEM COMPONENTS: C30, C40 INITCTL1.16
CLL INITCTL1.17
CLL PURPOSE: Initialises STASH control arrays from STASH control INITCTL1.18
CLL file. INITCTL1.19
CLL INITCTL1.20
CLL EXTERNAL DOCUMENTATION: UMDP NO. C4 VERSION NO. 4 INITCTL1.21
CLL INITCTL1.22
CLLEND------------------------------------------------------------- INITCTL1.23
INITCTL1.24
SUBROUTINE INITCTL( 1,12@DYALLOC.1429
& NUM_STASH_LEVELSDA,NUM_LEVEL_LISTSDA, @DYALLOC.1430
& NITEMS_DA,NSECTS_DA,NMDLS_DA, GSS1F305.232
*CALL ARGSIZE
@DYALLOC.1431
*CALL ARGSTS
@DYALLOC.1432
*CALL ARGPPX
GSS1F305.233
*CALL ARGD1
GSM2F403.234
& ICODE,CMESSAGE) @DYALLOC.1433
INITCTL1.26
IMPLICIT NONE INITCTL1.27
INITCTL1.28
*CALL CSUBMODL
! Defines N_INTERNAL_MODEL to dimension STASH arrays GSS1F305.234
GSS1F305.235
CL Arguments GSS1F305.236
GSS1F305.237
*CALL TYPSIZE
@DYALLOC.1436
*CALL TYPSTS
! Contains *CALL CPPXREF GSS1F305.238
*CALL PPXLOOK
! Contains *CALL VERSION GSS3F401.40
INTEGER @DYALLOC.1438
& NUM_STASH_LEVELSDA, ! IN: Extra copy for portable @DYALLOC.1439
& NUM_LEVEL_LISTSDA, ! IN: dynamic allocation @DYALLOC.1440
& NITEMS_DA, ! IN: Local copy, other in common without _DA GMC2F304.5
& NSECTS_DA, ! IN: Local copy, other in common without _DA GMC2F304.6
& NMDLS_DA, GSS1F305.241
& ICODE ! OUT: Error return code @DYALLOC.1441
C @DYALLOC.1442
CHARACTER*256 @DYALLOC.1443
& CMESSAGE ! OUT: Error return message @DYALLOC.1444
INITCTL1.32
*CALL CHSUNITS
RS030293.118
*CALL CCONTROL
INITCTL1.33
*CALL CLOOKADD
@DYALLOC.1445
*CALL CHISTORY
GDR3F305.137
*CALL STPARAM
INITCTL1.38
*CALL C_MDI
INITCTL1.39
*CALL CSTASH
GRB0F401.18
*CALL STEXTEND
! Declares arrays used in STASH_PROC code (LIST_S etc.); GSS1F305.244
! also contains common block STEXTEND GSS1F305.245
*CALL TYPD1
! For accessing D1 addressing array GSM2F403.235
INITCTL1.40
C External subroutines called INITCTL1.41
INITCTL1.42
INTEGER EXPPXI GSS1F305.246
CHARACTER*36 EXPPXC GSS1F305.247
GSS1F305.248
EXTERNAL INITCTL1.43
& DIAGDESC,TIMER,EXPPXI,EXPPXC GRB2F400.16
& ,FILL_D1_ARRAY GSM2F403.236
INITCTL1.45
C Local arrays GMC2F304.7
GSS1F305.250
! STASH input lengths GSS1F305.251
INTEGER SI_LEN(NITEMS_DA,0:NSECTS_DA,NMDLS_DA) GSS1F305.252
INTEGER ppxref_dat(PPXREF_CODELEN) GSS1F305.253
GSS1F305.254
C Local variables INITCTL1.46
INITCTL1.47
CHARACTER*36 NAME GSS1F305.255
REAL INITCTL1.48
& REAL_LEVELS(NUM_STASH_LEVELSDA,NUM_LEVEL_LISTSDA) @DYALLOC.1446
INITCTL1.50
INTEGER INITCTL1.51
& NUM_LISTS, INITCTL1.53
& NUM_LEVELS, INITCTL1.54
& NUM_PSEUDO_LEVELS, GSS1F305.256
& N_TABLES, INITCTL1.56
& I, INITCTL1.57
& IPK, GSS1F305.257
& KK, GSS1F305.258
& L, GSS1F305.259
& IS, INITCTL1.58
& IE, INITCTL1.59
& II, INITCTL1.60
& SM, GSM2F403.237
& IOBJ, GSM2F403.238
& ISEC, GSM2F403.239
& ITM, GSM2F403.240
& Im_ident, GSM2F403.241
& Sm_ident, GSM2F403.242
& IX, MC261093.57
& ISTEP, INITCTL1.61
& IL, INITCTL1.62
& IM, INITCTL1.63
& JJ, INITCTL1.64
& INPUT_LENGTH INITCTL1.65
GSS1F305.260
INTEGER IR1 ! loop start GSS1F400.1387
INTEGER IR,J,K ! loop count GSS1F400.1388
CHARACTER*1 VAR_TYPE GSS1F400.1389
CHARACTER*80 FILENAME AD050293.158
LOGICAL INT_MOD_INCLUDED ! Flag to indicate whether a particular GSS1F305.261
! internal model is included GSS1F305.262
INITCTL1.77
!----------------------------------------------------------------------- GSS1F305.263
INITCTL1.82
! 1. Assign STASHlist and associated lists to appropriate UM arrays GSS1F305.264
GSS1F305.265
! Initialise STLIST to zero GSS1F305.266
GSS1F305.267
DO II = 1,TOTITEMS GSS1F305.268
DO IE = 1,LEN_STLIST GSS1F305.269
STLIST(IE,II)=0 INITCTL1.85
END DO INITCTL1.86
END DO INITCTL1.87
INITCTL1.90
! Assign STASH list to STLIST GSS1F305.270
INITCTL1.96
DO I = 1,TOTITEMS GSS1F305.271
DO J = 1,LEN_STLIST GSS1F305.272
STLIST(J,I) = LIST_S(J,I) GSS1F305.273
END DO GSS1F305.274
END DO INITCTL1.103
INITCTL1.104
! Assign STASH times tables to STTABL GSS1F305.275
INITCTL1.106
DO I = 1,NSTTABL GSS1F305.276
DO J = 1,NSTTIMS GSS1F305.277
STTABL(J,I) = ITIM_S(J,I) GSS1F305.278
END DO GSS1F305.279
END DO INITCTL1.119
INITCTL1.120
! Assign STASH levels lists to STASH_LEVELS GSS1F305.280
INITCTL1.123
DO II=1,NUM_LEVEL_LISTS ! Initialise STASH_LEVELS to -99 GSS1F305.281
DO JJ=1,NUM_STASH_LEVELS+1 INITCTL1.125
STASH_LEVELS(JJ,II)=-99 INITCTL1.126
END DO GSS1F305.282
END DO GSS1F305.283
INITCTL1.145
DO I = 1,NUM_LEVEL_LISTS GSS1F305.284
NUM_LEVELS = LEVLST_S(1,I) GSS1F305.285
STASH_LEVELS(1,I) = NUM_LEVELS GSS1F305.286
DO J = 1,NUM_LEVELS GSS1F305.287
IF (LLISTTY(I).EQ.'R') THEN GSS1F305.288
REAL_LEVELS (J ,I) = RLEVLST_S (J+1,I) GSS1F305.289
STASH_LEVELS(J+1,I) =(REAL_LEVELS(J ,I)+0.0001)*1000.0 GSS1F305.290
ELSE IF (LLISTTY(I).EQ.'I') THEN GSS1F305.291
STASH_LEVELS(J+1,I) = LEVLST_S (J+1,I) GSS1F305.292
END IF GSS1F305.293
END DO GSS1F305.294
END DO GSS1F305.295
INITCTL1.148
! Store STASH pseudo levels lists in STASH_PSEUDO_LEVELS GSS1F305.296
GSS1F305.297
DO II=1,NUM_PSEUDO_LISTS ! Initialise STASH_PSEUDO_LEVELS GSS1F305.298
DO JJ=1,NUM_STASH_PSEUDO+1 ! to -99 GSS1F305.299
STASH_PSEUDO_LEVELS(JJ,II)=-99 INITCTL1.151
ENDDO INITCTL1.152
ENDDO INITCTL1.153
INITCTL1.161
DO I = 1,NUM_PSEUDO_LISTS GSS1F305.300
NUM_LEVELS = LENPLST(I) GSS1F305.301
STASH_PSEUDO_LEVELS(1,I) = NUM_LEVELS GSS1F305.302
DO J = 1,NUM_LEVELS GSS1F305.303
STASH_PSEUDO_LEVELS(J+1,I) = PSLIST_D(J,I) GSS1F305.304
END DO INITCTL1.205
END DO INITCTL1.206
INITCTL1.207
!Transfer time series data to STASH_SERIES array GSS1F400.1390
IF (NSERIES.GT.0) THEN GSS1F400.1391
!There are timeseries domains GSS1F400.1392
! Loop over STASHC domain profiles GSS1F400.1393
DO I=1,NDPROF GSS1F400.1394
IF (NPOS_TS(I) .GT. 0) THEN GSS1F400.1395
! This domain profile has a block of time series domains GSS1F400.1396
! J=time series block identifier (pointer): GSS1F400.1397
J=NPOS_TS(I) GSS1F400.1398
! STASH_SERIES_INDEX(1,J)=sequence no. of first record for GSS1F400.1399
! ts block J in STASH_SERIES GSS1F400.1400
IF (J.EQ.1) THEN GSS1F400.1401
STASH_SERIES_INDEX(1,J)=1 GSS1F400.1402
ELSE GSS1F400.1403
STASH_SERIES_INDEX(1,J)= STASH_SERIES_INDEX(1,J-1) GSS1F400.1404
& +STASH_SERIES_INDEX(2,J-1) GSS1F400.1405
END IF GSS1F400.1406
! STASH_SERIES_INDEX(2,J)=no. of records in ts block J GSS1F400.1407
STASH_SERIES_INDEX(2,J)=NRECS_TS(J) GSS1F400.1408
IR1 =STASH_SERIES_INDEX(1,J) GSS1F400.1409
DO IR=IR1,IR1+NRECS_TS(J)-1 GSS1F400.1410
STASH_SERIES(1,IR)=IG_TS GSS1F400.1411
STASH_SERIES(2,IR)=I1_TS GSS1F400.1412
STASH_SERIES(3,IR)=I51_TS GSS1F400.1413
STASH_SERIES(4,IR)=NLIM_TS(IR) GSS1F400.1414
STASH_SERIES(5,IR)=SLIM_TS(IR) GSS1F400.1415
STASH_SERIES(6,IR)=WLIM_TS(IR) GSS1F400.1416
STASH_SERIES(7,IR)=ELIM_TS(IR) GSS1F400.1417
STASH_SERIES(8,IR)=BLIM_TS(IR) GSS1F400.1418
STASH_SERIES(9,IR)=TLIM_TS(IR) GSS1F400.1419
END DO GSS1F400.1420
END IF GSS1F400.1421
END DO GSS1F400.1422
END IF GSS1F400.1423
GSS1F305.341
! Initialise STINDEX and SI GSS1F305.342
GSS1F305.343
DO IE=1,NITEMS GSS1F305.344
DO IS=0,NSECTS INITCTL1.208
DO IM=1,N_INTERNAL_MODEL GSS1F305.345
DO II=1,2 GSS1F305.346
STINDEX(II,IE,IS,IM)=0 GSS1F305.347
END DO INITCTL1.211
SI (IE,IS,IM)=1 GSS1F305.348
SI_LEN(IE,IS,IM)=0 GSS1F305.349
IF (IS.EQ.0) THEN GSS1F305.350
PPINDEX(IE,IM)=0 GSS1F305.351
END IF GSS1F305.352
END DO GSS1F305.353
END DO GSS1F305.354
END DO INITCTL1.212
INITCTL1.213
! 2. Read STASHindex and compute STASHWORK array lengths. GSS1F305.355
! The Lth. row in STINDEX, SI, SI_LEN, PPINDEX, corresponds to the GSS1F305.356
! Lth. internal model in INTERNAL_MODEL_LIST. GSS1F305.357
! Output a formatted description of the selected diagnostics. GSS1F305.358
GSS1F305.359
ii =0 ! Counter for checking no. of diags. printed GSS1F305.360
L =0 ! Counter for rows in STINDEX, SI, etc. GSS1F305.361
DO K=1,N_INTERNAL_MODEL_MAX GSS1F305.362
INT_MOD_INCLUDED=.FALSE. GSS3F401.41
! Find out whether int. model 'K' is included. If it is: GSS1F305.366
! Set logical flag, increment row number GSS1F305.367
DO KK=1,N_INTERNAL_MODEL_MAX GSS1F305.369
IF (INTERNAL_MODEL_LIST(KK).EQ.K) THEN GSS1F305.370
INT_MOD_INCLUDED=.TRUE. GSS1F305.371
L = L + 1 GSS1F305.372
END IF GSS1F305.373
END DO MC261093.61
IF (INT_MOD_INCLUDED) THEN GSS1F305.374
DO J=0,NSECTS ! NSECTS=NSECTP (WSTLST) GSS1F305.375
DO I=1,NITEMS ! NITEMS=NITEMP (WSTLST) GSS1F305.376
IF (IN_S(1,K,J,I).GE.1) THEN ! Entry in STASH list GSS1F305.377
ii = ii + 1 GSS1F305.379
STINDEX(1,I,J,L) = INDX_S (1,K,J,I) ! STASH index GSS1F305.380
STINDEX(2,I,J,L) = INDX_S (2,K,J,I) GSS1F305.381
SI ( I,J,L) = IN_S (1,K,J,I) ! STASH lengths and GSS1F305.382
SI_LEN ( I,J,L) = IN_S (2,K,J,I) ! addresses in D1 GSS1F305.383
IF (J.EQ.0 .AND. PPIND_S(K,I).NE.0) THEN GSS1F305.384
PPINDEX(I, L) = PPIND_S( K, I) ! Index for pp header GSS1F305.385
END IF ! array GSS1F305.386
! Extract ppxref information to be passed into GSS1F305.387
! diagnostic description routine GSS1F305.388
NAME = EXPPXC
(K,J,I, GSS1F305.389
*CALL ARGPPX
GSS1F305.390
& ICODE,CMESSAGE) GSS1F305.391
ppxref_dat(ppx_model_number) = K GSS3F401.42
ppxref_dat(ppx_field_code ) = EXPPXI
(K,J,I,ppx_field_code , GSS1F305.394
*CALL ARGPPX
GSS1F305.395
& ICODE,CMESSAGE) GSS1F305.396
ppxref_dat(ppx_data_type ) = EXPPXI
(K,J,I,ppx_data_type , GSS1F305.397
*CALL ARGPPX
GSS1F305.398
& ICODE,CMESSAGE) GSS1F305.399
ppxref_dat(ppx_grid_type ) = EXPPXI
(K,J,I,ppx_grid_type , GSS1F305.400
*CALL ARGPPX
GSS1F305.401
& ICODE,CMESSAGE) GSS1F305.402
ppxref_dat(ppx_lv_code ) = EXPPXI
(K,J,I,ppx_lv_code , GSS1F305.403
*CALL ARGPPX
GSS1F305.404
& ICODE,CMESSAGE) GSS1F305.405
ppxref_dat(ppx_cf_levelcode) = EXPPXI
(K,J,I,ppx_cf_levelcode, GSS1F305.406
*CALL ARGPPX
GSS1F305.407
& ICODE,CMESSAGE) GSS1F305.408
ppxref_dat(ppx_cf_fieldcode) = EXPPXI
(K,J,I,ppx_cf_fieldcode, GSS1F305.409
*CALL ARGPPX
GSS1F305.410
& ICODE,CMESSAGE) GSS1F305.411
DO IPK = 0,9 GSS1F305.412
ppxref_dat(ppx_pack_acc+IPK) = EXPPXI
(K,J,I,ppx_pack_acc+IPK, GSS1F305.413
*CALL ARGPPX
GSS1F305.414
& ICODE,CMESSAGE) GSS1F305.415
END DO GSS1F305.416
GSS1F305.417
! Write a formatted description of the diagnostic to output file. GSS1F305.418
DO IX=STINDEX(1,I,J,L), ! Loop over GSS1F305.420
& STINDEX(1,I,J,L)+STINDEX(2,I,J,L)-1 ! entries GSS1F305.421
IF (LTIMER) CALL TIMER
('DIAGDESC',3) MC261093.93
CALL DIAGDESC
(IX,NAME,STLIST(1,IX),ppxref_dat(1), GSS1F305.423
& stash_levels,num_stash_levels,num_level_lists, MC261093.95
& stash_pseudo_levels,num_stash_pseudo,num_pseudo_lists, MC261093.96
& sttabl,nsttims,nsttabl, MC261093.97
& stash_series,time_series_rec_len,nstash_series_records, MC261093.98
& stash_series_index,nstash_series_block) MC261093.99
IF (LTIMER) CALL TIMER
('DIAGDESC',4) MC261093.100
ENDDO GSS1F305.424
ELSE IF (IN_S(1,K,J,I).EQ.-1) THEN GSM4F404.12
ii = ii + 1 GSM4F404.13
END IF ! INDX_S(1,K,J,I).GE.1 GSS1F305.425
IF (ICODE.GT.0) GOTO 999 GSS1F305.426
END DO ! Items GSS1F305.427
END DO ! Sections GSS1F305.428
IF (K.EQ.A_IM) THEN GSS3F401.43
! Set SI for thetal from that for theta, and QT from that for Q GSS3F401.44
! - different item numbers but same address GSS3F401.45
SI( 5,0,L) = SI( 4,0,L) GSS3F401.46
SI(11,0,L) = SI(10,0,L) GSS3F401.47
END IF GSS3F401.48
END IF ! INT_MOD_INCLUDED GSS1F305.429
END DO ! Models GSS1F305.430
GSS1F305.431
IF (ii.NE.N_PPXRECS) THEN GSS1F305.432
WRITE(6,*) ' Error in INITCTL: N_PPXRECS not correct ',II MC261093.106
CMESSAGE='INITCTL : N_PPXRECS not correct ' MC261093.107
ICODE=1 MC261093.108
GOTO 999 MC261093.109
END IF MC261093.110
INITCTL1.241
!Assign values to PP_LEN2_LOOK, FT_OUTPUT GSS1F305.433
DO I = 20,NUNITS GSS1F305.434
PP_LEN2_LOOK(I)=PPlen2LkUp(I) GSS1F305.435
FT_OUTPUT (I)=FTOutUnit (I) GSS1F305.436
END DO GSS1F305.437
GSS1F305.438
INITCTL1.248
CL 2.1 Find the max length in STASH_WORK and store in STASH_MAXLEN INITCTL1.249
INITCTL1.250
DO IM=1,N_INTERNAL_MODEL GSS1F305.441
DO IS=1,NSECTS ! Note not section Zero as the data is in D1 INITCTL1.251
STASH_MAXLEN(IS,IM)=1 GSS1F305.442
DO IE=1,NITEMS ! Again only data not in D1 MC261093.111
IF(STINDEX(1,IE,IS,IM).NE.0) THEN GSS1F305.443
C Item is in STASHlist ... MC261093.112
IF (STLIST(st_input_code,STINDEX(1,IE,IS,IM)).EQ.1) THEN GSS1F305.444
C ... and input from STASHwork MC261093.114
C ... input length not from ST_LIST as this is post STOCGT GMC2F304.12
INPUT_LENGTH=SI_LEN(IE,IS,IM) GSS1F305.445
STASH_MAXLEN(IS,IM)=STASH_MAXLEN(IS,IM)+INPUT_LENGTH GSS1F305.446
ENDIF MC261093.117
ENDIF INITCTL1.257
END DO INITCTL1.258
END DO GSS1F305.447
END DO INITCTL1.259
INITCTL1.260
CL INITCTL1.261
CL MC261093.118
CL---------------------------------------------------------------------- INITCTL1.287
CL 3. Set derived control variables for use in STASH/STWORK GSS1F305.448
CL INITCTL1.289
CL Set PP_LEN2_LOOKUP to maximum PP_LEN2_LOOK value for any PP GSS1F305.449
CL unit referenced in the STASHlist (minimum value possible is 8). INITCTL1.291
CL Set MAX_STASH_LEVS to the maximum possible no of output levels INITCTL1.292
CL for any diagnostic, allowing for possible pseudo-levels. INITCTL1.293
CL INITCTL1.294
PP_LEN2_LOOKUP=8 INITCTL1.295
MAX_STASH_LEVS=1 GSS1F305.450
DO II=1,TOTITEMS GSS1F305.451
IF (STLIST(st_output_code,II).LT.0) THEN INITCTL1.298
C output is to PP file INITCTL1.299
IF (PP_LEN2_LOOK(-STLIST(st_output_code,II)) INITCTL1.300
& .GT.PP_LEN2_LOOKUP) INITCTL1.301
& PP_LEN2_LOOKUP=PP_LEN2_LOOK(-STLIST(st_output_code,II)) INITCTL1.302
ENDIF INITCTL1.303
C GSS1F305.452
C Input levels list/range is always longer than output GSS1F305.453
IF (STLIST(st_input_bottom,II).EQ.st_special_code) THEN GSS1F305.454
C On special level GSS1F305.455
NUM_LEVELS=1 GSS1F305.456
ELSE IF (STLIST(st_input_bottom,II).LT.0) THEN GSS1F305.457
C Using levels list, element 1 holds length. GSS1F305.458
NUM_LEVELS=STASH_LEVELS(1,-STLIST(st_input_bottom,II)) GSS1F305.459
ELSE GSS1F305.460
C Range GSS1F305.461
NUM_LEVELS= GSS1F305.462
& STLIST(st_input_top,II)-STLIST(st_input_bottom,II)+1 GSS1F305.463
END IF GSS1F305.464
IF (STLIST(st_pseudo_in,II).NE.0) THEN GSS1F305.465
C On pseudo levels GSS1F305.466
NUM_PSEUDO_LEVELS=STASH_PSEUDO_LEVELS(1, GSS1F305.467
& STLIST(st_pseudo_in,II)) GSS1F305.468
ELSE GSS1F305.469
C Not on pseudo levels GSS1F305.470
NUM_PSEUDO_LEVELS=1 GSS1F305.471
END IF GSS1F305.472
MAX_STASH_LEVS=MAX(MAX_STASH_LEVS,NUM_LEVELS*NUM_PSEUDO_LEVELS) GSS1F305.473
END DO INITCTL1.311
C Round PP_LEN2_LOOKUP up to a multiple of 8 INITCTL1.312
PP_LEN2_LOOKUP=((PP_LEN2_LOOKUP+7)/8)*8 INITCTL1.313
GSM2F403.243
GSM2F403.244
CALL FILL_D1_ARRAY
( GSM2F403.245
*CALL ARGSIZE
GSM2F403.246
*CALL ARGSTS
GSM2F403.247
*CALL ARGPPX
GSM2F403.248
*CALL ARGD1
GSM2F403.249
& ICODE,CMESSAGE) GSM2F403.250
GSM2F403.251
GSM2F403.252
C---------------------------------------------------------------------- GSM2F403.253
999 CONTINUE GSM2F403.254
RETURN GSM2F403.255
END GSM2F403.256
GSM2F403.257
CLL SUBROUTINE FILL_D1_ARRAY------------------------------------------ GSM2F403.258
CLL GSM2F403.259
CLL PURPOSE: Fill D1 addressing array with useful information. GSM2F403.260
CLL S.D.Mullerworth GSM2F403.261
GSM2F403.262
SUBROUTINE FILL_D1_ARRAY( 1,1GSM2F403.263
*CALL ARGSIZE
GSM2F403.264
*CALL ARGSTS
GSM2F403.265
*CALL ARGPPX
GSM2F403.266
*CALL ARGD1
GSM2F403.267
& ICODE,CMESSAGE) GSM2F403.268
GSM2F403.269
IMPLICIT NONE GSM2F403.270
GSM2F403.271
*CALL CSUBMODL
GSM2F403.272
*CALL TYPSIZE
GSM2F403.273
*CALL TYPSTS
! Contains *CALL CPPXREF GSM2F403.274
*CALL PPXLOOK
! Contains *CALL VERSION GSM2F403.275
*CALL CHSUNITS
GSM2F403.276
*CALL CHISTORY
GSM2F403.277
*CALL STPARAM
GSM2F403.278
*CALL C_MDI
GSM2F403.279
*CALL CSTASH
GSM2F403.280
*CALL MODEL
GSM2F403.281
*CALL STEXTEND
! Declares arrays used in STASH_PROC code (LIST_S etc.); GSM2F403.282
! also contains common block STEXTEND GSM2F403.283
*CALL TYPD1
! For accessing D1 addressing array GSM2F403.284
GSM2F403.285
INTEGER GSM2F403.286
& II, ! Addresses preliminary array GSM2F403.287
& SM, ! Addresses final array=1 for 1st submod =2 for 2nd GSM2F403.288
& ! submodel etc GSM2F403.289
& TYPE, ! Code for prognostic, diagnostic, secondary or other GSM2F403.290
& IOBJ, ! Addresses final array GSM2F403.291
& ISEC, ! Section number GSM2F403.292
& ITM, ! Item number GSM2F403.293
& LEVS, ! No of levels GSM2F403.294
& INF, ! Diagnostic STASHlist number or prognosic item number GSM2F403.295
& Im_ident, GSM2F403.296
& Sm_ident, GSM2F403.297
& LOOKUP_PTR, ! Pointer to lookup table GSM2F403.298
& EXT_ADDR, ! Temporary pointer GSM2F403.299
& ICODE ! OUT: Error return code GSM2F403.300
C GSM2F403.301
CHARACTER*256 GSM2F403.302
& CMESSAGE ! OUT: Error return message GSM2F403.303
GSM2F403.304
INTEGER EXPPXI GSM2F403.305
EXTERNAL EXPPXI GSM2F403.306
GSM2F403.307
C Initialise array GSM2F403.308
DO Sm_ident=1,N_SUBMODEL_PARTITION GSM2F403.309
DO II=1,N_OBJ_D1_MAX GSM2F403.310
DO INF=1,D1_LIST_LEN GSM2F403.311
D1_ADDR(INF,II,Sm_ident)=-1 GSM2F403.312
NO_OBJ_D1(Sm_ident)=0 GSM2F404.184
ENDDO GSM2F403.313
ENDDO GSM2F403.314
ENDDO GSM2F403.315
GSM2F403.316
C Set up addressing of D1 GSM2F403.317
WRITE(6,*)'Addressing of D1 array' GSM2F403.318
WRITE(6,*)'Key to Type:' GSM2F403.319
WRITE(6,*)'Type=0: Prognostic' GSM2F403.320
WRITE(6,*)'Type=1: Diagnostics in dump' GSM2F403.321
WRITE(6,*)'Type=2: Secondary diagnostics' GSM2F403.322
WRITE(6,*)'Type=3: Others (eg P_EXNER in atmos or 2nd of dual ' GSM2F403.323
WRITE(6,*)' time level ocean fields)' GSM2F403.324
SM=0 GSM2F403.325
DO Sm_ident=1,N_SUBMODEL_PARTITION_MAX GSM2F403.326
IOBJ=0 GSM2F403.327
SM=SUBMODEL_FOR_SM(Sm_ident) GSM2F403.328
IF (SM.NE.0) THEN GSM2F403.329
IF (NO_OBJ_D1(SM).EQ.0) THEN GSM2F404.185
NO_OBJ_D1(SM)=N_OBJ_D1(Sm_ident) GSM2F403.330
WRITE(6,*)'Submodel id ',Sm_ident GJC0F405.24
WRITE(6,*)'Submodel Number ',SM GJC0F405.25
WRITE(6,*)'No of objects in this submodel: ',NO_OBJ_D1(SM) GSM2F404.186
! Address if submodel not empty and not already addressed GSM2F404.187
DO II=1,NO_OBJ_D1(SM) GSM2F403.334
C Preliminary array held in D1_PADDR - full array in D1_ADDR GSM2F403.335
C Index II in D1_PADDR goes into index IOBJ of D1_ADDR GSM2F403.336
C First add prognostics followed by diagnostics... GSM2F403.337
Im_ident=D1_PADDR(d1_im,II,Sm_ident) GSM2F403.338
INF=D1_PADDR(d1_extra_info,II,Sm_ident) GSM2F403.339
TYPE=D1_PADDR(d1_type,II,Sm_ident) GSM2F403.340
IF (TYPE.EQ.prog) THEN GSM2F403.341
IOBJ=IOBJ+1 GSM2F403.342
D1_ADDR(d1_stlist_no,IOBJ,SM)=INF GSM2F403.343
D1_ADDR(d1_no_levels,IOBJ,SM)= GSM2F403.344
& D1_PADDR(d1_levs,II,Sm_ident) GSM2F403.345
D1_ADDR(d1_object_type,IOBJ,SM)=prognostic GSM2F403.346
D1_ADDR(d1_imodl,IOBJ,SM) = Im_ident GSM2F403.347
D1_ADDR(d1_address,IOBJ,SM)= IN_S(1,Im_ident,0,INF) GSM2F403.348
ELSEIF (TYPE.EQ.diag) THEN GSM2F403.349
IOBJ=IOBJ+1 GSM2F403.350
D1_ADDR(d1_stlist_no,IOBJ,SM)=INF GSM2F403.351
D1_ADDR(d1_object_type,IOBJ,SM)=diagnostic GSM2F403.352
D1_ADDR(d1_imodl,IOBJ,SM) = Im_ident GSM2F403.353
D1_ADDR(d1_address,IOBJ,SM)= STLIST(st_output_addr,INF) GSM2F403.354
ENDIF GSM2F403.355
ENDDO GSM2F403.356
C Calculate end position of progs and diags for ocean GSM2F403.357
IF(SM_IDENT.EQ.O_SM)THEN GSM2F403.358
EXT_ADDR=LPrimIM(O_IM)+LDumpIM(O_IM)+1 GSM2F403.359
ENDIF GSM2F403.360
GSM2F403.361
C Extra data between primary and secondary diagnostics GSM2F403.362
DO II=1,NO_OBJ_D1(SM) GSM2F403.363
TYPE=D1_PADDR(d1_type,II,Sm_ident) GSM2F403.364
IF (TYPE.EQ.extra_d1) THEN GSM2F403.365
Im_ident=D1_PADDR(d1_im,II,Sm_ident) GSM2F403.366
INF=D1_PADDR(d1_extra_info,II,Sm_ident) GSM2F403.367
IOBJ=IOBJ+1 GSM2F403.368
D1_ADDR(d1_stlist_no,IOBJ,SM)=INF GSM2F403.369
D1_ADDR(d1_no_levels,IOBJ,SM)= GSM2F403.370
& D1_PADDR(d1_levs,II,Sm_ident) GSM2F403.371
D1_ADDR(d1_object_type,IOBJ,SM)=other GSM2F403.372
D1_ADDR(d1_imodl,IOBJ,SM) = Im_ident GSM2F403.373
IF(SM_IDENT.NE.O_IM)THEN GSM2F403.374
C NOT OCEAN: Address was calculated in ADDRES GSM2F403.375
D1_ADDR(d1_address,IOBJ,SM)= IN_S(1,Im_ident,0,INF) GSM2F403.376
ELSE GSM2F403.377
C OCEAN: This is first time 2nd timestep prognostics GSM2F403.378
C have been addressed so calculate GSM2F403.379
D1_ADDR(d1_address,IOBJ,SM)=EXT_ADDR GSM2F403.380
EXT_ADDR=EXT_ADDR+IN_S(2,Im_ident,0,INF) GSM2F403.381
ENDIF GSM2F403.382
ENDIF GSM2F403.383
ENDDO GSM2F403.384
C Finally add secondary diagnostics GSM2F403.385
DO II=1,NO_OBJ_D1(SM) GSM2F403.386
C Preliminary array held in D1_PADDR - full array in D1_ADDR GSM2F403.387
Im_ident=D1_PADDR(d1_im,II,Sm_ident) GSM2F403.388
INF=D1_PADDR(d1_extra_info,II,Sm_ident) GSM2F403.389
TYPE=D1_PADDR(d1_type,II,Sm_ident) GSM2F403.390
IF (TYPE.EQ.seco) THEN GSM2F403.391
IOBJ=IOBJ+1 GSM2F403.392
D1_ADDR(d1_stlist_no,IOBJ,SM)=INF GSM2F403.393
D1_ADDR(d1_object_type,IOBJ,SM)=secondary GSM2F403.394
D1_ADDR(d1_imodl,IOBJ,SM) = Im_ident GSM2F403.395
D1_ADDR(d1_address,IOBJ,SM)= STLIST(st_output_addr,INF) GSM2F403.396
ENDIF GSM2F403.397
ENDDO GSM2F403.398
GSM2F403.399
LOOKUP_PTR=0 GSM2F403.400
DO II=1,NO_OBJ_D1(SM) GSM2F403.401
TYPE= D1_ADDR(d1_object_type,II,SM) GSM2F403.402
INF = D1_ADDR(d1_stlist_no,II,SM) GSM2F403.403
Im_ident = D1_ADDR(d1_imodl,II,SM) GSM2F403.404
IF((TYPE.EQ.prognostic).OR.(TYPE.EQ.other))THEN GSM2F403.405
C Prognostics don't have STASHlist numbers GSM2F403.406
D1_ADDR(d1_stlist_no,II,SM)= -1 GSM2F403.407
D1_ADDR(d1_section,II,SM)= 0 GSM2F403.408
D1_ADDR(d1_item,II,SM) = INF GSM2F403.409
D1_ADDR(d1_length,II,SM) = IN_S(2,Im_ident,0,INF) GSM2F403.410
ISEC = 0 GSM2F403.411
ITM = INF GSM2F403.412
C------------------------------------------------------------------- GSM2F403.413
C Prognostic items: GSM2F403.414
C Additional items can be added to the array here. Its code (eg GSM2F403.415
C d1_item, d1_levels) should be added to the TYPD1 comdeck and GSM2F403.416
C set as a parameter. The D1_LIST_LEN parameter should be changed GSM2F403.417
C as required GSM2F403.418
C------------------------------------------------------------------- GSM2F403.419
ELSE GSM2F403.420
D1_ADDR(d1_section,II,SM)= STLIST(st_sect_code,INF) GSM2F403.421
D1_ADDR(d1_item,II,SM) = STLIST(st_item_code,INF) GSM2F403.422
D1_ADDR(d1_length,II,SM) = STLIST(st_output_length,INF) GSM2F403.423
ISEC=D1_ADDR(d1_section,II,SM) GSM2F403.424
ITM=D1_ADDR(d1_item,II,SM) GSM2F403.425
C STASH list pointer to D1 address information GSM2F403.426
STLIST(st_position_in_d1,INF) = II GSM2F403.427
C------------------------------------------------------------------- GSM2F403.428
C Diagnostic items GSM2F403.429
C Add items as per prognostics GSM2F403.430
C------------------------------------------------------------------- GSM2F403.431
D1_ADDR(d1_north_code,II,SM) =STLIST(st_north_code,INF) GSM2F403.432
D1_ADDR(d1_south_code,II,SM) =STLIST(st_south_code,INF) GSM2F403.433
D1_ADDR(d1_east_code,II,SM) =STLIST(st_east_code,INF) GSM2F403.434
D1_ADDR(d1_west_code,II,SM) =STLIST(st_west_code,INF) GSM2F403.435
D1_ADDR(d1_gridpoint_code,II,SM)=STLIST(s_grid,INF) GSM2F403.436
D1_ADDR(d1_proc_no_code,II,SM) =STLIST(s_proc,INF) GSM2F403.437
C 1. Number of levels GSM2F403.438
IF(STLIST(st_output_bottom,INF).EQ.100) THEN GSM2F403.439
C Special levels GSM2F403.440
LEVS=1 GSM2F403.441
ELSE IF(STLIST(st_series_ptr,INF).NE.0) THEN GSM2F403.442
C Time series domain GSM2F403.443
LEVS=1 GSM2F403.444
ELSE IF(STLIST(st_gridpoint_code,INF).GE.10 GSM2F403.445
& .AND.STLIST(st_gridpoint_code,INF).LT.20) THEN GSM2F403.446
C Vertical ave. GSM2F403.447
LEVS=1 GSM2F403.448
ELSE IF(STLIST(st_output_bottom,INF).LT.0) THEN GSM2F403.449
C Levels list GSM2F403.450
LEVS=LEVLST_S(1,-STLIST(st_output_bottom,INF)) GSM2F403.451
ELSE GSM2F403.452
C Range of model levels GSM2F403.453
LEVS=STLIST(st_output_top ,INF) GSM2F403.454
& -STLIST(st_output_bottom,INF)+1 GSM2F403.455
END IF GSM2F403.456
GSM2F403.457
IF (STLIST(st_pseudo_out,INF).GT.0) THEN GSM2F403.458
C Pseudo levels GSM2F403.459
LEVS=LEVS*LENPLST(STLIST(st_pseudo_out,INF)) GSM2F403.460
END IF GSM2F403.461
D1_ADDR(d1_no_levels,II,SM) = LEVS GSM2F403.462
ENDIF GSM2F403.463
C------------------------------------------------------------------- GSM2F403.464
C Items whose settings are common to progs and diags (eg from PPXREF) GSM2F403.465
C Add items as per prognostics GSM2F403.466
C ISEC and ITM set above GSM2F403.467
C------------------------------------------------------------------- GSM2F403.468
D1_ADDR(d1_grid_type,II,SM) = GSM2F403.469
& EXPPXI
(Im_ident,ISEC,ITM,ppx_grid_type, GSM2F403.470
*CALL ARGPPX
GSM2F403.471
& ICODE, CMESSAGE) GSM2F403.472
LOOKUP_PTR=LOOKUP_PTR+D1_ADDR(d1_no_levels,II,SM) GSM2F403.473
D1_ADDR(d1_lookup_ptr,II,SM)=LOOKUP_PTR GSM2F403.474
ENDDO GSM2F403.475
WRITE(6,*) GSM2F403.476
&' Type Modl Sect Item Address Length Levels Gridtype' GSM2F403.477
DO II=1,NO_OBJ_D1(SM) GSM2F403.478
WRITE(6,100)II,D1_ADDR(d1_object_type,II,SM), GSM2F403.479
& D1_ADDR(d1_imodl,IOBJ,SM), GSM2F403.480
& D1_ADDR(d1_section,II,SM),D1_ADDR(d1_item,II,SM), GSM2F403.481
& D1_ADDR(d1_address,II,SM),D1_ADDR(d1_length,II,SM), GSM2F403.482
& D1_ADDR(d1_no_levels,II,SM),D1_ADDR(d1_grid_type,II,SM) GSM2F403.483
GSM2F403.484
ENDDO GSM2F403.485
100 FORMAT(5I5,I8,2I7,I5) GSM2F403.486
ENDIF ! IF (NO_OBJ_D1(SM).EQ.0) THEN GSM2F404.188
ENDIF GSM2F403.487
GSM2F403.488
ENDDO ! DO Sm_ident=1,N_SUBMODEL_PARTITION_MAX GSM2F403.489
INITCTL1.314
999 CONTINUE INITCTL1.315
RETURN INITCTL1.316
END INITCTL1.317
INITCTL1.318
*ENDIF INITCTL1.319