feat(libcomposition): python bindings for standard solar compositions

This commit is contained in:
2026-06-11 07:42:17 -04:00
parent e1f26598ba
commit 25b8495a2c
4 changed files with 133 additions and 5 deletions

View File

@@ -8,7 +8,7 @@ build-backend = "mesonpy"
[project]
name = "fourdst" # Choose your Python package name
version = "v0.9.22" # Your project's version
dynamic = ["version"]
description = "Python interface to the utility fourdst modules from the 4D-STAR project"
readme = "readme.md"
license = { file = "LICENSE.txt" } # Reference your license file [cite: 2]

View File

@@ -3,6 +3,7 @@
#include <pybind11/stl_bind.h> // Needed for binding std::vector, std::map etc. if needed directly
#include <string>
#include <ranges>
#include "fourdst/composition/composition.h"
#include "fourdst/atomic/atomicSpecies.h"
@@ -10,9 +11,10 @@
#include "bindings.h"
#include "fourdst/atomic/species.h"
#include "fourdst/composition/utils.h"
#include "fourdst/composition/utils/utils.h"
#include "fourdst/composition/utils/composition_hash.h"
#include "fourdst/composition/exceptions/exceptions_composition.h"
#include "fourdst/composition/io/standard_compositions.h"
namespace py = pybind11;
@@ -326,7 +328,127 @@ void register_comp_bindings(pybind11::module &m) {
"Build a Composition object from a map of species to mass fractions."
);
auto io = m.def_submodule("io", "IO library for standard solar compositions");
py::class_<fourdst::composition::io::CompositionData> (io, "CompositionData")
.def(py::init<>())
.def_readwrite("comment_str", &fourdst::composition::io::CompositionData::comment_str)
.def_readwrite("he_abundance", &fourdst::composition::io::CompositionData::he_abundance)
.def_readwrite("requires_atomic_weight", &fourdst::composition::io::CompositionData::requires_atomic_weight)
.def_property("elements",
[](fourdst::composition::io::CompositionData &self) -> const std::vector<std::string>& {
return self.elements;
},
[](fourdst::composition::io::CompositionData &self, const std::vector<std::string> &value) {
self.elements = value;
},
py::return_value_policy::reference_internal
)
.def_property("abundances",
[](fourdst::composition::io::CompositionData &self) -> const std::vector<double>& {
return self.abundances;
},
[](fourdst::composition::io::CompositionData &self, const std::vector<double> &value) {
self.abundances = value;
},
py::return_value_policy::reference_internal
);
py::class_<fourdst::composition::io::IsotopicPercentage>(io, "IsotopicPercentage")
.def(py::init<>())
.def_readwrite("comment_str", &fourdst::composition::io::IsotopicPercentage::comment_str)
.def_property("atomic_numbers",
[](fourdst::composition::io::IsotopicPercentage &self) -> const std::vector<int>& {
return self.atomic_numbers;
},
[](fourdst::composition::io::IsotopicPercentage &self, const std::vector<int> &value) {
self.atomic_numbers = value;
},
py::return_value_policy::reference_internal
)
.def_property("elements",
[](fourdst::composition::io::IsotopicPercentage &self) -> const std::vector<std::string>& {
return self.elements;
},
[](fourdst::composition::io::IsotopicPercentage &self, const std::vector<std::string> &value) {
self.elements = value;
},
py::return_value_policy::reference_internal
)
.def_property("mass_numbers",
[](fourdst::composition::io::IsotopicPercentage &self) -> const std::vector<int>& {
return self.mass_numbers;
},
[](fourdst::composition::io::IsotopicPercentage &self, const std::vector<int> &value) {
self.mass_numbers = value;
},
py::return_value_policy::reference_internal
)
.def_property("percentages",
[](fourdst::composition::io::IsotopicPercentage &self) -> const std::vector<double>& {
return self.percentages;
},
[](fourdst::composition::io::IsotopicPercentage &self, const std::vector<double> &value) {
self.percentages = value;
},
py::return_value_policy::reference_internal
);
py::enum_<fourdst::composition::io::SolarCompositions>(io,"SolarCompositions")
.value("AG89", fourdst::composition::io::SolarCompositions::AG89)
.value("GN93", fourdst::composition::io::SolarCompositions::GN93)
.value("GS98", fourdst::composition::io::SolarCompositions::GS98)
.value("L03", fourdst::composition::io::SolarCompositions::L03)
.value("AGS05", fourdst::composition::io::SolarCompositions::AGS05)
.value("AGSS09", fourdst::composition::io::SolarCompositions::AGSS09)
.value("A09_Przybilla", fourdst::composition::io::SolarCompositions::A09_Przybilla)
.value("MB22_photospheric", fourdst::composition::io::SolarCompositions::MB22_photospheric)
.value("AAG21_photospheric", fourdst::composition::io::SolarCompositions::AAG21_photospheric)
.value("L09", fourdst::composition::io::SolarCompositions::L09)
.export_values();
py::enum_<fourdst::composition::io::IsotopicPercentages>(io,"IsotopicPercentages")
.value("L03", fourdst::composition::io::IsotopicPercentages::L03)
.value("L09", fourdst::composition::io::IsotopicPercentages::L09);
io.attr("SolarCompositions_to_string_map") = fourdst::composition::io::SolarCompositions_to_string_map;
io.attr("IsotopicPercentages_to_string_map") = fourdst::composition::io::IsotopicPercentages_to_string_map;
io.def("get_raw_standard_solar_composition_data",
[]() -> std::vector<unsigned char> {
std::span<const unsigned char> raw = fourdst::composition::io::get_raw_standard_solar_composition_data();
return std::ranges::to<std::vector<unsigned char>>(raw);
}
);
py::class_<fourdst::composition::io::ChemicalFileParser>(io,"ChemicalFileParser")
.def(py::init<>())
.def_static("parse_composition_data",
&fourdst::composition::io::ChemicalFileParser::parse_composition_data,
py::arg("data"),
py::arg("scheme")
)
.def_static("parse_isotopic_percentage",
&fourdst::composition::io::ChemicalFileParser::parse_isotopic_percentage,
py::arg("data"),
py::arg("scheme")
);
m.def("get_composition_record",
py::overload_cast<const std::string&, const std::string&, double, double>(&fourdst::composition::get_composition_record),
py::arg("metal_fraction_scheme"),
py::arg("isotopic_percentage_scheme"),
py::arg("initial_z"),
py::arg("initial_y")
);
m.def("get_composition_record",
py::overload_cast<fourdst::composition::io::SolarCompositions, fourdst::composition::io::IsotopicPercentages, double, double>(&fourdst::composition::get_composition_record),
py::arg("metal_fraction_scheme"),
py::arg("isotopic_percentage_scheme"),
py::arg("initial_z"),
py::arg("initial_y")
);
}
void register_species_bindings(pybind11::module &chem_submodule) {

View File

@@ -3,14 +3,20 @@ from __future__ import annotations
import sys
from ._phys import atomic, composition, constants, config
from ._phys.composition import utils
from ._phys.composition import utils, io
sys.modules['fourdst.atomic'] = atomic
sys.modules['fourdst.composition'] = composition
sys.modules['fourdst.constants'] = constants
sys.modules['fourdst.config'] = config
sys.modules['fourdst.composition.utils'] = utils
sys.modules['fourdst.composition.io'] = io
__all__ = ['atomic', 'composition', 'constants', 'config', 'core', 'cli']
__version__ = 'v0.9.21'
from importlib.metadata import version, PackageNotFoundError
try:
__version__ = version("fourdst")
except PackageNotFoundError:
__version__ = "0.0.0+unknown"

View File

@@ -1,4 +1,4 @@
[wrap-git]
url = https://github.com/4D-STAR/libcomposition.git
revision = v2.4.2
revision = v2.4.3
depth = 1