/* This file is part of the OpenLB library * * Copyright (C) 2016 Thomas Henn, Mathias J. Krause * E-mail contact: info@openlb.net * The most recent release of OpenLB can be downloaded at * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef PARTICLE_3D_H #define PARTICLE_3D_H #include #include #include #include #include #include namespace olb { template class Particle3D { public: Particle3D(); Particle3D(std::vector pos, T mas = 1., T rad = 1., int id = 0); Particle3D(std::vector pos, std::vector vel, T mas = 1., T rad = 1., int id = 0); Particle3D(const Particle3D& p); inline void setPos(std::vector pos) { _pos = pos; } inline void setStoredPos(std::vector pos) { _storePos = pos; } inline std::vector& getStoredPos() { return _storePos; } inline std::vector& getPos() { return _pos; } inline const std::vector& getPos() const { return _pos; } inline void setVel(std::vector vel) { _vel = vel; } inline void setStoredVel(std::vector vel) { _storeVel = vel; } inline std::vector& getStoredVel() { return _storeVel; } inline int getID() { return _id; } inline void setID(int id) { _id = id; } inline std::vector& getVel() { return _vel; } inline const std::vector& getVel() const { return _vel; } inline void addForce(std::vector& frc); inline void setForce(std::vector& frc); inline void resetForce(); inline std::vector& getForce() { return _force; } inline const std::vector& getForce() const { return _force; } inline void setStoreForce(std::vector& storeForce); inline void resetStoreForce(); inline std::vector& getStoreForce() { return _storeForce; } inline const std::vector& getStoreForce() const { return _storeForce; } // RK4 // inline void setPos(std::vector pos, int i) { // _positions[i] = pos; // } // inline std::vector& getPos(int i) { // return _positions[i]; // } // inline const std::vector& getPos(int i) const { // return _positions[i]; // } // inline void setVel(std::vector vel, int i) { // _velocities[i] = vel; // } // inline std::vector& getVel(int i) { // return _velocities[i]; // } // inline const std::vector& getVel(int i) const { // return _velocities[i]; // } // inline void setForce(std::vector force, int i) { // _forces[i] = force; // } // inline std::vector& getForce(int i) { // return _forces[i]; // } // inline const std::vector& getForce(int i) const { // return _forces[i]; // } // write particle properties into serial void serialize(T serial[]); // write data into particle properties void unserialize(T*); void print(); void printDeep(std::string message); inline const T& getMass() { return _mas; } inline const T& getInvMass() { return _invMas; } inline const T& getMass() const { return _mas; } inline void setMass(T m) { _mas = m; _invMas = 1. / _mas; } inline const T& getRad() { return _rad; } inline const T& getRad() const { return _rad; } inline void setRad(T r) { _rad = r; } inline const int& getCuboid() { return _cuboid; } inline void setCuboid(int c) { _cuboid = c; } inline const bool& getActive() { return _active; } inline const bool& getActive() const { return _active; } inline void setActive(bool act) { _active = act; if (!act) { _vel[0] = 0; _vel[1] = 0; _vel[2] = 0; } } // static const int serialPartSize = 14; // pos, vel, force, mas, rad, cuboid, id, active static const int serialPartSize = 17; // pos, vel, force, mas, rad, cuboid, id, active, storeForce // static const int serialPartSize = 23; // pos, vel, force, mas, rad, cuboid, id, active, storeForce, storePos, storeVel std::vector > _verletList; protected: std::vector _pos; std::vector _vel; std::vector _force; T _invMas; T _mas; T _rad; ///globIC int _cuboid; int _id; bool _active; std::vector _storePos; std::vector _storeVel; std::vector _storeForce; // RK4 // std::vector > _positions; // std::vector > _velocities; // std::vector > _forces; }; /* * Electric Particles */ template class ElParticle3D: public Particle3D { public: ElParticle3D(); ElParticle3D(std::vector pos, T mas = 1., T rad = 1., T charge = 1.); ElParticle3D(std::vector pos, std::vector vel, T mas = 1., T rad = 1., T charge = 1.); ElParticle3D(const ElParticle3D& p); virtual ~ElParticle3D() { } ; virtual void serialize(T serial[]); virtual void unserialize(T*); static const int serialPartSize = 10; T _charge; }; /* * Particles for Agglomeration */ template class AggParticle3D: public Particle3D { public: AggParticle3D(); AggParticle3D(std::vector pos, T mas = 1., T rad = 1.); AggParticle3D(std::vector pos, std::vector vel, T mas = 1., T rad = 1.); AggParticle3D(const Particle3D& p); inline void setMass(T mas) { this->_mas = mas; } inline void setRad(T rad) { this->_rad = rad; } inline const bool& getAggl() { return _aggl; } inline const bool& getAggl() const { return _aggl; } inline void setAggl(bool aggl) { _aggl = aggl; if (aggl) { this->setActive(false); } } static const int serialPartSize = 14; void serialize(T serial[]); void unserialize(T*); private: bool _aggl; }; /* * Rotating Particles */ template class RotatingParticle3D: public Particle3D { public: RotatingParticle3D(); RotatingParticle3D(std::vector pos, T mas = 1., T rad = 1.); RotatingParticle3D(std::vector pos, std::vector vel, T mas = 1., T rad = 1.); RotatingParticle3D(const RotatingParticle3D& p); static const int serialPartSize = 19; void serialize(T serial[]); void unserialize(T*); inline std::vector& getAVel() { return _aVel; } inline const std::vector& getAVel() const { return _aVel; } inline std::vector& getTorque() { return _torque; } inline const std::vector& getTorque() const { return _torque; } private: std::vector _aVel; std::vector _torque; }; // NEW /* * Particles for magnetic force */ template class MagneticParticle3D: public Particle3D { private: std::vector _dMoment; std::vector _aVel; std::vector _torque; T _magnetisation; // _sActivity values range from 1 to 3 // Gives information about the poisiton of the particle in the simulation area // One collision model: // 1: Particle is not deposited // 2: Not in use // 3: Particle is deposited on mag. wire. // Multiple collision models: // 1: Particle is in sufficiently large distance to the inhom. mag. field of the wire // Particle collsions are managed by a collision model function // 2: Particle is within the inhom. mag. field of the wire // Particle collsions are managed by a mechanic contact force // The sActivity change (1 --> 2) is done in explicitEuler() // 3: Particle is deposited on mag. wire. // Particle collsions are managed by a mechanic contact force int _sActivity; // Assigns an agglomerate to the particle typename std::deque*>>::iterator _aggloItr; // Assigns the particle position in an Agglomerate to a Particle // typename std::list*>::iterator _aggloItrPos; public: MagneticParticle3D(); MagneticParticle3D(std::vector pos, T mas = 1., T rad = 1., int id = 0); MagneticParticle3D(std::vector pos, std::vector vel, T mas = 1., T rad = 1., int id = 0); MagneticParticle3D(const MagneticParticle3D& p); MagneticParticle3D(std::vector pos, std::vector vel, T mas, T rad, int id, std::vector dMoment, std::vector aVel, std::vector torque, T magnetisation); MagneticParticle3D(std::vector pos, std::vector vel, T mas, T rad, int id, std::vector dMoment, std::vector aVel, std::vector torque, T magnetisation, int sActivity); static const int serialPartSize = 28; void serialize(T serial[]); void unserialize(T*); // Set torque zero inline void resetTorque(); // Set and get orientation of magnetic dipolemoment inline void setMoment(std::vector moment); inline std::vector& getMoment() { return _dMoment; } inline const std::vector& getMoment() const { return _dMoment; } // Set and get angular velocity inline void setAVel(std::vector aVel); inline std::vector& getAVel() { return _aVel; } inline const std::vector& getAVel() const { return _aVel; } // Set and get torque inline void setTorque(std::vector torque); inline std::vector& getTorque() { return _torque; } inline const std::vector& getTorque() const { return _torque; } // Set and get magnetisation inline void setMagnetisation(T magnetisation); inline T& getMagnetisation() { return _magnetisation; } inline const T& getMagnetisation() const { return _magnetisation; } // Set and get sActivity inline void setSActivity(int sActivity); inline int& getSActivity() { return _sActivity; } // Set and get aggloItr inline void setAggloItr(typename std::deque*>>::iterator aggloItr); inline typename std::deque*>>::iterator& getAggloItr() { return _aggloItr; } }; } #endif /* PARTICLE_3D_H */