Compare commits

..

54 Commits

Author SHA1 Message Date
fb51ffd35e Fixup for sph 2024-04-26 08:53:38 +02:00
924047de22 Add possibility to have an external state 2024-04-25 18:11:06 +02:00
be64c7fd7a Remove support for old python 2024-04-25 17:06:15 +02:00
guilhem.lavaux@iap.fr
47d63a25ce Bump version 2024-02-13 10:47:28 +01:00
guilhem.lavaux@iap.fr
4bcc5f3270 Add missing numpy_adaptors 2024-02-13 10:37:52 +01:00
guilhem.lavaux@iap.fr
1d59533b17 Add python in search path 2024-02-13 10:28:58 +01:00
guilhem.lavaux@iap.fr
1548fd8450 Add missing pyx in MANIFEST 2024-02-13 09:15:36 +01:00
guilhem.lavaux@iap.fr
1151d0c8b6 Add cython back to dependency 2024-02-13 08:25:14 +01:00
guilhem.lavaux@iap.fr
1db266b4ea Add pyproject.toml 2024-02-13 08:19:54 +01:00
guilhem.lavaux@iap.fr
f2a5092cf1 Fix MANIFEST 2024-02-13 07:53:12 +01:00
guilhem.lavaux@iap.fr
54a59b5246 Fix manifest 2024-02-13 07:53:12 +01:00
883c338c08 Fixed building 2024-01-17 14:00:09 +01:00
guilhem.lavaux@iap.fr
b8e60a7d33 Updating to 1.3.5 2024-01-16 07:50:50 +01:00
guilhem.lavaux@iap.fr
751d8a19a0 Remove pyfftw from requirements 2024-01-16 07:49:08 +01:00
guilhem.lavaux@iap.fr
97a1e34132 Strip mandatory pyfftw support 2024-01-16 07:33:45 +01:00
guilhem.lavaux@iap.fr
26e095fc71 Fix for default MacOS build with python 2024-01-16 07:21:56 +01:00
6adf02b287 Attempt to fix linkage errors 2023-12-07 08:56:24 +01:00
b878efb8b1 Fix requirements 2023-12-06 22:35:55 +01:00
Guilhem Lavaux
7c7ccd6f87 Changed to use configure and not CMake for hdf5. 2023-12-06 21:21:11 +00:00
7a81120977 Fix setPeriodic 2023-12-06 18:40:06 +01:00
c88f91ba80 Bump to 1.3.4 2023-12-06 09:29:58 +01:00
0093a6aa0f Fix cython syntax and port to more recent numpy.pxd 2023-12-06 09:28:43 +01:00
4afc982dfc Cache downloads 2023-12-06 09:28:43 +01:00
d4b1742cbf Add periodic argument 2023-12-05 16:35:54 +01:00
guilhem.lavaux@iap.fr
d2cd6bb650 Merge remote-tracking branch 'origin/master' 2023-12-03 20:30:25 +01:00
guilhem.lavaux@iap.fr
2aa7c96e48 Update for macmini 2023-12-03 20:29:56 +01:00
d8b58bd8f1 Update version 2023-04-23 12:44:12 +02:00
05ac03fb7a Update bundled external libs 2023-04-22 17:21:14 +02:00
522588fc1f Fixup script for more modern pypa image 2023-02-27 14:16:36 +01:00
39fe922143 Merge branch 'master' of bitbucket.org:glavaux/cosmotool 2023-02-04 09:54:41 +01:00
fd16d7dc69 Add config.* updated tool for mac support 2023-02-04 09:54:32 +01:00
5eb0fe210b Fix version 2023-02-04 08:26:42 +01:00
957d5187e9 Bump requirement of numpy 2023-02-03 21:44:28 +01:00
f326962bc8 Add dependencies 2023-01-31 14:38:04 +01:00
4509174d81 moved param to transfer func 2022-12-06 20:59:13 +01:00
2cc11b3633 wiggle parameterization 2022-12-06 20:59:07 +01:00
f79d7f6830 added BAO wiggles 2022-12-06 20:59:02 +01:00
046e9a1447 Reformat and add some adjoint gradient 2022-11-17 21:50:06 +01:00
fe06434619 Reformat 2022-11-16 16:48:40 +01:00
4633f6edc9 Reformat 2022-11-16 16:48:31 +01:00
b538d4974d Add and fix support for parallel SPH state 2022-11-15 09:02:11 +01:00
f03751907b Push compatibility to HDF5 1.12 2022-08-17 08:57:52 +03:00
31d0f19408 Fix patch 2022-06-19 10:53:45 +02:00
cc94866bc3 Remove bind2nd from omptl 2022-06-19 08:24:26 +02:00
a309aa732b Fix for C++17: switch out random_shuffle for shuffle.
For details see https://clang.llvm.org/extra/clang-tidy/checks/modernize-replace-random-shuffle.html
2022-06-13 11:36:04 +02:00
59bb99e7ee Fix check of kdtree loading from disk 2022-05-27 16:26:59 +03:00
e2a2c7287c Remove obsolete exception specification 2022-02-10 07:20:21 +01:00
d875416200 Tweaks for speed 2022-01-29 08:22:08 +01:00
8ab094ad3d Bump version 2022-01-27 16:28:16 +01:00
0b77b010e4 Merge branch 'master' of bitbucket.org:glavaux/cosmotool 2022-01-27 13:36:25 +01:00
c264f2c69d Add output file argument 2022-01-27 13:36:19 +01:00
533d8d0630 Merge branch 'master' of bitbucket.org:glavaux/cosmotool 2021-10-15 18:39:01 +02:00
b01543a02a Use 64 bits instead of 32 bits 2021-10-15 18:38:55 +02:00
009fae2418 Bump version 2021-08-05 08:00:19 +02:00
30 changed files with 4431 additions and 534 deletions

