diff --git a/.gitignore b/.gitignore index 9e4c862..a33a7a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ *~ +.eggs/ +dist/ +wheelhouse/ +cosmotool.egg-info/ +build/ *.o *.prog *.pyc diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e21c7d..ca6f9ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,8 +54,8 @@ IF(YORICK_SUPPORT) ENDIF((EXISTS ${NETCDFCPP_INCLUDE_PATH}/netcdf AND ${NETCDFCPP_LIBRARY} MATCHES "netcdf_c\\+\\+4") OR (INTERNAL_NETCDF)) ENDIF(YORICK_SUPPORT) -find_program(CYTHON cython3 cython) -find_library(ZLIB z) +find_program(CYTHON NAMES cython3 cython) +find_library(ZLIB_LIBRARY z) find_library(DL_LIBRARY dl) find_library(MATH_LIBRARY m) @@ -70,8 +70,8 @@ SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A toolbox for impatient cosmologists") SET(CPACK_PACKAGE_VENDOR "Guilhem Lavaux") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE_CeCILL_V2") SET(CPACK_PACKAGE_VERSION_MAJOR "1") -SET(CPACK_PACKAGE_VERSION_MINOR "0") -SET(CPACK_PACKAGE_VERSION_PATCH "0${EXTRA_VERSION}") +SET(CPACK_PACKAGE_VERSION_MINOR "1") +SET(CPACK_PACKAGE_VERSION_PATCH "1${EXTRA_VERSION}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") SET(CPACK_STRIP_FILES "lib/libCosmoTool.so") SET(CPACK_SOURCE_IGNORE_FILES diff --git a/LICENCE.txt b/LICENCE.txt new file mode 100644 index 0000000..acde39e --- /dev/null +++ b/LICENCE.txt @@ -0,0 +1,508 @@ +Copyright (C) 2009-2020 Guilhem Lavaux + + +CeCILL FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial research establishment, having its principal place of +business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of these rights is conditional upon certain obligations +for users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software as regards their 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 same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows future Licensees unhindered access to +the full Source Code of the Software by indicating how to access it, it +being understood that the additional cost of acquiring the Source Code +shall not exceed the cost of transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the object code of the Modified +Software is redistributed, the Licensee allows future Licensees +unhindered access to the full source code of the Modified Software by +indicating how to access it, it being understood that the additional +cost of acquiring the source code shall not exceed the cost of +transferring the data. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH THE GNU GPL + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL in the Modified or unmodified Software, +and distribute that entire code under the terms of the same version of +the GNU GPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +and distribute that entire code under the terms of the same version of +the GNU GPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 2.0 dated 2006-09-05. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..8d92fca --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,169 @@ +include .gitignore +include CMakeLists.txt +include FindNumPy.cmake +include FindPyLibs.cmake +include GetGitRevisionDescription.cmake +include GetGitRevisionDescription.cmake.in +include LICENCE.txt +include LICENCE_CeCILL_V2 +include README.md +include build_tools/gather_sources.py +include color_msg.cmake +include doc/Makefile +include doc/make.bat +include doc/source/conf.py +include doc/source/cpplibrary.rst +include doc/source/index.rst +include doc/source/intro.rst +include doc/source/pythonmodule.rst +include external/external_build.cmake +include external/libsharp-6077806.tar.gz +include external/omptl-20120422.tar.bz2 +include external/patch-omptl +include python/CMakeLists.txt +include python/_cosmo_bispectrum.cpp +include python/_cosmo_cic.pyx +include python/_cosmo_power.pyx +include python/_cosmotool.pyx +include python/_fast_interp.pyx +include python/_project.pyx +include python/copy.pxd +include python/cosmotool/__init__.py +include python/cosmotool/bispectrum.py +include python/cosmotool/borg.py +include python/cosmotool/cic.py +include python/cosmotool/cl_cic.py +include python/cosmotool/config.py.in +include python/cosmotool/ctpv.py +include python/cosmotool/fftw.py +include python/cosmotool/grafic.py +include python/cosmotool/simu.py +include python/cosmotool/smooth.py +include python/cosmotool/timing.py +include python/cppHelper.hpp +include python/dummy.c +include python/project_tool.hpp +include python/safe_gadget.hpp +include python_sample/build_2lpt_ksz.py +include python_sample/build_2lpt_skymap.py +include python_sample/build_dipole_ksz_from_galaxies.py +include python_sample/build_nbody_ksz.py +include python_sample/build_nbody_ksz_from_galaxies.py +include python_sample/build_nbody_skymap.py +include python_sample/gen_2lpt_asmooth.py +include python_sample/gen_2lpt_density.py +include python_sample/icgen/__init__.py +include python_sample/icgen/borgadaptor.py +include python_sample/icgen/borgicgen.py +include python_sample/icgen/cosmogrowth.py +include python_sample/icgen/gen_ic_from_borg.py +include python_sample/icgen/test_ic_from_borg.py +include python_sample/icgen/test_whitify.py +include python_sample/ksz/__init__.py +include python_sample/ksz/constants.py +include python_sample/ksz/gal_prof.py +include python_sample/ramsesToArray.py +include python_sample/test_bispectrum.py +include python_sample/test_spheric_proj.py +include sample/CMakeLists.txt +include sample/Hartmann_Matrix.txt +include sample/gadgetToArray.cpp +include sample/gadgetToDensity.cpp +include sample/graficToDensity.cpp +include sample/simple3DFilter.cpp +include sample/simpleDistanceFilter.cpp +include sample/testAlgo.cpp +include sample/testBQueue.cpp +include sample/testBSP.cpp +include sample/testDelaunay.cpp +include sample/testEskow.cpp +include sample/testHDF5.cpp +include sample/testInterpolate.cpp +include sample/testNewton.cpp +include sample/testPool.cpp +include sample/testReadFlash.cpp +include sample/testSmooth.cpp +include sample/test_cosmopower.cpp +include sample/test_fft_calls.cpp +include sample/test_healpix_calls.cpp +include sample/testkd.cpp +include sample/testkd2.cpp +include sample/testkd3.cpp +include setup.py +include src/CMakeLists.txt +include src/algo.hpp +include src/bqueue.hpp +include src/bqueue.tcc +include src/bsp_simple.hpp +include src/bsp_simple.tcc +include src/cic.cpp +include src/cic.hpp +include src/config.hpp +include src/cosmopower.cpp +include src/cosmopower.hpp +include src/dinterpolate.hpp +include src/dinterpolate.tcc +include src/eskow.hpp +include src/field.hpp +include src/fixArray.hpp +include src/fortran.cpp +include src/fortran.hpp +include src/fourier/base_types.hpp +include src/fourier/details/euclidian_maps.hpp +include src/fourier/details/euclidian_spectrum_1d.hpp +include src/fourier/details/euclidian_spectrum_1d_bin.hpp +include src/fourier/details/euclidian_transform.hpp +include src/fourier/details/healpix_alms.hpp +include src/fourier/details/healpix_map.hpp +include src/fourier/details/healpix_spectrum.hpp +include src/fourier/details/healpix_transform.hpp +include src/fourier/details/healpix_utility.hpp +include src/fourier/euclidian.hpp +include src/fourier/fft/fftw_calls.hpp +include src/fourier/fft/fftw_calls_mpi.hpp +include src/fourier/fft/fftw_complex.hpp +include src/fourier/healpix.hpp +include src/growthFactor.cpp +include src/growthFactor.hpp +include src/h5_readFlash.cpp +include src/h5_readFlash.hpp +include src/hdf5_array.hpp +include src/hdf5_flash.h +include src/interpolate.cpp +include src/interpolate.hpp +include src/interpolate3d.hpp +include src/kdtree_leaf.hpp +include src/kdtree_leaf.tcc +include src/kdtree_splitters.hpp +include src/loadFlash.cpp +include src/loadFlash.hpp +include src/loadFlash_dummy.cpp +include src/loadGadget.cpp +include src/loadGadget.hpp +include src/loadRamses.cpp +include src/loadRamses.hpp +include src/loadSimu.hpp +include src/load_data.cpp +include src/load_data.hpp +include src/mach.hpp +include src/miniargs.cpp +include src/miniargs.hpp +include src/mykdtree.hpp +include src/mykdtree.tcc +include src/newton.hpp +include src/octTree.hpp +include src/octTree.tcc +include src/openmp.hpp +include src/pool.hpp +include src/powerSpectrum.cpp +include src/powerSpectrum.hpp +include src/replicateGenerator.hpp +include src/sparseGrid.hpp +include src/sparseGrid.tcc +include src/sphSmooth.hpp +include src/sphSmooth.tcc +include src/symbol_visible.hpp +include src/tf_fit.hpp +include src/yorick.hpp +include src/yorick_nc3.cpp +include src/yorick_nc4.cpp diff --git a/builder/build-wheels.sh b/builder/build-wheels.sh new file mode 100755 index 0000000..90f87a9 --- /dev/null +++ b/builder/build-wheels.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -e -x + +CC=cc +CXX=c++ + +export CC CXX + +# Install a system package required by our library +#yum install -y atlas-devel +yum install -y cmake3 gsl-devel zlib-devel + +ln -fs /usr/bin/cmake3 /usr/bin/cmake + + +ALL_PYTHON="cp36-cp36m cp37-cp37m cp38-cp38 cp39-cp39" + +# Compile wheels +for pkg in $ALL_PYTHON; do + PYBIN=/opt/python/${pkg}/bin +# "${PYBIN}/pip" install -r /io/dev-requirements.txt + "${PYBIN}/pip" install -r /io/requirements.txt + "${PYBIN}/pip" wheel -vvv /io/ -w wheelhouse/ +done + +# Bundle external shared libraries into the wheels +for whl in wheelhouse/*.whl; do + auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/ +done + +# Install packages and test +for pkg in $ALL_PYTHON; do + PYBIN=/opt/python/${pkg}/bin + "${PYBIN}/pip" install cosmotool --no-index -f /io/wheelhouse +done diff --git a/builder/start.sh b/builder/start.sh new file mode 100755 index 0000000..9fbc185 --- /dev/null +++ b/builder/start.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +d=$(pwd) +if test x"$(basename $d)" = xbuilder; then + d=${d}/../ +fi +if ! [ -e ${d}/setup.py ] ; then + echo "Unknown directory. Please move to the root of cosmotool source tree." + exit 1 +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 diff --git a/conda/build.sh b/conda/build.sh new file mode 100644 index 0000000..5a5aeeb --- /dev/null +++ b/conda/build.sh @@ -0,0 +1 @@ +$PYTHON setup.py install diff --git a/conda/conda_build_config.yaml b/conda/conda_build_config.yaml new file mode 100644 index 0000000..b120466 --- /dev/null +++ b/conda/conda_build_config.yaml @@ -0,0 +1,7 @@ +python: + - 3.7 + - 3.8 + +numpy: + - 1.11 + - 1.19 diff --git a/conda/meta.yaml b/conda/meta.yaml new file mode 100644 index 0000000..8cc271b --- /dev/null +++ b/conda/meta.yaml @@ -0,0 +1,38 @@ +package: + name: cosmotool + version: "1.0.0a7" + +source: + git_rev: 7fce73e + git_url: https://bitbucket.org/glavaux/cosmotool + +requirements: + build: + - numpy >=1.11 + - gcc_linux-64 + - gxx_linux-64 + - python + - setuptools + - cython + - healpy + - numexpr + - cffi + - pyfftw + - gsl + - h5py + + run: + - numpy + - python + - healpy + - numexpr + - cffi + - pyfftw + - h5py + +test: + imports: + - cosmotool + +about: + home: https://bitbucket.org/glavaux/cosmotool diff --git a/external/external_build.cmake b/external/external_build.cmake index c8fedcf..5459427 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -2,8 +2,8 @@ include(FindOpenMP) OPTION(ENABLE_OPENMP "Set to Yes if Healpix and/or you need openMP" OFF) -SET(FFTW_URL "http://www.fftw.org/fftw-3.3.3.tar.gz" CACHE URL "URL to download FFTW from") -SET(EIGEN_URL "http://bitbucket.org/eigen/eigen/get/3.2.10.tar.gz" CACHE URL "URL to download Eigen 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(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(NETCDF_URL "ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.5.0.tar.gz" CACHE STRING "URL to download NetCDF from") @@ -56,19 +56,19 @@ if (ENABLE_SHARP) IF(NOT ENABLE_OPENMP) SET(SHARP_OPENMP --disable-openmp) ENDIF() - ExternalProject_Add(sharp - URL ${CMAKE_SOURCE_DIR}/external/libsharp-6077806.tar.gz - PREFIX ${BUILD_PREFIX}/sharp-prefix - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND autoconf && ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND echo "No install" - ) SET(CUTILS_LIBRARY ${DEP_BUILD}/lib/libc_utils.a) SET(FFTPACK_LIBRARY ${DEP_BUILD}/lib/libfftpack.a) SET(SHARP_LIBRARY ${DEP_BUILD}/lib/libsharp.a) SET(SHARP_LIBRARIES ${SHARP_LIBRARY} ${FFTPACK_LIBRARY} ${CUTILS_LIBRARY}) SET(SHARP_INCLUDE_PATH ${DEP_BUILD}/include) + ExternalProject_Add(sharp + URL ${CMAKE_SOURCE_DIR}/external/libsharp-6077806.tar.gz + PREFIX ${BUILD_PREFIX}/sharp-prefix + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND autoconf && ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} + INSTALL_COMMAND echo "No install" + BUILD_BYPRODUCTS ${SHARP_LIBRARIES} + ) endif (ENABLE_SHARP) @@ -246,10 +246,23 @@ if (INTERNAL_BOOST) set(Boost_DEP boost) ELSE (INTERNAL_BOOST) - find_package(Boost 1.53 QUIET) - set(Boost_DEP) + find_package(Boost 1.69 QUIET) + if (Boost_VERSION) + if (${Boost_VERSION} VERSION_GREATER 1000) + math(EXPR TMP_MAJOR "${Boost_VERSION} / 100000") + math(EXPR TMP_MINOR "(${Boost_VERSION} - ${TMP_MAJOR} * 100000) / 100") + math(EXPR TMP_PATCHLEVEL "${Boost_VERSION} - ${TMP_MAJOR} * 100000 - ${TMP_MINOR} * 100") + set(Boost_VERSION ${TMP_MAJOR}.${TMP_MINOR}.${TMP_PATCHLEVEL}) + ENDIF() + if (${Boost_VERSION} VERSION_GREATER_EQUAL 1.70.0) + set(Boost_DEP Boost::boost) + set(Boost_TARGET Boost::boost) + endif() + endif() if (NOT Boost_FOUND) - cmessage(CWARNING "Boost >= 1.53 was not found") + cmessage(CWARNING "Boost >= 1.69 was not found") + else() + cmessage(STATUS "Boost has been found (version=${Boost_VERSION}), Boost_TARGET=${Boost_Target}") endif() endif (INTERNAL_BOOST) mark_as_advanced(Boost_INCLUDE_DIRS Boost_LIBRARIES) @@ -278,13 +291,19 @@ IF(INTERNAL_GSL) set(GSL_LIBRARIES ${GSL_LIBRARY} ${GSLCBLAS_LIBRARY}) SET(cosmotool_DEPS ${cosmotool_DEPS} gsl) ELSE(INTERNAL_GSL) - find_path(GSL_INCLUDE_PATH NAMES gsl/gsl_blas.h) - find_library(GSL_LIBRARY gsl) - find_library(GSLCBLAS_LIBRARY gslcblas) + IF (NOT DEFINED GSL_LIBRARY OR NOT GSL_LIBRARY) + find_library(GSL_LIBRARY gsl) + ENDIF() + IF (NOT DEFINED GSL_INCLUDE_PATH OR NOT GSL_INCLUDE_PATH) + find_path(GSL_INCLUDE_PATH NAMES gsl/gsl_blas.h) + ENDIF() + IF (NOT DEFINED GSL_CBLAS_LIBRARY OR NOT GSL_CBLAS_LIBRARY) + find_library(GSLCBLAS_LIBRARY gslcblas) + ENDIF() set(GSL_LIBRARIES ${GSL_LIBRARY} ${GSLCBLAS_LIBRARY}) - ENDIF(INTERNAL_GSL) + mark_as_advanced(GSL_LIBRARY GSLCBLAS_LIBRARY GSL_INCLUDE_PATH) @@ -337,7 +356,7 @@ ENDIF(INTERNAL_FFTW) IF (INTERNAL_EIGEN) ExternalProject_Add(eigen URL ${EIGEN_URL} - URL_HASH SHA256=04f8a4fa4afedaae721c1a1c756afeea20d3cdef0ce3293982cf1c518f178502 + URL_HASH MD5=b9e98a200d2455f06db9c661c5610496 PREFIX ${BUILD_PREFIX}/eigen-prefix CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} @@ -375,6 +394,7 @@ ExternalProject_Add(omptl BUILD_COMMAND echo "No build" PATCH_COMMAND patch -p1 -t -N < ${CMAKE_SOURCE_DIR}/external/patch-omptl INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory ${OMPTL_BUILD_DIR} ${EXT_INSTALL}/include/omptl + BUILD_BYPRODUCTS ${EXT_INSTALL}/include/omptl ) include_directories(${EXT_INSTALL}/include) ##include_directories(${OMPTL_BUILD_DIR}/src/) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 6045aca..e2ea884 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -30,6 +30,10 @@ IF(CYTHON) 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 ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp + COMMAND ${CYTHON} --cplus -o ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_cosmomath.pyx ) ENDIF(CYTHON) @@ -38,25 +42,27 @@ add_library(_cosmo_power MODULE ${CMAKE_CURRENT_BINARY_DIR}/_cosmo_power.cpp) 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(_project MODULE ${CMAKE_CURRENT_BINARY_DIR}/_project.cpp) +add_library(_cosmomath MODULE ${CMAKE_CURRENT_BINARY_DIR}/_cosmomath.cpp) target_include_directories(_cosmotool PRIVATE ${PYTHON_INCLUDES}) target_include_directories(_cosmo_power PRIVATE ${PYTHON_INCLUDES}) target_include_directories(_cosmo_cic PRIVATE ${PYTHON_INCLUDES}) target_include_directories(_fast_interp PRIVATE ${PYTHON_INCLUDES}) target_include_directories(_project PRIVATE ${PYTHON_INCLUDES}) - +target_include_directories(_cosmomath PRIVATE ${PYTHON_INCLUDES}) SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Bsymbolic-functions") if(APPLE) set(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup") endif() -target_link_libraries(_cosmotool ${CosmoTool_local} ${GSL_LIBRARIES}) -target_link_libraries(_cosmo_power ${CosmoTool_local} ${GSL_LIBRARIES}) -target_link_libraries(_cosmo_cic ${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_cic PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES}) +target_link_libraries(_cosmomath PRIVATE ${CosmoTool_local} ${GSL_LIBRARIES}) target_link_libraries(_project ) -target_link_libraries(_fast_interp ${CosmoTool_local} ) +target_link_libraries(_fast_interp PRIVATE ${CosmoTool_local} ) -SET(ct_TARGETS _cosmotool _project _cosmo_power _cosmo_cic _fast_interp ) +SET(ct_TARGETS _cosmotool _project _cosmo_power _cosmo_cic _fast_interp _cosmomath) if (Boost_FOUND) message(STATUS "Building bispectrum support (path = ${Boost_INCLUDE_DIRS})") diff --git a/python/_cosmomath.pyx b/python/_cosmomath.pyx new file mode 100644 index 0000000..e5ab880 --- /dev/null +++ b/python/_cosmomath.pyx @@ -0,0 +1,45 @@ +#cython: language_level=3 +import numpy as np +cimport numpy as np + +np.import_array() +np.import_ufunc() + +cdef extern from "sys/types.h": + ctypedef np.int64_t int64_t + +cdef extern from "numpy/npy_common.h": + ctypedef npy_intp + +cdef extern from "special_math.hpp" namespace "CosmoTool": + T log_modified_bessel_first_kind[T](T v, T z) nogil except + + +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 char input_output_types[3] +cdef void *elementwise_funcs[1] + +loop_func[0] = parallel_ufunc_dd_d[double,npy_intp] + +input_output_types[0] = np.NPY_DOUBLE +input_output_types[1] = np.NPY_DOUBLE +input_output_types[2] = np.NPY_DOUBLE + +elementwise_funcs[0] = log_modified_bessel_first_kind[double] + +log_modified_I = np.PyUFunc_FromFuncAndData( + loop_func, + elementwise_funcs, + input_output_types, + 1, # number of supported input types + 2, # number of input args + 1, # number of output args + 0, # `identity` element, never mind this + "log_modified_bessel_first_kind", # function name + "log_modified_bessel_first_kind(v: Float, z: Float) -> Float", # docstring + 0 # unused + ) + diff --git a/python/_cosmotool.pyx b/python/_cosmotool.pyx index 61ba1a0..ed9195e 100644 --- a/python/_cosmotool.pyx +++ b/python/_cosmotool.pyx @@ -513,7 +513,8 @@ def writeGadget(str filename, object simulation): simdata.TotalNumPart = NumPart simdata.NumPart = NumPart - cxx_writeGadget(filename, &simdata) + filename_b = bytes(filename, 'utf-8') + cxx_writeGadget(filename_b, &simdata) 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) diff --git a/python/cosmotool/__init__.py b/python/cosmotool/__init__.py index c5b1c79..fd1eb0e 100644 --- a/python/cosmotool/__init__.py +++ b/python/cosmotool/__init__.py @@ -3,6 +3,7 @@ from ._project import * from ._cosmo_power import * from ._cosmo_cic import * from ._fast_interp import * +from ._cosmomath import * from .grafic import writeGrafic, writeWhitePhase, readGrafic, readWhitePhase from .borg import read_borg_vol from .cic import cicParticles diff --git a/python/cosmotool/ctpv.py b/python/cosmotool/ctpv.py index 22a9d22..4d90f1a 100644 --- a/python/cosmotool/ctpv.py +++ b/python/cosmotool/ctpv.py @@ -87,7 +87,7 @@ class ProgrammableParticleHistoryLoad(object): class ProgrammableDensityLoad(object): @staticmethod - def main_script(source, density, extents=None, aname="default"): + def main_script(source, density, extents=None, aname="default", extra_arrays={}): import vtk from vtk.util import numpy_support @@ -116,6 +116,11 @@ class ProgrammableDensityLoad(object): arr = numpy_support.numpy_to_vtk(density.transpose().astype(np.float64).ravel(), deep=1) arr.SetName(aname) ido.GetPointData().AddArray(arr) + + for k in extra_arrays.keys(): + arr = numpy_support.numpy_to_vtk(extra_arrays[k].transpose().astype(np.float64).ravel(), deep=1) + arr.SetName(k) + ido.GetPointData().AddArray(arr) @staticmethod def request_information(source, density=None, dims=None): diff --git a/python/cosmotool/simu.py b/python/cosmotool/simu.py index 2389926..157e107 100644 --- a/python/cosmotool/simu.py +++ b/python/cosmotool/simu.py @@ -98,12 +98,12 @@ def simpleWriteGadget(filename, positions, boxsize=1.0, Hubble=100, Omega_M=0.30 s.positions = positions - if velocities: + if velocities is not None: s.velocities = velocities else: s.velocities = [np.zeros(positions[0].size,dtype=np.float32)]*3 - if identifiers: + if identifiers is not None: s.identifiers = identifiers else: s.identifiers = np.arange(positions[0].size, dtype=np.int64) diff --git a/python/dummy.c b/python/dummy.c new file mode 100644 index 0000000..ad8787c --- /dev/null +++ b/python/dummy.c @@ -0,0 +1 @@ +static void dummyFunc() {} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ef3f5d4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy +cffi +numexpr +pyfftw +cython diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 561751c..03709a7 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -114,6 +114,9 @@ if (Boost_FOUND) add_dependencies(graficToDensity ${all_deps}) endif() endif() + + add_executable(test_special test_special.cpp) + target_link_libraries(test_special ${tolink}) endif (Boost_FOUND) IF (ENABLE_OPENMP AND YORICK_SUPPORT) diff --git a/sample/test_special.cpp b/sample/test_special.cpp new file mode 100644 index 0000000..ae463d6 --- /dev/null +++ b/sample/test_special.cpp @@ -0,0 +1,12 @@ +#include +#include "special_math.hpp" + +int main() +{ + + std::cout << CosmoTool::log1p_exp(2.0) << std::endl; + + std::cout << CosmoTool::log_modified_bessel_first_kind(100.0, 0.1) << std::endl; + return 0; +} + diff --git a/setup.py b/setup.py index a3d1a58..04e9df0 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ class CMakeExtension(Extension): doesn't try to build your sources for you """ - def __init__(self, name, sources=[]): + def __init__(self, name, sources=["python/dummy.c"]): super().__init__(name = name, sources = sources) @@ -156,9 +156,8 @@ class BuildCMakeExt(build_ext): cython_code = os.path.join(str(build_dir.absolute()),'mycython') with open(cython_code, mode="wt") as ff: - ff.write(f"#!{sys.executable}\n" - "from Cython.Compiler.Main import setuptools_main\n" - "setuptools_main()") + ff.write("#!/bin/sh\n" + f"{sys.executable} -c 'from Cython.Compiler.Main import setuptools_main; setuptools_main()' $@") os.chmod(cython_code, stat.S_IXUSR|stat.S_IWUSR|stat.S_IRUSR|stat.S_IRGRP) # Now that the necessary directories are created, build @@ -169,6 +168,7 @@ class BuildCMakeExt(build_ext): # Below is just an example set of arguments for building Blender as a Python module 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', '-DINTERNAL_HDF5=ON','-DINTERNAL_NETCDF=ON', '-DBUILD_PYTHON=ON', '-DINSTALL_PYTHON_LOCAL=OFF', @@ -218,10 +218,11 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.0.0a2', + version='1.1.1', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, - setup_requires=['cython','cffi','numexpr'], + install_requires=['numpy','cffi','numexpr','pyfftw','h5py'], + setup_requires=['cython','cffi','numpy','numexpr'], ext_modules=[CosmoTool_extension], description='A small cosmotool box of useful functions', long_description=open("./README.md", 'r').read(), @@ -241,5 +242,6 @@ setup(name='cosmotool', 'build_ext': BuildCMakeExt, 'install_data': InstallCMakeLibsData, 'install_lib': InstallCMakeLibs, - } + }, + python_requires='>=3.6' ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 196ed36..4f39695 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -72,14 +72,14 @@ SET(CosmoTool_SRCS ${CosmoTool_SRCS} include_directories(${GSL_INCLUDE_PATH} ${CMAKE_BINARY_DIR}/src) -set(CosmoTool_LIBS ${GSL_LIBRARIES}) +set(CosmoTool_LIBS ${GSL_LIBRARIES} ${Boost_TARGET}) if(YORICK_SUPPORT) set(CosmoTool_LIBS ${CosmoTool_LIBS} ${NETCDFCPP_LIBRARY} ${NETCDF_LIBRARY} ${GSL_LIBRARIES}) include_directories(${NETCDF_INCLUDE_PATH} ${NETCDFCPP_INCLUDE_PATH}) endif(YORICK_SUPPORT) if (HDF5_FOUND) - set(CosmoTool_LIBS ${CosmoTool_LIBS} ${HDF5_CXX_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB}) + set(CosmoTool_LIBS ${CosmoTool_LIBS} ${HDF5_CXX_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARY}) message(STATUS "CosmoTool_LIBS: ${CosmoTool_LIBS}") endif (HDF5_FOUND) @@ -92,11 +92,13 @@ if (BUILD_SHARED_LIBS) add_library(CosmoTool_static STATIC ${CosmoTool_SRCS} $) target_link_libraries(CosmoTool_static) set_property(TARGET CosmoTool_static PROPERTY POSITION_INDEPENDENT_CODE ON) + add_dependencies(CosmoTool_static ${cosmotool_DEPS}) endif(BUILD_STATIC_LIBS) else (BUILD_SHARED_LIBS) add_library(CosmoTool STATIC ${CosmoTool_SRCS} $) - target_link_libraries(CosmoTool) + target_link_libraries(CosmoTool ${CosmoTool_LIBS}) set_property(TARGET CosmoTool PROPERTY POSITION_INDEPENDENT_CODE ON) + add_dependencies(CosmoTool ${cosmotool_DEPS}) endif (BUILD_SHARED_LIBS) IF(NOT COSMOTOOL_PYTHON_PACKAGING) diff --git a/src/algo.hpp b/src/algo.hpp index 5f896ef..9dcf1bc 100644 --- a/src/algo.hpp +++ b/src/algo.hpp @@ -93,6 +93,6 @@ namespace CosmoTool -}; +} #endif diff --git a/src/config.hpp b/src/config.hpp index 6fa7b63..940919b 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -165,6 +165,6 @@ namespace CosmoTool FilesystemFullException() : Exception() {} }; -}; +} #endif diff --git a/src/fourier/fft/fftw_calls.hpp b/src/fourier/fft/fftw_calls.hpp index 16426cf..a5ef225 100644 --- a/src/fourier/fft/fftw_calls.hpp +++ b/src/fourier/fft/fftw_calls.hpp @@ -114,6 +114,9 @@ public: \ 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); } \ } diff --git a/src/fourier/fft/fftw_calls_mpi.hpp b/src/fourier/fft/fftw_calls_mpi.hpp index 0a7a508..b592220 100644 --- a/src/fourier/fft/fftw_calls_mpi.hpp +++ b/src/fourier/fft/fftw_calls_mpi.hpp @@ -97,6 +97,9 @@ public: \ 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); } \ } diff --git a/src/hdf5_array.hpp b/src/hdf5_array.hpp index 11762bb..4cab937 100644 --- a/src/hdf5_array.hpp +++ b/src/hdf5_array.hpp @@ -78,8 +78,6 @@ namespace CosmoTool { } }; - //, typename boost::enable_if >::type> \ - // #define HDF5_TYPE(tl, thdf5) \ template struct get_hdf5_data_type >::type > \ { static H5::DataType type() { return H5::PredType::thdf5; }; } @@ -122,7 +120,7 @@ namespace CosmoTool { template<> struct hdf5_extent_gen<0> { - static inline boost::multi_array_types::extent_gen build(hsize_t *d) + static inline boost::multi_array_types::extent_gen build(hsize_t *) { return boost::extents; } @@ -513,7 +511,7 @@ namespace CosmoTool { \ }; \ }; -}; +} #endif diff --git a/src/loadRamses.cpp b/src/loadRamses.cpp index 0c628f8..3e841d5 100644 --- a/src/loadRamses.cpp +++ b/src/loadRamses.cpp @@ -34,7 +34,7 @@ knowledge of the CeCILL license and that you accept its terms. +*/ #include -#include "/usr/include/regex.h" +#include #include #include #include diff --git a/src/numpy_adaptors.hpp b/src/numpy_adaptors.hpp new file mode 100644 index 0000000..196206b --- /dev/null +++ b/src/numpy_adaptors.hpp @@ -0,0 +1,30 @@ +#ifndef __COSMOTOOL_NUMPY_ADAPTOR_HPP +#define __COSMOTOOL_NUMPY_ADAPTOR_HPP + +namespace CosmoTool { + + template + 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 diff --git a/src/special_math.hpp b/src/special_math.hpp new file mode 100644 index 0000000..19e1414 --- /dev/null +++ b/src/special_math.hpp @@ -0,0 +1,231 @@ +// Original code derived from Boost and is distributed here +// under the Boost license (licenses/boost-license.txt) +// Copyright (c) 2006 Xiaogang Zhang +// Copyright (c) 2007, 2017 John Maddock +// Secondary code copyright by its author and is distributed here +// under the BSD-3 license (LICENSE.md). Derived from +// stan/math/prim/fun/log_modified_bessel_first_kind.hpp + +#ifndef __COSMOTOOL_SPECIAL_MATH_HPP +#define __COSMOTOOL_SPECIAL_MATH_HPP + +#include "algo.hpp" +#include +#include +#include +#include + +// Taken and adapted from +// https://github.com/stan-dev/math/blob/develop/stan/math/prim/fun/log_modified_bessel_first_kind.hpp + +namespace CosmoTool { + +template T log1p_exp(T x) { + if (x > T(0)) { + return x + std::log1p(std::exp(-x)); + } + return std::log1p(std::exp(x)); +} + +template T multiply_log(T a, T b) { + if (a == 0 && b == 0) + return 0; + return a * std::log(b); +} + +template T inf() { return std::numeric_limits::infinity(); } + +template T log_sum_exp(T const a, T const b) { + if (a == -inf()) { + return b; + } + if (a == inf() && b == inf()) { + return inf(); + } + if (a > b) { + return a + log1p_exp(b - a); + } + return b + log1p_exp(a - b); +} + +/* Log of the modified Bessel function of the first kind, + * which is better known as the Bessel I function. See + * modified_bessel_first_kind.hpp for the function definition. + * The derivatives are known to be incorrect for v = 0 because a + * simple constant 0 is returned. + * + * @tparam T common type for calculation + * @param v Order, can be a non-integer but must be at least -1 + * @param z Real non-negative number + * @throws std::domain_error if either v or z is NaN, z is + * negative, or v is less than -1 + * @return log of Bessel I function + */ +template T log_modified_bessel_first_kind(T const v, T const z) { + using boost::math::tools::evaluate_polynomial; + using std::log; + using std::pow; + using std::sqrt; + static const double LOG_TWO = std::log(2.0); + static const double EPSILON = std::numeric_limits::epsilon(); + static const double TWO_PI = 2.0 * boost::math::constants::pi(); + + if (z == 0) { + if (v == 0) { + return 0.0; + } + if (v > 0) { + return -std::numeric_limits::infinity(); + } + return std::numeric_limits::infinity(); + } + if (std::isinf(z)) { + return z; + } + if (v == 0) { + // Modified Bessel function of the first kind of order zero + // we use the approximating forms derived in: + // "Rational Approximations for the Modified Bessel Function of the + // First Kind -- I0(x) for Computations with Double Precision" + // by Pavel Holoborodko, see + // http://www.advanpix.com/2015/11/11/rational-approximations-for-the-modified-bessel-function-of-the-first-kind-i0-computations-double-precision + // The actual coefficients used are [Boost's] own, and extend + // Pavel's work to precisions other than double. + + if (z < 7.75) { + // Bessel I0 over[10 ^ -16, 7.75] + // Max error in interpolated form : 3.042e-18 + // Max Error found at double precision = Poly : 5.106609e-16 + // Cheb : 5.239199e-16 + static const double P[] = { + 1.00000000000000000e+00, 2.49999999999999909e-01, + 2.77777777777782257e-02, 1.73611111111023792e-03, + 6.94444444453352521e-05, 1.92901234513219920e-06, + 3.93675991102510739e-08, 6.15118672704439289e-10, + 7.59407002058973446e-12, 7.59389793369836367e-14, + 6.27767773636292611e-16, 4.34709704153272287e-18, + 2.63417742690109154e-20, 1.13943037744822825e-22, + 9.07926920085624812e-25}; + return log1p_exp(multiply_log(2.0, z) - log(4.0) + + log(evaluate_polynomial(P, 0.25 * square(z)))); + } + if (z < 500) { + // Max error in interpolated form : 1.685e-16 + // Max Error found at double precision = Poly : 2.575063e-16 + // Cheb : 2.247615e+00 + static const double P[] = { + 3.98942280401425088e-01, 4.98677850604961985e-02, + 2.80506233928312623e-02, 2.92211225166047873e-02, + 4.44207299493659561e-02, 1.30970574605856719e-01, + -3.35052280231727022e+00, 2.33025711583514727e+02, + -1.13366350697172355e+04, 4.24057674317867331e+05, + -1.23157028595698731e+07, 2.80231938155267516e+08, + -5.01883999713777929e+09, 7.08029243015109113e+10, + -7.84261082124811106e+11, 6.76825737854096565e+12, + -4.49034849696138065e+13, 2.24155239966958995e+14, + -8.13426467865659318e+14, 2.02391097391687777e+15, + -3.08675715295370878e+15, 2.17587543863819074e+15}; + return z + log(evaluate_polynomial(P, 1 / z)) - multiply_log(0.5, z); + } + // Max error in interpolated form : 2.437e-18 + // Max Error found at double precision = Poly : 1.216719e-16 + static const double P[] = {3.98942280401432905e-01, 4.98677850491434560e-02, + 2.80506308916506102e-02, 2.92179096853915176e-02, + 4.53371208762579442e-02}; + return z + log(evaluate_polynomial(P, 1 / z)) - multiply_log(0.5, z); + } + if (v == 1) { // WARNING: will not autodiff for v = 1 correctly + // modified from Boost's bessel_i1_imp in the double precision case + // see credits above in the v == 0 case + if (z < 7.75) { + // Bessel I0 over[10 ^ -16, 7.75] + // Max error in interpolated form: 5.639e-17 + // Max Error found at double precision = Poly: 1.795559e-16 + + static const double P[] = { + 8.333333333333333803e-02, 6.944444444444341983e-03, + 3.472222222225921045e-04, 1.157407407354987232e-05, + 2.755731926254790268e-07, 4.920949692800671435e-09, + 6.834657311305621830e-11, 7.593969849687574339e-13, + 6.904822652741917551e-15, 5.220157095351373194e-17, + 3.410720494727771276e-19, 1.625212890947171108e-21, + 1.332898928162290861e-23}; + T a = square(z) * 0.25; + T Q[3] = {1, 0.5, evaluate_polynomial(P, a)}; + return log(z) + log(evaluate_polynomial(Q, a)) - LOG_TWO; + } + if (z < 500) { + // Max error in interpolated form: 1.796e-16 + // Max Error found at double precision = Poly: 2.898731e-16 + + static const double P[] = { + 3.989422804014406054e-01, -1.496033551613111533e-01, + -4.675104253598537322e-02, -4.090895951581637791e-02, + -5.719036414430205390e-02, -1.528189554374492735e-01, + 3.458284470977172076e+00, -2.426181371595021021e+02, + 1.178785865993440669e+04, -4.404655582443487334e+05, + 1.277677779341446497e+07, -2.903390398236656519e+08, + 5.192386898222206474e+09, -7.313784438967834057e+10, + 8.087824484994859552e+11, -6.967602516005787001e+12, + 4.614040809616582764e+13, -2.298849639457172489e+14, + 8.325554073334618015e+14, -2.067285045778906105e+15, + 3.146401654361325073e+15, -2.213318202179221945e+15}; + return z + log(evaluate_polynomial(P, 1 / z)) - multiply_log(0.5, z); + } + // Max error in interpolated form: 1.320e-19 + // Max Error found at double precision = Poly: 7.065357e-17 + static const double P[] = { + 3.989422804014314820e-01, -1.496033551467584157e-01, + -4.675105322571775911e-02, -4.090421597376992892e-02, + -5.843630344778927582e-02}; + return z + log(evaluate_polynomial(P, 1 / z)) - multiply_log(0.5, z); + } + if (z > 100) { + // Boost does something like this in asymptotic_bessel_i_large_x + T lim = pow((square(v) + 2.5) / (2 * z), 3) / 24; + if (lim < (EPSILON * 10)) { + T s = 1; + T mu = 4 * square(v); + T ex = 8 * z; + T num = mu - 1; + T denom = ex; + s -= num / denom; + num *= mu - 9; + denom *= ex * 2; + s += num / denom; + num *= mu - 25; + denom *= ex * 3; + s -= num / denom; + s = z - log(sqrt(z * TWO_PI)) + log(s); + return s; + } + } + + T log_half_z = log(0.5 * z); + T lgam = (v > -1) ? lgamma(v + 1.0) : 0; + T lcons = (2.0 + v) * log_half_z; + T out; + if (v > -1) { + out = log_sum_exp(v * log_half_z - lgam, lcons - lgamma(v + 2)); + lgam += log1p(v); + } else { + out = lcons; + } + + double m = 2; + double lfac = 0; + T old_out; + do { + lfac += log(m); + lgam += log(v + m); + lcons += 2 * log_half_z; + old_out = out; + out = log_sum_exp(out, lcons - lfac - lgam); // underflows eventually + m++; + } while (out > old_out || out < old_out); + return out; +} + +} // namespace CosmoTool + +#endif