source: src/mg.cpp@ 32ff22

Last change on this file since 32ff22 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
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>
20#endif
21#endif
22
[48b662]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"
[dfed1c]34#include "base/timer.hpp"
[48b662]35#include "comm/comm.hpp"
[dfed1c]36#include "grid/grid.hpp"
[48b662]37#include "grid/tempgrid.hpp"
38#include "interface/interface.hpp"
[dfed1c]39#include "interface/interface_particles_cf.hpp"
[48b662]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
[dfed1c]49VMG::CommandFactory MG::command_factory;
[48b662]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);
[dfed1c]59 REGISTER_COMMAND(VMGCommandComputeResidualNorm);
[48b662]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);
[dfed1c]69 REGISTER_COMMAND(VMGCommandInitializeIterationCounter);
[48b662]70 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
[dfed1c]71 REGISTER_COMMAND(VMGCommandNOP);
72 REGISTER_COMMAND(VMGCommandPrintAllSettings);
[48b662]73 REGISTER_COMMAND(VMGCommandPrintDefect);
74 REGISTER_COMMAND(VMGCommandPrintGridStructure);
75 REGISTER_COMMAND(VMGCommandPrintGrid);
76 REGISTER_COMMAND(VMGCommandPrintInnerGrid);
77 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
[dfed1c]78 REGISTER_COMMAND(VMGCommandPrintRunningTime);
[48b662]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{
[dfed1c]90 state = 0;
[48b662]91 VMGRegisterBuiltinCommands();
92}
93
94MG::~MG()
95{
96 MG::Destroy();
97}
98
99// Brings Multigrid back to starting state.
100void MG::Destroy()
101{
[dfed1c]102 MG::Instance()->factories.clear();
103 MG::Instance()->state = 0;
104 Timer::Clear();
[48b662]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);
[dfed1c]113 TempGrid* temp = new TempGrid();
114 TempGrid* global_grid = new TempGrid();
115
116 global_grid->SetPropertiesToGlobalCoarseGrid();
[48b662]117
118 sol->Register("SOL");
119 rhs->Register("RHS");
120 temp->Register("TEMPGRID");
[dfed1c]121 global_grid->Register("GLOBAL_COARSE_GRID");
[48b662]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
[dfed1c]128void MG::InitializeFromParticleConfigFile(const char* filename)
129{
130 InterfaceParticlesCF interface_particles(filename);
131}
132
[894a5f]133/*
134 * Post init communication class
135 */
136void MG::PostInit()
137{
138 GetComm()->PostInit(*GetSol(), *GetRhs());
139}
140
[48b662]141/**
142 * Solves a given system with a multigrid method
143 *
144 */
145void MG::Solve()
146{
[dfed1c]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>();
[48b662]157
158 cl_init->ExecuteList();
159
160 while (cl_loop->ExecuteList() == Continue);
161
162 cl_finalize->ExecuteList();
[dfed1c]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;
[48b662]192}
193
194Comm* MG::GetComm()
195{
[dfed1c]196 return MG::GetFactory().Get("COMM")->Cast<VMG::Comm>();
[48b662]197}
198
199Discretization* MG::GetDiscretization()
200{
[dfed1c]201 return MG::GetFactory().Get("DISCRETIZATION")->Cast<VMG::Discretization>();
[48b662]202}
203
204LevelOperator* MG::GetLevelOperator()
205{
[dfed1c]206 return MG::GetFactory().Get("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
[48b662]207}
208
209Multigrid* MG::GetRhs()
210{
[dfed1c]211 return MG::GetFactory().Get("RHS")->Cast<VMG::Multigrid>();
[48b662]212}
213
214Multigrid* MG::GetSol()
215{
[dfed1c]216 return MG::GetFactory().Get("SOL")->Cast<VMG::Multigrid>();
[48b662]217}
218
219Smoother* MG::GetSmoother()
220{
[dfed1c]221 return MG::GetFactory().Get("SMOOTHER")->Cast<VMG::Smoother>();
[48b662]222}
223
224Solver* MG::GetSolver()
225{
[dfed1c]226 return MG::GetFactory().Get("SOLVER")->Cast<VMG::Solver>();
[48b662]227}
228
229TempGrid* MG::GetTempGrid()
230{
[dfed1c]231 return MG::GetFactory().Get("TEMPGRID")->Cast<VMG::TempGrid>();
[48b662]232}
233
[dfed1c]234Grid* MG::GetGlobalCoarseGrid()
[48b662]235{
[dfed1c]236 return MG::GetFactory().Get("GLOBAL_COARSE_GRID")->Cast<VMG::Grid>();
[48b662]237}
238
239Interface* MG::GetInterface()
240{
[dfed1c]241 return MG::GetFactory().Get("INTERFACE")->Cast<VMG::Interface>();
[48b662]242}
243
244static bool CheckObject(std::string id)
245{
[dfed1c]246 Object *obj = MG::GetFactory().Get(id);
[48b662]247
[dfed1c]248#ifdef DEBUG_OUTPUT
[48b662]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.