flow 1.3.0
Kokkos cut-cell IBM incompressible Navier-Stokes solver + pnm pore extraction
Loading...
Searching...
No Matches
dem_capture.cpp
Go to the documentation of this file.
1// Rung-3 relocation oracle: evaluate dem's SDF surface over a large deterministic point cloud and
2// dump the RAW BITS. Run before and after the port; the files must be byte-identical. This is a
3// far sharper gate than the pass/fail ctests, which carry tolerances.
4#include <cstdint>
5#include <cstdio>
6#include <Kokkos_Core.hpp>
7#include <vector>
8
9#include "dem_portable.hpp"
10#include "narrowphase.hpp"
11
12using namespace peclet::dem;
13
14int main(int argc, char** argv) {
15 Kokkos::initialize(argc, argv);
16 std::vector<std::uint32_t> bits;
17 {
18 // deterministic point cloud + parameter sweep
19 std::uint32_t st = 0xC0FFEEu;
20 auto u = [&](float lo, float hi) {
21 st = st * 1664525u + 1013904223u;
22 const float t = (float)((st >> 8) & 0xFFFFFFu) / (float)0x1000000u;
23 return lo + (hi - lo) * t;
24 };
25
26 // --- analytic leaves, swept over shapes and points -------------------------------------
27 for (int s = 0; s < 40; ++s) {
28 const F4 par{u(0.2f, 2.0f), u(0.2f, 2.0f), u(0.05f, 0.6f), 0.0f};
29 for (int i = 0; i < 400; ++i) {
30 const F3 p{u(-3, 3), u(-3, 3), u(-3, 3)};
31 const float vals[4] = {sdfSphere(p, par), sdfBox(p, par), sdfHollowCylinder(p, par),
32 sdfEval(p, (i % 4), par)};
33 for (float v : vals) {
34 std::uint32_t b;
35 std::memcpy(&b, &v, 4);
36 bits.push_back(b);
37 }
38 }
39 }
40
41 // --- grid samplers (object + container policies) ----------------------------------------
42 const int NX = 9, NY = 7, NZ = 6;
43 Kokkos::View<float*, CpMem> pool("pool", (std::size_t)NX * NY * NZ);
44 auto hp = Kokkos::create_mirror_view(pool);
45 for (int k = 0; k < NZ; ++k)
46 for (int j = 0; j < NY; ++j)
47 for (int i = 0; i < NX; ++i) {
48 const float x = -1.0f + 0.3f * i, y = -1.0f + 0.3f * j, z = -1.0f + 0.3f * k;
49 hp(i + NX * (j + NY * k)) = Kokkos::sqrt(x * x + y * y + z * z) - 0.55f;
50 }
51 Kokkos::deep_copy(pool, hp);
52
53 ShapeDesc sd{};
54 sd.type = SHAPE_GRID_SDF;
55 sd.grid.nx = NX;
56 sd.grid.ny = NY;
57 sd.grid.nz = NZ;
58 sd.grid.offset = 0;
59 sd.grid.origin = peclet::core::Vec3<float>{-1.0f, -1.0f, -1.0f};
60 sd.grid.invSpacing = peclet::core::Vec3<float>{1.0f / 0.3f, 1.0f / 0.3f, 1.0f / 0.3f};
61 sd.grid.extension = peclet::core::geom::GridExtension::kObject;
62
63 WallSdf w{};
64 w.grid.nx = NX;
65 w.grid.ny = NY;
66 w.grid.nz = NZ;
67 w.grid.offset = 0;
68 w.grid.origin = peclet::core::Vec3<float>{-1.0f, -1.0f, -1.0f};
69 w.grid.invSpacing = peclet::core::Vec3<float>{1.0f / 0.3f, 1.0f / 0.3f, 1.0f / 0.3f};
70 w.grid.extension = peclet::core::geom::GridExtension::kContainer;
71
72 const int NP = 4000;
73 Kokkos::View<float*, CpMem> out("out", 2 * NP);
74 std::vector<F3> pts(NP);
75 for (int i = 0; i < NP; ++i)
76 pts[i] = F3{u(-2.5f, 2.0f), u(-2.5f, 2.0f), u(-2.5f, 2.0f)};
77 Kokkos::View<F3*, CpMem> dp("dp", NP);
78 auto hdp = Kokkos::create_mirror_view(dp);
79 for (int i = 0; i < NP; ++i)
80 hdp(i) = pts[i];
81 Kokkos::deep_copy(dp, hdp);
82
83 Kokkos::parallel_for(
84 "cap", Kokkos::RangePolicy<CpExec>(0, NP), KOKKOS_LAMBDA(int i) {
85 out(2 * i) = sampleGridSdf(dp(i), sd, pool);
86 out(2 * i + 1) = sampleWallSdf(dp(i), w, pool);
87 });
88 Kokkos::fence();
89 auto ho = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out);
90 for (int i = 0; i < 2 * NP; ++i) {
91 std::uint32_t b;
92 float v = ho(i);
93 std::memcpy(&b, &v, 4);
94 bits.push_back(b);
95 }
96
97 // --- sdfEvalShape dispatch (analytic + grid) --------------------------------------------
98 Kokkos::View<ShapeDesc*, CpMem> shp("shp", 1);
99 auto hs = Kokkos::create_mirror_view(shp);
100 hs(0) = sd;
101 Kokkos::deep_copy(shp, hs);
102 Kokkos::View<float*, CpMem> out2("out2", NP);
103 Kokkos::parallel_for(
104 "cap2", Kokkos::RangePolicy<CpExec>(0, NP),
105 KOKKOS_LAMBDA(int i) { out2(i) = sdfEvalShape(dp(i), shp(0), pool); });
106 Kokkos::fence();
107 auto ho2 = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out2);
108 for (int i = 0; i < NP; ++i) {
109 std::uint32_t b;
110 float v = ho2(i);
111 std::memcpy(&b, &v, 4);
112 bits.push_back(b);
113 }
114 }
115 Kokkos::finalize();
116
117 std::FILE* f = std::fopen(argv[1], "wb");
118 std::fwrite(bits.data(), 4, bits.size(), f);
119 std::fclose(f);
120 std::printf("wrote %zu values to %s\n", bits.size(), argv[1]);
121 return 0;
122}
int main()
Definition dbg_scene.cpp:13
static constexpr int NY
static constexpr int NX
static constexpr int NZ