From 879cbf326e7640cb339111128c607b18e81fb29f Mon Sep 17 00:00:00 2001 From: Christoph Niethammer Date: Wed, 20 Mar 2024 20:52:09 +0100 Subject: [PATCH 1/5] Change default initialization for Quaternions to 0 + 0i + 0j + 0k The current initialization is neither the identity quaternion 1 + 0i + 0j + 0k (Q(w = 1, x = 0, y = 0, z = 0)) nor represents a pure rotation as it is not normalized. Therefore revert changes made earlier returning to Q(0,0,0,0). Note: Initialisation to Q(0,0,0,0) is beneficial for performance reasons to Q(1,0,0,0). Signed-off-by: Christoph Niethammer --- src/molecules/Quaternion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/molecules/Quaternion.h b/src/molecules/Quaternion.h index c537c3968a..cfa53d12b9 100644 --- a/src/molecules/Quaternion.h +++ b/src/molecules/Quaternion.h @@ -9,7 +9,7 @@ */ class Quaternion { public: - Quaternion(double qw = 1., double qx = 1., double qy = 0., double qz = 0.) + Quaternion(double qw = 0., double qx = 0., double qy = 0., double qz = 0.) : m_qw(qw), m_qx(qx), m_qy(qy), m_qz(qz) { } From 32d6e831f55e22e98d38a8a8162cb6aefa35e362 Mon Sep 17 00:00:00 2001 From: Christoph Niethammer Date: Wed, 20 Mar 2024 20:56:28 +0100 Subject: [PATCH 2/5] Align names of parameters in Molecule constructors with Quaternion parameters Signed-off-by: Christoph Niethammer --- src/molecules/AutoPasSimpleMolecule.cpp | 4 ++-- src/molecules/AutoPasSimpleMolecule.h | 4 ++-- src/molecules/FullMolecule.cpp | 4 ++-- src/molecules/FullMolecule.h | 2 +- src/molecules/MoleculeRMM.h | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/molecules/AutoPasSimpleMolecule.cpp b/src/molecules/AutoPasSimpleMolecule.cpp index dc1cf66198..3db373520b 100644 --- a/src/molecules/AutoPasSimpleMolecule.cpp +++ b/src/molecules/AutoPasSimpleMolecule.cpp @@ -12,8 +12,8 @@ Component* AutoPasSimpleMolecule::_component = nullptr; Quaternion AutoPasSimpleMolecule::_quaternion = Quaternion(1.0, 0.0, 0.0, 0.0); AutoPasSimpleMolecule::AutoPasSimpleMolecule(unsigned long id, Component* component, double rx, double ry, double rz, - double vx, double vy, double vz, double q0, double q1, double q2, - double q3, double Dx, double Dy, double Dz) + double vx, double vy, double vz, double qw, double qx, double qy, + double qz, double Dx, double Dy, double Dz) : autopas::ParticleFP64({rx, ry, rz}, {vx, vy, vz}, id) { if (_component == nullptr) { _component = component; diff --git a/src/molecules/AutoPasSimpleMolecule.h b/src/molecules/AutoPasSimpleMolecule.h index 5fc924ecaa..ee0c80283b 100644 --- a/src/molecules/AutoPasSimpleMolecule.h +++ b/src/molecules/AutoPasSimpleMolecule.h @@ -18,8 +18,8 @@ class AutoPasSimpleMolecule final : public MoleculeInterface, public autopas::ParticleFP64 { public: explicit AutoPasSimpleMolecule(unsigned long id = 0, Component* component = nullptr, double rx = 0., double ry = 0., - double rz = 0., double vx = 0., double vy = 0., double vz = 0., double q0 = 1., - double q1 = 1., double q2 = 0., double q3 = 0., double Dx = 0., double Dy = 0., + double rz = 0., double vx = 0., double vy = 0., double vz = 0., double qw = 1., + double qx = 1., double qy = 0., double qz = 0., double Dx = 0., double Dy = 0., double Dz = 0.); AutoPasSimpleMolecule(const AutoPasSimpleMolecule& m) = default; diff --git a/src/molecules/FullMolecule.cpp b/src/molecules/FullMolecule.cpp index 0e263fa77e..2c18287919 100644 --- a/src/molecules/FullMolecule.cpp +++ b/src/molecules/FullMolecule.cpp @@ -11,10 +11,10 @@ FullMolecule::FullMolecule(unsigned long id, Component *component, double rx, double ry, double rz, double vx, double vy, double vz, - double q0, double q1, double q2, double q3, + double qw, double qx, double qy, double qz, double Dx, double Dy, double Dz ) - : _q(q0, q1, q2, q3) { + : _q(qw, qx, qy, qz) { _id = id; _component = component; _r[0] = rx; diff --git a/src/molecules/FullMolecule.h b/src/molecules/FullMolecule.h index 93ba81f58a..014ad5151b 100644 --- a/src/molecules/FullMolecule.h +++ b/src/molecules/FullMolecule.h @@ -25,7 +25,7 @@ class FullMolecule : public MoleculeInterface { FullMolecule(unsigned long id = 0, Component *component = nullptr, double rx = 0., double ry = 0., double rz = 0., double vx = 0., double vy = 0., double vz = 0., - double q0 = 1., double q1 = 1., double q2 = 0., double q3 = 0., + double qw = 1., double qx = 1., double qy = 0., double qz = 0., double Dx = 0., double Dy = 0., double Dz = 0. ); FullMolecule(const FullMolecule& m); diff --git a/src/molecules/MoleculeRMM.h b/src/molecules/MoleculeRMM.h index 56d45b861c..8ab1c1ce0a 100644 --- a/src/molecules/MoleculeRMM.h +++ b/src/molecules/MoleculeRMM.h @@ -21,8 +21,8 @@ class MoleculeRMM : public MoleculeInterface { MoleculeRMM(unsigned long id = 0, Component *component = nullptr, double rx = 0., double ry = 0., double rz = 0., double vx = 0., double vy = 0., double vz = 0., - double = 0., double = 0., double = 0., double = 0., /*q0, q1, q2, q3*/ - double = 0., double = 0., double = 0. /*Dx, Dy, Dz*/ + double qw = 0., double qx = 0., double qy = 0., double qz = 0., + double Dx = 0., double Dy = 0., double Dz = 0. ) { _state = STORAGE_AOS; _r[0] = rx; From 4fe755b910a3a5fc42fb5f17708719576edffe6a Mon Sep 17 00:00:00 2001 From: Christoph Niethammer Date: Wed, 20 Mar 2024 21:27:58 +0100 Subject: [PATCH 3/5] Fix initialization of molecule orientation in internal generator code Signed-off-by: Christoph Niethammer --- src/molecules/AutoPasSimpleMolecule.h | 4 ++-- src/molecules/FullMolecule.h | 2 +- src/particleContainer/ParticleCellBase.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/molecules/AutoPasSimpleMolecule.h b/src/molecules/AutoPasSimpleMolecule.h index ee0c80283b..2796cb778b 100644 --- a/src/molecules/AutoPasSimpleMolecule.h +++ b/src/molecules/AutoPasSimpleMolecule.h @@ -18,8 +18,8 @@ class AutoPasSimpleMolecule final : public MoleculeInterface, public autopas::ParticleFP64 { public: explicit AutoPasSimpleMolecule(unsigned long id = 0, Component* component = nullptr, double rx = 0., double ry = 0., - double rz = 0., double vx = 0., double vy = 0., double vz = 0., double qw = 1., - double qx = 1., double qy = 0., double qz = 0., double Dx = 0., double Dy = 0., + double rz = 0., double vx = 0., double vy = 0., double vz = 0., double qw = 0., + double qx = 0., double qy = 0., double qz = 0., double Dx = 0., double Dy = 0., double Dz = 0.); AutoPasSimpleMolecule(const AutoPasSimpleMolecule& m) = default; diff --git a/src/molecules/FullMolecule.h b/src/molecules/FullMolecule.h index 014ad5151b..a9cfd32d1e 100644 --- a/src/molecules/FullMolecule.h +++ b/src/molecules/FullMolecule.h @@ -25,7 +25,7 @@ class FullMolecule : public MoleculeInterface { FullMolecule(unsigned long id = 0, Component *component = nullptr, double rx = 0., double ry = 0., double rz = 0., double vx = 0., double vy = 0., double vz = 0., - double qw = 1., double qx = 1., double qy = 0., double qz = 0., + double qw = 0., double qx = 0., double qy = 0., double qz = 0., double Dx = 0., double Dy = 0., double Dz = 0. ); FullMolecule(const FullMolecule& m); diff --git a/src/particleContainer/ParticleCellBase.cpp b/src/particleContainer/ParticleCellBase.cpp index 3cd67b55ca..1e40e400d9 100644 --- a/src/particleContainer/ParticleCellBase.cpp +++ b/src/particleContainer/ParticleCellBase.cpp @@ -143,7 +143,7 @@ unsigned long ParticleCellBase::initCubicGrid(const std::array ++numInserted; std::array v = getRandomVelocity(T, RNG); Molecule dummy(0, &(global_simulation->getEnsemble()->getComponents()->at(0)), - x1, y1, z1, v[0], -v[1], v[2]); + x1, y1, z1, v[0], -v[1], v[2], 1.0, 0.0, 0.0, 0.0); buffer.push_back(dummy); } @@ -151,7 +151,7 @@ unsigned long ParticleCellBase::initCubicGrid(const std::array ++numInserted; std::array v = getRandomVelocity(T, RNG); Molecule dummy(0, &(global_simulation->getEnsemble()->getComponents()->at(0)), - x2, y2, z2, v[0], -v[1], v[2]); + x2, y2, z2, v[0], -v[1], v[2], 1.0, 0.0, 0.0, 0.0); buffer.push_back(dummy); } } From 561259f5cf1b30731bfcf5233101310c157272a5 Mon Sep 17 00:00:00 2001 From: Christoph Niethammer Date: Wed, 20 Mar 2024 23:30:57 +0100 Subject: [PATCH 4/5] Add cubic_gird_generator example to test configuration list Signed-off-by: Christoph Niethammer --- examples/example-list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/example-list.txt b/examples/example-list.txt index 01a10a9901..26284459f2 100644 --- a/examples/example-list.txt +++ b/examples/example-list.txt @@ -6,6 +6,7 @@ ./EOX/600K_15mol_l/config.xml ./Generators/mkTcTS/config.xml ./Generators/mkesfera/config.xml +./Generators/cubic_grid_generator/config.xml ./DropletCoalescence/liq/config_1_generateLiq.xml ./DropletCoalescence/vap/config_3_generateVap.xml ./surface-tension_LRC/CO2_Merker/vle/220K/run01/config.xml From be75df9c8b820abe657a9371b3686a970a89178b Mon Sep 17 00:00:00 2001 From: Christoph Niethammer Date: Tue, 16 Apr 2024 18:48:46 +0200 Subject: [PATCH 5/5] Change Molecule constructor to require passing all parameters Remove the default parameters for the Molecule constructor to prevent unintentional incorrect initialization of molecules. Fix all related places in the code with the appropriate initialization values. Signed-off-by: Christoph Niethammer --- src/io/ASCIIReader.cpp | 3 +-- src/io/BinaryReader.cpp | 3 +-- src/io/MPI_IOReader.cpp | 3 +-- src/io/ObjectGenerator.cpp | 2 +- src/io/PerCellGenerator.cpp | 4 ++-- src/molecules/FullMolecule.h | 10 +++++----- src/molecules/MoleculeRMM.h | 10 +++++----- src/parallel/ParticleDataFull.cpp | 4 ++-- src/parallel/ParticleDataFull.h | 2 +- src/parallel/ParticleDataRMM.cpp | 2 +- src/parallel/ParticleDataRMM.h | 2 +- src/particleContainer/adapter/CellDataSoARMM.h | 4 +++- 12 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/io/ASCIIReader.cpp b/src/io/ASCIIReader.cpp index c0d1a6a76a..0039e6df7c 100644 --- a/src/io/ASCIIReader.cpp +++ b/src/io/ASCIIReader.cpp @@ -410,8 +410,7 @@ ASCIIReader::readPhaseSpace(ParticleContainer* particleContainer, Domain* domain Log::global_log->debug() << "broadcasting(sending/receiving) particles with buffer_position " << particle_buff_pos << std::endl; MPI_Bcast(particle_buff, PARTICLE_BUFFER_SIZE, mpi_Particle, 0, MPI_COMM_WORLD); // TODO: MPI_COMM_WORLD for (int j = 0; j < particle_buff_pos; j++) { - Molecule m; - ParticleData::ParticleDataToMolecule(particle_buff[j], m); + Molecule m = ParticleData::ParticleDataToMolecule(particle_buff[j]); // only add particle if it is inside of the own domain! if(particleContainer->isInBoundingBox(m.r_arr().data())) { particleContainer->addParticle(m, true, false); diff --git a/src/io/BinaryReader.cpp b/src/io/BinaryReader.cpp index 83875f6e95..52f4ae5eff 100644 --- a/src/io/BinaryReader.cpp +++ b/src/io/BinaryReader.cpp @@ -261,8 +261,7 @@ BinaryReader::readPhaseSpace(ParticleContainer* particleContainer, Domain* domai MPI_Bcast(particle_buff, PARTICLE_BUFFER_SIZE, mpi_Particle, 0, MPI_COMM_WORLD); // TODO: MPI_COMM_WORLD for (int j = 0; j < particle_buff_pos; j++) { - Molecule m; - ParticleData::ParticleDataToMolecule(particle_buff[j], m); + Molecule m = ParticleData::ParticleDataToMolecule(particle_buff[j]); // only add particle if it is inside of the own domain! if(particleContainer->isInBoundingBox(m.r_arr().data())) { particleContainer->addParticle(m, true, false); diff --git a/src/io/MPI_IOReader.cpp b/src/io/MPI_IOReader.cpp index f706427b96..a8d0976fcc 100644 --- a/src/io/MPI_IOReader.cpp +++ b/src/io/MPI_IOReader.cpp @@ -504,10 +504,9 @@ MPI_IOReader::readPhaseSpace(ParticleContainer* particleContainer, Domain* domai if (globalNumParticlesPerCell[index] > 0) { - Molecule m; for (int l = 0; l < globalNumParticlesPerCell[index]; l++) { - ParticleData::ParticleDataToMolecule(data[l], m); + Molecule m = ParticleData::ParticleDataToMolecule(data[l]); // only add particle if it is inside of the own domain! if(particleContainer->isInBoundingBox(m.r_arr().data())) { diff --git a/src/io/ObjectGenerator.cpp b/src/io/ObjectGenerator.cpp index 25a080147c..df2bb40f24 100644 --- a/src/io/ObjectGenerator.cpp +++ b/src/io/ObjectGenerator.cpp @@ -126,7 +126,7 @@ ObjectGenerator::readPhaseSpace(ParticleContainer* particleContainer, Domain* do _filler->setObject(boundedObject); _filler->init(); - Molecule molecule; + Molecule molecule(0, nullptr, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); unsigned long moleculeID = _moleculeIdPool->getNewMoleculeId(); while(_filler->getMolecule(&molecule) > 0) { molecule.setid(moleculeID); diff --git a/src/io/PerCellGenerator.cpp b/src/io/PerCellGenerator.cpp index 673a67dd0d..90b72ee221 100644 --- a/src/io/PerCellGenerator.cpp +++ b/src/io/PerCellGenerator.cpp @@ -120,7 +120,7 @@ void PerCellGenerator::fillContainer(ParticleContainer *particleContainer, Compo std::array pos = {uniform_dists[0](randomEngine), uniform_dists[1](randomEngine), uniform_dists[2](randomEngine)}; - Molecule m(id, component, pos[0], pos[1], pos[2], 0., 0., 0.); + Molecule m(id, component, pos[0], pos[1], pos[2], 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.); if (isHalo) { particleContainer->addHaloParticle(m, true); } else { @@ -160,7 +160,7 @@ void PerCellGenerator::generateTwoParticles(ParticleContainer *particleContainer for (auto id = 0; id < 2; ++id) { std::array pos = {uniform_dists[0](randomEngine), uniform_dists[1](randomEngine), uniform_dists[2](randomEngine)}; - Molecule m(id, component, pos[0], pos[1], pos[2], 0., 0., 0.); + Molecule m(id, component, pos[0], pos[1], pos[2], 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.); particleContainer->addParticle(m, true); } } diff --git a/src/molecules/FullMolecule.h b/src/molecules/FullMolecule.h index a9cfd32d1e..1f6765f796 100644 --- a/src/molecules/FullMolecule.h +++ b/src/molecules/FullMolecule.h @@ -22,11 +22,11 @@ class FullMolecule : public MoleculeInterface { // but if it is left away, all pointer data is not initialized (which is not // neccessarily bad), but then assertions fail (e.g. in the destructor) and we can't // use it's instances. - FullMolecule(unsigned long id = 0, Component *component = nullptr, - double rx = 0., double ry = 0., double rz = 0., - double vx = 0., double vy = 0., double vz = 0., - double qw = 0., double qx = 0., double qy = 0., double qz = 0., - double Dx = 0., double Dy = 0., double Dz = 0. + FullMolecule(unsigned long id, Component *component, + double rx, double ry, double rz, + double vx, double vy, double vz, + double qw, double qx, double qy, double qz, + double Dx, double Dy, double Dz ); FullMolecule(const FullMolecule& m); diff --git a/src/molecules/MoleculeRMM.h b/src/molecules/MoleculeRMM.h index 8ab1c1ce0a..a460d0a7be 100644 --- a/src/molecules/MoleculeRMM.h +++ b/src/molecules/MoleculeRMM.h @@ -18,11 +18,11 @@ class MoleculeRMM : public MoleculeInterface { }; public: - MoleculeRMM(unsigned long id = 0, Component *component = nullptr, - double rx = 0., double ry = 0., double rz = 0., - double vx = 0., double vy = 0., double vz = 0., - double qw = 0., double qx = 0., double qy = 0., double qz = 0., - double Dx = 0., double Dy = 0., double Dz = 0. + MoleculeRMM(unsigned long id, Component *component, + double rx, double ry, double rz, + double vx, double vy, double vz, + double qw, double qx, double qy, double qz, + double Dx, double Dy, double Dz ) { _state = STORAGE_AOS; _r[0] = rx; diff --git a/src/parallel/ParticleDataFull.cpp b/src/parallel/ParticleDataFull.cpp index 9a2d296d63..12307735b4 100644 --- a/src/parallel/ParticleDataFull.cpp +++ b/src/parallel/ParticleDataFull.cpp @@ -60,9 +60,9 @@ void ParticleDataFull::MoleculeToParticleData(ParticleDataFull &particleStruct, particleStruct.D[2] = molecule.D(2); } -void ParticleDataFull::ParticleDataToMolecule(const ParticleDataFull &particleStruct, Molecule &molecule) { +Molecule ParticleDataFull::ParticleDataToMolecule(const ParticleDataFull &particleStruct) { Component* component = _simulation.getEnsemble()->getComponent(particleStruct.cid); - molecule = Molecule(particleStruct.id, component, + return Molecule(particleStruct.id, component, particleStruct.r[0], particleStruct.r[1], particleStruct.r[2], particleStruct.v[0], particleStruct.v[1], particleStruct.v[2], particleStruct.q[0], particleStruct.q[1], particleStruct.q[2], particleStruct.q[3], diff --git a/src/parallel/ParticleDataFull.h b/src/parallel/ParticleDataFull.h index 8f0317cf56..bf3bce512e 100644 --- a/src/parallel/ParticleDataFull.h +++ b/src/parallel/ParticleDataFull.h @@ -25,7 +25,7 @@ class ParticleDataFull { static void MoleculeToParticleData(ParticleDataFull &particleStruct, Molecule &molecule); //! @brief copy data from object of class ParticleDataFull to object of class Molecule - static void ParticleDataToMolecule(const ParticleDataFull &particleStruct, Molecule &molecule); + static Molecule ParticleDataToMolecule(const ParticleDataFull &particleStruct); double r[3]; //! position double v[3]; //! velocity diff --git a/src/parallel/ParticleDataRMM.cpp b/src/parallel/ParticleDataRMM.cpp index 70e228ecac..246d8dc507 100644 --- a/src/parallel/ParticleDataRMM.cpp +++ b/src/parallel/ParticleDataRMM.cpp @@ -66,7 +66,7 @@ void ParticleDataRMM::MoleculeToParticleData(ParticleDataRMM &particleStruct, Mo particleStruct.v[2] = molecule.v(2); } -void ParticleDataRMM::ParticleDataToMolecule(const ParticleDataRMM &particleStruct, Molecule &molecule) { +Molecule ParticleDataRMM::ParticleDataToMolecule(const ParticleDataRMM &particleStruct) { Component* component = _simulation.getEnsemble()->getComponent(0); molecule = Molecule(particleStruct.id, component, particleStruct.r[0], particleStruct.r[1], particleStruct.r[2], diff --git a/src/parallel/ParticleDataRMM.h b/src/parallel/ParticleDataRMM.h index f5e8b3524d..ba2902bead 100644 --- a/src/parallel/ParticleDataRMM.h +++ b/src/parallel/ParticleDataRMM.h @@ -26,7 +26,7 @@ class ParticleDataRMM { static void MoleculeToParticleData(ParticleDataRMM &particleStruct, Molecule &molecule); //! @brief copy data from object of class class ParticleDataRMM to object of class Molecule - static void ParticleDataToMolecule(const ParticleDataRMM &particleStruct, Molecule &molecule); + static Molecule ParticleDataToMolecule(const ParticleDataRMM &particleStruct); unsigned long id; vcp_real_calc r[3]; diff --git a/src/particleContainer/adapter/CellDataSoARMM.h b/src/particleContainer/adapter/CellDataSoARMM.h index 6a437b10ef..cd7c83e97f 100644 --- a/src/particleContainer/adapter/CellDataSoARMM.h +++ b/src/particleContainer/adapter/CellDataSoARMM.h @@ -72,7 +72,9 @@ class CellDataSoARMM : public CellDataSoABase { return Molecule ( getMolUid(index), nullptr, getMolR(0,index), getMolR(1,index), getMolR(2,index), - getMolV(0,index), getMolV(1,index), getMolV(2,index)); + getMolV(0,index), getMolV(1,index), getMolV(2,index), + 1.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0); } void readImmutableMolecule(size_t index, MoleculeInterface& m) const {