2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2008, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012,2013, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
50 #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
52 void four1(real data[],int nn,int isign)
54 int n,mmax,m,j,istep,i;
55 double wtemp,wr,wpr,wpi,wi,theta;
62 SWAP(data[j],data[i]);
63 SWAP(data[j+1],data[i+1]);
66 while (m >= 2 && j > m) {
75 theta=6.28318530717959/(isign*mmax);
77 wpr = -2.0*wtemp*wtemp;
81 for (m=1;m<mmax;m+=2) {
82 for (i=m;i<=n;i+=istep) {
84 tempr=wr*data[j]-wi*data[j+1];
85 tempi=wr*data[j+1]+wi*data[j];
86 data[j]=data[i]-tempr;
87 data[j+1]=data[i+1]-tempi;
91 wr=(wtemp=wr)*wpr-wi*wpi+wr;
92 wi=wi*wpr+wtemp*wpi+wi;
100 static void realft(real data[],int n,int isign)
102 int i,i1,i2,i3,i4,n2p3;
103 real c1=0.5,c2,h1r,h1i,h2r,h2i;
104 double wr,wi,wpr,wpi,wtemp,theta;
106 theta=3.141592653589793/(double) n;
114 wtemp=sin(0.5*theta);
115 wpr = -2.0*wtemp*wtemp;
120 for (i=2;i<=n/2;i++) {
121 i4=1+(i3=n2p3-(i2=1+(i1=i+i-1)));
122 h1r=c1*(data[i1]+data[i3]);
123 h1i=c1*(data[i2]-data[i4]);
124 h2r = -c2*(data[i2]+data[i4]);
125 h2i=c2*(data[i1]-data[i3]);
126 data[i1]=h1r+wr*h2r-wi*h2i;
127 data[i2]=h1i+wr*h2i+wi*h2r;
128 data[i3]=h1r-wr*h2r+wi*h2i;
129 data[i4] = -h1i+wr*h2i+wi*h2r;
130 wr=(wtemp=wr)*wpr-wi*wpi+wr;
131 wi=wi*wpr+wtemp*wpi+wi;
134 data[1] = (h1r=data[1])+data[2];
135 data[2] = h1r-data[2];
137 data[1]=c1*((h1r=data[1])+data[2]);
138 data[2]=c1*(h1r-data[2]);
143 static void twofft(real data1[],real data2[],real fft1[],real fft2[],int n)
146 real rep,rem,aip,aim;
149 for (j=1,jj=2;j<=n;j++,jj+=2) {
156 for (j=3;j<=n+1;j+=2) {
157 rep=0.5*(fft1[j]+fft1[nn2-j]);
158 rem=0.5*(fft1[j]-fft1[nn2-j]);
159 aip=0.5*(fft1[j+1]+fft1[nn3-j]);
160 aim=0.5*(fft1[j+1]-fft1[nn3-j]);
172 void correl(real data1[],real data2[],int n,real ans[])
178 twofft(data1,data2,fft,ans,n);
180 for (i=2;i<=n+2;i+=2) {
182 ans[i-1] = (fft[i-1]*dum+fft[i]*ans[i])/no2;
183 ans[i] = (fft[i]*dum-fft[i-1]*ans[i])/no2;