*IF DEF,CONTROL GTPPXPT1.2
C ******************************COPYRIGHT****************************** GTS2F400.12412
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.12413
C GTS2F400.12414
C Use, duplication or disclosure of this code is subject to the GTS2F400.12415
C restrictions as set forth in the contract. GTS2F400.12416
C GTS2F400.12417
C Meteorological Office GTS2F400.12418
C London Road GTS2F400.12419
C BRACKNELL GTS2F400.12420
C Berkshire UK GTS2F400.12421
C RG12 2SZ GTS2F400.12422
C GTS2F400.12423
C If no contract has been raised with this copy of the code, the use, GTS2F400.12424
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.12425
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.12426
C Modelling at the above address. GTS2F400.12427
C GTS2F400.12428
!+ Reads required portion of PPXREF file into "look-up" arrays GTPPXPT1.3
! GTPPXPT1.4
! Subroutine Interface: GTPPXPT1.5
GTPPXPT1.6
SUBROUTINE GETPPX_PART(NFT,NFTU,StmsrNam,Im_ident,RowNumber, 4,4GSS2F401.230
*CALL ARGPPX
GTPPXPT1.8
& ErrorStatus,CMESSAGE) GSS1F400.341
IMPLICIT NONE GTPPXPT1.10
! GTPPXPT1.11
! Description: GTPPXPT1.12
! Reads records from PPXREF file into arrays PPXI (for integer data) GTPPXPT1.13
! and PPXC (for character data, i.e. name of diagnostic/prognostic). GTPPXPT1.14
! Only those ppxref records corresponding to entries in the STASH GTPPXPT1.15
! addresses array IN_S are read in. Also set up pointer array PPXPTR. GTPPXPT1.16
! GTPPXPT1.17
! Method: GTPPXPT1.18
! Uses routines SETPOS and BUFFIN - these employ Cray-specific code GTPPXPT1.19
! GTPPXPT1.20
! Current code owner: S.J.Swarbrick GTPPXPT1.21
! GTPPXPT1.22
! History: GTPPXPT1.23
! Version Date Comment GTPPXPT1.24
! ======= ==== ======= GTPPXPT1.25
! 3.5 Mar 95 Original code. S.J.Swarbrick GTPPXPT1.26
! 4.0 Sept 95 S.J.Swarbrick GSS1F400.342
! 4.0 Dec. 95 Check for ppxRecs LE (NDIAGP or NUM_DIAG_MAX) ANF4F400.17
! (N Farnon) ANF4F400.18
! 4.1 Apr. 96 Changes associated with new STASHmaster format GSS1F401.6
! S.J.Swarbrick GSS1F401.7
! 4.5 30/10/97 Read stash data on PE 0 for the T3E GBCVF405.437
! and distribute it. GBCVF405.438
! Author: Bob Carruthers, Cray Research GBCVF405.439
! GTPPXPT1.27
! Code description: GTPPXPT1.28
! FORTRAN 77 + common Fortran 90 extensions. GTPPXPT1.29
! Written to UM programming standards version 7. GTPPXPT1.30
! GTPPXPT1.31
! System component covered: GTPPXPT1.32
! System task: Sub-Models Project GTPPXPT1.33
! GTPPXPT1.34
! Global Variables: GTPPXPT1.35
*CALL CSUBMODL
GTPPXPT1.37
*CALL CPPXREF
GTPPXPT1.38
*CALL PPXLOOK
GTPPXPT1.40
*CALL C_MDI
GTPPXPT1.41
*CALL CSTASH
GRB0F401.5
*CALL STEXTEND
! Declares IN_S GTPPXPT1.43
GTPPXPT1.44
! Subroutine arguments GTPPXPT1.45
! Scalar arguments with intent(in): GTPPXPT1.47
INTEGER NFT,NFTU ! Unit nos. for STASHmaster files GSS2F401.231
CHARACTER*13 Stmsrnam ! Names of stash master files GSS2F401.232
GTPPXPT1.50
! Array arguments with intent(out): GTPPXPT1.51
CHARACTER*80 CMESSAGE ! Error return message GTPPXPT1.52
GTPPXPT1.53
! Error status: GTPPXPT1.54
INTEGER ErrorStatus ! Error return code GSS1F400.343
GTPPXPT1.56
! Local scalars: GTPPXPT1.57
INTEGER I,J,K,Model ! Loop counters GSS1F400.344
CHARACTER*80 STASH_MSTR ! File name for STASH master GSS2F401.233
INTEGER Im_index ! Internal model index (run dependent) GSS1F400.345
INTEGER Im_ident ! Internal model identifier (absolute) GSS1F400.346
INTEGER Section,Sec ! section no. GSS2F401.234
INTEGER Item,Itm ! item no. GSS2F401.235
INTEGER RowNumber ! Row no. counter for PPXI, PPXC arrays GTPPXPT1.67
INTEGER RowNum_U ! Do. for PPXI_U, PPXC_U (user diags.) GSS1F400.349
CHARACTER*36 NAME GSS2F401.236
CHARACTER*1 CHAR1 GSS2F401.237
INTEGER FirstBlank GSS2F401.238
INTEGER IOStatus GSS2F401.239
GTPPXPT1.68
! Local arrays: GTPPXPT1.69
! WARNING: must have PPXREF_CHARLEN=4*PPX_CHARWORD GTPPXPT1.70
! to avoid overwriting GTPPXPT1.71
CHARACTER DNAM (PPXREF_CHARLEN) ! For char part of ppx record GTPPXPT1.72
INTEGER CODES(PPXREF_CODELEN) ! For integer part of ppx record GTPPXPT1.73
INTEGER IMASK(20) GSS2F401.240
*IF DEF,MPP,AND,DEF,T3E GBCVF405.440
GBCVF405.441
common/shmem_getppx_c1/ dnam GBCVF405.442
cdir$ cache_align /shmem_getppx_c1/ GBCVF405.443
common/shmem_getppx_c2/ char1 GBCVF405.444
cdir$ cache_align /shmem_getppx_c2/ GBCVF405.445
common/shmem_getppx/ codes, iostatus, Model, Sec, Itm GBCVF405.446
cdir$ cache_align /shmem_getppx/ GBCVF405.447
c GBCVF405.448
integer shmem_n_pes, msg, info, nproc, shmem_my_pe, mype GBCVF405.449
c GBCVF405.450
*ENDIF GBCVF405.451
GTPPXPT1.74
! Function and subroutine calls: GTPPXPT1.75
EXTERNAL READSTM GSS2F401.241
! GTPPXPT1.77
!- End of header ------------------------------------------------------- GTPPXPT1.78
! GTPPXPT1.79
ErrorStatus = 0 GSS1F400.350
IOStatus=0 GSS2F401.242
C---------------------------------------------------------------------- ANF4F400.19
C Check that the no. of requested diagnostics does not exceed max ANF4F400.20
C defined in comdecks VERSION and PPXLOOK. ANF4F400.21
C ANF4F400.22
IF ( (ppxRecs .GT. NDIAGP) .OR. (ppxRecs .GT. NUM_DIAG_MAX) ) ANF4F400.23
&THEN ANF4F400.24
WRITE(6,*) 'ERROR: no. of diags. reqested exceeds max' ANF4F400.25
WRITE(6,*) 'ppxRecs=',ppxRecs,' NDIAGP=',NDIAGP, ANF4F400.26
& ' NUM_DIAG_MAX=',NUM_DIAG_MAX ANF4F400.27
Errorstatus=104 ANF4F400.28
CMESSAGE= 'GTPPXPT1: ppxRecs GT (NDIAGP or NUM_DIAG_MAX)' ANF4F400.29
GO TO 9999 ANF4F400.30
END IF ANF4F400.31
C---------------------------------------------------------------------- ANF4F400.32
!Open STASHmaster file for current internal model GSS2F401.243
! Get directory name for STASHmaster & append rest of filename GSS2F401.244
*IF DEF,MPP,AND,DEF,T3E GBCVF405.452
mype=shmem_my_pe() GBCVF405.453
nproc=shmem_n_pes() GBCVF405.454
*ENDIF GBCVF405.455
*IF DEF,MPP,AND,DEF,T3E GBCVF405.456
stash_mstr='empty ' GBCVF405.457
if(mype.eq.0) CALL GET_FILE
(NFT,STASH_MSTR,80,ErrorStatus) GBCVF405.458
*ELSE GBCVF405.459
CALL GET_FILE
(NFT,STASH_MSTR,80,ErrorStatus) GSS2F401.245
*ENDIF GBCVF405.460
FirstBlank = 0 GSS2F401.246
DO I = 1,80 GSS2F401.247
IF (STASH_MSTR(I:I).EQ.' '.AND.FirstBlank.EQ.0) GSS2F401.248
& FirstBlank=I GSS2F401.249
END DO GSS2F401.250
STASH_MSTR(FirstBlank:FirstBlank)='/' GSS2F401.251
STASH_MSTR(FirstBlank+1:FirstBlank+13)=StmsrNam GSS2F401.252
*IF DEF,MPP,AND,DEF,T3E GBCVF405.461
if(mype.eq.0) OPEN(UNIT=NFT,FILE=STASH_MSTR,IOSTAT=IOStatus) GBCVF405.462
GBCVF405.463
msg=7060 GBCVF405.464
info=0 GBCVF405.465
call gc_ibcast(
msg, 1, 0, nproc, info, IOStatus) GBCVF405.466
GBCVF405.467
*ELSE GBCVF405.468
OPEN(UNIT=NFT,FILE=STASH_MSTR,IOSTAT=IOStatus) GSS2F401.253
*ENDIF GBCVF405.469
IF(IOStatus.NE.0) THEN GSS2F401.254
WRITE(6,*) 'ERROR in routine GETPPX_PART' GSS2F401.255
WRITE(6,*) GSS2F401.256
& 'CANNOT OPEN STASHmaster FILE, IOSTATUS=',IOStatus GSS2F401.257
WRITE(6,*) 'UNIT=',NFT,' FILE=',STASH_MSTR GSS2F401.258
ErrorStatus=100 GSS2F401.259
CMESSAGE=' GETPPX_PART: ERROR OPENING STASHmaster' GSS2F401.260
GOTO 9999 GSS2F401.261
END IF GSS2F401.262
GTPPXPT1.102
! Read the required ppxref records into PPXI, PPXC GSS1F400.355
Im_index = INTERNAL_MODEL_INDEX(Im_ident) GSS2F401.263
DO Section = 0,PPXREF_SECTIONS GSS2F401.264
DO Item = 1,PPXREF_ITEMS GSS2F401.265
GTPPXPT1.104
! Check whether there is a stash entry GTPPXPT1.114
IF (IN_S(1,Im_ident,Section,Item) .NE. 0) THEN GSS1F400.362
! Assign pointer value GTPPXPT1.116
PPXPTR(Im_index,Section,Item) = RowNumber GSS1F400.363
GSS2F401.266
! OriginFlag was compressed down at end of STASH_PROC, GSS2F401.267
! to contain only those items requested. GSS2F401.268
GSS2F401.269
IF (OriginFlag(RowNumber).EQ.'U') THEN GSS1F400.367
! Record is from user STASHmaster GSS2F401.270
GSS2F401.271
! GETPPX saved all userSTASHmaster records, not just GSS2F401.272
! those requested, so search for correct record. GSS2F401.273
DO I = 1,NUM_USR_DIAG_MAX GSS1F400.370
IF (PPXI_U(I,1).eq.Im_ident .and. GSS1F400.371
& PPXI_U(I,2).eq.Section .and. GSS1F400.372
& PPXI_U(I,3).eq.Item) THEN GSS1F400.373
! Correct record found GSS2F401.274
RowNum_U = I GSS1F400.374
END IF GSS1F400.375
END DO GSS1F400.376
! Read user ppxref record from transfer arrays GSS1F400.377
DO I=1,PPXREF_CHARLEN GSS1F400.378
PPXC(RowNumber,I)=PPXC_U(RowNum_U,I) GSS1F400.379
END DO GSS1F400.380
DO I=1,PPXREF_CODELEN GSS1F400.381
PPXI(RowNumber,I)=PPXI_U(RowNum_U,I) GSS1F400.382
END DO GSS1F400.383
IF ((PPXI(RowNumber,1).NE.Im_ident).OR. GSS1F400.384
& (PPXI(RowNumber,2).NE.Section ).OR. GSS1F400.385
& (PPXI(RowNumber,3).NE.Item )) THEN GSS1F400.386
WRITE(6,*) 'ERROR, GETPPX_PART: ' GSS1F400.387
WRITE(6,*) 'Inconsistency in user ppxref transfer' GSS1F400.388
WRITE(6,*) 'Model,Section,Item: ', GSS1F400.389
& Im_ident,Section,Item GSS1F400.390
ErrorStatus=115 GSS1F400.391
GO TO 9999 GSS1F400.392
END IF GSS1F400.393
GSS2F401.275
ELSE IF (OriginFlag(RowNumber).EQ.'P') THEN GSS1F400.394
GSS2F401.276
! Find appropriate record in STASHmaster file and read it in GSS2F401.277
*IF DEF,MPP,AND,DEF,T3E GBCVF405.470
100 continue GBCVF405.471
if(mype.eq.0) READ(NFT,'(A1)') CHAR1 GBCVF405.472
c GBCVF405.473
msg=7063 GBCVF405.474
info=0 GBCVF405.475
call gc_cbcast(
msg, 1, 0, nproc, info, char1) GBCVF405.476
c GBCVF405.477
*ELSE GBCVF405.478
100 READ(NFT,'(A1)') CHAR1 GSS2F401.278
*ENDIF GBCVF405.479
IF (CHAR1.EQ.'1') THEN GSS2F401.279
*IF DEF,MPP,AND,DEF,T3E GBCVF405.480
if(mype.eq.0) then GBCVF405.481
BACKSPACE NFT GBCVF405.482
READ(NFT,'(2X,3(I5,2X))') Model,Sec,Itm GBCVF405.483
endif GBCVF405.484
c GBCVF405.485
msg=7066 GBCVF405.486
info=0 GBCVF405.487
call gc_ibcast(
msg, 3, 0, nproc,info, model) GBCVF405.488
c GBCVF405.489
*ELSE GBCVF405.490
BACKSPACE NFT GSS2F401.280
READ(NFT,'(2X,3(I5,2X))') Model,Sec,Itm GSS2F401.281
*ENDIF GBCVF405.491
IF (Model.EQ.-1) THEN GSS2F401.282
WRITE(6,*) GSS2F401.283
& 'GETPPX_PART: End of STASHmaster file ', GSS2F401.284
& StmsrNam,' reached' GSS2F401.285
GO TO 1100 GSS2F401.286
END IF GSS2F401.287
IF (Sec.EQ.Section .AND. Itm.EQ.Item) THEN GSS2F401.288
! Correct record found GSS2F401.289
*IF DEF,MPP,AND,DEF,T3E GBCVF405.492
if(mype.eq.0) then GBCVF405.493
BACKSPACE NFT GBCVF405.494
CALL READSTM
GBCVF405.495
& (IMASK,DNAM,CODES,NFT,ErrorStatus,CMESSAGE) GBCVF405.496
endif GBCVF405.497
GBCVF405.498
msg=7061 GBCVF405.499
info=0 GBCVF405.500
call gc_ibcast(
msg, ppxref_codelen, 0, nproc, GBCVF405.501
2 info, codes) GBCVF405.502
msg=7062 GBCVF405.503
info=0 GBCVF405.504
call gc_cbcast(
msg, ppxref_charlen, 0, nproc, GBCVF405.505
2 info, dnam) GBCVF405.506
*ELSE GBCVF405.507
BACKSPACE NFT GSS2F401.290
CALL READSTM
GSS2F401.291
& (IMASK,DNAM,CODES,NFT,ErrorStatus,CMESSAGE) GSS2F401.292
*ENDIF GBCVF405.508
! Transfer STASHmaster record to look-up arrays GSS2F401.293
DO I=1,PPXREF_CHARLEN GSS2F401.294
PPXC(RowNumber,I)=DNAM(I) GSS2F401.295
END DO GSS2F401.296
DO I=1,PPXREF_CODELEN GSS2F401.297
PPXI(RowNumber,I)=CODES(I) GSS2F401.298
END DO GSS2F401.299
ELSE GSS2F401.300
GO TO 100 GSS2F401.301
END IF GSS2F401.302
ELSE GSS2F401.303
GO TO 100 GSS2F401.304
END IF GSS1F400.401
ELSE IF (OriginFlag(RowNumber).NE.' ') THEN GSS1F400.447
WRITE(6,*) 'ERROR, GETPPX_PART: INVALID OriginFlag' GSS1F400.448
WRITE(6,*) 'Row number, Flag' GSS1F400.449
WRITE(6,*) RowNumber, OriginFlag(RowNumber) GSS1F400.450
ErrorStatus=135 GSS2F401.305
GO TO 9999 GSS1F400.452
END IF GSS1F400.453
GTPPXPT1.188
RowNumber = RowNumber + 1 GTPPXPT1.189
1100 CONTINUE GSS2F401.306
GTPPXPT1.190
IF ((RowNumber-1) .GT. ppxRecs) THEN GTPPXPT1.191
WRITE(6,*) 'Error in GETPPX_PART:' GTPPXPT1.192
WRITE(6,*) GTPPXPT1.193
& ' PPXI row number exceeds total no. of ppx records' GTPPXPT1.194
GO TO 9999 GTPPXPT1.195
END IF GTPPXPT1.196
GTPPXPT1.197
END IF ! Stash entries GTPPXPT1.198
END DO ! Items GTPPXPT1.200
END DO ! Sections GSS2F401.307
GTPPXPT1.203
9999 CONTINUE GTPPXPT1.204
GSS2F401.308
*IF DEF,MPP,AND,DEF,T3E GBCVF405.509
if(mype.eq.0) CLOSE(UNIT=NFT) GBCVF405.510
*ELSE GBCVF405.511
CLOSE(UNIT=NFT) GSS2F401.309
*ENDIF GBCVF405.512
RETURN GTPPXPT1.205
END GTPPXPT1.206
!- End of Subroutine code --------------------------------------------- GTPPXPT1.207
*ENDIF GTPPXPT1.208