diff --git a/external/cosmotool/sample/test_cosmopower.cpp b/external/cosmotool/sample/test_cosmopower.cpp new file mode 100644 index 0000000..f87677b --- /dev/null +++ b/external/cosmotool/sample/test_cosmopower.cpp @@ -0,0 +1,29 @@ +#include +#include +#include "cosmopower.hpp" + +using namespace std; +using namespace CosmoTool; + +int main() +{ + CosmoPower cp; + CosmoPower::CosmoFunction f[] = { CosmoPower::POWER_EFSTATHIOU, CosmoPower::HU_WIGGLES, CosmoPower::HU_BARYON, CosmoPower::POWER_SUGIYAMA }; + int num_F = sizeof(f)/sizeof(f[0]); + + cp.setFunction(f[0]); + cp.normalize(); + for (int ik = 0; ik < 100; ik++) + { + double k = pow(10.0, 4*ik/100.-3); + + cout << k << " "; + for (int q = 0; q < num_F; q++) + { + cp.setFunction(f[q]); + cout << cp.power(k) << " "; + } + cout << endl; + } + return 0; +} diff --git a/external/cosmotool/sample/test_fft_calls.cpp b/external/cosmotool/sample/test_fft_calls.cpp index 35eeb12..f62e678 100644 --- a/external/cosmotool/sample/test_fft_calls.cpp +++ b/external/cosmotool/sample/test_fft_calls.cpp @@ -1,12 +1,58 @@ +#include +#include "yorick.hpp" +#include +#include +#include #include "fourier/euclidian.hpp" using namespace CosmoTool; +using boost::format; +using boost::str; +using namespace std; -int main() +double spectrum_generator(double k) { - EuclidianFourierTransform_2d dft(128,128,1.0,1.0); + if (k==0) + return 0; + return 1/(0.01+pow(k, 3.0)); +} + +template +void test_2d(int Nx, int Ny) +{ + EuclidianFourierTransform_2d dft(Nx,Ny,1.0,1.0); + EuclidianSpectrum_1D spectrum(spectrum_generator); + double volume = Nx*Ny; + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); dft.realSpace().eigen().setRandom(); + dft.fourierSpace().scale(std::complex(0,0)); dft.analysis(); + cout << format("Testing (%d,%d)") % Nx % Ny << endl; + cout << "Map dot-product = " << dft.realSpace().dot_product(dft.realSpace()) << endl; + cout << "Fourier dot-product = " << dft.fourierSpace().dot_product(dft.fourierSpace()).real()*volume << endl; + dft.synthesis(); + cout << "Resynthesis dot-product = " << dft.realSpace().dot_product(dft.realSpace()) << endl; + + dft.realSpace().scale(2.0); + dft.fourierSpace().scale(0.2); + + spectrum.newRandomFourier(rng, dft.fourierSpace()); + dft.synthesis(); + + uint32_t dims[2] = { Ny, Nx }; + CosmoTool::saveArray(str(format("generated_map_%d_%d.nc") %Nx % Ny) , dft.realSpace().data(), dims, 2); + + gsl_rng_free(rng); +} + +int main(int argc, char **argv) +{ + test_2d(128,128); + test_2d(131,128); + test_2d(130,128); + test_2d(128,128); + test_2d(128,131); + test_2d(128,130); return 0; } diff --git a/external/cosmotool/src/fourier/base_types.hpp b/external/cosmotool/src/fourier/base_types.hpp index 9a02a7e..936bc83 100644 --- a/external/cosmotool/src/fourier/base_types.hpp +++ b/external/cosmotool/src/fourier/base_types.hpp @@ -1,12 +1,51 @@ #ifndef __BASE_FOURIER_TYPES_HPP #define __BASE_FOURIER_TYPES_HPP +#include +#include #include #include #include +#include namespace CosmoTool { + class IncompatibleMap: virtual std::exception {}; + + template class FourierMap; + + template + class SpectrumFunction + { + protected: + SpectrumFunction() {} + public: + typedef Eigen::Array VecType; + typedef Eigen::Map MapType; + typedef Eigen::Map ConstMapType; + typedef FourierMap > FourierMapType; + typedef boost::shared_ptr FourierMapPtr; + typedef boost::shared_ptr > SpectrumFunctionPtr; + + virtual ~SpectrumFunction() {} + + virtual void + newRandomFourier(gsl_rng *rng, FourierMapType& out_map) const = 0; + + virtual SpectrumFunctionPtr copy() const = 0; + + virtual const T *data() const { return 0; } + virtual const int *dof() const { return 0; } + virtual long size() const { return -1; } + + virtual void sqrt() = 0; + + virtual void mul(FourierMapType& m) const = 0; + virtual void mul_sqrt(FourierMapType& m) const = 0; + virtual void mul_inv(FourierMapType& m) const = 0; + virtual void mul_inv_sqrt(FourierMapType& m) const = 0; + }; + template class FourierMap { @@ -14,7 +53,7 @@ namespace CosmoTool FourierMap() {} public: - typedef Eigen::Matrix VecType; + typedef Eigen::Array VecType; typedef Eigen::Map MapType; typedef Eigen::Map ConstMapType; @@ -34,6 +73,18 @@ namespace CosmoTool { return ConstMapType(data(), size()); } + + FourierMap& operator=(const FourierMap& m) + { + eigen() = m.eigen(); + return *this; + } + + void sqrt() + { + MapType m = eigen(); + m = m.sqrt(); + } void scale(const T& factor) { @@ -45,7 +96,7 @@ namespace CosmoTool { assert(size() == map2->size()); MapType m(data(), size()); - MapType m2(map2->data(), map2->size()); + ConstMapType m2(map2->data(), map2->size()); m *= m2; } @@ -71,6 +122,9 @@ namespace CosmoTool return m; } + virtual T dot_product(const FourierMap& second) const + throw(std::bad_cast) = 0; + virtual FourierMap *mimick() const = 0; }; @@ -96,6 +150,18 @@ namespace CosmoTool virtual void synthesis_conjugate() = 0; }; + template + class MapUtilityFunction + { + public: + typedef SpectrumFunction Spectrum; + typedef boost::shared_ptr Spectrum_ptr; + typedef FourierMap > FMap; + + virtual Spectrum_ptr estimateSpectrumFromMap(const FMap& m) const = 0; + virtual Spectrum_ptr newSpectrumFromRaw(T *data, long size, + const Spectrum& like_spec) const = 0; + }; }; diff --git a/external/cosmotool/src/fourier/euclidian.hpp b/external/cosmotool/src/fourier/euclidian.hpp index 0f40e1a..45ec3dc 100644 --- a/external/cosmotool/src/fourier/euclidian.hpp +++ b/external/cosmotool/src/fourier/euclidian.hpp @@ -1,200 +1,17 @@ #ifndef __COSMOTOOL_FOURIER_EUCLIDIAN_HPP #define __COSMOTOOL_FOURIER_EUCLIDIAN_HPP +#include +#include #include #include +#include #include "base_types.hpp" #include "fft/fftw_calls.hpp" - -namespace CosmoTool -{ - - template - class EuclidianFourierMap: public FourierMap - { - private: - boost::shared_ptr m_data; - std::vector m_dims; - long m_size; - public: - EuclidianFourierMap(boost::shared_ptr indata, std::vector indims) - { - m_data = indata; - m_dims = indims; - m_size = 1; - for (int i = 0; i < m_dims.size(); i++) - m_size *= m_dims[i]; - } - - virtual ~EuclidianFourierMap() - { - } - - virtual const T *data() const { return m_data.get(); } - virtual T *data() { return m_data.get(); } - virtual long size() const { return m_size; } - - virtual FourierMap *copy() const - { - FourierMap *m = this->mimick(); - m->eigen() = this->eigen(); - return m; - } - - virtual FourierMap *mimick() const - { - return new EuclidianFourierMap( - boost::shared_ptr((T *)fftw_malloc(sizeof(T)*m_size), - std::ptr_fun(fftw_free)), - m_dims); - } - }; - - - template - class EuclidianFourierTransform: public FourierTransform - { - private: - typedef FFTW_Calls calls; - EuclidianFourierMap *realMap; - EuclidianFourierMap > *fourierMap; - typename calls::plan_type m_analysis, m_synthesis; - double volume; - long N; - std::vector m_dims; - std::vector m_L; - public: - EuclidianFourierTransform(const std::vector& dims, const std::vector& L) - { - assert(L.size() == dims.size()); - - m_dims = dims; - m_L = L; - - N = 1; - volume = 1; - for (int i = 0; i < dims.size(); i++) - { - N *= dims[i]; - volume *= L[i]; - } - - realMap = new EuclidianFourierMap( - boost::shared_ptr(calls::alloc_real(N), - std::ptr_fun(calls::free)), - dims); - fourierMap = new EuclidianFourierMap >( - boost::shared_ptr >((std::complex*)calls::alloc_complex(N), - std::ptr_fun(calls::free)), - dims); - m_analysis = calls::plan_dft_r2c(dims.size(), &dims[0], - realMap->data(), (typename calls::complex_type *)fourierMap->data(), - FFTW_MEASURE); - m_synthesis = calls::plan_dft_c2r(dims.size(), &dims[0], - (typename calls::complex_type *)fourierMap->data(), realMap->data(), - FFTW_MEASURE); - } - - virtual ~EuclidianFourierTransform() - { - delete realMap; - delete fourierMap; - calls::destroy_plan(m_synthesis); - calls::destroy_plan(m_analysis); - } - - void synthesis() - { - calls::execute(m_synthesis); - realMap->scale(1/volume); - } - - void analysis() - { - calls::execute(m_analysis); - fourierMap->scale(volume/N); - } - - void synthesis_conjugate() - { - calls::execute(m_analysis); - fourierMap->scale(1/volume); - } - - void analysis_conjugate() - { - calls::execute(m_synthesis); - realMap->scale(volume/N); - } - - const FourierMap >& fourierSpace() const - { - return *fourierMap; - } - - FourierMap >& fourierSpace() - { - return *fourierMap; - } - - const FourierMap& realSpace() const - { - return *realMap; - } - - FourierMap& realSpace() - { - return *realMap; - } - - FourierTransform *mimick() const - { - return new EuclidianFourierTransform(m_dims, m_L); - } - }; - - template - class EuclidianFourierTransform_2d: public EuclidianFourierTransform - { - private: - template - static std::vector make_2d_vector(T2 a, T2 b) - { - T2 arr[2] = { a, b}; - return std::vector(&arr[0], &arr[2]); - } - public: - EuclidianFourierTransform_2d(int Nx, int Ny, double Lx, double Ly) - : EuclidianFourierTransform(make_2d_vector(Nx, Ny), make_2d_vector(Lx, Ly)) - { - } - - virtual ~EuclidianFourierTransform_2d() {} - - }; - - template - class EuclidianFourierTransform_3d: public EuclidianFourierTransform - { - private: - template - static std::vector make_3d_vector(T2 a, T2 b, T2 c) - { - T2 arr[2] = { a, b, c}; - return std::vector(&arr[0], &arr[3]); - } - - public: - EuclidianFourierTransform_3d(int Nx, int Ny, int Nz, double Lx, double Ly, double Lz) - : EuclidianFourierTransform(make_3d_vector(Nx, Ny, Nz), make_3d_vector(Lx, Ly, Lz)) - { - } - - virtual ~EuclidianFourierTransform_3d() {} - }; - - - -}; +#include "../algo.hpp" +#include "details/euclidian_maps.hpp" +#include "details/euclidian_spectrum_1d.hpp" +#include "details/euclidian_spectrum_1d_bin.hpp" +#include "details/euclidian_transform.hpp" #endif diff --git a/external/cosmotool/src/fourier/fft/fftw_calls.hpp b/external/cosmotool/src/fourier/fft/fftw_calls.hpp index 0106055..41e4d7c 100644 --- a/external/cosmotool/src/fourier/fft/fftw_calls.hpp +++ b/external/cosmotool/src/fourier/fft/fftw_calls.hpp @@ -28,8 +28,8 @@ public: \ typedef prefix ## _complex complex_type; \ typedef prefix ## _plan plan_type; \ \ - static complex_type *alloc_complex(int N) { return prefix ## _alloc_complex(N); } \ - static real_type *alloc_real(int N) { return prefix ## _alloc_real(N); } \ + static complex_type *alloc_complex(size_t N) { return prefix ## _alloc_complex(N); } \ + static real_type *alloc_real(size_t N) { return prefix ## _alloc_real(N); } \ static void free(void *p) { fftw_free(p); } \ \ static void execute(plan_type p) { prefix ## _execute(p); } \ diff --git a/external/cosmotool/src/fourier/healpix.hpp b/external/cosmotool/src/fourier/healpix.hpp index 1759a78..36f7979 100644 --- a/external/cosmotool/src/fourier/healpix.hpp +++ b/external/cosmotool/src/fourier/healpix.hpp @@ -1,135 +1,24 @@ #ifndef __COSMOTOOL_FOURIER_HEALPIX_HPP #define __COSMOTOOL_FOURIER_HEALPIX_HPP +#include +#include +#include +#include #include #include -#include -#include -#include +#include +#include "base_types.hpp" +#include +#include +#include +#include +#include -namespace CosmoTool -{ - - template - class HealpixFourierMap: public FourierMap, public Healpix_Base - { - private: - T *m_data; - Eigen::aligned_allocator alloc; - public: - HealpixFourierMap(long nSide) - : Healpix_Base(RING, nSide, SET_NSIDE) - { - m_data = alloc.allocate(Npix); - } - - virtual ~HealpixFourierMap() - { - alloc.deallocate(m_data); - } - - virtual const T* data() const { return m_data; } - virtual T *data() { return m_data; } - virtual long size() const { return Npix(); } - - virtual FourierMap *mimick() const - { - return new HealpixFourierMap(Nside()); - } - }; - - - template - class HealpixFourierALM: public FourierMap >, public Alm_Base - { - private: - std::complex *alms; - long size; - Eigen::aligned_allocator > alloc; - public: - HealpixFourierALM(long Lmax, long Mmax) - : Alm_Base(Lmax, Mmax) - { - size = Num_Alms(Lmax, Mmax); - alms = alloc.allocate(size); - } - - virtual ~HealpixFourierALM() - { - alloc.deallocate(alms); - } - - virtual const T* data() const { return alms; } - virtual T * data() { return alms;} - virtual long size() const { return size; } - - virtual FourierMap *mimick() const - { - return new HealpixFourierALM(Lmax(), Mmax()); - } - }; - - template - class HealpixFourierTransform: public FourierTransform - { - private: - HealpixFourierMap realMap; - HealpixFourierALM fourierMap; - psht_joblist jobs; - public: - HealpixFourierTransform(long nSide, long Lmax, long Mmax) - : realMap(nSide), fourierMap(Lmax, Mmax) - { - jobs.set_Healpix_geometry(nSide); - jobs.set_triangular_alm_info(Lmax, Mmax); - } - - virtual ~HealpixFourierTransform() {} - - virtual const FourierMap >& fourierSpace() const { return fourierMap; } - - virtual FourierMap >& fourierSpace() { return fourierMap; } - - virtual const FourierMap& realSpace() const { return realMap; } - - virtual FourierMap& realSpace() { return realMap; } - - virtual FourierTransform *mimick() const - { - return new HealpixFourierTransform(realMap.Nside(), fourierMap.Lmax(), fourierMap.Mmax()); - } - - virtual void analysis() - { - jobs.add_map2alm(realMap.data(), - reinterpret_cast *>(fourierMap.data()), - false); - jobs.execute(); - jobs.clear_jobs(); - } - - virtual void synthesis() - { - jobs.add_alm2map(reinterpret_cast *>(fourierMap.data()), - realMap.data(), - false); - jobs.execute(); - jobs.clear_jobs(); - } - - virtual void analysis_conjugate() - { - synthesis(); - realMap.scale(4*M_PI/realMap.Npix()); - } - - virtual void synthesis_conjugate() - { - analysis(); - fourierMap.scale(realMap.Npix()/(4*M_PI)); - } - - }; -}; +#include "details/healpix_map.hpp" +#include "details/healpix_alms.hpp" +#include "details/healpix_transform.hpp" +#include "details/healpix_spectrum.hpp" +#include "details/healpix_utility.hpp" #endif diff --git a/external/cosmotool/src/h5_readFlash.cpp b/external/cosmotool/src/h5_readFlash.cpp index 0c78f58..d8f6475 100644 --- a/external/cosmotool/src/h5_readFlash.cpp +++ b/external/cosmotool/src/h5_readFlash.cpp @@ -185,7 +185,7 @@ void h5_read_flash3_particles (H5File* file, float *vel1, float *vel2, float *vel3, - int *id) + long *id) { herr_t status; @@ -341,7 +341,7 @@ void h5_read_flash3_particles (H5File* file, if (id) { for(p=0; p < (pcount); p++) { - id[p+poffset] = (int) *(partBuffer+iptag-1+p*numProps); + id[p+poffset] = (long) *(partBuffer+iptag-1+p*numProps); } } if (pos1 && pos2 && pos3) { diff --git a/external/cosmotool/src/h5_readFlash.hpp b/external/cosmotool/src/h5_readFlash.hpp index 5187232..71392bc 100644 --- a/external/cosmotool/src/h5_readFlash.hpp +++ b/external/cosmotool/src/h5_readFlash.hpp @@ -29,7 +29,7 @@ void h5_read_flash3_particles (H5File* file, float *vel1, float *vel2, float *vel3, - int *id); + long *id); void h5_read_flash3_header_info(H5File* file, double* time, /* simulation time */ diff --git a/external/cosmotool/src/loadFlash.cpp b/external/cosmotool/src/loadFlash.cpp index ada498d..f00f098 100644 --- a/external/cosmotool/src/loadFlash.cpp +++ b/external/cosmotool/src/loadFlash.cpp @@ -71,7 +71,7 @@ SimuData *CosmoTool::loadFlashMulti(const char *fname, int id, int loadflags) } } if (loadflags & NEED_GADGET_ID) { - data->Id = new int[data->NumPart]; + data->Id = new long[data->NumPart]; if (data->Id == 0) { delete data; return 0; diff --git a/external/cosmotool/src/loadGadget.cpp b/external/cosmotool/src/loadGadget.cpp index ee30d80..ced42b6 100644 --- a/external/cosmotool/src/loadGadget.cpp +++ b/external/cosmotool/src/loadGadget.cpp @@ -195,7 +195,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, try { f->beginCheckpoint(); - data->Id = new int[data->NumPart]; + data->Id = new long[data->NumPart]; if (data->Id == 0) { delete f; diff --git a/external/cosmotool/src/loadRamses.cpp b/external/cosmotool/src/loadRamses.cpp index 5cd2e1e..e05f426 100644 --- a/external/cosmotool/src/loadRamses.cpp +++ b/external/cosmotool/src/loadRamses.cpp @@ -384,7 +384,7 @@ CosmoTool::SimuData *CosmoTool::loadRamsesSimu(const char *basename, int outputI } if (flags & NEED_GADGET_ID) { - data->Id = new int[nPar]; + data->Id = new long[nPar]; } for (int k = 0; k < 3; k++) diff --git a/external/cosmotool/src/loadSimu.hpp b/external/cosmotool/src/loadSimu.hpp index 7a72259..e93fd64 100644 --- a/external/cosmotool/src/loadSimu.hpp +++ b/external/cosmotool/src/loadSimu.hpp @@ -38,7 +38,7 @@ namespace CosmoTool long NumPart; long TotalNumPart; - int *Id; + long *Id; float *Pos[3]; float *Vel[3]; int *type; diff --git a/external/cosmotool/src/powerSpectrum.cpp b/external/cosmotool/src/powerSpectrum.cpp index 9f3d7c8..02549d6 100644 --- a/external/cosmotool/src/powerSpectrum.cpp +++ b/external/cosmotool/src/powerSpectrum.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -21,7 +22,7 @@ using namespace std; #define POWER_BDM 7 #define POWER_TEST 8 -#define POWER_SPECTRUM HU_WIGGLES +#define POWER_SPECTRUM POWER_EFSTATHIOU namespace Cosmology { @@ -651,4 +652,17 @@ double computeCorrel2(double powNorm, double topHatRad1, double topHatRad2) #endif } + double vvCorrection(double P_deltadelta, double k) + { + static const double alpha0 = -12480.5, alpha1 = 1.824, alpha2 = 2165.87, alpha3=1.796; + if (k > 0.3) + return 0; + double r =(alpha0*sqrt(P_deltadelta) + alpha1*P_deltadelta*P_deltadelta)/(alpha2 + alpha3*P_deltadelta); + assert(P_deltadelta > 0); + + if (r < 0) + return 0; + return r; + } + }; diff --git a/external/cosmotool/src/powerSpectrum.hpp b/external/cosmotool/src/powerSpectrum.hpp index ad0b0a9..de7ce53 100644 --- a/external/cosmotool/src/powerSpectrum.hpp +++ b/external/cosmotool/src/powerSpectrum.hpp @@ -30,6 +30,8 @@ namespace Cosmology { double computeVarianceZero(double powNorm); double computeCorrel(double powNorm, double topHatRad1); double computeCorrel2(double powNorm, double topHatRad1, double topHatRad2); + + double vvCorrection(double P_deltadelta, double k); }; #endif