SUBROUTINE tesend ! Test for run completion USE basic use prec_const IMPLICIT NONE LOGICAL :: mlend, mlexist REAL :: tnow INTEGER :: ncheck_stop = 100 CHARACTER(len=*), PARAMETER :: stop_file = 'mystop' !________________________________________________________________________________ ! 1. Some processors had set nlend CALL mpi_allreduce(nlend, mlend, 1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr) IF( mlend ) THEN nlend = .TRUE. crashed = .TRUE. IF (my_id .EQ. 0) WRITE(*,'(/a)') 'rhs are NaN/Inf' IF (my_id .EQ. 0) WRITE(*,*) 'Run terminated at cstep=',cstep RETURN END IF !________________________________________________________________________________ ! 2. Test on NRUN nlend = step .GT. nrun IF ( nlend ) THEN WRITE(*,'(/a)') 'NRUN steps done' RETURN END IF !________________________________________________________________________________ ! 3. Test on TMAX nlend = time .GT. tmax IF ( nlend ) THEN IF (my_id .EQ. 0) WRITE(*,'(/a)') 'TMAX reached' RETURN END IF ! ! !________________________________________________________________________________ ! 4. Test on run time CALL cpu_time(tnow) mlend = (1.2*(tnow-start)) .GT. maxruntime CALL mpi_allreduce(mlend, nlend, 1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr) IF ( nlend ) THEN IF(my_id.EQ.0) WRITE(*,'(/a)') 'Max run time reached' RETURN END IF !________________________________________________________________________________ ! 5. NRUN modified through "stop file" ! IF( (my_id .EQ. 0) .AND. (MOD(cstep, ncheck_stop) == 0) ) THEN INQUIRE(file=stop_file, exist=mlexist) IF( mlexist ) THEN OPEN(lu_stop, file=stop_file) mlend = mlexist ! Send stop status asa the file exists WRITE(*,'(/a,i4,a)') 'Stop file found -> finishing..' CLOSE(lu_stop, status='delete') END IF END IF CALL mpi_allreduce(mlend, nlend, 1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr) ! RETURN ! END SUBROUTINE tesend