52 lines
1.5 KiB
C++
52 lines
1.5 KiB
C++
/* $Header: /var/lib/cvs/dynare_cpp/sylv/cc/SylvesterSolver.h,v 1.1.1.1 2004/06/04 13:00:54 kamenik Exp $ */
|
|
|
|
/* Tag $Name: $ */
|
|
|
|
#ifndef SYLVESTER_SOLVER_H
|
|
#define SYLVESTER_SOLVER_H
|
|
|
|
#include "KronVector.h"
|
|
#include "QuasiTriangular.h"
|
|
#include "QuasiTriangularZero.h"
|
|
#include "SimilarityDecomp.h"
|
|
#include "SylvParams.h"
|
|
#include "SchurDecomp.h"
|
|
|
|
class SylvesterSolver {
|
|
protected:
|
|
const QuasiTriangular* const matrixK;
|
|
const QuasiTriangular* const matrixF;
|
|
private:
|
|
/* return true when it is more efficient to use QuasiTriangular
|
|
* than QuasiTriangularZero */
|
|
static bool zeroPad(const SchurDecompZero& kdecomp) {
|
|
return ((kdecomp.getZeroCols()*3 < kdecomp.getDim()*2) ||
|
|
(kdecomp.getZeroCols() < 10));
|
|
}
|
|
public:
|
|
SylvesterSolver(const QuasiTriangular& k, const QuasiTriangular& f)
|
|
: matrixK(new QuasiTriangular(k)),
|
|
matrixF(new QuasiTriangular(f))
|
|
{}
|
|
SylvesterSolver(const SchurDecompZero& kdecomp, const SchurDecomp& fdecomp)
|
|
: matrixK((zeroPad(kdecomp)) ?
|
|
new QuasiTriangular(kdecomp) : new QuasiTriangularZero(kdecomp)),
|
|
matrixF(new QuasiTriangular(fdecomp))
|
|
{}
|
|
SylvesterSolver(const SchurDecompZero& kdecomp, const SimilarityDecomp& fdecomp)
|
|
: matrixK((zeroPad(kdecomp)) ?
|
|
new QuasiTriangular(kdecomp) : new QuasiTriangularZero(kdecomp)),
|
|
matrixF(new BlockDiagonal(fdecomp.getB()))
|
|
{}
|
|
virtual ~SylvesterSolver()
|
|
{delete matrixK; delete matrixF;}
|
|
virtual void solve(SylvParams& pars, KronVector& x) const = 0;
|
|
};
|
|
|
|
#endif /* SYLVESTER_SOLVER_H */
|
|
|
|
|
|
// Local Variables:
|
|
// mode:C++
|
|
// End:
|