Changeset 3349 in Sophya


Ignore:
Timestamp:
Oct 11, 2007, 4:39:58 PM (18 years ago)
Author:
cmv
Message:
  • gros changements dans la structure de la classe GeneFluct3D (constructeur et logique d'aloocation memoire, init_fftw etc...)
  • suppression des valeurs de masse<0 mises a -999. directement mises a zero
  • suppression de TurnMass2HIMass qui fait maintenant la meme chose que TurnMass2MeanNumber
  • legere restructuration de cmvobserv3d.cc pour compat.

cmv 11/10/2007

Location:
trunk/Cosmo/SimLSS
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cosmo/SimLSS/cmvobserv3d.cc

    r3345 r3349  
    4545     <<" -R schmassdist.ppf : read mass distribution for trials from file"<<endl
    4646     <<"               instead of computing it (ONLY if \"-Q\" option is activated)"<<endl
    47      <<" -A <log10(S_agn in Jy at 1.4 GHz)>,sigma,powlaw :"<<endl
    48      <<"    AGN mean and sigma gaussian equiv. distrib. for solid angle of centeral pixel"<<endl
    49      <<"    powlaw: apply S_agn evolution as (Nu/1.4)^powlaw"<<endl
    5047     <<" -W : write cube in FITS format (complex cube is coded as real cube)"<<endl
    5148     <<" -P : write cube in PPF format"<<endl
     
    5451     <<" -T nth : nombre de threads (si compil multi-thread, default: 0)"<<endl
    5552     <<endl;
     53     ////<<" -A <log10(S_agn in Jy at 1.4 GHz)>,sigma,powlaw :"<<endl
     54     ////<<"    AGN mean and sigma gaussian equiv. distrib. for solid angle of centeral pixel"<<endl
     55     ////<<"    powlaw: apply S_agn evolution as (Nu/1.4)^powlaw"<<endl
    5656}
    5757
     
    101101 int noise_evol = 0;
    102102
    103  // *** AGN
    104  bool do_agn = false;
    105  double lfjy_agn=-99., lsigma_agn=0.;   // en Jy
    106  double powlaw_agn = 0.;
     103 //// *** AGN
     104 ////bool do_agn = false;
     105 ////double lfjy_agn=-99., lsigma_agn=0.;   // en Jy
     106 ////double powlaw_agn = 0.;
    107107
    108108 // *** type de generation
     
    177177    schmassdistfile = optarg;
    178178    break;
    179   case 'A' :
    180     do_agn = true;
    181     sscanf(optarg,"%lf,%lf,%lf",&lfjy_agn,&lsigma_agn,&powlaw_agn);
    182     break;
     179    ////  case 'A' :
     180    ////do_agn = true;
     181    ////sscanf(optarg,"%lf,%lf,%lf",&lfjy_agn,&lsigma_agn,&powlaw_agn);
     182    ////break;
    183183  case 'V' :
    184184    compvarreal = true;
     
    224224 cout<<"snoise="<<snoise<<" equivalent Msol, evolution="<<noise_evol<<endl;
    225225 cout<<"scalecube="<<scalecube<<", offsetcube="<<offsetcube<<endl;
    226  if(do_agn)
    227    cout<<"AGN: <log10(Jy)>="<<lfjy_agn<<" , sigma="<<lsigma_agn
    228        <<" , powlaw="<<powlaw_agn<<endl;
     226 ////if(do_agn)
     227 ////  cout<<"AGN: <log10(Jy)>="<<lfjy_agn<<" , sigma="<<lsigma_agn
     228 ////      <<" , powlaw="<<powlaw_agn<<endl;
    229229
    230230 string tagobs = "cmvobserv3d.ppf";
     
    264264 cout<<endl<<"\n--- Compute variance for top-hat R="<<R
    265265     <<" at z="<<pkz.GetZ()<<endl;
    266  VarianceSpectrum varpk_th(pkz,0);
    267  double kfind_th = varpk_th.FindMaximum(R,kmin,kmax,eps);
     266 VarianceSpectrum varpk_th(pkz,R,VarianceSpectrum::TOPHAT);
     267 double kfind_th = varpk_th.FindMaximum(kmin,kmax,eps);
    268268 double pkmax_th = varpk_th(kfind_th);
    269269 cout<<"kfind_th = "<<kfind_th<<" ("<<log10(kfind_th)<<"), integrand="<<pkmax_th<<endl;
    270270 double k1=kmin, k2=kmax;
    271  int rc = varpk_th.FindLimits(R,pkmax_th/1.e4,k1,k2,eps);
     271 int rc = varpk_th.FindLimits(pkmax_th/1.e4,k1,k2,eps);
    272272 cout<<"limit_th: rc="<<rc<<" : "<<k1<<" ("<<log10(k1)<<") , "
    273273     <<k2<<" ("<<log10(k2)<<")"<<endl;
     
    275275 double ldlk = (log10(k2)-log10(k1))/npt;
    276276 varpk_th.SetInteg(0.01,ldlk,-1.,4);
    277  double sr2 = varpk_th.Variance(R,k1,k2);
     277 double sr2 = varpk_th.Variance(k1,k2);
    278278 cout<<"varpk_th="<<sr2<<"  ->  sigma="<<sqrt(sr2)<<endl;
    279279
     
    292292 //-----------------------------------------------------------------
    293293 cout<<endl<<"\n--- Compute variance for Pk at z="<<pkz.GetZ()<<endl;
    294  VarianceSpectrum varpk_int(pkz,2);
    295 
    296  double kfind_int = varpk_int.FindMaximum(R,kmin,kmax,eps);
     294 VarianceSpectrum varpk_int(pkz,R,VarianceSpectrum::NOFILTER);
     295
     296 double kfind_int = varpk_int.FindMaximum(kmin,kmax,eps);
    297297 double pkmax_int = varpk_int(kfind_int);
    298298 cout<<"kfind_int = "<<kfind_int<<" ("<<log10(kfind_int)<<"), integrand="<<pkmax_int<<endl;
    299299 double k1int=kmin, k2int=kmax;
    300  int rcint = varpk_int.FindLimits(R,pkmax_int/1.e4,k1int,k2int,eps);
     300 int rcint = varpk_int.FindLimits(pkmax_int/1.e4,k1int,k2int,eps);
    301301 cout<<"limit_int: rc="<<rcint<<" : "<<k1int<<" ("<<log10(k1int)<<") , "
    302302     <<k2int<<" ("<<log10(k2int)<<")"<<endl;
     
    304304 double ldlkint = (log10(k2int)-log10(k1int))/npt;
    305305 varpk_int.SetInteg(0.01,ldlkint,-1.,4);
    306  double sr2int = varpk_int.Variance(R,k1int,k2int);
     306 double sr2int = varpk_int.Variance(k1int,k2int);
    307307 cout<<"varpk_int="<<sr2int<<"  ->  sigma="<<sqrt(sr2int)<<endl;
    308308 
     
    355355 cout<<endl<<"\n--- Initialisation de GeneFluct3D"<<endl;
    356356
    357  TArray< complex<r_8> > pkgen;
    358  GeneFluct3D fluct3d(pkgen);
    359  fluct3d.SetPrtLevel(2);
    360  fluct3d.SetNThread(nthread);
    361  fluct3d.SetSize(nx,ny,nz,dx,dy,dz);
     357 GeneFluct3D fluct3d(nx,ny,nz,dx,dy,dz,nthread,2);
    362358 fluct3d.SetObservator(zref,-nz/2.);
    363359 fluct3d.SetCosmology(univ);
    364360 fluct3d.SetGrowthFactor(growth);
    365361 fluct3d.LosComRedshift(0.001,-1);
    366  //TArray<r_8>& rgen = fluct3d.GetRealArray();
     362 TArray< complex<r_8> >& pkgen = fluct3d.GetComplexArray();
     363 TArray<r_8>& rgen = fluct3d.GetRealArray();
    367364 cout<<endl; fluct3d.Print();
    368365 cout<<"\nMean number of galaxies per pixel = "<<ngal_by_mpc3*fluct3d.GetDVol()<<endl;
     
    391388 ldlkint = (log10(knyqmax_mod)-log10(k1int))/npt;
    392389 varpk_int.SetInteg(0.01,ldlkint,-1.,4);
    393  double sr2int_kmax = varpk_int.Variance(R,k1int,knyqmax_mod);
     390 double sr2int_kmax = varpk_int.Variance(k1int,knyqmax_mod);
    394391 cout<<"varpk_int(<"<<knyqmax_mod<<")="<<sr2int_kmax<<"  ->  sigma="<<sqrt(sr2int_kmax)<<endl;
    395392
     
    538535
    539536 if(no_poisson) {
    540 
    541537   cout<<"\n--- Converting !!!DIRECTLY!!! mass into HI mass: mass per pixel ="
    542538       <<mass_by_mpc3*fluct3d.GetDVol()<<endl;
    543    rm = fluct3d.TurnMass2HIMass(mass_by_mpc3);
    544      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200);
    545      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200,true,0.);
    546    PrtTim(">>>> End Converting !!!DIRECTLY!!! mass into HI mass");
    547 
     539   rm = fluct3d.TurnMass2MeanNumber(mass_by_mpc3);
    548540 } else {
    549 
    550541   cout<<"\n--- Converting mass into galaxy number: gal per pixel ="
    551542       <<ngal_by_mpc3*fluct3d.GetDVol()<<endl;
    552543   rm = fluct3d.TurnMass2MeanNumber(ngal_by_mpc3);
    553      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200);
    554      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200,true,0.);
    555    PrtTim(">>>> End Converting mass into galaxy number");
    556 
    557    cout<<"\n--- Set negative and null pixels to BAD"<<endl;
    558    nm = fluct3d.SetToVal(0.,1e+200,-999.);
    559    PrtTim(">>>> End Set negative pixels to BAD etc...");
     544 }
     545 nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200);
     546 nm = fluct3d.MeanSigma2(rm,rs2);
     547 PrtTim(">>>> End Converting mass into galaxy number or mass");
     548
     549 if( !no_poisson ) {
    560550
    561551   cout<<"\n--- Apply poisson on galaxy number"<<endl;
    562552   fluct3d.ApplyPoisson();
    563      nm = fluct3d.MeanSigma2(rm,rs2,-998.,1e200);
    564      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200,true,0.);
     553     nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200);
     554     nm = fluct3d.MeanSigma2(rm,rs2);
    565555   double xgalmin,xgalmax; fluct3d.MinMax(xgalmin,xgalmax,0.1,1.e50);
    566556   PrtTim(">>>> End Apply poisson on galaxy number");
     
    584574   }
    585575   cout<<mhi<<" MSol in survey / "<<mass_by_mpc3*fluct3d.GetVol()<<endl;
    586      nm = fluct3d.MeanSigma2(rm,rs2,-998.,1e200);
     576     nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200);
    587577     cout<<"Equivalent: "<<rm*nm/fluct3d.NPix()<<" Msol / pixels"<<endl;
    588      nm = fluct3d.MeanSigma2(rm,rs2,0.,1e200,true,0.);
     578     nm = fluct3d.MeanSigma2(rm,rs2);
    589579   PrtTim(">>>> End Convert Galaxy number to HI mass");
    590 
    591    cout<<"\n--- Set BAD pixels to Zero"<<endl;
    592    nm = fluct3d.SetToVal(-998.,1e+200,0.);
    593    PrtTim(">>>> End Set BAD pixels to Zero etc...");
    594580
    595581 }
     
    609595
    610596 //-----------------------------------------------------------------
    611  if(do_agn) {
    612    cout<<"\n--- Add AGN: <log10(S Jy)>="<<lfjy_agn<<" , sigma="<<lsigma_agn
    613        <<" , powlaw="<<powlaw_agn<<endl;
    614    fluct3d.AddAGN(lfjy_agn,lsigma_agn,powlaw_agn);
    615      nm = fluct3d.MeanSigma2(rm,rs2);
    616    PrtTim(">>>> End Add AGN");
    617  }
     597 ////if(do_agn) {
     598 ////  cout<<"\n--- Add AGN: <log10(S Jy)>="<<lfjy_agn<<" , sigma="<<lsigma_agn
     599 ////      <<" , powlaw="<<powlaw_agn<<endl;
     600 ////  fluct3d.AddAGN(lfjy_agn,lsigma_agn,powlaw_agn);
     601 ////    nm = fluct3d.MeanSigma2(rm,rs2);
     602 ////   PrtTim(">>>> End Add AGN");
     603 ////}
    618604
    619605 //-----------------------------------------------------------------
     
    627613 }
    628614
     615
     616 //-----------------------------------------------------------------
    629617 if(scalecube!=0.) {  // Si scalecube==0 pas de normalisation
    630618   cout<<"\n--- Scale cube rs2ref="<<rs2ref<<endl;
  • trunk/Cosmo/SimLSS/genefluct3d.cc

    r3331 r3349  
    2424#include "genefluct3d.h"
    2525
    26 #define FFTW_THREAD
     26#define WITH_FFTW_THREAD
    2727
    2828#define MODULE2(_x_) ((double)((_x_).real()*(_x_).real() + (_x_).imag()*(_x_).imag()))
     
    3131
    3232//-------------------------------------------------------
    33 GeneFluct3D::GeneFluct3D(TArray< complex<r_8 > >& T)
    34   : Nx_(0) , Ny_(0) , Nz_(0)
    35   , lp_(0)
    36   , array_allocated_(false) , T_(T)
    37   , cosmo_(NULL) , growth_(NULL)
    38   , redsh_ref_(-999.), kredsh_ref_(0.), dred_ref_(-999.)
    39   , loscom_ref_(-999.), dtrc_ref_(-999.), dlum_ref_(-999.), dang_ref_(-999.)
    40   , nu_ref_(-999.), dnu_ref_ (-999.)
    41   , loscom_min_(-999.), loscom_max_(-999.)
    42   , loscom2zred_min_(0.) , loscom2zred_max_(0.)
    43 {
     33GeneFluct3D::GeneFluct3D(long nx,long ny,long nz,double dx,double dy,double dz
     34                        ,unsigned short nthread,int lp)
     35{
     36 init_default();
     37
     38 lp_ = lp;
     39 nthread_ = nthread;
     40
     41 setsize(nx,ny,nz,dx,dy,dz);
     42 setalloc();
     43 setpointers(false);
     44 init_fftw();
     45}
     46
     47GeneFluct3D::GeneFluct3D(unsigned short nthread)
     48{
     49 init_default();
     50 setsize(2,2,2,1.,1.,1.);
     51 nthread_ = nthread;
     52 setalloc();
     53 setpointers(false);
     54 init_fftw();
     55}
     56
     57GeneFluct3D::~GeneFluct3D(void)
     58{
     59 delete_fftw();
     60}
     61
     62//-------------------------------------------------------
     63void GeneFluct3D::init_default(void)
     64{
     65 Nx_ = Ny_ = Nz_ = 0;
     66 is_set_fftw_plan = false;
     67 nthread_ = 0;
     68 lp_ = 0;
     69 array_allocated_ = false;
     70 cosmo_ = NULL;
     71 growth_ = NULL;
     72 redsh_ref_ = -999.;
     73 kredsh_ref_ = 0.;
     74 dred_ref_ = -999.;
     75 loscom_ref_ = -999.;
     76 dtrc_ref_ = dlum_ref_ = dang_ref_ = -999.;
     77 nu_ref_ = dnu_ref_ = -999.;
     78 loscom_min_ = loscom_max_ = -999.;
     79 loscom2zred_min_ = loscom2zred_max_ = 0.;
    4480 xobs_[0] = xobs_[1] = xobs_[2] = 0.;
    4581 zred_.resize(0);
    4682 loscom_.resize(0);
    4783 loscom2zred_.resize(0);
    48  SetNThread();
    49 }
    50 
    51 GeneFluct3D::~GeneFluct3D(void)
    52 {
    53  fftw_destroy_plan(pf_);
    54  fftw_destroy_plan(pb_);
    55 #ifdef FFTW_THREAD
    56  if(nthread_>0) fftw_cleanup_threads();
    57 #endif
    58 }
    59 
    60 //-------------------------------------------------------
    61 void GeneFluct3D::SetSize(long nx,long ny,long nz,double dx,double dy,double dz)
    62 {
    63   setsize(nx,ny,nz,dx,dy,dz);
    64   setalloc();
    65   setpointers(false);
    66   init_fftw();
    67 }
    68 
    69 void GeneFluct3D::SetObservator(double redshref,double kredshref)
    70 // L'observateur est au redshift z=0
    71 //               est situe sur la "perpendiculaire" a la face x,y
    72 //                         issue du centre de cette face
    73 // Il faut positionner le cube sur l'axe des z cad des redshifts:
    74 //     redshref  = redshift de reference
    75 //                 Si redshref<0 alors redshref=0
    76 //     kredshref = indice (en double) correspondant a ce redshift
    77 //                 Si kredshref<0 alors kredshref=nz/2 (milieu du cube)
    78 // Exemple: redshref=1.5 kredshref=250.75
    79 //    -> Le pixel i=nx/2 j=ny/2 k=250.75 est au redshift 1.5
    80 {
    81  if(redshref<0.) redshref = 0.;
    82  if(kredshref<0.) {
    83    if(Nz_<=0) {
    84      char *bla = "GeneFluct3D::SetObservator_Error: for kredsh_ref<0 SetSize should be called first";
    85      cout<<bla<<endl; throw ParmError(bla);
    86    }
    87    kredshref = Nz_/2.;
    88  }
    89  redsh_ref_  = redshref;
    90  kredsh_ref_ = kredshref;
    91  if(lp_>0)
    92    cout<<"--- GeneFluct3D::SetObservator zref="<<redsh_ref_<<" kref="<<kredsh_ref_<<endl;
    93 }
    94 
    95 void GeneFluct3D::SetCosmology(CosmoCalc& cosmo)
    96 {
    97  cosmo_ = &cosmo;
    98  if(lp_>1) cosmo_->Print();
    99 }
    100 
    101 void GeneFluct3D::SetGrowthFactor(GrowthFactor& growth)
    102 {
    103  growth_ = &growth;
    10484}
    10585
     
    171151}
    172152
    173 void GeneFluct3D::check_array_alloc(void)
    174 // Pour tester si le tableau T_ est alloue
    175 {
    176  if(array_allocated_) return;
    177  char bla[90];
    178  sprintf(bla,"GeneFluct3D::check_array_alloc_Error: array is not allocated");
    179  cout<<bla<<endl; throw ParmError(bla);
    180 }
    181 
    182153void GeneFluct3D::init_fftw(void)
    183154{
     155 if( is_set_fftw_plan ) delete_fftw();
     156
    184157 // --- Initialisation de fftw3 (attention data est sur-ecrit a l'init)
    185158 if(lp_>1) cout<<"--- GeneFluct3D::init_fftw ---"<<endl;
    186 #ifdef FFTW_THREAD
     159#ifdef WITH_FFTW_THREAD
    187160 if(nthread_>0) {
    188161   cout<<"...Computing with "<<nthread_<<" threads"<<endl;
     
    195168 if(lp_>1) cout<<"...backward plan"<<endl;
    196169 pb_ = fftw_plan_dft_c2r_3d(Nx_,Ny_,Nz_,fdata_,data_,FFTW_ESTIMATE);
     170 is_set_fftw_plan = true;
     171}
     172
     173void GeneFluct3D::delete_fftw(void)
     174{
     175 if( !is_set_fftw_plan ) return;
     176 fftw_destroy_plan(pf_);
     177 fftw_destroy_plan(pb_);
     178#ifdef WITH_FFTW_THREAD
     179 if(nthread_>0) fftw_cleanup_threads();
     180#endif
     181 is_set_fftw_plan = false;
     182}
     183
     184void GeneFluct3D::check_array_alloc(void)
     185// Pour tester si le tableau T_ est alloue
     186{
     187 if(array_allocated_) return;
     188 char bla[90];
     189 sprintf(bla,"GeneFluct3D::check_array_alloc_Error: array is not allocated");
     190 cout<<bla<<endl; throw ParmError(bla);
    197191}
    198192
    199193//-------------------------------------------------------
     194void GeneFluct3D::SetObservator(double redshref,double kredshref)
     195// L'observateur est au redshift z=0
     196//               est situe sur la "perpendiculaire" a la face x,y
     197//                         issue du centre de cette face
     198// Il faut positionner le cube sur l'axe des z cad des redshifts:
     199//     redshref  = redshift de reference
     200//                 Si redshref<0 alors redshref=0
     201//     kredshref = indice (en double) correspondant a ce redshift
     202//                 Si kredshref<0 alors kredshref=nz/2 (milieu du cube)
     203// Exemple: redshref=1.5 kredshref=250.75
     204//    -> Le pixel i=nx/2 j=ny/2 k=250.75 est au redshift 1.5
     205{
     206 if(redshref<0.) redshref = 0.;
     207 if(kredshref<0.) {
     208   if(Nz_<=0) {
     209     char *bla = "GeneFluct3D::SetObservator_Error: for kredsh_ref<0 define cube geometry first";
     210     cout<<bla<<endl; throw ParmError(bla);
     211   }
     212   kredshref = Nz_/2.;
     213 }
     214 redsh_ref_  = redshref;
     215 kredsh_ref_ = kredshref;
     216 if(lp_>0)
     217   cout<<"--- GeneFluct3D::SetObservator zref="<<redsh_ref_<<" kref="<<kredsh_ref_<<endl;
     218}
     219
     220void GeneFluct3D::SetCosmology(CosmoCalc& cosmo)
     221{
     222 cosmo_ = &cosmo;
     223 if(lp_>1) cosmo_->Print();
     224}
     225
     226void GeneFluct3D::SetGrowthFactor(GrowthFactor& growth)
     227{
     228 growth_ = &growth;
     229}
     230
    200231long GeneFluct3D::LosComRedshift(double zinc,long npoints)
    201232// Given a position of the cube relative to the observer
     
    11641195}
    11651196
    1166 double  GeneFluct3D::TurnMass2HIMass(double m_by_mpc3)
    1167 {
    1168  if(lp_>0) cout<<"--- TurnMass2HIMass : "<<m_by_mpc3<<" Msol/Mpc^3"<<endl;
    1169 
    1170  double mall=0., mgood=0.;
    1171  int_8  nall=0,  ngood=0;
    1172  for(long i=0;i<Nx_;i++) for(long j=0;j<Ny_;j++) for(long l=0;l<Nz_;l++) {
    1173    int_8 ip = IndexR(i,j,l);
    1174    mall += data_[ip]; nall++;
    1175    if(data_[ip]>0.) {mgood += data_[ip]; ngood++;}
    1176  }
    1177  if(ngood>0) mgood /= (double)ngood;
    1178  if(nall>0)  mall  /= (double)nall;
    1179  if(lp_>0) cout<<"...ngood="<<ngood<<" mgood="<<mgood
    1180                <<",  nall="<<nall<<" mall="<<mall<<endl;
    1181  if(ngood<=0 || mall<=0.) {
    1182    cout<<"TurnMass2HIMass_Error: ngood="<<ngood<<" <=0 || mall="<<mall<<" <=0"<<endl;
    1183    throw RangeCheckError("TurnMass2HIMass_Error: ngood<=0 || mall<=0");
    1184  }
    1185 
    1186  // On doit mettre m*Vol masse de HI dans notre survey
    1187  // On en met uniquement dans les pixels de masse >0.
    1188  // On MET a zero les pixels <0
    1189  // On renormalise sur les pixels>0 pour qu'on ait m*Vol masse de HI
    1190  //   comme on ne prend que les pixels >0, on doit normaliser
    1191  //   a la moyenne de <1+d_rho/rho> sur ces pixels
    1192  //   (rappel sur tout les pixels <1+d_rho/rho>=1)
    1193  // masse de HI a mettre ds 1 px:
    1194  double dm = m_by_mpc3*Vol_/ (mgood/mall) /(double)ngood;
    1195  if(lp_>0) cout<<"...HI mass density move from "
    1196                <<m_by_mpc3*Vol_/double(NRtot_)<<" to "<<dm<<" / pixel"<<endl;
    1197 
    1198  double sum = 0.;
    1199  for(long i=0;i<Nx_;i++) for(long j=0;j<Ny_;j++) for(long l=0;l<Nz_;l++) {
    1200    int_8 ip = IndexR(i,j,l);
    1201    if(data_[ip]<=0.) data_[ip] = 0.;
    1202    else {
    1203      data_[ip] *= dm; // par coherence on multiplie aussi les <=0
    1204      sum += data_[ip];  // mais on ne les compte pas
    1205    }
    1206  }
    1207 
    1208  if(lp_>0) cout<<sum<<"...mass HI put into survey / "<<m_by_mpc3*Vol_<<endl;
    1209 
    1210  return sum;
    1211 }
    1212 
    1213 double GeneFluct3D::TurnMass2MeanNumber(double n_by_mpc3)
    1214 // do NOT treate negative or nul values
    1215 {
    1216  if(lp_>0) cout<<"--- TurnMass2MeanNumber : "<<n_by_mpc3<<" gal/Mpc^3"<<endl;
     1197double GeneFluct3D::TurnMass2MeanNumber(double val_by_mpc3)
     1198{
     1199 if(lp_>0) cout<<"--- TurnMass2MeanNumber : "<<val_by_mpc3<<" quantity (gal or mass)/Mpc^3"<<endl;
    12171200
    12181201 double mall=0., mgood=0.;
     
    12321215 }
    12331216
    1234  // On doit mettre n*Vol galaxies dans notre survey
     1217 // On doit mettre n*Vol galaxies (ou Msol) dans notre survey
    12351218 // On en met uniquement dans les pixels de masse >0.
    1236  // On NE met PAS a zero les pixels <0
    1237  // On renormalise sur les pixels>0 pour qu'on ait n*Vol galaxies
     1219 // On MET a zero les pixels <0
     1220 // On renormalise sur les pixels>0 pour qu'on ait n*Vol galaxies (ou Msol)
    12381221 //   comme on ne prend que les pixels >0, on doit normaliser
    12391222 //   a la moyenne de <1+d_rho/rho> sur ces pixels
    12401223 //   (rappel sur tout les pixels <1+d_rho/rho>=1)
    1241  // nb de gal a mettre ds 1 px:
    1242  double dn = n_by_mpc3*Vol_/ (mgood/mall) /(double)ngood;
    1243  if(lp_>0) cout<<"...galaxy density move from "
    1244                <<n_by_mpc3*Vol_/double(NRtot_)<<" to "<<dn<<" / pixel"<<endl;
     1224 // nb de gal (ou Msol) a mettre ds 1 px:
     1225 double dn = val_by_mpc3*Vol_/ (mgood/mall) /(double)ngood;
     1226 if(lp_>0) cout<<"...quantity density move from "
     1227               <<val_by_mpc3*Vol_/double(NRtot_)<<" to "<<dn<<" / pixel"<<endl;
    12451228
    12461229 double sum = 0.;
    12471230 for(long i=0;i<Nx_;i++) for(long j=0;j<Ny_;j++) for(long l=0;l<Nz_;l++) {
    12481231   int_8 ip = IndexR(i,j,l);
    1249    data_[ip] *= dn; // par coherence on multiplie aussi les <=0
    1250    if(data_[ip]>0.) sum += data_[ip];  // mais on ne les compte pas
    1251  }
    1252 
    1253  if(lp_>0) cout<<sum<<"...galaxies put into survey / "<<n_by_mpc3*Vol_<<endl;
     1232   if(data_[ip]<=0.) data_[ip] = 0.;
     1233   else {
     1234     data_[ip] *= dn;
     1235     sum += data_[ip];
     1236   }
     1237 }
     1238
     1239 if(lp_>0) cout<<sum<<"...quantity put into survey / "<<val_by_mpc3*Vol_<<endl;
    12541240
    12551241 return sum;
     
    13291315}
    13301316
     1317void GeneFluct3D::AddNoise2Real(double snoise,int type_evol)
     1318// add noise to every pixels (meme les <=0 !)
     1319// type_evol = 0 : pas d'evolution de la puissance du bruit
     1320//             1 : evolution de la puissance du bruit avec la distance a l'observateur
     1321//             2 : evolution de la puissance du bruit avec la distance du plan Z
     1322//                 (tous les plans Z sont mis au meme redshift z de leur milieu)
     1323{
     1324 if(lp_>0) cout<<"--- AddNoise2Real: snoise = "<<snoise<<" evol="<<type_evol<<endl;
     1325 check_array_alloc();
     1326
     1327 if(type_evol<0) type_evol = 0;
     1328 if(type_evol>2) {
     1329   char *bla = "GeneFluct3D::AddNoise2Real_Error: bad type_evol value";
     1330   cout<<bla<<endl; throw ParmError(bla);
     1331 }
     1332
     1333 vector<double> correction;
     1334 InterpFunc *intercor = NULL;
     1335
     1336 if(type_evol>0) {
     1337   // Sigma_Noise(en mass) :
     1338   //      Slim ~ 1/sqrt(DNu) * sqrt(nlobe)   en W/m^2Hz
     1339   //      Flim ~ sqrt(DNu) * sqrt(nlobe)   en W/m^2
     1340   //      Mlim ~ sqrt(DNu) * (Dlum)^2 * sqrt(nlobe)  en Msol
     1341   //                                    nlobe ~ 1/Dtrcom^2
     1342   //      Mlim ~ sqrt(DNu) * (Dlum)^2 / Dtrcom
     1343   if(cosmo_ == NULL || redsh_ref_<0.| loscom2zred_.size()<1) {
     1344     char *bla = "GeneFluct3D::AddNoise2Real_Error: set Observator and Cosmology first";
     1345     cout<<bla<<endl; throw ParmError(bla);
     1346   }
     1347   InterpFunc interpinv(loscom2zred_min_,loscom2zred_max_,loscom2zred_);
     1348   long nsz = loscom2zred_.size(), nszmod=((nsz>10)? nsz/10: 1);
     1349   for(long i=0;i<nsz;i++) {
     1350     double d = interpinv.X(i);
     1351     double zred = interpinv(d);
     1352     double dtrc = cosmo_->Dtrcom(zred);  // pour variation angle solide
     1353     double dlum = cosmo_->Dlum(zred);  // pour variation conversion mass HI
     1354     double dred = Dz_/(cosmo_->Dhubble()/cosmo_->E(zred));
     1355     double dnu  = Fr_HyperFin_Par *dred/pow(1.+zred,2.); // pour variation dNu
     1356     double corr = sqrt(dnu/dnu_ref_) * pow(dlum/dlum_ref_,2.) * dtrc_ref_/dtrc;
     1357     if(lp_>0 && (i==0 || i==nsz-1 || i%nszmod==0))
     1358       cout<<"i="<<i<<" d="<<d<<" red="<<zred<<" dred="<<dred<<" dnu="<<dnu
     1359           <<" dtrc="<<dtrc<<" dlum="<<dlum<<" -> cor="<<corr<<endl;
     1360     correction.push_back(corr);
     1361   }
     1362   intercor = new InterpFunc(loscom2zred_min_,loscom2zred_max_,correction);
     1363 }
     1364
     1365 double corrlim[2] = {1.,1.};
     1366 for(long i=0;i<Nx_;i++) {
     1367   double dx2 = DXcom(i); dx2 *= dx2;
     1368   for(long j=0;j<Ny_;j++) {
     1369     double dy2 = DYcom(j); dy2 *= dy2;
     1370     for(long l=0;l<Nz_;l++) {
     1371       double corr = 1.;
     1372       if(type_evol>0) {
     1373         double dz = DZcom(l);
     1374         if(type_evol==1) dz = sqrt(dx2+dy2+dz*dz);
     1375           else dz = fabs(dz); // tous les plans Z au meme redshift
     1376         corr = (*intercor)(dz);
     1377         if(corr<corrlim[0]) corrlim[0]=corr; else if(corr>corrlim[1]) corrlim[1]=corr;
     1378       }
     1379       int_8 ip = IndexR(i,j,l);
     1380       data_[ip] += snoise*corr*NorRand();
     1381     }
     1382   }
     1383 }
     1384 if(type_evol>0)
     1385   cout<<"correction factor range: ["<<corrlim[0]<<","<<corrlim[1]<<"]"<<endl;
     1386
     1387 if(intercor!=NULL) delete intercor;
     1388}
     1389
     1390}  // Fin namespace SOPHYA
     1391
     1392
     1393
     1394
     1395/*********************************************************************
    13311396void GeneFluct3D::AddAGN(double lfjy,double lsigma,double powlaw)
    13321397// Add AGN flux into simulation:
     
    14231488 
    14241489}
    1425 
    1426 void GeneFluct3D::AddNoise2Real(double snoise,int type_evol)
    1427 // add noise to every pixels (meme les <=0 !)
    1428 // type_evol = 0 : pas d'evolution de la puissance du bruit
    1429 //             1 : evolution de la puissance du bruit avec la distance a l'observateur
    1430 //             2 : evolution de la puissance du bruit avec la distance du plan Z
    1431 //                 (tous les plans Z sont mis au meme redshift z de leur milieu)
    1432 {
    1433  if(lp_>0) cout<<"--- AddNoise2Real: snoise = "<<snoise<<" evol="<<type_evol<<endl;
    1434  check_array_alloc();
    1435 
    1436  if(type_evol<0) type_evol = 0;
    1437  if(type_evol>2) {
    1438    char *bla = "GeneFluct3D::AddNoise2Real_Error: bad type_evol value";
    1439    cout<<bla<<endl; throw ParmError(bla);
    1440  }
    1441 
    1442  vector<double> correction;
    1443  InterpFunc *intercor = NULL;
    1444 
    1445  if(type_evol>0) {
    1446    // Sigma_Noise(en mass) :
    1447    //      Slim ~ 1/sqrt(DNu) * sqrt(nlobe)   en W/m^2Hz
    1448    //      Flim ~ sqrt(DNu) * sqrt(nlobe)   en W/m^2
    1449    //      Mlim ~ sqrt(DNu) * (Dlum)^2 * sqrt(nlobe)  en Msol
    1450    //                                    nlobe ~ 1/Dtrcom^2
    1451    //      Mlim ~ sqrt(DNu) * (Dlum)^2 / Dtrcom
    1452    if(cosmo_ == NULL || redsh_ref_<0.| loscom2zred_.size()<1) {
    1453      char *bla = "GeneFluct3D::AddNoise2Real_Error: set Observator and Cosmology first";
    1454      cout<<bla<<endl; throw ParmError(bla);
    1455    }
    1456    InterpFunc interpinv(loscom2zred_min_,loscom2zred_max_,loscom2zred_);
    1457    long nsz = loscom2zred_.size(), nszmod=((nsz>10)? nsz/10: 1);
    1458    for(long i=0;i<nsz;i++) {
    1459      double d = interpinv.X(i);
    1460      double zred = interpinv(d);
    1461      double dtrc = cosmo_->Dtrcom(zred);  // pour variation angle solide
    1462      double dlum = cosmo_->Dlum(zred);  // pour variation conversion mass HI
    1463      double dred = Dz_/(cosmo_->Dhubble()/cosmo_->E(zred));
    1464      double dnu  = Fr_HyperFin_Par *dred/pow(1.+zred,2.); // pour variation dNu
    1465      double corr = sqrt(dnu/dnu_ref_) * pow(dlum/dlum_ref_,2.) * dtrc_ref_/dtrc;
    1466      if(lp_>0 && (i==0 || i==nsz-1 || i%nszmod==0))
    1467        cout<<"i="<<i<<" d="<<d<<" red="<<zred<<" dred="<<dred<<" dnu="<<dnu
    1468            <<" dtrc="<<dtrc<<" dlum="<<dlum<<" -> cor="<<corr<<endl;
    1469      correction.push_back(corr);
    1470    }
    1471    intercor = new InterpFunc(loscom2zred_min_,loscom2zred_max_,correction);
    1472  }
    1473 
    1474  double corrlim[2] = {1.,1.};
    1475  for(long i=0;i<Nx_;i++) {
    1476    double dx2 = DXcom(i); dx2 *= dx2;
    1477    for(long j=0;j<Ny_;j++) {
    1478      double dy2 = DYcom(j); dy2 *= dy2;
    1479      for(long l=0;l<Nz_;l++) {
    1480        double corr = 1.;
    1481        if(type_evol>0) {
    1482          double dz = DZcom(l);
    1483          if(type_evol==1) dz = sqrt(dx2+dy2+dz*dz);
    1484            else dz = fabs(dz); // tous les plans Z au meme redshift
    1485          corr = (*intercor)(dz);
    1486          if(corr<corrlim[0]) corrlim[0]=corr; else if(corr>corrlim[1]) corrlim[1]=corr;
    1487        }
    1488        int_8 ip = IndexR(i,j,l);
    1489        data_[ip] += snoise*corr*NorRand();
    1490      }
    1491    }
    1492  }
    1493  if(type_evol>0)
    1494    cout<<"correction factor range: ["<<corrlim[0]<<","<<corrlim[1]<<"]"<<endl;
    1495 
    1496  if(intercor!=NULL) delete intercor;
    1497 }
    1498 
    1499 }  // Fin namespace SOPHYA
     1490*********************************************************************/
  • trunk/Cosmo/SimLSS/genefluct3d.h

    r3331 r3349  
    2424class GeneFluct3D {
    2525public:
    26   GeneFluct3D(TArray< complex<r_8 > >& T);
     26  GeneFluct3D(long nx,long ny,long nz,double dx,double dy,double dz,unsigned short nthread=0,int lp=0);  // Mpc
     27  GeneFluct3D(unsigned short nthread=0);
    2728  virtual ~GeneFluct3D(void);
    2829
    29   void SetNThread(unsigned short nthread=0) {nthread_ = nthread;}
    30   void SetSize(long nx,long ny,long nz,double dx,double dy,double dz);  // Mpc
    3130  // Distance los comobile a l'observateur
    3231  void SetObservator(double redshref=0.,double kredshref=0.);
     
    111110
    112111  void TurnFluct2Mass(void);
    113   double TurnMass2HIMass(double m_by_mpc3);
    114   double TurnMass2MeanNumber(double n_by_mpc3);
     112  double TurnMass2MeanNumber(double val_by_mpc3);
    115113  double ApplyPoisson(void);
    116114  double TurnNGal2Mass(FunRan& massdist,bool axeslog=false);
    117115  double TurnNGal2MassQuick(SchechterMassDist& schmdist);
    118116  double TurnMass2Flux(void);
    119   void AddAGN(double lfjy,double lsigma,double powlaw=0.);
     117  //void AddAGN(double lfjy,double lsigma,double powlaw=0.);
    120118  void AddNoise2Real(double snoise,int type_evol=0);
    121119
     
    133131
    134132protected:
     133  void init_default(void);
    135134  void setsize(long nx,long ny,long nz,double dx,double dy,double dz);
    136135  void setalloc(void);
    137136  void setpointers(bool from_real);
    138137  void init_fftw(void);
     138  void delete_fftw(void);
    139139  long manage_coefficients(void);
    140140  double compute_power_carte(void);
     
    157157
    158158  // la gestion de la FFT
     159  bool is_set_fftw_plan;
    159160  fftw_plan pf_,pb_;
    160161  unsigned short nthread_;
     
    163164  // le stockage du Cube de donnees et les pointeurs
    164165  bool array_allocated_;  // true if array has been allocated
    165   TArray< complex<r_8> >& T_;
     166  TArray< complex<r_8> > T_;
    166167  fftw_complex *fdata_;
    167168  TArray<r_8> R_;
Note: See TracChangeset for help on using the changeset viewer.