Nicholaswogan / ForwardDiff

Forward mode automatic differentiation for Fortran

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ForwardDiff

ForwardDiff allows for the computation of derivatives, gradients and Jacobians of Fortran subroutines or functions using forward mode automatic differentiation (AD). To create this package I borrowed code, syntax and inspiration from DNAD, ForwardDiff.jl, and a lecture series by Chris Rackauckas.

Examples

For a comprehensive set of examples see the tests in the test directory. In particular, test/fypp_example.fypp shows how to use the fypp preprocessor to write more general, differentiable code.

Below is a simple demo that computes the derivative of the scalar function $f(x) = \sin(x)\exp(x)x^2 + 1$ at $x = 2$.

program main
  use forwarddiff, only: wp, derivative
  implicit none

  call example()

contains

  subroutine example()
    real(wp) :: x, f, dfdx
    x = 2.0_wp
    call derivative(fcn, x, f, dfdx)
    print*,'x = ',x
    print*,'f = ',f
    print*,'df/dx = ',dfdx
  end subroutine

  function fcn(x) result(f)
    use forwarddiff
    type(dual), intent(in) :: x
    type(dual) :: f
    f = sin(x)*exp(x)*x**2.0_wp + 1.0_wp
  end function

end program 

Output:

 x =    2.0000000000000000     
 f =    27.875398789713000     
 df/dx =    41.451068296868563

Building

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
# run test
./test/test_forwarddiff

Limitations

This package has the following limitations:

  • The package is not compatible with all Fortran intrinsic functions. If you identify an intrinsic that should be added, please submit a pull request.

  • The jacobian routine can only compute square Jacobians.

About

Forward mode automatic differentiation for Fortran

License:MIT License


Languages

Language:Fortran 89.9%Language:CMake 5.5%Language:Python 4.6%