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
RevLine 
[710]1#include "fftservintf.h"
2
3
[1371]4/*!
5 \class SOPHYA::FFTServerInterface
6 \ingroup NTools
7 Defines the interface for FFT (Fast Fourier Transform) operations.
8*/
[710]9
10/* --Methode-- */
11FFTServerInterface::FFTServerInterface(string info)
12{
13 _info = info;
[717]14 _fgnorm = true;
[710]15}
16
17/* --Methode-- */
18FFTServerInterface::~FFTServerInterface()
19{
20}
21
[1390]22// ----------------- Transforme pour les double -------------------
23
[710]24/* --Methode-- */
[1390]25void FFTServerInterface::FFTForward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
[710]26{
[1390]27 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
[710]28}
29
30/* --Methode-- */
[1390]31void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< complex<r_8> > &)
[710]32{
[1390]33 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
[710]34}
35
36/* --Methode-- */
[1390]37void FFTServerInterface::FFTForward(TArray< r_8 > const &, TArray< complex<r_8> > &)
[710]38{
[1390]39 throw NotAvailableOperation("FFTServer::FFTForward(TArray...) Unsupported operation !");
[710]40}
41
42/* --Methode-- */
[1402]43void FFTServerInterface::FFTBackward(TArray< complex<r_8> > const &, TArray< r_8 > &, bool)
[710]44{
[1390]45 throw NotAvailableOperation("FFTServer::FFTBackward(TArray...) Unsupported operation !");
[710]46}
47
[1390]48
49// ----------------- Transforme pour les float -------------------
50
[710]51/* --Methode-- */
[1390]52void FFTServerInterface::FFTForward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &)
[710]53{
[1390]54 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !");
[710]55}
56
57/* --Methode-- */
[1390]58void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< complex<r_4> > &)
[710]59{
[1390]60 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !");
[710]61}
62
63/* --Methode-- */
[1390]64void FFTServerInterface::FFTForward(TArray< r_4 > const &, TArray< complex<r_4> > &)
[710]65{
[1390]66 throw NotAvailableOperation("FFTServer::FFTForward(TArray r_4 ... ) Unsupported operation !");
[710]67}
68
69/* --Methode-- */
[1402]70void FFTServerInterface::FFTBackward(TArray< complex<r_4> > const &, TArray< r_4 > &, bool)
[710]71{
[1390]72 throw NotAvailableOperation("FFTServer::FFTBackward(TArray r_4 ... ) Unsupported operation !");
[710]73}
74
75
76
77/* --Methode-- */
[1390]78template <class T>
[1394]79FFTArrayChecker<T>::FFTArrayChecker(string msg, bool checkpack, bool onedonly)
[710]80{
[1394]81 _msg = msg + " FFTArrayChecker::";
[1390]82 _checkpack = checkpack;
83 _onedonly = onedonly;
[710]84}
85
86/* --Methode-- */
[1390]87template <class T>
88FFTArrayChecker<T>::~FFTArrayChecker()
[710]89{
90}
91
[1394]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
[710]110/* --Methode-- */
[1390]111template <class T>
112int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< complex<T> > & out)
[710]113{
[1390]114 int k;
[1394]115 string msg;
116 if (in.Size() < 1) {
117 msg = _msg + "CheckResize(complex in, complex out) - Unallocated input array !";
118 throw(SzMismatchError(msg));
119 }
[1390]120 if (_checkpack)
[1394]121 if ( !in.IsPacked() ) {
122 msg = _msg + "CheckResize(complex in, complex out) - Not packed input array !";
123 throw(SzMismatchError(msg));
124 }
[1390]125 int ndg1 = 0;
126 for(k=0; k<in.NbDimensions(); k++)
127 if (in.Size(k) > 1) ndg1++;
128 if (_onedonly)
[1394]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);
[1390]138
139 return(ndg1);
[710]140}
141
142/* --Methode-- */
[1390]143template <class T>
144int FFTArrayChecker<T>::CheckResize(TArray< T > const & in, TArray< complex<T> > & out)
[710]145{
[1390]146 int k;
[1394]147 string msg;
148 if (in.Size() < 1) {
149 msg = _msg + "CheckResize(real in, complex out) - Unallocated input array !";
150 throw(SzMismatchError(msg));
151 }
[1390]152 if (_checkpack)
[1394]153 if ( !in.IsPacked() ) {
154 msg = _msg + "CheckResize(real in, complex out) - Not packed input array !";
155 throw(SzMismatchError(msg));
156 }
[1390]157 int ndg1 = 0;
158 for(k=0; k<in.NbDimensions(); k++)
159 if (in.Size(k) > 1) ndg1++;
160 if (_onedonly)
[1394]161 if (ndg1 > 1) {
162 msg = _msg + "CheckResize(real in, complex out) - Only 1-D array accepted !";
163 throw(SzMismatchError(msg));
164 }
[1390]165 sa_size_t sz[BASEARRAY_MAXNDIMS];
[1400]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 }
[1390]178 out.ReSize(in.NbDimensions(), sz);
179
180 return(ndg1);
[710]181}
182
183/* --Methode-- */
[1390]184template <class T>
[1402]185int FFTArrayChecker<T>::CheckResize(TArray< complex<T> > const & in, TArray< T > & out,
186 bool usoutsz)
[710]187{
[1390]188 int k;
[1394]189 string msg;
190 if (in.Size() < 1) {
191 msg = _msg + "CheckResize(complex in, real out) - Unallocated input array !";
192 throw(SzMismatchError(msg));
193 }
[1390]194 if (_checkpack)
[1394]195 if ( !in.IsPacked() ) {
196 msg = _msg + "CheckResize(complex in, real out) - Not packed input array !";
197 throw(SzMismatchError(msg));
198 }
[1390]199 int ndg1 = 0;
200 for(k=0; k<in.NbDimensions(); k++)
201 if (in.Size(k) > 1) ndg1++;
202 if (_onedonly)
[1394]203 if (ndg1 > 1) {
204 msg = _msg + "CheckResize(complex in, real out) - Only 1-D array accepted !";
205 throw(SzMismatchError(msg));
206 }
[1402]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);
[1400]226 // sz[k] = in.Size(k)*2-1;
[1402]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);
[1394]237 }
238
[1390]239 return(ndg1);
240
[710]241}
242
243
[1390]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.