source: src/mg.cpp@ 4571da

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

vmg: Implement fourth-order discretization of the Poisson equation.

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

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