diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index b24ba5480..909da7f1e 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -5,6 +5,7 @@ !-------------------------------------------------------------------------------------------------- module CPFEM2 use parallelization + use signals use DAMASK_interface use prec use IO @@ -21,7 +22,6 @@ module CPFEM2 use material use phase use homogenization - use discretization #if defined(MESH) use FEM_quadrature @@ -44,6 +44,7 @@ subroutine CPFEM_initAll call parallelization_init call DAMASK_interface_init ! Spectral and FEM interface to commandline + call signals_init call prec_init call IO_init #if defined(MESH) diff --git a/src/DAMASK_interface.f90 b/src/DAMASK_interface.f90 index 1a6bb3ee6..2dee9b13c 100644 --- a/src/DAMASK_interface.f90 +++ b/src/DAMASK_interface.f90 @@ -24,10 +24,6 @@ module DAMASK_interface implicit none private - logical, volatile, public, protected :: & - interface_SIGTERM, & !< termination signal - interface_SIGUSR1, & !< 1. user-defined signal - interface_SIGUSR2 !< 2. user-defined signal integer, public, protected :: & interface_restartInc = 0 !< Increment at which calculation starts character(len=:), allocatable, public, protected :: & @@ -36,10 +32,7 @@ module DAMASK_interface public :: & getSolverJobName, & - DAMASK_interface_init, & - interface_setSIGTERM, & - interface_setSIGUSR1, & - interface_setSIGUSR2 + DAMASK_interface_init contains @@ -197,13 +190,6 @@ subroutine DAMASK_interface_init if (interface_restartInc > 0) & print'(a,i6.6)', ' Restart from increment: ', interface_restartInc - call signalterm_c(c_funloc(catchSIGTERM)) - call signalusr1_c(c_funloc(catchSIGUSR1)) - call signalusr2_c(c_funloc(catchSIGUSR2)) - call interface_setSIGTERM(.false.) - call interface_setSIGUSR1(.false.) - call interface_setSIGUSR2(.false.) - end subroutine DAMASK_interface_init @@ -376,92 +362,4 @@ function makeRelativePath(a,b) end function makeRelativePath - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGTERM to .true. -!> @details This function can be registered to catch signals send to the executable. -!-------------------------------------------------------------------------------------------------- -subroutine catchSIGTERM(signal) bind(C) - - integer(C_INT), value :: signal - - - print'(a,i0)', ' received signal ',signal - call interface_setSIGTERM(.true.) - -end subroutine catchSIGTERM - - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGUSR1 to .true. -!> @details This function can be registered to catch signals send to the executable. -!-------------------------------------------------------------------------------------------------- -subroutine catchSIGUSR1(signal) bind(C) - - integer(C_INT), value :: signal - - - print'(a,i0)', ' received signal ',signal - call interface_setSIGUSR1(.true.) - -end subroutine catchSIGUSR1 - - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGUSR2 to .true. -!> @details This function can be registered to catch signals send to the executable. -!-------------------------------------------------------------------------------------------------- -subroutine catchSIGUSR2(signal) bind(C) - - integer(C_INT), value :: signal - - - print'(a,i0,a)', ' received signal ',signal - call interface_setSIGUSR2(.true.) - -end subroutine catchSIGUSR2 - - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGTERM. -!-------------------------------------------------------------------------------------------------- -subroutine interface_setSIGTERM(state) - - logical, intent(in) :: state - - - interface_SIGTERM = state - print*, 'set SIGTERM to',state - -end subroutine interface_setSIGTERM - - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGUSR. -!-------------------------------------------------------------------------------------------------- -subroutine interface_setSIGUSR1(state) - - logical, intent(in) :: state - - - interface_SIGUSR1 = state - print*, 'set SIGUSR1 to',state - -end subroutine interface_setSIGUSR1 - - -!-------------------------------------------------------------------------------------------------- -!> @brief Set global variable interface_SIGUSR2. -!-------------------------------------------------------------------------------------------------- -subroutine interface_setSIGUSR2(state) - - logical, intent(in) :: state - - - interface_SIGUSR2 = state - print*, 'set SIGUSR2 to',state - -end subroutine interface_setSIGUSR2 - - -end module +end module DAMASK_interface diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 39870a8ff..72cc83452 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -15,6 +15,7 @@ program DAMASK_grid use prec use parallelization + use signals use DAMASK_interface use IO use config @@ -448,15 +449,15 @@ program DAMASK_grid print'(/,1x,a,i0,a)', 'increment ', totalIncsCounter, ' NOT converged' endif; flush(IO_STDOUT) - call MPI_Allreduce(interface_SIGUSR1,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) + call MPI_Allreduce(signals_SIGUSR1,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) if (err_MPI /= 0_MPI_INTEGER_KIND) error stop 'MPI error' if (mod(inc,loadCases(l)%f_out) == 0 .or. signal) then print'(/,1x,a)', '... writing results to file ...............................................' flush(IO_STDOUT) call CPFEM_results(totalIncsCounter,t) endif - if (signal) call interface_setSIGUSR1(.false.) - call MPI_Allreduce(interface_SIGUSR2,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) + if (signal) call signals_setSIGUSR1(.false.) + call MPI_Allreduce(signals_SIGUSR2,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) if (err_MPI /= 0_MPI_INTEGER_KIND) error stop 'MPI error' if (mod(inc,loadCases(l)%f_restart) == 0 .or. signal) then do field = 1, nActiveFields @@ -469,8 +470,8 @@ program DAMASK_grid end do call CPFEM_restartWrite endif - if (signal) call interface_setSIGUSR2(.false.) - call MPI_Allreduce(interface_SIGTERM,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) + if (signal) call signals_setSIGUSR2(.false.) + call MPI_Allreduce(signals_SIGTERM,signal,1_MPI_INTEGER_KIND,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,err_MPI) if (err_MPI /= 0_MPI_INTEGER_KIND) error stop 'MPI error' if (signal) exit loadCaseLooping endif skipping diff --git a/src/signals.f90 b/src/signals.f90 new file mode 100644 index 000000000..bf53912f4 --- /dev/null +++ b/src/signals.f90 @@ -0,0 +1,128 @@ +!-------------------------------------------------------------------------------------------------- +!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH +!> @brief Handling of UNIX signals. +!-------------------------------------------------------------------------------------------------- +module signals + use prec + use system_routines + + implicit none + private + + logical, volatile, public, protected :: & + signals_SIGTERM, & !< termination signal + signals_SIGUSR1, & !< 1. user-defined signal + signals_SIGUSR2 !< 2. user-defined signal + + public :: & + signals_init, & + signals_setSIGTERM, & + signals_setSIGUSR1, & + signals_setSIGUSR2 + +contains + + +!-------------------------------------------------------------------------------------------------- +!> @brief Register signal handlers. +!-------------------------------------------------------------------------------------------------- +subroutine signals_init() + + call signalterm_c(c_funloc(catchSIGTERM)) + call signalusr1_c(c_funloc(catchSIGUSR1)) + call signalusr2_c(c_funloc(catchSIGUSR2)) + call signals_setSIGTERM(.false.) + call signals_setSIGUSR1(.false.) + call signals_setSIGUSR2(.false.) + +end subroutine signals_init + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGTERM to .true. +!> @details This function can be registered to catch signals send to the executable. +!-------------------------------------------------------------------------------------------------- +subroutine catchSIGTERM(signal) bind(C) + + integer(C_INT), value :: signal + + + print'(a,i0)', ' received signal ',signal + call signals_setSIGTERM(.true.) + +end subroutine catchSIGTERM + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGUSR1 to .true. +!> @details This function can be registered to catch signals send to the executable. +!-------------------------------------------------------------------------------------------------- +subroutine catchSIGUSR1(signal) bind(C) + + integer(C_INT), value :: signal + + + print'(a,i0)', ' received signal ',signal + call signals_setSIGUSR1(.true.) + +end subroutine catchSIGUSR1 + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGUSR2 to .true. +!> @details This function can be registered to catch signals send to the executable. +!-------------------------------------------------------------------------------------------------- +subroutine catchSIGUSR2(signal) bind(C) + + integer(C_INT), value :: signal + + + print'(a,i0,a)', ' received signal ',signal + call signals_setSIGUSR2(.true.) + +end subroutine catchSIGUSR2 + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGTERM. +!-------------------------------------------------------------------------------------------------- +subroutine signals_setSIGTERM(state) + + logical, intent(in) :: state + + + signals_SIGTERM = state + print*, 'set SIGTERM to',state + +end subroutine signals_setSIGTERM + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGUSR. +!-------------------------------------------------------------------------------------------------- +subroutine signals_setSIGUSR1(state) + + logical, intent(in) :: state + + + signals_SIGUSR1 = state + print*, 'set SIGUSR1 to',state + +end subroutine signals_setSIGUSR1 + + +!-------------------------------------------------------------------------------------------------- +!> @brief Set global variable signals_SIGUSR2. +!-------------------------------------------------------------------------------------------------- +subroutine signals_setSIGUSR2(state) + + logical, intent(in) :: state + + + signals_SIGUSR2 = state + print*, 'set SIGUSR2 to',state + +end subroutine signals_setSIGUSR2 + + +end module signals