source: src/mg.cpp@ 01be70

Last change on this file since 01be70 was 76e019, checked in by Julian Iseringhausen <isering@…>, 14 years ago

Check that mpi.h will be included as the first header.

Needed by certain mpi implementations.

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

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