/* This file is part of the OpenLB library * * Copyright (C) 2016 Thomas Henn * 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_HH #define PARTICLE_3D_HH #include #include #include #include #include #include #include "particle3D.h" namespace olb { template Particle3D::Particle3D() : _pos(3, 0.), _vel(3, 0.), _force(3, 0.), _mas(0), _rad(0), _cuboid(0), _id(0), _active(false), _storeForce(3, 0.) { } template Particle3D::Particle3D(std::vector pos, T mas, T rad, int id) : _pos(pos), _vel(3, 0.), _force(3, 0.), _mas(mas), _rad(rad), _cuboid(0), _id(id), _active(true), _storeForce(3, 0.) { _invMas = 1. / _mas; // RK4 // _positions = std::vector > (4, std::vector (3, T() )); // _velocities = std::vector > (4, std::vector (3, T() )); // _forces = std::vector > (4, std::vector (3, T() )); } template Particle3D::Particle3D(const Particle3D& p) : _pos(p._pos), _vel(p._vel), _force(p._force), _mas(p._mas), _rad(p._rad), _cuboid(p._cuboid), _id(p._id), _active(p._active), _storeForce(p._storeForce) { _invMas = 1. / _mas; // RK4 // _positions = std::vector > (4, std::vector (3, T() )); // _velocities = std::vector > (4, std::vector (3, T() )); // _forces = std::vector > (4, std::vector (3, T() )); } template Particle3D::Particle3D(std::vector pos, std::vector vel, T mas, T rad, int id) : _pos(pos), _vel(vel), _force(12, 0.), _mas(mas), _rad(rad), _cuboid(0), _id(id), _active(true), _storeForce(3, 0.) { _vel.resize(12, 0.); // RK4 // _positions = std::vector > (4, std::vector (3, T() )); // _velocities = std::vector > (4, std::vector (3, T() )); // _forces = std::vector > (4, std::vector (3, T() )); } template inline void Particle3D::addForce(std::vector& force) { for (int i = 0; i < 3; i++) { _force[i] += force[i]; } } // set and get force template inline void Particle3D::setForce(std::vector& force) { _force = force; } template inline void Particle3D::resetForce() { for (int i = 0; i < 3; i++) { _force[i] = 0.; } } // set and get storedForce template inline void Particle3D::setStoreForce(std::vector& storeForce) { for (int i = 0; i < 3; i++) { _storeForce[i] = storeForce[i]; } } template inline void Particle3D::resetStoreForce() { for (int i = 0; i < 3; i++) { _storeForce[i] = T(0); } } template void Particle3D::serialize(T serial[]) { for (int i = 0; i < 3; i++) { serial[i] = _pos[i]; serial[i + 3] = _vel[i]; serial[i + 6] = _force[i]; } serial[9] = _mas; serial[10] = _rad; serial[11] = _cuboid; serial[12] = _active; serial[13] = _id; for (int i = 0; i < 3; i++) { serial[i + 14] = _storeForce[i]; } // for (int i = 0; i < 17; i++) { // cout << "serialize " << i << ": " << serial[i] << " tn: " << typeid(serial[i]).name() << endl; // } } template void Particle3D::unserialize(T* data) { for (int i = 0; i < 3; i++) { _pos[i] = data[i]; _vel[i] = data[i + 3]; _force[i] = data[i + 6]; } _mas = data[9]; _rad = data[10]; _cuboid = int(data[11]); _active = data[12]; _invMas = 1. / _mas; _id = data[13]; for (int i = 0; i < 3; i++) { _storeForce[i] = data[i + 14]; } // for (int i = 0; i < 17; i++) { // cout << "unserialize " << i << ": " << data[i] << " tn: " << typeid(data[i]).name() << endl; // } } template void Particle3D::print() { std::cout << "Pos " << _pos[0] << " " << _pos[1] << " " << _pos[2] << " " << "Vel " << _vel[0] << " " << _vel[1] << " " << _vel[2] << " " << _cuboid << std::endl; } template void Particle3D::printDeep(std::string message) { std::cout << message << " Particle ID " << this->getID() << " rad " << this->getRad() << " mass " << this->getMass() << " invMass " << this->getInvMass() << " force " << this->getForce()[0] << " " << this->getForce()[1] << " " << this->getForce()[2] << " storeForce " << this->getStoreForce()[0] << " " << this->getStoreForce()[1] << " " << this->getStoreForce()[2] << " "; this->print(); } template ElParticle3D::ElParticle3D() : Particle3D(), _charge(1.) { } template ElParticle3D::ElParticle3D(std::vector pos, T mas, T rad, T charge) : Particle3D(pos, mas, rad), _charge(charge) { } template ElParticle3D::ElParticle3D(std::vector pos, std::vector vel, T mas, T rad, T charge) : Particle3D(pos, vel, mas, rad), _charge(charge) { } template ElParticle3D::ElParticle3D(const ElParticle3D& p) : Particle3D(p), _charge(p._charge) { } template void ElParticle3D::serialize(T serial[]) { serial[0] = this->_pos[0]; serial[1] = this->_pos[1]; serial[2] = this->_pos[2]; serial[3] = this->_vel[0]; serial[4] = this->_vel[1]; serial[5] = this->_vel[2]; serial[6] = this->_rad; serial[7] = this->_mas; serial[8] = (double) this->_active; serial[9] = _charge; } template void ElParticle3D::unserialize(T* data) { this->_pos[0] = data[0]; this->_pos[1] = data[1]; this->_pos[2] = data[2]; this->_vel[0] = data[3]; this->_vel[1] = data[4]; this->_vel[2] = data[5]; this->_rad = data[6]; this->_mas = data[7]; this->_active = (bool) data[8]; _charge = data[9]; } template AggParticle3D::AggParticle3D() : Particle3D::Particle3D() { _aggl = false; } template AggParticle3D::AggParticle3D(std::vector pos, T mas, T rad) : Particle3D::Particle3D(pos, mas, rad) { _aggl = false; } template AggParticle3D::AggParticle3D(const Particle3D& p) : Particle3D::Particle3D(p) { _aggl = false; } template AggParticle3D::AggParticle3D(std::vector pos, std::vector vel, T mas, T rad) : Particle3D::Particle3D(pos, vel, mas, rad) { _aggl = false; } template void AggParticle3D::serialize(T serial[]) { for (int i = 0; i < 3; i++) { serial[i] = this->_pos[i]; serial[i + 3] = this->_vel[i]; serial[i + 6] = this->_force[i]; } serial[9] = this->_mas; serial[10] = this->_rad; serial[11] = this->_cuboid; serial[12] = (double) this->_active; serial[13] = (double) _aggl; } template void AggParticle3D::unserialize(T* data) { for (int i = 0; i < 3; i++) { this->_pos[i] = data[i]; this->_vel[i] = data[i + 3]; this->_force[i] = data[i + 6]; } this->_mas = data[9]; this->_rad = data[10]; this->_cuboid = int(data[11]); this->_active = (bool) data[12]; _aggl = (bool) data[13]; } template RotatingParticle3D::RotatingParticle3D() : Particle3D::Particle3D(), _aVel(3, T()), _torque(3, T()) { } template RotatingParticle3D::RotatingParticle3D(std::vector pos, T mas, T rad) : Particle3D::Particle3D(pos, mas, rad), _aVel(3, T()), _torque(3, T()) { } template RotatingParticle3D::RotatingParticle3D(const RotatingParticle3D& p) : Particle3D::Particle3D(p), _aVel(p.getAVel()), _torque(p._torque) { } template RotatingParticle3D::RotatingParticle3D(std::vector pos, std::vector vel, T mas, T rad) : Particle3D::Particle3D(pos, vel, mas, rad), _aVel(3, T()), _torque(3, T()) { } template void RotatingParticle3D::serialize(T serial[]) { for (int i = 0; i < 3; i++) { serial[i] = this->_pos[i]; serial[i + 3] = this->_vel[i]; serial[i + 6] = this->_force[i]; } serial[9] = this->_mas; serial[10] = this->_rad; serial[11] = this->_cuboid; serial[12] = (double) this->_active; serial[13] = (double) _aVel[0]; serial[14] = (double) _aVel[1]; serial[15] = (double) _aVel[2]; serial[16] = (double) _torque[0]; serial[17] = (double) _torque[1]; serial[18] = (double) _torque[2]; } template void RotatingParticle3D::unserialize(T* data) { for (int i = 0; i < 3; i++) { this->_pos[i] = data[i]; this->_vel[i] = data[i + 3]; this->_force[i] = data[i + 6]; } this->_mas = data[9]; this->_rad = data[10]; this->_cuboid = int(data[11]); this->_active = (bool) data[12]; _aVel[0] = (bool) data[13]; _aVel[1] = (bool) data[14]; _aVel[2] = (bool) data[15]; _torque[0] = (bool) data[16]; _torque[1] = (bool) data[17]; _torque[2] = (bool) data[18]; } template MagneticParticle3D::MagneticParticle3D() : Particle3D::Particle3D(), _dMoment(3, T()), _aVel(3, T()), _torque(3, T()), _magnetisation(T()) { } template MagneticParticle3D::MagneticParticle3D(const MagneticParticle3D& p) : Particle3D::Particle3D(p), _dMoment(p._dMoment), _aVel(p._aVel), _torque(p._torque), _magnetisation(p._magnetisation), _sActivity(p._sActivity) { } template MagneticParticle3D::MagneticParticle3D(std::vector pos, std::vector vel, T mas, T rad, int id) : Particle3D::Particle3D(pos, vel, mas, rad), _dMoment(3, T()), _aVel(3, T()), _torque(3, T()), _magnetisation(T()) { } template MagneticParticle3D::MagneticParticle3D(std::vector pos, std::vector vel, T mas, T rad, int id, std::vector dMoment, std::vector aVel, std::vector torque, T magnetisation) : Particle3D::Particle3D(pos, vel, mas, rad, id), _dMoment(dMoment), _aVel(aVel), _torque(torque), _magnetisation(magnetisation) { } template MagneticParticle3D::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) : Particle3D::Particle3D(pos, vel, mas, rad, id), _dMoment(dMoment), _aVel(aVel), _torque(torque), _magnetisation(magnetisation), _sActivity(sActivity) { } template inline void MagneticParticle3D::resetTorque() { for (int i = 0; i < 3; i++) { _torque[i] = 0.; } } template inline void MagneticParticle3D::setMoment(std::vector moment) { _dMoment = moment; // std::cout<< "Setting moment: "<< _dMoment[0] << " " << _dMoment[1] << " " <<_dMoment[2] << std::endl; } template inline void MagneticParticle3D::setAVel(std::vector aVel) { _aVel = aVel; } template inline void MagneticParticle3D::setTorque(std::vector torque) { _torque = torque; //std::cout<< "Setting torque: "<< _torque[0] << " " << _torque[1] << " " <<_torque[2] << std::endl; } template inline void MagneticParticle3D::setMagnetisation(T magnetisation) { _magnetisation = magnetisation; //std::cout<< "Setting magnetisation: "<< _magnetisation << std::endl; } template inline void MagneticParticle3D::setSActivity(int sActivity) { _sActivity = sActivity; } template inline void MagneticParticle3D::setAggloItr(typename std::deque*>>::iterator aggloItr) { _aggloItr = aggloItr; } template void MagneticParticle3D::serialize(T serial[]) { for (int i = 0; i < 3; i++) { serial[i] = this->_pos[i]; serial[i + 3] = this->_vel[i]; serial[i + 6] = this->_force[i]; } serial[9] = this->_mas; serial[10] = this->_rad; serial[11] = (double) this->_cuboid; serial[12] = (double) this->_active; serial[13] = (double) this->_id; for (int i = 0; i < 3; i++) { serial[i + 14] = this->_storeForce[i]; serial[i + 17] = _dMoment[i]; serial[i + 20] = _aVel[i]; serial[i + 23] = _torque[i]; } serial[26] = _magnetisation; serial[27] = (double) _sActivity; } template void MagneticParticle3D::unserialize(T* data) { for (int i = 0; i < 3; i++) { this->_pos[i] = data[i]; this->_vel[i] = data[i + 3]; this->_force[i] = data[i + 6]; } this->_mas = data[9]; this->_rad = data[10]; this->_cuboid = (int) data[11]; this->_active = (bool) data[12]; this->_id = (int) data[13]; for (int i = 0; i < 3; i++) { this->_storeForce[i] = data[i + 14]; _dMoment[i] = data[i + 17]; _aVel[i] = data[i + 20]; _torque[i] = data[i + 23]; } _magnetisation = data[26]; _sActivity = (int) data[27]; } } #endif /* PARTICLE_3D_HH */