DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
ArrayEigenVector_bind.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "../Array_bind.hpp"
5
6namespace DNDS
7{
8 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
10 {
11 return fmt::format("_{}_{}_{}",
12 RowSize_To_PySnippet(_vec_size),
13 RowSize_To_PySnippet(_row_max),
14 Align_To_PySnippet(_align));
15 }
16
17 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
19 {
20 return "ArrayEigenVector" + pybind11_ArrayEigenVector_name_appends<_vec_size, _row_max, _align>();
21 }
22
23 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
25 {
26 return "ArrayEigenVectorPair" + pybind11_ArrayEigenVector_name_appends<_vec_size, _row_max, _align>();
27 }
28
29 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign> // ! shared ptr
31
32 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign> // ! shared ptr
34}
35
36namespace DNDS
37{
38
39 template <class TArrayEigenVector = ArrayEigenVector<1>>
40 auto pybind11_ArrayEigenVector_getitem(TArrayEigenVector &self, index index_)
41 {
42 auto row = self[index_];
43 return py::memoryview::from_buffer<real>(
44 row.data(),
45 {row.size()},
46 {sizeof(real)},
47 false);
48 }
49
50 template <class TArrayEigenVector = ArrayEigenVector<1>>
51 auto pybind11_ArrayEigenVector_setitem(TArrayEigenVector &self, index index_, py::buffer row)
52 {
53 auto row_info = row.request(false);
54 DNDS_assert(row_info.item_type_is_equivalent_to<real>());
55 auto [count, row_style] = py_buffer_get_contigious_size(row_info); // todo: upgrade to accept any 1D array
56 DNDS_assert(self.RowSize(index_) == count);
57 auto row_start_ptr = reinterpret_cast<real *>(row_info.ptr);
58 std::copy(row_start_ptr, row_start_ptr + count, self[index_].data());
59 }
60}
61
62namespace DNDS
63{
64 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
65 tPy_ArrayEigenVector<_vec_size, _row_max, _align>
67 {
68 auto ParArray_ = pybind11_ParArray_get_class<real, _vec_size, _row_max, _align>(m);
69 return {m, pybind11_ArrayEigenVector_name<_vec_size, _row_max, _align>().c_str(), ParArray_};
70 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
71 }
72
73 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
74 tPy_ArrayEigenVector<_vec_size, _row_max, _align>
76 {
77 return {m.attr(pybind11_ArrayEigenVector_name<_vec_size, _row_max, _align>().c_str())};
78 }
79
80 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
82 {
83
84 using TArrayEigenVector = ArrayEigenVector<_vec_size, _row_max, _align>;
85 auto ArrayEigenVector_ = pybind11_ArrayEigenVector_declare<_vec_size, _row_max, _align>(m);
86
87 // // helper
88 // using TArrayEigenVector = ArrayEigenVector<1>;
89 // auto ArrayEigenVector_ = pybind11_ArrayEigenVector_declare<1>(m);
90 // // helper
91 ArrayEigenVector_
92 .def("clone", [](TArrayEigenVector &self)
93 {
94 auto arr = std::make_shared<TArrayEigenVector>(self);
95 return arr; });
96 ArrayEigenVector_
97 // we only bind the non-default ctor here
98 .def(py::init<const MPIInfo &>(), py::arg("nmpi"))
99 .def(
100 "__getitem__",
101 [](TArrayEigenVector &self, index index_)
102 {
103 return pybind11_ArrayEigenVector_getitem(self, index_);
104 },
105 py::keep_alive<0, 1>())
106 .def(
107 "__setitem__",
108 [](TArrayEigenVector &self, index index_, py::buffer row)
109 {
110 return pybind11_ArrayEigenVector_setitem(self, index_, row);
111 });
112
113 ArrayEigenVector_
114 .def("to_device", [](TArrayEigenVector &self, const std::string &backend)
115 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
116 .def("to_host", &TArrayEigenVector::to_host);
117 }
118
119 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
121 {
122 if constexpr (_vec_size == UnInitRowsize)
123 return;
124 else
125 return pybind11_ArrayEigenVector_define<_vec_size, _row_max, _align>(m);
126 }
127}
128
129namespace DNDS
130{
131 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
132 tPy_ArrayEigenVectorPair<_vec_size, _row_max, _align>
134 {
135 return {m, pybind11_ArrayEigenVectorPair_name<_vec_size, _row_max, _align>().c_str()};
136 }
137
138 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
139 tPy_ArrayEigenVector<_vec_size, _row_max, _align>
141 {
142 return {m.attr(pybind11_ArrayEigenVectorPair_name<_vec_size, _row_max, _align>().c_str())};
143 }
144
145 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
147 {
148
149 // using TArray = ParArray<T, _row_size, _row_max, _align>;
151 auto Pair_ = pybind11_ArrayEigenVectorPair_declare<_vec_size, _row_max, _align>(m);
152
153 // // helper
154 // using TPair = ArrayEigenVectorPair<1>;
155 // auto Pair_ = pybind11_ArrayEigenVectorPair_declare<1>(m);
156 // // helper
157
158 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
159
160 Pair_
161 .def("RowSize", [](const TPair &self, index i)
162 { return self.RowSize(i); }, py::arg("i"))
163 .def("RowSize", [](const TPair &self)
164 { return self.RowSize(); });
165 Pair_
166 .def(
167 "__getitem__",
168 [](TPair &self, index index_)
169 {
170 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
171 { return pybind11_ArrayEigenVector_getitem(ar, iC); });
172 },
173 py::keep_alive<0, 1>())
174 .def(
175 "__setitem__",
176 [](TPair &self, index index_, py::buffer row)
177 {
178 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
179 { return pybind11_ArrayEigenVector_setitem(ar, iC, row); });
180 });
181 }
182
183 template <rowsize _vec_size = 1, rowsize _row_max = _vec_size, rowsize _align = NoAlign>
185 {
186 if constexpr (_vec_size == UnInitRowsize)
187 return;
188 else
189 return pybind11_ArrayEigenVectorPair_define<_vec_size, _row_max, _align>(m);
190 }
191}
192
193namespace DNDS
194{
195 template <size_t N, std::array<int, N> const &Arr, size_t... Is>
196 void __pybind11_callBindArrayEigenVectors_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
197 {
198 (_pybind11_ArrayEigenVector_define_dispatch<Arr[Is]>(m), ...);
199 (_pybind11_ArrayEigenVectorPair_define_dispatch<Arr[Is]>(m), ...);
200 }
201
203 {
204 static constexpr auto seq = pybind11_arrayRowsizeInstantiationList;
206 seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
207 }
208
209 void pybind11_bind_ArrayEigenVector_All(py::module_ &m);
210}
Eigen-vector array: each row is an Eigen::Map over contiguous real storage.
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
Definition Errors.hpp:108
ParArray<real, N> whose operator[] returns an Eigen::Map<Vector>.
the host side operators are provided as implemented
void pybind11_callBindArrayEigenVectors_rowsizes(py::module_ &m)
std::string pybind11_ArrayEigenVector_name_appends()
py::classh< T > py_class_ssp
tPy_ArrayEigenVector< _vec_size, _row_max, _align > pybind11_ArrayEigenVector_get_class(py::module_ &m)
std::tuple< ssize_t, char > py_buffer_get_contigious_size(const py::buffer_info &info)
py_class_ssp< ArrayEigenVectorPair< _vec_size, _row_max, _align > > tPy_ArrayEigenVectorPair
py_class_ssp< ArrayEigenVector< _vec_size, _row_max, _align > > tPy_ArrayEigenVector
void _pybind11_ArrayEigenVector_define_dispatch(py::module_ &m)
auto pybind11_ArrayEigenVector_getitem(TArrayEigenVector &self, index index_)
DeviceBackend device_backend_name_to_enum(std::string_view s)
Inverse of device_backend_name. Returns Unknown for unrecognised names.
auto pybind11_ArrayEigenVector_setitem(TArrayEigenVector &self, index index_, py::buffer row)
std::string RowSize_To_PySnippet(rowsize rs)
Encode a rowsize constant as a short Python-binding snippet: "<number>" for fixed,...
Definition Defines.hpp:294
std::string pybind11_ArrayEigenVector_name()
tPy_ArrayEigenVector< _vec_size, _row_max, _align > pybind11_ArrayEigenVectorPair_get_class(py::module_ &m)
void _pybind11_ArrayEigenVectorPair_define_dispatch(py::module_ &m)
tPy_ArrayEigenVectorPair< _vec_size, _row_max, _align > pybind11_ArrayEigenVectorPair_declare(py::module_ &m)
void pybind11_ArrayEigenVector_define(py::module_ &m)
std::string pybind11_ArrayEigenVectorPair_name()
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
Definition Defines.hpp:107
tPy_ArrayEigenVector< _vec_size, _row_max, _align > pybind11_ArrayEigenVector_declare(py::module_ &m)
void pybind11_ArrayEigenVectorPair_define(py::module_ &m)
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
Definition Defines.hpp:105
std::string Align_To_PySnippet(rowsize al)
Encode an alignment value as a Python-binding snippet: "N" for NoAlign, the number otherwise.
Definition Defines.hpp:310
void __pybind11_callBindArrayEigenVectors_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
void pybind11_bind_ArrayEigenVector_All(py::module_ &m)
DNDS_CONSTANT const rowsize UnInitRowsize
Sentinel "not initialised" rowsize value (= INT32_MIN).
Definition Defines.hpp:179
Convenience bundle of a father, son, and attached ArrayTransformer.