*IF DEF,CONTROL,OR,DEF,UTILIO,OR,DEF,RECON,OR,DEF,FLDOP UIE3F404.22
C ******************************COPYRIGHT****************************** GTS2F400.3781
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.3782
C GTS2F400.3783
C Use, duplication or disclosure of this code is subject to the GTS2F400.3784
C restrictions as set forth in the contract. GTS2F400.3785
C GTS2F400.3786
C Meteorological Office GTS2F400.3787
C London Road GTS2F400.3788
C BRACKNELL GTS2F400.3789
C Berkshire UK GTS2F400.3790
C RG12 2SZ GTS2F400.3791
C GTS2F400.3792
C If no contract has been raised with this copy of the code, the use, GTS2F400.3793
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.3794
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.3795
C Modelling at the above address. GTS2F400.3796
C ******************************COPYRIGHT****************************** GTS2F400.3797
C GTS2F400.3798
CLL SUBROUTINE HDPPXRF --------------------------------------------- HDPPXRF1.3
CLL HDPPXRF1.4
CLL PROGRAM TO READ THE HEADER RECORD OF THE PPXREF FILE HDPPXRF1.5
CLL CHECK THE VALUES AND RETURN THE FILE DIMENSIONS HDPPXRF1.6
CLL HDPPXRF1.7
CLL AUTHOR M.J.CARTER HDPPXRF1.8
CLL HDPPXRF1.9
CLL TESTED UNDER CFT77 ON OS 5.1 HDPPXRF1.10
CLL HDPPXRF1.11
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: HDPPXRF1.12
CLL VERSION DATE HDPPXRF1.13
CLL 3.4 16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon ANF0F304.22
CLL 3.5 24/03/95 Changed OPEN to FILE_OPEN P.Burton GPB1F305.40
CLL 3.5 Aug. 95 Sub-Models Project: GSS1F400.455
CLL PPXREF_ITEMS,PPXREF_SECTIONS no longer read from GSS1F305.195
CLL ppxref file header, as they are now declared as GSS1F305.196
CLL parameters in comdeck PPXLOOK. GSS1F305.197
CLL Total no. of pre-SM records now read from header GSS1F305.198
CLL STASH control file opened and some user-stash file GSS1F400.456
CLL information read - needed for dynamic allocation. GSS1F400.457
CLL S.J.Swarbrick GSS1F305.199
CLL 4.4 Oct. 97 GDW1F404.1
CLL Added code to check the UM version against the GDW1F404.2
CLL version contained in the STASHmaster file. This GDW1F404.3
CLL feature was added at 4.4 and is contained in H3 GDW1F404.4
CLL of the heading section of the file. Additionally GDW1F404.5
CLL error handling was corrected so that ICODE is not GDW1F404.6
CLL set to zero each time the routine is called; if GDW1F404.7
CLL a positive (fatal) error code has previously been GDW1F404.8
CLL set, get out of the routine and let the calling GDW1F404.9
CLL routine deal with the error. GDW1F404.10
CLL Shaun de Witt GDW1F404.11
CLL 4.5 Apr 98 Minor write statement change. Rick Rawlins GRR0F405.1
CLL 4.5 17/08/98 Pick up Open Response correctly. GBCKF405.7
CLL Author: Bob Carruthers Cray Research. GBCKF405.8
CLL 4.5 30/10/97 Read stash data on PE 0 for the T3E GBCVF405.1
CLL and distribute it. GBCVF405.2
CLL Author: Bob Carruthers, Cray Research GBCVF405.3
CLL HDPPXRF1.14
CLL PROGRAMMING STANDARD UMDP 4 HDPPXRF1.15
CLL HDPPXRF1.16
CLL LOGICAL COMPONENT R911 HDPPXRF1.17
CLL HDPPXRF1.18
CLL PROJECT TASK: C4 HDPPXRF1.19
CLL HDPPXRF1.20
CLL EXTERNAL DOCUMENT C4 HDPPXRF1.21
CLL HDPPXRF1.22
CLLEND--------------------------------------------------------------- HDPPXRF1.23
SUBROUTINE HDPPXRF(NFT,StmsrNam,ppxRecs,ICODE,CMESSAGE) 53,3GSS2F401.1
IMPLICIT NONE HDPPXRF1.26
INTEGER NFT,NFTU !IN: UNIT NUMBER FOR FILE GSS2F401.2
CHARACTER*(80) CMESSAGE !OUT: ERROR RETURN MESSAGE GSS1F305.202
INTEGER ICODE !OUT: ERROR RETURN CODE HDPPXRF1.32
GSS1F305.203
*CALL CSUBMODL
GSS1F305.204
*CALL CPPXREF
HDPPXRF1.33
*CALL PPXLOOK
GSS1F305.206
*CALL CSTASH
GRB0F401.21
*CALL LENFIL
GSS1F400.460
HDPPXRF1.34
INTEGER LEN_IO HDPPXRF1.35
INTEGER IU ! Local - unit no. for stash control file GSS1F400.461
INTEGER I GSS1F400.462
INTEGER Int_Model_No GSS2F401.3
INTEGER FirstBlank GSS2F401.4
CHARACTER*13 StmsrNam GSS2F401.5
CHARACTER*80 STASH_MSTR GSS2F401.6
CHARACTER*1 CHAR1 GSS2F401.7
INTEGER IOStatus GSS2F401.8
GSS1F400.463
character*8 c_um_version !UM version as string GJC0F405.17
character*8 c_stm_version !STASHmaster version string GJC0F405.18
integer um_version, !Version of UM GJC0F405.19
& um_revision !Revision of UM GDW1F404.15
integer stm_version, !Version of STASHmaster file GJC0F405.20
& stm_revision !Revision of STASHmaster file GJC0F405.21
integer ocode !Copy of the input value of ICODE GDW1F404.18
logical found_version !Indicates presence of STM version GDW1F404.19
REAL STATUS HDPPXRF1.36
INTEGER RECORD(PPX_RECORDLEN) HDPPXRF1.37
*IF DEF,MPP,AND,DEF,T3E GBCVF405.4
integer shmem_n_pes, msg, info, nproc, shmem_my_pe, mype GBCVF405.5
common/shmem_hdppxrf/ IOStatus, found_version, stm_version GBCVF405.6
cdir$ cache_align /shmem_hdppxrf/ GBCVF405.7
*ENDIF GBCVF405.8
IOStatus=0 GSS2F401.9
c Check if an error has already been encountered, and get out GDW1F404.20
c if it has. GDW1F404.21
ocode = 0 GDW1F404.22
IF (icode .gt. 0) then GDW1F404.23
goto 9999 GDW1F404.24
ELSE IF (icode .lt. 0)then GDW1F404.25
ocode = icode GDW1F404.26
icode = 0 GDW1F404.27
END IF GDW1F404.28
GDW1F404.29
GSS1F305.214
*IF DEF,MPP,AND,DEF,T3E GBCVF405.9
mype=shmem_my_pe() GBCVF405.10
nproc=shmem_n_pes() GBCVF405.11
*ENDIF GBCVF405.12
IF (NFT.EQ.22) THEN GSS2F401.10
*IF DEF,MPP,AND,DEF,T3E GBCVF405.13
if(mype.eq.0) then GBCVF405.14
stash_mstr='empty ' GBCVF405.15
*ENDIF GBCVF405.16
!Open STASHmaster file for current internal model GSS2F401.11
! Get directory name for STASHmaster & append rest of filename GSS2F401.12
CALL GET_FILE
(NFT,STASH_MSTR,80,ICODE) GSS2F401.13
FirstBlank = 0 GSS2F401.14
DO I = 1,80 GSS2F401.15
IF (STASH_MSTR(I:I).EQ.' '.AND.FirstBlank.EQ.0) GSS2F401.16
& FirstBlank=I GSS2F401.17
END DO GSS2F401.18
STASH_MSTR(FirstBlank:FirstBlank)='/' GSS2F401.19
STASH_MSTR(FirstBlank+1:FirstBlank+13)=StmsrNam GSS2F401.20
OPEN(UNIT=NFT,FILE=STASH_MSTR,IOSTAT=IOStatus) GSS2F401.21
write(6,*) '!!!! STASH_MSTR ',STASH_MSTR GSS2F401.22
*IF DEF,MPP,AND,DEF,T3E GBCVF405.17
endif GBCVF405.18
c GBCVF405.19
msg=7001 GBCVF405.20
info=0 GBCVF405.21
call gc_ibcast(
msg, 1, 0, nproc, info, IOStatus) GBCVF405.22
*ENDIF GBCVF405.23
GSS1F305.216
IF (IOStatus.NE.0) THEN GSS2F401.23
CMESSAGE= GSS2F401.24
& 'Error opening STASHmaster file, routine HDPPXRF' GSS2F401.25
WRITE(6,*) GSS2F401.26
& 'HDPPXRF: Fortran Error Response = ',IOStatus, GBCKF405.9
& ' Opening STASHmaster file ',StmsrNam GBCKF405.10
ICODE=100 GSS2F401.29
GO TO 9999 GSS2F401.30
ENDIF GSS2F401.31
GDW1F404.30
c Get the UM version from the environment variable $VN. GDW1F404.31
CALL FORT_GET_ENV
('VN', 2, c_um_version, 8, icode) GDW1F404.32
IF (icode .ne. 0) then GDW1F404.33
c $VN was not set GDW1F404.34
write (6,*) GDW1F404.35
& 'HDPPXRF : WARNING : Environment variable VN not ', GRR0F405.2
& 'set or not obtainable; skipping version checking.' GRR0F405.3
cmessage = 'Environment variable VN not set, no version '// GRR0F405.4
& 'checking performed' GRR0F405.5
icode = -1 GDW1F404.41
goto 100 GDW1F404.42
ELSE GDW1F404.43
READ (c_um_version, '(i1,1x,i1)') um_version, um_revision GDW1F404.44
um_version = um_version*100 + um_revision GDW1F404.45
END IF GDW1F404.46
GDW1F404.47
c Now check through the header section of the STASHmaster GDW1F404.48
c file looking for H3 GDW1F404.49
found_version = .false. GDW1F404.50
*IF DEF,MPP,and,DEF,T3E GBCVF405.24
if (mype.eq.0) then GBCVF405.25
*ENDIF GBCVF405.26
READ (nft, '(A1)') char1 GDW1F404.51
DO WHILE (char1 .eq. 'H' .or. char1 .eq. '#') GDW1F404.52
IF (char1 .eq. 'H') THEN GDW1F404.53
BACKSPACE nft GDW1F404.54
READ (nft, '(1X, A1)') char1 GDW1F404.55
IF (char1 .eq. '3') THEN GDW1F404.56
c This line starts with H3 and should GDW1F404.57
c indicate the STASHmaster version. The line should look like GDW1F404.58
c H3| UM_VERSION=4.3 GDW1F404.59
found_version = .true. GDW1F404.60
BACKSPACE nft GDW1F404.61
READ (nft, '(15x,a8)') c_stm_version GDW1F404.62
READ (c_stm_version, '(i1,1x,i1)') GDW1F404.63
& stm_version, stm_revision GDW1F404.64
stm_version = stm_version*100 + stm_revision GDW1F404.65
c Now perform the check against the UM version GDW1F404.66
IF (stm_version .ne. um_version) then GDW1F404.67
*IF DEF,MPP,and,DEF,T3E GBCVF405.27
c--in MPP mode, defer setting the variables until all PE's can GBCVF405.28
icode=1 GBCVF405.29
go to 9997 GBCVF405.30
*ELSE GBCVF405.31
write (cmessage,*) GDW1F404.68
& 'HDPPXRF : UM version and STASHmaster version differ' GDW1F404.69
write (6,*) 'Version of STASHmaster file (' GDW1F404.70
& ,stm_version, GDW1F404.71
& ') does not match UM version (' GDW1F404.72
& ,um_version,') in file ',StmsrNam GDW1F404.73
icode = 1 GDW1F404.74
goto 9999 GDW1F404.75
*ENDIF GBCVF405.32
END IF ! version check GJC0F405.22
END IF ! char1 == '3' GJC0F405.23
END IF ! char1 == 'H' GDW1F404.78
READ (nft, '(a1)') char1 GDW1F404.79
END DO GDW1F404.80
GBCVF405.33
*IF DEF,MPP,and,DEF,T3E GBCVF405.34
endif ! if(mype .eq. 0) GBCVF405.35
c GBCVF405.36
c--in MPP Mode, get the Value of 'icode', 'stm_version', GBCVF405.37
c and 'found_version' GBCVF405.38
9997 continue GBCVF405.39
msg=7007 GBCVF405.40
iostatus=icode GBCVF405.41
call gc_ibcast (
msg,3,0,nproc,info,iostatus) GBCVF405.42
icode=iostatus GBCVF405.43
c--check if we generated a failure GBCVF405.44
if(icode.ne.0) then GBCVF405.45
write (cmessage,*) GBCVF405.46
& 'HDPPXRF: UM version and STASHmaster version differ' GBCVF405.47
write (6,*) 'Version of STASHmaster file (' GBCVF405.48
& ,stm_version,') does not match UM version (' GBCVF405.49
& ,um_version,') in file ',StmsrNam GBCVF405.50
go to 9999 GBCVF405.51
endif GBCVF405.52
*ENDIF GBCVF405.53
GDW1F404.81
IF (.not. found_version) THEN GDW1F404.82
write (6,*) GDW1F404.83
& 'HDPPXRF : No STASHmaster version available; Unable to' GDW1F404.84
write (6,*) GDW1F404.85
& 'check against UM version for file ',StmsrNam GDW1F404.86
cmessage = 'HDPPXRF : No STASHmaster version available' GDW1F404.87
icode = -1 GDW1F404.88
END IF GDW1F404.89
*IF DEF,MPP,AND,DEF,T3E GBCVF405.54
if(mype.eq.0) then GBCVF405.55
*ENDIF GBCVF405.56
c For safety, rewind to the start of the STASH file. GDW1F404.90
rewind (nft) GDW1F404.91
*IF DEF,MPP,AND,DEF,T3E GBCVF405.57
endif ! if(mype .eq. 0) GBCVF405.58
*ENDIF GBCVF405.59
GSS2F401.32
100 continue GBCVF405.60
*IF DEF,MPP,AND,DEF,T3E GBCVF405.61
if(mype.eq.0) then GBCVF405.62
*ENDIF GBCVF405.63
!Count records - ppxRecs is counter GSS2F401.33
READ(NFT,'(A1)') CHAR1 GBCVF405.64
IF (CHAR1.EQ.'1') THEN GSS2F401.35
BACKSPACE NFT GSS2F401.36
READ(NFT,'(2X,I5)') Int_Model_No GSS2F401.37
IF (Int_Model_No.EQ.-1) THEN GSS2F401.38
!End of file reached GSS2F401.39
!ppxRecs initialised to 1 before HDPPXRF - so subtract 1 now GSS2F401.40
IF (StmsrNam(13:).EQ.'A') THEN GSS2F401.41
IF (INTERNAL_MODEL_INDEX(A_IM).EQ.1) THEN GSS2F401.42
ppxRecs=ppxRecs-1 GSS2F401.43
END IF GSS2F401.44
END IF GSS2F401.45
IF (StmsrNam(13:).EQ.'O') THEN GSS2F401.46
IF (INTERNAL_MODEL_INDEX(O_IM).EQ.1) THEN GSS2F401.47
ppxRecs=ppxRecs-1 GSS2F401.48
END IF GSS2F401.49
END IF GSS2F401.50
IF (StmsrNam(13:).EQ.'S') THEN GSS2F401.51
IF (INTERNAL_MODEL_INDEX(S_IM).EQ.1) THEN GSS2F401.52
ppxRecs=ppxRecs-1 GSS2F401.53
END IF GSS2F401.54
END IF GSS2F401.55
IF (StmsrNam(13:).EQ.'W') THEN GSS2F401.56
IF (INTERNAL_MODEL_INDEX(W_IM).EQ.1) THEN GSS2F401.57
ppxRecs=ppxRecs-1 GSS2F401.58
END IF GSS2F401.59
END IF GSS2F401.60
CLOSE(UNIT=NFT) GSS2F401.61
*IF DEF,MPP,AND,DEF,T3E GBCVF405.65
GO TO 9998 GBCVF405.66
*ELSE GBCVF405.67
GO TO 9999 GSS2F401.62
*ENDIF GBCVF405.68
END IF GSS2F401.63
ppxRecs = ppxRecs + 1 GSS2F401.64
GO TO 100 GSS2F401.65
ELSE GSS2F401.66
GO TO 100 GSS2F401.67
END IF GSS2F401.68
*IF DEF,MPP,AND,DEF,T3E GBCVF405.69
endif GBCVF405.70
GBCVF405.71
9998 continue GBCVF405.72
iostatus=ppxrecs GBCVF405.73
msg=7002 GBCVF405.74
call gc_ibcast(
msg, 1, 0, nproc, info, iostatus) GBCVF405.75
ppxrecs=iostatus GBCVF405.76
goto 9999 GBCVF405.77
GBCVF405.78
*ENDIF GBCVF405.79
ELSE GSS2F401.69
GSS1F400.464
! Open stash control file and read USTSNUM namelist: number of user GSS1F400.465
! stash files and total no. of user stash records GSS1F400.466
*IF DEF,RECON GSS1F400.467
! Read USTNUM namelist from unit 5 GSS1F400.468
IU = 5 GSS2F401.70
*ELSE GSS1F400.470
! Read USTNUM namelist from unit 4 GSS1F400.471
IU = 4 ! Unit number GSS2F401.71
*IF DEF,MPP,AND,DEF,T3E GBCVF405.80
if(mype.eq.0) then GBCVF405.81
file='empty ' GBCVF405.82
*ENDIF GBCVF405.83
CALL GET_FILE
(IU,FILE,80,icode) ! Get name for stash file GSS2F401.72
OPEN(IU,FILE=FILE,IOSTAT=icode) ! Open stash file GSS2F401.73
*IF DEF,MPP,AND,DEF,T3E GBCVF405.84
endif GBCVF405.85
c GBCVF405.86
msg=7003 GBCVF405.87
info=0 GBCVF405.88
iostatus=icode GBCVF405.89
call gc_ibcast(
msg, 1, 0, nproc, info, iostatus) GBCVF405.90
icode=iostatus GBCVF405.91
c GBCVF405.92
*ENDIF GBCVF405.93
IF(icode.GT.0)THEN ! Error check GSS2F401.74
WRITE(6,*)'HDPPXRF : Failed in OPEN of Stash Control File' GIE0F403.257
GOTO 9999 GSS2F401.76
ELSEIF(icode.LT.0)THEN GSS2F401.77
WRITE(6,*)'HDPPXRF : GIE0F403.258
& Warning message on OPEN of Stash Control File' GSS1F400.480
WRITE(6,*)'IOSTAT= ',icode GIE0F403.259
ENDIF GSS2F401.80
*ENDIF GSS1F400.483
!Initialisation GSS2F401.81
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP GSS2F401.82
DO I = 1,20 GSS2F401.83
NRECS_USTASH(I)=0 GSS2F401.84
END DO GSS2F401.85
*ELSEIF DEF,FLDOP GSS2F401.86
DO I = 1,20 GSS2F401.87
NRECS_USTASH(I)=0 GSS2F401.88
END DO GSS2F401.89
*ELSE GSS2F401.90
N_USTASH = 0 GSS2F401.91
NRECS_USTASH = 0 PXPPXRF.1
*ENDIF GSS2F401.92
DO I = 1,20 GSS2F401.94
USTSFILS(I)=' ' GSS2F401.95
END DO GSS2F401.96
! Read namelist GSS1F400.490
*IF DEF,MPP,AND,DEF,T3E GBCVF405.94
if(mype.eq.0) then GBCVF405.95
*ENDIF GBCVF405.96
READ(IU,USTSNUM) GSS2F401.97
*IF DEF,MPP,AND,DEF,T3E GBCVF405.97
endif GBCVF405.98
c GBCVF405.99
msg=7004 GBCVF405.100
call gc_ibcast(
msg, 1, 0, nproc, info, N_USTASH) GBCVF405.101
msg=7005 GBCVF405.102
call gc_ibcast(
msg, 1, 0, nproc, info, NRECS_USTASH) GBCVF405.103
msg=7006 GBCVF405.104
call gc_cbcast(
msg, 160, 0, nproc, info, USTSFILS) GBCVF405.105
*IF DEF,DIAG190 GBCVF405.106
if(my_pe().le.1) write(190+my_pe(), USTSNUM) GBCVF405.107
*ENDIF GBCVF405.108
*ENDIF GBCVF405.109
! Add no. of user stash records to ppxRecs GSS1F400.492
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP GSS2F401.98
DO I=1,N_USTASH GSS2F401.99
ppxRecs = ppxRecs + NRECS_USTASH(I) GSS2F401.100
END DO GSS2F401.101
*ELSEIF DEF,FLDOP GSS2F401.102
DO I=1,N_USTASH GSS2F401.103
ppxRecs = ppxRecs + NRECS_USTASH(I) GSS2F401.104
END DO GSS2F401.105
*ELSE GSS2F401.106
ppxRecs = ppxRecs + NRECS_USTASH GSS2F401.107
*ENDIF GSS2F401.108
END IF GSS2F401.109
GSS1F305.218
9999 CONTINUE GSS1F305.219
c If we have found an error, leave it in icode. If no error GDW1F404.92
c occurred then check if the original input value of icode was] GDW1F404.93
c non-zero (a previous untrapped error/warning), and copy this GDW1F404.94
c back into ICODE before eaving the routine. GDW1F404.95
IF (icode .eq. 0 .and. ocode .ne. 0) then GDW1F404.96
icode = ocode GDW1F404.97
END IF GDW1F404.98
RETURN GSS1F305.220
END HDPPXRF1.96
HDPPXRF1.97
*ENDIF HDPPXRF1.98