! $Id$
!
!  This module provide a way for users to specify custom initial
!  conditions.
!
!** AUTOMATIC CPARAM.INC GENERATION ****************************
! Declare (for generation of cparam.inc) the number of f array
! variables and auxiliary variables added by this module
!
! CPARAM logical, parameter :: linitial_condition = .true.
!
!***************************************************************
module InitialCondition
!
  use Cparam
  use Cdata
  use General, only: keep_compiler_quiet
  use Messages
!
  implicit none
!
  include 'initial_condition.h'
!
  real, dimension(3) :: amp0 = 0.0, k0 = 0.0
  real :: phase0 = 0.0
!
  namelist /initial_condition_pars/ amp0, k0, phase0
!
  contains
!***********************************************************************
    subroutine register_initial_condition()
!
!  Registers variables associated with this module; likely none.
!
!  25-jun-13/ccyang: coded.
!
      if (lroot) call svn_id("$Id$")
!
    endsubroutine register_initial_condition
!***********************************************************************
    subroutine initialize_initial_condition(f)
!
!  Initializes any module variables which are parameter dependent.
!
!  25-jun-13/ccyang: coded.
!
      real, dimension(mx,my,mz,mfarray) :: f
!
      call keep_compiler_quiet(f)
!
    endsubroutine initialize_initial_condition
!***********************************************************************
    subroutine initial_condition_uu(f)
!
!  Initializes the velocity field.
!
!  25-jun-13/ccyang: coded.
!
      use Initcond, only: sinwave_phase
!
      real, dimension(mx,my,mz,mfarray), intent(inout) :: f
!
      integer :: i
!
      do i = 1, 3
        call sinwave_phase(f, iuu+i-1, amp0(i), k0(1), k0(2), k0(3), phase0)
      enddo
!
    endsubroutine initial_condition_uu
!***********************************************************************
    subroutine initial_condition_aa(f)
!
!  Initializes the magnetic field.
!
!  28-jun-13/ccyang: coded.
!
      use EquationOfState, only: rho0
      use Initcond, only: sinwave_phase
!
      real, dimension(mx,my,mz,mfarray), intent(inout) :: f
!
      integer :: i
      real :: c
!
      c = sqrt(mu0 * rho0)
      do i = 1, 3
        call sinwave_phase(f, ibb+i-1, c * amp0(i), k0(1), k0(2), k0(3), phase0)
      enddo
!
    endsubroutine initial_condition_aa
!***********************************************************************
    subroutine read_initial_condition_pars(unit, iostat)
!
! Reads the initialization parameters for the initial conditions.
!
!  25-jun-13/ccyang: coded.
!
      integer, intent(in) :: unit
      integer, intent(inout), optional :: iostat
!
      integer :: istat
!
      read(unit, NML=initial_condition_pars, IOSTAT=istat)
!
      if (present(iostat)) then
        iostat = istat
      else if (istat /= 0) then
        call fatal_error('read_initial_condition_pars', 'cannot read the namelist initial_condition_pars. ')
      endif
!
    endsubroutine read_initial_condition_pars
!***********************************************************************
    subroutine write_initial_condition_pars(unit)
!
! Writes the initialization parameters for the initial conditions.
!
!  25-jun-13/ccyang: coded.
!
      integer, intent(in) :: unit
!
      write(unit, NML=initial_condition_pars)
!
    endsubroutine write_initial_condition_pars
!***********************************************************************
!
!********************************************************************
!************        DO NOT DELETE THE FOLLOWING       **************
!********************************************************************
!**  This is an automatically generated include file that creates  **
!**  copies dummy routines from noinitial_condition.f90 for any    **
!**  InitialCondition routines not implemented in this file        **
!**                                                                **
    include 'initial_condition_dummies.inc'
!********************************************************************
endmodule InitialCondition