!!****************************************************************************** !! !! This file is part of the AMUN source code, a program to perform !! Newtonian or relativistic magnetohydrodynamical simulations on uniform or !! adaptive mesh. !! !! Copyright (C) 2019-2021 Grzegorz Kowal !! !! This program 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. !! !! This program 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 . !! !!****************************************************************************** !! !! module: HELPERS !! !! This module provides miscellaneous support subroutines. !! !! !!****************************************************************************** ! module helpers ! module variables are not implicit by default ! implicit none ! MODULE INTERFACES: ! ================= ! interface print_parameter module procedure print_parameter_integer module procedure print_parameter_double module procedure print_parameter_string end interface ! by default everything is private ! private ! declare public subroutines ! public :: print_welcome, print_section, print_parameter public :: flush_and_sync !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! contains ! !=============================================================================== !! !!*** PUBLIC SUBROUTINES ***************************************************** !! !=============================================================================== ! !=============================================================================== ! ! subroutine PRINT_WELCOME: ! ------------------------ ! ! Subroutine prints welcome message. ! ! Arguments: ! ! verbose - if true, the subroutine is executed, otherwise it is skipped; ! !=============================================================================== ! subroutine print_welcome(verbose) ! local variables are not implicit by default ! implicit none ! subroutine arguments ! logical, intent(in) :: verbose ! !------------------------------------------------------------------------------- ! if (.not. verbose) return write(*,"(1x,78('-'))") write(*,"(1x,18('='),17x,a,17x,19('='))") 'A M U N' write(*,"(1x,16('='),4x,a,4x,16('='))") & 'Copyright (C) 2008-2021 Grzegorz Kowal' write(*,"(1x,18('='),9x,a,9x,19('='))") & 'under GNU GPLv3 license' write(*,"(1x,78('-'))") !------------------------------------------------------------------------------- ! end subroutine print_welcome ! !=============================================================================== ! ! subroutine PRINT_SECTION: ! ------------------------ ! ! Subroutine prints section lines. ! ! Arguments: ! ! verbose - if true, the subroutine is executed, otherwise it is skipped; ! title - the section title; ! !=============================================================================== ! subroutine print_section(verbose, title) ! local variables are not implicit by default ! implicit none ! subroutine arguments ! logical , intent(in) :: verbose character(len=*), intent(in) :: title ! !------------------------------------------------------------------------------- ! if (.not. verbose) return write(*,*) write(*,"(1x,a,':')") trim(adjustl(title)) !------------------------------------------------------------------------------- ! end subroutine print_section ! !=============================================================================== ! ! subroutine PRINT_PARAMETER_INTEGER: ! ---------------------------------- ! ! Subroutine prints integer parameter. ! ! Arguments: ! ! verbose - if true, the subroutine is executed, otherwise it is skipped; ! desciption - the parameter description; ! value - the parameter value; ! !=============================================================================== ! subroutine print_parameter_integer(verbose, description, value) ! local variables are not implicit by default ! implicit none ! subroutine arguments ! logical , intent(in) :: verbose character(len=*), intent(in) :: description integer , intent(in) :: value ! local variables ! character(len=26) :: msg ! !------------------------------------------------------------------------------- ! if (.not. verbose) return msg = trim(adjustl(description)) write(*,"(4x,a26,1x,'=',1x,i0)") msg, value !------------------------------------------------------------------------------- ! end subroutine print_parameter_integer ! !=============================================================================== ! ! subroutine PRINT_PARAMETER_DOUBLE: ! ---------------------------------- ! ! Subroutine prints double precision parameter. ! ! Arguments: ! ! verbose - if true, the subroutine is executed, otherwise it is skipped; ! desciption - the parameter description; ! value - the parameter value; ! !=============================================================================== ! subroutine print_parameter_double(verbose, description, value) ! local variables are not implicit by default ! implicit none ! subroutine arguments ! logical , intent(in) :: verbose character(len=*), intent(in) :: description real(kind=8) , intent(in) :: value ! local variables ! character(len=26) :: msg ! !------------------------------------------------------------------------------- ! if (.not. verbose) return msg = trim(adjustl(description)) if (value >= 0.0d+00) then write(*,"(4x,a26,1x,'=',es12.5)") msg, value else write(*,"(4x,a26,1x,'=',1x,es12.5)") msg, value end if !------------------------------------------------------------------------------- ! end subroutine print_parameter_double ! !=============================================================================== ! ! subroutine PRINT_PARAMETER_STRING: ! --------------------------------- ! ! Subroutine prints string parameter. ! ! Arguments: ! ! verbose - if true, the subroutine is executed, otherwise it is skipped; ! desciption - the parameter description; ! value - the parameter value; ! !=============================================================================== ! subroutine print_parameter_string(verbose, description, value) ! local variables are not implicit by default ! implicit none ! subroutine arguments ! logical , intent(in) :: verbose character(len=*), intent(in) :: description character(len=*), intent(in) :: value ! local variables ! character(len=26) :: msg ! !------------------------------------------------------------------------------- ! if (.not. verbose) return msg = trim(adjustl(description)) write(*,"(4x,a26,1x,'=',1x,a)") msg, trim(adjustl(value)) !------------------------------------------------------------------------------- ! end subroutine print_parameter_string ! !=============================================================================== ! ! subroutine FLUSH_AND_SYNC: ! ----------------------- ! ! Function flushes and fsyncs the I/O buffers. ! ! Arguments: ! ! iounit - the I/O unit to flash; ! !=============================================================================== ! subroutine flush_and_sync(iounit) use iso_fortran_env, only : error_unit implicit none #ifdef __GFORTRAN__ interface function fsync (fd) bind(c,name="fsync") use iso_c_binding, only: c_int integer(c_int), value :: fd integer(c_int) :: fsync end function fsync end interface #endif /* __GFORTRAN__ */ integer, intent(in) :: iounit integer :: ret !------------------------------------------------------------------------------- ! call flush(iounit) #ifdef __GFORTRAN__ ret = fsync(fnum(iounit)) if (ret /= 0) & write(error_unit,"('Error calling FSYNC for unit:',1i4)") iounit #endif /* __GFORTRAN__ */ !------------------------------------------------------------------------------- ! end subroutine flush_and_sync !=============================================================================== ! end module helpers