OGS
SmallDeformationLocalAssemblerInterface.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 <utility>
7#include <vector>
8
9#include "BaseLib/Error.h"
12
13namespace ProcessLib
14{
15namespace LIE
16{
17namespace SmallDeformation
18{
22{
23public:
26 std::size_t n_local_size, std::vector<unsigned> dofIndex_to_localIndex)
27 : _dofIndex_to_localIndex(std::move(dofIndex_to_localIndex))
28 {
29 _local_u.resize(n_local_size);
30 _local_b.resize(_local_u.size());
31 _local_J.resize(_local_u.size(), _local_u.size());
32 }
33
34 void assembleWithJacobian(double const t, double const dt,
35 std::vector<double> const& local_x_,
36 std::vector<double> const& /*local_x_prev*/,
37 std::vector<double>& local_b_data,
38 std::vector<double>& local_Jac_data) override
39 {
40 auto const local_dof_size = local_x_.size();
41
42 _local_u.setZero();
43 for (unsigned i = 0; i < local_dof_size; i++)
44 {
45 _local_u[_dofIndex_to_localIndex[i]] = local_x_[i];
46 }
47 _local_b.setZero();
48 _local_J.setZero();
49
51
52 local_b_data.resize(local_dof_size);
53 for (unsigned i = 0; i < local_dof_size; i++)
54 {
55 local_b_data[i] = _local_b[_dofIndex_to_localIndex[i]];
56 }
57
58 local_Jac_data.resize(local_dof_size * local_dof_size);
59 for (unsigned i = 0; i < local_dof_size; i++)
60 {
61 for (unsigned j = 0; j < local_dof_size; j++)
62 {
63 local_Jac_data[i * local_dof_size + j] = _local_J(
65 }
66 }
67 }
68
69 virtual void assembleWithJacobian(double const /*t*/, double const /*dt*/,
70 Eigen::VectorXd const& /*local_u*/,
71 Eigen::VectorXd& /*local_b*/,
72 Eigen::MatrixXd& /*local_J*/)
73 {
75 "SmallDeformationLocalAssemblerInterface::assembleWithJacobian() "
76 "is not implemented");
77 }
78
80 double const t, double const /*dt*/, Eigen::VectorXd const& local_x,
81 Eigen::VectorXd const& /*local_x_prev*/) override
82 {
83 if (!_dofIndex_to_localIndex.empty())
84 {
85 _local_u.setZero();
86 for (auto i = 0; i < local_x.rows(); i++)
87 {
88 _local_u[_dofIndex_to_localIndex[i]] = local_x[i];
89 }
90 }
91
93 }
94
95 virtual std::vector<double> const& getIntPtSigma(
96 const double t,
97 std::vector<GlobalVector*> const& x,
98 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
99 std::vector<double>& cache) const = 0;
100
101 virtual std::vector<double> const& getIntPtEpsilon(
102 const double t,
103 std::vector<GlobalVector*> const& x,
104 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
105 std::vector<double>& cache) const = 0;
106
107 virtual std::vector<double> const& getIntPtFractureStress(
108 const double t,
109 std::vector<GlobalVector*> const& x,
110 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
111 std::vector<double>& cache) const = 0;
112
113 virtual std::vector<double> const& getIntPtFractureAperture(
114 const double t,
115 std::vector<GlobalVector*> const& x,
116 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
117 std::vector<double>& cache) const = 0;
118
119protected:
121 double const t, Eigen::VectorXd const& local_u) = 0;
122
123private:
124 Eigen::VectorXd _local_u;
125 Eigen::VectorXd _local_b;
126 Eigen::MatrixXd _local_J;
127 std::vector<unsigned> const _dofIndex_to_localIndex;
128};
129
130} // namespace SmallDeformation
131} // namespace LIE
132} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual std::vector< double > const & getIntPtEpsilon(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual std::vector< double > const & getIntPtFractureAperture(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
void assembleWithJacobian(double const t, double const dt, std::vector< double > const &local_x_, std::vector< double > const &, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
SmallDeformationLocalAssemblerInterface(std::size_t n_local_size, std::vector< unsigned > dofIndex_to_localIndex)
virtual void computeSecondaryVariableConcreteWithVector(double const t, Eigen::VectorXd const &local_u)=0
virtual std::vector< double > const & getIntPtSigma(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
void computeSecondaryVariableConcrete(double const t, double const, Eigen::VectorXd const &local_x, Eigen::VectorXd const &) override
virtual void assembleWithJacobian(double const, double const, Eigen::VectorXd const &, Eigen::VectorXd &, Eigen::MatrixXd &)
virtual std::vector< double > const & getIntPtFractureStress(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0