OGS
LiquidFlowLocalAssembler.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 <Eigen/Core>
7#include <optional>
8#include <vector>
9
10#include "LiquidFlowData.h"
24
25namespace ProcessLib
26{
27namespace LiquidFlow
28{
29template <typename GlobalDimNodalMatrixType>
31{
32 explicit IntegrationPointData(GlobalDimNodalMatrixType const& dNdx_,
33 double const& integration_weight_)
34 : dNdx(dNdx_), integration_weight(integration_weight_)
35 {
36 }
37
38 GlobalDimNodalMatrixType const dNdx;
39 double const integration_weight;
40
42};
43
44const unsigned NUM_NODAL_DOF = 1;
45
49{
50public:
51 virtual std::vector<double> const& getIntPtDarcyVelocity(
52 const double t,
53 std::vector<GlobalVector*> const& x,
54 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables,
55 std::vector<double>& cache) const = 0;
56};
57
58template <typename ShapeFunction, int GlobalDim>
60{
63
65 ShapeMatricesType, ShapeFunction::NPOINTS, NUM_NODAL_DOF, GlobalDim>;
66
74
75public:
77 MeshLib::Element const& element,
78 std::size_t const /*local_matrix_size*/,
79 NumLib::GenericIntegrationMethod const& integration_method,
80 bool const is_axially_symmetric,
81 LiquidFlowData const& process_data)
82 : _element(element),
83 _integration_method(integration_method),
84 _process_data(process_data)
85 {
86 unsigned const n_integration_points =
87 _integration_method.getNumberOfPoints();
88 _ip_data.reserve(n_integration_points);
89
90 auto const& shape_matrices =
92 GlobalDim>(element, is_axially_symmetric,
94
95 for (unsigned ip = 0; ip < n_integration_points; ip++)
96 {
97 auto const& N = shape_matrices[ip].N;
99 std::nullopt, _element.getID(),
103 N))};
104
105 double const aperture_size =
106 (_element.getDimension() == 3u)
107 ? 1.0
108 : _process_data.aperture_size(0.0, pos)[0];
109
110 _ip_data.emplace_back(
111 shape_matrices[ip].dNdx,
112 _integration_method.getWeightedPoint(ip).getWeight() *
113 shape_matrices[ip].integralMeasure *
114 shape_matrices[ip].detJ * aperture_size);
115 }
116 }
117
118 void assemble(double const t, double const dt,
119 std::vector<double> const& local_x,
120 std::vector<double> const& /*local_x_prev*/,
121 std::vector<double>& local_M_data,
122 std::vector<double>& local_K_data,
123 std::vector<double>& local_b_data) override;
124
127 Eigen::Vector3d getFlux(MathLib::Point3d const& p_local_coords,
128 double const t,
129 std::vector<double> const& local_x) const override;
130
131 Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
132 const unsigned integration_point) const override
133 {
134 auto const& N =
135 _process_data.shape_matrix_cache
136 .NsHigherOrder<typename ShapeFunction::MeshElement>();
137
138 // assumes N is stored contiguously in memory
139 return Eigen::Map<const Eigen::RowVectorXd>(
140 N[integration_point].data(), N[integration_point].size());
141 }
142
143 std::vector<double> const& getIntPtDarcyVelocity(
144 const double t,
145 std::vector<GlobalVector*> const& x,
146 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
147 std::vector<double>& velocity_cache) const override;
148
149private:
151
153 std::vector<IntegrationPointData<GlobalDimNodalMatrixType>> _ip_data;
154
160 {
162 Eigen::Map<NodalMatrixType>& local_K,
163 Eigen::Map<NodalVectorType>& local_b,
165 GlobalDimMatrixType const& permeability_with_density_factor,
166 double const mu, double const rho_L,
167 GlobalDimVectorType const& specific_body_force,
168 bool const has_gravity);
169
170 static Eigen::Matrix<double, GlobalDim, 1> calculateVelocity(
171 Eigen::Map<const NodalVectorType> const& local_p,
173 GlobalDimMatrixType const& permeability, double const mu,
174 double const rho_L, GlobalDimVectorType const& specific_body_force,
175 bool const has_gravity);
176 };
177
183 {
185 Eigen::Map<NodalMatrixType>& local_K,
186 Eigen::Map<NodalVectorType>& local_b,
188 GlobalDimMatrixType const& permeability_with_density_factor,
189 double const mu, double const rho_L,
190 GlobalDimVectorType const& specific_body_force,
191 bool const has_gravity);
192
193 static Eigen::Matrix<double, GlobalDim, 1> calculateVelocity(
194 Eigen::Map<const NodalVectorType> const& local_p,
196 GlobalDimMatrixType const& permeability, double const mu,
197 double const rho_L, GlobalDimVectorType const& specific_body_force,
198 bool const has_gravity);
199 };
200
201 template <typename LaplacianGravityVelocityCalculator>
202 void assembleMatrixAndVector(double const t, double const dt,
203 std::vector<double> const& local_x,
204 std::vector<double>& local_M_data,
205 std::vector<double>& local_K_data,
206 std::vector<double>& local_b_data);
207
208 template <typename LaplacianGravityVelocityCalculator,
209 typename VelocityCacheType>
211 const double t, const double dt, std::vector<double> const& local_x,
213 VelocityCacheType& darcy_velocity_at_ips) const;
214
215 template <typename VelocityCacheType>
216 void computeDarcyVelocity(bool const is_scalar_permeability, const double t,
217 const double dt,
218 std::vector<double> const& local_x,
220 VelocityCacheType& darcy_velocity_at_ips) const;
221
223};
224
225} // namespace LiquidFlow
226} // namespace ProcessLib
227
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType
virtual std::vector< double > const & getIntPtDarcyVelocity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< double > &cache) const =0
Eigen::Vector3d getFlux(MathLib::Point3d const &p_local_coords, double const t, std::vector< double > const &local_x) const override
std::vector< IntegrationPointData< GlobalDimNodalMatrixType > > _ip_data
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
typename LocalAssemblerTraits::LocalMatrix NodalMatrixType
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
typename ShapeMatricesType::GlobalDimVectorType GlobalDimVectorType
LiquidFlowLocalAssembler(MeshLib::Element const &element, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, LiquidFlowData const &process_data)
typename ShapeMatricesType::NodalRowVectorType NodalRowVectorType
ShapeMatrixPolicyType< ShapeFunction, GlobalDim > ShapeMatricesType
void computeProjectedDarcyVelocity(const double t, const double dt, std::vector< double > const &local_x, ParameterLib::SpatialPosition const &pos, VelocityCacheType &darcy_velocity_at_ips) const
typename LocalAssemblerTraits::LocalVector NodalVectorType
void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data) override
NumLib::GenericIntegrationMethod const & _integration_method
ProcessLib::LocalAssemblerTraits< ShapeMatricesType, ShapeFunction::NPOINTS, NUM_NODAL_DOF, GlobalDim > LocalAssemblerTraits
void assembleMatrixAndVector(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
void computeDarcyVelocity(bool const is_scalar_permeability, const double t, const double dt, std::vector< double > const &local_x, ParameterLib::SpatialPosition const &pos, VelocityCacheType &darcy_velocity_at_ips) const
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
typename ShapeMatricesType::GlobalDimNodalMatrixType GlobalDimNodalMatrixType
std::vector< double > const & getIntPtDarcyVelocity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &velocity_cache) const override
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
detail::LocalAssemblerTraitsFixed< ShpPol, NNodes, NodalDOF, Dim > LocalAssemblerTraits
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
MatrixType< GlobalDim, ShapeFunction::NPOINTS > GlobalDimNodalMatrixType
MatrixType< GlobalDim, GlobalDim > GlobalDimMatrixType
VectorType< GlobalDim > GlobalDimVectorType
RowVectorType< ShapeFunction::NPOINTS > NodalRowVectorType
IntegrationPointData(GlobalDimNodalMatrixType const &dNdx_, double const &integration_weight_)
static void calculateLaplacianAndGravityTerm(Eigen::Map< NodalMatrixType > &local_K, Eigen::Map< NodalVectorType > &local_b, IntegrationPointData< GlobalDimNodalMatrixType > const &ip_data, GlobalDimMatrixType const &permeability_with_density_factor, double const mu, double const rho_L, GlobalDimVectorType const &specific_body_force, bool const has_gravity)
static Eigen::Matrix< double, GlobalDim, 1 > calculateVelocity(Eigen::Map< const NodalVectorType > const &local_p, IntegrationPointData< GlobalDimNodalMatrixType > const &ip_data, GlobalDimMatrixType const &permeability, double const mu, double const rho_L, GlobalDimVectorType const &specific_body_force, bool const has_gravity)
static void calculateLaplacianAndGravityTerm(Eigen::Map< NodalMatrixType > &local_K, Eigen::Map< NodalVectorType > &local_b, IntegrationPointData< GlobalDimNodalMatrixType > const &ip_data, GlobalDimMatrixType const &permeability_with_density_factor, double const mu, double const rho_L, GlobalDimVectorType const &specific_body_force, bool const has_gravity)
static Eigen::Matrix< double, GlobalDim, 1 > calculateVelocity(Eigen::Map< const NodalVectorType > const &local_p, IntegrationPointData< GlobalDimNodalMatrixType > const &ip_data, GlobalDimMatrixType const &permeability, double const mu, double const rho_L, GlobalDimVectorType const &specific_body_force, bool const has_gravity)
Matrix< NNodes *NodalDOF, NNodes *NodalDOF > LocalMatrix