fftpack.h 6.76 KB
Newer Older
1
/*
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* This file contains a Fortran to C translation of the 1D transformations
* based on the original FFTPACK, written by paul n swarztrauber
* at the national center for atmospheric research and available
* at www.netlib.org. FFTPACK is in the public domain.
*
* Higher-dimension transforms written by Erik Lindahl, 2008-2009.
* Just as FFTPACK, this file may be redistributed freely, and can be
* considered to be in the public domain. 
*
* Any errors in this (threadsafe, but not threaded) C version
* are probably due to the f2c translator, or hacks by Erik Lindahl,
* rather than FFTPACK. If you find a bug, it would be great if you could
* drop a line to lindahl@cbr.su.se and let me know about it!
*/
16

17
18
19
20
21
22
#ifndef _FFTPACK_H_
#define _FFTPACK_H_


#include <stdio.h>

23
#include "openmm/internal/windowsExport.h"
24
25
26
27
28
29
30
31
32

#ifdef __cplusplus
extern "C" {
#endif
#if 0
} /* fixes auto-indentation problems */
#endif


33
34
class t_complex {
public:
peastman's avatar
peastman committed
35
36
    double re;
    double im;
37
38
    t_complex() : re(0.0), im(0.0) {
    }
peastman's avatar
peastman committed
39
    t_complex(double re, double im) : re(re), im(im) {
40
41
42
    }
    t_complex(const t_complex& c) : re(c.re), im(c.im) {
    }
peastman's avatar
peastman committed
43
    t_complex operator*(double r) {
44
45
46
47
48
49
50
51
        return t_complex(re*r, im*r);
    }
    t_complex operator+(const t_complex& c) const {
        return t_complex(re+c.re, im+c.im);
    }
    t_complex operator-(const t_complex& c) const {
        return t_complex(re-c.re, im-c.im);
    }
52
    t_complex& operator+=(const t_complex& c) {
53
54
        re += c.re;
        im += c.im;
55
        return *this;
56
    }
57
    t_complex& operator-=(const t_complex& c) {
58
59
        re -= c.re;
        im -= c.im;
60
        return *this;
61
62
    }
};
63
64


65
/*! \brief Datatype for FFT setup
66
67
 *
 *  The fftpack_t type contains all the setup information, e.g. twiddle
68
 *  factors, necessary to perform an FFT. Internally it is mapped to
69
70
71
72
73
74
75
76
77
 *  whatever FFT library we are using, or the built-in FFTPACK if no fast
 *  external library is available.
 */
typedef struct fftpack *
fftpack_t;




78
/*! \brief Specifier for FFT direction.
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 *
 *  The definition of the 1D forward transform from input x[] to output y[] is
 *  \f[
 *  y_{k} = \sum_{j=0}^{N-1} x_{j} \exp{-i 2 \pi j k /N}
 *  \f]
 *
 *  while the corresponding backward transform is
 *
 *  \f[
 *  y_{k} = \sum_{j=0}^{N-1} x_{j} \exp{i 2 \pi j k /N}
 *  \f]
 *
 *  A forward-backward transform pair will this result in data scaled by N.
 *
 */
typedef enum fftpack_direction
{
    FFTPACK_FORWARD,         /*!< Forward complex-to-complex transform  */
    FFTPACK_BACKWARD,        /*!< Backward complex-to-complex transform */
} fftpack_direction;



102
/*! \brief Setup a 1-dimensional complex-to-complex transform
103
104
 *
 *  \param fft    Pointer to opaque Gromacs FFT datatype
105
 *  \param nx     Length of transform
106
107
108
109
 *
 *  \return status - 0 or a standard error message.
 */
int
110
OPENMM_EXPORT
111
112
113
114
115
fftpack_init_1d        (fftpack_t *       fft,
                        int               nx);



116
/*! \brief Setup a 2-dimensional complex-to-complex transform
117
118
119
120
121
122
 *
 *  \param fft    Pointer to opaque Gromacs FFT datatype
 *  \param nx     Length of transform in first dimension
 *  \param ny     Length of transform in second dimension
 *
 *  \return status - 0 or a standard error message.
123
 *
124
125
 */
