summaryrefslogtreecommitdiff
path: root/modules/core/c++/particle
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2026-07-15 15:39:41 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2026-07-15 15:39:41 +0200
commit44cb41bbe6128f2c7ca92b06e2267d52e3121721 (patch)
tree089220c108f12c65abe880f448085f2705c3606a /modules/core/c++/particle
parent0dcc910d33832e2c5c29a6317467f85accf77aac (diff)
downloadlibs-lbm-44cb41bbe6128f2c7ca92b06e2267d52e3121721.tar.gz
Preping two way
Diffstat (limited to 'modules/core/c++/particle')
-rw-r--r--modules/core/c++/particle/aabb.hpp14
-rw-r--r--modules/core/c++/particle/particle.hpp6
-rw-r--r--modules/core/c++/particle/particle_opa.hpp2
-rw-r--r--modules/core/c++/particle/porosity.hpp12
-rw-r--r--modules/core/c++/particle/schema.hpp4
5 files changed, 21 insertions, 17 deletions
diff --git a/modules/core/c++/particle/aabb.hpp b/modules/core/c++/particle/aabb.hpp
index 18426d5..a838401 100644
--- a/modules/core/c++/particle/aabb.hpp
+++ b/modules/core/c++/particle/aabb.hpp
@@ -10,12 +10,12 @@ class particle_aabb final {
static_assert(saw::always_false<PGroup>, "Not supported");
};
-template<typename T, uint64_t D>
+template<typename T, uint64_t D, uint64_t PC>
class particle_aabb<
- sch::ParticleGroup<T,D,coll::Spheroid<T>>
+ sch::ParticleGroup<T,D,PC,coll::Spheroid<T>>
> final {
public:
- using Schema = sch::ParticleGroup<T,D,coll::Spheroid<T>>;
+ using Schema = sch::ParticleGroup<T,D,PC,coll::Spheroid<T>>;
using AABB = sch::Struct<
sch::Member<sch::FixedArray<sch::UInt64,D>,"a">,
@@ -23,7 +23,11 @@ public:
>;
public:
template<typename Encode>
- static constexpr saw::data<AABB> calculate(const saw::data<Schema,Encode>& p_grp, const saw::data<sch::FixedArray<sch::UInt64,1u>>& i, const saw::data<sch::FixedArray<sch::UInt64,D>>& meta){
+ static constexpr saw::error_or<saw::data<AABB>> calculate(const saw::data<Schema,Encode>& p_grp, const saw::data<sch::FixedArray<sch::UInt64,1u>>& i, const saw::data<sch::FixedArray<sch::UInt64,D>>& meta){
+ static_assert(PC > 0u, "Can't calculate from no particles");
+ if(not (i.at({0u}).get() < PC) ){
+ return saw::make_error<saw::err::critical>("Too large i in particle_aabb");
+ }
saw::data<AABB> aabb;
auto& parts = p_grp.template get<"particles">();
@@ -35,7 +39,7 @@ public:
auto& a = aabb.template get<"a">();
auto& b = aabb.template get<"b">();
- const saw::data<sch::Scalar<T>>& rad_d = p_grp.template get<"collision">().at({0u}).template get<"radius">();
+ const saw::data<sch::Scalar<T>>& rad_d = p_grp.template get<"collision">().at(i).template get<"radius">();
saw::data<sch::Vector<T,D>> lower;
saw::data<sch::Vector<T,D>> upper;
diff --git a/modules/core/c++/particle/particle.hpp b/modules/core/c++/particle/particle.hpp
index 8e75e5a..3c3630a 100644
--- a/modules/core/c++/particle/particle.hpp
+++ b/modules/core/c++/particle/particle.hpp
@@ -13,13 +13,13 @@
namespace kel {
namespace lbm {
-template<typename T, uint64_t D>
-saw::data<sch::ParticleGroup<T,D, coll::Spheroid<T>>> create_spheroid_particle_group(
+template<typename T, uint64_t D,uint64_t PartAmount>
+saw::data<sch::ParticleGroup<T, D, PartAmount, coll::Spheroid<T>>> create_spheroid_particle_group(
saw::data<sch::Scalar<T>> radius_p,
saw::data<sch::Scalar<T>> density_p,
const saw::data<sch::UInt64>& mask_resolution
){
- saw::data<sch::ParticleGroup<T,D,coll::Spheroid<T>>> part;
+ saw::data<sch::ParticleGroup<T,D,PartAmount,coll::Spheroid<T>>> part;
auto& rad_s = part.template get<"collision">().at({0u}).template get<"radius">();
rad_s = radius_p;
diff --git a/modules/core/c++/particle/particle_opa.hpp b/modules/core/c++/particle/particle_opa.hpp
index 30a8ade..ce1ecb7 100644
--- a/modules/core/c++/particle/particle_opa.hpp
+++ b/modules/core/c++/particle/particle_opa.hpp
@@ -41,7 +41,7 @@ public:
// Write out value
auto diff = pos_ind.template cast_to<T>() - pos_;
auto diff_dot = saw::math::dot(diff,diff);
- porous = particle_porosity<T,Descriptor::D,por::ParticleSpheroid<T>>::calculate(diff, rad_, eps_);
+ porous = particle_porosity<T,Descriptor::D,1u,por::ParticleSpheroid<T>>::calculate(diff, rad_, eps_);
}
};
}
diff --git a/modules/core/c++/particle/porosity.hpp b/modules/core/c++/particle/porosity.hpp
index 2f39d2e..353cd58 100644
--- a/modules/core/c++/particle/porosity.hpp
+++ b/modules/core/c++/particle/porosity.hpp
@@ -11,11 +11,11 @@ template<typename T>
struct ParticleSpheroid {};
}
-template<typename T, uint64_t D, typename Coll>
+template<typename T, uint64_t D, uint64_t PC, typename Coll>
class particle_porosity {
public:
- static saw::data<sch::Scalar<T>> calculate(const saw::data<sch::ParticleGroup<T,D,Coll>>& part_group, uint64_t p_i, const saw::data<sch::Vector<T,D>>& lbm_pos){
+ static saw::data<sch::Scalar<T>> calculate(const saw::data<sch::ParticleGroup<T,D,PC,Coll>>& part_group, uint64_t p_i, const saw::data<sch::Vector<T,D>>& lbm_pos){
auto& mask = part_group.template get<"mask">();
auto& particles = part_group.template get<"particles">();
@@ -33,7 +33,7 @@ public:
};
template<typename T, uint64_t D>
-class particle_porosity<T, D, por::ParticleSpheroid<T>> final {
+class particle_porosity<T, D, 1u, por::ParticleSpheroid<T>> final {
public:
static saw::data<sch::Scalar<T>> calculate(const saw::data<sch::Vector<T,D>>& lbm_rel_dist, saw::data<sch::Scalar<T>> rad, saw::data<sch::Scalar<T>> eps){
saw::data<sch::Scalar<T>> por;
@@ -68,10 +68,10 @@ public:
};
-template<typename T, uint64_t D>
-class particle_porosity<T, D, coll::Spheroid<T>> final {
+template<typename T, uint64_t D, uint64_t PC>
+class particle_porosity<T, D, PC, coll::Spheroid<T>> final {
public:
- static saw::data<sch::Scalar<T>> calculate(const saw::data<sch::ParticleGroup<T,D,coll::Spheroid<T> > >& part_group, uint64_t i, const saw::data<sch::Vector<T,D>>& lbm_pos) {
+ static saw::data<sch::Scalar<T>> calculate(const saw::data<sch::ParticleGroup<T,D,PC,coll::Spheroid<T> > >& part_group, uint64_t i, const saw::data<sch::Vector<T,D>>& lbm_pos) {
saw::data<sch::Scalar<T>> por;
auto& parts = part_group.template get<"particles">();
diff --git a/modules/core/c++/particle/schema.hpp b/modules/core/c++/particle/schema.hpp
index 714a16f..221137a 100644
--- a/modules/core/c++/particle/schema.hpp
+++ b/modules/core/c++/particle/schema.hpp
@@ -52,7 +52,7 @@ using Particle = Struct<
// Member<Array<Float64,D>, "mask">,
>;
-template<typename T, uint64_t D, typename CollisionType = coll::Spheroid<T>>
+template<typename T, uint64_t D, uint64_t PartAmount, typename CollisionType = coll::Spheroid<T>>
using ParticleGroup = Struct<
Member<Array<T,D>, "mask">,
Member<FixedArray<typename CollisionType::Schema,1u>, "collision">,
@@ -61,7 +61,7 @@ using ParticleGroup = Struct<
Member<FixedArray<Scalar<T>,1u>, "density">,
Member<FixedArray<Vector<T,D>,1u>, "center_of_mass">,
Member<FixedArray<Scalar<T>,1u>, "total_mass">,
- Member<Array<Particle<T,D>,1u>, "particles">
+ Member<FixedArray<Particle<T,D>,PartAmount>, "particles">
>;
}
}