View File

@ -10,8 +10,6 @@ include(FindPkgConfig)
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
include(color_msg) include(color_msg)
find_package(MPI)
option(BUILD_SHARED_LIBS "Build shared libraries." OFF) option(BUILD_SHARED_LIBS "Build shared libraries." OFF)
option(BUILD_STATIC_LIBS "Build static libraries." ON) option(BUILD_STATIC_LIBS "Build static libraries." ON)
option(ENABLE_SHARP "Enable SHARP support." ON) option(ENABLE_SHARP "Enable SHARP support." ON)
@ -44,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)
@ -57,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)
@ -72,14 +78,12 @@ 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 "2") SET(CPACK_PACKAGE_VERSION_MINOR "3")
SET(CPACK_PACKAGE_VERSION_PATCH "3${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 "/CVS/;/\\\\.git/;/\\\\.svn/;\\\\.swp$;\\\\.#;/#;.*~;cscope.*;/CMakeFiles/;.*\\\\.cmake;Makefile") SET(CPACK_SOURCE_IGNORE_FILES
"/CVS/;/\\\\.git/;/\\\\.svn/;\\\\.swp$;\\\\.#;/#;.*~;cscope.*;/CMakeFiles/;.*\\\\.cmake;Makefile")
include_directories( ${MPI_C_INCLUDE_PATH})
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(sample) add_subdirectory(sample)

View File

@ -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
@ -93,6 +97,7 @@ 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

View File

@ -8,12 +8,15 @@ 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 fftw3-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 cp39-cp39" 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
@ -21,12 +24,12 @@ for pkg in $ALL_PYTHON; do
# "${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 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/cosmotool*.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

View File

@ -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

View File

@ -1,6 +1,6 @@
package: package:
name: cosmotool name: cosmotool
version: "1.2.3" version: "1.3.0"
source: source:
git_rev: a86c9a8 git_rev: a86c9a8

1754
external/config.guess vendored Executable file

File diff suppressed because it is too large Load Diff

1890
external/config.sub vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -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 "https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.bz2" 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,7 +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
URL_HASH MD5=da07ca30dd1c0d1fdedbd487efee01bd 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
@ -277,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
@ -329,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}
@ -358,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}
@ -390,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

