suanPan
Step.h
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright (C) 2017-2023 Theodore Chang
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  ******************************************************************************/
28 #ifndef STEP_H
29 #define STEP_H
30 
31 #include <Domain/Factory.hpp>
32 #include <Domain/Tag.h>
33 
34 class DomainBase;
35 class Solver;
36 class Converger;
37 class Integrator;
38 
39 class Step : public Tag {
40  double time_period = 1.0; // time period
41 
42  double time_left = time_period;
43 
44  double max_step_size = time_period; // maximum step size
45  double min_step_size = time_period > 0. ? 1E-8 : 0.; // minimum step size
46  double ini_step_size = time_period > 0. ? time_period : 1.; // initial step size
47 
48  unsigned max_substep = 1000; // maximum increment number
49 
50  bool fixed_step_size = false; // auto-stepping
51 
52  unsigned solver_tag = 0;
53  unsigned converger_tag = 0;
54  unsigned integrator_tag = 0;
55 
56 protected:
57  const bool symm_mat = false;
58  const bool band_mat = true;
59  const bool sparse_mat = false;
60 
63 
64 #ifdef SUANPAN_MAGMA
65  magma_dopts magma_setting{};
66 #endif
67 
68  weak_ptr<DomainBase> database;
69  shared_ptr<Factory<double>> factory;
70  shared_ptr<Solver> solver;
71  shared_ptr<Converger> tester;
72  shared_ptr<Integrator> modifier;
73 
74  void configure_storage_scheme() const;
75 
76 public:
77  explicit Step(unsigned = 0, double = 1.);
78  Step(const Step&) = delete;
79  Step(Step&&) noexcept = delete;
80  Step& operator=(const Step&) = delete;
81  Step& operator=(Step&&) noexcept = delete;
82  ~Step() override = default;
83 
84  virtual int initialize();
85 
86  virtual int analyze() = 0;
87 
88  void set_domain(const weak_ptr<DomainBase>&);
89  [[nodiscard]] const weak_ptr<DomainBase>& get_domain() const;
90 
91  void set_factory(const shared_ptr<Factory<double>>&);
92  [[nodiscard]] const shared_ptr<Factory<double>>& get_factory() const;
93 
94  void set_solver_tag(unsigned);
95  void set_solver(const shared_ptr<Solver>&);
96  [[nodiscard]] const shared_ptr<Solver>& get_solver() const;
97 
98  void set_converger_tag(unsigned);
99  void set_converger(const shared_ptr<Converger>&);
100  [[nodiscard]] const shared_ptr<Converger>& get_converger() const;
101 
102  void set_integrator_tag(unsigned);
103  void set_integrator(const shared_ptr<Integrator>&);
104  [[nodiscard]] const shared_ptr<Integrator>& get_integrator() const;
105 
106  void set_time_period(double);
107  void set_time_left(double);
108  [[nodiscard]] double get_time_period() const;
109  [[nodiscard]] double get_time_left() const;
110 
111  void set_ini_step_size(double);
112  void set_min_step_size(double);
113  void set_max_step_size(double);
114  void set_max_substep(unsigned);
118  void set_precision(Precision);
119  void set_tolerance(double);
120  void set_refinement(unsigned);
121  void set_lis_option(std::string_view);
122 #ifdef SUANPAN_MAGMA
123  void set_magma_option(const magma_dopts& magma_opt) { magma_setting = magma_opt; }
124 #endif
125 
126  [[nodiscard]] double get_ini_step_size() const;
127  [[nodiscard]] double get_min_step_size() const;
128  [[nodiscard]] double get_max_step_size() const;
129  [[nodiscard]] unsigned get_max_substep() const;
130 
131  [[nodiscard]] bool is_fixed_step_size() const;
132  void set_fixed_step_size(bool);
133 
134  [[nodiscard]] bool is_symm() const;
135  [[nodiscard]] bool is_band() const;
136  [[nodiscard]] bool is_sparse() const;
137  void set_symm(bool) const;
138  void set_band(bool) const;
139  void set_sparse(bool) const;
140 };
141 
142 #endif
143 
PreconditionerType
Definition: SolverSetting.hpp:34
Precision
Definition: SolverSetting.hpp:23
IterativeSolver
Definition: SolverSetting.hpp:28
The Converger class handles converger test to indicate if the iteration converges according to variou...
Definition: Converger.h:44
The DomainBase class is a template.
Definition: DomainBase.h:104
A Factory class.
Definition: Factory.hpp:73
The Integrator class is basically a wrapper of the DomainBase class with regard to some status changi...
Definition: Integrator.h:51
A Solver class defines solvers used in analysis.
Definition: Solver.h:38
A Step class.
Definition: Step.h:39
Step(const Step &)=delete
const bool sparse_mat
Definition: Step.h:59
void set_precision(Precision)
Definition: Step.cpp:144
const weak_ptr< DomainBase > & get_domain() const
Definition: Step.cpp:77
void set_integrator_tag(unsigned)
Definition: Step.cpp:95
void set_sparse(bool) const
Definition: Step.cpp:174
const shared_ptr< Solver > & get_solver() const
Definition: Step.cpp:87
void set_converger_tag(unsigned)
Definition: Step.cpp:89
void set_integrator(const shared_ptr< Integrator > &)
Definition: Step.cpp:97
void set_band(bool) const
Definition: Step.cpp:172
void set_preconditioner(PreconditionerType)
Definition: Step.cpp:142
void set_refinement(unsigned)
Definition: Step.cpp:148
bool is_band() const
Definition: Step.cpp:166
void set_system_solver(SolverType)
Definition: Step.cpp:135
void set_max_substep(unsigned)
Definition: Step.cpp:133
bool is_symm() const
Definition: Step.cpp:164
double get_time_period() const
Definition: Step.cpp:115
weak_ptr< DomainBase > database
Definition: Step.h:68
virtual int initialize()
Definition: Step.cpp:37
unsigned get_max_substep() const
Definition: Step.cpp:158
double get_ini_step_size() const
Definition: Step.cpp:152
void set_max_step_size(double)
Definition: Step.cpp:131
Step(unsigned=0, double=1.)
Definition: Step.cpp:33
const shared_ptr< Factory< double > > & get_factory() const
Definition: Step.cpp:81
void set_solver(const shared_ptr< Solver > &)
Definition: Step.cpp:85
const bool band_mat
Definition: Step.h:58
const shared_ptr< Converger > & get_converger() const
Definition: Step.cpp:93
void set_lis_option(std::string_view)
Definition: Step.cpp:150
double get_max_step_size() const
Definition: Step.cpp:156
SolverSetting< double > setting
Definition: Step.h:62
virtual int analyze()=0
SolverType system_solver
Definition: Step.h:61
void set_symm(bool) const
Definition: Step.cpp:170
const bool symm_mat
Definition: Step.h:57
void set_fixed_step_size(bool)
Definition: Step.cpp:162
void set_solver_tag(unsigned)
Definition: Step.cpp:83
void set_tolerance(double)
Definition: Step.cpp:146
void configure_storage_scheme() const
Definition: Step.cpp:25
bool is_sparse() const
Definition: Step.cpp:168
shared_ptr< Integrator > modifier
Definition: Step.h:72
shared_ptr< Solver > solver
Definition: Step.h:70
bool is_fixed_step_size() const
Definition: Step.cpp:160
void set_time_period(double)
Definition: Step.cpp:101
double get_time_left() const
Definition: Step.cpp:117
Step(Step &&) noexcept=delete
void set_converger(const shared_ptr< Converger > &)
Definition: Step.cpp:91
void set_ini_step_size(double)
Definition: Step.cpp:119
void set_factory(const shared_ptr< Factory< double >> &)
Definition: Step.cpp:79
void set_min_step_size(double)
Definition: Step.cpp:129
void set_domain(const weak_ptr< DomainBase > &)
Definition: Step.cpp:75
double get_min_step_size() const
Definition: Step.cpp:154
const shared_ptr< Integrator > & get_integrator() const
Definition: Step.cpp:99
shared_ptr< Converger > tester
Definition: Step.h:71
void set_time_left(double)
Definition: Step.cpp:113
shared_ptr< Factory< double > > factory
Definition: Step.h:69
A base Tag class.
Definition: Tag.h:38
SolverType
Definition: Factory.hpp:61