/** * @file linked_cell_list.cpp * @author Julian Iseringhausen * @date Mon Nov 21 13:27:22 2011 * * @brief A linked cell list implementation. * */ #ifdef HAVE_CONFIG_H #include #endif #include "base/linked_cell_list.hpp" #include "comm/comm.hpp" #include "mg.hpp" using namespace VMG; Particle::LinkedCellList::LinkedCellList(const std::list& particles, const int& near_field_cells, const Grid& grid) { std::list::const_iterator iter; Index index_global, index_local; LocalIndices local = grid.Local(); local.BoundaryBegin1() = local.BoundaryEnd1() = 0; local.BoundaryBegin2() = local.BoundaryEnd2() = 0; for (int i=0; i<3; ++i) { if (local.HasHalo1()[i]) { local.HaloBegin1()[i] = 0; local.HaloEnd1()[i] = near_field_cells+1; local.Begin()[i] = near_field_cells+1; local.End()[i] = local.Begin()[i] + local.Size()[i]; local.SizeTotal()[i] = local.Size()[i] + local.HaloEnd1()[i] - local.HaloBegin1()[i] + local.HaloEnd2()[i] - local.HaloBegin2()[i]; } if (local.HasHalo2()[i]) { local.HaloBegin2()[i] = local.End()[i]; local.HaloEnd2()[i] = local.HaloBegin2()[i] + near_field_cells+1; local.SizeTotal()[i] = local.Size()[i] + local.HaloEnd1()[i] - local.HaloBegin1()[i] + local.HaloEnd2()[i] - local.HaloBegin2()[i]; } } SetGridSize(grid.Global(), local, grid.Extent()); for (iter=particles.begin(); iter!=particles.end(); ++iter) AddParticle(*iter); } void Particle::LinkedCellList::AddParticle(const Particle& p) { const Index global_index = (p.Pos() - Extent().Begin()) / Extent().MeshWidth(); const Index local_index = global_index - Global().BeginLocal() + Local().Begin(); if (local_index.IsInBounds(Local().Begin(), Local().End())) (*this)(local_index).push_back(Particle(p.Pos(), p.Charge(), 0.0, 0.0, p.Rank(), p.Index())); else not_my_particles.push_back(Particle(p.Pos(), p.Charge(), 0.0, 0.0, p.Rank(), p.Index())); } void Particle::LinkedCellList::AddParticleToComplete(const vmg_float* pos, const vmg_float& charge, const vmg_float& pot, const vmg_float* force, const int& rank, const int& index) { const Index global_index = (Vector(pos) - Extent().Begin()) / Extent().MeshWidth(); const Index local_index = global_index - Global().BeginLocal() + Local().Begin(); if (local_index.IsInBounds(0, Local().SizeTotal())) (*this)(local_index).push_back(Particle(pos, charge, pot, force, rank, index)); else not_my_particles.push_back(Particle(pos, charge, pot, force, rank, index)); } void Particle::LinkedCellList::AddParticleToComplete(const Vector& pos, const vmg_float& charge, const vmg_float& pot, const Vector& force, const int& rank, const int& index) { const Index global_index = (pos - Extent().Begin()) / Extent().MeshWidth(); const Index local_index = global_index - Global().BeginLocal() + Local().Begin(); if (local_index.IsInBounds(0, Local().SizeTotal())) (*this)(local_index).push_back(Particle(pos, charge, pot, force, rank, index)); else not_my_particles.push_back(Particle(pos, charge, pot, force, rank, index)); } void Particle::LinkedCellList::AddParticleToComplete(const vmg_float* pos, const vmg_float& charge) { const Index global_index = (Vector(pos) - Extent().Begin()) / Extent().MeshWidth(); const Index local_index = global_index - Global().BeginLocal() + Local().Begin(); if (local_index.IsInBounds(0, Local().SizeTotal())) (*this)(local_index).push_back(Particle(pos, charge)); else not_my_particles.push_back(Particle(pos, charge)); }