*IF DEF,C84_1A STWORK1A.2
C ******************************COPYRIGHT****************************** GTS2F400.9793
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.9794
C GTS2F400.9795
C Use, duplication or disclosure of this code is subject to the GTS2F400.9796
C restrictions as set forth in the contract. GTS2F400.9797
C GTS2F400.9798
C Meteorological Office GTS2F400.9799
C London Road GTS2F400.9800
C BRACKNELL GTS2F400.9801
C Berkshire UK GTS2F400.9802
C RG12 2SZ GTS2F400.9803
C GTS2F400.9804
C If no contract has been raised with this copy of the code, the use, GTS2F400.9805
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.9806
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.9807
C Modelling at the above address. GTS2F400.9808
C ******************************COPYRIGHT****************************** GTS2F400.9809
C GTS2F400.9810
CLL Subroutine STWORK ------------------------------------------------- STWORK1A.3
CLL STWORK1A.4
CLL Purpose: Processes all the STASHlist entries for a particular STWORK1A.5
CLL item and section number after a timestep. Raw input diagnostics to STWORK1A.6
CLL STWORK come either from D1, the main data array, or STASH_WORK, a STWORK1A.7
CLL work array dimensioned by the control level and passed in. Each STWORK1A.8
CLL field is spatially processed, temporally processed and then output. STWORK1A.9
CLL The output destination can either be to an address in D1 or to a PP STWORK1A.10
CLL fieldsfile on a given unit. In either case a PP-type LOOKUP header STWORK1A.11
CLL is generated to describe the contents of the output field. Now STWORK1A.12
CLL handles atmosphere or ocean diagnostics according to arguments STWORK1A.13
CLL passed by calling routine. STWORK1A.14
CLL STWORK1A.15
CLL Author: T.Johns/S.Tett STWORK1A.16
CLL STWORK1A.17
CLL Tested under compiler: cft77 STWORK1A.18
CLL Tested under OS version: UNICOS 5.1 STWORK1A.19
CLL STWORK1A.20
CLL Model Modification history from model version 3.0: STWORK1A.21
CLL version Date STWORK1A.22
CLL 3.0 31/12/92 Reference to deck name removed from message STWORK1A.23
CLL when deckname STWORK2 changed to STWORK1A MJH TJ140193.1
CLL 3.1 19/01/93 Enforce processing thro' SPATIAL loop if the input TJ140193.2
CLL and output pseudo-levels lists differ (bugfix). TJ140193.3
CLL 3.1 24/02/93 Correct outstanding problems with timeseries (ST). TJ140193.4
CLL 16/03/93 Correct coding errors for ppx_ocn GR types (SI). TJ140193.5
CLL 3.1 15/01/93 Add NUNITS to argument list to cope with increases RS030293.278
CLL in i/o units for 'C' portable code. R.Rawlins RS030293.279
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.243
CLL portability. Author Tracey Smith. TS150793.244
CLL 3.2 06/04/93 Correct base_level in no-SPATIAL-processing case TJ010793.1
CLL when OCEAN diagnostic on input levels list. Trap TJ010793.2
CLL error return codes from STOCGT. Bugfix for packing TJ010793.3
CLL of timeseries (extraw_hdr not extraw). Initialise TJ010793.4
CLL extraw_hdr (MOS case). Remove rogue comma.(TCJ/ST) TJ010793.5
CLL 3.2 02/07/93 Add arguments needed in STOCGT owing to dynamic @DYALLOC.3463
CLL allocation control level changes. R.T.H.Barnes. @DYALLOC.3464
CLL 3.3 30/03/94 Pass lenout dimension to MULTI_SPAIAL and remove TJ300394.13
CLL redundant addr_out addressing on ppfield; correct TJ300394.14
CLL bug in SPATIAL processing of ocean fields on TJ300394.15
CLL input levels lists. Author Tim Johns. TJ300394.16
CLL 3.3 17/11/93 Declaring MODEL_FT_UNIT(NUNITS) after NUNITS NF171193.5
CLL has been defined. (N.Farnon) NF171193.6
CLL 3.3 17/09/93 Set LOGICAL lmasswt to denote that level-by-level TJ170993.5
CLL mass-weights exist and pass to (MULTI)SPATIAL. TJ170993.6
CLL Also correct error in passing addressed field to TJ170993.7
CLL SPATIAL in vertical/global mean case (TCJ). TJ170993.8
CLL 3.4 04/08/94 No packing indicator change from -26 to -99 PJS APS1F304.5
CLL 3.4 07/10/94 : Move call to grib_file so that pp headers are GRS3F304.184
CLL set correctly R A Stratton. GRS3F304.185
CLL 3.4 15/06/94 Force soft failure if number of fields output to GRR0F304.1
CLL a PP file exceeds the number of pre-allocated GRR0F304.2
CLL headers. R.Rawlins GRR0F304.3
CLL 3.4 22/07/94 Corrects uninitialised argument to PP_HEAD when GDG1F304.1
CLL stashing data to D1 GDG1F304.2
CLL 3.4 13/01/94 Correct bug in spatial processing loop - cater for GTJ1F304.32
CLL C-U and C-V grid types. T.Johns GTJ1F304.33
CLL 4.0 26/07/95 Allow integer or logical fields to be passed thro' GTJ0F400.10
CLL STASH provided no spatial processing done. T.Johns GTJ0F400.11
CLL 3.5 07/04/95 Changes for stage 1 of submodels project. K Rogers GKR0F305.434
CLL In STOCGT remove ARGSIZE and pass in: GKR0F305.435
CLL JMT=T_ROWS,IMT=ROW_LENGTH,KM=P_LEVELS or GKR0F305.436
CLL JMT=T_ROWS,IMTM2=ROW_LENGTH,KM=P_LEVELS GKR0F305.437
CLL 3.5 24/03/95 Changed OPEN to FILE_OPEN and GPB1F305.152
CLL CLOSE to FILE_CLOSE P.Burton GPB1F305.153
CLL 4.0 12/09/95 Remove CMESSAGE='' after call to PP_HEAD. GAB1F400.157
CLL Call PP_HEAD with AK, BK, AHH, BKH, T_levels and GAB1F400.158
CLL JJ (level list value) and without RUN_INDIC_OP GAB1F400.159
CLL (Andrew Brady) GAB1F400.160
!LL 4.0 06/09/95 Pass in superarray from higher levels. K Rogers GKR0F400.179
! 4.0 10/03/95 Allow alternative packing method for grib output. GRS3F400.275
! R A Stratton GRS3F400.276
CLL 4.0 15/06/95 Reduce i/o required by STASH. Original code read GRR1F400.1
CLL the entire set of pp lookup tables (at least GRR1F400.2
CLL PP_LEN2_LOOK, usually 4096) records, then re-wrote GRR1F400.3
CLL the same set for each call to STASH. This is GRR1F400.4
CLL replaced here by only reading the last pp header GRR1F400.5
CLL written to and subsequently only writing out the GRR1F400.6
CLL next set of pp headers serviced by the STASH call. GRR1F400.7
CLL Rick Rawlins. GRR1F400.8
! 4.1 Apr. 96 Rationalise *CALLs S.J.Swarbrick GSS1F401.55
CLL 4.1 31/05/96 Add calls to STWVGT for wave model. K Rogers GKR1F401.63
! 4.1 03/04/96 New argument DUMP_PACK : Use to control GDR2F401.55
! packing in dumps. D. Robinson GDR2F401.56
! 4.2 10/09/96 MPP modifications to STASH P.Burton GPB1F402.1
! 4.3 13/3/97 Further MPP STASH modifications P.Burton GPB0F403.2030
!LL 4.3 30/04/97 Added code to use UM_SECTOR_SIZE to make transfers GBC0F403.60
!LL well-formed. GBC0F403.61
!LL B. Carruthers Cray Research. GBC0F403.62
! 4.3 07/05/97 Correct error in STASH-time processed GMC1F403.1
! diagnostics affecting Ocean and Wave GMC1F403.2
! models only M.Carter GMC1F403.3
! 4.3 17/4/97 Parallelisation of COEX D.Salmond GDS3F403.1
! 4.4 25/11/96 New option - mean timeseries. R A Stratton. GRS1F404.158
! 4.4 25/06/97 Set PPHORIZ_OUT and NROWS/COLS_OUT correctly GPB1F404.66
! when outputing timeseries. P.Burton GPB1F404.67
!LL 4.4 28/07/97 Changes connected with allowing reinitialisation of GMG1F404.345
!LL PP files on Gregorian month boundaries. M.Gallani GMG1F404.346
!LL 4.4 16/06/97 Add processing after the write, so GBC3F404.19
!LL that all the processors know the answer GBC3F404.20
!LL Author: Bob Carruthers, Cray Rsearch. GBC3F404.21
! 4.4 12/06/97 MPP improvements P.Burton GPB0F404.1
! 4.4 7/10/97 Force explicit fail of model when attempting to GRR1F404.1
! write to a file on a re-initialised stream before GRR1F404.2
! it has been opened. R.Rawlins GRR1F404.3
!LL 4.5 13/01/98 Added global_LENOUT argument, and replace GPB2F405.247
!LL SHMEM COMMON blocks with dynamic arrays GPB2F405.248
!LL for buf and buf3 arrays. P.Burton GPB2F405.249
!LL 4.5 18/09/98 Corrected non-standard FORMAT statments GPB0F405.140
!LL P.Burton GPB0F405.141
!LL 4.5 28/05/98 Code for parallel processing in COEX Packing GBCQF405.41
!LL Author: Paul Burton & Bob Carruthers GBCQF405.42
CLL 4.5 28/02/96 Flush buffer for non-reinitializable files to try GDR8F405.30
CLL to avoid problems with continuation runs following GDR8F405.31
CLL hard failures. RTHBarnes. GDR8F405.32
CLL STWORK1A.25
CLL Programming standard: UM Doc Paper 3, version 2 (7/9/90) STWORK1A.26
CLL STWORK1A.27
CLL Logical components covered : C3, C4, C8 STWORK1A.28
CLL STWORK1A.29
CLL Project task: C4 STWORK1A.30
CLL STWORK1A.31
CLL External documentation : UMDP no C4 STWORK1A.32
CLL STWORK1A.33
C*L Interface and arguments: ------------------------------------------ STWORK1A.34
SUBROUTINE STWORK ( 4,60SF011193.51
*CALL ARGPPX
GKR0F305.438
& D1,LEN_TOT,STASH_WORK,STASH_WORK_LEN,LENOUT, GPB2F405.250
*IF DEF,MPP GPB2F405.251
& global_LENOUT, GPB2F405.252
*ENDIF GPB2F405.253
& len_ocwork, GPB2F405.254
& IS,IM,ILSTART,ILEND,STEP,steps_per_period,secs_per_period, STWORK1A.38
& previous_time, STWORK1A.39
& STLIST,LEN_STLIST,TOTITEMS,SI,NSECTS,NITEMS, STWORK1A.40
& STASH_LEVELS,NUM_STASH_LEVELS,NUM_LEVEL_LISTS, STWORK1A.41
& STASH_PSEUDO_LEVELS,NUM_STASH_PSEUDO,NUM_PSEUDO_LISTS, STWORK1A.42
& MAX_STASH_LEVS,STTABL,NSTTIMS, STWORK1A.43
& NSTTABL,STASH_SERIES,STASH_SERIES_LEN, STWORK1A.44
& stash_series_rec_len,stash_series_index,stash_ser_index_size, STWORK1A.45
& MOS_MASK,MOS_MASK_LEN,MOS_OUTPUT_LENGTH, GPB0F403.2031
& PP_PACK_CODE,MODEL_FT_UNIT,FT_STEPS,FT_FIRSTSTEP, GRR1F404.4
& FIXHD,INTHD,REALHD,LEN_FIXHD,LEN_INTHD,LEN_REALHD, STWORK1A.48
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, STWORK1A.49
& LOOKUP,RLOOKUP,LEN1_LOOKUP,LEN2_LOOKUP, STWORK1A.50
& PP_LEN2_LOOKUP,NUNITS,PP_LEN2_LOOK, RS030293.280
& LCYCLIC, GKR0F305.440
& T_rows,U_ROWS,ROW_LENGTH,T_field,U_FIELD,T_levels, STWORK1A.54
& FCST_PRD,RUN_INDIC_OP,ELF,FT_LASTFIELD, STWORK1A.55
& sm_ident,im_ident,dump_pack, GDR2F401.57
& stsuparrlen, stsuparr, istsuparr, sa_idx, sa_idxlen, GKR0F400.181
& ICODE,CMESSAGE) STWORK1A.56
C STWORK1A.57
IMPLICIT NONE STWORK1A.58
C STWORK1A.59
*CALL CSUBMODL
GKR0F305.443
INTEGER STWORK1A.62
* TOTITEMS !IN MAX NO OF ITEMS IN STASHLIST STWORK1A.63
*, NSECTS !IN MAX NO OF SECTIONS STWORK1A.64
*, NITEMS !IN MAX NO OF ITEMS IN A SECTION STWORK1A.65
*, LEN_TOT !IN LENGTH OF REAL DATA ARRAY D1 STWORK1A.66
*, len_ocwork !IN Length of ocean work array OCWORK STWORK1A.67
*, LEN_FIXHD !IN LENGTH OF FIXED CONSTANTS STWORK1A.68
*, LEN_INTHD !IN LENGTH OF INTEGER CONSTANTS STWORK1A.69
*, LEN_REALHD !IN LENGTH OF REAL CONSTANTS STWORK1A.70
*, LEN1_LEVDEPC !IN First dimension of LEVDEPC STWORK1A.71
*, LEN2_LEVDEPC !IN Second dimension of LEVDEPC STWORK1A.72
*, NUM_STASH_LEVELS !IN DIMENSION OF STASH_LEVELS STWORK1A.73
*, NUM_LEVEL_LISTS !IN DIMENSION OF STASH_LEVELS STWORK1A.74
*, NUM_STASH_PSEUDO !IN Maximum no of pseudo-levels in a list STWORK1A.75
*, NUM_PSEUDO_LISTS !IN Number of pseudo-level lists STWORK1A.76
*, MAX_STASH_LEVS !IN Max no of output levels for any diag STWORK1A.77
*, LEN1_LOOKUP !IN First dimension of LOOKUP/IPPLOOK STWORK1A.78
*, LEN2_LOOKUP !IN Second dimension of LOOKUP STWORK1A.79
*, PP_LEN2_LOOKUP !IN Largest poss. value in PP_LEN2_LOOK STWORK1A.80
*, NUNITS !IN Max i/o FT unit no RS030293.282
*, PP_LEN2_LOOK(20:NUNITS)!IN Individual PP_LEN2_LOOKs per unit RS030293.283
*, PP_PACK_CODE(20:NUNITS)!IN Packing code per unit RS030293.284
*, FT_LASTFIELD(20:NUNITS)!IN Current write posn in each PP file RS030293.285
*, FT_STEPS(20:NUNITS) !IN File reinitialisation freq per unit RS030293.286
*, FT_FIRSTSTEP(20:NUNITS)!IN First step file initialised GRR1F404.5
*, NSTTIMS !IN Number of times against to test STWORK1A.85
*, NSTTABL !IN Number of STASH timetables STWORK1A.86
*, NUM_WORDS !IN Number of 64 Bit words to hold DATA STWORK1A.87
*, sm_ident !IN Submodel identifier GKR1F401.64
*, im_ident !IN Internal model identifier GKR0F305.445
&, dump_pack !IN Packing Indicator for Dump GDR2F401.58
&, sa_idxlen !IN Superarray index length GKR0F400.182
&, sa_idx(sa_idxlen) !IN Superarray index GKR0F400.183
&, stsuparrlen !IN Superarray index length GKR0F400.184
&, istsuparr(stsuparrlen)!IN Integer superarray GKR0F400.185
CHARACTER*80 NF171193.7
* MODEL_FT_UNIT(NUNITS) !IN Current table of file associations NF171193.8
NF171193.9
INTEGER STWORK1A.88
* FIXHD(LEN_FIXHD) !IN ARRAY OF FIXED CONSTANTS STWORK1A.89
*, PP_FIXHD(LEN_FIXHD)!IN Array of fixed constants from PP file STWORK1A.90
*, INTHD(LEN_INTHD) !IN ARRAY OF integer CONSTANTS STWORK1A.91
*, ILSTART !IN START OF LOOP OVER ENTRIES STWORK1A.92
*, ILEND !IN END OF LOOP OVER ENTRIES STWORK1A.93
*, IS !IN SECTION NUMBERS STWORK1A.94
*, IM !IN ITEM NUMBER STWORK1A.95
*, STEP !IN MODEL STEP NUMBER STWORK1A.96
*, steps_per_period !IN No of steps in defining period STWORK1A.97
*, secs_per_period !IN No of secs in period (define timestep) STWORK1A.98
*, previous_time(7) !IN Time at start of current step STWORK1A.99
*, LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) ! Integer LOOKUP headers STWORK1A.101
*, RLOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) ! Real version of LOOKUP STWORK1A.102
*, ICODE !OUT RETURN CODE FROM ROUTINE STWORK1A.103
C STWORK1A.104
INTEGER STWORK1A.105
* LENOUT !IN Length of largest workfield needed STWORK1A.106
*IF DEF,MPP GPB2F405.255
&, global_LENOUT !IN Output length of largest field GPB2F405.256
*ENDIF GPB2F405.257
*, T_field !IN NO OF TEMP/PRESS POINTS STWORK1A.107
*, U_FIELD !IN NO OF U,V POINTS STWORK1A.108
*, ROW_LENGTH !IN No of points per row STWORK1A.109
*, U_ROWS !IN No of U,V, rows STWORK1A.110
*, T_rows !IN No of PRESS/TEMP rows STWORK1A.111
*, T_levels !IN No of model Press/Temp levels STWORK1A.112
*, STASH_WORK_LEN !IN LENGTH of STASH_WORK STWORK1A.113
&, MOS_MASK_LEN !IN Size of MOS_MASK array GPB0F403.2032
*, MOS_OUTPUT_LENGTH !IN No of MOS data pts extracted STWORK1A.114
*, LEN_STLIST !IN No of entries in STASHlist STWORK1A.115
*, STLIST(LEN_STLIST,TOTITEMS) !IN STASHLIST STWORK1A.116
*, SI(NITEMS,0:NSECTS,N_INTERNAL_MODEL) !IN STASH IN ADDRESS GKR0F305.449
*, STTABL(NSTTIMS,NSTTABL)!IN STASH TIME TABLES STWORK1A.118
*, STASH_LEVELS(NUM_STASH_LEVELS+1,NUM_LEVEL_LISTS) STWORK1A.119
*, STASH_PSEUDO_LEVELS(NUM_STASH_PSEUDO+1,NUM_PSEUDO_LISTS) STWORK1A.120
&, MOS_MASK(MOS_MASK_LEN) ! IN mask used to output data on MOS grid GPB0F403.2033
*, FCST_PRD !IN Forecast period STWORK1A.122
*, RUN_INDIC_OP !IN Operational Run indicator (ITAB) STWORK1A.123
C STASH timeseries information STWORK1A.124
*, STASH_SERIES_LEN ! IN no of STASH SERIES records STWORK1A.125
*, stash_series_rec_len ! IN length of each record STWORK1A.126
*, STASH_SERIES(stash_series_rec_len,STASH_SERIES_LEN) STWORK1A.127
C ! IN individual sample records STWORK1A.128
*, stash_ser_index_size ! IN no. of index blocks STWORK1A.129
*, stash_series_index(2,stash_ser_index_size) STWORK1A.130
C ! IN index block (1=start, 2=no of records) STWORK1A.131
*, EXPPXI ! Function to extract ppxref info GKR0F305.454
*, im_index ! Internal model index number GKR0F305.455
&, N1 ! Packing Indicator for Lookup(21) GDR2F401.59
C STWORK1A.132
CHARACTER*(80) CMESSAGE ! OUT MESSAGE FROM ROUTINE TS150793.245
C STWORK1A.134
C STWORK1A.135
LOGICAL STWORK1A.136
* LCYCLIC !IN TRUE if cyclic EW BCs STWORK1A.137
*, LAND(T_field) !IN land sea mask STWORK1A.138
*, ELF !IN True if the input grid is rotated Equatorial STWORK1A.139
C STWORK1A.140
STWORK1A.141
REAL STWORK1A.142
* D1(LEN_TOT) !IN REAL DATA ARRAY STWORK1A.143
*, REALHD(LEN_REALHD) !IN ARRAY OF REAL CONSTANTS STWORK1A.144
*, LEVDEPC(LEN1_LEVDEPC*LEN2_LEVDEPC+1) !IN level dep constants STWORK1A.145
*, STASH_WORK(STASH_WORK_LEN) !IN INPUT work array to STASH STWORK1A.146
&, stsuparr(stsuparrlen) !IN Real superarray GKR0F400.186
GKR0F400.187
C STWORK1A.157
C*---------------------------------------------------------------------- STWORK1A.158
C STWORK1A.159
C Common blocks and PARAMETERs STWORK1A.160
C STWORK1A.161
*CALL STPARAM
STWORK1A.162
*CALL STERR
STWORK1A.163
*CALL CPPXREF
STWORK1A.164
*CALL PPXLOOK
! Contains *CALL VERSION GSS1F401.56
*CALL CLOOKADD
STWORK1A.165
*CALL C_MDI
STWORK1A.166
*IF DEF,MPP GPB1F402.2
*CALL PARVARS
GPB1F402.3
*CALL DECOMPTP
GPB1F402.4
*ENDIF GPB1F402.7
C STWORK1A.167
C Subroutines called STWORK1A.168
C STWORK1A.169
EXTERNAL STOCGT,SPATIAL,MULTI_SPATIAL,STLEVELS,TEMPORAL, STWORK1A.170
& PP_FILE,PP_HEAD,BUFFIN,BUFFOUT,EXPPXI,STWVGT GKR1F401.65
& ,GRIB_FILE,IOERROR,SETPOS,FILE_OPEN,FILE_CLOSE,FLUSH_BUFFER GDR8F405.33
C STWORK1A.172
C Local variables STWORK1A.173
C STWORK1A.174
REAL STWORK1A.175
* PPFIELD(LENOUT) ! Main internal work array STWORK1A.176
&, OCWORK(len_ocwork) ! Extra work array needed by ocean GKR0F400.188
& ! Also used by wave model in STWVGT. GKR1F401.66
C ! - reduced to minimum length in atmos case STWORK1A.178
*, AK_LEV(max_stash_levs) ! The values of A at output levels STWORK1A.179
*, BK_LEV(max_stash_levs) ! The values of B at output levels STWORK1A.180
*, LEVEL(max_stash_levs) ! The levels of the data as REAL nos STWORK1A.181
*, sample_prd ! Sampling period in hours for means, etc STWORK1A.182
*, A_IO ! The output code from the unit command. STWORK1A.183
C STWORK1A.184
*IF DEF,MPP GPB2F405.258
GPB2F405.259
! I/O buffer workspace arrays - used for holding the data to be GPB2F405.260
! written to disk. GPB2F405.261
GPB2F405.262
REAL GPB2F405.263
& buf(global_LENOUT) GPB2F405.264
&, buf3(global_LENOUT) GPB2F405.265
GPB2F405.266
CDIR$ CACHE_ALIGN buf,buf3 GPB2F405.267
GPB2F405.268
*IF DEF,T3E GPB2F405.269
! buf3 is used in direct shmem communications, so some extra stuff is GPB2F405.270
! required since it is not memory aligned: GPB2F405.271
GPB2F405.272
REAL remote_buf3(global_LENOUT) GPB2F405.273
POINTER (ptr_buf3,remote_buf3) GPB2F405.274
INTEGER address GPB2F405.275
COMMON /shmem_address_align/ address GPB2F405.276
GPB2F405.277
*ENDIF GPB2F405.278
*ENDIF GPB2F405.279
INTEGER STWORK1A.185
* IPPLOOK(LEN1_LOOKUP,PP_LEN2_LOOKUP) ! INTEGER LOOKUP TABLE STWORK1A.186
*, N_ROWS_OUT ! No of rows used for a diagnostic STWORK1A.187
*, N_COLS_OUT ! No of cols used PPHORIZ=N_ROWS*N_COLS_ STWORK1A.188
*, SROW_IN,SROW_OUT ! North, South, East and West STWORK1A.189
*, NROW_IN,NROW_OUT ! subdomain limits in the horizontal sense STWORK1A.190
*, WCOL_IN,WCOL_OUT ! corresponding to the subarea before being STWORK1A.191
*, ECOL_IN,ECOL_OUT ! processed (IN) and after processing (OUT) STWORK1A.192
*, LEV_IN_ADDR ! The num of pts skipped in the Input STWORK1A.193
*, GR ! Grid point code STWORK1A.194
*, LBPROC_COMP(14) ! Array of 1/0 denoting LBPROC components STWORK1A.195
*, UNITPP ! PPinit number (also used in PP_FILE) STWORK1A.196
*, LENBUF ! PPHORIZ_OUT rnd to 512 words (used PP) STWORK1A.197
*, COMP_ACCRCY ! PACKING ACCURACY IN POWER OF 2 STWORK1A.198
*, PPHORIZ_OUT ! No of points in the output field STWORK1A.199
*, PPHORIZ_IN ! No of points in the input field STWORK1A.200
*, IWA ! Record no used inSETPOS STWORK1A.201
*, LEN_BUF_WORDS ! Number of 64 Bit words (rounded to 512) STWORK1A.202
*, NUM_LEVS_OUT ! Number of output levels STWORK1A.203
*, NUM_LEVS_IN ! Number of input levels STWORK1A.204
*, NI ! Number of the INPUT STASH_LIST STWORK1A.205
*, NO ! Number of the OUTPUT STASH_LIST STWORK1A.206
*, INDX1 STWORK1A.207
*, INDEX_LEV(MAX_STASH_LEVS) ! Index used to relate input and STWORK1A.208
C ! output levels STWORK1A.209
*, level_list(MAX_STASH_LEVS) ! model level for each output level STWORK1A.210
*, pseudo_level(MAX_STASH_LEVS) ! pseudo-level at each output level STWORK1A.211
*, lv ! LV code for field from PP_XREF STWORK1A.212
*, samples ! no of samples (timeseries/trajec) STWORK1A.213
*, icurrll_dump_ptr ! pointer to mother record LOOKUP STWORK1A.214
*, start_time(7) ! start time for PPheader in STWORK1A.215
C ! timeseries/time mean/accumulation STWORK1A.216
*, no_records ! no of records processed by multi_spatial STWORK1A.217
*, record_start ! the start record for multi_spatial STWORK1A.218
&, PEXNER ! Exner Pressure GKR0F400.189
&, PSTAR ! Surface pressure GKR0F400.190
C GBC0F403.63
cdir$ cache_align ipplook GBC0F403.64
*CALL CNTL_IO
GBC0F403.65
GKR0F400.191
INTEGER STWORK1A.219
& JL,II,IL,JJ,IT, STWORK1A.220
& ntab, ! Number of the STASH TIMES table STWORK1A.221
& IKOUNT, ! Local counter STWORK1A.222
& POINTS, ! No of points in a field STWORK1A.223
& POSN, ! Local temp variable STWORK1A.224
& KL, ! Local counter STWORK1A.225
& ML, ! Local counter STWORK1A.226
* LEN_IO, ! The length of data transferred. STWORK1A.227
* ILPREV, !The counter of the first of a pair of STLIST STWORK1A.228
* ILCURR, ! The current value of IL STWORK1A.229
* IWL, ! The word address of the LOOKUP table STWORK1A.230
* LBVCL, ! Vertical coordinate code in LOOKUP table STWORK1A.231
* ICURRLL, ! Current position in the PP Lookup table STWORK1A.232
* INT_LEVEL, ! Integer copy of level STWORK1A.233
* DUMP_PACKING, ! Copy of packing indicator in dump LOOKUP STWORK1A.234
* DUMP_DATA_TYPE,! Copy of data type in dump LOOKUP TJ140193.6
* I ! loop variable TJ140193.7
* ,J ! Level indicator used in call to GRIB_FILE GO261093.1
* ,PACKING_TYPE ! 0 No packing, 1 for WGDOS, 3 for GRIB GO261093.3
& ,GRIB_PACKING ! ppxref profile number used to determine GRS3F400.277
! grib packing method GRS3F400.278
INTEGER VX,VY,VZ ! SIZES OF ARRAYS. STWORK1A.236
&, st_grid ! Horizontal grid type, (eg. T-p or u-v) STWORK1A.237
*,LEN_PPNAME STWORK1A.238
INTEGER INPUT_CODE ! VALUE OF INPUT_CODE IN STASHLIST STWORK1A.239
INTEGER ADDR ! ADDRESS OF STASH VARIABLE IN EITHER DUMP OR STWORK1A.240
INTEGER ADDR_OUT ! ADDRESS OF SPATIALLY PROCESSED FIELD STWORK1A.241
INTEGER ELAP_TIME ! NO OF TIMESTEPS ELAPSED IN PERIOD. STWORK1A.243
INTEGER SERIES_PTR ! THE ADDRESS IN STASH_SERIES WHERE DOMIN INF STWORK1A.244
INTEGER INDEX_SIZE ! THE NUMBER OF LEVELS IN THE INDEX. STWORK1A.245
INTEGER BASE_LEVEL ! Base model level needed for mass weighting STWORK1A.246
INTEGER top_level ! Top model level for 3D ocean decompress STWORK1A.247
INTEGER base_level0,top_level0 ! Ref base/top levels in levs loop STWORK1A.248
INTEGER what_proc ! What kind of processing will be done STWORK1A.249
INTEGER what_mean ! What kind of meaning will be done STWORK1A.250
INTEGER output_code ! Output destination code from STLIST STWORK1A.251
INTEGER expected_len ! expected length of output field STWORK1A.252
INTEGER ocnlev_bottom ! first ocean level diagnosed STWORK1A.253
LOGICAL STWORK1A.254
& S_F ! TRUE for items requiring processing STWORK1A.255
&, OCEAN ! TRUE if processing an ocean diagnostic STWORK1A.256
&, LLPROC ! TRUE if spatial processing required STWORK1A.257
&, lnullproc ! TRUE if null processing indicated STWORK1A.258
&, lfullfield ! TRUE if output field on full horiz domain STWORK1A.259
&, lmasswt ! TRUE if level-by-level mass-weights exist TJ170993.9
&, start_step ! TRUE at start of time period (TEMPORAL) STWORK1A.260
&, end_step ! TRUE at end of time period (TEMPORAL) STWORK1A.261
&, MOS ! TRUE if MOS output is required STWORK1A.262
&, PACKING ! TRUE if packing required STWORK1A.263
&, GRIB_OUT ! TRUE if output to be in GRIB code. GO261093.4
&, ROTATE ! TRUE if input data to be rotated STWORK1A.265
CHARACTER*14 STWORK1A.266
& PPNAME ! PPfile name decoded from MODEL_FT_UNIT STWORK1A.267
CHARACTER*80 STWORK1A.268
& STRING ! PPfile name decoded from MODEL_FT_UNIT STWORK1A.269
STWORK1A.270
integer expected_extra ! expected length of extra data STWORK1A.271
INTEGER extraw ! number of extra words this timestep TJ140193.8
INTEGER extraw_hdr ! number of extra words for the header TJ140193.9
INTEGER data_type_code ! ppx_data_type code copied from PPX file GTJ0F400.12
INTEGER rotatecode ! code for rotated grid GKR0F305.464
INTEGER NT_DIM ! Number of tracers GKR0F400.192
INTEGER pointer_dummy ! dummy pointer variable for ocean GKR0F400.193
REAL RPPLOOK(64) GO261093.5
GPB1F402.8
*IF DEF,MPP GPB1F402.9
INTEGER GPB1F402.10
! local versions of the subdomain limits GPB1F402.11
& local_NROW_OUT,local_SROW_OUT,local_ECOL_OUT,local_WCOL_OUT GPB1F402.12
&, local_NROW_IN,local_SROW_IN,local_ECOL_IN,local_WCOL_IN GPB0F404.2
! global versions of the total size of output GPB1F402.13
&, global_N_ROWS_OUT,global_N_COLS_OUT, global_PPHORIZ_OUT GPB1F402.14
! MOS variables GPB0F403.2034
&, global_NROWS GPB0F403.2035
&, info ! return variable from GCOM GPB1F402.15
*IF DEF,MPP,AND,DEF,T3E GBCQF405.43
c GBCQF405.44
integer current_io_pe GBCQF405.45
c GBCQF405.46
data current_io_pe/0/ GBCQF405.47
*ENDIF GBCQF405.48
GPB0F403.2036
*ENDIF GPB1F402.16
*IF DEF,T3E,AND,DEF,MPP GDS3F403.2
GDS3F403.3
REAL GDS3F403.4
* IX ! RETURN VALUE FROM UNIT COMMAND GDS3F403.5
GDS3F403.6
integer LENGTH_FULLWRD,num_out,jjj GDS3F403.7
GDS3F403.8
integer len_buf_words_com,num_words_com GDS3F403.9
common/coex_com/len_buf_words_com,num_words_com GDS3F403.10
GDS3F403.11
*ENDIF GDS3F403.12
GPB0F403.2037
INTEGER GPB0F403.2038
& grid_type_code ! grid type of field being processed GPB0F403.2039
GPB0F403.2040
*IF DEF,MPP,AND,DEF,T3E GPB2F405.280
!-------------------------------------------------------------- GPB2F405.281
! Initialise address of buf3, required for later shmem communication GPB2F405.282
address=LOC(buf3) GPB2F405.283
CALL barrier(
) GPB2F405.284
GPB2F405.285
*ENDIF GPB2F405.286
CL---------------------------------------------------------------------- STWORK1A.273
CL 0. Initialise: set constants relating to input grid type and size STWORK1A.274
CL STWORK1A.275
CL 0.1 Set up internal grid type st_grid and input field size GKR0F305.462
CL according to the master GR code for the diagnostic GKR0F305.463
CL STWORK1A.278
GKR0F305.465
! Get internal model index GKR0F305.466
im_index = internal_model_index(im_ident) GKR0F305.467
NT_DIM = (sa_idx(2) - sa_idx(1))/2 GKR0F400.194
GKR0F305.468
if (im_ident .eq. ocean_im) then GKR0F400.195
OCEAN = .true. GKR0F400.196
else GKR0F400.197
OCEAN = .false. GKR0F400.198
endif GKR0F400.199
GKR0F400.200
if ((im_ident .eq. atmos_im) .or. (im_ident .eq. slab_im)) then GKR0F400.201
pexner = stsuparr(sa_idx(7)) GKR0F400.202
pstar = stsuparr(sa_idx(8)) GKR0F400.203
else GKR0F400.204
pointer_dummy = 1 GKR0F400.205
pexner = pointer_dummy GKR0F400.206
pstar = pointer_dummy GKR0F400.207
endif GKR0F400.208
GKR0F305.491
GKR0F305.492
! Get PP_XREF gridtype code GKR0F305.493
GR = EXPPXI
( im_ident, IS, IM, ppx_grid_type, GKR0F305.494
*CALL ARGPPX
GKR0F305.495
& icode, cmessage) GKR0F305.496
grid_type_code=GR GPB0F403.2041
GKR0F305.497
IF (GR.EQ.ppx_atm_tall.OR.GR.EQ.ppx_atm_tland.OR. STWORK1A.282
& GR.EQ.ppx_atm_tsea) THEN STWORK1A.283
C Atmosphere data on T-grid STWORK1A.284
st_grid=st_tp_grid STWORK1A.285
PPHORIZ_IN=T_field STWORK1A.286
ELSEIF (GR.EQ.ppx_atm_uall.OR.GR.EQ.ppx_atm_uland.OR. STWORK1A.287
& GR.EQ.ppx_atm_usea) THEN STWORK1A.288
C Atmosphere data on U-grid STWORK1A.289
st_grid=st_uv_grid STWORK1A.290
PPHORIZ_IN=U_FIELD STWORK1A.291
ELSEIF(GR.EQ.ppx_atm_compressed) THEN STWORK1A.292
C Atmosphere data on T-grid (compressed) STWORK1A.293
st_grid=st_tp_grid STWORK1A.294
PPHORIZ_IN=T_field STWORK1A.295
ELSEIF(GR.EQ.ppx_atm_cuall) THEN STWORK1A.296
C Atmosphere data on C-grid (u-points) STWORK1A.297
st_grid=st_cu_grid STWORK1A.298
PPHORIZ_IN=T_field STWORK1A.299
ELSEIF(GR.EQ.ppx_atm_cvall) THEN STWORK1A.300
C Atmosphere data on C-grid (v-points) STWORK1A.301
st_grid=st_cv_grid STWORK1A.302
PPHORIZ_IN=U_field STWORK1A.303
ELSEIF(GR.EQ.ppx_atm_tzonal) THEN STWORK1A.304
C Atmosphere zonal data on T-grid STWORK1A.305
st_grid=st_zt_grid STWORK1A.306
PPHORIZ_IN=T_rows STWORK1A.307
ELSEIF(GR.EQ.ppx_atm_uzonal) THEN STWORK1A.308
C Atmosphere zonal data on u-grid STWORK1A.309
st_grid=st_zu_grid STWORK1A.310
PPHORIZ_IN=u_rows STWORK1A.311
ELSEIF(GR.EQ.ppx_atm_tmerid) THEN STWORK1A.312
C Atmosphere meridional data on T-grid STWORK1A.313
st_grid=st_mt_grid STWORK1A.314
PPHORIZ_IN=row_length STWORK1A.315
ELSEIF(GR.EQ.ppx_atm_umerid) THEN STWORK1A.316
C Atmosphere meridional data on u-grid STWORK1A.317
st_grid=st_mu_grid STWORK1A.318
PPHORIZ_IN=row_length STWORK1A.319
ELSEIF(GR.EQ.ppx_atm_scalar) THEN STWORK1A.320
C Atmosphere scalar STWORK1A.321
st_grid=st_scalar STWORK1A.322
PPHORIZ_IN=1 STWORK1A.323
ELSEIF (GR.EQ.ppx_ocn_tcomp.OR.GR.EQ.ppx_ocn_tall.OR. STWORK1A.324
& GR.EQ.ppx_ocn_tfield) THEN STWORK1A.325
C Ocean data on T-grid (compressed/uncompressed) STWORK1A.326
st_grid=st_tp_grid STWORK1A.328
PPHORIZ_IN=T_field STWORK1A.329
ELSEIF (GR.EQ.ppx_ocn_ucomp.OR.GR.EQ.ppx_ocn_uall.OR. STWORK1A.330
& GR.EQ.ppx_ocn_ufield) THEN STWORK1A.331
C Ocean data on U-grid (compressed/uncompressed) STWORK1A.332
st_grid=st_uv_grid STWORK1A.334
PPHORIZ_IN=U_FIELD STWORK1A.335
ELSEIF(GR.EQ.ppx_ocn_cuall) THEN STWORK1A.336
C Ocean data on C-grid (u-points) STWORK1A.337
st_grid=st_cu_grid STWORK1A.339
PPHORIZ_IN=T_field STWORK1A.340
ELSEIF(GR.EQ.ppx_ocn_cvall) THEN STWORK1A.341
C Ocean data on C-grid (v-points) STWORK1A.342
st_grid=st_cv_grid STWORK1A.344
PPHORIZ_IN=U_field STWORK1A.345
ELSEIF(GR.EQ.ppx_ocn_tzonal) THEN TJ140193.10
C Ocean zonal data on T-grid STWORK1A.346
st_grid=st_zt_grid STWORK1A.348
PPHORIZ_IN=T_rows STWORK1A.349
ELSEIF(GR.EQ.ppx_ocn_uzonal) THEN TJ140193.11
C Ocean zonal data on u-grid STWORK1A.351
st_grid=st_zu_grid STWORK1A.353
PPHORIZ_IN=u_rows STWORK1A.354
ELSEIF(GR.EQ.ppx_ocn_tmerid) THEN TJ140193.12
C Ocean meridional data on T-grid STWORK1A.356
st_grid=st_mt_grid STWORK1A.358
PPHORIZ_IN=row_length STWORK1A.359
ELSEIF(GR.EQ.ppx_ocn_umerid) THEN TJ140193.13
C Ocean meridional data on u-grid STWORK1A.361
st_grid=st_mu_grid STWORK1A.362
PPHORIZ_IN=row_length STWORK1A.363
ELSEIF(GR.EQ.ppx_ocn_scalar) THEN TJ140193.14
C Ocean scalar STWORK1A.365
st_grid=st_scalar STWORK1A.367
PPHORIZ_IN=1 STWORK1A.368
ELSE STWORK1A.369
C Unknown grid type STWORK1A.370
ICODE=1 STWORK1A.371
CMESSAGE='STWORK : Unknown grid type found in PP_XREF' TJ170993.10
GOTO 999 STWORK1A.373
ENDIF STWORK1A.374
CL STWORK1A.375
CL 0.2 Set up ROTATE to flag fields which are rotated (eg. ELF winds) STWORK1A.376
CL (this is used to set alternative fieldcodes in PPHEAD) STWORK1A.377
CL STWORK1A.378
GKR0F305.498
rotatecode = EXPPXI
( im_ident, IS, IM, ppx_rotate_code, GKR0F305.499
*CALL ARGPPX
GKR0F305.500
& icode, cmessage) GKR0F305.501
GKR0F305.502
IF (rotatecode .EQ. ppx_elf_rotated .AND. ELF) GKR0F305.503
& THEN STWORK1A.380
ROTATE=.TRUE. STWORK1A.381
ELSE STWORK1A.382
ROTATE=.FALSE. STWORK1A.383
ENDIF STWORK1A.384
CL---------------------------------------------------------------------- STWORK1A.385
CL 1. Loop over entries with this section/item number STWORK1A.386
CL STWORK1A.387
DO 200 IL=ILSTART,ILEND !loop over num entries for each item/sec STWORK1A.388
extraw=0 ! no extra data by default TJ140193.15
*IF DEF,PRINT84 STWORK1A.389
WRITE(6,104) IL,IS,IM STWORK1A.390
*ENDIF STWORK1A.391
104 FORMAT(' MAIN LOOP IN STWORK IL/IS/IM ARE',I6,2X,I4,2X,I4) STWORK1A.392
C Set MOS flag if output PP unit indicates output to MOS file STWORK1A.393
MOS=(STLIST(st_output_code,IL).EQ.-89) STWORK1A.394
CL STWORK1A.395
CL 1.1 Set up S_F which has to be set for each STASHLIST entry. The STWORK1A.396
CL STASHFLAG is be set for a particular ITEM/SECTION the S_F for STWORK1A.397
CL the STASHLIST entry. STWORK1A.398
CL STWORK1A.399
S_F=.FALSE. STWORK1A.400
IF (STLIST(st_freq_code,IL).EQ.1.AND. STWORK1A.401
& STEP.GE.STLIST(st_start_time_code,IL).AND. STWORK1A.402
& (STEP.LE.STLIST(st_end_time_code,IL).OR. STWORK1A.403
& STLIST(st_end_time_code,IL).EQ.st_infinite_time)) THEN STWORK1A.404
C ... if required every step between start and end STWORK1A.405
S_F=.TRUE. STWORK1A.406
ELSEIF(STLIST(st_freq_code,IL).LT.0) THEN STWORK1A.407
C ... if required at specified times and this is one of them STWORK1A.408
NTAB=-STLIST(st_freq_code,IL) STWORK1A.409
DO 220 IT=1,NSTTIMS STWORK1A.410
IF (STTABL(IT,NTAB).EQ.st_end_of_list) GOTO 230 STWORK1A.411
IF (STEP.EQ.STTABL(IT,NTAB)) S_F=.TRUE. STWORK1A.412
220 CONTINUE STWORK1A.413
ELSEIF (STLIST(st_freq_code,IL).gt.0) THEN STWORK1A.414
IF (MOD((STEP-STLIST(st_start_time_code,IL)), STWORK1A.415
& STLIST(st_freq_code,IL)).EQ.0.AND. STWORK1A.416
& STEP.GE.STLIST(st_start_time_code,IL).AND. STWORK1A.417
& (STEP.LE.STLIST(st_end_time_code,IL).OR. STWORK1A.418
& STLIST(st_end_time_code,IL).EQ.st_infinite_time)) STWORK1A.419
C ... if required every N timesteps and this is one of them STWORK1A.420
& S_F=.TRUE. STWORK1A.421
ENDIF STWORK1A.422
230 CONTINUE STWORK1A.423
C STWORK1A.424
C S_F now set - Start of IF (S_F) block ....... STWORK1A.425
C STWORK1A.426
IF(S_F) THEN STWORK1A.427
CL STWORK1A.428
CL 1.2 Find number of input and output levels and relative positions STWORK1A.429
CL and set up levels and pseudo-levels arrays for PPheaders. STWORK1A.430
CL Set indicator lmasswt if level-by-level mass weighting possible TJ170993.11
CL - only currently available with atmosphere model full levels. TJ170993.12
CL STWORK1A.431
! special case of mean timeseries leave ilcurr pointing to il GRS1F404.159
GRS1F404.160
ilcurr=il ! The current STASHlist entry IL STWORK1A.432
IF (STLIST(st_input_code,IL).LT.0.and. GRS1F404.161
& STLIST(st_proc_no_code,IL).ne.st_time_series_mean) THEN GRS1F404.162
ilcurr=-STLIST(st_input_code,il) ! points to prev entry STWORK1A.434
ENDIF STWORK1A.435
C STWORK1A.436
GKR0F305.504
C Get PP_XREF lbvc code GKR0F305.505
lbvcl = EXPPXI
( im_ident, IS, IM, ppx_lbvc_code, GKR0F305.506
*CALL ARGPPX
GKR0F305.507
& icode, cmessage) GKR0F305.508
GKR0F305.509
C Get PP_XREF lv code GKR0F305.510
lv = EXPPXI
( im_ident, IS, IM, ppx_lv_code, GKR0F305.511
*CALL ARGPPX
GKR0F305.512
& icode, cmessage) GKR0F305.513
GKR0F305.514
C STWORK1A.439
IF (lv.EQ.ppx_full_level.AND.im_ident .NE. ocean_im) THEN GKR0F305.515
lmasswt=.TRUE. TJ170993.14
ELSE TJ170993.15
lmasswt=.FALSE. TJ170993.16
ENDIF TJ170993.17
C TJ170993.18
IF (lv.EQ.ppx_half_level) THEN STWORK1A.440
CALL STLEVELS
(stlist(1,ilcurr),len_stlist, STWORK1A.441
+ stash_levels,num_stash_levels,num_level_lists, STWORK1A.442
+ stash_pseudo_levels,num_stash_pseudo,num_pseudo_lists, STWORK1A.443
+ max_stash_levs,num_levs_in,num_levs_out,index_size, STWORK1A.444
+ index_lev,level_list, STWORK1A.445
& lbvcl,stsuparr(sa_idx(3)),stsuparr(sa_idx(4)), ! akh,bkh GKR0F400.209
& level,pseudo_level,ak_lev,bk_lev, GKR0F400.210
+ icode,cmessage) STWORK1A.447
ELSE STWORK1A.448
CALL STLEVELS
(stlist(1,ilcurr),len_stlist, STWORK1A.449
+ stash_levels,num_stash_levels,num_level_lists, STWORK1A.450
+ stash_pseudo_levels,num_stash_pseudo,num_pseudo_lists, STWORK1A.451
+ max_stash_levs,num_levs_in,num_levs_out,index_size, STWORK1A.452
+ index_lev,level_list, STWORK1A.453
& lbvcl,stsuparr(sa_idx(3)),stsuparr(sa_idx(4)), ! akh,bkh GKR0F400.211
& level,pseudo_level,ak_lev,bk_lev, GKR0F400.212
+ icode,cmessage) STWORK1A.455
ENDIF STWORK1A.456
IF (icode.gt.0) goto 999 STWORK1A.457
vz=num_levs_in STWORK1A.458
CL STWORK1A.459
CL 1.3 Find the horizontal dimensions for the output grid STWORK1A.460
CL and the input field subdomain limits in which processing happens. STWORK1A.461
CL STWORK1A.462
WCOL_IN= STLIST(st_west_code,ILCURR) ! Input subdomain limits STWORK1A.463
ECOL_IN= STLIST(st_east_code,ILCURR) STWORK1A.464
NROW_IN= STLIST(st_north_code,ILCURR) STWORK1A.465
SROW_IN= STLIST(st_south_code,ILCURR) STWORK1A.466
C STWORK1A.467
IF(MOS) THEN STWORK1A.468
CL STWORK1A.469
CL 1.3.1 MOS output uses hard-wired MOS_OUTPUT_LENGTH, samples,extraw=0 TJ010793.7
CL STWORK1A.471
PPHORIZ_OUT=MOS_OUTPUT_LENGTH STWORK1A.472
NROW_OUT=1 ! Used in PP_HEAD , so set to preserve orig grid STWORK1A.473
WCOL_OUT=1 ! " " " " " " " " " STWORK1A.474
N_ROWS_OUT=1 STWORK1A.475
N_COLS_OUT=MOS_OUTPUT_LENGTH STWORK1A.476
samples=0 STWORK1A.477
extraw_hdr=0 TJ010793.8
ELSE STWORK1A.478
CL STWORK1A.479
CL 1.3.2 Other output types need to calculate lengths in detail STWORK1A.480
CL (ie. number of rows, columns, and horizontal field size) STWORK1A.481
CL according to processing options STWORK1A.482
CL STWORK1A.483
*IF DEF,MPP GPB0F404.3
GPB0F404.4
! Calculate local versions of the subdomain limits and area GPB0F404.5
GPB0F404.6
CALL GLOBAL_TO_LOCAL_SUBDOMAIN
( GPB0F404.7
& .TRUE.,.TRUE., GPB0F404.8
& grid_type_code,mype, GPB0F404.9
& NROW_IN,ECOL_IN,SROW_IN,WCOL_IN, GPB0F404.10
& local_NROW_IN,local_ECOL_IN, GPB0F404.11
& local_SROW_IN,local_WCOL_IN) GPB0F404.12
GPB0F404.13
*ENDIF GPB0F404.14
what_proc=stlist(st_proc_no_code,ilcurr) STWORK1A.484
what_mean=(stlist(st_gridpoint_code,ilcurr)/block_size)* STWORK1A.485
+ block_size STWORK1A.486
samples=0 ! Initialise value for non-timeseries STWORK1A.487
CL STWORK1A.488
CL 1.3.2.1 Time series or trajectory processing STWORK1A.489
CL STWORK1A.490
IF (what_proc.eq.st_time_series_code.or. STWORK1A.491
& what_proc.eq.st_append_traj_code.or. GRS1F404.163
& what_proc.eq.st_time_series_mean) THEN GRS1F404.164
CL STWORK1A.493
CL 1.3.2.2 Compute number of samples in period for timeseries for STWORK1A.494
CL input to PP_HEAD. STWORK1A.495
CL No of output rows and cols are set to the no of points STWORK1A.496
CL in each time sample and number of time samples in the STWORK1A.497
CL period spanned by the output field, respectively. STWORK1A.498
CL STWORK1A.499
samples=stlist(st_period_code,ilcurr)/ STWORK1A.500
& stlist(st_freq_code,ilcurr) STWORK1A.501
wcol_out=1 STWORK1A.502
ecol_out=samples STWORK1A.503
nrow_out=1 STWORK1A.504
srow_out=stlist(st_output_length,ilcurr)/samples STWORK1A.505
*IF DEF,MPP GPB0F404.15
local_WCOL_OUT=1 GPB0F404.16
local_ECOL_OUT=samples GPB0F404.17
local_NROW_OUT=1 GPB0F404.18
local_SROW_OUT=stlist(st_output_length,ilcurr)/samples GPB0F404.19
*ENDIF GPB0F404.20
CL 1.3.2.3 Multi spatial processing of some other type (not supported) STWORK1A.506
ELSEIF (stlist(st_series_ptr,ilcurr).ne.0) THEN STWORK1A.507
ICODE=1323 STWORK1A.508
CMESSAGE='STWORK : Illegal timeseries processing selected' TJ170993.19
GOTO 999 STWORK1A.510
CL 1.3.2.4 Primary record requesting an extract STWORK1A.511
ELSEIF (what_mean.eq.extract_base) THEN STWORK1A.512
WCOL_OUT= WCOL_IN STWORK1A.513
ECOL_OUT= ECOL_IN STWORK1A.514
NROW_OUT= NROW_IN STWORK1A.515
SROW_OUT= SROW_IN STWORK1A.516
*IF DEF,MPP GPB0F404.21
local_WCOL_OUT= local_WCOL_IN GPB0F404.22
local_ECOL_OUT= local_ECOL_IN GPB0F404.23
local_NROW_OUT= local_NROW_IN GPB0F404.24
local_SROW_OUT= local_SROW_IN GPB0F404.25
*ENDIF GPB0F404.26
CL 1.3.2.5 Primary record requesting a vertical mean STWORK1A.517
ELSEIF (what_mean.eq.vert_mean_base) THEN STWORK1A.518
WCOL_OUT= WCOL_IN STWORK1A.519
ECOL_OUT= ECOL_IN STWORK1A.520
NROW_OUT= NROW_IN STWORK1A.521
SROW_OUT= SROW_IN STWORK1A.522
*IF DEF,MPP GPB0F404.27
local_WCOL_OUT= local_WCOL_IN GPB0F404.28
local_ECOL_OUT= local_ECOL_IN GPB0F404.29
local_NROW_OUT= local_NROW_IN GPB0F404.30
local_SROW_OUT= local_SROW_IN GPB0F404.31
*ENDIF GPB0F404.32
CL 1.3.2.6 Primary record requesting a zonal mean STWORK1A.523
ELSEIF (what_mean.eq.zonal_mean_base) THEN STWORK1A.524
WCOL_OUT= 1 STWORK1A.525
ECOL_OUT= 1 STWORK1A.526
NROW_OUT= NROW_IN STWORK1A.527
SROW_OUT= SROW_IN STWORK1A.528
*IF DEF,MPP GPB0F404.33
local_WCOL_OUT= 1 GPB0F404.34
local_ECOL_OUT= 1 GPB0F404.35
local_NROW_OUT= local_NROW_IN GPB0F404.36
local_SROW_OUT= local_SROW_IN GPB0F404.37
*ENDIF GPB0F404.38
CL 1.3.2.7 Primary record requesting a meridional mean STWORK1A.529
ELSEIF (what_mean.eq.merid_mean_base) THEN STWORK1A.530
WCOL_OUT= WCOL_IN STWORK1A.531
ECOL_OUT= ECOL_IN STWORK1A.532
NROW_OUT= 1 STWORK1A.533
SROW_OUT= 1 STWORK1A.534
*IF DEF,MPP GPB0F404.39
local_WCOL_OUT= local_WCOL_IN GPB0F404.40
local_ECOL_OUT= local_ECOL_IN GPB0F404.41
local_NROW_OUT= 1 GPB0F404.42
local_SROW_OUT= 1 GPB0F404.43
*ENDIF GPB0F404.44
CL 1.3.2.8 Primary record requesting a global mean STWORK1A.535
ELSEIF (what_mean.eq.global_mean_base) THEN STWORK1A.536
WCOL_OUT= 1 STWORK1A.537
ECOL_OUT= 1 STWORK1A.538
NROW_OUT= 1 STWORK1A.539
SROW_OUT= 1 STWORK1A.540
*IF DEF,MPP GPB0F404.45
local_WCOL_OUT= 1 GPB0F404.46
local_ECOL_OUT= 1 GPB0F404.47
local_NROW_OUT= 1 GPB0F404.48
local_SROW_OUT= 1 GPB0F404.49
*ENDIF GPB0F404.50
CL 1.3.2.9 Primary record requesting a field mean STWORK1A.541
ELSEIF (what_mean.eq.field_mean_base) THEN STWORK1A.542
WCOL_OUT= 1 STWORK1A.543
ECOL_OUT= 1 STWORK1A.544
NROW_OUT= 1 STWORK1A.545
SROW_OUT= 1 STWORK1A.546
*IF DEF,MPP GPB0F404.51
local_WCOL_OUT= 1 GPB0F404.52
local_ECOL_OUT= 1 GPB0F404.53
local_NROW_OUT= 1 GPB0F404.54
local_SROW_OUT= 1 GPB0F404.55
*ENDIF GPB0F404.56
CL 1.3.2.10 Error trap for unknown request STWORK1A.547
ELSE ! Invalid option STWORK1A.548
icode=st_unknown STWORK1A.549
write(cmessage,87)'unknown option in setup',what_mean STWORK1A.550
goto 999 ! jump to error return STWORK1A.551
ENDIF STWORK1A.552
CL STWORK1A.553
CL 1.3.3 Compute expected length. This differs from total output length STWORK1A.554
CL when data is appended from multiple timesteps into the same STWORK1A.555
CL field, being output_length/number_of_appends in this case. STWORK1A.556
CL STWORK1A.557
IF (stlist(st_output_code,il).ge.0.and. STWORK1A.558
& (what_proc.eq.st_time_series_code.or. GRS1F404.165
& what_proc.eq.st_append_traj_code.or. GRS1F404.166
& what_proc.eq.st_time_series_mean)) THEN GRS1F404.167
series_ptr=stlist(st_series_ptr,il) !set up ptr to stashseries STWORK1A.561
expected_extra=(stash_series_index(2,series_ptr)+1)*6 STWORK1A.562
extraw_hdr=expected_extra TJ140193.17
expected_len=((stlist(st_output_length,ilcurr) STWORK1A.563
& -expected_extra)* STWORK1A.564
& stlist(st_freq_code,ilcurr))/stlist(st_period_code,ilcurr) STWORK1A.565
ELSE STWORK1A.566
expected_len=stlist(st_output_length,ilcurr) STWORK1A.567
expected_extra=0 ! no extra data for non timeseries stuff TJ140193.18
extraw_hdr=0 TJ140193.19
ENDIF STWORK1A.568
CL STWORK1A.569
CL 1.3.6 Compute number of rows and columns and field size for output STWORK1A.570
CL - first adjust easternmost column if field wraps EW STWORK1A.571
CL STWORK1A.572
IF (WCOL_IN .GT.ECOL_IN .AND.LCYCLIC) STWORK1A.573
*IF -DEF,MPP GPB1F402.41
& ECOL_IN =ECOL_IN +ROW_LENGTH STWORK1A.574
*ELSE GPB1F402.42
& ECOL_IN =ECOL_IN + glsize(1) GPB1F402.43
*ENDIF GPB1F402.44
IF (WCOL_OUT.GT.ECOL_OUT.AND.LCYCLIC) STWORK1A.575
*IF -DEF,MPP GPB1F402.45
& ECOL_OUT=ECOL_OUT+ROW_LENGTH STWORK1A.576
*ELSE GPB1F402.46
& ECOL_OUT=ECOL_OUT + glsize(1) GPB1F402.47
*ENDIF GPB1F402.48
C STWORK1A.577
*IF -DEF,MPP GPB1F402.49
N_ROWS_OUT= SROW_OUT - NROW_OUT + 1 STWORK1A.578
N_COLS_OUT= ECOL_OUT - WCOL_OUT + 1 STWORK1A.579
PPHORIZ_OUT= N_ROWS_OUT*N_COLS_OUT STWORK1A.580
*ELSE GPB1F402.50
GPB1F402.51
IF (local_WCOL_OUT .GT. local_ECOL_OUT) GPB0F403.2043
& local_ECOL_OUT=local_ECOL_OUT+ROW_LENGTH-2*Offx GPB0F404.57
GPB0F403.2045
N_ROWS_OUT = local_SROW_OUT - local_NROW_OUT + 1 GPB1F402.60
N_COLS_OUT = local_ECOL_OUT - local_WCOL_OUT + 1 GPB1F402.61
global_N_ROWS_OUT = SROW_OUT - NROW_OUT + 1 GPB1F402.62
global_N_COLS_OUT = ECOL_OUT - WCOL_OUT + 1 GPB1F402.63
GPB1F402.64
PPHORIZ_OUT= N_ROWS_OUT*N_COLS_OUT GPB1F402.65
global_PPHORIZ_OUT=global_N_ROWS_OUT*global_N_COLS_OUT GPB1F402.66
*ENDIF GPB1F402.67
GPB1F402.68
ENDIF ! End of MOS IF block STWORK1A.581
CL STWORK1A.582
CL 1.4 Check to see if any processing is required. STWORK1A.583
CL Set flag LLPROC if some SPATIAL processing indicated. STWORK1A.584
CL NB: If input and output bottom levels differ (or the input and TJ140193.20
CL output pseudo-levels lists differ), level-by-level TJ140193.21
CL processing in the SPATIAL loop IS required. STWORK1A.586
CL MULTI-SPATIAL processing is always required for timeseries. STWORK1A.587
CL STWORK1A.588
*IF -DEF,MPP GPB1F402.69
lfullfield=((st_grid.EQ.st_tp_grid .OR. st_grid.EQ.st_cu_grid) STWORK1A.589
& .AND. stlist(st_west_code,il).eq.1.and. STWORK1A.590
& stlist(st_east_code,il).eq.row_length.and. STWORK1A.591
& stlist(st_north_code,il).eq.1.and. STWORK1A.592
& stlist(st_south_code,il).eq.T_rows) .OR. STWORK1A.593
& ((st_grid.EQ.st_uv_grid .OR. st_grid.EQ.st_cv_grid) STWORK1A.594
& .AND. stlist(st_west_code,il).eq.1.and. STWORK1A.595
& stlist(st_east_code,il).eq.row_length.and. STWORK1A.596
& stlist(st_north_code,il).eq.1.and. STWORK1A.597
& stlist(st_south_code,il).eq.u_rows) .OR. STWORK1A.598
& ((st_grid.EQ.st_zt_grid) STWORK1A.599
& .AND. stlist(st_north_code,il).eq.1.and. STWORK1A.600
& stlist(st_south_code,il).eq.T_rows) .OR. STWORK1A.601
& ((st_grid.EQ.st_zu_grid) STWORK1A.602
& .AND. stlist(st_north_code,il).eq.1.and. STWORK1A.603
& stlist(st_south_code,il).eq.u_rows) .OR. STWORK1A.604
& ((st_grid.EQ.st_mt_grid .OR. st_grid.EQ.st_mu_grid) STWORK1A.605
& .AND. stlist(st_west_code,il).eq.1.and. STWORK1A.606
& stlist(st_east_code,il).eq.row_length) .OR. STWORK1A.607
& (st_grid.EQ.st_scalar) STWORK1A.608
*ELSE GPB1F402.70
lfullfield=((st_grid.EQ.st_tp_grid .OR. st_grid.EQ.st_cu_grid) GPB1F402.71
& .AND. stlist(st_west_code,il).eq.1.and. GPB1F402.72
& stlist(st_east_code,il).eq.glsize(1).and. GPB1F402.73
& stlist(st_north_code,il).eq.1.and. GPB1F402.74
& stlist(st_south_code,il).eq.glsize(2)) .OR. GPB1F402.75
& ((st_grid.EQ.st_uv_grid .OR. st_grid.EQ.st_cv_grid) GPB1F402.76
& .AND. stlist(st_west_code,il).eq.1.and. GPB1F402.77
& stlist(st_east_code,il).eq.glsize(1).and. GPB1F402.78
& stlist(st_north_code,il).eq.1.and. GPB1F402.79
& stlist(st_south_code,il).eq.glsize(2)-1) .OR. GPB1F402.80
& ((st_grid.EQ.st_zt_grid) GPB1F402.81
& .AND. stlist(st_north_code,il).eq.1.and. GPB1F402.82
& stlist(st_south_code,il).eq.glsize(2)) .OR. GPB1F402.83
& ((st_grid.EQ.st_zu_grid) GPB1F402.84
& .AND. stlist(st_north_code,il).eq.1.and. GPB1F402.85
& stlist(st_south_code,il).eq.glsize(2)-1) .OR. GPB1F402.86
& ((st_grid.EQ.st_mt_grid .OR. st_grid.EQ.st_mu_grid) GPB1F402.87
& .AND. stlist(st_west_code,il).eq.1.and. GPB1F402.88
& stlist(st_east_code,il).eq.glsize(1)) .OR. GPB1F402.89
& (st_grid.EQ.st_scalar) GPB1F402.90
*ENDIF GPB1F402.91
lnullproc= lfullfield .AND. STWORK1A.609
& (stlist(st_input_bottom,il).eq. STWORK1A.610
& stlist(st_output_bottom,il)) .and. STWORK1A.611
& (stlist(st_pseudo_in,il).eq. TJ140193.22
& stlist(st_pseudo_out,il)) .and. TJ140193.23
& (stlist(st_gridpoint_code,il).eq. STWORK1A.612
& (extract_base+stash_null_mask_code) .and. STWORK1A.613
& stlist(st_weight_code,IL).eq. STWORK1A.614
& stash_weight_null_code ) STWORK1A.615
IF (STLIST(st_series_ptr,IL).GT.0) THEN STWORK1A.616
lnullproc=.FALSE. ! Timeseries always requires processing STWORK1A.617
ENDIF STWORK1A.618
C LLPROC must be false for MOS output, output from a prev STLIST STWORK1A.619
C or simple extraction of full field with no weighting STWORK1A.620
IF (MOS .or. (STLIST(st_input_code,IL).LT.0.and. GRS1F404.168
& STLIST(st_proc_no_code,IL).ne.st_time_series_mean).or. GRS1F404.169
& lnullproc) THEN GRS1F404.170
LLPROC=.FALSE. STWORK1A.622
ELSE STWORK1A.623
LLPROC=.TRUE. STWORK1A.624
ENDIF STWORK1A.625
CL STWORK1A.626
CL 1.5 Check that no spatial processing is requested if the input field GTJ0F400.13
CL is of integer or logical type -- these types of fields can be GTJ0F400.14
CL passed directly through STASH, for example for coupling purposes, GTJ0F400.15
CL but no arithmetic is allowed at present. GTJ0F400.16
CL STWORK1A.630
data_type_code=EXPPXI
(im_ident,IS,IM,ppx_data_type, GTJ0F400.17
*CALL ARGPPX
GTJ0F400.18
& icode,cmessage) GTJ0F400.19
C GTJ0F400.20
IF (( data_type_code .EQ.ppx_type_int .OR. GTJ0F400.21
& data_type_code .EQ.ppx_type_log) .AND. GTJ0F400.22
& .NOT. lnullproc) THEN GTJ0F400.23
ICODE=st_not_supported STWORK1A.632
CMESSAGE='STWORK : Spatial processing of INT/LOGICAL illegal' GTJ0F400.24
GOTO 999 STWORK1A.634
ENDIF STWORK1A.635
CL---------------------------------------------------------------------- STWORK1A.636
CL 2. Perform spatial processing (loop over output levels) STWORK1A.637
CL STWORK1A.638
IF (LLPROC) THEN ! Processing is required STWORK1A.639
input_code=stlist(st_input_code,il) STWORK1A.640
CL make sure no volume processing asked for as not supported STWORK1A.641
CL this will need adding at some point STWORK1A.642
IF (stlist(st_weight_code,il).eq.stash_weight_volume_code) STWORK1A.643
+ THEN STWORK1A.644
icode=st_not_supported STWORK1A.645
cmessage='STWORK : volume processing not supported' STWORK1A.646
goto 999 STWORK1A.647
ENDIF STWORK1A.648
C Work out vx,vy (depends on kind of grid) STWORK1A.649
IF (st_grid.EQ.st_tp_grid.OR.st_grid.EQ.st_cu_grid) THEN GTJ1F304.34
vx=row_length ! T_rows x row_length STWORK1A.651
vy=T_rows ! worth of data in input field STWORK1A.652
ELSEIF (st_grid.EQ.st_uv_grid.OR.st_grid.EQ.st_cv_grid) THEN GTJ1F304.35
vx=row_length ! u_rows x row_length STWORK1A.654
vy=u_rows ! worth of data in input field STWORK1A.655
ELSEIF (st_grid.EQ.st_zt_grid) THEN STWORK1A.656
vx=1 ! T_rows x 1 STWORK1A.657
vy=T_rows ! worth of data in input field STWORK1A.658
ELSEIF (st_grid.EQ.st_zu_grid) THEN STWORK1A.659
vx=1 ! u_rows x 1 STWORK1A.660
vy=u_rows ! worth of data in input field STWORK1A.661
ELSEIF (st_grid.EQ.st_mt_grid .OR. st_grid.EQ.st_mu_grid) THEN STWORK1A.662
vx=row_length ! 1 x row_length STWORK1A.663
vy=1 ! worth of data in input field STWORK1A.664
ELSEIF (st_grid.EQ.st_scalar) THEN STWORK1A.665
vx=1 ! 1 x 1 STWORK1A.666
vy=1 ! worth of data in input field STWORK1A.667
ENDIF STWORK1A.668
CL Work out if this is the first timestep in a timeseries. TJ140193.24
CL This is required so that the extra data can be generated TJ140193.25
C STWORK1A.673
series_ptr=stlist(st_series_ptr,il) STWORK1A.674
IF (series_ptr.gt.0) THEN ! multi spatial processing reqd. STWORK1A.675
CL recompute expected sizes TJ140193.26
elap_time=step-stlist(st_start_time_code,il) STWORK1A.677
elap_time=mod(elap_time,stlist(st_period_code,il)) STWORK1A.678
start_step=(elap_time.eq.0) TJ140193.27
IF (start_step) THEN TJ140193.28
expected_len=stlist(st_output_length,ilcurr) TJ140193.29
ELSE TJ140193.30
expected_extra=0 ! reset to zero as no extra data TJ140193.31
expected_len=((stlist(st_output_length,ilcurr) TJ140193.32
& -((stash_series_index(2,series_ptr)+1)*6))* TJ140193.33
& stlist(st_freq_code,ilcurr))/stlist(st_period_code,ilcurr) TJ140193.34
ENDIF TJ140193.35
CL STWORK1A.685
CL 2.1 Timeseries extraction section follows STWORK1A.686
CL STWORK1A.687
no_records=stash_series_index(2,series_ptr) STWORK1A.688
record_start=stash_series_index(1,series_ptr) STWORK1A.689
CL STWORK1A.690
CL 2.1.0 Strip/decompress ocean fields using STOCGT if not already STWORK1A.691
CL processed - output result to ocwork STWORK1A.692
CL processed - output result to ocwork GKR1F401.69
CL Similarly decompress wave fields using STWVGT. GKR1F401.70
CL STWORK1A.693
IF (im_ident .eq. ocean_im) THEN GKR0F400.243
base_level=stlist(st_input_bottom,il) STWORK1A.695
top_level=stlist(st_input_top,il) STWORK1A.696
ocnlev_bottom=base_level STWORK1A.697
IF (base_level.LT.0.OR.base_level.EQ.st_special_code)THEN STWORK1A.698
base_level=1 STWORK1A.699
top_level =1 STWORK1A.700
ocnlev_bottom=1 STWORK1A.701
ENDIF STWORK1A.702
IF (input_code.eq.0) THEN STWORK1A.703
CALL STOCGT
( GKR0F400.213
*CALL ARGPPX
GKR0F400.214
& t_rows,row_length,t_levels, GKR0F400.215
& im_ident,sm_ident, GKR1F401.67
& d1,im,is,base_level,top_level, GKR0F400.217
& ocnlev_bottom,rmdi,ocwork,vx,vy,vz, GKR0F400.218
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.219
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.220
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.221
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.222
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.223
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.224
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.225
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.226
& icode,cmessage) GKR0F400.227
IF (icode.GT.0) GOTO 999 TJ010793.9
ELSEIF (input_code.eq.1) THEN STWORK1A.707
CALL STOCGT
( GKR0F400.228
*CALL ARGPPX
GKR0F400.229
& t_rows,row_length,t_levels, GKR0F400.230
& im_ident,sm_ident, GKR1F401.68
& stash_work,im,is,base_level,top_level, GKR0F400.232
& ocnlev_bottom,rmdi,ocwork,vx,vy,vz, GKR0F400.233
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.234
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.235
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.236
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.237
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.238
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.239
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.240
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.241
& icode,cmessage) GKR0F400.242
IF (icode.GT.0) GOTO 999 TJ010793.10
ENDIF STWORK1A.711
GKR1F401.71
ELSEIF (im_ident .eq. wave_im) THEN GKR1F401.72
GKR1F401.73
IF (input_code.eq.0) THEN GKR1F401.74
CALL STWVGT(
GKR1F401.75
*CALL ARGPPX
GKR1F401.76
& t_rows,row_length,im_ident,sm_ident, GKR1F401.77
& d1,im,is,rmdi,ocwork,vx,vy,si, GKR1F401.78
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.79
& ICODE,CMESSAGE) GKR1F401.80
IF (icode.GT.0) GOTO 999 GKR1F401.81
GKR1F401.82
ELSEIF (input_code.eq.1) THEN GKR1F401.83
CALL STWVGT(
GKR1F401.84
*CALL ARGPPX
GKR1F401.85
& t_rows,row_length,im_ident,sm_ident, GKR1F401.86
& stash_work,im,is,rmdi,ocwork,vx,vy,si, GKR1F401.87
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.88
& ICODE,CMESSAGE) GKR1F401.89
IF (icode.GT.0) GOTO 999 GKR1F401.90
ENDIF GKR1F401.91
ENDIF GKR1F401.92
CL STWORK1A.713
CL 2.1.1 Process a primary field from D1 (timeseries) STWORK1A.714
CL STWORK1A.715
IF (input_code.eq.0) THEN STWORK1A.716
IF (im_ident .eq.ocean_im) THEN GKR0F305.523
CALL MULTI_SPATIAL
(ocwork, STWORK1A.718
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2046
+ pphoriz_out,num_levs_out, STWORK1A.720
& d1(pexner), d1(pstar), GKR0F400.244
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.245
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.246
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.247
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.248
& stsuparr(sa_idx(11)), ! land GKR0F400.249
+ row_length,T_rows,u_rows,T_levels, STWORK1A.723
+ ppfield,lenout, TJ300394.17
+ rmdi,stlist(1,il),len_stlist, STWORK1A.725
+ stash_series(1,record_start), STWORK1A.726
+ stash_series_rec_len,no_records, STWORK1A.727
+ index_size,index_lev,level_list, STWORK1A.728
+ start_step,extraw,n_rows_out,n_cols_out, TJ140193.36
+ realhd,len_realhd,inthd,len_inthd,ocean, STWORK1A.730
+ icode,cmessage) STWORK1A.731
ELSE STWORK1A.732
addr=si(im,is,im_index) GKR0F305.524
CALL MULTI_SPATIAL
(d1(addr), STWORK1A.734
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2047
+ pphoriz_out,num_levs_out, STWORK1A.736
& d1(pexner), d1(pstar), GKR0F400.250
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.251
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.252
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.253
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.254
& stsuparr(sa_idx(11)), ! land GKR0F400.255
+ row_length,T_rows,u_rows,T_levels, STWORK1A.739
+ ppfield,lenout, TJ300394.18
+ rmdi,stlist(1,il),len_stlist, STWORK1A.741
+ stash_series(1,record_start), STWORK1A.742
+ stash_series_rec_len,no_records, STWORK1A.743
+ index_size,index_lev,level_list, STWORK1A.744
+ start_step,extraw,n_rows_out,n_cols_out, TJ140193.37
+ realhd,len_realhd,inthd,len_inthd,ocean, STWORK1A.746
+ icode,cmessage) STWORK1A.747
ENDIF STWORK1A.748
CL STWORK1A.749
CL 2.1.2 Process a field from STASHWORK (timeseries) STWORK1A.750
CL STWORK1A.751
ELSEIF (input_code.eq.1) THEN STWORK1A.752
IF (im_ident .eq.ocean_im) THEN GKR0F305.525
CALL MULTI_SPATIAL
(ocwork, STWORK1A.754
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2048
+ pphoriz_out,num_levs_out, STWORK1A.756
& d1(pexner), d1(pstar), GKR0F400.256
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.257
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.258
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.259
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.260
& stsuparr(sa_idx(11)), ! land GKR0F400.261
+ row_length,T_rows,u_rows,T_levels, STWORK1A.759
+ ppfield,lenout, TJ300394.19
+ rmdi,stlist(1,il),len_stlist, STWORK1A.761
+ stash_series(1,record_start), STWORK1A.762
+ stash_series_rec_len,no_records, STWORK1A.763
+ index_size,index_lev,level_list, STWORK1A.764
+ start_step,extraw,n_rows_out,n_cols_out, TJ140193.38
+ realhd,len_realhd,inthd,len_inthd,ocean, STWORK1A.766
+ icode,cmessage) STWORK1A.767
ELSE STWORK1A.768
addr=si(im,is,im_index) GKR0F305.526
CALL MULTI_SPATIAL
(stash_work(addr), STWORK1A.770
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2049
+ pphoriz_out,num_levs_out, STWORK1A.772
& d1(pexner), d1(pstar), GKR0F400.262
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.263
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.264
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.265
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.266
& stsuparr(sa_idx(11)), ! land GKR0F400.267
+ row_length,T_rows,u_rows,T_levels, STWORK1A.775
+ ppfield,lenout, TJ300394.20
+ rmdi,stlist(1,il),len_stlist, STWORK1A.777
+ stash_series(1,record_start), STWORK1A.778
+ stash_series_rec_len,no_records, STWORK1A.779
+ index_size,index_lev,level_list, STWORK1A.780
+ start_step,extraw,n_rows_out,n_cols_out, TJ140193.39
+ realhd,len_realhd,inthd,len_inthd,ocean, STWORK1A.782
+ icode,cmessage) STWORK1A.783
ENDIF STWORK1A.784
ELSEIF (input_code.lt.0) then STWORK1A.785
CL STWORK1A.786
CL 2.1.3 Process a field from previously STASHed position in D1 STWORK1A.787
CL (currently unsupported since diagnostic-of-diagnostic) STWORK1A.788
CL STWORK1A.789
IF (what_proc.eq.st_time_series_mean) THEN GRS1F404.171
! special case of mean timeseries GRS1F404.172
IF (im_ident .eq.ocean_im) THEN GRS1F404.173
! Warning never tested for ocean case GRS1F404.174
CALL MULTI_SPATIAL
(ocwork, GRS1F404.175
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GRS1F404.176
+ pphoriz_out,num_levs_out, GRS1F404.177
& d1(pexner), d1(pstar), GRS1F404.178
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GRS1F404.179
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GRS1F404.180
& stsuparr(sa_idx(9)), ! cos_p_latitude GRS1F404.181
& stsuparr(sa_idx(10)), ! cos_u_latitude GRS1F404.182
& stsuparr(sa_idx(11)), ! land GRS1F404.183
+ row_length,T_rows,u_rows,T_levels, GRS1F404.184
+ ppfield,lenout, GRS1F404.185
+ rmdi,stlist(1,il),len_stlist, GRS1F404.186
+ stash_series(1,record_start), GRS1F404.187
+ stash_series_rec_len,no_records, GRS1F404.188
+ index_size,index_lev,level_list, GRS1F404.189
+ start_step,extraw,n_rows_out,n_cols_out, GRS1F404.190
+ realhd,len_realhd,inthd,len_inthd,ocean, GRS1F404.191
+ icode,cmessage) GRS1F404.192
ELSE GRS1F404.193
! Mother record GRS1F404.194
ILPREV=-stlist(st_input_code,IL) GRS1F404.195
! address of mother record in D1 GRS1F404.196
addr=stlist(20,ILPREV) GRS1F404.197
CALL MULTI_SPATIAL
(D1(addr), GRS1F404.198
+ vx,vy,vz,grid_type_code,st_grid,lcyclic,lmasswt, GRS1F404.199
+ pphoriz_out,num_levs_out, GRS1F404.200
& d1(pexner), d1(pstar), GRS1F404.201
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GRS1F404.202
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GRS1F404.203
& stsuparr(sa_idx(9)), ! cos_p_latitude GRS1F404.204
& stsuparr(sa_idx(10)), ! cos_u_latitude GRS1F404.205
& stsuparr(sa_idx(11)), ! land GRS1F404.206
+ row_length,T_rows,u_rows,T_levels, GRS1F404.207
+ ppfield,lenout, GRS1F404.208
+ rmdi,stlist(1,il),len_stlist, GRS1F404.209
+ stash_series(1,record_start), GRS1F404.210
+ stash_series_rec_len,no_records, GRS1F404.211
+ index_size,index_lev,level_list, GRS1F404.212
+ start_step,extraw,n_rows_out,n_cols_out, GRS1F404.213
+ realhd,len_realhd,inthd,len_inthd,ocean, GRS1F404.214
+ icode,cmessage) GRS1F404.215
ENDIF GRS1F404.216
ELSE GRS1F404.217
icode=st_not_supported STWORK1A.790
cmessage='STWORK1 : diag-of-diagnostic unsupported' STWORK1A.791
goto 999 ! jump to error return STWORK1A.792
ENDIF GRS1F404.218
ELSE STWORK1A.793
icode=st_unknown STWORK1A.794
write(cmessage,87)'unknown input option',input_code STWORK1A.795
goto 999 STWORK1A.796
ENDIF STWORK1A.797
if (icode.ne.0) goto 999 ! error exit STWORK1A.798
IF (start_step.AND.(extraw.NE.expected_extra)) THEN TJ140193.40
icode=st_bad_array_param STWORK1A.800
write(cmessage,89) extraw,expected_extra STWORK1A.801
89 FORMAT('STWORK : Inconsistent length for extra data ', STWORK1A.802
& i8,1x,i8) STWORK1A.803
goto 999 STWORK1A.804
endif STWORK1A.805
C STWORK1A.806
CL pphoriz_out has been computed by multi_spatial TJ140193.41
CL it is the size of the output field TJ140193.42
ELSE ! do "normal" spatial processing STWORK1A.807
CL STWORK1A.808
CL 2.2 Standard spatial processing section follows STWORK1A.809
CL STWORK1A.810
CL In ocean case, a possibly 3D decompression is required (to top_level) STWORK1A.811
CL STWORK1A.812
CL If multi-level processing (ie. vertical, global mean) is performed by TJ170993.24
CL SPATIAL, the input field is passed in with the original start address TJ170993.25
CL but if single-level processing is done by SPATIAL, the field is TJ170993.26
CL passed in with an address pointing to the single level required. TJ170993.27
CL TJ170993.28
base_level0=stlist(st_input_bottom,il) STWORK1A.813
what_proc=stlist(st_gridpoint_code,il) TJ170993.29
IF (im_ident .eq.ocean_im) THEN GKR0F305.527
IF ((what_proc.LT.vert_mean_top .AND. STWORK1A.816
& what_proc.GT.vert_mean_base) .OR. STWORK1A.817
& (what_proc.LT.global_mean_top .AND. STWORK1A.818
& what_proc.GT.global_mean_base)) THEN STWORK1A.819
top_level0=stlist(st_input_top,il) STWORK1A.820
ELSE STWORK1A.821
top_level0=base_level0 STWORK1A.822
ENDIF STWORK1A.823
ENDIF STWORK1A.824
C STWORK1A.825
addr_out=1 ! Initialise output address TJ300394.21
C TJ300394.22
DO kl=1,num_levs_out ! --- Start of levels loop --- STWORK1A.826
C Work out model level if model level range, otherwise set to 1 STWORK1A.827
IF (base_level0.LT.0.OR.base_level0.EQ.st_special_code) STWORK1A.828
& THEN STWORK1A.829
base_level=1 STWORK1A.830
IF (im_ident .eq.ocean_im) THEN GKR0F305.528
top_level =1 STWORK1A.832
ocnlev_bottom=1 STWORK1A.833
ENDIF STWORK1A.834
ELSE STWORK1A.835
base_level=base_level0+index_lev(kl)-1 STWORK1A.836
IF (im_ident .eq.ocean_im) THEN GKR0F305.529
top_level=top_level0+index_lev(kl)-1 STWORK1A.838
ocnlev_bottom=stlist(st_input_bottom,il) STWORK1A.839
ENDIF STWORK1A.840
ENDIF STWORK1A.841
CL STWORK1A.842
CL 2.2.0 Strip/decompress ocean fields using STOCGT if not already STWORK1A.843
CL processed - output result to ocwork STWORK1A.844
CL NB: If 3D global mean is required, perform 3D decompress STWORK1A.845
CL between base_level and top_level. STWORK1A.846
CL STWORK1A.847
IF (im_ident .eq. ocean_im) THEN GKR1F401.93
IF (input_code.eq.0) THEN GKR1F401.94
CALL STOCGT
( GKR1F401.95
*CALL ARGPPX
GKR0F400.269
& t_rows,row_length,t_levels, GKR0F400.270
& im_ident,sm_ident, GKR1F401.96
& d1,im,is,base_level,top_level, GKR0F400.272
& ocnlev_bottom,rmdi,ocwork,vx,vy,vz, GKR0F400.273
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.274
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.275
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.276
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.277
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.278
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.279
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.280
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.281
& icode,cmessage) GKR0F400.282
IF (icode.GT.0) GOTO 999 GKR1F401.97
ELSEIF (input_code.eq.1) THEN GKR1F401.98
CALL STOCGT
( GKR1F401.99
*CALL ARGPPX
GKR0F400.284
& t_rows,row_length,t_levels, GKR0F400.285
& im_ident,sm_ident, GKR1F401.100
& stash_work,im,is,base_level,top_level, GKR0F400.287
& ocnlev_bottom,rmdi,ocwork,vx,vy,vz, GKR0F400.288
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.289
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.290
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.291
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.292
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.293
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.294
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.295
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.296
& icode,cmessage) GKR0F400.297
IF (icode.GT.0) GOTO 999 GKR1F401.101
ENDIF GKR1F401.102
GKR1F401.103
ELSEIF (im_ident .eq. wave_im) THEN GKR1F401.104
GKR1F401.105
IF (input_code.eq.0) THEN GKR1F401.106
CALL STWVGT(
GKR1F401.107
*CALL ARGPPX
GKR1F401.108
& t_rows,row_length,im_ident,sm_ident, GKR1F401.109
& d1,im,is,rmdi,ocwork,vx,vy,si, GKR1F401.110
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.111
& ICODE,CMESSAGE) GKR1F401.112
IF (icode.GT.0) GOTO 999 GKR1F401.113
GKR1F401.114
ELSEIF (input_code.eq.1) THEN GKR1F401.115
CALL STWVGT(
GKR1F401.116
*CALL ARGPPX
GKR1F401.117
& t_rows,row_length,im_ident,sm_ident, GKR1F401.118
& stash_work,im,is,rmdi,ocwork,vx,vy,si, GKR1F401.119
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.120
& ICODE,CMESSAGE) GKR1F401.121
IF (icode.GT.0) GOTO 999 GKR1F401.122
GKR1F401.123
ENDIF GKR1F401.124
ENDIF STWORK1A.856
CL STWORK1A.857
CL 2.2.1 Process a primary field from D1 (or ocwork if OCEAN field) STWORK1A.858
CL STWORK1A.859
IF (input_code.eq.0) THEN STWORK1A.860
if (im_ident .eq. ocean_im) then GKR0F305.538
CALL SPATIAL
(ocwork,vx,vy,vz, TJ170993.30
+ grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2050
+ n_cols_out,n_rows_out,base_level, STWORK1A.863
+ level_list,index_lev,index_size, STWORK1A.864
& d1(pexner), d1(pstar), GKR0F400.298
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.299
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.300
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.301
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.302
& stsuparr(sa_idx(11)), ! land GKR0F400.303
+ row_length,T_rows,u_rows,T_levels, STWORK1A.867
+ ppfield(addr_out),pphoriz_out, TJ300394.23
+ stlist(1,il),len_stlist,rmdi, STWORK1A.869
+ icode,cmessage) STWORK1A.870
ELSE STWORK1A.871
IF ((what_proc.LT.vert_mean_top .AND. TJ170993.32
& what_proc.GT.vert_mean_base) .OR. TJ170993.33
& (what_proc.LT.global_mean_top .AND. TJ170993.34
& what_proc.GT.global_mean_base)) THEN TJ170993.35
addr=si(im,is,im_index) GKR0F305.539
ELSE TJ170993.37
addr=si(im,is,im_index)+ GKR0F305.540
& (index_lev(kl)-1)*pphoriz_in GKR0F305.541
ENDIF TJ170993.39
IF (addr.lt.1.or.addr.gt.len_tot) THEN STWORK1A.873
icode=st_bad_address STWORK1A.874
cmessage='STWORK : D1 address out of bounds' STWORK1A.875
goto 999 STWORK1A.876
ENDIF STWORK1A.877
CALL SPATIAL
(d1(addr),vx,vy,vz, TJ170993.40
+ grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2051
+ n_cols_out,n_rows_out,base_level, STWORK1A.879
+ level_list,index_lev,index_size, STWORK1A.880
& d1(pexner), d1(pstar), GKR0F400.304
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.305
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.306
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.307
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.308
& stsuparr(sa_idx(11)), ! land GKR0F400.309
+ row_length,T_rows,u_rows,T_levels, STWORK1A.883
+ ppfield(addr_out),pphoriz_out, TJ300394.24
+ stlist(1,il),len_stlist,rmdi, STWORK1A.885
+ icode,cmessage) STWORK1A.886
ENDIF STWORK1A.887
CL STWORK1A.888
CL 2.2.2 Process a field from STASHWORK (or ocwork if OCEAN) STWORK1A.889
CL STWORK1A.890
ELSEIF (input_code.eq.1) THEN STWORK1A.891
IF (im_ident .eq. ocean_im) THEN GKR0F305.542
CALL SPATIAL
(ocwork,vx,vy,vz, TJ170993.42
+ grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2052
+ n_cols_out,n_rows_out,base_level, STWORK1A.894
+ level_list,index_lev,index_size, STWORK1A.895
& d1(pexner), d1(pstar), GKR0F400.310
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.311
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.312
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.313
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.314
& stsuparr(sa_idx(11)), ! land GKR0F400.315
+ row_length,T_rows,u_rows,T_levels, STWORK1A.898
+ ppfield(addr_out),pphoriz_out, TJ300394.25
+ stlist(1,il),len_stlist,rmdi, STWORK1A.900
+ icode,cmessage) STWORK1A.901
ELSE STWORK1A.902
IF ((what_proc.LT.vert_mean_top .AND. TJ170993.44
& what_proc.GT.vert_mean_base) .OR. TJ170993.45
& (what_proc.LT.global_mean_top .AND. TJ170993.46
& what_proc.GT.global_mean_base)) THEN TJ170993.47
addr=si(im,is,im_index) GKR0F305.543
ELSE TJ170993.49
addr=si(im,is,im_index)+ GKR0F305.544
& (index_lev(kl)-1)*pphoriz_in GKR0F305.545
ENDIF TJ170993.51
IF (addr.lt.1.or.addr.gt.stash_work_len) THEN STWORK1A.904
icode=st_bad_address STWORK1A.905
cmessage='STWORK : STASHWORK addr out of bounds' STWORK1A.906
goto 999 STWORK1A.907
ENDIF STWORK1A.908
CALL SPATIAL
(stash_work(addr),vx,vy,vz, TJ170993.52
+ grid_type_code,st_grid,lcyclic,lmasswt, GPB0F403.2053
+ n_cols_out,n_rows_out,base_level, TJ170993.54
+ level_list,index_lev,index_size, STWORK1A.911
& d1(pexner), d1(pstar), GKR0F400.316
& stsuparr(sa_idx(5)), ! a_levdepc(jdelta_ak) GKR0F400.317
& stsuparr(sa_idx(6)), ! a_levdepc(jdelta_bk) GKR0F400.318
& stsuparr(sa_idx(9)), ! cos_p_latitude GKR0F400.319
& stsuparr(sa_idx(10)), ! cos_u_latitude GKR0F400.320
& stsuparr(sa_idx(11)), ! land GKR0F400.321
+ row_length,T_rows,u_rows,T_levels, STWORK1A.914
+ ppfield(addr_out),pphoriz_out, TJ300394.26
+ stlist(1,il),len_stlist,rmdi, STWORK1A.916
+ icode,cmessage) STWORK1A.917
ENDIF STWORK1A.918
ELSEIF (input_code.lt.0) THEN STWORK1A.919
CL STWORK1A.920
CL 2.2.3 Process a field from previously STASHed position in D1 STWORK1A.921
CL (currently unsupported since diagnostic-of-diagnostic) STWORK1A.922
CL STWORK1A.923
icode=st_not_supported STWORK1A.924
cmessage='STWORK1 : diag-of-diagnostic unsupported' STWORK1A.925
goto 999 STWORK1A.926
ELSE STWORK1A.927
icode=st_unknown STWORK1A.928
write(cmessage,87)'unknown input option',input_code STWORK1A.929
87 format('STWORK1 : >>FATAL ERROR <<',a,1x,i5) GPB0F405.142
goto 999 STWORK1A.931
ENDIF STWORK1A.932
C STWORK1A.933
IF (icode.gt.0) goto 999 ! Trap error STWORK1A.934
C STWORK1A.935
CL compute pphoriz_out TJ140193.43
CL pphoriz_out is the size of the output vector TJ140193.44
CL we should not be doing timeseries processing here. TJ140193.45
CL TJ300394.27
CL NOTE: n_cols_out and n_rows_out should agree with values calculated TJ300394.28
CL before, but are not checked for consistency. TJ300394.29
C TJ140193.46
pphoriz_out=n_cols_out*n_rows_out STWORK1A.936
addr_out=addr_out+pphoriz_out ! increment output address TJ140193.47
ENDDO ! --- End of levels loop --- STWORK1A.939
C STWORK1A.940
ENDIF ! End of multi-spatial/spatial IF block STWORK1A.941
C STWORK1A.942
IF (icode.gt.0) goto 999 ! Trap processing error STWORK1A.943
CL STWORK1A.944
CL 2.3 Set length of output field and check against expected length STWORK1A.945
CL STWORK1A.946
CL check that extrawords are the same as the expected number of extrawor STWORK1A.947
*IF DEF,MPP GPB1F402.98
! Calculate size of global pphoriz_out - the size on disk GPB1F402.99
GPB1F402.100
IF (what_proc .eq. st_time_series_code .OR. GRS1F404.219
& what_proc .eq. st_time_series_mean) THEN GRS1F404.220
global_pphoriz_out=pphoriz_out GPB0F403.2055
global_n_rows_out=n_rows_out GPB1F404.68
global_n_cols_out=n_cols_out GPB1F404.69
ELSE GPB0F403.2056
CALL STASH_GET_GLOBAL_SIZE
( GPB0F403.2057
& stlist(st_north_code,il) , stlist(st_east_code,il), GPB0F403.2058
& stlist(st_south_code,il) , stlist(st_west_code,il), GPB0F403.2059
& 1, GPB0F403.2060
& STLIST(st_gridpoint_code,il) , STLIST(st_proc_no_code,il), GPB0F403.2061
& global_pphoriz_out, GPB0F403.2062
& ICODE, CMESSAGE) GPB0F403.2063
GPB1F402.108
IF (icode .ne. 0) goto 999 GPB0F403.2064
GPB0F403.2065
ENDIF GPB0F403.2066
GPB1F402.110
*ENDIF GPB1F402.111
IF (pphoriz_out*num_levs_out.ne.expected_len) THEN STWORK1A.948
icode=st_bad_array_param STWORK1A.949
write(cmessage,88) pphoriz_out*num_levs_out,expected_len STWORK1A.950
88 FORMAT('STWORK : Inconsistent length for output field ', STWORK1A.951
& i8,1x,i8) STWORK1A.952
goto 999 STWORK1A.953
ENDIF STWORK1A.954
ELSE STWORK1A.955
CL---------------------------------------------------------------------- STWORK1A.956
CL 3. No SPATIAL processing - extract output field by direct copy STWORK1A.957
CL STWORK1A.958
IF(MOS) THEN ! Mos OUTPUT STWORK1A.959
CL STWORK1A.960
CL 3.1 MOS output. STWORK1A.961
CL STWORK1A.962
C Establish which grid the data is on ie wind/pts temp/pts ocean etc STWORK1A.963
IF(st_grid.EQ.st_tp_grid.OR.st_grid.EQ.st_cu_grid) THEN STWORK1A.964
POINTS=T_field STWORK1A.965
*IF DEF,MPP GPB0F403.2067
global_NROWS=glsize(2) GPB0F403.2068
*ENDIF GPB0F403.2069
ELSE STWORK1A.966
POINTS=U_FIELD STWORK1A.967
*IF DEF,MPP GPB0F403.2070
global_NROWS=glsize(2)-1 GPB0F403.2071
*ENDIF GPB0F403.2072
ENDIF STWORK1A.968
IF(PPHORIZ_IN.NE.POINTS) THEN STWORK1A.969
ICODE=1 STWORK1A.970
CMESSAGE='STWORK : MOS input must be a complete field' STWORK1A.971
GOTO 999 STWORK1A.972
ENDIF STWORK1A.973
IKOUNT=0 STWORK1A.974
*IF -DEF,MPP GPB0F403.2073
DO 311 KL=1,NUM_LEVS_OUT STWORK1A.975
IF(STLIST(st_input_code,IL).LT.0) THEN ! previous entry STWORK1A.976
LEV_IN_ADDR=(KL-1)*PPHORIZ_IN STWORK1A.977
II=-STLIST(st_input_code,IL) STWORK1A.978
DO JL=1,PPHORIZ_IN STWORK1A.979
IF(MOS_MASK(JL).EQ.1) THEN STWORK1A.980
IKOUNT=IKOUNT+1 STWORK1A.981
POSN=LEV_IN_ADDR+JL-1 STWORK1A.982
PPFIELD(IKOUNT)=D1(STLIST(st_output_addr,II)+POSN) STWORK1A.983
ENDIF STWORK1A.984
ENDDO STWORK1A.985
ELSE ! Current STASH list STWORK1A.986
LEV_IN_ADDR=(INDEX_LEV(KL)-1)*PPHORIZ_IN STWORK1A.987
IF(STLIST(st_input_code,IL).EQ.0) THEN ! DATA in D1 STWORK1A.988
DO JL=1,PPHORIZ_IN STWORK1A.989
IF(MOS_MASK(JL).EQ.1) THEN STWORK1A.990
IKOUNT=IKOUNT+1 STWORK1A.991
POSN=LEV_IN_ADDR+JL-1 STWORK1A.992
PPFIELD(IKOUNT)=D1(SI(IM,IS,im_index)+POSN) GKR0F305.546
ENDIF STWORK1A.994
ENDDO STWORK1A.995
ELSE ! DATA in STWORK STWORK1A.996
DO JL=1,PPHORIZ_IN STWORK1A.997
IF (MOS_MASK(JL).EQ.1) THEN STWORK1A.998
IKOUNT=IKOUNT+1 STWORK1A.999
POSN=LEV_IN_ADDR+JL-1 STWORK1A.1000
PPFIELD(IKOUNT)=STASH_WORK(SI(IM,IS,im_index)+POSN) GKR0F305.547
ENDIF STWORK1A.1002
ENDDO STWORK1A.1003
ENDIF STWORK1A.1004
ENDIF STWORK1A.1005
311 CONTINUE STWORK1A.1006
*ELSE GPB0F403.2074
STWORK1A.1007
! Send the required field to PE 0 (buf), and pack into PPFIELD GPB0F403.2075
DO KL=1,NUM_LEVS_OUT GPB0F403.2076
GPB0F403.2077
! Gather the field into buf1 array on PE 0 GPB0F403.2078
GPB0F403.2079
IF(STLIST(st_input_code,IL).LT.0) THEN ! previous entry GPB0F403.2080
GPB0F403.2081
II=-STLIST(st_input_code,IL) GPB0F403.2082
LEV_IN_ADDR=(KL-1)*PPHORIZ_IN GPB0F403.2083
GPB0F403.2084
CALL GATHER_FIELD
( GPB0F403.2085
& D1(STLIST(st_output_addr,II)+LEV_IN_ADDR),buf, GPB0F403.2086
& ROW_LENGTH,T_ROWS, GPB0F403.2087
& glsize(1),global_NROWS, GPB0F403.2088
& 0,gc_all_proc_group, GPB0F403.2089
& info) GPB0F403.2090
GPB0F403.2091
ELSE ! Current STASH list GPB0F403.2092
LEV_IN_ADDR=(INDEX_LEV(KL)-1)*PPHORIZ_IN GPB0F403.2093
GPB0F403.2094
IF (STLIST(st_input_code,IL).EQ.0) THEN ! DATA in D1 GPB0F403.2095
GPB0F403.2096
CALL GATHER_FIELD
( GPB0F403.2097
& D1(SI(IM,IS,im_index)+LEV_IN_ADDR),buf, GPB0F403.2098
& ROW_LENGTH,T_ROWS, GPB0F403.2099
& glsize(1),global_NROWS, GPB0F403.2100
& 0,gc_all_proc_group, GPB0F403.2101
& info) GPB0F403.2102
GPB0F403.2103
ELSE ! DATA in STWORK GPB0F403.2104
GPB0F403.2105
CALL GATHER_FIELD
( GPB0F403.2106
& STASH_WORK(SI(IM,IS,im_index)+LEV_IN_ADDR),buf, GPB0F403.2107
& ROW_LENGTH,T_ROWS, GPB0F403.2108
& glsize(1),global_NROWS, GPB0F403.2109
& 0,gc_all_proc_group, GPB0F403.2110
& info) GPB0F403.2111
GPB0F403.2112
ENDIF GPB0F403.2113
ENDIF GPB0F403.2114
GPB0F403.2115
! PE 0 must now pack the field using the mask in MOS_MASK GPB0F403.2116
! from the buf array into PPFIELD GPB0F403.2117
GPB0F403.2118
DO JL=1,glsize(1)*global_NROWS GPB0F403.2119
IF (MOS_MASK(JL).EQ.1) THEN GPB0F403.2120
IKOUNT=IKOUNT+1 GPB0F403.2121
GPB0F403.2122
IF (mype .EQ. 0) GPB0F403.2123
& PPFIELD(IKOUNT)=buf(JL) GPB0F403.2124
GPB0F403.2125
ENDIF GPB0F403.2126
ENDDO GPB0F403.2127
GPB0F403.2128
ENDDO ! KL : loop over output levels GPB0F403.2129
GPB0F403.2130
global_PPHORIZ_OUT=PPHORIZ_OUT GPB0F403.2131
global_N_ROWS_OUT=N_ROWS_OUT GPB0F403.2132
global_N_COLS_OUT=N_COLS_OUT GPB0F403.2133
GPB0F403.2134
*ENDIF GPB0F403.2135
GPB0F403.2136
IF(IKOUNT/NUM_LEVS_OUT.NE.PPHORIZ_OUT)THEN STWORK1A.1008
WRITE(6,*)'MOS_OUTPUT_LENGTH ',MOS_OUTPUT_LENGTH GIE0F403.639
WRITE(6,*)'IKOUNT ',IKOUNT GIE0F403.640
ICODE=1 STWORK1A.1011
CMESSAGE='STWORK MOS_OUTPUT_LENGTH not = to MOS_MASK' STWORK1A.1012
GOTO 999 STWORK1A.1013
ENDIF STWORK1A.1014
STWORK1A.1015
ELSE STWORK1A.1016
CL STWORK1A.1017
CL 3.2 Other output - determine input source STWORK1A.1018
CL STWORK1A.1019
input_code=STLIST(st_input_code,IL) STWORK1A.1020
CL STWORK1A.1021
CL 3.2.1 Ocean fields need to be stripped/decompressed using STOCGT STWORK1A.1022
CL if not already processed, and output to ppfield array STWORK1A.1023
CL except when input is already STASHed in D1 (input_code.lt.0) GMC1F403.4
CL STWORK1A.1024
IF ( (im_ident .eq. ocean_im).AND.(input_code.eq.0) ) THEN GMC1F403.5
base_level=stlist(st_input_bottom,il) STWORK1A.1026
C Set base_level to 1 for special level fields STWORK1A.1027
IF (base_level.eq.st_special_code) base_level=1 GKR1F401.127
CALL STOCGT
( GKR1F401.128
*CALL ARGPPX
GKR0F400.325
& t_rows,row_length,t_levels, GKR0F400.326
& im_ident,sm_ident, GKR1F401.129
& d1,im,is,base_level,base_level+num_levs_out-1, GKR0F400.328
& base_level,rmdi,ppfield,vx,vy,vz, GKR0F400.329
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.330
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.331
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.332
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.333
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.334
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.335
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.336
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.337
& icode,cmessage) GKR0F400.338
IF (icode.GT.0) GOTO 999 GKR1F401.130
ELSEIF ((im_ident.eq.ocean_im).AND.(input_code.eq.1)) THEN GMC1F403.6
base_level=stlist(st_input_bottom,il) GKR1F401.132
C Set base_level to 1 for special level fields or input levels lists TJ010793.14
IF (base_level.LT.0.OR.base_level.EQ.st_special_code) GKR1F401.133
& base_level=1 GKR1F401.134
CALL STOCGT
( GKR0F400.339
*CALL ARGPPX
GKR0F400.340
& t_rows,row_length,t_levels, GKR0F400.341
& im_ident,sm_ident, GKR1F401.135
& stash_work,im,is,base_level, GKR0F400.343
& base_level+num_levs_out-1, GKR0F400.344
& base_level,rmdi,ppfield,vx,vy,vz, GKR0F400.345
& nt_dim,si,istsuparr(sa_idx(1)), ! joc_tracer GKR0F400.346
& istsuparr(sa_idx(2)), ! joc_u GKR0F400.347
& istsuparr(sa_idx(3)), ! joc_v GKR0F400.348
& istsuparr(sa_idx(6)), ! o_cfi1, GKR0F400.349
& istsuparr(sa_idx(7)), ! o_cfi2 GKR0F400.350
& istsuparr(sa_idx(8)), ! o_cfi3 GKR0F400.351
& istsuparr(sa_idx(4)), ! joc_no_seapts GKR0F400.352
& istsuparr(sa_idx(5)), ! joc_no_segs GKR0F400.353
& icode,cmessage) GKR0F400.354
IF (icode.GT.0) GOTO 999 GKR1F401.136
CL GKR1F401.138
CL 3.2.1.1 Wave fields need to be stripped/decompressed using STWVGT GKR1F401.139
CL if not already processed, and output to ppfield array GKR1F401.140
CL except when input is already STASHed in D1 (input_code.lt.0) GMC1F403.7
CL GKR1F401.141
ELSEIF ((im_ident.eq.wave_im).AND.(input_code.eq.0)) THEN GMC1F403.8
CALL STWVGT(
GKR1F401.145
*CALL ARGPPX
GKR1F401.146
& t_rows,row_length,im_ident,sm_ident, GKR1F401.147
& d1,im,is,rmdi,ppfield,vx,vy,si, GKR1F401.148
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.149
& ICODE,CMESSAGE) GKR1F401.150
IF (icode.GT.0) GOTO 999 GKR1F401.151
GKR1F401.152
ELSEIF ((im_ident.eq.wave_im).AND.(input_code.eq.1)) THEN GMC1F403.9
CALL STWVGT(
GKR1F401.154
*CALL ARGPPX
GKR1F401.155
& t_rows,row_length,im_ident,sm_ident, GKR1F401.156
& stash_work,im,is,rmdi,ppfield,vx,vy,si, GKR1F401.157
& istsuparr(sa_idx(1)), ! land-sea mask GKR1F401.158
& ICODE,CMESSAGE) GKR1F401.159
IF (icode.GT.0) GOTO 999 GKR1F401.160
GKR1F401.162
CL STWORK1A.1041
CL 3.2.2 Other fields are simply copied STWORK1A.1042
CL STWORK1A.1043
ELSEIF (input_code.eq.0) THEN STWORK1A.1044
C Simple extraction with no weighting from primary field in D1 STWORK1A.1045
C except for those needing special extraction on funny grids GMC1F403.10
C (Ocean, Wave) GMC1F403.11
addr=si(im,is,im_index) GKR0F305.556
DO JL=1,STLIST(st_output_length,IL) STWORK1A.1047
PPFIELD(JL)=D1(addr+JL-1) STWORK1A.1048
ENDDO STWORK1A.1049
ELSEIF (input_code.eq.1) THEN STWORK1A.1050
C Simple extraction with no weighting from STASH_WORK STWORK1A.1051
C except for those needing special extraction on funny grids GMC1F403.12
C (Ocean, Wave) GMC1F403.13
addr=si(im,is,im_index) GKR0F305.557
DO JL=1,STLIST(st_output_length,IL) STWORK1A.1053
PPFIELD(JL)=STASH_WORK(addr+JL-1) STWORK1A.1054
ENDDO STWORK1A.1055
ELSEIF (input_code.lt.0) THEN STWORK1A.1056
C Previously STASHed entry in D1 STWORK1A.1057
C for all sub-models as diagnostic D1 is always on a proper grid. GMC1F403.14
GMC1F403.15
addr=STLIST(st_output_addr,-input_code) STWORK1A.1058
DO JL=1,STLIST(st_output_length,IL) STWORK1A.1059
PPFIELD(JL)=D1(addr+JL-1) STWORK1A.1060
ENDDO STWORK1A.1061
ELSE STWORK1A.1062
C Illegal input code STWORK1A.1063
ICODE=st_unknown STWORK1A.1064
CMESSAGE='STWORK : Unknown input code encountered' STWORK1A.1065
GOTO 999 STWORK1A.1066
ENDIF STWORK1A.1067
ENDIF ! End of IF for test if MOS output STWORK1A.1068
ENDIF ! End of LLPROC IF BLOCK ************************ STWORK1A.1069
STWORK1A.1070
CL----------------------------------------------------------------- STWORK1A.1071
CL 4. OUTPUT section. STWORK1A.1072
CL STWORK1A.1073
CL The data is in PPFIELD with a length LENOUT. STWORK1A.1074
CL The horizontal field size PPHORIZ_OUT and number of output levels STWORK1A.1075
CL NUM_LEVS_OUT were calculated in section 1. STWORK1A.1076
CL Output option depends on the STLIST code. STWORK1A.1077
CL STWORK1A.1078
CL 4.0 Find mother STASHlist record if necessary. STWORK1A.1079
CL TJ140193.48
C Packing_type not set from PP_FILE in the ELSE IF part of block. GO261093.6
PACKING_TYPE = 0 ! Default is unpacked. GO261093.7
IF(STLIST(st_input_code,IL).LT.0) THEN ! Second of two STLIST STWORK1A.1083
ILPREV=-STLIST(st_input_code,IL) STWORK1A.1084
ELSE STWORK1A.1085
ilprev=IL ! no daughter record STWORK1A.1086
ENDIF STWORK1A.1087
CL STWORK1A.1088
CL 4.0.1 Set up LBPROC sub-components based on STASH processing info. STWORK1A.1089
CL STWORK1A.1090
DO JJ=1,14 STWORK1A.1091
LBPROC_COMP(JJ)=0 STWORK1A.1092
ENDDO STWORK1A.1093
C STWORK1A.1094
IF(STLIST(st_gridpoint_code,ilprev).GE.zonal_mean_base) STWORK1A.1095
& LBPROC_COMP(7)=1 STWORK1A.1096
C STWORK1A.1097
IF((STLIST(st_gridpoint_code,ilprev).GE.vert_mean_base .AND. STWORK1A.1098
& STLIST(st_gridpoint_code,ilprev).LT.vert_mean_top) .OR. STWORK1A.1099
& (STLIST(st_gridpoint_code,ilprev).GE.global_mean_base .AND. STWORK1A.1100
& STLIST(st_gridpoint_code,ilprev).LT.global_mean_top)) STWORK1A.1101
& LBPROC_COMP(12)=1 STWORK1A.1102
C STWORK1A.1103
IF((STLIST(st_proc_no_code,ilprev).EQ.st_accum_code) .OR. STWORK1A.1104
& (STLIST(st_proc_no_code,ilprev).EQ.st_time_mean_code).OR. GRS1F404.221
& (STLIST(st_proc_no_code,ilprev).EQ.st_time_series_mean)) GRS1F404.222
& LBPROC_COMP(8)=1 STWORK1A.1106
C STWORK1A.1107
IF(STLIST(st_proc_no_code,ilprev).EQ.st_min_code) STWORK1A.1108
& LBPROC_COMP(13)=1 STWORK1A.1109
C STWORK1A.1110
IF(STLIST(st_proc_no_code,ilprev).EQ.st_max_code) STWORK1A.1111
& LBPROC_COMP(14)=1 STWORK1A.1112
C STWORK1A.1113
output_code=STLIST(st_output_code,IL) STWORK1A.1114
CL STWORK1A.1115
CL 4.1 OUTPUT to PPfile STWORK1A.1116
CL STWORK1A.1117
IF (output_code.LT.0) THEN ! PP Output STWORK1A.1118
C Find appropriate dump header if a daughter record STWORK1A.1119
IF (il.ne.ilcurr) then STWORK1A.1120
icurrll_dump_ptr=stlist(st_lookup_ptr,ilcurr) STWORK1A.1121
ENDIF STWORK1A.1122
CL STWORK1A.1123
CL 4.1.0 Determine output PP unit and associated filename; OPEN file STWORK1A.1124
CL STWORK1A.1125
C If preattached files are used the file is left open by PPCTL following STWORK1A.1126
C the initial OPEN; if reinitialised files are used the unit must be STWORK1A.1127
C OPENed and CLOSEd explicitly every time it is used. STWORK1A.1128
C STWORK1A.1129
UNITPP=-output_code STWORK1A.1130
IF (FT_STEPS(UNITPP).NE.0) THEN ! Filename generated by model GMG1F404.347
! Check if re-initialised file stream has been opened yet GRR1F404.6
IF(STEP.LT.FT_FIRSTSTEP(UNITPP)) THEN ! File stream opened? GRR1F404.7
ICODE=1 GRR1F404.8
CMESSAGE='STWORK : Re-initialised file not yet created' GRR1F404.9
write(6,*) GRR1F404.10
& 'STWORK : FATAL ERROR. Attempt to write to ', GRR1F404.11
& 're-initialised file stream before file first opened:' GRR1F404.12
write(6,*) GRR1F404.13
& ' : Check that output on unit ',unitpp,' is not', GRR1F404.14
& ' requested before first initialisation of output file:' GRR1F404.15
write(6,*) GRR1F404.16
& ' : See UMUI window (Initialisation of PP file', GRR1F404.17
& 's) accessed from (Post Processing) from (Submodel ', GRR1F404.18
& 'independent).' GRR1F404.19
GO TO 999 GRR1F404.20
ENDIF ! File stream opened? GRR1F404.21
STRING=MODEL_FT_UNIT(UNITPP) STWORK1A.1132
DO JJ=80,1,-1 STWORK1A.1133
IF (STRING(JJ:JJ).EQ.'/') GOTO 411 TJ170993.55
ENDDO STWORK1A.1135
ICODE=1 STWORK1A.1136
CMESSAGE='STWORK : Illegal output PPfile name' STWORK1A.1137
GOTO 999 STWORK1A.1138
411 CONTINUE STWORK1A.1139
IF (JJ.GT.66) THEN STWORK1A.1140
PPNAME=STRING(JJ+1:80) STWORK1A.1141
ELSE STWORK1A.1142
PPNAME=STRING(JJ+1:JJ+14) STWORK1A.1143
ENDIF STWORK1A.1144
LEN_PPNAME=LEN(PPNAME) STWORK1A.1145
CALL FILE_OPEN
(UNITPP,PPNAME,LEN_PPNAME,1,1,ICODE) GPB1F305.154
IF(ICODE.NE.0)GOTO990 STWORK1A.1147
ENDIF STWORK1A.1148
CL STWORK1A.1149
CL 4.1.1 Read in the pp fixed-length header STWORK1A.1150
CL STWORK1A.1151
IWA=0 STWORK1A.1152
CALL SETPOS
(UNITPP,IWA,ICODE) GTD0F400.128
CALL BUFFIN
(UNITPP,PP_FIXHD(1),LEN_FIXHD,LEN_IO,A_IO) STWORK1A.1154
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN STWORK1A.1155
CALL IOERROR
('Buffer in fixed length header',A_IO,LEN_IO, STWORK1A.1156
& LEN_FIXHD) STWORK1A.1157
CMESSAGE='STWORK : I/O error - PP fixed length header' STWORK1A.1158
ICODE=1 STWORK1A.1159
RETURN STWORK1A.1160
ENDIF STWORK1A.1161
CL STWORK1A.1162
CL 4.1.2 Find the first available pp lookup record. GRR1F400.9
CL GRR1F400.10
ICURRLL=FT_LASTFIELD(UNITPP) ! Position of the last field GRR1F400.11
ICURRLL=ICURRLL+1 ! Position of the next field GRR1F400.12
CL GRR1F400.13
CL 4.1.3 Find the first available position for the next data record(s) GRR1F400.14
CL by reading last pp lookup record. GRR1F400.15
CL GRR1F400.16
IWL= PP_FIXHD(150)-1 ! NOTE for BUFFIN I/O the start address GRR1F400.17
C ! is zero for word 1. This is pointer GRR1F400.18
C ! to start of lookups. GRR1F400.19
IF(ICURRLL.EQ.1) THEN ! First record GRR1F400.20
IWA=PP_FIXHD(160)-1 ! Pointer to start of data GRR1F400.21
GRR1F400.22
ELSE GRR1F400.23
GRR1F400.24
C Point to start of last pp lookup record and read GRR1F400.25
CALL SETPOS
(UNITPP,IWL+(ICURRLL-2)*LEN1_LOOKUP,ICODE) GRR1F400.26
CALL BUFFIN
(UNITPP,IPPLOOK(1,ICURRLL-1), GRR1F400.27
& LEN1_LOOKUP,LEN_IO,A_IO) GRR1F400.28
C GRR1F400.29
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.PP_FIXHD(151)) GRR1F400.30
& THEN GRR1F400.31
CALL IOERROR
('Buffer in LOOKUP table ',A_IO,LEN_IO, GRR1F400.32
& PP_FIXHD(151)) GRR1F400.33
CMESSAGE='STWORK : I/O error - PP LOOKUP table ' GRR1F400.34
ICODE=2 GRR1F400.35
RETURN GRR1F400.36
ENDIF GRR1F400.37
C Pointer to next available data location in output file GRR1F400.38
IWA=IPPLOOK(LBEGIN,ICURRLL-1)+IPPLOOK(LBNREC,ICURRLL-1) GRR1F400.39
GRR1F400.40
ENDIF ! Test on first record GRR1F400.41
CL STWORK1A.1190
CL 4.1.4 If a daughter record is being processed then recover STWORK1A.1191
CL size information from dump LOOKUP header referenced by STWORK1A.1192
CL mother record (unless MOS output) STWORK1A.1193
CL STWORK1A.1194
IF (il.NE.ilcurr .AND. .NOT.MOS) THEN STWORK1A.1195
extraw_hdr=lookup(lbext,icurrll_dump_ptr) TJ140193.51
*IF -DEF,MPP GPB0F403.2137
pphoriz_out=lookup(lblrec,icurrll_dump_ptr) STWORK1A.1197
n_rows_out=lookup(lbrow,icurrll_dump_ptr) STWORK1A.1198
n_cols_out=lookup(lbnpt,icurrll_dump_ptr) STWORK1A.1199
*ELSE GPB0F403.2138
global_pphoriz_out=lookup(lblrec,icurrll_dump_ptr) GPB0F403.2139
global_n_rows_out=lookup(lbrow,icurrll_dump_ptr) GPB0F403.2140
global_n_cols_out=lookup(lbnpt,icurrll_dump_ptr) GPB0F403.2141
IF (what_proc.eq.st_time_series_mean) then GRS1F404.223
! As work is done on only PE 0 and copy to buf 3 uses pphoriz_out GRS1F404.224
! this must be reset. GRS1F404.225
pphoriz_out=global_pphoriz_out GRS1F404.226
n_rows_out=global_n_rows_out GRS1F404.227
n_cols_out=global_n_cols_out GRS1F404.228
endif GRS1F404.229
IF (what_proc .EQ. st_time_series_code) THEN GPB1F404.70
pphoriz_out=global_pphoriz_out GPB1F404.71
n_rows_out=global_n_rows_out GPB1F404.72
n_cols_out=global_n_cols_out GPB1F404.73
ENDIF GPB1F404.74
*ENDIF GPB0F403.2142
ENDIF STWORK1A.1200
CL STWORK1A.1201
CL 4.1.5 Check PP_PACK_CODE for GRIB output. Set GRIB flag and reset GO261093.11
CL PP_PACK_CODE to give packing profile. GO261093.12
IF(PP_PACK_CODE(UNITPP).GE.100)THEN GO261093.13
GRIB_OUT=.TRUE. GO261093.14
PP_PACK_CODE(UNITPP)=PP_PACK_CODE(UNITPP)-100 GO261093.15
GRIB_PACKING=PP_PACK_CODE(UNITPP) GRS3F400.279
ELSE GO261093.16
GRIB_OUT=.FALSE. GO261093.17
ENDIF GO261093.18
CL GO261093.19
CL 4.1.6 Set packing accuracy for output data field and buffer length GO261093.20
CL Multiple packing profiles are held in PP_XREF and chosen on a STWORK1A.1203
CL per-unit basis through PP_PACK_CODE. Profile 0 means unpacked. STWORK1A.1204
CL If the field has any extra data switch off packing. STWORK1A.1205
CL STWORK1A.1206
IF (PP_PACK_CODE(UNITPP).EQ.0.OR.extraw_hdr.NE.0) THEN TJ010793.18
PACKING=.FALSE. STWORK1A.1208
COMP_ACCRCY=-99 APS1F304.6
ELSE STWORK1A.1210
PACKING=.TRUE. STWORK1A.1211
comp_accrcy= EXPPXI
( im_ident, IS, IM, GKR0F400.322
& ppx_packing_acc+PP_PACK_CODE(UNITPP)-1, GKR0F400.323
*CALL ARGPPX
GKR0F305.559
& icode, cmessage) GKR0F305.560
ENDIF STWORK1A.1213
IF(GRIB_OUT) THEN ! reset packing code GRS3F304.187
PP_PACK_CODE(UNITPP)=PP_PACK_CODE(UNITPP)+100 GRS3F304.188
ENDIF GRS3F304.189
C STWORK1A.1214
*IF -DEF,MPP GPB1F402.112
LENBUF=((PPHORIZ_OUT+um_sector_size-1)/um_sector_size)* GBC0F403.66
2 um_sector_size ! Output length before pack GBC0F403.67
*ELSE GPB1F402.113
LENBUF=((global_PPHORIZ_OUT+um_sector_size-1)/um_sector_size)* GBC0F403.68
2 um_sector_size GBC0F403.69
! ! Output length before pack GPB1F402.115
*ENDIF GPB1F402.116
CL STWORK1A.1216
CL 4.2 Select routine to output data using logical GRIB. GO261093.8
CL If data to be output in grib code then call GRIB_FILE GO261093.9
CL If data to be output in PP code then call PP_FILE GO261093.10
CL STWORK1A.1218
*IF DEF,T3E,AND,DEF,MPP GDS3F403.13
IF(MOS.OR.GRIB_OUT.OR.NPROC.LT.NUM_LEVS_OUT.OR. GDS3F403.14
& NUM_LEVS_OUT.EQ.1)THEN GDS3F403.15
c GDS3F403.16
c Only use parallelised COEX if : GDS3F403.17
c GDS3F403.18
c (1) not MOS GDS3F403.19
c (2) not GRIB GDS3F403.20
c (3) NPROC > NUM_LEVS_OUT GDS3F403.21
c (4) NUM_LEVS_OUT > 1 GDS3F403.22
c GDS3F403.23
*ENDIF GDS3F403.24
DO II=1,NUM_LEVS_OUT ! --- Start of levels loop --- STWORK1A.1219
GPB1F402.117
*IF DEF,MPP GPB1F402.118
! Gather together distributed field to PE 0 GPB1F402.119
! Distributed data is in PP_FIELD, gathered data will be GPB1F402.120
! in the buf array GPB1F402.121
GPB1F402.122
IF ( MOS .OR. (what_proc.eq.st_time_series_code) .OR. GRS1F404.230
& (what_proc.eq.st_time_series_mean) ) THEN GRS1F404.231
! if it's either MOS or timeseries output - just copy on PE 0 GPB0F403.2144
GPB1F402.132
IF (mype .EQ. 0) THEN GPB0F403.2145
DO I=1,PPHORIZ_OUT GPB0F403.2146
buf(I)=PPFIELD(I+(II-1)*PPHORIZ_OUT) GPB0F403.2147
ENDDO GPB0F403.2148
ENDIF GPB0F403.2149
GPB0F403.2150
ELSE ! not MOS or timeseries output GPB0F403.2151
GPB0F403.2152
CALL STASH_GATHER_FIELD
( GPB0F403.2153
& PPFIELD(1+(II-1)*PPHORIZ_OUT) , buf, GPB0F403.2154
& PPHORIZ_OUT , global_PPHORIZ_OUT , 1, GPB0F403.2155
& stlist(st_north_code,il) , GPB0F403.2156
& stlist(st_west_code,il)+global_N_COLS_OUT-1, GPB0F403.2157
& stlist(st_north_code,il)+global_N_ROWS_OUT-1, GPB0F403.2158
& stlist(st_west_code,il), GPB0F403.2159
& grid_type_code,0,.TRUE., GPB0F403.2160
& ICODE,CMESSAGE) GPB0F403.2161
GPB0F403.2162
IF (ICODE .GT. 0) THEN GPB0F403.2163
WRITE(6,*) 'Error occured in STASH while gathering ', GPB0F403.2164
& 'data for output.' GPB0F403.2165
GOTO 999 GPB0F403.2166
ENDIF GPB0F403.2167
GPB0F403.2168
ENDIF ! IF (MOS) GPB0F403.2169
*ENDIF GPB1F402.138
GPB1F402.139
! Reset index for PP_HEAD if there is a levels list of hybrid levels GAB1F400.161
IF (stlist(st_output_bottom,il).lt.0.and.lbvcl.eq.9) THEN GAB1F400.162
JJ = level_list(II) GAB1F400.163
! or a range of model levels, as they may not be consecutive, GAB1F400.164
ELSE IF (stlist(st_output_bottom,il).ge.1.and. GAB1F400.165
& stlist(st_output_top,il).le.T_levels) THEN GAB1F400.166
JJ = level_list(II) GAB1F400.167
! otherwise use of level index is alright GAB1F400.168
ELSE GAB1F400.169
JJ = II GAB1F400.170
END IF GAB1F400.171
C GRR0F304.4
C Check that PP output file has sufficient headers pre-allocated GRR0F304.5
IF(ICURRLL.GT.PP_FIXHD(152)) THEN GRR0F304.6
ICODE=4 GRR0F304.7
WRITE(6,*) 'ERROR detected in routine STWORK: stop model' GRR0F304.8
WRITE(6,*) ': No. of output fields (=',ICURRLL,')', GRR0F304.9
& ' exceeds no. of reserved PP headers for unit ',UNITPP GRR0F304.10
CMESSAGE='STWORK : NO. OF FIELDS EXCEEDS RESERVED HEADERS' GRR0F304.11
GOTO 999 GRR0F304.12
ENDIF ! end no. of pp fields check GRR0F304.13
C GRR0F304.14
IF(GRIB_OUT) THEN GO261093.21
! GRS3F304.190
! NOTE cannot pack data into grib before pphead correctly setup GRS3F304.191
! GRS3F304.192
NUM_WORDS = -99 ! ie unset before call to pp_head GRS3F304.193
PACKING_TYPE=3 GO261093.23
ELSE GO261093.50
CL Pack data into PP code. GO261093.51
*IF -DEF,MPP GPB1F402.140
CALL PP_FILE
(PPFIELD(1+(II-1)*PPHORIZ_OUT), STWORK1A.1220
*ELSE GPB1F402.141
*IF DEF,MPP,AND,DEF,T3E GBCQF405.49
c--call the parallel version of 'COEX' GBCQF405.50
*ELSE GBCQF405.51
IF (mype .EQ. 0) THEN GPB1F402.142
*ENDIF GBCQF405.52
GPB1F402.143
CALL PP_FILE
(buf, GPB1F402.144
*ENDIF GPB1F402.145
1 LENBUF,NUM_WORDS,RMDI,COMP_ACCRCY, STWORK1A.1221
*IF -DEF,MPP GPB1F402.146
2 PPHORIZ_OUT,UNITPP,IWA,N_COLS_OUT,N_ROWS_OUT, STWORK1A.1222
*ELSE GPB1F402.147
2 global_PPHORIZ_OUT,UNITPP,IWA, GPB0F403.2170
& global_N_COLS_OUT,global_N_ROWS_OUT, GPB0F403.2171
*ENDIF GPB1F402.149
*IF DEF,MPP,AND,DEF,T3E GBCQF405.53
3 PACKING,PACKING_TYPE,current_io_pe,ICODE,CMESSAGE) GBCQF405.54
*ELSE GBCQF405.55
3 PACKING,PACKING_TYPE,ICODE,CMESSAGE) GO261093.52
*ENDIF GBCQF405.56
*IF DEF,MPP GPB1F402.150
*IF DEF,MPP,AND,DEF,T3E GBCQF405.57
GBCQF405.58
*ELSE GBCQF405.59
ENDIF ! (IF mype.eq.0) GPB1F402.151
*ENDIF GBCQF405.60
! Make sure all processors get the return code GPB1F402.152
GPB1F402.153
CALL GC_IBCAST(
101,1,0,nproc,info,ICODE) GPB1F402.154
GPB1F402.155
*ENDIF GPB1F402.156
C Num_words is the no of 64 bit words required STWORK1A.1224
IF(ICODE.gt.0) THEN STWORK1A.1225
CMESSAGE='STWORK : Error in PP_FILE' STWORK1A.1226
GOTO 999 STWORK1A.1227
ENDIF STWORK1A.1228
ENDIF GO261093.53
LEN_BUF_WORDS=((NUM_WORDS+um_sector_size-1)/um_sector_size)* GBC0F403.70
2 um_sector_size ! No of words output GBC0F403.71
CL STWORK1A.1230
CL 4.2.1 Set STASH processing codes and sampling period for PPheader STWORK1A.1231
CL STWORK1A.1232
GR=STLIST(st_gridpoint_code,ILPREV)! Grid point code STWORK1A.1233
C Any time-processed field has a (non-zero) sample_prd set - STWORK1A.1234
C this will be translated by PP_HEAD into an LBTIM subcode IB of 2 STWORK1A.1235
sample_prd=0.0 STWORK1A.1236
IF(STLIST(st_proc_no_code,ILPREV).GT.st_replace_code) THEN STWORK1A.1237
sample_prd=REAL(STLIST(st_freq_code,ILPREV)*secs_per_period) STWORK1A.1238
& /REAL(steps_per_period*3600) STWORK1A.1239
ENDIF STWORK1A.1240
CL STWORK1A.1241
CL 4.2.2 Verification time comes from fixhd(28), current time fixhd(21) STWORK1A.1242
CL 2 cases that require consideration here: STWORK1A.1243
CL STWORK1A.1244
CL (1) this record is not a daughter record. STWORK1A.1245
CL in which case, set start_step=.true., verif time from fixhd STWORK1A.1246
CL present time also from fixhd STWORK1A.1247
CL STWORK1A.1248
CL (2) this record IS a daughter record. STWORK1A.1249
CL in which case, will need to retreive info on start_time STWORK1A.1250
CL from dump STWORK1A.1251
CL STWORK1A.1252
start_step=.true. STWORK1A.1253
IF (il.eq.ilcurr) THEN ! not daughter record STWORK1A.1254
CALL PP_HEAD
( GKR0F305.561
*CALL ARGPPX
GKR0F305.562
* im_ident,FIXHD,INTHD,REALHD, GKR0F305.563
1 LEN_FIXHD,LEN_INTHD,LEN_REALHD, STWORK1A.1257
2 IM,IS,GR,lfullfield, STWORK1A.1258
3 level(II),pseudo_level(II), GKR0F305.564
4 samples,start_step,fixhd(28),fixhd(21),LEN1_LOOKUP, STWORK1A.1260
5 extraw_hdr,IPPLOOK(1,ICURRLL),IPPLOOK(1,ICURRLL), TJ140193.52
*IF -DEF,MPP GPB1F402.157
6 N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, STWORK1A.1262
7 N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, STWORK1A.1263
*ELSE GPB1F402.158
6 global_N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, GPB1F402.159
7 global_N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, GPB1F402.160
*ENDIF GPB1F402.161
7 lbproc_comp,sample_prd, STWORK1A.1264
8 FCST_PRD,COMP_ACCRCY,PACKING_TYPE, GAB1F400.172
& st_grid,IWA,stsuparr(sa_idx(1)),stsuparr(sa_idx(2)), GAB1F400.173
& stsuparr(sa_idx(3)),stsuparr(sa_idx(4)), GAB1F400.174
& T_levels,JJ,ROTATE,ELF, GAB1F400.175
A OCEAN,LEVDEPC,LEN1_LEVDEPC, STWORK1A.1267
B ICODE,CMESSAGE) STWORK1A.1268
ELSE ! daughter record so start time is in dump STWORK1A.1269
C set up start_time from data in LOOKUP(lbyr,icurrll_dump_ptr) STWORK1A.1270
start_time(1)=LOOKUP(lbyr,icurrll_dump_ptr) STWORK1A.1271
start_time(2)=LOOKUP(lbmon,icurrll_dump_ptr) STWORK1A.1272
start_time(3)=LOOKUP(lbdat,icurrll_dump_ptr) STWORK1A.1273
start_time(4)=LOOKUP(lbhr,icurrll_dump_ptr) STWORK1A.1274
start_time(5)=LOOKUP(lbmin,icurrll_dump_ptr) STWORK1A.1275
start_time(7)=LOOKUP(lbday,icurrll_dump_ptr) STWORK1A.1276
CALL PP_HEAD
( GKR0F305.565
*CALL ARGPPX
GKR0F305.566
* im_ident,FIXHD,INTHD,REALHD, GKR0F305.567
1 LEN_FIXHD,LEN_INTHD,LEN_REALHD, STWORK1A.1279
2 IM,IS,GR,lfullfield, STWORK1A.1280
3 level(II),pseudo_level(II), GKR0F305.568
4 samples,start_step,start_time, STWORK1A.1282
4 fixhd(28),LEN1_LOOKUP, STWORK1A.1283
5 extraw_hdr,IPPLOOK(1,ICURRLL),IPPLOOK(1,ICURRLL), TJ140193.53
*IF -DEF,MPP GPB1F402.162
6 N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, STWORK1A.1285
7 N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, STWORK1A.1286
*ELSE GPB1F402.163
6 global_N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, GPB1F402.164
7 global_N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, GPB1F402.165
*ENDIF GPB1F402.166
7 lbproc_comp,sample_prd, STWORK1A.1287
8 FCST_PRD,COMP_ACCRCY,PACKING_TYPE, GAB1F400.176
& st_grid,IWA,stsuparr(sa_idx(1)),stsuparr(sa_idx(2)), GAB1F400.177
& stsuparr(sa_idx(3)),stsuparr(sa_idx(4)),T_levels,JJ, GAB1F400.178
A ROTATE,ELF,OCEAN,LEVDEPC,LEN1_LEVDEPC, STWORK1A.1290
B ICODE,CMESSAGE) STWORK1A.1291
ENDIF ! end if block over daughter/mother record STWORK1A.1292
GAB1F400.179
IF(ICODE.gt.0) GOTO 999 ! An error has occured GAB1F400.180
GRS3F304.194
IF(GRIB_OUT) THEN GRS3F304.195
! Now safe to call grib coder as pphead correctly set apart from GRS3F304.196
! length of data GRS3F304.197
CL Pack data into grib code GRS3F304.198
*IF -DEF,MPP GPB1F402.180
CALL GRIB_FILE
(LEN1_LOOKUP,PP_LEN2_LOOKUP, GRS3F304.199
1 IPPLOOK,IPPLOOK,ICURRLL, GRS3F304.200
2 PPFIELD(1+(II-1)*PPHORIZ_OUT),PPHORIZ_OUT, GRS3F304.201
3 LENBUF,NUM_WORDS,UNITPP,IWA,GRIB_PACKING, GRS3F400.280
& ICODE,CMESSAGE) GRS3F400.281
*ELSE GPB1F402.181
IF (mype .EQ. 0) THEN GPB1F402.182
CALL GRIB_FILE
(LEN1_LOOKUP,PP_LEN2_LOOKUP, GPB1F402.183
& IPPLOOK,IPPLOOK,ICURRLL, GPB1F402.184
& buf,global_PPHORIZ_OUT, GPB1F402.185
& LENBUF,NUM_WORDS,UNITPP,IWA,GRIB_PACKING, GPB1F402.186
& ICODE,CMESSAGE) GPB1F402.187
ENDIF ! (IF mype.eq.0) GPB1F402.188
GPB1F402.189
! Make sure all processors get the return code GPB1F402.190
GPB1F402.191
CALL GC_IBCAST(
101,1,0,nproc,info,ICODE) GPB1F402.192
*ENDIF GPB1F402.193
IF(ICODE.gt.0)THEN GRS3F304.203
CMESSAGE='STWORK : Error in GRIB_FILE' GRS3F304.204
GOTO 990 GRS3F304.205
ENDIF GRS3F304.206
GRS3F304.207
ENDIF ! end of grib_out GRS3F304.208
GRS3F304.209
IWA=IPPLOOK(LBEGIN,ICURRLL)+IPPLOOK(LBNREC,ICURRLL) STWORK1A.1297
ICURRLL=ICURRLL+1 ! Update the counter STWORK1A.1298
icurrll_dump_ptr=icurrll_dump_ptr+1 STWORK1A.1299
C strictly only needs doing if a daughter record STWORK1A.1300
C STWORK1A.1301
ENDDO ! --- End of levels loop --- STWORK1A.1302
*IF DEF,T3E,AND,DEF,MPP GDS3F403.25
GDS3F403.26
ELSE ! PARALLELISE COEX GDS3F403.27
GDS3F403.28
DO II=1,NUM_LEVS_OUT ! --- Start of levels loop --- GDS3F403.29
GDS3F403.30
! Gather together distributed field to PE 0 GDS3F403.31
! Distributed data is in PP_FIELD, gathered data will be GDS3F403.32
! in the buf array GDS3F403.33
GDS3F403.34
CALL STASH_GATHER_FIELD
( GDS3F403.35
& PPFIELD(1+(II-1)*PPHORIZ_OUT) , buf, GDS3F403.36
& PPHORIZ_OUT , global_PPHORIZ_OUT , 1, GDS3F403.37
& stlist(st_north_code,il) , GDS3F403.38
& stlist(st_west_code,il)+global_N_COLS_OUT-1, GDS3F403.39
& stlist(st_north_code,il)+global_N_ROWS_OUT-1, GDS3F403.40
& stlist(st_west_code,il), GDS3F403.41
& grid_type_code,II-1,.TRUE., GDS3F403.42
& ICODE,CMESSAGE) GDS3F403.43
GDS3F403.44
IF (ICODE .GT. 0) THEN GDS3F403.45
WRITE(6,*) 'Error occured in STASH while gathering ', GDS3F403.46
& 'data for output.' GDS3F403.47
GOTO 999 GDS3F403.48
ENDIF GDS3F403.49
GDS3F403.50
ENDDO ! --- End of levels loop --- GDS3F403.51
c GDS3F403.52
c Code from PP_FILE GDS3F403.53
c GDS3F403.54
IF (mype .lt. NUM_LEVS_OUT) THEN GDS3F403.55
GDS3F403.56
LENGTH_FULLWRD=64 ! LENGTH IN BITS OF FULLWORD VAR GDS3F403.57
CL At this point packing,if required,will be done using the WGDOS GDS3F403.58
CL method of packing. GDS3F403.59
PACKING_TYPE=0 GDS3F403.60
C Note the value of -26 corresponds to -15 (F) in ppxref. GDS3F403.61
C The packing acuracy is scaled to allow greater accuracy. GDS3F403.62
C Packing will only be attempted if there are at least 2 points per row GDS3F403.63
C in the PPfield. GDS3F403.64
C GDS3F403.65
IF(PACKING.AND.COMP_ACCRCY.GT.-99.AND.global_N_COLS_OUT.GE.2) GDS3F403.66
& PACKING_TYPE=1 GDS3F403.67
C GDS3F403.68
IF(PACKING_TYPE.EQ.1)THEN GDS3F403.69
CALL COEX
(buf,global_PPHORIZ_OUT,buf3,LENBUF, GDS3F403.70
& global_N_COLS_OUT, GDS3F403.71
& global_N_ROWS_OUT, GDS3F403.72
& NUM_OUT,COMP_ACCRCY,.TRUE.,RMDI,LENGTH_FULLWRD) GDS3F403.73
GDS3F403.74
NUM_WORDS=(NUM_OUT+1)/2 ! Round up to the nearest 64 Bit CRAY Wd GDS3F403.75
C COEX returns the number of IBM words needed to hold the packed data GDS3F403.76
C ~~~ GDS3F403.77
LEN_BUF_WORDS=((NUM_WORDS+um_sector_size-1)/um_sector_size)* GDS3F403.78
& um_sector_size ! No of words output GDS3F403.79
GDS3F403.80
GDS3F403.81
GDS3F403.83
ELSE ! No packing required. GDS3F403.84
DO 1 JJJ=1,global_PPHORIZ_OUT GDS3F403.85
buf3(JJJ) = buf(JJJ) GDS3F403.86
1 CONTINUE GDS3F403.87
NUM_WORDS=global_PPHORIZ_OUT GDS3F403.88
LEN_BUF_WORDS=LENBUF GDS3F403.89
ENDIF GDS3F403.90
DO JJJ=NUM_WORDS+1,LEN_BUF_WORDS GDS3F403.91
buf3(JJJ)= 0.0 GDS3F403.92
ENDDO GDS3F403.93
NUM_WORDS_com=NUM_WORDS GDS3F403.94
LEN_BUF_WORDS_com=LEN_BUF_WORDS GDS3F403.95
GDS3F403.96
endif GDS3F403.97
GDS3F403.98
call barrier(
) GDS3F403.99
GDS3F403.100
DO II=1,NUM_LEVS_OUT ! --- Start of levels loop --- GDS3F403.101
! Reset index for PP_HEAD if there is a levels list of hybrid levels GDS3F403.102
IF (stlist(st_output_bottom,il).lt.0.and.lbvcl.eq.9) THEN GDS3F403.103
JJ = level_list(II) GDS3F403.104
! or a range of model levels, as they may not be consecutive, GDS3F403.105
ELSE IF (stlist(st_output_bottom,il).ge.1.and. GDS3F403.106
& stlist(st_output_top,il).le.T_levels) THEN GDS3F403.107
JJ = level_list(II) GDS3F403.108
! otherwise use of level index is alright GDS3F403.109
ELSE GDS3F403.110
JJ = II GDS3F403.111
END IF GDS3F403.112
C GDS3F403.113
C Check that PP output file has sufficient headers pre-allocated GDS3F403.114
IF(ICURRLL.GT.PP_FIXHD(152)) THEN GDS3F403.115
ICODE=4 GDS3F403.116
WRITE(6,*) 'ERROR detected in routine STWORK: stop model' GDS3F403.117
WRITE(6,*) ': No. of output fields (=',ICURRLL,')', GDS3F403.118
& ' exceeds no. of reserved PP headers for unit ',UNITPP GDS3F403.119
CMESSAGE='STWORK : NO. OF FIELDS EXCEEDS RESERVED HEADERS' GDS3F403.120
GOTO 999 GDS3F403.121
ENDIF ! end no. of pp fields check GDS3F403.122
C GDS3F403.123
if(mype.eq.0)then GDS3F403.124
GDS3F403.125
GPB2F405.287
! Get the address of buf3 on the remote PE GPB2F405.288
CALL shmem_get(
ptr_buf3,address,1,ii-1) GPB2F405.289
! So now, remote_buf3 on PE 0 will have the same address as buf3 on GPB2F405.290
! PE (ii-1) GPB2F405.291
if(num_levs_out.gt.1)then GDS3F403.126
call shmem_get(
NUM_WORDS,NUM_WORDS_com,1,ii-1) GDS3F403.127
call shmem_get(
LEN_BUF_WORDS,LEN_BUF_WORDS_com,1,ii-1) GDS3F403.128
call shmem_get(
buf3,remote_buf3,LEN_BUF_WORDS,II-1) GPB2F405.292
endif GDS3F403.130
GDS3F403.131
CALL SETPOS_single
(UNITPP,IWA,ICODE) GDS3F403.132
CALL BUFFOUT_single
(UNITPP,buf3,LEN_BUF_WORDS,LEN_IO,IX) GDS3F403.133
GDS3F403.134
C GBC3F404.22
IF (IX.NE.-1.0.OR.LEN_IO.NE.LEN_BUF_WORDS) THEN GBC3F404.23
CALL IOERROR
('Buffer out Data Field',IX,LEN_IO, GBC3F404.24
& LEN_BUF_WORDS) GBC3F404.25
CMESSAGE='STWORK : I/O error - PP Data Field Output' GBC3F404.26
ICODE=8 GBC3F404.27
RETURN GBC3F404.28
ENDIF GBC3F404.29
GBC3F404.30
endif GDS3F403.135
GDS3F403.136
! Make sure all processors get the return code GDS3F403.137
GDS3F403.138
CALL GC_IBCAST(
101,1,0,nproc,info,ICODE) GDS3F403.139
GDS3F403.140
C Num_words is the no of 64 bit words required GDS3F403.141
IF(ICODE.gt.0) THEN GDS3F403.142
CMESSAGE='STWORK : Error in PP_FILE' GDS3F403.143
GOTO 999 GDS3F403.144
ENDIF GDS3F403.145
LEN_BUF_WORDS=((NUM_WORDS+um_sector_size-1)/um_sector_size)* GDS3F403.146
& um_sector_size ! No of words output GDS3F403.147
CL GDS3F403.148
CL 4.2.1 Set STASH processing codes and sampling period for PPheader GDS3F403.149
CL GDS3F403.150
GR=STLIST(st_gridpoint_code,ILPREV)! Grid point code GDS3F403.151
C Any time-processed field has a (non-zero) sample_prd set - GDS3F403.152
C this will be translated by PP_HEAD into an LBTIM subcode IB of 2 GDS3F403.153
sample_prd=0.0 GDS3F403.154
IF(STLIST(st_proc_no_code,ILPREV).GT.st_replace_code) THEN GDS3F403.155
sample_prd=REAL(STLIST(st_freq_code,ILPREV)*secs_per_period) GDS3F403.156
& /REAL(steps_per_period*3600) GDS3F403.157
ENDIF GDS3F403.158
CL GDS3F403.159
CL 4.2.2 Verification time comes from fixhd(28), current time fixhd(21) GDS3F403.160
CL 2 cases that require consideration here: GDS3F403.161
CL GDS3F403.162
CL (1) this record is not a daughter record. GDS3F403.163
CL in which case, set start_step=.true., verif time from fixhd GDS3F403.164
CL present time also from fixhd GDS3F403.165
CL GDS3F403.166
CL (2) this record IS a daughter record. GDS3F403.167
CL in which case, will need to retreive info on start_time GDS3F403.168
CL from dump GDS3F403.169
CL GDS3F403.170
start_step=.true. GDS3F403.171
IF (il.eq.ilcurr) THEN ! not daughter record GDS3F403.172
CALL PP_HEAD
( GDS3F403.173
*CALL ARGPPX
GDS3F403.174
* im_ident,FIXHD,INTHD,REALHD, GDS3F403.175
1 LEN_FIXHD,LEN_INTHD,LEN_REALHD, GDS3F403.176
2 IM,IS,GR,lfullfield, GDS3F403.177
3 level(II),pseudo_level(II), GDS3F403.178
4 samples,start_step,fixhd(28),fixhd(21),LEN1_LOOKUP, GDS3F403.179
5 extraw_hdr,IPPLOOK(1,ICURRLL),IPPLOOK(1,ICURRLL), GDS3F403.180
6 global_N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, GDS3F403.181
7 global_N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, GDS3F403.182
7 lbproc_comp,sample_prd, GDS3F403.183
8 FCST_PRD,COMP_ACCRCY,PACKING_TYPE, GDS3F403.184
& st_grid,IWA,stsuparr(sa_idx(1)),stsuparr(sa_idx(2)), GDS3F403.185
& stsuparr(sa_idx(3)),stsuparr(sa_idx(4)), GDS3F403.186
& T_levels,JJ,ROTATE,ELF, GDS3F403.187
A OCEAN,LEVDEPC,LEN1_LEVDEPC, GDS3F403.188
B ICODE,CMESSAGE) GDS3F403.189
ELSE ! daughter record so start time is in dump GDS3F403.190
C set up start_time from data in LOOKUP(lbyr,icurrll_dump_ptr) GDS3F403.191
start_time(1)=LOOKUP(lbyr,icurrll_dump_ptr) GDS3F403.192
start_time(2)=LOOKUP(lbmon,icurrll_dump_ptr) GDS3F403.193
start_time(3)=LOOKUP(lbdat,icurrll_dump_ptr) GDS3F403.194
start_time(4)=LOOKUP(lbhr,icurrll_dump_ptr) GDS3F403.195
start_time(5)=LOOKUP(lbmin,icurrll_dump_ptr) GDS3F403.196
start_time(7)=LOOKUP(lbday,icurrll_dump_ptr) GDS3F403.197
CALL PP_HEAD
( GDS3F403.198
*CALL ARGPPX
GDS3F403.199
* im_ident,FIXHD,INTHD,REALHD, GDS3F403.200
1 LEN_FIXHD,LEN_INTHD,LEN_REALHD, GDS3F403.201
2 IM,IS,GR,lfullfield, GDS3F403.202
3 level(II),pseudo_level(II), GDS3F403.203
4 samples,start_step,start_time, GDS3F403.204
4 fixhd(28),LEN1_LOOKUP, GDS3F403.205
5 extraw_hdr,IPPLOOK(1,ICURRLL),IPPLOOK(1,ICURRLL), GDS3F403.206
6 global_N_COLS_OUT,NUM_WORDS,LEN_BUF_WORDS, GDS3F403.207
7 global_N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, GDS3F403.208
7 lbproc_comp,sample_prd, GDS3F403.209
8 FCST_PRD,COMP_ACCRCY,PACKING_TYPE, GDS3F403.210
& st_grid,IWA,stsuparr(sa_idx(1)),stsuparr(sa_idx(2)), GDS3F403.211
& stsuparr(sa_idx(3)),stsuparr(sa_idx(4)),T_levels,JJ, GDS3F403.212
A ROTATE,ELF,OCEAN,LEVDEPC,LEN1_LEVDEPC, GDS3F403.213
B ICODE,CMESSAGE) GDS3F403.214
ENDIF ! end if block over daughter/mother record GDS3F403.215
GDS3F403.216
IF(ICODE.gt.0) GOTO 999 ! An error has occured GDS3F403.217
GDS3F403.218
IWA=IPPLOOK(LBEGIN,ICURRLL)+IPPLOOK(LBNREC,ICURRLL) GDS3F403.219
ICURRLL=ICURRLL+1 ! Update the counter GDS3F403.220
icurrll_dump_ptr=icurrll_dump_ptr+1 GDS3F403.221
C strictly only needs doing if a daughter record GDS3F403.222
C GDS3F403.223
ENDDO ! --- End of levels loop --- GDS3F403.224
ENDIF ! PARALLELISE COEX GDS3F403.225
*ENDIF GDS3F403.226
FT_LASTFIELD(UNITPP)=ICURRLL-1 ! Position of the last field STWORK1A.1303
CL STWORK1A.1304
CL 4.3 Write out the pp lookup table IPPLOOK (RPPLOOK) and close file STWORK1A.1305
CL if reinitialisation possible. STWORK1A.1306
CL Otherwise force last buffer to be written to file to avoid GDR8F405.34
CL problems with continuation runs following hard failures. GDR8F405.35
CL STWORK1A.1307
CL Write out only pp lookups for records written this call. GRR1F400.42
CL Point to the start of the current lookup record. GRR1F400.43
IWA = IWL + (ICURRLL-NUM_LEVS_OUT-1)*LEN1_LOOKUP GRR1F400.44
CALL SETPOS
(UNITPP,IWA,ICODE) GTD0F400.130
CALL BUFFOUT
(UNITPP,IPPLOOK(1,ICURRLL-NUM_LEVS_OUT), GRR1F400.45
* LEN1_LOOKUP*NUM_LEVS_OUT,LEN_IO,A_IO) GRR1F400.46
C GRR1F400.47
IF (A_IO.NE.-1.0.OR.LEN_IO.NE.PP_FIXHD(151)*NUM_LEVS_OUT) GRR1F400.48
& THEN STWORK1A.1314
CALL IOERROR
('Buffer out LOOKUP table ',A_IO,LEN_IO, STWORK1A.1315
& PP_FIXHD(151)) STWORK1A.1316
CMESSAGE='STWORK : I/O error - PP LOOKUP table ' STWORK1A.1317
ICODE=3 STWORK1A.1318
RETURN STWORK1A.1319
ENDIF STWORK1A.1320
IF (FT_STEPS(UNITPP).NE.0) THEN GMG1F404.348
LEN_PPNAME=LEN(PPNAME) STWORK1A.1322
CALL FILE_CLOSE
(UNITPP,PPNAME,LEN_PPNAME,1,0,ICODE) GTD0F400.37
ELSE GDR8F405.36
CALL FLUSH_BUFFER
(UNITPP,ICODE) GDR8F405.37
IF(ICODE.NE.0) THEN GDR8F405.38
CMESSAGE='STWORK: Problem flushing buffer' GDR8F405.39
ICODE=10 GDR8F405.40
RETURN GDR8F405.41
ENDIF GDR8F405.42
GDR8F405.43
ENDIF STWORK1A.1324
C STWORK1A.1325
ELSEIF (output_code.EQ.st_dump.OR.output_code.EQ.st_secondary) STWORK1A.1326
* THEN STWORK1A.1327
CL STWORK1A.1328
CL 4.4 OUTPUT to dump or secondary D1 space - this implies some STWORK1A.1329
CL TEMPORAL processing possibly. If destination is secondary D1 STWORK1A.1330
CL space, there will be no associated LOOKUP header to update. STWORK1A.1331
CL STWORK1A.1332
C Length is calculated from STASHlist STWORK1A.1333
C NB: Full field length must be coded here, even for partial timeseries STWORK1A.1334
C STWORK1A.1335
*IF -DEF,MPP GPB1F402.167
NUM_WORDS=STLIST(st_output_length,IL)/NUM_LEVS_OUT STWORK1A.1336
*ELSE GPB1F402.168
NUM_WORDS=STLIST(st_dump_output_length,IL)/NUM_LEVS_OUT GPB1F402.169
*ENDIF GPB1F402.170
ICURRLL=STLIST(st_lookup_ptr,IL) ! Location of DUMP header STWORK1A.1337
C STWORK1A.1338
DO II=1,NUM_LEVS_OUT ! --- Start of levels loop --- STWORK1A.1339
! Reset index for PP_HEAD if there is a levels list of hybrid levels GAB1F400.181
IF (stlist(st_output_bottom,il).lt.0.and.lbvcl.eq.9) THEN GAB1F400.182
JJ = level_list(II) GAB1F400.183
! or a range of model levels, as they may not be consecutive, GAB1F400.184
ELSE IF (stlist(st_output_bottom,il).ge.1.and. GAB1F400.185
& stlist(st_output_top,il).le.T_levels) THEN GAB1F400.186
JJ = level_list(II) GAB1F400.187
! otherwise use of level index is alright GAB1F400.188
ELSE GAB1F400.189
JJ = II GAB1F400.190
END IF GAB1F400.191
addr=stlist(st_output_addr,il) ! start address STWORK1A.1340
IF (what_proc.eq.st_time_series_code.or. GRS1F404.232
& what_proc.eq.st_time_series_mean) THEN GRS1F404.233
GRS1F404.234
CL STWORK1A.1343
CL 4.4.1 Timeseries addresses are incremented according to timestep STWORK1A.1344
CL STWORK1A.1345
IF (stlist(st_freq_code,il).lt.1) THEN STWORK1A.1346
icode=st_not_supported STWORK1A.1347
cmessage= STWORK1A.1348
+ 'STWORK : STASHtime for timeseries not supported' STWORK1A.1349
goto 999 ! got an error so jump to return STWORK1A.1350
ENDIF STWORK1A.1351
elap_time=step-stlist(st_start_time_code,il) STWORK1A.1352
elap_time=(mod(elap_time,stlist(st_period_code,il)))/ STWORK1A.1353
+ stlist(st_freq_code,il) STWORK1A.1354
addr=addr+(elap_time*pphoriz_out) TJ140193.55
CL on the first time step of a timeseries processing TJ140193.56
CL pphoriz_out is the length of the entire output vector TJ140193.57
CL including extra data -- on other timesteps it is TJ140193.58
CL the length of a single record (data for just one timestep) TJ140193.59
ENDIF STWORK1A.1356
CL STWORK1A.1357
CL 4.4.2 TEMPORAL processing from ppfield array to D1 STWORK1A.1358
CL STWORK1A.1359
CALL TEMPORAL
(ppfield(1+(ii-1)*pphoriz_out), STWORK1A.1360
+ d1(addr+(ii-1)*pphoriz_out),pphoriz_out,extraw, STWORK1A.1361
+ stlist(1,il),len_stlist,OCEAN,step, STWORK1A.1362
+ icode,cmessage,start_step,rmdi) STWORK1A.1363
STWORK1A.1364
IF (icode.gt.0) goto 999 STWORK1A.1365
CL STWORK1A.1366
CL 4.4.3 Set up LOOKUP header if destination is main part of D1 STWORK1A.1367
CL STWORK1A.1368
IF (output_code.EQ.st_dump) THEN STWORK1A.1369
CL STWORK1A.1370
CL 4.4.3 Set other information for input to PPHEAD STWORK1A.1371
CL STWORK1A.1372
GR=STLIST(st_gridpoint_code,ILPREV)! Grid point code STWORK1A.1373
C Any time-processed field has a (non-zero) sample_prd set - STWORK1A.1374
C this will be translated by PP_HEAD into an LBTIM subcode IB of 2 STWORK1A.1375
sample_prd=0.0 STWORK1A.1376
IF (STLIST(st_proc_no_code,ILPREV).GT.st_replace_code) STWORK1A.1377
* THEN STWORK1A.1378
sample_prd=REAL(STLIST(st_freq_code,ILPREV)* STWORK1A.1379
& secs_per_period)/REAL(steps_per_period*3600) STWORK1A.1380
ENDIF STWORK1A.1381
C Address of whole field is calculated from STASHlist STWORK1A.1382
*IF -DEF,MPP GPB1F402.171
IWA=STLIST(st_output_addr,IL)+(II-1)*NUM_WORDS STWORK1A.1383
*ELSE GPB1F402.172
IWA=STLIST(st_dump_output_addr,IL)+(II-1)*NUM_WORDS GPB1F402.173
*ENDIF GPB1F402.174
CL STWORK1A.1384
CL 4.4.4 Call PPHEAD to set LOOKUP header for field STASHed to D1. STWORK1A.1385
CL Here pass previous_time as well as start_step from temporal STWORK1A.1386
CL if start_step is true then start time will be updated. STWORK1A.1387
CL Value of end time is unimportant as that is handled properly STWORK1A.1388
CL when data is written out to pp file. STWORK1A.1389
CL Note that LBNREC is hardwired to 0 and so too is BACC. STWORK1A.1390
CL STWORK1A.1391
CALL PP_HEAD
( GKR0F305.569
*CALL ARGPPX
GKR0F305.570
* im_ident,FIXHD,INTHD,REALHD, GKR0F305.571
1 LEN_FIXHD,LEN_INTHD,LEN_REALHD, STWORK1A.1394
2 IM,IS,GR,lfullfield, STWORK1A.1395
3 level(II),pseudo_level(II), GKR0F305.572
4 samples,start_step,previous_time,fixhd(28),LEN1_LOOKUP, STWORK1A.1397
5 extraw_hdr,LOOKUP(1,ICURRLL),RLOOKUP(1,ICURRLL), TJ140193.60
*IF -DEF,MPP GPB1F402.175
6 N_COLS_OUT,NUM_WORDS,0, STWORK1A.1399
7 N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, STWORK1A.1400
*ELSE GPB1F402.176
6 global_N_COLS_OUT,NUM_WORDS,0, GPB1F402.177
7 global_N_ROWS_OUT,NROW_IN,SROW_IN,WCOL_IN,ECOL_IN, GPB1F402.178
*ENDIF GPB1F402.179
7 lbproc_comp,sample_prd, STWORK1A.1401
8 FCST_PRD,0,PACKING_TYPE, GAB1F400.192
& st_grid,IWA,stsuparr(sa_idx(1)),stsuparr(sa_idx(2)), GAB1F400.193
& stsuparr(sa_idx(3)),stsuparr(sa_idx(4)),T_levels,JJ, GAB1F400.194
A ROTATE,ELF,OCEAN,LEVDEPC,LEN1_LEVDEPC, STWORK1A.1404
B ICODE,CMESSAGE) STWORK1A.1405
C STWORK1A.1406
IF(ICODE.gt.0) goto 999 ! An error has occured GAB1F400.195
GAB1F400.196
C Only (optionally) pack fields if no extra words of data STWORK1A.1411
IF (extraw_hdr .eq. 0) THEN TJ140193.61
LOOKUP(LBPACK,ICURRLL) = GKR0F305.573
& EXPPXI
( im_ident, IS, IM, ppx_dump_packing, GKR0F305.574
*CALL ARGPPX
GKR0F305.575
& icode, cmessage) GKR0F305.576
IF (DUMP_PACK.eq.3 ) THEN GDR2F401.60
! Override packing indicator from PPXREF GDR2F401.61
N1 = 0 ! No packing GDR2F401.62
LOOKUP(LBPACK,ICURRLL) = GDR2F401.63
& (LOOKUP(LBPACK,ICURRLL)/10)*10 + N1 GDR2F401.64
ENDIF GDR2F401.65
ELSE STWORK1A.1414
LOOKUP(LBPACK,ICURRLL)=0 STWORK1A.1415
ENDIF STWORK1A.1416
C Set data type (REAL/INTEGER) from PP_XREF (-ve for timeseries) STWORK1A.1417
IF (STLIST(st_series_ptr,ilprev).GT.0.OR. GRS1F404.235
& STLIST(st_proc_no_code,ilprev).eq.st_time_series_mean) THEN GRS1F404.236
LOOKUP(DATA_TYPE,ICURRLL) = GKR0F305.577
& -EXPPXI
( im_ident, IS, IM, ppx_data_type, GKR0F305.578
*CALL ARGPPX
GKR0F305.579
& icode, cmessage) GKR0F305.580
ELSE STWORK1A.1420
LOOKUP(DATA_TYPE,ICURRLL) = GKR0F305.581
& EXPPXI
( im_ident, IS, IM, ppx_data_type, GKR0F305.582
*CALL ARGPPX
GKR0F305.583
& icode, cmessage) GKR0F305.584
ENDIF STWORK1A.1422
ICURRLL=ICURRLL+1 ! Update the counter for the next field STWORK1A.1423
C STWORK1A.1424
ENDIF ! End of IF output_code=dump STWORK1A.1425
C STWORK1A.1426
ENDDO ! --- End of levels loop --- STWORK1A.1427
C STWORK1A.1428
ELSE STWORK1A.1429
ICODE=9 STWORK1A.1430
CMESSAGE='STWORK : Illegal output destination in STLIST' STWORK1A.1431
GOTO 999 STWORK1A.1432
ENDIF ! End of STLIST output destination IF block STWORK1A.1433
C STWORK1A.1434
ENDIF ! END OF S_F IF Block --------------------------------- STWORK1A.1435
CL STWORK1A.1436
CL 5. End of loop over STASHlist entries - RETURN to calling routine STWORK1A.1437
CL STWORK1A.1438
200 CONTINUE STWORK1A.1439
C STWORK1A.1440
999 CONTINUE STWORK1A.1441
RETURN STWORK1A.1442
CL STWORK1A.1443
CL 9. IO error exits STWORK1A.1444
CL STWORK1A.1445
990 WRITE(CMESSAGE,'("STWORK : Error opening output PP file on unit " STWORK1A.1446
& ,I2)') UNITPP STWORK1A.1447
RETURN STWORK1A.1448
END STWORK1A.1449
*ENDIF STWORK1A.1450