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

[PCS] Added the computation of the secondary variables after during the un-coupling

parent 8b694e40
No related branches found
No related tags found
No related merge requests found
...@@ -154,9 +154,67 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: ...@@ -154,9 +154,67 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
template <typename ShapeFunction, typename IntegrationMethod, template <typename ShapeFunction, typename IntegrationMethod,
unsigned GlobalDim> unsigned GlobalDim>
void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
computeSecondaryVariable(std::vector<double> const& local_x) computeSecondaryVariableConcrete(std::vector<double> const& local_x)
{ {
(void) local_x; auto const local_matrix_size = local_x.size();
assert(local_matrix_size == ShapeFunction::NPOINTS);
const auto local_p_vec =
MathLib::toVector<NodalVectorType>(local_x, local_matrix_size);
unsigned const n_integration_points =
_integration_method.getNumberOfPoints();
SpatialPosition pos;
pos.setElementID(_element.getID());
_material_properties.setMaterialID(pos);
const Eigen::MatrixXd& perm =
_material_properties.getPermeability(t, pos, _element.getDimension());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
auto const& sm = _shape_matrices[ip];
double p = 0.;
NumLib::shapeFunctionInterpolate(local_x, sm.N, p);
// TODO : compute _temperature from the heat transport pcs
const double rho_g =
_material_properties.getLiquidDensity(p, _temperature) *
_gravitational_acceleration;
// Compute viscosity:
const double mu = _material_properties.getViscosity(p, _temperature);
// Assemble Laplacian, K, and RHS by the gravitational term
if (perm.size() == 1) // Save time for isotropic permeability.
{
// Use scalar number for isotropic permeability
// to save the computation time.
const double K = perm(0, 0) / mu;
// Compute the velocity
GlobalDimVectorType darcy_velocity = -K * sm.dNdx * local_p_vec;
// gravity term
if (_gravitational_axis_id >= 0)
darcy_velocity[GlobalDim - 1] -= K * rho_g;
for (unsigned d = 0; d < GlobalDim; ++d)
{
_darcy_velocities[d][ip] = darcy_velocity[d];
}
}
else
{
// Compute the velocity
GlobalDimVectorType darcy_velocity = -perm * sm.dNdx * local_p_vec / mu;
if (_gravitational_axis_id >= 0)
{
darcy_velocity.noalias() -= rho_g * perm.col(GlobalDim - 1) / mu;
}
for (unsigned d = 0; d < GlobalDim; ++d)
{
_darcy_velocities[d][ip] = darcy_velocity[d];
}
}
}
} }
} // end of namespace } // end of namespace
......
...@@ -85,7 +85,7 @@ public: ...@@ -85,7 +85,7 @@ public:
std::vector<double>& local_K_data, std::vector<double>& local_K_data,
std::vector<double>& local_b_data) override; std::vector<double>& local_b_data) override;
void computeSecondaryVariable(std::vector<double> const& local_x) override; void computeSecondaryVariableConcrete(std::vector<double> const& local_x) override;
Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix( Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
const unsigned integration_point) const override const unsigned integration_point) const override
......
...@@ -113,5 +113,13 @@ void LiquidFlowProcess::assembleWithJacobianConcreteProcess( ...@@ -113,5 +113,13 @@ void LiquidFlowProcess::assembleWithJacobianConcreteProcess(
dx_dx, M, K, b, Jac); dx_dx, M, K, b, Jac);
} }
void LiquidFlowProcess::computeSecondaryVariableConcrete(GlobalVector const& x)
{
DBUG("Compute the velocity for LiquidFlowProcess.");
GlobalExecutor::executeMemberOnDereferenced(
&LiquidFlowLocalAssemblerInterface::computeSecondaryVariable,
_local_assemblers, *_local_to_global_index_map, x);
}
} // end of namespace } // end of namespace
} // end of namespace } // end of namespace
...@@ -69,6 +69,8 @@ public: ...@@ -69,6 +69,8 @@ public:
double const gravitational_acceleration, double const gravitational_acceleration,
BaseLib::ConfigTree const& config); BaseLib::ConfigTree const& config);
void computeSecondaryVariableConcrete(GlobalVector const& x) override;
bool isLinear() const override { return true; } bool isLinear() const override { return true; }
private: private:
void initializeConcreteProcess( void initializeConcreteProcess(
......
...@@ -26,11 +26,13 @@ void LocalAssemblerInterface::assembleWithJacobian( ...@@ -26,11 +26,13 @@ void LocalAssemblerInterface::assembleWithJacobian(
"assembler."); "assembler.");
} }
void LocalAssemblerInterface::computeSecondaryVariable(std::vector<double> const& /*local_x*/) void LocalAssemblerInterface::computeSecondaryVariable(std::size_t const mesh_item_id,
NumLib::LocalToGlobalIndexMap const& dof_table,
GlobalVector const& x)
{ {
OGS_FATAL( auto const indices = NumLib::getIndices(mesh_item_id, dof_table);
"computeSecondaryVariable(...) function is not implemented in the local " auto const local_x = x.get(indices);
"assembler."); computeSecondaryVariableConcrete(local_x);
} }
void LocalAssemblerInterface::preTimestep( void LocalAssemblerInterface::preTimestep(
......
...@@ -45,7 +45,9 @@ public: ...@@ -45,7 +45,9 @@ public:
std::vector<double>& local_b_data, std::vector<double>& local_b_data,
std::vector<double>& local_Jac_data); std::vector<double>& local_Jac_data);
virtual void computeSecondaryVariable(std::vector<double> const& local_x); virtual void computeSecondaryVariable(std::size_t const mesh_item_id,
NumLib::LocalToGlobalIndexMap const& dof_table,
GlobalVector const& x);
virtual void preTimestep(std::size_t const mesh_item_id, virtual void preTimestep(std::size_t const mesh_item_id,
NumLib::LocalToGlobalIndexMap const& dof_table, NumLib::LocalToGlobalIndexMap const& dof_table,
...@@ -72,6 +74,9 @@ private: ...@@ -72,6 +74,9 @@ private:
} }
virtual void postTimestepConcrete(std::vector<double> const& /*local_x*/) {} virtual void postTimestepConcrete(std::vector<double> const& /*local_x*/) {}
virtual void computeSecondaryVariableConcrete
(std::vector<double> const& /*local_x*/) {}
}; };
} // namespace ProcessLib } // namespace ProcessLib
......
...@@ -242,6 +242,11 @@ void Process::postTimestep(GlobalVector const& x) ...@@ -242,6 +242,11 @@ void Process::postTimestep(GlobalVector const& x)
postTimestepConcreteProcess(x); postTimestepConcreteProcess(x);
} }
void Process::computeSecondaryVariable(GlobalVector const& x)
{
computeSecondaryVariableConcrete(x);
}
void Process::preIteration(const unsigned iter, const GlobalVector &x) void Process::preIteration(const unsigned iter, const GlobalVector &x)
{ {
// In every new iteration cached values of secondary variables are expired. // In every new iteration cached values of secondary variables are expired.
......
...@@ -59,6 +59,9 @@ public: ...@@ -59,6 +59,9 @@ public:
void preIteration(const unsigned iter, void preIteration(const unsigned iter,
GlobalVector const& x) override final; GlobalVector const& x) override final;
/// computeSecondaryVariable for the coupled equations or for output.
void computeSecondaryVariable(GlobalVector const& x);
NumLib::IterationResult postIteration(GlobalVector const& x) override final; NumLib::IterationResult postIteration(GlobalVector const& x) override final;
void initialize(); void initialize();
...@@ -148,6 +151,8 @@ private: ...@@ -148,6 +151,8 @@ private:
virtual void preIterationConcreteProcess(const unsigned /*iter*/, virtual void preIterationConcreteProcess(const unsigned /*iter*/,
GlobalVector const& /*x*/){} GlobalVector const& /*x*/){}
virtual void computeSecondaryVariableConcrete(GlobalVector const& /*x*/) {};
virtual NumLib::IterationResult postIterationConcreteProcess( virtual NumLib::IterationResult postIterationConcreteProcess(
GlobalVector const& /*x*/) GlobalVector const& /*x*/)
{ {
......
...@@ -505,6 +505,8 @@ bool UncoupledProcessesTimeLoop::loop() ...@@ -505,6 +505,8 @@ bool UncoupledProcessesTimeLoop::loop()
nonlinear_solver_succeeded = solveOneTimeStepOneProcess( nonlinear_solver_succeeded = solveOneTimeStepOneProcess(
x, timestep, t, delta_t, *spd, *_output); x, timestep, t, delta_t, *spd, *_output);
pcs.computeSecondaryVariable(x);
INFO("[time] Solving process #%u took %g s in timestep #%u.", INFO("[time] Solving process #%u took %g s in timestep #%u.",
timestep, time_timestep.elapsed(), pcs_idx); timestep, time_timestep.elapsed(), pcs_idx);
......
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