SUBROUTINE check_for_restart !------------------------------------------------------------------------------! ! Actual revisions: ! ----------------- ! ! ! Former revisions: ! ----------------- ! $Id: check_for_restart.f90 110 2007-10-05 05:13:14Z gronemeier $ ! ! 108 2007-08-24 15:10:38Z letzel ! modifications to terminate coupled runs ! ! RCS Log replace by Id keyword, revision history cleaned up ! ! Revision 1.11 2007/02/11 12:55:13 raasch ! Informative output to the job protocol ! ! Revision 1.1 1998/03/18 20:06:51 raasch ! Initial revision ! ! ! Description: ! ------------ ! Set stop flag, if restart is neccessary because of expiring cpu-time or ! if it is forced by user !------------------------------------------------------------------------------! USE pegrid USE control_parameters IMPLICIT NONE LOGICAL :: terminate_run_l REAL :: remaining_time ! !-- Check remaining CPU-time CALL local_tremain( remaining_time ) ! !-- If necessary set a flag to stop the model run terminate_run_l = .FALSE. IF ( remaining_time <= termination_time_needed .AND. & write_binary(1:4) == 'true' ) THEN terminate_run_l = .TRUE. ENDIF #if defined( __parallel ) ! !-- Make a logical OR for all processes. Stop the model run if at least !-- one processor has reached the time limit. CALL MPI_ALLREDUCE( terminate_run_l, terminate_run, 1, MPI_LOGICAL, & MPI_LOR, comm2d, ierr ) #else terminate_run = terminate_run_l #endif ! !-- Output that job will be terminated IF ( terminate_run .AND. myid == 0 ) THEN PRINT*, '*** WARNING: run will be terminated because it is running out', & ' of job cpu limit' PRINT*, ' remaining time: ', remaining_time, ' s' PRINT*, ' termination time needed:', termination_time_needed,& ' s' ENDIF ! !-- In case of coupled runs inform the remote model of the termination !-- and its reason, provided the remote model has not already been !-- informed of another termination reason (terminate_coupled > 0) before, !-- or vice versa (terminate_coupled_remote > 0). IF ( terminate_run .AND. TRIM( coupling_mode ) /= 'uncoupled' .AND. & terminate_coupled == 0 .AND. terminate_coupled_remote == 0 ) THEN terminate_coupled = 3 CALL MPI_SENDRECV( terminate_coupled, 1, MPI_INTEGER, myid, 0, & terminate_coupled_remote, 1, MPI_INTEGER, myid, 0, & comm_inter, status, ierr ) ENDIF ! !-- Set the stop flag also, if restart is forced by user IF ( time_restart /= 9999999.9 .AND. time_restart < simulated_time ) & THEN ! !-- Restart is not neccessary, if the end time of the run (given by !-- the user) has been reached IF ( simulated_time < end_time ) THEN terminate_run = .TRUE. ! !-- Increment restart time, if forced by user, otherwise set restart !-- time to default (no user restart) IF ( dt_restart /= 9999999.9 ) THEN time_restart = time_restart + dt_restart ELSE time_restart = 9999999.9 ENDIF IF ( myid == 0 ) THEN PRINT*, '*** INFORMATIVE: run will be terminated due to user ', & 'settings of' PRINT*, ' restart_time / dt_restart' PRINT*, ' new restart time is: ', time_restart, ' s' ENDIF ! !-- In case of coupled runs inform the remote model of the termination !-- and its reason, provided the remote model has not already been !-- informed of another termination reason (terminate_coupled > 0) before, !-- or vice versa (terminate_coupled_remote > 0). IF ( coupling_mode /= 'uncoupled' .AND. terminate_coupled == 0 .AND. & terminate_coupled_remote == 0) THEN IF ( dt_restart /= 9999999.9 ) THEN terminate_coupled = 4 ELSE terminate_coupled = 5 ENDIF CALL MPI_SENDRECV( & terminate_coupled, 1, MPI_INTEGER, myid, 0, & terminate_coupled_remote, 1, MPI_INTEGER, myid, 0, & comm_inter, status, ierr ) ENDIF ELSE time_restart = 9999999.9 ENDIF ENDIF ! !-- If the run is stopped, set a flag file which is necessary to initiate !-- the start of a continuation run IF ( terminate_run .AND. myid == 0 ) THEN OPEN ( 90, FILE='CONTINUE_RUN', FORM='FORMATTED' ) WRITE ( 90, '(A)' ) TRIM( run_description_header ) CLOSE ( 90 ) ENDIF END SUBROUTINE check_for_restart