!-----------------------------------------------------------------------
!
!  support module for test.f90 sample program to demonstrate the 
!    sderk.f90 stochastic integrator
!
!-----------------------------------------------------------------------

module sderk_support

  integer, parameter  :: sderk_prec = selected_real_kind(p=14)
  integer, parameter  :: wp = sderk_prec
  integer, parameter  :: sderk_mf = 23
  integer, parameter  :: sderk_rand_mf = 301
  real(wp), parameter :: sderk_tol = epsilon(1.0_wp) * 100

  real(wp), dimension(1), save, target :: sderk_y
  real(wp), dimension(1), save ::                                      &
           sderk_a, sderk_b, sderk_c, sderk_ybar,                      &
           sderk_aybarp, sderk_aybarm, sderk_bybarp, sderk_bybarm,     &
           sderk_aphip, sderk_aphim, sderk_bphip, sderk_bphim

  real(wp) :: alpha, beta


contains


! Subroutines that implement equations of motion, to be called
!   by sderk

subroutine sderk_func_a(t, y, ydot)
  implicit none
  real(wp) :: t
  real(wp), dimension(1) :: y, ydot

  ! this is the Ito form
  ! return deterministic derivative
  ydot = (-1.0_wp) * (alpha+beta*beta*y) * (1.0_wp - y*y)

  return
end subroutine sderk_func_a

subroutine sderk_func_b(t, y, ydot)
  implicit none      
  real(wp) :: t
  real(wp), dimension(1) :: y, ydot 

  ! return stochastic derivative   
  ydot = beta * (1.0_wp - y*y)

  return
end subroutine sderk_func_b


end module sderk_support
