Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __IPPARDISOSOLVERINTERFACE_HPP__
00011 #define __IPPARDISOSOLVERINTERFACE_HPP__
00012
00013 #include "IpSparseSymLinearSolverInterface.hpp"
00014
00015 namespace Ipopt
00016 {
00017
00022 class PardisoSolverInterface: public SparseSymLinearSolverInterface
00023 {
00024 public:
00028 PardisoSolverInterface();
00029
00031 virtual ~PardisoSolverInterface();
00033
00035 bool InitializeImpl(const OptionsList& options,
00036 const std::string& prefix);
00037
00038
00042 virtual ESymSolverStatus InitializeStructure(Index dim, Index nonzeros,
00043 const Index *ia,
00044 const Index *ja);
00045
00048 virtual double* GetValuesArrayPtr();
00049
00051 virtual ESymSolverStatus MultiSolve(bool new_matrix,
00052 const Index* ia,
00053 const Index* ja,
00054 Index nrhs,
00055 double* rhs_vals,
00056 bool check_NegEVals,
00057 Index numberOfNegEVals);
00058
00062 virtual Index NumberOfNegEVals() const;
00064
00065
00067
00069 virtual bool IncreaseQuality();
00070
00074 virtual bool ProvidesInertia() const
00075 {
00076 return true;
00077 }
00081 EMatrixFormat MatrixFormat() const
00082 {
00083 return CSR_Format_1_Offset;
00084 }
00086
00089 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00091
00092 private:
00102 PardisoSolverInterface(const PardisoSolverInterface&);
00103
00105 void operator=(const PardisoSolverInterface&);
00107
00111 Index dim_;
00112
00114 Index nonzeros_;
00115
00117 double* a_;
00119
00123 Index negevals_;
00125
00129 enum PardisoMatchingStrategy
00130 {
00131 COMPLETE,
00132 COMPLETE2x2,
00133 CONSTRAINT
00134 };
00136 PardisoMatchingStrategy match_strat_;
00139 bool have_symbolic_factorization_;
00142 bool pardiso_redo_symbolic_fact_only_if_inertia_wrong_;
00146 bool pardiso_repeated_perturbation_means_singular_;
00149 bool skip_inertia_check_;
00152 bool pardiso_iterative_;
00154 Index pardiso_max_droptol_corrections_;
00156
00161 bool initialized_;
00163
00167 void** PT_;
00170 ipfint MAXFCT_;
00172 ipfint MNUM_;
00174 ipfint MTYPE_;
00176 ipfint* IPARM_;
00178 double* DPARM_;
00180 ipfint MSGLVL_;
00182
00185 Index debug_last_iter_;
00186 Index debug_cnt_;
00188
00193 ESymSolverStatus SymbolicFactorization(const Index* ia,
00194 const Index* ja);
00195
00198 ESymSolverStatus Factorization(const Index* ia,
00199 const Index* ja,
00200 bool check_NegEVals,
00201 Index numberOfNegEVals);
00202
00205 ESymSolverStatus Solve(const Index* ia,
00206 const Index* ja,
00207 Index nrhs,
00208 double *rhs_vals);
00210 };
00211
00212 }
00213 #endif