source: src/grid/tempgrid.cpp@ f003a9

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

Refactored vmg in order to separate the core library and the particle simulation part properly.

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

  • Property mode set to 100644
File size: 10.2 KB
Line 
1/**
2 * @file tempgrid.cpp
3 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
4 * @date Mon Apr 18 12:55:05 2011
5 *
6 * @brief VMG::TempGrid
7 *
8 */
9
10#ifdef HAVE_CONFIG_H
11#include <config.h>
12#endif
13
14#include "base/discretization.hpp"
15#include "base/interface.hpp"
16#include "base/stencil.hpp"
17#include "comm/comm.hpp"
18#include "grid/grid_index_translations.hpp"
19#include "grid/tempgrid.hpp"
20#include "mg.hpp"
21
22using namespace VMG;
23
24void TempGrid::SetProperties(const Grid& rhs)
25{
26 local = rhs.Local();
27 global = rhs.Global();
28 extent = rhs.Extent();
29 iterators.SetSubgrids(rhs.Local());
30 level = rhs.Level();
31 Allocate();
32}
33
34void TempGrid::SetProperties(const GlobalIndices& global_, const LocalIndices& local_, const SpatialExtent& extent_)
35{
36 local = local_;
37 global = global_;
38 extent = extent_;
39 iterators.SetSubgrids(local_);
40 Allocate();
41}
42
43void TempGrid::SetProperties(const Index& size, const Index& halo_size,
44 const Vector& spatial_begin, const Vector& spatial_end)
45{
46 global.LocalBegin() = 0;
47 global.LocalEnd() = size;
48 global.LocalSize() = size;
49 global.GlobalFinerBegin() = 0;
50 global.GlobalFinerEnd() = 0;
51 global.GlobalFinerSize() = 0;
52 global.LocalFinerBegin() = 0;
53 global.LocalFinerEnd() = 0;
54 global.LocalFinerSize() = 0;
55 global.FinestAbsBegin() = 0;
56 global.FinestAbsEnd() = size;
57 global.FinestAbsSize() = size;
58 global.GlobalSize() = size;
59 global.BoundaryType() = BTUndefined;
60
61 local.Begin() = halo_size;
62 local.End() = this->local.Begin() + size;
63 local.Size() = size;
64 local.SizeTotal() = size + 2 * halo_size;
65 local.HaloBegin1() = 0;
66 local.HaloEnd1() = halo_size;
67 local.HaloSize1() = halo_size;
68 local.HaloBegin2() = this->local.End();
69 local.HaloEnd2() = this->local.HaloBegin2() = halo_size;
70 local.HaloSize2() = halo_size;
71 local.BoundaryBegin1() = 0;
72 local.BoundaryEnd1() = 0;
73 local.BoundarySize1() = 0;
74 local.BoundaryBegin2() = 0;
75 local.BoundaryEnd2() = 0;
76 local.BoundarySize2() = 0;
77 local.FinerBegin() = 0;
78 local.FinerEnd() = 0;
79 local.FinerSize() = 0;
80
81 extent.Begin() = spatial_begin;
82 extent.End() = spatial_end;
83 extent.Size() = spatial_end - spatial_begin;
84 extent.MeshWidth() = this->extent.Size() / static_cast<Vector>(size-1);
85
86 Allocate();
87}
88
89void TempGrid::SetPropertiesToFiner(const Grid& grid, const Boundary& boundary)
90{
91 assert(grid.Father() != NULL);
92 assert(grid.Level() < grid.Father()->MaxLevel());
93
94 const Grid& grid_finer = (*grid.Father())(grid.Level()+1);
95 const Index off = GridIndexTranslations::EndOffset(boundary);
96
97 level = grid.Level() + 1;
98
99 global.GlobalFinerBegin() = 0;
100 global.GlobalFinerEnd() = 0;
101 global.GlobalFinerSize() = 0;
102
103 global.LocalFinerBegin() = 0;
104 global.LocalFinerEnd() = 0;
105 global.LocalFinerSize() = 0;
106
107 global.FinestAbsBegin() = grid_finer.Global().FinestAbsBegin();
108 global.FinestAbsEnd() = grid_finer.Global().FinestAbsEnd();
109 global.FinestAbsSize() = grid_finer.Global().FinestAbsSize();
110
111 global.GlobalSize() = 2 * (grid.Global().GlobalFinerSize() - off) + off;
112 global.BoundaryType() = grid_finer.Global().BoundaryType();
113
114 global.LocalBegin() = 2 * grid.Global().LocalBegin().Clamp(grid.Global().GlobalFinerBegin(), grid.Global().GlobalFinerEnd());
115 global.LocalEnd() = 2 * grid.Global().LocalEnd().Clamp(grid.Global().GlobalFinerBegin(), grid.Global().GlobalFinerEnd()) - off;
116
117 global.LocalSize() = global.LocalEnd() - global.LocalBegin();
118 if (global.LocalSize().Product() == 0) {
119 global.LocalBegin() = 0;
120 global.LocalEnd() = 0;
121 global.LocalSize() = 0;
122 global.BoundaryType() = EmptyGrid;
123 }
124
125 local.FinerBegin() = 0;
126 local.FinerEnd() = 0;
127 local.FinerSize() = 0;
128
129 local.Begin() = 0;
130 local.End() = global.LocalSize();
131 local.Size() = global.LocalSize();
132 local.SizeTotal() = global.LocalSize();
133
134 local.HaloBegin1() = 0;
135 local.HaloEnd1() = 0;
136 local.HaloBegin2() = 0;
137 local.HaloEnd2() = 0;
138
139 local.BoundaryBegin1() = 0;
140 local.BoundaryEnd1() = 0;
141 local.BoundaryBegin2() = 0;
142 local.BoundaryEnd2() = 0;
143
144 for (int i=0; i<3; ++i) {
145
146 if (grid.Local().HaloSize1()[i] > 0) {
147 local.Begin()[i] += grid.Local().HaloSize1()[i];
148 local.End()[i] += grid.Local().HaloSize1()[i];
149 local.HaloEnd1()[i] = grid.Local().HaloSize1()[i];
150 }
151
152 if (grid.Local().BoundarySize1()[i] > 0) {
153 local.Begin()[i] += grid.Local().BoundarySize1()[i];
154 local.BoundaryEnd1()[i] = grid.Local().BoundarySize1()[i];
155 }
156
157 if (grid.Local().HaloSize2()[i] > 0) {
158 local.HaloBegin2()[i] = local.End()[i];
159 local.HaloEnd2()[i] = local.End()[i] + grid.Local().HaloSize2()[i];
160 }
161
162 if (grid.Local().BoundarySize2()[i] > 0) {
163 local.End()[i] -= grid.Local().BoundarySize2()[i];
164 local.BoundaryBegin2()[i] = local.End()[i];
165 local.BoundaryEnd2()[i] = local.End()[i]+grid.Local().BoundarySize2()[i];
166 }
167
168 }
169
170 local.HaloSize1() = local.HaloEnd1() - local.HaloBegin1();
171 local.HaloSize2() = local.HaloEnd2() - local.HaloBegin2();
172 local.BoundarySize1() = local.BoundaryEnd1() - local.BoundaryBegin1();
173 local.BoundarySize2() = local.BoundaryEnd2() - local.BoundaryBegin2();
174 local.Size() = local.End() - local.Begin();
175 local.SizeTotal() = local.Size() +
176 local.HaloSize1() + local.HaloSize2() +
177 local.BoundarySize1() + local.BoundarySize2();
178
179 extent.Size() = grid.Extent().Size();
180 extent.Begin() = grid.Extent().Begin();
181 extent.End() = grid.Extent().End();
182 extent.MeshWidth() = 0.5 * grid.Extent().MeshWidth();
183
184 iterators.SetSubgrids(local);
185
186 Allocate();
187}
188
189void TempGrid::SetPropertiesToCoarser(const Grid& grid, const Boundary& boundary)
190{
191 assert(grid.Father() != NULL);
192 assert(grid.Level() > grid.Father()->MinLevel());
193
194 const Grid& grid_coarser = (*grid.Father())(grid.Level()-1);
195 const Index off = GridIndexTranslations::EndOffset(boundary);
196
197 level = grid.Level() - 1;
198
199 global.GlobalFinerBegin() = grid_coarser.Global().GlobalFinerBegin();
200 global.GlobalFinerEnd() = grid_coarser.Global().GlobalFinerEnd();
201 global.GlobalFinerSize() = grid_coarser.Global().GlobalFinerSize();
202
203 global.FinestAbsBegin() = grid.Global().FinestAbsBegin();
204 global.FinestAbsEnd() = grid.Global().FinestAbsEnd();
205 global.FinestAbsSize() = grid.Global().FinestAbsSize();
206
207 global.GlobalSize() = (grid.Global().GlobalSize() - off)/2 + off;
208 global.BoundaryType() = grid_coarser.Global().BoundaryType();
209
210 global.LocalBegin() = grid.Global().LocalBegin();
211 global.LocalEnd() = grid.Global().LocalEnd();
212 GridIndexTranslations::FineToCoarse(global.LocalBegin(), global.LocalEnd());
213
214 global.LocalBegin() += grid_coarser.Global().GlobalFinerBegin();
215 global.LocalEnd() += grid_coarser.Global().GlobalFinerBegin();
216
217 global.LocalSize() = global.LocalEnd() - global.LocalBegin();
218
219 if (global.LocalSize().Product() == 0) {
220 global.LocalBegin() = 0;
221 global.LocalEnd() = 0;
222 global.LocalSize() = 0;
223 global.BoundaryType() = EmptyGrid;
224 }
225
226 global.LocalFinerBegin() = global.LocalBegin();
227 global.LocalFinerEnd() = global.LocalEnd();
228 global.LocalFinerSize() = global.LocalSize();
229
230 local.SizeTotal() = global.LocalSize();
231 local.Size() = global.LocalSize();
232 local.Begin() = 0;
233 local.End() = global.LocalSize();
234
235 for (int i=0; i<3; ++i) {
236
237 if (grid.Local().HaloSize1()[i] > 0) {
238 local.SizeTotal()[i] += grid.Local().HaloSize1()[i];
239 local.Begin()[i] += grid.Local().HaloSize1()[i];
240 local.End()[i] += grid.Local().HaloSize1()[i];
241 local.HaloBegin1()[i] = 0;
242 local.HaloEnd1()[i] = grid.Local().HaloSize1()[i];
243 }else {
244 local.HaloBegin1()[i] = 0;
245 local.HaloEnd1()[i] = 0;
246 }
247
248 if (grid.Local().BoundarySize1()[i]> 0) {
249 local.Size()[i] -= grid.Local().BoundarySize1()[i];
250 local.Begin()[i] += grid.Local().BoundarySize1()[i];
251 local.BoundaryBegin1()[i] = 0;
252 local.BoundaryEnd1()[i] = grid.Local().BoundarySize1()[i];
253 }else {
254 local.BoundaryBegin1()[i] = 0;
255 local.BoundaryEnd1()[i] = 0;
256 }
257
258 if (grid.Local().HaloSize2()[i] > 0) {
259 local.SizeTotal()[i] += grid.Local().HaloSize2()[i];
260 local.HaloBegin2()[i] = local.End()[i];
261 local.HaloEnd2()[i] = local.End()[i] + grid.Local().HaloSize2()[i];
262 }else {
263 local.HaloBegin2()[i] = 0;
264 local.HaloEnd2()[i] = 0;
265 }
266
267 if (grid.Local().BoundarySize2()[i] > 0) {
268 local.Size()[i] -= grid.Local().BoundarySize2()[i];
269 local.End()[i] -= grid.Local().BoundarySize2()[i];
270 local.BoundaryBegin2()[i] = local.End()[i];
271 local.BoundaryEnd2()[i] = local.End()[i] + grid.Local().BoundarySize2()[i];
272 }else {
273 local.BoundaryBegin2()[i] = 0;
274 local.BoundaryEnd2()[i] = 0;
275 }
276
277 }
278
279 local.HaloSize1() = local.HaloEnd1() - local.HaloBegin1();
280 local.HaloSize2() = local.HaloEnd2() - local.HaloBegin2();
281 local.BoundarySize1() = local.BoundaryEnd1() - local.BoundaryBegin1();
282 local.BoundarySize2() = local.BoundaryEnd2() - local.BoundaryBegin2();
283
284 local.FinerBegin() = local.Begin();
285 local.FinerEnd() = local.End();
286 local.FinerSize() = local.Size();
287
288 Extent().Size() = grid.Extent().Size();
289 Extent().Begin() = grid.Extent().Begin();
290 Extent().End() = grid.Extent().End();
291 Extent().MeshWidth() = 2.0 * grid.Extent().MeshWidth();
292
293 iterators.SetSubgrids(local);
294 Allocate();
295}
296
297void TempGrid::ImportFromResidual(Grid& sol, Grid& rhs)
298{
299 Grid::iterator iter;
300
301 const vmg_float prefactor = MG::GetDiscretization()->OperatorPrefactor(sol);
302 const Stencil& A = MG::GetDiscretization()->GetStencil();
303
304 this->Clear();
305
306 MG::GetComm()->CommToGhosts(sol);
307
308 for (iter=Iterators().Local().Begin(); iter!=Iterators().Local().End(); ++iter)
309 (*this)(*iter) = rhs.GetVal(*iter) - prefactor * A.Apply(sol, *iter);
310}
311
312void TempGrid::Allocate()
313{
314 const int size = local.SizeTotal().Product();
315
316 if (size > size_max) {
317 size_max = size;
318 delete [] grid;
319 grid = new vmg_float[size];
320 }
321}
322
323TempGrid::TempGrid() :
324 size_max(0)
325{
326}
327
328TempGrid::TempGrid(const Grid& rhs) :
329 size_max(0)
330{
331 SetProperties(rhs);
332}
333
334TempGrid::TempGrid(const GlobalIndices& global, const LocalIndices& local, const SpatialExtent& extent) :
335 size_max(0)
336{
337 SetProperties(global, local, extent);
338}
339
340TempGrid::TempGrid(const Index& size, const Index& halo_size,
341 const Vector& spatial_begin, const Vector& spatial_end) :
342 size_max(0)
343{
344 SetProperties(size, halo_size, spatial_begin, spatial_end);
345}
346
347TempGrid::~TempGrid()
348{
349}
Note: See TracBrowser for help on using the repository browser.