source: src/grid/tempgrid.cpp@ e85cfd

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

Work.

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