/* nag_zero_cont_func_cntin_rcomm (c05axc) Example Program.
 *
 * Copyright 2014 Numerical Algorithms Group.
 *
 * Mark 9, 2009.
 */

#include <nag.h>
#include <stdio.h>
#include <nag_stdlib.h>
#include <math.h>
#include <nagc05.h>
#include <nagx02.h>

int main(void)
{
  /* Scalars */
  Integer          exit_status = 0;
  double           fx, tol, x, scal, i;
  Integer          ind;
  Nag_ErrorControl ir;
  /* Arrays */
  double           c[26];
  NagError         fail;

  INIT_FAIL(fail);

  printf("nag_zero_cont_func_cntin_rcomm (c05axc) Example Program Results\n");

  scal = sqrt(nag_machine_precision);
  ir = Nag_Mixed;

  for (i = 3; i <= 4; i++)
    {
      tol = pow(10.0, -i);
      printf("\ntol = %13.4e\n\n", tol);
      x = 1.0;
      ind = 1;
      fx = 0.0;

      /* nag_zero_cont_func_cntin_rcomm (c05axc).
       * Locates a zero of a continuous function.
       * Reverse communication.
       */

      while (ind != 0)
        {
          nag_zero_cont_func_cntin_rcomm(&x, fx, tol, ir, scal, c, &ind, &fail);
          if (ind != 0)
            fx = x - exp(-x);
        }

      if (fail.code == NE_NOERROR)
        {
          printf("Root is %14.5f\n", x);
        }
      else
        {
          printf(
                  "Error from nag_zero_cont_func_cntin_rcomm (c05axc) %s\n",
                  fail.message);

          if (fail.code == NE_CONTIN_PROB_NOT_SOLVED ||
              fail.code == NE_FINAL_PROB_NOT_SOLVED)
            {
              printf("Final value = %14.5f, theta = %10.2f\n", x, c[4]);
            }

          exit_status = 1;
          goto END;
        }
    }

 END:

  return exit_status;
}