source: src/base/linked_cell_list.cpp@ 759a6a

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

Fix energy calculation.

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

  • Property mode set to 100644
File size: 3.7 KB
Line 
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
20Particle::LinkedCellList::LinkedCellList(std::list<Particle>& particles,
21 const int& near_field_cells, const Grid& grid)
22{
23 std::list<Particle>::iterator iter;
24 Index index_global, index_local;
25 LocalIndices local = grid.Local();
26
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.FinerBegin() = 0;
36 local.FinerEnd() = 0;
37 local.FinerSize() = 0;
38
39 for (int i=0; i<3; ++i) {
40
41 if (local.HaloSize1()[i] > 0) {
42 local.HaloBegin1()[i] = 0;
43 local.HaloEnd1()[i] = near_field_cells+1;
44 local.HaloSize1()[i] = near_field_cells+1;
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];
50 }else {
51 local.Begin()[i] = 0;
52 local.End()[i] = local.Size()[i];
53 }
54
55 if (local.HaloSize2()[i] > 0) {
56 local.HaloBegin2()[i] = local.End()[i];
57 local.HaloEnd2()[i] = local.HaloBegin2()[i] + near_field_cells+1;
58 local.HaloSize2()[i] = near_field_cells+1;
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)
68 AddParticle(&(*iter));
69}
70
71Particle::LinkedCellList::~LinkedCellList()
72{
73 ClearHalo();
74}
75
76void Particle::LinkedCellList::AddParticle(Particle* p)
77{
78 const Index global_index = (p->Pos() - Extent().Begin()) / Extent().MeshWidth();
79 const Index local_index = global_index - Global().LocalBegin() + Local().Begin();
80
81 assert(local_index.IsInBounds(Local().Begin(), Local().End()));
82 (*this)(local_index).push_back(p);
83}
84
85void Particle::LinkedCellList::AddParticleToHalo(const vmg_float* x, const vmg_float& q)
86{
87 const Index global_index = ((Vector(x) - Extent().Begin()) / Extent().MeshWidth()).Floor();
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));
99}
100
101void Particle::LinkedCellList::ClearHalo()
102{
103 Grid::iterator g_iter;
104 std::list<Particle*>::iterator p_iter;
105
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 }
117}
Note: See TracBrowser for help on using the repository browser.