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

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

Modifs FFTServerInterface + FFTPackServer (Suite - Fin ?) - Reza 13/2/2001

File size: 6.6 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 > &, bool)
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 > &, bool)
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 bool usoutsz)
187{
188 int k;
189 string msg;
190 if (in.Size() < 1) {
191 msg = _msg + "CheckResize(complex in, real out) - Unallocated input array !";
192 throw(SzMismatchError(msg));
193 }
194 if (_checkpack)
195 if ( !in.IsPacked() ) {
196 msg = _msg + "CheckResize(complex in, real out) - Not packed input array !";
197 throw(SzMismatchError(msg));
198 }
199 int ndg1 = 0;
200 for(k=0; k<in.NbDimensions(); k++)
201 if (in.Size(k) > 1) ndg1++;
202 if (_onedonly)
203 if (ndg1 > 1) {
204 msg = _msg + "CheckResize(complex in, real out) - Only 1-D array accepted !";
205 throw(SzMismatchError(msg));
206 }
207 if (usoutsz) { // We have to use output array size
208 bool fgerr = false;
209 if (ndg1 > 1) {
210 if (in.Size(0) != out.Size(0)/2+1) fgerr = true;
211 }
212 else {
213 if (in.Size(in.MaxSizeKA()) != out.Size(in.MaxSizeKA())/2+1) fgerr = true;
214 }
215 if (fgerr) {
216 msg = _msg + "CheckResize(complex in, real out) - Incompatible in-out sizes !";
217 throw(SzMismatchError(msg));
218 }
219 }
220 else { // We have to resize the output array
221 sa_size_t sz[BASEARRAY_MAXNDIMS];
222 if (ndg1 > 1) {
223 sz[0] = 2*in.Size(0)-1;
224 for(k=1; k<in.NbDimensions(); k++)
225 sz[k] = in.Size(k);
226 // sz[k] = in.Size(k)*2-1;
227 }
228 else {
229 for(k=0; k<BASEARRAY_MAXNDIMS; k++) sz[k] = 1;
230 T thr = ZeroThreshold();
231 sa_size_t n = in.Size(in.MaxSizeKA());
232 sa_size_t ncs = ( (in[n-1].imag() < -thr) || (in[n-1].imag() > thr) ) ?
233 ncs = 2*n-1 : ncs = 2*n-2;
234 sz[in.MaxSizeKA()] = ncs;
235 }
236 out.ReSize(in.NbDimensions(), sz);
237 }
238
239 return(ndg1);
240
241}
242
243
244#ifdef __CXX_PRAGMA_TEMPLATES__
245#pragma define_template FFTArrayChecker<r_4>
246#pragma define_template FFTArrayChecker<r_8>
247#endif
248
249#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
250template class FFTArrayChecker<r_4>;
251template class FFTArrayChecker<r_8>;
252#endif
Note: See TracBrowser for help on using the repository browser.