The boost subset used to live as a .tar.xz inside this repo under
dev/docker/boost_bcp_docker/, extracted at configure time into
boost_CoolProp/. That setup is replaced by a CPM fetch of
CoolProp/boost-headers, pinned to a commit SHA like every other
dependency in cmake/dependencies.cmake.
Drops ~22 MB of in-tree headers + a 548 KB .tar.xz, and removes the
fatal-error configure path that required the tarball to exist.
The new subset also includes boost::numeric::odeint (and pulls the
typeof sublibrary explicitly so bcp's static dep scan doesn't miss
macro-registered headers -- see CoolProp/boost-headers c681046).
Closes#2774
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* build: replace git submodules with CPM.cmake
All 11 submodules (Eigen, fmtlib, msgpack-c, rapidjson, IF97,
REFPROP-headers, multicomplex, Catch2, pybind11, ExcelAddinInstaller,
FindMathematica) are now fetched by CPM.cmake at configure time.
Set CPM_SOURCE_CACHE (e.g. ~/.cache/CPM) to share the download cache
across git worktrees and build directories — no more per-worktree
`git submodule update --init --recursive`.
Vendored deps that have no upstream release cycle (miniz, nlohmann-json,
incbin) remain in externals/ as before.
Source-level changes: angle-bracket includes for rapidjson, IF97, and
REFPROP-headers now that their directories are on the include path via
CPM-provided source dirs rather than relative paths from the repo root.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(python): wire up CPM.cmake in Python wrapper, fix include paths
The Python wrapper CMakeLists.txt was still referencing submodule paths
(externals/Eigen, externals/fmtlib, externals/msgpack-c) removed by the
CPM migration. Include CPM.cmake + dependencies.cmake from the root and
use the ${Pkg_SOURCE_DIR} variables instead. Also adds missing
rapidjson, IF97, and REFPROP_headers include dirs required by CoolProp
sources.
CI workflows drop the now-meaningless `submodules: recursive` checkout
option and add a CPM source-cache step to avoid re-downloading on each
macOS/Windows runner.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: remove git submodule references after CPM.cmake migration
Dependencies are now managed by CPM.cmake (fetched automatically at
CMake configure time), so git submodules no longer exist.
- Drop `--recursive` from all `git clone` commands in Web docs and
wrapper READMEs (26 .rst/.md files)
- Remove `submodules: recursive` from all CI workflow checkout steps
(13 workflow files)
- Remove `git submodule foreach/update` calls from release.bsh and
delete the now-dead pybind11 security-workaround lines
- Drop `--recursive` from build_swigged_matlab.sh and gitMirror.bsh
- Update CONTRIBUTING.md: drop "and its submodules" phrasing
Changelog entries referencing old submodule PRs are left intact as
historical records. The --recursive in buildbot.rst is for the
Dockerfiles repo (unrelated) and is also left unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(ci): remove empty 'with:' blocks after submodule removal, apply clang-format
After removing 'submodules: recursive' from checkout steps, some workflow
files were left with dangling empty 'with:' blocks that GitHub Actions
rejects as workflow file errors. Remove the empty 'with:' in 9 workflows.
Also apply clang-format to fix spacing in REFPROPMixtureBackend.cpp,
HumidAirProp.cpp, and Helmholtz.cpp.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(deps): update miniz from 3.0.2 to 3.1.1
Adds the miniz-3.1.1 source directory and updates all CMakeLists.txt
references. Notable fixes in 3.1.0/3.1.1: integer promotion warnings,
tinfl_decompress bug that broke mem-to-heap decompression, MinGW Unicode
path support, and inline static wrappers to silence warnings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(deps): remove old miniz-3.0.2 source tree
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Only the REFPROP checks not passing because of permissions but ran fine locally. All regression testing passed and limited to the single Mathcad wrapper file.
* Use ninja for the examples
Should help a little bit with doc building
* FIx some templates
* Fix template deduction error in count_x_for_y_many functions
The count_x_for_y_many and count_x_for_y_manyC functions were using
a single template parameter for both input (double) and output (size_t)
arrays, causing template deduction failures in Cython bindings.
Changed to use separate template parameters YContainer and CountContainer
to properly support different types for input y values and output counts.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix types in PXD header too
* Docs should get ninja too
* Changes from clang-format
* Fix git diff argument order in clang-format script
The script was comparing PR_BRANCH to TARGET_BRANCH, which shows changes from the PR branch to the target (what's in target that's NOT in PR). For PR validation, we need the opposite: changes from target to PR (what's in PR that's NOT in target).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix Cython template deduction errors in solve_for_x_manyC and count_x_for_y_manyC
Add explicit template parameters [double, size_t] to both function calls
to resolve template type deduction errors when compiling with Cython.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix wheel building by removing return from void Cython template calls
The functions solve_for_x_manyC and count_x_for_y_manyC return void in C++.
When Cython sees a return statement with a void function call containing
template arguments with commas (e.g., [double, size_t]), it wraps the call
in the __Pyx_void_to_None macro. This macro is a simple preprocessor macro
that cannot handle the commas in template arguments, treating them as macro
argument separators instead.
The fix is to remove the return statements, making these simple void function
calls. This prevents the __Pyx_void_to_None wrapping and allows the wheel to
build successfully.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Fix header gen on windows
* Add missing dependencies for constants generation
The generate_constants_target was defined but nothing depended on it,
so CMake never invoked the constants generation script on Windows.
Changes:
- CoolProp_module now depends on generate_constants_target (not just
generate_headers_target)
- CoolProp.pyx Cythonization now depends on constants_header.pxd and
generate_constants_target (since CoolProp.pyx imports constants_header)
This ensures the constants generation script runs before building,
creating the required files:
- constants_header.pxd
- _constants.pyx
- constants.py
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Modernize Python build system to use scikit-build-core
This commit replaces the old setuptools-based build system with a modern
scikit-build-core + CMake build system for the Python bindings.
Key changes:
- Replace setup.py with pyproject.toml using scikit-build-core backend
- Create new CMakeLists.txt for Cython module compilation
- Add FindCython.cmake helper module
- Update README from .rst to .md format
- Enable incremental builds with proper CMake dependency tracking
- Support Python 3.8-3.14 with proper Cython directives
Benefits:
- Incremental builds work correctly (only rebuild changed files)
- Modern PEP 517/518 compliant build system
- Build artifacts cached in build/{wheel_tag} directories
- Better integration with pip and modern Python tooling
- No more need for custom _py_backend build hooks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add build-time file generation and ignore generated files
This commit adds the missing build-time steps from setup.py:
- Header generation from JSON files (generate_headers.py)
- Cython constants module generation (generate_constants_module.py)
- Copying headers, fmtlib, and BibTeX file to package directory
Also updates .gitignore to ignore:
- wrappers/Python/CoolProp/include/ (generated during build)
- wrappers/Python/CoolProp/CoolPropBibTeXLibrary.bib (copied during build)
Includes test script to verify wheel contents match between old and new build approaches.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Set CMAKE_POSITION_INDEPENDENT_CODE for shared library build
Enable -fPIC flag for all targets to ensure proper shared library compilation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove deprecated buildbot configuration
The buildbot system is deprecated and no longer in use.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update extract_version.py to use .version file instead of setup.py
With the migration to scikit-build-core, version information is now stored
in the .version file and read by pyproject.toml. Updated the script to:
- Rename replace_setup_py() to replace_version_file()
- Update .version file instead of modifying setup.py
- Change --replace-setup-py flag to --replace-version
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update build scripts and documentation for scikit-build-core
Changes:
- Updated documentation to show modern pip-based installation
- Updated manylinux build script to use pip wheel instead of setup.py
- Updated conda metadata generator to use pip install
- Removed deprecated PyPI preparation script (replaced by `python -m build --sdist`)
All build infrastructure now uses the new scikit-build-core build system.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update manylinux Docker script for scikit-build-core
Removed SETUP_PY_ARGS since cmake options are no longer passed via
setup.py arguments. The new build system uses CMake directly via
scikit-build-core. Also fixed typo and updated install_root path.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove deprecated _py_backend custom build backend
The _py_backend was a custom setuptools build backend wrapper used
with the old setup.py build system. It's no longer needed with
scikit-build-core.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add uv package manager documentation
Added section on using uv (Astral's fast Python package manager) to
install and work with CoolProp. Includes examples for:
- Installing in current environment
- Creating new projects with CoolProp
- Running scripts with automatic environment management
- Development installations from source
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix sdist packaging and update scikit-build-core config
Changes:
- Updated pyproject.toml to use newer scikit-build-core config syntax
- cmake.minimum-version → cmake.version
- cmake.verbose → build.verbose
- Added sdist.include to ensure .version file is in source distributions
- Added .version to MANIFEST.in for completeness
This fixes the issue where building a wheel from an sdist would fail
due to missing .version file. Now sdist → wheel builds work correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Rename setup.py to deprecated_setup.py
The old setuptools-based build system has been fully replaced with
scikit-build-core. Renaming setup.py to deprecated_setup.py to:
- Clearly indicate it's no longer the primary build method
- Keep it available for reference and backward compatibility
- Prevent accidental use of the old build system
Users should now use: pip install .
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update GitHub Actions workflows for new build system
Changes:
- Replace --replace-setup-py with --replace-version flag
- Update sdist build to use 'python -m build --sdist' instead of deprecated prepare_pypi.py
- Workflows now work with scikit-build-core build system
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix cibuildwheel to build from repository root
With scikit-build-core, the pyproject.toml is at the repository root,
not in wrappers/Python/. Updated cibuildwheel configuration:
- Changed package-dir from ./wrappers/Python/ to .
- Removed redundant CIBW_BEFORE_BUILD (dependencies are in pyproject.toml)
- Build dependencies are now automatically installed by pip from pyproject.toml
This fixes the "Multiple top-level packages discovered" error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Set macOS deployment target to 11.0 in pyproject.toml
Configure MACOSX_DEPLOYMENT_TARGET=11.0 (Big Sur) in cibuildwheel config.
This matches the setting in GitHub Actions and ensures wheels are built
with consistent compatibility for macOS 11.0 and later.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove old pyproject.toml from wrappers/Python
This file was used by the old setuptools build system. With
scikit-build-core, the main pyproject.toml at the repository root
is now used for all Python packaging configuration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove redundant PyPy skip selector from cibuildwheel
The 'pp*' skip selector was causing a warning because PyPy isn't enabled
in the build matrix anyway. Since we explicitly specify only CPython
versions in the build directive (cp38-*, cp39-*, etc.), the pp* skip is
unnecessary.
Fixes warning: "Invalid skip selector: 'pp*'. This selector matches a
group that wasn't enabled."
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update fmtlib from 11.1.3 to 12.0.0
Updated the fmtlib submodule to the latest stable release (12.0.0).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Remove pdsim
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Add Windows Instructions and example
I added how to use the wrapper for Windows through the shared library. There might be a better way using the static library, but I believe this method works for 99% of use cases.
* Update Windows setup instructions in Fluent README
Clarified and expanded the step-by-step instructions for setting up CoolProp with Fluent on Windows. Added details about launching Fluent, using absolute paths, and using '//' in paths. Improved clarity and fixed minor typos.
* Update Windows instructions in Fluent wrapper README
Added clarification about limitations of using the shared library method and recommended using a static library for more robust results. Minor formatting and wording improvements were also made to the step-by-step instructions.
* Add ability to get at the ideal-gas properties directly
Also through the python interface
* And python interface files
* Fixes the missing reference to ideal gas notebook
Use regex with negative lookbehind to avoid splitting names like '1,2-dichloroethane'
into separate aliases. This fixes the issue where chemical names containing
numbers and commas were being incorrectly split.
* Expansions are fully wrapped, looking good. Next step is the set of expansions that is the 1D approximation
* Get 1D approx working via cython
* Count solutions
* SuperAncillary class is working
>1000x speedup for water
Time for C++!
* Superancillaries are working!
In C++, speedup is more than 2000x. In Python, more like 150x because of Python <-> C++ overhead
* Add pmax check for PQ superancillary calls
* Update tests
* Allow T limits to be obtained
* Implement get_fluid_parameter_double for getting superanc value
* Add tests for getting parameters from superanc
* Script for testing superancillaries for sphinx
* Microoptimizations; don't help speed
The limiting factor remains the clear function, which takes about 30 ns
* Add R125 superancillary
* Use the release from fastchebpure for the files
* Drop a .gitignore in the unzipped folder
* Update superancillary injection script
* Turn on superancillaries by default
* Missing header
* Many int conversions in superancillary
* Another int cast
* More annoying solution for boost iter max
* Fix warnings
* One more warning
* Clear up the calculation of rho
* Update docs_docker-build.yml
Use arm64 since the containers were built on mac
* Superfluous ;
* Update backend.py
* Get the critical points working for superancillaries
* Fix wrapping changes of xmin&xmax methods
* squelch warnings
* Version 0 of jupyter notebook for docs
* Try to add the notebook to the docs
* Add jupyter notebook for superancillary
* Lots of updates to superancillary notebook
* More updates to docs
* Skip pseudo-pure for superancillary docs
* Fix output of superancillary figures
* Add superancillary plots to docs for the page for each fluid
* Make a placeholder figure for fluids without superancillary
* Add superancillary plots to task list
* Bump to release fixing m-xylene
* Relax the location of the REFPROP stuff
* Change default name for R-1336mzz(E)
* No need for figures to be so large
* Don't need REFPROP setting
* Bump to fastchebpure release with methanol
* Benchmark caching options
* Benchmark more granularly
* Add the fast methods to public API for HEOS class
* Back to memset - can memset with 0 but no other value
* Fix how caching is managed in Helmholtz class
* Close to final implementation
Perhaps a tiny bit more optimization possible?
* Update function name
* Make message more accurate
* Fix init order
* Expose update_QT_pure_superanc to Python
* Fix when _reducing is set for pures
* Fix the post_update
* Indent
* Notebook
* Notebook
* Make ln(p) construction lazy
Only really matters for debug builds
* Also make reference non-const
* Inject superancillary for methanol
* Make the superancillary loading entirely lazy in debug
* Fix PH bug for Nitrogen
Closes#2470
* Force the clear to be called on SatL and SatV
To invalidate them at start
* Default is non-lazy superancillary loading
* Add CMake option to have lazy-loading superancillaries [skip ci]
Not a good idea unless doing very narrow testing
* Ignore depcache files [skip ci]
* Z lib compress the fluid data
And migrate to newer version of miniz
* Add the writing of the .z file
* This works on MSVC, not sure about any other platform
How does one inform the linker about what locations to search for this file?
* Does this give the necessary linking info to the compiler?
* Include the header only for MSVC
* The incbin is still needed for non-windows
* Missing headers for Python
* Add miniz source file
* Missing import
* Provide a solution for compilers that don't support assembly to embed files
* Don't specify standard since we have mixed C/C++
https://stackoverflow.com/questions/49000674/cython-std-c11-error-using-both-c-and-c
* rename miniz to cpp
* And cmake
* Back to .c again
Not sure what to do about Python now
* Build the C library and then link it in
* FIx cmake too
* Location for .z file
* arg to setup function
* Check for z file [skip ci]
* Force build temp to be here
* Try switching to setuptools version
* Force the build_temp to be build before clib construction begins
That was subtle...
Test whether renaming the project in setup.py is enough. Does not impact the package name (CoolProp) that is included in the wheel so user code should not change
* Add PTC Libs and Terms of Use to wrappers/Mathcad
* Convert Mathcad README files from RST to MD
* Run Mathcad workflow with local Repo Files
* Allow Mathcad workflow to be called by other workflows
When i tried to plot log(p)-h-diagrams there always had been an issue in the common.py file in line 481. By deleting the "Isoline, self" between the () of super in this line i could fix this an the plots were generated. So i made this pull request.
* Update setup.py replace distutils with setuptools
PEP 632 – Deprecate distutils module.
Edit line 4-6:
from distutils.version import LooseVersion
from distutils.sysconfig import get_config_var
from setuptools.command.build_ext import build_ext
To
from packaging.version import Version
from sysconfig import get_config_var
from setuptools.command.build_ext import build_ext
Edit line 291:
cython_version = Version (Cython.__version__)
To
cython_version = str(Version (Cython.__version__))
Edit line 353:
from distutils.errors import CompileError
To
from setuptools import CompileError
Edit line 394:
from Cython.Distutils.extension import Extension
To
from setuptools.extension import Extension
Delete line 396:
from Cython.Distutils import build_ext
This is now handled with line 6 and thus redundant
from setuptools.command.build_ext import build_ext
Edit line 3, 60, 61 62, 66, 77, 229, and 291
Replace all instances of LooseVersion with Version
* Update python_buildwheels.yml
* Update python_cibuildwheel.yml
* Update setup.py
* Update setup.py
* Update setup.py
* Update python_buildwheels.yml
Added module packaging to the list of dependencies.
* Update python_cibuildwheel.yml
Updated cibuildwheel version form 2.17.0 to latest edition 2.21.3 for python 3.13 support.
* Update python_buildwheels.yml
Deleted lines with python specific exclusions for Windows ARM64 as it already excluded generically.
* Update python_buildwheels.yml
Deleted lines with python specific exclusions for MacOS as these are no longer supported.