source: Sophya/trunk/SophyaLib/NTools/fftservintf.cc@ 1400

Last change on this file since 1400 was 1400, checked in by ansari, 25 years ago

Modifs-debug FFTServerInterface FFTPackServer - Reza 13/2/2001

File size: 7.0 KB
Line 
1#include "fftservintf.h"
2
3
4/*!
5 \class SOPHYA::FFTServerInterface
6 \ingroup NTools
7 Defines the interface for FFT (Fast Fourier Transform) operations.
8*/
9
10/* --Methode-- */
11FFTServerInterface::FFTServerInterface(string info)
12{
13 _info = info;
14 _fgnorm = true;
15}
16
17/* --Methode-- */
18FFTServerInterface::~FFTServerInterface()
19{
20}
21
22// ----------------- Transforme pour les double -------------------
23
24/* --Methode-- */
25void FFTServerInterface::FFTForward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
26{
27 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
28}
29
30/* --Methode-- */
31void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
32{
33 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
34}
35
36/* --Methode-- */
37void FFTServerInterface::FFTForward(TArray< r_8 > const &, TArray< complex<r_8> > &)
38{
39 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
40}
41
42/* --Methode-- */
43void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< r_8 > &)
44{
45 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
46}
47
48
49// ----------------- Transforme pour les float -------------------
50
51/* --Methode-- */
52void FFTServerInterface::FFTForward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &)
53{
54 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !");
55}
56
57/* --Methode-- */
58void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &)
59{
60 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !");
61}
62
63/* --Methode-- */
64void FFTServerInterface::FFTForward(TArray< r_4 > const &, TArray< complex<r_4> > &)
65{
66 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !");
67}
68
69/* --Methode-- */
70void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< r_4 > &)
71{
72 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !");
73}
74
75
76
77/* --Methode-- */
78template <class T>
79FFTArrayChecker<T>::FFTArrayChecker(string msg, bool checkpack, bool onedonly)
80{
81 _msg = msg + " FFTArrayChecker::";
82 _checkpack = checkpack;
83 _onedonly = onedonly;
84}
85
86/* --Methode-- */
87template <class T>
88FFTArrayChecker<T>::~FFTArrayChecker()
89{
90}
91
92template <class T>
93T FFTArrayChecker<T>::ZeroThreshold()
94{
95 return(0);
96}
97
98r_8 FFTArrayChecker< r_8 >::ZeroThreshold()
99{
100 return(1.e-18);
101}
102
103r_4 FFTArrayChecker< r_4 >::ZeroThreshold()
104{
105 return(1.e-9);
106}
107
108
109
110/* --Methode-- */
111template <class T>
112int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< complex<T> > & out)
113{
114 int k;
115 string msg;
116 if (in.Size() < 1) {
117 msg = _msg + "CheckResize(complex in, complex out) - Unallocated input array !";
118 throw(SzMismatchError(msg));
119 }
120 if (_checkpack)
121 if ( !in.IsPacked() ) {
122 msg = _msg + "CheckResize(complex in, complex out) - Not packed input array !";
123 throw(SzMismatchError(msg));
124 }
125 int ndg1 = 0;
126 for(k=0; k<in.NbDimensions(); k++)
127 if (in.Size(k) > 1) ndg1++;
128 if (_onedonly)
129 if (ndg1 > 1) {
130 msg = _msg + "CheckResize(complex in, complex out) - Only 1-D array accepted !";
131 throw(SzMismatchError(msg));
132 }
133 out.ReSize(in);
134 // sa_size_t sz[BASEARRAY_MAXNDIMS];
135 // for(k=0; k<in.NbDimensions(); k++)
136 // sz[k] = in.Size(k);
137 // out.ReSize(in.NbDimensions(), sz);
138
139 return(ndg1);
140}
141
142/* --Methode-- */
143template <class T>
144int FFTArrayChecker<T>::CheckResize(TArray< T > const & in, TArray< complex<T> > & out)
145{
146 int k;
147 string msg;
148 if (in.Size() < 1) {
149 msg = _msg + "CheckResize(real in, complex out) - Unallocated input array !";
150 throw(SzMismatchError(msg));
151 }
152 if (_checkpack)
153 if ( !in.IsPacked() ) {
154 msg = _msg + "CheckResize(real in, complex out) - Not packed input array !";
155 throw(SzMismatchError(msg));
156 }
157 int ndg1 = 0;
158 for(k=0; k<in.NbDimensions(); k++)
159 if (in.Size(k) > 1) ndg1++;
160 if (_onedonly)
161 if (ndg1 > 1) {
162 msg = _msg + "CheckResize(real in, complex out) - Only 1-D array accepted !";
163 throw(SzMismatchError(msg));
164 }
165 sa_size_t sz[BASEARRAY_MAXNDIMS];
166 //
167 if (ndg1 > 1) {
168 sz[0] = in.Size(0)/2+1;
169 for(k=1; k<in.NbDimensions(); k++)
170 sz[k] = in.Size(k);
171 }
172 else {
173 for(k=0; k<BASEARRAY_MAXNDIMS; k++) sz[k] = 1;
174 sz[in.MaxSizeKA()] = in.Size(in.MaxSizeKA())/2+1;
175 // sz[k] = in.Size(k)/2+1;
176 // sz[k] = (in.Size(k)%2 != 0) ? in.Size(k)/2+1 : in.Size(k)/2;
177 }
178 out.ReSize(in.NbDimensions(), sz);
179
180 return(ndg1);
181}
182
183/* --Methode-- */
184template <class T>
185int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< T > & out)
186{
187 int k;
188 string msg;
189 if (in.Size() < 1) {
190 msg = _msg + "CheckResize(complex in, real out) - Unallocated input array !";
191 throw(SzMismatchError(msg));
192 }
193 if (_checkpack)
194 if ( !in.IsPacked() ) {
195 msg = _msg + "CheckResize(complex in, real out) - Not packed input array !";
196 throw(SzMismatchError(msg));
197 }
198 int ndg1 = 0;
199 for(k=0; k<in.NbDimensions(); k++)
200 if (in.Size(k) > 1) ndg1++;
201 if (_onedonly)
202 if (ndg1 > 1) {
203 msg = _msg + "CheckResize(complex in, real out) - Only 1-D array accepted !";
204 throw(SzMismatchError(msg));
205 }
206 sa_size_t sz[BASEARRAY_MAXNDIMS];
207 if (ndg1 > 1) {
208 sz[0] = 2*in.Size(0)-1;
209 for(k=1; k<in.NbDimensions(); k++)
210 sz[k] = in.Size(k);
211 // sz[k] = in.Size(k)*2-1;
212 }
213 else {
214 for(k=0; k<BASEARRAY_MAXNDIMS; k++) sz[k] = 1;
215 T thr = ZeroThreshold();
216 sa_size_t n = in.Size(in.MaxSizeKA());
217 sa_size_t ncs = ( (in[n-1].imag() < -thr) || (in[n-1].imag() > thr) ) ?
218 ncs = 2*n-1 : ncs = 2*n-2;
219 sz[in.MaxSizeKA()] = ncs;
220 }
221
222 out.ReSize(in.NbDimensions(), sz);
223
224 return(ndg1);
225
226}
227
228/* --Methode--
229template <class T>
230void FFTArrayChecker<T>::ReShapetoReal( TArray< complex<T> > const & in, TArray< T > & out)
231{
232 sa_size_t n = in.Size();
233 // int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2;
234 sa_size_t ncs = 2*n-1;
235 sa_size_t k;
236 out[0] = in[0].real();
237 for(k=1;k<n-1;k++) {
238 out[2*k-1] = in[k].real();
239 out[2*k] = in[k].imag();
240 }
241 // if (ncs == n*2-2) out[ncs-1] = in[n-1].real();
242 // else { out[ncs-2] = in[n-1].real(); out[ncs-1] = in[n-1].imag(); }
243 out[ncs-2] = in[n-1].real(); out[ncs-1] = in[n-1].imag();
244}
245*/
246
247/* --Methode--
248template <class T>
249void FFTArrayChecker<T>::ReShapetoCompl(TArray< T > const & in, TArray< complex<T> > & out)
250{
251 sa_size_t n = in.Size();
252 sa_size_t ncs = n/2+1;
253 sa_size_t nc = (n%2 != 0) ? n/2+1 : n/2;
254 out[0] = complex<T> (in[0],0.);
255 for(int k=1;k<nc;k++)
256 out[k] = complex<T> (in[2*k-1], in[2*k]);
257 if (n%2 == 0) out[ncs-1] = complex<r_8>(in[n-1], 0.);
258}
259*/
260
261#ifdef __CXX_PRAGMA_TEMPLATES__
262#pragma define_template FFTArrayChecker<r_4>
263#pragma define_template FFTArrayChecker<r_8>
264#endif
265
266#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
267template class FFTArrayChecker<r_4>;
268template class FFTArrayChecker<r_8>;
269#endif
Note: See TracBrowser for help on using the repository browser.