int
126
OPENMM_EXPORT
127
fftpack_init_2d        (fftpack_t *         fft,
128
                        int                 nx,
129
130
131
132
133
                        int                 ny);




134
/*! \brief Setup a 3-dimensional complex-to-complex transform
135
136
137
138
139
140
141
 *
 *  \param fft    Pointer to opaque Gromacs FFT datatype
 *  \param nx     Length of transform in first dimension
 *  \param ny     Length of transform in second dimension
 *  \param nz     Length of transform in third dimension
 *
 *  \return status - 0 or a standard error message.
142
 *
143
144
 */
int
145
OPENMM_EXPORT
146
fftpack_init_3d        (fftpack_t *         fft,
147
                        int                 nx,
148
149
150
151
152
153
154
155
156
157
158
159
                        int                 ny,
                        int                 nz);




/*! \brief Perform a 1-dimensional complex-to-complex transform
 *
 *  Performs an instance of a transform previously initiated.
 *
 *  \param setup     Setup returned from fftpack_init_1d()
 *  \param dir       Forward or Backward
160
161
 *  \param in_data   Input grid data.
 *  \param out_data  Output grid data.
162
163
164
165
166
 *                   You can provide the same pointer for in_data and out_data
 *                   to perform an in-place transform.
 *
 * \return 0 on success, or an error code.
 *
167
 * \note Data pointers are declared as void, to avoid casting pointers
168
169
 *       depending on your grid type.
 */
170
int
171
OPENMM_EXPORT
172
173
174
175
176
177
178
179
180
181
182
fftpack_exec_1d          (fftpack_t                  setup,
                          enum fftpack_direction     dir,
                          t_complex *                in_data,
                          t_complex *                out_data);

/*! \brief Perform a 2-dimensional complex-to-complex transform
 *
 *  Performs an instance of a transform previously initiated.
 *
 *  \param setup     Setup returned from fftpack_init_1d()
 *  \param dir       Forward or Backward
183
184
 *  \param in_data   Input grid data.
 *  \param out_data  Output grid data.
185
186
187
188
189
 *                   You can provide the same pointer for in_data and out_data
 *                   to perform an in-place transform.
 *
 * \return 0 on success, or an error code.
 *
190
 * \note Data pointers are declared as void, to avoid casting pointers
191
192
 *       depending on your grid type.
 */
193
int
194
OPENMM_EXPORT
195
196
197
198
199
200
201
202
203
204
205
206
fftpack_exec_2d          (fftpack_t                  setup,
                          enum fftpack_direction     dir,
                          t_complex *                in_data,
                          t_complex *                out_data);


/*! \brief Perform a 3-dimensional complex-to-complex transform
 *
 *  Performs an instance of a transform previously initiated.
 *
 *  \param setup     Setup returned from fftpack_init_1d()
 *  \param dir       Forward or Backward
207
208
 *  \param in_data   Input grid data.
 *  \param out_data  Output grid data.
209
210
211
212
213
 *                   You can provide the same pointer for in_data and out_data
 *                   to perform an in-place transform.
 *
 * \return 0 on success, or an error code.
 *
214
 * \note Data pointers are declared as void, to avoid casting pointers
215
216
 *       depending on your grid type.
 */
217
int
218
OPENMM_EXPORT
219
220
221
222
223
224
fftpack_exec_3d          (fftpack_t                  setup,
                          enum fftpack_direction     dir,
                          t_complex *                in_data,
                          t_complex *                out_data);


225
/*! \brief Release an FFT setup structure
226
227
228
229
 *
 *  Destroy setup and release all allocated memory.
 *
 *  \param setup Setup returned from fftpack_init_1d(), or one
230
 *         of the other initializers.
231
232
233
 *
 */
void
234
OPENMM_EXPORT
235
236
237
238
239
240
241
242
243
fftpack_destroy          (fftpack_t                 setup);



#ifdef __cplusplus
}
#endif

#endif /* _FFTPACK_H_ */