/** * @file grid.cpp * @author Julian Iseringhausen * @date Mon Apr 18 12:53:27 2011 * * @brief VMG::Grid * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "base/helper.hpp" #include "comm/comm.hpp" #include "grid/grid.hpp" #include "grid/tempgrid.hpp" #include "mg.hpp" using namespace VMG; vmg_float Grid::correction; Grid::Grid(const Comm* comm, const Index& size, const vmg_float& width) { grid = new vmg_float[size.Product()]; global.Size() = size; global.Begin() = 0; global.End() = size; local.SizeTotal() = size; local.HaloBegin1() = 0; local.HaloBegin2() = 0; local.HaloEnd1() = 0; local.HaloEnd2() = 0; extent.MeshWidth() = width; if (comm->BoundaryConditions() == Dirichlet || comm->BoundaryConditions() == Quasiperiodic) { local.Size() = size - 2; local.Begin() = 1; local.End() = size-1; local.BoundaryBegin1() = 0; local.BoundaryEnd1() = 1; local.BoundaryBegin2() = size-1; local.BoundaryEnd2() = size; }else if (comm->BoundaryConditions() == Periodic) { local.Size() = size; local.Begin() = 0; local.End() = 0; local.BoundaryBegin1() = 0; local.BoundaryEnd1() = 0; local.BoundaryBegin2() = 0; local.BoundaryEnd2() = 0; } } void Grid::InitGrid() { grid = new vmg_float[local.SizeTotal().Product()]; } void Grid::Clear() { for (int i=0; iAllReduce(val); if (fabs(val) <= Global().Size().Product() * std::numeric_limits::epsilon()) { #ifdef DEBUGVERBOSE printf("Multigrid: Right hand side satisfies compatibility condition.\n"); #endif }else { printf("Multigrid: Right hand side does NOT satisfy the compatibility condition.\n\tTotal sum: %e\nForcing compatibility condition now\n", val); val *= MeshWidth() * MeshWidth() * MeshWidth(); for (int i=Local().Begin().X(); iSetProperties(*this); temp->SetGrid(*this); MG::GetComm()->CommToGhosts(*temp); for (int i=Local().Begin().X(); iGetVal(i,j,k); for (iter=stencil.begin(); iter!=stencil.end(); ++iter) (*this)(i,j,k) += iter->val * temp->GetVal(i+iter->m, j+iter->n, k+iter->o); } } bool Grid::IsCompatible(const Grid& rhs) const { bool eq = true; eq &= Helper::IsEq(Local().Begin(), rhs.Local().Begin(), "Local().Begin"); eq &= Helper::IsEq(Local().End(), rhs.Local().End(), "Local().End"); eq &= Helper::IsEq(Local().Size(), rhs.Local().Size(), "Local().Size"); eq &= Helper::IsEq(Local().SizeTotal(), rhs.Local().SizeTotal(), "Local().SizeTotal"); eq &= Helper::IsEq(Global().Begin(), rhs.Global().Begin(), "Global().Begin"); eq &= Helper::IsEq(Global().End(), rhs.Global().End(), "Global().End"); eq &= Helper::IsEq(Global().Size(), rhs.Global().Size(), "Global().Size"); eq &= Helper::IsEq(Local().HaloBegin1(), rhs.Local().HaloBegin1(), "Local().HaloBegin1"); eq &= Helper::IsEq(Local().HaloBegin2(), rhs.Local().HaloBegin2(), "Local().HaloBegin2"); eq &= Helper::IsEq(Local().HaloEnd1(), rhs.Local().HaloEnd1(), "Local().HaloEnd1"); eq &= Helper::IsEq(Local().HaloEnd2(), rhs.Local().HaloEnd2(), "Local().HaloEnd2"); eq &= Helper::IsEq(MeshWidth(), rhs.MeshWidth(), "MeshWidth"); return eq; } bool Grid::IsConsistent() const { bool consistent = true; for (int i=0; i