diff options
Diffstat (limited to 'lib/core/c++/particle/particle.hpp')
| -rw-r--r-- | lib/core/c++/particle/particle.hpp | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/lib/core/c++/particle/particle.hpp b/lib/core/c++/particle/particle.hpp index 938131b..fec2eca 100644 --- a/lib/core/c++/particle/particle.hpp +++ b/lib/core/c++/particle/particle.hpp @@ -51,26 +51,33 @@ using Particle = Struct< // Member<Array<Float64,D>, "mask">, >; -template<typename T, uint64_t D, typename CollisionType = ParticleCollisionSpheroid<T,2.0f>> +template<typename T, uint64_t D, typename CollisionType = ParticleCollisionSpheroid<T>> using ParticleGroup = Struct< Member<Array<T,D>, "mask">, + Member<FixedArray<Scalar<T>,1u>, "mask_step">, Member<FixedArray<Scalar<T>,1u>, "density">, - Member<Vector<T,D>, "center_of_mass">, - Member<Scalar<T>, "total_mass">, - Member<Array<Particle<T,D>>, "particles"> + Member<FixedArray<Vector<T,D>,1u>, "center_of_mass">, + Member<FixedArray<Scalar<T>,1u>, "total_mass">, + Member<Array<Particle<T,D>,1u>, "particles"> >; } + + template<typename T, uint64_t D, typename saw::native_data_type<T>::type radius> saw::data<sch::ParticleGroup<T,D, sch::ParticleCollisionSpheroid<T,radius>>> create_spheroid_particle_group( saw::data<sch::Scalar<T>> density_p, const saw::data<sch::UInt64>& mask_resolution ){ - saw::data<sch::ParticleGroup<T,D,sch::ParticleCollisionSpheroid<T,2.0f>>> part; + saw::data<sch::ParticleGroup<T,D,sch::ParticleCollisionSpheroid<T,radius>>> part; auto& mask = part.template get<"mask">(); auto& density = part.template get<"density">().at({{0u}}); + auto& total_mass = part.template get<"total_mass">().at({{0u}}); + // Paranoia + total_mass.at({}) = {}; + static_assert(D >= 1u and D <= 3u, "Dimensions only supported for Dim 1,2 & 3."); density = density_p; @@ -78,14 +85,16 @@ saw::data<sch::ParticleGroup<T,D, sch::ParticleCollisionSpheroid<T,radius>>> cre for(uint64_t i = 0u; i < D; ++i){ mask_dims.at({i}) = mask_resolution; } - saw::data<sch::Scalar<T>> mask_step; saw::data<T> rad_d{radius}; saw::data<T> dia_d = rad_d * 2; - mask_step.at({}) = dia_d / mask_resolution.template cast_to<T>(); mask = {mask_dims}; - auto& com = part.template get<"center_of_mass">(); + auto& mask_step = part.template get<"mask_step">().at({{0u}}); + mask_step.at({}) = dia_d / mask_resolution.template cast_to<T>(); + + auto& com = part.template get<"center_of_mass">().at({{0u}}); + // Paranoia for(uint64_t i = 0u; i < D; ++i){ com.at({{i}}) = {}; } @@ -97,14 +106,27 @@ saw::data<sch::ParticleGroup<T,D, sch::ParticleCollisionSpheroid<T,radius>>> cre saw::data<sch::Vector<T,D>> center; for(uint64_t i = 0u; i < D; ++i){ - com.at({{i}}) = ; + center.at({{i}}).set(radius); } iterator<D>::apply([&](const auto& index){ ++ele_ctr; + saw::data<sch::Vector<T,D>> offset_index = saw::math::vectorize_data(index).template cast_to<T>() - center; + + auto& dpi = mask.at(index); + + for(uint64_t i = 0u; i < D; ++i){ + com.at({{i}}) = com.at({{i}}) + index.at({i}).template cast_to<T>() * dpi; + } + + total_mass.at({}) = total_mass.at({}) + dpi; + },{},mask_dims); + for(uint64_t i = 0u; i < D; ++i){ + com.at({{i}}) = com.at({{i}}) / total_mass.at({}); + } return part; } |
