Changeset 1395 in Sophya for trunk/SophyaExt


Ignore:
Timestamp:
Feb 12, 2001, 6:09:47 PM (25 years ago)
Author:
ansari
Message:

Corrections- adaptation interface FFTServer - Reza 12/2/2001

Location:
trunk/SophyaExt/IFFTW
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/IFFTW/fftwserver.cc

    r1391 r1395  
    127127FFTWServer::FFTWServer()
    128128  : FFTServerInterface("FFTServer using FFTW package")
    129   ,  ckR4(true, false) , ckR8(true, false)
     129  , ckR8("FFTWServer - ", true, false)
    130130
    131131{
     
    185185    fftwnd_one(_pndf->pnd, (fftw_complex *)(in.Data()) , (fftw_complex *)(out.Data()) );
    186186  } 
    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.);
    189188  return;
    190189}
     
    211210    else _pndb = new FFTWServerPlan(in.NbDimensions(), sz, FFTW_BACKWARD, false);
    212211  }
    213   // $CHECK$ Reza 9/2/2001 , Verifier normalisation 
    214   if(this->getNormalize()) out=out/complex<r_8>(sqrt((double)in.Size()),0.);
     212
    215213  return;
    216214}
     
    242240                                (fftw_complex *)(out.Data()) );
    243241  }
    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.);
    246243  return;
    247244
     
    252249void FFTWServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out)
    253250{
    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;
    270279}
    271280
     
    336345
    337346/* --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   }
     347void 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();
    374369 
    375370  //  for(int k=0; k<out.NElts(); k++) cout << "ReShapetoReal out " << k << " " << out(k) << endl;
     
    378373
    379374/* --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 
     375void 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  
    2626
    2727// 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);
    2929  virtual void ReShapetoCompl(TArray< r_8 > const & in, TArray< complex<r_8> > & out);
    3030
     
    4040 FFTWServerPlan * _pndrb;
    4141
    42  FFTArrayChecker<r_4> ckR4;
    4342 FFTArrayChecker<r_8> ckR8;
    4443};
Note: See TracChangeset for help on using the changeset viewer.