source: src/mg.cpp@ a24b80

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

Simplified API.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1873 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 7.4 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 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
35#ifdef DEBUG_MEASURE_TIME
36#ifdef HAVE_MPI
37#include <mpi.h>
38#ifdef HAVE_MARMOT
39#include <enhancempicalls.h>
40#include <sourceinfompicalls.h>
41#endif
42#endif
43#endif
44
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"
56#include "base/interface.hpp"
57#include "base/timer.hpp"
58#include "comm/comm.hpp"
59#include "grid/grid.hpp"
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
70VMG::CommandFactory MG::command_factory;
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);
80 REGISTER_COMMAND(VMGCommandComputeResidualNorm);
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);
90 REGISTER_COMMAND(VMGCommandInitializeIterationCounter);
91 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
92 REGISTER_COMMAND(VMGCommandNOP);
93 REGISTER_COMMAND(VMGCommandPrintAllSettings);
94 REGISTER_COMMAND(VMGCommandPrintDefect);
95 REGISTER_COMMAND(VMGCommandPrintGridStructure);
96 REGISTER_COMMAND(VMGCommandPrintGrid);
97 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
98 REGISTER_COMMAND(VMGCommandPrintRunningTime);
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{
110 state = 0;
111 VMGRegisterBuiltinCommands();
112}
113
114MG::~MG()
115{
116 MG::Destroy();
117}
118
119// Brings Multigrid back to starting state.
120void MG::Destroy()
121{
122 MG::Instance()->factories.clear();
123 MG::Instance()->state = 0;
124 Timer::Clear();
125}
126
127/*
128 * Post init communication class
129 */
130void MG::PostInit()
131{
132 Multigrid* sol = new Multigrid(GetComm(), GetInterface());
133 sol->Register("SOL");
134
135 Multigrid* rhs = new Multigrid(GetComm(), GetInterface());
136 rhs->Register("RHS");
137
138 TempGrid* temp = new TempGrid();
139 temp->Register("TEMPGRID");
140
141 new ObjectStorage<int>("GLOBAL_MAXLEVEL", sol->GlobalMaxLevel());
142 new ObjectStorage<int>("MINLEVEL", sol->MinLevel());
143 new ObjectStorage<int>("MAXLEVEL", sol->MaxLevel());
144
145 GetComm()->PostInit(*GetSol(), *GetRhs());
146}
147
148/**
149 * Solves a given system with a multigrid method
150 *
151 */
152void MG::Solve()
153{
154#ifdef DEBUG_MEASURE_TIME
155#ifdef HAVE_MPI
156 GetComm()->Barrier();
157#endif
158 Timer::Start("CompleteRunningTime");
159#endif
160
161 CommandList* cl_init = MG::GetFactory().Get("COMMANDLIST_INIT")->Cast<CommandList>();
162 CommandList* cl_loop = MG::GetFactory().Get("COMMANDLIST_LOOP")->Cast<CommandList>();
163 CommandList* cl_finalize = MG::GetFactory().Get("COMMANDLIST_FINALIZE")->Cast<CommandList>();
164
165 cl_init->ExecuteList();
166
167 while (cl_loop->ExecuteList() == Continue);
168
169 cl_finalize->ExecuteList();
170
171#ifdef DEBUG_MEASURE_TIME
172#ifdef HAVE_MPI
173 GetComm()->Barrier();
174#endif
175 Timer::Stop("CompleteRunningTime");
176#ifdef DEBUG_MEASURE_TIME_OUTPUT
177#ifdef HAVE_MPI
178 Timer::PrintGlobal();
179#else
180 Timer::Print();
181#endif
182#endif
183#endif
184}
185
186void MG::SetState(const int& state_)
187{
188 MG::Instance()->state = state_;
189}
190
191VMG::Factory& MG::GetFactory()
192{
193 std::map<int, VMG::Factory>::iterator iter = MG::Instance()->factories.find(MG::Instance()->state);
194
195 if (iter == MG::Instance()->factories.end())
196 iter = MG::Instance()->factories.insert(std::make_pair(MG::Instance()->state, Factory())).first;
197
198 assert(iter != MG::Instance()->factories.end());
199
200 return iter->second;
201}
202
203VMG::CommandFactory& MG::GetCommands()
204{
205 return MG::command_factory;
206}
207
208Comm* MG::GetComm()
209{
210 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
211}
212
213Discretization* MG::GetDiscretization()
214{
215 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
216}
217
218LevelOperator* MG::GetLevelOperator()
219{
220 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
221}
222
223Multigrid* MG::GetRhs()
224{
225 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
226}
227
228Multigrid* MG::GetSol()
229{
230 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
231}
232
233VMG::Grid& MG::GetRhsMaxLevel()
234{
235 return (*MG::GetRhs())(MG::GetRhs()->MaxLevel());
236}
237
238VMG::Grid& MG::GetSolMaxLevel()
239{
240 return (*MG::GetSol())(MG::GetSol()->MaxLevel());
241}
242
243Smoother* MG::GetSmoother()
244{
245 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
246}
247
248Solver* MG::GetSolver()
249{
250 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
251}
252
253TempGrid* MG::GetTempGrid()
254{
255 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
256}
257
258Interface* MG::GetInterface()
259{
260 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
261}
262
263static bool CheckObject(std::string id)
264{
265 Object *obj = MG::GetFactory().Get(id);
266
267#ifdef DEBUG_OUTPUT
268 if (obj == NULL)
269 printf("\nMultigrid: CLASS %s NOT INITIALIZED\n\n", id.c_str());
270#endif
271
272 return obj != NULL;
273}
274
275bool MG::IsInitialized()
276{
277 bool init = true;
278
279 init &= CheckObject("COMM");
280 init &= CheckObject("LEVEL_OPERATOR");
281 init &= CheckObject("RHS");
282 init &= CheckObject("SOL");
283 init &= CheckObject("SOLVER");
284 init &= CheckObject("SMOOTHER");
285 init &= CheckObject("DISCRETIZATION");
286 init &= CheckObject("MAX_ITERATION");
287 init &= CheckObject("PRECISION");
288 init &= CheckObject("PRESMOOTHSTEPS");
289 init &= CheckObject("POSTSMOOTHSTEPS");
290 init &= CheckObject("COMMANDLIST_INIT");
291 init &= CheckObject("COMMANDLIST_LOOP");
292 init &= CheckObject("COMMANDLIST_FINALIZE");
293 init &= CheckObject("MINLEVEL");
294 init &= CheckObject("MAXLEVEL");
295 init &= CheckObject("GLOBAL_MAXLEVEL");
296 init &= CheckObject("INTERFACE");
297
298 return init;
299}
Note: See TracBrowser for help on using the repository browser.