*IF DEF,CONTROL,AND,DEF,OCEAN STOCGT1.2
C ******************************COPYRIGHT****************************** GTS2F400.9721
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.9722
C GTS2F400.9723
C Use, duplication or disclosure of this code is subject to the GTS2F400.9724
C restrictions as set forth in the contract. GTS2F400.9725
C GTS2F400.9726
C Meteorological Office GTS2F400.9727
C London Road GTS2F400.9728
C BRACKNELL GTS2F400.9729
C Berkshire UK GTS2F400.9730
C RG12 2SZ GTS2F400.9731
C GTS2F400.9732
C If no contract has been raised with this copy of the code, the use, GTS2F400.9733
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.9734
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.9735
C Modelling at the above address. GTS2F400.9736
C ******************************COPYRIGHT****************************** GTS2F400.9737
C GTS2F400.9738
CLL Subroutine STOCGT ----------------------------------------------- STOCGT1.3
CLL STOCGT1.4
CLL Purpose: To extract 3D primary data and 2D fields (after removal of STOCGT1.5
CLL redundant columns when cyclic boundary conditions are in STOCGT1.6
CLL use) for use by STASH STOCGT1.7
CLL STOCGT1.8
CLL Author: N.K.Taylor Date: 25/01/91 STOCGT1.9
CLL STOCGT1.10
CLL Tested under compiler: cft77 STOCGT1.11
CLL Tested under OS version: UNICOS 5.1.10 STOCGT1.12
CLL STOCGT1.13
CLL Model Modification history from model version 3.0: STOCGT1.14
CLL version Date STOCGT1.15
CLL 3.2 02/07/93 Dynamic allocation changes - R.T.H.Barnes. @DYALLOC.3433
CLL 3.3 22/11/93 Remove hard coded validation of sub-model no. RH221193.1
CLL Replace with check using parameters. - R.S.R.Hill RH221193.2
CLL 3.5 19/05/95 Remove ARGSIZE, pass in equivalent args. K Rogers GKR0F305.813
CLL 4.1 22/03/96 Increased no. of dimensions in array SI GGH2F401.1
CLL to include internal model id. G Henderson GGH2F401.2
! 4.1 Apr. 96 Rationalise *CALLs S.J.Swarbrick GSS1F401.57
CLL 4.2 26/11/96 Allow uncompressed ocean dumps OSI0F402.147
! 4.3 18/04/97 Include calls to OD12SLAB for mpp code. ORH4F403.1
CLL STOCGT1.16
CLL Programming Standard: UM Doc Paper 3, version 2 (10/08/90) STOCGT1.17
CLL STOCGT1.18
CLL Logical components covered: CO STOCGT1.19
CLL STOCGT1.20
CLL Project Task: STOCGT1.21
CLL STOCGT1.22
CLL External documentation: STOCGT1.23
CLL STOCGT1.24
CLLEND ----------------------------------------------------------------- STOCGT1.25
C*L Arguments STOCGT1.26
STOCGT1.27
SUBROUTINE STOCGT ( 6,5SF011193.48
*CALL ARGPPX
GKR0F305.814
& ROWS, ROW_LEN, LEVELS, im_ident, submodel, GKR0F305.815
*DATA,STNO,SECTION,LEVEL1,LEVEL2,base_level, SF011193.50
& RMDI,VALUES,IX,IY,IZ,NT_DIM, GKR0F400.355
& SI,JOC_TRACER,JOC_U,JOC_V,O_CFI1, GKR0F305.816
& O_CFI2,O_CFI3,JOC_NO_SEAPTS,JOC_NO_SEGS,ICODE,CMESSAGE) @DYALLOC.3436
STOCGT1.30
IMPLICIT NONE STOCGT1.31
STOCGT1.32
CL Common Blocks STOCGT1.33
STOCGT1.34
*CALL TYPSIZE
@DYALLOC.3437
*CALL CSUBMODL
GKR0F305.824
*CALL CPPXREF
@DYALLOC.3438
*CALL PPXLOOK
! Contains *CALL VERSION GSS1F401.58
STOCGT1.37
INTEGER STOCGT1.38
& ROWS, ! (IN) No of rows GKR0F305.818
& ROW_LEN, ! (IN) No of points per row GKR0F305.819
& LEVELS, ! (IN) No of levels GKR0F305.820
& im_ident, ! (IN) Internal model id GKR0F305.821
& submodel, ! (IN) Submodel id GKR0F305.822
& STNO , !(IN) stash identifier for extracted variable STOCGT1.39
& SECTION, ! (IN) STOCGT1.40
& LEVEL1,LEVEL2 ! (IN) levels between which data is extracted STOCGT1.41
& ,base_level ! (IN) first ocean level diagnosed STOCGT1.42
& ,NT_DIM ! (IN) number of tracers GKR0F400.356
& ,SI(NITEMS,0:NSECTS,N_INTERNAL_MODEL) !STASH IN ADDRESS GGH2F401.4
& ,JOC_TRACER(NT_DIM,2) ! (IN) ocean tracer pointers GKR0F400.357
& ,JOC_U(2),JOC_V(2) ! (IN) ocean pointers @DYALLOC.3442
& ,JOC_NO_SEAPTS,JOC_NO_SEGS @DYALLOC.3443
& ,O_CFI1(O_LEN_CFI1+1) ! (IN) ocean compressed field index @DYALLOC.3444
& ,O_CFI2(O_LEN_CFI2+1),O_CFI3(O_LEN_CFI3+1) @DYALLOC.3445
c STOCGT1.43
INTEGER STOCGT1.44
& IX, ! (OUT) STOCGT1.45
& IY, ! (OUT) STOCGT1.46
& IZ, ! (OUT) STOCGT1.47
& ICODE ! (OUT) STOCGT1.48
STOCGT1.49
REAL STOCGT1.50
& DATA(*), ! (IN) input1-d array of data, possibly compr STOCGT1.51
& RMDI, ! (IN) missing data indicator STOCGT1.52
& VALUES(*) ! (OUT) output array of data for diagnostic STOCGT1.53
STOCGT1.54
CHARACTER*256 STOCGT1.55
& CMESSAGE ! (OUT) Error message if return code >0 STOCGT1.56
STOCGT1.57
CL External subroutines called STOCGT1.58
STOCGT1.59
EXTERNAL STOCGT1.60
& UNPACK STOCGT1.61
c STOCGT1.62
c*-------------------------------------------------------------------- STOCGT1.63
c STOCGT1.64
c Local variables STOCGT1.65
c STOCGT1.66
INTEGER STOCGT1.67
& ROW1, ! 1st row to be extracted from compressed data STOCGT1.68
& ROW2, ! Last " " " " " " " STOCGT1.69
& PT, ! Local pointer to correct position in array D1 STOCGT1.70
& INDEX, ! Local pointer to position in output array valu STOCGT1.71
& JJ,KK,KK1,! Temporary inner loop counters STOCGT1.72
& I,J,K, ! Do loop indices STOCGT1.73
& im_index, ! Internal model index number GGH2F401.3
& GR, ! Local value of PP cross reference grid code STOCGT1.74
& IXDATA ! No of x-points in input data array STOCGT1.75
* ,EXPPXI ! Function to extract ppxref info GKR0F305.823
c STOCGT1.76
CL-------------------------------------------------------------------- STOCGT1.77
C Get internal model index GGH2F401.5
im_index = internal_model_index(im_ident) GGH2F401.6
CL Check input values for validity STOCGT1.78
c STOCGT1.79
c Check levels STOCGT1.80
c STOCGT1.81
IF (LEVEL1.GT.LEVEL2) THEN STOCGT1.82
ICODE=3 STOCGT1.83
CMESSAGE='STOCGT : Incorrect levels: level1 > level2' STOCGT1.84
GOTO 999 STOCGT1.85
ENDIF STOCGT1.86
c STOCGT1.87
IF (LEVEL1.LT.1) THEN STOCGT1.88
ICODE=3 STOCGT1.89
CMESSAGE='STOCGT : Incorrect levels: level1 < 1' STOCGT1.90
GOTO 999 STOCGT1.91
ENDIF STOCGT1.92
c STOCGT1.93
IF (LEVEL1.GT.LEVELS) THEN GKR0F305.827
ICODE=3 STOCGT1.95
CMESSAGE='STOCGT : Incorrect levels: level1 > LEVELS' GKR0F305.828
GOTO 999 STOCGT1.97
ENDIF STOCGT1.98
c STOCGT1.99
IF (LEVEL2.LT.1) THEN STOCGT1.100
ICODE=3 STOCGT1.101
CMESSAGE='STOCGT : Incorrect levels: level2 < 1' STOCGT1.102
GOTO 999 STOCGT1.103
ENDIF STOCGT1.104
c STOCGT1.105
IF (LEVEL2.GT.LEVELS) THEN GKR0F305.829
ICODE=3 STOCGT1.107
CMESSAGE='STOCGT : Incorrect levels: level2 > LEVELS' GKR0F305.830
GOTO 999 STOCGT1.109
ENDIF STOCGT1.110
c STOCGT1.111
c Check STASH identifier STOCGT1.112
c STOCGT1.113
IF ( im_ident .NE.OCEAN_IM) THEN GKR0F305.831
ICODE=1 STOCGT1.115
CMESSAGE='STOCGT : Invalid SUB-MODEL' RH221193.5
GOTO 999 STOCGT1.117
ENDIF STOCGT1.118
CL---------------------------------------------------------------------- STOCGT1.138
CL Calculate IX,IY,IZ - the output field dimensions, and STOCGT1.139
CL IXDATA - the input field x-dimension STOCGT1.140
c STOCGT1.141
c Look up local PP cross reference STOCGT1.142
c STOCGT1.143
GR = EXPPXI
(im_ident, section, stno, ppx_grid_type, GKR0F305.832
*CALL ARGPPX
GKR0F305.833
& icode, cmessage) GKR0F305.834
c STOCGT1.151
c Extract all physical points - number depends on EW bdry condition STOCGT1.152
c and the input grid type STOCGT1.153
c STOCGT1.154
IF (CYCLIC_OCEAN) THEN ! CYCLIC_OCEAN is set by user interface STOCGT1.155
IF ((GR.EQ.ppx_ocn_tfield).OR.(GR.EQ.ppx_ocn_ufield) STOCGT1.156
& .OR.(GR.EQ.ppx_ocn_tmerid).OR.(GR.EQ.ppx_ocn_umerid)) THEN STOCGT1.157
IXDATA=IMTM2 STOCGT1.158
IX=IMTM2 STOCGT1.159
ELSEIF ((GR.EQ.ppx_ocn_tzonal).OR.(GR.EQ.ppx_ocn_uzonal) STOCGT1.160
& .OR.(GR.EQ.ppx_ocn_scalar)) THEN STOCGT1.161
IXDATA=1 STOCGT1.162
IX=1 STOCGT1.163
ELSE STOCGT1.164
IXDATA=IMTM2 +2 ORH5F400.37
IX=IMTM2 STOCGT1.166
ENDIF STOCGT1.167
ELSE STOCGT1.168
IF ((GR.EQ.ppx_ocn_tzonal).OR.(GR.EQ.ppx_ocn_uzonal) STOCGT1.169
& .OR.(GR.EQ.ppx_ocn_scalar)) THEN STOCGT1.170
IXDATA=1 STOCGT1.171
IX=1 STOCGT1.172
ELSE STOCGT1.173
IXDATA=ROW_LEN GKR0F305.836
IX=ROW_LEN GKR0F305.837
ENDIF STOCGT1.176
ENDIF STOCGT1.177
c STOCGT1.178
c Remove row ROWS at U,V points in output field GKR0F305.838
c STOCGT1.180
IF ((GR.EQ.ppx_ocn_uall) STOCGT1.181
& .OR.(GR.EQ.ppx_ocn_ucomp) STOCGT1.182
& .OR.(GR.EQ.ppx_ocn_ufield) STOCGT1.183
& .OR.(GR.EQ.ppx_ocn_uzonal)) THEN STOCGT1.184
*IF DEF,MPP ORH5F403.1
IY = ROWS ORH5F403.2
*ELSE ORH5F403.3
IY = ROWS - 1 ORH5F403.4
*ENDIF ORH5F403.5
ELSEIF ((GR.EQ.ppx_ocn_tmerid).OR.(GR.EQ.ppx_ocn_umerid) STOCGT1.186
& .OR.(GR.EQ.ppx_ocn_scalar)) THEN STOCGT1.187
IY=1 STOCGT1.188
ELSE STOCGT1.189
IY=ROWS GKR0F305.840
ENDIF STOCGT1.191
c STOCGT1.192
IZ=LEVEL2-LEVEL1+1 STOCGT1.193
c STOCGT1.194
CL---------------------------------------------------------------------- STOCGT1.195
CL Set pointer to stash address OSI0F402.148
OSI0F402.149
IF (STNO.GE.101.AND.STNO.LE.122) THEN OSI0F402.150
OSI0F402.151
C For all dual time level variables, except climate mean sections, OSI0F402.152
C select 'update' level (joc_variable(2)). OSI0F402.153
OSI0F402.154
IF (SECTION.GE.41.AND.SECTION.LE.44) THEN OSI0F402.155
PT = SI(STNO,SECTION,im_index) OSI0F402.156
ELSE OSI0F402.157
IF (STNO.GE.101.AND.STNO.LE.120) THEN ! tracers OSI0F402.158
PT = JOC_TRACER(STNO-100,2) OSI0F402.159
ELSE IF (STNO.EQ.121) THEN ! zonal velocity OSI0F402.160
PT = JOC_U(2) OSI0F402.161
ELSE IF (STNO.EQ.122) THEN ! meridional velocity OSI0F402.162
PT = JOC_V(2) OSI0F402.163
ENDIF OSI0F402.164
ENDIF OSI0F402.165
OSI0F402.166
ELSE OSI0F402.167
OSI0F402.168
PT = SI(STNO,SECTION,im_index) OSI0F402.169
OSI0F402.170
ENDIF OSI0F402.171
OSI0F402.172
CL---------------------------------------------------------------------- OSI0F402.173
CL Extract data STOCGT1.196
c STOCGT1.197
c STOCGT1.198
IF (GR.EQ.ppx_ocn_tcomp) THEN STOCGT1.199
c Extract tracers. STOCGT1.200
c Need to access 3d primary data, using UNPACK to expand from STOCGT1.201
c compressed form STOCGT1.202
c Extract all rows STOCGT1.203
ROW1=1 STOCGT1.204
ROW2=IY STOCGT1.205
*IF DEF,MPP ORH4F403.2
CALL OD12SLAB
(1,IMT,ROW1,ROW2,1,KM,IMT,1,KM,IMT,JMT,KM, ORH4F403.3
& DATA(PT),VALUES) ORH4F403.4
*ELSE ORH4F403.5
OSI0F402.174
CALL UNPACK
(ROW1,ROW2,LEVEL1,LEVEL2,ROWS,LEVELS, GKR0F305.841
& IX,IY,IZ,O_CFI1,O_CFI2,joc_no_segs,O_CFI3, STOCGT1.212
& joc_no_seapts,DATA(PT),VALUES,RMDI,.FALSE.) STOCGT1.213
*ENDIF ORH4F403.6
ELSE IF (GR.EQ.ppx_ocn_ucomp) THEN STOCGT1.214
c Extract velocities STOCGT1.215
c Extract all rows STOCGT1.216
ROW1=1 STOCGT1.217
ROW2=IY STOCGT1.218
c STOCGT1.219
*IF DEF,MPP ORH4F403.7
CALL OD12SLAB
(1,IMT,ROW1,ROW2,1,KM,IMT,1,KM,IMT,JMT,KM, ORH4F403.8
& DATA(PT),VALUES) ORH4F403.9
*ELSE ORH4F403.10
CALL UNPACK
(ROW1,ROW2,LEVEL1,LEVEL2,ROWS,LEVELS, GKR0F305.842
& IX,IY,IZ,O_CFI1,O_CFI2,joc_no_segs,O_CFI3, STOCGT1.239
& joc_no_seapts,DATA(PT),VALUES,RMDI,.FALSE.) STOCGT1.240
c STOCGT1.241
*ENDIF ORH4F403.11
ELSE IF((GR.EQ.ppx_ocn_tall).OR.(GR.EQ.ppx_ocn_uall).OR. STOCGT1.242
& (GR.EQ.ppx_ocn_tfield).OR.(GR.EQ.ppx_ocn_ufield) .OR. STOCGT1.243
& (GR.EQ.ppx_ocn_tzonal).OR.(GR.EQ.ppx_ocn_uzonal) .OR. STOCGT1.244
& (GR.EQ.ppx_ocn_tmerid).OR.(GR.EQ.ppx_ocn_umerid) .OR. STOCGT1.245
& (GR.EQ.ppx_ocn_scalar)) THEN STOCGT1.246
c Extract uncompressed data, excluding cyclic points if present STOCGT1.247
c in input field STOCGT1.248
DO K=1,IZ STOCGT1.249
KK=(K-1)*IX*IY STOCGT1.250
KK1=(K-1)*IXDATA*IY+(LEVEL1-base_level)*IXDATA*IY STOCGT1.251
DO J=1,IY STOCGT1.252
JJ=(J-1)*IXDATA STOCGT1.253
INDEX=KK+(J-1)*IX STOCGT1.254
DO I=1,IX STOCGT1.255
INDEX=INDEX+1 STOCGT1.256
VALUES(INDEX)=DATA(PT+(I-1)+JJ+KK1) OSI0F402.175
ENDDO STOCGT1.259
ENDDO STOCGT1.260
ENDDO STOCGT1.261
ELSE STOCGT1.262
ICODE=1 STOCGT1.263
CMESSAGE='STOCGT : Unrecognised grid type' STOCGT1.264
GOTO 999 STOCGT1.265
ENDIF STOCGT1.266
c STOCGT1.267
ICODE=0 STOCGT1.268
CMESSAGE='Normal Exit' STOCGT1.269
c STOCGT1.270
999 CONTINUE STOCGT1.271
RETURN STOCGT1.272
END STOCGT1.273
*ENDIF STOCGT1.274