5 #ifdef SPH_USE_CHAISCRIPT
7 Chai::Particles::Particles(
const Size particleCnt) {
10 storage = alignedNew<Storage>();
14 this->resize(particleCnt);
17 Chai::Particles::~Particles() {
23 void Chai::Particles::bindToStorage(
Storage& input) {
29 this->resize(storage->getParticleCnt());
35 std::copy(r.
begin(), r.
end(), positions.begin());
36 std::copy(v.
begin(), v.
end(), velocities.begin());
37 std::copy(dv.
begin(), dv.
end(), accelerations.begin());
38 for (
Size i = 0; i < r.
size(); ++i) {
45 std::copy(m.
begin(), m.
end(), masses.begin());
50 std::copy(u.
begin(), u.
end(), energies.begin());
55 std::copy(rho.
begin(), rho.
end(), densities.begin());
59 const Storage& Chai::Particles::store()
const {
60 const Size N = positions.size();
63 for (
Size i = 0; i <
N; ++i) {
67 dv[i] = accelerations[i];
70 rho[i] = densities[i];
81 Size Chai::Particles::getParticleCnt()
const {
82 return storage->getParticleCnt();
85 void Chai::Particles::resize(
const Size particleCnt) {
86 positions.resize(particleCnt);
87 velocities.resize(particleCnt);
88 accelerations.resize(particleCnt);
89 masses.resize(particleCnt);
90 energies.resize(particleCnt);
91 densities.resize(particleCnt);
92 radii.resize(particleCnt);
95 std::vector<Float>& Chai::Particles::getMasses() {
100 std::vector<Float>& Chai::Particles::getEnergies() {
105 std::vector<Float>& Chai::Particles::getDensities() {
110 std::vector<Float>& Chai::Particles::getRadii() {
114 std::vector<Chai::Vec3>& Chai::Particles::getPositions() {
118 std::vector<Chai::Vec3>& Chai::Particles::getVelocities() {
122 std::vector<Chai::Vec3>& Chai::Particles::getAccelerations() {
123 return accelerations;
128 for (
Size i = 0; i < positions.size(); ++i) {
134 Float Chai::Particles::getTotalMass()
const {
135 return std::accumulate(masses.begin(), masses.end(), 0._f);
141 for (
Size i = 0; i < positions.size(); ++i) {
142 r_com += positions[i] * masses[i];
148 Chai::Vec3 Chai::Particles::getTotalMomentum()
const {
150 for (
Size i = 0; i < velocities.size(); ++i) {
151 p += velocities[i] * masses[i];
156 Chai::Vec3 Chai::Particles::getTotalAngularMomentum()
const {
159 for (
Size i = 0; i < velocities.size(); ++i) {
160 L +=
cross(positions[i] - r0, velocities[i]) * masses[i];
167 for (
Size i = 0; i < r.
size(); ++i) {
169 v[i] = velocities[i];
174 void Chai::Particles::merge(Particles& other) {
175 storage->merge(std::move(*other.storage));
177 positions.insert(positions.end(), other.positions.begin(), other.positions.end());
178 velocities.insert(velocities.end(), other.velocities.begin(), other.velocities.end());
179 masses.insert(masses.end(), other.masses.begin(), other.masses.end());
180 energies.insert(energies.end(), other.energies.begin(), other.energies.end());
181 densities.insert(densities.end(), other.densities.begin(), other.densities.end());
182 radii.insert(radii.end(), other.radii.begin(), other.radii.end());
185 void Chai::registerBindings(chaiscript::ChaiScript& chai) {
187 chai.add(chaiscript::fun(&Sph::sqr<double>),
"sqr");
188 chai.add(chaiscript::fun(&Sph::sqrt<double>),
"sqrt");
189 chai.add(chaiscript::fun(&Sph::cos<double>),
"cos");
190 chai.add(chaiscript::fun(&Sph::sin<double>),
"sin");
191 chai.add(chaiscript::fun(&Sph::lerp<double, double>),
"lerp");
192 chai.add(chaiscript::fun(&Sph::abs<double>),
"abs");
193 chai.add(chaiscript::fun(&Sph::pow<double>),
"pow");
196 chai.add(chaiscript::user_type<Vec3>(),
"Vec3");
197 chai.add(chaiscript::constructor<Vec3()>(),
"Vec3");
198 chai.add(chaiscript::constructor<Vec3(
const Vec3&)>(),
"Vec3");
199 chai.add(chaiscript::constructor<Vec3(
Float,
Float,
Float)>(),
"Vec3");
200 chai.add(chaiscript::fun(&Vec3::x),
"x");
201 chai.add(chaiscript::fun(&Vec3::y),
"y");
202 chai.add(chaiscript::fun(&Vec3::z),
"z");
203 chai.add(chaiscript::fun(&Vec3::operator+),
"+");
204 chai.add(chaiscript::fun(&Vec3::operator-),
"-");
205 chai.add(chaiscript::fun(&Vec3::operator*),
"*");
206 chai.add(chaiscript::fun(&Vec3::operator/),
"/");
207 chai.add(chaiscript::fun(&Vec3::operator=),
"=");
208 chai.add(chaiscript::fun(&Vec3::operator+=),
"+=");
209 chai.add(chaiscript::fun(&dot),
"dotProd");
210 chai.add(chaiscript::fun(&
cross),
"crossProd");
211 chai.add(chaiscript::fun(&length),
"length");
212 chai.add(chaiscript::fun(&
max),
"max");
213 chai.add(chaiscript::fun(&
min),
"min");
214 chai.add(chaiscript::fun(&normalized),
"normalized");
217 chai.add(chaiscript::user_type<Box3>(),
"Box3");
218 chai.add(chaiscript::constructor<Box3()>(),
"Box3");
219 chai.add(chaiscript::constructor<Box3(
const Box3&)>(),
"Box3");
220 chai.add(chaiscript::constructor<Box3(
const Vec3&,
const Vec3&)>(),
"Box3");
221 chai.add(chaiscript::fun(&Box3::operator=),
"=");
222 chai.add(chaiscript::fun(&Box3::size),
"size");
223 chai.add(chaiscript::fun(&Box3::extend),
"extend");
226 chai.add(chaiscript::user_type<Particles>(),
"Particles");
227 chai.add(chaiscript::constructor<Particles(
Size)>(),
"Particles");
228 chai.add(chaiscript::fun(&Particles::getParticleCnt),
"getParticleCnt");
229 chai.add(chaiscript::fun(&Particles::getMasses),
"getMasses");
230 chai.add(chaiscript::fun(&Particles::getEnergies),
"getEnergies");
231 chai.add(chaiscript::fun(&Particles::getDensities),
"getDensities");
232 chai.add(chaiscript::fun(&Particles::getPositions),
"getPositions");
233 chai.add(chaiscript::fun(&Particles::getVelocities),
"getVelocities");
234 chai.add(chaiscript::fun(&Particles::getAccelerations),
"getAccelerations");
235 chai.add(chaiscript::fun(&Particles::getRadii),
"getRadii");
236 chai.add(chaiscript::fun(&Particles::merge),
"merge");
239 chai.add(chaiscript::fun(&Particles::getTotalMass),
"getTotalMass");
240 chai.add(chaiscript::fun(&Particles::getTotalMomentum),
"getTotalMomentum");
241 chai.add(chaiscript::fun(&Particles::getTotalAngularMomentum),
"getTotalAngularMomentum");
245 chai.add(chaiscript::bootstrap::standard_library::vector_type<std::vector<Float>>(
"VectorFloat"));
246 chai.add(chaiscript::bootstrap::standard_library::vector_type<std::vector<Vec3>>(
"VectorVec3"));
249 chai.add_global_const(chaiscript::const_var(
DEG_TO_RAD),
"DEG_TO_RAD");
250 chai.add_global_const(chaiscript::const_var(
RAD_TO_DEG),
"RAD_TO_DEG");
INLINE void alignedDelete(T *ptr)
Deletes an object previously allocated using alignedNew.
uint32_t Size
Integral type used to index arrays (by default).
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
constexpr INLINE T max(const T &f1, const T &f2)
NAMESPACE_SPH_BEGIN constexpr INLINE T min(const T &f1, const T &f2)
Minimum & Maximum value.
constexpr Float DEG_TO_RAD
constexpr Float RAD_TO_DEG
#define NAMESPACE_SPH_END
@ POSITION
Positions (velocities, accelerations) of particles, always a vector quantity,.
@ ENERGY
Specific internal energy, always a scalar quantity.
@ DENSITY
Density, always a scalar quantity.
@ MASS
Paricles masses, always a scalar quantity.
@ SECOND
Quantity with 1st and 2nd derivative.
@ FIRST
Quantity with 1st derivative.
@ ZERO
Quantity without derivatives, or "zero order" of quantity.
Utility functions and classes exposed to the embedded scripting language.
StaticArray< T0 &, sizeof...(TArgs)+1 > tie(T0 &t0, TArgs &... rest)
Creates a static array from a list of l-value references.
Box getBoundingBox(const Storage &storage, const Float radius)
Convenience function to get the bounding box of all particles.
INLINE BasicVector< float > cross(const BasicVector< float > &v1, const BasicVector< float > &v2)
Cross product between two vectors.
BasicVector< Float > Vector
Object providing safe access to continuous memory of data.
INLINE TCounter size() const
INLINE Iterator< StorageType > begin()
INLINE Iterator< StorageType > end()
Generic dynamically allocated resizable storage.
INLINE void extend(const Vector &v)
Enlarges the box to contain the vector.
Container storing all quantities used within the simulations.
constexpr Float gravity
Gravitational constant (CODATA 2014)
constexpr Float M_earth
Earth mass.
Vector getAngularFrequency(ArrayView< const Float > m, ArrayView< const Vector > r, ArrayView< const Vector > v, const Vector &r0, const Vector &v0, ArrayView< const Size > idxs=nullptr)
Computes the immediate vector of angular frequency of a rigid body.
Vector getCenterOfMass(ArrayView< const Float > m, ArrayView< const Vector > r, ArrayView< const Size > idxs=nullptr)
Computes the center of mass.