Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@ build

# Local conda environments
.conda

# Python cache artifacts
__pycache__/
*.py[cod]
132 changes: 94 additions & 38 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
option(STORMM_BUILD_APPS "Build the apps" ON)
option(STORMM_BUILD_TESTS "Build the tests" ON)
option(STORMM_BUILD_BENCHMARKS "Build the benchmarks" ON)

# Preserve compatibility with older build scripts while migrating to STORMM_ENABLE_PYTHON.
if (DEFINED STORMM_BUILD_PYTHON AND NOT DEFINED STORMM_ENABLE_PYTHON)
set(STORMM_ENABLE_PYTHON ${STORMM_BUILD_PYTHON})
message(WARNING "STORMM_BUILD_PYTHON is deprecated; use STORMM_ENABLE_PYTHON instead.")
endif()
option(STORMM_ENABLE_PYTHON "Enable the Python bridge library" ON)
option(STORMM_ENABLE_CUDA "Enable CUDA support" ON)
option(STORMM_ENABLE_RDKIT "Enable RDKIT support" ON)
option(STORMM_ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
Expand Down Expand Up @@ -86,61 +93,91 @@ if (STORMM_INCLUDE_NETCDF)
set(NETCDF_C_INSTALL_DIR ${NETCDF_INSTALL_DIR}/install)
set(NETCDF_CXX_INSTALL_DIR ${NETCDF_INSTALL_DIR}/install-cxx)

# --- Install HDF5 ---
# --- Install HDF5 ---
ExternalProject_Add(
HDF5
GIT_REPOSITORY https://github.com/HDFGroup/hdf5.git
GIT_TAG hdf5-1_14_3
GIT_PROGRESS 1
GIT_SHALLOW 1
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${HDF5_INSTALL_DIR}
-DBUILD_SHARED_LIBS=ON
-DHDF5_BUILD_HL_LIB=ON
-DHDF5_ENABLE_Z_LIB_SUPPORT=ON
-DHDF5_BUILD_CPP_LIB=ON
-DHDF5_BUILD_TOOLS=OFF
-DHDF5_BUILD_EXAMPLES=OFF
-DHDF5_BUILD_JAVA=OFF
-DHDF5_BUILD_FORTRAN=OFF
-DHDF5_BUILD_UTILS=OFF
-DHDF5_ENABLE_PARALLEL=OFF
-DHDF5_ENABLE_THREADSAFE=OFF
-DHDF5_ENABLE_DIRECT_VFD=ON
-DHDF5_ENABLE_EMBEDDED_LIBINFO=ON
BUILD_COMMAND ${CMAKE_COMMAND} --build . --parallel
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
HDF5
GIT_REPOSITORY https://github.com/HDFGroup/hdf5.git
GIT_TAG hdf5-1_14_3
GIT_PROGRESS 1
GIT_SHALLOW 1
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${HDF5_INSTALL_DIR}
-DBUILD_SHARED_LIBS=ON
-DHDF5_BUILD_HL_LIB=ON
-DHDF5_ENABLE_Z_LIB_SUPPORT=ON
-DHDF5_BUILD_CPP_LIB=ON
-DHDF5_BUILD_TOOLS=OFF
-DHDF5_BUILD_EXAMPLES=OFF
-DHDF5_BUILD_JAVA=OFF
-DHDF5_BUILD_FORTRAN=OFF
-DHDF5_BUILD_UTILS=OFF
-DHDF5_ENABLE_PARALLEL=OFF
-DHDF5_ENABLE_THREADSAFE=OFF
-DHDF5_ENABLE_DIRECT_VFD=ON
-DHDF5_ENABLE_EMBEDDED_LIBINFO=ON
# Add these lines to disable network features that require CURL
-DHDF5_ENABLE_ROS3_VFD=OFF
-DHDF5_ENABLE_DAP=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . --parallel
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
)

# Set include and library paths
set(HDF5_INCLUDE_DIR ${HDF5_INSTALL_DIR}/include)
set(HDF5_LIBRARY ${HDF5_INSTALL_DIR}/lib/libhdf5${CMAKE_SHARED_LIBRARY_SUFFIX})

# --- Install NetCDF-C (Requires HDF5) ---
ExternalProject_Add(
NetCDFC
GIT_REPOSITORY https://github.com/Unidata/netcdf-c.git
GIT_TAG main
GIT_TAG v4.9.2
GIT_PROGRESS 1
DEPENDS HDF5
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${NETCDF_C_INSTALL_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DBUILD_SHARED_LIBS=ON
-DNETCDF_ENABLE_HDF5=ON
-DNETCDF_ENABLE_DAP=OFF
-DNETCDF_ENABLE_TESTS=OFF
-DENABLE_NETCDF_4=ON
-DENABLE_DAP=ON
-DENABLE_TESTS=OFF
-DBUILD_UTILITIES=OFF
-DHDF5_ROOT=${HDF5_INSTALL_DIR}
-DHDF5_DIR=${HDF5_INSTALL_DIR}/lib/cmake/hdf5
-DCMAKE_PREFIX_PATH=${HDF5_INSTALL_DIR}
# Suppress compiler warnings (optional)
-DCMAKE_C_FLAGS=-w
BUILD_COMMAND ${CMAKE_COMMAND} --build . --parallel
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
)

# Set include and library paths
# Create imported targets for easier linking
add_library(HDF5::HDF5 SHARED IMPORTED)
set_target_properties(HDF5::HDF5 PROPERTIES
IMPORTED_LOCATION ${HDF5_INSTALL_DIR}/lib/libhdf5${CMAKE_SHARED_LIBRARY_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES ${HDF5_INSTALL_DIR}/include
)

add_library(NetCDF::NetCDF SHARED IMPORTED)
set_target_properties(NetCDF::NetCDF PROPERTIES
IMPORTED_LOCATION ${NETCDF_C_INSTALL_DIR}/lib/libnetcdf${CMAKE_SHARED_LIBRARY_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES ${NETCDF_C_INSTALL_DIR}/include
INTERFACE_LINK_LIBRARIES HDF5::HDF5
)

# Add dependencies to ensure external projects are built before imported targets are used
add_dependencies(HDF5::HDF5 HDF5)
add_dependencies(NetCDF::NetCDF NetCDFC)

# Set variables for compatibility (if your code expects these)
set(HDF5_INCLUDE_DIR ${HDF5_INSTALL_DIR}/include)
set(HDF5_LIBRARY ${HDF5_INSTALL_DIR}/lib/libhdf5${CMAKE_SHARED_LIBRARY_SUFFIX})
set(NETCDF_C_INCLUDE_DIR ${NETCDF_C_INSTALL_DIR}/include)
set(NETCDF_C_LIBRARY ${NETCDF_C_INSTALL_DIR}/lib/libnetcdf${CMAKE_SHARED_LIBRARY_SUFFIX})

# Add compile definitions
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTORMM_USE_NETCDF")
if(STORMM_ENABLE_CUDA)
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -DSTORMM_USE_NETCDF")
endif()
endif()


# --- RDKit Integration ---
if (STORMM_ENABLE_RDKIT)
message("-- RDKit support will be enabled")
Expand Down Expand Up @@ -192,12 +229,12 @@ file(WRITE ${CMAKE_BINARY_DIR}/check_memory.cmake
OUTPUT_VARIABLE AVAILABLE_MEM_KB
OUTPUT_STRIP_TRAILING_WHITESPACE
)

string(REGEX REPLACE \"[^0-9]\" \"\" TOTAL_MEM_KB \"\${TOTAL_MEM_KB}\")
string(REGEX REPLACE \"[^0-9]\" \"\" AVAILABLE_MEM_KB \"\${AVAILABLE_MEM_KB}\")

math(EXPR USED_PERCENT \"100 - (\${AVAILABLE_MEM_KB} * 100 / \${TOTAL_MEM_KB})\")

if(USED_PERCENT GREATER 70)
message(WARNING \"System memory usage is at \${USED_PERCENT}% (above 70% threshold)\")
message(STATUS \"Available memory: \${AVAILABLE_MEM_KB}KB of \${TOTAL_MEM_KB}KB total\")
Expand All @@ -221,13 +258,13 @@ elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL \"Darwin\")
OUTPUT_VARIABLE TOTAL_MEM_B
OUTPUT_STRIP_TRAILING_WHITESPACE
)

string(REGEX REPLACE \"[^0-9]\" \"\" FREE_PAGES \"\${FREE_PAGES}\")
string(REGEX REPLACE \"[^0-9]\" \"\" INACTIVE_PAGES \"\${INACTIVE_PAGES}\")

math(EXPR AVAILABLE_MEM_B \"(\${FREE_PAGES} + \${INACTIVE_PAGES}) * 4096\")
math(EXPR AVAILABLE_PERCENT \"(\${AVAILABLE_MEM_B} * 100 / \${TOTAL_MEM_B})\")

if(AVAILABLE_PERCENT GREATER 70)
message(WARNING \"System memory availability is at \${AVAILABLE_PERCENT}% (above 70% threshold)\")
message(STATUS \"Available memory: \${AVAILABLE_MEM_B} bytes of \${TOTAL_MEM_B} bytes total\")
Expand Down Expand Up @@ -494,3 +531,22 @@ endif()
if (STORMM_BUILD_BENCHMARKS)
add_subdirectory(benchmark)
endif()

#--- Build the Python bridge ---
if (STORMM_ENABLE_PYTHON)
# Build a small C ABI layer for Python ctypes clients. This target links against the main
# STORMM shared library and exports stable, pointer-based entry points.
add_library(stormm_pybridge SHARED python/cpp/stormm_pybridge.cpp)
target_include_directories(stormm_pybridge
PRIVATE
${CMAKE_SOURCE_DIR}/src
)
target_link_libraries(stormm_pybridge
PRIVATE
${PROJECT_NAME}
)
set_target_properties(stormm_pybridge PROPERTIES
OUTPUT_NAME "stormm_pybridge"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)
endif()
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ the cmake command prefaced with ```-D``` ("define"). They include:
unlock any real functionality. Some features of STORMM are a stepping stone to information
processing with RDKit, and some features of RDKit will enhance the capabilities on the STORMM
roadmap.
- ```-DSTORMM_ENABLE_PYTHON``` with values ```ON``` or ```OFF``` (default ```ON```). This will
enable or disable compilation of the ```stormm_pybridge``` shared library that supports Python
interfaces built on ```ctypes```.
- ```-DCUSTOM_GPU_ARCH``` with many values separated by semicolons (```;```) with no spaces. Apply
whatever architectures will be necessary for the GPUs available. ```52``` will serve Maxwell
GPUs such as the GTX 980, ```61``` will serve consumer-grade Pascal GPUs such as the GTX 1080 Ti,
Expand Down
46 changes: 46 additions & 0 deletions python/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# STORMM Python Layer (CPU)

This directory provides a Python interface to existing STORMM C++ code. It does not reimplement
STORMM.

## Layout

- `cpp/stormm_pybridge.h`: documented C ABI declarations consumed by Python `ctypes`
- `cpp/stormm_pybridge.cpp`: C++ implementations that marshal Python-compatible arguments into
native STORMM objects
- `stormm/dynamics.py`: thin Python wrappers and convenience classes
- `examples/dynamics_end_to_end.py`: runnable example that exercises all wrapped object types

## Build

From the repository root:

```bash
cmake -S . -B build -DSTORMM_ENABLE_CUDA=OFF -DSTORMM_ENABLE_PYTHON=ON
cmake --build build --target stormm_pybridge -j4
```

This produces `build/libstormm_pybridge.*` and the Python module loads it with `ctypes`.

## Use

Set `PYTHONPATH` to this repository's `python/` directory:

```bash
PYTHONPATH=python python3 -c "from stormm import dynamics; print(dynamics.state_variable_names()[:5])"
```

## End-to-end Demo

```bash
PYTHONPATH=python python3 python/examples/dynamics_end_to_end.py
```

The demo creates, from Python:

- `AtomGraph`
- `PhaseSpace`
- `AtomGraphSynthesis`
- `PhaseSpaceSynthesis`

Then it runs STORMM `dynamics(...)` and reads results back into Python.
Loading