C $Header: /u/gcmpack/MITgcm/eesupp/src/eeboot.F,v 1.27 2017/09/26 15:52:52 dimitri Exp $ C $Name: $ #include "CPP_EEOPTIONS.h" #include "PACKAGES_CONFIG.h" CBOP C !ROUTINE: EEBOOT C !INTERFACE: SUBROUTINE EEBOOT( myComm ) C !DESCRIPTION: C *==========================================================* C | SUBROUTINE EEBOOT C | o Set up execution "environment", particularly perform C | steps to initialise parallel processing. C *==========================================================* C | Note: This routine can also be compiled with CPP C | directives set so that no multi-processing is initialised C | This is OK and works fine. C *==========================================================* C !CALLING SEQUENCE: C eeboot() C | C |-- eeboot_minimal() :: Minimal startup. Just enough to C | allow basic I/O. C | C |-- eeintro_msg() :: Write startup greeting. C | C |-- eeset_parms() :: Set WRAPPER parameters C | C |-- eewrite_eeenv() :: Print WRAPPER parameter settings C | C |-- ini_procs() :: Associate processes with grid regions. C | C |-- ini_threading_environment() :: Associate threads with grid regions. C | C |-- cpl_register() :: Pass attributes to the coupler C | C |-- w2_eeboot() :: Initialise WRAPPER2 execution environment C !USES: IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "EESUPPORT.h" C !ROUTINE ARGUMENTS C == Routine arguments == C myComm :: Communicator that is passed down from C upper level driver (if there is one). INTEGER myComm C !LOCAL VARIABLES: C == Local variables == C I :: Loop counter INTEGER I LOGICAL doReport CEOP C-- Set error reporting flags and I/O streams C fatalError is a flag used to indicate that the program C ended abnormally. C errorMessageUnit is the Fortran unit number used for C writing error messages. C standardMessageUnit is the Fortran unit number used for C writing textual, informational output. C eeBootError is a flag used to indicate an error in the C "execution environment" startup pahse as opposed C to the simulation pahse of the execution. C eeEndError is used to indicate an "execution environment" shutdown C error. C thError flag used to allow a thread to report an error. C This is only really used during the startup process, C although it could be used elsewhere. C allMyEdgesAreSharedMemory flag which says for a particular C set of blocks the only form of communication C it does is using shared memory. C threadIsRunning used during startup to enable check that all C the threads are running. fatalError = .FALSE. eeBootError = .FALSE. eeEndError = .FALSE. DO I=1, MAX_NO_THREADS thError(I) = .FALSE. allMyEdgesAreSharedMemory(I) = .TRUE. threadIsRunning(I) = .FALSE. threadIsComplete(I) = .FALSE. ioErrorCount(I) = 0 ENDDO standardMessageUnit = 6 #ifdef HACK_FOR_GMAO_CPL scrUnit1 = 31 scrUnit2 = 32 eeDataUnit = 33 modelDataUnit = 34 errorMessageUnit = 35 standardMessageUnit = 36 #else scrUnit1 = 11 scrUnit2 = 12 eeDataUnit = 13 modelDataUnit = 14 errorMessageUnit = 15 cph errorMessageUnit = 0 is not allowed on some platforms, e.g. SP3 #endif C-- Start minimal environment so that we can do I/O to report errors. C Notes C ===== C o Here we start MPI and setup the I/O environment C that is needed for error reporting. C o Under MPI I/O support is very variable until C MPI is started. This makes is hard to trap the case C where mpirun is used to start a non-MPI run or C we try to start MPI when mpirun was not used. C after it is started. C jmc: test: C If necessary ( COMPONENT_MODULE defined ) add a 1rst preliminary C call to eeset_params (in EEBOOT_MINIMAL) to set useCoupler (needed C very early, and the stardard call eeset_params below comes too late) C jmc: This needs to be sorted-out in a cleaner way. CALL EEBOOT_MINIMAL( myComm ) IF ( eeBootError ) GOTO 999 C-- Now we can write a startup message CALL EEINTRO_MSG C-- Initialise parameters associated with execution environment. doReport = .TRUE. CALL EESET_PARMS ( myProcId, doReport ) IF ( eeBootError ) GOTO 999 C-- Write summary of execution environment configuration for this run CALL EEWRITE_EEENV C-- Now do the rest of the multi-process startup. C o Here we map processes to the model grid. C o Print tables of process-grid mappings. C o Do other miscellaneous multi-processing set up steps. For C example under MPI we create datatypes for communication C of array edges. CALL INI_PROCS IF ( eeBootError ) GOTO 999 C-- Initialise variables to support "nThreads" of computation. C o Note the program is still running with a single thread of C execution at this stage. CALL INI_THREADING_ENVIRONMENT IF ( eeBootError ) GOTO 999 #ifdef ALLOW_EXCH2 C-- Initialise WRAPPER2 execution environment CALL W2_EEBOOT #endif /* ALLOW_EXCH2 */ C-- Pass attributes to the coupler #ifdef COMPONENT_MODULE IF ( useCoupler ) CALL CPL_REGISTER #endif 999 CONTINUE RETURN END