DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
ArrayEigenMatrix_bind.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "../Array_bind.hpp"
5
6namespace DNDS
7{
8
9 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
10 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
12 {
13 return fmt::format("_{}x{}_{}x{}_{}",
14 RowSize_To_PySnippet(_mat_ni),
15 RowSize_To_PySnippet(_mat_nj),
16 RowSize_To_PySnippet(_mat_ni_max),
17 RowSize_To_PySnippet(_mat_nj_max),
18 Align_To_PySnippet(_align));
19 }
20
21 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
22 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
24 {
25 return "ArrayEigenMatrix" + pybind11_ArrayEigenMatrix_name_appends<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>();
26 }
27
28 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
29 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
31 {
32 return "ArrayEigenMatrixPair" + pybind11_ArrayEigenMatrix_name_appends<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>();
33 }
34
35 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
36 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign> // ! shared ptr
38
39 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
40 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign> // ! shared ptr
42}
43
44namespace DNDS
45{
46 template <class TArrayEigenMatrix = ArrayEigenMatrix<3, 3>>
47 auto pybind11_ArrayEigenMatrix_getitem(TArrayEigenMatrix &self, index index_)
48 {
49 using tElem = real;
50 auto mat = self[index_];
51 return py::memoryview::from_buffer<tElem>(
52 mat.data(),
53 {mat.rows(), mat.cols()},
54 {sizeof(tElem) * mat.rowStride(), sizeof(tElem) * mat.colStride()},
55 false);
56 }
57
58 template <class TArrayEigenMatrix = ArrayEigenMatrix<3, 3>>
59 auto pybind11_ArrayEigenMatrix_setitem(TArrayEigenMatrix &self, index index_, py::buffer row)
60 {
61 using tElem = real;
62 auto row_info = row.request(false);
63 DNDS_assert(row_info.item_type_is_equivalent_to<tElem>());
64 auto iRow = index_;
65 auto mat = self[index_];
66 DNDS_assert_info(row_info.shape.size() == 2, "need to pass a 2-d array");
67 DNDS_assert_info(row_info.shape[0] == mat.rows(), "row size not matching");
68 DNDS_assert_info(row_info.shape[1] == mat.cols(), "col size not matching");
69
70 auto row_start_ptr = reinterpret_cast<tElem *>(row_info.ptr);
71
72 DNDS_assert(row_info.strides.size() == 2);
73
74 auto row_mat_map = Eigen::Map<
75 const Eigen::Matrix<tElem, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::ColMajor>,
76 Eigen::Unaligned,
77 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>(
78 row_start_ptr,
79 row_info.shape[0],
80 row_info.shape[1],
81 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(row_info.strides[1] / sizeof(tElem) /*col stride*/, row_info.strides[0] / sizeof(tElem) /*row stride*/));
82 mat = row_mat_map;
83 }
84}
85
86namespace DNDS
87{
88 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
89 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
90 tPy_ArrayEigenMatrix<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>
92 {
94 static constexpr rowsize rs = TArrayEigenMatrix::t_base::rs;
95 static constexpr rowsize rm = TArrayEigenMatrix::t_base::rm;
96 static constexpr rowsize al = TArrayEigenMatrix::t_base::al;
97 auto ParArray_ = pybind11_ParArray_get_class<real, rs, rm, al>(m);
98 return {m, pybind11_ArrayEigenMatrix_name<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>().c_str(), ParArray_};
99 }
100
101 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
102 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
103 tPy_ArrayEigenMatrix<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>
105 {
106 return {m.attr(pybind11_ArrayEigenMatrix_name<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>().c_str())};
107 }
108
109 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
110 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
112 {
113
115 auto ArrayEigenMatrix_ = pybind11_ArrayEigenMatrix_declare<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>(m);
116
117 // // helper
118 // using TArrayEigenMatrix = ArrayEigenMatrix<3, 3>;
119 // auto ArrayEigenMatrix_ = pybind11_ArrayEigenMatrix_declare<3, 3>(m);
120 // // helper
121
122 ArrayEigenMatrix_
123 // we only bind the non-default ctor here
124 .def(py::init<const MPIInfo &>(), py::arg("nmpi"))
125 .def("Resize", [](TArrayEigenMatrix &self, index nSize, rowsize md, rowsize nd)
126 { return self.Resize(nSize, md, nd); }, py::arg("size"), py::arg("m_size"), py::arg("n_size"));
127
128 ArrayEigenMatrix_
129 .def("clone", [](TArrayEigenMatrix &self)
130 {
131 auto arr = std::make_shared<TArrayEigenMatrix>(self);
132 return arr; });
133
134 ArrayEigenMatrix_
135 .def("MatRowSize", [](const TArrayEigenMatrix &self, index iMat)
136 { return self.MatRowSize(iMat); }, py::arg("iMat") = 0)
137 .def("MatColSize", [](const TArrayEigenMatrix &self, index iMat)
138 { return self.MatColSize(iMat); }, py::arg("iMat") = 0);
139
140 ArrayEigenMatrix_
141 .def("ResizeMat", [](TArrayEigenMatrix &self, index iMat, rowsize nm, rowsize nn)
142 { return self.ResizeMat(iMat, nm, nn); }, py::arg("iMat"), py::arg("nm"), py::arg("nn"))
143 .def("ResizeRow", [](TArrayEigenMatrix &self, index iMat, rowsize nm, rowsize nn)
144 { return self.ResizeRow(iMat, nm, nn); }, py::arg("iMat"), py::arg("nm"), py::arg("nn"));
145
146 ArrayEigenMatrix_
147 .def(
148 "__getitem__",
149 [](TArrayEigenMatrix &self, index index_)
150 {
151 return pybind11_ArrayEigenMatrix_getitem(self, index_);
152 },
153 py::keep_alive<0, 1>())
154 .def(
155 "__setitem__",
156 [](TArrayEigenMatrix &self, index index_, py::buffer row)
157 {
158 return pybind11_ArrayEigenMatrix_setitem(self, index_, row);
159 });
160
161 ArrayEigenMatrix_
162 .def("to_device", [](TArrayEigenMatrix &self, const std::string &backend)
163 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
164 .def("to_host", &TArrayEigenMatrix::to_host);
165 }
166
167 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
168 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
170 {
171 // std::cout << fmt::format("binding ArrayEigenMatrix {},{}", _mat_ni, _mat_nj) << std::endl;
172 if constexpr (_mat_ni == UnInitRowsize || _mat_nj == UnInitRowsize)
173 return;
174 else
175 return pybind11_ArrayEigenMatrix_define<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>(m);
176 }
177}
178
179namespace DNDS
180{
181 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
182 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
183 tPy_ArrayEigenMatrixPair<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>
185 {
186 return {m, pybind11_ArrayEigenMatrixPair_name<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>().c_str()};
187 }
188
189 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
190 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
191 tPy_ArrayEigenMatrixPair<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>
193 {
194 return {m.attr(pybind11_ArrayEigenMatrixPair_name<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>().c_str())};
195 }
196
197 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
198 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
200 {
202 auto Pair_ = pybind11_ArrayEigenMatrixPair_declare<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>(m);
203
204 // // helper
205 // using TPair = ArrayEigenMatrixPair<3, 3>;
206 // auto Pair_ = pybind11_ArrayEigenMatrixPair_declare<3, 3>(m);
207 // // helper
208
209 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
210
211 Pair_
212 .def("RowSize", [](const TPair &self, index i)
213 { return self.RowSize(i); }, py::arg("i"))
214 .def("RowSize", [](const TPair &self)
215 { return self.RowSize(); }); //! maybe should not use here
216 Pair_
217 .def(
218 "__getitem__",
219 [](TPair &self, index index_)
220 {
221 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
222 { return pybind11_ArrayEigenMatrix_getitem(ar, iC); });
223 },
224 py::keep_alive<0, 1>())
225 .def(
226 "__setitem__",
227 [](TPair &self, index index_, py::buffer row)
228 {
229 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
230 { return pybind11_ArrayEigenMatrix_setitem(ar, iC, row); });
231 });
232 }
233
234 template <rowsize _mat_ni = 1, rowsize _mat_nj = 1,
235 rowsize _mat_ni_max = _mat_ni, rowsize _mat_nj_max = _mat_nj, rowsize _align = NoAlign>
237 {
238 // std::cout << fmt::format("binding ArrayEigenMatrixPair {},{}", _mat_ni, _mat_nj) << std::endl;
239 if constexpr (_mat_ni == UnInitRowsize || _mat_nj == UnInitRowsize)
240 return;
241 else
242 return pybind11_ArrayEigenMatrixPair_define<_mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align>(m);
243 }
244}
245
246namespace DNDS
247{
248 template <rowsize mat_n, size_t N, std::array<int, N> const &Arr, size_t... Is>
249 void __pybind11_callBindArrayEigenMatrixs_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
250 {
251 (_pybind11_ArrayEigenMatrix_define_dispatch<Arr[Is], mat_n>(m), ...);
252 (_pybind11_ArrayEigenMatrixPair_define_dispatch<Arr[Is], mat_n>(m), ...);
253 }
254
255 template <rowsize mat_n>
257 {
258 static constexpr auto seq = pybind11_arrayRowsizeInstantiationList;
260 mat_n,
261 seq.size(),
262 seq>(m, std::make_index_sequence<seq.size()>{});
263 }
264
265 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<1>(py::module_ &m);
266 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<2>(py::module_ &m);
267 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<3>(py::module_ &m);
268 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<4>(py::module_ &m);
269 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<5>(py::module_ &m);
270 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<6>(py::module_ &m);
271 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<7>(py::module_ &m);
272 extern template void pybind11_callBindArrayEigenMatrixs_rowsizes<8>(py::module_ &m);
275
276 void pybind11_bind_ArrayEigenMatrix_All(py::module_ &m);
277}
Eigen-matrix array: each row is an Eigen::Map<Matrix> over contiguous real storage.
#define DNDS_assert_info(expr, info)
Debug-only assertion with an extra std::string info message.
Definition Errors.hpp:113
#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> whose operator[] returns an Eigen::Map<Matrix<real, Ni, Nj>>.
the host side operators are provided as implemented
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 1 >(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< DynamicSize >(py::module_ &m)
void _pybind11_ArrayEigenMatrixPair_define_dispatch(py::module_ &m)
py_class_ssp< ArrayEigenMatrixPair< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > > tPy_ArrayEigenMatrixPair
void pybind11_callBindArrayEigenMatrixs_rowsizes(py::module_ &m)
void _pybind11_ArrayEigenMatrix_define_dispatch(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 6 >(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 8 >(py::module_ &m)
std::string pybind11_ArrayEigenMatrix_name()
py::classh< T > py_class_ssp
DNDS_CONSTANT const rowsize NoAlign
Alignment flag: no padding applied to rows (the only currently-supported value).
Definition Defines.hpp:282
void pybind11_ArrayEigenMatrixPair_define(py::module_ &m)
int32_t rowsize
Row-width / per-row element-count type (signed 32-bit).
Definition Defines.hpp:109
tPy_ArrayEigenMatrixPair< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > pybind11_ArrayEigenMatrixPair_declare(py::module_ &m)
std::string pybind11_ArrayEigenMatrix_name_appends()
DeviceBackend device_backend_name_to_enum(std::string_view s)
Inverse of device_backend_name. Returns Unknown for unrecognised names.
std::string pybind11_ArrayEigenMatrixPair_name()
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 4 >(py::module_ &m)
std::string RowSize_To_PySnippet(rowsize rs)
Encode a rowsize constant as a short Python-binding snippet: "<number>" for fixed,...
Definition Defines.hpp:294
auto pybind11_ArrayEigenMatrix_setitem(TArrayEigenMatrix &self, index index_, py::buffer row)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 5 >(py::module_ &m)
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
Definition Defines.hpp:107
auto pybind11_ArrayEigenMatrix_getitem(TArrayEigenMatrix &self, index index_)
void __pybind11_callBindArrayEigenMatrixs_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 7 >(py::module_ &m)
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
Definition Defines.hpp:105
void pybind11_ArrayEigenMatrix_define(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< NonUniformSize >(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 2 >(py::module_ &m)
py_class_ssp< ArrayEigenMatrix< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > > tPy_ArrayEigenMatrix
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
tPy_ArrayEigenMatrixPair< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > pybind11_ArrayEigenMatrixPair_get_class(py::module_ &m)
template void pybind11_callBindArrayEigenMatrixs_rowsizes< 3 >(py::module_ &m)
tPy_ArrayEigenMatrix< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > pybind11_ArrayEigenMatrix_declare(py::module_ &m)
void pybind11_bind_ArrayEigenMatrix_All(py::module_ &m)
tPy_ArrayEigenMatrix< _mat_ni, _mat_nj, _mat_ni_max, _mat_nj_max, _align > pybind11_ArrayEigenMatrix_get_class(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.