source: Sophya/trunk/Cosmo/SimLSS/genefluct3d.h@ 3781

Last change on this file since 3781 was 3781, checked in by cmv, 15 years ago

ameliorations mineures, cmv 20/05/2010

File size: 7.5 KB
RevLine 
[3115]1#ifndef GENEFLUCT3D_SEEN
2#define GENEFLUCT3D_SEEN
3
4#include "machdefs.h"
[3289]5#include <math.h>
[3115]6#include "genericfunc.h"
7#include "tarray.h"
[3141]8#include "histerr.h"
9#include "hist2err.h"
[3115]10#include "perandom.h"
11
[3141]12#include "FFTW/fftw3.h"
13#include "FitsIO/fitsio.h"
14
[3115]15#include <vector>
[3619]16#include <algorithm>
[3115]17
[3157]18#include "cosmocalc.h"
[3115]19#include "pkspectrum.h"
[3768]20#include "schechter.h"
[3115]21
[3518]22#define WITH_FFTW_THREAD
[3115]23
[3770]24//NE PAS DECOMMENTER, UTILISEZ LA MAKEFILE ("g++ -c -DGEN3D_FLOAT ...")
[3518]25#if defined(GEN3D_FLOAT)
26#define GEN3D_TYPE r_4
27#define GEN3D_FFTW_PLAN fftwf_plan
28#define GEN3D_FFTW_COMPLEX fftwf_complex
29#else
30#define GEN3D_TYPE r_8
31#define GEN3D_FFTW_PLAN fftw_plan
32#define GEN3D_FFTW_COMPLEX fftw_complex
33#endif
34
[3115]35namespace SOPHYA {
36
37//-----------------------------------------------------------------------------------
38class GeneFluct3D {
39public:
[3349]40 GeneFluct3D(long nx,long ny,long nz,double dx,double dy,double dz,unsigned short nthread=0,int lp=0); // Mpc
41 GeneFluct3D(unsigned short nthread=0);
[3115]42 virtual ~GeneFluct3D(void);
43
[3271]44 // Distance los comobile a l'observateur
[3157]45 void SetObservator(double redshref=0.,double kredshref=0.);
[3271]46 inline double DXcom(long i) {return i*Dx_ - xobs_[0];}
47 inline double DYcom(long j) {return j*Dy_ - xobs_[1];}
48 inline double DZcom(long k) {return k*Dz_ - xobs_[2];}
49 inline double Dcom(long i,long j,long k) {
50 double dx=DXcom(i), dy=DYcom(j), dz=DZcom(k);
51 return sqrt(dx*dx+dy*dy+dz*dz);
52 }
[3157]53 void SetCosmology(CosmoCalc& cosmo);
54 void SetGrowthFactor(GrowthFactor& growth);
[3199]55 long LosComRedshift(double zinc=0.001,long npoints=-1);
[3115]56
[3518]57 TArray< complex<GEN3D_TYPE> >& GetComplexArray(void) {return T_;}
58 GEN3D_FFTW_COMPLEX * GetComplexPointer(void) {return fdata_;}
59 TArray<GEN3D_TYPE>& GetRealArray(void) {return R_;}
60 GEN3D_TYPE* GetRealPointer(void) {return data_;}
[3141]61
62 // Pour adressage data_[ip]
63 inline int_8 IndexR(long i,long j,long k) {return (int_8)(k+NTz_*(j+Ny_*i));}
64 // Pour adressage fdata_[ip][0-1]
65 inline int_8 IndexC(long i,long j,long k) {return (int_8)(k+NCz_*(j+Ny_*i));}
[3330]66 // On peut aussi adresser:
67 // TArray< complex<r_8> >& pk = gf3d.GetComplexArray();
68 // pk(k,j,i) avec k=[0,NCz_[ j=[0,Ny_[ i=[0,Nx_[
69 // pk[IndexC(i,j,k)]
70 // TArray<r_8>& rgen = gf3d.GetRealArray();
71 // rgen(k,j,i) avec k=[0,NTz_[ j=[0,Ny_[ i=[0,Nx_[
72 // mais seul k=[0,Nz_[ est utile
73 // rgen[IndexR(i,j,k)]
74 // ATTENTION: TArray adresse en memoire a l'envers du C !
75 // Tarray(n1,n2,n3) == Carray[n3][n2][n1]
[3141]76
77 vector<long> GetNpix(void) {return N_;}
78 int_8 NPix(void) {return NRtot_;}
[3781]79 int_8 NCoeff(void) {return NFcoef_;}
[3768]80 long Nx(void) {return Nx_;}
81 long Ny(void) {return Ny_;}
82 long Nz(void) {return Nz_;}
83 double Dx(void) {return Dx_;}
84 double Dy(void) {return Dy_;}
85 double Dz(void) {return Dz_;}
[3141]86
[3290]87 // Return |K_i| module relative to pixel indices
[3770]88 inline r_8 AbsKx(long i) {long ii=(i>Nx_/2)? Nx_-i :i; return ii*Dkx_;}
89 inline r_8 AbsKy(long j) {long jj=(j>Ny_/2)? Ny_-j :j; return jj*Dky_;}
90 inline r_8 AbsKz(long l) {return l*Dkz_;}
91 inline r_8 Kx(long i) {long ii=(i>Nx_/2)? i-Nx_ :i; return ii*Dkx_;}
92 inline r_8 Ky(long j) {long jj=(j>Ny_/2)? j-Ny_ :j; return jj*Dky_;}
[3290]93 inline r_8 Kz(long l) {return l*Dkz_;}
94
[3141]95 vector<r_8> GetDinc(void) {return D_;}
96 double GetDVol(void) {return dVol_;}
[3115]97 double GetVol(void) {return Vol_;}
[3141]98
99 vector<r_8> GetKinc(void) {return Dk_;}
100 vector<r_8> GetKnyq(void) {return Knyq_;}
[3115]101 double GetKmax(void) {return sqrt(Knyqx_*Knyqx_+Knyqy_*Knyqy_+Knyqz_*Knyqz_);}
[3141]102 double GetKTmax(void) {return sqrt(Knyqx_*Knyqx_+Knyqy_*Knyqy_);}
103 double GetKincMin(void)
104 {vector<r_8>::const_iterator it = min_element(Dk_.begin(), Dk_.end()); return *it;}
[3289]105 double GetKincMax(void)
106 {vector<r_8>::const_iterator it = max_element(Dk_.begin(), Dk_.end()); return *it;}
[3141]107 double GetKTincMin(void) {return min(Dk_[0],Dk_[1]);}
[3289]108 double GetKTincMax(void) {return max(Dk_[0],Dk_[1]);}
[3115]109
[3768]110 double Zref(void) {return redsh_ref_;}
111 double ZrefPk(void) {return compute_pk_redsh_ref_;}
112 double Dref(void) {return growth_ref_;}
113 double DrefPk(void)
114 {return (growth_!=NULL && compute_pk_redsh_ref_>=0.) ? (*growth_)(compute_pk_redsh_ref_): -999.;}
[3770]115 double Href(void) {return h_ref_;}
[3768]116
117 void ComputeFourier0(PkSpectrumZ& pk_at_z);
118 void ComputeFourier(PkSpectrumZ& pk_at_z);
[3115]119 void FilterByPixel(void);
[3770]120 void ToVelLoS(void);
[3141]121
[3115]122 void ComputeReal(void);
[3331]123 void ApplyGrowthFactor(int type_evol=1);
[3768]124 void ApplyDerGrowthFactor(int type_evol=1);
[3141]125
[3115]126 void ReComputeFourier(void);
127
[3141]128 int ComputeSpectrum(HistoErr& herr);
129 int ComputeSpectrum2D(Histo2DErr& herr);
[3330]130 int ComputeSpectrum(HistoErr& herr,double sigma,bool pixcor);
131 int ComputeSpectrum2D(Histo2DErr& herr,double sigma,bool pixcor);
[3141]132
[3134]133 int_8 VarianceFrReal(double R,double& var);
[3261]134 int_8 MeanSigma2(double& rm,double& rs2,double vmin=1.,double vmax=-1.
135 ,bool useout=false,double vout=0.);
[3320]136 int_8 MinMax(double& xmin,double& xmax,double vmin=1.,double vmax=-1.);
[3134]137 int_8 NumberOfBad(double vmin=-1.e+150,double vmax=1.e+150);
138 int_8 SetToVal(double vmin, double vmax,double val0=0.);
[3283]139 void ScaleOffset(double scalecube=1.,double offsetcube=0.);
[3115]140
141 void TurnFluct2Mass(void);
[3358]142 double TurnFluct2MeanNumber(double val_by_mpc3);
[3115]143 double ApplyPoisson(void);
144 double TurnNGal2Mass(FunRan& massdist,bool axeslog=false);
[3320]145 double TurnNGal2MassQuick(SchechterMassDist& schmdist);
[3115]146 double TurnMass2Flux(void);
[3349]147 //void AddAGN(double lfjy,double lsigma,double powlaw=0.);
[3331]148 void AddNoise2Real(double snoise,int type_evol=0);
[3115]149
[3141]150 void WriteFits(string cfname,int bitpix=FLOAT_IMG);
151 void ReadFits(string cfname);
152
153 void WritePPF(string cfname,bool write_real=true);
154 void ReadPPF(string cfname);
[3281]155 void WriteSlicePPF(string cfname);
[3524]156 void NTupleCheck(POutPersist &pos,string ntname,unsigned long nent);
[3141]157
[3150]158 void SetPrtLevel(int lp=0) {lp_ = lp;}
[3115]159 void Print(void);
160
[3199]161//-------------------------------------------------------------------
162
[3115]163protected:
[3349]164 void init_default(void);
[3141]165 void setsize(long nx,long ny,long nz,double dx,double dy,double dz);
166 void setalloc(void);
167 void setpointers(bool from_real);
[3154]168 void init_fftw(void);
[3349]169 void delete_fftw(void);
[3129]170 long manage_coefficients(void);
[3115]171 double compute_power_carte(void);
[3141]172 void check_array_alloc(void);
[3662]173 inline double pixelfilter(double x) // ATTENTION: seulement pour x>0
[3120]174 {return (x<0.025) ? 1.-x*x/6.*(1.-x*x/20.): sin(x)/x;}
[3115]175
[3154]176 // valeurs dans l'espace reel
[3141]177 long Nx_,Ny_,Nz_; vector<long> N_;
[3129]178 long NCz_,NTz_;
[3781]179 int_8 NRtot_,NFcoef_;
[3141]180
181 double Dx_,Dy_,Dz_; vector<double> D_;
182
[3154]183 // valeurs dans l'espace des K
[3141]184 double Dkx_,Dky_,Dkz_; vector<double> Dk_;
185 double Knyqx_,Knyqy_,Knyqz_; vector<double> Knyq_;
186 double Dk3_;
[3115]187 double dVol_, Vol_;
188
[3154]189 // la gestion de la FFT
[3518]190 bool is_set_fft_plan;
191 GEN3D_FFTW_PLAN pf_,pb_;
[3115]192 unsigned short nthread_;
[3150]193 int lp_;
[3115]194
[3154]195 // le stockage du Cube de donnees et les pointeurs
[3141]196 bool array_allocated_; // true if array has been allocated
[3524]197 unsigned short array_type; // 0=empty, 1=real, 2=complex
[3518]198 TArray< complex<GEN3D_TYPE> > T_;
199 GEN3D_FFTW_COMPLEX *fdata_;
200 TArray<GEN3D_TYPE> R_;
201 GEN3D_TYPE *data_;
[3154]202
203 // l'observateur
[3157]204 CosmoCalc *cosmo_;
205 GrowthFactor *growth_;
[3768]206 double good_dzinc_;
[3271]207 double redsh_ref_,kredsh_ref_,dred_ref_;
[3768]208 double compute_pk_redsh_ref_;
[3770]209 double h_ref_, loscom_ref_,dtrc_ref_, dlum_ref_, dang_ref_;
[3768]210 double growth_ref_, dsdz_growth_ref_;
[3271]211 double nu_ref_, dnu_ref_ ;
[3157]212 double xobs_[3];
[3768]213
[3271]214 double loscom_min_, loscom_max_;
[3157]215 vector<double> zred_, loscom_;
[3199]216 double loscom2zred_min_, loscom2zred_max_;
217 vector<double> loscom2zred_;
218
[3768]219 double zredmin_dpsd_, zredmax_dpsd_;
220 vector<double> dpsdfrzred_;
221
[3115]222};
223
[3325]224} // Fin du namespace SOPHYA
[3115]225
226#endif
Note: See TracBrowser for help on using the repository browser.