source: src/mg.cpp@ fcf7f6

Last change on this file since fcf7f6 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
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
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);
133 TempGrid* temp = new TempGrid();
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
144/*
145 * Post init communication class
146 */
147void MG::PostInit()
148{
149 GetComm()->PostInit(*GetSol(), *GetRhs());
150}
151
152/**
153 * Solves a given system with a multigrid method
154 *
155 */
156void MG::Solve()
157{
158#ifdef DEBUG_MEASURE_TIME
159#ifdef HAVE_MPI
160 MPI_Barrier(MPI_COMM_WORLD);
161#endif
162 Timer::Start("CompleteRunningTime");
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>();
168
169 cl_init->ExecuteList();
170
171 while (cl_loop->ExecuteList() == Continue);
172
173 cl_finalize->ExecuteList();
174
175#ifdef DEBUG_MEASURE_TIME
176#ifdef HAVE_MPI
177 MPI_Barrier(MPI_COMM_WORLD);
178#endif
179 Timer::Stop("CompleteRunningTime");
180#ifdef DEBUG_MEASURE_TIME_OUTPUT
181#ifdef HAVE_MPI
182 Timer::PrintGlobal();
183#else
184 Timer::Print();
185#endif
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;
210}
211
212Comm* MG::GetComm()
213{
214 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
215}
216
217Discretization* MG::GetDiscretization()
218{
219 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
220}
221
222LevelOperator* MG::GetLevelOperator()
223{
224 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
225}
226
227Multigrid* MG::GetRhs()
228{
229 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
230}
231
232Multigrid* MG::GetSol()
233{
234 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
235}
236
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
247Smoother* MG::GetSmoother()
248{
249 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
250}
251
252Solver* MG::GetSolver()
253{
254 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
255}
256
257TempGrid* MG::GetTempGrid()
258{
259 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
260}
261
262Interface* MG::GetInterface()
263{
264 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
265}
266
267static bool CheckObject(std::string id)
268{
269 Object *obj = MG::GetFactory().Get(id);
270
271#ifdef DEBUG_OUTPUT
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.