/* Driver for routine rlft3 */

#include <stdio.h>
#include <math.h>
#define NRANSI
#include "nr.h"
#include "nrutil.h"
#define IPRNT 20

static unsigned long compare(char *string, float ***arr1, float ***arr2,
	unsigned long len1, unsigned long len2, unsigned long len3, float eps)
{
	unsigned long err=0,i1,i2,i3;
	float a1,a2;

	printf("%s\n",string);
	for (i1=1;i1<=len1;i1++)
		for (i2=1;i2<=len2;i2++)
			for (i3=1;i3<=len3;i3++) {
				a1=arr1[i1][i2][i3];
				a2=arr2[i1][i2][i3];
				if ((a2 == 0.0 && fabs(a1-a2) > eps) || (fabs((a1-a2)/a2) > eps)) {
					if (++err <= IPRNT)
						printf("%d %d %d %12.6f %12.6f\n",
							i1,i2,i3,a1,a2);
				}
			}
	return err;
}

#define NX 32
#define NY 8
#define NZ 16

#define EPS 0.0008

int main(void)
{
	long idum=(-3);
	unsigned long err,i,j,k,nn1=NX,nn2=NY,nn3=NZ;
	float fnorm,***data1,***data2,**speq1;

	fnorm=(float)nn1*(float)nn2*(float)nn3/2.0;
	data1=f3tensor(1,nn1,1,nn2,1,nn3);
	data2=f3tensor(1,nn1,1,nn2,1,nn3);
	speq1=matrix(1,nn1,1,nn2<<1);
	for (i=1;i<=nn1;i++)
		for (j=1;j<=nn2;j++)
			for (k=1;k<=nn3;k++)
				data2[i][j][k]=fnorm*(data1[i][j][k]=2*ran1(&idum)-1);
	rlft3(data1,speq1,nn1,nn2,nn3,1);
	/* here would be any processing in Fourier space */
	rlft3(data1,speq1,nn1,nn2,nn3,-1);
	err=compare("data",data1,data2,nn1,nn2,nn3,EPS);
	if (err) {
		printf("Comparison error at tolerance %12.6f\n",EPS);
		printf("Total number of errors is %d\n",err);
	}
	else {
		printf("Data compares OK to tolerance %12.6f\n",EPS);
	}
	free_matrix(speq1,1,nn1,1,nn2<<1);
	free_f3tensor(data2,1,nn1,1,nn2,1,nn3);
	free_f3tensor(data1,1,nn1,1,nn2,1,nn3);
	return (err > 0);
}
#undef NRANSI