diff --git a/build-config/hypre/meson.build b/build-config/hypre/meson.build index 72951bf..9e24347 100644 --- a/build-config/hypre/meson.build +++ b/build-config/hypre/meson.build @@ -1,2 +1,9 @@ -hypre_sp = cmake.subproject('hypre') +hypre_cpp_cmake_options = cmake.subproject_options() +hypre_cpp_cmake_options.add_cmake_defines({ + 'BUILD_SHARED_LIBS': 'ON', +}) +hypre_sp = cmake.subproject( + 'hypre', + options: hypre_cpp_cmake_options, +) hypre_dep = hypre_sp.dependency('HYPRE') diff --git a/build-config/opatIO/meson.build b/build-config/opatIO/meson.build index 01ae467..4a69f2e 100644 --- a/build-config/opatIO/meson.build +++ b/build-config/opatIO/meson.build @@ -1,5 +1,10 @@ # Get the subproject object first -opat_sub = subproject('opat-core') +opat_sub = subproject( + 'opat-core', + default_options: { + 'generate_pc': false + } +) # Get the dependency variable from that subproject opatio_dep = opat_sub.get_variable('opatio_dep') \ No newline at end of file diff --git a/build-python/meson.build b/build-python/meson.build index 7141c6e..48236f5 100644 --- a/build-python/meson.build +++ b/build-python/meson.build @@ -2,21 +2,22 @@ py_installation = import('python').find_installation('python3') py_mod = py_installation.extension_module( - 'fourdsse_bindings', # Name of the generated .so/.pyd file (without extension) + 'serif', # Name of the generated .so/.pyd file (without extension) sources: [ meson.project_source_root() + '/src/python/bindings.cpp', meson.project_source_root() + '/src/python/composition/bindings.cpp', meson.project_source_root() + '/src/python/const/bindings.cpp', meson.project_source_root() + '/src/python/config/bindings.cpp', + meson.project_source_root() + '/src/python/eos/bindings.cpp', ], dependencies : [ pybind11_dep, const_dep, config_dep, composition_dep, + eos_dep, species_weight_dep ], cpp_args : ['-UNDEBUG'], # Example: Ensure assertions are enabled if needed install : true, - subdir: 'fourdstar' # Optional: Install the module inside a 'fourdsse' Python package directory ) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 1ebe206..e3f38b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,8 +7,8 @@ requires = [ build-backend = "mesonpy" [project] -name = "fourdstar" # Choose your Python package name -version = "0.1.0" # Your project's version +name = "serif" # Choose your Python package name +version = "0.0.1a" # Your project's version description = "Python interface for the 4DSSE C++ project" readme = "Readme.md" license = { file = "LICENSE.txt" } # Reference your license file [cite: 2] diff --git a/src/eos/meson.build b/src/eos/meson.build index f7abb67..00e285c 100644 --- a/src/eos/meson.build +++ b/src/eos/meson.build @@ -1,12 +1,12 @@ # Define the library eos_sources = files( 'private/helm.cpp', - 'private/eosIO.cpp' + 'private/EOSio.cpp' ) eos_headers = files( 'public/helm.h', - 'public/eosIO.h' + 'public/EOSio.h' ) dependencies = [ diff --git a/src/eos/private/eosIO.cpp b/src/eos/private/EOSio.cpp similarity index 86% rename from src/eos/private/eosIO.cpp rename to src/eos/private/EOSio.cpp index d87c789..03a6b43 100644 --- a/src/eos/private/eosIO.cpp +++ b/src/eos/private/EOSio.cpp @@ -19,28 +19,29 @@ // // *********************************************************************** */ #include +#include -#include "eosIO.h" +#include "EOSio.h" #include "helm.h" #include "debug.h" #include namespace serif::eos { - EosIO::EosIO(const std::string filename) : m_filename(filename) { + EOSio::EOSio(const std::string &filename) : m_filename(filename) { load(); } - std::string EosIO::getFormat() const { + std::string EOSio::getFormat() const { return m_format; } - EOSTable& EosIO::getTable() { + EOSTable& EOSio::getTable() { return m_table; } - void EosIO::load() { + void EOSio::load() { // Load the EOS table from the file // For now, just set the format to HELM @@ -50,7 +51,7 @@ namespace serif::eos { } } - void EosIO::loadHelm() { + void EOSio::loadHelm() { // Load the HELM table from the file auto helmTabptr = serif::eos::helmholtz::read_helm_table(m_filename); m_table = std::move(helmTabptr); diff --git a/src/eos/private/helm.cpp b/src/eos/private/helm.cpp index 99c8cdb..1c18b05 100644 --- a/src/eos/private/helm.cpp +++ b/src/eos/private/helm.cpp @@ -49,8 +49,11 @@ using namespace std; // interpolating polynomila function definitions namespace serif::eos::helmholtz { - double** heap_allocate_contiguous_2D_memory(int rows, int cols) { - auto array = new double*[rows]; + double** heap_allocate_contiguous_2D_memory(const int rows, const int cols) { + if (rows <= 0 || cols <= 0) { + throw std::invalid_argument("Rows and columns must be positive integers."); + } + const auto array = new double*[rows]; array[0] = new double[rows * cols]; for (int i = 1; i < rows; i++) { @@ -64,34 +67,34 @@ namespace serif::eos::helmholtz { delete[] array[0]; delete[] array; } - double psi0(double z) { return z*z*z * (z * (-6.0 * z + 15.0) - 10.0) + 1.0; } + double psi0(const double z) { return z*z*z * (z * (-6.0 * z + 15.0) - 10.0) + 1.0; } - double dpsi0(double z) { return z*z * ( z * (-30.0 * z + 60.0) - 30.0); } + double dpsi0(const double z) { return z*z * ( z * (-30.0 * z + 60.0) - 30.0); } - double ddpsi0(double z) { return z * ( z * (-120.0 * z + 180.0) - 60.0); } + double ddpsi0(const double z) { return z * ( z * (-120.0 * z + 180.0) - 60.0); } - double psi1(double z) { return z * ( z*z * ( z * (-3.0*z + 8.0) - 6.0) + 1.0); } + double psi1(const double z) { return z * ( z*z * ( z * (-3.0*z + 8.0) - 6.0) + 1.0); } - double dpsi1(double z) { return z*z * ( z * (-15.0*z + 32.0) - 18.0) +1.0; } + double dpsi1(const double z) { return z*z * ( z * (-15.0*z + 32.0) - 18.0) +1.0; } - double ddpsi1(double z) { return z * (z * (-60.0*z + 96.0) - 36.0); } + double ddpsi1(const double z) { return z * (z * (-60.0*z + 96.0) - 36.0); } - double psi2(double z) { return 0.5 * z*z * ( z* ( z * (-z + 3.0) - 3.0) + 1.0); } + double psi2(const double z) { return 0.5 * z*z * ( z* ( z * (-z + 3.0) - 3.0) + 1.0); } - double dpsi2(double z) { return 0.5 * z * ( z * (z * (-5.0*z + 12.0) - 9.0) + 2.0); } + double dpsi2(const double z) { return 0.5 * z * ( z * (z * (-5.0*z + 12.0) - 9.0) + 2.0); } - double ddpsi2(double z) { return 0.5*(z*( z * (-20.*z + 36.) - 18.) + 2.); } + double ddpsi2(const double z) { return 0.5*(z*( z * (-20.*z + 36.) - 18.) + 2.); } - double xpsi0(double z) { return z * z * (2.0 * z - 3.0) + 1.0; } + double xpsi0(const double z) { return z * z * (2.0 * z - 3.0) + 1.0; } - double xdpsi0(double z) { return z * (6.0*z - 6.0); } + double xdpsi0(const double z) { return z * (6.0*z - 6.0); } - double xpsi1(double z) { return z * ( z * (z - 2.0) + 1.0); } + double xpsi1(const double z) { return z * ( z * (z - 2.0) + 1.0); } - double xdpsi1(double z) { return z * (3.0 * z - 4.0) + 1.0; } + double xdpsi1(const double z) { return z * (3.0 * z - 4.0) + 1.0; } - double h3(std::array fi, double w0t, double w1t, double w0mt, double w1mt, - double w0d, double w1d, double w0md, double w1md) { + double h3(const std::array &fi, const double w0t, const double w1t, const double w0mt, const double w1mt, + const double w0d, const double w1d, const double w0md, const double w1md) { return fi[0] * w0d * w0t + fi[1] * w0md * w0t + fi[2] * w0d * w0mt + fi[3] * w0md * w0mt + fi[4] * w0d * w1t + fi[5] * w0md * w1t @@ -102,9 +105,9 @@ namespace serif::eos::helmholtz { + fi[14] * w1d * w1mt + fi[15] * w1md * w1mt; } - double h5(std::array fi, double w0t, double w1t, double w2t,double w0mt, - double w1mt, double w2mt, double w0d, double w1d, double w2d, - double w0md, double w1md, double w2md) { + double h5(const std::array &fi, const double w0t, const double w1t, const double w2t, const double w0mt, + const double w1mt, const double w2mt, const double w0d, const double w1d, const double w2d, + const double w0md, const double w1md, const double w2md) { return fi[0] * w0d * w0t + fi[1] * w0md * w0t + fi[2] * w0d * w0mt + fi[3] * w0md * w0mt + fi[4] * w0d * w1t + fi[5] * w0md * w1t @@ -126,7 +129,7 @@ namespace serif::eos::helmholtz { } // this function reads in the HELM table and stores in the above arrays - std::unique_ptr read_helm_table(const std::string filename) { + std::unique_ptr read_helm_table(const std::string &filename) { serif::config::Config& config = serif::config::Config::getInstance(); auto logFile = config.get("EOS:Helm:LogFile", "log"); serif::probe::LogManager& logManager = serif::probe::LogManager::getInstance(); @@ -253,13 +256,13 @@ namespace serif::eos::helmholtz { const double kergavo = kerg*avo; const double clight2 = clight * clight; - const double ssol = 5.6704e-5; + constexpr double ssol = 5.6704e-5; const double asol = 4 * ssol / clight; const double asoli3 = asol / 3; const double sioncon = (2.0 * pi * amu * kerg)/(h*h); - const double qe = 4.8032042712e-10; - const double esqu = qe * qe; - const double third = 1./3.; + constexpr double qe = 4.8032042712e-10; + constexpr double esqu = qe * qe; + constexpr double third = 1./3.; std::array fi; double T, rho, s, free, abar, zbar, ytot1, ye, ptot; double prad, srad, erad, etot, stot; @@ -631,14 +634,14 @@ namespace serif::eos::helmholtz { // coulomb - const double a1 = -0.898004; - const double b1 = 0.96786; - const double c1 = 0.220703; - const double d1 = -0.86097; - const double e1 = 2.5269; - const double a2 = 0.29561; - const double b2 = 1.9885; - const double c2 = 0.288675; + constexpr double a1 = -0.898004; + constexpr double b1 = 0.96786; + constexpr double c1 = 0.220703; + constexpr double d1 = -0.86097; + constexpr double e1 = 2.5269; + constexpr double a2 = 0.29561; + constexpr double b2 = 1.9885; + constexpr double c2 = 0.288675; z = 4 * pi * third; s = z * xni; diff --git a/src/eos/public/eosIO.h b/src/eos/public/EOSio.h similarity index 89% rename from src/eos/public/eosIO.h rename to src/eos/public/EOSio.h index 55f8c5d..1882c07 100644 --- a/src/eos/public/eosIO.h +++ b/src/eos/public/EOSio.h @@ -33,7 +33,7 @@ namespace serif::eos { >; /** - * @class EosIO + * @class EOSio * @brief Handles the input/output operations for EOS tables. * * The EosIO class is responsible for loading and managing EOS tables from files. @@ -46,7 +46,7 @@ namespace serif::eos { * EOSTable& table = eosIO.getTable(); * @endcode */ - class EosIO { + class EOSio { private: std::string m_filename; ///< The filename of the EOS table. bool m_loaded = false; ///< Flag indicating if the table is loaded. @@ -67,23 +67,26 @@ namespace serif::eos { * @brief Constructs an EosIO object with the given filename. * @param filename The filename of the EOS table. */ - EosIO(const std::string filename); + explicit EOSio(const std::string &filename); /** * @brief Default destructor. */ - ~EosIO() = default; + ~EOSio() = default; /** * @brief Gets the format of the EOS table. * @return The format of the EOS table as a string. */ - std::string getFormat() const; + [[nodiscard]] std::string getFormat() const; /** * @brief Gets the EOS table. * @return A reference to the EOS table. */ - EOSTable& getTable(); + [[nodiscard]] EOSTable& getTable(); + + [[nodiscard]] std::string getFilename() const { return m_filename; } }; -} \ No newline at end of file +} + diff --git a/src/eos/public/helm.h b/src/eos/public/helm.h index 60112af..501db49 100644 --- a/src/eos/public/helm.h +++ b/src/eos/public/helm.h @@ -35,8 +35,8 @@ #include "debug.h" namespace serif::eos::helmholtz { - constexpr int IMAX = 541; - constexpr int JMAX = 201; + static constexpr int IMAX = 541; + static constexpr int JMAX = 201; /** * @brief 2D array template alias. * @tparam T Type of the array elements. @@ -139,118 +139,6 @@ namespace serif::eos::helmholtz { heap_deallocate_contiguous_2D_memory(xfdt); } - // // Delete copy constructor and copy assignment operator to prevent accidental shallow copies - // HELMTable(const HELMTable&) = delete; - // HELMTable& operator=(const HELMTable&) = delete; - - // // Move constructor - // HELMTable(HELMTable&& other) noexcept - // : loaded(other.loaded), - // f(other.f), fd(other.fd), ft(other.ft), fdd(other.fdd), ftt(other.ftt), fdt(other.fdt), - // fddt(other.fddt), fdtt(other.fdtt), fddtt(other.fddtt), - // dpdf(other.dpdf), dpdfd(other.dpdfd), dpdft(other.dpdft), dpdfdt(other.dpdfdt), - // ef(other.ef), efd(other.efd), eft(other.eft), efdt(other.efdt), - // xf(other.xf), xfd(other.xfd), xft(other.xft), xfdt(other.xfdt) - // { - // other.f = nullptr; - // other.fd = nullptr; - // other.ft = nullptr; - // other.fdd = nullptr; - // other.ftt = nullptr; - // other.fdt = nullptr; - // other.fddt = nullptr; - // other.fdtt = nullptr; - // other.fddtt = nullptr; - // other.dpdf = nullptr; - // other.dpdfd = nullptr; - // other.dpdft = nullptr; - // other.dpdfdt = nullptr; - // other.ef = nullptr; - // other.efd = nullptr; - // other.eft = nullptr; - // other.efdt = nullptr; - // other.xf = nullptr; - // other.xfd = nullptr; - // other.xft = nullptr; - // other.xfdt = nullptr; - // } - - // // Move assignment operator - // HELMTable& operator=(HELMTable&& other) noexcept { - // if (this != &other) { - // // Deallocate current memory - // heap_deallocate_contiguous_2D_memory(f); - // heap_deallocate_contiguous_2D_memory(fd); - // heap_deallocate_contiguous_2D_memory(ft); - // heap_deallocate_contiguous_2D_memory(fdd); - // heap_deallocate_contiguous_2D_memory(ftt); - // heap_deallocate_contiguous_2D_memory(fdt); - // heap_deallocate_contiguous_2D_memory(fddt); - // heap_deallocate_contiguous_2D_memory(fdtt); - // heap_deallocate_contiguous_2D_memory(fddtt); - // heap_deallocate_contiguous_2D_memory(dpdf); - // heap_deallocate_contiguous_2D_memory(dpdfd); - // heap_deallocate_contiguous_2D_memory(dpdft); - // heap_deallocate_contiguous_2D_memory(dpdfdt); - // heap_deallocate_contiguous_2D_memory(ef); - // heap_deallocate_contiguous_2D_memory(efd); - // heap_deallocate_contiguous_2D_memory(eft); - // heap_deallocate_contiguous_2D_memory(efdt); - // heap_deallocate_contiguous_2D_memory(xf); - // heap_deallocate_contiguous_2D_memory(xfd); - // heap_deallocate_contiguous_2D_memory(xft); - // heap_deallocate_contiguous_2D_memory(xfdt); - - // // Transfer ownership of resources - // loaded = other.loaded; - // f = other.f; - // fd = other.fd; - // ft = other.ft; - // fdd = other.fdd; - // ftt = other.ftt; - // fdt = other.fdt; - // fddt = other.fddt; - // fdtt = other.fdtt; - // fddtt = other.fddtt; - // dpdf = other.dpdf; - // dpdfd = other.dpdfd; - // dpdft = other.dpdft; - // dpdfdt = other.dpdfdt; - // ef = other.ef; - // efd = other.efd; - // eft = other.eft; - // efdt = other.efdt; - // xf = other.xf; - // xfd = other.xfd; - // xft = other.xft; - // xfdt = other.xfdt; - - // // Null out the other object's pointers - // other.f = nullptr; - // other.fd = nullptr; - // other.ft = nullptr; - // other.fdd = nullptr; - // other.ftt = nullptr; - // other.fdt = nullptr; - // other.fddt = nullptr; - // other.fdtt = nullptr; - // other.fddtt = nullptr; - // other.dpdf = nullptr; - // other.dpdfd = nullptr; - // other.dpdft = nullptr; - // other.dpdfdt = nullptr; - // other.ef = nullptr; - // other.efd = nullptr; - // other.eft = nullptr; - // other.efdt = nullptr; - // other.xf = nullptr; - // other.xfd = nullptr; - // other.xft = nullptr; - // other.xfdt = nullptr; - // } - // return *this; - // } - friend std::ostream& operator<<(std::ostream& os, const helmholtz::HELMTable& table) { if (!table.loaded) { os << "HELMTable not loaded\n"; @@ -330,20 +218,20 @@ namespace serif::eos::helmholtz { os << " Electron Chemical Potential: " << std::format("{0:24.16e}",eos.etaele) << "\n"; os << " Electron Number Density: " << std::format("{0:24.16e}",eos.xnefer) << "\n"; os << " Total Pressure: " << std::format("{0:24.16e}",eos.ptot) << "\n"; - os << " dPres/dRho: " << std::format("{0:24.16e}",eos.dpresdd) << "\n"; - os << " dPres/dT: " << std::format("{0:24.16e}",eos.dpresdt) << "\n"; - os << " Gas Pressure: " << std::format("{0:24.16e}",eos.pgas) << "\n"; + os << " dPres/dRho: " << std::format("{0:24.16e}",eos.dpresdd) << "\n"; + os << " dPres/dT: " << std::format("{0:24.16e}",eos.dpresdt) << "\n"; + os << " Gas Pressure: " << std::format("{0:24.16e}",eos.pgas) << "\n"; os << " Radiation Pressure: " << std::format("{0:24.16e}",eos.prad) << "\n"; os << " Total Energy: " << std::format("{0:24.16e}",eos.etot) << "\n"; - os << " dEner/dRho: " << std::format("{0:24.16e}",eos.denerdd) << "\n"; - os << " dEner/dT: " << std::format("{0:24.16e}",eos.denerdt) << "\n"; + os << " dEner/dRho: " << std::format("{0:24.16e}",eos.denerdd) << "\n"; + os << " dEner/dT: " << std::format("{0:24.16e}",eos.denerdt) << "\n"; os << " Gas Energy: " << std::format("{0:24.16e}",eos.egas) << "\n"; - os << " Radiation Energy: " << std::format("{0:24.16e}",eos.erad) << "\n"; - os << " Total Entropy: " << std::format("{0:24.16e}",eos.stot) << "\n"; - os << " dEntr/dRho: " << std::format("{0:24.16e}",eos.dentrdd) << "\n"; - os << " dEntr/dT: " << std::format("{0:24.16e}",eos.dentrdt) << "\n"; - os << " Gas Entropy: " << std::format("{0:24.16e}",eos.sgas) << "\n"; - os << " Radiation Entropy: " << std::format("{0:24.16e}",eos.srad); + os << " Radiation Energy: " << std::format("{0:24.16e}",eos.erad) << "\n"; + os << " Total Entropy: " << std::format("{0:24.16e}",eos.stot) << "\n"; + os << " dEntr/dRho: " << std::format("{0:24.16e}",eos.dentrdd) << "\n"; + os << " dEntr/dT: " << std::format("{0:24.16e}",eos.dentrdt) << "\n"; + os << " Gas Entropy: " << std::format("{0:24.16e}",eos.sgas) << "\n"; + os << " Radiation Entropy: " << std::format("{0:24.16e}",eos.srad); return os; } }; @@ -454,8 +342,8 @@ namespace serif::eos::helmholtz { * @param w1md Weight 1 for density (minus). * @return Result of the polynomial. */ - double h3(double fi[36], double w0t, double w1t, double w0mt, double w1mt, - double w0d, double w1d, double w0md, double w1md); + double h3(const std::array &fi, const double w0t, const double w1t, const double w0mt, const double w1mt, + const double w0d, const double w1d, const double w0md, const double w1md); /** * @brief Interpolating polynomial function h5. @@ -474,16 +362,16 @@ namespace serif::eos::helmholtz { * @param w2md Weight 2 for density (minus). * @return Result of the polynomial. */ - double h5(double fi[36], double w0t, double w1t, double w2t, double w0mt, - double w1mt, double w2mt, double w0d, double w1d, double w2d, - double w0md, double w1md, double w2md); + double h5(const std::array &fi, const double w0t, const double w1t, const double w2t, const double w0mt, + const double w1mt, const double w2mt, const double w0d, const double w1d, const double w2d, + const double w0md, const double w1md, const double w2md); /** * @brief Read the Helmholtz EOS table from a file. * @param filename Path to the file containing the table. * @return HELMTable structure containing the table data. */ - std::unique_ptr read_helm_table(const std::string filename); + std::unique_ptr read_helm_table(const std::string& filename); /** * @brief Calculate the Helmholtz EOS components. diff --git a/src/polytrope/coeff/meson.build b/src/polytrope/coeff/meson.build index 4c82cff..4fc9f22 100644 --- a/src/polytrope/coeff/meson.build +++ b/src/polytrope/coeff/meson.build @@ -6,7 +6,7 @@ polyCoeff_headers = files( 'public/polyCoeff.h' ) -libPolyCoeff = static_library('polyCoeff', +libPolyCoeff = shared_library('polyCoeff', polyCoeff_sources, include_directories : include_directories('./public'), cpp_args: ['-fvisibility=default'], diff --git a/src/polytrope/solver/meson.build b/src/polytrope/solver/meson.build index f88a183..3b52c56 100644 --- a/src/polytrope/solver/meson.build +++ b/src/polytrope/solver/meson.build @@ -39,7 +39,7 @@ dependencies = [ types_dep, ] -libPolySolver = static_library('polySolver', +libPolySolver = shared_library('polySolver', polySolver_sources, include_directories : include_directories('./public'), cpp_args: ['-fvisibility=default'], diff --git a/src/polytrope/utils/meson.build b/src/polytrope/utils/meson.build index ec0c03c..1587b3a 100644 --- a/src/polytrope/utils/meson.build +++ b/src/polytrope/utils/meson.build @@ -34,7 +34,7 @@ dependencies = [ mfemanalysis_dep, ] -libpolyutils = library('polyutils', +libpolyutils = shared_library('polyutils', polyutils_sources, include_directories : include_directories('./public'), cpp_args: ['-fvisibility=default'], diff --git a/src/python/bindings.cpp b/src/python/bindings.cpp index 1eb5d01..411c3f6 100644 --- a/src/python/bindings.cpp +++ b/src/python/bindings.cpp @@ -5,9 +5,10 @@ #include "const/bindings.h" #include "composition/bindings.h" #include "config/bindings.h" +#include "eos/bindings.h" -PYBIND11_MODULE(fourdsse_bindings, m) { - m.doc() = "Python bindings for the 4DSSE project"; +PYBIND11_MODULE(serif, m) { + m.doc() = "Python bindings for the SERiF project"; auto compMod = m.def_submodule("composition", "Composition-module bindings"); register_comp_bindings(compMod); @@ -17,4 +18,7 @@ PYBIND11_MODULE(fourdsse_bindings, m) { auto configMod = m.def_submodule("config", "Configuration-module bindings"); register_config_bindings(configMod); + + auto eosMod = m.def_submodule("eos", "EOS-module bindings"); + register_eos_bindings(eosMod); } \ No newline at end of file diff --git a/src/python/eos/bindings.cpp b/src/python/eos/bindings.cpp new file mode 100644 index 0000000..40e31d9 --- /dev/null +++ b/src/python/eos/bindings.cpp @@ -0,0 +1,162 @@ +#include +#include // Needed for vectors, maps, sets, strings +#include // Needed for binding std::vector, std::map etc if needed directly +#include + +#include +#include "helm.h" +// #include "resourceManager.h" +#include "bindings.h" +#include "EOSio.h" +#include "helm.h" +#include "../../eos/public/EOSio.h" +#include "../../eos/public/helm.h" + +namespace serif::eos { + class EOSio; +} + +namespace py = pybind11; + + +void register_eos_bindings(pybind11::module &eos_submodule) { + py::class_(eos_submodule, "EOSio") + .def(py::init(), py::arg("filename")) + // .def("load", &EOSio::load) + .def("getFormat", &serif::eos::EOSio::getFormat, "Get the format of the EOS table.") + .def("getTable", [](serif::eos::EOSio &self) -> serif::eos::helmholtz::HELMTable* { + auto& table_variant = self.getTable(); + + // Use std::get_if to safely access the contents of the variant. + // This returns a pointer to the value if the variant holds that type, otherwise nullptr. + if (auto* ptr_to_unique_ptr = std::get_if>(&table_variant)) { + return (*ptr_to_unique_ptr).get(); + } + + return nullptr; + }, py::return_value_policy::reference_internal, // IMPORTANT: Keep this policy! + "Get the EOS table data.") + .def("__repr__", [](const serif::eos::EOSio &eos) { + return ""; + }); + + py::class_(eos_submodule, "EOSTable"); + + py::class_(eos_submodule, "HELMTable") + .def_readonly("loaded", &serif::eos::helmholtz::HELMTable::loaded) + .def_readonly("imax", &serif::eos::helmholtz::HELMTable::imax) + .def_readonly("jmax", &serif::eos::helmholtz::HELMTable::jmax) + .def_readonly("t", &serif::eos::helmholtz::HELMTable::t) + .def_readonly("d", &serif::eos::helmholtz::HELMTable::d) + .def("__repr__", [](const serif::eos::helmholtz::HELMTable &table) { + return ""; + }) + .def_property_readonly("f", [](serif::eos::helmholtz::HELMTable &table) -> py::array_t { + // --- Check Preconditions --- + // 1. Check if dimensions are valid + if (table.imax <= 0 || table.jmax <= 0) { + // Return empty array or throw error for invalid dimensions + throw std::runtime_error("HELMTable dimensions (imax, jmax) are non-positive."); + // Alternatively: return py::array_t(); + } + // 2. Check if pointer 'f' and the data block 'f[0]' are non-null + // (Essential check assuming f could be null if not loaded/initialized) + if (!table.f || !table.f[0]) { + throw std::runtime_error("HELMTable data buffer 'f' is null or not initialized."); + // Alternatively: return py::array_t(); + } + + // --- Get necessary info --- + py::ssize_t rows = static_cast(table.imax); + py::ssize_t cols = static_cast(table.jmax); + double* data_ptr = table.f[0]; // Pointer to the start of contiguous data block + + // --- Define NumPy array shape and strides --- + std::vector shape = {rows, cols}; + std::vector strides = { + static_cast(cols * sizeof(double)), // Stride to next row + static_cast( sizeof(double)) // Stride to next element in row + }; + + // --- Create and return the py::array_t --- + // py::cast(table) creates a py::object that acts as the 'base'. + // This tells NumPy not to manage the memory of 'data_ptr' and + // ensures the 'table' object stays alive as long as the NumPy array view exists. + return py::array_t( + shape, // The dimensions of the array + strides, // How many bytes to step in each dimension + data_ptr, // Pointer to the actual data + py::cast(table) // Owner object (keeps C++ object alive) + ); + }, py::return_value_policy::reference_internal); // Keep parent 'table' alive + + py::class_(eos_submodule, "EOS") + .def(py::init<>()) + .def_readonly("ye", &serif::eos::helmholtz::EOS::ye) + .def_readonly("etaele", &serif::eos::helmholtz::EOS::etaele) + .def_readonly("xnefer", &serif::eos::helmholtz::EOS::xnefer) + + .def_readonly("ptot", &serif::eos::helmholtz::EOS::ptot) + .def_readonly("pgas", &serif::eos::helmholtz::EOS::pgas) + .def_readonly("prad", &serif::eos::helmholtz::EOS::prad) + + .def_readonly("etot", &serif::eos::helmholtz::EOS::etot) + .def_readonly("egas", &serif::eos::helmholtz::EOS::egas) + .def_readonly("erad", &serif::eos::helmholtz::EOS::erad) + + .def_readonly("stot", &serif::eos::helmholtz::EOS::stot) + .def_readonly("sgas", &serif::eos::helmholtz::EOS::sgas) + .def_readonly("srad", &serif::eos::helmholtz::EOS::srad) + + .def_readonly("dpresdd", &serif::eos::helmholtz::EOS::dpresdd) + .def_readonly("dpresdt", &serif::eos::helmholtz::EOS::dpresdt) + .def_readonly("dpresda", &serif::eos::helmholtz::EOS::dpresda) + .def_readonly("dpresdz", &serif::eos::helmholtz::EOS::dpresdz) + // TODO: Finish adding all the derivatives to the bound class + .def_readonly("dentrdd", &serif::eos::helmholtz::EOS::dentrdd) + .def_readonly("dentrdt", &serif::eos::helmholtz::EOS::dentrdt) + .def_readonly("dentrda", &serif::eos::helmholtz::EOS::dentrda) + .def_readonly("dentrdz", &serif::eos::helmholtz::EOS::dentrdz) + + .def_readonly("denerdd", &serif::eos::helmholtz::EOS::denerdd) + .def_readonly("denerdt", &serif::eos::helmholtz::EOS::denerdt) + .def_readonly("denerda", &serif::eos::helmholtz::EOS::denerda) + .def_readonly("denerdz", &serif::eos::helmholtz::EOS::denerdz) + + .def_readonly("chiT", &serif::eos::helmholtz::EOS::chiT) + .def_readonly("chiRho", &serif::eos::helmholtz::EOS::chiRho) + .def_readonly("csound", &serif::eos::helmholtz::EOS::csound) + .def_readonly("grad_ad", &serif::eos::helmholtz::EOS::grad_ad) + .def_readonly("gamma1", &serif::eos::helmholtz::EOS::gamma1) + .def_readonly("gamma2", &serif::eos::helmholtz::EOS::gamma2) + .def_readonly("gamma3", &serif::eos::helmholtz::EOS::gamma3) + .def_readonly("cV", &serif::eos::helmholtz::EOS::cV) + .def_readonly("cP", &serif::eos::helmholtz::EOS::cP) + .def_readonly("dse", &serif::eos::helmholtz::EOS::dse) + .def_readonly("dpe", &serif::eos::helmholtz::EOS::dpe) + .def_readonly("dsp", &serif::eos::helmholtz::EOS::dsp) + + .def("__repr__", [](const serif::eos::helmholtz::EOS &eos) { + return ""; + }); + + py::class_(eos_submodule, "EOSInput") + .def(py::init<>()) + .def_readwrite("T", &serif::eos::helmholtz::EOSInput::T) + .def_readwrite("rho", &serif::eos::helmholtz::EOSInput::rho) + .def_readwrite("abar", &serif::eos::helmholtz::EOSInput::abar) + .def_readwrite("zbar", &serif::eos::helmholtz::EOSInput::zbar) + .def("__repr__", [](const serif::eos::helmholtz::EOSInput &input) { + return ""; + }); + + eos_submodule.def("get_helm_eos", + &serif::eos::helmholtz::get_helm_EOS, + py::arg("q"), py::arg("table"), + "Calculate the Helmholtz EOS components based on input parameters and table data."); + +} diff --git a/src/python/eos/bindings.h b/src/python/eos/bindings.h new file mode 100644 index 0000000..3945840 --- /dev/null +++ b/src/python/eos/bindings.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +void register_eos_bindings(pybind11::module &eos_submodule); diff --git a/src/python/eos/meson.build b/src/python/eos/meson.build new file mode 100644 index 0000000..e98ace6 --- /dev/null +++ b/src/python/eos/meson.build @@ -0,0 +1,19 @@ +# Define the library +bindings_sources = files('bindings.cpp') +bindings_headers = files('bindings.h') + +dependencies = [ + eos_dep, + config_dep, + resourceManager_dep, + python3_dep, + pybind11_dep, +] + +shared_module('py_eos', + bindings_sources, + include_directories: include_directories('.'), + cpp_args: ['-fvisibility=default'], + install : true, + dependencies: dependencies, +) diff --git a/src/python/meson.build b/src/python/meson.build index 4d21619..c865fc2 100644 --- a/src/python/meson.build +++ b/src/python/meson.build @@ -1,3 +1,4 @@ subdir('composition') subdir('const') -subdir('config') \ No newline at end of file +subdir('config') +subdir('eos') \ No newline at end of file diff --git a/src/python/fourdstar/__init__.py b/src/python/serif/__init__.py similarity index 100% rename from src/python/fourdstar/__init__.py rename to src/python/serif/__init__.py diff --git a/src/resource/private/resourceManagerTypes.cpp b/src/resource/private/resourceManagerTypes.cpp index ad99792..ccce397 100644 --- a/src/resource/private/resourceManagerTypes.cpp +++ b/src/resource/private/resourceManagerTypes.cpp @@ -23,7 +23,7 @@ #include "resourceManagerTypes.h" #include "opatIO.h" #include "meshIO.h" -#include "eosIO.h" +#include "EOSio.h" #include "debug.h" @@ -49,7 +49,7 @@ namespace serif::resource::types { std::make_unique(p)); }}, {"eos", [](const std::string& p) { return Resource( - std::make_unique(p)); + std::make_unique(p)); }} // Add more mappings as needed }; diff --git a/src/resource/public/resourceManagerTypes.h b/src/resource/public/resourceManagerTypes.h index 62ddb28..df26d43 100644 --- a/src/resource/public/resourceManagerTypes.h +++ b/src/resource/public/resourceManagerTypes.h @@ -25,7 +25,7 @@ #include "opatIO.h" #include "helm.h" #include "meshIO.h" -#include "eosIO.h" +#include "EOSio.h" namespace serif::resource::types { /** @@ -41,7 +41,7 @@ namespace serif::resource::types { * @brief A variant type that can hold different types of resources. * * The Resource type is a std::variant that can hold a unique pointer to - * an OpatIO, MeshIO, or EosIO object. + * an OpatIO, MeshIO, or EOSio object. * * Example usage: * @code @@ -51,7 +51,7 @@ namespace serif::resource::types { using Resource = std::variant< std::unique_ptr, std::unique_ptr, - std::unique_ptr>; + std::unique_ptr>; /** * @brief Extracts the first segment of a given string. diff --git a/subprojects/opat-core.wrap b/subprojects/opat-core.wrap index bb78a4b..3db0c11 100644 --- a/subprojects/opat-core.wrap +++ b/subprojects/opat-core.wrap @@ -1,4 +1,4 @@ [wrap-git] url = https://github.com/4D-STAR/opat-core -revision = 0.3.1a +revision = 0.3.3a depth = 1 diff --git a/tests/eos/eosTest.cpp b/tests/eos/eosTest.cpp index 9995e4e..b7a670b 100644 --- a/tests/eos/eosTest.cpp +++ b/tests/eos/eosTest.cpp @@ -27,7 +27,7 @@ std::string TEST_CONFIG = std::string(getenv("MESON_SOURCE_ROOT")) + "/tests/tes TEST_F(eosTest, read_helm_table) { serif::config::Config::getInstance().loadConfig(TEST_CONFIG); serif::resource::ResourceManager& rm = serif::resource::ResourceManager::getInstance(); - auto& eos = std::get>(rm.getResource("eos:helm")); + auto& eos = std::get>(rm.getResource("eos:helm")); auto& table = eos->getTable(); auto& helmTable = *std::get>(table); std::stringstream ss; @@ -58,7 +58,7 @@ TEST_F(eosTest, get_helm_EOS) { eos1.zbar = eos1.abar*zsum; serif::resource::ResourceManager& rm = serif::resource::ResourceManager::getInstance(); - auto& eos = std::get>(rm.getResource("eos:helm")); + auto& eos = std::get>(rm.getResource("eos:helm")); auto& table = eos->getTable(); auto& helmTable = *std::get>(table); serif::eos::helmholtz::EOS helmEos = get_helm_EOS(eos1, helmTable); diff --git a/tests/resource/resourceManagerTest.cpp b/tests/resource/resourceManagerTest.cpp index 5e0f0b0..2936653 100644 --- a/tests/resource/resourceManagerTest.cpp +++ b/tests/resource/resourceManagerTest.cpp @@ -1,6 +1,6 @@ #include #include "config.h" -#include "eosIO.h" +#include "EOSio.h" #include "helm.h" #include "resourceManager.h" #include "resourceManagerTypes.h" @@ -47,7 +47,7 @@ TEST_F(resourceManagerTest, getResource) { std::string name = "eos:helm"; const serif::resource::types::Resource &r = rm.getResource(name); // BREAKPOINT(); - const auto &eos = std::get>(r); + const auto &eos = std::get>(r); EXPECT_EQ("helm", eos->getFormat()); serif::eos::EOSTable &table = eos->getTable();