/* nag_sum_fast_gauss (c06sac) Example Program.
*
* Copyright 2017 Numerical Algorithms Group.
*
* Mark 26.2, 2017.
*/
#include <stdio.h>
#include <nag.h>
#include <nag_stdlib.h>
#include <nagc06.h>
int main(void) {
/* Scalars */
Integer d, n, m, p1, p2, k, i, j;
Integer exit_status = 0;
double tol;
/* Arrays */
double *srcs = 0, *trgs = 0, *q = 0, *hin= 0, *v = 0, *term = 0;
/* Nag Types */
NagError fail;
INIT_FAIL(fail);
printf("nag_sum_fast_gauss (c06sac) Example Program Results\n");
/* Read dimensions of arrays from data file. */
scanf("%*[^\n] ");
scanf("%" NAG_IFMT "%" NAG_IFMT "%" NAG_IFMT "%*[^\n]", &d, &n, &m);
scanf("%" NAG_IFMT "%" NAG_IFMT "%" NAG_IFMT "%*[^\n]", &p1, &p2, &k);
scanf("%lf %*[^\n]", &tol);
/* Allocate arrays accordingly */
if (!(srcs = NAG_ALLOC((d * n), double)) ||
!(trgs = NAG_ALLOC((d * m), double)) ||
!(q = NAG_ALLOC((n), double)) ||
!(hin = NAG_ALLOC((n), double)) ||
!(v = NAG_ALLOC((m), double)) ||
!(term = NAG_ALLOC((m), double))
)
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read array values from data file */
for(i=0;i<n;i++){
scanf("%lf", &q[i]);
}
scanf("%*[^\n]");
for(i=0;i<n;i++){
scanf("%lf", &hin[i]);
}
scanf("%*[^\n]");
/* Data in file is stored by column but it is read into rows here
* First for sources
*/
#define SRCS(I, J) srcs[(J-1)*d + I - 1]
for(j=1; j<=n; j++) {
for(i=1; i<=d; i++) {
scanf("%lf", &SRCS(i,j));
}
}
scanf("%*[^\n]");
#define TRGS(I, J) trgs[(J-1)*d + I - 1]
/* And then for targets */
for(j=1; j<=m; j++){
for(i=1; i<=d; i++){
scanf("%lf", &TRGS(i,j));
}
}
nag_sum_fast_gauss(d, srcs, n, trgs, m, q, &p1, &p2,
&k, hin, n, tol, v, term, &fail);
if (fail.code != NE_NOERROR ) {
printf("Error from nag_sum_fast_gauss (c06sac).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
printf("\n y FGT(y) term\n\n");
for(i=0; i<m; i++){
for (j=0; j<d; j++)
printf(" %4.1f",trgs[d*i+j]);
printf(" %8.3f %8.6f\n",v[i],term[i]);
}
END:
NAG_FREE(srcs);
NAG_FREE(trgs);
NAG_FREE(q);
NAG_FREE(hin);
NAG_FREE(v);
NAG_FREE(term);
return exit_status;
}