source: src/mg.cpp@ 36d56c

Last change on this file since 36d56c 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: 7.5 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 mg.cpp
21 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
22 * @date Sat Jun 12 20:36:24 2010
23 *
24 * @brief A multigrid solver
25 *
26 * This file contains the implementation of the main class for
27 * a multigrid solver.
28 *
29 */
30
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
[76e019]35#ifdef DEBUG_MEASURE_TIME
36#ifdef HAVE_MPI
37#include <mpi.h>
[ac6d04]38#ifdef HAVE_MARMOT
39#include <enhancempicalls.h>
40#include <sourceinfompicalls.h>
41#endif
[76e019]42#endif
43#endif
44
[48b662]45#include <cmath>
46#include <cstdio>
47#include <cfloat>
48#include <ctime>
49#include <string>
50#include <fstream>
51#include <sstream>
52
53#include "base/command_list.hpp"
54#include "base/discretization.hpp"
55#include "base/factory.hpp"
[f003a9]56#include "base/interface.hpp"
[dfed1c]57#include "base/timer.hpp"
[48b662]58#include "comm/comm.hpp"
[dfed1c]59#include "grid/grid.hpp"
[48b662]60#include "grid/tempgrid.hpp"
61#include "level/level_operator.hpp"
62#include "smoother/smoother.hpp"
63#include "solver/solver.hpp"
64#include "mg.hpp"
65
66using namespace VMG;
67
68#define REGISTER_COMMAND(a) extern void Initialize##a();Initialize##a();
69
[dfed1c]70VMG::CommandFactory MG::command_factory;
[48b662]71
72static void VMGRegisterBuiltinCommands()
73{
74 REGISTER_COMMAND(VMGCommandCheckConsistency);
75 REGISTER_COMMAND(VMGCommandCheckIterationCounter);
76 REGISTER_COMMAND(VMGCommandCheckRelativeResidual);
77 REGISTER_COMMAND(VMGCommandCheckResidual);
78 REGISTER_COMMAND(VMGCommandClearCoarseLevels);
79 REGISTER_COMMAND(VMGCommandClearGrid);
[dfed1c]80 REGISTER_COMMAND(VMGCommandComputeResidualNorm);
[48b662]81 REGISTER_COMMAND(VMGCommandCopyBoundary);
82 REGISTER_COMMAND(VMGCommandExecuteCycle);
83 REGISTER_COMMAND(VMGCommandExecuteCycleLoop);
84 REGISTER_COMMAND(VMGCommandExecuteFullCycle);
85 REGISTER_COMMAND(VMGCommandExecuteFullCycleLoop);
86 REGISTER_COMMAND(VMGCommandExportSolution);
87 REGISTER_COMMAND(VMGCommandForceDiscreteCompatibility);
88 REGISTER_COMMAND(VMGCommandImportRightHandSide);
89 REGISTER_COMMAND(VMGCommandInterpolateFMG);
[dfed1c]90 REGISTER_COMMAND(VMGCommandInitializeIterationCounter);
[48b662]91 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
[dfed1c]92 REGISTER_COMMAND(VMGCommandNOP);
93 REGISTER_COMMAND(VMGCommandPrintAllSettings);
[48b662]94 REGISTER_COMMAND(VMGCommandPrintDefect);
95 REGISTER_COMMAND(VMGCommandPrintGridStructure);
96 REGISTER_COMMAND(VMGCommandPrintGrid);
97 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
[dfed1c]98 REGISTER_COMMAND(VMGCommandPrintRunningTime);
[48b662]99 REGISTER_COMMAND(VMGCommandProlongate);
100 REGISTER_COMMAND(VMGCommandRestrict);
101 REGISTER_COMMAND(VMGCommandSetAverageToZero);
102 REGISTER_COMMAND(VMGCommandSetCoarserDirichletValues);
103 REGISTER_COMMAND(VMGCommandSetLevel);
104 REGISTER_COMMAND(VMGCommandSmooth);
105 REGISTER_COMMAND(VMGCommandSolve);
106}
107
108MG::MG()
109{
[dfed1c]110 state = 0;
[48b662]111 VMGRegisterBuiltinCommands();
112}
113
114MG::~MG()
115{
116 MG::Destroy();
117}
118
119// Brings Multigrid back to starting state.
120void MG::Destroy()
121{
[dfed1c]122 MG::Instance()->factories.clear();
123 MG::Instance()->state = 0;
124 Timer::Clear();
[48b662]125}
126
127void MG::SetInterface(VMG::Interface* interface, VMG::Comm* comm)
128{
129 interface->Register("INTERFACE");
130
131 Multigrid* sol = new Multigrid(comm, interface);
132 Multigrid* rhs = new Multigrid(comm, interface);
[dfed1c]133 TempGrid* temp = new TempGrid();
[48b662]134
135 sol->Register("SOL");
136 rhs->Register("RHS");
137 temp->Register("TEMPGRID");
138
139 new ObjectStorage<int>("GLOBAL_MAXLEVEL", sol->GlobalMaxLevel());
140 new ObjectStorage<int>("MINLEVEL", sol->MinLevel());
141 new ObjectStorage<int>("MAXLEVEL", sol->MaxLevel());
142}
143
[894a5f]144/*
145 * Post init communication class
146 */
147void MG::PostInit()
148{
149 GetComm()->PostInit(*GetSol(), *GetRhs());
150}
151
[48b662]152/**
153 * Solves a given system with a multigrid method
154 *
155 */
156void MG::Solve()
157{
[dfed1c]158#ifdef DEBUG_MEASURE_TIME
159#ifdef HAVE_MPI
160 MPI_Barrier(MPI_COMM_WORLD);
161#endif
[ac6d04]162 Timer::Start("CompleteRunningTime");
[dfed1c]163#endif
164
165 CommandList* cl_init = MG::GetFactory().Get("COMMANDLIST_INIT")->Cast<CommandList>();
166 CommandList* cl_loop = MG::GetFactory().Get("COMMANDLIST_LOOP")->Cast<CommandList>();
167 CommandList* cl_finalize = MG::GetFactory().Get("COMMANDLIST_FINALIZE")->Cast<CommandList>();
[48b662]168
169 cl_init->ExecuteList();
170
171 while (cl_loop->ExecuteList() == Continue);
172
173 cl_finalize->ExecuteList();
[dfed1c]174
175#ifdef DEBUG_MEASURE_TIME
176#ifdef HAVE_MPI
177 MPI_Barrier(MPI_COMM_WORLD);
[ac6d04]178#endif
[dfed1c]179 Timer::Stop("CompleteRunningTime");
[ac6d04]180#ifdef DEBUG_MEASURE_TIME_OUTPUT
181#ifdef HAVE_MPI
182 Timer::PrintGlobal();
183#else
184 Timer::Print();
185#endif
[dfed1c]186#endif
187#endif
188}
189
190void MG::SetState(const int& state_)
191{
192 MG::Instance()->state = state_;
193}
194
195VMG::Factory& MG::GetFactory()
196{
197 std::map<int, VMG::Factory>::iterator iter = MG::Instance()->factories.find(MG::Instance()->state);
198
199 if (iter == MG::Instance()->factories.end())
200 iter = MG::Instance()->factories.insert(std::make_pair(MG::Instance()->state, Factory())).first;
201
202 assert(iter != MG::Instance()->factories.end());
203
204 return iter->second;
205}
206
207VMG::CommandFactory& MG::GetCommands()
208{
209 return MG::command_factory;
[48b662]210}
211
212Comm* MG::GetComm()
213{
[dfed1c]214 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
[48b662]215}
216
217Discretization* MG::GetDiscretization()
218{
[dfed1c]219 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
[48b662]220}
221
222LevelOperator* MG::GetLevelOperator()
223{
[dfed1c]224 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
[48b662]225}
226
227Multigrid* MG::GetRhs()
228{
[dfed1c]229 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
[48b662]230}
231
232Multigrid* MG::GetSol()
233{
[dfed1c]234 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
[48b662]235}
236
[4571da]237VMG::Grid& MG::GetRhsMaxLevel()
238{
239 return (*MG::GetRhs())(MG::GetRhs()->MaxLevel());
240}
241
242VMG::Grid& MG::GetSolMaxLevel()
243{
244 return (*MG::GetSol())(MG::GetSol()->MaxLevel());
245}
246
[48b662]247Smoother* MG::GetSmoother()
248{
[dfed1c]249 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
[48b662]250}
251
252Solver* MG::GetSolver()
253{
[dfed1c]254 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
[48b662]255}
256
257TempGrid* MG::GetTempGrid()
258{
[dfed1c]259 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
[48b662]260}
261
262Interface* MG::GetInterface()
263{
[dfed1c]264 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
[48b662]265}
266
267static bool CheckObject(std::string id)
268{
[dfed1c]269 Object *obj = MG::GetFactory().Get(id);
[48b662]270
[dfed1c]271#ifdef DEBUG_OUTPUT
[48b662]272 if (obj == NULL)
273 printf("\nMultigrid: CLASS %s NOT INITIALIZED\n\n", id.c_str());
274#endif
275
276 return obj != NULL;
277}
278
279bool MG::IsInitialized()
280{
281 bool init = true;
282
283 init &= CheckObject("COMM");
284 init &= CheckObject("LEVEL_OPERATOR");
285 init &= CheckObject("RHS");
286 init &= CheckObject("SOL");
287 init &= CheckObject("SOLVER");
288 init &= CheckObject("SMOOTHER");
289 init &= CheckObject("DISCRETIZATION");
290 init &= CheckObject("MAX_ITERATION");
291 init &= CheckObject("PRECISION");
292 init &= CheckObject("PRESMOOTHSTEPS");
293 init &= CheckObject("POSTSMOOTHSTEPS");
294 init &= CheckObject("COMMANDLIST_INIT");
295 init &= CheckObject("COMMANDLIST_LOOP");
296 init &= CheckObject("COMMANDLIST_FINALIZE");
297 init &= CheckObject("MINLEVEL");
298 init &= CheckObject("MAXLEVEL");
299 init &= CheckObject("GLOBAL_MAXLEVEL");
300 init &= CheckObject("INTERFACE");
301
302 return init;
303}
Note: See TracBrowser for help on using the repository browser.