OGS
Process.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <string>
14#include <tuple>
15
26#include "ProcessVariable.h"
29#include "processlib_export.h"
30
31namespace MeshLib
32{
33class Mesh;
34}
35
36namespace ProcessLib
37{
38
40 : public NumLib::ODESystem< // TODO: later on use a simpler ODE system
41 NumLib::ODESystemTag::FirstOrderImplicitQuasilinear,
42 NumLib::NonlinearSolverTag::Newton>,
44{
45public:
47
48 Process(std::string name_,
49 MeshLib::Mesh& mesh,
50 std::unique_ptr<AbstractJacobianAssembler>&& jacobian_assembler,
51 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
52 parameters,
53 unsigned const integration_order,
54 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
55 process_variables,
56 SecondaryVariableCollection&& secondary_variables,
57 const bool use_monolithic_scheme = true);
58
60 void preTimestep(std::vector<GlobalVector*> const& x, const double t,
61 const double delta_t, const int process_id);
62
64 void postTimestep(std::vector<GlobalVector*> const& x,
65 std::vector<GlobalVector*> const& x_prev, const double t,
66 const double delta_t, int const process_id);
67
70 void postNonLinearSolver(std::vector<GlobalVector*> const& x,
71 std::vector<GlobalVector*> const& x_prev,
72 const double t, double const dt,
73 int const process_id);
74
75 void preIteration(const unsigned iter, GlobalVector const& x) final;
76
78 void computeSecondaryVariable(double const t,
79 double const dt,
80 std::vector<GlobalVector*> const& x,
81 GlobalVector const& x_prev,
82 int const process_id);
83
85
86 void initialize(
87 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
88 media);
89
91 std::vector<GlobalVector*>& process_solutions,
92 std::vector<GlobalVector*> const& process_solutions_prev,
93 double const t,
94 int const process_id);
95
97 const int process_id) const override;
98
99 void updateDeactivatedSubdomains(double const time, const int process_id);
100
101 virtual bool isMonolithicSchemeUsed() const
102 {
104 }
105
107 const double /*t*/,
108 std::vector<GlobalVector*> const& /*integration_point_values_vectors*/,
109 std::vector<GlobalVector*>& /*nodal_values_vectors*/)
110 {
111 }
112
113 void preAssemble(const double t, double const dt,
114 GlobalVector const& x) final;
115
116 void assemble(const double t, double const dt,
117 std::vector<GlobalVector*> const& x,
118 std::vector<GlobalVector*> const& x_prev,
119 int const process_id, GlobalMatrix& M, GlobalMatrix& K,
120 GlobalVector& b) final;
121
122 void assembleWithJacobian(const double t, double const dt,
123 std::vector<GlobalVector*> const& x,
124 std::vector<GlobalVector*> const& x_prev,
125 int const process_id, GlobalMatrix& M,
127 GlobalMatrix& Jac) final;
128
129 /* Computes data necessary for output.
130 *
131 * \pre Must be called before postTimestep() since the latter will overwrite
132 * previous states with current ones possibly affecting the data computed by
133 * this method.
134 */
135 void preOutput(const double t, double const dt,
136 std::vector<GlobalVector*> const& x,
137 std::vector<GlobalVector*> const& x_prev,
138 int const process_id);
139
140 std::vector<NumLib::IndexValueVector<GlobalIndexType>> const*
141 getKnownSolutions(double const t, GlobalVector const& x,
142 int const process_id) const final
143 {
144 return _boundary_conditions[process_id].getKnownSolutions(t, x);
145 }
146
148 const int /*process_id*/) const
149 {
151 }
152
153 MeshLib::Mesh& getMesh() const { return _mesh; }
154 std::vector<std::reference_wrapper<ProcessVariable>> const&
155 getProcessVariables(const int process_id) const
156 {
157 return _process_variables[process_id];
158 }
159
160 std::vector<std::size_t> const& getActiveElementIDs() const
161 {
163 }
164
169
170 std::vector<std::unique_ptr<MeshLib::IntegrationPointWriter>> const&
175
176 // Used as a call back for CalculateSurfaceFlux process.
177
178 virtual Eigen::Vector3d getFlux(
179 std::size_t /*element_id*/,
180 MathLib::Point3d const& /*p*/,
181 double const /*t*/,
182 std::vector<GlobalVector*> const& /*x*/) const
183 {
184 return Eigen::Vector3d{};
185 }
186
188 std::vector<GlobalVector*>& /*x*/,
189 std::vector<GlobalVector*> const& /*x_prev*/, double const /*t*/,
190 double const /*dt*/, NumLib::EquationSystem& /*ode_sys*/,
191 int const /*process_id*/)
192 {
193 }
194
195protected:
196 std::vector<NumLib::LocalToGlobalIndexMap const*> getDOFTables(
197 int const number_of_processes) const;
198
203
208
215 const NumLib::LocalToGlobalIndexMap& dof_table, const int process_id,
216 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
217 media);
218
219private:
222 NumLib::LocalToGlobalIndexMap const& dof_table,
223 MeshLib::Mesh const& mesh,
224 unsigned const integration_order) = 0;
225
228 virtual void initializeBoundaryConditions(
229 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
230 media);
231
233 std::vector<GlobalVector*>& /*x*/,
234 double const /*t*/,
235 int const /*process_id*/)
236 {
237 }
238
239 virtual void preAssembleConcreteProcess(const double /*t*/,
240 double const /*dt*/,
241 GlobalVector const& /*x*/)
242 {
243 }
244
246 const double t, double const dt, std::vector<GlobalVector*> const& x,
247 std::vector<GlobalVector*> const& x_prev, int const process_id,
248 GlobalMatrix& M, GlobalMatrix& K, GlobalVector& b) = 0;
249
251 const double t, double const dt, std::vector<GlobalVector*> const& x,
252 std::vector<GlobalVector*> const& x_prev, int const process_id,
254 GlobalMatrix& Jac) = 0;
255
257 std::vector<GlobalVector*> const& /*x*/,
258 const double /*t*/,
259 const double /*dt*/,
260 const int /*process_id*/)
261 {
262 }
263
265 std::vector<GlobalVector*> const& /*x*/,
266 std::vector<GlobalVector*> const& /*x_prev*/,
267 const double /*t*/,
268 const double /*dt*/,
269 int const /*process_id*/)
270 {
271 }
272
274 std::vector<GlobalVector*> const& /*x*/,
275 std::vector<GlobalVector*> const& /*x_prev*/, const double /*t*/,
276 double const /*dt*/, int const /*process_id*/)
277 {
278 }
279
280 virtual void preIterationConcreteProcess(const unsigned /*iter*/,
281 GlobalVector const& /*x*/)
282 {
283 }
284
286 double const /*t*/,
287 double const /*dt*/,
288 std::vector<GlobalVector*> const& /*x*/,
289 GlobalVector const& /*x_prev*/,
290 int const /*process_id*/)
291 {
292 }
293
299
301 const double /*t*/, double const /*dt*/,
302 std::vector<GlobalVector*> const& /*x*/,
303 std::vector<GlobalVector*> const& /*x_prev*/, int const /*process_id*/)
304 {
305 }
306
307protected:
314 virtual void constructDofTable();
315
321
328 const int specified_process_id);
329
338 virtual std::tuple<NumLib::LocalToGlobalIndexMap*, bool>
340
343 std::vector<GlobalIndexType>
345
346private:
348
352
353public:
354 std::string const name;
355
356protected:
358 std::unique_ptr<MeshLib::MeshSubset const> _mesh_subset_all_nodes;
359
360 std::unique_ptr<NumLib::LocalToGlobalIndexMap> _local_to_global_index_map;
361
363
364 // TODO (CL) switch to the parallel vector matrix assembler here, once
365 // feature complete, or use the assembly mixin and remove these two members.
366 std::unique_ptr<ProcessLib::AbstractJacobianAssembler> _jacobian_assembler;
368
370
374 unsigned const _integration_order;
375
379 std::vector<std::unique_ptr<MeshLib::IntegrationPointWriter>>
381
383
384protected:
389 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
391
395 std::vector<BoundaryConditionCollection> _boundary_conditions;
396
397private:
401 std::vector<SourceTermCollection> _source_term_collections;
402
404
406 std::vector<std::size_t> _ids_of_active_elements;
407};
408
409} // namespace ProcessLib
MathLib::SparsityPattern< GlobalIndexType > GlobalSparsityPattern
Global vector based on Eigen vector.
Definition EigenVector.h:25
NumLib::LocalToGlobalIndexMap const & getDOFTable() const
NumLib::Extrapolator & getExtrapolator() const
std::string const name
Definition Process.h:354
std::vector< NumLib::IndexValueVector< GlobalIndexType > > const * getKnownSolutions(double const t, GlobalVector const &x, int const process_id) const final
Definition Process.h:141
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > const & getIntegrationPointWriters() const
Definition Process.h:171
MeshLib::Mesh & getMesh() const
Definition Process.h:153
virtual NumLib::IterationResult postIterationConcreteProcess(GlobalVector const &)
Definition Process.h:294
virtual void assembleWithJacobianConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)=0
virtual Eigen::Vector3d getFlux(std::size_t, MathLib::Point3d const &, double const, std::vector< GlobalVector * > const &) const
Definition Process.h:178
virtual void preTimestepConcreteProcess(std::vector< GlobalVector * > const &, const double, const double, const int)
Definition Process.h:256
std::vector< BoundaryConditionCollection > _boundary_conditions
Definition Process.h:395
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(int const number_of_processes) const
Definition Process.cpp:386
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > _integration_point_writer
Definition Process.h:380
SecondaryVariableCollection const & getSecondaryVariables() const
Definition Process.h:165
virtual void preIterationConcreteProcess(const unsigned, GlobalVector const &)
Definition Process.h:280
void constructDofTableOfSpecifiedProcessStaggeredScheme(const int specified_process_id)
Definition Process.cpp:355
static PROCESSLIB_EXPORT const std::string constant_one_parameter_name
Definition Process.h:46
void preAssemble(const double t, double const dt, GlobalVector const &x) final
Definition Process.cpp:259
virtual void initializeBoundaryConditions(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:104
void initialize(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:118
void initializeProcessBoundaryConditionsAndSourceTerms(const NumLib::LocalToGlobalIndexMap &dof_table, const int process_id, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:89
virtual void solveReactionEquation(std::vector< GlobalVector * > &, std::vector< GlobalVector * > const &, double const, double const, NumLib::EquationSystem &, int const)
Definition Process.h:187
virtual void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order)=0
Process specific initialization called by initialize().
std::vector< std::size_t > _ids_of_active_elements
Union of active element ids per process variable.
Definition Process.h:406
virtual bool isMonolithicSchemeUsed() const
Definition Process.h:101
void assembleWithJacobian(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac) final
Definition Process.cpp:286
void assemble(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) final
Definition Process.cpp:265
virtual void postTimestepConcreteProcess(std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, const double, const double, int const)
Definition Process.h:264
Process(std::string name_, MeshLib::Mesh &mesh, std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > &&process_variables, SecondaryVariableCollection &&secondary_variables, const bool use_monolithic_scheme=true)
Definition Process.cpp:44
virtual void computeSecondaryVariableConcrete(double const, double const, std::vector< GlobalVector * > const &, GlobalVector const &, int const)
Definition Process.h:285
std::unique_ptr< MeshLib::MeshSubset const > _mesh_subset_all_nodes
Definition Process.h:358
void preOutput(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)
Definition Process.cpp:501
MeshLib::Mesh & _mesh
Definition Process.h:357
virtual void assembleConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)=0
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > _process_variables
Definition Process.h:390
std::vector< std::size_t > const & getActiveElementIDs() const
Definition Process.h:160
NumLib::LocalToGlobalIndexMap const & getSingleComponentDOFTable() const
Definition Process.h:204
virtual NumLib::LocalToGlobalIndexMap const & getDOFTable(const int) const
Definition Process.h:147
virtual void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &, double const, int const)
Definition Process.h:232
NumLib::IterationResult postIteration(GlobalVector const &x) final
Definition Process.cpp:495
void postTimestep(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, const double t, const double delta_t, int const process_id)
Postprocessing after a complete timestep.
Definition Process.cpp:454
SecondaryVariableCollection _secondary_variables
Definition Process.h:362
void preTimestep(std::vector< GlobalVector * > const &x, const double t, const double delta_t, const int process_id)
Preprocessing before starting assembly for new timestep.
Definition Process.cpp:444
void computeSecondaryVariable(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id)
compute secondary variables for the coupled equations or for output.
Definition Process.cpp:476
void initializeExtrapolator()
Definition Process.cpp:421
virtual void postNonLinearSolverConcreteProcess(std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, const double, double const, int const)
Definition Process.h:273
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
Definition Process.h:155
virtual void constructDofTable()
Definition Process.cpp:308
void constructMonolithicProcessDofTable()
Definition Process.cpp:322
VectorMatrixAssembler _global_assembler
Definition Process.h:367
virtual void preAssembleConcreteProcess(const double, double const, GlobalVector const &)
Definition Process.h:239
void postNonLinearSolver(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, const double t, double const dt, int const process_id)
Definition Process.cpp:466
std::vector< GlobalIndexType > getIndicesOfResiduumWithoutInitialCompensation() const override
Definition Process.cpp:513
unsigned const _integration_order
Definition Process.h:374
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Definition Process.h:360
std::vector< SourceTermCollection > _source_term_collections
Definition Process.h:401
virtual void extrapolateIntegrationPointValuesToNodes(const double, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > &)
Definition Process.h:106
std::unique_ptr< ProcessLib::AbstractJacobianAssembler > _jacobian_assembler
Definition Process.h:366
void updateDeactivatedSubdomains(double const time, const int process_id)
Definition Process.cpp:218
void computeSparsityPattern()
Definition Process.cpp:438
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
Definition Process.cpp:210
void setInitialConditions(std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, double const t, int const process_id)
Definition Process.cpp:139
virtual void preOutputConcreteProcess(const double, double const, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, int const)
Definition Process.h:300
ExtrapolatorData _extrapolator_data
Definition Process.h:403
NumLib::Extrapolator & getExtrapolator() const
Definition Process.h:199
GlobalSparsityPattern _sparsity_pattern
Definition Process.h:382
void preIteration(const unsigned iter, GlobalVector const &x) final
Definition Process.cpp:489
const bool _use_monolithic_scheme
Definition Process.h:369
virtual std::tuple< NumLib::LocalToGlobalIndexMap *, bool > getDOFTableForExtrapolatorData() const
Definition Process.cpp:397
Handles configuration of several secondary variables from the project file.
IterationResult
Status flags telling the NonlinearSolver if an iteration succeeded.
#define PROCESSLIB_EXPORT