Skip to content
Snippets Groups Projects
Commit 0d637835 authored by wenqing's avatar wenqing
Browse files

[Coupling] Added local assembler of the coupled terms

 for the staggered scheme.
parent 42c19d6f
No related branches found
No related tags found
No related merge requests found
Showing
with 93 additions and 34 deletions
......@@ -14,6 +14,7 @@
namespace ProcessLib
{
class LocalAssemblerInterface;
struct LocalCouplingTerm;
//! Base class for Jacobian assemblers.
class AbstractJacobianAssembler
......@@ -29,6 +30,18 @@ public:
std::vector<double>& local_K_data, std::vector<double>& local_b_data,
std::vector<double>& local_Jac_data) = 0;
//! Assembles the Jacobian, the matrices \f$M\f$ and \f$K\f$, and the vector
//! \f$b\f$ with coupling.
virtual void coupling_assembleWithJacobian(
LocalAssemblerInterface& /*local_assembler*/, double const /*t*/,
std::vector<double> const& /*local_x*/,
std::vector<double> const& /*local_xdot*/, const double /*dxdot_dx*/,
const double /*dx_dx*/, std::vector<double>& /*local_M_data*/,
std::vector<double>& /*local_K_data*/,
std::vector<double>& /*local_b_data*/,
std::vector<double>& /*local_Jac_data*/,
LocalCouplingTerm const& /*coupled_term*/) {}
virtual ~AbstractJacobianAssembler() = default;
};
......
......@@ -78,14 +78,14 @@ void GroundwaterFlowProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm
const& /*coupled_term*/)
const& coupled_term)
{
DBUG("Assemble GroundwaterFlowProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void GroundwaterFlowProcess::assembleWithJacobianConcreteProcess(
......
......@@ -73,14 +73,14 @@ void HTProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/)
coupled_term)
{
DBUG("Assemble HTProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void HTProcess::assembleWithJacobianConcreteProcess(
......
......@@ -74,14 +74,14 @@ void HeatConductionProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm
const& /*coupled_term*/)
const& coupled_term)
{
DBUG("Assemble HeatConductionProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void HeatConductionProcess::assembleWithJacobianConcreteProcess(
......
......@@ -200,9 +200,7 @@ public:
std::vector<double>& /*local_M_data*/,
std::vector<double>& /*local_K_data*/,
std::vector<double>& local_rhs_data,
std::vector<double>& local_Jac_data,
LocalCouplingTerm const& /*coupled_term*/
) override
std::vector<double>& local_Jac_data) override
{
assert(local_x.size() == pressure_size + displacement_size);
......
......@@ -111,14 +111,15 @@ private:
GlobalMatrix& M, GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/) override
coupled_term) override
{
DBUG("Assemble HydroMechanicsProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble,
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b);
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b,
coupled_term);
}
void assembleWithJacobianConcreteProcess(
......
......@@ -72,20 +72,22 @@ private:
GlobalMatrix& M, GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/) override
coupled_term) override
{
DBUG("Assemble HydroMechanicsProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble,
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b);
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b,
coupled_term);
}
void assembleWithJacobianConcreteProcess(
const double t, GlobalVector const& x, GlobalVector const& xdot,
const double dxdot_dx, const double dx_dx, GlobalMatrix& M,
GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac) override
GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac,
StaggeredCouplingTerm const& coupled_term) override
{
DBUG("AssembleWithJacobian HydroMechanicsProcess.");
......@@ -93,7 +95,7 @@ private:
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assembleWithJacobian,
_local_assemblers, *_local_to_global_index_map, t, x, xdot,
dxdot_dx, dx_dx, M, K, b, Jac);
dxdot_dx, dx_dx, M, K, b, Jac, coupled_term);
}
void preTimestepConcreteProcess(GlobalVector const& x, double const t,
......
......@@ -70,14 +70,15 @@ private:
GlobalMatrix& M, GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/) override
coupled_term) override
{
DBUG("Assemble SmallDeformationProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble,
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b);
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b,
coupled_term);
}
void assembleWithJacobianConcreteProcess(
......
......@@ -94,13 +94,13 @@ void LiquidFlowProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/)
coupled_term)
{
DBUG("Assemble LiquidFlowProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void LiquidFlowProcess::assembleWithJacobianConcreteProcess(
......
......@@ -13,6 +13,19 @@
namespace ProcessLib
{
void LocalAssemblerInterface::coupling_assemble(
double const /*t*/, std::vector<double> const& /*local_x*/,
std::vector<double>& /*local_M_data*/,
std::vector<double>& /*local_K_data*/,
std::vector<double>& /*local_b_data*/,
LocalCouplingTerm const& /*coupled_term*/)
{
OGS_FATAL(
"The coupling_assemble() function is not implemented in the local "
"assembler.");
}
void LocalAssemblerInterface::assembleWithJacobian(
double const /*t*/, std::vector<double> const& /*local_x*/,
std::vector<double> const& /*local_xdot*/, const double /*dxdot_dx*/,
......@@ -26,6 +39,20 @@ void LocalAssemblerInterface::assembleWithJacobian(
"assembler.");
}
void LocalAssemblerInterface::coupling_assembleWithJacobian(
double const /*t*/, std::vector<double> const& /*local_x*/,
std::vector<double> const& /*local_xdot*/, const double /*dxdot_dx*/,
const double /*dx_dx*/, std::vector<double>& /*local_M_data*/,
std::vector<double>& /*local_K_data*/,
std::vector<double>& /*local_b_data*/,
std::vector<double>& /*local_Jac_data*/,
LocalCouplingTerm const& /*coupled_term*/)
{
OGS_FATAL(
"The coupling_assembleWithJacobian() function is not implemented in"
" the local.");
}
void LocalAssemblerInterface::computeSecondaryVariable(
std::size_t const mesh_item_id,
NumLib::LocalToGlobalIndexMap const& dof_table,
......
......@@ -11,6 +11,7 @@
#include "NumLib/NumericsConfig.h"
#include "MathLib/Point3d.h"
#include "StaggeredCouplingTerm.h"
namespace NumLib
{
......@@ -35,6 +36,12 @@ public:
std::vector<double>& local_M_data, std::vector<double>& local_K_data,
std::vector<double>& local_b_data) = 0;
virtual void coupling_assemble(
double const t, std::vector<double> const& local_x,
std::vector<double>& local_M_data, std::vector<double>& local_K_data,
std::vector<double>& local_b_data,
LocalCouplingTerm const& coupled_term);
virtual void assembleWithJacobian(double const t,
std::vector<double> const& local_x,
std::vector<double> const& local_xdot,
......@@ -44,6 +51,16 @@ public:
std::vector<double>& local_b_data,
std::vector<double>& local_Jac_data);
virtual void coupling_assembleWithJacobian(double const t,
std::vector<double> const& local_x,
std::vector<double> const& local_xdot,
const double dxdot_dx, const double dx_dx,
std::vector<double>& local_M_data,
std::vector<double>& local_K_data,
std::vector<double>& local_b_data,
std::vector<double>& local_Jac_data,
LocalCouplingTerm const& coupled_term);
virtual void computeSecondaryVariable(std::size_t const mesh_item_id,
NumLib::LocalToGlobalIndexMap const& dof_table,
const double t, GlobalVector const& x);
......
......@@ -57,14 +57,14 @@ void RichardsFlowProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/)
coupled_term)
{
DBUG("Assemble RichardsFlowProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void RichardsFlowProcess::assembleWithJacobianConcreteProcess(
......
......@@ -148,14 +148,15 @@ private:
GlobalMatrix& M, GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm const&
/*coupled_term*/) override
coupled_term) override
{
DBUG("Assemble SmallDeformationProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble,
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b);
_local_assemblers, *_local_to_global_index_map, t, x, M, K, b,
coupled_term);
}
void assembleWithJacobianConcreteProcess(
......
......@@ -228,14 +228,14 @@ void TESProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm
const& /*coupled_term*/)
const& coupled_term)
{
DBUG("Assemble TESProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void TESProcess::assembleWithJacobianConcreteProcess(
......
......@@ -74,13 +74,13 @@ void TwoPhaseFlowWithPPProcess::assembleConcreteProcess(const double t,
GlobalMatrix& K,
GlobalVector& b,
StaggeredCouplingTerm
const& /*coupled_term*/)
const& coupled_term)
{
DBUG("Assemble TwoPhaseFlowWithPPProcess.");
// Call global assembler for each local assembly item.
GlobalExecutor::executeMemberDereferenced(
_global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
*_local_to_global_index_map, t, x, M, K, b);
*_local_to_global_index_map, t, x, M, K, b, coupled_term);
}
void TwoPhaseFlowWithPPProcess::assembleWithJacobianConcreteProcess(
......
......@@ -41,8 +41,7 @@ void VectorMatrixAssembler::assemble(
if (coupled_term.coupled_processes.empty())
{
local_assembler.assemble(t, local_x, _local_M_data, _local_K_data,
_local_b_data,
ProcessLib::createVoidLocalCouplingTerm());
_local_b_data);
}
else
{
......@@ -62,8 +61,9 @@ void VectorMatrixAssembler::assemble(
ProcessLib::LocalCouplingTerm local_coupling_term(
coupled_term.coupled_processes, std::move(local_coupled_xs));
local_assembler.assemble(t, local_x, _local_M_data, _local_K_data,
_local_b_data, local_coupling_term);
local_assembler.coupling_assemble(t, local_x, _local_M_data,
_local_K_data, _local_b_data,
local_coupling_term);
}
auto const num_r_c = indices.size();
......@@ -107,8 +107,7 @@ void VectorMatrixAssembler::assembleWithJacobian(
{
_jacobian_assembler->assembleWithJacobian(
local_assembler, t, local_x, local_xdot, dxdot_dx, dx_dx,
_local_M_data, _local_K_data, _local_b_data, _local_Jac_data,
ProcessLib::createVoidLocalCouplingTerm());
_local_M_data, _local_K_data, _local_b_data, _local_Jac_data);
}
else
{
......@@ -128,7 +127,7 @@ void VectorMatrixAssembler::assembleWithJacobian(
ProcessLib::LocalCouplingTerm local_coupling_term(
coupled_term.coupled_processes, std::move(local_coupled_xs));
_jacobian_assembler->assembleWithJacobian(
_jacobian_assembler->coupling_assembleWithJacobian(
local_assembler, t, local_x, local_xdot, dxdot_dx, dx_dx,
_local_M_data, _local_K_data, _local_b_data, _local_Jac_data,
local_coupling_term);
......
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