/* nag_tsa_spectrum_bivar_cov (g13ccc) Example Program.
 *
 * Copyright 2014 Numerical Algorithms Group.
 *
 * Mark 7, 2002.
 */

#include <stdio.h>
#include <nag.h>
#include <nag_stdlib.h>
#include <nagg13.h>

int main(void)
{
  /* Scalars */
  double         pxy;
  Integer        exit_status, i, ic, ii, ish, iw, kc, lf,
                 mw, nc, ng, nxy, nxyg;

  /* Arrays */
  double         *cxy = 0, *cyx = 0, *xg = 0, *yg = 0;
  Complex        *g = 0;

  NagMeanOrTrend mtxy;

  NagError       fail;


  INIT_FAIL(fail);

  exit_status = 0;

  printf(
          "nag_tsa_spectrum_bivar_cov (g13ccc) Example Program Results\n");

  /* Skip heading in data file */
  scanf("%*[^\n] ");
  scanf("%ld%ld%ld%*[^\n] ", &nxy, &nc, &ic);

  if (nxy > 0 && nc > 0)
    {
      /* Set parameters for call to nag_tsa_spectrum_bivar_cov (g13ccc) */
      /* Mean correction and 10 percent taper */
      mtxy = Nag_Mean;
      pxy = 0.1;

      /* Parzen window and zero covariance at lag 35 */
      iw = 4;
      mw = 35;

      /* Alignment shift of 3, 50 covariances to be calculated */
      ish = 3;
      kc = 350;
      lf = 80;

      if (ic == 0)
        nxyg = MAX(kc, lf);
      else
        nxyg = lf;

      /* Allocate arrays xg, yg, cxy and cyx */
      if (!(xg = NAG_ALLOC(nxyg, double)) ||
          !(yg = NAG_ALLOC(nxyg, double)) ||
          !(cxy = NAG_ALLOC(nc, double)) ||
          !(cyx = NAG_ALLOC(nc, double)) ||
          !(g = NAG_ALLOC((lf/2)+1, Complex)))
        {
          printf("Allocation failure\n");
          exit_status = -1;
          goto END;
        }

      if (ic == 0)
        {
          for (i = 1; i <= nxy; ++i)
            scanf("%lf", &xg[i-1]);
          scanf("%*[^\n] ");
          for (i = 1; i <= nxy; ++i)
            scanf("%lf", &yg[i-1]);
          scanf("%*[^\n] ");
        }
      else
        {
          for (i = 1; i <= nc; ++i)
            scanf("%lf", &cxy[i-1]);
          scanf("%*[^\n] ");
          for (i = 1; i <= nc; ++i)
            scanf("%lf", &cyx[i-1]);
          scanf("%*[^\n] ");
        }

      /* nag_tsa_spectrum_bivar_cov (g13ccc).
       * Multivariate time series, smoothed sample cross spectrum
       * using rectangular, Bartlett, Tukey or Parzen lag window
       */
      nag_tsa_spectrum_bivar_cov(nxy, mtxy, pxy, iw, mw, ish, ic, nc, cxy, cyx,
                                 kc, lf, xg, yg, g, &ng, &fail);
      if (fail.code != NE_NOERROR)
        {
          printf(
                  "Error from nag_tsa_spectrum_bivar_cov (g13ccc).\n%s\n",
                  fail.message);
          exit_status = 1;
          goto END;
        }

      printf("\n");
      printf("                  Returned cross covariances\n");
      printf("\n");
      printf(" Lag     XY       YX    Lag     XY       YX    Lag"
              "     XY       YX\n");
      for (i = 1; i <= nc; i += 3)
        {
          for (ii = i; ii <= MIN(i+2, nc); ++ii)
            printf("%4ld%9.4f%9.4f ", ii-1, cxy[ii-1],
                    cyx[ii-1]);
          printf("\n");
        }

      printf("\n");
      printf("                      Returned sample spectrum\n");
      printf("\n");
      printf("        Real  Imaginary        Real  Imaginary  "
              "      Real  Imaginary\n");
      printf(" Lag    part     part   Lag    part     part   Lag"
              "    part     part\n");
      for (i = 1; i <= ng; i += 3)
        {
          for (ii = i; ii <= MIN(i+2, ng); ++ii)
            printf("%4ld%9.4f%9.4f ", ii-1, g[ii-1].re,
                    g[ii-1].im);
          printf("\n");
        }
    }

 END:
  NAG_FREE(cxy);
  NAG_FREE(cyx);
  NAG_FREE(xg);
  NAG_FREE(yg);
  NAG_FREE(g);

  return exit_status;
}