OGS
SteadyStateDiffusion.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
11
12namespace ProcessLib
13{
15{
16class SteadyStateDiffusion final : public Process
17{
18public:
20 std::string name,
21 MeshLib::Mesh& mesh,
22 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&&
23 jacobian_assembler,
24 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
25 parameters,
26 unsigned const integration_order,
27 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
28 process_variables,
29 SteadyStateDiffusionData&& process_data,
30 SecondaryVariableCollection&& secondary_variables,
31 std::unique_ptr<ProcessLib::SurfaceFluxData>&& surfaceflux);
32
35
36 bool isLinear() const override { return true; }
38
39 Eigen::Vector3d getFlux(std::size_t element_id,
40 MathLib::Point3d const& p,
41 double const t,
42 std::vector<GlobalVector*> const& x) const override
43 {
44 // fetch local_x from primary variable
45 std::vector<GlobalIndexType> indices_cache;
46 auto const r_c_indices = NumLib::getRowColumnIndices(
47 element_id, *_local_to_global_index_map, indices_cache);
48 constexpr int process_id = 0; // monolithic scheme.
49 std::vector<double> local_x(x[process_id]->get(r_c_indices.rows));
50
51 return _local_assemblers[element_id]->getFlux(p, t, local_x);
52 }
53
55 std::vector<GlobalVector*> const& x,
56 std::vector<GlobalVector*> const& /*x_prev*/,
57 const double t,
58 const double /*delta_t*/,
59 int const process_id) override
60 {
61 // For this single process, process_id is always zero.
62 if (process_id != 0)
63 {
65 "The condition of process_id = 0 must be satisfied for "
66 "SteadyStateDiffusion, which is a single process.");
67 }
68 if (!_surfaceflux) // computing the surfaceflux is optional
69 {
70 return;
71 }
72
73 _surfaceflux->integrate(x, t, *this, process_id, _integration_order,
75 }
76
77private:
79 NumLib::LocalToGlobalIndexMap const& dof_table,
80 MeshLib::Mesh const& mesh,
81 unsigned const integration_order) override;
82
83 void assembleConcreteProcess(const double t, double const dt,
84 std::vector<GlobalVector*> const& x,
85 std::vector<GlobalVector*> const& x_prev,
86 int const process_id, GlobalMatrix& M,
87 GlobalMatrix& K, GlobalVector& b) override;
88
90 const double t, double const dt, std::vector<GlobalVector*> const& x,
91 std::vector<GlobalVector*> const& x_prev, int const process_id,
92 GlobalVector& b, GlobalMatrix& Jac) override;
93
95
96 std::vector<std::unique_ptr<SteadyStateDiffusionLocalAssemblerInterface>>
98
99 std::unique_ptr<ProcessLib::SurfaceFluxData> _surfaceflux;
100};
101
102} // namespace SteadyStateDiffusion
103} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
std::string const name
Definition Process.h:361
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
MeshLib::Mesh & _mesh
Definition Process.h:364
std::vector< std::size_t > const & getActiveElementIDs() const
Definition Process.h:160
unsigned const _integration_order
Definition Process.h:383
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Definition Process.h:367
Handles configuration of several secondary variables from the project file.
std::unique_ptr< ProcessLib::SurfaceFluxData > _surfaceflux
void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override
Process specific initialization called by initialize().
std::vector< std::unique_ptr< SteadyStateDiffusionLocalAssemblerInterface > > _local_assemblers
void postTimestepConcreteProcess(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &, const double t, const double, int const process_id) override
SteadyStateDiffusion(std::string name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::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, SteadyStateDiffusionData &&process_data, SecondaryVariableCollection &&secondary_variables, std::unique_ptr< ProcessLib::SurfaceFluxData > &&surfaceflux)
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) override
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) override
Eigen::Vector3d getFlux(std::size_t element_id, MathLib::Point3d const &p, double const t, std::vector< GlobalVector * > const &x) const override
NumLib::LocalToGlobalIndexMap::RowColumnIndices getRowColumnIndices(std::size_t const id, NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< GlobalIndexType > &indices)