source: src/grid/tempgrid.cpp@ 8180d8

Last change on this file since 8180d8 was 8180d8, checked in by Julian Iseringhausen <julian.iseringhausen@…>, 13 years ago

Merge stashed open boundary stuff.

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