Changeset 1395 in Sophya for trunk/SophyaExt
- Timestamp:
- Feb 12, 2001, 6:09:47 PM (25 years ago)
- Location:
- trunk/SophyaExt/IFFTW
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/IFFTW/fftwserver.cc
r1391 r1395 127 127 FFTWServer::FFTWServer() 128 128 : FFTServerInterface("FFTServer using FFTW package") 129 , ckR4(true, false) , ckR8(true, false)129 , ckR8("FFTWServer - ", true, false) 130 130 131 131 { … … 185 185 fftwnd_one(_pndf->pnd, (fftw_complex *)(in.Data()) , (fftw_complex *)(out.Data()) ); 186 186 } 187 // $CHECK$ Reza 9/2/2001 , Verifier normalisation 188 if(this->getNormalize()) out=out/complex<r_8>(sqrt((double)in.Size()),0.); 187 if(this->getNormalize()) out=out/complex<r_8>((double)in.Size(),0.); 189 188 return; 190 189 } … … 211 210 else _pndb = new FFTWServerPlan(in.NbDimensions(), sz, FFTW_BACKWARD, false); 212 211 } 213 // $CHECK$ Reza 9/2/2001 , Verifier normalisation 214 if(this->getNormalize()) out=out/complex<r_8>(sqrt((double)in.Size()),0.); 212 215 213 return; 216 214 } … … 242 240 (fftw_complex *)(out.Data()) ); 243 241 } 244 // $CHECK$ Reza 9/2/2001 , Verifier normalisation 245 if(this->getNormalize()) out=out/complex<r_8>(sqrt((double)in.Size()),0.); 242 if(this->getNormalize()) out=out/complex<r_8>((double)in.Size(),0.); 246 243 return; 247 244 … … 252 249 void FFTWServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out) 253 250 { 254 throw ParmError("FFTWServer::FFTBackward(TArray< complex<r_8> > ... Not implemented ... !"); 255 /* 256 int size; 257 if(in(in.NElts()).imag() == 0) { size = 2*in.NElts()-2;} 258 else { size = 2*in.NElts()-1;} 259 260 TArray< r_8 > inTemp(size); 261 out.ReSize(size); 262 263 if (_p1drb) _p1drb->Recreate(size); 264 else _p1drb = new FFTWServerPlan(size, FFTW_COMPLEX_TO_REAL, true); 265 266 ReShapetoReal(in, inTemp); 267 rfftw_one(_p1drb->rp, (fftw_real *)(inTemp.Data()) , (fftw_real *)(out.Data())); 268 if(this->getNormalize()) out=out/pow(size,0.5); 269 */ 251 252 int rank = ckR8.CheckResize(in, out); 253 if (rank == 1) { // One dimensional transform 254 TArray<r_8> intemp(out, false); 255 if (_p1drb) _p1drb->Recreate(out.Size()); 256 else _p1drb = new FFTWServerPlan(out.Size(), FFTW_COMPLEX_TO_REAL, true); 257 258 ReShapetoReal(in, intemp); 259 cerr << " DEBUG-FFTWServer::FFTBackward() in = \n" << in << endl; 260 cerr << " DEBUG-FFTWServer::FFTBackward() intemp = \n" << intemp << endl; 261 rfftw_one(_p1drb->rp, (fftw_real *)(intemp.Data()) , (fftw_real *)(out.Data())); 262 263 } 264 else { // Multi dimensional 265 if (in.NbDimensions() > MAXND_FFTW) 266 throw ParmError("FFTWServer::FFTForward( complex<r_8>, complex<r_8> ) rank > MAXND_FFTW !"); 267 int sz[MAXND_FFTW]; 268 int k1 = 0; 269 int k2 = 0; 270 for(k1=in.NbDimensions()-1; k1>=0; k1--) { 271 sz[k2] = in.Size(k1); k2++; 272 } 273 if (_pndrb) _pndrb->Recreate(in.NbDimensions(), sz); 274 else _pndrb = new FFTWServerPlan(in.NbDimensions(), sz, FFTW_COMPLEX_TO_REAL, true); 275 276 rfftwnd_one_complex_to_real(_pndrb->rpnd, (fftw_complex *)(in.Data()) , (fftw_real *)(out.Data()) ); 277 } 278 return; 270 279 } 271 280 … … 336 345 337 346 /* --Methode-- */ 338 void FFTWServer::ReShapetoReal( TArray< complex<r_8> > const & in, TArray< r_8 > & out) 339 { 340 int N = in.Size(); 341 /* 342 int i; 343 if (in(in.Size()).imag() == 0) 344 { 345 out(0) = in(0).real(); 346 for(i=1; i<in.NElts(); i++) 347 { 348 out(i) = in(i).real(); 349 } 350 for(i=1; i<in.NElts(); i++) 351 { 352 out(i+in.NElts()-1) = in(in.NElts()-i-1).imag(); 353 } 354 } 355 else 356 { 357 out(0) = in(0).real(); 358 for(i=1; i<in.NElts(); i++) 359 { 360 out(i) = in(i).real(); 361 } 362 for(i=1; i<in.NElts(); i++) 363 { 364 out(i+in.NElts()-1) = in(in.NElts()-i).imag(); 365 } 366 } 367 */ 368 out[0] = in[0].real(); 369 int k=0; 370 for(int i=1; i<N; i++) { 371 out[i] = in[i].real(); 372 out[N-i] = in[i].imag(); 373 } 347 void FFTWServer::ReShapetoReal(TArray< complex<r_8> > const & ina, TArray< r_8 > & outa) 348 { 349 TVector< complex<r_8> > in(ina); 350 TVector< r_8> out(outa); 351 int n = in.NElts(); 352 r_8 thr = FFTArrayChecker<r_8>::ZeroThreshold(); 353 sa_size_t ncs = ( (in(n-1).imag() < -thr) || (in(n-1).imag() > thr) ) ? 354 ncs = 2*n-1 : ncs = 2*n-2; 355 356 if (out.NElts() != ncs) { 357 cerr << " DEBUG-FFTWServer::ReShapetoReal() ncs= " << ncs 358 << " out.NElts()= " << out.NElts() << endl; 359 throw SzMismatchError("FFTWServer::ReShapetoReal() - Wrong output array size !"); 360 } 361 // if (ncs == 2*n-2) { 362 out(0) = in(0).real(); 363 for(int k=1; k<n; k++) { 364 out(k) = in(k).real(); 365 out(ncs-k) = in(k).imag(); 366 } 367 if (ncs == 2*n-2) 368 out(ncs-1) = in(n-1).real(); 374 369 375 370 // for(int k=0; k<out.NElts(); k++) cout << "ReShapetoReal out " << k << " " << out(k) << endl; … … 378 373 379 374 /* --Methode-- */ 380 void FFTWServer::ReShapetoCompl(TArray< r_8 > const & in, TArray< complex<r_8> > & out) 381 { 382 int N = in.Size(); 383 // for(int k=0; k<in.NElts(); k++) cout << "ReShapetoCompl in " << k << " " << in(k) << endl; 384 out[0] = complex<r_8> (in[0],0.); 385 for(int k=1; k<N+1/2; k++) 386 out[k] = complex<r_8>(in[k], in[N-k]); 387 if (N%2 == 0) out[N/2] = complex<r_8>(in[N/2], 0.); 388 // for(int k=0; k<out.NElts(); k++) cout << "ReShapetoCompl out " << k << " " << out(k) << endl; 389 } 390 375 void FFTWServer::ReShapetoCompl(TArray< r_8 > const & ina, TArray< complex<r_8> > & outa) 376 { 377 TVector< r_8> in(ina); 378 TVector< complex<r_8> > out(outa); 379 380 sa_size_t n = in.NElts(); 381 sa_size_t ncs = n/2+1; 382 sa_size_t nc = (n%2 != 0) ? n/2+1 : n/2; 383 if (out.NElts() != ncs) 384 throw SzMismatchError("FFTWServer::ReShapetoCompl() - Wrong output array size !"); 385 386 out(0) = complex<r_8> (in(0),0.); 387 for(int k=1; k<ncs; k++) 388 out(k) = complex<r_8>(in(k), in(n-k)); 389 if (n%2 == 0) out(ncs-1) = complex<r_8>(in(n/2), 0.); 390 391 } 392 -
trunk/SophyaExt/IFFTW/fftwserver.h
r1391 r1395 26 26 27 27 // Methodes statiques pour reordonner les donnees 28 virtual void ReShapetoReal( TArray< complex<r_8> > const & in, TArray< r_8 >& out);28 virtual void ReShapetoReal(TArray< complex<r_8> > const & in, TArray< r_8 > & out); 29 29 virtual void ReShapetoCompl(TArray< r_8 > const & in, TArray< complex<r_8> > & out); 30 30 … … 40 40 FFTWServerPlan * _pndrb; 41 41 42 FFTArrayChecker<r_4> ckR4;43 42 FFTArrayChecker<r_8> ckR8; 44 43 };
Note:
See TracChangeset
for help on using the changeset viewer.