7#ifndef PECLET_VORO_BINDINGS_COMMON_HPP
8#define PECLET_VORO_BINDINGS_COMMON_HPP
10#include <nanobind/nanobind.h>
11#include <nanobind/ndarray.h>
12#include <nanobind/stl/array.h>
13#include <nanobind/stl/optional.h>
14#include <nanobind/stl/string.h>
21#include <Kokkos_Core.hpp>
30#include "peclet/core/common/view.hpp"
31#include "peclet/core/geom/scene_builder.hpp"
32#include "peclet/core/python/kokkos_teardown.hpp"
33#include "peclet/core/python/ndarray_interop.hpp"
37namespace nb = nanobind;
39using DView = Kokkos::View<real_t*, peclet::core::MemSpace>;
91inline const char*
doc(std::string s) {
92 static std::deque<std::string> keep;
93 keep.push_back(std::move(s));
94 return keep.back().c_str();
96inline std::string
fmt(
double v) {
98 std::snprintf(b,
sizeof b,
"%g", v);
101inline std::string
fmt(
int v) {
102 return std::to_string(v);
106inline std::vector<real_t>
flatten3(nb::ndarray<real_t, nb::c_contig> a) {
107 if (a.ndim() != 2 || a.shape(1) != 3)
108 throw std::runtime_error(
"expected an (N,3) array");
109 const real_t* p = a.data();
110 return std::vector<real_t>(p, p +
static_cast<std::size_t
>(a.shape(0)) * 3);
114inline std::vector<real_t>
flatten1(nb::ndarray<real_t, nb::c_contig> a) {
115 return peclet::core::python::ndarray_to_vector<real_t>(nb::ndarray<>(a));
121 if (!(e[0] >
real_t(0)) || e[0] != e[1] || e[1] != e[2])
122 throw std::invalid_argument(std::string(
"voro: ") + fn +
123 "(extent=...) must be a cubic box (Lx == Ly == Lz > 0) — the "
124 "union-of-spheres wall SDF is cubic-periodic.");
131using Mem = peclet::core::MemSpace;
138 Kokkos::View<peclet::core::geom::ShapeNode<real_t>*,
Mem>
nodes;
139 Kokkos::View<peclet::core::geom::GridDesc<real_t>*,
Mem>
grids;
140 Kokkos::View<float*, Mem>
pool;
153 nb::ndarray<real_t, nb::c_contig> node_reals,
int root,
155 using namespace peclet::core::geom;
156 std::vector<int> ni(node_ints.data(), node_ints.data() + node_ints.size());
157 std::vector<real_t> nr(node_reals.data(), node_reals.data() + node_reals.size());
158 SceneBuilder<real_t> b = SceneBuilder<real_t>::decode(ni, nr, {}, {}, {}, {});
159 const auto& nodes = b.nodes();
161 throw std::runtime_error(
"set_geometry: empty node table");
162 if (root < 0 || root >=
static_cast<int>(nodes.size()))
163 throw std::runtime_error(
"set_geometry: root node index out of range");
165 h.
nodes = Kokkos::View<ShapeNode<real_t>*,
Mem>(
"scene.nodes", nodes.size());
167 auto hn = Kokkos::create_mirror_view(h.
nodes);
168 for (std::size_t i = 0; i < nodes.size(); ++i)
170 Kokkos::deep_copy(h.
nodes, hn);
172 const auto& grids = b.grids();
173 const auto& pool = b.samples();
174 h.
grids = Kokkos::View<GridDesc<real_t>*,
Mem>(
"scene.grids", grids.empty() ? 1 : grids.size());
175 h.
pool = Kokkos::View<float*, Mem>(
"scene.pool", pool.empty() ? 1 : pool.size());
176 if (!grids.empty()) {
177 auto hg = Kokkos::create_mirror_view(h.
grids);
178 for (std::size_t i = 0; i < grids.size(); ++i)
180 Kokkos::deep_copy(h.
grids, hg);
183 Kokkos::deep_copy(h.
pool,
184 Kokkos::View<const float*, Kokkos::HostSpace>(pool.data(), pool.size()));
195inline void checkDomain(
const char* cls, std::array<real_t, 3> extent, std::array<real_t, 3> origin,
196 std::array<bool, 3> periodic) {
197 for (
int a = 0; a < 3; ++a) {
198 if (!(extent[a] >
real_t(0)))
199 throw std::invalid_argument(std::string(
"voro: ") + cls +
200 ".set_domain(extent=...) needs three positive lengths.");
201 if (origin[a] !=
real_t(0))
202 throw std::invalid_argument(std::string(
"voro: ") + cls +
203 ".set_domain(origin=...) must be (0, 0, 0) — the tessellator's "
204 "periodic box is anchored at the origin. Shift your points "
207 throw std::invalid_argument(std::string(
"voro: ") + cls +
208 ".set_domain(periodic=...) must be (True, True, True) — this "
209 "engine has no non-periodic axis. Use a wall SDF (set_geometry) "
210 "to bound the domain.");
221 throw std::invalid_argument(
"voro: set_wall_mode(mode='" + mode +
225inline nb::ndarray<nb::numpy, real_t>
toNumpy3(std::vector<real_t> v) {
226 const std::size_t N = v.size() / 3;
227 return peclet::core::python::vector_to_ndarray(std::move(v), {N, std::size_t(3)}, {3, 1});
229inline nb::ndarray<nb::numpy, real_t>
toNumpy1(std::vector<real_t> v) {
230 const std::size_t N = v.size();
231 return peclet::core::python::vector_to_ndarray(std::move(v), {N}, {1});
263#ifdef PECLET_VORO_MPI
264void bindMpi(nb::module_& m);
constexpr int kPoreCgIters
Definition voro_bindings_common.hpp:79
constexpr double kInterfaceSigma
Definition voro_bindings_common.hpp:80
constexpr int kPoreMaxIter
Definition voro_bindings_common.hpp:77
constexpr int kOptimizerSearchWindow
Definition voro_bindings_common.hpp:74
constexpr int kPoreSearchWindow
Definition voro_bindings_common.hpp:75
constexpr int kPoreMaxBins
Definition voro_bindings_common.hpp:82
constexpr long kDistributedCells
Definition voro_bindings_common.hpp:86
constexpr double kSdfGradientStep
Definition voro_bindings_common.hpp:69
constexpr int kOptimizerMaxIter
Definition voro_bindings_common.hpp:76
constexpr double kDistributedRcut
Definition voro_bindings_common.hpp:85
constexpr double kWallSkin
Definition voro_bindings_common.hpp:70
constexpr double kOptimizerTolerance
Definition voro_bindings_common.hpp:78
Definition voro_bindings_common.hpp:45
const char * doc(std::string s)
Definition voro_bindings_common.hpp:91
nb::ndarray< nb::numpy, real_t > toNumpy3(std::vector< real_t > v)
Definition voro_bindings_common.hpp:225
nb::ndarray< nb::numpy, real_t > toNumpy1(std::vector< real_t > v)
Definition voro_bindings_common.hpp:229
void checkDomain(const char *cls, std::array< real_t, 3 > extent, std::array< real_t, 3 > origin, std::array< bool, 3 > periodic)
Definition voro_bindings_common.hpp:195
std::vector< real_t > flatten1(nb::ndarray< real_t, nb::c_contig > a)
Definition voro_bindings_common.hpp:114
std::vector< real_t > flatten3(nb::ndarray< real_t, nb::c_contig > a)
Definition voro_bindings_common.hpp:106
std::string fmt(double v)
Definition voro_bindings_common.hpp:96
bool parseWallMode(const std::string &mode)
Definition voro_bindings_common.hpp:216
peclet::core::MemSpace Mem
Definition voro_bindings_common.hpp:131
void bindOptimizers(nb::module_ &m)
Definition voro_optimizers.cpp:7
void bindSimulation(nb::module_ &m)
Definition voro_simulation.cpp:232
SceneHolder makeSceneHolder(nb::ndarray< int, nb::c_contig > node_ints, nb::ndarray< real_t, nb::c_contig > node_reals, int root, real_t grad_h)
Definition voro_bindings_common.hpp:152
void bindFlow(nb::module_ &m)
Definition voro_flow.cpp:181
real_t cubicExtent(std::array< real_t, 3 > e, const char *fn)
Definition voro_bindings_common.hpp:120
constexpr const char * kWallModeList
Definition voro_bindings_common.hpp:215
void bindPore(nb::module_ &m)
Definition voro_pore.cpp:167
void bindTessellation(nb::module_ &m)
Definition voro_tessellation.cpp:26
constexpr int kPoreMaxTriangles
Definition params.hpp:24
constexpr int kOptimizerCgIters
Definition params.hpp:37
constexpr double kBarrierDecay
Definition params.hpp:38
constexpr int kMaxPlanes
Definition params.hpp:18
constexpr double kSkin
Definition params.hpp:33
constexpr double kCertificateTolerance
Definition params.hpp:32
constexpr int kMaxTriangles
Definition params.hpp:19
constexpr int kPoreMaxPlanes
Definition params.hpp:23
constexpr int kSearchWindow
Definition params.hpp:28
The named engine defaults of peclet.voro — one header-level home for every capacity and default the l...
Sentinel "no geometry" provider — the default; the clip stage is skipped.
Definition sdf.hpp:39
Definition voro_bindings_common.hpp:246
int iters
Definition voro_bindings_common.hpp:249
bool converged
Definition voro_bindings_common.hpp:250
double energy
Definition voro_bindings_common.hpp:248
double energy_ratio
Definition voro_bindings_common.hpp:248
nb::object positions
(N,3) float64
Definition voro_bindings_common.hpp:247
Definition voro_bindings_common.hpp:237
bool converged
Definition voro_bindings_common.hpp:242
nb::object positions
(N,3) float64
Definition voro_bindings_common.hpp:238
int iters
Definition voro_bindings_common.hpp:240
int num_empty
Definition voro_bindings_common.hpp:243
nb::object weights
(N,) float64 when the power weights were optimised, else None
Definition voro_bindings_common.hpp:239
double max_vol_err
Definition voro_bindings_common.hpp:241
double mean_vol_err
Definition voro_bindings_common.hpp:241
Definition voro_bindings_common.hpp:137
SceneT scene
Definition voro_bindings_common.hpp:141
void clear()
Definition voro_bindings_common.hpp:143
Kokkos::View< peclet::core::geom::ShapeNode< real_t > *, Mem > nodes
Definition voro_bindings_common.hpp:138
Kokkos::View< float *, Mem > pool
Definition voro_bindings_common.hpp:140
Kokkos::View< peclet::core::geom::GridDesc< real_t > *, Mem > grids
Definition voro_bindings_common.hpp:139
bool set
Definition voro_bindings_common.hpp:142
Kokkos::View< real_t *, peclet::core::MemSpace > DView
Definition voro_bindings_common.hpp:39
double real_t
Definition voro_bindings_common.hpp:38