#ifndef __SOLVER_MTILUC2__ #define __SOLVER_MTILUC2__ #include #include "inmost_solver.h" #include "solver_prototypes.hpp" class MTILUC_preconditioner : public Method { typedef struct Interval_t { INMOST_DATA_ENUM_TYPE first, last; INMOST_DATA_ENUM_TYPE Size() { return last - first; } } Interval; typedef std::pair coord; typedef std::pair wgt_coord; typedef std::vector< wgt_coord > wgt_coords; typedef struct row_col_t { Sparse::Row row, col; INMOST_DATA_REAL_TYPE diag; } row_col; typedef dynarray levels_t; std::vector LU_Entries, B_Entries; interval LU_Diag; interval U_Address, L_Address, B_Address; interval temp; // temporal place for solve phase //reordering information interval ddP,ddQ; INMOST_DATA_REAL_TYPE condestL, condestU; INMOST_DATA_ENUM_TYPE estimator; INMOST_DATA_REAL_TYPE iluc2_tau; INMOST_DATA_REAL_TYPE tau, eps; INMOST_DATA_ENUM_TYPE sciters; Sparse::Matrix * Alink; Solver::OrderInfo * info; bool init; void DumpMatrix(interval & Address, std::vector & Entries, INMOST_DATA_ENUM_TYPE wmbeg, INMOST_DATA_ENUM_TYPE wmend, std::string file_name); void SwapEntries(interval & Address, std::vector & Entries, INMOST_DATA_ENUM_TYPE rbeg, INMOST_DATA_ENUM_TYPE rend, INMOST_DATA_ENUM_TYPE k, INMOST_DATA_ENUM_TYPE j); void SwapLine(interval & Line, INMOST_DATA_ENUM_TYPE i, INMOST_DATA_ENUM_TYPE j); void inversePQ(INMOST_DATA_ENUM_TYPE wbeg, INMOST_DATA_ENUM_TYPE wend, interval & localP, interval & localQ, interval & invP, interval & invQ); void applyPQ(INMOST_DATA_ENUM_TYPE wbeg, INMOST_DATA_ENUM_TYPE wend, interval & localP, interval & localQ, interval & invP, interval & invQ); public: INMOST_DATA_ENUM_TYPE & EnumParameter(std::string name); INMOST_DATA_REAL_TYPE & RealParameter(std::string name); void Copy(const Method * other); MTILUC_preconditioner(const MTILUC_preconditioner & other); MTILUC_preconditioner & operator =(MTILUC_preconditioner const & other); MTILUC_preconditioner(Solver::OrderInfo & info); bool isInitialized(); bool isFinalized(); bool Initialize(); bool Finalize(); void ApplyB(double alpha, Sparse::Vector & x, double beta, Sparse::Vector & y); int Descend(Sparse::Vector & input, Sparse::Vector & output); int Ascend(Sparse::Vector & input, Sparse::Vector & output); bool Solve(Sparse::Vector & input, Sparse::Vector & output); bool ReplaceMAT(Sparse::Matrix & A); bool ReplaceSOL(Sparse::Vector & x); bool ReplaceRHS(Sparse::Vector & b); Method * Duplicate(); ~MTILUC_preconditioner(); }; #endif //__SOLVER_MTILUC2__