source: src/mg.cpp@ d24c2f

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

Parallel performance update.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1314 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 * Post init communication class
135 */
136void MG::PostInit()
137{
138 GetComm()->PostInit(*GetSol(), *GetRhs());
139}
140
141/**
142 * Solves a given system with a multigrid method
143 *
144 */
145void MG::Solve()
146{
147#ifdef DEBUG_MEASURE_TIME
148#ifdef HAVE_MPI
149 MPI_Barrier(MPI_COMM_WORLD);
150 Timer::Start("CompleteRunningTime");
151#endif
152#endif
153
154 CommandList* cl_init = MG::GetFactory().Get("COMMANDLIST_INIT")->Cast<CommandList>();
155 CommandList* cl_loop = MG::GetFactory().Get("COMMANDLIST_LOOP")->Cast<CommandList>();
156 CommandList* cl_finalize = MG::GetFactory().Get("COMMANDLIST_FINALIZE")->Cast<CommandList>();
157
158 cl_init->ExecuteList();
159
160 while (cl_loop->ExecuteList() == Continue);
161
162 cl_finalize->ExecuteList();
163
164#ifdef DEBUG_MEASURE_TIME
165#ifdef HAVE_MPI
166 MPI_Barrier(MPI_COMM_WORLD);
167 Timer::Stop("CompleteRunningTime");
168#endif
169#endif
170}
171
172void MG::SetState(const int& state_)
173{
174 MG::Instance()->state = state_;
175}
176
177VMG::Factory& MG::GetFactory()
178{
179 std::map<int, VMG::Factory>::iterator iter = MG::Instance()->factories.find(MG::Instance()->state);
180
181 if (iter == MG::Instance()->factories.end())
182 iter = MG::Instance()->factories.insert(std::make_pair(MG::Instance()->state, Factory())).first;
183
184 assert(iter != MG::Instance()->factories.end());
185
186 return iter->second;
187}
188
189VMG::CommandFactory& MG::GetCommands()
190{
191 return MG::command_factory;
192}
193
194Comm* MG::GetComm()
195{
196 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
197}
198
199Discretization* MG::GetDiscretization()
200{
201 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
202}
203
204LevelOperator* MG::GetLevelOperator()
205{
206 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
207}
208
209Multigrid* MG::GetRhs()
210{
211 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
212}
213
214Multigrid* MG::GetSol()
215{
216 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
217}
218
219Smoother* MG::GetSmoother()
220{
221 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
222}
223
224Solver* MG::GetSolver()
225{
226 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
227}
228
229TempGrid* MG::GetTempGrid()
230{
231 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
232}
233
234Grid* MG::GetGlobalCoarseGrid()
235{
236 return MG::GetFactory().Get("GLOBAL_COARSE_GRID")->Cast<VMG::Grid>();
237}
238
239Interface* MG::GetInterface()
240{
241 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
242}
243
244static bool CheckObject(std::string id)
245{
246 Object *obj = MG::GetFactory().Get(id);
247
248#ifdef DEBUG_OUTPUT
249 if (obj == NULL)
250 printf("\nMultigrid: CLASS %s NOT INITIALIZED\n\n", id.c_str());
251#endif
252
253 return obj != NULL;
254}
255
256bool MG::IsInitialized()
257{
258 bool init = true;
259
260 init &= CheckObject("COMM");
261 init &= CheckObject("LEVEL_OPERATOR");
262 init &= CheckObject("RHS");
263 init &= CheckObject("SOL");
264 init &= CheckObject("SOLVER");
265 init &= CheckObject("SMOOTHER");
266 init &= CheckObject("DISCRETIZATION");
267 init &= CheckObject("MAX_ITERATION");
268 init &= CheckObject("PRECISION");
269 init &= CheckObject("PRESMOOTHSTEPS");
270 init &= CheckObject("POSTSMOOTHSTEPS");
271 init &= CheckObject("COMMANDLIST_INIT");
272 init &= CheckObject("COMMANDLIST_LOOP");
273 init &= CheckObject("COMMANDLIST_FINALIZE");
274 init &= CheckObject("MINLEVEL");
275 init &= CheckObject("MAXLEVEL");
276 init &= CheckObject("GLOBAL_MAXLEVEL");
277 init &= CheckObject("INTERFACE");
278
279 return init;
280}
Note: See TracBrowser for help on using the repository browser.