source: src/mg.cpp@ b2154a3

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

Merge recent changes of the vmg library into ScaFaCos.

Includes a fix for the communication problems on Jugene.

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

  • Property mode set to 100644
File size: 6.7 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#ifdef HAVE_MARMOT
21#include <enhancempicalls.h>
22#include <sourceinfompicalls.h>
23#endif
24#endif
25#endif
26
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"
38#include "base/timer.hpp"
39#include "comm/comm.hpp"
40#include "grid/grid.hpp"
41#include "grid/tempgrid.hpp"
42#include "interface/interface.hpp"
43#include "interface/interface_particles_cf.hpp"
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
53VMG::CommandFactory MG::command_factory;
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);
63 REGISTER_COMMAND(VMGCommandComputeResidualNorm);
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);
73 REGISTER_COMMAND(VMGCommandInitializeIterationCounter);
74 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
75 REGISTER_COMMAND(VMGCommandNOP);
76 REGISTER_COMMAND(VMGCommandPrintAllSettings);
77 REGISTER_COMMAND(VMGCommandPrintDefect);
78 REGISTER_COMMAND(VMGCommandPrintGridStructure);
79 REGISTER_COMMAND(VMGCommandPrintGrid);
80 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
81 REGISTER_COMMAND(VMGCommandPrintRunningTime);
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{
93 state = 0;
94 VMGRegisterBuiltinCommands();
95}
96
97MG::~MG()
98{
99 MG::Destroy();
100}
101
102// Brings Multigrid back to starting state.
103void MG::Destroy()
104{
105 MG::Instance()->factories.clear();
106 MG::Instance()->state = 0;
107 Timer::Clear();
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);
116 TempGrid* temp = new TempGrid();
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
127void MG::InitializeFromParticleConfigFile(const char* filename)
128{
129 InterfaceParticlesCF interface_particles(filename);
130}
131
132/*
133 * Post init communication class
134 */
135void MG::PostInit()
136{
137 GetComm()->PostInit(*GetSol(), *GetRhs());
138}
139
140/**
141 * Solves a given system with a multigrid method
142 *
143 */
144void MG::Solve()
145{
146#ifdef DEBUG_MEASURE_TIME
147#ifdef HAVE_MPI
148 MPI_Barrier(MPI_COMM_WORLD);
149#endif
150 Timer::Start("CompleteRunningTime");
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>();
156
157 cl_init->ExecuteList();
158
159 while (cl_loop->ExecuteList() == Continue);
160
161 cl_finalize->ExecuteList();
162
163#ifdef DEBUG_MEASURE_TIME
164#ifdef HAVE_MPI
165 MPI_Barrier(MPI_COMM_WORLD);
166#endif
167 Timer::Stop("CompleteRunningTime");
168#ifdef DEBUG_MEASURE_TIME_OUTPUT
169#ifdef HAVE_MPI
170 Timer::PrintGlobal();
171#else
172 Timer::Print();
173#endif
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;
198}
199
200Comm* MG::GetComm()
201{
202 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
203}
204
205Discretization* MG::GetDiscretization()
206{
207 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
208}
209
210LevelOperator* MG::GetLevelOperator()
211{
212 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
213}
214
215Multigrid* MG::GetRhs()
216{
217 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
218}
219
220Multigrid* MG::GetSol()
221{
222 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
223}
224
225Smoother* MG::GetSmoother()
226{
227 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
228}
229
230Solver* MG::GetSolver()
231{
232 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
233}
234
235TempGrid* MG::GetTempGrid()
236{
237 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
238}
239
240Interface* MG::GetInterface()
241{
242 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
243}
244
245static bool CheckObject(std::string id)
246{
247 Object *obj = MG::GetFactory().Get(id);
248
249#ifdef DEBUG_OUTPUT
250 if (obj == NULL)
251 printf("\nMultigrid: CLASS %s NOT INITIALIZED\n\n", id.c_str());
252#endif
253
254 return obj != NULL;
255}
256
257bool MG::IsInitialized()
258{
259 bool init = true;
260
261 init &= CheckObject("COMM");
262 init &= CheckObject("LEVEL_OPERATOR");
263 init &= CheckObject("RHS");
264 init &= CheckObject("SOL");
265 init &= CheckObject("SOLVER");
266 init &= CheckObject("SMOOTHER");
267 init &= CheckObject("DISCRETIZATION");
268 init &= CheckObject("MAX_ITERATION");
269 init &= CheckObject("PRECISION");
270 init &= CheckObject("PRESMOOTHSTEPS");
271 init &= CheckObject("POSTSMOOTHSTEPS");
272 init &= CheckObject("COMMANDLIST_INIT");
273 init &= CheckObject("COMMANDLIST_LOOP");
274 init &= CheckObject("COMMANDLIST_FINALIZE");
275 init &= CheckObject("MINLEVEL");
276 init &= CheckObject("MAXLEVEL");
277 init &= CheckObject("GLOBAL_MAXLEVEL");
278 init &= CheckObject("INTERFACE");
279
280 return init;
281}
Note: See TracBrowser for help on using the repository browser.