Binary file not shown.

148
external/patch-omptl vendored
View File

@ -1,6 +1,6 @@
diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm
--- omptl.old/omptl_algorithm 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_algorithm 2022-06-19 08:21:39.815498672 +0200
+++ omptl/omptl_algorithm 2021-06-20 15:40:29.000000000 +0200 +++ 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
@ -23,11 +23,13 @@ diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm
#endif /* OMPTL_ALGORITHM */ #endif /* OMPTL_ALGORITHM */
diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
--- omptl.old/omptl_algorithm_par.h 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_algorithm_par.h 2022-06-19 08:21:39.816498675 +0200
+++ omptl/omptl_algorithm_par.h 2021-06-20 15:40:50.000000000 +0200 +++ 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,7 +38,78 @@ diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
#include <iterator> #include <iterator>
@@ -1700,7 +1700,7 @@ @@ -510,7 +511,7 @@
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 std::vector<char> pivot_used(pivots.size(), false); // can't be bool due to parallel write
@ -45,9 +118,56 @@ diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h
assert(1u << max_depth <= P); assert(1u << max_depth <= P);
for (unsigned i = 0; i < max_depth; ++i) 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 diff -ur omptl.old/omptl_numeric omptl/omptl_numeric
--- omptl.old/omptl_numeric 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_numeric 2022-06-19 08:21:39.816498675 +0200
+++ omptl/omptl_numeric 2021-06-20 15:40:29.000000000 +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
@ -73,8 +193,8 @@ diff -ur omptl.old/omptl_numeric omptl/omptl_numeric
#endif /* OMPTL_NUMERIC */ #endif /* OMPTL_NUMERIC */
diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h
--- omptl.old/omptl_numeric_extensions.h 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_numeric_extensions.h 2022-06-19 08:21:39.815498672 +0200
+++ omptl/omptl_numeric_extensions.h 2021-06-20 15:40:29.000000000 +0200 +++ omptl/omptl_numeric_extensions.h 2022-06-19 08:21:52.956544683 +0200
@@ -51,9 +51,9 @@ @@ -51,9 +51,9 @@
} // namespace } // namespace
@ -88,8 +208,8 @@ diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h
namespace omptl namespace omptl
diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h
--- omptl.old/omptl_numeric_par.h 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_numeric_par.h 2022-06-19 08:21:39.816498675 +0200
+++ omptl/omptl_numeric_par.h 2021-06-20 15:40:29.000000000 +0200 +++ 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>
@ -102,8 +222,8 @@ diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h
namespace omptl namespace omptl
{ {
diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h
--- omptl.old/omptl_tools.h 2012-04-22 16:29:41.000000000 +0200 --- omptl.old/omptl_tools.h 2022-06-19 08:21:39.816498675 +0200
+++ omptl/omptl_tools.h 2021-06-20 15:40:42.000000000 +0200 +++ omptl/omptl_tools.h 2022-06-19 08:21:52.957544686 +0200
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
#include <climits> #include <climits>
#include <iterator> #include <iterator>

4
pyproject.toml Normal file
View File

@ -0,0 +1,4 @@
[build-system]
requires = ["setuptools","wheel","cython"]
build-backend = "setuptools.build_meta"

View File

@ -2,7 +2,7 @@ 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(
@ -69,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()

View File

@ -12,7 +12,7 @@ cdef extern from "numpy/npy_common.h":
ctypedef npy_intp 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": cdef extern from "numpy_adaptors.hpp" namespace "CosmoTool":
void parallel_ufunc_dd_d[T,IT](char **args, IT* dimensions, IT* steps, void *func) void parallel_ufunc_dd_d[T,IT](char **args, IT* dimensions, IT* steps, void *func)

View File

@ -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":
@ -313,6 +313,13 @@ tries to get an array from the object."""
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
@ -320,7 +327,8 @@ 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

View File

@ -727,7 +727,7 @@ 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]

View File

@ -1,5 +1,4 @@
numpy<1.19 numpy<1.22
cffi cffi
numexpr numexpr
pyfftw cython<3
cython

View File

@ -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)
@ -87,7 +91,7 @@ if (Boost_FOUND)
ENDIF (YORICK_SUPPORT) ENDIF (YORICK_SUPPORT)
if (HDF5_FOUND) if (HDF5_FOUND)
add_executable(simple3DFilter simple3DFilter.cpp) add_executable(simple3DFilter simple3DFilter.cpp)
target_link_libraries(simple3DFilter ${tolink} ${MPI_C_LIBRARIES}) target_link_libraries(simple3DFilter ${tolink})
add_executable(simpleDistanceFilter simpleDistanceFilter.cpp) add_executable(simpleDistanceFilter simpleDistanceFilter.cpp)
target_link_libraries(simpleDistanceFilter ${tolink}) target_link_libraries(simpleDistanceFilter ${tolink})

View File

@ -1,11 +1,3 @@
#include <H5Cpp.h>
#include <mpi.h>
#include <boost/bind.hpp>
#include <boost/format.hpp>
#include <cassert>
#include <iostream>
#include "hdf5_array.hpp" #include "hdf5_array.hpp"
#include "miniargs.hpp" #include "miniargs.hpp"
#include "mykdtree.hpp" #include "mykdtree.hpp"
@ -13,6 +5,11 @@
#include "openmp.hpp" #include "openmp.hpp"
#include "sphSmooth.hpp" #include "sphSmooth.hpp"
#include "yorick.hpp" #include "yorick.hpp"
#include <H5Cpp.h>
#include <boost/bind.hpp>
#include <boost/format.hpp>
#include <cassert>
#include <iostream>
using namespace std; using namespace std;
using namespace CosmoTool; using namespace CosmoTool;
@ -30,32 +27,37 @@ 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) { return v.mass * v.v[i]; } ComputePrecision getVelocity(const VCoord &v, int i) { return v.mass * v.v[i]; }
ComputePrecision getMass(const VCoord& v) { return v.mass; } ComputePrecision getMass(const VCoord &v) { 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, void computeInterpolatedField(MyTree *tree1, double boxsize, int Nres,
double cx, double cy, double cz, double cx, double cy, double cz,
array3_type& bins, array3_type& arr, FuncT func, array3_type &bins, array3_type &arr, FuncT func,
double rLimit2) { double rLimit2) {
#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) #pragma omp for collapse(3) schedule(dynamic)
for (int rz = 0; rz < Nres; rz++) { 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;
for (int ry = 0; ry < Nres; ry++) { 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;
cout << format("[%d] %d / %d") % smp_get_thread_id() % rz % Nres
<< endl;
}
double px = (rx)*boxsize / Nres - cx; 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)}; MyTree::coords c = {float(px), float(py), float(pz)};
@ -78,18 +80,11 @@ void computeInterpolatedField(MyTree* tree1, double boxsize, int Nres,
} }
} }
int main(int argc, char** argv) { int main(int argc, char **argv) {
int provided; char *fname1, *outFile;
MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);
if (provided < MPI_THREAD_FUNNELED) {
std::cerr << "Cannot mix MPI and Threads here. Please recompile with "
"OpenMP or MPI switched off."
<< std::endl;
MPI_Abort(MPI_COMM_WORLD, 99);
}
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[] = {{"INPUT DATA1", &fname1, MINIARG_STRING}, MiniArgDesc args[] = {{"INPUT DATA1", &fname1, MINIARG_STRING},
{"RADIUS LIMIT", &rLimit, MINIARG_DOUBLE}, {"RADIUS LIMIT", &rLimit, MINIARG_DOUBLE},
@ -98,17 +93,17 @@ int main(int argc, char** argv) {
{"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},
{"PERIODIC", &periodic, MINIARG_INT},
{0, 0, MINIARG_NULL}}; {0, 0, MINIARG_NULL}};
if (!parseMiniArgs(argc, argv, args)) return 1; if (!parseMiniArgs(argc, argv, args))
return 1;
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
H5::H5File in_f(fname1, 0); H5::H5File in_f(fname1, 0);
H5::H5File out_f(boost::str(boost::format("fields_%d.h5", rank), 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]);
@ -121,15 +116,17 @@ int main(int argc, char** argv) {
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++) bins.data()[i] = 0; for (uint32_t i = 0; i < Nres * Nres * Nres; i++)
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++) allCells_1[i].coord[j] = v1_data[i][j]; for (int j = 0; j < 3; 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];
@ -143,8 +140,9 @@ int main(int argc, char** argv) {
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]);
@ -152,6 +150,7 @@ int main(int argc, char** argv) {
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;
@ -159,18 +158,21 @@ int main(int argc, char** argv) {
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) #pragma omp for collapse(3) schedule(dynamic, 8)
for (int rz = 0; rz < Nres; rz++) { for (int rz = 0; rz < Nres; rz++) {
double pz = (rz)*boxsize / Nres - cz;
(cout << rz << " / " << Nres << endl).flush();
for (int ry = 0; ry < Nres; ry++) { 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;
(cout << rz << " / " << Nres << endl).flush();
}
double pz = (rz)*boxsize / Nres - cz;
double py = (ry)*boxsize / Nres - cy;
double px = (rx)*boxsize / Nres - cx; double px = (rx)*boxsize / Nres - cx;
MyTree::coords c = {float(px), float(py), float(pz)}; MyTree::coords c = {float(px), float(py), float(pz)};
@ -185,30 +187,11 @@ int main(int argc, char** argv) {
smooth1.fetchNeighbours(c, numInCell); smooth1.fetchNeighbours(c, numInCell);
else else
smooth1.fetchNeighbours(c); smooth1.fetchNeighbours(c);
#pragma omp critical
smooth1.addGridSite(c); smooth1.addGridSite(c);
} }
} }
(cout << " Done " << rz << endl).flush();
} }
} }
//
// Reduction on the cell.weight in the tree.
// MPI_Allreduce to act on contiguous arrays.
auto tree = smooth1.getTree();
auto nodes = tree->getAllNodes();
double *weight_array = new double[N1_points];
for (size_t c = 0; c < N1_points; c++) {
weight_array[c] = allCells[c].val.weight;
}
MPI_Allreduce(MPI_IN_PLACE, weight_array, N1_points, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
for (size_t c = 0; c < N1_points; c++) {
allCells[c].val.weight = weight_array[c];
}
delete[] weight_array;
// cell.weights -> build a 1d array of the particles weight -> MPI_Allreduce -> resend the new weights to the particles
//
cout << "Interpolating..." << endl; cout << "Interpolating..." << endl;

View File

@ -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
@ -167,17 +168,24 @@ 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=[] compilers=[]
fill_up_settings=[ fill_up_settings=[
("CMAKE_C_COMPILER", "CC"), ("CMAKE_C_COMPILER", "CC", get_config_var("CC")),
("CMAKE_CXX_COMPILER", "CXX"), ("CMAKE_CXX_COMPILER", "CXX", get_config_var("CXX")),
("CMAKE_C_FLAGS", "CFLAGS"), ("CMAKE_C_FLAGS", "CFLAGS", None),
("CMAKE_EXE_LINKER_FLAGS_INIT", "LDFLAGS"), ("CMAKE_CXX_FLAGS", "CXXFLAGS", None),
("CMAKE_SHARED_LINKER_FLAGS_INIT", "LDFLAGS"), ("CMAKE_EXE_LINKER_FLAGS_INIT", "LDFLAGS", None),
("CMAKE_MODULE_LINKER_FLAGS_INIT", "LDFLAGS")] ("CMAKE_SHARED_LINKER_FLAGS_INIT", "LDFLAGS", None),
for cmake_flag, os_flag in fill_up_settings: ("CMAKE_MODULE_LINKER_FLAGS_INIT", "LDFLAGS", None)]
if os_flag in os.environ: for cmake_flag, os_flag, default_flag in fill_up_settings:
compilers.append(f"-D{cmake_flag}={os.environ[os_flag]}") 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,
'-DENABLE_OPENMP=ON','-DINTERNAL_BOOST=ON','-DINTERNAL_EIGEN=ON', '-DENABLE_OPENMP=ON','-DINTERNAL_BOOST=ON','-DINTERNAL_EIGEN=ON',
@ -229,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.2.3', 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',

View File

@ -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)));
@ -444,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();
} }

View File

@ -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);
}; };
}; };

View File

@ -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++) {
@ -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++) {
@ -289,9 +283,7 @@ void h5_read_flash3_particles (H5File* file,
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();
@ -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 */
@ -485,8 +476,7 @@ void h5_read_flash3_header_info(H5File* file,
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) {

View File

@ -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; \
long 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()); \
} }

View File

@ -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

View File

@ -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
@ -99,8 +99,8 @@ 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;
}; };
@ -114,7 +114,7 @@ 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);
@ -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);

View File

@ -80,9 +80,9 @@ 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,
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;
@ -501,7 +501,7 @@ 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)
{ {
RecursionMultipleInfo<N,ValType> info(x, cells, N2); RecursionMultipleInfo<N,ValType> info(x, cells, N2);
@ -527,7 +527,7 @@ 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)
{ {
@ -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;

View File

@ -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;

View File

@ -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
@ -39,30 +39,26 @@ 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;
@ -70,45 +66,58 @@ namespace CosmoTool
ComputePrecision smoothRadius; ComputePrecision smoothRadius;
}; };
SPHSmooth(SPHTree *tree, uint32_t Nsph); SPHSmooth(SPHTree *tree, uint32_t Nsph);
virtual ~SPHSmooth(); virtual ~SPHSmooth();
void fetchNeighbours(const typename SPHTree::coords& c, SPHState *state = 0); void
fetchNeighbours(const typename SPHTree::coords &c, SPHState *state = 0);
void fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNsph); void fetchNeighbours(
void fetchNeighboursOnVolume(const typename SPHTree::coords& c, ComputePrecision radius); const typename SPHTree::coords &c, uint32_t newNsph,
const typename SPHTree::coords& getCurrentCenter() const 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>
ComputePrecision computeSmoothedValue(
const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0);
template<typename FuncT> /** This is the weighted SPH smoothing function. It does reweight by the
ComputePrecision computeInterpolatedValue(const typename SPHTree::coords& c, * value computed at each grid site. This ensures the total sum of the interpolated
FuncT fun, SPHState *state = 0); * quantity is preserved by interpolating to the target mesh.
*/
template <typename FuncT>
ComputePrecision computeInterpolatedValue(
const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0);
ComputePrecision getMaxDistance(const typename SPHTree::coords& c, /** This is the adjoint gradient of computeInterpolatedValue w.r.t. to the value
SPHNode *node) const; * 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 getSmoothingLen() const ComputePrecision
{ getMaxDistance(const typename SPHTree::coords &c, SPHNode *node) const;
return internal.smoothRadius;
} 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;
@ -133,21 +142,21 @@ namespace CosmoTool
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, void runUnrollNode(SPHNode *node, FuncT fun);
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"

View File

@ -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)); memcpy(state->currentCenter, c, sizeof(c));
tree->getNearestNeighbours(c, requested, state->ngb.get(), state->distances.get()); tree->getNearestNeighbours(
c, requested, state->ngb.get(), state->distances.get());
state->currentNgb = 0; state->currentNgb = 0;
for (uint32_t i = 0; i < requested && state->ngb[i] != 0; i++,state->currentNgb++) 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 outputValue = 0;
ComputePrecision max_dist = 0; ComputePrecision max_dist = 0;
ComputePrecision weight = 0; ComputePrecision weight = 0;
for (uint32_t i = 0; i < state->currentNgb; i++) 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

View File

@ -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);