OGS
Process.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <string>
7#include <tuple>
8
20#include "ProcessVariable.h"
23#include "processlib_export.h"
24
25namespace MeshLib
26{
27class Mesh;
28}
29
30namespace ProcessLib
31{
32
34 : public NumLib::ODESystem< // TODO: later on use a simpler ODE system
35 NumLib::ODESystemTag::FirstOrderImplicitQuasilinear,
36 NumLib::NonlinearSolverTag::Newton>,
38{
39public:
41
42 Process(std::string name_,
43 MeshLib::Mesh& mesh,
44 std::unique_ptr<AbstractJacobianAssembler>&& jacobian_assembler,
45 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
46 parameters,
47 unsigned const integration_order,
48 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
49 process_variables,
50 SecondaryVariableCollection&& secondary_variables,
51 const bool use_monolithic_scheme = true);
52
54 void preTimestep(std::vector<GlobalVector*> const& x, const double t,
55 const double delta_t, const int process_id);
56
58 void postTimestep(std::vector<GlobalVector*> const& x,
59 std::vector<GlobalVector*> const& x_prev, const double t,
60 const double delta_t, int const process_id);
61
64 void postNonLinearSolver(std::vector<GlobalVector*> const& x,
65 std::vector<GlobalVector*> const& x_prev,
66 const double t, double const dt,
67 int const process_id);
68
69 void preIteration(const unsigned iter, GlobalVector const& x) final;
70
72 void computeSecondaryVariable(double const t,
73 double const dt,
74 std::vector<GlobalVector*> const& x,
75 GlobalVector const& x_prev,
76 int const process_id);
77
79
80 void initialize(
81 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
82 media);
83
85 std::vector<GlobalVector*>& process_solutions,
86 std::vector<GlobalVector*> const& process_solutions_prev,
87 double const t,
88 int const process_id);
89
91 const int process_id) const override;
92
93 void updateDeactivatedSubdomains(double const time, const int process_id);
94
95 virtual bool isMonolithicSchemeUsed() const
96 {
98 }
99
101 const double /*t*/,
102 std::vector<GlobalVector*> const& /*integration_point_values_vectors*/,
103 std::vector<GlobalVector*>& /*nodal_values_vectors*/)
104 {
105 }
106
107 void preAssemble(const double t, double const dt,
108 GlobalVector const& x) final;
109
110 void assemble(const double t, double const dt,
111 std::vector<GlobalVector*> const& x,
112 std::vector<GlobalVector*> const& x_prev,
113 int const process_id, GlobalMatrix& M, GlobalMatrix& K,
114 GlobalVector& b) final;
115
116 void assembleWithJacobian(const double t, double const dt,
117 std::vector<GlobalVector*> const& x,
118 std::vector<GlobalVector*> const& x_prev,
119 int const process_id, GlobalVector& b,
120 GlobalMatrix& Jac) final;
121
122 /* Computes data necessary for output.
123 *
124 * \pre Must be called before postTimestep() since the latter will overwrite
125 * previous states with current ones possibly affecting the data computed by
126 * this method.
127 */
128 void preOutput(const double t, double const dt,
129 std::vector<GlobalVector*> const& x,
130 std::vector<GlobalVector*> const& x_prev,
131 int const process_id);
132
133 std::vector<NumLib::IndexValueVector<GlobalIndexType>> const*
134 getKnownSolutions(double const t, GlobalVector const& x,
135 int const process_id) const final
136 {
137 return _boundary_conditions[process_id].getKnownSolutions(t, x);
138 }
139
141 const int /*process_id*/) const
142 {
144 }
145
146 MeshLib::Mesh& getMesh() const { return _mesh; }
147
148 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>> const&
150 {
151 return _process_variables;
152 }
153
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
195 bool requiresNormalization() const override { return false; }
196
197protected:
198 std::vector<NumLib::LocalToGlobalIndexMap const*> getDOFTables(
199 int const number_of_processes) const;
200
202 {
203 return _extrapolator_data.getExtrapolator();
204 }
205
207 {
208 return _extrapolator_data.getDOFTable();
209 }
210
217 const NumLib::LocalToGlobalIndexMap& dof_table, const int process_id,
218 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
219 media);
220
221private:
224 NumLib::LocalToGlobalIndexMap const& dof_table,
225 MeshLib::Mesh const& mesh,
226 unsigned const integration_order) = 0;
227
230 virtual void initializeBoundaryConditions(
231 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
232 media);
233
235 std::vector<GlobalVector*>& /*x*/,
236 double const /*t*/,
237 int const /*process_id*/)
238 {
239 }
240
241 virtual void preAssembleConcreteProcess(const double /*t*/,
242 double const /*dt*/,
243 GlobalVector const& /*x*/)
244 {
245 }
246
248 const double t, double const dt, std::vector<GlobalVector*> const& x,
249 std::vector<GlobalVector*> const& x_prev, int const process_id,
250 GlobalMatrix& M, GlobalMatrix& K, GlobalVector& b) = 0;
251
253 const double t, double const dt, std::vector<GlobalVector*> const& x,
254 std::vector<GlobalVector*> const& x_prev, int const process_id,
255 GlobalVector& b, GlobalMatrix& Jac) = 0;
256
258 std::vector<GlobalVector*> const& /*x*/,
259 const double /*t*/,
260 const double /*dt*/,
261 const int /*process_id*/)
262 {
263 }
264
266 std::vector<GlobalVector*> const& /*x*/,
267 std::vector<GlobalVector*> const& /*x_prev*/,
268 const double /*t*/,
269 const double /*dt*/,
270 int const /*process_id*/)
271 {
272 }
273
275 std::vector<GlobalVector*> const& /*x*/,
276 std::vector<GlobalVector*> const& /*x_prev*/, const double /*t*/,
277 double const /*dt*/, int const /*process_id*/)
278 {
279 }
280
281 virtual void preIterationConcreteProcess(const unsigned /*iter*/,
282 GlobalVector const& /*x*/)
283 {
284 }
285
287 double const /*t*/,
288 double const /*dt*/,
289 std::vector<GlobalVector*> const& /*x*/,
290 GlobalVector const& /*x_prev*/,
291 int const /*process_id*/)
292 {
293 }
294
300
302 const double /*t*/, double const /*dt*/,
303 std::vector<GlobalVector*> const& /*x*/,
304 std::vector<GlobalVector*> const& /*x_prev*/, int const /*process_id*/)
305 {
306 }
307
308protected:
315 virtual void constructDofTable();
316
322
329 const int specified_process_id);
330
339 virtual std::tuple<NumLib::LocalToGlobalIndexMap*, bool>
341
344 std::vector<GlobalIndexType>
346
350 void setReleaseNodalForces(GlobalVector const* r_neq,
351 int const process_id) override;
352
353private:
355
359
360public:
361 std::string const name;
362
363protected:
365 std::unique_ptr<MeshLib::MeshSubset const> _mesh_subset_all_nodes;
366
367 std::unique_ptr<NumLib::LocalToGlobalIndexMap> _local_to_global_index_map;
368
370
372
373 // TODO (CL) switch to the parallel vector matrix assembler here, once
374 // feature complete, or use the assembly mixin and remove these two members.
375 std::unique_ptr<ProcessLib::AbstractJacobianAssembler> _jacobian_assembler;
377
379
383 unsigned const _integration_order;
384
388 std::vector<std::unique_ptr<MeshLib::IntegrationPointWriter>>
390
392
393protected:
398 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
400
404 std::vector<BoundaryConditionCollection> _boundary_conditions;
405
406private:
410 std::vector<SourceTermCollection> _source_term_collections;
411
413
415 std::vector<std::size_t> _ids_of_active_elements;
416};
417
418} // namespace ProcessLib
MathLib::EigenMatrix GlobalMatrix
MathLib::SparsityPattern< GlobalIndexType > GlobalSparsityPattern
MathLib::EigenVector GlobalVector
std::string const name
Definition Process.h:361
std::vector< NumLib::IndexValueVector< GlobalIndexType > > const * getKnownSolutions(double const t, GlobalVector const &x, int const process_id) const final
Definition Process.h:134
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > const & getIntegrationPointWriters() const
Definition Process.h:171
MeshLib::Mesh & getMesh() const
Definition Process.h:146
virtual NumLib::IterationResult postIterationConcreteProcess(GlobalVector const &)
Definition Process.h:295
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:257
std::vector< BoundaryConditionCollection > _boundary_conditions
Definition Process.h:404
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(int const number_of_processes) const
Definition Process.cpp:376
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > _integration_point_writer
Definition Process.h:389
SecondaryVariableCollection const & getSecondaryVariables() const
Definition Process.h:165
virtual void preIterationConcreteProcess(const unsigned, GlobalVector const &)
Definition Process.h:281
void constructDofTableOfSpecifiedProcessStaggeredScheme(const int specified_process_id)
Definition Process.cpp:345
static PROCESSLIB_EXPORT const std::string constant_one_parameter_name
Definition Process.h:40
void preAssemble(const double t, double const dt, GlobalVector const &x) final
Definition Process.cpp:252
virtual void initializeBoundaryConditions(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:98
void initialize(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:112
void initializeProcessBoundaryConditionsAndSourceTerms(const NumLib::LocalToGlobalIndexMap &dof_table, const int process_id, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:83
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:415
virtual bool isMonolithicSchemeUsed() const
Definition Process.h:95
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:258
CellAverageData cell_average_data_
Definition Process.h:371
virtual void postTimestepConcreteProcess(std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, const double, const double, int const)
Definition Process.h:265
void setReleaseNodalForces(GlobalVector const *r_neq, int const process_id) override
Definition Process.cpp:548
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:37
virtual void computeSecondaryVariableConcrete(double const, double const, std::vector< GlobalVector * > const &, GlobalVector const &, int const)
Definition Process.h:286
std::unique_ptr< MeshLib::MeshSubset const > _mesh_subset_all_nodes
Definition Process.h:365
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:491
MeshLib::Mesh & _mesh
Definition Process.h:364
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:399
std::vector< std::size_t > const & getActiveElementIDs() const
Definition Process.h:160
NumLib::LocalToGlobalIndexMap const & getSingleComponentDOFTable() const
Definition Process.h:206
virtual NumLib::LocalToGlobalIndexMap const & getDOFTable(const int) const
Definition Process.h:140
virtual void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &, double const, int const)
Definition Process.h:234
NumLib::IterationResult postIteration(GlobalVector const &x) final
Definition Process.cpp:485
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:444
bool requiresNormalization() const override
Definition Process.h:195
SecondaryVariableCollection _secondary_variables
Definition Process.h:369
virtual void assembleWithJacobianConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac)=0
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:434
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:466
void initializeExtrapolator()
Definition Process.cpp:411
virtual void postNonLinearSolverConcreteProcess(std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, const double, double const, int const)
Definition Process.h:274
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
Definition Process.h:155
virtual void constructDofTable()
Definition Process.cpp:299
void constructMonolithicProcessDofTable()
Definition Process.cpp:313
VectorMatrixAssembler _global_assembler
Definition Process.h:376
virtual void preAssembleConcreteProcess(const double, double const, GlobalVector const &)
Definition Process.h:241
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:456
std::vector< GlobalIndexType > getIndicesOfResiduumWithoutInitialCompensation() const override
Definition Process.cpp:503
unsigned const _integration_order
Definition Process.h:383
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Definition Process.h:367
std::vector< SourceTermCollection > _source_term_collections
Definition Process.h:410
virtual void extrapolateIntegrationPointValuesToNodes(const double, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > &)
Definition Process.h:100
std::unique_ptr< ProcessLib::AbstractJacobianAssembler > _jacobian_assembler
Definition Process.h:375
void updateDeactivatedSubdomains(double const time, const int process_id)
Definition Process.cpp:211
void computeSparsityPattern()
Definition Process.cpp:428
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
Definition Process.cpp:203
void setInitialConditions(std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, double const t, int const process_id)
Definition Process.cpp:133
void assembleWithJacobian(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac) final
Definition Process.cpp:279
virtual void preOutputConcreteProcess(const double, double const, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, int const)
Definition Process.h:301
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > const & getProcessVariables() const
Definition Process.h:149
ExtrapolatorData _extrapolator_data
Definition Process.h:412
NumLib::Extrapolator & getExtrapolator() const
Definition Process.h:201
GlobalSparsityPattern _sparsity_pattern
Definition Process.h:391
void preIteration(const unsigned iter, GlobalVector const &x) final
Definition Process.cpp:479
const bool _use_monolithic_scheme
Definition Process.h:378
virtual std::tuple< NumLib::LocalToGlobalIndexMap *, bool > getDOFTableForExtrapolatorData() const
Definition Process.cpp:387
Handles configuration of several secondary variables from the project file.
IterationResult
Status flags telling the NonlinearSolver if an iteration succeeded.
#define PROCESSLIB_EXPORT