*IF DEF,CONTROL,OR,DEF,RECON,OR,DEF,FLDOP UIE3F404.2
C ******************************COPYRIGHT****************************** GTS2F400.12276
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.12277
C GTS2F400.12278
C Use, duplication or disclosure of this code is subject to the GTS2F400.12279
C restrictions as set forth in the contract. GTS2F400.12280
C GTS2F400.12281
C Meteorological Office GTS2F400.12282
C London Road GTS2F400.12283
C BRACKNELL GTS2F400.12284
C Berkshire UK GTS2F400.12285
C RG12 2SZ GTS2F400.12286
C GTS2F400.12287
C If no contract has been raised with this copy of the code, the use, GTS2F400.12288
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.12289
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.12290
C Modelling at the above address. GTS2F400.12291
C GTS2F400.12292
!+Set the STASH addresses for D1 ADDRES1.3
! Subroutine Interface: ADDRES1.4
SUBROUTINE ADDRES( 1,18GSS3F401.66
*CALL ARGPPX
ADDRES1.7
& NRECS, GSM2F403.87
& ErrorStatus,CMESSAGE) GSM2F403.88
IMPLICIT NONE ADDRES1.9
! Description: ADDRES1.10
! ADDRES1.11
! Method: ADDRES1.12
! ADDRES1.13
! Current code owner: S.J.Swarbrick ADDRES1.14
! ADDRES1.15
! History: ADDRES1.16
! Version Date Comment ADDRES1.17
! ======= ==== ======= ADDRES1.18
! 3.5 Mar. 95 Original code. S.J.Swarbrick ADDRES1.19
! 4.0 Oct. 95 S.J.Swarbrick GSS1F400.808
! 4.1 Apr. 96 Generalisation GSS3F401.68
! of routine S.J.Swarbrick GSS3F401.69
! 4.2 Nov. 96 Allow for uncompresses ocean dumps in OSI0F402.143
! calculation of LPRIM_O2 OSI0F402.144
! 4.2 2/9/96 MPP code : Change to relevant decomposition GPB0F403.3019
! as each submodel is processed. P.Burton GPB0F403.3020
! 4.3 13/3/97 Further MPP changes P.Burton GPB0F403.3021
! 4.3 19/5/97 Allow for pseudo-levels. W.Ingram AWI1F403.100
! ADDRES1.20
! 4.3 18/03/97 Set up preliminary addressing of D1 GSM2F403.89
! S.D.Mullerworth GSM2F403.90
! 4.4 05/09/97 New space code 10. S.D.Mullerworth GSM4F404.1
! 4.4 Oct. 97 Added error checking on return from TOTIMP GDW1F404.231
! 4.4 26/08/97 Mixed phase precip scheme means not all ISPACE.eq.9 ARB1F404.4
! may be active. RTHBarnes. ARB1F404.5
! 4.4 11/07/97 Correction for fields not on model levels. GDG0F404.1
! D.M. Goddard GDG0F404.2
! vn4.4 Remove check preventing stash codes 4 and 10 UIE2F404.117
! (q and theta) from being included in variable NProgItems enabling UIE2F404.118
! them to be written out as prognostics. Ian Edmond UIE2F404.119
! 4.5 03/09/98 Don't set the decomposition in PARVARS for the SCH0F405.11
! slab model. Prior to this there would be an SCH0F405.12
! error message if the slab model was selected SCH0F405.13
! for mpp runs. Slab model can now be run with SCH0F405.14
! mpp selected. C. D. Hewitt SCH0F405.15
! Code description: ADDRES1.21
! FORTRAN 77 + common Fortran 90 extensions. ADDRES1.22
! Written to UM programming standards version 7. ADDRES1.23
! ADDRES1.24
! System component covered: ADDRES1.25
! System task: Sub-Models Project ADDRES1.26
! ADDRES1.27
! Global variables: ADDRES1.28
*CALL CSUBMODL
ADDRES1.30
*CALL LENFIL
ADDRES1.31
*CALL CPPXREF
GSS3F401.70
*CALL PPXLOOK
GSS3F401.71
*CALL TYPSIZE
GSS3F401.72
*CALL MODEL
ADDRES1.33
*CALL CSTASH
GRB0F401.3
*CALL STEXTEND
ADDRES1.35
*IF DEF,RECON ADDRES1.36
*CALL NRECON
ADDRES1.37
*ENDIF ADDRES1.38
*CALL STPARAM
ADDRES1.40
GPB1F402.196
*IF DEF,MPP GPB1F402.197
! MPP comdecks GPB1F402.198
*CALL DECOMPTP
GPB1F402.199
*CALL PARVARS
GPB1F402.200
*ENDIF GPB1F402.201
GSS3F401.73
ADDRES1.47
! Subroutine arguments: ADDRES1.48
! Scalar arguments with intent(in): ADDRES1.50
INTEGER NRECS GSS3F401.74
ADDRES1.55
! Scalar arguments with intent(out): ADDRES1.56
CHARACTER*80 CMESSAGE GSS9F402.165
ADDRES1.59
! ErrorStatus: ADDRES1.60
INTEGER ErrorStatus ADDRES1.61
ADDRES1.62
! Local scalars: ADDRES1.63
INTEGER TOTIMP GSS3F401.75
INTEGER Im_ident !Internal model identifier (absolute - CSMID) GSS1F400.809
INTEGER Im_index !Internal model index (expt. dependent) GSS1F400.810
INTEGER Sm_ident !Submodel identifier (absolute) GSS3F401.76
INTEGER ISEC ADDRES1.68
INTEGER IITM ADDRES1.69
INTEGER RLEVS ADDRES1.70
INTEGER RADDRESS ADDRES1.72
INTEGER PIrow ADDRES1.73
INTEGER I,J GSS3F401.77
INTEGER IFIRST ADDRES1.75
INTEGER IFREQ ADDRES1.76
INTEGER IHOURS ADDRES1.78
INTEGER ILAST ADDRES1.80
INTEGER IREC ADDRES1.82
INTEGER IH,IL,IP,IT GSS3F401.78
INTEGER LWORK_S(N_SUBMODEL_PARTITION_MAX) GSS3F401.79
*IF DEF,MPP GPB1F402.202
INTEGER ICODE ! return from CHANGE_DECOMPOSITION GPB1F402.203
*ENDIF GPB1F402.204
GSS3F401.80
! Local arrays: GSS3F401.81
! Submodel definitions array: stores list of Im_index's GSS3F401.82
! for each submodel partition GSS3F401.83
INTEGER GSS3F401.84
& SM_def(N_SUBMODEL_PARTITION_MAX,N_INTERNAL_MODEL_MAX) GSS3F401.85
ADDRES1.87
! Function and subroutine calls: ADDRES1.88
INTEGER EXPPXI ADDRES1.90
EXTERNAL PRIMARY,EXPPXI ADDRES1.91
ADDRES1.92
!- End of Header ---------------------------------------------------- ADDRES1.93
ADDRES1.94
ADDRES1.95
! 1. Set STASHIN addresses and input lengths for primary fields ADDRES1.96
ADDRES1.97
! The address loop for primary fields is performed for each ADDRES1.98
! internal model in turn. Hence, each internal model's primary ADDRES1.99
! data occupies a contiguous block in D1. The order of these blocks ADDRES1.100
! is the same as the order of the internal models given in the ADDRES1.101
! array INTERNAL_MODEL_LIST. ADDRES1.102
! User-defined prognostics are included in this primary addressing GSS1F400.811
! routine, since they are incorporated into the ppxref lookup GSS1F400.812
! arrays PPXI, PPXC in routine GETPPX. GSS1F400.813
ADDRES1.103
! Initialisation ADDRES1.104
*IF DEF,RECON ADDRES1.105
DO Im_ident= 1,N_INTERNAL_MODEL_MAX GSS3F401.86
NProgItems(Im_ident ) = 0 GSS3F401.87
PrimDataLen(Im_ident ) = 0 GSS3F401.88
DO IITM = 1,PPXREF_ITEMS GSS1F400.816
ProgItems(Im_ident,IITM) = 0 GSS3F401.89
END DO ADDRES1.110
END DO ADDRES1.111
*ENDIF ADDRES1.112
N_OBJ_D1_MAX=0 GSM2F403.91
DO I = 1,N_SUBMODEL_PARTITION GSM2F403.92
N_OBJ_D1(I)=0 GSM2F403.93
ENDDO GSM2F403.94
GSM2F403.95
DO I = 1,N_SUBMODEL_PARTITION_MAX GSS3F401.90
DO J = 1,N_INTERNAL_MODEL_MAX GSS3F401.91
SM_def(I,J) = 0 GSS3F401.92
END DO GSS3F401.93
END DO GSS3F401.94
GSS3F401.95
! Obtain submodel definitions and store in SMdef array GSS3F401.96
DO Im_index = 1,N_INTERNAL_MODEL GSS3F401.97
! Submodel ident. GSS3F401.98
Sm_ident = SUBMODEL_FOR_IM(Im_index) GSS3F401.99
! Internal model index GSS3F401.100
SM_def(Sm_ident,Im_index) = Im_index GSS3F401.101
END DO GSS3F401.102
ADDRES1.113
! Primary address loop ADDRES1.114
GSS1F400.819
! Loop over submodel partitions GSS3F401.103
DO Sm_ident = 1,N_SUBMODEL_PARTITION_MAX GSS3F401.104
GSS3F401.105
C Initialise LEXTRA GSM2F403.96
LEXTRA(Sm_ident)=0 GSM2F403.97
GSM2F403.98
! Initialise address for reconfiguration GSS3F401.106
RADDRESS = 1 GSS3F401.107
GSS3F401.108
! Loop over internal models for each SM partition GSS3F401.109
DO Im_index = 1,N_INTERNAL_MODEL GSS3F401.110
GSS3F401.111
! Test whether current SM contains this IM GSS3F401.112
IF (SM_def(Sm_ident,Im_index).GT.0) THEN GSS3F401.113
GSS3F401.114
! Obtain internal model identifier GSS3F401.115
Im_ident = INTERNAL_MODEL_LIST(Im_index) GSS1F400.820
GPB1F402.205
*IF DEF,MPP GPB1F402.206
! Set the correct decomposition in PARVARS GPB1F402.207
GPB1F402.208
ICODE=0 GPB1F402.209
GPB1F402.210
IF (Im_ident .EQ. A_IM) THEN GPB1F402.211
IF (current_decomp_type .NE. decomp_standard_atmos) GPB1F402.212
& CALL CHANGE_DECOMPOSITION
(decomp_standard_atmos,ICODE) GPB1F402.213
GPB1F402.214
ELSEIF (Im_ident .EQ. O_IM) THEN GPB1F402.215
IF (current_decomp_type .NE. decomp_standard_ocean) GPB1F402.216
& CALL CHANGE_DECOMPOSITION
(decomp_standard_ocean,ICODE) GPB1F402.217
GPB1F402.218
ELSEIF (Im_ident .EQ. S_IM) THEN SCH0F405.16
WRITE(6,*) 'ADDRES1 : Slab model not actually running MPP', SCH0F405.17
& ' but will run on PE0 while atmosphere runs MPP' SCH0F405.18
SCH0F405.19
ELSE ! unsupported decomposition type GPB1F402.219
WRITE(6,*) 'ADDRES1 : Error - Only atmosphere and ocean ', GPB1F402.220
& 'submodels are currently supported for MPP code.' GPB1F402.221
ErrorStatus=-1 GPB1F402.222
CMESSAGE='Unsupported submodel for MPP code' GPB1F402.223
GOTO 9999 GPB1F402.224
ENDIF GPB1F402.225
GPB1F402.226
IF (ICODE .NE. 0) THEN GPB1F402.227
WRITE(6,*) 'ADDRES1 : Error - Could not set decomposition ', GPB1F402.228
& 'for selected submodel.' GPB1F402.229
ErrorStatus=-2 GPB1F402.230
CMESSAGE='Unsupported decomposition selected for MPP code' GPB1F402.231
GOTO 9999 GPB1F402.232
ENDIF GPB1F402.233
GPB1F402.234
*ENDIF GPB1F402.235
GSS3F401.116
! Initialise primary data lengths for TYPSIZE GSS3F401.117
IF (Im_ident.EQ.A_IM) A_PROG_LEN=0 GSS3F401.118
IF (Im_ident.EQ.O_IM) O_PROG_LEN=0 GSS3F401.119
IF (Im_ident.EQ.S_IM) S_PROG_LEN=0 GSS3F401.120
IF (Im_ident.EQ.W_IM) W_PROG_LEN=0 GSS3F401.121
IF (Im_ident.EQ.A_IM) A_PROG_LOOKUP=0 GSS3F401.122
IF (Im_ident.EQ.O_IM) O_PROG_LOOKUP=0 GSS3F401.123
IF (Im_ident.EQ.S_IM) S_PROG_LOOKUP=0 GSS3F401.124
IF (Im_ident.EQ.W_IM) W_PROG_LOOKUP=0 GSS3F401.125
*IF DEF,RECON GSS1F400.821
IF(Im_ident.EQ.SUBMODEL_IDENT.OR.Im_ident.EQ.SLAB_IM)THEN GSS3F401.126
*ENDIF GSS1F400.823
PIrow = 0 ADDRES1.122
ISEC = 0 ADDRES1.123
! Loop over section zero items GSS3F401.127
DO IITM = 1,PPXREF_ITEMS ADDRES1.124
! Check whether there is a primary field corresponding ADDRES1.126
! to this item number ADDRES1.127
*IF DEF,RECON GSS1F400.824
IF (PPXPTR(Im_ident,ISEC,IITM).NE.0) THEN GSS1F400.825
*ELSE GSS1F400.826
IF (PPXPTR(Im_index,ISEC,IITM).NE.0) THEN GSS1F400.827
*ENDIF GSS1F400.828
VMSK = EXPPXI
(Im_ident,ISEC,IITM,ppx_version_mask , GSS1F400.829
*CALL ARGPPX
ADDRES1.131
& ErrorStatus,CMESSAGE) ADDRES1.132
ISPACE = EXPPXI
(Im_ident,ISEC,IITM,ppx_space_code , GSS1F400.830
*CALL ARGPPX
ADDRES1.134
& ErrorStatus,CMESSAGE) ADDRES1.135
IGP = EXPPXI
(Im_ident,ISEC,IITM,ppx_grid_type , GSS1F400.831
*CALL ARGPPX
ADDRES1.137
& ErrorStatus,CMESSAGE) ADDRES1.138
ILEV = EXPPXI
(Im_ident,ISEC,IITM,ppx_lv_code , GSS1F400.832
*CALL ARGPPX
ADDRES1.140
& ErrorStatus,CMESSAGE) ADDRES1.141
IBOT = EXPPXI
(Im_ident,ISEC,IITM,ppx_lb_code , GSS1F400.833
*CALL ARGPPX
ADDRES1.143
& ErrorStatus,CMESSAGE) ADDRES1.144
ITOP = EXPPXI
(Im_ident,ISEC,IITM,ppx_lt_code , GSS1F400.834
*CALL ARGPPX
ADDRES1.146
& ErrorStatus,CMESSAGE) ADDRES1.147
DO I=1,4 GSS3F401.128
IOPN(I) = EXPPXI
(Im_ident,ISEC,IITM,ppx_opt_code+I-1 , GSS3F401.129
*CALL ARGPPX
ADDRES1.149
& ErrorStatus,CMESSAGE) ADDRES1.150
END DO GSS3F401.130
IFLAG = EXPPXI
(Im_ident,ISEC,IITM,ppx_lev_flag , GSS3F401.131
*CALL ARGPPX
GSS3F401.132
& ErrorStatus,CMESSAGE) GSS3F401.133
IPSEUDO = EXPPXI
(Im_ident,ISEC,IITM,ppx_pt_code , GSS3F401.134
*CALL ARGPPX
GSS3F401.135
& ErrorStatus,CMESSAGE) GSS3F401.136
IPFIRST = EXPPXI
(Im_ident,ISEC,IITM,ppx_pf_code , GSS3F401.137
*CALL ARGPPX
GSS3F401.138
& ErrorStatus,CMESSAGE) GSS3F401.139
IPLAST = EXPPXI
(Im_ident,ISEC,IITM,ppx_pl_code , GSS3F401.140
*CALL ARGPPX
GSS3F401.141
& ErrorStatus,CMESSAGE) GSS3F401.142
IF((ISPACE.EQ.2).OR.(ISPACE.EQ.3).OR.(ISPACE.EQ.9) GSM2F403.99
*IF -DEF,RECON ADDRES1.153
& .OR.(ISPACE.EQ.4) ADDRES1.154
*ENDIF ADDRES1.155
& .OR.(ISPACE.EQ.5) GSS1F403.38
& .OR.(ISPACE.EQ.10) GSM4F404.2
& .OR.(ISPACE.EQ.8)) THEN ! Primary variable GSS1F403.39
CALL PRIMARY
(IITM,Im_index,Im_ident,Sm_ident, GSS3F401.143
& RLEVS,RADDRESS,PIrow,ErrorStatus,CMESSAGE) GSS3F401.144
END IF ADDRES1.159
END IF ! PPXPTR(m,s,i) .ne. 0 ADDRES1.160
END DO ! Loop over items ADDRES1.161
*IF DEF,RECON GSS1F400.838
END IF GSS3F401.145
*ENDIF GSS1F400.840
END IF ! test whether SM contains IM GSS3F401.146
END DO ! Loop over Im_index GSS3F401.147
END DO ! Loop over SM partitions GSS3F401.148
ADDRES1.175
*IF DEF,RECON ADDRES1.176
! No. of levels & primary data lengths for reconfiguration GSS3F401.149
DO I=1,N_INTERNAL_MODEL_MAX GSS3F401.150
DumpProgLevs(I) = NHEAD (I) GSS3F401.151
PrimDataLen (I) = LPrimIM(I) GSS3F401.152
END DO GSS3F401.153
*ENDIF ADDRES1.184
*IF -DEF,RECON ADDRES1.186
! LOOKUP array lengths for TYPSIZE GSS3F401.154
A_PROG_LOOKUP = NHEAD(A_IM) GSS3F401.155
O_PROG_LOOKUP = NHEAD(O_IM) GSS3F401.156
S_PROG_LOOKUP = NHEAD(S_IM) GSS3F401.157
W_PROG_LOOKUP = NHEAD(W_IM) GSS3F401.158
! Primary data lengths for TYPSIZE GSS3F401.159
A_PROG_LEN = LPrimIM(A_IM) GSS3F401.160
O_PROG_LEN = LPrimIM(O_IM) GSS3F401.161
S_PROG_LEN = LPrimIM(S_IM) GSS3F401.162
W_PROG_LEN = LPrimIM(W_IM) GSS3F401.163
WRITE(6,*) ' ADDRES : A_PROG_LOOKUP = ',A_PROG_LOOKUP ADDRES1.192
WRITE(6,*) ' ADDRES : A_PROG_LEN = ',A_PROG_LEN ADDRES1.193
WRITE(6,*) ' ADDRES : S_PROG_LOOKUP = ',S_PROG_LOOKUP GSS1F400.844
WRITE(6,*) ' ADDRES : S_PROG_LEN = ',S_PROG_LEN GSS1F400.845
WRITE(6,*) ' ADDRES : O_PROG_LOOKUP = ',O_PROG_LOOKUP ADDRES1.194
WRITE(6,*) ' ADDRES : O_PROG_LEN = ',O_PROG_LEN ADDRES1.195
WRITE(6,*) ' ADDRES : W_PROG_LOOKUP = ',W_PROG_LOOKUP GSS3F401.164
WRITE(6,*) ' ADDRES : W_PROG_LEN = ',W_PROG_LEN GSS3F401.165
*ENDIF ADDRES1.196
ADDRES1.197
*IF -DEF,RECON ADDRES1.198
! 2. Loop through stash list to set output addresses and ADDRES1.201
! header positions for diagnostics ADDRES1.202
DO IREC=1,NRECS ADDRES1.204
ADDRES1.205
! Read internal model number from stash list. Stash list has already GSS3F401.166
! been ordered by internal model, section, item. Thus, all the atmos ADDRES1.207
! diagnostic addressing will be done first, followed by the slab ADDRES1.208
! addressing in the case of a slab model. ADDRES1.209
Im_ident = LIST_S(st_model_code,IREC) GSS1F400.846
! Obtain submodel partition id. GSS3F401.167
Sm_ident = SUBMODEL_PARTITION_INDEX(Im_ident) GSS3F401.168
ADDRES1.211
! Set output address relative to D1 ADDRES1.212
IF(LIST_S(st_output_code,IREC).EQ.1) THEN ADDRES1.213
ADDRES1.214
! Diagnostic output to dump rather than direct output pp file ADDRES1.215
! Add the output length for this diag to LDUMP; total length of GSS3F401.169
! dump so far = LPRIM + LDUMP; hence obtain the start address for GSS3F401.170
! the output from the next diagnostic to be stored in dump. GSS3F401.171
ADDRES1.219
LIST_S(st_output_addr,IREC) GSS3F401.172
& = LPRIM(Sm_ident)+LDUMP(Sm_ident)+1 GSS3F401.173
C Information for preliminary D1 addressing array GSM2F403.100
N_OBJ_D1(Sm_ident) =N_OBJ_D1(Sm_ident)+1 GSM2F403.101
IF (N_OBJ_D1(Sm_ident).LE.MAX_D1_LEN)THEN GSM2F403.102
D1_PADDR(d1_type,N_OBJ_D1(Sm_ident),Sm_ident)=diag GSM2F403.103
D1_PADDR(d1_im,N_OBJ_D1(Sm_ident),Sm_ident)=Im_ident GSM2F403.104
D1_PADDR(d1_extra_info,N_OBJ_D1(Sm_ident),Sm_ident)=IREC GSM2F403.105
ENDIF GSM2F403.106
*IF DEF,MPP GPB1F402.236
LIST_S(st_dump_output_addr,IREC)= GPB1F402.237
& global_LPRIM(Sm_ident)+global_LDUMP(Sm_ident)+1 GPB1F402.238
*ENDIF GPB1F402.239
LDUMP(Sm_ident) GSS3F401.174
& = LDUMP(Sm_ident)+LIST_S(st_output_length,IREC) GSS3F401.175
LDumpIM(Im_ident) GSS3F401.176
& = LDumpIM(Im_ident)+LIST_S(st_output_length,IREC) GSS3F401.177
*IF DEF,MPP GPB1F402.240
global_LDUMP(Sm_ident)= GPB1F402.241
& global_LDUMP(Sm_ident)+LIST_S(st_dump_output_length,IREC) GPB1F402.242
global_LDUMPIM(Sm_ident)= GPB1F402.243
& global_LDUMPIM(Im_ident)+LIST_S(st_dump_output_length,IREC) GPB1F402.244
*ENDIF GPB1F402.245
ADDRES1.232
IF(LIST_S(st_output_bottom,IREC).EQ.100) THEN ADDRES1.233
! Special levels ADDRES1.234
RLEVS=1 ADDRES1.235
ELSE IF(LIST_S(st_series_ptr,IREC).NE.0) THEN ADDRES1.236
! Time series domain ADDRES1.237
RLEVS=1 ADDRES1.238
ELSE IF(LIST_S(st_gridpoint_code,IREC).GE.10 ADDRES1.239
& .AND.LIST_S(st_gridpoint_code,IREC).LT.20) THEN ADDRES1.240
! Vertical ave. ADDRES1.241
RLEVS=1 ADDRES1.242
ELSE IF(LIST_S(st_output_bottom,IREC).LT.0) THEN ADDRES1.243
! Levels list ADDRES1.244
RLEVS=LEVLST_S(1,-LIST_S(st_output_bottom,IREC)) ADDRES1.245
ELSE ADDRES1.246
! Range of model levels ADDRES1.247
RLEVS=LIST_S(st_output_top ,IREC) ADDRES1.248
& -LIST_S(st_output_bottom,IREC)+1 ADDRES1.249
END IF ADDRES1.250
ADDRES1.251
IF (LIST_S(st_pseudo_out,IREC).GT.0) THEN ADDRES1.252
! Pseudo levels ADDRES1.253
RLEVS=RLEVS*LENPLST(LIST_S(st_pseudo_out,IREC)) ADDRES1.254
END IF ADDRES1.255
ADDRES1.256
! Set position of pp lookup header in the dump ADDRES1.257
LIST_S(st_lookup_ptr,IREC)=NHeadSub(Sm_ident)+1 GSS3F401.178
ADDRES1.258
! Increment NHEAD (there is one pp header for each level at GSS3F401.179
! which a diagnostic is output GSS3F401.180
NHEAD (Im_ident)=NHEAD (Im_ident)+RLEVS GSS3F401.181
NHeadSub(Sm_ident)=NHeadSub(Sm_ident)+RLEVS GSS3F401.182
ADDRES1.276
ELSE IF(LIST_S(st_output_code,IREC).EQ.2) THEN ADDRES1.277
ADDRES1.278
! Secondary data in D1. ADDRES1.279
! Compute and store secondary data lengths. Start address for ADDRES1.280
! secondary data is determined below, after total dump ADDRES1.281
! diagnostic length has been found. ADDRES1.282
ADDRES1.283
LIST_S(st_output_addr,IREC)=LSECD(Sm_ident)+1 GSS3F401.183
LSECD(Sm_ident) GSS3F401.184
& =LSECD(Sm_ident)+LIST_S(st_output_length,IREC) GSS3F401.185
LSecdIM(Im_ident) GSS3F401.186
& =LSecdIM(Im_ident)+LIST_S(st_output_length,IREC) GSS3F401.187
! Set pointer for pp header GSS3F401.188
LIST_S(st_lookup_ptr,IREC)=-1 GSS3F401.189
ADDRES1.294
ELSE IF(LIST_S(st_output_code,IREC).LT.0) THEN ADDRES1.297
ADDRES1.298
! Diagnostic output to PP file ADDRES1.299
ADDRES1.300
! Compute no. of pp headers for this diagnostic ADDRES1.301
! = output levels * pseudo output levels * output times ADDRES1.302
ADDRES1.303
! No. of levels ADDRES1.304
IF(LIST_S(st_output_bottom,IREC).EQ.100) THEN ADDRES1.305
! Special levels ADDRES1.306
IL=1 ADDRES1.307
ELSE IF(LIST_S(st_series_ptr,IREC).NE.0) THEN ADDRES1.308
! Time series dom ADDRES1.309
IL=1 ADDRES1.310
ELSE IF(LIST_S(st_gridpoint_code,IREC).GE.10 ADDRES1.311
& .AND.LIST_S(st_gridpoint_code,IREC).LT.20) THEN ADDRES1.312
! Vertical average ADDRES1.313
IL=1 ADDRES1.314
ELSE IF(LIST_S(st_output_bottom,IREC).LT.0) THEN ADDRES1.315
! Levels list ADDRES1.316
IL=LEVLST_S(1,-LIST_S(st_output_bottom,IREC)) ADDRES1.317
ELSE ADDRES1.318
! Range of mod levs ADDRES1.319
IL=LIST_S(st_output_top,IREC) ADDRES1.320
& -LIST_S(st_output_bottom,IREC)+1 ADDRES1.321
END IF ADDRES1.322
ADDRES1.323
! No. of pseudo levels ADDRES1.324
IF (LIST_S(st_pseudo_out,IREC).GT.0) THEN ADDRES1.325
IP=LENPLST(LIST_S(st_pseudo_out,IREC)) ADDRES1.326
ELSE ADDRES1.327
IP=1 ADDRES1.328
END IF ADDRES1.329
ADDRES1.330
! No. of output times ADDRES1.331
IF(LIST_S(st_freq_code,IREC).GT.0) THEN ADDRES1.332
IFIRST=LIST_S(st_start_time_code,IREC) ADDRES1.334
IFREQ =LIST_S(st_freq_code ,IREC) ADDRES1.335
IF(LIST_S(st_end_time_code,IREC).EQ.-1) THEN ADDRES1.337
! Output to continues to end of run ADDRES1.338
IHOURS=1+8760*RUN_TARGET_END(1) ADDRES1.339
& + 744*RUN_TARGET_END(2) ADDRES1.340
& + 24*RUN_TARGET_END(3) ADDRES1.341
& + RUN_TARGET_END(4) ADDRES1.342
ILAST=TOTIMP
(IHOURS,'H ',Im_ident) GSS3F401.190
if (ILAST .eq. -999) then GDW1F404.232
errorStatus = 1 GDW1F404.233
cmessage = 'TOTIMP:UNEXPECTED TIME UNIT or GDW1F404.234
& IRREGULAR DUMPS FOR DUMP FREQUENCY' GDW1F404.235
GOTO 9999 GDW1F404.236
endif GDW1F404.237
ELSE ADDRES1.352
! Last output time before end of run ADDRES1.353
ILAST=LIST_S(st_end_time_code,IREC) ADDRES1.354
END IF ADDRES1.356
ADDRES1.357
IT= 1 + (ILAST-IFIRST)/IFREQ ADDRES1.358
IF (IT.LT.0) THEN ADDRES1.360
IT=0 ADDRES1.361
WRITE(6,*) GSS3F401.191
& ' Output time error detected in routine ADDRESS:' GSS3F401.192
WRITE(6,*) GSS3F401.193
& ' Output time starts after specified end of run' GSS3F401.194
WRITE(6,*) GSS3F401.195
& ' STASH record no.,MODEL,SECTION,ITEM as follows: ', GSS3F401.196
& IREC, LIST_S(st_model_code,IREC), ADDRES1.365
& LIST_S(st_sect_code ,IREC), ADDRES1.366
& LIST_S(st_item_code ,IREC) ADDRES1.367
WRITE(6,*) 'OUTPUT CODE: ', GSS3F401.197
& LIST_S(st_output_code,IREC) GSS3F401.198
END IF ADDRES1.369
ELSE GSS3F401.199
! Times table in STASH_times array GSS3F401.200
IT=1 ADDRES1.373
DO I=1,NTIMEP ADDRES1.374
IF (ITIM_S(I,-LIST_S(st_freq_code,IREC)).EQ.-1) THEN ADDRES1.375
IT=I-1 ADDRES1.376
GOTO 260 ADDRES1.377
END IF ADDRES1.378
END DO ADDRES1.379
260 CONTINUE ADDRES1.380
END IF ADDRES1.382
! No. of output "headers" - (levels)*(pseudo-levels)*(output times) ADDRES1.383
IH=IL*IP*IT ADDRES1.384
! Assign output unit no. (nn) to (st_output_addr) ADDRES1.385
LIST_S(st_output_addr,IREC)=-LIST_S(st_output_code,IREC) ADDRES1.386
! Assign no. of output headers to NHEAD_FILE(nn) ADDRES1.387
NHEAD_FILE(LIST_S(st_output_addr,IREC))= ADDRES1.388
& NHEAD_FILE(LIST_S(st_output_addr,IREC)) + IH ADDRES1.389
ELSE IF (LIST_S(st_output_code,IREC).EQ.0) THEN ADDRES1.390
! Inactive record, not output ADDRES1.392
LIST_S(st_output_addr,IREC)=-LIST_S(st_output_code,IREC) ADDRES1.393
ELSE ADDRES1.395
WRITE(6,*) 'ERROR detected in routine ADDRESS ' GSS3F401.201
WRITE(6,*) 'ILLEGAL OUTPUT CODE FOR STASH RECORD ' GSS3F401.202
WRITE(6,*) GSS3F401.203
& ' STASH record no.,MODEL,SECTION,ITEM as follows: ', GSS3F401.204
& IREC, LIST_S(st_model_code,IREC), GSS3F401.205
& LIST_S(st_sect_code ,IREC), GSS3F401.206
& LIST_S(st_item_code ,IREC) GSS3F401.207
END IF ADDRES1.400
ADDRES1.401
END DO ! End of loop over records for D1 addressing ADDRES1.402
ADDRES1.403
ADDRES1.404
C Correct the addressing of SPACE=9 items from being relative GSM2F403.107
C to start of LEXTRA space to being relative to start of dump GSM2F403.108
GSM2F403.109
C Loop over submodel partitions GSM2F403.110
DO Sm_ident = 1,N_SUBMODEL_PARTITION_MAX GSM2F403.111
GSM2F403.112
C Loop over internal models for each SM partition GSM2F403.113
DO Im_index = 1,N_INTERNAL_MODEL GSM2F403.114
GSM2F403.115
C Test whether current SM contains this IM GSM2F403.116
IF (SM_def(Sm_ident,Im_index).GT.0) THEN GSM2F403.117
GSM2F403.118
C Obtain internal model identifier GSM2F403.119
Im_ident = INTERNAL_MODEL_LIST(Im_index) GSM2F403.120
GSM2F403.121
DO IITM = 1,PPXREF_ITEMS GSM2F403.122
C Check whether there is a primary field corresponding GSM2F403.123
*IF DEF,RECON GSM2F403.124
IF (PPXPTR(Im_ident,ISEC,IITM).NE.0) THEN GSM2F403.125
*ELSE GSM2F403.126
IF (PPXPTR(Im_index,ISEC,IITM).NE.0) THEN GSM2F403.127
*ENDIF GSM2F403.128
ISPACE = EXPPXI
(Im_ident,ISEC,IITM,ppx_space_code, GSM2F403.129
*CALL ARGPPX
GSM2F403.130
& ErrorStatus,CMESSAGE) GSM2F403.131
IF (IN_S(1,Im_ident,0,IITM).ne.0 ! item is active ARB1F404.6
& .and. ISPACE.EQ.9) THEN ARB1F404.7
IN_S(1,Im_ident,0,IITM)=IN_S(1,Im_ident,0,IITM)+ GSM2F403.133
& LPRIM(Sm_ident)+LDUMP(Sm_ident) GSM2F403.134
IF (Im_ident.EQ.O_IM) THEN GSM2F403.135
IN_S(1,Im_ident,0,IITM)=IN_S(1,Im_ident,0,IITM) GSM2F403.136
& +LPRIM_O2 GSM2F403.137
ENDIF GSM2F403.138
ENDIF GSM2F403.139
ENDIF GSM2F403.140
ENDDO GSM2F403.141
ENDIF GSM2F403.142
ENDDO GSM2F403.143
ENDDO GSM2F403.144
GSM2F403.145
GSM2F403.146
! Set secondary data addresses relative to start of D1 ADDRES1.405
DO IREC=1,NRECS ADDRES1.406
Im_ident = LIST_S(st_model_code,IREC) GSS1F400.867
Sm_ident = SUBMODEL_PARTITION_INDEX(Im_ident) GSS3F401.208
ADDRES1.409
IF (LIST_S(st_output_code,IREC).EQ.2) THEN ADDRES1.410
LIST_S(st_output_addr,IREC) =LIST_S(st_output_addr,IREC) GSS3F401.209
& + LPRIM(Sm_ident)+LDUMP(Sm_ident)+LEXTRA(Sm_ident) GSS3F401.210
C Information for preliminary D1 addressing array GSM2F403.147
N_OBJ_D1(Sm_ident) =N_OBJ_D1(Sm_ident)+1 GSM2F403.148
IF (N_OBJ_D1(Sm_ident).LE.MAX_D1_LEN)THEN GSM2F403.149
D1_PADDR(d1_type,N_OBJ_D1(Sm_ident),Sm_ident)=seco GSM2F403.150
D1_PADDR(d1_im,N_OBJ_D1(Sm_ident),Sm_ident)=Im_ident GSM2F403.151
D1_PADDR(d1_extra_info,N_OBJ_D1(Sm_ident),Sm_ident)=IREC GSM2F403.152
ENDIF GSM2F403.153
IF (Im_ident.EQ.O_IM) THEN GSS3F401.211
LIST_S(st_output_addr,IREC)=LIST_S(st_output_addr,IREC) GSS3F401.212
& + LPRIM_O2 GSS3F401.213
END IF ADDRES1.425
END IF ADDRES1.426
END DO ADDRES1.427
ADDRES1.428
! 3. Set input addresses and work lengths for non-primary ADDRES1.430
! fields (i.e., ISPACE=0,1,6 or 7) GSS3F401.214
DO Im_ident=1,N_INTERNAL_MODEL_MAX GSS1F400.871
Sm_ident= SUBMODEL_PARTITION_INDEX(Im_ident) GSS3F401.215
DO ISEC =0,PPXREF_SECTIONS GSS1F400.872
! Re-initialise sectional work lengths GSS3F401.216
DO I=1,N_SUBMODEL_PARTITION_MAX GSS3F401.217
LWORK_S(I)=0 GSS3F401.218
END DO GSS3F401.219
DO IITM =1,PPXREF_ITEMS GSS1F400.876
IF(INDX_S(2,Im_ident,ISEC,IITM).GT.0) THEN GSS1F400.877
! Item in STASH list GSS1F400.878
! Obtain space code & section zero point-back code GSS3F401.220
! from ppxref lookup array GSS3F401.221
ISPACE = EXPPXI
(Im_ident,ISEC,IITM,ppx_space_code , GSS1F400.879
*CALL ARGPPX
ADDRES1.447
& ErrorStatus,CMESSAGE) ADDRES1.448
PTR_PROG= EXPPXI
(Im_ident,ISEC,IITM,ppx_ptr_code , GSS1F400.880
*CALL ARGPPX
ADDRES1.450
& ErrorStatus,CMESSAGE) ADDRES1.451
IF ( (ISPACE.EQ.0).OR.(ISPACE.EQ.1).OR. GSS1F403.40
& (ISPACE.EQ.6).OR.(ISPACE.EQ.7) ) THEN GSS1F403.41
! Compute length of work space required ADDRES1.455
IF (ISPACE.NE.7) THEN ADDRES1.457
! STASH_WORK address & length GSS3F401.222
IN_S(1,Im_ident,ISEC,IITM)=LWORK_S(Sm_ident)+1 GSS3F401.223
LWORK_S(Sm_ident)=LWORK_S(Sm_ident) GSS3F401.224
& +IN_S(2,Im_ident,ISEC,IITM) GSS3F401.225
ELSE ADDRES1.470
! Point-back to primary space in section 0 GSS3F401.226
IN_S(1,Im_ident,ISEC,IITM ) GSS3F401.227
& =IN_S(1,Im_ident,0 ,PTR_PROG) GSS3F401.228
IN_S(2,Im_ident,ISEC,IITM ) GSS1F400.892
& =IN_S(2,Im_ident,0 ,PTR_PROG) GSS1F400.893
END IF ADDRES1.475
END IF ADDRES1.476
END IF ADDRES1.477
END DO ! Items ADDRES1.479
ADDRES1.480
! Find max sectional work length for each submodel partition GSS3F401.229
DO I=1,N_SUBMODEL_PARTITION_MAX GSS3F401.230
LWORK(I)=MAX(LWORK(I),LWORK_S(I)) GSS3F401.231
END DO GSS3F401.232
ADDRES1.486
END DO ! Sections ADDRES1.487
IF(Sm_ident.NE.0)THEN GSM2F403.154
C Save the maximum value for dimensioning full D1 address array GSM2F403.155
N_OBJ_D1_MAX=MAX(N_OBJ_D1_MAX,N_OBJ_D1(Sm_ident)) GSM2F403.156
WRITE(6,*)N_OBJ_D1(Sm_ident),' D1 items in submodel ',Sm_ident GSM2F403.157
ENDIF GSM2F403.158
END DO ! Models ADDRES1.488
IF(N_OBJ_D1_MAX.GT.MAX_D1_LEN)THEN GSM2F403.159
WRITE(6,*)'ADDRES1: No of items in D1 exceeds maximum allowed:' GSM2F403.160
WRITE(6,*)'Number allowed ',MAX_D1_LEN,' Number requested ' GSM2F403.161
& ,N_OBJ_D1_MAX GSM2F403.162
WRITE(6,*)'Modify the COMDECK STEXTEND to increase' GSM2F403.163
WRITE(6,*)'MAX_D1_LEN parameter as required' GSM2F403.164
WRITE(6,*)'Such a change can be safely made' GSM2F403.165
CMESSAGE='ADDRES1: No of D1 items exceeds max: See output' GSM2F403.166
ErrorStatus=1 GSM2F403.167
ENDIF GSM2F403.168
*ENDIF ADDRES1.491
ADDRES1.492
9999 CONTINUE GPB1F402.246
RETURN ADDRES1.493
END ADDRES1.494
ADDRES1.495
!- End of subroutine code ------------------------------------------- ADDRES1.496
ADDRES1.497
ADDRES1.498
!+Compute data lengths and addresses for primary fields GSS3F401.233
! Subroutine Interface: ADDRES1.500
SUBROUTINE PRIMARY(IITM,Im_index,Im_ident,Sm_ident, 1,11GSS3F401.234
& RLEVS,RADDRESS,PIrow,ErrorStatus,CMESSAGE) GSS3F401.235
IMPLICIT NONE ADDRES1.504
! Description: ADDRES1.505
! ADDRES1.506
! Method: ADDRES1.507
! ADDRES1.508
! Current code owner: S.J.Swarbrick ADDRES1.509
! ADDRES1.510
! History: ADDRES1.511
! Version Date Comment ADDRES1.512
! ======= ==== ======= ADDRES1.513
! 3.5 Apr. 95 Original code. S.J.Swarbrick ADDRES1.514
! 4.0 Oct. 95 S.J.Swarbrick GSS3F401.236
! 4.1 Apr. 96 Generalisation GSS3F401.237
! of routine S.J.Swarbrick GSS3F401.238
! 4.2 28/11/96 MPP code : Added calculation of global (dump) GPB1F402.247
! lengths GPB1F402.248
! Generalise code for dual-time level prognostics GSS1F403.36
! S.J.Swarbrick GSS1F403.37
! ADDRES1.515
! Code description: ADDRES1.516
! FORTRAN 77 + common Fortran 90 extensions. ADDRES1.517
! Written to UM programming standards version 7. ADDRES1.518
! ADDRES1.519
! System component covered: ADDRES1.520
! System task: Sub-Models Project ADDRES1.521
! ADDRES1.522
! Global variables: ADDRES1.523
*CALL CSUBMODL
ADDRES1.525
*CALL VERSION
ADDRES1.526
*CALL TYPSIZE
GSS3F401.239
*CALL MODEL
ADDRES1.527
*CALL CSTASH
GRB0F401.4
*CALL STEXTEND
ADDRES1.529
*IF DEF,RECON ADDRES1.530
*CALL NRECON
ADDRES1.531
*ENDIF ADDRES1.532
*IF DEF,MPP GPB1F402.249
*CALL PARPARM
GPB1F402.250
*ENDIF GPB1F402.251
ADDRES1.533
! Subroutine arguments: ADDRES1.534
! Scalar arguments with intent(in): GSS3F401.240
INTEGER IITM ! Current section 0 item number GSS1F400.896
INTEGER Im_ident ! Current internal model number GSS1F400.897
INTEGER Im_index ! Current position in internal model list GSS1F400.898
INTEGER Sm_ident ! Submodel identifier (absolute) GSS3F401.241
! Scalar arguments with intent(out): GSS3F401.242
CHARACTER*80 CMESSAGE GSS3F401.243
ADDRES1.543
! ErrorStatus: ADDRES1.544
INTEGER ErrorStatus ADDRES1.545
ADDRES1.546
! Local scalars: ADDRES1.547
LOGICAL MODEL_LEV GSS3F401.244
LOGICAL LADDR ADDRES1.549
LOGICAL LMASK ADDRES1.550
INTEGER RLEVS ! No. of levels for reconfiguration GSS3F401.245
INTEGER DLEVS ! No of levels inc pseudo levels GSM2F403.169
INTEGER RPLEVS ! & of pseudo-levels AWI1F403.101
INTEGER RADDRESS ! Address for reconfiguration GSS3F401.246
INTEGER I ADDRES1.554
INTEGER IL1,IL2 GSS3F401.247
INTEGER IPL1,IPL2 GSS3F401.248
INTEGER LEN ! Data length for primary field GSS3F401.249
*IF DEF,MPP GPB1F402.252
INTEGER global_LEN ! Global data length for primary field GPB1F402.253
*ENDIF GPB1F402.254
INTEGER PIrow ! Counter for ProgItems array GSS3F401.250
ADDRES1.559
LOGICAL VAR_RECON UIE2F404.120
! Function and subroutine calls: ADDRES1.560
LOGICAL DISCT_LEV GSS3F401.251
EXTERNAL TSTMSK,ADDRLN,LEVCOD,OCNVOL ADDRES1.562
ADDRES1.563
!- End of Header --------------------------------------------------- ADDRES1.564
ADDRES1.565
! Find out whether the primary is included for this version GSS3F401.252
CALL TSTMSK
(Im_ident,0,LMASK,LADDR,ErrorStatus,CMESSAGE) GSS3F401.253
IF (LADDR) THEN ADDRES1.568
IF (ISPACE.EQ.10) THEN GSM4F404.3
! Space code 10 means: no space is required for this item in D1 or GSM4F404.4
! the dump, but stashmaster data is required, so an "address" of GSM4F404.5
! -1 is set to ensure that the corresponding record will be read GSM4F404.6
! into PPXI in routine GET_PPX_PART (called by U_MODEL). GSM4F404.7
IN_S(1,Im_ident,0,IITM)=-1 GSM4F404.8
ELSE GSM4F404.9
ADDRES1.570
! Start address for model levels in PP array GSS3F401.254
PPIND_S(Im_ident,IITM) = NHEAD(Im_ident)+1 GSS3F401.255
GSS3F401.256
! Find address length per level GSS3F401.257
*IF -DEF,MPP GPB1F402.255
CALL ADDRLN
(IGP,LEN,ErrorStatus) GSS3F401.258
*ELSE GPB1F402.256
CALL ADDRLN
(IGP,LEN,local_data,ErrorStatus) GPB1F402.257
CALL ADDRLN
(IGP,global_LEN,global_dump_data,ErrorStatus) GPB1F402.258
*ENDIF GPB1F402.259
GSS3F401.259
MODEL_LEV=DISCT_LEV
(ILEV,ErrorStatus,CMESSAGE) GSS3F401.260
IF (MODEL_LEV .OR.(ILEV.EQ.5 .AND. IPSEUDO.NE.0)) THEN GSS1F403.42
! Field has model levels - decode level codes GSS3F401.262
IF (ILEV .NE. 5) THEN GSS1F403.43
CALL LEVCOD
(IBOT,IL1,ErrorStatus,CMESSAGE) GSS3F401.263
CALL LEVCOD
(ITOP,IL2,ErrorStatus,CMESSAGE) GSS3F401.264
ELSE GSS1F403.44
IL1=1 GSS1F403.45
IL2=1 GSS1F403.46
END IF GSS1F403.47
! No. of model levels (for reconfiguration) GSS3F401.265
RLEVS=IL2-IL1+1 GSS3F401.266
! No. of model levels for D1 addressing GSM2F403.170
DLEVS=RLEVS GSM2F403.171
! Initialise first & last pseudo level indices GSS3F401.267
IPL1 =0 GSS3F401.268
IPL2 =0 GSS3F401.269
IF (IFLAG.EQ.0.AND.IPSEUDO.NE.0) THEN GSS3F401.270
! Primary with input on all available pseudo levels - GSS3F401.271
! decode pseudo level codes GSS3F401.272
CALL PSLEVCOD
(IPFIRST,IPL1,'F',ErrorStatus,CMESSAGE) GSS3F401.273
CALL PSLEVCOD
(IPLAST ,IPL2,'L',ErrorStatus,CMESSAGE) GSS3F401.274
DLEVS=DLEVS*(IPL2-IPL1+1) GSM2F403.172
END IF GSS3F401.275
RPLEVS=IPL2-IPL1+1 AWI1F403.102
! Multiply length per level by no. of levels GSS3F401.276
IF(LEN.EQ.-1) THEN !Grid codes 31,32 GSS3F401.277
CALL OCNVOL
(LEN,IL1,IL2) GSS3F401.278
*IF DEF,MPP GPB1F402.260
CALL OCNVOL
(global_LEN,IL1,IL2) GPB1F402.261
*ENDIF GPB1F402.262
ELSE GSS3F401.279
LEN=LEN*(IL2-IL1+1)*(IPL2-IPL1+1) GSS3F401.280
*IF DEF,MPP GPB1F402.263
global_LEN=global_LEN*(IL2-IL1+1)*(IPL2-IPL1+1) GPB1F402.264
*ENDIF GPB1F402.265
END IF GSS3F401.281
IF (ISPACE.NE.4.AND.ISPACE.NE.9) THEN GSM2F403.173
! Increment no. of headers GSS3F401.283
NHEAD (Im_ident)= NHEAD(Im_ident) GSS3F401.284
& +(IL2-IL1+1)*(IPL2-IPL1+1) GSS3F401.285
NHeadSub(Sm_ident)=NHeadSub(Sm_ident) GSS3F401.286
& +(IL2-IL1+1)*(IPL2-IPL1+1) GSS3F401.287
END IF GSS3F401.288
ELSE GSS3F401.289
! Not model levels GSS3F401.290
RLEVS=1 GSS3F401.291
DLEVS=1 GSM2F403.174
RPLEVS=1 AWI1F403.103
IF (ISPACE.NE.4.AND.ISPACE.NE.9) THEN GDG0F404.3
NHEAD (Im_ident)=NHEAD (Im_ident)+1 GSS3F401.293
NHeadSub(Sm_ident)=NHeadSub(Sm_ident)+1 GSS3F401.294
END IF GSS3F401.295
END IF ADDRES1.577
ADDRES1.578
! The input start address for primary (m,0,i) is assigned GSS3F401.296
! to IN_S(1,m,0,i). GSS3F401.297
! Addresses are set relative to the beginning of the primary data, ADDRES1.620
! since the primary data starts at the beginning of D1. ADDRES1.621
*IF -DEF,RECON ADDRES1.622
IF(ISPACE.NE.5) THEN ADDRES1.623
*ENDIF ADDRES1.624
IF(ISPACE.NE.9) THEN GSM2F403.175
! Start address for this primary field GSS3F401.298
IN_S(1,Im_ident,0,IITM)=LPRIM(Sm_ident)+1 GSS3F401.299
! Increment LPRIM by LEN (=data length for this primary field) GSS3F401.300
LPRIM (Sm_ident) =LPRIM (Sm_ident)+LEN GSS3F401.301
LPrimIM(Im_ident) =LPrimIM(Im_ident)+LEN GSS3F401.302
C Information for preliminary D1 addressing array GSM2F403.176
N_OBJ_D1(Sm_ident) =N_OBJ_D1(Sm_ident)+1 GSM2F403.177
IF (N_OBJ_D1(Sm_ident).LE.MAX_D1_LEN)THEN GSM2F403.178
D1_PADDR(d1_type,N_OBJ_D1(Sm_ident),Sm_ident)=prog GSM2F403.179
D1_PADDR(d1_im,N_OBJ_D1(Sm_ident),Sm_ident)=Im_ident GSM2F403.180
D1_PADDR(d1_extra_info,N_OBJ_D1(Sm_ident),Sm_ident)=IITM GSM2F403.181
D1_PADDR(d1_levs,N_OBJ_D1(Sm_ident),Sm_ident)=DLEVS GSM2F403.182
ENDIF GSM2F403.183
*IF DEF,MPP GPB1F402.266
global_LPRIM (Sm_ident) =global_LPRIM (Sm_ident)+global_LEN GPB1F402.267
global_LPrimIM(Im_ident) =global_LPrimIM(Im_ident)+global_LEN GPB1F402.268
*ENDIF GPB1F402.269
! Dual addresses for ocean fields with dual time level GSS3F401.303
IF(ISPACE.EQ.8) THEN GSS1F403.48
LPRIM_O2 =LPRIM_O2+LEN GSS3F401.305
C Information for preliminary D1 addressing array GSM2F403.184
N_OBJ_D1(Sm_ident) =N_OBJ_D1(Sm_ident)+1 GSM2F403.185
IF (N_OBJ_D1(Sm_ident).LE.MAX_D1_LEN)THEN GSM2F403.186
D1_PADDR(d1_type,N_OBJ_D1(Sm_ident),Sm_ident)=extra_d1 GSM2F403.187
D1_PADDR(d1_im,N_OBJ_D1(Sm_ident),Sm_ident)=Im_ident GSM2F403.188
D1_PADDR(d1_extra_info,N_OBJ_D1(Sm_ident),Sm_ident)=IITM GSM2F403.189
D1_PADDR(d1_levs,N_OBJ_D1(Sm_ident),Sm_ident)=DLEVS GSM2F403.190
ENDIF GSM2F403.191
END IF ADDRES1.640
*IF DEF,RECON ADDRES1.642
! Increment NProgItems for this model; add item no. to ProgItems ADDRES1.643
VAR_RECON=.FALSE. UIE2F404.121
IF (.NOT.VAR_RECON) THEN UIE2F404.122
IF (IITM.NE.4.AND.IITM.NE.10) THEN ADDRES1.644
NProgItems(Im_index) = NProgItems(Im_index) + 1 GSS3F401.306
PIrow = PIrow + 1 GSS3F401.307
ProgItems (Im_index,PIrow)= IITM GSS3F401.308
END IF ADDRES1.648
END IF UIE2F404.123
*ENDIF ADDRES1.654
ELSE ! Space = 9 GSM2F403.192
C These are EXNER etc items. Record the address relative GSM2F403.193
C to start of LEXTRA space in D1. A loop in ADDRES GSM2F403.194
C will then add on LPRIM and LDUMP GSM2F403.195
IN_S(1,Im_ident,0,IITM)=LEXTRA(Sm_ident)+1 GSM2F403.196
LEXTRA(Sm_ident) = LEXTRA(Sm_ident)+LEN GSM2F403.197
C Information for preliminary D1 addressing array GSM2F403.198
N_OBJ_D1(Sm_ident) =N_OBJ_D1(Sm_ident)+1 GSM2F403.199
IF (N_OBJ_D1(Sm_ident).LE.MAX_D1_LEN)THEN GSM2F403.200
D1_PADDR(d1_type,N_OBJ_D1(Sm_ident),Sm_ident)=extra_d1 GSM2F403.201
D1_PADDR(d1_im,N_OBJ_D1(Sm_ident),Sm_ident)=Im_ident GSM2F403.202
D1_PADDR(d1_extra_info,N_OBJ_D1(Sm_ident),Sm_ident)=IITM GSM2F403.203
D1_PADDR(d1_levs,N_OBJ_D1(Sm_ident),Sm_ident)=DLEVS GSM2F403.204
ENDIF GSM2F403.205
ENDIF GSM2F403.206
*IF -DEF,RECON ADDRES1.655
ELSE ADDRES1.656
! ISP=5 means: set address of prim var in dump only. GSS3F401.309
! D1 address is then set to same address as previous item GSS3F401.310
IN_S(1,Im_ident,0,IITM)=IN_S(1,Im_ident,0,IITM-1) GSS1F400.921
END IF ADDRES1.661
*ENDIF ADDRES1.662
! The input length for primary (m,0,i) is assigned to IN_S(2,m,0,i). ADDRES1.663
IN_S(2,Im_ident,0,IITM)=LEN GSS1F400.922
ADDRES1.665
! Store levels, lengths and addresses required for reconfiguration ADDRES1.666
! in array Recondat ADDRES1.667
*IF DEF,RECON ADDRES1.669
IF (ISPACE.NE.4.AND.ISPACE.NE.9) THEN GSM2F403.207
Recondat(Im_index,IITM,1)=RLEVS GSS3F401.311
Recondat(Im_index,IITM,2)=LEN GSS3F401.312
Recondat(Im_index,IITM,3)=RADDRESS GSS3F401.313
Recondat(Im_index,IITM,4)=RPLEVS AWI1F403.104
RADDRESS =RADDRESS+LEN GSS3F401.314
END IF ADDRES1.680
*ENDIF GSS3F401.315
END IF ! ISPACE .ne. 10 GSM4F404.10
END IF ! LADDR ADDRES1.684
ADDRES1.685
RETURN ADDRES1.686
END ADDRES1.687
GSS3F401.316
!+Test whether level type is discrete (model) or continuous (non-model) GSS3F401.317
! Function Interface: GSS3F401.318
LOGICAL FUNCTION DISCT_LEV(LEV_CODE,ErrorStatus,CMESSAGE) 8GSS3F401.319
IMPLICIT NONE GSS3F401.320
GSS3F401.321
! Description: GSS3F401.322
! GSS3F401.323
! Method: GSS3F401.324
! GSS3F401.325
! Current code owner: S.J.Swarbrick GSS3F401.326
! GSS3F401.327
! History: GSS3F401.328
! Version Date Comment GSS3F401.329
! ======= ==== ======= GSS3F401.330
! 4.1 Apr. 96 Original code. S.J.Swarbrick GSS3F401.331
! Code description: GSS3F401.332
! FORTRAN 77 + common Fortran 90 extensions. GSS3F401.333
! Written to UM programming standards version 7. GSS3F401.334
! GSS3F401.335
! System component covered: GSS3F401.336
! System task: Sub-Models Project GSS3F401.337
! GSS3F401.338
! Global variables: GSS3F401.339
*CALL CSUBMODL
GSS3F401.340
*CALL VERSION
GSS3F401.341
*CALL MODEL
GSS3F401.342
GSS3F401.343
! Function arguments: GSS3F401.344
! Scalar arguments with intent(in): GSS3F401.345
INTEGER LEV_CODE !Level code from STASHmaster GSS3F401.346
GSS3F401.347
! ErrorStatus GSS3F401.348
INTEGER ErrorStatus GSS3F401.349
CHARACTER*80 CMESSAGE GSS3F401.350
GSS3F401.351
!- End of Header ---------------------------------------------- GSS3F401.352
GSS3F401.353
IF (LEV_CODE.EQ.1 .OR. LEV_CODE.EQ.2 .OR. LEV_CODE.EQ.6 .OR. GSS3F401.354
& LEV_CODE.EQ.10) THEN GSS3F401.355
DISCT_LEV=.TRUE. GSS3F401.356
ELSE IF (LEV_CODE .GE. 0 .AND. LEV_CODE .LE. 10) THEN GSS3F401.357
DISCT_LEV=.FALSE. GSS3F401.358
ELSE GSS3F401.359
DISCT_LEV=.FALSE. GSS3F401.360
ErrorStatus=1 GSS3F401.361
CMESSAGE='DISCT_LEV : Invalid level type in STASHmaster' GSS3F401.362
END IF GSS3F401.363
END GSS3F401.364
!- End of Function code -------------------------------------------- GSS3F401.365
GSS3F401.366
!+Decode the STASH pseudo level code GSS3F401.367
! Subroutine Interface: GSS3F401.368
SUBROUTINE PSLEVCOD(ILIN,ILOUT,SWTCH,ErrorStatus,CMESSAGE) 4GSS3F401.369
IMPLICIT NONE GSS3F401.370
! Description: GSS3F401.371
! Sets ILOUT to an appropriate pseudo level size according GSS3F401.372
! to the value of IL GSS3F401.373
! Level sizes are parametrised in comdeck MODEL. GSS3F401.374
! GSS3F401.375
! Current code owner: S.J.Swarbrick GSS3F401.376
! GSS3F401.377
! History: GSS3F401.378
! Version Date Comment GSS3F401.379
! ======= ==== ======= GSS3F401.380
! 4.1 Apr. 96 Original code. S.J.Swarbrick GSS3F401.381
! 4.4 29/9/97 Allow for surface type pseudo-levels. R.A.Betts ABX2F404.70
! GSS3F401.382
! Code description: GSS3F401.383
! FORTRAN 77 + common Fortran 90 extensions. GSS3F401.384
! Written to UM programming standards version 7. GSS3F401.385
! GSS3F401.386
! System component covered: GSS3F401.387
! System task: Sub-Models Project GSS3F401.388
! GSS3F401.389
! Global variables: GSS3F401.390
*CALL CSUBMODL
GSS3F401.391
*CALL VERSION
GSS3F401.392
*CALL MODEL
GSS3F401.393
*CALL TYPSIZE
GSS3F401.394
*CALL CNTLATM
GSS3F401.395
*CALL CSENARIO
AWI1F403.56
*CALL NSTYPES
ABX2F404.71
GSS3F401.396
! Subroutine arguments: GSS3F401.397
! Scalar arguments with intent(in): GSS3F401.398
INTEGER ILIN ! Model pseudo level code GSS3F401.399
CHARACTER*1 SWTCH GSS3F401.400
GSS3F401.401
! Scalar arguments with intent(out): GSS3F401.402
INTEGER ILOUT ! An actual pseudo level GSS3F401.403
CHARACTER*80 CMESSAGE GSS3F401.404
GSS3F401.405
! Local scalars: GSS3F401.406
INTEGER I GSS3F401.407
INTEGER J GSS3F401.408
GSS3F401.409
! Error Status: GSS3F401.410
INTEGER ErrorStatus GSS3F401.411
GSS3F401.412
!- End of Header -------------------------------------------------- GSS3F401.413
GSS3F401.414
IF (SWTCH.EQ.'F') THEN GSS3F401.415
IF(ILIN.EQ.1) THEN GSS3F401.416
ILOUT=1 GSS3F401.417
! Ocean assimilation groups GSS3F401.418
ELSE IF(ILIN.EQ.41) THEN GSS3F401.419
ILOUT=OASLEV(1) GSS3F401.420
ELSE IF(ILIN.EQ.42) THEN GSS3F401.421
ILOUT=OASLEV(2) GSS3F401.422
ELSE IF(ILIN.EQ.43) THEN GSS3F401.423
ILOUT=OASLEV(3) GSS3F401.424
ELSE IF(ILIN.EQ.44) THEN GSS3F401.425
ILOUT=OASLEV(4) GSS3F401.426
ELSE IF(ILIN.EQ.45) THEN GSS3F401.427
ILOUT=OASLEV(5) GSS3F401.428
ELSE IF(ILIN.EQ.46) THEN GSS3F401.429
ILOUT=OASLEV(6) GSS3F401.430
ELSE GSS3F401.431
WRITE(6,*) GSS3F401.432
& 'MSG FROM PSLEVCOD: ', GSS3F401.433
& 'INAPPROPRIATE FIRST PSEUDO LEVEL CODE FOUND ',ILIN GSS3F401.434
ErrorStatus=2 GSS3F401.435
END IF GSS3F401.436
ELSE IF (SWTCH.EQ.'L') THEN GSS3F401.437
IF(ILIN.EQ.1) THEN GSS3F401.438
ILOUT=H_SWBANDS GSS3F401.439
ELSE IF(ILIN.EQ.2) THEN GSS3F401.440
ILOUT=H_LWBANDS GSS3F401.441
ELSE IF(ILIN.EQ.4) THEN GSS3F401.442
! Last frequency (wave model) GSS3F401.443
ILOUT=NFRE GSS3F401.444
ELSE IF(ILIN.EQ.5) THEN GSS3F401.445
! Last wave train (wave model) GSS3F401.446
ILOUT=NWTRAIN GSS3F401.447
ELSEIF ( ILIN .EQ. 6 ) THEN AWI1F403.57
! Last index for HadCM2 sulphate loading patterns. AWI1F403.58
ILOUT = NSULPAT AWI1F403.59
ELSEIF ( ILIN .EQ. 7 ) THEN ABX2F404.72
! All surface types ABX2F404.73
ILOUT = NTYPE ABX2F404.74
ELSEIF ( ILIN .EQ. 8 ) THEN ABX2F404.75
! Plant functional types only ABX2F404.76
ILOUT = NPFT ABX2F404.77
ELSEIF ( ILIN .EQ. 9 ) THEN ABX2F404.78
! All surface types except ice ABX2F404.79
ILOUT = NTYPE-1 ABX2F404.80
ELSE GSS3F401.448
WRITE(6,*) GSS3F401.449
& 'MSG FROM PSLEVCOD: ', GSS3F401.450
& 'INAPPROPRIATE LAST PSEUDO LEVEL CODE FOUND ',ILIN GSS3F401.451
ErrorStatus=2 GSS3F401.452
END IF GSS3F401.453
GSS3F401.454
END IF GSS3F401.455
GSS3F401.456
RETURN GSS3F401.457
END GSS3F401.458
*ENDIF ADDRES1.688