Compare commits
98 Commits
natalia/ql
...
master
Author | SHA1 | Date | |
---|---|---|---|
fb51ffd35e | |||
924047de22 | |||
be64c7fd7a | |||
|
47d63a25ce | ||
|
4bcc5f3270 | ||
|
1d59533b17 | ||
|
1548fd8450 | ||
|
1151d0c8b6 | ||
|
1db266b4ea | ||
|
f2a5092cf1 | ||
|
54a59b5246 | ||
883c338c08 | |||
|
b8e60a7d33 | ||
|
751d8a19a0 | ||
|
97a1e34132 | ||
|
26e095fc71 | ||
6adf02b287 | |||
b878efb8b1 | |||
|
7c7ccd6f87 | ||
7a81120977 | |||
c88f91ba80 | |||
0093a6aa0f | |||
4afc982dfc | |||
d4b1742cbf | |||
|
d2cd6bb650 | ||
|
2aa7c96e48 | ||
d8b58bd8f1 | |||
05ac03fb7a | |||
522588fc1f | |||
39fe922143 | |||
fd16d7dc69 | |||
5eb0fe210b | |||
957d5187e9 | |||
f326962bc8 | |||
4509174d81 | |||
2cc11b3633 | |||
f79d7f6830 | |||
046e9a1447 | |||
fe06434619 | |||
4633f6edc9 | |||
b538d4974d | |||
f03751907b | |||
31d0f19408 | |||
cc94866bc3 | |||
a309aa732b | |||
59bb99e7ee | |||
e2a2c7287c | |||
d875416200 | |||
8ab094ad3d | |||
0b77b010e4 | |||
c264f2c69d | |||
533d8d0630 | |||
b01543a02a | |||
009fae2418 | |||
c9ac439dd5 | |||
2d0f34fbc0 | |||
6cafdd50b2 | |||
65b3139ba9 | |||
7feba4788f | |||
2b01b1ca11 | |||
d1013ee784 | |||
a86c9a85c2 | |||
793134d1ba | |||
81c2d0e688 | |||
b8c9288fc7 | |||
5d653cfee8 | |||
c416ff751f | |||
f412a9b442 | |||
17d4f4429c | |||
f3e05ad903 | |||
033fe22638 | |||
84ad61a717 | |||
51e84a3f4f | |||
a16ae60382 | |||
03033b64b6 | |||
8942adab6c | |||
10409ca7f0 | |||
83884a3747 | |||
f668fb00fd | |||
0805bac277 | |||
56e6761bf5 | |||
8068ebe3ae | |||
3e013139f2 | |||
e6950440a3 | |||
52f870e0c1 | |||
041cfc0630 | |||
793c649a8d | |||
f0afb5dc00 | |||
cb9e97e2c1 | |||
7e436bb0e7 | |||
|
014f7f9564 | ||
|
f3c459d9f6 | ||
|
9b148414b6 | ||
75de5fb4d9 | |||
5e6d69f017 | |||
3f7da964ee | |||
|
84a1d3bf47 | ||
|
67c609a422 |
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,4 +1,9 @@
|
|||||||
*~
|
*~
|
||||||
|
.eggs/
|
||||||
|
dist/
|
||||||
|
wheelhouse/
|
||||||
|
cosmotool.egg-info/
|
||||||
|
build/
|
||||||
*.o
|
*.o
|
||||||
*.prog
|
*.prog
|
||||||
*.pyc
|
*.pyc
|
||||||
|
@ -42,6 +42,17 @@ ENDIF(BUILD_PYTHON)
|
|||||||
|
|
||||||
MESSAGE(STATUS "Using the target ${CosmoTool_local} to build python module")
|
MESSAGE(STATUS "Using the target ${CosmoTool_local} to build python module")
|
||||||
|
|
||||||
|
find_library(ZLIB_LIBRARY z)
|
||||||
|
find_library(DL_LIBRARY dl)
|
||||||
|
find_library(RT_LIBRARY rt)
|
||||||
|
if (RT_LIBRARY)
|
||||||
|
SET(RT_DEP rt)
|
||||||
|
message(STATUS "RT found, linking against it")
|
||||||
|
else()
|
||||||
|
SET(RT_DEP)
|
||||||
|
endif()
|
||||||
|
find_library(MATH_LIBRARY m)
|
||||||
|
|
||||||
include(${CMAKE_SOURCE_DIR}/external/external_build.cmake)
|
include(${CMAKE_SOURCE_DIR}/external/external_build.cmake)
|
||||||
|
|
||||||
IF(YORICK_SUPPORT)
|
IF(YORICK_SUPPORT)
|
||||||
@ -55,9 +66,6 @@ IF(YORICK_SUPPORT)
|
|||||||
ENDIF(YORICK_SUPPORT)
|
ENDIF(YORICK_SUPPORT)
|
||||||
|
|
||||||
find_program(CYTHON NAMES cython3 cython)
|
find_program(CYTHON NAMES cython3 cython)
|
||||||
find_library(ZLIB_LIBRARY z)
|
|
||||||
find_library(DL_LIBRARY dl)
|
|
||||||
find_library(MATH_LIBRARY m)
|
|
||||||
|
|
||||||
set(NETCDF_FIND_REQUIRED ${YORICK_SUPPORT})
|
set(NETCDF_FIND_REQUIRED ${YORICK_SUPPORT})
|
||||||
set(GSL_FIND_REQUIRED TRUE)
|
set(GSL_FIND_REQUIRED TRUE)
|
||||||
@ -70,8 +78,8 @@ SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A toolbox for impatient cosmologists")
|
|||||||
SET(CPACK_PACKAGE_VENDOR "Guilhem Lavaux")
|
SET(CPACK_PACKAGE_VENDOR "Guilhem Lavaux")
|
||||||
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE_CeCILL_V2")
|
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE_CeCILL_V2")
|
||||||
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
|
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
|
||||||
SET(CPACK_PACKAGE_VERSION_MINOR "0")
|
SET(CPACK_PACKAGE_VERSION_MINOR "3")
|
||||||
SET(CPACK_PACKAGE_VERSION_PATCH "0${EXTRA_VERSION}")
|
SET(CPACK_PACKAGE_VERSION_PATCH "4${EXTRA_VERSION}")
|
||||||
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
||||||
SET(CPACK_STRIP_FILES "lib/libCosmoTool.so")
|
SET(CPACK_STRIP_FILES "lib/libCosmoTool.so")
|
||||||
SET(CPACK_SOURCE_IGNORE_FILES
|
SET(CPACK_SOURCE_IGNORE_FILES
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
include .gitignore
|
include .gitignore
|
||||||
|
include pyproject.toml
|
||||||
include CMakeLists.txt
|
include CMakeLists.txt
|
||||||
include FindNumPy.cmake
|
include FindNumPy.cmake
|
||||||
include FindPyLibs.cmake
|
include FindPyLibs.cmake
|
||||||
@ -16,14 +17,17 @@ include doc/source/cpplibrary.rst
|
|||||||
include doc/source/index.rst
|
include doc/source/index.rst
|
||||||
include doc/source/intro.rst
|
include doc/source/intro.rst
|
||||||
include doc/source/pythonmodule.rst
|
include doc/source/pythonmodule.rst
|
||||||
|
include external/config.guess
|
||||||
|
include external/config.sub
|
||||||
include external/external_build.cmake
|
include external/external_build.cmake
|
||||||
include external/libsharp-6077806.tar.gz
|
include external/libsharp-8d51946.tar.gz
|
||||||
include external/omptl-20120422.tar.bz2
|
include external/omptl-20120422.tar.bz2
|
||||||
include external/patch-omptl
|
include external/patch-omptl
|
||||||
include python/CMakeLists.txt
|
include python/CMakeLists.txt
|
||||||
include python/_cosmo_bispectrum.cpp
|
include python/_cosmo_bispectrum.cpp
|
||||||
include python/_cosmo_cic.pyx
|
include python/_cosmo_cic.pyx
|
||||||
include python/_cosmo_power.pyx
|
include python/_cosmo_power.pyx
|
||||||
|
include python/_cosmomath.pyx
|
||||||
include python/_cosmotool.pyx
|
include python/_cosmotool.pyx
|
||||||
include python/_fast_interp.pyx
|
include python/_fast_interp.pyx
|
||||||
include python/_project.pyx
|
include python/_project.pyx
|
||||||
@ -86,12 +90,14 @@ include sample/testSmooth.cpp
|
|||||||
include sample/test_cosmopower.cpp
|
include sample/test_cosmopower.cpp
|
||||||
include sample/test_fft_calls.cpp
|
include sample/test_fft_calls.cpp
|
||||||
include sample/test_healpix_calls.cpp
|
include sample/test_healpix_calls.cpp
|
||||||
|
include sample/test_special.cpp
|
||||||
include sample/testkd.cpp
|
include sample/testkd.cpp
|
||||||
include sample/testkd2.cpp
|
include sample/testkd2.cpp
|
||||||
include sample/testkd3.cpp
|
include sample/testkd3.cpp
|
||||||
include setup.py
|
include setup.py
|
||||||
include src/CMakeLists.txt
|
include src/CMakeLists.txt
|
||||||
include src/algo.hpp
|
include src/algo.hpp
|
||||||
|
include src/numpy_adaptors.hpp
|
||||||
include src/bqueue.hpp
|
include src/bqueue.hpp
|
||||||
include src/bqueue.tcc
|
include src/bqueue.tcc
|
||||||
include src/bsp_simple.hpp
|
include src/bsp_simple.hpp
|
||||||
@ -167,3 +173,4 @@ include src/tf_fit.hpp
|
|||||||
include src/yorick.hpp
|
include src/yorick.hpp
|
||||||
include src/yorick_nc3.cpp
|
include src/yorick_nc3.cpp
|
||||||
include src/yorick_nc4.cpp
|
include src/yorick_nc4.cpp
|
||||||
|
include src/special_math.hpp
|
||||||
|
@ -8,28 +8,32 @@ export CC CXX
|
|||||||
|
|
||||||
# Install a system package required by our library
|
# Install a system package required by our library
|
||||||
#yum install -y atlas-devel
|
#yum install -y atlas-devel
|
||||||
yum install -y cmake3 gsl-devel zlib-devel
|
yum install -y cmake3 gsl-devel zlib-devel fftw3-devel libffi-devel hdf5 hdf5-devel
|
||||||
|
|
||||||
ln -fs /usr/bin/cmake3 /usr/bin/cmake
|
ln -fs /usr/bin/cmake3 /usr/bin/cmake
|
||||||
|
|
||||||
|
|
||||||
ALL_PYTHON="cp36-cp36m cp37-cp37m cp38-cp38"
|
test -d /io/wheelhouse || mkdir /io/wheelhouse
|
||||||
|
test -d /io/wheelhouse/fix || mkdir /io/wheelhouse/fix
|
||||||
|
|
||||||
|
ALL_PYTHON="cp39-cp39 cp310-cp310"
|
||||||
|
|
||||||
# Compile wheels
|
# Compile wheels
|
||||||
for pkg in $ALL_PYTHON; do
|
for pkg in $ALL_PYTHON; do
|
||||||
PYBIN=/opt/python/${pkg}/bin
|
PYBIN=/opt/python/${pkg}/bin
|
||||||
# "${PYBIN}/pip" install -r /io/dev-requirements.txt
|
# "${PYBIN}/pip" install -r /io/dev-requirements.txt
|
||||||
|
"${PYBIN}/pip" install setuptools wheel Cython
|
||||||
"${PYBIN}/pip" install -r /io/requirements.txt
|
"${PYBIN}/pip" install -r /io/requirements.txt
|
||||||
"${PYBIN}/pip" wheel -vvv /io/ -w wheelhouse/
|
"${PYBIN}/pip" wheel -vvv /io/ -w /io/wheelhouse/
|
||||||
done
|
done
|
||||||
|
|
||||||
# Bundle external shared libraries into the wheels
|
# Bundle external shared libraries into the wheels
|
||||||
for whl in wheelhouse/*.whl; do
|
for whl in /io/wheelhouse/cosmotool*linux*.whl; do
|
||||||
auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/
|
auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/fix
|
||||||
done
|
done
|
||||||
|
|
||||||
# Install packages and test
|
# Install packages and test
|
||||||
for pkg in $ALL_PYTHON; do
|
#for pkg in $ALL_PYTHON; do
|
||||||
PYBIN=/opt/python/${pkg}/bin
|
# PYBIN=/opt/python/${pkg}/bin
|
||||||
"${PYBIN}/pip" install cosmotool --no-index -f /io/wheelhouse
|
# "${PYBIN}/pip" install cosmotool --no-index -f /io/wheelhouse
|
||||||
done
|
#done
|
||||||
|
@ -9,4 +9,4 @@ if ! [ -e ${d}/setup.py ] ; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
podman run -ti --rm -e PLAT=manylinux2010_x86_64 -v ${d}:/io:Z quay.io/pypa/manylinux2010_x86_64 /io/builder/build-wheels.sh
|
podman run -ti --rm -e PLAT=manylinux2014_x86_64 -v ${d}:/io:Z quay.io/pypa/manylinux2014_x86_64 /io/builder/build-wheels.sh
|
||||||
|
@ -1 +1,4 @@
|
|||||||
|
export CC=$(basename ${CC})
|
||||||
|
export CXX=$(basename ${CXX})
|
||||||
|
|
||||||
$PYTHON setup.py install
|
$PYTHON setup.py install
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
python:
|
python:
|
||||||
- 3.7
|
- 3.9
|
||||||
- 3.8
|
- 3.8
|
||||||
|
- 3.7
|
||||||
|
|
||||||
numpy:
|
numpy:
|
||||||
- 1.11
|
|
||||||
- 1.19
|
- 1.19
|
||||||
|
|
||||||
|
gsl:
|
||||||
|
- 2.4
|
||||||
|
@ -1,38 +1,50 @@
|
|||||||
package:
|
package:
|
||||||
name: cosmotool
|
name: cosmotool
|
||||||
version: "1.0.0a7"
|
version: "1.3.0"
|
||||||
|
|
||||||
source:
|
source:
|
||||||
git_rev: 7fce73e
|
git_rev: a86c9a8
|
||||||
git_url: https://bitbucket.org/glavaux/cosmotool
|
git_url: https://bitbucket.org/glavaux/cosmotool
|
||||||
|
|
||||||
requirements:
|
requirements:
|
||||||
build:
|
build:
|
||||||
- numpy >=1.11
|
- python # [build_platform != target_platform]
|
||||||
- gcc_linux-64
|
- cross-python_{{ target_platform }} # [build_platform != target_platform]
|
||||||
- gxx_linux-64
|
- cython # [build_platform != target_platform]
|
||||||
|
- numpy # [build_platform != target_platform]
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
- llvm-openmp # [osx]
|
||||||
|
- libgomp # [linux]
|
||||||
|
|
||||||
|
host:
|
||||||
- python
|
- python
|
||||||
- setuptools
|
- pip
|
||||||
|
- numpy
|
||||||
|
- pkgconfig
|
||||||
|
- numexpr
|
||||||
- cython
|
- cython
|
||||||
- healpy
|
- healpy
|
||||||
- numexpr
|
|
||||||
- cffi
|
- cffi
|
||||||
- pyfftw
|
- pyfftw
|
||||||
- gsl
|
- gsl {{ gsl }}
|
||||||
- h5py
|
- h5py
|
||||||
|
|
||||||
run:
|
run:
|
||||||
- numpy
|
|
||||||
- python
|
- python
|
||||||
|
- {{ pin_compatible('numpy') }}
|
||||||
- healpy
|
- healpy
|
||||||
- numexpr
|
- numexpr
|
||||||
- cffi
|
- cffi
|
||||||
- pyfftw
|
- pyfftw
|
||||||
- h5py
|
- h5py
|
||||||
|
- {{ pin_compatible('gsl') }}
|
||||||
|
- llvm-openmp
|
||||||
|
|
||||||
test:
|
test:
|
||||||
imports:
|
imports:
|
||||||
- cosmotool
|
- cosmotool
|
||||||
|
requires:
|
||||||
|
- pip
|
||||||
|
|
||||||
about:
|
about:
|
||||||
home: https://bitbucket.org/glavaux/cosmotool
|
home: https://bitbucket.org/glavaux/cosmotool
|
||||||
|
1754
external/config.guess
vendored
Executable file
1754
external/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1890
external/config.sub
vendored
Executable file
1890
external/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
89
external/external_build.cmake
vendored
89
external/external_build.cmake
vendored
@ -2,16 +2,19 @@ include(FindOpenMP)
|
|||||||
|
|
||||||
OPTION(ENABLE_OPENMP "Set to Yes if Healpix and/or you need openMP" OFF)
|
OPTION(ENABLE_OPENMP "Set to Yes if Healpix and/or you need openMP" OFF)
|
||||||
|
|
||||||
|
SET(SOURCE_PREFIX ${CMAKE_SOURCE_DIR})
|
||||||
SET(FFTW_URL "http://www.fftw.org/fftw-3.3.3.tar.gz" CACHE STRING "URL to download FFTW from")
|
SET(FFTW_URL "http://www.fftw.org/fftw-3.3.3.tar.gz" CACHE STRING "URL to download FFTW from")
|
||||||
SET(EIGEN_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2" CACHE STRING "URL to download Eigen from")
|
SET(EIGEN_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2" CACHE STRING "URL to download Eigen from")
|
||||||
SET(GENGETOPT_URL "ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.5.tar.gz" CACHE STRING "URL to download gengetopt from")
|
SET(GENGETOPT_URL "ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.5.tar.gz" CACHE STRING "URL to download gengetopt from")
|
||||||
SET(HDF5_URL "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.18/src/hdf5-1.8.18.tar.bz2" CACHE STRING "URL to download HDF5 from")
|
SET(HDF5_URL "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.2/src/hdf5-1.12.2.tar.gz" CACHE STRING "URL to download HDF5 from")
|
||||||
SET(NETCDF_URL "ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.5.0.tar.gz" CACHE STRING "URL to download NetCDF from")
|
SET(NETCDF_URL "https://downloads.unidata.ucar.edu/netcdf-c/4.9.2/netcdf-c-4.9.2.tar.gz" CACHE STRING "URL to download NetCDF from")
|
||||||
SET(NETCDFCXX_URL "https://github.com/Unidata/netcdf-cxx4/archive/v4.3.0.tar.gz" CACHE STRING "URL to download NetCDF-C++ from")
|
SET(NETCDFCXX_URL "https://github.com/Unidata/netcdf-cxx4/archive/v4.3.1.tar.gz" CACHE STRING "URL to download NetCDF-C++ from")
|
||||||
SET(BOOST_URL "http://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz/download" CACHE STRING "URL to download Boost from")
|
SET(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz" CACHE STRING "URL to download Boost from")
|
||||||
SET(GSL_URL "ftp://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz" CACHE STRING "URL to download GSL from ")
|
SET(GSL_URL "https://ftpmirror.gnu.org/gsl/gsl-2.7.tar.gz" CACHE STRING "URL to download GSL from ")
|
||||||
mark_as_advanced(FFTW_URL EIGEN_URL HDF5_URL NETCDF_URL BOOST_URL GSL_URL)
|
mark_as_advanced(FFTW_URL EIGEN_URL HDF5_URL NETCDF_URL BOOST_URL GSL_URL)
|
||||||
|
|
||||||
|
file(MAKE_DIRECTORY ${SOURCE_PREFIX}/downloads)
|
||||||
|
|
||||||
SET(all_deps)
|
SET(all_deps)
|
||||||
|
|
||||||
MACRO(CHECK_CHANGE_STATE VAR)
|
MACRO(CHECK_CHANGE_STATE VAR)
|
||||||
@ -36,12 +39,13 @@ CHECK_CHANGE_STATE(INTERNAL_DLIB DLIB_INCLUDE_DIR DLIB_LIBRARIES)
|
|||||||
|
|
||||||
IF(ENABLE_OPENMP)
|
IF(ENABLE_OPENMP)
|
||||||
IF (NOT OPENMP_FOUND)
|
IF (NOT OPENMP_FOUND)
|
||||||
MESSAGE(ERROR "No known compiler option for enabling OpenMP")
|
MESSAGE(NOTICE "No known compiler option for enabling OpenMP")
|
||||||
|
ELSE()
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
||||||
|
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
|
||||||
ENDIF(NOT OPENMP_FOUND)
|
ENDIF(NOT OPENMP_FOUND)
|
||||||
|
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
|
|
||||||
ENDIF(ENABLE_OPENMP)
|
ENDIF(ENABLE_OPENMP)
|
||||||
|
|
||||||
|
|
||||||
@ -55,17 +59,25 @@ if (ENABLE_SHARP)
|
|||||||
SET(DEP_BUILD ${BUILD_PREFIX}/sharp-prefix/src/sharp/auto)
|
SET(DEP_BUILD ${BUILD_PREFIX}/sharp-prefix/src/sharp/auto)
|
||||||
IF(NOT ENABLE_OPENMP)
|
IF(NOT ENABLE_OPENMP)
|
||||||
SET(SHARP_OPENMP --disable-openmp)
|
SET(SHARP_OPENMP --disable-openmp)
|
||||||
|
ELSE()
|
||||||
|
SET(SHARP_OPENMP)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
SET(CUTILS_LIBRARY ${DEP_BUILD}/lib/libc_utils.a)
|
SET(CUTILS_LIBRARY ${DEP_BUILD}/lib/libc_utils.a)
|
||||||
SET(FFTPACK_LIBRARY ${DEP_BUILD}/lib/libfftpack.a)
|
SET(FFTPACK_LIBRARY ${DEP_BUILD}/lib/libfftpack.a)
|
||||||
SET(SHARP_LIBRARY ${DEP_BUILD}/lib/libsharp.a)
|
SET(SHARP_LIBRARY ${DEP_BUILD}/lib/libsharp.a)
|
||||||
SET(SHARP_LIBRARIES ${SHARP_LIBRARY} ${FFTPACK_LIBRARY} ${CUTILS_LIBRARY})
|
SET(SHARP_LIBRARIES ${SHARP_LIBRARY} ${FFTPACK_LIBRARY} ${CUTILS_LIBRARY})
|
||||||
SET(SHARP_INCLUDE_PATH ${DEP_BUILD}/include)
|
SET(SHARP_INCLUDE_PATH ${DEP_BUILD}/include)
|
||||||
|
message(STATUS "Flags: ${CMAKE_C_FLAGS}")
|
||||||
ExternalProject_Add(sharp
|
ExternalProject_Add(sharp
|
||||||
URL ${CMAKE_SOURCE_DIR}/external/libsharp-6077806.tar.gz
|
URL ${CMAKE_SOURCE_DIR}/external/libsharp-8d51946.tar.gz
|
||||||
PREFIX ${BUILD_PREFIX}/sharp-prefix
|
PREFIX ${BUILD_PREFIX}/sharp-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
CONFIGURE_COMMAND autoconf && ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP}
|
CONFIGURE_COMMAND
|
||||||
|
cp -f ${CMAKE_SOURCE_DIR}/external/config.guess . &&
|
||||||
|
cp -f ${CMAKE_SOURCE_DIR}/external/config.sub . &&
|
||||||
|
autoconf &&
|
||||||
|
./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${CMAKE_C_FLAGS}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" --prefix=${DEP_BUILD} ${SHARP_OPENMP}
|
||||||
INSTALL_COMMAND echo "No install"
|
INSTALL_COMMAND echo "No install"
|
||||||
BUILD_BYPRODUCTS ${SHARP_LIBRARIES}
|
BUILD_BYPRODUCTS ${SHARP_LIBRARIES}
|
||||||
)
|
)
|
||||||
@ -82,27 +94,23 @@ if (INTERNAL_HDF5)
|
|||||||
ExternalProject_Add(hdf5
|
ExternalProject_Add(hdf5
|
||||||
PREFIX ${BUILD_PREFIX}/hdf5-prefix
|
PREFIX ${BUILD_PREFIX}/hdf5-prefix
|
||||||
URL ${HDF5_URL}
|
URL ${HDF5_URL}
|
||||||
URL_HASH MD5=29117bf488887f89888f9304c8ebea0b
|
URL_HASH MD5=30172c75e436d7f2180e274071a4ca97
|
||||||
CMAKE_ARGS
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
-DCMAKE_INSTALL_PREFIX=${EXT_INSTALL}
|
CONFIGURE_COMMAND
|
||||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
${HDF5_SOURCE_DIR}/configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${CMAKE_C_FLAGS}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" --prefix=${HDF5_BIN_DIR} --disable-shared --enable-cxx --enable-hl --enable-tools --with-pic
|
||||||
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
INSTALL_COMMAND make install
|
||||||
-DHDF5_BUILD_CPP_LIB=ON
|
|
||||||
-DHDF5_BUILD_TOOLS=ON
|
|
||||||
-DHDF5_BUILD_HL_LIB=ON
|
|
||||||
-DBUILD_SHARED_LIBS=OFF
|
|
||||||
)
|
)
|
||||||
SET(cosmotool_DEPS ${cosmotool_DEPS} hdf5)
|
SET(cosmotool_DEPS ${cosmotool_DEPS} hdf5)
|
||||||
SET(hdf5_built hdf5)
|
SET(hdf5_built hdf5)
|
||||||
SET(ENV{HDF5_ROOT} ${HDF5_BIN_DIR})
|
SET(ENV{HDF5_ROOT} ${HDF5_BIN_DIR})
|
||||||
SET(HDF5_ROOTDIR ${HDF5_BIN_DIR})
|
SET(HDF5_ROOTDIR ${HDF5_BIN_DIR})
|
||||||
SET(CONFIGURE_LDFLAGS "${CONFIGURE_LDFLAGS} -L${HDF5_BIN_DIR}/lib")
|
SET(CONFIGURE_LDFLAGS "${CONFIGURE_LDFLAGS} -L${HDF5_BIN_DIR}/lib")
|
||||||
SET(CONFIGURE_LIBS "${CONFIGURE_LIBS} -ldl")
|
SET(CONFIGURE_LIBS "${CONFIGURE_LIBS} -ldl ${RT_LIBRARY}")
|
||||||
set(HDF5_C_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5-static.a)
|
set(HDF5_C_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5.a)
|
||||||
set(HDF5_HL_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5_hl-static.a)
|
set(HDF5_HL_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5_hl.a)
|
||||||
set(HDF5_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5-static.a CACHE STRING "HDF5 lib" FORCE)
|
set(HDF5_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5.a CACHE STRING "HDF5 lib" FORCE)
|
||||||
set(HDF5_HL_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_hl-static.a CACHE STRING "HDF5 HL lib" FORCE)
|
set(HDF5_HL_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_hl.a CACHE STRING "HDF5 HL lib" FORCE)
|
||||||
set(HDF5_CXX_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_cpp-static.a CACHE STRING "HDF5 C++ lib" FORCE)
|
set(HDF5_CXX_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_cpp.a CACHE STRING "HDF5 C++ lib" FORCE)
|
||||||
SET(HDF5_INCLUDE_DIRS ${HDF5_BIN_DIR}/include CACHE STRING "HDF5 include path" FORCE)
|
SET(HDF5_INCLUDE_DIRS ${HDF5_BIN_DIR}/include CACHE STRING "HDF5 include path" FORCE)
|
||||||
mark_as_advanced(HDF5_LIBRARIES HDF5_CXX_LIBRARIES HDF5_INCLUDE_DIRS)
|
mark_as_advanced(HDF5_LIBRARIES HDF5_CXX_LIBRARIES HDF5_INCLUDE_DIRS)
|
||||||
|
|
||||||
@ -160,43 +168,52 @@ if (INTERNAL_NETCDF)
|
|||||||
SET(NETCDF_CONFIG_COMMAND ${NETCDF_SOURCE_DIR}/configure
|
SET(NETCDF_CONFIG_COMMAND ${NETCDF_SOURCE_DIR}/configure
|
||||||
--prefix=${NETCDF_BIN_DIR} --libdir=${NETCDF_BIN_DIR}/lib
|
--prefix=${NETCDF_BIN_DIR} --libdir=${NETCDF_BIN_DIR}/lib
|
||||||
--enable-netcdf-4 --with-pic --disable-shared --disable-dap
|
--enable-netcdf-4 --with-pic --disable-shared --disable-dap
|
||||||
--disable-cdmremote --disable-rpc --enable-cxx-4
|
--disable-byterange --disable-cdmremote --disable-rpc --enable-cxx-4
|
||||||
--disable-examples ${EXTRA_NC_FLAGS} CC=${CMAKE_C_COMPILER}
|
--disable-examples ${EXTRA_NC_FLAGS} CC=${CMAKE_C_COMPILER}
|
||||||
CXX=${CMAKE_CXX_COMPILER})
|
CXX=${CMAKE_CXX_COMPILER})
|
||||||
list(INSERT CMAKE_PREFIX_PATH 0 ${EXT_INSTALL})
|
list(INSERT CMAKE_PREFIX_PATH 0 ${EXT_INSTALL})
|
||||||
string(REPLACE ";" "|" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}")
|
string(REPLACE ";" "|" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}")
|
||||||
ExternalProject_Add(netcdf
|
ExternalProject_Add(netcdf
|
||||||
DEPENDS ${hdf5_built}
|
DEPENDS ${hdf5_built}
|
||||||
|
URL_HASH MD5=f48ee01534365006934f0c63d4055ea0
|
||||||
PREFIX ${BUILD_PREFIX}/netcdf-prefix
|
PREFIX ${BUILD_PREFIX}/netcdf-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
URL ${NETCDF_URL}
|
URL ${NETCDF_URL}
|
||||||
LIST_SEPARATOR |
|
LIST_SEPARATOR |
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}
|
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}
|
||||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||||
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
||||||
|
-DNC_EXTRA_DEPS=${RT_DEP}
|
||||||
-DBUILD_SHARED_LIBS=OFF
|
-DBUILD_SHARED_LIBS=OFF
|
||||||
-DBUILD_TESTING=OFF
|
-DBUILD_TESTING=OFF
|
||||||
-DCMAKE_BUILD_TYPE=Release
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
-DENABLE_NETCDF4=ON
|
-DENABLE_NETCDF4=ON
|
||||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
-DENABLE_BYTERANGE=FALSE
|
||||||
-DENABLE_DAP=OFF
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||||
|
-DENABLE_DAP=OFF
|
||||||
-DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR}
|
-DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR}
|
||||||
-DHDF5_C_LIBRARY=${HDF5_C_STATIC_LIBRARY}
|
-DHDF5_C_LIBRARY=${HDF5_C_STATIC_LIBRARY}
|
||||||
-DHDF5_HL_LIBRARY=${HDF5_HL_STATIC_LIBRARY}
|
-DHDF5_HL_LIBRARY=${HDF5_HL_STATIC_LIBRARY}
|
||||||
-DHDF5_INCLUDE_DIR=${HDF5_INCLUDE_DIRS}
|
-DHDF5_INCLUDE_DIR=${HDF5_INCLUDE_DIRS}
|
||||||
-DCMAKE_INSTALL_LIBDIR=lib
|
-DCMAKE_INSTALL_LIBDIR=lib
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(NETCDFCXX_SOURCE_DIR ${BUILD_PREFIX}/netcdf-c++-prefix/src/netcdf-c++)
|
SET(NETCDFCXX_SOURCE_DIR ${BUILD_PREFIX}/netcdf-c++-prefix/src/netcdf-c++)
|
||||||
ExternalProject_Add(netcdf-c++
|
ExternalProject_Add(netcdf-c++
|
||||||
DEPENDS ${hdf5_built} netcdf
|
DEPENDS ${hdf5_built} netcdf
|
||||||
PREFIX ${BUILD_PREFIX}/netcdf-c++-prefix
|
PREFIX ${BUILD_PREFIX}/netcdf-c++-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
URL ${NETCDFCXX_URL}
|
URL ${NETCDFCXX_URL}
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}
|
||||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||||
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
||||||
-DBUILD_SHARED_LIBS=OFF
|
-DBUILD_SHARED_LIBS=OFF
|
||||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||||
|
-DHDF5_C_LIBRARY=${HDF5_C_STATIC_LIBRARY}
|
||||||
|
-DHDF5_HL_LIBRARY=${HDF5_HL_STATIC_LIBRARY}
|
||||||
|
-DHDF5_INCLUDE_DIR=${HDF5_INCLUDE_DIRS}
|
||||||
-DBUILD_TESTING=OFF
|
-DBUILD_TESTING=OFF
|
||||||
-DCMAKE_BUILD_TYPE=Release
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
-DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR}
|
-DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR}
|
||||||
@ -234,6 +251,8 @@ if (INTERNAL_BOOST)
|
|||||||
ExternalProject_Add(boost
|
ExternalProject_Add(boost
|
||||||
URL ${BOOST_URL}
|
URL ${BOOST_URL}
|
||||||
PREFIX ${BUILD_PREFIX}/boost-prefix
|
PREFIX ${BUILD_PREFIX}/boost-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
|
URL_HASH MD5=f7050f554a65f6a42ece221eaeec1660
|
||||||
CONFIGURE_COMMAND
|
CONFIGURE_COMMAND
|
||||||
${BOOST_SOURCE_DIR}/bootstrap.sh --prefix=${CMAKE_BINARY_DIR}/ext_build/boost
|
${BOOST_SOURCE_DIR}/bootstrap.sh --prefix=${CMAKE_BINARY_DIR}/ext_build/boost
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
@ -276,6 +295,7 @@ IF(INTERNAL_GSL)
|
|||||||
ExternalProject_Add(gsl
|
ExternalProject_Add(gsl
|
||||||
URL ${GSL_URL}
|
URL ${GSL_URL}
|
||||||
PREFIX ${BUILD_PREFIX}/gsl-prefix
|
PREFIX ${BUILD_PREFIX}/gsl-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
CONFIGURE_COMMAND ${GSL_SOURCE_DIR}/configure
|
CONFIGURE_COMMAND ${GSL_SOURCE_DIR}/configure
|
||||||
--prefix=${EXT_INSTALL} --disable-shared
|
--prefix=${EXT_INSTALL} --disable-shared
|
||||||
--with-pic
|
--with-pic
|
||||||
@ -328,6 +348,7 @@ IF(INTERNAL_FFTW)
|
|||||||
ExternalProject_Add(fftw
|
ExternalProject_Add(fftw
|
||||||
URL ${FFTW_URL}
|
URL ${FFTW_URL}
|
||||||
PREFIX ${BUILD_PREFIX}/fftw-prefix
|
PREFIX ${BUILD_PREFIX}/fftw-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
CONFIGURE_COMMAND
|
CONFIGURE_COMMAND
|
||||||
${FFTW_SOURCE}/configure
|
${FFTW_SOURCE}/configure
|
||||||
--prefix=${EXT_INSTALL}
|
--prefix=${EXT_INSTALL}
|
||||||
@ -357,6 +378,7 @@ IF (INTERNAL_EIGEN)
|
|||||||
ExternalProject_Add(eigen
|
ExternalProject_Add(eigen
|
||||||
URL ${EIGEN_URL}
|
URL ${EIGEN_URL}
|
||||||
URL_HASH MD5=b9e98a200d2455f06db9c661c5610496
|
URL_HASH MD5=b9e98a200d2455f06db9c661c5610496
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
PREFIX ${BUILD_PREFIX}/eigen-prefix
|
PREFIX ${BUILD_PREFIX}/eigen-prefix
|
||||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL}
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL}
|
||||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||||
@ -389,6 +411,7 @@ SET(cosmotool_DEPS ${cosmotool_DEPS} omptl)
|
|||||||
SET(OMPTL_BUILD_DIR ${BUILD_PREFIX}/omptl-prefix/src/omptl)
|
SET(OMPTL_BUILD_DIR ${BUILD_PREFIX}/omptl-prefix/src/omptl)
|
||||||
ExternalProject_Add(omptl
|
ExternalProject_Add(omptl
|
||||||
PREFIX ${BUILD_PREFIX}/omptl-prefix
|
PREFIX ${BUILD_PREFIX}/omptl-prefix
|
||||||
|
DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads
|
||||||
URL ${CMAKE_SOURCE_DIR}/external/omptl-20120422.tar.bz2
|
URL ${CMAKE_SOURCE_DIR}/external/omptl-20120422.tar.bz2
|
||||||
CONFIGURE_COMMAND echo "No configure"
|
CONFIGURE_COMMAND echo "No configure"
|
||||||
BUILD_COMMAND echo "No build"
|
BUILD_COMMAND echo "No build"
|
||||||
|
BIN
external/libsharp-8d51946.tar.gz
vendored
Normal file
BIN
external/libsharp-8d51946.tar.gz
vendored
Normal file
Binary file not shown.
173
external/patch-omptl
vendored
173
external/patch-omptl
vendored
@ -1,6 +1,6 @@
|
|||||||
diff -ur omptl.orig/omptl_algorithm omptl/omptl_algorithm
|
diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm
|
||||||
--- omptl.orig/omptl_algorithm 2017-01-16 14:58:37.996690639 +0100
|
--- omptl.old/omptl_algorithm 2022-06-19 08:21:39.815498672 +0200
|
||||||
+++ omptl/omptl_algorithm 2017-01-16 15:00:26.678641720 +0100
|
+++ omptl/omptl_algorithm 2022-06-19 08:21:52.953544672 +0200
|
||||||
@@ -20,7 +20,7 @@
|
@@ -20,7 +20,7 @@
|
||||||
#define OMPTL_ALGORITHM 1
|
#define OMPTL_ALGORITHM 1
|
||||||
|
|
||||||
@ -22,12 +22,14 @@ diff -ur omptl.orig/omptl_algorithm omptl/omptl_algorithm
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* OMPTL_ALGORITHM */
|
#endif /* OMPTL_ALGORITHM */
|
||||||
diff -ur omptl.orig/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
|
diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
|
||||||
--- omptl.orig/omptl_algorithm_par.h 2017-01-16 14:58:37.996690639 +0100
|
--- omptl.old/omptl_algorithm_par.h 2022-06-19 08:21:39.816498675 +0200
|
||||||
+++ omptl/omptl_algorithm_par.h 2017-01-16 14:59:57.974126410 +0100
|
+++ omptl/omptl_algorithm_par.h 2022-06-19 08:23:50.705956964 +0200
|
||||||
@@ -21,8 +21,8 @@
|
@@ -20,9 +20,10 @@
|
||||||
|
#include <utility>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
+#include <random>
|
||||||
|
|
||||||
-#include <omptl/omptl_tools.h>
|
-#include <omptl/omptl_tools.h>
|
||||||
-#include <omptl/omptl_numeric>
|
-#include <omptl/omptl_numeric>
|
||||||
@ -36,9 +38,136 @@ diff -ur omptl.orig/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
|
|||||||
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
|
||||||
diff -ur omptl.orig/omptl_numeric omptl/omptl_numeric
|
@@ -510,7 +511,7 @@
|
||||||
--- omptl.orig/omptl_numeric 2017-01-16 14:58:37.996690639 +0100
|
|
||||||
+++ omptl/omptl_numeric 2017-01-16 15:00:57.051186974 +0100
|
typename std::vector<Iterator>::iterator result =
|
||||||
|
std::find_if(results.begin(),results.end(),
|
||||||
|
- std::bind2nd(std::not_equal_to<Iterator>(), last) );
|
||||||
|
+ std::bind(std::not_equal_to<Iterator>(), std::placeholders::_1, last) );
|
||||||
|
|
||||||
|
if ( result != results.end() )
|
||||||
|
return *result;
|
||||||
|
@@ -569,7 +570,7 @@
|
||||||
|
|
||||||
|
const typename std::vector<Iterator>::iterator result
|
||||||
|
= std::find_if(results.begin(), results.end(),
|
||||||
|
- std::bind2nd(std::not_equal_to<Iterator>(), last) );
|
||||||
|
+ std::bind(std::not_equal_to<Iterator>(), std::placeholders::_1, last) );
|
||||||
|
|
||||||
|
if ( result != results.end() )
|
||||||
|
return *result;
|
||||||
|
@@ -654,7 +655,7 @@
|
||||||
|
|
||||||
|
const typename std::vector<Iterator>::iterator
|
||||||
|
result = std::find_if(results.begin(), results.end(),
|
||||||
|
- std::bind2nd(std::not_equal_to<Iterator>(), last1));
|
||||||
|
+ std::bind(std::not_equal_to<Iterator>(), std::placeholders::_1, last1));
|
||||||
|
|
||||||
|
if ( result != results.end() )
|
||||||
|
return *result;
|
||||||
|
@@ -953,7 +954,7 @@
|
||||||
|
results[t] = std::lower_bound(partitions[t].first, partitions[t].second, value, comp);
|
||||||
|
|
||||||
|
const typename std::vector<ForwardIterator>::iterator result =
|
||||||
|
- std::find_if(results.begin(), results.end(), std::bind2nd(std::not_equal_to<ForwardIterator>(), last) );
|
||||||
|
+ std::find_if(results.begin(), results.end(), std::bind(std::not_equal_to<ForwardIterator>(), std::placeholders::_1, last) );
|
||||||
|
|
||||||
|
if (result != results.end())
|
||||||
|
return *result;
|
||||||
|
@@ -1179,7 +1180,7 @@
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
-
|
||||||
|
+
|
||||||
|
template<typename Iterator, class StrictWeakOrdering>
|
||||||
|
Iterator _pivot_range(Iterator first, Iterator last,
|
||||||
|
const typename std::iterator_traits<Iterator>::value_type pivot,
|
||||||
|
@@ -1309,14 +1310,14 @@
|
||||||
|
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||||
|
const unsigned P)
|
||||||
|
{
|
||||||
|
- std::random_shuffle(first, last);
|
||||||
|
+ std::shuffle(first, last, std::mt19937(std::random_device()()));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class RandomAccessIterator, class RandomNumberGenerator>
|
||||||
|
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||||
|
RandomNumberGenerator& rgen, const unsigned P)
|
||||||
|
{
|
||||||
|
- std::random_shuffle(first, last, rgen);
|
||||||
|
+ std::shuffle(first, last, std::mt19937(std::random_device()()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not (yet) parallelized, not straightforward due to possible dependencies
|
||||||
|
@@ -1472,7 +1473,7 @@
|
||||||
|
const T& new_value, const unsigned P)
|
||||||
|
{
|
||||||
|
return ::omptl::replace_copy_if(first, last, result,
|
||||||
|
- std::bind2nd(std::equal_to<T>(), old_value), new_value, P);
|
||||||
|
+ std::bind(std::equal_to<T>(), std::placeholders::_1, old_value), new_value, P);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ForwardIterator, class Predicate, class T>
|
||||||
|
@@ -1700,7 +1701,7 @@
|
||||||
|
|
||||||
|
std::vector<char> pivot_used(pivots.size(), false); // can't be bool due to parallel write
|
||||||
|
|
||||||
|
- const unsigned max_depth = std::floor(std::tr1::log2(P));
|
||||||
|
+ const unsigned max_depth = unsigned(std::floor(std::log2(P)));
|
||||||
|
assert(1u << max_depth <= P);
|
||||||
|
for (unsigned i = 0; i < max_depth; ++i)
|
||||||
|
{
|
||||||
|
@@ -1781,7 +1782,7 @@
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
std::cout << borders.size() << " " << partitions.size() << " " << P << std::endl;
|
||||||
|
-*/
|
||||||
|
+*/
|
||||||
|
// Round one: sort final partitions, split remaining
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (int i = 0; i < int(partitions.size()); ++i)
|
||||||
|
@@ -1814,7 +1815,7 @@
|
||||||
|
|
||||||
|
const RandomAccessIterator begin = partitions[i].first;
|
||||||
|
const RandomAccessIterator end = partitions[i].second;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
const RandomAccessIterator middle =
|
||||||
|
detail::_pivot_range(begin, end, pivots[pivot_index], comp);
|
||||||
|
partitions[i ] = std::make_pair(begin, middle);
|
||||||
|
diff -ur omptl.old/omptl_algorithm_ser.h omptl/omptl_algorithm_ser.h
|
||||||
|
--- omptl.old/omptl_algorithm_ser.h 2022-06-19 08:21:39.815498672 +0200
|
||||||
|
+++ omptl/omptl_algorithm_ser.h 2022-06-19 08:21:52.960544697 +0200
|
||||||
|
@@ -14,7 +14,7 @@
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
-
|
||||||
|
+#include <random>
|
||||||
|
|
||||||
|
namespace omptl
|
||||||
|
{
|
||||||
|
@@ -463,14 +463,14 @@
|
||||||
|
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||||
|
const unsigned P)
|
||||||
|
{
|
||||||
|
- return ::std::random_shuffle(first, last);
|
||||||
|
+ return ::std::shuffle(first, last, std::mt19937(std::random_device()()));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class RandomAccessIterator, class RandomNumberGenerator>
|
||||||
|
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||||
|
RandomNumberGenerator &rgen, const unsigned P)
|
||||||
|
{
|
||||||
|
- return ::std::random_shuffle(first, last, rgen);
|
||||||
|
+ return ::std::shuffle(first, last, std::mt19937(std::random_device()()));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ForwardIterator, class T>
|
||||||
|
diff -ur omptl.old/omptl_numeric omptl/omptl_numeric
|
||||||
|
--- omptl.old/omptl_numeric 2022-06-19 08:21:39.816498675 +0200
|
||||||
|
+++ omptl/omptl_numeric 2022-06-19 08:21:52.955544679 +0200
|
||||||
@@ -19,7 +19,7 @@
|
@@ -19,7 +19,7 @@
|
||||||
#define OMPTL_NUMERIC 1
|
#define OMPTL_NUMERIC 1
|
||||||
|
|
||||||
@ -63,9 +192,9 @@ diff -ur omptl.orig/omptl_numeric omptl/omptl_numeric
|
|||||||
+#include "omptl_numeric_extensions.h"
|
+#include "omptl_numeric_extensions.h"
|
||||||
|
|
||||||
#endif /* OMPTL_NUMERIC */
|
#endif /* OMPTL_NUMERIC */
|
||||||
diff -ur omptl.orig/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h
|
diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h
|
||||||
--- omptl.orig/omptl_numeric_extensions.h 2017-01-16 14:58:37.996690639 +0100
|
--- omptl.old/omptl_numeric_extensions.h 2022-06-19 08:21:39.815498672 +0200
|
||||||
+++ omptl/omptl_numeric_extensions.h 2017-01-16 14:59:21.549472508 +0100
|
+++ omptl/omptl_numeric_extensions.h 2022-06-19 08:21:52.956544683 +0200
|
||||||
@@ -51,9 +51,9 @@
|
@@ -51,9 +51,9 @@
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@ -78,9 +207,9 @@ diff -ur omptl.orig/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace omptl
|
namespace omptl
|
||||||
diff -ur omptl.orig/omptl_numeric_par.h omptl/omptl_numeric_par.h
|
diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h
|
||||||
--- omptl.orig/omptl_numeric_par.h 2017-01-16 14:58:37.996690639 +0100
|
--- omptl.old/omptl_numeric_par.h 2022-06-19 08:21:39.816498675 +0200
|
||||||
+++ omptl/omptl_numeric_par.h 2017-01-16 14:59:36.397739066 +0100
|
+++ omptl/omptl_numeric_par.h 2022-06-19 08:21:52.957544686 +0200
|
||||||
@@ -23,8 +23,8 @@
|
@@ -23,8 +23,8 @@
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -92,3 +221,15 @@ diff -ur omptl.orig/omptl_numeric_par.h omptl/omptl_numeric_par.h
|
|||||||
|
|
||||||
namespace omptl
|
namespace omptl
|
||||||
{
|
{
|
||||||
|
diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h
|
||||||
|
--- omptl.old/omptl_tools.h 2022-06-19 08:21:39.816498675 +0200
|
||||||
|
+++ omptl/omptl_tools.h 2022-06-19 08:21:52.957544686 +0200
|
||||||
|
@@ -25,7 +25,7 @@
|
||||||
|
#include <climits>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
-#include <tr1/cmath>
|
||||||
|
+#include <cmath>
|
||||||
|
|
||||||
|
namespace omptl
|
||||||
|
{
|
||||||
|
4
pyproject.toml
Normal file
4
pyproject.toml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools","wheel","cython"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
@ -2,38 +2,38 @@ set(CMAKE_SHARED_MODULE_PREFIX)
|
|||||||
|
|
||||||
|
|
||||||
set(PYTHON_INCLUDES ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} ${CMAKE_SOURCE_DIR}/python)
|
set(PYTHON_INCLUDES ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} ${CMAKE_SOURCE_DIR}/python)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/src)
|
include_directories(${CMAKE_SOURCE_DIR}/python ${CMAKE_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/src)
|
||||||
|
|
||||||
IF(CYTHON)
|
IF(CYTHON)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmotool.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmotool.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmotool.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmotool.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmotool.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmotool.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmotool.pyx)
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmotool.pyx)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_power.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_power.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_power.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_power.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_power.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_power.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_power.pyx)
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_power.pyx)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_fast_interp.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_fast_interp.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_fast_interp.pyx)
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_fast_interp.pyx)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_cic.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_cic.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_cic.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_cic.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_cic.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_cic.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_cic.pyx)
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmo_cic.pyx)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_project.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_project.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_project.pyx ${CMAKE_CURRENT_SOURCE_DIR}/project_tool.hpp )
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_project.pyx ${CMAKE_CURRENT_SOURCE_DIR}/project_tool.hpp )
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp
|
||||||
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx
|
COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx )
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx )
|
||||||
ENDIF(CYTHON)
|
ENDIF(CYTHON)
|
||||||
|
|
||||||
|
|
||||||
@ -43,17 +43,21 @@ add_library(_cosmo_cic MODULE ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_cic.cpp)
|
|||||||
add_library(_fast_interp MODULE ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp)
|
add_library(_fast_interp MODULE ${CMAKE_CURRENT_BINARY_DIR}/_fast_interp.cpp)
|
||||||
add_library(_project MODULE ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp)
|
add_library(_project MODULE ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp)
|
||||||
add_library(_cosmomath MODULE ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp)
|
add_library(_cosmomath MODULE ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp)
|
||||||
target_include_directories(_cosmotool PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_cosmotool PRIVATE ${PYTHON_INCLUDES})
|
||||||
target_include_directories(_cosmo_power PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_cosmo_power PRIVATE ${PYTHON_INCLUDES})
|
||||||
target_include_directories(_cosmo_cic PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_cosmo_cic PRIVATE ${PYTHON_INCLUDES})
|
||||||
target_include_directories(_fast_interp PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_fast_interp PRIVATE ${PYTHON_INCLUDES})
|
||||||
target_include_directories(_project PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_project PRIVATE ${PYTHON_INCLUDES})
|
||||||
target_include_directories(_cosmomath PRIVATE ${PYTHON_INCLUDES})
|
target_include_directories(_cosmomath PRIVATE ${PYTHON_INCLUDES})
|
||||||
|
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Bsymbolic-functions")
|
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Bsymbolic-functions")
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup")
|
set(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup")
|
||||||
endif()
|
endif()
|
||||||
|
IF(NOT APPLE)
|
||||||
|
set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/cosmotool.version")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(_cosmotool PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES})
|
target_link_libraries(_cosmotool PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES})
|
||||||
target_link_libraries(_cosmo_power PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES})
|
target_link_libraries(_cosmo_power PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES})
|
||||||
@ -65,13 +69,10 @@ target_link_libraries(_fast_interp PRIVATE ${CosmoTool_local} )
|
|||||||
SET(ct_TARGETS _cosmotool _project _cosmo_power _cosmo_cic _fast_interp _cosmomath)
|
SET(ct_TARGETS _cosmotool _project _cosmo_power _cosmo_cic _fast_interp _cosmomath)
|
||||||
|
|
||||||
if (Boost_FOUND)
|
if (Boost_FOUND)
|
||||||
message(STATUS "Building bispectrum support (path = ${Boost_INCLUDE_DIRS})")
|
message(STATUS "Building bispectrum support")
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
include_directories(${Boost_INCLUDE_DIRS})
|
||||||
add_library(_cosmo_bispectrum MODULE _cosmo_bispectrum.cpp)
|
add_library(_cosmo_bispectrum MODULE _cosmo_bispectrum.cpp)
|
||||||
target_link_libraries(_cosmo_bispectrum ${MATH_LIBRARY})
|
target_link_libraries(_cosmo_bispectrum ${MATH_LIBRARY})
|
||||||
if(ENABLE_OPENMP)
|
|
||||||
set_target_properties(_cosmo_bispectrum PROPERTIES COMPILE_FLAGS "${OpenMP_CXX_FLAGS}" LINK_FLAGS "${OpenMP_CXX_FLAGS}")
|
|
||||||
endif()
|
|
||||||
if (Boost_DEP)
|
if (Boost_DEP)
|
||||||
add_dependencies(_cosmo_bispectrum ${Boost_DEP})
|
add_dependencies(_cosmo_bispectrum ${Boost_DEP})
|
||||||
endif()
|
endif()
|
||||||
@ -110,10 +111,19 @@ endif (WIN32 AND NOT CYGWIN)
|
|||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cosmotool/config.py.in ${CMAKE_CURRENT_BINARY_DIR}/cosmotool/config.py @ONLY)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cosmotool/config.py.in ${CMAKE_CURRENT_BINARY_DIR}/cosmotool/config.py @ONLY)
|
||||||
|
|
||||||
INSTALL(TARGETS
|
INSTALL(TARGETS
|
||||||
${ct_TARGETS}
|
${ct_TARGETS}
|
||||||
|
COMPONENT python
|
||||||
LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES}/cosmotool
|
LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES}/cosmotool
|
||||||
)
|
)
|
||||||
|
|
||||||
INSTALL(DIRECTORY cosmotool ${CMAKE_CURRENT_BINARY_DIR}/cosmotool DESTINATION ${PYTHON_SITE_PACKAGES}
|
INSTALL(DIRECTORY cosmotool ${CMAKE_CURRENT_BINARY_DIR}/cosmotool
|
||||||
|
COMPONENT python DESTINATION ${PYTHON_SITE_PACKAGES}
|
||||||
FILES_MATCHING PATTERN "*.py")
|
FILES_MATCHING PATTERN "*.py")
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
python-install
|
||||||
|
DEPENDS ${ct_TARGETS}
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=python -P
|
||||||
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#cython: language_level=3
|
||||||
import numpy as np
|
import numpy as np
|
||||||
cimport numpy as np
|
cimport numpy as np
|
||||||
|
|
||||||
@ -7,15 +8,21 @@ np.import_ufunc()
|
|||||||
cdef extern from "sys/types.h":
|
cdef extern from "sys/types.h":
|
||||||
ctypedef np.int64_t int64_t
|
ctypedef np.int64_t int64_t
|
||||||
|
|
||||||
|
cdef extern from "numpy/npy_common.h":
|
||||||
|
ctypedef npy_intp
|
||||||
|
|
||||||
cdef extern from "special_math.hpp" namespace "CosmoTool":
|
cdef extern from "special_math.hpp" namespace "CosmoTool":
|
||||||
T log_modified_bessel_first_kind[T](T v, T z) nogil except +
|
T log_modified_bessel_first_kind[T](T v, T z) except + nogil
|
||||||
|
|
||||||
|
cdef extern from "numpy_adaptors.hpp" namespace "CosmoTool":
|
||||||
|
void parallel_ufunc_dd_d[T,IT](char **args, IT* dimensions, IT* steps, void *func)
|
||||||
|
|
||||||
|
|
||||||
cdef np.PyUFuncGenericFunction loop_func[1]
|
cdef np.PyUFuncGenericFunction loop_func[1]
|
||||||
cdef char input_output_types[3]
|
cdef char input_output_types[3]
|
||||||
cdef void *elementwise_funcs[1]
|
cdef void *elementwise_funcs[1]
|
||||||
|
|
||||||
loop_func[0] = np.PyUFunc_dd_d
|
loop_func[0] = <np.PyUFuncGenericFunction>parallel_ufunc_dd_d[double,npy_intp]
|
||||||
|
|
||||||
input_output_types[0] = np.NPY_DOUBLE
|
input_output_types[0] = np.NPY_DOUBLE
|
||||||
input_output_types[1] = np.NPY_DOUBLE
|
input_output_types[1] = np.NPY_DOUBLE
|
||||||
|
@ -31,7 +31,7 @@ cdef extern from "loadSimu.hpp" namespace "CosmoTool":
|
|||||||
|
|
||||||
bool noAuto
|
bool noAuto
|
||||||
|
|
||||||
cdef const int NEED_GADGET_ID
|
cdef const int NEED_GADGET_ID
|
||||||
cdef const int NEED_POSITION
|
cdef const int NEED_POSITION
|
||||||
cdef const int NEED_VELOCITY
|
cdef const int NEED_VELOCITY
|
||||||
cdef const int NEED_TYPE
|
cdef const int NEED_TYPE
|
||||||
@ -39,7 +39,7 @@ cdef extern from "loadSimu.hpp" namespace "CosmoTool":
|
|||||||
|
|
||||||
cdef extern from "loadGadget.hpp" namespace "CosmoTool":
|
cdef extern from "loadGadget.hpp" namespace "CosmoTool":
|
||||||
|
|
||||||
SimuData *loadGadgetMulti(const char *fname, int id, int flags, int gformat) nogil except +
|
SimuData *loadGadgetMulti(const char *fname, int id, int flags, int gformat) except + nogil
|
||||||
void cxx_writeGadget "CosmoTool::writeGadget" (const char * s, SimuData *data) except +
|
void cxx_writeGadget "CosmoTool::writeGadget" (const char * s, SimuData *data) except +
|
||||||
|
|
||||||
cdef extern from "safe_gadget.hpp":
|
cdef extern from "safe_gadget.hpp":
|
||||||
@ -57,36 +57,36 @@ class PySimulationBase(object):
|
|||||||
"""
|
"""
|
||||||
This is the base class to representation Simulation in CosmoTool/python.
|
This is the base class to representation Simulation in CosmoTool/python.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def getPositions(self):
|
def getPositions(self):
|
||||||
"""
|
"""
|
||||||
getPositions(self)
|
getPositions(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A list of three arrays holding the positions of the particles.
|
A list of three arrays holding the positions of the particles.
|
||||||
The i-th element is the i-th coordinate of each particle.
|
The i-th element is the i-th coordinate of each particle.
|
||||||
It may be None if the positions were not requested.
|
It may be None if the positions were not requested.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getPositions is not implemented")
|
raise NotImplementedError("getPositions is not implemented")
|
||||||
|
|
||||||
def getVelocities(self):
|
def getVelocities(self):
|
||||||
"""
|
"""
|
||||||
getVelocities(self)
|
getVelocities(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A list of three arrays holding the velocities of the particles.
|
A list of three arrays holding the velocities of the particles.
|
||||||
The i-th element is the i-th coordinate of each particle.
|
The i-th element is the i-th coordinate of each particle.
|
||||||
It may be None if the velocities were not requested.
|
It may be None if the velocities were not requested.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getVelocities is not implemented")
|
raise NotImplementedError("getVelocities is not implemented")
|
||||||
|
|
||||||
def getIdentifiers(self):
|
def getIdentifiers(self):
|
||||||
"""
|
"""
|
||||||
getIdentifiers(self)
|
getIdentifiers(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Returns an integer array that hold the unique identifiers of
|
Returns an integer array that hold the unique identifiers of
|
||||||
each particle.
|
each particle.
|
||||||
It may be None if the identifiers were not requested.
|
It may be None if the identifiers were not requested.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getIdentifiers is not implemented")
|
raise NotImplementedError("getIdentifiers is not implemented")
|
||||||
@ -94,10 +94,10 @@ class PySimulationBase(object):
|
|||||||
def getTypes(self):
|
def getTypes(self):
|
||||||
"""
|
"""
|
||||||
getTypes(self)
|
getTypes(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Returns an integer array that hold the type of
|
Returns an integer array that hold the type of
|
||||||
each particle.
|
each particle.
|
||||||
It may be None if the types were not requested.
|
It may be None if the types were not requested.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getTypes is not implemented")
|
raise NotImplementedError("getTypes is not implemented")
|
||||||
@ -105,27 +105,27 @@ class PySimulationBase(object):
|
|||||||
def getOmega_M(self):
|
def getOmega_M(self):
|
||||||
"""
|
"""
|
||||||
getOmega_M(self)
|
getOmega_M(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
the mean matter density in the simulation, with respect
|
the mean matter density in the simulation, with respect
|
||||||
to the critical density.
|
to the critical density.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getOmega_M is not implemented")
|
raise NotImplementedError("getOmega_M is not implemented")
|
||||||
|
|
||||||
def getOmega_Lambda(self):
|
def getOmega_Lambda(self):
|
||||||
"""
|
"""
|
||||||
getOmega_Lambda(self)
|
getOmega_Lambda(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
the mean dark energy density in the simulation, with respect
|
the mean dark energy density in the simulation, with respect
|
||||||
to the critical density.
|
to the critical density.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("getOmega_Lambda is not implemented")
|
raise NotImplementedError("getOmega_Lambda is not implemented")
|
||||||
|
|
||||||
def getTime(self):
|
def getTime(self):
|
||||||
"""
|
"""
|
||||||
getTime(self)
|
getTime(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
the time the snapshot was taken in the simulation. It can
|
the time the snapshot was taken in the simulation. It can
|
||||||
have various units depending on the file format.
|
have various units depending on the file format.
|
||||||
@ -135,7 +135,7 @@ class PySimulationBase(object):
|
|||||||
def getHubble(self):
|
def getHubble(self):
|
||||||
"""
|
"""
|
||||||
getHubble(self)
|
getHubble(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
the hubble constant in unit of 100 km/s/Mpc
|
the hubble constant in unit of 100 km/s/Mpc
|
||||||
"""
|
"""
|
||||||
@ -144,7 +144,7 @@ class PySimulationBase(object):
|
|||||||
def getBoxsize(self):
|
def getBoxsize(self):
|
||||||
"""
|
"""
|
||||||
getBoxsize(self)
|
getBoxsize(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
the size of the simulation box. The length unit is not fixed,
|
the size of the simulation box. The length unit is not fixed,
|
||||||
though it is customary to have it in Mpc/h if the loader has
|
though it is customary to have it in Mpc/h if the loader has
|
||||||
@ -155,7 +155,7 @@ class PySimulationBase(object):
|
|||||||
def getMasses(self):
|
def getMasses(self):
|
||||||
"""
|
"""
|
||||||
getMasses(self)
|
getMasses(self)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
an array with the masses of each particles, in unspecified unit that
|
an array with the masses of each particles, in unspecified unit that
|
||||||
depend on the loader.
|
depend on the loader.
|
||||||
@ -165,7 +165,7 @@ class PySimulationBase(object):
|
|||||||
cdef class Simulation:
|
cdef class Simulation:
|
||||||
"""
|
"""
|
||||||
Simulation()
|
Simulation()
|
||||||
|
|
||||||
Class that directly manages internal loaded data obtained from a loader
|
Class that directly manages internal loaded data obtained from a loader
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ cdef class Simulation:
|
|||||||
property BoxSize:
|
property BoxSize:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.data.BoxSize
|
return self.data.BoxSize
|
||||||
|
|
||||||
property time:
|
property time:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.data.time
|
return self.data.time
|
||||||
@ -192,15 +192,15 @@ cdef class Simulation:
|
|||||||
property Omega_M:
|
property Omega_M:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.data.Omega_M
|
return self.data.Omega_M
|
||||||
|
|
||||||
property Omega_Lambda:
|
property Omega_Lambda:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.data.Omega_Lambda
|
return self.data.Omega_Lambda
|
||||||
|
|
||||||
property positions:
|
property positions:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.positions
|
return self.positions
|
||||||
|
|
||||||
property velocities:
|
property velocities:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.velocities
|
return self.velocities
|
||||||
@ -216,7 +216,7 @@ cdef class Simulation:
|
|||||||
property masses:
|
property masses:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.masses
|
return self.masses
|
||||||
|
|
||||||
property numParticles:
|
property numParticles:
|
||||||
def __get__(Simulation self):
|
def __get__(Simulation self):
|
||||||
return self.data.NumPart
|
return self.data.NumPart
|
||||||
@ -228,7 +228,7 @@ cdef class Simulation:
|
|||||||
|
|
||||||
def __cinit__(Simulation self):
|
def __cinit__(Simulation self):
|
||||||
self.data = <SimuData *>0
|
self.data = <SimuData *>0
|
||||||
|
|
||||||
def __dealloc__(Simulation self):
|
def __dealloc__(Simulation self):
|
||||||
if self.data != <SimuData *>0:
|
if self.data != <SimuData *>0:
|
||||||
del self.data
|
del self.data
|
||||||
@ -237,40 +237,43 @@ cdef class Simulation:
|
|||||||
class PySimulationAdaptor(PySimulationBase):
|
class PySimulationAdaptor(PySimulationBase):
|
||||||
"""
|
"""
|
||||||
PySimulationAdaptor(PySimulationBase_)
|
PySimulationAdaptor(PySimulationBase_)
|
||||||
|
|
||||||
This class is an adaptor for an internal type to the loader. It defines
|
This class is an adaptor for an internal type to the loader. It defines
|
||||||
all the methods of PySimulationBase.
|
all the methods of PySimulationBase.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
simu: a Simulation_ object
|
simu: a Simulation_ object
|
||||||
"""
|
"""
|
||||||
def __init__(self,sim):
|
def __init__(self,sim):
|
||||||
self.simu = sim
|
self.simu = sim
|
||||||
|
|
||||||
|
def getNumParticles(self):
|
||||||
|
return self.simu.numParticles
|
||||||
|
|
||||||
def getBoxsize(self):
|
def getBoxsize(self):
|
||||||
return self.simu.BoxSize
|
return self.simu.BoxSize
|
||||||
|
|
||||||
def getPositions(self):
|
def getPositions(self):
|
||||||
return self.simu.positions
|
return self.simu.positions
|
||||||
|
|
||||||
def getTypes(self):
|
def getTypes(self):
|
||||||
return self.simu.types
|
return self.simu.types
|
||||||
|
|
||||||
def getVelocities(self):
|
def getVelocities(self):
|
||||||
return self.simu.velocities
|
return self.simu.velocities
|
||||||
|
|
||||||
def getIdentifiers(self):
|
def getIdentifiers(self):
|
||||||
return self.simu.identifiers
|
return self.simu.identifiers
|
||||||
|
|
||||||
def getTime(self):
|
def getTime(self):
|
||||||
return self.simu.time
|
return self.simu.time
|
||||||
|
|
||||||
def getHubble(self):
|
def getHubble(self):
|
||||||
return self.simu.Hubble
|
return self.simu.Hubble
|
||||||
|
|
||||||
def getOmega_M(self):
|
def getOmega_M(self):
|
||||||
return self.simu.Omega_M
|
return self.simu.Omega_M
|
||||||
|
|
||||||
def getOmega_Lambda(self):
|
def getOmega_Lambda(self):
|
||||||
return self.simu.Omega_Lambda
|
return self.simu.Omega_Lambda
|
||||||
|
|
||||||
@ -281,7 +284,7 @@ cdef class ArrayWrapper:
|
|||||||
cdef void* data_ptr
|
cdef void* data_ptr
|
||||||
cdef np.uint64_t size
|
cdef np.uint64_t size
|
||||||
cdef int type_array
|
cdef int type_array
|
||||||
|
|
||||||
cdef set_data(self, np.uint64_t size, int type_array, void* data_ptr):
|
cdef set_data(self, np.uint64_t size, int type_array, void* data_ptr):
|
||||||
""" Set the data of the array
|
""" Set the data of the array
|
||||||
This cannot be done in the constructor as it must recieve C-level
|
This cannot be done in the constructor as it must recieve C-level
|
||||||
@ -294,22 +297,29 @@ cdef class ArrayWrapper:
|
|||||||
self.data_ptr = data_ptr
|
self.data_ptr = data_ptr
|
||||||
self.size = size
|
self.size = size
|
||||||
self.type_array = type_array
|
self.type_array = type_array
|
||||||
|
|
||||||
def __array__(self):
|
def __array__(self):
|
||||||
""" Here we use the __array__ method, that is called when numpy
|
""" Here we use the __array__ method, that is called when numpy
|
||||||
tries to get an array from the object."""
|
tries to get an array from the object."""
|
||||||
cdef np.npy_intp shape[1]
|
cdef np.npy_intp shape[1]
|
||||||
|
|
||||||
shape[0] = <np.npy_intp> self.size
|
shape[0] = <np.npy_intp> self.size
|
||||||
# Create a 1D array, of length 'size'
|
# Create a 1D array, of length 'size'
|
||||||
ndarray = np.PyArray_SimpleNewFromData(1, shape, self.type_array, self.data_ptr)
|
ndarray = np.PyArray_SimpleNewFromData(1, shape, self.type_array, self.data_ptr)
|
||||||
return ndarray
|
return ndarray
|
||||||
|
|
||||||
def __dealloc__(self):
|
def __dealloc__(self):
|
||||||
""" Frees the array. This is called by Python when all the
|
""" Frees the array. This is called by Python when all the
|
||||||
references to the object are gone. """
|
references to the object are gone. """
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
cdef extern from "numpy/arrayobject.h":
|
||||||
|
# a little bit awkward: the reference to obj will be stolen
|
||||||
|
# using PyObject* to signal that Cython cannot handle it automatically
|
||||||
|
int PyArray_SetBaseObject(np.ndarray arr, PyObject *obj) except -1 # -1 means there was an error
|
||||||
|
|
||||||
|
|
||||||
cdef object wrap_array(void *p, np.uint64_t s, int typ):
|
cdef object wrap_array(void *p, np.uint64_t s, int typ):
|
||||||
cdef np.ndarray ndarray
|
cdef np.ndarray ndarray
|
||||||
cdef ArrayWrapper wrapper
|
cdef ArrayWrapper wrapper
|
||||||
@ -317,9 +327,10 @@ cdef object wrap_array(void *p, np.uint64_t s, int typ):
|
|||||||
wrapper = ArrayWrapper()
|
wrapper = ArrayWrapper()
|
||||||
wrapper.set_data(s, typ, p)
|
wrapper.set_data(s, typ, p)
|
||||||
ndarray = np.array(wrapper, copy=False)
|
ndarray = np.array(wrapper, copy=False)
|
||||||
ndarray.base = <PyObject*> wrapper
|
#ndarray.base = <PyObject*> wrapper
|
||||||
|
PyArray_SetBaseObject(ndarray, <PyObject*> wrapper)
|
||||||
Py_INCREF(wrapper)
|
Py_INCREF(wrapper)
|
||||||
|
|
||||||
return ndarray
|
return ndarray
|
||||||
|
|
||||||
|
|
||||||
@ -368,7 +379,7 @@ def loadGadget(str filename, int snapshot_id, int gadgetFormat = 1, bool loadPos
|
|||||||
"""loadGadget(filename, snapshot_id, gadgetFormat = 1, loadPosition=True, loadVelocity=False, loadId=False, loadType=False)
|
"""loadGadget(filename, snapshot_id, gadgetFormat = 1, loadPosition=True, loadVelocity=False, loadId=False, loadType=False)
|
||||||
|
|
||||||
This function loads Gadget-1 snapshot format.
|
This function loads Gadget-1 snapshot format.
|
||||||
|
|
||||||
If snapshot_id is negative then the snapshot is considered not to be part of
|
If snapshot_id is negative then the snapshot is considered not to be part of
|
||||||
a set of snapshots written by different cpu. Otherwise the filename is modified
|
a set of snapshots written by different cpu. Otherwise the filename is modified
|
||||||
to reflect the indicated snapshot_id.
|
to reflect the indicated snapshot_id.
|
||||||
@ -376,16 +387,16 @@ def loadGadget(str filename, int snapshot_id, int gadgetFormat = 1, bool loadPos
|
|||||||
Arguments:
|
Arguments:
|
||||||
filename (str): input filename
|
filename (str): input filename
|
||||||
snapshot_id (int): identifier of the gadget file if it is a multi-file snapshot
|
snapshot_id (int): identifier of the gadget file if it is a multi-file snapshot
|
||||||
|
|
||||||
Keyword arguments:
|
Keyword arguments:
|
||||||
loadPosition (bool): whether to load positions
|
loadPosition (bool): whether to load positions
|
||||||
loadVelocity (bool): whether to load velocities
|
loadVelocity (bool): whether to load velocities
|
||||||
loadId (bool): whether to load unique identifiers
|
loadId (bool): whether to load unique identifiers
|
||||||
loadType (bool): whether to set types to particles
|
loadType (bool): whether to set types to particles
|
||||||
loadMass (bool): whether to set the mass of particles
|
loadMass (bool): whether to set the mass of particles
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
an PySimulationAdaptor instance.
|
an PySimulationAdaptor instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
cdef int flags
|
cdef int flags
|
||||||
@ -410,7 +421,7 @@ def loadGadget(str filename, int snapshot_id, int gadgetFormat = 1, bool loadPos
|
|||||||
with nogil:
|
with nogil:
|
||||||
data = loadGadgetMulti(filename_bs, snapshot_id, flags, gadgetFormat)
|
data = loadGadgetMulti(filename_bs, snapshot_id, flags, gadgetFormat)
|
||||||
if data == <SimuData*>0:
|
if data == <SimuData*>0:
|
||||||
return None
|
raise RuntimeError("File could not be read")
|
||||||
|
|
||||||
return PySimulationAdaptor(wrap_simudata(data, flags))
|
return PySimulationAdaptor(wrap_simudata(data, flags))
|
||||||
|
|
||||||
@ -419,13 +430,13 @@ def loadParallelGadget(object filename_list, int gadgetFormat = 1, bool loadPosi
|
|||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
filename (list): a list or tuple of filenames to load in parallel
|
filename (list): a list or tuple of filenames to load in parallel
|
||||||
|
|
||||||
Keyword arguments:
|
Keyword arguments:
|
||||||
loadPosition (bool): indicate to load positions
|
loadPosition (bool): indicate to load positions
|
||||||
loadVelocity (bool): indicate to load velocities
|
loadVelocity (bool): indicate to load velocities
|
||||||
loadId (bool): indicate to load id
|
loadId (bool): indicate to load id
|
||||||
loadType (bool): indicate to load particle types
|
loadType (bool): indicate to load particle types
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
It loads a gadget-1 snapshot and return a cosmotool.PySimulationBase_ object.
|
It loads a gadget-1 snapshot and return a cosmotool.PySimulationBase_ object.
|
||||||
"""
|
"""
|
||||||
@ -453,16 +464,16 @@ def loadParallelGadget(object filename_list, int gadgetFormat = 1, bool loadPosi
|
|||||||
data = alloc_simudata(num_files)
|
data = alloc_simudata(num_files)
|
||||||
for i,l in enumerate(filename_list):
|
for i,l in enumerate(filename_list):
|
||||||
filenames[i] = l.encode('utf-8')
|
filenames[i] = l.encode('utf-8')
|
||||||
|
|
||||||
with nogil:
|
with nogil:
|
||||||
for i in prange(num_files):
|
for i in prange(num_files):
|
||||||
local_data = loadGadgetMulti_safe(filenames[i], flags, gadgetFormat)
|
local_data = loadGadgetMulti_safe(filenames[i], flags, gadgetFormat)
|
||||||
data[i] = local_data
|
data[i] = local_data
|
||||||
# data[i] = loadGadgetMulti(filenames[i].c_str(), -1, flags)
|
# data[i] = loadGadgetMulti(filenames[i].c_str(), -1, flags)
|
||||||
|
|
||||||
out_arrays = []
|
out_arrays = []
|
||||||
for i in xrange(num_files):
|
for i in xrange(num_files):
|
||||||
if data[i] == <SimuData*>0:
|
if data[i] == <SimuData*>0:
|
||||||
out_arrays.append(None)
|
out_arrays.append(None)
|
||||||
else:
|
else:
|
||||||
out_arrays.append(PySimulationAdaptor(wrap_simudata(data[i], flags)))
|
out_arrays.append(PySimulationAdaptor(wrap_simudata(data[i], flags)))
|
||||||
@ -473,10 +484,10 @@ def loadParallelGadget(object filename_list, int gadgetFormat = 1, bool loadPosi
|
|||||||
|
|
||||||
def writeGadget(str filename, object simulation):
|
def writeGadget(str filename, object simulation):
|
||||||
"""writeGadget(filename, simulation)
|
"""writeGadget(filename, simulation)
|
||||||
|
|
||||||
This function attempts to write the content of the simulation object into
|
This function attempts to write the content of the simulation object into
|
||||||
a file named `filename` using a Gadget-1 file format.
|
a file named `filename` using a Gadget-1 file format.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
filename (str): output filename
|
filename (str): output filename
|
||||||
simulation (PySimulationBase): a simulation object
|
simulation (PySimulationBase): a simulation object
|
||||||
@ -486,23 +497,23 @@ def writeGadget(str filename, object simulation):
|
|||||||
cdef np.ndarray[np.int64_t, ndim=1] ids
|
cdef np.ndarray[np.int64_t, ndim=1] ids
|
||||||
cdef np.int64_t NumPart
|
cdef np.int64_t NumPart
|
||||||
cdef int j
|
cdef int j
|
||||||
|
|
||||||
if not isinstance(simulation,PySimulationBase):
|
if not isinstance(simulation,PySimulationBase):
|
||||||
raise TypeError("Second argument must be of type SimulationBase")
|
raise TypeError("Second argument must be of type SimulationBase")
|
||||||
|
|
||||||
NumPart = simulation.positions[0].size
|
NumPart = simulation.positions[0].size
|
||||||
simdata.noAuto = True
|
simdata.noAuto = True
|
||||||
|
|
||||||
for j in xrange(3):
|
for j in xrange(3):
|
||||||
pos = simulation.getPositions()[j]
|
pos = simulation.getPositions()[j]
|
||||||
vel = simulation.getVelocities()[j]
|
vel = simulation.getVelocities()[j]
|
||||||
|
|
||||||
if pos.size != NumPart or vel.size != NumPart:
|
if pos.size != NumPart or vel.size != NumPart:
|
||||||
raise ValueError("Invalid number of particles")
|
raise ValueError("Invalid number of particles")
|
||||||
|
|
||||||
simdata.Pos[j] = <float *>pos.data
|
simdata.Pos[j] = <float *>pos.data
|
||||||
simdata.Vel[j] = <float *>vel.data
|
simdata.Vel[j] = <float *>vel.data
|
||||||
|
|
||||||
ids = simulation.getIdentifiers()
|
ids = simulation.getIdentifiers()
|
||||||
simdata.Id = <int64_t *>ids.data
|
simdata.Id = <int64_t *>ids.data
|
||||||
simdata.BoxSize = simulation.getBoxsize()
|
simdata.BoxSize = simulation.getBoxsize()
|
||||||
@ -519,21 +530,21 @@ def writeGadget(str filename, object simulation):
|
|||||||
def loadRamses(str basepath, int snapshot_id, int cpu_id, bool doublePrecision = False, bool loadPosition = True, bool loadVelocity = False, bool loadId = False, bool loadMass = False):
|
def loadRamses(str basepath, int snapshot_id, int cpu_id, bool doublePrecision = False, bool loadPosition = True, bool loadVelocity = False, bool loadId = False, bool loadMass = False):
|
||||||
""" loadRamses(basepath, snapshot_id, cpu_id, doublePrecision = False, loadPosition = True, loadVelocity = False)
|
""" loadRamses(basepath, snapshot_id, cpu_id, doublePrecision = False, loadPosition = True, loadVelocity = False)
|
||||||
Loads the indicated snapshot based on the cpu id, snapshot id and basepath. It is important to specify the correct precision in doublePrecision otherwise the loading will fail. There is no way of auto-detecting properly the precision of the snapshot file.
|
Loads the indicated snapshot based on the cpu id, snapshot id and basepath. It is important to specify the correct precision in doublePrecision otherwise the loading will fail. There is no way of auto-detecting properly the precision of the snapshot file.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
basepath (str): the base directory of the snapshot
|
basepath (str): the base directory of the snapshot
|
||||||
snapshot_id (int): the snapshot id
|
snapshot_id (int): the snapshot id
|
||||||
cpu_id (int): the cpu id of the file to load
|
cpu_id (int): the cpu id of the file to load
|
||||||
|
|
||||||
Keyword args:
|
Keyword args:
|
||||||
doublePrecision (bool): By default it is False, thus singlePrecision
|
doublePrecision (bool): By default it is False, thus singlePrecision
|
||||||
loadPosition (bool): Whether to load positions
|
loadPosition (bool): Whether to load positions
|
||||||
loadVelocity (bool): Whether to load velocities
|
loadVelocity (bool): Whether to load velocities
|
||||||
loadId (bool): Whether to load identifiers
|
loadId (bool): Whether to load identifiers
|
||||||
loadMass (bool): Whether to load mass value
|
loadMass (bool): Whether to load mass value
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
An object derived from PySimulationBase_.
|
An object derived from PySimulationBase_.
|
||||||
"""
|
"""
|
||||||
cdef int flags
|
cdef int flags
|
||||||
cdef SimuData *data
|
cdef SimuData *data
|
||||||
@ -549,7 +560,7 @@ def loadRamses(str basepath, int snapshot_id, int cpu_id, bool doublePrecision =
|
|||||||
if loadMass:
|
if loadMass:
|
||||||
flags |= NEED_MASS
|
flags |= NEED_MASS
|
||||||
|
|
||||||
encpath = basepath.encode('utf-8')
|
encpath = basepath.encode('utf-8')
|
||||||
try:
|
try:
|
||||||
data = loadRamsesSimu(encpath, snapshot_id, cpu_id, doublePrecision, flags)
|
data = loadRamsesSimu(encpath, snapshot_id, cpu_id, doublePrecision, flags)
|
||||||
if data == <SimuData*>0:
|
if data == <SimuData*>0:
|
||||||
@ -558,4 +569,4 @@ def loadRamses(str basepath, int snapshot_id, int cpu_id, bool doublePrecision =
|
|||||||
raise RuntimeError(str(e) + ' (check the float precision in snapshot)')
|
raise RuntimeError(str(e) + ' (check the float precision in snapshot)')
|
||||||
|
|
||||||
return PySimulationAdaptor(wrap_simudata(data, flags))
|
return PySimulationAdaptor(wrap_simudata(data, flags))
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@ cdef extern from "openmp.hpp" namespace "CosmoTool":
|
|||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
@cython.wraparound(False)
|
@cython.wraparound(False)
|
||||||
cdef void interp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
cdef void interp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
||||||
DTYPE_t z,
|
DTYPE_t z,
|
||||||
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval) nogil:
|
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval) nogil:
|
||||||
|
|
||||||
cdef int Ngrid = d.shape[0]
|
cdef int Ngrid = d.shape[0]
|
||||||
@ -84,8 +84,8 @@ cdef void interp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
|||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
@cython.wraparound(False)
|
@cython.wraparound(False)
|
||||||
cdef void ngp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
cdef void ngp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
||||||
DTYPE_t z,
|
DTYPE_t z,
|
||||||
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval) nogil:
|
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval) nogil:
|
||||||
|
|
||||||
cdef int Ngrid = d.shape[0]
|
cdef int Ngrid = d.shape[0]
|
||||||
@ -108,14 +108,14 @@ cdef void ngp3d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
|||||||
iy = iy%Ngrid
|
iy = iy%Ngrid
|
||||||
iz = iz%Ngrid
|
iz = iz%Ngrid
|
||||||
|
|
||||||
retval[0] = d[ix ,iy ,iz ]
|
retval[0] = d[ix ,iy ,iz ]
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
@cython.wraparound(False)
|
@cython.wraparound(False)
|
||||||
cdef void ngp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
cdef void ngp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
||||||
DTYPE_t z,
|
DTYPE_t z,
|
||||||
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval, DTYPE_t inval) nogil:
|
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval, DTYPE_t inval) nogil:
|
||||||
|
|
||||||
cdef int Ngrid = d.shape[0]
|
cdef int Ngrid = d.shape[0]
|
||||||
@ -137,16 +137,16 @@ cdef void ngp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
|||||||
retval[0] = inval
|
retval[0] = inval
|
||||||
return
|
return
|
||||||
|
|
||||||
retval[0] = d[ix ,iy ,iz ]
|
retval[0] = d[ix ,iy ,iz ]
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
@cython.wraparound(False)
|
@cython.wraparound(False)
|
||||||
cdef void interp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
cdef void interp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
||||||
DTYPE_t z,
|
DTYPE_t z,
|
||||||
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval, DTYPE_t inval) nogil:
|
DTYPE_t[:,:,:] d, DTYPE_t Lbox, DTYPE_t *retval, DTYPE_t inval) nogil:
|
||||||
|
|
||||||
cdef int Ngrid = d.shape[0]
|
cdef int Ngrid = d.shape[0]
|
||||||
cdef DTYPE_t inv_delta = Ngrid/Lbox
|
cdef DTYPE_t inv_delta = Ngrid/Lbox
|
||||||
cdef int ix, iy, iz
|
cdef int ix, iy, iz
|
||||||
@ -193,13 +193,13 @@ cdef void interp3d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
|||||||
d[ix+1,iy+1,iz+1] * f[1][1][1]
|
d[ix+1,iy+1,iz+1] * f[1][1][1]
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
def interp3d(x not None, y not None,
|
def interp3d(x not None, y not None,
|
||||||
z not None,
|
z not None,
|
||||||
npx.ndarray[DTYPE_t, ndim=3] d not None, DTYPE_t Lbox,
|
npx.ndarray[DTYPE_t, ndim=3] d not None, DTYPE_t Lbox,
|
||||||
bool periodic=False, bool centered=True, bool ngp=False, DTYPE_t inval = 0):
|
bool periodic=False, bool centered=True, bool ngp=False, DTYPE_t inval = 0):
|
||||||
""" interp3d(x,y,z,d,Lbox,periodic=False,centered=True,ngp=False) -> interpolated values
|
""" interp3d(x,y,z,d,Lbox,periodic=False,centered=True,ngp=False) -> interpolated values
|
||||||
|
|
||||||
Compute the tri-linear interpolation of the given field (d) at the given position (x,y,z). It assumes that they are box-centered coordinates. So (x,y,z) == (0,0,0) is equivalent to the pixel at (Nx/2,Ny/2,Nz/2) with Nx,Ny,Nz = d.shape. If periodic is set, it assumes the box is periodic
|
Compute the tri-linear interpolation of the given field (d) at the given position (x,y,z). It assumes that they are box-centered coordinates. So (x,y,z) == (0,0,0) is equivalent to the pixel at (Nx/2,Ny/2,Nz/2) with Nx,Ny,Nz = d.shape. If periodic is set, it assumes the box is periodic
|
||||||
"""
|
"""
|
||||||
cdef npx.ndarray[DTYPE_t] out
|
cdef npx.ndarray[DTYPE_t] out
|
||||||
cdef DTYPE_t[:] out_slice
|
cdef DTYPE_t[:] out_slice
|
||||||
@ -227,12 +227,12 @@ def interp3d(x not None, y not None,
|
|||||||
if type(x) == np.ndarray or type(y) == np.ndarray or type(z) == np.ndarray:
|
if type(x) == np.ndarray or type(y) == np.ndarray or type(z) == np.ndarray:
|
||||||
if type(x) != np.ndarray or type(y) != np.ndarray or type(z) != np.ndarray:
|
if type(x) != np.ndarray or type(y) != np.ndarray or type(z) != np.ndarray:
|
||||||
raise ValueError("All or no array. No partial arguments")
|
raise ValueError("All or no array. No partial arguments")
|
||||||
|
|
||||||
ax = x
|
ax = x
|
||||||
ay = y
|
ay = y
|
||||||
az = z
|
az = z
|
||||||
assert ax.size == ay.size and ax.size == az.size
|
assert ax.size == ay.size and ax.size == az.size
|
||||||
|
|
||||||
out = np.empty(x.shape, dtype=DTYPE)
|
out = np.empty(x.shape, dtype=DTYPE)
|
||||||
out_slice = out
|
out_slice = out
|
||||||
in_slice = d
|
in_slice = d
|
||||||
@ -280,10 +280,10 @@ cdef DTYPE_t interp2d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
|||||||
|
|
||||||
rx = (inv_delta*x + Ngrid/2)
|
rx = (inv_delta*x + Ngrid/2)
|
||||||
ry = (inv_delta*y + Ngrid/2)
|
ry = (inv_delta*y + Ngrid/2)
|
||||||
|
|
||||||
ix = int(floor(rx))
|
ix = int(floor(rx))
|
||||||
iy = int(floor(ry))
|
iy = int(floor(ry))
|
||||||
|
|
||||||
rx -= ix
|
rx -= ix
|
||||||
ry -= iy
|
ry -= iy
|
||||||
|
|
||||||
@ -291,13 +291,13 @@ cdef DTYPE_t interp2d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
|||||||
ix += Ngrid
|
ix += Ngrid
|
||||||
while iy < 0:
|
while iy < 0:
|
||||||
iy += Ngrid
|
iy += Ngrid
|
||||||
|
|
||||||
jx = (ix+1)%Ngrid
|
jx = (ix+1)%Ngrid
|
||||||
jy = (iy+1)%Ngrid
|
jy = (iy+1)%Ngrid
|
||||||
|
|
||||||
assert ((ix >= 0) and ((jx) < Ngrid))
|
assert ((ix >= 0) and ((jx) < Ngrid))
|
||||||
assert ((iy >= 0) and ((jy) < Ngrid))
|
assert ((iy >= 0) and ((jy) < Ngrid))
|
||||||
|
|
||||||
f[0][0] = (1-rx)*(1-ry)
|
f[0][0] = (1-rx)*(1-ry)
|
||||||
f[1][0] = ( rx)*(1-ry)
|
f[1][0] = ( rx)*(1-ry)
|
||||||
f[0][1] = (1-rx)*( ry)
|
f[0][1] = (1-rx)*( ry)
|
||||||
@ -314,7 +314,7 @@ cdef DTYPE_t interp2d_INTERNAL_periodic(DTYPE_t x, DTYPE_t y,
|
|||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
cdef DTYPE_t interp2d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
cdef DTYPE_t interp2d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
||||||
npx.ndarray[DTYPE_t, ndim=2] d, DTYPE_t Lbox) except? 0:
|
npx.ndarray[DTYPE_t, ndim=2] d, DTYPE_t Lbox) except? 0:
|
||||||
|
|
||||||
cdef int Ngrid = d.shape[0]
|
cdef int Ngrid = d.shape[0]
|
||||||
cdef DTYPE_t inv_delta = Ngrid/Lbox
|
cdef DTYPE_t inv_delta = Ngrid/Lbox
|
||||||
cdef int ix, iy
|
cdef int ix, iy
|
||||||
@ -348,7 +348,7 @@ cdef DTYPE_t interp2d_INTERNAL(DTYPE_t x, DTYPE_t y,
|
|||||||
d[ix+1,iy ] * f[1][0] + \
|
d[ix+1,iy ] * f[1][0] + \
|
||||||
d[ix ,iy+1] * f[0][1] + \
|
d[ix ,iy+1] * f[0][1] + \
|
||||||
d[ix+1,iy+1] * f[1][1]
|
d[ix+1,iy+1] * f[1][1]
|
||||||
|
|
||||||
def interp2d(x not None, y not None,
|
def interp2d(x not None, y not None,
|
||||||
npx.ndarray[DTYPE_t, ndim=2] d not None, DTYPE_t Lbox,
|
npx.ndarray[DTYPE_t, ndim=2] d not None, DTYPE_t Lbox,
|
||||||
bool periodic=False):
|
bool periodic=False):
|
||||||
@ -362,11 +362,11 @@ def interp2d(x not None, y not None,
|
|||||||
if type(x) == np.ndarray or type(y) == np.ndarray:
|
if type(x) == np.ndarray or type(y) == np.ndarray:
|
||||||
if type(x) != np.ndarray or type(y) != np.ndarray:
|
if type(x) != np.ndarray or type(y) != np.ndarray:
|
||||||
raise ValueError("All or no array. No partial arguments")
|
raise ValueError("All or no array. No partial arguments")
|
||||||
|
|
||||||
ax = x
|
ax = x
|
||||||
ay = y
|
ay = y
|
||||||
assert ax.size == ay.size
|
assert ax.size == ay.size
|
||||||
|
|
||||||
out = np.empty(x.shape, dtype=DTYPE)
|
out = np.empty(x.shape, dtype=DTYPE)
|
||||||
if periodic:
|
if periodic:
|
||||||
for i in range(ax.size):
|
for i in range(ax.size):
|
||||||
@ -381,8 +381,8 @@ def interp2d(x not None, y not None,
|
|||||||
return interp2d_INTERNAL_periodic(x, y, d, Lbox)
|
return interp2d_INTERNAL_periodic(x, y, d, Lbox)
|
||||||
else:
|
else:
|
||||||
return interp2d_INTERNAL(x, y, d, Lbox)
|
return interp2d_INTERNAL(x, y, d, Lbox)
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
cdef void INTERNAL_project_cic_no_mass(DTYPE_t[:,:,:] g,
|
cdef void INTERNAL_project_cic_no_mass(DTYPE_t[:,:,:] g,
|
||||||
@ -450,7 +450,7 @@ cdef void INTERNAL_project_cic_no_mass_periodic(DTYPE_t[:,:,:] g,
|
|||||||
ag[b1[0],b[1],b[2]] += a[0]*c[1]*c[2]
|
ag[b1[0],b[1],b[2]] += a[0]*c[1]*c[2]
|
||||||
ag[b[0],b1[1],b[2]] += c[0]*a[1]*c[2]
|
ag[b[0],b1[1],b[2]] += c[0]*a[1]*c[2]
|
||||||
ag[b1[0],b1[1],b[2]] += a[0]*a[1]*c[2]
|
ag[b1[0],b1[1],b[2]] += a[0]*a[1]*c[2]
|
||||||
|
|
||||||
ag[b[0],b[1],b1[2]] += c[0]*c[1]*a[2]
|
ag[b[0],b[1],b1[2]] += c[0]*c[1]*a[2]
|
||||||
ag[b1[0],b[1],b1[2]] += a[0]*c[1]*a[2]
|
ag[b1[0],b[1],b1[2]] += a[0]*c[1]*a[2]
|
||||||
ag[b[0],b1[1],b1[2]] += c[0]*a[1]*a[2]
|
ag[b[0],b1[1],b1[2]] += c[0]*a[1]*a[2]
|
||||||
@ -525,20 +525,21 @@ cdef void INTERNAL_project_cic_with_mass_periodic(DTYPE_t[:,:,:] g,
|
|||||||
g[b1[0],b[1],b[2]] += a[0]*c[1]*c[2]*m0
|
g[b1[0],b[1],b[2]] += a[0]*c[1]*c[2]*m0
|
||||||
g[b[0],b1[1],b[2]] += c[0]*a[1]*c[2]*m0
|
g[b[0],b1[1],b[2]] += c[0]*a[1]*c[2]*m0
|
||||||
g[b1[0],b1[1],b[2]] += a[0]*a[1]*c[2]*m0
|
g[b1[0],b1[1],b[2]] += a[0]*a[1]*c[2]*m0
|
||||||
|
|
||||||
g[b[0],b[1],b1[2]] += c[0]*c[1]*a[2]*m0
|
g[b[0],b[1],b1[2]] += c[0]*c[1]*a[2]*m0
|
||||||
g[b1[0],b[1],b1[2]] += a[0]*c[1]*a[2]*m0
|
g[b1[0],b[1],b1[2]] += a[0]*c[1]*a[2]*m0
|
||||||
g[b[0],b1[1],b1[2]] += c[0]*a[1]*a[2]*m0
|
g[b[0],b1[1],b1[2]] += c[0]*a[1]*a[2]*m0
|
||||||
g[b1[0],b1[1],b1[2]] += a[0]*a[1]*a[2]*m0
|
g[b1[0],b1[1],b1[2]] += a[0]*a[1]*a[2]*m0
|
||||||
|
|
||||||
|
|
||||||
def project_cic(npx.ndarray[DTYPE_t, ndim=2] x not None, npx.ndarray[DTYPE_t, ndim=1] mass, int Ngrid,
|
|
||||||
double Lbox, bool periodic = False, centered=True):
|
|
||||||
"""
|
|
||||||
project_cic(x array (N,3), mass (may be None), Ngrid, Lbox, periodict, centered=True)
|
|
||||||
|
|
||||||
This function does a Cloud-In-Cell projection of a 3d unstructured dataset. First argument is a Nx3 array of coordinates.
|
def project_cic(npx.ndarray[DTYPE_t, ndim=2] x not None, npx.ndarray[DTYPE_t, ndim=1] mass, int Ngrid,
|
||||||
|
double Lbox, bool periodic = False, centered=True, output=None):
|
||||||
|
"""
|
||||||
|
project_cic(x array (N,3), mass (may be None), Ngrid, Lbox, periodict, centered=True, output=None)
|
||||||
|
|
||||||
|
This function does a Cloud-In-Cell projection of a 3d unstructured dataset. First argument is a Nx3 array of coordinates.
|
||||||
Second argument is an optinal mass. Ngrid is the size output grid and Lbox is the physical size of the grid.
|
Second argument is an optinal mass. Ngrid is the size output grid and Lbox is the physical size of the grid.
|
||||||
|
if output is not None, it must be a numpy array with dimension NgridxNgridxNgrid. The result will be accumulated in that array.
|
||||||
"""
|
"""
|
||||||
cdef npx.ndarray[DTYPE_t, ndim=3] g
|
cdef npx.ndarray[DTYPE_t, ndim=3] g
|
||||||
cdef double shifter
|
cdef double shifter
|
||||||
@ -558,7 +559,13 @@ def project_cic(npx.ndarray[DTYPE_t, ndim=2] x not None, npx.ndarray[DTYPE_t, nd
|
|||||||
if mass is not None and mass.shape[0] != x.shape[0]:
|
if mass is not None and mass.shape[0] != x.shape[0]:
|
||||||
raise ValueError("Mass array and coordinate array must have the same number of elements")
|
raise ValueError("Mass array and coordinate array must have the same number of elements")
|
||||||
|
|
||||||
g = np.zeros((Ngrid,Ngrid,Ngrid),dtype=DTYPE)
|
if output is None:
|
||||||
|
g = np.zeros((Ngrid,Ngrid,Ngrid),dtype=DTYPE)
|
||||||
|
else:
|
||||||
|
if type(output) != np.ndarray:
|
||||||
|
raise ValueError("Invalid array type")
|
||||||
|
g = output
|
||||||
|
|
||||||
cdef DTYPE_t[:,:,:] d_g = g
|
cdef DTYPE_t[:,:,:] d_g = g
|
||||||
cdef DTYPE_t[:,:] d_x = x
|
cdef DTYPE_t[:,:] d_x = x
|
||||||
|
|
||||||
@ -569,7 +576,7 @@ def project_cic(npx.ndarray[DTYPE_t, ndim=2] x not None, npx.ndarray[DTYPE_t, nd
|
|||||||
else:
|
else:
|
||||||
d_mass = mass
|
d_mass = mass
|
||||||
with nogil:
|
with nogil:
|
||||||
INTERNAL_project_cic_with_mass(d_g, d_x, d_mass, Ngrid, Lbox, shifter)
|
INTERNAL_project_cic_with_mass(d_g, d_x, d_mass, Ngrid, Lbox, shifter)
|
||||||
else:
|
else:
|
||||||
if mass is None:
|
if mass is None:
|
||||||
with nogil:
|
with nogil:
|
||||||
@ -577,13 +584,13 @@ def project_cic(npx.ndarray[DTYPE_t, ndim=2] x not None, npx.ndarray[DTYPE_t, nd
|
|||||||
else:
|
else:
|
||||||
d_mass = mass
|
d_mass = mass
|
||||||
with nogil:
|
with nogil:
|
||||||
INTERNAL_project_cic_with_mass_periodic(d_g, d_x, d_mass, Ngrid, Lbox, shifter)
|
INTERNAL_project_cic_with_mass_periodic(d_g, d_x, d_mass, Ngrid, Lbox, shifter)
|
||||||
|
|
||||||
return g
|
return g
|
||||||
|
|
||||||
def tophat_fourier_internal(npx.ndarray[DTYPE_t, ndim=1] x not None):
|
def tophat_fourier_internal(npx.ndarray[DTYPE_t, ndim=1] x not None):
|
||||||
cdef int i
|
cdef int i
|
||||||
cdef npx.ndarray[DTYPE_t] y
|
cdef npx.ndarray[DTYPE_t] y
|
||||||
cdef DTYPE_t x0
|
cdef DTYPE_t x0
|
||||||
|
|
||||||
y = np.empty(x.size, dtype=DTYPE)
|
y = np.empty(x.size, dtype=DTYPE)
|
||||||
@ -609,7 +616,7 @@ def tophat_fourier(x not None):
|
|||||||
|
|
||||||
return b.reshape(x.shape)
|
return b.reshape(x.shape)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@cython.cdivision(True)
|
@cython.cdivision(True)
|
||||||
@ -659,25 +666,25 @@ cdef DTYPE_t cube_integral_trilin(DTYPE_t u[3], DTYPE_t u0[3], int r[1], DTYPE_t
|
|||||||
if tmp_a < alpha_max:
|
if tmp_a < alpha_max:
|
||||||
alpha_max = tmp_a
|
alpha_max = tmp_a
|
||||||
j = i
|
j = i
|
||||||
|
|
||||||
I = compute_projection(vertex_value, u, u0, alpha_max)
|
I = compute_projection(vertex_value, u, u0, alpha_max)
|
||||||
|
|
||||||
for i in xrange(3):
|
for i in xrange(3):
|
||||||
u0[i] += u[i]*alpha_max
|
u0[i] += u[i]*alpha_max
|
||||||
|
|
||||||
# alpha_max is the integration length
|
# alpha_max is the integration length
|
||||||
# we integrate between 0 and alpha_max (curvilinear coordinates)
|
# we integrate between 0 and alpha_max (curvilinear coordinates)
|
||||||
r[0] = j
|
r[0] = j
|
||||||
|
|
||||||
return I
|
return I
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
cdef DTYPE_t integrator0(DTYPE_t[:,:,:] density,
|
cdef DTYPE_t integrator0(DTYPE_t[:,:,:] density,
|
||||||
DTYPE_t u[3], DTYPE_t u0[3], int u_delta[3], int iu0[3], int jumper[1], DTYPE_t alpha_max) nogil:
|
DTYPE_t u[3], DTYPE_t u0[3], int u_delta[3], int iu0[3], int jumper[1], DTYPE_t alpha_max) nogil:
|
||||||
cdef DTYPE_t d
|
cdef DTYPE_t d
|
||||||
|
|
||||||
d = density[iu0[0], iu0[1], iu0[2]]
|
d = density[iu0[0], iu0[1], iu0[2]]
|
||||||
|
|
||||||
return cube_integral(u, u0, jumper, alpha_max)*d
|
return cube_integral(u, u0, jumper, alpha_max)*d
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
@ -687,7 +694,7 @@ cdef DTYPE_t integrator1(DTYPE_t[:,:,:] density,
|
|||||||
cdef DTYPE_t d
|
cdef DTYPE_t d
|
||||||
cdef int a[3][2]
|
cdef int a[3][2]
|
||||||
cdef int i
|
cdef int i
|
||||||
|
|
||||||
for i in xrange(3):
|
for i in xrange(3):
|
||||||
a[i][0] = iu0[i]
|
a[i][0] = iu0[i]
|
||||||
a[i][1] = iu0[i]+1
|
a[i][1] = iu0[i]+1
|
||||||
@ -705,14 +712,14 @@ cdef DTYPE_t integrator1(DTYPE_t[:,:,:] density,
|
|||||||
return cube_integral_trilin(u, u0, jumper, vertex_value, alpha_max)
|
return cube_integral_trilin(u, u0, jumper, vertex_value, alpha_max)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
||||||
DTYPE_t a_u[3],
|
DTYPE_t a_u[3],
|
||||||
DTYPE_t min_distance,
|
DTYPE_t min_distance,
|
||||||
DTYPE_t max_distance, DTYPE_t[:] shifter, int integrator_id) nogil except? 0:
|
DTYPE_t max_distance, DTYPE_t[:] shifter, int integrator_id) nogil except? 0:
|
||||||
|
|
||||||
cdef DTYPE_t u[3]
|
cdef DTYPE_t u[3]
|
||||||
cdef DTYPE_t ifu0[3]
|
cdef DTYPE_t ifu0[3]
|
||||||
cdef DTYPE_t u0[3]
|
cdef DTYPE_t u0[3]
|
||||||
cdef DTYPE_t utot[3]
|
cdef DTYPE_t utot[3]
|
||||||
@ -720,11 +727,11 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
|||||||
cdef int iu0[3]
|
cdef int iu0[3]
|
||||||
cdef int i
|
cdef int i
|
||||||
cdef int N = density.shape[0]
|
cdef int N = density.shape[0]
|
||||||
cdef int half_N = density.shape[0]/2
|
cdef int half_N = density.shape[0]//2
|
||||||
cdef int completed
|
cdef int completed
|
||||||
cdef DTYPE_t I0, d, dist2, delta, s, max_distance2
|
cdef DTYPE_t I0, d, dist2, delta, s, max_distance2
|
||||||
cdef int jumper[1]
|
cdef int jumper[1]
|
||||||
|
|
||||||
cdef DTYPE_t (*integrator)(DTYPE_t[:,:,:],
|
cdef DTYPE_t (*integrator)(DTYPE_t[:,:,:],
|
||||||
DTYPE_t u[3], DTYPE_t u0[3], int u_delta[3], int iu0[3], int jumper[1], DTYPE_t alpha_max) nogil
|
DTYPE_t u[3], DTYPE_t u0[3], int u_delta[3], int iu0[3], int jumper[1], DTYPE_t alpha_max) nogil
|
||||||
|
|
||||||
@ -747,7 +754,7 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
|||||||
if (not ((iu0[i]>= 0) and (iu0[i] < N))):
|
if (not ((iu0[i]>= 0) and (iu0[i] < N))):
|
||||||
with gil:
|
with gil:
|
||||||
raise RuntimeError("iu0[%d] = %d !!" % (i,iu0[i]))
|
raise RuntimeError("iu0[%d] = %d !!" % (i,iu0[i]))
|
||||||
|
|
||||||
if (not (u0[i]>=0 and u0[i]<=1)):
|
if (not (u0[i]>=0 and u0[i]<=1)):
|
||||||
with gil:
|
with gil:
|
||||||
raise RuntimeError("u0[%d] = %g !" % (i,u0[i]))
|
raise RuntimeError("u0[%d] = %g !" % (i,u0[i]))
|
||||||
@ -756,7 +763,7 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
|||||||
if ((iu0[0] >= N-1) or (iu0[0] <= 0) or
|
if ((iu0[0] >= N-1) or (iu0[0] <= 0) or
|
||||||
(iu0[1] >= N-1) or (iu0[1] <= 0) or
|
(iu0[1] >= N-1) or (iu0[1] <= 0) or
|
||||||
(iu0[2] >= N-1) or (iu0[2] <= 0)):
|
(iu0[2] >= N-1) or (iu0[2] <= 0)):
|
||||||
completed = 1
|
completed = 1
|
||||||
|
|
||||||
I0 = 0
|
I0 = 0
|
||||||
jumper[0] = 0
|
jumper[0] = 0
|
||||||
@ -771,8 +778,8 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
|||||||
iu0[jumper[0]] += 1
|
iu0[jumper[0]] += 1
|
||||||
u0[jumper[0]] = 0
|
u0[jumper[0]] = 0
|
||||||
|
|
||||||
|
|
||||||
if ((iu0[0] >= N-1) or (iu0[0] <= 0) or
|
if ((iu0[0] >= N-1) or (iu0[0] <= 0) or
|
||||||
(iu0[1] >= N-1) or (iu0[1] <= 0) or
|
(iu0[1] >= N-1) or (iu0[1] <= 0) or
|
||||||
(iu0[2] >= N-1) or (iu0[2] <= 0)):
|
(iu0[2] >= N-1) or (iu0[2] <= 0)):
|
||||||
completed = 1
|
completed = 1
|
||||||
@ -787,7 +794,7 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density,
|
|||||||
#delta = sqrt(dist2) - max_distance
|
#delta = sqrt(dist2) - max_distance
|
||||||
#I0 -= d*delta
|
#I0 -= d*delta
|
||||||
completed = 1
|
completed = 1
|
||||||
|
|
||||||
return I0
|
return I0
|
||||||
|
|
||||||
def line_of_sight_projection(DTYPE_t[:,:,:] density not None,
|
def line_of_sight_projection(DTYPE_t[:,:,:] density not None,
|
||||||
@ -795,18 +802,18 @@ def line_of_sight_projection(DTYPE_t[:,:,:] density not None,
|
|||||||
DTYPE_t min_distance,
|
DTYPE_t min_distance,
|
||||||
DTYPE_t max_distance, DTYPE_t[:] shifter not None, int integrator_id=0):
|
DTYPE_t max_distance, DTYPE_t[:] shifter not None, int integrator_id=0):
|
||||||
cdef DTYPE_t u[3]
|
cdef DTYPE_t u[3]
|
||||||
|
|
||||||
u[0] = a_u[0]
|
u[0] = a_u[0]
|
||||||
u[1] = a_u[1]
|
u[1] = a_u[1]
|
||||||
u[2] = a_u[2]
|
u[2] = a_u[2]
|
||||||
|
|
||||||
return C_line_of_sight_projection(density,
|
return C_line_of_sight_projection(density,
|
||||||
u,
|
u,
|
||||||
min_distance,
|
min_distance,
|
||||||
max_distance, shifter, integrator_id)
|
max_distance, shifter, integrator_id)
|
||||||
|
|
||||||
cdef double _spherical_projloop(double theta, double phi, DTYPE_t[:,:,:] density,
|
cdef double _spherical_projloop(double theta, double phi, DTYPE_t[:,:,:] density,
|
||||||
double min_distance, double max_distance,
|
double min_distance, double max_distance,
|
||||||
DTYPE_t[:] shifter, int integrator_id) nogil:
|
DTYPE_t[:] shifter, int integrator_id) nogil:
|
||||||
cdef DTYPE_t u0[3]
|
cdef DTYPE_t u0[3]
|
||||||
|
|
||||||
@ -814,7 +821,7 @@ cdef double _spherical_projloop(double theta, double phi, DTYPE_t[:,:,:] density
|
|||||||
u0[0] = cos(phi)*stheta
|
u0[0] = cos(phi)*stheta
|
||||||
u0[1] = sin(phi)*stheta
|
u0[1] = sin(phi)*stheta
|
||||||
u0[2] = cos(theta)
|
u0[2] = cos(theta)
|
||||||
|
|
||||||
return C_line_of_sight_projection(density, u0, min_distance, max_distance, shifter, integrator_id)
|
return C_line_of_sight_projection(density, u0, min_distance, max_distance, shifter, integrator_id)
|
||||||
|
|
||||||
|
|
||||||
@ -825,20 +832,20 @@ def spherical_projection(int Nside,
|
|||||||
DTYPE_t max_distance, int progress=1, int integrator_id=0, DTYPE_t[:] shifter = None, int booster=-1):
|
DTYPE_t max_distance, int progress=1, int integrator_id=0, DTYPE_t[:] shifter = None, int booster=-1):
|
||||||
"""
|
"""
|
||||||
spherical_projection(Nside, density, min_distance, max_distance, progress=1, integrator_id=0, shifter=None, booster=-1)
|
spherical_projection(Nside, density, min_distance, max_distance, progress=1, integrator_id=0, shifter=None, booster=-1)
|
||||||
|
|
||||||
Keyword arguments:
|
Keyword arguments:
|
||||||
progress (int): show progress if it is equal to 1
|
progress (int): show progress if it is equal to 1
|
||||||
integrator_id (int): specify the order of integration along the line of shift
|
integrator_id (int): specify the order of integration along the line of shift
|
||||||
shifter (DTYPE_t array): this is an array of size 3. It specifies the amount of shift to apply to the center, in unit of voxel
|
shifter (DTYPE_t array): this is an array of size 3. It specifies the amount of shift to apply to the center, in unit of voxel
|
||||||
booster (int): what is the frequency of refreshment of the progress bar. Small number decreases performance by locking the GIL.
|
booster (int): what is the frequency of refreshment of the progress bar. Small number decreases performance by locking the GIL.
|
||||||
|
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
Nside (int): Nside of the returned map
|
Nside (int): Nside of the returned map
|
||||||
density (NxNxN array): this is the density field, expressed as a cubic array
|
density (NxNxN array): this is the density field, expressed as a cubic array
|
||||||
min_distance (float): lower bound of the integration
|
min_distance (float): lower bound of the integration
|
||||||
max_distance (float): upper bound of the integration
|
max_distance (float): upper bound of the integration
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
an healpix map, as a 1-dimensional array.
|
an healpix map, as a 1-dimensional array.
|
||||||
"""
|
"""
|
||||||
@ -853,11 +860,11 @@ def spherical_projection(int Nside,
|
|||||||
cdef long N, N0
|
cdef long N, N0
|
||||||
cdef double stheta
|
cdef double stheta
|
||||||
cdef int tid
|
cdef int tid
|
||||||
|
|
||||||
if shifter is None:
|
if shifter is None:
|
||||||
shifter = view.array(shape=(3,), format=FORMAT_DTYPE, itemsize=sizeof(DTYPE_t))
|
shifter = view.array(shape=(3,), format=FORMAT_DTYPE, itemsize=sizeof(DTYPE_t))
|
||||||
shifter[:] = 0
|
shifter[:] = 0
|
||||||
|
|
||||||
print("allocating map")
|
print("allocating map")
|
||||||
outm_array = np.empty(hp.nside2npix(Nside),dtype=DTYPE)
|
outm_array = np.empty(hp.nside2npix(Nside),dtype=DTYPE)
|
||||||
print("initializing views")
|
print("initializing views")
|
||||||
@ -870,10 +877,10 @@ def spherical_projection(int Nside,
|
|||||||
|
|
||||||
N = smp_get_max_threads()
|
N = smp_get_max_threads()
|
||||||
N0 = outm.size
|
N0 = outm.size
|
||||||
|
|
||||||
if booster < 0:
|
if booster < 0:
|
||||||
booster = 1#000
|
booster = 1#000
|
||||||
|
|
||||||
job_done = view.array(shape=(N,), format="i", itemsize=sizeof(int))
|
job_done = view.array(shape=(N,), format="i", itemsize=sizeof(int))
|
||||||
job_done[:] = 0
|
job_done[:] = 0
|
||||||
theta,phi = hp.pix2ang(Nside, np.arange(N0))
|
theta,phi = hp.pix2ang(Nside, np.arange(N0))
|
||||||
|
7
python/cosmotool.version
Normal file
7
python/cosmotool.version
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
CODEABI_1.0 {
|
||||||
|
global:
|
||||||
|
PyInit_*;
|
||||||
|
_init;
|
||||||
|
_fini;
|
||||||
|
local: *;
|
||||||
|
};
|
@ -1,5 +1,4 @@
|
|||||||
numpy
|
numpy<1.22
|
||||||
cffi
|
cffi
|
||||||
numexpr
|
numexpr
|
||||||
pyfftw
|
cython<3
|
||||||
cython
|
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
SET(tolink ${CosmoTool_local} ${CosmoTool_LIBS} ${GSL_LIBRARIES} ${DL_LIBRARY})
|
SET(tolink ${CosmoTool_local} ${CosmoTool_LIBS} ${GSL_LIBRARIES} ${DL_LIBRARY})
|
||||||
|
if (RT_LIBRARY)
|
||||||
|
SET(tolink ${tolink} ${RT_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/src)
|
include_directories(${CMAKE_SOURCE_DIR}/src)
|
||||||
include_directories(${FFTW3_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${GSL_INCLUDE_PATH})
|
include_directories(${FFTW3_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${GSL_INCLUDE_PATH})
|
||||||
if(YORICK_SUPPORT)
|
if(YORICK_SUPPORT)
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
#include "openmp.hpp"
|
|
||||||
#include "omptl/algorithm"
|
|
||||||
#include <cassert>
|
|
||||||
#include "yorick.hpp"
|
|
||||||
#include "sphSmooth.hpp"
|
|
||||||
#include "mykdtree.hpp"
|
|
||||||
#include "miniargs.hpp"
|
|
||||||
#include <H5Cpp.h>
|
|
||||||
#include "hdf5_array.hpp"
|
#include "hdf5_array.hpp"
|
||||||
#include <iostream>
|
#include "miniargs.hpp"
|
||||||
#include <boost/format.hpp>
|
#include "mykdtree.hpp"
|
||||||
|
#include "omptl/algorithm"
|
||||||
|
#include "openmp.hpp"
|
||||||
|
#include "sphSmooth.hpp"
|
||||||
|
#include "yorick.hpp"
|
||||||
|
#include <H5Cpp.h>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
#include <boost/format.hpp>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace CosmoTool;
|
using namespace CosmoTool;
|
||||||
|
|
||||||
#define N_SPH 32
|
#define N_SPH 32
|
||||||
|
|
||||||
struct VCoord{
|
struct VCoord {
|
||||||
float v[3];
|
float v[3];
|
||||||
float mass;
|
float mass;
|
||||||
};
|
};
|
||||||
@ -27,192 +27,186 @@ typedef boost::multi_array<float, 2> array_type;
|
|||||||
typedef boost::multi_array<float, 3> array3_type;
|
typedef boost::multi_array<float, 3> array3_type;
|
||||||
typedef boost::multi_array<float, 4> array4_type;
|
typedef boost::multi_array<float, 4> array4_type;
|
||||||
|
|
||||||
ComputePrecision getVelocity(const VCoord& v, int i)
|
ComputePrecision getVelocity(const VCoord &v, int i) { return v.mass * v.v[i]; }
|
||||||
{
|
|
||||||
return v.mass * v.v[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
ComputePrecision getMass(const VCoord& v)
|
ComputePrecision getMass(const VCoord &v) { return v.mass; }
|
||||||
{
|
|
||||||
return v.mass;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef SPHSmooth<VCoord> MySmooth;
|
typedef SPHSmooth<VCoord> MySmooth;
|
||||||
typedef MySmooth::SPHTree MyTree;
|
typedef MySmooth::SPHTree MyTree;
|
||||||
typedef MyTree::Cell MyCell;
|
typedef MyTree::Cell MyCell;
|
||||||
|
|
||||||
template<typename FuncT>
|
template <typename FuncT>
|
||||||
void computeInterpolatedField(MyTree *tree1, double boxsize, int Nres, double cx, double cy, double cz,
|
void computeInterpolatedField(MyTree *tree1, double boxsize, int Nres,
|
||||||
array3_type& bins, array3_type& arr, FuncT func, double rLimit2)
|
double cx, double cy, double cz,
|
||||||
{
|
array3_type &bins, array3_type &arr, FuncT func,
|
||||||
#pragma omp parallel
|
double rLimit2) {
|
||||||
|
int rz_max = 0;
|
||||||
|
#pragma omp parallel shared(rz_max)
|
||||||
{
|
{
|
||||||
MySmooth smooth1(tree1, N_SPH);
|
MySmooth smooth1(tree1, N_SPH);
|
||||||
|
|
||||||
#pragma omp for schedule(dynamic)
|
|
||||||
for (int rz = 0; rz < Nres; rz++)
|
|
||||||
{
|
|
||||||
double pz = (rz)*boxsize/Nres-cz;
|
|
||||||
|
|
||||||
cout << format("[%d] %d / %d") % smp_get_thread_id() % rz % Nres << endl;
|
#pragma omp for collapse(3) schedule(dynamic)
|
||||||
for (int ry = 0; ry < Nres; ry++)
|
for (int rz = 0; rz < Nres; rz++) {
|
||||||
{
|
|
||||||
double py = (ry)*boxsize/Nres-cy;
|
|
||||||
for (int rx = 0; rx < Nres; rx++)
|
|
||||||
{
|
|
||||||
double px = (rx)*boxsize/Nres-cx;
|
|
||||||
|
|
||||||
MyTree::coords c = { float(px), float(py), float(pz) };
|
|
||||||
|
|
||||||
double r2 = c[0]*c[0]+c[1]*c[1]+c[2]*c[2];
|
for (int ry = 0; ry < Nres; ry++) {
|
||||||
if (r2 > rLimit2)
|
for (int rx = 0; rx < Nres; rx++) {
|
||||||
{
|
if (rz > rz_max) {
|
||||||
arr[rx][ry][rz] = 0;
|
rz_max = rz;
|
||||||
continue;
|
cout << format("[%d] %d / %d") % smp_get_thread_id() % rz % Nres
|
||||||
}
|
<< endl;
|
||||||
|
|
||||||
uint32_t numInCell = bins[rx][ry][rz];
|
|
||||||
if (numInCell > N_SPH)
|
|
||||||
smooth1.fetchNeighbours(c, numInCell);
|
|
||||||
else
|
|
||||||
smooth1.fetchNeighbours(c);
|
|
||||||
|
|
||||||
arr[rx][ry][rz] = smooth1.computeSmoothedValue(c, func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
double px = (rx)*boxsize / Nres - cx;
|
||||||
|
double py = (ry)*boxsize / Nres - cy;
|
||||||
|
double pz = (rz)*boxsize / Nres - cz;
|
||||||
|
|
||||||
|
MyTree::coords c = {float(px), float(py), float(pz)};
|
||||||
|
|
||||||
|
double r2 = c[0] * c[0] + c[1] * c[1] + c[2] * c[2];
|
||||||
|
if (r2 > rLimit2) {
|
||||||
|
arr[rx][ry][rz] = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t numInCell = bins[rx][ry][rz];
|
||||||
|
if (numInCell > N_SPH)
|
||||||
|
smooth1.fetchNeighbours(c, numInCell);
|
||||||
|
else
|
||||||
|
smooth1.fetchNeighbours(c);
|
||||||
|
|
||||||
|
arr[rx][ry][rz] = smooth1.computeSmoothedValue(c, func);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv) {
|
||||||
{
|
char *fname1, *outFile;
|
||||||
|
|
||||||
char *fname1, *fname2;
|
|
||||||
double rLimit, boxsize, rLimit2, cx, cy, cz;
|
double rLimit, boxsize, rLimit2, cx, cy, cz;
|
||||||
int Nres;
|
int Nres;
|
||||||
|
int periodic;
|
||||||
|
|
||||||
MiniArgDesc args[] = {
|
MiniArgDesc args[] = {{"INPUT DATA1", &fname1, MINIARG_STRING},
|
||||||
{ "INPUT DATA1", &fname1, MINIARG_STRING },
|
{"RADIUS LIMIT", &rLimit, MINIARG_DOUBLE},
|
||||||
{ "RADIUS LIMIT", &rLimit, MINIARG_DOUBLE },
|
{"BOXSIZE", &boxsize, MINIARG_DOUBLE},
|
||||||
{ "BOXSIZE", &boxsize, MINIARG_DOUBLE },
|
{"RESOLUTION", &Nres, MINIARG_INT},
|
||||||
{ "RESOLUTION", &Nres, MINIARG_INT },
|
{"CX", &cx, MINIARG_DOUBLE},
|
||||||
{ "CX", &cx, MINIARG_DOUBLE },
|
{"CY", &cy, MINIARG_DOUBLE},
|
||||||
{ "CY", &cy, MINIARG_DOUBLE },
|
{"CZ", &cz, MINIARG_DOUBLE},
|
||||||
{ "CZ", &cz, MINIARG_DOUBLE },
|
{"OUTPUT FILE", &outFile, MINIARG_STRING},
|
||||||
{ 0, 0, MINIARG_NULL }
|
{"PERIODIC", &periodic, MINIARG_INT},
|
||||||
};
|
{0, 0, MINIARG_NULL}};
|
||||||
|
|
||||||
if (!parseMiniArgs(argc, argv, args))
|
if (!parseMiniArgs(argc, argv, args))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
H5::H5File in_f(fname1, 0);
|
H5::H5File in_f(fname1, 0);
|
||||||
H5::H5File out_f("fields.h5", H5F_ACC_TRUNC);
|
H5::H5File out_f(outFile, H5F_ACC_TRUNC);
|
||||||
array_type v1_data;
|
array_type v1_data;
|
||||||
uint32_t N1_points, N2_points;
|
uint64_t N1_points, N2_points;
|
||||||
|
|
||||||
array3_type bins(boost::extents[Nres][Nres][Nres]);
|
array3_type bins(boost::extents[Nres][Nres][Nres]);
|
||||||
|
|
||||||
rLimit2 = rLimit*rLimit;
|
rLimit2 = rLimit * rLimit;
|
||||||
|
|
||||||
hdf5_read_array(in_f, "particles", v1_data);
|
hdf5_read_array(in_f, "particles", v1_data);
|
||||||
assert(v1_data.shape()[1] == 7);
|
assert(v1_data.shape()[1] == 7);
|
||||||
|
|
||||||
N1_points = v1_data.shape()[0];
|
N1_points = v1_data.shape()[0];
|
||||||
|
|
||||||
cout << "Got " << N1_points << " in the first file." << endl;
|
cout << "Got " << N1_points << " in the first file." << endl;
|
||||||
|
|
||||||
MyCell *allCells_1 = new MyCell[N1_points];
|
MyCell *allCells_1 = new MyCell[N1_points];
|
||||||
|
|
||||||
#pragma omp parallel for schedule(static)
|
#pragma omp parallel for schedule(static)
|
||||||
for (long i = 0; i < Nres*Nres*Nres; i++)
|
for (uint32_t i = 0; i < Nres * Nres * Nres; i++)
|
||||||
bins.data()[i] = 0;
|
bins.data()[i] = 0;
|
||||||
|
|
||||||
cout << "Shuffling data in cells..." << endl;
|
cout << "Shuffling data in cells..." << endl;
|
||||||
#pragma omp parallel for schedule(static)
|
#pragma omp parallel for schedule(static)
|
||||||
for (int i = 0 ; i < N1_points; i++)
|
for (uint64_t i = 0; i < N1_points; i++) {
|
||||||
{
|
for (int j = 0; j < 3; j++)
|
||||||
for (int j = 0; j < 3; j++)
|
allCells_1[i].coord[j] = v1_data[i][j];
|
||||||
allCells_1[i].coord[j] = v1_data[i][j];
|
for (int k = 0; k < 3; k++)
|
||||||
for (int k = 0; k < 3; k++)
|
allCells_1[i].val.pValue.v[k] = v1_data[i][3 + k];
|
||||||
allCells_1[i].val.pValue.v[k] = v1_data[i][3+k];
|
allCells_1[i].val.pValue.mass = v1_data[i][6];
|
||||||
allCells_1[i].val.pValue.mass = v1_data[i][6];
|
allCells_1[i].active = true;
|
||||||
allCells_1[i].active = true;
|
allCells_1[i].val.weight = 0.0;
|
||||||
allCells_1[i].val.weight = 0.0;
|
|
||||||
|
|
||||||
long rx = floor((allCells_1[i].coord[0]+cx)*Nres/boxsize+0.5);
|
long rx = floor((allCells_1[i].coord[0] + cx) * Nres / boxsize + 0.5);
|
||||||
long ry = floor((allCells_1[i].coord[1]+cy)*Nres/boxsize+0.5);
|
long ry = floor((allCells_1[i].coord[1] + cy) * Nres / boxsize + 0.5);
|
||||||
long rz = floor((allCells_1[i].coord[2]+cz)*Nres/boxsize+0.5);
|
long rz = floor((allCells_1[i].coord[2] + cz) * Nres / boxsize + 0.5);
|
||||||
|
|
||||||
if (rx < 0 || rx >= Nres || ry < 0 || ry >= Nres || rz < 0 || rz >= Nres)
|
if (rx < 0 || rx >= Nres || ry < 0 || ry >= Nres || rz < 0 || rz >= Nres)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//#pragma omp atomic update
|
auto &b = bins[rx][ry][rz];
|
||||||
bins[rx][ry][rz]++;
|
#pragma omp atomic
|
||||||
}
|
b++;
|
||||||
|
}
|
||||||
v1_data.resize(boost::extents[1][1]);
|
v1_data.resize(boost::extents[1][1]);
|
||||||
|
|
||||||
hdf5_write_array(out_f, "num_in_cell", bins);
|
hdf5_write_array(out_f, "num_in_cell", bins);
|
||||||
|
|
||||||
cout << "Building trees..." << endl;
|
cout << "Building trees..." << endl;
|
||||||
MyTree tree1(allCells_1, N1_points);
|
MyTree tree1(allCells_1, N1_points);
|
||||||
|
tree1.setPeriodic(periodic != 0, boxsize);
|
||||||
|
|
||||||
cout << "Creating smoothing filter..." << endl;
|
cout << "Creating smoothing filter..." << endl;
|
||||||
|
|
||||||
// array3_type out_rad_1(boost::extents[Nres][Nres][Nres]);
|
// array3_type out_rad_1(boost::extents[Nres][Nres][Nres]);
|
||||||
|
|
||||||
cout << "Weighing..." << endl;
|
cout << "Weighing..." << endl;
|
||||||
|
|
||||||
#pragma omp parallel
|
int rz_max = 0;
|
||||||
|
#pragma omp parallel shared(rz_max)
|
||||||
{
|
{
|
||||||
MySmooth smooth1(&tree1, N_SPH);
|
MySmooth smooth1(&tree1, N_SPH);
|
||||||
|
|
||||||
#pragma omp for schedule(dynamic)
|
|
||||||
for (int rz = 0; rz < Nres; rz++)
|
|
||||||
{
|
|
||||||
double pz = (rz)*boxsize/Nres-cz;
|
|
||||||
|
|
||||||
(cout << rz << " / " << Nres << endl).flush();
|
#pragma omp for collapse(3) schedule(dynamic, 8)
|
||||||
for (int ry = 0; ry < Nres; ry++)
|
for (int rz = 0; rz < Nres; rz++) {
|
||||||
{
|
for (int ry = 0; ry < Nres; ry++) {
|
||||||
double py = (ry)*boxsize/Nres-cy;
|
for (int rx = 0; rx < Nres; rx++) {
|
||||||
for (int rx = 0; rx < Nres; rx++)
|
if (rz > rz_max) {
|
||||||
{
|
rz_max = rz;
|
||||||
double px = (rx)*boxsize/Nres-cx;
|
(cout << rz << " / " << Nres << endl).flush();
|
||||||
|
|
||||||
MyTree::coords c = { float(px), float(py), float(pz) };
|
|
||||||
|
|
||||||
double r2 = c[0]*c[0]+c[1]*c[1]+c[2]*c[2];
|
|
||||||
if (r2 > rLimit2)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t numInCell = bins[rx][ry][rz];
|
|
||||||
if (numInCell > N_SPH)
|
|
||||||
smooth1.fetchNeighbours(c, numInCell);
|
|
||||||
else
|
|
||||||
smooth1.fetchNeighbours(c);
|
|
||||||
#pragma omp critical
|
|
||||||
smooth1.addGridSite(c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
(cout << " Done " << rz << endl).flush();
|
double pz = (rz)*boxsize / Nres - cz;
|
||||||
}
|
double py = (ry)*boxsize / Nres - cy;
|
||||||
|
double px = (rx)*boxsize / Nres - cx;
|
||||||
|
|
||||||
|
MyTree::coords c = {float(px), float(py), float(pz)};
|
||||||
|
|
||||||
|
double r2 = c[0] * c[0] + c[1] * c[1] + c[2] * c[2];
|
||||||
|
if (r2 > rLimit2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t numInCell = bins[rx][ry][rz];
|
||||||
|
if (numInCell > N_SPH)
|
||||||
|
smooth1.fetchNeighbours(c, numInCell);
|
||||||
|
else
|
||||||
|
smooth1.fetchNeighbours(c);
|
||||||
|
smooth1.addGridSite(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "Interpolating..." << endl;
|
cout << "Interpolating..." << endl;
|
||||||
|
|
||||||
array3_type interpolated(boost::extents[Nres][Nres][Nres]);
|
array3_type interpolated(boost::extents[Nres][Nres][Nres]);
|
||||||
|
|
||||||
computeInterpolatedField(&tree1, boxsize, Nres, cx, cy, cz,
|
computeInterpolatedField(&tree1, boxsize, Nres, cx, cy, cz, bins,
|
||||||
bins, interpolated, getMass, rLimit2);
|
interpolated, getMass, rLimit2);
|
||||||
hdf5_write_array(out_f, "density", interpolated);
|
hdf5_write_array(out_f, "density", interpolated);
|
||||||
//out_f.flush();
|
// out_f.flush();
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
computeInterpolatedField(&tree1, boxsize, Nres, cx, cy, cz,
|
computeInterpolatedField(&tree1, boxsize, Nres, cx, cy, cz, bins,
|
||||||
bins, interpolated, boost::bind(getVelocity, _1, i), rLimit2);
|
interpolated, boost::bind(getVelocity, _1, i),
|
||||||
hdf5_write_array(out_f, str(format("p%d") % i), interpolated);
|
rLimit2);
|
||||||
|
hdf5_write_array(out_f, str(format("p%d") % i), interpolated);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
53
setup.py
53
setup.py
@ -2,6 +2,7 @@ import stat
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import shutil
|
import shutil
|
||||||
|
from sysconfig import get_config_var
|
||||||
from distutils.command.install_data import install_data
|
from distutils.command.install_data import install_data
|
||||||
import pathlib
|
import pathlib
|
||||||
from setuptools import find_packages, setup, Extension
|
from setuptools import find_packages, setup, Extension
|
||||||
@ -76,9 +77,9 @@ class InstallCMakeLibs(install_lib):
|
|||||||
# # your files are moved to the appropriate location when the installation
|
# # your files are moved to the appropriate location when the installation
|
||||||
# # is run
|
# # is run
|
||||||
#
|
#
|
||||||
# libs = [os.path.join(bin_dir, _lib) for _lib in
|
# libs = [os.path.join(bin_dir, _lib) for _lib in
|
||||||
# os.listdir(bin_dir) if
|
# os.listdir(bin_dir) if
|
||||||
# os.path.isfile(os.path.join(bin_dir, _lib)) and
|
# os.path.isfile(os.path.join(bin_dir, _lib)) and
|
||||||
# os.path.splitext(_lib)[1] in [".dll", ".so"]
|
# os.path.splitext(_lib)[1] in [".dll", ".so"]
|
||||||
# and not (_lib.startswith("python") or _lib.startswith(PACKAGE_NAME))]
|
# and not (_lib.startswith("python") or _lib.startswith(PACKAGE_NAME))]
|
||||||
#
|
#
|
||||||
@ -87,16 +88,16 @@ class InstallCMakeLibs(install_lib):
|
|||||||
# shutil.move(lib, os.path.join(self.build_dir,
|
# shutil.move(lib, os.path.join(self.build_dir,
|
||||||
# os.path.basename(lib)))
|
# os.path.basename(lib)))
|
||||||
#
|
#
|
||||||
# # Mark the libs for installation, adding them to
|
# # Mark the libs for installation, adding them to
|
||||||
# # distribution.data_files seems to ensure that setuptools' record
|
# # distribution.data_files seems to ensure that setuptools' record
|
||||||
# # writer appends them to installed-files.txt in the package's egg-info
|
# # writer appends them to installed-files.txt in the package's egg-info
|
||||||
# #
|
# #
|
||||||
# # Also tried adding the libraries to the distribution.libraries list,
|
# # Also tried adding the libraries to the distribution.libraries list,
|
||||||
# # but that never seemed to add them to the installed-files.txt in the
|
# # but that never seemed to add them to the installed-files.txt in the
|
||||||
# # egg-info, and the online recommendation seems to be adding libraries
|
# # egg-info, and the online recommendation seems to be adding libraries
|
||||||
# # into eager_resources in the call to setup(), which I think puts them
|
# # into eager_resources in the call to setup(), which I think puts them
|
||||||
# # in data_files anyways.
|
# # in data_files anyways.
|
||||||
# #
|
# #
|
||||||
# # What is the best way?
|
# # What is the best way?
|
||||||
#
|
#
|
||||||
# # These are the additional installation files that should be
|
# # These are the additional installation files that should be
|
||||||
@ -104,7 +105,7 @@ class InstallCMakeLibs(install_lib):
|
|||||||
# # step; depending on the files that are generated from your cmake
|
# # step; depending on the files that are generated from your cmake
|
||||||
# # build chain, you may need to modify the below code
|
# # build chain, you may need to modify the below code
|
||||||
#
|
#
|
||||||
# self.distribution.data_files = [os.path.join(self.install_dir,
|
# self.distribution.data_files = [os.path.join(self.install_dir,
|
||||||
# os.path.basename(lib))
|
# os.path.basename(lib))
|
||||||
# for lib in libs]
|
# for lib in libs]
|
||||||
# print(self.distribution.data_files)
|
# print(self.distribution.data_files)
|
||||||
@ -167,15 +168,33 @@ class BuildCMakeExt(build_ext):
|
|||||||
# Change your cmake arguments below as necessary
|
# Change your cmake arguments below as necessary
|
||||||
# Below is just an example set of arguments for building Blender as a Python module
|
# Below is just an example set of arguments for building Blender as a Python module
|
||||||
|
|
||||||
|
c_compiler=os.environ.get('CC', get_config_var("CC"))
|
||||||
|
cxx_compiler=os.environ.get('CXX', get_config_var("CXX"))
|
||||||
|
|
||||||
|
compilers=[]
|
||||||
|
fill_up_settings=[
|
||||||
|
("CMAKE_C_COMPILER", "CC", get_config_var("CC")),
|
||||||
|
("CMAKE_CXX_COMPILER", "CXX", get_config_var("CXX")),
|
||||||
|
("CMAKE_C_FLAGS", "CFLAGS", None),
|
||||||
|
("CMAKE_CXX_FLAGS", "CXXFLAGS", None),
|
||||||
|
("CMAKE_EXE_LINKER_FLAGS_INIT", "LDFLAGS", None),
|
||||||
|
("CMAKE_SHARED_LINKER_FLAGS_INIT", "LDFLAGS", None),
|
||||||
|
("CMAKE_MODULE_LINKER_FLAGS_INIT", "LDFLAGS", None)]
|
||||||
|
for cmake_flag, os_flag, default_flag in fill_up_settings:
|
||||||
|
if os_flag in os.environ or default_flag is not None:
|
||||||
|
c = os.environ.get(os_flag, default_flag)
|
||||||
|
if not c is None:
|
||||||
|
compilers.append(f"-D{cmake_flag}={c}")
|
||||||
|
print(compilers)
|
||||||
|
|
||||||
self.spawn(['cmake', '-H'+SOURCE_DIR, '-B'+self.build_temp,
|
self.spawn(['cmake', '-H'+SOURCE_DIR, '-B'+self.build_temp,
|
||||||
'-DCMAKE_C_COMPILER=' + os.environ["CC"], "-DCMAKE_CXX_COMPILER=" + os.environ["CXX"],
|
|
||||||
'-DENABLE_OPENMP=ON','-DINTERNAL_BOOST=ON','-DINTERNAL_EIGEN=ON',
|
'-DENABLE_OPENMP=ON','-DINTERNAL_BOOST=ON','-DINTERNAL_EIGEN=ON',
|
||||||
'-DINTERNAL_HDF5=ON','-DINTERNAL_NETCDF=ON',
|
'-DINTERNAL_HDF5=ON','-DINTERNAL_NETCDF=ON',
|
||||||
'-DBUILD_PYTHON=ON', '-DINSTALL_PYTHON_LOCAL=OFF',
|
'-DBUILD_PYTHON=ON', '-DINSTALL_PYTHON_LOCAL=OFF',
|
||||||
'-DCOSMOTOOL_PYTHON_PACKAGING=ON',
|
'-DCOSMOTOOL_PYTHON_PACKAGING=ON',
|
||||||
f"-DCYTHON={cython_code}",
|
f"-DCYTHON={cython_code}",
|
||||||
f"-DPYTHON_SITE_PACKAGES={build_dir.absolute()}/private_install",
|
f"-DPYTHON_SITE_PACKAGES={build_dir.absolute()}/private_install",
|
||||||
f"-DPYTHON_EXECUTABLE={sys.executable}"])
|
f"-DPYTHON_EXECUTABLE={sys.executable}"] + compilers)
|
||||||
|
|
||||||
|
|
||||||
self.announce("Building binaries", level=3)
|
self.announce("Building binaries", level=3)
|
||||||
@ -202,7 +221,7 @@ class BuildCMakeExt(build_ext):
|
|||||||
if _pyd_top[0].startswith(PACKAGE_NAME):
|
if _pyd_top[0].startswith(PACKAGE_NAME):
|
||||||
if os.path.splitext(_pyd)[1] in [".pyd", ".so"] or _pyd_top[-1] == 'config.py':
|
if os.path.splitext(_pyd)[1] in [".pyd", ".so"] or _pyd_top[-1] == 'config.py':
|
||||||
pyd_path.append((_pyd_top,_pyd))
|
pyd_path.append((_pyd_top,_pyd))
|
||||||
|
|
||||||
|
|
||||||
for top,p in pyd_path:
|
for top,p in pyd_path:
|
||||||
_,n = os.path.split(p)
|
_,n = os.path.split(p)
|
||||||
@ -218,10 +237,10 @@ class BuildCMakeExt(build_ext):
|
|||||||
CosmoTool_extension = CMakeExtension(name="cosmotool")
|
CosmoTool_extension = CMakeExtension(name="cosmotool")
|
||||||
|
|
||||||
setup(name='cosmotool',
|
setup(name='cosmotool',
|
||||||
version='1.1.0',
|
version='1.3.6',
|
||||||
packages=["cosmotool"],
|
packages=["cosmotool"],
|
||||||
package_dir={'cosmotool': 'python/cosmotool'},
|
package_dir={'cosmotool': 'python/cosmotool'},
|
||||||
install_requires=['numpy','cffi','numexpr','pyfftw','h5py'],
|
install_requires=['cython','numpy','cffi','numexpr','h5py'],
|
||||||
setup_requires=['cython','cffi','numpy','numexpr'],
|
setup_requires=['cython','cffi','numpy','numexpr'],
|
||||||
ext_modules=[CosmoTool_extension],
|
ext_modules=[CosmoTool_extension],
|
||||||
description='A small cosmotool box of useful functions',
|
description='A small cosmotool box of useful functions',
|
||||||
|
@ -38,6 +38,7 @@ if (HDF5_FOUND)
|
|||||||
h5_readFlash.cpp
|
h5_readFlash.cpp
|
||||||
loadFlash.cpp
|
loadFlash.cpp
|
||||||
)
|
)
|
||||||
|
add_dependencies(CosmoHDF5 ${cosmotool_DEPS})
|
||||||
set_property(TARGET CosmoHDF5 PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS})
|
set_property(TARGET CosmoHDF5 PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS})
|
||||||
target_include_directories(CosmoHDF5 BEFORE PRIVATE ${HDF5_INCLUDE_DIR})
|
target_include_directories(CosmoHDF5 BEFORE PRIVATE ${HDF5_INCLUDE_DIR})
|
||||||
else(HDF5_FOUND)
|
else(HDF5_FOUND)
|
||||||
|
@ -212,6 +212,30 @@ double CosmoPower::powerHuWiggles(double k)
|
|||||||
return normPower * pow(k,n) * T_k * T_k;
|
return normPower * pow(k,n) * T_k * T_k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double CosmoPower::BAO_Tk(double k){
|
||||||
|
|
||||||
|
double no_wiggle_tk = noWiggleTk(k);
|
||||||
|
|
||||||
|
double A = 0;
|
||||||
|
double r_s = 10;
|
||||||
|
double k_D = 2 * M_PI / 100;
|
||||||
|
|
||||||
|
//sqrt as we want to make the parameterization part of the transfer function
|
||||||
|
double param = sqrt(1 + A * sin(k * r_s) * exp(- k / k_D));
|
||||||
|
return no_wiggle_tk * param;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
double CosmoPower::sample_BAO(double k)
|
||||||
|
{
|
||||||
|
// BAO wiggle parameterization for reconstruction
|
||||||
|
// Babic et al. 2022, https://arxiv.org/abs/2203.06177
|
||||||
|
|
||||||
|
double T_k = BAO_Tk(k);
|
||||||
|
|
||||||
|
return normPower * pow(k,n) * T_k * T_k;
|
||||||
|
}
|
||||||
|
|
||||||
double CosmoPower::primordialPowerSpectrum(double k)
|
double CosmoPower::primordialPowerSpectrum(double k)
|
||||||
{
|
{
|
||||||
//Primordial power spectrum, needed for PNG
|
//Primordial power spectrum, needed for PNG
|
||||||
@ -249,6 +273,19 @@ double CosmoPower::matterTransferFunctionHu(double k)
|
|||||||
return T_k;
|
return T_k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double CosmoPower::noWiggleTk(double k)
|
||||||
|
{
|
||||||
|
double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75)));
|
||||||
|
double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2);
|
||||||
|
double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4)));
|
||||||
|
double q = k/(h*GammaEff) * pow(Theta_27, 2);
|
||||||
|
double L_0 = log(2 * M_E + 1.8 * q);
|
||||||
|
double C_0 = 14.2 + 731 / (1 + 62.5 * q);
|
||||||
|
double T0 = L_0 / (L_0 + C_0 * q * q);
|
||||||
|
|
||||||
|
return T0;
|
||||||
|
}
|
||||||
|
|
||||||
double CosmoPower::powerHuBaryons(double k)
|
double CosmoPower::powerHuBaryons(double k)
|
||||||
{
|
{
|
||||||
double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75)));
|
double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75)));
|
||||||
@ -342,12 +379,14 @@ void CosmoPower::normalize(double k_min, double k_max)
|
|||||||
|
|
||||||
normPower = 1;
|
normPower = 1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
ofstream ff("PP_k.txt");
|
ofstream ff("PP_k.txt");
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 100; i++)
|
||||||
{
|
{
|
||||||
double k = pow(10.0, 8.0*i/100.-4);
|
double k = pow(10.0, 8.0*i/100.-4);
|
||||||
ff << k << " " << power(k) << endl;
|
ff << k << " " << power(k) << endl;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// gsl_integration_qagiu(&f, 0, 0, TOLERANCE, NUM_ITERATION, w, &normVal, &abserr);
|
// gsl_integration_qagiu(&f, 0, 0, TOLERANCE, NUM_ITERATION, w, &normVal, &abserr);
|
||||||
gsl_integration_qag(&f, x_min, x_max, 0, TOLERANCE, NUM_ITERATION, GSL_INTEG_GAUSS61, w, &normVal, &abserr);
|
gsl_integration_qag(&f, x_min, x_max, 0, TOLERANCE, NUM_ITERATION, GSL_INTEG_GAUSS61, w, &normVal, &abserr);
|
||||||
@ -442,12 +481,18 @@ void CosmoPower::setFunction(CosmoFunction f)
|
|||||||
case POWER_SUGIYAMA:
|
case POWER_SUGIYAMA:
|
||||||
eval = &CosmoPower::powerSugiyama;
|
eval = &CosmoPower::powerSugiyama;
|
||||||
break;
|
break;
|
||||||
|
case SAMPLE_WIGGLES:
|
||||||
|
eval = &CosmoPower::sample_BAO;
|
||||||
|
break;
|
||||||
case POWER_BDM:
|
case POWER_BDM:
|
||||||
eval = &CosmoPower::powerBDM;
|
eval = &CosmoPower::powerBDM;
|
||||||
break;
|
break;
|
||||||
case POWER_TEST:
|
case POWER_TEST:
|
||||||
eval = &CosmoPower::powerTest;
|
eval = &CosmoPower::powerTest;
|
||||||
break;
|
break;
|
||||||
|
case BAO_TK:
|
||||||
|
eval = &CosmoPower::BAO_Tk;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,9 @@ namespace CosmoTool {
|
|||||||
POWER_SUGIYAMA,
|
POWER_SUGIYAMA,
|
||||||
POWER_BDM,
|
POWER_BDM,
|
||||||
POWER_TEST,
|
POWER_TEST,
|
||||||
HU_WIGGLES_ORIGINAL
|
HU_WIGGLES_ORIGINAL,
|
||||||
|
SAMPLE_WIGGLES,
|
||||||
|
BAO_TK
|
||||||
};
|
};
|
||||||
|
|
||||||
CosmoPower();
|
CosmoPower();
|
||||||
@ -122,6 +124,9 @@ namespace CosmoTool {
|
|||||||
double powerBDM(double k);
|
double powerBDM(double k);
|
||||||
double powerTest(double k);
|
double powerTest(double k);
|
||||||
double powerHuWigglesOriginal(double k);
|
double powerHuWigglesOriginal(double k);
|
||||||
|
double sample_BAO(double k);
|
||||||
|
double noWiggleTk(double k);
|
||||||
|
double BAO_Tk(double k);
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -139,14 +139,22 @@ void UnformattedRead::beginCheckpoint(bool bufferRecord)
|
|||||||
|
|
||||||
void UnformattedRead::endCheckpoint(bool autodrop)
|
void UnformattedRead::endCheckpoint(bool autodrop)
|
||||||
{
|
{
|
||||||
|
bool always_fail = false;
|
||||||
|
|
||||||
if (recordBuffer != 0) {
|
if (recordBuffer != 0) {
|
||||||
delete[] recordBuffer;
|
delete[] recordBuffer;
|
||||||
recordBuffer = 0;
|
recordBuffer = 0;
|
||||||
}
|
}
|
||||||
|
if (cSize == Check_32bits) {
|
||||||
|
if (checkPointAccum >= 1UL<<32UL) {
|
||||||
|
always_fail = true;
|
||||||
|
checkPointAccum %= (1UL<<32UL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (checkPointRef != checkPointAccum)
|
if (checkPointRef != checkPointAccum)
|
||||||
{
|
{
|
||||||
if (!autodrop || checkPointAccum > checkPointRef) {
|
if (always_fail || !autodrop || checkPointAccum > checkPointRef) {
|
||||||
throw InvalidUnformattedAccess();
|
throw InvalidUnformattedAccess();
|
||||||
}
|
}
|
||||||
f->seekg(checkPointRef-checkPointAccum, ios::cur);
|
f->seekg(checkPointRef-checkPointAccum, ios::cur);
|
||||||
|
@ -39,91 +39,112 @@ knowledge of the CeCILL license and that you accept its terms.
|
|||||||
#include <fftw3.h>
|
#include <fftw3.h>
|
||||||
#include <complex>
|
#include <complex>
|
||||||
|
|
||||||
namespace CosmoTool
|
namespace CosmoTool {
|
||||||
{
|
|
||||||
|
|
||||||
static inline void init_fftw_wisdom()
|
static inline void init_fftw_wisdom() {
|
||||||
{
|
fftw_import_system_wisdom();
|
||||||
fftw_import_system_wisdom();
|
fftw_import_wisdom_from_filename("fft_wisdom");
|
||||||
fftw_import_wisdom_from_filename("fft_wisdom");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static inline void save_fftw_wisdom()
|
static inline void save_fftw_wisdom() {
|
||||||
{
|
fftw_export_wisdom_to_filename("fft_wisdom");
|
||||||
fftw_export_wisdom_to_filename("fft_wisdom");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> class FFTW_Calls {};
|
template <typename T>
|
||||||
|
class FFTW_Calls {};
|
||||||
|
|
||||||
|
#define FFTW_CALLS_BASE(rtype, prefix) \
|
||||||
|
template <> \
|
||||||
|
class FFTW_Calls<rtype> { \
|
||||||
|
public: \
|
||||||
|
typedef rtype real_type; \
|
||||||
|
typedef prefix##_complex complex_type; \
|
||||||
|
typedef prefix##_plan plan_type; \
|
||||||
|
\
|
||||||
|
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); } \
|
||||||
|
static void execute_r2c(plan_type p, real_type *in, complex_type *out) { \
|
||||||
|
prefix##_execute_dft_r2c(p, in, out); \
|
||||||
|
} \
|
||||||
|
static void execute_c2r(plan_type p, complex_type *in, real_type *out) { \
|
||||||
|
prefix##_execute_dft_c2r(p, in, out); \
|
||||||
|
} \
|
||||||
|
static void \
|
||||||
|
execute_r2c(plan_type p, real_type *in, std::complex<real_type> *out) { \
|
||||||
|
prefix##_execute_dft_r2c(p, in, (complex_type *)out); \
|
||||||
|
} \
|
||||||
|
static void \
|
||||||
|
execute_c2r(plan_type p, std::complex<real_type> *in, real_type *out) { \
|
||||||
|
prefix##_execute_dft_c2r(p, (complex_type *)in, out); \
|
||||||
|
} \
|
||||||
|
static void execute_c2c( \
|
||||||
|
plan_type p, std::complex<real_type> *in, \
|
||||||
|
std::complex<real_type> *out) { \
|
||||||
|
prefix##_execute_dft(p, (complex_type *)in, (complex_type *)out); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_r2c_1d( \
|
||||||
|
int Nx, real_type *in, complex_type *out, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_r2c_1d(Nx, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r_1d( \
|
||||||
|
int Nx, complex_type *in, real_type *out, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_c2r_1d(Nx, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_r2c_2d( \
|
||||||
|
int Nx, int Ny, real_type *in, complex_type *out, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_r2c_2d(Nx, Ny, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r_2d( \
|
||||||
|
int Nx, int Ny, complex_type *in, real_type *out, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_c2r_2d(Nx, Ny, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_r2c_3d( \
|
||||||
|
int Nx, int Ny, int Nz, real_type *in, complex_type *out, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_r2c_3d(Nx, Ny, Nz, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r_3d( \
|
||||||
|
int Nx, int Ny, int Nz, complex_type *in, real_type *out, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_c2r_3d(Nx, Ny, Nz, in, out, flags); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_r2c( \
|
||||||
|
int rank, const int *n, real_type *in, complex_type *out, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_r2c(rank, n, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r( \
|
||||||
|
int rank, const int *n, complex_type *in, real_type *out, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_c2r(rank, n, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_3d( \
|
||||||
|
int Nx, int Ny, int Nz, complex_type *in, complex_type *out, int sign, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_3d(Nx, Ny, Nz, in, out, sign, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_2d( \
|
||||||
|
int Nx, int Ny, complex_type *in, complex_type *out, int sign, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_2d(Nx, Ny, in, out, sign, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_1d( \
|
||||||
|
int Nx, complex_type *in, complex_type *out, int sign, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_1d(Nx, in, out, sign, flags); \
|
||||||
|
} \
|
||||||
|
static void destroy_plan(plan_type plan) { prefix##_destroy_plan(plan); } \
|
||||||
|
}
|
||||||
|
|
||||||
#define FFTW_CALLS_BASE(rtype, prefix) \
|
FFTW_CALLS_BASE(double, fftw);
|
||||||
template<> \
|
FFTW_CALLS_BASE(float, fftwf);
|
||||||
class FFTW_Calls<rtype> { \
|
|
||||||
public: \
|
|
||||||
typedef rtype real_type; \
|
|
||||||
typedef prefix ## _complex complex_type; \
|
|
||||||
typedef prefix ## _plan plan_type; \
|
|
||||||
\
|
|
||||||
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); } \
|
|
||||||
static void execute_r2c(plan_type p, real_type *in, complex_type *out) { prefix ## _execute_dft_r2c(p, in, out); } \
|
|
||||||
static void execute_c2r(plan_type p, complex_type *in, real_type *out) { prefix ## _execute_dft_c2r(p, in, out); } \
|
|
||||||
static void execute_r2c(plan_type p, real_type *in, std::complex<real_type> *out) { prefix ## _execute_dft_r2c(p, in, (complex_type*)out); } \
|
|
||||||
static void execute_c2r(plan_type p, std::complex<real_type> *in, real_type *out) { prefix ## _execute_dft_c2r(p, (complex_type*) in, out); } \
|
|
||||||
static void execute_c2c(plan_type p, std::complex<real_type> *in, std::complex<real_type> *out) { prefix ## _execute_dft(p, (complex_type *)in, (complex_type*)out); } \
|
|
||||||
static plan_type plan_dft_r2c_2d(int Nx, int Ny, \
|
|
||||||
real_type *in, complex_type *out, \
|
|
||||||
unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_r2c_2d(Nx, Ny, in, out, \
|
|
||||||
flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r_2d(int Nx, int Ny, \
|
|
||||||
complex_type *in, real_type *out, \
|
|
||||||
unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_c2r_2d(Nx, Ny, in, out, \
|
|
||||||
flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_r2c_3d(int Nx, int Ny, int Nz, \
|
|
||||||
real_type *in, complex_type *out, \
|
|
||||||
unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_r2c_3d(Nx, Ny, Nz, in, out, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r_3d(int Nx, int Ny, int Nz, \
|
|
||||||
complex_type *in, real_type *out, \
|
|
||||||
unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_c2r_3d(Nx, Ny, Nz, in, out, flags); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static plan_type plan_dft_r2c(int rank, const int *n, real_type *in, \
|
|
||||||
complex_type *out, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_r2c(rank, n, in, out, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r(int rank, const int *n, complex_type *in, \
|
|
||||||
real_type *out, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _plan_dft_c2r(rank, n, in, out, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_3d(int Nx, int Ny, int Nz, complex_type *in, complex_type *out, int sign, unsigned flags) { \
|
|
||||||
return prefix ## _plan_dft_3d(Nx, Ny, Nz, in, out, sign, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_2d(int Nx, int Ny, complex_type *in, complex_type *out, int sign, unsigned flags) { \
|
|
||||||
return prefix ## _plan_dft_2d(Nx, Ny, in, out, sign, flags); \
|
|
||||||
} \
|
|
||||||
static void destroy_plan(plan_type plan) { prefix ## _destroy_plan(plan); } \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FFTW_CALLS_BASE(double, fftw);
|
|
||||||
FFTW_CALLS_BASE(float, fftwf);
|
|
||||||
#undef FFTW_CALLS_BASE
|
#undef FFTW_CALLS_BASE
|
||||||
};
|
}; // namespace CosmoTool
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,110 +5,140 @@
|
|||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
#include <fftw3-mpi.h>
|
#include <fftw3-mpi.h>
|
||||||
|
|
||||||
namespace CosmoTool
|
namespace CosmoTool {
|
||||||
{
|
|
||||||
|
|
||||||
static inline void init_fftw_mpi()
|
static inline void init_fftw_mpi() { fftw_mpi_init(); }
|
||||||
{
|
|
||||||
fftw_mpi_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void done_fftw_mpi()
|
static inline void done_fftw_mpi() { fftw_mpi_cleanup(); }
|
||||||
{
|
|
||||||
fftw_mpi_cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> class FFTW_MPI_Calls {};
|
template <typename T>
|
||||||
|
class FFTW_MPI_Calls {};
|
||||||
|
|
||||||
|
#define FFTW_MPI_CALLS_BASE(rtype, prefix) \
|
||||||
|
template <> \
|
||||||
|
class FFTW_MPI_Calls<rtype> { \
|
||||||
|
public: \
|
||||||
|
typedef rtype real_type; \
|
||||||
|
typedef prefix##_complex complex_type; \
|
||||||
|
typedef prefix##_plan plan_type; \
|
||||||
|
\
|
||||||
|
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); } \
|
||||||
|
\
|
||||||
|
template <size_t Nd> \
|
||||||
|
static ptrdiff_t local_size( \
|
||||||
|
std::array<ptrdiff_t, Nd> const &N, MPI_Comm comm, \
|
||||||
|
ptrdiff_t *local_n0, ptrdiff_t *local_0_start) { \
|
||||||
|
return prefix##_mpi_local_size( \
|
||||||
|
Nd, N.data(), comm, local_n0, local_0_start); \
|
||||||
|
} \
|
||||||
|
static ptrdiff_t local_size_2d( \
|
||||||
|
ptrdiff_t N0, ptrdiff_t N1, MPI_Comm comm, ptrdiff_t *local_n0, \
|
||||||
|
ptrdiff_t *local_0_start) { \
|
||||||
|
return prefix##_mpi_local_size_2d( \
|
||||||
|
N0, N1, comm, local_n0, local_0_start); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static ptrdiff_t local_size_3d( \
|
||||||
|
ptrdiff_t N0, ptrdiff_t N1, ptrdiff_t N2, MPI_Comm comm, \
|
||||||
|
ptrdiff_t *local_n0, ptrdiff_t *local_0_start) { \
|
||||||
|
return prefix##_mpi_local_size_3d( \
|
||||||
|
N0, N1, N2, comm, local_n0, local_0_start); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static void execute(plan_type p) { prefix##_execute(p); } \
|
||||||
|
static void \
|
||||||
|
execute_c2c(plan_type p, complex_type *in, complex_type *out) { \
|
||||||
|
prefix##_mpi_execute_dft(p, in, out); \
|
||||||
|
} \
|
||||||
|
static void execute_c2c( \
|
||||||
|
plan_type p, std::complex<real_type> *in, \
|
||||||
|
std::complex<real_type> *out) { \
|
||||||
|
prefix##_mpi_execute_dft(p, (complex_type *)in, (complex_type *)out); \
|
||||||
|
} \
|
||||||
|
static void execute_r2c(plan_type p, real_type *in, complex_type *out) { \
|
||||||
|
prefix##_mpi_execute_dft_r2c(p, in, out); \
|
||||||
|
} \
|
||||||
|
static void \
|
||||||
|
execute_c2r(plan_type p, std::complex<real_type> *in, real_type *out) { \
|
||||||
|
prefix##_mpi_execute_dft_c2r(p, (complex_type *)in, out); \
|
||||||
|
} \
|
||||||
|
static void execute_c2r(plan_type p, complex_type *in, real_type *out) { \
|
||||||
|
prefix##_mpi_execute_dft_c2r(p, in, out); \
|
||||||
|
} \
|
||||||
|
static void \
|
||||||
|
execute_r2c(plan_type p, real_type *in, std::complex<real_type> *out) { \
|
||||||
|
prefix##_mpi_execute_dft_r2c(p, in, (complex_type *)out); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_r2c_1d( \
|
||||||
|
int n, real_type *in, complex_type *out, MPI_Comm, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_r2c_1d(n, in, out, flags); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_r2c_2d( \
|
||||||
|
int Nx, int Ny, real_type *in, complex_type *out, MPI_Comm comm, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_r2c_2d(Nx, Ny, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_c2r_1d( \
|
||||||
|
int n, complex_type *in, real_type *out, MPI_Comm, unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_c2r_1d(n, in, out, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r_2d( \
|
||||||
|
int Nx, int Ny, complex_type *in, real_type *out, MPI_Comm comm, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_c2r_2d(Nx, Ny, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_r2c_3d( \
|
||||||
|
int Nx, int Ny, int Nz, real_type *in, complex_type *out, \
|
||||||
|
MPI_Comm comm, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_r2c_3d(Nx, Ny, Nz, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r_3d( \
|
||||||
|
int Nx, int Ny, int Nz, complex_type *in, real_type *out, \
|
||||||
|
MPI_Comm comm, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_c2r_3d(Nx, Ny, Nz, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static plan_type plan_dft_r2c( \
|
||||||
|
int rank, const ptrdiff_t *n, real_type *in, complex_type *out, \
|
||||||
|
MPI_Comm comm, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_r2c(rank, n, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_c2r( \
|
||||||
|
int rank, const ptrdiff_t *n, complex_type *in, real_type *out, \
|
||||||
|
MPI_Comm comm, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_c2r(rank, n, in, out, comm, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_3d( \
|
||||||
|
int Nx, int Ny, int Nz, complex_type *in, complex_type *out, \
|
||||||
|
MPI_Comm comm, int sign, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_3d(Nx, Ny, Nz, in, out, comm, sign, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_2d( \
|
||||||
|
int Nx, int Ny, complex_type *in, complex_type *out, MPI_Comm comm, \
|
||||||
|
int sign, unsigned flags) { \
|
||||||
|
return prefix##_mpi_plan_dft_2d(Nx, Ny, in, out, comm, sign, flags); \
|
||||||
|
} \
|
||||||
|
static plan_type plan_dft_1d( \
|
||||||
|
int Nx, complex_type *in, complex_type *out, MPI_Comm comm, int sign, \
|
||||||
|
unsigned flags) { \
|
||||||
|
return prefix##_plan_dft_1d(Nx, in, out, sign, flags); \
|
||||||
|
} \
|
||||||
|
static void destroy_plan(plan_type plan) { prefix##_destroy_plan(plan); } \
|
||||||
|
}
|
||||||
|
|
||||||
#define FFTW_MPI_CALLS_BASE(rtype, prefix) \
|
FFTW_MPI_CALLS_BASE(double, fftw);
|
||||||
template<> \
|
FFTW_MPI_CALLS_BASE(float, fftwf);
|
||||||
class FFTW_MPI_Calls<rtype> { \
|
|
||||||
public: \
|
|
||||||
typedef rtype real_type; \
|
|
||||||
typedef prefix ## _complex complex_type; \
|
|
||||||
typedef prefix ## _plan plan_type; \
|
|
||||||
\
|
|
||||||
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); } \
|
|
||||||
\
|
|
||||||
template<size_t Nd> \
|
|
||||||
static ptrdiff_t local_size(std::array<ptrdiff_t,Nd> const& N, MPI_Comm comm, \
|
|
||||||
ptrdiff_t *local_n0, ptrdiff_t *local_0_start) { \
|
|
||||||
return prefix ## _mpi_local_size(Nd, N.data(), comm, local_n0, local_0_start); \
|
|
||||||
} \
|
|
||||||
static ptrdiff_t local_size_2d(ptrdiff_t N0, ptrdiff_t N1, MPI_Comm comm, \
|
|
||||||
ptrdiff_t *local_n0, ptrdiff_t *local_0_start) { \
|
|
||||||
return prefix ## _mpi_local_size_2d(N0, N1, comm, local_n0, local_0_start); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static ptrdiff_t local_size_3d(ptrdiff_t N0, ptrdiff_t N1, ptrdiff_t N2, MPI_Comm comm, \
|
|
||||||
ptrdiff_t *local_n0, ptrdiff_t *local_0_start) { \
|
|
||||||
return prefix ## _mpi_local_size_3d(N0, N1, N2, comm, local_n0, local_0_start); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static void execute(plan_type p) { prefix ## _execute(p); } \
|
|
||||||
static void execute_c2c(plan_type p, complex_type *in, complex_type *out) { prefix ## _mpi_execute_dft(p, in, out); } \
|
|
||||||
static void execute_c2c(plan_type p, std::complex<real_type> *in, std::complex<real_type> *out) { prefix ## _mpi_execute_dft(p, (complex_type*)in, (complex_type*)out); } \
|
|
||||||
static void execute_r2c(plan_type p, real_type *in, complex_type *out) { prefix ## _mpi_execute_dft_r2c(p, in, out); } \
|
|
||||||
static void execute_c2r(plan_type p, std::complex<real_type> *in, real_type *out) { prefix ## _mpi_execute_dft_c2r(p, (complex_type*)in, out); } \
|
|
||||||
static void execute_c2r(plan_type p, complex_type *in, real_type *out) { prefix ## _mpi_execute_dft_c2r(p, in, out); } \
|
|
||||||
static void execute_r2c(plan_type p, real_type *in, std::complex<real_type> *out) { prefix ## _mpi_execute_dft_r2c(p, in, (complex_type*)out); } \
|
|
||||||
\
|
|
||||||
static plan_type plan_dft_r2c_2d(int Nx, int Ny, \
|
|
||||||
real_type *in, complex_type *out, \
|
|
||||||
MPI_Comm comm, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_r2c_2d(Nx, Ny, in, out, \
|
|
||||||
comm, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r_2d(int Nx, int Ny, \
|
|
||||||
complex_type *in, real_type *out, \
|
|
||||||
MPI_Comm comm, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_c2r_2d(Nx, Ny, in, out, \
|
|
||||||
comm, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_r2c_3d(int Nx, int Ny, int Nz, \
|
|
||||||
real_type *in, complex_type *out, \
|
|
||||||
MPI_Comm comm, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_r2c_3d(Nx, Ny, Nz, in, out, comm, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r_3d(int Nx, int Ny, int Nz, \
|
|
||||||
complex_type *in, real_type *out, \
|
|
||||||
MPI_Comm comm, \
|
|
||||||
unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_c2r_3d(Nx, Ny, Nz, in, out, comm, flags); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static plan_type plan_dft_r2c(int rank, const ptrdiff_t *n, real_type *in, \
|
|
||||||
complex_type *out, MPI_Comm comm, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_r2c(rank, n, in, out, comm, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_c2r(int rank, const ptrdiff_t *n, complex_type *in, \
|
|
||||||
real_type *out, MPI_Comm comm, unsigned flags) \
|
|
||||||
{ \
|
|
||||||
return prefix ## _mpi_plan_dft_c2r(rank, n, in, out, comm, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_3d(int Nx, int Ny, int Nz, complex_type *in, complex_type *out, MPI_Comm comm, int sign, unsigned flags) { \
|
|
||||||
return prefix ## _mpi_plan_dft_3d(Nx, Ny, Nz, in, out, comm, sign, flags); \
|
|
||||||
} \
|
|
||||||
static plan_type plan_dft_2d(int Nx, int Ny, complex_type *in, complex_type *out, MPI_Comm comm, int sign, unsigned flags) { \
|
|
||||||
return prefix ## _mpi_plan_dft_2d(Nx, Ny, in, out, comm, sign, flags); \
|
|
||||||
} \
|
|
||||||
static void destroy_plan(plan_type plan) { prefix ## _destroy_plan(plan); } \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FFTW_MPI_CALLS_BASE(double, fftw);
|
|
||||||
FFTW_MPI_CALLS_BASE(float, fftwf);
|
|
||||||
|
|
||||||
#undef FFTW_MPI_CALLS_BASE
|
#undef FFTW_MPI_CALLS_BASE
|
||||||
|
|
||||||
};
|
}; // namespace CosmoTool
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
|
|||||||
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
||||||
|
|
||||||
This software is governed by the CeCILL license under French law and
|
This software is governed by the CeCILL license under French law and
|
||||||
abiding by the rules of distribution of free software. You can use,
|
abiding by the rules of distribution of free software. You can use,
|
||||||
modify and/ or redistribute the software under the terms of the CeCILL
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
"http://www.cecill.info".
|
"http://www.cecill.info".
|
||||||
|
|
||||||
As a counterpart to the access to the source code and rights to copy,
|
As a counterpart to the access to the source code and rights to copy,
|
||||||
modify and redistribute granted by the license, users are provided only
|
modify and redistribute granted by the license, users are provided only
|
||||||
with a limited warranty and the software's author, the holder of the
|
with a limited warranty and the software's author, the holder of the
|
||||||
economic rights, and the successive licensors have only limited
|
economic rights, and the successive licensors have only limited
|
||||||
liability.
|
liability.
|
||||||
|
|
||||||
In this respect, the user's attention is drawn to the risks associated
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
with loading, using, modifying and/or developing or reproducing the
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
|
|||||||
therefore means that it is reserved for developers and experienced
|
therefore means that it is reserved for developers and experienced
|
||||||
professionals having in-depth computer knowledge. Users are therefore
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
encouraged to load and test the software's suitability as regards their
|
encouraged to load and test the software's suitability as regards their
|
||||||
requirements in conditions enabling the security of their systems and/or
|
requirements in conditions enabling the security of their systems and/or
|
||||||
data to be ensured and, more generally, to use and operate it in the
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
same conditions as regards security.
|
same conditions as regards security.
|
||||||
|
|
||||||
The fact that you are presently reading this means that you have had
|
The fact that you are presently reading this means that you have had
|
||||||
knowledge of the CeCILL license and that you accept its terms.
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
@ -59,8 +59,8 @@ int ipvz_out = 5;
|
|||||||
|
|
||||||
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */
|
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */
|
||||||
|
|
||||||
/* n*_runtime_parameters should be set by the caller to
|
/* n*_runtime_parameters should be set by the caller to
|
||||||
the maximum number of runtime parameters to read.
|
the maximum number of runtime parameters to read.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void h5_read_runtime_parameters
|
void h5_read_runtime_parameters
|
||||||
@ -100,12 +100,12 @@ void h5_read_runtime_parameters
|
|||||||
nreal_runtime_parameters = MAX_PARM;
|
nreal_runtime_parameters = MAX_PARM;
|
||||||
|
|
||||||
/* integer runtime parameters */
|
/* integer runtime parameters */
|
||||||
int_rt_parms = (int_runtime_params_t *) malloc(nint_runtime_parameters * sizeof(int_runtime_params_t));
|
int_rt_parms = (int_runtime_params_t *) malloc(nint_runtime_parameters * sizeof(int_runtime_params_t));
|
||||||
|
|
||||||
rank = 1;
|
rank = 1;
|
||||||
DataSet dataset = file->openDataSet("integer runtime parameters");
|
DataSet dataset = file->openDataSet("integer runtime parameters");
|
||||||
|
|
||||||
IntType int_rt_type = dataset.getIntType();
|
IntType int_rt_type = dataset.getIntType();
|
||||||
//int_rt_type = H5Dget_type(dataset);
|
//int_rt_type = H5Dget_type(dataset);
|
||||||
|
|
||||||
DataSpace dataspace = dataset.getSpace();
|
DataSpace dataspace = dataset.getSpace();
|
||||||
@ -123,10 +123,7 @@ void h5_read_runtime_parameters
|
|||||||
DataSpace memspace(rank, &dimens_1d);
|
DataSpace memspace(rank, &dimens_1d);
|
||||||
//memspace = H5Screate_simple(rank, &dimens_1d, NULL);
|
//memspace = H5Screate_simple(rank, &dimens_1d, NULL);
|
||||||
|
|
||||||
dataset.read(int_rt_parms, int_rt_type, memspace, dataspace,
|
dataset.read(int_rt_parms, int_rt_type, memspace, dataspace);
|
||||||
H5P_DEFAULT);
|
|
||||||
//status = H5Dread(dataset, int_rt_type, memspace, dataspace,
|
|
||||||
// H5P_DEFAULT, int_rt_parms);
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < nint_runtime_parameters; i++) {
|
for (i = 0; i < nint_runtime_parameters; i++) {
|
||||||
@ -145,14 +142,14 @@ void h5_read_runtime_parameters
|
|||||||
|
|
||||||
/* reals */
|
/* reals */
|
||||||
|
|
||||||
real_rt_parms = (real_runtime_params_t *) malloc(nreal_runtime_parameters * sizeof(real_runtime_params_t));
|
real_rt_parms = (real_runtime_params_t *) malloc(nreal_runtime_parameters * sizeof(real_runtime_params_t));
|
||||||
|
|
||||||
rank = 1;
|
rank = 1;
|
||||||
dataset = file->openDataSet("real runtime parameters");
|
dataset = file->openDataSet("real runtime parameters");
|
||||||
//dataset = H5Dopen(*file_identifier, "real runtime parameters");
|
//dataset = H5Dopen(*file_identifier, "real runtime parameters");
|
||||||
|
|
||||||
dataspace = dataset.getSpace();
|
dataspace = dataset.getSpace();
|
||||||
FloatType real_rt_type = dataset.getFloatType();
|
FloatType real_rt_type = dataset.getFloatType();
|
||||||
ndims = dataspace.getSimpleExtentDims(&dimens_1d, NULL);
|
ndims = dataspace.getSimpleExtentDims(&dimens_1d, NULL);
|
||||||
//dataspace = H5Dget_space(dataset);
|
//dataspace = H5Dget_space(dataset);
|
||||||
//real_rt_type = H5Dget_type(dataset);
|
//real_rt_type = H5Dget_type(dataset);
|
||||||
@ -167,10 +164,7 @@ void h5_read_runtime_parameters
|
|||||||
memspace = DataSpace(rank, &dimens_1d);
|
memspace = DataSpace(rank, &dimens_1d);
|
||||||
//memspace = H5Screate_simple(rank, &dimens_1d, NULL);
|
//memspace = H5Screate_simple(rank, &dimens_1d, NULL);
|
||||||
|
|
||||||
dataset.read(real_rt_parms, real_rt_type, memspace, dataspace,
|
dataset.read(real_rt_parms, real_rt_type, memspace, dataspace);
|
||||||
H5P_DEFAULT);
|
|
||||||
//status = H5Dread(dataset, real_rt_type, memspace, dataspace,
|
|
||||||
// H5P_DEFAULT, real_rt_parms);
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < nreal_runtime_parameters; i++) {
|
for (i = 0; i < nreal_runtime_parameters; i++) {
|
||||||
@ -193,7 +187,7 @@ void h5_read_runtime_parameters
|
|||||||
*LBox = real_runtime_parameter_values[i];
|
*LBox = real_runtime_parameter_values[i];
|
||||||
}
|
}
|
||||||
if (strncmp(real_runtime_parameter_names[i],"hubbleconstant", 14) == 0 ) {
|
if (strncmp(real_runtime_parameter_names[i],"hubbleconstant", 14) == 0 ) {
|
||||||
*hubble = real_runtime_parameter_values[i];
|
*hubble = real_runtime_parameter_values[i];
|
||||||
}
|
}
|
||||||
if (strncmp(real_runtime_parameter_names[i],"omegamatter", 11) == 0 ) {
|
if (strncmp(real_runtime_parameter_names[i],"omegamatter", 11) == 0 ) {
|
||||||
*omegam = real_runtime_parameter_values[i];
|
*omegam = real_runtime_parameter_values[i];
|
||||||
@ -205,7 +199,7 @@ void h5_read_runtime_parameters
|
|||||||
*omegalambda = real_runtime_parameter_values[i];
|
*omegalambda = real_runtime_parameter_values[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nint_runtime_parameters; i++) {
|
for (i = 0; i < nint_runtime_parameters; i++) {
|
||||||
if (strncmp(int_runtime_parameter_names[i],"pt_numx",7) == 0 ) {
|
if (strncmp(int_runtime_parameter_names[i],"pt_numx",7) == 0 ) {
|
||||||
*numPart = int_runtime_parameter_values[i];
|
*numPart = int_runtime_parameter_values[i];
|
||||||
@ -214,7 +208,7 @@ void h5_read_runtime_parameters
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
|
/* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
|
||||||
void h5_read_flash3_particles (H5File* file,
|
void h5_read_flash3_particles (H5File* file,
|
||||||
int* totalparticles,
|
int* totalparticles,
|
||||||
@ -241,8 +235,8 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
char *propName;
|
char *propName;
|
||||||
double *partBuffer;
|
double *partBuffer;
|
||||||
char part_names[50][OUTPUT_PROP_LENGTH];
|
char part_names[50][OUTPUT_PROP_LENGTH];
|
||||||
int string_size;
|
int string_size;
|
||||||
|
|
||||||
// char part_names[NPART_PROPS][OUTPUT_PROP_LENGTH];
|
// char part_names[NPART_PROPS][OUTPUT_PROP_LENGTH];
|
||||||
hsize_t dimens_2d[2], maxdimens_2d[2];
|
hsize_t dimens_2d[2], maxdimens_2d[2];
|
||||||
hsize_t start_2d[2], count_2d[2], stride_2d[2];
|
hsize_t start_2d[2], count_2d[2], stride_2d[2];
|
||||||
@ -265,12 +259,12 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
|
|
||||||
//total number of particle properties
|
//total number of particle properties
|
||||||
numProps = dimens_2d[0];
|
numProps = dimens_2d[0];
|
||||||
|
|
||||||
string_size = OUTPUT_PROP_LENGTH;
|
string_size = OUTPUT_PROP_LENGTH;
|
||||||
StrType string_type = H5Tcopy(H5T_C_S1);
|
StrType string_type = H5Tcopy(H5T_C_S1);
|
||||||
string_type.setSize(string_size);
|
string_type.setSize(string_size);
|
||||||
//status = H5Tset_size(string_type, string_size);
|
//status = H5Tset_size(string_type, string_size);
|
||||||
|
|
||||||
rank = 2;
|
rank = 2;
|
||||||
|
|
||||||
start_2d[0] = 0;
|
start_2d[0] = 0;
|
||||||
@ -282,22 +276,20 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
count_2d[0] = dimens_2d[0];
|
count_2d[0] = dimens_2d[0];
|
||||||
count_2d[1] = dimens_2d[1];
|
count_2d[1] = dimens_2d[1];
|
||||||
|
|
||||||
dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d);
|
dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d);
|
||||||
//status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d,
|
//status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d,
|
||||||
// stride_2d, count_2d, NULL);
|
// stride_2d, count_2d, NULL);
|
||||||
|
|
||||||
DataSpace memspace(rank, dimens_2d);
|
DataSpace memspace(rank, dimens_2d);
|
||||||
//memspace = H5Screate_simple(rank, dimens_2d, NULL);
|
//memspace = H5Screate_simple(rank, dimens_2d, NULL);
|
||||||
|
|
||||||
dataset.read(part_names, string_type, H5S_ALL, H5S_ALL, H5P_DEFAULT);
|
dataset.read(part_names, string_type);
|
||||||
//status = H5Dread(dataset, string_type, H5S_ALL, H5S_ALL,
|
|
||||||
// H5P_DEFAULT, part_names);
|
|
||||||
|
|
||||||
|
|
||||||
string_type.close();
|
string_type.close();
|
||||||
memspace.close();
|
memspace.close();
|
||||||
dataspace.close();
|
dataspace.close();
|
||||||
dataset.close();
|
dataset.close();
|
||||||
//H5Tclose(string_type);
|
//H5Tclose(string_type);
|
||||||
//H5Sclose(memspace);
|
//H5Sclose(memspace);
|
||||||
//H5Sclose(dataspace);
|
//H5Sclose(dataspace);
|
||||||
@ -313,7 +305,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
if (strncmp(part_names[i], "velz", 4) == 0) { ipvz = i+1; }
|
if (strncmp(part_names[i], "velz", 4) == 0) { ipvz = i+1; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((iptag < 0) || (ipx < 0) || (ipy < 0) || (ipz < 0) || (ipvx < 0) ||
|
if ((iptag < 0) || (ipx < 0) || (ipy < 0) || (ipz < 0) || (ipvx < 0) ||
|
||||||
(ipvy < 0) || (ipvz < 0) ) {
|
(ipvy < 0) || (ipvz < 0) ) {
|
||||||
printf("One or more required particle attributes not found in file!\n");
|
printf("One or more required particle attributes not found in file!\n");
|
||||||
return;
|
return;
|
||||||
@ -325,7 +317,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
//read particles
|
//read particles
|
||||||
dataset = file->openDataSet("tracer particles");
|
dataset = file->openDataSet("tracer particles");
|
||||||
//dataset = H5Dopen(*file_identifier, "tracer particles");
|
//dataset = H5Dopen(*file_identifier, "tracer particles");
|
||||||
|
|
||||||
FloatType datatype = dataset.getFloatType();
|
FloatType datatype = dataset.getFloatType();
|
||||||
//datatype = H5Dget_type(dataset);
|
//datatype = H5Dget_type(dataset);
|
||||||
|
|
||||||
@ -338,7 +330,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
ndims = dataspace.getSimpleExtentDims(dimens_2d, NULL);
|
ndims = dataspace.getSimpleExtentDims(dimens_2d, NULL);
|
||||||
//dataspace = H5Dget_space(dataset);
|
//dataspace = H5Dget_space(dataset);
|
||||||
//H5Sget_simple_extent_dims(dataspace, dimens_2d, maxdimens_2d);
|
//H5Sget_simple_extent_dims(dataspace, dimens_2d, maxdimens_2d);
|
||||||
|
|
||||||
/*insert particle properties (numPartBuffer) particles at a time*/
|
/*insert particle properties (numPartBuffer) particles at a time*/
|
||||||
pstack = (*localnp);
|
pstack = (*localnp);
|
||||||
poffset = 0;
|
poffset = 0;
|
||||||
@ -366,7 +358,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
dimens_2d[0] = (pcount);
|
dimens_2d[0] = (pcount);
|
||||||
dimens_2d[1] = (numProps);
|
dimens_2d[1] = (numProps);
|
||||||
|
|
||||||
dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d);
|
dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d);
|
||||||
//status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d,
|
//status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d,
|
||||||
// stride_2d, count_2d, NULL);
|
// stride_2d, count_2d, NULL);
|
||||||
|
|
||||||
@ -374,8 +366,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
//memspace = H5Screate_simple(rank, dimens_2d, maxdimens_2d);
|
//memspace = H5Screate_simple(rank, dimens_2d, maxdimens_2d);
|
||||||
|
|
||||||
/* read data from the dataset */
|
/* read data from the dataset */
|
||||||
dataset.read(partBuffer, datatype, memspace, dataspace, H5P_DEFAULT);
|
dataset.read(partBuffer, datatype, memspace, dataspace);
|
||||||
//status = H5Dread(dataset, datatype, memspace, dataspace, H5P_DEFAULT, partBuffer);
|
|
||||||
|
|
||||||
/* convert buffer into particle struct */
|
/* convert buffer into particle struct */
|
||||||
|
|
||||||
@ -391,8 +382,8 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
pos3[p+poffset] = (float) *(partBuffer+ipz-1+p*numProps);
|
pos3[p+poffset] = (float) *(partBuffer+ipz-1+p*numProps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (vel1 && vel2 && vel3) {
|
if (vel1 && vel2 && vel3) {
|
||||||
for(p=0; p < (pcount); p++) {
|
for(p=0; p < (pcount); p++) {
|
||||||
vel1[p+poffset] = (float) *(partBuffer+ipvx-1+p*numProps);
|
vel1[p+poffset] = (float) *(partBuffer+ipvx-1+p*numProps);
|
||||||
@ -423,7 +414,7 @@ void h5_read_flash3_particles (H5File* file,
|
|||||||
//status = H5Sclose(dataspace);
|
//status = H5Sclose(dataspace);
|
||||||
//status = H5Dclose(dataset);
|
//status = H5Dclose(dataset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
|
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
|
||||||
|
|
||||||
@ -451,7 +442,7 @@ void h5_read_flash3_header_info(H5File* file,
|
|||||||
|
|
||||||
H5std_string DATASET_NAME;
|
H5std_string DATASET_NAME;
|
||||||
|
|
||||||
string_type = H5Tcopy(H5T_C_S1);
|
string_type = H5Tcopy(H5T_C_S1);
|
||||||
H5Tset_size(string_type, MAX_STRING_LENGTH);
|
H5Tset_size(string_type, MAX_STRING_LENGTH);
|
||||||
|
|
||||||
DataSet dataset = file->openDataSet("real scalars");
|
DataSet dataset = file->openDataSet("real scalars");
|
||||||
@ -467,13 +458,13 @@ void h5_read_flash3_header_info(H5File* file,
|
|||||||
/* malloc a pointer to a list of real_list_t's */
|
/* malloc a pointer to a list of real_list_t's */
|
||||||
real_list = (real_list_t *) malloc(dimens_1d * sizeof(real_list_t));
|
real_list = (real_list_t *) malloc(dimens_1d * sizeof(real_list_t));
|
||||||
|
|
||||||
// create a new simple dataspace of 1 dimension and size of 'dimens_1d'
|
// create a new simple dataspace of 1 dimension and size of 'dimens_1d'
|
||||||
DataSpace memspace(1, &dimens_1d);
|
DataSpace memspace(1, &dimens_1d);
|
||||||
|
|
||||||
// create an empty vessel sized to hold one real_list_t's worth of data
|
// create an empty vessel sized to hold one real_list_t's worth of data
|
||||||
CompType real_list_type( sizeof(real_list_t) );
|
CompType real_list_type( sizeof(real_list_t) );
|
||||||
|
|
||||||
// subdivide the empty vessel into its component sections (name and value)
|
// subdivide the empty vessel into its component sections (name and value)
|
||||||
real_list_type.insertMember(
|
real_list_type.insertMember(
|
||||||
"name",
|
"name",
|
||||||
HOFFSET(real_list_t, name),
|
HOFFSET(real_list_t, name),
|
||||||
@ -484,9 +475,8 @@ void h5_read_flash3_header_info(H5File* file,
|
|||||||
HOFFSET(real_list_t, value),
|
HOFFSET(real_list_t, value),
|
||||||
PredType::NATIVE_DOUBLE);
|
PredType::NATIVE_DOUBLE);
|
||||||
|
|
||||||
// read the data into 'real_list'
|
// read the data into 'real_list'
|
||||||
dataset.read( real_list, real_list_type, memspace, dataspace,
|
dataset.read( real_list, real_list_type, memspace, dataspace);
|
||||||
H5P_DEFAULT);
|
|
||||||
|
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
|
@ -144,8 +144,8 @@ namespace CosmoTool {
|
|||||||
bool useBases = false)
|
bool useBases = false)
|
||||||
{
|
{
|
||||||
std::vector<hsize_t> memdims(data.shape(), data.shape() + data.num_dimensions());
|
std::vector<hsize_t> memdims(data.shape(), data.shape() + data.num_dimensions());
|
||||||
H5::DataSpace dataspace(dimensions.size(), dimensions.data());
|
H5::DataSpace dataspace(int(dimensions.size()), dimensions.data());
|
||||||
H5::DataSpace memspace(memdims.size(), memdims.data());
|
H5::DataSpace memspace(int(memdims.size()), memdims.data());
|
||||||
|
|
||||||
if (useBases) {
|
if (useBases) {
|
||||||
std::vector<hsize_t> offsets(data.index_bases(), data.index_bases() + data.num_dimensions());
|
std::vector<hsize_t> offsets(data.index_bases(), data.index_bases() + data.num_dimensions());
|
||||||
@ -398,7 +398,7 @@ namespace CosmoTool {
|
|||||||
hdf5_weak_check_array(data, dimensions);
|
hdf5_weak_check_array(data, dimensions);
|
||||||
|
|
||||||
std::vector<hsize_t> memdims(data.shape(), data.shape() + data.num_dimensions());
|
std::vector<hsize_t> memdims(data.shape(), data.shape() + data.num_dimensions());
|
||||||
H5::DataSpace memspace(memdims.size(), memdims.data());
|
H5::DataSpace memspace(int(memdims.size()), memdims.data());
|
||||||
|
|
||||||
std::vector<hsize_t> offsets(data.index_bases(), data.index_bases() + data.num_dimensions());
|
std::vector<hsize_t> offsets(data.index_bases(), data.index_bases() + data.num_dimensions());
|
||||||
dataspace.selectHyperslab(H5S_SELECT_SET, memdims.data(), offsets.data());
|
dataspace.selectHyperslab(H5S_SELECT_SET, memdims.data(), offsets.data());
|
||||||
@ -426,7 +426,7 @@ namespace CosmoTool {
|
|||||||
#define CTOOL_HDF5_INSERT_ELEMENT(r, STRUCT, element) \
|
#define CTOOL_HDF5_INSERT_ELEMENT(r, STRUCT, element) \
|
||||||
{ \
|
{ \
|
||||||
::CosmoTool::get_hdf5_data_type<BOOST_PP_TUPLE_ELEM(2, 0, element)> t; \
|
::CosmoTool::get_hdf5_data_type<BOOST_PP_TUPLE_ELEM(2, 0, element)> t; \
|
||||||
position = HOFFSET(STRUCT, BOOST_PP_TUPLE_ELEM(2, 1, element)); \
|
long position = offsetof(STRUCT, BOOST_PP_TUPLE_ELEM(2, 1, element)); \
|
||||||
const char *field_name = BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, element)); \
|
const char *field_name = BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, element)); \
|
||||||
type.insertMember(field_name, position, t.type()); \
|
type.insertMember(field_name, position, t.type()); \
|
||||||
}
|
}
|
||||||
@ -439,7 +439,6 @@ namespace CosmoTool { \
|
|||||||
\
|
\
|
||||||
TNAME() : type(sizeof(STRUCT)) \
|
TNAME() : type(sizeof(STRUCT)) \
|
||||||
{ \
|
{ \
|
||||||
long position; \
|
|
||||||
BOOST_PP_SEQ_FOR_EACH(CTOOL_HDF5_INSERT_ELEMENT, STRUCT, ATTRIBUTES) \
|
BOOST_PP_SEQ_FOR_EACH(CTOOL_HDF5_INSERT_ELEMENT, STRUCT, ATTRIBUTES) \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -471,7 +470,6 @@ namespace CosmoTool { \
|
|||||||
\
|
\
|
||||||
TNAME() : type(sizeof(STRUCT)) \
|
TNAME() : type(sizeof(STRUCT)) \
|
||||||
{ \
|
{ \
|
||||||
long position; \
|
|
||||||
BOOST_PP_SEQ_FOR_EACH(CTOOL_HDF5_INSERT_ENUM_ELEMENT, STRUCT, ATTRIBUTES) \
|
BOOST_PP_SEQ_FOR_EACH(CTOOL_HDF5_INSERT_ENUM_ELEMENT, STRUCT, ATTRIBUTES) \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
@ -157,6 +157,7 @@ const Interpolate& Interpolate::operator=(const Interpolate& a)
|
|||||||
gsl_spline_init(spline, a.spline->x, a.spline->y, a.spline->size);
|
gsl_spline_init(spline, a.spline->x, a.spline->y, a.spline->size);
|
||||||
logx = a.logx;
|
logx = a.logx;
|
||||||
logy = a.logy;
|
logy = a.logy;
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Interpolate::getMaxX() const
|
double Interpolate::getMaxX() const
|
||||||
|
@ -221,7 +221,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id,
|
|||||||
cerr << "Invalid format while reading header" << endl;
|
cerr << "Invalid format while reading header" << endl;
|
||||||
delete data;
|
delete data;
|
||||||
delete f;
|
delete f;
|
||||||
return 0;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id,
|
|||||||
cerr << "Invalid format while reading positions" << endl;
|
cerr << "Invalid format while reading positions" << endl;
|
||||||
delete f;
|
delete f;
|
||||||
delete data;
|
delete data;
|
||||||
return 0;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -292,7 +292,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id,
|
|||||||
{
|
{
|
||||||
delete f;
|
delete f;
|
||||||
delete data;
|
delete data;
|
||||||
return 0;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,7 +317,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id,
|
|||||||
cerr << "Invalid format while reading velocities" << endl;
|
cerr << "Invalid format while reading velocities" << endl;
|
||||||
delete f;
|
delete f;
|
||||||
delete data;
|
delete data;
|
||||||
return 0;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
// THE VELOCITIES ARE IN PHYSICAL COORDINATES
|
// THE VELOCITIES ARE IN PHYSICAL COORDINATES
|
||||||
@ -367,7 +367,7 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id,
|
|||||||
cerr << "Invalid unformatted access while reading ID" << endl;
|
cerr << "Invalid unformatted access while reading ID" << endl;
|
||||||
delete f;
|
delete f;
|
||||||
delete data;
|
delete data;
|
||||||
return 0;
|
throw;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
f->skip(2*4);
|
f->skip(2*4);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*+
|
/*+
|
||||||
This is CosmoTool (./src/mykdtree.hpp) -- Copyright (C) Guilhem Lavaux (2007-2014)
|
This is CosmoTool (./src/mykdtree.hpp) -- Copyright (C) Guilhem Lavaux (2007-2022)
|
||||||
|
|
||||||
guilhem.lavaux@gmail.com
|
guilhem.lavaux@gmail.com
|
||||||
|
|
||||||
@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
|
|||||||
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
||||||
|
|
||||||
This software is governed by the CeCILL license under French law and
|
This software is governed by the CeCILL license under French law and
|
||||||
abiding by the rules of distribution of free software. You can use,
|
abiding by the rules of distribution of free software. You can use,
|
||||||
modify and/ or redistribute the software under the terms of the CeCILL
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
"http://www.cecill.info".
|
"http://www.cecill.info".
|
||||||
|
|
||||||
As a counterpart to the access to the source code and rights to copy,
|
As a counterpart to the access to the source code and rights to copy,
|
||||||
modify and redistribute granted by the license, users are provided only
|
modify and redistribute granted by the license, users are provided only
|
||||||
with a limited warranty and the software's author, the holder of the
|
with a limited warranty and the software's author, the holder of the
|
||||||
economic rights, and the successive licensors have only limited
|
economic rights, and the successive licensors have only limited
|
||||||
liability.
|
liability.
|
||||||
|
|
||||||
In this respect, the user's attention is drawn to the risks associated
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
with loading, using, modifying and/or developing or reproducing the
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
|
|||||||
therefore means that it is reserved for developers and experienced
|
therefore means that it is reserved for developers and experienced
|
||||||
professionals having in-depth computer knowledge. Users are therefore
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
encouraged to load and test the software's suitability as regards their
|
encouraged to load and test the software's suitability as regards their
|
||||||
requirements in conditions enabling the security of their systems and/or
|
requirements in conditions enabling the security of their systems and/or
|
||||||
data to be ensured and, more generally, to use and operate it in the
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
same conditions as regards security.
|
same conditions as regards security.
|
||||||
|
|
||||||
The fact that you are presently reading this means that you have had
|
The fact that you are presently reading this means that you have had
|
||||||
knowledge of the CeCILL license and that you accept its terms.
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
@ -48,13 +48,13 @@ namespace CosmoTool {
|
|||||||
|
|
||||||
typedef uint64_t NodeIntType;
|
typedef uint64_t NodeIntType;
|
||||||
|
|
||||||
template<int N, typename CType = ComputePrecision>
|
template<int N, typename CType = ComputePrecision>
|
||||||
struct KDDef
|
struct KDDef
|
||||||
{
|
{
|
||||||
typedef CType CoordType;
|
typedef CType CoordType;
|
||||||
typedef float KDCoordinates[N];
|
typedef float KDCoordinates[N];
|
||||||
};
|
};
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType = ComputePrecision>
|
template<int N, typename ValType, typename CType = ComputePrecision>
|
||||||
struct KDCell
|
struct KDCell
|
||||||
{
|
{
|
||||||
@ -99,10 +99,10 @@ namespace CosmoTool {
|
|||||||
typename KDDef<N,CType>::CoordType r, r2;
|
typename KDDef<N,CType>::CoordType r, r2;
|
||||||
KDCell<N, ValType,CType> **cells;
|
KDCell<N, ValType,CType> **cells;
|
||||||
typename KDDef<N,CType>::CoordType *distances;
|
typename KDDef<N,CType>::CoordType *distances;
|
||||||
uint32_t currentRank;
|
uint64_t currentRank;
|
||||||
uint32_t numCells;
|
uint64_t numCells;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType = ComputePrecision>
|
template<int N, typename ValType, typename CType = ComputePrecision>
|
||||||
class RecursionMultipleInfo
|
class RecursionMultipleInfo
|
||||||
@ -114,14 +114,14 @@ namespace CosmoTool {
|
|||||||
|
|
||||||
RecursionMultipleInfo(const typename KDDef<N,CType>::KDCoordinates& rx,
|
RecursionMultipleInfo(const typename KDDef<N,CType>::KDCoordinates& rx,
|
||||||
KDCell<N,ValType,CType> **cells,
|
KDCell<N,ValType,CType> **cells,
|
||||||
uint32_t numCells)
|
uint64_t numCells)
|
||||||
: queue(cells, numCells, INFINITY),traversed(0)
|
: queue(cells, numCells, INFINITY),traversed(0)
|
||||||
{
|
{
|
||||||
std::copy(rx, rx+N, x);
|
std::copy(rx, rx+N, x);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType = ComputePrecision>
|
template<int N, typename ValType, typename CType = ComputePrecision>
|
||||||
struct KD_default_cell_splitter
|
struct KD_default_cell_splitter
|
||||||
{
|
{
|
||||||
void operator()(KDCell<N,ValType,CType> **cells, NodeIntType Ncells, NodeIntType& split_index, int axis, typename KDDef<N,CType>::KDCoordinates minBound, typename KDDef<N,CType>::KDCoordinates maxBound);
|
void operator()(KDCell<N,ValType,CType> **cells, NodeIntType Ncells, NodeIntType& split_index, int axis, typename KDDef<N,CType>::KDCoordinates minBound, typename KDDef<N,CType>::KDCoordinates maxBound);
|
||||||
@ -135,7 +135,7 @@ namespace CosmoTool {
|
|||||||
typedef typename KDDef<N>::KDCoordinates coords;
|
typedef typename KDDef<N>::KDCoordinates coords;
|
||||||
typedef KDCell<N,ValType,CType> Cell;
|
typedef KDCell<N,ValType,CType> Cell;
|
||||||
typedef KDTreeNode<N,ValType,CType> Node;
|
typedef KDTreeNode<N,ValType,CType> Node;
|
||||||
|
|
||||||
CellSplitter splitter;
|
CellSplitter splitter;
|
||||||
|
|
||||||
KDTree(Cell *cells, NodeIntType Ncells);
|
KDTree(Cell *cells, NodeIntType Ncells);
|
||||||
@ -153,20 +153,20 @@ namespace CosmoTool {
|
|||||||
std::copy(replicate, replicate+N, this->replicate);
|
std::copy(replicate, replicate+N, this->replicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t getIntersection(const coords& x, CoordType r,
|
uint64_t getIntersection(const coords& x, CoordType r,
|
||||||
Cell **cells,
|
Cell **cells,
|
||||||
uint32_t numCells);
|
uint64_t numCells);
|
||||||
uint32_t getIntersection(const coords& x, CoordType r,
|
uint64_t getIntersection(const coords& x, CoordType r,
|
||||||
Cell **cells,
|
Cell **cells,
|
||||||
CoordType *distances,
|
CoordType *distances,
|
||||||
uint32_t numCells);
|
uint64_t numCells);
|
||||||
uint32_t countCells(const coords& x, CoordType r);
|
uint64_t countCells(const coords& x, CoordType r);
|
||||||
|
|
||||||
Cell *getNearestNeighbour(const coords& x);
|
Cell *getNearestNeighbour(const coords& x);
|
||||||
|
|
||||||
void getNearestNeighbours(const coords& x, uint32_t NumCells,
|
void getNearestNeighbours(const coords& x, uint64_t NumCells,
|
||||||
Cell **cells);
|
Cell **cells);
|
||||||
void getNearestNeighbours(const coords& x, uint32_t NumCells,
|
void getNearestNeighbours(const coords& x, uint64_t NumCells,
|
||||||
Cell **cells,
|
Cell **cells,
|
||||||
CoordType *distances);
|
CoordType *distances);
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ namespace CosmoTool {
|
|||||||
NodeIntType getNumberInNode(const Node *n) const { return n->numNodes; }
|
NodeIntType getNumberInNode(const Node *n) const { return n->numNodes; }
|
||||||
#else
|
#else
|
||||||
NodeIntType getNumberInNode(const Node *n) const {
|
NodeIntType getNumberInNode(const Node *n) const {
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1+getNumberInNode(n->children[0])+getNumberInNode(n->children[1]);
|
return 1+getNumberInNode(n->children[0])+getNumberInNode(n->children[1]);
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ namespace CosmoTool {
|
|||||||
uint32_t depth,
|
uint32_t depth,
|
||||||
coords minBound,
|
coords minBound,
|
||||||
coords maxBound);
|
coords maxBound);
|
||||||
|
|
||||||
template<bool justCount>
|
template<bool justCount>
|
||||||
void recursiveIntersectionCells(RecursionInfoCells<N,ValType, CType>& info,
|
void recursiveIntersectionCells(RecursionInfoCells<N,ValType, CType>& info,
|
||||||
Node *node,
|
Node *node,
|
||||||
@ -224,7 +224,7 @@ namespace CosmoTool {
|
|||||||
CoordType& R2,
|
CoordType& R2,
|
||||||
Cell*& cell);
|
Cell*& cell);
|
||||||
void recursiveMultipleNearest(RecursionMultipleInfo<N,ValType,CType>& info, Node *node,
|
void recursiveMultipleNearest(RecursionMultipleInfo<N,ValType,CType>& info, Node *node,
|
||||||
int level);
|
int level);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ namespace CosmoTool {
|
|||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
KDTree<N,ValType,CType,CellSplitter>::KDTree(Cell *cells, NodeIntType Ncells)
|
KDTree<N,ValType,CType,CellSplitter>::KDTree(Cell *cells, NodeIntType Ncells)
|
||||||
{
|
{
|
||||||
periodic = false;
|
periodic = false;
|
||||||
|
|
||||||
base_cell = cells;
|
base_cell = cells;
|
||||||
numNodes = Ncells;
|
numNodes = Ncells;
|
||||||
@ -41,7 +41,7 @@ namespace CosmoTool {
|
|||||||
|
|
||||||
sortingHelper = new Cell *[Ncells];
|
sortingHelper = new Cell *[Ncells];
|
||||||
for (NodeIntType i = 0; i < Ncells; i++)
|
for (NodeIntType i = 0; i < Ncells; i++)
|
||||||
sortingHelper[i] = &cells[i];
|
sortingHelper[i] = &cells[i];
|
||||||
|
|
||||||
optimize();
|
optimize();
|
||||||
}
|
}
|
||||||
@ -73,16 +73,16 @@ namespace CosmoTool {
|
|||||||
absoluteMax[k] = cell->coord[k];
|
absoluteMax[k] = cell->coord[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << " rebuilding the tree..." << std::endl;
|
std::cout << " rebuilding the tree..." << std::endl;
|
||||||
root = buildTree(sortingHelper, activeCells, 0, absoluteMin, absoluteMax);
|
root = buildTree(sortingHelper, activeCells, 0, absoluteMin, absoluteMax);
|
||||||
std::cout << " done." << std::endl;
|
std::cout << " done." << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
uint32_t KDTree<N,ValType,CType,CellSplitter>::getIntersection(const coords& x, CoordType r,
|
uint64_t KDTree<N,ValType,CType,CellSplitter>::getIntersection(const coords& x, CoordType r,
|
||||||
KDTree<N,ValType,CType,CellSplitter>::Cell **cells,
|
KDTree<N,ValType,CType,CellSplitter>::Cell **cells,
|
||||||
uint32_t numCells)
|
uint64_t numCells)
|
||||||
{
|
{
|
||||||
RecursionInfoCells<N,ValType,CType> info;
|
RecursionInfoCells<N,ValType,CType> info;
|
||||||
|
|
||||||
@ -112,10 +112,10 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
uint32_t KDTree<N,ValType,CType,CellSplitter>::getIntersection(const coords& x, CoordType r,
|
uint64_t KDTree<N,ValType,CType,CellSplitter>::getIntersection(const coords& x, CoordType r,
|
||||||
Cell **cells,
|
Cell **cells,
|
||||||
CoordType *distances,
|
CoordType *distances,
|
||||||
uint32_t numCells)
|
uint64_t numCells)
|
||||||
{
|
{
|
||||||
RecursionInfoCells<N,ValType> info;
|
RecursionInfoCells<N,ValType> info;
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
uint32_t KDTree<N,ValType,CType,CellSplitter>::countCells(const coords& x, CoordType r)
|
uint64_t KDTree<N,ValType,CType,CellSplitter>::countCells(const coords& x, CoordType r)
|
||||||
{
|
{
|
||||||
RecursionInfoCells<N,ValType> info;
|
RecursionInfoCells<N,ValType> info;
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ namespace CosmoTool {
|
|||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
template<bool justCount>
|
template<bool justCount>
|
||||||
void KDTree<N,ValType,CType,CellSplitter>::recursiveIntersectionCells(RecursionInfoCells<N,ValType,CType>& info,
|
void KDTree<N,ValType,CType,CellSplitter>::recursiveIntersectionCells(RecursionInfoCells<N,ValType,CType>& info,
|
||||||
Node *node,
|
Node *node,
|
||||||
int level)
|
int level)
|
||||||
{
|
{
|
||||||
@ -183,7 +183,7 @@ namespace CosmoTool {
|
|||||||
CoordType d2 = 0;
|
CoordType d2 = 0;
|
||||||
|
|
||||||
#if __KD_TREE_ACTIVE_CELLS == 1
|
#if __KD_TREE_ACTIVE_CELLS == 1
|
||||||
if (node->value->active)
|
if (node->value->active)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
for (int j = 0; j < 3; j++)
|
for (int j = 0; j < 3; j++)
|
||||||
@ -250,9 +250,9 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType>
|
template<int N, typename ValType, typename CType>
|
||||||
void KD_default_cell_splitter<N,ValType,CType>::operator()(KDCell<N,ValType,CType> **cells, NodeIntType Ncells,
|
void KD_default_cell_splitter<N,ValType,CType>::operator()(KDCell<N,ValType,CType> **cells, NodeIntType Ncells,
|
||||||
NodeIntType& split_index, int axis,
|
NodeIntType& split_index, int axis,
|
||||||
typename KDDef<N,CType>::KDCoordinates minBound,
|
typename KDDef<N,CType>::KDCoordinates minBound,
|
||||||
typename KDDef<N,CType>::KDCoordinates maxBound)
|
typename KDDef<N,CType>::KDCoordinates maxBound)
|
||||||
{
|
{
|
||||||
CellCompare<N,ValType,CType> compare(axis);
|
CellCompare<N,ValType,CType> compare(axis);
|
||||||
@ -279,9 +279,9 @@ namespace CosmoTool {
|
|||||||
|
|
||||||
//#pragma omp atomic capture
|
//#pragma omp atomic capture
|
||||||
nodeId = (this->lastNode)++;
|
nodeId = (this->lastNode)++;
|
||||||
|
|
||||||
node = &nodes[nodeId];
|
node = &nodes[nodeId];
|
||||||
|
|
||||||
// Isolate the environment
|
// Isolate the environment
|
||||||
splitter(cell0, Ncells, mid, axis, minBound, maxBound);
|
splitter(cell0, Ncells, mid, axis, minBound, maxBound);
|
||||||
|
|
||||||
@ -297,12 +297,12 @@ namespace CosmoTool {
|
|||||||
{
|
{
|
||||||
node->children[0] = buildTree(cell0, mid, depth, minBound, tmpBound);
|
node->children[0] = buildTree(cell0, mid, depth, minBound, tmpBound);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tmpBound, minBound, sizeof(coords));
|
memcpy(tmpBound, minBound, sizeof(coords));
|
||||||
tmpBound[axis] = node->value->coord[axis];
|
tmpBound[axis] = node->value->coord[axis];
|
||||||
#pragma omp task private(tmpBound)
|
#pragma omp task private(tmpBound)
|
||||||
{
|
{
|
||||||
node->children[1] = buildTree(cell0+mid+1, Ncells-mid-1, depth,
|
node->children[1] = buildTree(cell0+mid+1, Ncells-mid-1, depth,
|
||||||
tmpBound, maxBound);
|
tmpBound, maxBound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,17 +391,17 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if current node is not the nearest
|
// Check if current node is not the nearest
|
||||||
CoordType thisR2 =
|
CoordType thisR2 =
|
||||||
computeDistance(node->value, x);
|
computeDistance(node->value, x);
|
||||||
|
|
||||||
if (thisR2 < R2)
|
if (thisR2 < R2)
|
||||||
{
|
{
|
||||||
R2 = thisR2;
|
R2 = thisR2;
|
||||||
best = node->value;
|
best = node->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we found the best. We check whether the hypersphere
|
// Now we found the best. We check whether the hypersphere
|
||||||
// intersect the hyperplane of the other branch
|
// intersect the hyperplane of the other branch
|
||||||
|
|
||||||
@ -435,11 +435,11 @@ namespace CosmoTool {
|
|||||||
{
|
{
|
||||||
coords x_new;
|
coords x_new;
|
||||||
r.getPosition(x_new);
|
r.getPosition(x_new);
|
||||||
recursiveNearest(root, 0, x_new, R2, best);
|
recursiveNearest(root, 0, x_new, R2, best);
|
||||||
}
|
}
|
||||||
while (r.next());
|
while (r.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,15 +474,15 @@ namespace CosmoTool {
|
|||||||
{
|
{
|
||||||
recursiveMultipleNearest(info, go, level+1);
|
recursiveMultipleNearest(info, go, level+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if current node is not the nearest
|
// Check if current node is not the nearest
|
||||||
CoordType thisR2 =
|
CoordType thisR2 =
|
||||||
computeDistance(node->value, info.x);
|
computeDistance(node->value, info.x);
|
||||||
info.queue.push(node->value, thisR2);
|
info.queue.push(node->value, thisR2);
|
||||||
info.traversed++;
|
info.traversed++;
|
||||||
// if (go == 0)
|
// if (go == 0)
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
// Now we found the best. We check whether the hypersphere
|
// Now we found the best. We check whether the hypersphere
|
||||||
// intersect the hyperplane of the other branch
|
// intersect the hyperplane of the other branch
|
||||||
|
|
||||||
@ -497,15 +497,15 @@ namespace CosmoTool {
|
|||||||
{
|
{
|
||||||
recursiveMultipleNearest(info, other, level+1);
|
recursiveMultipleNearest(info, other, level+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
void KDTree<N,ValType,CType,CellSplitter>::getNearestNeighbours(const coords& x, uint32_t N2,
|
void KDTree<N,ValType,CType,CellSplitter>::getNearestNeighbours(const coords& x, uint64_t N2,
|
||||||
Cell **cells)
|
Cell **cells)
|
||||||
{
|
{
|
||||||
RecursionMultipleInfo<N,ValType> info(x, cells, N2);
|
RecursionMultipleInfo<N,ValType> info(x, cells, N2);
|
||||||
|
|
||||||
for (int i = 0; i < N2; i++)
|
for (int i = 0; i < N2; i++)
|
||||||
cells[i] = 0;
|
cells[i] = 0;
|
||||||
|
|
||||||
@ -527,12 +527,12 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<int N, typename ValType, typename CType, typename CellSplitter>
|
template<int N, typename ValType, typename CType, typename CellSplitter>
|
||||||
void KDTree<N,ValType,CType,CellSplitter>::getNearestNeighbours(const coords& x, uint32_t N2,
|
void KDTree<N,ValType,CType,CellSplitter>::getNearestNeighbours(const coords& x, uint64_t N2,
|
||||||
Cell **cells,
|
Cell **cells,
|
||||||
CoordType *distances)
|
CoordType *distances)
|
||||||
{
|
{
|
||||||
RecursionMultipleInfo<N,ValType> info(x, cells, N2);
|
RecursionMultipleInfo<N,ValType> info(x, cells, N2);
|
||||||
|
|
||||||
for (int i = 0; i < N2; i++)
|
for (int i = 0; i < N2; i++)
|
||||||
cells[i] = 0;
|
cells[i] = 0;
|
||||||
|
|
||||||
@ -555,14 +555,14 @@ namespace CosmoTool {
|
|||||||
#ifdef __KD_TREE_SAVE_ON_DISK
|
#ifdef __KD_TREE_SAVE_ON_DISK
|
||||||
#define KDTREE_DISK_SIGNATURE "KDTREE"
|
#define KDTREE_DISK_SIGNATURE "KDTREE"
|
||||||
#define KDTREE_DISK_SIGNATURE_LEN 7
|
#define KDTREE_DISK_SIGNATURE_LEN 7
|
||||||
|
|
||||||
template<int N, typename CType>
|
template<int N, typename CType>
|
||||||
struct KDTreeOnDisk
|
struct KDTreeOnDisk
|
||||||
{
|
{
|
||||||
long cell_id;
|
long cell_id;
|
||||||
long children_node[2];
|
long children_node[2];
|
||||||
typename KDDef<N, CType>::KDCoordinates minBound, maxBound;
|
typename KDDef<N, CType>::KDCoordinates minBound, maxBound;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct KDTreeHeader
|
struct KDTreeHeader
|
||||||
{
|
{
|
||||||
@ -619,7 +619,7 @@ namespace CosmoTool {
|
|||||||
{
|
{
|
||||||
std::cerr << "KDTree Signature invalid" << std::endl;
|
std::cerr << "KDTree Signature invalid" << std::endl;
|
||||||
throw InvalidOnDiskKDTree();
|
throw InvalidOnDiskKDTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (h.numCells != Ncells || h.nodesUsed < 0) {
|
if (h.numCells != Ncells || h.nodesUsed < 0) {
|
||||||
std::cerr << "The number of cells has changed (" << h.numCells << " != " << Ncells << ") or nodesUsed=" << h.nodesUsed << std::endl;
|
std::cerr << "The number of cells has changed (" << h.numCells << " != " << Ncells << ") or nodesUsed=" << h.nodesUsed << std::endl;
|
||||||
@ -643,8 +643,8 @@ namespace CosmoTool {
|
|||||||
throw InvalidOnDiskKDTree();
|
throw InvalidOnDiskKDTree();
|
||||||
}
|
}
|
||||||
if (node_on_disk.cell_id > numNodes || node_on_disk.cell_id < 0 ||
|
if (node_on_disk.cell_id > numNodes || node_on_disk.cell_id < 0 ||
|
||||||
node_on_disk.children_node[0] > lastNode || node_on_disk.children_node[0] < -1 ||
|
(node_on_disk.children_node[0] >= 0 && node_on_disk.children_node[0] > lastNode) || node_on_disk.children_node[0] < -1 ||
|
||||||
node_on_disk.children_node[1] > lastNode || node_on_disk.children_node[1] < -1)
|
(node_on_disk.children_node[1] >= 0 && node_on_disk.children_node[1] > lastNode) || node_on_disk.children_node[1] < -1)
|
||||||
{
|
{
|
||||||
delete[] nodes;
|
delete[] nodes;
|
||||||
std::cerr << "Invalid cell id or children node id invalid" << std::endl;
|
std::cerr << "Invalid cell id or children node id invalid" << std::endl;
|
||||||
@ -683,10 +683,10 @@ namespace CosmoTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
root = &nodes[h.rootId];
|
root = &nodes[h.rootId];
|
||||||
|
|
||||||
sortingHelper = new Cell *[Ncells];
|
sortingHelper = new Cell *[Ncells];
|
||||||
for (NodeIntType i = 0; i < Ncells; i++)
|
for (NodeIntType i = 0; i < Ncells; i++)
|
||||||
sortingHelper[i] = &cells[i];
|
sortingHelper[i] = &cells[i];
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
30
src/numpy_adaptors.hpp
Normal file
30
src/numpy_adaptors.hpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef __COSMOTOOL_NUMPY_ADAPTOR_HPP
|
||||||
|
#define __COSMOTOOL_NUMPY_ADAPTOR_HPP
|
||||||
|
|
||||||
|
namespace CosmoTool {
|
||||||
|
|
||||||
|
template<typename T, typename IT>
|
||||||
|
void parallel_ufunc_dd_d(char **args, IT* dimensions, IT* steps, void *func) {
|
||||||
|
IT i;
|
||||||
|
IT n = dimensions[0];
|
||||||
|
char *in = args[0], *in2 = args[1], *out = args[2];
|
||||||
|
IT in_step = steps[0], in2_step = steps[1], out_step = steps[2];
|
||||||
|
|
||||||
|
double tmp;
|
||||||
|
typedef double (*F_t)(double,double);
|
||||||
|
|
||||||
|
F_t f = (F_t)func;
|
||||||
|
|
||||||
|
#pragma omp parallel for schedule(static)
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
T *out_t = (T *)(out + i * out_step);
|
||||||
|
T *in_t = (T *)(in + i * in_step);
|
||||||
|
T *in2_t = (T *)(in2 + i * in2_step);
|
||||||
|
*out_t = f(*in_t, *in2_t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -58,6 +58,7 @@ using namespace std;
|
|||||||
#define POWER_TEST 8
|
#define POWER_TEST 8
|
||||||
|
|
||||||
#define POWER_SPECTRUM POWER_EFSTATHIOU
|
#define POWER_SPECTRUM POWER_EFSTATHIOU
|
||||||
|
#define SAMPLE_WIGGLES 9
|
||||||
|
|
||||||
namespace Cosmology {
|
namespace Cosmology {
|
||||||
|
|
||||||
@ -206,6 +207,31 @@ double powG(double y)
|
|||||||
*/
|
*/
|
||||||
double powerSpectrum(double k, double normPower)
|
double powerSpectrum(double k, double normPower)
|
||||||
{
|
{
|
||||||
|
#if POWER_SPECTRUM == SAMPLE_WIGGLES
|
||||||
|
// BAO wiggle parameterization for reconstruction
|
||||||
|
// Babic et al. 2022, https://arxiv.org/abs/2203.06177
|
||||||
|
|
||||||
|
// No-wiggle transfer function
|
||||||
|
|
||||||
|
double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75)));
|
||||||
|
double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2);
|
||||||
|
double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4)));
|
||||||
|
double q = k/(h*GammaEff) * pow(Theta_27, 2);
|
||||||
|
double L_0 = log(2 * M_E + 1.8 * q);
|
||||||
|
double C_0 = 14.2 + 731 / (1 + 62.5 * q);
|
||||||
|
double T0 = L_0 / (L_0 + C_0 * q * q);
|
||||||
|
|
||||||
|
// Wiggle parameterization
|
||||||
|
|
||||||
|
double A = 0;
|
||||||
|
double r_s = 10;
|
||||||
|
double k_D = 2 * M_PI / 100;
|
||||||
|
|
||||||
|
double param = 1 + A * sin(k * r_s) * exp(- k / k_D);
|
||||||
|
|
||||||
|
return normPower * pow(k, n) * T0 * T0 * param;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if POWER_SPECTRUM == POWER_EFSTATHIOU
|
#if POWER_SPECTRUM == POWER_EFSTATHIOU
|
||||||
double a = 6.4/Gamma0;
|
double a = 6.4/Gamma0;
|
||||||
double b = 3/Gamma0;
|
double b = 3/Gamma0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*+
|
/*+
|
||||||
This is CosmoTool (./src/sphSmooth.hpp) -- Copyright (C) Guilhem Lavaux (2007-2014)
|
This is CosmoTool (./src/sphSmooth.hpp) -- Copyright (C) Guilhem Lavaux (2007-2022)
|
||||||
|
|
||||||
guilhem.lavaux@gmail.com
|
guilhem.lavaux@gmail.com
|
||||||
|
|
||||||
@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
|
|||||||
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
||||||
|
|
||||||
This software is governed by the CeCILL license under French law and
|
This software is governed by the CeCILL license under French law and
|
||||||
abiding by the rules of distribution of free software. You can use,
|
abiding by the rules of distribution of free software. You can use,
|
||||||
modify and/ or redistribute the software under the terms of the CeCILL
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
"http://www.cecill.info".
|
"http://www.cecill.info".
|
||||||
|
|
||||||
As a counterpart to the access to the source code and rights to copy,
|
As a counterpart to the access to the source code and rights to copy,
|
||||||
modify and redistribute granted by the license, users are provided only
|
modify and redistribute granted by the license, users are provided only
|
||||||
with a limited warranty and the software's author, the holder of the
|
with a limited warranty and the software's author, the holder of the
|
||||||
economic rights, and the successive licensors have only limited
|
economic rights, and the successive licensors have only limited
|
||||||
liability.
|
liability.
|
||||||
|
|
||||||
In this respect, the user's attention is drawn to the risks associated
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
with loading, using, modifying and/or developing or reproducing the
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
|
|||||||
therefore means that it is reserved for developers and experienced
|
therefore means that it is reserved for developers and experienced
|
||||||
professionals having in-depth computer knowledge. Users are therefore
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
encouraged to load and test the software's suitability as regards their
|
encouraged to load and test the software's suitability as regards their
|
||||||
requirements in conditions enabling the security of their systems and/or
|
requirements in conditions enabling the security of their systems and/or
|
||||||
data to be ensured and, more generally, to use and operate it in the
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
same conditions as regards security.
|
same conditions as regards security.
|
||||||
|
|
||||||
The fact that you are presently reading this means that you have had
|
The fact that you are presently reading this means that you have had
|
||||||
knowledge of the CeCILL license and that you accept its terms.
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
@ -39,80 +39,89 @@ knowledge of the CeCILL license and that you accept its terms.
|
|||||||
#include "config.hpp"
|
#include "config.hpp"
|
||||||
#include "mykdtree.hpp"
|
#include "mykdtree.hpp"
|
||||||
|
|
||||||
namespace CosmoTool
|
namespace CosmoTool {
|
||||||
{
|
|
||||||
template <typename ValType, int Ndims = NUMDIMS>
|
template <typename ValType, int Ndims = NUMDIMS>
|
||||||
class SPHSmooth
|
class SPHSmooth {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
ComputePrecision weight;
|
ComputePrecision weight;
|
||||||
ValType pValue;
|
ValType pValue;
|
||||||
} FullType;
|
} FullType;
|
||||||
|
|
||||||
typedef KDTree<Ndims,FullType> SPHTree;
|
typedef KDTree<Ndims, FullType> SPHTree;
|
||||||
typedef KDTreeNode<Ndims,FullType> SPHNode;
|
typedef KDTreeNode<Ndims, FullType> SPHNode;
|
||||||
typedef KDCell<Ndims,FullType> SPHCell;
|
typedef KDCell<Ndims, FullType> SPHCell;
|
||||||
typedef typename KDTree<Ndims,FullType>::CoordType CoordType;
|
typedef typename KDTree<Ndims, FullType>::CoordType CoordType;
|
||||||
|
|
||||||
typedef ComputePrecision (*computeParticleValue)(const ValType& t);
|
typedef ComputePrecision (*computeParticleValue)(const ValType &t);
|
||||||
typedef void (*runParticleValue)(ValType& t);
|
typedef void (*runParticleValue)(ValType &t);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef SPHCell *P_SPHCell;
|
typedef SPHCell *P_SPHCell;
|
||||||
struct SPHState
|
struct SPHState {
|
||||||
{
|
|
||||||
boost::shared_ptr<P_SPHCell[]> ngb;
|
boost::shared_ptr<P_SPHCell[]> ngb;
|
||||||
boost::shared_ptr<CoordType[]> distances;
|
boost::shared_ptr<CoordType[]> distances;
|
||||||
typename SPHTree::coords currentCenter;
|
typename SPHTree::coords currentCenter;
|
||||||
int currentNgb;
|
int currentNgb;
|
||||||
ComputePrecision smoothRadius;
|
ComputePrecision smoothRadius;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
SPHSmooth(SPHTree *tree, uint32_t Nsph);
|
|
||||||
virtual ~SPHSmooth();
|
|
||||||
|
|
||||||
void fetchNeighbours(const typename SPHTree::coords& c, SPHState *state = 0);
|
SPHSmooth(SPHTree *tree, uint32_t Nsph);
|
||||||
|
virtual ~SPHSmooth();
|
||||||
void fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNsph);
|
|
||||||
void fetchNeighboursOnVolume(const typename SPHTree::coords& c, ComputePrecision radius);
|
void
|
||||||
const typename SPHTree::coords& getCurrentCenter() const
|
fetchNeighbours(const typename SPHTree::coords &c, SPHState *state = 0);
|
||||||
{
|
|
||||||
|
void fetchNeighbours(
|
||||||
|
const typename SPHTree::coords &c, uint32_t newNsph,
|
||||||
|
SPHState *state = 0);
|
||||||
|
void fetchNeighboursOnVolume(
|
||||||
|
const typename SPHTree::coords &c, ComputePrecision radius);
|
||||||
|
const typename SPHTree::coords &getCurrentCenter() const {
|
||||||
return internal.currentCenter;
|
return internal.currentCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FuncT>
|
/** This is the pure SPH smoothing function. It does not reweight by the
|
||||||
ComputePrecision computeSmoothedValue(const typename SPHTree::coords& c,
|
* value computed at each grid site.
|
||||||
FuncT fun, SPHState *state = 0);
|
*/
|
||||||
|
template <typename FuncT>
|
||||||
template<typename FuncT>
|
ComputePrecision computeSmoothedValue(
|
||||||
ComputePrecision computeInterpolatedValue(const typename SPHTree::coords& c,
|
const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0);
|
||||||
FuncT fun, SPHState *state = 0);
|
|
||||||
|
|
||||||
ComputePrecision getMaxDistance(const typename SPHTree::coords& c,
|
|
||||||
SPHNode *node) const;
|
|
||||||
|
|
||||||
ComputePrecision getSmoothingLen() const
|
/** This is the weighted SPH smoothing function. It does reweight by the
|
||||||
{
|
* value computed at each grid site. This ensures the total sum of the interpolated
|
||||||
return internal.smoothRadius;
|
* quantity is preserved by interpolating to the target mesh.
|
||||||
}
|
*/
|
||||||
|
template <typename FuncT>
|
||||||
|
ComputePrecision computeInterpolatedValue(
|
||||||
|
const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0);
|
||||||
|
|
||||||
|
/** This is the adjoint gradient of computeInterpolatedValue w.r.t. to the value
|
||||||
|
* array. FuncT is expected to have the following prototype:
|
||||||
|
* void((CellValue defined by the user), ComputePrecision weighted_ag_value)
|
||||||
|
*/
|
||||||
|
template <typename FuncT>
|
||||||
|
void computeAdjointGradientSmoothedValue(
|
||||||
|
const typename SPHTree::coords &c, ComputePrecision ag_value, FuncT fun,
|
||||||
|
SPHState *state = 0);
|
||||||
|
|
||||||
|
ComputePrecision
|
||||||
|
getMaxDistance(const typename SPHTree::coords &c, SPHNode *node) const;
|
||||||
|
|
||||||
|
ComputePrecision getSmoothingLen() const { return internal.smoothRadius; }
|
||||||
|
|
||||||
// TO USE WITH EXTREME CARE !
|
// TO USE WITH EXTREME CARE !
|
||||||
void setSmoothingLen(ComputePrecision len)
|
void setSmoothingLen(ComputePrecision len) { internal.smoothRadius = len; }
|
||||||
{
|
|
||||||
internal.smoothRadius = len;
|
|
||||||
}
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
template<typename FuncT>
|
template <typename FuncT>
|
||||||
void runForEachNeighbour(FuncT fun, SPHState *state = 0);
|
void runForEachNeighbour(FuncT fun, SPHState *state = 0);
|
||||||
void addGridSite(const typename SPHTree::coords& c);
|
void addGridSite(const typename SPHTree::coords &c, SPHState *state);
|
||||||
|
void addGridSite(const typename SPHTree::coords &c);
|
||||||
|
|
||||||
bool hasNeighbours() const;
|
bool hasNeighbours() const;
|
||||||
|
|
||||||
virtual ComputePrecision getKernel(ComputePrecision d) const;
|
virtual ComputePrecision getKernel(ComputePrecision d) const;
|
||||||
|
|
||||||
SPHTree *getTree() { return tree; }
|
SPHTree *getTree() { return tree; }
|
||||||
|
|
||||||
@ -125,29 +134,29 @@ namespace CosmoTool
|
|||||||
uint32_t getCurrent() const { return internal.currentNgb; }
|
uint32_t getCurrent() const { return internal.currentNgb; }
|
||||||
|
|
||||||
uint32_t getNgb() const { return maxNgb; }
|
uint32_t getNgb() const { return maxNgb; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SPHState internal;
|
SPHState internal;
|
||||||
uint32_t Nsph;
|
uint32_t Nsph;
|
||||||
uint32_t deltaNsph;
|
uint32_t deltaNsph;
|
||||||
uint32_t maxNgb;
|
uint32_t maxNgb;
|
||||||
SPHTree *tree;
|
SPHTree *tree;
|
||||||
|
|
||||||
template<typename FuncT>
|
template <typename FuncT>
|
||||||
ComputePrecision computeWValue(const typename SPHTree::coords & c,
|
ComputePrecision computeWValue(
|
||||||
SPHCell& cell,
|
const typename SPHTree::coords &c, SPHCell &cell, CoordType d,
|
||||||
CoordType d,
|
FuncT fun, SPHState *state);
|
||||||
FuncT fun, SPHState *state);
|
|
||||||
|
template <typename FuncT>
|
||||||
template<typename FuncT>
|
void runUnrollNode(SPHNode *node, FuncT fun);
|
||||||
void runUnrollNode(SPHNode *node,
|
|
||||||
FuncT fun);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class ValType1, class ValType2, int Ndims>
|
template <class ValType1, class ValType2, int Ndims>
|
||||||
bool operator<(const SPHSmooth<ValType1, Ndims>& s1, const SPHSmooth<ValType2, Ndims>& s2);
|
bool operator<(
|
||||||
|
const SPHSmooth<ValType1, Ndims> &s1,
|
||||||
|
const SPHSmooth<ValType2, Ndims> &s2);
|
||||||
|
|
||||||
};
|
}; // namespace CosmoTool
|
||||||
|
|
||||||
#include "sphSmooth.tcc"
|
#include "sphSmooth.tcc"
|
||||||
|
|
||||||
|
@ -3,225 +3,248 @@
|
|||||||
|
|
||||||
namespace CosmoTool {
|
namespace CosmoTool {
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
SPHSmooth<ValType,Ndims>::SPHSmooth(SPHTree *tree, uint32_t Nsph)
|
SPHSmooth<ValType, Ndims>::SPHSmooth(SPHTree *tree, uint32_t Nsph) {
|
||||||
{
|
this->Nsph = Nsph;
|
||||||
this->Nsph = Nsph;
|
this->tree = tree;
|
||||||
this->tree = tree;
|
internal.currentNgb = 0;
|
||||||
internal.currentNgb = 0;
|
|
||||||
|
|
||||||
this->maxNgb = Nsph;
|
this->maxNgb = Nsph;
|
||||||
internal.ngb = boost::shared_ptr<SPHCell *[]>(new SPHCell *[maxNgb]);
|
internal.ngb = boost::shared_ptr<SPHCell *[]>(new SPHCell *[maxNgb]);
|
||||||
internal.distances = boost::shared_ptr<CoordType[]>(new CoordType[maxNgb]);
|
internal.distances = boost::shared_ptr<CoordType[]>(new CoordType[maxNgb]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
SPHSmooth<ValType,Ndims>::~SPHSmooth()
|
SPHSmooth<ValType, Ndims>::~SPHSmooth() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
template<typename FuncT>
|
template <typename FuncT>
|
||||||
ComputePrecision SPHSmooth<ValType,Ndims>::computeWValue(const typename SPHTree::coords& c,
|
ComputePrecision SPHSmooth<ValType, Ndims>::computeWValue(
|
||||||
SPHCell& cell,
|
const typename SPHTree::coords &c, SPHCell &cell, CoordType d, FuncT fun,
|
||||||
CoordType d,
|
SPHState *state) {
|
||||||
FuncT fun, SPHState *state)
|
CoordType weight;
|
||||||
{
|
|
||||||
CoordType weight;
|
|
||||||
|
|
||||||
d /= state->smoothRadius;
|
d /= state->smoothRadius;
|
||||||
weight = getKernel(d);
|
weight = getKernel(d);
|
||||||
|
|
||||||
if (cell.val.weight != 0)
|
if (cell.val.weight != 0)
|
||||||
return weight * fun(cell.val.pValue) / cell.val.weight;
|
return weight * fun(cell.val.pValue) / cell.val.weight;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
void
|
void SPHSmooth<ValType, Ndims>::fetchNeighbours(
|
||||||
SPHSmooth<ValType,Ndims>::fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNngb)
|
const typename SPHTree::coords &c, uint32_t newNngb, SPHState *state) {
|
||||||
{
|
ComputePrecision d2, max_dist = 0;
|
||||||
ComputePrecision d2, max_dist = 0;
|
uint32_t requested = newNngb;
|
||||||
uint32_t requested = newNngb;
|
|
||||||
|
|
||||||
if (requested > maxNgb)
|
if (state != 0) {
|
||||||
{
|
state->distances = boost::shared_ptr<CoordType[]>(new CoordType[newNngb]);
|
||||||
maxNgb = requested;
|
state->ngb = boost::shared_ptr<SPHCell *[]>(new SPHCell *[newNngb]);
|
||||||
internal.ngb = boost::shared_ptr<P_SPHCell[]>(new P_SPHCell[maxNgb]);
|
} else {
|
||||||
internal.distances = boost::shared_ptr<CoordType[]>(new CoordType[maxNgb]);
|
state = &internal;
|
||||||
|
if (requested > maxNgb) {
|
||||||
|
maxNgb = requested;
|
||||||
|
internal.ngb = boost::shared_ptr<P_SPHCell[]>(new P_SPHCell[maxNgb]);
|
||||||
|
internal.distances =
|
||||||
|
boost::shared_ptr<CoordType[]>(new CoordType[maxNgb]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(internal.currentCenter, c, sizeof(c));
|
memcpy(state->currentCenter, c, sizeof(c));
|
||||||
tree->getNearestNeighbours(c, requested, (SPHCell **)internal.ngb.get(), (CoordType*)internal.distances.get());
|
tree->getNearestNeighbours(
|
||||||
|
c, requested, (SPHCell **)state->ngb.get(),
|
||||||
|
(CoordType *)state->distances.get());
|
||||||
|
|
||||||
internal.currentNgb = 0;
|
state->currentNgb = 0;
|
||||||
for (uint32_t i = 0; i < requested && (internal.ngb)[i] != 0; i++,internal.currentNgb++)
|
for (uint32_t i = 0; i < requested && (state->ngb)[i] != 0;
|
||||||
{
|
i++, state->currentNgb++) {
|
||||||
internal.distances[i] = sqrt(internal.distances[i]);
|
state->distances[i] = sqrt(state->distances[i]);
|
||||||
d2 = internal.distances[i];
|
d2 = state->distances[i];
|
||||||
if (d2 > max_dist)
|
if (d2 > max_dist)
|
||||||
max_dist = d2;
|
max_dist = d2;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal.smoothRadius = max_dist / 2;
|
state->smoothRadius = max_dist / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
void SPHSmooth<ValType,Ndims>::fetchNeighbours(const typename SPHTree::coords& c, SPHState *state)
|
void SPHSmooth<ValType, Ndims>::fetchNeighbours(
|
||||||
{
|
const typename SPHTree::coords &c, SPHState *state) {
|
||||||
ComputePrecision d2, max_dist = 0;
|
ComputePrecision d2, max_dist = 0;
|
||||||
uint32_t requested = Nsph;
|
uint32_t requested = Nsph;
|
||||||
|
|
||||||
if (state != 0) {
|
if (state != 0) {
|
||||||
state->distances = boost::shared_ptr<CoordType[]>(new CoordType[Nsph]);
|
state->distances = boost::shared_ptr<CoordType[]>(new CoordType[Nsph]);
|
||||||
state->ngb = boost::shared_ptr<SPHCell *[]>(new SPHCell *[Nsph]);
|
state->ngb = boost::shared_ptr<SPHCell *[]>(new SPHCell *[Nsph]);
|
||||||
} else
|
} else
|
||||||
state = &internal;
|
state = &internal;
|
||||||
|
|
||||||
memcpy(state->currentCenter, c, sizeof(c));
|
|
||||||
|
|
||||||
tree->getNearestNeighbours(c, requested, state->ngb.get(), state->distances.get());
|
|
||||||
|
|
||||||
state->currentNgb = 0;
|
memcpy(state->currentCenter, c, sizeof(c));
|
||||||
for (uint32_t i = 0; i < requested && state->ngb[i] != 0; i++,state->currentNgb++)
|
|
||||||
{
|
tree->getNearestNeighbours(
|
||||||
|
c, requested, state->ngb.get(), state->distances.get());
|
||||||
|
|
||||||
|
state->currentNgb = 0;
|
||||||
|
for (uint32_t i = 0; i < requested && state->ngb[i] != 0;
|
||||||
|
i++, state->currentNgb++) {
|
||||||
|
d2 = state->distances[i] = sqrt(state->distances[i]);
|
||||||
|
if (d2 > max_dist)
|
||||||
|
max_dist = d2;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->smoothRadius = max_dist / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename ValType, int Ndims>
|
||||||
|
void SPHSmooth<ValType, Ndims>::fetchNeighboursOnVolume(
|
||||||
|
const typename SPHTree::coords &c, ComputePrecision radius) {
|
||||||
|
uint32_t numPart;
|
||||||
|
ComputePrecision d2, max_dist = 0;
|
||||||
|
|
||||||
|
memcpy(internal.currentCenter, c, sizeof(c));
|
||||||
|
|
||||||
|
internal.currentNgb = tree->getIntersection(
|
||||||
|
c, radius, internal.ngb, internal.distances, maxNgb);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < internal.currentNgb; i++) {
|
||||||
d2 = internal.distances[i] = sqrt(internal.distances[i]);
|
d2 = internal.distances[i] = sqrt(internal.distances[i]);
|
||||||
if (d2 > max_dist)
|
if (d2 > max_dist)
|
||||||
max_dist = d2;
|
max_dist = d2;
|
||||||
}
|
}
|
||||||
|
internal.smoothRadius = max_dist / 2;
|
||||||
|
}
|
||||||
|
|
||||||
state->smoothRadius = max_dist / 2;
|
template <typename ValType, int Ndims>
|
||||||
}
|
template <typename FuncT>
|
||||||
|
ComputePrecision SPHSmooth<ValType, Ndims>::computeSmoothedValue(
|
||||||
|
const typename SPHTree::coords &c, FuncT fun, SPHState *state) {
|
||||||
|
if (state == 0)
|
||||||
|
state = &internal;
|
||||||
|
|
||||||
|
ComputePrecision outputValue = 0;
|
||||||
|
ComputePrecision max_dist = 0;
|
||||||
|
ComputePrecision r3 = cube(state->smoothRadius);
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
void
|
outputValue +=
|
||||||
SPHSmooth<ValType,Ndims>::fetchNeighboursOnVolume(const typename SPHTree::coords& c,
|
computeWValue(c, *state->ngb[i], state->distances[i], fun, state);
|
||||||
ComputePrecision radius)
|
|
||||||
{
|
|
||||||
uint32_t numPart;
|
|
||||||
ComputePrecision d2, max_dist = 0;
|
|
||||||
|
|
||||||
memcpy(internal.currentCenter, c, sizeof(c));
|
|
||||||
|
|
||||||
internal.currentNgb = tree->getIntersection(c, radius, internal.ngb, internal.distances,
|
|
||||||
maxNgb);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < internal.currentNgb; i++)
|
|
||||||
{
|
|
||||||
d2 = internal.distances[i] = sqrt(internal.distances[i]);
|
|
||||||
if (d2 > max_dist)
|
|
||||||
max_dist = d2;
|
|
||||||
}
|
|
||||||
internal.smoothRadius = max_dist / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
|
||||||
template<typename FuncT>
|
|
||||||
ComputePrecision
|
|
||||||
SPHSmooth<ValType,Ndims>::computeSmoothedValue(const typename SPHTree::coords& c,
|
|
||||||
FuncT fun, SPHState *state)
|
|
||||||
{
|
|
||||||
if (state == 0)
|
|
||||||
state = &internal;
|
|
||||||
|
|
||||||
ComputePrecision outputValue = 0;
|
|
||||||
ComputePrecision max_dist = 0;
|
|
||||||
ComputePrecision r3 = cube(state->smoothRadius);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < state->currentNgb; i++)
|
|
||||||
{
|
|
||||||
outputValue += computeWValue(c, *state->ngb[i], state->distances[i], fun, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return outputValue / r3;
|
return outputValue / r3;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType>
|
template <typename ValType>
|
||||||
ComputePrecision interpolateOne(const ValType& t)
|
ComputePrecision interpolateOne(const ValType &t) {
|
||||||
{
|
return 1.0;
|
||||||
return 1.0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// WARNING ! Cell's weight must be 1 !!!
|
template <typename ValType, int Ndims>
|
||||||
template<typename ValType, int Ndims>
|
template <typename FuncT>
|
||||||
template<typename FuncT>
|
void SPHSmooth<ValType, Ndims>::computeAdjointGradientSmoothedValue(
|
||||||
ComputePrecision SPHSmooth<ValType,Ndims>::computeInterpolatedValue(const typename SPHTree::coords& c,
|
const typename SPHTree::coords &c, ComputePrecision ag_value, FuncT fun,
|
||||||
FuncT fun, SPHState *state)
|
SPHState *state) {
|
||||||
{
|
if (state == 0)
|
||||||
if (state == 0)
|
state = &internal;
|
||||||
state = &internal;
|
|
||||||
|
|
||||||
ComputePrecision outputValue = 0;
|
|
||||||
ComputePrecision max_dist = 0;
|
|
||||||
ComputePrecision weight = 0;
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < state->currentNgb; i++)
|
ComputePrecision outputValue = 0;
|
||||||
{
|
ComputePrecision max_dist = 0;
|
||||||
|
ComputePrecision weight = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
|
weight +=
|
||||||
|
computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
|
auto &cell = *state->ngb[i];
|
||||||
|
double partial_ag =
|
||||||
|
computeWValue(
|
||||||
|
c, cell, state->distances[i],
|
||||||
|
[ag_value](ComputePrecision) { return ag_value; }) /
|
||||||
|
weight;
|
||||||
|
fun(cell.val.pValue, ag_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WARNING ! Cell's weight must be 1 !!!
|
||||||
|
template <typename ValType, int Ndims>
|
||||||
|
template <typename FuncT>
|
||||||
|
ComputePrecision SPHSmooth<ValType, Ndims>::computeInterpolatedValue(
|
||||||
|
const typename SPHTree::coords &c, FuncT fun, SPHState *state) {
|
||||||
|
if (state == 0)
|
||||||
|
state = &internal;
|
||||||
|
|
||||||
|
ComputePrecision outputValue = 0;
|
||||||
|
ComputePrecision max_dist = 0;
|
||||||
|
ComputePrecision weight = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
outputValue += computeWValue(c, *state->ngb[i], state->distances[i], fun);
|
outputValue += computeWValue(c, *state->ngb[i], state->distances[i], fun);
|
||||||
weight += computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne);
|
weight +=
|
||||||
|
computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (outputValue == 0) ? 0 : (outputValue / weight);
|
return (outputValue == 0) ? 0 : (outputValue / weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
template<typename FuncT>
|
template <typename FuncT>
|
||||||
void SPHSmooth<ValType,Ndims>::runForEachNeighbour(FuncT fun, SPHState *state)
|
void
|
||||||
{
|
SPHSmooth<ValType, Ndims>::runForEachNeighbour(FuncT fun, SPHState *state) {
|
||||||
if (state == 0)
|
if (state == 0)
|
||||||
state = &internal;
|
state = &internal;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < state->currentNgb; i++)
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
{
|
|
||||||
fun(state->ngb[i]);
|
fun(state->ngb[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ValType, int Ndims>
|
||||||
|
void SPHSmooth<ValType, Ndims>::addGridSite(
|
||||||
|
const typename SPHTree::coords &c, SPHState *state) {
|
||||||
|
ComputePrecision outputValue = 0;
|
||||||
|
ComputePrecision max_dist = 0;
|
||||||
|
ComputePrecision r3 = cube(state->smoothRadius);
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
for (uint32_t i = 0; i < state->currentNgb; i++) {
|
||||||
void SPHSmooth<ValType,Ndims>::addGridSite(const typename SPHTree::coords& c)
|
ComputePrecision d = state->distances[i];
|
||||||
{
|
SPHCell &cell = *(state->ngb[i]);
|
||||||
ComputePrecision outputValue = 0;
|
double kernel_value = getKernel(d / state->smoothRadius) / r3;
|
||||||
ComputePrecision max_dist = 0;
|
#pragma omp atomic update
|
||||||
|
cell.val.weight += kernel_value;
|
||||||
ComputePrecision r3 = cube(internal.smoothRadius);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < internal.currentNgb; i++)
|
|
||||||
{
|
|
||||||
ComputePrecision d = internal.distances[i];
|
|
||||||
SPHCell& cell = *(internal.ngb[i]);
|
|
||||||
cell.val.weight += getKernel(d/internal.smoothRadius) / r3;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
ComputePrecision
|
void
|
||||||
SPHSmooth<ValType,Ndims>::getKernel(ComputePrecision x) const
|
SPHSmooth<ValType, Ndims>::addGridSite(const typename SPHTree::coords &c) {
|
||||||
{
|
addGridSite(c, &internal);
|
||||||
// WARNING !!! This is an unnormalized version of the kernel.
|
}
|
||||||
if (x < 1)
|
|
||||||
return 1 - 1.5 * x * x + 0.75 * x * x * x;
|
template <typename ValType, int Ndims>
|
||||||
else if (x < 2)
|
ComputePrecision
|
||||||
{
|
SPHSmooth<ValType, Ndims>::getKernel(ComputePrecision x) const {
|
||||||
|
// WARNING !!! This is an unnormalized version of the kernel.
|
||||||
|
if (x < 1)
|
||||||
|
return 1 - 1.5 * x * x + 0.75 * x * x * x;
|
||||||
|
else if (x < 2) {
|
||||||
ComputePrecision d = 2 - x;
|
ComputePrecision d = 2 - x;
|
||||||
return 0.25 * d * d * d;
|
return 0.25 * d * d * d;
|
||||||
}
|
} else
|
||||||
else
|
return 0;
|
||||||
return 0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ValType, int Ndims>
|
template <typename ValType, int Ndims>
|
||||||
bool SPHSmooth<ValType,Ndims>::hasNeighbours() const
|
bool SPHSmooth<ValType, Ndims>::hasNeighbours() const {
|
||||||
{
|
return (internal.currentNgb != 0);
|
||||||
return (internal.currentNgb != 0);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template<class ValType1, class ValType2, int Ndims>
|
template <class ValType1, class ValType2, int Ndims>
|
||||||
bool operator<(const SPHSmooth<ValType1, Ndims>& s1, const SPHSmooth<ValType2, Ndims>& s2)
|
bool operator<(
|
||||||
{
|
const SPHSmooth<ValType1, Ndims> &s1,
|
||||||
return (s1.getSmoothingLen() < s2.getSmoothingLen());
|
const SPHSmooth<ValType2, Ndims> &s2) {
|
||||||
}
|
return (s1.getSmoothingLen() < s2.getSmoothingLen());
|
||||||
|
}
|
||||||
};
|
}; // namespace CosmoTool
|
||||||
|
@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
|
|||||||
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
||||||
|
|
||||||
This software is governed by the CeCILL license under French law and
|
This software is governed by the CeCILL license under French law and
|
||||||
abiding by the rules of distribution of free software. You can use,
|
abiding by the rules of distribution of free software. You can use,
|
||||||
modify and/ or redistribute the software under the terms of the CeCILL
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
"http://www.cecill.info".
|
"http://www.cecill.info".
|
||||||
|
|
||||||
As a counterpart to the access to the source code and rights to copy,
|
As a counterpart to the access to the source code and rights to copy,
|
||||||
modify and redistribute granted by the license, users are provided only
|
modify and redistribute granted by the license, users are provided only
|
||||||
with a limited warranty and the software's author, the holder of the
|
with a limited warranty and the software's author, the holder of the
|
||||||
economic rights, and the successive licensors have only limited
|
economic rights, and the successive licensors have only limited
|
||||||
liability.
|
liability.
|
||||||
|
|
||||||
In this respect, the user's attention is drawn to the risks associated
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
with loading, using, modifying and/or developing or reproducing the
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
|
|||||||
therefore means that it is reserved for developers and experienced
|
therefore means that it is reserved for developers and experienced
|
||||||
professionals having in-depth computer knowledge. Users are therefore
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
encouraged to load and test the software's suitability as regards their
|
encouraged to load and test the software's suitability as regards their
|
||||||
requirements in conditions enabling the security of their systems and/or
|
requirements in conditions enabling the security of their systems and/or
|
||||||
data to be ensured and, more generally, to use and operate it in the
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
same conditions as regards security.
|
same conditions as regards security.
|
||||||
|
|
||||||
The fact that you are presently reading this means that you have had
|
The fact that you are presently reading this means that you have had
|
||||||
knowledge of the CeCILL license and that you accept its terms.
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
@ -42,7 +42,7 @@ knowledge of the CeCILL license and that you accept its terms.
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
namespace CosmoTool
|
namespace CosmoTool
|
||||||
{
|
{
|
||||||
|
|
||||||
class ProgressiveDoubleOutputImpl
|
class ProgressiveDoubleOutputImpl
|
||||||
@ -75,7 +75,7 @@ namespace CosmoTool
|
|||||||
bool initialized;
|
bool initialized;
|
||||||
int *ref;
|
int *ref;
|
||||||
ProgressiveDoubleOutputImpl *impl;
|
ProgressiveDoubleOutputImpl *impl;
|
||||||
|
|
||||||
friend ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
friend ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
||||||
void decRef();
|
void decRef();
|
||||||
public:
|
public:
|
||||||
@ -86,7 +86,7 @@ namespace CosmoTool
|
|||||||
|
|
||||||
virtual void addDouble(double a);
|
virtual void addDouble(double a);
|
||||||
|
|
||||||
const ProgressiveDoubleOutput& operator=(const ProgressiveDoubleOutput& b);
|
const ProgressiveDoubleOutput& operator=(const ProgressiveDoubleOutput& b);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -95,12 +95,12 @@ namespace CosmoTool
|
|||||||
private:
|
private:
|
||||||
int *ref;
|
int *ref;
|
||||||
ProgressiveInputImpl<T> *impl;
|
ProgressiveInputImpl<T> *impl;
|
||||||
|
|
||||||
void decRef()
|
void decRef()
|
||||||
{
|
{
|
||||||
if (ref == 0)
|
if (ref == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
(*ref)--;
|
(*ref)--;
|
||||||
if (*ref == 0)
|
if (*ref == 0)
|
||||||
{
|
{
|
||||||
@ -112,17 +112,17 @@ namespace CosmoTool
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ProgressiveInput<T>
|
static ProgressiveInput<T>
|
||||||
loadArrayProgressive(const std::string& fname, uint32_t *&dimList,
|
loadArrayProgressive(const std::string& fname, uint32_t *&dimList,
|
||||||
uint32_t& rank);
|
uint32_t& rank);
|
||||||
|
|
||||||
ProgressiveInput() {
|
ProgressiveInput() {
|
||||||
impl = 0;
|
impl = 0;
|
||||||
ref = 0;
|
ref = 0;
|
||||||
}
|
}
|
||||||
ProgressiveInput(ProgressiveInputImpl<T> *i) {
|
ProgressiveInput(ProgressiveInputImpl<T> *i) {
|
||||||
impl = i;
|
impl = i;
|
||||||
ref = new int;
|
ref = new int;
|
||||||
*ref = 1;
|
*ref = 1;
|
||||||
}
|
}
|
||||||
ProgressiveInput(const ProgressiveInput<T>& o) {
|
ProgressiveInput(const ProgressiveInput<T>& o) {
|
||||||
@ -161,12 +161,12 @@ namespace CosmoTool
|
|||||||
private:
|
private:
|
||||||
int *ref;
|
int *ref;
|
||||||
ProgressiveOutputImpl<T> *impl;
|
ProgressiveOutputImpl<T> *impl;
|
||||||
|
|
||||||
void decRef()
|
void decRef()
|
||||||
{
|
{
|
||||||
if (ref == 0)
|
if (ref == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
(*ref)--;
|
(*ref)--;
|
||||||
if (*ref == 0)
|
if (*ref == 0)
|
||||||
{
|
{
|
||||||
@ -178,17 +178,17 @@ namespace CosmoTool
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ProgressiveOutput<T>
|
static ProgressiveOutput<T>
|
||||||
saveArrayProgressive(const std::string& fname, uint32_t *dimList,
|
saveArrayProgressive(const std::string& fname, uint32_t *dimList,
|
||||||
uint32_t rank);
|
uint32_t rank);
|
||||||
|
|
||||||
ProgressiveOutput() {
|
ProgressiveOutput() {
|
||||||
impl = 0;
|
impl = 0;
|
||||||
ref = 0;
|
ref = 0;
|
||||||
}
|
}
|
||||||
ProgressiveOutput(ProgressiveOutputImpl<T> *i) {
|
ProgressiveOutput(ProgressiveOutputImpl<T> *i) {
|
||||||
impl = i;
|
impl = i;
|
||||||
ref = new int;
|
ref = new int;
|
||||||
*ref = 1;
|
*ref = 1;
|
||||||
}
|
}
|
||||||
ProgressiveOutput(const ProgressiveOutput<T>& o) {
|
ProgressiveOutput(const ProgressiveOutput<T>& o) {
|
||||||
@ -222,10 +222,9 @@ namespace CosmoTool
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void loadArray(const std::string& fname,
|
void loadArray(const std::string& fname,
|
||||||
T*& array, uint32_t *& dimList, uint32_t& rank)
|
T*& array, uint32_t *& dimList, uint32_t& rank);
|
||||||
throw (NoSuchFileException);
|
|
||||||
|
|
||||||
ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
ProgressiveDoubleOutput saveDoubleArrayProgressive(const char *fname, uint32_t *dimList, uint32_t rank);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -260,7 +260,6 @@ namespace CosmoTool {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
void loadArray(const std::string& fname,
|
void loadArray(const std::string& fname,
|
||||||
T*&array, uint32_t *&dimList, uint32_t& rank)
|
T*&array, uint32_t *&dimList, uint32_t& rank)
|
||||||
throw (NoSuchFileException)
|
|
||||||
{
|
{
|
||||||
NcFile f(fname.c_str(), NcFile::ReadOnly);
|
NcFile f(fname.c_str(), NcFile::ReadOnly);
|
||||||
|
|
||||||
|
@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
|
|||||||
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
|
||||||
|
|
||||||
This software is governed by the CeCILL license under French law and
|
This software is governed by the CeCILL license under French law and
|
||||||
abiding by the rules of distribution of free software. You can use,
|
abiding by the rules of distribution of free software. You can use,
|
||||||
modify and/ or redistribute the software under the terms of the CeCILL
|
modify and/ or redistribute the software under the terms of the CeCILL
|
||||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||||
"http://www.cecill.info".
|
"http://www.cecill.info".
|
||||||
|
|
||||||
As a counterpart to the access to the source code and rights to copy,
|
As a counterpart to the access to the source code and rights to copy,
|
||||||
modify and redistribute granted by the license, users are provided only
|
modify and redistribute granted by the license, users are provided only
|
||||||
with a limited warranty and the software's author, the holder of the
|
with a limited warranty and the software's author, the holder of the
|
||||||
economic rights, and the successive licensors have only limited
|
economic rights, and the successive licensors have only limited
|
||||||
liability.
|
liability.
|
||||||
|
|
||||||
In this respect, the user's attention is drawn to the risks associated
|
In this respect, the user's attention is drawn to the risks associated
|
||||||
with loading, using, modifying and/or developing or reproducing the
|
with loading, using, modifying and/or developing or reproducing the
|
||||||
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
|
|||||||
therefore means that it is reserved for developers and experienced
|
therefore means that it is reserved for developers and experienced
|
||||||
professionals having in-depth computer knowledge. Users are therefore
|
professionals having in-depth computer knowledge. Users are therefore
|
||||||
encouraged to load and test the software's suitability as regards their
|
encouraged to load and test the software's suitability as regards their
|
||||||
requirements in conditions enabling the security of their systems and/or
|
requirements in conditions enabling the security of their systems and/or
|
||||||
data to be ensured and, more generally, to use and operate it in the
|
data to be ensured and, more generally, to use and operate it in the
|
||||||
same conditions as regards security.
|
same conditions as regards security.
|
||||||
|
|
||||||
The fact that you are presently reading this means that you have had
|
The fact that you are presently reading this means that you have had
|
||||||
knowledge of the CeCILL license and that you accept its terms.
|
knowledge of the CeCILL license and that you accept its terms.
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
vector<size_t> counts;
|
vector<size_t> counts;
|
||||||
vector<NcDim> dimList;
|
vector<NcDim> dimList;
|
||||||
uint32_t rank;
|
uint32_t rank;
|
||||||
|
|
||||||
NetCDF_handle(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank);
|
NetCDF_handle(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank);
|
||||||
virtual ~NetCDF_handle();
|
virtual ~NetCDF_handle();
|
||||||
};
|
};
|
||||||
@ -86,14 +86,14 @@ public:
|
|||||||
InputGenCDF(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank)
|
InputGenCDF(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank)
|
||||||
: NetCDF_handle(f,v,dimList,rank)
|
: NetCDF_handle(f,v,dimList,rank)
|
||||||
{}
|
{}
|
||||||
virtual ~InputGenCDF() {}
|
virtual ~InputGenCDF() {}
|
||||||
|
|
||||||
virtual T read()
|
virtual T read()
|
||||||
{
|
{
|
||||||
T a;
|
T a;
|
||||||
|
|
||||||
curVar.getVar(curPos, counts, &a);
|
curVar.getVar(curPos, counts, &a);
|
||||||
|
|
||||||
curPos[rank-1]++;
|
curPos[rank-1]++;
|
||||||
for (long i = rank-1; i >= 1; i--)
|
for (long i = rank-1; i >= 1; i--)
|
||||||
{
|
{
|
||||||
@ -102,7 +102,7 @@ public:
|
|||||||
curPos[i-1]++;
|
curPos[i-1]++;
|
||||||
curPos[i] = 0;
|
curPos[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,12 +120,12 @@ public:
|
|||||||
OutputGenCDF(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank)
|
OutputGenCDF(NcFile *f, NcVar v, vector<NcDim>& dimList, uint32_t rank)
|
||||||
: NetCDF_handle(f,v,dimList,rank)
|
: NetCDF_handle(f,v,dimList,rank)
|
||||||
{}
|
{}
|
||||||
virtual ~OutputGenCDF() {}
|
virtual ~OutputGenCDF() {}
|
||||||
|
|
||||||
virtual void put(T a)
|
virtual void put(T a)
|
||||||
{
|
{
|
||||||
curVar.putVar(curPos, counts, &a);
|
curVar.putVar(curPos, counts, &a);
|
||||||
|
|
||||||
curPos[rank-1]++;
|
curPos[rank-1]++;
|
||||||
for (long i = rank-1; i >= 1; i--)
|
for (long i = rank-1; i >= 1; i--)
|
||||||
{
|
{
|
||||||
@ -134,7 +134,7 @@ public:
|
|||||||
curPos[i-1]++;
|
curPos[i-1]++;
|
||||||
curPos[i] = 0;
|
curPos[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -159,17 +159,17 @@ namespace CosmoTool {
|
|||||||
uint32_t rank)
|
uint32_t rank)
|
||||||
{
|
{
|
||||||
NcFile *f = new NcFile(fname, NcFile::replace);
|
NcFile *f = new NcFile(fname, NcFile::replace);
|
||||||
|
|
||||||
vector<NcDim> dimArray;
|
vector<NcDim> dimArray;
|
||||||
for (uint32_t i = 0; i < rank; i++)
|
for (uint32_t i = 0; i < rank; i++)
|
||||||
{
|
{
|
||||||
char dimName[255];
|
char dimName[255];
|
||||||
|
|
||||||
sprintf(dimName, "dim%d", i);
|
sprintf(dimName, "dim%d", i);
|
||||||
dimArray.push_back(f->addDim(dimName, dimList[rank-1-i]));
|
dimArray.push_back(f->addDim(dimName, dimList[rank-1-i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
NcVar v = f->addVar("array", get_NetCDF_type<T>(), dimArray);
|
NcVar v = f->addVar("array", get_NetCDF_type<T>(), dimArray);
|
||||||
|
|
||||||
vector<NcDim> ldimList;
|
vector<NcDim> ldimList;
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ namespace CosmoTool {
|
|||||||
ldimList.push_back(dimArray[i]);
|
ldimList.push_back(dimArray[i]);
|
||||||
|
|
||||||
OutputGenCDF<T> *impl = new OutputGenCDF<T>(f, v, ldimList, rank);
|
OutputGenCDF<T> *impl = new OutputGenCDF<T>(f, v, ldimList, rank);
|
||||||
return ProgressiveOutput<T>(impl);
|
return ProgressiveOutput<T>(impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -206,32 +206,31 @@ namespace CosmoTool {
|
|||||||
const T *array, uint32_t *dimList, uint32_t rank)
|
const T *array, uint32_t *dimList, uint32_t rank)
|
||||||
{
|
{
|
||||||
NcFile f(fname.c_str(), NcFile::replace);
|
NcFile f(fname.c_str(), NcFile::replace);
|
||||||
|
|
||||||
vector<NcDim> dimArray;
|
vector<NcDim> dimArray;
|
||||||
for (uint32_t i = 0; i < rank; i++)
|
for (uint32_t i = 0; i < rank; i++)
|
||||||
{
|
{
|
||||||
char dimName[255];
|
char dimName[255];
|
||||||
|
|
||||||
sprintf(dimName, "dim%d", i);
|
sprintf(dimName, "dim%d", i);
|
||||||
dimArray.push_back(f.addDim(dimName, dimList[i]));
|
dimArray.push_back(f.addDim(dimName, dimList[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
NcVar v = f.addVar("array", get_NetCDF_type<T>(), dimArray);
|
NcVar v = f.addVar("array", get_NetCDF_type<T>(), dimArray);
|
||||||
|
|
||||||
v.putVar(array);
|
v.putVar(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void loadArray(const std::string& fname,
|
void loadArray(const std::string& fname,
|
||||||
T*&array, uint32_t *&dimList, uint32_t& rank)
|
T*&array, uint32_t *&dimList, uint32_t& rank)
|
||||||
throw (NoSuchFileException)
|
|
||||||
{
|
{
|
||||||
NcFile f(fname.c_str(), NcFile::read);
|
NcFile f(fname.c_str(), NcFile::read);
|
||||||
|
|
||||||
//if (!f.is_valid())
|
//if (!f.is_valid())
|
||||||
// throw NoSuchFileException(fname);
|
// throw NoSuchFileException(fname);
|
||||||
|
|
||||||
NcVar v = f.getVar("array");
|
NcVar v = f.getVar("array");
|
||||||
vector<NcDim> dims = v.getDims();
|
vector<NcDim> dims = v.getDims();
|
||||||
rank = v.getDimCount();
|
rank = v.getDimCount();
|
||||||
uint32_t fullSize = 1;
|
uint32_t fullSize = 1;
|
||||||
@ -268,5 +267,5 @@ namespace CosmoTool {
|
|||||||
const float *array, uint32_t *dimList, uint32_t rank);
|
const float *array, uint32_t *dimList, uint32_t rank);
|
||||||
template void saveArray<double>(const std::string& fname,
|
template void saveArray<double>(const std::string& fname,
|
||||||
const double *array, uint32_t *dimList, uint32_t rank);
|
const double *array, uint32_t *dimList, uint32_t rank);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user