 BEGIN_PROVIDER [ double precision, output_wall_time_0 ]
&BEGIN_PROVIDER [ double precision, output_cpu_time_0 ]
  implicit none
  BEGIN_DOC
  ! Initial CPU and wall times when printing in the output files
  END_DOC
  call cpu_time(output_wall_time_0)
  call wall_time(output_wall_time_0)
END_PROVIDER
 
BEGIN_SHELL [ /bin/bash ]
 
 for NAME in $(\ls -d ${QPACKAGE_ROOT}/src/*/)
 do
 NAME=$(basename ${NAME})
 cat << EOF
 BEGIN_PROVIDER [ integer, output_$NAME ]
  implicit none
  BEGIN_DOC
  ! Output file for $NAME
  END_DOC
  PROVIDE output_wall_time_0 output_cpu_time_0
  integer                        :: getUnitAndOpen
  call ezfio_set_output_empty(.False.)
IRP_IF COARRAY
  if (this_image() == 1) then
    output_$NAME = getUnitAndOpen(trim(ezfio_filename)//'/output/'//'$NAME.rst','a')
  else
    output_$NAME = getUnitAndOpen('/dev/null','w')
  endif
IRP_ELSE
  output_$NAME = getUnitAndOpen(trim(ezfio_filename)//'/output/'//'$NAME.rst','a')
IRP_ENDIF
  write(output_$NAME,'(A)')                                          &
      '--------------------------------------------------------------------------------'
 END_PROVIDER
EOF
 done
 
END_SHELL
 
subroutine write_time(iunit)
  implicit none
  BEGIN_DOC
  ! Write a time stamp in the output for chronological reconstruction
  END_DOC
  integer, intent(in)            :: iunit
  double precision               :: wt, ct
  call cpu_time(ct)
  call wall_time(wt)
  write(iunit,*)
  write(iunit,'(A,F15.6,A,F15.6,A)') &
    '.. >>>>> [ WALL TIME: ', wt-output_wall_time_0, &
        ' s ] [ CPU  TIME: ', ct-output_cpu_time_0, ' s ] <<<<< ..'
  write(iunit,*)
end
 
subroutine write_double(iunit,value,label)
  implicit none
  BEGIN_DOC
  ! Write a double precision value in output
  END_DOC
  integer, intent(in)            :: iunit
  double precision               :: value
  character*(*)                  :: label
  character*(64), parameter      :: f = '(A50,G24.16)'
  character*(50)                 :: newlabel
  write(newlabel,'(A,A)') '* ',trim(label)
  write(iunit,f) newlabel, value
end


subroutine write_int(iunit,value,label)
  implicit none
  BEGIN_DOC
  ! Write an integer value in output
  END_DOC
  integer, intent(in)            :: iunit
  integer                        :: value
  character*(*)                  :: label
  character*(64), parameter      :: f = '(A50,I16)'
  character*(50)                 :: newlabel
  write(newlabel,'(A,A)') '* ',trim(label)
  write(iunit,f) newlabel, value
end


subroutine write_bool(iunit,value,label)
  implicit none
  BEGIN_DOC
  ! Write an logical value in output
  END_DOC
  integer, intent(in)            :: iunit
  logical                        :: value
  character*(*)                  :: label
  character*(64), parameter      :: f = '(A50,L1)'
  character*(50)                 :: newlabel
  write(newlabel,'(A,A)') '* ',trim(label)
  write(iunit,f) newlabel, value
end


