diff --git a/examples/old/BlockPreconditioner.hpp b/examples/old/BlockPreconditioner.hpp deleted file mode 100644 index 423e3f7ef9743a104d902a0307a36e4544104fbd..0000000000000000000000000000000000000000 --- a/examples/old/BlockPreconditioner.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include <amdis/AMDiS.hpp> -#include <amdis/LinearAlgebra.hpp> - -namespace AMDiS -{ - /// Basis preconditioner structure for block-preconditioners - template <class Matrix, class Vector> - class BlockPreconditioner - : public PreconditionerInterface<Matrix, Vector> - { - public: - using Self = BlockPreconditioner; - using Super = PreconditionerInterface<Matrix, Vector>; - using PreconBase = Super; - - public: - BlockPreconditioner() = default; - - /// extract iranges from BlockMatrix to be used to extract sub-vectors and sub-matrices. - virtual void init(Matrix const& A_) override - { - A = &A_; - - A_.getRanges(rows, cols); - initialized = true; - } - - virtual void solve(Vector const& b, Vector& x) const override - { - error_exit("Must be implemented in derived classes!\n"); - } - - virtual void adjoint_solve(Vector const& x, Vector& y) const override - { - error_exit("Must be implemented in derived classes!\n"); - } - - template <size_t I> - mtl::irange const& getRowRange(const index_t<I> i = {}) const - { - test_exit_dbg(initialized, - "BlockPreconditioner not initialized. Call init() before."); - return std::get<I>(rows); - } - - template <size_t I> - mtl::irange const& getColRange(const index_t<I> i = {}) const - { - test_exit_dbg(initialized, - "BlockPreconditioner not initialized. Call init() before."); - return std::get<I>(cols); - } - - protected: - Matrix const* A = NULL; - bool initialized = false; - - std::array<mtl::irange, Matrix::N()> rows; - std::array<mtl::irange, Matrix::M()> cols; - }; - -} // end namespace AMDiS diff --git a/examples/old/MTLPfcPrecon.hpp b/examples/old/MTLPfcPrecon.hpp deleted file mode 100644 index 4f9ca3021b7c23f5359e8fee701cc5fe68cdc35b..0000000000000000000000000000000000000000 --- a/examples/old/MTLPfcPrecon.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once - -#include "BlockPreconditioner.hpp" -#include <amdis/common/Literals.hpp> - -namespace AMDiS -{ - template <class Matrix, class Vector> - class MTLPfcPrecon - : public BlockPreconditioner<Matrix, Vector> - { - public: - using Self = MTLPfcPrecon; - using Super = BlockPreconditioner<Matrix, Vector>; - using PreconBase = typename Super::PreconBase; - - using MTLMatrix = BaseMatrix_t<Matrix>; - using MTLVector = Vector; - using LinearSolverType = LinearSolverInterface<MTLMatrix, MTLVector>; - - public: - struct Creator : CreatorInterface<PreconBase> - { - virtual std::shared_ptr<PreconBase> create() override - { - precon = std::make_shared<Self>(); - return precon; - } - - std::shared_ptr<Self> precon = NULL; - }; - - public: - MTLPfcPrecon() - : Super() - { - std::string solverNameM = "cg", - solverNameMpL = "cg", - solverNameMpL2 = "cg"; - Parameters::get("precon_pfc->M->solver", solverNameM); - Parameters::get("precon_pfc->MpL->solver", solverNameMpL); - Parameters::get("precon_pfc->MpL2->solver", solverNameMpL2); - - CreatorInterfaceName<LinearSolverType>* creator; - - creator = named( CreatorMap<LinearSolverType>::getCreator(solverNameM, "precon_pfc->M->solver") ); - solverM = creator->create("precon_pfc->M"); - - creator = named( CreatorMap<LinearSolverType>::getCreator(solverNameMpL, "precon_pfc->MpL->solver") ); - solverMpL = creator->create("precon_pfc->MpL"); - - creator = named( CreatorMap<LinearSolverType>::getCreator(solverNameMpL2, "precon_pfc->MpL2->solver") ); - solverMpL2 = creator->create("precon_pfc->MpL2"); - } - - virtual ~MTLPfcPrecon() - { - exit(); - } - - void setData(double* tau_, double M0_ = 1.0) - { - tau = tau_; - M0 = M0_; - } - - // implementation in MTLPfcPrecon.inc.hpp - virtual void init(Matrix const& A) override; - - virtual void exit() override {} - - // implementation in MTLPfcPrecon.inc.hpp - virtual void solve(MTLVector const& b, MTLVector& x) const override; - - - template <typename VectorX, typename VectorB> - void solveM(VectorX& x, const VectorB& b) const - { - SolverInfo solverInfo("precon_pfc->M"); - solverM->solve(getM(), x, b, solverInfo); - } - - template <typename VectorX, typename VectorB> - void solveMpL(VectorX& x, const VectorB& b) const - { - SolverInfo solverInfo("precon_pfc->MpL"); - solverMpL->solve(MpL, x, b, solverInfo); - } - - template <typename VectorX, typename VectorB> - void solveMpL2(VectorX& x, const VectorB& b) const - { - SolverInfo solverInfo("precon_pfc->MpL2"); - solverMpL2->solve(MpL2, x, b, solverInfo); - } - - MTLMatrix const& getM() const { return matM ? *matM : (*Super::A)(_2, _2); } // < u, v > - MTLMatrix const& getL0() const { return matL0 ? *matL0 : (*Super::A)(_1, _0); } // < M0*tau*grad(u), grad(v) > - MTLMatrix const& getL() const { return matL ? *matL : (*Super::A)(_2, _1); } // < grad(u), grad(v) > - - double getTau() const { return *tau; } - - protected: - double* tau = NULL; - double M0 = 1.0; - - MTLMatrix* matM = NULL; - MTLMatrix* matL = NULL; - MTLMatrix* matL0 = NULL; - - MTLMatrix MpL; - MTLMatrix MpL2; - - mutable MTLVector y0; - mutable MTLVector y1; - mutable MTLVector tmp; - - std::shared_ptr<LinearSolverType> solverM; - std::shared_ptr<LinearSolverType> solverMpL; - std::shared_ptr<LinearSolverType> solverMpL2; - }; - -} // end namespace AMDiS - -#include "MTLPfcPrecon.inc.hpp" diff --git a/examples/old/MTLPfcPrecon.inc.hpp b/examples/old/MTLPfcPrecon.inc.hpp deleted file mode 100644 index 3b15726247fbce0401aba5988c685980fdec55e1..0000000000000000000000000000000000000000 --- a/examples/old/MTLPfcPrecon.inc.hpp +++ /dev/null @@ -1,64 +0,0 @@ -namespace AMDiS -{ - - template <class Matrix, class Vector> - void MTLPfcPrecon<Matrix, Vector>::init(Matrix const& A) - { - test_exit(tau, "Preconditioner not initialized!"); - Super::init(A); - - using size_type = typename MTLMatrix::size_type; - size_type n = num_rows(getM()); - - double delta = std::sqrt(M0 * getTau()); - msg("delta = {}", delta); - - // helper-matrix MpL = M + delta*L - MpL.change_dim(n, n); - MpL = getM() + (1.0/delta) * getL0(); - - // helper-matrix MpL = M + sqrt(delta)*L - MpL2.change_dim(n, n); - MpL2 = getM() + std::sqrt(delta) * getL(); - - // temporary variables - y0.change_dim(num_rows(getM())); - y1.change_dim(num_rows(getM())); - tmp.change_dim(num_rows(getM())); - } - - - template <class Matrix, class Vector> - void MTLPfcPrecon<Matrix, Vector>::solve(Vector const& b, Vector& x) const - { - x.change_dim(num_rows(b)); - - Vector x0(x[Super::getColRange(0_c)]); - Vector x1(x[Super::getColRange(1_c)]); - Vector x2(x[Super::getColRange(2_c)]); - - const Vector b0(b[Super::getRowRange(0_c)]); - const Vector b1(b[Super::getRowRange(1_c)]); - const Vector b2(b[Super::getRowRange(2_c)]); - - double delta = std::sqrt(M0 * getTau()); - - solveM(y0, b0); // M*y0 = b0 - y1 = getL0() * y0; // y1 = K*y0 - tmp = b1 - y1; // tmp := b1 - tau*y1 - - solveMpL(y1, tmp); // (M + delta*K) * y1 = tmp - x0 = y0 + (1.0/delta)*y1; // x0 = y0 + (1/delta)*y1 - - tmp = getM() * y1; // tmp := M*y1 - solveMpL2(y1, tmp); // (M+eps*sqrt(delta)K) * y1 = tmp - tmp = getM() * y1; // tmp := M*y1 - solveMpL2(x1, tmp); // (M+eps*sqrt(delta)K) * x1 = tmp - - x0-= (1.0/delta)*x1; // x0 = x0 - (1/delta)*x1 = y0 + (1/delta)*(y1 - x1) - - tmp = b2 - getL() * x1; // tmp := b2 - K*x1 - solveM(x2, tmp); - } - -} // end namespace AMDiS diff --git a/examples/old/PfcPrecon.hpp b/examples/old/PfcPrecon.hpp deleted file mode 100644 index 1b8b9fe17f5a279a60a12915ebade4006d5a5ec9..0000000000000000000000000000000000000000 --- a/examples/old/PfcPrecon.hpp +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once - -#include <tuple> -#include <cmath> - -#include <dune/istl/bcrsmatrix.hh> -#include <dune/istl/bvector.hh> -#include <dune/istl/multitypeblockmatrix.hh> -#include <dune/istl/multitypeblockvector.hh> -#include <dune/istl/preconditioner.hh> - -#include <amdis/common/Mpl.hpp> - -namespace AMDiS { - -template <class Matrix, class Vector> -class PfcPrecon - : public Dune::Preconditioner<Vector, Vector> -{ - using SubMatrix = std::decay_t<decltype( std::declval<Matrix>()[_0][_0] )>; - using SubVector = std::decay_t<decltype( std::declval<Vector>()[_0] )>; - -public: - PfcPrecon(Matrix const& matrix, double* tauPtr, double M0) - : matrix(matrix) - , tauPtr(tauPtr) - , M0(M0) - , matL0(matrix[_1][_0]) - , matL (matrix[_2][_1]) - , matM (matrix[_2][_2]) - {} - - virtual void pre(Vector& x, Vector& b) override - { - double delta = std::sqrt(M0 * (*tauPtr)); - - matMpL = matM; - matMpL.axpy(1.0/delta, matL0); // => MpL = M + 1/delta * L0 - - matMpL2 = matM; - matMpL2.axpy(std::sqrt(delta), matL); - - y0.resize(matM.N()); - y1.resize(matM.N()); - tmp.resize(matM.N()); - } - - virtual void apply(Vector& x, const Vector& b) override - { - double delta = std::sqrt(M0 * (*tauPtr)); - - solve(matM, y0, b[_0]); // M*y0 = b0 - matL0.mv(y0, y1); // y1 = K*y0 - tmp = b[_1]; - tmp-= y1; // tmp := b1 - tau*y1 - - solve(matMpL, y1, tmp); // (M + delta*K) * y1 = tmp - x[_0] = y0; - x[_0].axpy(1.0/delta, y1); // x0 = y0 + (1/delta)*y1 - - matM.mv(y1, tmp); // tmp := M*y1 - solve(matMpL2, y1, tmp); // (M+eps*sqrt(delta)K) * y1 = tmp - matM.mv(y1, tmp); // tmp := M*y1 - solve(matMpL2, x[_1], tmp); // (M+eps*sqrt(delta)K) * x1 = tmp - - x[_0].axpy(-1.0/delta, x[_1]); // x0 = x0 - (1/delta)*x1 = y0 + (1/delta)*(y1 - x1) - - matL.mv(x[_1], y1); - tmp = b[_2]; - tmp-= y1; // tmp := b2 - K*x1 - solve(matM, x[_2], tmp); - } - - virtual void post(Vector& x) override - { - - } - - -private: - - template <class Mat, class Vec> - void solve(Mat const& A, Vec& x, Vec b) - { - Dune::MatrixAdapter<Mat, Vec, Vec> op(A); - Dune::SeqJac<Mat, Vec, Vec> precon(A, 1, 1.0); - Dune::CGSolver<Vec> solver(op, precon, 1.e-3, 20, 0); - - Dune::InverseOperatorResult statistics; - solver.apply(x, b, statistics); - } - - -private: - - Matrix const& matrix; - double* tauPtr; - double M0; - - SubMatrix const& matL0; - SubMatrix const& matL; - SubMatrix const& matM; - - SubMatrix matMpL; - SubMatrix matMpL2; - - SubVector y0, y1, tmp; -}; - -} // end namespace AMDiS diff --git a/examples/old/pfc.cc b/examples/old/pfc.cc deleted file mode 100644 index 33a32e1f37a2daee4c10dc8f9f603cc2300351a8..0000000000000000000000000000000000000000 --- a/examples/old/pfc.cc +++ /dev/null @@ -1,109 +0,0 @@ -// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- -// vi: set et ts=4 sw=2 sts=2: - -#include <iostream> -#include <ctime> -#include <cmath> - -#include <amdis/AMDiS.hpp> -#include <amdis/AdaptInstationary.hpp> -#include <amdis/ProblemStat.hpp> -#include <amdis/ProblemInstat.hpp> -#include <amdis/Terms.hpp> - -#include "MTLPfcPrecon.hpp" - -using namespace AMDiS; - -// using Mesh = Dune::YaspGrid<AMDIS_DIM>; -using Mesh = Dune::AlbertaGrid<AMDIS_DIM, AMDIS_DOW>; - -using PfcParam = LagrangeBasis<Mesh::LeafGridView, 2, 2, 2>; - - -// 3 component with polynomial degree 1 -using PfcProblem = ProblemStat<PfcParam>; -using PfcProblemInstat = ProblemInstat<PfcParam>; - -using MatrixType = PfcProblem::SystemMatrixType::MultiMatrix; -using VectorType = PfcProblem::SystemVectorType::BaseVector; - -using Precon = MTLPfcPrecon<MatrixType,VectorType>; - -int main(int argc, char** argv) -{ - AMDiS::init(argc, argv); - - auto creator = new Precon::Creator; - CreatorMap<typename Precon::PreconBase>::addCreator("pfc", creator); - - PfcProblem prob("pfc"); - prob.initialize(INIT_ALL); - - PfcProblemInstat probInstat("pfc", prob); - probInstat.initialize(INIT_UH_OLD); - - AdaptInfo adaptInfo("adapt", prob.getNumComponents()); - - double r = -0.4; - double psi_mean = -0.3; - double M0 = 1.0; - - auto& Mu = prob.getSolution<0>(); - auto& Psi = prob.getSolution<1>(); - auto& Nu = prob.getSolution<2>(); - - using Op = PfcProblem::ElementOperator; - - // < [-(1+r) - 3*psi^2]*u, v > + < 2*grad(u), grad(v) > - auto opLhs01_ = Op::zot( -(1.0 + r) ); - opLhs01_.addZOT( valueOfFunc(Psi, [](auto psi) { return -3.0 * Math::pow<2>(psi); }, 2) ); - opLhs01_.addSOT( 2.0 ); - auto opLhs01 = std::make_pair(opLhs01_, true); - - // < -2*psi^3, v > - auto opRhs0 = Op::zot(valueOfFunc(Psi, [](auto psi) { return -2.0 * Math::pow<3>(psi); }, 3)); - - // < psi, v > - auto opRhs1 = Op::zot(valueOf(Psi)); - - // < u, v > - auto opM = std::make_pair(Op::zot(1.0), false); - - // < grad(u), grad(v) > - auto opL = std::make_pair(Op::sot(1.0), false); - - // < M0*tau * grad(u), grad(v) > - double* tauPtr = adaptInfo.getTimestepPtr(); - auto opL0 = std::make_pair(Op::sot([M0, tauPtr](auto /*x*/) { return M0 * (*tauPtr); }), false); - - - // === Define the linear system === - - prob.addMatrixOperator({{ {{0,0}, opM}, {{0,1}, opLhs01}, {{0,2}, opL}, - {{1,0}, opL0}, {{1,1}, opM}, - {{2,1}, opL}, {{2,2}, opM}}}); - - prob.addVectorOperator({{ {0, opRhs0}, - {1, opRhs1} }}); - - // === set the initial solution === - Mu = 0.0; - Nu = 0.0; - std::srand( 12345 ); - Psi.interpol([psi_mean](auto const& x) { return 0.5*(std::rand()/double(RAND_MAX) - 0.5) + psi_mean; }); - - // === configure preconditioner, if necessary === - if (creator->precon) { - creator->precon->setData(tauPtr, M0); - } - - AdaptInstationary adapt("adapt", prob, adaptInfo, probInstat, adaptInfo); - adapt.adapt(); - - msg("|mu| = {}, |nu| = {}, |psi| = {}", - two_norm(Mu.getVector()), two_norm(Nu.getVector()), two_norm(Psi.getVector())); - - AMDiS::finalize(); - return 0; -}