DNDSR 0.2.1
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
Array_bind.hpp
Go to the documentation of this file.
1#pragma once
2/// @file Array_bind.hpp
3/// @brief pybind11 bindings for @ref DNDS::Array "Array" / @ref DNDS::ParArray "ParArray" / @ref DNDS::ArrayPair "ArrayPair".
4///
5/// Provides templated helper functions (`pybind11_Array_name_appends`,
6/// `pybind11_Array_declare_*`, ...) that mechanically generate Python classes
7/// for every instantiated `(T, row_size, row_max)` combination. See the
8/// `ArrayPair.hpp` and `ArrayTransformer.hpp` corresponding C++ types.
9
10#include "Array.hpp"
11#include "ArrayTransformer.hpp"
12#include "ArrayPair.hpp"
14#include "DNDS/Defines.hpp"
16#include "Defines_bind.hpp"
17
18#include <pybind11/numpy.h>
19#include <pybind11/stl.h>
20
21namespace DNDS
22{
23 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
25 {
26 std::string TName;
27 if constexpr (std::is_arithmetic_v<T>)
28 TName = py::format_descriptor<T>().format();
29 else
30 {
31 TName = T::pybind11_name();
32 }
33 return fmt::format("_{}_{}_{}_{}",
34 TName,
35 RowSize_To_PySnippet(_row_size),
36 RowSize_To_PySnippet(_row_max),
37 Align_To_PySnippet(_align));
38 }
39
40 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
41 std::string pybind11_Array_name()
42 {
43 return "Array" + pybind11_Array_name_appends<T, _row_size, _row_max, _align>();
44 }
45
46 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
48 {
49 return "ParArray" + pybind11_Array_name_appends<T, _row_size, _row_max, _align>();
50 }
51
52 template <class TArray>
54 {
55 return "ArrayTransformer" + pybind11_Array_name_appends<typename TArray::value_type, TArray::rs, TArray::rm, TArray::al>();
56 }
57
58 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
60 {
61 return "ParArrayPair" + pybind11_Array_name_appends<T, _row_size, _row_max, _align>();
62 }
63
64 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign> // ! shared pointer managing
66
67 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign> // ! shared pointer managing
69
70 template <class TArray>
71 // using tPy_ArrayTransformer = py::class_<ArrayTransformerType_t<TArray>>; // ! unique ptr
73
74 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
75 // using tPy_ParArrayPair = py::class_<ArrayPair<ParArray<T, _row_size, _row_max, _align>>>; // ! unique ptr
77}
78
79namespace DNDS // Array
80{
81
82 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
83 tPy_Array<T, _row_size, _row_max, _align>
85 {
86 return {
87 m,
88 pybind11_Array_name<T, _row_size, _row_max, _align>().c_str()};
89 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
90 }
91
92 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
93 tPy_Array<T, _row_size, _row_max, _align>
95 {
96 return {m.attr(pybind11_Array_name<T, _row_size, _row_max, _align>().c_str())};
97 }
98
99 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
100 void pybind11_Array_define(py::module_ &m)
101 {
102
104 auto Array_ = pybind11_Array_declare<T, _row_size, _row_max, _align>(m);
105 // // helper
106 // using TArray = Array<real, 1, 1, -1>;
107 // auto Array_ = pybind11_Array_declare<real, 1, 1, -1>(m);
108 // // helper
109
110 Array_
111 .def(py::init<>())
112 .def("Size", &TArray::Size);
113 Array_
114 .def("clone", [](TArray &self)
115 {
116 auto arr = std::make_shared<TArray>();
117 arr->clone(self);
118 return arr; });
119 if constexpr (TArray::GetDataLayoutStatic() == CSR)
120 Array_
121 .def("Compress", &TArray::Compress)
122 .def("Decompress", &TArray::Decompress)
123 .def("IfCompressed", &TArray::IfCompressed);
124 Array_
125 .def(
126 "getRowStart",
127 [](TArray &self)
128 {
129 if (!self.getRowStart())
130 return py::memoryview::from_buffer<index>((index *)(&self), {0}, {sizeof(index)}, true);
131 auto &rs = *self.getRowStart();
132 return py::memoryview::from_buffer<index>(rs.data(), {rs.size()}, {sizeof(index)}, true);
133 },
134 py::keep_alive<0, 1>() /* remember to keep alive */);
135
136 Array_
137 .def(
138 "getRowSizes",
139 [](TArray &self)
140 {
141 if (!self.getRowSizes())
142 return py::memoryview::from_buffer<rowsize>((rowsize *)(&self), {0}, {sizeof(rowsize)}, true);
143 auto &rs = *self.getRowSizes();
144 return py::memoryview::from_buffer<rowsize>(rs.data(), {rs.size()}, {sizeof(rowsize)}, true);
145 },
146 py::keep_alive<0, 1>() /* remember to keep alive */);
147
148 Array_
149 .def(
150 "data",
151 [](TArray &self)
152 {
153 if constexpr (std::is_arithmetic_v<T>)
154 return py::memoryview::from_buffer<T>(
155 self.DataSize() ? self.data() : (T *)(&self), // for null buffer
156 {self.DataSize()}, {TArray::sizeof_T});
157 else // todo: determine if have pybind11_buffer_format()
158 {
159 std::string buf_format;
160 buf_format.reserve(32);
161 for (size_t i = 0; i < TArray::sizeof_T; i++)
162 buf_format += "c"; // now we use a untyped byte data
163 return py::memoryview::from_buffer(
164 self.DataSize() ? self.data() : (T *)(&self), // for null buffer
165 TArray::sizeof_T,
166 buf_format.c_str(),
167 {self.DataSize()}, {TArray::sizeof_T});
168 }
169 },
170 py::keep_alive<0, 1>() /* remember to keep alive */);
171
172 Array_
173 .def("Rowsize", py::overload_cast<index>(&TArray::RowSize, py::const_), py::arg("iRow"));
174 Array_
175 .def("Rowsize", py::overload_cast<>(&TArray::RowSize, py::const_));
176 if constexpr (
177 TArray::GetDataLayoutStatic() == CSR ||
178 TArray::GetDataLayoutStatic() == TABLE_StaticFixed ||
179 TArray::GetDataLayoutStatic() == TABLE_StaticMax)
180 Array_
181 .def("Resize", [](TArray &self, index nRow)
182 { self.Resize(nRow); }, py::arg("nRow"));
183 Array_
184 .def("Resize", [](TArray &self, index nRow, rowsize nRowsizeDynamic)
185 { self.Resize(nRow, nRowsizeDynamic); }, py::arg("nRow"), py::arg("rowsizeDynamic"));
186 if constexpr (TArray::isCSR)
187 Array_
188 .def(
189 "Resize",
190 [](TArray &self, index nRow, const py::array_t<int, pybind11::array::c_style | pybind11::array::forcecast> &rowsizes)
191 {
192 DNDS_assert_info(rowsizes.size() >= nRow, fmt::format("rowsizes is of size {}, not enough", rowsizes.size()));
193 self.Resize(nRow, [&](index iRow)
194 { return rowsizes.at(iRow); });
195 },
196 py::arg("nRow"), py::arg("rowsizesArray"));
197 if constexpr (TArray::GetDataLayoutStatic() == CSR ||
198 TArray::GetDataLayoutStatic() == TABLE_Max ||
199 TArray::GetDataLayoutStatic() == TABLE_StaticMax)
200 Array_
201 .def("ResizeRow", &TArray::ResizeRow, py::arg("iRow"), py::arg("nRowsize"));
202 Array_
203 .def("__getitem__",
204 [](const TArray &self, std::tuple<index, rowsize> index_)
205 {
206 return self(std::get<0>(index_), std::get<1>(index_));
207 });
208 Array_
209 .def("__setitem__",
210 [](TArray &self, std::tuple<index, rowsize> index_, const T &value)
211 {
212 self(std::get<0>(index_), std::get<1>(index_)) = value;
213 });
214
215 Array_
216 .def("to_device", [](TArray &self, const std::string &backend)
217 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
218 .def("to_host", &TArray::to_host)
219 .def("device", &TArray::device);
220 }
221
222 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
224 {
225 if constexpr (_row_size == UnInitRowsize)
226 return;
227 else
228 return pybind11_Array_define<T, _row_size, _row_max, _align>(m);
229 }
230}
231
232namespace DNDS // ParArray
233{
234
235 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
236 tPy_ParArray<T, _row_size, _row_max, _align>
238 {
239 // std::cout << "here1 " << std::endl;
240 auto array_ = pybind11_Array_get_class<T, _row_size, _row_max, _align>(m); // same module here
241 // std::cout << "here2 " << std::endl;
242 return {
243 m,
244 pybind11_ParArray_name<T, _row_size, _row_max, _align>().c_str(),
245 array_};
246 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
247 }
248
249 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
250 tPy_ParArray<T, _row_size, _row_max, _align>
252 {
253 return {m.attr(pybind11_ParArray_name<T, _row_size, _row_max, _align>().c_str())};
254 }
255
256 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
257 void pybind11_ParArray_define(py::module_ &m)
258 {
260 auto ParArray_ = pybind11_ParArray_declare<T, _row_size, _row_max, _align>(m);
261
262 // // helper
263 // using TParArray = ParArray<real, 1, 1, -1>;
264 // auto ParArray_ = pybind11_ParArray_declare<real, 1, 1, -1>(m);
265 // // helper
266
267 ParArray_ // need lambda below to avoid inheritance checking
268 .def(py::init([](const MPIInfo &n_mpi)
269 { return std::make_shared<TParArray>(n_mpi); }),
270 py::arg("n_mpi"))
271 .def(py::init([](const std::string &name, const MPIInfo &n_mpi)
272 { return make_ssp<TParArray>(ObjName{name}, n_mpi); }),
273 py::arg("name"), py::arg("n_mpi"))
274 .def("setObjectName", &TParArray::setObjectName, py::arg("name"))
275 .def("getObjectName", &TParArray::getObjectName)
276 .def("getMPI", [](const TParArray &self)
277 { return self.getMPI(); })
278 .def("setMPI", [](TParArray &self, const MPIInfo &n_mpi)
279 { self.setMPI(n_mpi); }, py::arg("n_mpi"))
280 .def("createGlobalMapping", [](TParArray &self)
281 { self.createGlobalMapping(); })
282 .def("getLGlobalMapping", [](TParArray &self)
283 { return self.pLGlobalMapping; })
284 .def("getTrans", [m](TParArray &self)
285 { return py::type{m.attr(pybind11_ArrayTransformer_name<TParArray>().c_str())}; });
286
287 ParArray_
288 .def("clone", [](TParArray &self)
289 {
290 auto arr = std::make_shared<TParArray>(self.mpi);
291 arr->clone(self);
292 return arr; });
293 }
294
295 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
297 {
298 if constexpr (_row_size == UnInitRowsize)
299 return;
300 else
301 return pybind11_ParArray_define<T, _row_size, _row_max, _align>(m);
302 }
303}
304
305namespace DNDS // ParArrayPair
306{
307
308 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
309 tPy_ParArrayPair<T, _row_size, _row_max, _align>
311 {
312 return {
313 m,
314 pybind11_ParArrayPair_name<T, _row_size, _row_max, _align>().c_str()};
315 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
316 }
317
318 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
319 tPy_ParArrayPair<T, _row_size, _row_max, _align>
321 {
322 return {m.attr(pybind11_ParArrayPair_name<T, _row_size, _row_max, _align>().c_str())};
323 }
324
325 template <class TPair, class TPy_Pair>
327 {
328 Pair_
329 .def(py::init([]()
330 { return std::make_shared<TPair>(); }));
331 Pair_
332 .def_readwrite("father", &TPair::father)
333 .def_readwrite("son", &TPair::son);
334 Pair_
335 .def_readonly("trans", &TPair::trans, py::return_value_policy::reference_internal);
336 Pair_
337 .def("clone",
338 [&](TPair &self)
339 {
340 auto new_pair = std::make_shared<TPair>();
341 new_pair->clone(self);
342 return new_pair;
343 });
344 Pair_
345 .def("InitPair", [](TPair &self, const std::string &name, const MPIInfo &mpi)
346 { self.InitPair(name, mpi); }, py::arg("name"), py::arg("mpi"))
347 .def("TransAttach", &TPair::TransAttach)
348 .def("hash", &TPair::hash)
349 .def("Size", &TPair::Size);
350 if constexpr (TPair::t_arr::GetDataLayoutStatic() == CSR)
351 Pair_
352 .def("CompressBoth", &TPair::CompressBoth);
353
354 Pair_
355 .def("to_device", [](TPair &self, const std::string &backend)
356 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
357 .def("to_host", &TPair::to_host);
358
359 // Serialization methods
360 Pair_
361 .def(
362 "WriteSerialize",
363 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
364 const std::string &name, bool includePIG, bool includeSon)
365 {
366 self.WriteSerialize(serializerP, name, includePIG, includeSon);
367 },
368 py::arg("serializer"), py::arg("name"),
369 py::arg("includePIG") = true, py::arg("includeSon") = true)
370 .def(
371 "WriteSerialize",
372 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
373 const std::string &name, std::vector<index> origIndex,
374 bool includePIG, bool includeSon)
375 {
376 self.WriteSerialize(serializerP, name, origIndex, includePIG, includeSon);
377 },
378 py::arg("serializer"), py::arg("name"), py::arg("origIndex"),
379 py::arg("includePIG") = true, py::arg("includeSon") = true)
380 .def(
381 "ReadSerialize",
382 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
383 const std::string &name, bool includePIG, bool includeSon)
384 {
385 self.ReadSerialize(serializerP, name, includePIG, includeSon);
386 },
387 py::arg("serializer"), py::arg("name"),
388 py::arg("includePIG") = true, py::arg("includeSon") = true)
389 .def(
390 "ReadSerializeRedistributed",
391 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
392 const std::string &name, std::vector<index> newOrigIndex)
393 {
394 self.ReadSerializeRedistributed(serializerP, name, newOrigIndex);
395 },
396 py::arg("serializer"), py::arg("name"), py::arg("newOrigIndex"));
397 }
398
399 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
401 {
402 // using TArray = ParArray<T, _row_size, _row_max, _align>;
404 auto Pair_ = pybind11_ParArrayPair_declare<T, _row_size, _row_max, _align>(m);
405
406 // // helper
407 // using TArray = ParArray<real, 1, 1, -1>;
408 // using TPair = ArrayPair<ParArray<real, 1, 1, -1>>;
409 // auto Pair_ = pybind11_ParArrayPair_declare<real, 1, 1, -1>(m);
410 // // helper
411
412 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
413
414 Pair_
415 .def("RowSize", [](const TPair &self, index i)
416 { return self.RowSize(i); }, py::arg("i"))
417 .def("RowSize", [](const TPair &self)
418 { return self.RowSize(); });
419 Pair_
420 .def(
421 "__getitem__",
422 [](const TPair &self, std::tuple<index, rowsize> index_)
423 {
424 return self(std::get<0>(index_), std::get<1>(index_));
425 })
426 .def(
427 "__setitem__",
428 [](TPair &self, std::tuple<index, rowsize> index_, const T &value)
429 {
430 self(std::get<0>(index_), std::get<1>(index_)) = value;
431 });
432 }
433
434 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
436 {
437 if constexpr (_row_size == UnInitRowsize)
438 return;
439 else
440 return pybind11_ParArrayPair_define<T, _row_size, _row_max, _align>(m);
441 }
442}
443
444namespace DNDS // ArrayTransformer
445{
446 template <class TArray>
447 tPy_ArrayTransformer<TArray>
449 {
450 return {m, pybind11_ArrayTransformer_name<TArray>().c_str()};
451 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
452 }
453
454 template <class TArray>
455 tPy_ArrayTransformer<TArray>
457 {
458 return {m.attr(pybind11_ArrayTransformer_name<TArray>().c_str())};
459 }
460
461 template <class TArray>
463 {
464 using TArrayTransformer = ArrayTransformerType_t<TArray>;
465 auto ArrayTransformer_ = pybind11_ArrayTransformer_declare<TArray>(m);
466
467 // // helper
468 // using TArrayTransformer = ArrayTransformer<real, 1>;
469 // auto ArrayTransformer_ = pybind11_ArrayTransformer_declare<real, 1>(m);
470 // // helper
471
472#define DNDS_pybind11_array_transformer_def_ssp_property(property_name, field_name) \
473 { \
474 ArrayTransformer_.def_property( \
475 #property_name, \
476 [](TArrayTransformer &self) { return self.field_name; }, \
477 [](TArrayTransformer &self, decltype(TArrayTransformer::field_name) in) { self.field_name = in; }); \
478 }
480 DNDS_pybind11_array_transformer_def_ssp_property(LGhostMapping, pLGhostMapping);
484
485 ArrayTransformer_
486 .def(py::init<>())
487 .def("setFatherSon", &TArrayTransformer::setFatherSon, py::arg("father"), py::arg("son"))
488 .def("createFatherGlobalMapping", &TArrayTransformer::createFatherGlobalMapping)
489 .def("createGhostMapping", [](TArrayTransformer &self, std::vector<index> pullIndexGlobal) -> void
490 { self.createGhostMapping(pullIndexGlobal); }, py::arg("pullIndexGlobal"))
491 .def("createGhostMapping", [](TArrayTransformer &self, const py::array_t<index> &pullIndexGlobal)
492 {
493 std::vector<index> pullIndexVec;
494 pullIndexVec.reserve(pullIndexGlobal.size());
495 // NOLINTBEGIN(modernize-loop-convert)
496 // Index-based loop is required here: pybind11 `array_t` iterators
497 // yield `pybind11::handle`, not `long`. The implicit numpy-to-long
498 // conversion is performed by `pullIndexGlobal.at(i)`, which does
499 // not have a range-based-for equivalent.
500 for(ssize_t i = 0; i < pullIndexGlobal.size(); i++)
501 pullIndexVec.push_back(pullIndexGlobal.at(i)); // only 1D
502 // NOLINTEND(modernize-loop-convert)
503 self.createGhostMapping(pullIndexVec); }, py::arg("pullIndexGlobal"))
504 .def("createGhostMapping", [](TArrayTransformer &self, std::vector<index> pushingIndexLocal, std::vector<index> pushingStarts) -> void
505 { self.createGhostMapping(pushingIndexLocal, pushingStarts); }, py::arg("pushingIndexLocal"), py::arg("pushingStarts"));
506 ArrayTransformer_
507 .def("createMPITypes", &TArrayTransformer::createMPITypes)
508 .def("clearMPITypes", &TArrayTransformer::clearMPITypes)
509 .def(
510 "BorrowGGIndexing",
511 [](TArrayTransformer &self, const py::object &other)
512 {
513 auto other_father = other.attr("father");
514 auto other_father_size = other_father.attr("Size")().cast<index>();
515 auto other_pLGhostMapping = other.attr("LGhostMapping").cast<ssp<OffsetAscendIndexMapping>>();
516 auto other_pLGlobalMapping = other.attr("LGlobalMapping").cast<ssp<GlobalOffsetsMapping>>();
517
518 DNDS_assert(self.father);
519 DNDS_assert(other_father_size == self.father->Size());
520 DNDS_assert(other_pLGhostMapping && other_pLGlobalMapping);
521
522 self.pLGhostMapping = other_pLGhostMapping;
523 self.pLGlobalMapping = other_pLGlobalMapping;
524 self.father->pLGlobalMapping = self.pLGlobalMapping;
525 },
526 py::arg("other"));
527
528 ArrayTransformer_
529 .def("initPersistentPull", &TArrayTransformer::initPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
530 .def("initPersistentPush", &TArrayTransformer::initPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
531 .def("startPersistentPull", &TArrayTransformer::startPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
532 .def("startPersistentPush", &TArrayTransformer::startPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
533 .def("waitPersistentPull", &TArrayTransformer::waitPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
534 .def("waitPersistentPush", &TArrayTransformer::waitPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
535 .def("clearPersistentPull", &TArrayTransformer::clearPersistentPull)
536 .def("clearPersistentPush", &TArrayTransformer::clearPersistentPush)
537 .def("pullOnce", &TArrayTransformer::pullOnce)
538 .def("pushOnce", &TArrayTransformer::pushOnce);
539 }
540
541 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
543 {
544 if constexpr (_row_size == UnInitRowsize)
545 return;
546 else
547 return pybind11_ArrayTransformer_define<ParArray<T, _row_size, _row_max, _align>>(m);
548 }
549}
550
551namespace DNDS
552{
553 template <int offset = 0>
555 {
556 std::array<rowsize, 9> ret{UnInitRowsize};
557
558 for (auto &v : ret)
560 int rs = 8;
561 for (int i = 0; i < rs; i++)
562 ret[i] = i + 1 + rs * offset;
563 return ret;
564 }
565 static constexpr auto pybind11_arrayRowsizeInstantiationList = _get_pybind11_arrayRowsizeInstantiationList();
566
567 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
568 void pybind11_callBindArrays_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...> /*unused*/)
569 {
570 (_pybind11_Array_define_dispatch<T, Arr[Is]>(m), ...);
571 }
572
573 template <class T, int offset = 0>
575 {
576 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
578 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
579 }
580
581 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
582 void pybind11_callBindParArrays_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...> /*unused*/)
583 {
584 (_pybind11_ParArray_define_dispatch<T, Arr[Is]>(m), ...);
585 }
586
587 template <class T, int offset = 0>
589 {
590 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
592 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
593 }
594
595 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
596 void pybind11_callBindArrayTransformers_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...> /*unused*/)
597 {
598 (_pybind11_ArrayTransformer_define_dispatch<T, Arr[Is]>(m), ...);
599 }
600
601 template <class T, int offset = 0>
603 {
604 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
606 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
607 }
608
609 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
610 void pybind11_callBindParArrayPairs_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...> /*unused*/)
611 {
612 (_pybind11_ParArrayPair_define_dispatch<T, Arr[Is]>(m), ...);
613 }
614
615 template <class T, int offset = 0>
617 {
618 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
620 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
621 }
622}
623
624namespace DNDS
625{
626 void pybind11_bind_Array_All(py::module_ m);
627
628#define pybind11_bind_Array_All_X_declare(offset) \
629 void pybind11_bind_Array_All_##offset(py::module_ m)
630
631#define pybind11_bind_Array_All_X_call(offset, m) \
632 pybind11_bind_Array_All_##offset(m)
633
641 // definitions are offloaded to Array_bind_offset/*.cpp
642
653}
Father-son array pairs with device views and ghost communication.
ParArray (MPI-aware array) and ArrayTransformer (ghost/halo communication).
Core 2D variable-length array container with five data layouts.
#define DNDS_pybind11_array_transformer_def_ssp_property(property_name, field_name)
#define pybind11_bind_Array_All_X_call(offset, m)
#define pybind11_bind_Array_All_X_declare(offset)
Core type aliases, constants, and metaprogramming utilities for the DNDS framework.
Shared pybind11 plumbing used by every *_bind.hpp in DNDS (buffer-protocol type check,...
Device memory abstraction layer with backend-specific storage and factory creation.
#define DNDS_assert_info(expr, info)
Debug-only assertion with an extra std::string info message.
Definition Errors.hpp:117
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
Definition Errors.hpp:112
Eigen::Matrix< real, 3, 3 > m
Base types and abstract interface for array serialization.
Core 2D variable-length array container, the storage foundation of DNDSR.
Definition Array.hpp:97
MPI-aware Array: adds a communicator, rank, and global index mapping.
ssp< SerializerBase > SerializerBaseSSP
the host side operators are provided as implemented
void pybind11_Array_define(py::module_ &m)
void _pybind11_ArrayTransformer_define_dispatch(py::module_ &m)
constexpr auto _get_pybind11_arrayRowsizeInstantiationList()
void _pybind11_ParArray_define_dispatch(py::module_ &m)
@ Unknown
Unset / sentinel.
py_class_ssp< ParArray< T, _row_size, _row_max, _align > > tPy_ParArray
py::classh< T > py_class_ssp
tPy_ParArray< T, _row_size, _row_max, _align > pybind11_ParArray_get_class(py::module_ &m)
void pybind11_callBindParArrays_rowsizes(py::module_ &m)
void pybind11_bind_Array_Offsets(const py::module_ &m)
void pybind11_callBindArrayTransformers_rowsizes(py::module_ &m)
void pybind11_ArrayPairGenericBindBasics(TPy_Pair &Pair_)
tPy_Array< T, _row_size, _row_max, _align > pybind11_Array_declare(py::module_ &m)
int32_t rowsize
Row-width / per-row element-count type (signed 32-bit).
Definition Defines.hpp:114
void pybind11_callBindParArrayPairs_rowsizes(py::module_ &m)
tPy_ArrayTransformer< TArray > pybind11_ArrayTransformer_get_class(py::module_ &m)
void pybind11_ArrayTransformer_define(py::module_ &m)
std::string pybind11_Array_name_appends()
void pybind11_callBindArrayTransformers_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
std::string pybind11_ParArrayPair_name()
DeviceBackend device_backend_name_to_enum(std::string_view s)
Inverse of device_backend_name. Returns Unknown for unrecognised names.
std::string pybind11_ParArray_name()
@ TABLE_StaticFixed
Fixed row width, known at compile time.
@ TABLE_Max
Padded variable rows; max width set at runtime.
@ CSR
Compressed Sparse Row (flat buffer + row-start index).
@ TABLE_StaticMax
Padded variable rows; max width fixed at compile time.
tPy_ParArray< T, _row_size, _row_max, _align > pybind11_ParArray_declare(py::module_ &m)
void _pybind11_Array_define_dispatch(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:299
tPy_ArrayTransformer< TArray > pybind11_ArrayTransformer_declare(py::module_ &m)
std::string pybind11_ArrayTransformer_name()
void pybind11_callBindParArrayPairs_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
void pybind11_callBindArrays_rowsizes(py::module_ &m)
py_class_ssp< ArrayTransformerType_t< TArray > > tPy_ArrayTransformer
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
Definition Defines.hpp:112
py_class_ssp< Array< T, _row_size, _row_max, _align > > tPy_Array
std::shared_ptr< T > ssp
Shortened alias for std::shared_ptr used pervasively in DNDSR.
Definition Defines.hpp:143
tPy_Array< T, _row_size, _row_max, _align > pybind11_Array_get_class(py::module_ &m)
void _pybind11_ParArrayPair_define_dispatch(py::module_ &m)
py_class_ssp< ArrayPair< ParArray< T, _row_size, _row_max, _align > > > tPy_ParArrayPair
std::string pybind11_Array_name()
void pybind11_callBindParArrays_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
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:315
void pybind11_ParArray_define(py::module_ &m)
typename ArrayTransformerType< TArray >::Type ArrayTransformerType_t
void pybind11_bind_Array_All(py::module_ m)
Definition Array_bind.cpp:5
void pybind11_callBindArrays_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
void pybind11_ParArrayPair_define(py::module_ &m)
DNDS_CONSTANT const rowsize UnInitRowsize
Sentinel "not initialised" rowsize value (= INT32_MIN).
Definition Defines.hpp:184
tPy_ParArrayPair< T, _row_size, _row_max, _align > pybind11_ParArrayPair_declare(py::module_ &m)
tPy_ParArrayPair< T, _row_size, _row_max, _align > pybind11_ParArrayPair_get_class(py::module_ &m)
Convenience bundle of a father, son, and attached ArrayTransformer.
Lightweight bundle of an MPI communicator and the calling rank's coordinates.
Definition MPI.hpp:231
Tag type for naming objects created via make_ssp.
Definition Defines.hpp:254
Eigen::Matrix< real, 5, 1 > v
solverDOF father pLGlobalMapping