Skip to content
Snippets Groups Projects
Commit 5bc6f8ae authored by Tom Fischer's avatar Tom Fischer
Browse files

Merge branch 'H_body_force' into 'master'

[LiquidFlow]  Use body force vector in the local assember

See merge request ogs/ogs!3623
parents ad0feafe dffc636b
No related branches found
No related tags found
No related merge requests found
...@@ -90,15 +90,12 @@ std::unique_ptr<Process> createLiquidFlowProcess( ...@@ -90,15 +90,12 @@ std::unique_ptr<Process> createLiquidFlowProcess(
"dimension is {:d}", "dimension is {:d}",
b.size(), mesh.getDimension()); b.size(), mesh.getDimension());
} }
int gravity_axis_id = -1; // default: no gravity
double const g = -b[mesh.getDimension()-1]; Eigen::VectorXd specific_body_force(b.size());
bool const has_gravity = MathLib::toVector(b).norm() > 0; bool const has_gravity = MathLib::toVector(b).norm() > 0;
if (has_gravity) if (has_gravity)
{ {
if (g != 0.0) std::copy_n(b.data(), b.size(), specific_body_force.data());
{
gravity_axis_id = mesh.getDimension()-1;
}
} }
std::unique_ptr<ProcessLib::SurfaceFluxData> surfaceflux; std::unique_ptr<ProcessLib::SurfaceFluxData> surfaceflux;
...@@ -118,7 +115,8 @@ std::unique_ptr<Process> createLiquidFlowProcess( ...@@ -118,7 +115,8 @@ std::unique_ptr<Process> createLiquidFlowProcess(
checkMPLProperties(mesh, *media_map); checkMPLProperties(mesh, *media_map);
DBUG("Media properties verified."); DBUG("Media properties verified.");
LiquidFlowData process_data{std::move(media_map), gravity_axis_id, g}; LiquidFlowData process_data{std::move(media_map),
std::move(specific_body_force), has_gravity};
return std::make_unique<LiquidFlowProcess>( return std::make_unique<LiquidFlowProcess>(
std::move(name), mesh, std::move(jacobian_assembler), parameters, std::move(name), mesh, std::move(jacobian_assembler), parameters,
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#pragma once #pragma once
#include <Eigen/Dense>
#include <memory> #include <memory>
namespace MaterialPropertyLib namespace MaterialPropertyLib
...@@ -25,8 +26,8 @@ struct LiquidFlowData final ...@@ -25,8 +26,8 @@ struct LiquidFlowData final
{ {
std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap> std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
media_map; media_map;
const int gravitational_axis_id; Eigen::VectorXd const specific_body_force;
const double gravitational_acceleration; bool const has_gravity;
}; };
} // namespace LiquidFlow } // namespace LiquidFlow
......
...@@ -190,9 +190,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -190,9 +190,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
// Assemble Laplacian, K, and RHS by the gravitational term // Assemble Laplacian, K, and RHS by the gravitational term
LaplacianGravityVelocityCalculator::calculateLaplacianAndGravityTerm( LaplacianGravityVelocityCalculator::calculateLaplacianAndGravityTerm(
local_K, local_b, ip_data, permeability, viscosity, local_K, local_b, ip_data, permeability, viscosity, fluid_density,
fluid_density * _process_data.gravitational_acceleration, _process_data);
_process_data.gravitational_axis_id);
} }
} }
...@@ -299,9 +298,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -299,9 +298,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
medium[MaterialPropertyLib::PropertyType::permeability].value( medium[MaterialPropertyLib::PropertyType::permeability].value(
vars, pos, t, dt)); vars, pos, t, dt));
LaplacianGravityVelocityCalculator::calculateVelocity( LaplacianGravityVelocityCalculator::calculateVelocity(
ip, local_p_vec, ip_data, permeability, viscosity, ip, local_p_vec, ip_data, permeability, viscosity, fluid_density,
fluid_density * _process_data.gravitational_acceleration, darcy_velocity_at_ips, _process_data);
_process_data.gravitational_axis_id, darcy_velocity_at_ips);
} }
} }
...@@ -314,20 +312,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -314,20 +312,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id) double const rho_L, const LiquidFlowData& process_data)
{ {
const double K = permeability(0, 0) / mu; const double K = permeability(0, 0) / mu;
const double fac = K * ip_data.integration_weight; const double fac = K * ip_data.integration_weight;
local_K.noalias() += fac * ip_data.dNdx.transpose() * ip_data.dNdx; local_K.noalias() += fac * ip_data.dNdx.transpose() * ip_data.dNdx;
if (gravitational_axis_id >= 0) if (process_data.has_gravity)
{ {
// Note: Since permeability, K, is a scalar number in this function, local_b.noalias() += (fac * rho_L) * ip_data.dNdx.transpose() *
// (gradN)*K*V becomes K*(grad N)*V. With the gravity vector of V, process_data.specific_body_force;
// the simplification of (grad N)*V is the gravitational_axis_id th
// column of the transpose of (grad N) multiplied with rho_g.
local_b.noalias() -=
fac * ip_data.dNdx.transpose().col(gravitational_axis_id) * rho_g;
} }
} }
...@@ -339,16 +333,18 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -339,16 +333,18 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id, double const rho_L,
MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips,
const LiquidFlowData& process_data)
{ {
const double K = permeability(0, 0) / mu; const double K = permeability(0, 0) / mu;
// Compute the velocity // Compute the velocity
darcy_velocity_at_ips.col(ip).noalias() = -K * ip_data.dNdx * local_p; darcy_velocity_at_ips.col(ip).noalias() = -K * ip_data.dNdx * local_p;
// gravity term // gravity term
if (gravitational_axis_id >= 0) if (process_data.has_gravity)
{ {
darcy_velocity_at_ips.col(ip)[gravitational_axis_id] -= K * rho_g; darcy_velocity_at_ips.col(ip).noalias() +=
(K * rho_L) * process_data.specific_body_force;
} }
} }
...@@ -361,19 +357,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -361,19 +357,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id) double const rho_L, const LiquidFlowData& process_data)
{ {
const double fac = ip_data.integration_weight / mu; const double fac = ip_data.integration_weight / mu;
local_K.noalias() += local_K.noalias() +=
fac * ip_data.dNdx.transpose() * permeability * ip_data.dNdx; fac * ip_data.dNdx.transpose() * permeability * ip_data.dNdx;
if (gravitational_axis_id >= 0)
if (process_data.has_gravity)
{ {
// Note: permeability * gravity_vector = rho_g * local_b.noalias() += (fac * rho_L) * ip_data.dNdx.transpose() *
// permeability.col(gravitational_axis_id) permeability * process_data.specific_body_force;
// i.e the result is the gravitational_axis_id th column of
// permeability multiplied with rho_g.
local_b.noalias() -= fac * rho_g * ip_data.dNdx.transpose() *
permeability.col(gravitational_axis_id);
} }
} }
...@@ -385,16 +378,18 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -385,16 +378,18 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id, double const rho_L,
MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips,
const LiquidFlowData& process_data)
{ {
// Compute the velocity // Compute the velocity
darcy_velocity_at_ips.col(ip).noalias() = darcy_velocity_at_ips.col(ip).noalias() =
-permeability * ip_data.dNdx * local_p / mu; -permeability * ip_data.dNdx * local_p / mu;
if (gravitational_axis_id >= 0) // gravity term
if (process_data.has_gravity)
{ {
darcy_velocity_at_ips.col(ip).noalias() -= darcy_velocity_at_ips.col(ip).noalias() +=
rho_g * permeability.col(gravitational_axis_id) / mu; (rho_L / mu) * permeability * process_data.specific_body_force;
} }
} }
......
...@@ -37,10 +37,9 @@ struct IntegrationPointData final ...@@ -37,10 +37,9 @@ struct IntegrationPointData final
explicit IntegrationPointData(NodalRowVectorType const& N_, explicit IntegrationPointData(NodalRowVectorType const& N_,
GlobalDimNodalMatrixType const& dNdx_, GlobalDimNodalMatrixType const& dNdx_,
double const& integration_weight_) double const& integration_weight_)
: N(N_), : N(N_), dNdx(dNdx_), integration_weight(integration_weight_)
dNdx(dNdx_), {
integration_weight(integration_weight_) }
{}
NodalRowVectorType const N; NodalRowVectorType const N;
GlobalDimNodalMatrixType const dNdx; GlobalDimNodalMatrixType const dNdx;
...@@ -83,12 +82,11 @@ class LiquidFlowLocalAssembler : public LiquidFlowLocalAssemblerInterface ...@@ -83,12 +82,11 @@ class LiquidFlowLocalAssembler : public LiquidFlowLocalAssemblerInterface
Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>; Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>;
public: public:
LiquidFlowLocalAssembler( LiquidFlowLocalAssembler(MeshLib::Element const& element,
MeshLib::Element const& element, std::size_t const /*local_matrix_size*/,
std::size_t const /*local_matrix_size*/, bool const is_axially_symmetric,
bool const is_axially_symmetric, unsigned const integration_order,
unsigned const integration_order, LiquidFlowData const& process_data)
LiquidFlowData const& process_data)
: _element(element), : _element(element),
_integration_method(integration_order), _integration_method(integration_order),
_process_data(process_data) _process_data(process_data)
...@@ -162,15 +160,16 @@ private: ...@@ -162,15 +160,16 @@ private:
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id); double const rho_L, const LiquidFlowData& process_data);
static void calculateVelocity( static void calculateVelocity(
unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p,
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id, double const rho_L,
MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips); MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips,
const LiquidFlowData& process_data);
}; };
/** /**
...@@ -185,15 +184,16 @@ private: ...@@ -185,15 +184,16 @@ private:
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id); double const rho_L, const LiquidFlowData& process_data);
static void calculateVelocity( static void calculateVelocity(
unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p,
IntegrationPointData<NodalRowVectorType, IntegrationPointData<NodalRowVectorType,
GlobalDimNodalMatrixType> const& ip_data, GlobalDimNodalMatrixType> const& ip_data,
Eigen::MatrixXd const& permeability, double const mu, Eigen::MatrixXd const& permeability, double const mu,
double const rho_g, int const gravitational_axis_id, double const rho_L,
MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips); MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips,
const LiquidFlowData& process_data);
}; };
template <typename LaplacianGravityVelocityCalculator> template <typename LaplacianGravityVelocityCalculator>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment