NAG Library Manual, Mark 27.2
Interfaces:  FL   CL   CPP   AD 

NAG AD Library Introduction
Example description
/* nag::ad::c05au Passive Example Program.
 */

#include <dco.hpp>
#include <iostream>
#include <nagad.h>

// Function which calls NAG AD Library routines.
// Finds the zero point f(xv) = 0 for the function
// f(x) = x - exp(-r*x) using an initial approximation of xv.
template <typename T> void func(T r, T &x);

// The function f
template <typename T>
void NAG_CALL f(void *&ad_handle, const T &x, T &z, Integer iuser[], T ruser[]);

int main()
{
  std::cout << " nag::ad::c05au Passive Example Program Results\n";

  // Set problem parameters
  double rv = 1.0;
  // Solution x
  double xv;

  // Call the NAG AD Lib functions
  func(rv, xv);

  // Print outputs
  std::cout.setf(std::ios::scientific, std::ios::floatfield);
  std::cout.precision(12);
  std::cout << "\n Solution:\n";
  std::cout << " x = " << xv << std::endl;

  return 0;
}

// Function which calls NAG AD Library routines.
// Finds the zero point f(xv) = 0 for the function
// f(x) = x - exp(-r*x) using an initial approximation of xv.
template <typename T> void func(T r, T &x)
{
  // Active variables
  T a, b, h = 0.1;
  T eps = 1.0e-5, eta = 0.0;
  // Initial guess to the zero
  dco::passive_value(x) = 1.0;
  // Create AD configuration data object
  Integer ifail     = 0;
  void *  ad_handle = 0;
  nag::ad::x10aa(ad_handle, ifail);
  // Call routine for computing an approximation to a simple zero of the
  // continuous function f using an initial approximation.
  ifail = 0;
  nag::ad::c05au(ad_handle, x, h, eps, eta, f<T>, a, b, 0, nullptr, 1, &r,
                 ifail);
  // Remove computational data object
  ifail = 0;
  nag::ad::x10ab(ad_handle, ifail);
}

// Callback that evaluates the non-linear function
template <typename T>
void NAG_CALL f(void *&ad_handle, const T &x, T &z, Integer iuser[], T ruser[])
{
  T r = ruser[0];
  z   = x - exp(-r * x);
}