Skip to content
Merged
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 .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,17 @@ jobs:
exodusii==2022.10.* \
fmt=11.* \
yaml-cpp==0.8.0 \
pybind11 \
pytest \
flake8 \
lcov

- name: Configure
run: |
cmake -S . -B ${{ github.workspace }}/build \
-DGCOV_PATH=`which x86_64-conda-linux-gnu-gcov` \
-DEXODUSIICPP_LIBRARY_TYPE=SHARED \
-DEXODUSIICPP_WITH_PYTHON=ON \
-DEXODUSIICPP_BUILD_TESTS=YES \
-DEXODUSIICPP_CODE_COVERAGE=YES

Expand Down
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16)
cmake_minimum_required(VERSION 3.26)

project(exodusIIcpp
VERSION 3.0.0
Expand All @@ -24,6 +24,7 @@ set_property(CACHE EXODUSIICPP_LIBRARY_TYPE PROPERTY STRINGS ${LibraryTypeValues
option(EXODUSIICPP_BUILD_TESTS "Build tests" NO)
option(EXODUSIICPP_BUILD_TOOLS "Build tools" YES)
option(EXODUSIICPP_INSTALL "Install the library" ON)
option(EXODUSIICPP_WITH_PYTHON "Build python wrapper" NO)
mark_as_advanced(FORCE EXODUSIICPP_INSTALL)

find_package(fmt 11 REQUIRED)
Expand Down Expand Up @@ -59,6 +60,10 @@ if (EXODUSIICPP_BUILD_TOOLS)
add_subdirectory(tools)
endif()

if (EXODUSIICPP_WITH_PYTHON)
add_subdirectory(python)
endif()

# Tests

if (EXODUSIICPP_BUILD_TESTS)
Expand Down
15 changes: 15 additions & 0 deletions python/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
find_package(Python3 REQUIRED COMPONENTS Interpreter Development)

configure_file(pyproject.toml.in pyproject.toml)
install(CODE "execute_process(COMMAND ${Python3_EXECUTABLE} -m pip install ${CMAKE_CURRENT_BINARY_DIR})")

add_subdirectory(src)

if (EXODUSIICPP_BUILD_TESTS)
find_program(PYTEST "pytest" REQUIRED)
enable_testing()
add_test(
NAME python-tests
COMMAND ${PYTEST} ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
10 changes: 10 additions & 0 deletions python/pyproject.toml.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "exodusIIcpp"
version = "${PROJECT_VERSION}"

[tool.setuptools.packages.find]
where = ["src"]
38 changes: 38 additions & 0 deletions python/src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
project(pyexodusIIcpp LANGUAGES C CXX)

find_package(pybind11 2.9 REQUIRED)

pybind11_add_module(pyexodusIIcpp exodusIIcpp.cpp)

set_target_properties(pyexodusIIcpp PROPERTIES OUTPUT_NAME exodusIIcpp)

target_include_directories(
pyexodusIIcpp
PRIVATE
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/include
${PROJECT_BINARY_DIR}
)

target_link_libraries(
pyexodusIIcpp
PUBLIC
exodusIIcpp
)

configure_file(version.h.in version.h)

set(PYTHON_SITE lib/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages)

install(
TARGETS pyexodusIIcpp
COMPONENT python
LIBRARY DESTINATION ${PYTHON_SITE}/exodusIIcpp
)

install(
FILES
${CMAKE_CURRENT_SOURCE_DIR}/exodusIIcpp/__init__.py
DESTINATION ${PYTHON_SITE}/exodusIIcpp
COMPONENT python
)
96 changes: 96 additions & 0 deletions python/src/exodusIIcpp.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// SPDX-FileCopyrightText: 2025 David Andrs <[email protected]>
// SPDX-License-Identifier: MIT

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "exodusIIcpp/exodusIIcpp.h"
#include "version.h"

using namespace exodusIIcpp;

namespace py = pybind11;

PYBIND11_MODULE(exodusIIcpp, m)
{
m.doc() = "pybind11 plugin for exodusIIcpp";
py::setattr(m, "version", py::str(EXODUSIICPP_VERSION));

py::class_<exodusIIcpp::File>(m, "File")
.def(py::init())
.def("open", &File::open)
.def("create", &File::create)
.def("is_opened", &File::is_opened)
.def("init", static_cast<void (File::*)()>(&File::init))
.def("init",
static_cast<void (File::*)(const char *, int, int, int, int, int, int)>(&File::init))
//
.def("get_title", &File::get_title)
.def("get_dim", &File::get_dim)
.def("get_num_nodes", &File::get_num_nodes)
.def("get_num_elements", &File::get_num_elements)
.def("get_num_element_blocks", &File::get_num_element_blocks)
.def("get_num_node_sets", &File::get_num_node_sets)
.def("get_num_side_sets", &File::get_num_side_sets)
.def("get_x_coords", &File::get_x_coords)
.def("get_y_coords", &File::get_y_coords)
.def("get_z_coords", &File::get_z_coords)
.def("get_coord_names", &File::get_coord_names)
.def("get_element_block", &File::get_element_block)
.def("get_side_sets", &File::get_side_sets)
.def("get_side_set_node_list", &File::get_side_set_node_list)
.def("get_node_sets", &File::get_node_sets)
.def("get_num_times", &File::get_num_times)
.def("get_times", &File::get_times)
.def("get_nodal_variable_names", &File::get_nodal_variable_names)
.def("get_elemental_variable_names", &File::get_elemental_variable_names)
.def("get_global_variable_names", &File::get_global_variable_names)
.def("get_nodal_variable_values", &File::get_nodal_variable_values)
.def("get_elemental_variable_values", &File::get_elemental_variable_values)
.def("get_global_variable_values",
static_cast<std::vector<double> (File::*)(int) const>(
&File::get_global_variable_values))
// read
.def("read", &File::read)
.def("read_coords", &File::read_coords)
.def("read_coord_names", &File::read_coord_names)
.def("read_elem_map", &File::read_elem_map)
.def("read_blocks", &File::read_blocks)
.def("read_block_names", &File::read_block_names)
.def("read_node_sets", &File::read_node_sets)
.def("read_node_set_names", &File::read_node_set_names)
.def("read_side_sets", &File::read_side_sets)
.def("read_side_set_names", &File::read_side_set_names)
.def("read_times", &File::read_times)
// write
.def("write_coords",
static_cast<void (File::*)(const std::vector<double> &)>(&File::write_coords))
.def("write_coords",
static_cast<void (File::*)(const std::vector<double> &, const std::vector<double> &)>(
&File::write_coords))
.def("write_coords",
static_cast<void (File::*)(const std::vector<double> &,
const std::vector<double> &,
const std::vector<double> &)>(&File::write_coords))
.def("write_coord_names", static_cast<void (File::*)()>(&File::write_coord_names))
.def(
"write_coord_names",
static_cast<void (File::*)(const std::vector<std::string> &)>(&File::write_coord_names))
.def("write_info", &File::write_info)
.def("write_time", &File::write_time)
.def("write_node_set_names", &File::write_node_set_names)
.def("write_node_set", &File::write_node_set)
.def("write_side_set_names", &File::write_side_set_names)
.def("write_side_set", &File::write_side_set)
.def("write_block_names", &File::write_block_names)
.def("write_block", &File::write_block)
.def("write_nodal_var_names", &File::write_nodal_var_names)
.def("write_elem_var_names", &File::write_elem_var_names)
.def("write_global_var_names", &File::write_global_var_names)
.def("write_nodal_var", &File::write_nodal_var)
.def("write_partial_nodal_var", &File::write_partial_nodal_var)
.def("write_partial_elem_var", &File::write_partial_elem_var)
.def("write_global_var", &File::write_global_var)
//
.def("update", &File::update)
.def("close", &File::close);
}
5 changes: 5 additions & 0 deletions python/src/exodusIIcpp/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .exodusIIcpp import *

__all__ = [
File
]
3 changes: 3 additions & 0 deletions python/src/version.h.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

#define EXODUSIICPP_VERSION "@CMAKE_PROJECT_VERSION_MAJOR@.@[email protected]"
Loading