Changeset 3768 in Sophya for trunk/Cosmo/SimLSS/genefluct3d.cc
- Timestamp:
- May 3, 2010, 4:08:34 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cosmo/SimLSS/genefluct3d.cc
r3746 r3768 1 #include "sopnamsp.h"2 1 #include "machdefs.h" 3 2 #include <iostream> … … 88 87 cosmo_ = NULL; 89 88 growth_ = NULL; 89 good_dzinc_ = 0.01; 90 compute_pk_redsh_ref_ = -999.; 90 91 redsh_ref_ = -999.; 91 92 kredsh_ref_ = 0.; … … 262 263 // 263 264 { 265 if(zinc<=0.) zinc = good_dzinc_; 264 266 if(lp_>0) cout<<"--- LosComRedshift: zinc="<<zinc<<" , npoints="<<npoints<<endl; 265 267 266 if(cosmo_ == NULL || redsh_ref_<0.) {267 const char *bla = "GeneFluct3D::LosComRedshift_Error: set Observator and Cosmologyfirst";268 if(cosmo_ == NULL || growth_==NULL || redsh_ref_<0.) { 269 const char *bla = "GeneFluct3D::LosComRedshift_Error: set Observator, Cosmology and Growth first"; 268 270 cout<<bla<<endl; throw ParmError(bla); 269 271 } … … 275 277 dlum_ref_ = cosmo_->Dlum(redsh_ref_); 276 278 dang_ref_ = cosmo_->Dang(redsh_ref_); 279 h_ref = cosmo_->H(redsh_ref_); 280 growth_ref_ = (*growth_)(redsh_ref_); 281 dsdz_growth_ref_ = growth_->DsDz(redsh_ref_,zinc); 277 282 nu_ref_ = Fr_HyperFin_Par/(1.+redsh_ref_); // GHz 278 283 dnu_ref_ = Fr_HyperFin_Par *dred_ref_/pow(1.+redsh_ref_,2.); // GHz … … 282 287 <<", nuref="<<nu_ref_ <<" GHz" 283 288 <<", dnuref="<<dnu_ref_ <<" GHz"<<endl 289 <<" H="<<h_ref<<" km/s/Mpc" 290 <<", D="<<growth_ref_ 291 <<", dD/dz="<<dsdz_growth_ref_<<endl 284 292 <<" dlosc="<<loscom_ref_<<" Mpc com" 285 293 <<", dtrc="<<dtrc_ref_<<" Mpc com" … … 335 343 336 344 // Fill the corresponding vectors for loscom and zred 337 // Be shure to have one dlc <loscom_min and one >loscom_max 338 if(zinc<=0.) zinc = 0.01; 345 // Be shure to have one dlc<loscom_min and one dlc>loscom_max 339 346 double zmin = 0., dlcmin=0.; 340 347 while(1) { … … 397 404 } 398 405 406 407 // Compute the table for D'(z)/D(z) where D'(z)=dD/dEta (Eta is conformal time) 408 zredmin_dpsd_ = zred_[0]; 409 zredmax_dpsd_ = zred_[zred_.size()-1]; 410 long nptd = long(sqrt(Nx_*Nx_ + Ny_*Ny_ +Nz_*Nz_)); 411 if(nptd<10) nptd = 10; 412 good_dzinc_ = (zredmax_dpsd_ - zredmin_dpsd_)/nptd; 413 if(lp_>0) cout<<"...good_dzinc changed to "<<good_dzinc_<<endl; 414 dpsdfrzred_.resize(0); 415 double dz = (zredmax_dpsd_ - zredmin_dpsd_)/(nptd-1); 416 int nmod = nptd/5; if(nmod==0) nmod = 1; 417 if(lp_>0) cout<<"...Compute table D'/D on "<<nptd<<" pts for z[" 418 <<zredmin_dpsd_<<","<<zredmax_dpsd_<<"]"<<endl; 419 for(int i=0;i<nptd;i++) { 420 double z = zredmin_dpsd_ + i*dz; 421 double v = -cosmo_->H(z) * growth_->DsDz(z,good_dzinc_) / (*growth_)(z); 422 dpsdfrzred_.push_back(v); 423 if(lp_ && (i%nmod==0 || i==nptd-1)) cout<<" z="<<z<<" D'/D="<<v<<" km/s/Mpc"<<endl; 424 } 425 399 426 return zred_.size(); 400 427 } … … 415 442 fwrt.WriteKey("DKY",Dky_," Mpc^-1"); 416 443 fwrt.WriteKey("DKZ",Dkz_," Mpc^-1"); 444 fwrt.WriteKey("ZREFPK",compute_pk_redsh_ref_," Pk computed redshift"); 417 445 fwrt.WriteKey("ZREF",redsh_ref_," reference redshift"); 418 446 fwrt.WriteKey("KZREF",kredsh_ref_," reference redshift on z axe"); 447 fwrt.WriteKey("Growth",Dref()," growth at reference redshift"); 448 fwrt.WriteKey("GrowthPk",DrefPk()," growth at Pk computed redshift"); 419 449 fwrt.Write(R_); 420 450 } catch (PThrowable & exc) { … … 440 470 double dy = fimg.ReadKey("DY"); 441 471 double dz = fimg.ReadKey("DZ"); 472 double pkzref = fimg.ReadKey("ZREFPK"); 442 473 double zref = fimg.ReadKey("ZREF"); 443 474 double kzref = fimg.ReadKey("KZREF"); … … 447 478 SetObservator(zref,kzref); 448 479 array_allocated_ = true; 480 compute_pk_redsh_ref_ = pkzref; 449 481 } catch (PThrowable & exc) { 450 482 cout<<"Exception : "<<(string)typeid(exc).name() … … 468 500 R_.Info()["DY"] = (r_8)Dy_; 469 501 R_.Info()["DZ"] = (r_8)Dz_; 502 R_.Info()["ZREFPK"] = (r_8)compute_pk_redsh_ref_; 470 503 R_.Info()["ZREF"] = (r_8)redsh_ref_; 471 504 R_.Info()["KZREF"] = (r_8)kredsh_ref_; 505 R_.Info()["Growth"] = (r_8)Dref(); 506 R_.Info()["GrowthPk"] = (r_8)DrefPk(); 472 507 POutPersist pos(cfname.c_str()); 473 508 if(write_real) pos << PPFNameTag("rgen") << R_; … … 506 541 r_8 dy = R_.Info()["DY"]; 507 542 r_8 dz = R_.Info()["DZ"]; 543 r_8 pkzref = R_.Info()["ZREFPK"]; 508 544 r_8 zref = R_.Info()["ZREF"]; 509 545 r_8 kzref = R_.Info()["KZREF"]; … … 512 548 SetObservator(zref,kzref); 513 549 array_allocated_ = true; 550 compute_pk_redsh_ref_ = pkzref; 514 551 } catch (PThrowable & exc) { 515 552 cout<<"Exception : "<<(string)typeid(exc).name() … … 630 667 631 668 //------------------------------------------------------- 632 void GeneFluct3D::ComputeFourier0( GenericFunc& pk_at_z)669 void GeneFluct3D::ComputeFourier0(PkSpectrumZ& pk_at_z) 633 670 // cf ComputeFourier() mais avec autre methode de realisation du spectre 634 671 // (attention on fait une fft pour realiser le spectre) 635 672 { 636 673 compute_pk_redsh_ref_ = pk_at_z.GetZ(); 637 674 // --- realisation d'un tableau de tirage gaussiens 638 if(lp_>0) cout<<"--- ComputeFourier0: before gaussian filling ---"<<endl; 675 if(lp_>0) cout<<"--- ComputeFourier0 at z="<<compute_pk_redsh_ref_ 676 <<": before gaussian filling ---"<<endl; 639 677 // On tient compte du pb de normalisation de FFTW3 640 678 double sntot = sqrt((double)NRtot_); … … 651 689 if(lp_>0) cout<<"...before Fourier realization filling"<<endl; 652 690 T_(0,0,0) = complex<GEN3D_TYPE>(0.); // on coupe le continue et on l'initialise 653 long lmod = Nx_/ 10; if(lmod<1) lmod=1;691 long lmod = Nx_/20; if(lmod<1) lmod=1; 654 692 for(long i=0;i<Nx_;i++) { 655 long ii = (i>Nx_/2) ? Nx_-i : i; 656 double kx = ii*Dkx_; kx *= kx; 657 if(lp_>0 && i%lmod==0) cout<<"i="<<i<<" ii="<<ii<<endl; 693 double kx = Kx(i); kx *= kx; 694 if(lp_>0 && i%lmod==0) cout<<"i="<<i<<"\t nx-i="<<Nx_-i<<"\t kx="<<kx<<"\t pk="<<pk_at_z(kx)<<endl; 658 695 for(long j=0;j<Ny_;j++) { 659 long jj = (j>Ny_/2) ? Ny_-j : j; 660 double ky = jj*Dky_; ky *= ky; 696 double ky = Ky(j); ky *= ky; 661 697 for(long l=0;l<NCz_;l++) { 662 double kz = l*Dkz_; kz *= kz;698 double kz = Kz(l); kz *= kz; 663 699 if(i==0 && j==0 && l==0) continue; // Suppression du continu 664 700 double k = sqrt(kx+ky+kz); … … 680 716 681 717 //------------------------------------------------------- 682 void GeneFluct3D::ComputeFourier( GenericFunc& pk_at_z)718 void GeneFluct3D::ComputeFourier(PkSpectrumZ& pk_at_z) 683 719 // Calcule une realisation du spectre "pk_at_z" 684 720 // Attention: dans TArray le premier indice varie le + vite … … 692 728 // --- RaZ du tableau 693 729 T_ = complex<GEN3D_TYPE>(0.); 730 compute_pk_redsh_ref_ = pk_at_z.GetZ(); 694 731 695 732 // --- On remplit avec une realisation 696 if(lp_>0) cout<<"--- ComputeFourier ---"<<endl;697 long lmod = Nx_/ 10; if(lmod<1) lmod=1;733 if(lp_>0) cout<<"--- ComputeFourier at z="<<compute_pk_redsh_ref_<<" ---"<<endl; 734 long lmod = Nx_/20; if(lmod<1) lmod=1; 698 735 for(long i=0;i<Nx_;i++) { 699 long ii = (i>Nx_/2) ? Nx_-i : i; 700 double kx = ii*Dkx_; kx *= kx; 701 if(lp_>0 && i%lmod==0) cout<<"i="<<i<<" ii="<<ii<<endl; 736 double kx = Kx(i); kx *= kx; 737 if(lp_>0 && i%lmod==0) cout<<"i="<<i<<"\t nx-i="<<Nx_-i<<"\t kx="<<kx<<"\t pk="<<pk_at_z(kx)<<endl; 702 738 for(long j=0;j<Ny_;j++) { 703 long jj = (j>Ny_/2) ? Ny_-j : j; 704 double ky = jj*Dky_; ky *= ky; 739 double ky = Ky(j); ky *= ky; 705 740 for(long l=0;l<NCz_;l++) { 706 double kz = l*Dkz_; kz *= kz;741 double kz = Kz(l); kz *= kz; 707 742 if(i==0 && j==0 && l==0) continue; // Suppression du continu 708 743 double k = sqrt(kx+ky+kz); … … 728 763 // Take into account the real and complexe conjugate coefficients 729 764 // because we want a realization of a real data in real space 765 // On ecrit que: P(k_x,k_y,k_z) = P(-k_x,-k_y,-k_z) 766 // avec k_x = i, -k_x = N_x - i etc... 730 767 { 731 768 if(lp_>1) cout<<"...managing coefficients"<<endl; … … 800 837 if(lp_>1) cout<<"Number of forced conjugate hors cont+nyq ="<<nconj2<<endl; 801 838 802 if(lp_>1) cout<<"Check: ddl= "<<NRtot_<<" =?= "<<2*(Nx_*Ny_*NCz_-nconj1-nconj2)- 8<<endl;839 if(lp_>1) cout<<"Check: ddl= "<<NRtot_<<" =?= "<<2*(Nx_*Ny_*NCz_-nconj1-nconj2)-nreal<<endl; 803 840 804 841 return nreal+nconj1+nconj2; … … 840 877 841 878 for(long i=0;i<Nx_;i++) { 842 long ii = (i>Nx_/2) ? Nx_-i : i; 843 double kx = ii*Dkx_ *Dx_/2; 879 double kx = Kx(i) *Dx_/2; 844 880 double pk_x = pixelfilter(kx); 845 881 for(long j=0;j<Ny_;j++) { 846 long jj = (j>Ny_/2) ? Ny_-j : j; 847 double ky = jj*Dky_ *Dy_/2; 882 double ky = Ky(j) *Dy_/2; 848 883 double pk_y = pixelfilter(ky); 849 884 for(long l=0;l<NCz_;l++) { 850 double kz = l*Dkz_*Dz_/2;885 double kz = Kz(l) *Dz_/2; 851 886 double pk_z = pixelfilter(kz); 852 887 T_(l,j,i) *= pk_x*pk_y*pk_z; … … 855 890 } 856 891 892 } 893 894 //------------------------------------------------------------------- 895 void GeneFluct3D::ToVelTrans(void) 896 { 897 cout<<"-------------------- TO BE VERIFIED ToVelTrans"<<endl; 898 899 double zpk = compute_pk_redsh_ref_; 900 double dpsd = -cosmo_->H(zpk) * growth_->DsDz(zpk,good_dzinc_) / (*growth_)(zpk); 901 if(lp_>0) cout<<"--- ToVelTrans --- at z="<<zpk<<", D'/D="<<dpsd 902 <<" (km/s)/Mpc (comp. for dz="<<good_dzinc_<<")"<<endl; 903 check_array_alloc(); 904 905 for(long i=0;i<Nx_;i++) { 906 double kx = Kx(i); 907 for(long j=0;j<Ny_;j++) { 908 double ky = Ky(j); 909 double kt2 = kx*kx + ky*ky; 910 for(long l=0;l<NCz_;l++) { 911 double kz = Kz(l); 912 double k2 = kt2 + kz*kz; 913 if(k2<=0.) continue; 914 T_(l,j,i) *= complex<double>(0.,dpsd*kz/k2); 915 } 916 } 917 } 857 918 } 858 919 … … 879 940 880 941 InterpFunc interpinv(loscom2zred_min_,loscom2zred_max_,loscom2zred_); 881 //unsigned short ok; 882 883 //CHECK: Histo hgr(0.9*zred_[0],1.1*zred_[n-1],1000); 942 884 943 for(long i=0;i<Nx_;i++) { 885 944 double dx2 = DXcom(i); dx2 *= dx2; … … 890 949 if(type_evol==1) dz = sqrt(dx2+dy2+dz*dz); 891 950 else dz = fabs(dz); // tous les plans Z au meme redshift 892 double z = interpinv(dz); 893 //CHECK: hgr.Add(z); 894 double dzgr = (*growth_)(z); // interpolation par morceau 895 //double dzgr = growth_->Linear(z,ok); // interpolation lineaire 896 //double dzgr = growth_->Parab(z,ok); // interpolation parabolique 951 double z = interpinv(dz); // interpolation par morceau 952 double dzgr = (*growth_)(z); 897 953 int_8 ip = IndexR(i,j,l); 898 954 data_[ip] *= dzgr; … … 901 957 } 902 958 903 //CHECK: {POutPersist pos("applygrowth.ppf"); string tag="hgr"; pos.PutObject(hgr,tag);} 959 } 960 961 //------------------------------------------------------------------- 962 void GeneFluct3D::ApplyDerGrowthFactor(int type_evol) 963 // Apply Conformal derivative of Growth to real space for transverse velocity cube 964 { 965 cout<<"-------------------- TO BE VERIFIED ApplyDerGrowthFactor"<<endl; 966 967 if(lp_>0) cout<<"--- ApplyDerGrowthFactor: evol="<<type_evol<<endl; 968 check_array_alloc(); 969 970 if(growth_ == NULL) { 971 const char *bla = "GeneFluct3D::ApplyGrowthFactor_Error: set GrowthFactor first"; 972 cout<<bla<<endl; throw ParmError(bla); 973 } 974 if(type_evol<1 || type_evol>2) { 975 const char *bla = "GeneFluct3D::ApplyGrowthFactor_Error: bad type_evol value"; 976 cout<<bla<<endl; throw ParmError(bla); 977 } 978 979 double zpk = compute_pk_redsh_ref_; 980 double dpsd_orig = - cosmo_->H(zpk) * growth_->DsDz(zpk,good_dzinc_) / (*growth_)(zpk); 981 982 InterpFunc interpinv(loscom2zred_min_,loscom2zred_max_,loscom2zred_); 983 InterpFunc interdpd(zredmin_dpsd_,zredmax_dpsd_,dpsdfrzred_); 984 985 for(long i=0;i<Nx_;i++) { 986 double dx2 = DXcom(i); dx2 *= dx2; 987 for(long j=0;j<Ny_;j++) { 988 double dy2 = DYcom(j); dy2 *= dy2; 989 for(long l=0;l<Nz_;l++) { 990 double dz = DZcom(l); 991 if(type_evol==1) dz = sqrt(dx2+dy2+dz*dz); 992 else dz = fabs(dz); // tous les plans Z au meme redshift 993 double z = interpinv(dz); // interpolation par morceau 994 double dpsd = interdpd(z); 995 int_8 ip = IndexR(i,j,l); 996 data_[ip] *= dpsd / dpsd_orig; 997 } 998 } 999 } 904 1000 905 1001 } … … 948 1044 // Attention a l'ordre 949 1045 for(long i=0;i<Nx_;i++) { 950 long ii = (i>Nx_/2) ? Nx_-i : i; 951 double kx = ii*Dkx_; kx *= kx; 1046 double kx = Kx(i); kx *= kx; 952 1047 for(long j=0;j<Ny_;j++) { 953 long jj = (j>Ny_/2) ? Ny_-j : j; 954 double ky = jj*Dky_; ky *= ky; 1048 double ky = Ky(j); ky *= ky; 955 1049 for(long l=0;l<NCz_;l++) { 956 double kz = l*Dkz_;1050 double kz = Kz(l); 957 1051 double k = sqrt(kx+ky+kz*kz); 958 1052 double pk = MODULE2(T_(l,j,i)); … … 980 1074 // Attention a l'ordre 981 1075 for(long i=0;i<Nx_;i++) { 982 long ii = (i>Nx_/2) ? Nx_-i : i; 983 double kx = ii*Dkx_; kx *= kx; 1076 double kx = Kx(i); kx *= kx; 984 1077 for(long j=0;j<Ny_;j++) { 985 long jj = (j>Ny_/2) ? Ny_-j : j; 986 double ky = jj*Dky_; ky *= ky; 1078 double ky = Ky(j); ky *= ky; 987 1079 double kt = sqrt(kx+ky); 988 1080 for(long l=0;l<NCz_;l++) { 989 double kz = l*Dkz_;1081 double kz = Kz(l); 990 1082 double pk = MODULE2(T_(l,j,i)); 991 1083 herr.Add(kt,kz,pk); … … 1026 1118 // Attention a l'ordre 1027 1119 for(long i=0;i<Nx_;i++) { 1028 long ii = (i>Nx_/2) ? Nx_-i : i; 1029 double kx = ii*Dkx_; 1120 double kx = Kx(i); 1030 1121 double fx = (pixcor) ? pixelfilter(kx*Dx_/2): 1.; 1031 1122 kx *= kx; fx *= fx; 1032 1123 for(long j=0;j<Ny_;j++) { 1033 long jj = (j>Ny_/2) ? Ny_-j : j; 1034 double ky = jj*Dky_; 1124 double ky = Ky(j); 1035 1125 double fy = (pixcor) ? pixelfilter(ky*Dy_/2): 1.; 1036 1126 ky *= ky; fy *= fy; 1037 1127 for(long l=0;l<NCz_;l++) { 1038 double kz = l*Dkz_;1128 double kz = Kz(l); 1039 1129 double k = sqrt(kx+ky+kz*kz); 1040 1130 double pk = MODULE2(T_(l,j,i)) - sigma2; … … 1073 1163 // Attention a l'ordre 1074 1164 for(long i=0;i<Nx_;i++) { 1075 long ii = (i>Nx_/2) ? Nx_-i : i; 1076 double kx = ii*Dkx_; 1165 double kx = Kx(i); 1077 1166 double fx = (pixcor) ? pixelfilter(kx*Dx_/2) : 1.; 1078 1167 kx *= kx; fx *= fx; 1079 1168 for(long j=0;j<Ny_;j++) { 1080 long jj = (j>Ny_/2) ? Ny_-j : j; 1081 double ky = jj*Dky_; 1169 double ky = Ky(j); 1082 1170 double fy = (pixcor) ? pixelfilter(ky*Dy_/2) : 1.; 1083 1171 ky *= ky; fy *= fy; 1084 1172 double kt = sqrt(kx+ky); 1085 1173 for(long l=0;l<NCz_;l++) { 1086 double kz = l*Dkz_;1174 double kz = Kz(l); 1087 1175 double pk = MODULE2(T_(l,j,i)) - sigma2; 1088 1176 double fz = (pixcor) ? vfz(l): 1.;
Note:
See TracChangeset
for help on using the changeset viewer.