C $Header: /u/gcmpack/MITgcm/eesupp/src/open_copy_data_file.F,v 1.11 2017/08/10 15:31:02 mlosch Exp $
C $Name: $
#include "CPP_EEOPTIONS.h"
CBOP
C !ROUTINE: OPEN_COPY_DATA_FILE
C !INTERFACE:
SUBROUTINE OPEN_COPY_DATA_FILE(
I data_file, caller_sub,
O iUnit,
I myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | SUBROUTINE OPEN_COPY_DATA_FILE
C | o Routine to open and copy a data.* file to STDOUT
C | and return the open unit in iUnit
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#ifdef SINGLE_DISK_IO
# include "EESUPPORT.h"
#endif
C !INPUT/OUTPUT PARAMETERS:
C === Routine arguments ===
C data_file :: parameter file to open and copy
C caller_sub :: name of subroutine which is calling this S/R
C iUnit :: IO unit of parameter-file copy (already opened)
C myThid :: my Thread Id number
CHARACTER*(*) data_file
CHARACTER*(*) caller_sub
INTEGER iUnit
INTEGER myThid
C !FUNCTIONS:
INTEGER ILNBLNK
EXTERNAL
C !LOCAL VARIABLES:
C === Local variables ===
C msgBuf :: Informational/error message buffer
CHARACTER*(MAX_LEN_MBUF) msgBuf
CHARACTER*(MAX_LEN_PREC) record
#if !defined(USE_FORTRAN_SCRATCH_FILES) || defined(SINGLE_DISK_IO)
CHARACTER*(MAX_LEN_FNAM) scratchFile1
CHARACTER*(MAX_LEN_FNAM) scratchFile2
#endif
INTEGER errIO,IL
LOGICAL exst
#ifdef SINGLE_DISK_IO
C mpiRC :: Error code reporting variable used with MPI.
INTEGER mpiRC
#endif
CEOP
_BEGIN_MASTER(myThid)
C-- Open the parameter file
INQUIRE( FILE=data_file, EXIST=exst )
IF (exst) THEN
WRITE(msgBuf,'(A,A)')
& ' OPEN_COPY_DATA_FILE: opening file ',data_file
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
ELSE
WRITE(msgBuf,'(A,A,A)')
& 'File ',data_file,' does not exist!'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,A)') 'S/R CALLED BY ',caller_sub
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R OPEN_COPY_DATA_FILE'
ENDIF
C Make scratch copies of eedata with and without comments
#ifdef SINGLE_DISK_IO
WRITE(scratchFile1,'(A,A)') 'scratch1_', data_file
WRITE(scratchFile2,'(A,A)') 'scratch2_', data_file
IF ( myProcId .EQ. 0 ) THEN
OPEN(UNIT=scrUnit1, FILE=scratchFile1, STATUS='UNKNOWN')
OPEN(UNIT=scrUnit2, FILE=scratchFile2, STATUS='UNKNOWN')
ENDIF
#else /* ifndef SINGLE_DISK_IO */
#ifdef USE_FORTRAN_SCRATCH_FILES
C this is the old default, which can cause filename conflicts on some
C multi-node/multi-processor systems
OPEN(UNIT=scrUnit1,STATUS='SCRATCH')
OPEN(UNIT=scrUnit2,STATUS='SCRATCH')
#else
C After opening regular files here, they are closed with STATUS='DELETE'
WRITE(scratchFile1,'(A,'//FMT_PROC_ID//')') 'scratch1.', myProcId
WRITE(scratchFile2,'(A,'//FMT_PROC_ID//')') 'scratch2.', myProcId
OPEN(UNIT=scrUnit1, FILE=scratchFile1, STATUS='UNKNOWN')
OPEN(UNIT=scrUnit2, FILE=scratchFile2, STATUS='UNKNOWN')
#endif /* USE_FORTRAN_SCRATCH_FILES */
#endif /* SINGLE_DISK_IO */
#ifdef SINGLE_DISK_IO
IF ( myProcId .EQ. 0 ) THEN
#endif
OPEN(UNIT=modelDataUnit,FILE=data_file,STATUS='OLD',
& IOSTAT=errIO)
IF ( errIO .LT. 0 ) THEN
WRITE(msgBuf,'(A,A)')
& 'Unable to open parameter file: ',data_file
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,A)') 'S/R CALLED BY ',caller_sub
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R OPEN_COPY_DATA_FILE'
ENDIF
DO WHILE ( .TRUE. )
READ(modelDataUnit,FMT='(A)',END=1001) RECORD
IL = MAX(ILNBLNK(RECORD),1)
IF ( RECORD(1:1) .NE. commentCharacter ) THEN
c CALL NML_SET_TERMINATOR( RECORD )
CALL NML_CHANGE_SYNTAX( RECORD, data_file, myThid )
WRITE(UNIT=scrUnit1,FMT='(A)') RECORD(:IL)
ENDIF
WRITE(UNIT=scrUnit2,FMT='(A)') RECORD(:IL)
ENDDO
1001 CONTINUE
CLOSE(modelDataUnit)
C-- Report contents of model parameter file
WRITE(msgBuf,'(A)')
&'// ======================================================='
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(A,A,A)') '// Parameter file "',data_file,'"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(A)')
&'// ======================================================='
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
iUnit = scrUnit2
REWIND(iUnit)
DO WHILE ( .TRUE. )
READ(UNIT=iUnit,FMT='(A)',END=2001) RECORD
IL = MAX(ILNBLNK(RECORD),1)
WRITE(msgBuf,'(A,A)') '>',RECORD(:IL)
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
ENDDO
2001 CONTINUE
CLOSE(iUnit,STATUS='DELETE')
WRITE(msgBuf,'(A)') ' '
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
#ifdef SINGLE_DISK_IO
CALL FLUSH(scrUnit1)
CLOSE(scrUnit1)
ENDIF
# ifdef ALLOW_USE_MPI
C-- all processes must wait for process 0 to complete
C writing scratchFile1 before opening it
IF ( usingMPI ) THEN
CALL MPI_BARRIER( MPI_COMM_MODEL, mpiRC )
ENDIF
# endif
#ifdef HAVE_SYSTEM
CALL SYSTEM('sleep 1')
#endif
OPEN(UNIT=scrUnit1, FILE=scratchFile1, STATUS='OLD')
#endif /* SINGLE_DISK_IO */
C-- Return open unit to caller
iUnit = scrUnit1
REWIND(iUnit)
_END_MASTER(myThid)
RETURN
END