source: src/grid/tempgrid.cpp@ fcf7f6

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

vmg: Added license files and headers (GPLv3).

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

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