demo1.f90 Source File


This file depends on

sourcefile~~demo1.f90~~EfferentGraph sourcefile~demo1.f90 demo1.f90 sourcefile~fordiff.f90 fordiff.F90 sourcefile~demo1.f90->sourcefile~fordiff.f90

Source Code

program demo1

   ! This program demonstrates how to compute the derivative of a scalar-valued function w.r.t to a scalar variable
   ! using complex-step and finite-difference methods.

   use fordiff, only: rk, derivative

   implicit none

   real(rk) :: dfdx

   print'(a)', 'f(x) = x**2 + 2.0*x'
   print'(a)', 'compute derivative of f(x) w.r.t to x at x = 1.0'

   ! Compute derivative of a function using complex-step
   dfdx = derivative(f=f1, x=1.0_rk, h=tiny(0.0_rk))
   print'(a,g0,a)', 'dfdx = ', dfdx, ' (complex-step)'

   ! Compute derivative of a function using forward finite-difference
   dfdx = derivative(f=f2, x=1.0_rk, h=1e-5_rk, method='forward')
   print'(a,g0,a)', 'dfdx = ', dfdx, ' (forward finite-difference)'

   ! Compute derivative of a function using backward finite-difference
   dfdx = derivative(f=f2, x=1.0_rk, h=1e-5_rk, method='backward')
   print'(a,g0,a)', 'dfdx = ', dfdx, ' (backward finite-difference)'

   ! Compute derivative of a function using central finite-difference
   dfdx = derivative(f=f2, x=1.0_rk, h=1e-5_rk, method='central')
   print'(a,g0,a)', 'dfdx = ', dfdx, ' (central finite-difference)'

contains

   ! Define a scalar function of a scalar variable (complex)
   function f1(x) result(f)
      complex(rk), intent(in) :: x
      complex(rk)             :: f
      f = x**2 + 2.0_rk*x
   end function f1

   ! Define a scalar function of a scalar variable (real)
   function f2(x) result(f)
      real(rk), intent(in) :: x
      real(rk)             :: f
      f = x**2 + 2.0_rk*x
   end function f2

end program demo1