separating functionality
signal handling and CLI handling are not really related
This commit is contained in:
parent
5d12ef5b9f
commit
0e65d44bdc
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue