C $Header: /u/gcmpack/MITgcm/pkg/atm_ocn_coupler/coupler.F,v 1.7 2016/01/06 00:32:11 jmc Exp $ C $Name: $ CBOP 0 C !ROUTINE: COUPLER C !INTERFACE: PROGRAM COUPLER C !DESCRIPTION: C *==========================================================* C | PROGRAM COUPLER C | o Main routine for 'Coupler' component. 'Coupler' C | component coordiantes the exchange of data between C | component models in a coupled model experiment. C *==========================================================* C | This version uses the MIT Coupler "checkpoint1" library C | calls. C *==========================================================* C !USES: IMPLICIT NONE C == Global variables == #include "mpif.h" #include "CPL_PARAMS.h" C !LOCAL VARIABLES: C I :: Loop counter C rc :: MPI return code C msgUnit :: log-file I/O unit INTEGER I INTEGER rc INTEGER msgUnit CEOP C Initialise the coupler component CALL INITIALISE( O msgUnit ) C Perform registration with other components CALL ACCEPT_COMPONENT_REGISTRATIONS C Send Coupler-params to both components CALL CPL_SEND_ATM_CPLPARMS( msgUnit ) CALL CPL_SEND_OCN_CPLPARMS( msgUnit ) C Coordinate the transfer configuration information between components CALL EXCH_COMPONENT_CONFIGS( msgUnit ) DO I=1,nCouplingSteps IF ( cpl_sequential.EQ.1 ) THEN C- Sequential coupling C Receive ATM updated state CALL CPL_RECV_ATM_FIELDS( msgUnit, I ) C Send out ATM fields to OCN CALL CPL_SEND_OCN_FIELDS( msgUnit, I ) C Receive OCN updated state CALL CPL_RECV_OCN_FIELDS( msgUnit, I ) C Send out OCN fields to ATM CALL CPL_SEND_ATM_FIELDS( msgUnit, I ) ELSE C- Synchronous coupling C Receive updated state CALL CPL_RECV_OCN_FIELDS( msgUnit, I ) CALL CPL_RECV_ATM_FIELDS( msgUnit, I ) C Send out fields CALL CPL_SEND_ATM_FIELDS( msgUnit, I ) CALL CPL_SEND_OCN_FIELDS( msgUnit, I ) ENDIF ENDDO C o Finalize MPI C First wait for everybody to finish. Nobody should call C MPI_Finalize before all the component modules are C ready to finish. On some systems once one participant C gets to MPI_Finalize then its unclear what will C happen after that. If everybody does on MPI_Barrier C on COMM_WORLD then we will be OK. CALL MPI_BARRIER( MPI_COMM_WORLD, rc ) CALL MPI_FINALIZE(rc) STOP END