DNDSR 0.1.0.dev1+gcd065ad
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"
13#include "SerializerBase.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>
84 pybind11_Array_declare(py::module_ &m)
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, 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",
346 [](TPair &self, const std::string &name, const MPIInfo &mpi)
347 { self.InitPair(name, mpi); },
348 py::arg("name"), py::arg("mpi"))
349 .def("TransAttach", &TPair::TransAttach)
350 .def("hash", &TPair::hash)
351 .def("Size", &TPair::Size);
352 if constexpr (TPair::t_arr::GetDataLayoutStatic() == CSR)
353 Pair_
354 .def("CompressBoth", &TPair::CompressBoth);
355
356 Pair_
357 .def("to_device", [](TPair &self, const std::string &backend)
358 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
359 .def("to_host", &TPair::to_host);
360
361 // Serialization methods
362 Pair_
363 .def(
364 "WriteSerialize",
365 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
366 const std::string &name, bool includePIG, bool includeSon)
367 {
368 self.WriteSerialize(serializerP, name, includePIG, includeSon);
369 },
370 py::arg("serializer"), py::arg("name"),
371 py::arg("includePIG") = true, py::arg("includeSon") = true)
372 .def(
373 "WriteSerialize",
374 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
375 const std::string &name, std::vector<index> origIndex,
376 bool includePIG, bool includeSon)
377 {
378 self.WriteSerialize(serializerP, name, origIndex, includePIG, includeSon);
379 },
380 py::arg("serializer"), py::arg("name"), py::arg("origIndex"),
381 py::arg("includePIG") = true, py::arg("includeSon") = true)
382 .def(
383 "ReadSerialize",
384 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
385 const std::string &name, bool includePIG, bool includeSon)
386 {
387 self.ReadSerialize(serializerP, name, includePIG, includeSon);
388 },
389 py::arg("serializer"), py::arg("name"),
390 py::arg("includePIG") = true, py::arg("includeSon") = true)
391 .def(
392 "ReadSerializeRedistributed",
393 [](TPair &self, Serializer::SerializerBaseSSP serializerP,
394 const std::string &name, std::vector<index> newOrigIndex)
395 {
396 self.ReadSerializeRedistributed(serializerP, name, newOrigIndex);
397 },
398 py::arg("serializer"), py::arg("name"), py::arg("newOrigIndex"));
399 }
400
401 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
402 void pybind11_ParArrayPair_define(py::module_ &m)
403 {
404 // using TArray = ParArray<T, _row_size, _row_max, _align>;
406 auto Pair_ = pybind11_ParArrayPair_declare<T, _row_size, _row_max, _align>(m);
407
408 // // helper
409 // using TArray = ParArray<real, 1, 1, -1>;
410 // using TPair = ArrayPair<ParArray<real, 1, 1, -1>>;
411 // auto Pair_ = pybind11_ParArrayPair_declare<real, 1, 1, -1>(m);
412 // // helper
413
414 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
415
416 Pair_
417 .def("RowSize", [](const TPair &self, index i)
418 { return self.RowSize(i); }, py::arg("i"))
419 .def("RowSize", [](const TPair &self)
420 { return self.RowSize(); });
421 Pair_
422 .def(
423 "__getitem__",
424 [](const TPair &self, std::tuple<index, rowsize> index_)
425 {
426 return self(std::get<0>(index_), std::get<1>(index_));
427 })
428 .def(
429 "__setitem__",
430 [](TPair &self, std::tuple<index, rowsize> index_, const T &value)
431 {
432 self(std::get<0>(index_), std::get<1>(index_)) = value;
433 });
434 }
435
436 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
438 {
439 if constexpr (_row_size == UnInitRowsize)
440 return;
441 else
442 return pybind11_ParArrayPair_define<T, _row_size, _row_max, _align>(m);
443 }
444}
445
446namespace DNDS // ArrayTransformer
447{
448 template <class TArray>
449 tPy_ArrayTransformer<TArray>
451 {
452 return {m, pybind11_ArrayTransformer_name<TArray>().c_str()};
453 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
454 }
455
456 template <class TArray>
457 tPy_ArrayTransformer<TArray>
459 {
460 return {m.attr(pybind11_ArrayTransformer_name<TArray>().c_str())};
461 }
462
463 template <class TArray>
465 {
466 using TArrayTransformer = ArrayTransformerType_t<TArray>;
467 auto ArrayTransformer_ = pybind11_ArrayTransformer_declare<TArray>(m);
468
469 // // helper
470 // using TArrayTransformer = ArrayTransformer<real, 1>;
471 // auto ArrayTransformer_ = pybind11_ArrayTransformer_declare<real, 1>(m);
472 // // helper
473
474#define DNDS_pybind11_array_transformer_def_ssp_property(property_name, field_name) \
475 { \
476 ArrayTransformer_.def_property( \
477 #property_name, \
478 [](TArrayTransformer &self) { return self.field_name; }, \
479 [](TArrayTransformer &self, decltype(TArrayTransformer::field_name) in) { self.field_name = in; }); \
480 }
481 DNDS_pybind11_array_transformer_def_ssp_property(LGlobalMapping, pLGlobalMapping);
482 DNDS_pybind11_array_transformer_def_ssp_property(LGhostMapping, pLGhostMapping);
486
487 ArrayTransformer_
488 .def(py::init<>())
489 .def("setFatherSon", &TArrayTransformer::setFatherSon, py::arg("father"), py::arg("son"))
490 .def("createFatherGlobalMapping", &TArrayTransformer::createFatherGlobalMapping)
491 .def("createGhostMapping", [](TArrayTransformer &self, std::vector<index> pullIndexGlobal) -> void
492 { self.createGhostMapping(pullIndexGlobal); }, py::arg("pullIndexGlobal"))
493 .def("createGhostMapping", [](TArrayTransformer &self, py::array_t<index> pullIndexGlobal)
494 {
495 std::vector<index> pullIndexVec;
496 pullIndexVec.reserve(pullIndexGlobal.size());
497 for(ssize_t i = 0; i < pullIndexGlobal.size(); i++)
498 pullIndexVec.push_back(pullIndexGlobal.at(i)); // only 1D
499 self.createGhostMapping(pullIndexVec); }, py::arg("pullIndexGlobal"))
500 .def("createGhostMapping", [](TArrayTransformer &self, std::vector<index> pushingIndexLocal, std::vector<index> pushingStarts) -> void
501 { self.createGhostMapping(pushingIndexLocal, pushingStarts); }, py::arg("pushingIndexLocal"), py::arg("pushingStarts"));
502 ArrayTransformer_
503 .def("createMPITypes", &TArrayTransformer::createMPITypes)
504 .def("clearMPITypes", &TArrayTransformer::clearMPITypes)
505 .def(
506 "BorrowGGIndexing",
507 [](TArrayTransformer &self, py::object other)
508 {
509 auto other_father = other.attr("father");
510 auto other_father_size = other_father.attr("Size")().cast<index>();
511 auto other_pLGhostMapping = other.attr("LGhostMapping").cast<ssp<OffsetAscendIndexMapping>>();
512 auto other_pLGlobalMapping = other.attr("LGlobalMapping").cast<ssp<GlobalOffsetsMapping>>();
513
514 DNDS_assert(self.father);
515 DNDS_assert(other_father_size == self.father->Size());
516 DNDS_assert(other_pLGhostMapping && other_pLGlobalMapping);
517
518 self.pLGhostMapping = other_pLGhostMapping;
519 self.pLGlobalMapping = other_pLGlobalMapping;
520 self.father->pLGlobalMapping = self.pLGlobalMapping;
521 },
522 py::arg("other"));
523
524 ArrayTransformer_
525 .def("initPersistentPull", &TArrayTransformer::initPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
526 .def("initPersistentPush", &TArrayTransformer::initPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
527 .def("startPersistentPull", &TArrayTransformer::startPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
528 .def("startPersistentPush", &TArrayTransformer::startPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
529 .def("waitPersistentPull", &TArrayTransformer::waitPersistentPull, py::arg("backend") = DeviceBackend::Unknown)
530 .def("waitPersistentPush", &TArrayTransformer::waitPersistentPush, py::arg("backend") = DeviceBackend::Unknown)
531 .def("clearPersistentPull", &TArrayTransformer::clearPersistentPull)
532 .def("clearPersistentPush", &TArrayTransformer::clearPersistentPush)
533 .def("pullOnce", &TArrayTransformer::pullOnce)
534 .def("pushOnce", &TArrayTransformer::pushOnce);
535 }
536
537 template <class T, rowsize _row_size = 1, rowsize _row_max = _row_size, rowsize _align = NoAlign>
539 {
540 if constexpr (_row_size == UnInitRowsize)
541 return;
542 else
543 return pybind11_ArrayTransformer_define<ParArray<T, _row_size, _row_max, _align>>(m);
544 }
545}
546
547namespace DNDS
548{
549 template <int offset = 0>
551 {
552 std::array<rowsize, 9> ret{UnInitRowsize};
553
554 for (auto &v : ret)
556 int rs = 8;
557 for (int i = 0; i < rs; i++)
558 ret[i] = i + 1 + rs * offset;
559 return ret;
560 }
561 static constexpr auto pybind11_arrayRowsizeInstantiationList = _get_pybind11_arrayRowsizeInstantiationList();
562
563 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
564 void __pybind11_callBindArrays_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
565 {
566 (_pybind11_Array_define_dispatch<T, Arr[Is]>(m), ...);
567 }
568
569 template <class T, int offset = 0>
571 {
572 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
574 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
575 }
576
577 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
578 void __pybind11_callBindParArrays_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
579 {
580 (_pybind11_ParArray_define_dispatch<T, Arr[Is]>(m), ...);
581 }
582
583 template <class T, int offset = 0>
585 {
586 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
588 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
589 }
590
591 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
592 void __pybind11_callBindArrayTransformers_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
593 {
594 (_pybind11_ArrayTransformer_define_dispatch<T, Arr[Is]>(m), ...);
595 }
596
597 template <class T, int offset = 0>
599 {
600 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
602 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
603 }
604
605 template <class T, size_t N, std::array<int, N> const &Arr, size_t... Is>
606 void __pybind11_callBindParArrayPairs_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
607 {
608 (_pybind11_ParArrayPair_define_dispatch<T, Arr[Is]>(m), ...);
609 }
610
611 template <class T, int offset = 0>
613 {
614 static constexpr auto seq = _get_pybind11_arrayRowsizeInstantiationList<offset>();
616 T, seq.size(), seq>(m, std::make_index_sequence<seq.size()>{});
617 }
618}
619
620namespace DNDS
621{
622 void pybind11_bind_Array_All(py::module_ m);
623
624#define pybind11_bind_Array_All_X_declare(offset) \
625 void pybind11_bind_Array_All_##offset(py::module_ m)
626
627#define pybind11_bind_Array_All_X_call(offset, m) \
628 pybind11_bind_Array_All_##offset(m)
629
637 // definitions are offloaded to Array_bind_offset/*.cpp
638
649}
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:113
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
Definition Errors.hpp:108
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)
void pybind11_bind_Array_Offsets(py::module_ m)
constexpr auto _get_pybind11_arrayRowsizeInstantiationList()
void __pybind11_callBindArrays_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
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
void __pybind11_callBindArrayTransformers_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
tPy_ParArray< T, _row_size, _row_max, _align > pybind11_ParArray_get_class(py::module_ &m)
void pybind11_callBindParArrays_rowsizes(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:109
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()
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:294
tPy_ArrayTransformer< TArray > pybind11_ArrayTransformer_declare(py::module_ &m)
std::string pybind11_ArrayTransformer_name()
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:107
py_class_ssp< Array< T, _row_size, _row_max, _align > > tPy_Array
void __pybind11_callBindParArrayPairs_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
std::shared_ptr< T > ssp
Shortened alias for std::shared_ptr used pervasively in DNDSR.
Definition Defines.hpp:138
void __pybind11_callBindParArrays_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
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()
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_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_ParArrayPair_define(py::module_ &m)
DNDS_CONSTANT const rowsize UnInitRowsize
Sentinel "not initialised" rowsize value (= INT32_MIN).
Definition Defines.hpp:179
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:215
Tag type for naming objects created via make_ssp.
Definition Defines.hpp:249
Eigen::Matrix< real, 5, 1 > v