AMUN: Move problem evolution to evolve_problem() in PROBLEM.
Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
parent
16f2e7220e
commit
bfb3001a26
154
sources/amun.F90
154
sources/amun.F90
@ -31,13 +31,8 @@
|
|||||||
!
|
!
|
||||||
program amun
|
program amun
|
||||||
|
|
||||||
use blocks , only : get_nleafs
|
|
||||||
use evolution , only : advance, new_time_step
|
|
||||||
use evolution , only : step, time, dt, errtol
|
|
||||||
use helpers , only : print_welcome, print_section, print_parameter
|
use helpers , only : print_welcome, print_section, print_parameter
|
||||||
use io , only : initialize_io, finalize_io
|
use io , only : initialize_io, finalize_io
|
||||||
use io , only : write_restart_snapshot
|
|
||||||
use io , only : update_dtp
|
|
||||||
use iso_fortran_env, only : error_unit
|
use iso_fortran_env, only : error_unit
|
||||||
use mpitools , only : initialize_mpitools, finalize_mpitools
|
use mpitools , only : initialize_mpitools, finalize_mpitools
|
||||||
#ifdef MPI
|
#ifdef MPI
|
||||||
@ -46,9 +41,10 @@ program amun
|
|||||||
use mpitools , only : master, nprocs, nproc, check_status
|
use mpitools , only : master, nprocs, nproc, check_status
|
||||||
use parameters , only : read_parameters, finalize_parameters
|
use parameters , only : read_parameters, finalize_parameters
|
||||||
use problem , only : initialize_problem, finalize_problem
|
use problem , only : initialize_problem, finalize_problem
|
||||||
use problem , only : print_problem_info, prepare_problem, store_problem
|
use problem , only : print_problem_info, prepare_problem
|
||||||
|
use problem , only : evolve_problem, store_problem
|
||||||
use problem , only : resumed, nrun, name, rngtype
|
use problem , only : resumed, nrun, name, rngtype
|
||||||
use problem , only : tmax, trun, nwork, nmax
|
use problem , only : tmax, trun, nwork, nmax, quit, nsteps
|
||||||
use random , only : initialize_random, finalize_random
|
use random , only : initialize_random, finalize_random
|
||||||
use timers , only : initialize_timers, finalize_timers
|
use timers , only : initialize_timers, finalize_timers
|
||||||
use timers , only : start_timer, stop_timer, set_timer, get_timer
|
use timers , only : start_timer, stop_timer, set_timer, get_timer
|
||||||
@ -62,26 +58,18 @@ program amun
|
|||||||
!
|
!
|
||||||
logical :: initialization_succeeded
|
logical :: initialization_succeeded
|
||||||
logical :: verbose = .true.
|
logical :: verbose = .true.
|
||||||
logical :: proceed = .true.
|
|
||||||
integer :: quit = 0
|
|
||||||
integer :: status = 0
|
integer :: status = 0
|
||||||
|
|
||||||
! timer indices, iteration number and other time variables
|
! timer indices, iteration number and other time variables
|
||||||
!
|
!
|
||||||
integer :: iin, iev, itm
|
integer :: iin, iev, itm
|
||||||
integer :: i, ed, eh, em, es, ec
|
integer :: i, ed, eh, em, es, ec
|
||||||
integer :: nsteps = 1
|
real(kind=8) :: tm_exec, tm_conv
|
||||||
real(kind=8) :: tbeg = 0.0d+00, thrs
|
|
||||||
real(kind=8) :: tm_curr, tm_exec, tm_conv, tm_last = 0.0d+00
|
|
||||||
|
|
||||||
! the format string
|
! the format string
|
||||||
!
|
!
|
||||||
character(len=80) :: sfmt
|
character(len=80) :: sfmt
|
||||||
|
|
||||||
! vectors for improved estimation of the remaining simulation time
|
|
||||||
!
|
|
||||||
real(kind=8), dimension(8) :: tprv, tm_prev
|
|
||||||
|
|
||||||
! an array pointer for timings
|
! an array pointer for timings
|
||||||
!
|
!
|
||||||
real(kind=8), dimension(:), allocatable :: tm
|
real(kind=8), dimension(:), allocatable :: tm
|
||||||
@ -213,139 +201,15 @@ program amun
|
|||||||
!
|
!
|
||||||
call start_timer(iev)
|
call start_timer(iev)
|
||||||
|
|
||||||
! initiate the progress info
|
call evolve_problem(verbose, status)
|
||||||
!
|
if (status /= 0) then
|
||||||
if (verbose) then
|
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
||||||
|
"Problem execution failed!"
|
||||||
tbeg = time
|
|
||||||
tprv(:) = time
|
|
||||||
tm_prev(:) = get_timer_total()
|
|
||||||
|
|
||||||
ed = 9999
|
|
||||||
eh = 23
|
|
||||||
em = 59
|
|
||||||
es = 59
|
|
||||||
|
|
||||||
write(*,*)
|
|
||||||
write(*,"(1x,a)" ) "Evolving the system:"
|
|
||||||
write(*,"(4x,'step',5x,'time',11x,'timestep',6x,'err/tol',4x," // &
|
|
||||||
"'blocks',7x,'ETA')")
|
|
||||||
#ifdef __INTEL_COMPILER
|
|
||||||
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
|
||||||
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1,$)") &
|
|
||||||
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
|
||||||
#else /* __INTEL_COMPILER */
|
|
||||||
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
|
||||||
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1)",advance="no") &
|
|
||||||
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
|
||||||
#endif /* __INTEL_COMPILER */
|
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
if (check_status(status /= 0)) go to 1000
|
||||||
proceed = (nsteps <= nmax) .and. (time < tmax) .and. proceed
|
|
||||||
|
|
||||||
! the integration loop
|
|
||||||
!
|
|
||||||
do while(proceed)
|
|
||||||
|
|
||||||
call advance(status)
|
|
||||||
if (status /= 0) then
|
|
||||||
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
|
||||||
"Advancing to the next step failed!"
|
|
||||||
end if
|
|
||||||
if (check_status(status /= 0)) go to 1000
|
|
||||||
|
|
||||||
! increase the iteration number and time
|
|
||||||
!
|
|
||||||
time = time + dt
|
|
||||||
step = step + 1
|
|
||||||
nsteps = nsteps + 1
|
|
||||||
|
|
||||||
! update the time step for the precise snapshots
|
|
||||||
!
|
|
||||||
call update_dtp()
|
|
||||||
|
|
||||||
! estimate the next time step
|
|
||||||
!
|
|
||||||
call new_time_step()
|
|
||||||
|
|
||||||
! store problem's progress
|
|
||||||
!
|
|
||||||
call store_problem(status)
|
|
||||||
if (status /= 0) then
|
|
||||||
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
|
||||||
"Could not store the problem's progress!"
|
|
||||||
end if
|
|
||||||
|
|
||||||
! estimate the elapsed time to trigger the restart snapshot storage
|
|
||||||
!
|
|
||||||
tm_curr = get_timer_total()
|
|
||||||
thrs = tm_curr / 3.6d+03
|
|
||||||
|
|
||||||
call write_restart_snapshot(thrs, name, nrun, status)
|
|
||||||
if (status /= 0) then
|
|
||||||
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
|
||||||
"Could not store the restart snapshot!"
|
|
||||||
end if
|
|
||||||
if (check_status(status /= 0)) go to 1000
|
|
||||||
|
|
||||||
! check conditions for the integration interruption
|
|
||||||
!
|
|
||||||
proceed = (nsteps <= nmax) .and. (time < tmax) .and. &
|
|
||||||
(thrs <= trun) .and. .not. check_status(quit /= 0)
|
|
||||||
|
|
||||||
if (verbose) then
|
|
||||||
|
|
||||||
! update the vectors for the remaining time estimation
|
|
||||||
!
|
|
||||||
tm_prev(1) = tm_curr
|
|
||||||
tprv(1) = time
|
|
||||||
tm_prev = cshift(tm_prev, 1)
|
|
||||||
tprv = cshift(tprv , 1)
|
|
||||||
|
|
||||||
if (time >= tmax .or. (tm_curr - tm_last) >= 1.0d+00) then
|
|
||||||
|
|
||||||
ec = int((tm_curr - tm_prev(1)) * (tmax - time) &
|
|
||||||
/ max(1.0d-03, time - tprv(1)), kind = 4)
|
|
||||||
es = max(0, min(863999999, ec))
|
|
||||||
ed = es / 86400
|
|
||||||
es = es - 86400 * ed
|
|
||||||
eh = es / 3600
|
|
||||||
es = es - 3600 * eh
|
|
||||||
em = es / 60
|
|
||||||
es = es - 60 * em
|
|
||||||
|
|
||||||
! print the progress info
|
|
||||||
!
|
|
||||||
#ifdef __INTEL_COMPILER
|
|
||||||
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
|
||||||
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1,$)") &
|
|
||||||
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
|
||||||
#else /* __INTEL_COMPILER */
|
|
||||||
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
|
||||||
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1)",advance="no")&
|
|
||||||
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
|
||||||
#endif /* __INTEL_COMPILER */
|
|
||||||
|
|
||||||
tm_last = tm_curr
|
|
||||||
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
end do ! main loop
|
|
||||||
|
|
||||||
if (verbose) write(*,*)
|
|
||||||
|
|
||||||
call stop_timer(iev)
|
call stop_timer(iev)
|
||||||
|
|
||||||
! store the final restart snapshot
|
|
||||||
!
|
|
||||||
call write_restart_snapshot(1.0d+16, name, nrun, status)
|
|
||||||
if (status /= 0) then
|
|
||||||
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
|
||||||
"Could not store the restart snapshot!"
|
|
||||||
end if
|
|
||||||
|
|
||||||
1000 continue
|
1000 continue
|
||||||
call start_timer(itm)
|
call start_timer(itm)
|
||||||
|
|
||||||
|
@ -38,10 +38,18 @@ module problem
|
|||||||
!
|
!
|
||||||
logical, save :: resumed = .false.
|
logical, save :: resumed = .false.
|
||||||
|
|
||||||
|
! the flag indicating that the problem evolution should be interrupted
|
||||||
|
!
|
||||||
|
integer, save :: quit = 0
|
||||||
|
|
||||||
! the number of resumed run
|
! the number of resumed run
|
||||||
!
|
!
|
||||||
integer, save :: nrun = 0
|
integer, save :: nrun = 0
|
||||||
|
|
||||||
|
! the number of iterations executed during the evolution
|
||||||
|
!
|
||||||
|
integer, save :: nsteps = 1
|
||||||
|
|
||||||
! the problem's permament parameters
|
! the problem's permament parameters
|
||||||
!
|
!
|
||||||
character(len=64) , save :: name = "none"
|
character(len=64) , save :: name = "none"
|
||||||
@ -67,10 +75,11 @@ module problem
|
|||||||
integer , save :: nwork = 4194304 ! 32MiB
|
integer , save :: nwork = 4194304 ! 32MiB
|
||||||
|
|
||||||
private
|
private
|
||||||
public :: initialize_problem, finalize_problem, prepare_problem, store_problem
|
public :: initialize_problem, finalize_problem
|
||||||
|
public :: prepare_problem, evolve_problem, store_problem
|
||||||
public :: print_problem_info
|
public :: print_problem_info
|
||||||
public :: resumed, name, nrun, eqsys, eos, ncells, nghosts, maxlev
|
public :: resumed, name, nrun, eqsys, eos, ncells, nghosts, maxlev, nsteps
|
||||||
public :: bdims, dbnds, rngtype, nmax, ndat, tmax, trun, tsav, nwork
|
public :: bdims, dbnds, rngtype, nmax, ndat, tmax, trun, tsav, nwork, quit
|
||||||
|
|
||||||
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
!
|
!
|
||||||
@ -428,30 +437,163 @@ module problem
|
|||||||
!
|
!
|
||||||
!===============================================================================
|
!===============================================================================
|
||||||
!
|
!
|
||||||
! subroutine EXECUTE_PROBLEM:
|
! subroutine EVOLVE_PROBLEM:
|
||||||
! ---------------------------
|
! -------------------------
|
||||||
!
|
!
|
||||||
! Subroutine executes the problem by performing its time evolution.
|
! Subroutine performed the time evolution of the problem.
|
||||||
!
|
!
|
||||||
! Arguments:
|
! Arguments:
|
||||||
!
|
!
|
||||||
! status - the subroutine call status;
|
! verbose - the verbose flag;
|
||||||
|
! status - the subroutine call status;
|
||||||
!
|
!
|
||||||
!===============================================================================
|
!===============================================================================
|
||||||
!
|
!
|
||||||
subroutine execute_problem(status)
|
subroutine evolve_problem(verbose, status)
|
||||||
|
|
||||||
|
use blocks , only : get_nleafs
|
||||||
|
use evolution , only : step, time, dt, errtol
|
||||||
|
use evolution , only : advance, new_time_step
|
||||||
|
use io , only : update_dtp, write_restart_snapshot
|
||||||
|
use iso_fortran_env, only : error_unit
|
||||||
|
use mpitools , only : check_status
|
||||||
|
use timers , only : get_timer_total
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
|
logical, intent(in) :: verbose
|
||||||
integer, intent(out) :: status
|
integer, intent(out) :: status
|
||||||
|
|
||||||
|
logical :: proceed = .true.
|
||||||
|
integer :: ed, eh, em, es, ec
|
||||||
|
real(kind=8) :: tbeg = 0.0d+00, thrs
|
||||||
|
real(kind=8) :: tm_curr, tm_exec, tm_conv, tm_last = 0.0d+00
|
||||||
|
|
||||||
|
real(kind=8), dimension(8) :: tprv, tm_prev
|
||||||
|
|
||||||
|
character(len=*), parameter :: loc = 'PROBLEM::evolve_problem()'
|
||||||
|
|
||||||
!-------------------------------------------------------------------------------
|
!-------------------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
status = 0
|
status = 0
|
||||||
|
|
||||||
|
if (verbose) then
|
||||||
|
|
||||||
|
tbeg = time
|
||||||
|
tprv(:) = time
|
||||||
|
tm_prev(:) = get_timer_total()
|
||||||
|
|
||||||
|
ed = 9999
|
||||||
|
eh = 23
|
||||||
|
em = 59
|
||||||
|
es = 59
|
||||||
|
|
||||||
|
write(*,*)
|
||||||
|
write(*,"(1x,a)" ) "Evolving the system:"
|
||||||
|
write(*,"(4x,'step',5x,'time',11x,'timestep',6x,'err/tol',4x," // &
|
||||||
|
"'blocks',7x,'ETA')")
|
||||||
|
#ifdef __INTEL_COMPILER
|
||||||
|
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
||||||
|
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1,$)") &
|
||||||
|
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
||||||
|
#else /* __INTEL_COMPILER */
|
||||||
|
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x," // &
|
||||||
|
"1i4.1,'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1)",advance="no") &
|
||||||
|
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
||||||
|
#endif /* __INTEL_COMPILER */
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
proceed = (nsteps <= nmax) .and. (time < tmax) .and. proceed
|
||||||
|
|
||||||
|
do while(proceed)
|
||||||
|
|
||||||
|
call advance(status)
|
||||||
|
if (status /= 0) then
|
||||||
|
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
||||||
|
"Advancing to the next step failed!"
|
||||||
|
end if
|
||||||
|
if (check_status(status /= 0)) return
|
||||||
|
|
||||||
|
time = time + dt
|
||||||
|
step = step + 1
|
||||||
|
nsteps = nsteps + 1
|
||||||
|
|
||||||
|
call update_dtp()
|
||||||
|
|
||||||
|
call new_time_step()
|
||||||
|
|
||||||
|
call store_problem(status)
|
||||||
|
if (status /= 0) then
|
||||||
|
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
||||||
|
"Could not store the problem's progress!"
|
||||||
|
end if
|
||||||
|
if (check_status(status /= 0)) return
|
||||||
|
|
||||||
|
tm_curr = get_timer_total()
|
||||||
|
thrs = tm_curr / 3.6d+03
|
||||||
|
|
||||||
|
call write_restart_snapshot(thrs, name, nrun, status)
|
||||||
|
if (status /= 0) then
|
||||||
|
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
||||||
|
"Could not store the restart snapshot!"
|
||||||
|
end if
|
||||||
|
if (check_status(status /= 0)) return
|
||||||
|
|
||||||
|
! check conditions for the integration interruption
|
||||||
|
!
|
||||||
|
proceed = (nsteps <= nmax) .and. (time < tmax) .and. &
|
||||||
|
(thrs <= trun) .and. .not. check_status(quit /= 0)
|
||||||
|
|
||||||
|
if (verbose) then
|
||||||
|
|
||||||
|
! update the vectors for the remaining time estimation
|
||||||
|
!
|
||||||
|
tm_prev(1) = tm_curr
|
||||||
|
tprv(1) = time
|
||||||
|
tm_prev = cshift(tm_prev, 1)
|
||||||
|
tprv = cshift(tprv , 1)
|
||||||
|
|
||||||
|
if (time >= tmax .or. (tm_curr - tm_last) >= 1.0d+00) then
|
||||||
|
|
||||||
|
ec = int((tm_curr - tm_prev(1)) * (tmax - time) &
|
||||||
|
/ max(1.0d-03, time - tprv(1)), kind = 4)
|
||||||
|
es = max(0, min(863999999, ec))
|
||||||
|
ed = es / 86400
|
||||||
|
es = es - 86400 * ed
|
||||||
|
eh = es / 3600
|
||||||
|
es = es - 3600 * eh
|
||||||
|
em = es / 60
|
||||||
|
es = es - 60 * em
|
||||||
|
|
||||||
|
#ifdef __INTEL_COMPILER
|
||||||
|
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x,1i4.1," // &
|
||||||
|
"'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1,$)") &
|
||||||
|
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
||||||
|
#else /* __INTEL_COMPILER */
|
||||||
|
write(*,"(i8,2(1x,1es14.6),1x,1es10.2,2x,i8,2x,1i4.1," // &
|
||||||
|
"'d',1i2.2,'h',1i2.2,'m',1i2.2,'s',15x,a1)",advance="no") &
|
||||||
|
step, time, dt, errtol, get_nleafs(), ed, eh, em, es, char(13)
|
||||||
|
#endif /* __INTEL_COMPILER */
|
||||||
|
|
||||||
|
tm_last = tm_curr
|
||||||
|
|
||||||
|
end if
|
||||||
|
end if
|
||||||
|
|
||||||
|
end do ! main loop
|
||||||
|
|
||||||
|
if (verbose) write(*,*)
|
||||||
|
|
||||||
|
call write_restart_snapshot(1.0d+16, name, nrun, status)
|
||||||
|
if (status /= 0) then
|
||||||
|
write(error_unit,"('[',a,']: ',a)") trim(loc), &
|
||||||
|
"Could not store the restart snapshot!"
|
||||||
|
end if
|
||||||
|
|
||||||
!-------------------------------------------------------------------------------
|
!-------------------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
end subroutine execute_problem
|
end subroutine evolve_problem
|
||||||
!
|
!
|
||||||
!===============================================================================
|
!===============================================================================
|
||||||
!
|
!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user