source: src/mg.cpp@ 48b662

Last change on this file since 48b662 was 48b662, checked in by Olaf Lenz <olenz@…>, 14 years ago

Moved files in scafacos_fcs one level up.

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

  • Property mode set to 100644
File size: 5.1 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#include <cmath>
18#include <cstdio>
19#include <cfloat>
20#include <ctime>
21#include <string>
22#include <fstream>
23#include <iostream>
24#include <sstream>
25
26#include "base/command_list.hpp"
27#include "base/discretization.hpp"
28#include "base/factory.hpp"
29#include "comm/comm.hpp"
30#include "grid/tempgrid.hpp"
31#include "interface/interface.hpp"
32#include "level/level_operator.hpp"
33#include "smoother/smoother.hpp"
34#include "solver/solver.hpp"
35#include "mg.hpp"
36
37using namespace VMG;
38
39#define REGISTER_COMMAND(a) extern void Initialize##a();Initialize##a();
40
41Factory MG::factory;
42
43static void VMGRegisterBuiltinCommands()
44{
45 REGISTER_COMMAND(VMGCommandCheckConsistency);
46 REGISTER_COMMAND(VMGCommandCheckIterationCounter);
47 REGISTER_COMMAND(VMGCommandCheckRelativeResidual);
48 REGISTER_COMMAND(VMGCommandCheckResidual);
49 REGISTER_COMMAND(VMGCommandClearCoarseLevels);
50 REGISTER_COMMAND(VMGCommandClearGrid);
51 REGISTER_COMMAND(VMGCommandCopyBoundary);
52 REGISTER_COMMAND(VMGCommandExecuteCycle);
53 REGISTER_COMMAND(VMGCommandExecuteCycleLoop);
54 REGISTER_COMMAND(VMGCommandExecuteFullCycle);
55 REGISTER_COMMAND(VMGCommandExecuteFullCycleLoop);
56 REGISTER_COMMAND(VMGCommandExportSolution);
57 REGISTER_COMMAND(VMGCommandForceDiscreteCompatibility);
58 REGISTER_COMMAND(VMGCommandImportRightHandSide);
59 REGISTER_COMMAND(VMGCommandInterpolateFMG);
60 REGISTER_COMMAND(VMGCommandInitializeResidualNorm);
61 REGISTER_COMMAND(VMGCommandPrintDefect);
62 REGISTER_COMMAND(VMGCommandPrintGridStructure);
63 REGISTER_COMMAND(VMGCommandPrintGrid);
64 REGISTER_COMMAND(VMGCommandPrintInnerGrid);
65 REGISTER_COMMAND(VMGCommandPrintResidualNorm);
66 REGISTER_COMMAND(VMGCommandProlongate);
67 REGISTER_COMMAND(VMGCommandRestrict);
68 REGISTER_COMMAND(VMGCommandSetAverageToZero);
69 REGISTER_COMMAND(VMGCommandSetCoarserDirichletValues);
70 REGISTER_COMMAND(VMGCommandSetLevel);
71 REGISTER_COMMAND(VMGCommandSmooth);
72 REGISTER_COMMAND(VMGCommandSolve);
73}
74
75MG::MG()
76{
77 VMGRegisterBuiltinCommands();
78}
79
80MG::~MG()
81{
82 MG::Destroy();
83}
84
85// Brings Multigrid back to starting state.
86void MG::Destroy()
87{
88 MG::factory.Destroy();
89}
90
91void MG::SetInterface(VMG::Interface* interface, VMG::Comm* comm)
92{
93 interface->Register("INTERFACE");
94
95 Multigrid* sol = new Multigrid(comm, interface);
96 Multigrid* rhs = new Multigrid(comm, interface);
97 VMG::TempGrid* temp = new VMG::TempGrid();
98
99 sol->Register("SOL");
100 rhs->Register("RHS");
101 temp->Register("TEMPGRID");
102
103 new ObjectStorage<int>("GLOBAL_MAXLEVEL", sol->GlobalMaxLevel());
104 new ObjectStorage<int>("MINLEVEL", sol->MinLevel());
105 new ObjectStorage<int>("MAXLEVEL", sol->MaxLevel());
106}
107
108/**
109 * Solves a given system with a multigrid method
110 *
111 */
112void MG::Solve()
113{
114 CommandList* cl_init = factory.GetObject("COMMANDLIST_INIT")->Cast<CommandList>();
115 CommandList* cl_loop = factory.GetObject("COMMANDLIST_LOOP")->Cast<CommandList>();
116 CommandList* cl_finalize = factory.GetObject("COMMANDLIST_FINALIZE")->Cast<CommandList>();
117
118 cl_init->ExecuteList();
119
120 while (cl_loop->ExecuteList() == Continue);
121
122 cl_finalize->ExecuteList();
123}
124
125Comm* MG::GetComm()
126{
127 return factory.GetObject("COMM")->Cast<VMG::Comm>();
128}
129
130Discretization* MG::GetDiscretization()
131{
132 return factory.GetObject("DISCRETIZATION")->Cast<VMG::Discretization>();
133}
134
135LevelOperator* MG::GetLevelOperator()
136{
137 return factory.GetObject("LEVEL_OPERATOR")->Cast<VMG::LevelOperator>();
138}
139
140Multigrid* MG::GetRhs()
141{
142 return factory.GetObject("RHS")->Cast<VMG::Multigrid>();
143}
144
145Multigrid* MG::GetSol()
146{
147 return factory.GetObject("SOL")->Cast<VMG::Multigrid>();
148}
149
150Smoother* MG::GetSmoother()
151{
152 return factory.GetObject("SMOOTHER")->Cast<VMG::Smoother>();
153}
154
155Solver* MG::GetSolver()
156{
157 return factory.GetObject("SOLVER")->Cast<VMG::Solver>();
158}
159
160TempGrid* MG::GetTempGrid()
161{
162 return factory.GetObject("TEMPGRID")->Cast<VMG::TempGrid>();
163}
164
165Factory& MG::GetFactory()
166{
167 return MG::factory;
168}
169
170Interface* MG::GetInterface()
171{
172 return factory.GetObject("INTERFACE")->Cast<VMG::Interface>();
173}
174
175static bool CheckObject(std::string id)
176{
177 Object *obj = MG::GetFactory().GetObject(id);
178
179#ifdef DEBUG
180 if (obj == NULL)
181 printf("\nMultigrid: CLASS %s NOT INITIALIZED\n\n", id.c_str());
182#endif
183
184 return obj != NULL;
185}
186
187bool MG::IsInitialized()
188{
189 bool init = true;
190
191 init &= CheckObject("COMM");
192 init &= CheckObject("LEVEL_OPERATOR");
193 init &= CheckObject("RHS");
194 init &= CheckObject("SOL");
195 init &= CheckObject("SOLVER");
196 init &= CheckObject("SMOOTHER");
197 init &= CheckObject("DISCRETIZATION");
198 init &= CheckObject("MAX_ITERATION");
199 init &= CheckObject("PRECISION");
200 init &= CheckObject("PRESMOOTHSTEPS");
201 init &= CheckObject("POSTSMOOTHSTEPS");
202 init &= CheckObject("COMMANDLIST_INIT");
203 init &= CheckObject("COMMANDLIST_LOOP");
204 init &= CheckObject("COMMANDLIST_FINALIZE");
205 init &= CheckObject("MINLEVEL");
206 init &= CheckObject("MAXLEVEL");
207 init &= CheckObject("GLOBAL_MAXLEVEL");
208 init &= CheckObject("INTERFACE");
209
210 return init;
211}
Note: See TracBrowser for help on using the repository browser.