15int main(
int argc,
char** argv) {
16 Kokkos::initialize(argc, argv);
17 std::vector<std::uint32_t> bits;
20 std::uint32_t st = 0xBEEF01u;
21 auto u = [&](
double lo,
double hi) {
22 st = st * 1664525u + 1013904223u;
23 return lo + (hi - lo) * ((
double)((st >> 8) & 0xFFFFFFu) / (double)0x1000000u);
25 std::vector<double> px(NP), py(NP), pz(NP);
26 for (
int i = 0; i < NP; ++i) {
31 Kokkos::View<double*> X(
"x", NP), Y(
"y", NP), Z(
"z", NP);
32 auto hx = Kokkos::create_mirror_view(X), hy = Kokkos::create_mirror_view(Y),
33 hz = Kokkos::create_mirror_view(Z);
34 for (
int i = 0; i < NP; ++i) {
39 Kokkos::deep_copy(X, hx);
40 Kokkos::deep_copy(Y, hy);
41 Kokkos::deep_copy(Z, hz);
45 Kokkos::View<double*> out(
"out", (std::size_t)NP * NS);
47 "cap", NP, KOKKOS_LAMBDA(
int i) {
48 const double x = X(i), y = Y(i), z = Z(i);
50 SdfSphere<double> a{0.1, -0.2, 0.3, 1.25};
51 SdfSphere<double> a2{0, 0, 0, 0.5};
52 out(i * NS + s++) = a.eval(x, y, z);
53 out(i * NS + s++) = a2.eval(x, y, z);
54 SdfBox<double> b{0.2, 0.1, -0.3, 0.8, 1.1, 0.5};
55 SdfBox<double> b2{0, 0, 0, 0.4, 0.4, 0.4};
56 out(i * NS + s++) = b.eval(x, y, z);
57 out(i * NS + s++) = b2.eval(x, y, z);
58 for (
int ax = 0; ax < 3; ++ax) {
59 SdfHollowCylinder<double> c{0.05, -0.1, 0.15, 1.3, 0.7, 1.6, ax};
60 out(i * NS + s++) = c.eval(x, y, z);
62 SdfHollowCylinder<double> c2{0, 0, 0, 1.0, 0.0, 2.0, 2};
63 out(i * NS + s++) = c2.eval(x, y, z);
66 sdfGradient<double>(a, x, y, z, g);
67 out(i * NS + s++) = g[0];
68 out(i * NS + s++) = g[1];
69 out(i * NS + s++) = g[2];
70 out(i * NS + s++) = a.gradH() + b.gradH() + c2.gradH();
73 auto ho = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out);
74 for (std::size_t i = 0; i < ho.extent(0); ++i) {
77 std::memcpy(&b64, &v, 8);
78 bits.push_back((std::uint32_t)(b64 & 0xFFFFFFFFu));
79 bits.push_back((std::uint32_t)(b64 >> 32));
84 Kokkos::View<double*> cen(
"cen", 3 * M), rad(
"rad", M);
85 auto hc = Kokkos::create_mirror_view(cen), hr = Kokkos::create_mirror_view(rad);
86 for (
int i = 0; i < M; ++i) {
88 hc(3 * i + 1) = u(-1, 1);
89 hc(3 * i + 2) = u(-1, 1);
92 Kokkos::deep_copy(cen, hc);
93 Kokkos::deep_copy(rad, hr);
95 Kokkos::View<float*> gv(
"gv", (std::size_t)
G *
G *
G);
96 auto hg = Kokkos::create_mirror_view(gv);
97 for (
int k = 0; k <
G; ++k)
98 for (
int j = 0; j <
G; ++j)
99 for (
int i2 = 0; i2 <
G; ++i2) {
100 const double xx = -1 + 0.3 * i2, yy = -1 + 0.3 * j, zz = -1 + 0.3 * k;
101 hg(i2 +
G * (j +
G * k)) = (float)(std::sqrt(xx * xx + yy * yy + zz * zz) - 0.6);
103 Kokkos::deep_copy(gv, hg);
104 Kokkos::View<double*> out2(
"out2", (std::size_t)NP * 2);
105 Kokkos::parallel_for(
106 "cap2", NP, KOKKOS_LAMBDA(
int i) {
107 SdfSpheres<double> sp{cen, rad, M, 2.0};
109 SdfGrid<double>::fromSpacing(Kokkos::View<const float*, peclet::core::MemSpace>(gv),
110 G,
G,
G, -1.0, -1.0, -1.0, 0.3, 0.3, 0.3);
111 out2(2 * i) = sp.eval(X(i), Y(i), Z(i));
112 out2(2 * i + 1) = gr.eval(X(i), Y(i), Z(i));
115 auto ho2 = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, out2);
116 for (std::size_t i = 0; i < ho2.extent(0); ++i) {
119 std::memcpy(&b64, &v, 8);
120 bits.push_back((std::uint32_t)(b64 & 0xFFFFFFFFu));
121 bits.push_back((std::uint32_t)(b64 >> 32));
125 std::FILE* f = std::fopen(argv[1],
"wb");
126 std::fwrite(bits.data(), 4, bits.size(), f);
128 std::printf(
"wrote %zu words\n", bits.size());