!!****************************************************************************** !! !! program: Godunov-AMR !! !! Copyright (C) 2008-2010 Grzegorz Kowal !! !!****************************************************************************** !! !! This file is part of Godunov-AMR. !! !! Godunov-AMR is free software; you can redistribute it and/or modify !! it under the terms of the GNU General Public License as published by !! the Free Software Foundation; either version 3 of the License, or !! (at your option) any later version. !! !! Godunov-AMR is distributed in the hope that it will be useful, !! but WITHOUT ANY WARRANTY; without even the implied warranty of !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the !! GNU General Public License for more details. !! !! You should have received a copy of the GNU General Public License !! along with this program. If not, see . !! !!****************************************************************************** !! ! program godunov ! modules ! use config , only : read_config, nmax, tmax, dtini, dtout, ftype, cfl use evolution, only : evolve, n, t, dt, dtn use io , only : write_data use mesh , only : init_mesh, clear_mesh use mpitools , only : ncpu, ncpus, init_mpi, clear_mpi, is_master use timer , only : init_timers, start_timer, stop_timer, get_timer & , get_timer_total ! !------------------------------------------------------------------------------- ! ! local variables ! character(len=60) :: fmt integer :: no, ed, eh, em, es, ec real :: tall, tbeg, tcur, per ! !------------------------------------------------------------------------------- ! ! initialize MPI ! call init_mpi ! print info message ! if (is_master()) then write (*,"(1x,78('-'))") write (*,"(1x,18('='),4x,a,4x,19('='))") ' Godunov-AMR algorithm ' write (*,"(1x,16('='),4x,a,4x,16('='))") 'Copyright (C) 2008-2010 Grzegorz Kowal' #ifdef MPI write (*,"(1x,18('='),4x,a,i5,a,4x,19('='))") 'MPI enabled with ', ncpus & , ' processors' #endif /* MPI */ write (*,"(1x,78('-'))") write (*,*) end if ! read configuration file ! call read_config ! initialize timers ! call init_timers ! reset number of iterations and time, etc. ! n = 0 t = 0.0 dt = cfl*dtini dtn = dtini no = 0 tbeg = 0.0 ! initialize our adaptive mesh, refine that mesh to the desired level ! according to the initialized problem ! call start_timer(1) call init_mesh call stop_timer(1) ! write down the initial state ! call start_timer(3) call write_data(ftype, no, ncpu) call stop_timer(3) ! print information ! if (is_master()) then write(*,*) write(*,"(1x,a)" ) "Evolving system:" end if ! main loop ! do while((n .lt. nmax) .and. (t .le. tmax)) ! compute new time step ! dt = min(cfl*dtn, 2.*dt) ! advance the iteration number and time ! t = t + dt n = n + 1 ! performe one step evolution ! call start_timer(2) call evolve call stop_timer(2) ! store data ! call start_timer(3) if (dtout .gt. 0.0 .and. no .lt. (int(t/dtout))) then no = no + 1 call write_data(ftype, no, ncpu) end if call stop_timer(3) ! get current time in seconds ! tcur = get_timer_total() ec = int((tmax - t)/(t - tbeg)*tcur, kind=4) es = max(0, int(mod(ec,60))) em = int(mod(ec/60,60)) eh = int(ec/3600) ed = int(eh/24) eh = int(mod(eh, 24)) ed = min(9999,ed) ! print progress information ! if (is_master()) then if (mod(n, 50) .eq. 1) & write(*,'(4x,a4,3(3x,a9,3x),4x,a12)') 'iter', 'time ', 'dt ', 'dtnew ' & , 'remain. time' write(*,'(i8,3(1x,1pe14.6),2x,1i4.1,"d",1i2.2,"h",1i2.2,"m",1i2.2,"s")') & n, t, dt, dtn, ed, eh, em, es end if end do ! write down the final state ! call start_timer(3) no = no + 1 call write_data(ftype, no, ncpu) call stop_timer(3) ! deallocate and reset mesh ! call start_timer(1) call clear_mesh call stop_timer(1) ! get total time ! tall = get_timer_total() per = 100.0 / tall ! print info about execution times ! if (is_master()) then write(fmt,"(a,i2,a)") "(a27,1f", max(1, nint(alog10(tall))) + 6 & , ".4,' secs = ',f7.3,' %')" write (*,*) write (*,fmt) "Time for initialization : ", get_timer(1), per * get_timer(1) write (*,fmt) "Time for evolution : ", get_timer(2), per * get_timer(2) write (*,fmt) "Time for data output : ", get_timer(3), per * get_timer(3) write (*,fmt) "Time for boundary update: ", get_timer(4), per * get_timer(4) write (*,fmt) "Time for mesh update : ", get_timer(5), per * get_timer(5) write (*,fmt) "EXECUTION TIME : ", tall , 100.0 end if ! close access to the MPI ! call clear_mpi !------------------------------------------------------------------------------- ! end program