C $Header: /u/gcmpack/MITgcm/model/src/ini_model_io.F,v 1.51 2017/04/04 23:21:46 jmc Exp $
C $Name: $
#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"
CBOP
C !ROUTINE: INI_MODEL_IO
C !INTERFACE:
SUBROUTINE INI_MODEL_IO( myThid )
C !DESCRIPTION:
C Initialisation and setting of I/O:
C - Check size and initialise global I/O buffer
C - Initialise flags for pickup and for mdsio/rw.
C - Do MNC model-IO initialisation
C - Do Monitor-IO initialisation
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
#include "PARAMS.h"
#include "RESTART.h"
#ifdef ALLOW_EXCH2
# include "W2_EXCH2_SIZE.h"
# include "W2_EXCH2_TOPOLOGY.h"
# include "W2_EXCH2_PARAMS.h"
#endif /* ALLOW_EXCH2 */
#include "EEBUFF_SCPU.h"
C !INPUT/OUTPUT PARAMETERS:
C myThid :: my Thread Id number
INTEGER myThid
C !FUNCTIONS
INTEGER ILNBLNK
EXTERNAL
C !LOCAL VARIABLES:
C msgBuf :: Informational/error message buffer
CHARACTER*(MAX_LEN_MBUF) msgBuf
CHARACTER*(MAX_LEN_FNAM) namBuf
INTEGER i, iL, pIL
LOGICAL useGlobalBuff
#ifdef ALLOW_EXCH2
INTEGER xySize
#endif /* ALLOW_EXCH2 */
CEOP
C- Safety check:
IF ( nPx*nPy.NE.1 .AND. globalFiles
& .AND. .NOT.useSingleCpuIO ) THEN
_BEGIN_MASTER( myThid )
c WRITE(msgBuf,'(2A)')
c & 'INI_MODEL_IO: globalFiles=TRUE is not safe',
c & ' in Multi-processors (MPI) run'
c CALL PRINT_ERROR( msgBuf , myThid)
c WRITE(msgBuf,'(2A)')
c & 'INI_MODEL_IO: use instead "useSingleCpuIO=.TRUE."'
c CALL PRINT_ERROR( msgBuf , myThid)
c STOP 'ABNORMAL END: S/R INI_MODEL_IO'
C------
C GlobalFiles option with Multi-processors execution (with MPI) is not
C safe: dependending on the platform & compiler, it may produce:
C - incomplete output files (wrong size)
C - wrong isolated values in some output files
C - missing tiles (all zeros) in some output files.
C A safe alternative is to set "useSingleCpuIO=.TRUE." in file "data",
C namelist PARAM01 (and to keep the default value of globalFiles=FALSE)
C or if you are really sure that the globalFile works well on our platform
C & compiler, comment out the above "stop"
C-----
WRITE(msgBuf,'(2A)')
& '** WARNING ** INI_MODEL_IO: globalFiles=TRUE is not safe',
& ' in Multi-processors (MPI) run'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(2A)') '** WARNING ** INI_MODEL_IO:',
& ' use instead "useSingleCpuIO=.TRUE."'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
_END_MASTER( myThid )
ENDIF
C- Check size of IO buffers:
useGlobalBuff = useSingleCpuIO
#ifdef CG2D_SINGLECPU_SUM
useGlobalBuff = .TRUE.
#endif /* CG2D_SINGLECPU_SUM */
#ifdef ALLOW_EXCH2
IF ( useGlobalBuff ) THEN
xySize = exch2_global_Nx*exch2_global_Ny
#ifndef CG2D_SINGLECPU_SUM
IF ( .NOT.W2_useE2ioLayOut ) xySize = Nx*Ny
#endif /* ndef CG2D_SINGLECPU_SUM */
IF ( xySize.GT.W2_ioBufferSize ) THEN
WRITE(msgBuf,'(A,2(I10,A))')
& 'W2_ioBufferSize=', W2_ioBufferSize,
& ' <', xySize, ' = Size of Global 2-D map'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A)')
& 'INI_MODEL_IO: increase W2_ioBufferSize',
& ' in "W2_EXCH2_SIZE.h" + recompile'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R INI_MODEL_IO (buffer size)'
ENDIF
ENDIF
#endif /* ALLOW_EXCH2 */
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C- Only Master-thread updates IO-parameter in Common blocks:
_BEGIN_MASTER( myThid )
C- Initialise AB starting level
C notes: those could be modified when reading a pickup that does
C not correspond to what is actually needed.
tempStartAB = nIter0
saltStartAB = nIter0
mom_StartAB = nIter0
nHydStartAB = nIter0
IF ( startFromPickupAB2 ) tempStartAB = MIN( nIter0 , 1 )
saltStartAB = tempStartAB
mom_StartAB = tempStartAB
nHydStartAB = tempStartAB
dPhiNHstatus= 0
C- Initialise Alternating pickup-suffix
nCheckLev = 1
checkPtSuff(1) = 'ckptA'
checkPtSuff(2) = 'ckptB'
C- Flags specific to RW and MDSIO (and PLOT_FIELDS)
C- now we make local directories with myProcessStr appended.
IF ( mdsioLocalDir .NE. ' ' ) THEN
iL = ILNBLNK( mdsioLocalDir )
C Local dir name should not be too long to fit MAX_LEN_FNAM
C after adding file-name: set a limit to half MAX_LEN_FNAM
IF ( 2*IL.GT.MAX_LEN_FNAM ) THEN
WRITE(msgBuf,'(2A,I4,A)') 'INI_MODEL_IO: ',
& 'Too long (IL=',IL,') mdsioLocalDir:'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(errorMessageUnit,'(3A)')
& 'localDir: >',mdsioLocalDir(1:IL),'<'
STOP 'ABNORMAL END: S/R INI_MODEL_IO (mdsioLocalDir)'
ENDIF
WRITE(namBuf,'(4A)')
& ' mkdir -p ', mdsioLocalDir(1:iL),myProcessStr(1:4),' '
pIL = 1 + ILNBLNK( namBuf )
#ifdef HAVE_SYSTEM
WRITE(standardMessageUnit,'(3A)')
& '==> SYSTEM CALL (from INI_MODEL_IO): >',namBuf(1:pIL),'<'
CALL SYSTEM( namBuf(1:pIL) )
#else
WRITE(msgBuf,'(3A)') '** WARNING ** INI_MODEL_IO: ',
& 'SYSTEM call missing (HAVE_SYSTEM undef) for mdsioLocalDir'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(errorMessageUnit,'(4A)') '** WARNING ** INI_MODEL_IO: ',
& 'Skip command: >',namBuf(1:pIL),'<'
#endif
WRITE(msgBuf,'(A)') ' '
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
namBuf(1:iL) = mdsioLocalDir(1:iL)
WRITE(mdsioLocalDir,'(3A)') namBuf(1:iL),myProcessStr(1:4),'/'
ENDIF
C- Initialise MFLDS variables in common block
CALL READ_MFLDS_INIT( myThid )
C Set globalFiles flag for READ_WRITE_FLD package
CALL SET_WRITE_GLOBAL_FLD( globalFiles )
C Set globalFiles flag for READ_WRITE_REC package
CALL SET_WRITE_GLOBAL_REC( globalFiles )
C Set globalFiles flag for READ_WRITE_SEC package
IF ( useOBCS .AND. globalFiles ) THEN
WRITE(msgBuf,'(2A)') '** WARNING ** INI_MODEL_IO:',
& ' use tiled-files to write sections (for OBCS)'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
CALL SET_WRITE_GLOBAL_SEC( .FALSE. )
ELSE
CALL SET_WRITE_GLOBAL_SEC( globalFiles )
ENDIF
_END_MASTER( myThid )
C- Everyone else must wait for the IO-parameters to be set
_BARRIER
C- Global IO-buffers initialisation
IF ( useGlobalBuff ) THEN
_BEGIN_MASTER( myThid )
DO i=1,xyBuffer_size
xy_buffer_r8(i) = 0. _d 0
xy_buffer_r4(i) = 0.
ENDDO
_END_MASTER( myThid )
ENDIF
C- MNC model-io initialisation
#ifdef ALLOW_MNC
IF (useMNC) THEN
C- Initialize look-up tables for MNC
CALL MNC_INIT( myThid )
CALL MNC_CW_INIT( sNx,sNy,OLx,OLy,nSx,nSy,nPx,nPy,
& Nr,myThid )
CEH3 IF ( mnc_echo_gvtypes ) THEN
CEH3 CALL MNC_CW_DUMP( myThid )
CEH3 ENDIF
C Write units/set precision/etc for I/O of variables/arrays
C belonging to the core dynamical model
CALL INI_MNC_VARS( myThid )
ENDIF
#endif /* ALLOW_MNC */
#ifdef ALLOW_AUTODIFF
IF ( useAUTODIFF ) CALL AUTODIFF_INI_MODEL_IO( myThid )
#endif
#ifdef ALLOW_PROFILES
IF ( usePROFILES ) CALL PROFILES_INI_IO( myThid )
#endif
#ifdef ALLOW_DIAGNOSTICS
IF ( useDiagnostics ) CALL DIAGNOSTICS_INI_IO( myThid )
#endif
#ifdef ALLOW_MONITOR
C-- Initialise MONITOR I/O streams so we can report config. info
CALL MON_INIT( myThid )
#endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
RETURN
END