00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __IPMUMPSSOLVERINTERFACE_HPP__
00012 #define __IPMUMPSSOLVERINTERFACE_HPP__
00013
00014 #include "IpSparseSymLinearSolverInterface.hpp"
00015
00016 extern "C"
00017 {
00018 #include "dmumps_c.h"
00019 }
00020
00021 namespace Ipopt
00022 {
00023
00028 class MumpsSolverInterface: public SparseSymLinearSolverInterface
00029 {
00030 public:
00034 MumpsSolverInterface();
00035
00037 virtual ~MumpsSolverInterface();
00039
00041 bool InitializeImpl(const OptionsList& options,
00042 const std::string& prefix);
00043
00044
00048 virtual ESymSolverStatus InitializeStructure(Index dim, Index nonzeros, const Index *ia, const Index *ja);
00049
00052 virtual double* GetValuesArrayPtr();
00053
00055 virtual ESymSolverStatus MultiSolve(bool new_matrix,
00056 const Index* ia,
00057 const Index* ja,
00058 Index nrhs,
00059 double* rhs_vals,
00060 bool check_NegEVals,
00061 Index numberOfNegEVals);
00062
00066 virtual Index NumberOfNegEVals() const;
00068
00069
00071
00073 virtual bool IncreaseQuality();
00074
00078 virtual bool ProvidesInertia() const
00079 {
00080 return true;
00081 }
00085 EMatrixFormat MatrixFormat() const
00086 {
00087 return Triplet_Format;
00088 }
00090
00093 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00095
00096 private:
00106 MumpsSolverInterface(const MumpsSolverInterface&);
00107
00109 void operator=(const MumpsSolverInterface&);
00111
00117 Index n;
00118
00120 Index nz;
00121
00123 double* a;
00124
00126 int* irn_;
00128 int* jcn_;
00130
00133 Index negevals;
00135
00138
00139
00142
00143
00148
00149
00156 ESymSolverStatus Factorization(const Index* ia,
00157 const Index* ja,
00158 bool check_NegEVals,
00159 Index numberOfNegEVals);
00160
00163 ESymSolverStatus Solve(const Index* ia,
00164 const Index* ja,
00165 Index nrhs,
00166 double *rhs_vals);
00168
00169 DMUMPS_STRUC_C mumps_data;
00170
00171 };
00172
00173 }
00174 #endif