*IF DEF,CONTROL STASH1.2
C ******************************COPYRIGHT****************************** GTS2F400.9505
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.9506
C GTS2F400.9507
C Use, duplication or disclosure of this code is subject to the GTS2F400.9508
C restrictions as set forth in the contract. GTS2F400.9509
C GTS2F400.9510
C Meteorological Office GTS2F400.9511
C London Road GTS2F400.9512
C BRACKNELL GTS2F400.9513
C Berkshire UK GTS2F400.9514
C RG12 2SZ GTS2F400.9515
C GTS2F400.9516
C If no contract has been raised with this copy of the code, the use, GTS2F400.9517
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.9518
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.9519
C Modelling at the above address. GTS2F400.9520
C ******************************COPYRIGHT****************************** GTS2F400.9521
C GTS2F400.9522
CLL Subroutine STASH -------------------------------------------------- STASH1.3
CLL STASH1.4
CLL Purpose: Control routine for diagnostic processing step-by-step. STASH1.5
CLL Called after each code section to process diagnostic fields STASH1.6
CLL from workspace STASH_WORK to their final destination in D1 STASH1.7
CLL or PP file. This routine loops over raw input fields and STASH1.8
CLL calls a service routine STWORK to do the actual processing. STASH1.9
CLL STASH1.10
CLL TJ, SI <- programmer of some or all of previous code or changes STASH1.11
CLL STASH1.12
CLL Model Modification history from model version 3.0: STASH1.13
CLL version Date STASH1.14
CLL 3.1 2/02/93 : Add NUNITS to argument list of STWORK to increase RS030293.82
CLL no. of i/o units for 'C' portable code. RS030293.83
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.195
CLL portability. Author Tracey Smith. TS150793.196
CLL 3.2 13/04/93 Dynamic allocation of main arrays. R T H Barnes. @DYALLOC.3373
CLL 3.3 29/03/94 Correct serious error in computing LENOUT. This can TJ300394.1
CLL be longer than the input length for timeseries. TCJ TJ300394.2
CLL 3.3 26/10/93 M. Carter. Part of an extensive mod that: MC261093.263
CLL 1.Removes the limit on primary STASH item numbers. MC261093.264
CLL 2.Removes the assumption that (section,item) MC261093.265
CLL defines the sub-model. MC261093.266
CLL 3.Thus allows for user-prognostics. MC261093.267
CLL Re-Index PPXREF. MC261093.268
CLL 3.5 07/04/95 Recoded for first stage of submodels. Added GKR0F305.1
CLL routine to pack internal model specific data into GKR0F305.2
CLL a superarray. K Rogers GKR0F305.3
!LL 4.0 06/09/95 Pass in stash superarrays from above. K Rogers GKR0F400.137
!LL 4.1 03/05/96 Remove unnecessary comdecks ARGPTRA,ARGPTRO, GKR1F401.1
!LL ARGCONA,TYPPTRA and TYPPTRO. Add in wave GKR1F401.2
!LL comdecks and wave call to STWORK. K Rogers. GKR1F401.3
! 4.1 03/04/96 Pass DUMP_PACKim to STWORK. D. Robinson. GDR2F401.66
!LL 4.3 17/02/97 MPP code : Added code to change to correct GPB0F403.38
!LL decomposition before calling STASH. GPB0F403.39
!LL Add MOS_MASK_LEN to STWORK argument list GPB0F403.40
!LL P.Burton GPB0F403.41
!LL 4.3 16/05/97 Fix for MPP use of MOS diagnostics - GPB5F403.101
!LL calculate LENOUT correctly. P.Burton GPB5F403.102
!LL 4.4 7/10/97 FT_FIRSTSTEP needed in STWORK to check whether GRR1F404.22
!LL re-initialised file stream is written to before GRR1F404.23
!LL being opened. R.Rawlins GRR1F404.24
!LL 4.4 13/10/97 Pass LEN_A/O/W_SPSTS to STWORK. D. Robinson. UDR2F404.41
!LL 4.5 13/01/98 Add global_LENOUT argument to STWORK P.Burton GPB2F405.167
CLL STASH1.15
CLL GKR0F305.4
CLL Programming standard : UM Doc Paper no 3 STASH1.16
CLL STASH1.17
CLL Logical components covered : C3, C4, C8 STASH1.18
CLL STASH1.19
CLL Project task : C4 STASH1.20
CLL STASH1.21
CLL External documentation : UMDP no C4 STASH1.22
CLL STASH1.23
CL* Interface and arguments -------------------------------------------- STASH1.24
C STASH1.25
SUBROUTINE STASH(sm_ident,im_ident,IS,STASH_WORK, 32,7GKR1F401.4
*CALL ARGSIZE
@DYALLOC.3375
*CALL ARGD1
@DYALLOC.3376
*CALL ARGDUMA
@DYALLOC.3377
*CALL ARGDUMO
@DYALLOC.3378
*CALL ARGDUMW
GKR1F401.5
*CALL ARGSTS
@DYALLOC.3379
*CALL ARGPPX
GKR0F305.6
& ICODE,CMESSAGE) @DYALLOC.3383
C STASH1.27
IMPLICIT NONE STASH1.28
@DYALLOC.3384
*CALL CMAXSIZE
@DYALLOC.3385
*CALL CSUBMODL
GKR0F305.7
*CALL TYPSIZE
@DYALLOC.3386
*CALL TYPD1
@DYALLOC.3387
*CALL TYPDUMA
@DYALLOC.3388
*CALL TYPDUMO
@DYALLOC.3389
*CALL TYPDUMW
GKR1F401.6
*CALL TYPSTS
@DYALLOC.3390
*CALL TYPCONA
@DYALLOC.3393
@DYALLOC.3394
INTEGER STASH1.30
& sm_ident !IN Submodel identifier GKR1F401.7
& ,im_ident !IN Internal model identifier GKR0F305.8
& ,IS !IN SECTION NUMBER STASH1.32
& ,ICODE !OUT RETURN CODE STASH1.33
REAL STASH1.34
& STASH_WORK(*) !IN Area holding the data if not in D1 STASH1.35
CHARACTER*(80) TS150793.197
& CMESSAGE !OUT ANY ERROR MESSAGE PASSED BACK STASH1.37
STASH1.38
C*--------------------------------------------------------------------- STASH1.39
C STASH1.40
C Common blocks and PARAMETERs STASH1.41
C STASH1.42
*CALL PPXLOOK
GKR0F305.9
*CALL CHSUNITS
RS030293.84
*CALL CLOOKADD
STASH1.45
*CALL STPARAM
@DYALLOC.3395
*CALL CCONTROL
STASH1.49
*CALL CTIME
STASH1.50
*CALL CHISTORY
GDR3F305.184
*CALL CNTL_IO
GPB2F405.169
*IF DEF,MPP GPB0F403.42
*CALL DECOMPTP
GPB0F403.43
*CALL PARVARS
GPB0F403.44
*ENDIF GPB0F403.45
C STASH1.54
C Subroutines called STASH1.55
C STASH1.56
EXTERNAL STWORK STASH1.57
C STASH1.58
C Local variables. STASH1.59
C STASH1.60
LOGICAL STASH1.61
* LCYCLIC ! TRUE if submodel is cyclic STASH1.62
GKR0F305.10
INTEGER GKR0F305.11
* IE, ! Index over items in section STASH1.64
* ILEND, ! End point in STASHlist STASH1.65
* ILSTART, ! Start point in STASHlist STASH1.66
* IL, ! STASHlist index TJ300394.3
* IM, ! Item number in section STASH1.67
* IPPX, ! Index to record in PP_XREF MC261093.269
* LENOUT ! Maximum output length STASH1.68
& ,LEN_INTHD ! integer header length GKR0F305.14
& ,LEN_REALHD ! real header length GKR0F305.15
& ,LEN1_LEVDEPC ! length 1st dim LEVDEPC GKR0F305.16
& ,LEN2_LEVDEPC ! length 2nd dim LEVDEPC GKR0F305.17
& ,LEN2_LOOKUP ! length 2nd dim LOOKUP GKR0F305.18
& ,STEP ! Step number in integration GKR0F305.19
& ,STEPS_PER_PERIOD ! No of steps per period GKR0F305.20
& ,SECS_PER_PERIOD ! No of seconds per period GKR0F305.21
& ,im_index ! Internal model index number GKR0F305.22
& ,num_rows1 ! Number of rows in field type 1 GKR0F400.138
& ,num_rows2 ! Number of rows in field type 1 GKR0F400.139
& ,row_len ! Row length GKR0F400.140
& ,field_len1 ! Length of field type 1 GKR0F400.141
& ,field_len2 ! Length of field type 2 GKR0F400.142
& ,num_levels ! Number of levels GKR0F400.143
*IF DEF,OCEAN GKR0F305.23
& ,LEN_OCNWORK ! Length of ocean work array GKR0F305.24
*ENDIF GKR0F305.25
*IF DEF,WAVE GKR1F401.8
& ,len_wavwork ! Length of wave work array GKR1F401.9
*ENDIF GKR1F401.10
*IF DEF,MPP GPB0F403.46
& ,orig_decomp ! Decomposition on entry GPB0F403.47
&, global_LENOUT ! Size of output field on disk GPB2F405.168
*ENDIF GPB0F403.48
*IF -DEF,ATMOS GKR1F401.11
*IF DEF,OCEAN,OR,DEF,WAVE GKR1F401.12
LOGICAL ELF ! True if input grid rotated GKR0F305.31
! equatorial GKR0F305.32
*ENDIF GKR0F305.33
*ENDIF GKR1F401.13
GKR0F305.34
GKR0F305.36
GKR0F305.37
CL--------------------------------------------------------------------- STASH1.81
CL 0. Initialise. STASH1.82
CL Set LCYCLIC to indicate EW boundary condition. STASH1.83
CL STASH1.84
*IF DEF,MPP GPB0F403.49
! Find current decomposition, so we can return to this after STASH GPB0F403.50
orig_decomp=current_decomp_type GPB0F403.51
GPB0F403.52
*ENDIF GPB0F403.53
ICODE = 0 STASH1.85
*IF DEF,ATMOS STASH1.86
IF (sm_ident.eq.atmos_sm) LCYCLIC = .NOT. ELF GKR1F401.14
*ENDIF STASH1.88
*IF DEF,OCEAN STASH1.89
IF (sm_ident.eq.ocean_sm) LCYCLIC = CYCLIC_OCEAN GKR1F401.15
*ENDIF STASH1.91
*IF DEF,WAVE GKR1F401.16
IF (sm_ident.eq.wave_sm) LCYCLIC = GLOBAL_WAVE GKR1F401.17
*ENDIF GKR1F401.18
GKR0F305.38
im_index = internal_model_index(im_ident) GKR0F305.39
GKR0F305.40
CL--------------------------------------------------------------------- STASH1.92
CL 1. Loop over items within this section and call STWORK with STASH1.93
CL appropriate argument list depending on whether atmosphere/ocean STASH1.94
CL STASH1.95
DO 100 IE=1,NITEMS ! max no of items in this section STASH1.96
IF(STINDEX(2,IE,IS,im_index).GT.0) THEN ! Entries for this GKR0F305.41
! SECTION/ITEM GKR0F305.42
ILSTART=STINDEX(1,IE,IS,im_index) GKR0F305.43
ILEND=ILSTART+STINDEX(2,IE,IS,im_index)-1 GKR0F305.44
IM=STLIST(1,ILSTART) ! item number STASH1.100
STASH1.101
IF(SF(IM,IS)) THEN ! item/section reqd for this t/s STASH1.102
IF(STLIST(st_proc_no_code,STINDEX(1,IE,IS,im_index)) GKR0F305.45
& .NE.0) THEN GKR0F305.46
C required by STASH so continue. STASH1.104
C It should not be possible to have any multiple entries for a given STASH1.105
C ITEM SECTION number and one of those not be required by STASH STASH1.106
STASH1.107
*IF DEF,PRINT84 STASH1.108
WRITE(6,109) IM,IS STASH1.109
109 FORMAT(' ITEM',I4,' SECTION',I4,'REQUIRED BY STASH') STASH1.110
*ENDIF STASH1.111
TJ300394.4
C NB: max poss output length for the item/sect can be LONGER than TJ300394.5
C the input length in the case of timeseries. TJ300394.6
LENOUT=0 GPB5F403.103
*IF DEF,MPP GPB2F405.170
global_LENOUT=0 GPB2F405.171
*ENDIF GPB2F405.172
DO IL=ILSTART,ILEND GPB5F403.104
*IF -DEF,MPP GPB5F403.105
LENOUT=MAX(LENOUT,STLIST(st_output_length,IL)) GPB5F403.106
*ELSE GPB5F403.107
IF (STLIST(st_output_code,IL) .EQ. -89) THEN ! MOS GPB5F403.108
LENOUT=MAX(LENOUT,MOS_OUTPUT_LENGTH*P_LEVELS) GPB5F403.109
global_LENOUT=MAX(global_LENOUT, GPB2F405.173
& MOS_OUTPUT_LENGTH*P_LEVELS) GPB2F405.174
ELSE GPB5F403.110
LENOUT=MAX(LENOUT,STLIST(st_output_length,IL)) GPB5F403.111
global_LENOUT= GPB2F405.175
& MAX(global_LENOUT, GPB2F405.176
& STLIST(st_dump_level_output_length,IL)) GPB2F405.177
ENDIF GPB5F403.112
*ENDIF GPB5F403.113
ENDDO GPB5F403.114
*IF DEF,MPP GPB2F405.178
! Add on an extra UM_SECTOR_SIZE on the end, ensuring array is GPB2F405.179
! big enough for data+extra space to round up to the next GPB2F405.180
! UM_SECTOR_SIZE GPB2F405.181
global_LENOUT=global_LENOUT+UM_SECTOR_SIZE GPB2F405.182
*ENDIF GPB2F405.183
STASH1.114
! Set general variables GKR0F305.47
GKR0F305.48
STEP = STEPim(im_ident) GKR0F305.49
STEPS_PER_PERIOD = STEPS_PER_PERIODim(im_ident) GKR0F305.50
SECS_PER_PERIOD = SECS_PER_PERIODim(im_ident) GKR0F305.51
GKR0F305.52
! DUMP_PACKim controls the packing of fields in a dump GDR2F401.67
! 1 : Use PPXREF file to control packing GDR2F401.68
! 2 : Do not pack prognostics, as 1 for diagnostics GDR2F401.69
! 3 : Do not pack prognostics or diagnostics GDR2F401.70
GKR0F305.53
! Make superarrays to pass into STWORK GKR0F305.54
*IF DEF,ATMOS GKR0F305.55
if (im_ident .eq. atmos_sm) then GKR0F305.56
GKR0F305.57
*IF DEF,MPP GPB0F403.54
! Change to atmosphere decomposition GPB0F403.55
IF (current_decomp_type .NE. GPB0F403.56
& decomp_standard_atmos) THEN GPB0F403.57
CALL CHANGE_DECOMPOSITION
(decomp_standard_atmos, GPB0F403.58
& ICODE) GPB0F403.59
ENDIF GPB0F403.60
IF (ICODE .NE. 0) THEN GPB0F403.61
CMESSAGE='STASH : Unsupported MPP submodel : atmos' GPB0F403.62
GOTO 999 GPB0F403.63
ENDIF GPB0F403.64
*ENDIF GPB0F403.65
! Following 6 lines to be removed at vn4.1 GKR0F305.67
LEN_INTHD = A_LEN_INTHD GKR0F305.68
LEN_REALHD = A_LEN_REALHD GKR0F305.69
LEN1_LEVDEPC = A_LEN1_LEVDEPC GKR0F305.70
LEN2_LEVDEPC = A_LEN2_LEVDEPC GKR0F305.71
LEN2_LOOKUP = A_LEN2_LOOKUP GKR0F305.72
num_rows1 = p_rows GKR0F400.144
num_rows2 = u_rows GKR0F400.145
row_len = row_length GKR0F400.146
field_len1 = p_field GKR0F400.147
field_len2 = u_field GKR0F400.148
num_levels = p_levels GKR0F400.149
GKR0F305.73
CALL STWORK
( STASH1.118
*CALL ARGPPX
GKR0F305.74
& D1,LEN_TOT,STASH_WORK,STASH_MAXLEN(IS,im_index),LENOUT, GKR0F400.150
*IF DEF,MPP GPB2F405.184
& global_LENOUT, GPB2F405.185
*ENDIF GPB2F405.186
& 1,IS,IM,ILSTART,ILEND,STEP,STEPS_PER_PERIOD, GKR0F400.151
& SECS_PER_PERIOD, PREVIOUS_TIME, GKR0F305.77
& STLIST,LEN_STLIST,TOTITEMS,SI,NSECTS,NITEMS, STASH1.153
& STASH_LEVELS,NUM_STASH_LEVELS,NUM_LEVEL_LISTS, STASH1.154
& STASH_PSEUDO_LEVELS,NUM_STASH_PSEUDO,NUM_PSEUDO_LISTS, STASH1.155
& MAX_STASH_LEVS,STTABL,NSTTIMS,NSTTABL, STASH1.156
& STASH_SERIES,nstash_series_records,time_series_rec_len, STASH1.157
& stash_series_index,nstash_series_block, STASH1.158
& MOS_MASK,MOS_MASK_LEN,MOS_OUTPUT_LENGTH, GPB0F403.66
& PP_PACK_CODE,MODEL_FT_UNIT,FT_STEPS,FT_FIRSTSTEP, GRR1F404.25
& A_FIXHD,A_INTHD, GRR1F404.26
& A_REALHD,LEN_FIXHD,LEN_INTHD,LEN_REALHD, GKR0F305.79
& A_LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GKR0F305.80
& A_LOOKUP,A_LOOKUP, ! 2nd copy used as REAL in PP_HEAD @DYALLOC.3405
& LEN1_LOOKUP,LEN2_LOOKUP,PP_LEN2_LOOKUP, GKR0F305.81
& NUNITS,PP_LEN2_LOOK, RS030293.88
& lcyclic,num_rows1,num_rows2, GKR0F400.152
& row_len,field_len1,field_len2,num_levels, GKR0F400.153
& FORECAST_HRS,RUN_INDIC_OP,ELF,FT_LASTFIELD, STASH1.171
& sm_ident,im_ident,DUMP_PACKim(sm_ident), GDR2F401.71
& len_a_spsts, a_spsts, a_spsts, a_ixsts, len_a_ixsts, UDR2F404.42
& ICODE,CMESSAGE) STASH1.172
endif GKR0F305.85
*ENDIF GKR0F305.86
*IF DEF,OCEAN GKR0F305.87
if (im_ident .eq. ocean_sm) then GKR0F305.88
GKR0F305.89
*IF DEF,MPP GPB0F403.67
! Change to ocean (no wrap around points) decomposition GPB0F403.68
IF (current_decomp_type .NE. GPB0F403.69
& decomp_nowrap_ocean) THEN GPB0F403.70
CALL CHANGE_DECOMPOSITION
(decomp_nowrap_ocean, GPB0F403.71
& ICODE) GPB0F403.72
ENDIF GPB0F403.73
IF (ICODE .NE. 0) THEN GPB0F403.74
CMESSAGE='STASH : Unsupported MPP submodel : ocean' GPB0F403.75
GOTO 999 GPB0F403.76
ENDIF GPB0F403.77
*ENDIF GPB0F403.78
IF (CYCLIC_OCEAN) THEN STASH1.178
row_len = imtm2 GKR0F400.155
ELSE STASH1.180
row_len = imt GKR0F400.156
ENDIF STASH1.182
len_ocnwork = o_spsts(o_ixsts(9)) GKR0F400.157
GKR0F305.93
GKR0F305.101
! Following 6 lines to be removed at vn4.1 GKR0F305.102
LEN_INTHD = O_LEN_INTHD GKR0F305.103
LEN_REALHD = O_LEN_REALHD GKR0F305.104
LEN1_LEVDEPC = O_LEN1_LEVDEPC GKR0F305.105
LEN2_LEVDEPC = O_LEN2_LEVDEPC GKR0F305.106
LEN2_LOOKUP = O_LEN2_LOOKUP GKR0F305.107
GKR0F305.108
num_rows1 = jmt GKR0F400.158
num_rows2 = jmtm1 GKR0F400.159
field_len1 = jmt * row_len GKR0F400.160
field_len2 = jmtm1 * row_len GKR0F400.161
num_levels = km GKR0F400.162
ELF = .FALSE. GKR0F305.114
GKR0F305.115
CALL STWORK
( STASH1.185
*CALL ARGPPX
GKR0F305.116
& D1,LEN_TOT,STASH_WORK,STASH_MAXLEN(IS,im_index),LENOUT, GKR0F400.163
*IF DEF,MPP GPB2F405.187
& global_LENOUT, GPB2F405.188
*ENDIF GPB2F405.189
& LEN_OCNWORK, GKR0F400.164
& IS,IM,ILSTART,ILEND,STEP,STEPS_PER_PERIOD, GKR0F305.118
& SECS_PER_PERIOD, PREVIOUS_TIME, GKR0F305.119
& STLIST,LEN_STLIST,TOTITEMS,SI,NSECTS,NITEMS, STASH1.191
& STASH_LEVELS,NUM_STASH_LEVELS,NUM_LEVEL_LISTS, STASH1.192
& STASH_PSEUDO_LEVELS,NUM_STASH_PSEUDO,NUM_PSEUDO_LISTS, STASH1.193
& MAX_STASH_LEVS,STTABL,NSTTIMS,NSTTABL, STASH1.194
& STASH_SERIES,nstash_series_records,time_series_rec_len, STASH1.195
& stash_series_index,nstash_series_block, STASH1.196
& MOS_MASK,MOS_MASK_LEN,MOS_OUTPUT_LENGTH, GPB0F403.79
& PP_PACK_CODE,MODEL_FT_UNIT,FT_STEPS,FT_FIRSTSTEP, GRR1F404.27
& O_FIXHD,O_INTHD, GRR1F404.28
& O_REALHD,LEN_FIXHD,LEN_INTHD,LEN_REALHD, GKR0F305.121
& O_LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GKR0F305.122
& O_LOOKUP,O_LOOKUP, ! 2nd copy used as REAL in PP_HEAD @DYALLOC.3409
& LEN1_LOOKUP,LEN2_LOOKUP,PP_LEN2_LOOKUP, GKR0F305.123
& NUNITS,PP_LEN2_LOOK, RS030293.90
& lcyclic,num_rows1,num_rows2, GKR0F400.165
& row_len,field_len1,field_len2,num_levels, GKR0F400.166
& FORECAST_HRS,RUN_INDIC_OP,ELF,FT_LASTFIELD, GKR0F305.126
& sm_ident,im_ident,DUMP_PACKim(sm_ident), GDR2F401.72
& len_o_spsts, o_spsts, o_spsts, o_ixsts, len_o_ixsts, UDR2F404.43
& ICODE,CMESSAGE) STASH1.211
GKR0F305.129
endif GKR0F305.130
*ENDIF GKR0F305.131
*IF DEF,SLAB GKR0F305.132
if (im_ident .eq. slab_im) then GKR0F305.133
GKR0F305.134
GKR0F305.143
! Following 6 lines to be removed at vn4.1 GKR0F305.144
LEN_INTHD = A_LEN_INTHD GKR0F305.145
LEN_REALHD = A_LEN_REALHD GKR0F305.146
LEN1_LEVDEPC = A_LEN1_LEVDEPC GKR0F305.147
LEN2_LEVDEPC = A_LEN2_LEVDEPC GKR0F305.148
LEN2_LOOKUP = A_LEN2_LOOKUP GKR0F305.149
num_rows1 = p_rows GKR0F400.168
num_rows2 = u_rows GKR0F400.169
row_len = row_length GKR0F400.170
field_len1 = p_field GKR0F400.171
field_len2 = u_field GKR0F400.172
num_levels = p_levels GKR0F400.173
GKR0F305.150
CALL STWORK
( GKR0F305.151
*CALL ARGPPX
GKR0F305.152
& D1,LEN_TOT,STASH_WORK,STASH_MAXLEN(IS,im_index),LENOUT, GKR0F400.174
*IF DEF,MPP GPB2F405.190
& global_LENOUT, GPB2F405.191
*ENDIF GPB2F405.192
& 1,IS,IM,ILSTART,ILEND,STEP,STEPS_PER_PERIOD, GKR0F400.175
& SECS_PER_PERIOD, PREVIOUS_TIME, GKR0F305.155
& STLIST,LEN_STLIST,TOTITEMS,SI,NSECTS,NITEMS, GKR0F305.156
& STASH_LEVELS,NUM_STASH_LEVELS,NUM_LEVEL_LISTS, GKR0F305.157
& STASH_PSEUDO_LEVELS,NUM_STASH_PSEUDO,NUM_PSEUDO_LISTS, GKR0F305.158
& MAX_STASH_LEVS,STTABL,NSTTIMS,NSTTABL, GKR0F305.159
& STASH_SERIES,nstash_series_records,time_series_rec_len, GKR0F305.160
& stash_series_index,nstash_series_block, GKR0F305.161
& MOS_MASK,MOS_MASK_LEN,MOS_OUTPUT_LENGTH, GPB0F403.80
& PP_PACK_CODE,MODEL_FT_UNIT,FT_STEPS,FT_FIRSTSTEP, GRR1F404.29
& A_FIXHD,A_INTHD, GRR1F404.30
& A_REALHD,LEN_FIXHD,LEN_INTHD,LEN_REALHD, GKR0F305.164
& A_LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GKR0F305.165
& A_LOOKUP,A_LOOKUP, ! 2nd copy used as REAL in PP_HEAD GKR0F305.166
& LEN1_LOOKUP,LEN2_LOOKUP,PP_LEN2_LOOKUP, GKR0F305.167
& NUNITS,PP_LEN2_LOOK, GKR0F305.168
& lcyclic,num_rows1,num_rows2, GKR0F400.176
& row_len,field_len1,field_len2,num_levels, GKR0F400.177
& FORECAST_HRS,RUN_INDIC_OP,ELF,FT_LASTFIELD, GKR0F305.171
& sm_ident,im_ident,DUMP_PACKim(sm_ident), GDR2F401.73
& len_a_spsts, a_spsts, a_spsts, a_ixsts, len_a_ixsts, UDR2F404.44
& ICODE,CMESSAGE) GKR0F305.174
GKR0F305.175
endif GKR0F305.176
*ENDIF GKR0F305.177
*IF DEF,WAVE GKR1F401.19
if (im_ident .eq. wave_sm) then GKR1F401.20
GKR1F401.21
len_wavwork = w_spsts(w_ixsts(2)) GKR1F401.22
GKR1F401.23
num_rows1 = NGY GKR1F401.24
num_rows2 = NGY GKR1F401.25
field_len1 = NGX * NGY GKR1F401.26
field_len2 = NGX * NGY GKR1F401.27
num_levels = NANG ! number of directions GKR1F401.28
! num_freq = NFRE ! number of frequency pseudo-levels GKR1F401.29
ELF = .FALSE. GKR1F401.30
GKR1F401.31
CALL STWORK
( GKR1F401.32
*CALL ARGPPX
GKR1F401.33
& D1,LEN_TOT,STASH_WORK,STASH_MAXLEN(IS,im_index),LENOUT, GKR1F401.34
*IF DEF,MPP GPB2F405.193
& global_LENOUT, GPB2F405.194
*ENDIF GPB2F405.195
& len_wavwork, GKR1F401.35
& IS,IM,ILSTART,ILEND,STEP,STEPS_PER_PERIOD, GKR1F401.36
& SECS_PER_PERIOD, PREVIOUS_TIME, GKR1F401.37
& STLIST,LEN_STLIST,TOTITEMS,SI,NSECTS,NITEMS, GKR1F401.38
& STASH_LEVELS,NUM_STASH_LEVELS,NUM_LEVEL_LISTS, GKR1F401.39
& STASH_PSEUDO_LEVELS,NUM_STASH_PSEUDO,NUM_PSEUDO_LISTS, GKR1F401.40
& MAX_STASH_LEVS,STTABL,NSTTIMS,NSTTABL, GKR1F401.41
& STASH_SERIES,nstash_series_records,time_series_rec_len, GKR1F401.42
& stash_series_index,nstash_series_block, GKR1F401.43
& MOS_MASK,MOS_MASK_LEN,MOS_OUTPUT_LENGTH, GPB0F403.81
& PP_PACK_CODE,MODEL_FT_UNIT,FT_STEPS,FT_FIRSTSTEP, GRR1F404.31
& W_FIXHD,W_INTHD, GRR1F404.32
& W_REALHD,LEN_FIXHD,LEN_INTHD,LEN_REALHD, GKR1F401.46
& W_LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GKR1F401.47
& W_LOOKUP,W_LOOKUP, ! 2nd copy used as REAL in PP_HEAD GKR1F401.48
& LEN1_LOOKUP,LEN2_LOOKUP,PP_LEN2_LOOKUP, GKR1F401.49
& NUNITS,PP_LEN2_LOOK, GKR1F401.50
& lcyclic,num_rows1,num_rows2, GKR1F401.51
& row_len,field_len1,field_len2,num_levels, GKR1F401.52
& FORECAST_HRS,RUN_INDIC_OP,ELF,FT_LASTFIELD, GKR1F401.53
& sm_ident,im_ident,DUMP_PACKim(sm_ident), GKR1F401.54
& len_w_spsts, w_spsts, w_spsts, w_ixsts, len_w_ixsts, UDR2F404.45
& ICODE,CMESSAGE) GKR1F401.56
GKR1F401.57
endif GKR1F401.58
*ENDIF GKR1F401.59
GKR1F401.60
GKR0F305.178
ENDIF STASH1.214
GKR0F305.179
ENDIF STASH1.215
GKR0F305.180
ENDIF STASH1.216
C Handle error/warning conditions on return from STWORK STASH1.217
IF (icode.gt.0) THEN STASH1.218
WRITE(6,*)'STASH : Error processing diagnostic section ', GIE0F403.634
& is,', item ',im,', code ',icode GKR1F401.61
WRITE(6,*)' ',cmessage GIE0F403.635
goto 999 STASH1.221
ELSEIF (icode.lt.0) THEN STASH1.222
WRITE(6,*)'STASH : Warning processing diagnostic section ', GIE0F403.636
& is,', item ',im,', code ',icode STASH1.224
WRITE(6,*)' ',cmessage GIE0F403.637
icode=0 STASH1.226
ENDIF STASH1.227
100 CONTINUE STASH1.228
STASH1.229
999 CONTINUE STASH1.230
*IF DEF,MPP GPB0F403.82
IF (current_decomp_type .NE. orig_decomp) THEN GPB0F403.83
CALL CHANGE_DECOMPOSITION
(orig_decomp, GPB0F403.84
& ICODE) GPB0F403.85
IF (ICODE .NE. 0) THEN GPB0F403.86
CMESSAGE='STASH : Unsupported MPP submodel' GPB0F403.87
ENDIF GPB0F403.88
ENDIF GPB0F403.89
*ENDIF GPB0F403.90
RETURN STASH1.231
END STASH1.232
*ENDIF STASH1.233