Changeset 2920 in Sophya for trunk/SophyaPI
- Timestamp:
- Mar 14, 2006, 5:00:05 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaPI/ProgPI/sopiamodule.cc
r2615 r2920 31 31 } 32 32 33 void SophyaFFT(string& nom, string& nomout, string dopt); 33 void SophyaFFT_forw(string& nom, string& nomout, string dopt); 34 void SophyaFFT_back(string& nom, string& nomout, string dopt); 35 void SophyaFFT_crefilter(string& nomvec, string& nomfilter, string func, string dopt); 36 void SophyaFFT_filter(string& nom, string& nomfilter, string dopt); 34 37 35 38 class sopiamoduleExecutor : public CmdExecutor { … … 194 197 195 198 string 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); 199 string kw,usage; 200 201 kw = "powerspec"; 202 usage = "FFT on a vector -> Plots power spectrum "; 203 usage += "\n Usage: powerspec vecName vecFFT [graphic_att] "; 204 mpiac->RegisterCommand(kw, usage, this, hgrp); 205 206 kw = "fftforw"; 207 usage = "FFT on a vector -> Plots power spectrum (same as powerspec)"; 208 usage += "\n Usage: fftforw vecName vecFFT [graphic_att] "; 209 mpiac->RegisterCommand(kw, usage, this, hgrp); 210 211 kw = "fftback"; 212 usage = "FFT on a vector -> Plots power spectrum"; 213 usage += "\n Usage: fftback vecFFT vecName [graphic_att] "; 214 usage += "\n vecFFT is complex<r_8>"; 215 usage += "\n If vecName already exist, it gives the type(r_8 or complex<r_8>)"; 216 usage += "\n If vecName does not exist, return type is complex<r_8>"; 217 mpiac->RegisterCommand(kw, usage, this, hgrp); 218 219 kw = "crefilter"; 220 usage = "Create a filter for vecFFT (vector complex<r_8>)"; 221 usage += "\n Usage: crefilter vecFFT filter f(x) [graphic_att] "; 222 mpiac->RegisterCommand(kw, usage, this, hgrp); 223 224 kw = "fftfilter"; 225 usage = "Filter (multiply) vecFFT (vector complex<r_8>) by filter (vector<r_8>)"; 226 usage += "\n Usage: fftfilter vecFFT filter [graphic_att] "; 227 mpiac->RegisterCommand(kw, usage, this, hgrp); 228 200 229 kw = "mollgridsph"; 201 230 usage = "Creates a spherical coordinate grid in Molleweide projection "; 202 231 usage += "\n Usage: mollgridsph NameSphericalMap [Nb_Parallel Nb_Meridien graphic_att] "; 203 232 mpiac->RegisterCommand(kw, usage, this, hgrp); 233 204 234 kw = "mollgrid"; 205 235 usage = "Creates a spherical coordinate grid in Molleweide projection "; 206 236 usage += "\n Usage: mollgrid [Nb_Parallel Nb_Meridien graphic_att] "; 207 237 mpiac->RegisterCommand(kw, usage, this, hgrp); 238 208 239 kw = "setprjmoldefval"; 209 240 usage = "Set default value for Molleweide projection of spherical maps (outside maps)"; … … 222 253 { 223 254 224 if (kw == "powerspec" ) {255 if (kw == "powerspec" || kw == "fftforw") { 225 256 if (tokens.size() < 2) { 226 257 cout << "Usage: powerspec nameVec vecFFT [graphic_att]" << endl; 227 258 return(0); 228 259 } 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 } 263 else 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 } 271 else 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 } 279 else 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 232 288 else if (kw == "prjmoldefval") { 233 289 if (tokens.size() < 1) { … … 315 371 316 372 317 /* --Methode--*/318 void SophyaFFT (string& nom, string& nomout, string dopt)319 { 320 Timer tm("powerspec");373 /* Nouvelle-Fonction */ 374 void SophyaFFT_forw(string& nom, string& nomout, string dopt) 375 { 376 //Timer tm("powerspec"); 321 377 NamedObjMgr omg; 322 378 AnyDataObj* obj=omg.GetObj(nom); 323 379 if (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 384 TVector<r_8>* vin = dynamic_cast<TVector<r_8> *>(obj); 385 TVector< complex<r_8> >* vinc = dynamic_cast<TVector< complex<r_8> >*>(obj); 386 if (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 } 390 TVector< complex<r_8> > * vout = new TVector< complex<r_8> > ; 334 391 FFTPackServer ffts; 335 cout << "SophyaFFT() - Computing FFT of vector size " << vin->NElts() << endl; 336 ffts.FFTForward(*vin, *vout); 392 if(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 } 337 401 // cout << " SophyaFFT - FFT done " << endl; 338 402 // tm.Split(" FFT done "); 339 403 340 404 omg.AddObj(vout, nomout); 341 omg.DisplayObj(nomout, dopt);405 if(dopt.size()>0) omg.DisplayObj(nomout, dopt); 342 406 return; 343 407 344 408 } 409 410 411 /* Nouvelle-Fonction */ 412 void SophyaFFT_back(string& nom, string& nomout, string dopt) 413 { 414 //Timer tm("powerspec"); 415 NamedObjMgr omg; 416 AnyDataObj* obj=omg.GetObj(nom); 417 if (obj == NULL) { 418 cout << "SophyaFFT_back() Error , Pas d'objet de nom " << nom << endl; 419 return; 420 } 421 422 TVector< complex<r_8> >* vinc = dynamic_cast<TVector< complex<r_8> >*>(obj); 423 if (vinc == NULL) { 424 cout << "SophyaFFT_back() Error , Objet n'est pas un vecteur complex<r_8>" << endl; 425 return; 426 } 427 428 TVector< r_8 > * vout = NULL; 429 TVector< complex<r_8> > * voutc = NULL; 430 obj=omg.GetObj(nomout); 431 if(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 } 437 if(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 442 FFTPackServer ffts; 443 cout << "SophyaFFT_back() - Computing Backward FFT of vector size " << vinc->NElts() << endl; 444 if(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 454 if(dopt.size()>0) omg.DisplayObj(nomout, dopt); 455 return; 456 } 457 458 /* Nouvelle-Fonction */ 459 void SophyaFFT_crefilter(string& nomvec, string& nomfilter, string func, string dopt) 460 { 461 NamedObjMgr omg; 462 AnyDataObj* obj=omg.GetObj(nomvec); 463 if(obj == NULL) { 464 cout<<"SophyaFFT_crefilter() Error , Pas d'objet de nom "<<nomvec<<endl; 465 return; 466 } 467 468 TVector< complex<r_8> >* vfft = dynamic_cast<TVector< complex<r_8> >*>(obj); 469 if(vfft == NULL) { 470 cout<<"SophyaFFT_crefilter() Error , Objet "<<nomvec<<" n'est pas un Tvector<complex<r_8>>"<< endl; 471 return; 472 } 473 int n = vfft->Size(); 474 if(n<=0) return; 475 476 cout<<"Creating filter "<<nomfilter<<"("<<n<<") from vec "<<nomvec<<" with fun "<<func<<endl; 477 omg.GetServiceObj()->PlotFunc(func,nomfilter,0.,(double)n,n,dopt); 478 } 479 480 /* Nouvelle-Fonction */ 481 void SophyaFFT_filter(string& nom, string& nomfilter, string dopt) 482 { 483 NamedObjMgr omg; 484 AnyDataObj* obj=omg.GetObj(nom); 485 if(obj == NULL) { 486 cout<<"SophyaFFT_filter() Error , Pas d'objet de nom "<<nom<<endl; 487 return; 488 } 489 490 AnyDataObj* objfilter=omg.GetObj(nomfilter); 491 if(objfilter == NULL) { 492 cout<<"SophyaFFT_filter() Error , Pas d'objet de nom "<<nomfilter<<endl; 493 return; 494 } 495 496 TVector< complex<r_8> >* vfft = dynamic_cast<TVector< complex<r_8> >*>(obj); 497 if(vfft == NULL) { 498 cout<<"SophyaFFT_filter() Error , Objet "<<nom<<" n'est pas un Tvector<complex<r_8>>"<< endl; 499 return; 500 } 501 502 TVector<r_8>* vfilter = dynamic_cast<TVector<r_8>*>(objfilter); 503 if(vfft == NULL) { 504 cout<<"SophyaFFT_filter() Error , Objet "<<nomfilter<<" n'est pas un Tvector<r_8>"<<endl; 505 return; 506 } 507 508 int n = (vfilter->Size()<vfft->Size()) ? vfilter->Size(): vfft->Size(); 509 cout<<"...filtering from 0 to "<<n<<endl; 510 for(int i=0;i<n;i++) (*vfft)(i) *= (*vfilter)(i); 511 512 if(dopt.size()>0) omg.DisplayObj(nom,dopt); 513 return; 514 }
Note:
See TracChangeset
for help on using the changeset viewer.