Program Listing for File augmented_lagrangian.h¶
↰ Return to documentation for file (include/augmented_lagrangian.h)
#ifndef rdlm_augmented_lagrangian_h
#define rdlm_augmented_lagrangian_h
#include <deal.II/lac/block_vector.h>
#include <deal.II/lac/linear_operator.h>
#include <deal.II/lac/linear_operator_tools.h>
#include <deal.II/lac/precondition.h>
#include <deal.II/lac/solver_cg.h>
#include <deal.II/lac/solver_gmres.h>
#include <deal.II/lac/sparse_matrix.h>
#include <deal.II/lac/vector.h>
using namespace dealii;
template <typename VectorType,
typename BlockVectorType = TrilinosWrappers::MPI::BlockVector>
class BlockPreconditionerAugmentedLagrangian
{
public:
BlockPreconditionerAugmentedLagrangian(
const LinearOperator<VectorType> Aug_inv_,
const LinearOperator<VectorType> C_,
const LinearOperator<VectorType> Ct_,
const LinearOperator<VectorType> invW_,
const double gamma_ = 1e1)
{
Aug_inv = Aug_inv_;
C = C_;
Ct = Ct_;
invW = invW_;
gamma = gamma_;
}
void
vmult(BlockVectorType &v, const BlockVectorType &u) const
{
v.block(0) = 0.;
v.block(1) = 0.;
v.block(1) = -gamma * invW * u.block(1);
v.block(0) = Aug_inv * (u.block(0) - Ct * v.block(1));
}
LinearOperator<VectorType> K;
LinearOperator<VectorType> Aug_inv;
LinearOperator<VectorType> C;
LinearOperator<VectorType> invW;
LinearOperator<VectorType> Ct;
double gamma;
};
#endif