source: src/mg.cpp@ f57182

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

vmg: Work on output verbosity.

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

  • Property mode set to 100644
File size: 7.4 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
[d13e27]35#ifdef OUTPUT_TIMING
[76e019]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"
[b57b9b]59#include "cycles/cycle.hpp"
[dfed1c]60#include "grid/grid.hpp"
[48b662]61#include "grid/tempgrid.hpp"
62#include "level/level_operator.hpp"
63#include "smoother/smoother.hpp"
64#include "solver/solver.hpp"
65#include "mg.hpp"
66
67using namespace VMG;
68
69#define REGISTER_COMMAND(a) extern void Initialize##a();Initialize##a();
70
[dfed1c]71VMG::CommandFactory MG::command_factory;
[48b662]72
73static void VMGRegisterBuiltinCommands()
74{
75 REGISTER_COMMAND(VMGCommandCheckConsistency);
76 REGISTER_COMMAND(VMGCommandCheckIterationCounter);
77 REGISTER_COMMAND(VMGCommandCheckRelativeResidual);
78 REGISTER_COMMAND(VMGCommandCheckResidual);
79 REGISTER_COMMAND(VMGCommandClearCoarseLevels);
80 REGISTER_COMMAND(VMGCommandClearGrid);
[dfed1c]81 REGISTER_COMMAND(VMGCommandComputeResidualNorm);
[48b662]82 REGISTER_COMMAND(VMGCommandCopyBoundary);
83 REGISTER_COMMAND(VMGCommandExecuteCycle);
84 REGISTER_COMMAND(VMGCommandExecuteCycleLoop);
85 REGISTER_COMMAND(VMGCommandExecuteFullCycle);
86 REGISTER_COMMAND(VMGCommandExecuteFullCycleLoop);
87 REGISTER_COMMAND(VMGCommandExportSolution);
88 REGISTER_COMMAND(VMGCommandForceDiscreteCompatibility);
89 REGISTER_COMMAND(VMGCommandImportRightHandSide);
90 REGISTER_COMMAND(VMGCommandInterpolateFMG);
[dfed1c]91 REGISTER_COMMAND(VMGCommandInitializeIterationCounter);
[48b662]92 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
[dfed1c]93 REGISTER_COMMAND(VMGCommandNOP);
94 REGISTER_COMMAND(VMGCommandPrintAllSettings);
[48b662]95 REGISTER_COMMAND(VMGCommandPrintDefect);
96 REGISTER_COMMAND(VMGCommandPrintGridStructure);
97 REGISTER_COMMAND(VMGCommandPrintGrid);
98 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
[dfed1c]99 REGISTER_COMMAND(VMGCommandPrintRunningTime);
[48b662]100 REGISTER_COMMAND(VMGCommandProlongate);
101 REGISTER_COMMAND(VMGCommandRestrict);
102 REGISTER_COMMAND(VMGCommandSetAverageToZero);
103 REGISTER_COMMAND(VMGCommandSetCoarserDirichletValues);
104 REGISTER_COMMAND(VMGCommandSetLevel);
105 REGISTER_COMMAND(VMGCommandSmooth);
106 REGISTER_COMMAND(VMGCommandSolve);
107}
108
109MG::MG()
110{
[dfed1c]111 state = 0;
[48b662]112 VMGRegisterBuiltinCommands();
113}
114
115MG::~MG()
116{
117 MG::Destroy();
118}
119
120// Brings Multigrid back to starting state.
121void MG::Destroy()
122{
[dfed1c]123 MG::Instance()->factories.clear();
124 MG::Instance()->state = 0;
125 Timer::Clear();
[48b662]126}
127
[a24b80]128/*
129 * Post init communication class
130 */
131void MG::PostInit()
[48b662]132{
[b57b9b]133 if (GetFactory().TestObject("COMM") && GetFactory().TestObject("INTERFACE")) {
[a24b80]134
[b57b9b]135 Multigrid* sol = new Multigrid(GetComm(), GetInterface());
136 sol->Register("SOL");
[a24b80]137
[b57b9b]138 Multigrid* rhs = new Multigrid(GetComm(), GetInterface());
139 rhs->Register("RHS");
[48b662]140
[b57b9b]141 TempGrid* temp = new TempGrid();
142 temp->Register("TEMPGRID");
[48b662]143
[b57b9b]144 new ObjectStorage<int>("GLOBAL_MAXLEVEL", sol->GlobalMaxLevel());
145 new ObjectStorage<int>("MINLEVEL", sol->MinLevel());
146 new ObjectStorage<int>("MAXLEVEL", sol->MaxLevel());
147
148 if (GetFactory().TestObject("CYCLE"))
149 GetCycle()->Generate();
150
151 if (GetFactory().TestObject("COMM"))
152 GetComm()->PostInit(*GetSol(), *GetRhs());
153
154 }
[894a5f]155}
156
[48b662]157/**
158 * Solves a given system with a multigrid method
159 *
160 */
161void MG::Solve()
162{
[d13e27]163#ifdef OUTPUT_TIMING
[2a5451]164 GetComm()->Barrier();
[ac6d04]165 Timer::Start("CompleteRunningTime");
[dfed1c]166#endif
167
168 CommandList* cl_init = MG::GetFactory().Get("COMMANDLIST_INIT")->Cast<CommandList>();
169 CommandList* cl_loop = MG::GetFactory().Get("COMMANDLIST_LOOP")->Cast<CommandList>();
170 CommandList* cl_finalize = MG::GetFactory().Get("COMMANDLIST_FINALIZE")->Cast<CommandList>();
[48b662]171
172 cl_init->ExecuteList();
173
174 while (cl_loop->ExecuteList() == Continue);
175
176 cl_finalize->ExecuteList();
[dfed1c]177
[d13e27]178#ifdef OUTPUT_TIMING
[2a5451]179 GetComm()->Barrier();
[dfed1c]180 Timer::Stop("CompleteRunningTime");
[ac6d04]181#ifdef HAVE_MPI
182 Timer::PrintGlobal();
183#else
184 Timer::Print();
185#endif
[dfed1c]186#endif
187}
188
189void MG::SetState(const int& state_)
190{
191 MG::Instance()->state = state_;
192}
193
194VMG::Factory& MG::GetFactory()
195{
196 std::map<int, VMG::Factory>::iterator iter = MG::Instance()->factories.find(MG::Instance()->state);
197
198 if (iter == MG::Instance()->factories.end())
199 iter = MG::Instance()->factories.insert(std::make_pair(MG::Instance()->state, Factory())).first;
200
201 assert(iter != MG::Instance()->factories.end());
202
203 return iter->second;
204}
205
206VMG::CommandFactory& MG::GetCommands()
207{
208 return MG::command_factory;
[48b662]209}
210
211Comm* MG::GetComm()
212{
[dfed1c]213 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
[48b662]214}
215
[b57b9b]216Cycle* MG::GetCycle()
217{
218 return MG::GetFactory().Get("CYCLE")->Cast<VMG::Cycle>();
219}
220
[48b662]221Discretization* MG::GetDiscretization()
222{
[dfed1c]223 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
[48b662]224}
225
226LevelOperator* MG::GetLevelOperator()
227{
[dfed1c]228 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
[48b662]229}
230
231Multigrid* MG::GetRhs()
232{
[dfed1c]233 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
[48b662]234}
235
236Multigrid* MG::GetSol()
237{
[dfed1c]238 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
[48b662]239}
240
[4571da]241VMG::Grid& MG::GetRhsMaxLevel()
242{
243 return (*MG::GetRhs())(MG::GetRhs()->MaxLevel());
244}
245
246VMG::Grid& MG::GetSolMaxLevel()
247{
248 return (*MG::GetSol())(MG::GetSol()->MaxLevel());
249}
250
[48b662]251Smoother* MG::GetSmoother()
252{
[dfed1c]253 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
[48b662]254}
255
256Solver* MG::GetSolver()
257{
[dfed1c]258 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
[48b662]259}
260
261TempGrid* MG::GetTempGrid()
262{
[dfed1c]263 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
[48b662]264}
265
266Interface* MG::GetInterface()
267{
[dfed1c]268 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
[48b662]269}
270
271bool MG::IsInitialized()
272{
[b57b9b]273 const Factory& f = GetFactory();
274
[48b662]275 bool init = true;
276
[b57b9b]277 init &= f.TestObject("COMM");
278 init &= f.TestObject("LEVEL_OPERATOR");
279 init &= f.TestObject("RHS");
280 init &= f.TestObject("SOL");
281 init &= f.TestObject("SOLVER");
282 init &= f.TestObject("SMOOTHER");
283 init &= f.TestObject("DISCRETIZATION");
284 init &= f.TestObject("MAX_ITERATION");
285 init &= f.TestObject("PRECISION");
286 init &= f.TestObject("PRESMOOTHSTEPS");
287 init &= f.TestObject("POSTSMOOTHSTEPS");
288 init &= f.TestObject("COMMANDLIST_INIT");
289 init &= f.TestObject("COMMANDLIST_LOOP");
290 init &= f.TestObject("COMMANDLIST_FINALIZE");
291 init &= f.TestObject("MINLEVEL");
292 init &= f.TestObject("MAXLEVEL");
293 init &= f.TestObject("GLOBAL_MAXLEVEL");
294 init &= f.TestObject("INTERFACE");
[48b662]295
296 return init;
297}
Note: See TracBrowser for help on using the repository browser.