3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * GROningen Mixture of Alchemy and Childrens' Stories
39 #include "gromacs/utility/smalloc.h"
40 #include "gromacs/fileio/xvgr.h"
45 void testfft(FILE *fp,t_complex ***grid,int nx,int ny,int nz,gmx_bool bFirst)
49 static zomplex *coeff;
51 static complex *coeff;
56 real *gptr,*fqqq,fg,fac;
57 int ntot,i,j,k,m,n,ndim[4];
67 fqqq = &(grid[0][0][0].re);
71 fprintf(fp,"Going to use SGI optimized FFT routines.\n");
73 coeff = zfft3di(nx,ny,nz,NULL);
75 coeff = cfft3di(nx,ny,nz,NULL);
82 zfft3d(1,nx,ny,nz,(zomplex *)cptr,la1,la2,coeff);
84 cfft3d(1,nx,ny,nz,(complex *)cptr,la1,la2,coeff);
87 fourn(fqqq-1,ndim,3,1);
92 zfft3d(-1,nx,ny,nz,(zomplex *)cptr,la1,la2,coeff);
94 cfft3d(-1,nx,ny,nz,(complex *)cptr,la1,la2,coeff);
97 fourn(fqqq-1,ndim,3,-1);
101 void testrft(FILE *fp,real ***grid,int nx,int ny,int nz,gmx_bool bFirst)
105 static double *coeff;
112 real *gptr,*fqqq,fg,fac;
113 int ntot,i,j,k,m,n,ndim[4];
123 fqqq = &(grid[0][0][0]);
127 fprintf(fp,"Going to use SGI optimized FFT routines.\n");
129 coeff = dfft3di(nx,ny,nz,NULL);
131 coeff = sfft3di(nx,ny,nz,NULL);
139 dzfft3d(job,nx,ny,nz,cptr,la1,la2,coeff);
141 scfft3d(job,nx,ny,nz,cptr,la1,la2,coeff);
144 fourn(fqqq-1,ndim,3,1);
151 zdfft3d(job,nx,ny,nz,cptr,la1,la2,coeff);
153 csfft3d(job,nx,ny,nz,cptr,la1,la2,coeff);
156 fourn(fqqq-1,ndim,3,-1);
160 int main(int argc,char *argv[])
163 int nnn[] = { 8, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40,
164 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 100 };
165 #define NNN asize(nnn)
167 int i,j,n,nit,ntot,n3;
177 for(i=0; (i<NNN); i++) {
179 fprintf(stderr,"\rReal %d ",n);
190 h = mk_rgrid(n+2,n,n);
192 for(j=0; (j<nit); j++) {
193 testrft(stdout,h,n,n,n,(j==0));
199 fprintf(stderr,"\rComplex %d ",n);
202 for(j=0; (j<nit); j++) {
203 testfft(stdout,g,n,n,n,(j==0));
209 fprintf(stderr,"\n");
210 fp=xvgropen("timing.xvg","FFT timings per grid point","n","t (s)");
211 for(i=0; (i<NNN); i++) {
212 n3 = 2*niter[i]*nnn[i]*nnn[i]*nnn[i];
213 fprintf(fp,"%10d %10g %10g\n",nnn[i],rt[i]/n3,ct[i]/n3);