! This Fortran 90 module provides a template for automatic ! differentiation. MODULE AUTOMATIC_DIFFERENTIATION INTEGER, PARAMETER, PRIVATE :: KD = KIND(1D0) TYPE AUTODIFF REAL(KIND=KD) :: VALUE, DERIV END TYPE AUTODIFF !Interface to the basic operations INTERFACE OPERATOR(+) MODULE PROCEDURE ADD END INTERFACE INTERFACE OPERATOR(**) MODULE PROCEDURE IPOWER END INTERFACE CONTAINS ! Basic operation functions FUNCTION ADD(A,B) RESULT(SUM) TYPE(AUTODIFF) :: SUM TYPE(AUTODIFF), INTENT(IN) :: A, B SUM%VALUE = A%VALUE + B%VALUE SUM%DERIV = A%DERIV + B%DERIV END FUNCTION ADD FUNCTION IPOWER(A,N) RESULT(A_TO_N) TYPE(AUTODIFF) :: A_TO_N TYPE(AUTODIFF), INTENT(IN) :: A INTEGER, INTENT(IN) :: N A_TO_N%VALUE = A%VALUE **N A_TO_N%DERIV = N* A%VALUE **(N-1) * A%DERIV END FUNCTION IPOWER END MODULE AUTOMATIC_DIFFERENTIATION