Changeset 2920 in Sophya


Ignore:
Timestamp:
Mar 14, 2006, 5:00:05 PM (20 years ago)
Author:
cmv
Message:

crefilter,fftfilter,fftback for master env cmv 14/03/2006

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/ProgPI/sopiamodule.cc

    r2615 r2920  
    3131}
    3232
    33 void SophyaFFT(string& nom, string& nomout, string dopt);
     33void SophyaFFT_forw(string& nom, string& nomout, string dopt);
     34void SophyaFFT_back(string& nom, string& nomout, string dopt);
     35void SophyaFFT_crefilter(string& nomvec, string& nomfilter, string func, string dopt);
     36void SophyaFFT_filter(string& nom, string& nomfilter, string dopt);
    3437
    3538class sopiamoduleExecutor : public CmdExecutor {
     
    194197
    195198string hgrp = "SophyaCmd";
    196 string kw = "powerspec";
    197 string usage = "FFT on a vector -> Plots power spectrum ";
    198 usage += "\n Usage: fftp vecName vecFFT [graphic_att] ";
    199 mpiac->RegisterCommand(kw, usage, this, hgrp);
     199string kw,usage;
     200
     201kw = "powerspec";
     202usage = "FFT on a vector -> Plots power spectrum ";
     203usage += "\n Usage: powerspec vecName vecFFT [graphic_att] ";
     204mpiac->RegisterCommand(kw, usage, this, hgrp);
     205
     206kw = "fftforw";
     207usage = "FFT on a vector -> Plots power spectrum (same as powerspec)";
     208usage += "\n Usage: fftforw vecName vecFFT [graphic_att] ";
     209mpiac->RegisterCommand(kw, usage, this, hgrp);
     210
     211kw = "fftback";
     212usage = "FFT on a vector -> Plots power spectrum";
     213usage += "\n Usage: fftback vecFFT vecName [graphic_att] ";
     214usage += "\n  vecFFT is complex<r_8>";
     215usage += "\n  If vecName already exist, it gives the type(r_8 or complex<r_8>)";
     216usage += "\n  If vecName does not exist, return type is complex<r_8>";
     217mpiac->RegisterCommand(kw, usage, this, hgrp);
     218
     219kw = "crefilter";
     220usage = "Create a filter for vecFFT (vector complex<r_8>)";
     221usage += "\n Usage: crefilter vecFFT filter f(x) [graphic_att] ";
     222mpiac->RegisterCommand(kw, usage, this, hgrp);
     223
     224kw = "fftfilter";
     225usage = "Filter (multiply) vecFFT (vector complex<r_8>) by filter (vector<r_8>)";
     226usage += "\n Usage: fftfilter vecFFT filter [graphic_att] ";
     227mpiac->RegisterCommand(kw, usage, this, hgrp);
     228
    200229kw = "mollgridsph";
    201230usage = "Creates a spherical coordinate grid in Molleweide projection ";
    202231usage += "\n Usage: mollgridsph NameSphericalMap [Nb_Parallel Nb_Meridien graphic_att] ";
    203232mpiac->RegisterCommand(kw, usage, this, hgrp);
     233
    204234kw = "mollgrid";
    205235usage = "Creates a spherical coordinate grid in Molleweide projection ";
    206236usage += "\n Usage: mollgrid [Nb_Parallel Nb_Meridien graphic_att] ";
    207237mpiac->RegisterCommand(kw, usage, this, hgrp);
     238
    208239kw = "setprjmoldefval";
    209240usage = "Set default value for Molleweide projection of spherical maps (outside maps)";
     
    222253{
    223254
    224 if (kw == "powerspec") {
     255if (kw == "powerspec" || kw == "fftforw") {
    225256  if (tokens.size() < 2) {
    226257    cout << "Usage: powerspec nameVec vecFFT [graphic_att]" << endl;
    227258    return(0);
    228259    }
    229   if (tokens.size() < 3)  tokens.push_back((string)"n");
    230   SophyaFFT(tokens[0], tokens[1], tokens[2]);
    231   }
     260  if (tokens.size() < 3)  tokens.push_back((string)"");
     261  SophyaFFT_forw(tokens[0], tokens[1], tokens[2]);
     262  }
     263else if (kw == "fftback") {
     264  if (tokens.size() < 2) {
     265    cout << "Usage: fftback vecFFT nameVec [graphic_att]" << endl;
     266    return(0);
     267    }
     268  if (tokens.size() < 3)  tokens.push_back((string)"");
     269  SophyaFFT_back(tokens[0], tokens[1], tokens[2]);
     270  }
     271else if (kw == "crefilter") {
     272  if (tokens.size() < 3) {
     273    cout << "Usage: crefilter vecFFT filter f(x) [graphic_att]" << endl;
     274    return(0);
     275    }
     276  if (tokens.size() < 4)  tokens.push_back((string)"");
     277  SophyaFFT_crefilter(tokens[0], tokens[1], tokens[2], tokens[3]);
     278  }
     279else if (kw == "fftfilter") {
     280  if (tokens.size() < 2) {
     281    cout << "Usage: fftfilter vecFFT filter [graphic_att]" << endl;
     282    return(0);
     283    }
     284  if (tokens.size() < 3)  tokens.push_back((string)"");
     285  SophyaFFT_filter(tokens[0], tokens[1], tokens[2]);
     286  }
     287
    232288else if (kw == "prjmoldefval") {
    233289  if (tokens.size() < 1) {
     
    315371
    316372
    317 /* --Methode-- */
    318 void SophyaFFT(string& nom, string& nomout, string dopt)
    319 {
    320 Timer tm("powerspec");
     373/*  Nouvelle-Fonction */
     374void SophyaFFT_forw(string& nom, string& nomout, string dopt)
     375{
     376//Timer tm("powerspec");
    321377NamedObjMgr omg;
    322378AnyDataObj* obj=omg.GetObj(nom);
    323379if (obj == NULL) {
    324   cout << "SophyaFFT() Error , Pas d'objet de nom " << nom << endl;
    325   return;
    326 }
    327 
    328 Vector* vin = dynamic_cast<Vector *>(obj);
    329 if (vin == NULL) {
    330   cout << "SophyaFFT() Error , Objet n'est pas un vecteur " <<  endl;
    331   return;
    332   }
    333 TVector< complex<double> > * vout = new TVector< complex<double> >  ;
     380  cout<<"SophyaFFT_forw() Error , Pas d'objet de nom "<<nom<<endl;
     381  return;
     382}
     383
     384TVector<r_8>* vin = dynamic_cast<TVector<r_8> *>(obj);
     385TVector< complex<r_8> >* vinc = dynamic_cast<TVector< complex<r_8> >*>(obj);
     386if (vin == NULL && vinc == NULL) {
     387  cout<<"SophyaFFT_forw() Error , Objet n'est pas un vecteur r_8 ou complex<r_8>"<<endl;
     388  return;
     389}
     390TVector< complex<r_8> > * vout = new TVector< complex<r_8> >  ;
    334391FFTPackServer ffts;
    335 cout << "SophyaFFT() - Computing FFT of vector size " << vin->NElts() << endl;
    336 ffts.FFTForward(*vin, *vout);
     392if(vin!=NULL) {
     393  cout<<"SophyaFFT_forw() - Computing FFT of TVector<r_8> of size "<<vin->NElts()<< endl;
     394  ffts.FFTForward(*vin, *vout);
     395  cout<<"...Output TVector<complex<r_8>> of size: "<<vout->NElts()<<endl;
     396} else {
     397  cout<<"SophyaFFT_forw() - Computing FFT of vector TVector<complex<r_8>> of size "<<vinc->NElts()<< endl;
     398  ffts.FFTForward(*vinc, *vout);
     399  cout<<"...Output TVector<complex<r_8>> of size: "<<vout->NElts()<<endl;
     400}
    337401// cout << " SophyaFFT - FFT done " << endl;
    338402 // tm.Split(" FFT done ");
    339403
    340404omg.AddObj(vout, nomout);
    341 omg.DisplayObj(nomout, dopt);
     405if(dopt.size()>0) omg.DisplayObj(nomout, dopt);
    342406return;
    343407
    344408}
     409
     410
     411/*  Nouvelle-Fonction */
     412void SophyaFFT_back(string& nom, string& nomout, string dopt)
     413{
     414  //Timer tm("powerspec");
     415NamedObjMgr omg;
     416AnyDataObj* obj=omg.GetObj(nom);
     417if (obj == NULL) {
     418  cout << "SophyaFFT_back() Error , Pas d'objet de nom " << nom << endl;
     419  return;
     420}
     421
     422TVector< complex<r_8> >* vinc = dynamic_cast<TVector< complex<r_8> >*>(obj);
     423if (vinc == NULL) {
     424  cout << "SophyaFFT_back() Error , Objet n'est pas un vecteur complex<r_8>" <<  endl;
     425  return;
     426  }
     427
     428TVector< r_8 > * vout = NULL;
     429TVector< complex<r_8> > * voutc = NULL;
     430obj=omg.GetObj(nomout);
     431if(obj == NULL) {
     432  voutc = new TVector< complex<r_8> >;
     433} else {
     434  vout = dynamic_cast<TVector<r_8>*>(obj);
     435  if(vout==NULL) voutc = dynamic_cast<TVector< complex<r_8> >*>(obj);
     436}
     437if(vout==NULL && voutc==NULL) {
     438 cout << "SophyaFFT_back() Error , Output objet n'est pas un vecteur r_8 ou complex<r_8>" <<  endl;
     439 return;
     440}
     441
     442FFTPackServer ffts;
     443cout << "SophyaFFT_back() - Computing Backward FFT of vector size " << vinc->NElts() << endl;
     444if(vout!=NULL) {
     445  ffts.FFTBackward(*vinc, *vout);
     446  cout<<"...Output TVector<r_8> of size: "<<vout->NElts()<<endl;
     447  omg.AddObj(vout, nomout);
     448} else {
     449  ffts.FFTBackward(*vinc, *voutc);
     450  cout<<"...Output TVector<complex<r_8>> of size: "<<voutc->NElts()<<endl;
     451  omg.AddObj(voutc, nomout);
     452}
     453
     454if(dopt.size()>0) omg.DisplayObj(nomout, dopt);
     455return;
     456}
     457
     458/*  Nouvelle-Fonction */
     459void SophyaFFT_crefilter(string& nomvec, string& nomfilter, string func, string dopt)
     460{
     461NamedObjMgr omg;
     462AnyDataObj* obj=omg.GetObj(nomvec);
     463if(obj == NULL) {
     464  cout<<"SophyaFFT_crefilter() Error , Pas d'objet de nom "<<nomvec<<endl;
     465  return;
     466}
     467
     468TVector< complex<r_8> >* vfft = dynamic_cast<TVector< complex<r_8> >*>(obj);
     469if(vfft == NULL) {
     470  cout<<"SophyaFFT_crefilter() Error , Objet "<<nomvec<<" n'est pas un Tvector<complex<r_8>>"<< endl;
     471  return;
     472}
     473int n = vfft->Size();
     474if(n<=0) return;
     475
     476cout<<"Creating filter "<<nomfilter<<"("<<n<<") from vec "<<nomvec<<" with fun "<<func<<endl;
     477omg.GetServiceObj()->PlotFunc(func,nomfilter,0.,(double)n,n,dopt);
     478}
     479
     480/*  Nouvelle-Fonction */
     481void SophyaFFT_filter(string& nom, string& nomfilter, string dopt)
     482{
     483NamedObjMgr omg;
     484AnyDataObj* obj=omg.GetObj(nom);
     485if(obj == NULL) {
     486  cout<<"SophyaFFT_filter() Error , Pas d'objet de nom "<<nom<<endl;
     487  return;
     488}
     489
     490AnyDataObj* objfilter=omg.GetObj(nomfilter);
     491if(objfilter == NULL) {
     492  cout<<"SophyaFFT_filter() Error , Pas d'objet de nom "<<nomfilter<<endl;
     493  return;
     494}
     495
     496TVector< complex<r_8> >* vfft = dynamic_cast<TVector< complex<r_8> >*>(obj);
     497if(vfft == NULL) {
     498  cout<<"SophyaFFT_filter() Error , Objet "<<nom<<" n'est pas un Tvector<complex<r_8>>"<< endl;
     499  return;
     500}
     501
     502TVector<r_8>* vfilter = dynamic_cast<TVector<r_8>*>(objfilter);
     503if(vfft == NULL) {
     504  cout<<"SophyaFFT_filter() Error , Objet "<<nomfilter<<" n'est pas un Tvector<r_8>"<<endl;
     505  return;
     506}
     507
     508int n = (vfilter->Size()<vfft->Size()) ? vfilter->Size(): vfft->Size();
     509cout<<"...filtering from 0 to "<<n<<endl;
     510for(int i=0;i<n;i++) (*vfft)(i) *= (*vfilter)(i);
     511
     512if(dopt.size()>0) omg.DisplayObj(nom,dopt);
     513return;
     514}
Note: See TracChangeset for help on using the changeset viewer.