source: src/base/linked_cell_list.cpp@ ac6d04

Last change on this file since ac6d04 was ac6d04, checked in by Julian Iseringhausen <isering@…>, 14 years ago

Merge recent changes of the vmg library into ScaFaCos.

Includes a fix for the communication problems on Jugene.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1666 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 3.7 KB
RevLine 
[dfed1c]1/**
2 * @file linked_cell_list.cpp
3 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
4 * @date Mon Nov 21 13:27:22 2011
5 *
6 * @brief A linked cell list implementation.
7 *
8 */
9
10#ifdef HAVE_CONFIG_H
11#include <config.h>
12#endif
13
14#include "base/linked_cell_list.hpp"
15#include "comm/comm.hpp"
16#include "mg.hpp"
17
18using namespace VMG;
19
[ac6d04]20Particle::LinkedCellList::LinkedCellList(std::list<Particle>& particles,
[dfed1c]21 const int& near_field_cells, const Grid& grid)
22{
[ac6d04]23 std::list<Particle>::iterator iter;
[dfed1c]24 Index index_global, index_local;
25 LocalIndices local = grid.Local();
26
[ac6d04]27 local.BoundaryBegin1() = 0;
28 local.BoundaryEnd1() = 0;
29 local.BoundarySize1() = 0;
30
31 local.BoundaryBegin2() = 0;
32 local.BoundaryEnd2() = 0;
33 local.BoundarySize2() = 0;
34
35 local.FinerBeginFoo() = 0;
36 local.FinerEndFoo() = 0;
37 local.FinerSizeFoo() = 0;
[dfed1c]38
39 for (int i=0; i<3; ++i) {
40
[ac6d04]41 if (local.HaloSize1()[i] > 0) {
[dfed1c]42 local.HaloBegin1()[i] = 0;
43 local.HaloEnd1()[i] = near_field_cells+1;
[ac6d04]44 local.HaloSize1()[i] = near_field_cells+1;
[dfed1c]45 local.Begin()[i] = near_field_cells+1;
46 local.End()[i] = local.Begin()[i] + local.Size()[i];
47 local.SizeTotal()[i] = local.Size()[i] +
48 local.HaloEnd1()[i] - local.HaloBegin1()[i] +
49 local.HaloEnd2()[i] - local.HaloBegin2()[i];
[ac6d04]50 }else {
51 local.Begin()[i] = 0;
52 local.End()[i] = local.Size()[i];
[dfed1c]53 }
54
[ac6d04]55 if (local.HaloSize2()[i] > 0) {
[dfed1c]56 local.HaloBegin2()[i] = local.End()[i];
57 local.HaloEnd2()[i] = local.HaloBegin2()[i] + near_field_cells+1;
[ac6d04]58 local.HaloSize2()[i] = near_field_cells+1;
[dfed1c]59 local.SizeTotal()[i] = local.Size()[i] +
60 local.HaloEnd1()[i] - local.HaloBegin1()[i] +
61 local.HaloEnd2()[i] - local.HaloBegin2()[i];
62 }
63 }
64
65 SetGridSize(grid.Global(), local, grid.Extent());
66
67 for (iter=particles.begin(); iter!=particles.end(); ++iter)
[ac6d04]68 AddParticle(&(*iter));
[dfed1c]69}
70
[ac6d04]71Particle::LinkedCellList::~LinkedCellList()
[dfed1c]72{
[ac6d04]73 ClearHalo();
[dfed1c]74}
75
[ac6d04]76void Particle::LinkedCellList::AddParticle(Particle* p)
[dfed1c]77{
[ac6d04]78 const Index global_index = (p->Pos() - Extent().Begin()) / Extent().MeshWidth();
79 const Index local_index = global_index - Global().LocalBegin() + Local().Begin();
[dfed1c]80
[ac6d04]81 assert(local_index.IsInBounds(Local().Begin(), Local().End()));
82 (*this)(local_index).push_back(p);
[dfed1c]83}
84
[ac6d04]85void Particle::LinkedCellList::AddParticleToHalo(const vmg_float* x, const vmg_float& q)
[dfed1c]86{
[ac6d04]87 const Index global_index = (Vector(x) - Extent().Begin()) / Extent().MeshWidth();
88 const Index local_index = global_index - Global().LocalBegin() + Local().Begin();
89
90 assert(local_index.IsInBounds(0, Local().SizeTotal()));
91 assert((local_index[0] >= Local().HaloBegin1()[0] && local_index[0] < Local().HaloEnd1()[0]) ||
92 (local_index[1] >= Local().HaloBegin1()[1] && local_index[1] < Local().HaloEnd1()[1]) ||
93 (local_index[2] >= Local().HaloBegin1()[2] && local_index[2] < Local().HaloEnd1()[2]) ||
94 (local_index[0] >= Local().HaloBegin2()[0] && local_index[0] < Local().HaloEnd2()[0]) ||
95 (local_index[1] >= Local().HaloBegin2()[1] && local_index[1] < Local().HaloEnd2()[1]) ||
96 (local_index[2] >= Local().HaloBegin2()[2] && local_index[2] < Local().HaloEnd2()[2]));
97
98 (*this)(local_index).push_back(new Particle(x, q));
[dfed1c]99}
100
[ac6d04]101void Particle::LinkedCellList::ClearHalo()
[dfed1c]102{
[ac6d04]103 Grid::iterator g_iter;
104 std::list<Particle*>::iterator p_iter;
[dfed1c]105
[ac6d04]106 for (int i=0; i<3; ++i) {
107
108 for (g_iter = Iterators().Halo1()[i].Begin(); g_iter != Iterators().Halo1()[i].End(); ++g_iter)
109 for (p_iter = (*this)(*g_iter).begin(); p_iter!=(*this)(*g_iter).end(); ++p_iter)
110 delete *p_iter;
111
112 for (g_iter = Iterators().Halo2()[i].Begin(); g_iter != Iterators().Halo2()[i].End(); ++g_iter)
113 for (p_iter = (*this)(*g_iter).begin(); p_iter!=(*this)(*g_iter).end(); ++p_iter)
114 delete *p_iter;
115
116 }
[dfed1c]117}
Note: See TracBrowser for help on using the repository browser.