source: src/grid/tempgrid.cpp@ f57182

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

Open boundary conditions.

Conflicts:

lib/vmg/src/Makefile.am
lib/vmg/src/base/factory.cpp
lib/vmg/test/unit_test/library/dirichlet_fas_lr_mpi.cpp

  • Property mode set to 100644
File size: 11.1 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.GlobalSize() = size;
74 global.BoundaryType() = BTUndefined;
75
76 local.Begin() = halo_size;
77 local.End() = this->local.Begin() + size;
78 local.Size() = size;
79 local.SizeTotal() = size + 2 * halo_size;
80 local.HaloBegin1() = 0;
81 local.HaloEnd1() = halo_size;
82 local.HaloSize1() = halo_size;
83 local.HaloBegin2() = this->local.End();
84 local.HaloEnd2() = this->local.HaloBegin2() = halo_size;
85 local.HaloSize2() = halo_size;
86 local.BoundaryBegin1() = 0;
87 local.BoundaryEnd1() = 0;
88 local.BoundarySize1() = 0;
89 local.BoundaryBegin2() = 0;
90 local.BoundaryEnd2() = 0;
91 local.BoundarySize2() = 0;
92 local.FinerBegin() = 0;
93 local.FinerEnd() = 0;
94 local.FinerSize() = 0;
95
96 extent.Begin() = spatial_begin;
97 extent.End() = spatial_end;
98 extent.Size() = spatial_end - spatial_begin;
99 extent.MeshWidth() = this->extent.Size() / static_cast<Vector>(size-1);
100
101 Allocate();
102}
103
104void TempGrid::SetPropertiesToFiner(const Grid& grid, const Boundary& boundary)
105{
106 assert(grid.Father() != NULL);
107 assert(grid.Level() < grid.Father()->MaxLevel());
108
109 const Grid& grid_finer = (*grid.Father())(grid.Level()+1);
110 const Index off = GridIndexTranslations::EndOffset(boundary);
111
112 /*
113 * Set global grid attributes
114 */
115
116 level = grid.Level() + 1;
117
118 global.BoundaryType() = grid_finer.Global().BoundaryType();
119
120 global.GlobalFinerBegin() = 0;
121 global.GlobalFinerEnd() = 0;
122 global.GlobalFinerSize() = 0;
123
124 global.LocalFinerBegin() = 0;
125 global.LocalFinerEnd() = 0;
126 global.LocalFinerSize() = 0;
127
128 global.LocalBegin() = 2 * (grid.Global().LocalFinerBegin() - grid.Global().GlobalFinerBegin());
129 global.LocalEnd() = 2 * (grid.Global().LocalFinerEnd() - grid.Global().GlobalFinerBegin() - off) + off;
130 global.LocalSize() = global.LocalEnd() - global.LocalBegin();
131
132 global.GlobalSize() = 2 * (grid.Global().GlobalFinerSize() - off) + off;
133
134 for (int j=0; j<3; ++j) {
135
136 if (boundary[j] == Dirichlet ||
137 boundary[j] == Open) {
138
139 if (grid.Global().BoundaryType() == LocallyRefined) {
140
141 global.GlobalSize()[j] += 2;
142 global.LocalBegin()[j] += 1;
143 global.LocalEnd()[j] +=1;
144
145 } else if (grid.Global().BoundaryType() == GlobalMax) {
146
147 global.GlobalSize()[j] += 2;
148 global.LocalBegin()[j] += 1;
149 global.LocalEnd()[j] +=1;
150
151 }
152
153 } else {
154
155 }
156
157 }
158
159 global.LocalSize() = global.LocalEnd() - global.LocalBegin();
160 if (global.LocalSize().Product() == 0) {
161 global.LocalBegin() = 0;
162 global.LocalEnd() = 0;
163 global.LocalSize() = 0;
164 global.BoundaryType() = EmptyGrid;
165 }
166
167 local.FinerBegin() = 0;
168 local.FinerEnd() = 0;
169 local.FinerSize() = 0;
170
171 local.Begin() = 0;
172 local.End() = global.LocalSize();
173 local.Size() = global.LocalSize();
174 local.SizeTotal() = global.LocalSize();
175
176 local.HaloBegin1() = 0;
177 local.HaloEnd1() = 0;
178 local.HaloBegin2() = 0;
179 local.HaloEnd2() = 0;
180
181 local.BoundaryBegin1() = 0;
182 local.BoundaryEnd1() = 0;
183 local.BoundaryBegin2() = 0;
184 local.BoundaryEnd2() = 0;
185
186 for (int i=0; i<3; ++i) {
187
188 if (grid.Local().HaloSize1()[i] > 0) {
189 local.Begin()[i] += grid.Local().HaloSize1()[i];
190 local.End()[i] += grid.Local().HaloSize1()[i];
191 local.HaloEnd1()[i] = grid.Local().HaloSize1()[i];
192 }
193
194 if (grid.Local().BoundarySize1()[i] > 0 && global.BoundaryType() != LocallyRefined) {
195 local.Size()[i] -= grid.Local().BoundarySize1()[i];
196 local.Begin()[i] += grid.Local().BoundarySize1()[i];
197 local.BoundaryEnd1()[i] = grid.Local().BoundarySize1()[i];
198 }
199
200 if (grid.Local().HaloSize2()[i] > 0) {
201 local.HaloBegin2()[i] = local.End()[i];
202 local.HaloEnd2()[i] = local.End()[i] + grid.Local().HaloSize2()[i];
203 }
204
205 if (grid.Local().BoundarySize2()[i] > 0 && global.BoundaryType() != LocallyRefined) {
206 local.Size()[i] -= grid.Local().BoundarySize2()[i];
207 local.End()[i] -= grid.Local().BoundarySize2()[i];
208 local.BoundaryBegin2()[i] = local.End()[i];
209 local.BoundaryEnd2()[i] = local.End()[i] + grid.Local().BoundarySize2()[i];
210 }
211
212 }
213
214 local.HaloSize1() = local.HaloEnd1() - local.HaloBegin1();
215 local.HaloSize2() = local.HaloEnd2() - local.HaloBegin2();
216 local.BoundarySize1() = local.BoundaryEnd1() - local.BoundaryBegin1();
217 local.BoundarySize2() = local.BoundaryEnd2() - local.BoundaryBegin2();
218 local.Size() = local.End() - local.Begin();
219 local.SizeTotal() = local.Size() +
220 local.HaloSize1() + local.HaloSize2() +
221 local.BoundarySize1() + local.BoundarySize2();
222
223 extent = grid_finer.Extent();
224
225 iterators.SetSubgrids(local);
226
227 Allocate();
228}
229
230void TempGrid::SetPropertiesToCoarser(const Grid& grid, const Boundary& boundary)
231{
232 assert(grid.Father() != NULL);
233 assert(grid.Level() > grid.Father()->MinLevel());
234
235 const Grid& grid_coarser = (*grid.Father())(grid.Level()-1);
236 const Index off = GridIndexTranslations::EndOffset(boundary);
237
238 level = grid.Level() - 1;
239
240 global.GlobalFinerBegin() = grid_coarser.Global().GlobalFinerBegin();
241 global.GlobalFinerEnd() = grid_coarser.Global().GlobalFinerEnd();
242 global.GlobalFinerSize() = grid_coarser.Global().GlobalFinerSize();
243
244 global.GlobalSize() = (grid.Global().GlobalSize() - off)/2 + off;
245 global.BoundaryType() = grid_coarser.Global().BoundaryType();
246
247 global.LocalBegin() = grid.Global().LocalBegin();
248 global.LocalEnd() = grid.Global().LocalEnd();
249 GridIndexTranslations::FineToCoarse(global.LocalBegin(), global.LocalEnd());
250
251 global.LocalBegin() += grid_coarser.Global().GlobalFinerBegin();
252 global.LocalEnd() += grid_coarser.Global().GlobalFinerBegin();
253
254 global.LocalSize() = global.LocalEnd() - global.LocalBegin();
255
256 if (global.LocalSize().Product() == 0) {
257 global.LocalBegin() = 0;
258 global.LocalEnd() = 0;
259 global.LocalSize() = 0;
260 global.BoundaryType() = EmptyGrid;
261 }
262
263 global.LocalFinerBegin() = global.LocalBegin();
264 global.LocalFinerEnd() = global.LocalEnd();
265 global.LocalFinerSize() = global.LocalSize();
266
267 local.SizeTotal() = global.LocalSize();
268 local.Size() = global.LocalSize();
269 local.Begin() = 0;
270 local.End() = global.LocalSize();
271
272 for (int i=0; i<3; ++i) {
273
274 if (grid.Local().HaloSize1()[i] > 0) {
275 local.SizeTotal()[i] += grid.Local().HaloSize1()[i];
276 local.Begin()[i] += grid.Local().HaloSize1()[i];
277 local.End()[i] += grid.Local().HaloSize1()[i];
278 local.HaloBegin1()[i] = 0;
279 local.HaloEnd1()[i] = grid.Local().HaloSize1()[i];
280 }else {
281 local.HaloBegin1()[i] = 0;
282 local.HaloEnd1()[i] = 0;
283 }
284
285 if (grid.Local().BoundarySize1()[i]> 0) {
286 local.Size()[i] -= grid.Local().BoundarySize1()[i];
287 local.Begin()[i] += grid.Local().BoundarySize1()[i];
288 local.BoundaryBegin1()[i] = 0;
289 local.BoundaryEnd1()[i] = grid.Local().BoundarySize1()[i];
290 }else {
291 local.BoundaryBegin1()[i] = 0;
292 local.BoundaryEnd1()[i] = 0;
293 }
294
295 if (grid.Local().HaloSize2()[i] > 0) {
296 local.SizeTotal()[i] += grid.Local().HaloSize2()[i];
297 local.HaloBegin2()[i] = local.End()[i];
298 local.HaloEnd2()[i] = local.End()[i] + grid.Local().HaloSize2()[i];
299 }else {
300 local.HaloBegin2()[i] = 0;
301 local.HaloEnd2()[i] = 0;
302 }
303
304 if (grid.Local().BoundarySize2()[i] > 0) {
305 local.Size()[i] -= grid.Local().BoundarySize2()[i];
306 local.End()[i] -= grid.Local().BoundarySize2()[i];
307 local.BoundaryBegin2()[i] = local.End()[i];
308 local.BoundaryEnd2()[i] = local.End()[i] + grid.Local().BoundarySize2()[i];
309 }else {
310 local.BoundaryBegin2()[i] = 0;
311 local.BoundaryEnd2()[i] = 0;
312 }
313
314 }
315
316 local.HaloSize1() = local.HaloEnd1() - local.HaloBegin1();
317 local.HaloSize2() = local.HaloEnd2() - local.HaloBegin2();
318 local.BoundarySize1() = local.BoundaryEnd1() - local.BoundaryBegin1();
319 local.BoundarySize2() = local.BoundaryEnd2() - local.BoundaryBegin2();
320
321 local.FinerBegin() = local.Begin();
322 local.FinerEnd() = local.End();
323 local.FinerSize() = local.Size();
324
325 Extent().Size() = grid.Extent().Size();
326 Extent().Begin() = grid.Extent().Begin();
327 Extent().End() = grid.Extent().End();
328 Extent().MeshWidth() = 2.0 * grid.Extent().MeshWidth();
329
330 iterators.SetSubgrids(local);
331 Allocate();
332}
333
334void TempGrid::ImportFromResidual(Grid& sol, Grid& rhs)
335{
336 Grid::iterator iter;
337
338 const vmg_float prefactor = MG::GetDiscretization()->OperatorPrefactor(sol);
339 const Stencil& A = MG::GetDiscretization()->GetStencil();
340
341 this->Clear();
342
343 MG::GetComm()->CommToGhosts(sol);
344
345 for (iter=Iterators().Local().Begin(); iter!=Iterators().Local().End(); ++iter)
346 (*this)(*iter) = rhs.GetVal(*iter) - prefactor * A.Apply(sol, *iter);
347
348 this->ClearBoundary();
349}
350
351void TempGrid::Allocate()
352{
353 const int size = local.SizeTotal().Product();
354
355 if (size > size_max) {
356 size_max = size;
357 delete [] grid;
358 grid = new vmg_float[size];
359 }
360}
361
362TempGrid::TempGrid() :
363 size_max(0)
364{
365}
366
367TempGrid::TempGrid(const Grid& rhs) :
368 size_max(0)
369{
370 SetProperties(rhs);
371}
372
373TempGrid::TempGrid(const GlobalIndices& global, const LocalIndices& local, const SpatialExtent& extent) :
374 size_max(0)
375{
376 SetProperties(global, local, extent);
377}
378
379TempGrid::TempGrid(const Index& size, const Index& halo_size,
380 const Vector& spatial_begin, const Vector& spatial_end) :
381 size_max(0)
382{
383 SetProperties(size, halo_size, spatial_begin, spatial_end);
384}
385
386TempGrid::~TempGrid()
387{
388}
Note: See TracBrowser for help on using the repository browser.