#include <stdio.h>
#include <sys/time.h>
#include "nrutil.h"
#include <math.h>
#define N 512
main()
{
/* Timer stuff */
struct timeval time1,time2;
double rtime,mflop;
/* Stuff for LAPACK call */
int NL=N,NRHS=1,LDA=N,*IPIV,LDB=N,INFO;
/* Declare arrays and variables */
double **M1,*v1;
double **M2,*v2;
double **M3,*v3;
double tmp,error=0.;
int *indx;
int i,j;
M1=dmatrix(1,N,1,N);
M2=dmatrix(1,N,1,N);
M3=dmatrix(1,N,1,N);
v1=dvector(1,N);
v2=dvector(1,N);
v3=dvector(1,N);
indx=ivector(1,N);
IPIV=ivector(1,N);
/* Matrices and vectors */
for (i=1; i<=N; i++)
for (j=1; j<=N; j++) {
M1[i][j]=1./(1+i+j);
M2[i][j]=1./(1+i+j);
M3[i][j]=1./(1+i+j);
}
for (i=1; i<=N; i++) {
v1[i]=1./(1+i);
v2[i]=1./(1+i);
v3[i]=1./(1+i);
}
/* Numerical Recipes */
gettimeofday(&time1,NULL);
ludcmpp480(M1,N,indx,&tmp); /* Get LU decomposition */
lubksbp480(M1,N,indx,v1); /* Use LU decomposition to solve equations */
gettimeofday(&time2,NULL);
/* Output timing */
mflop=(double) 2*N*N*N/3./1e6;
rtime=
(time2.tv_sec-time1.tv_sec)+(time2.tv_usec-time1.tv_usec)/1.e6;
printf("\n");
printf("Numrec: %.0lf MFLOP in %.3f sec ==> %.0lf MFLOPS.\n",
mflop,rtime,mflop/rtime);
/* LAPACK */
gettimeofday(&time1,NULL);
dgesv_(&NL,&NRHS,&M2[1][1],&LDA,&IPIV[1],&v2[1],&LDB,&INFO);
gettimeofday(&time2,NULL);
if (INFO!=0) {
printf("Error in LAPACK call: %d",INFO);
exit(1);
}
/* Output timing info */
mflop=(double) 2*N*N*N/3./1e6;
rtime=
(time2.tv_sec-time1.tv_sec)+(time2.tv_usec-time1.tv_usec)/1.e6;
printf("LAPACK: %.0lf MFLOP in %.3f sec ==> %.0lf MFLOPS.\n",
mflop,rtime,mflop/rtime);
/* Check results */
printf("\n");
for (i=1; i<=N; i++) {
tmp=-v3[i];
for (j=1; j<=N; j++)
tmp+=M3[i][j]*v1[j];
error+=tmp*tmp;
}
printf("Numerical Recipes rms error: %e\n",sqrt(error/N));
for (i=1; i<=N; i++) {
tmp=-v3[i];
for (j=1; j<=N; j++)
tmp+=M3[i][j]*v2[j];
error+=tmp*tmp;
}
printf("LAPACK rms error: %e\n",sqrt(error/N));
printf("\n");
}