19#ifndef _GIMLI_LINSOLVER__H
20#define _GIMLI_LINSOLVER__H
23#include "solverWrapper.h"
31enum SolverType{AUTOMATIC,LDL,CHOLMOD,UMFPACK,UNKNOWN};
34class DLLEXPORT LinSolver :
public SolverWrapper{
36 LinSolver(
bool verbose=
false);
38 LinSolver(RSparseMatrix & S,
bool verbose=
false);
40 LinSolver(RSparseMapMatrix & S,
bool verbose=
false);
42 LinSolver(CSparseMatrix & S,
bool verbose=
false);
44 LinSolver(RSparseMatrix & S, SolverType solverType,
bool verbose=
false);
46 LinSolver(CSparseMatrix & S, SolverType solverType,
bool verbose=
false);
50 RVector operator()(
const RVector & rhs);
51 CVector operator()(
const CVector & rhs);
53 void solve(
const RVector & rhs, RVector & solution);
54 void solve(
const CVector & rhs, CVector & solution);
56 RVector solve(
const RVector & rhs);
57 CVector solve(
const CVector & rhs);
59 void setSolverType(SolverType solverType=AUTOMATIC);
64 void setMatrix(RSparseMatrix & S,
int stype=-2);
67 void setMatrix(CSparseMatrix & S,
int stype=-2);
69 SolverType solverType()
const {
return solverType_; }
71 std::string solverName()
const;
73 std::string name()
const {
return solverName(); }
78 void initialize_(RSparseMatrix & S,
int stype);
79 void initialize_(CSparseMatrix & S,
int stype);
82 SolverType solverType_;
83 SolverWrapper * solver_;
89template <
class Mat,
class Vec >
int solveLU(
const Mat & A, Vec &
x,
const Vec & b){
100 double pivot, biggest, mult, tempf;
101 uint pivotindex = 0, tmpIdx = 0;
103 for (uint i = N; i < n + N; i++) {
106 for (uint j = N; j < n + N; j++) {
107 if (biggest < (tempf = std::fabs(lu[i][j]))) biggest = tempf;
110 if (biggest != 0.0) scales[i] = 1.0 / biggest;
113 std::cerr << WHERE_AM_I <<
" Zero row: singular matrix" << std::endl;
119 for (uint k = N; k < n + N - 1; k++) {
122 for (uint i = k; i < n + N; i++) {
123 if (biggest < (tempf = std::fabs(lu[ps[i]][k]) * scales[ps[i]])) {
128 if (biggest == 0.0) {
129 std::cerr << WHERE_AM_I <<
" Zero column: singular matrix" << std::endl;
133 if (pivotindex != k) {
135 ps[k] = ps[pivotindex];
136 ps[pivotindex] = tmpIdx;
141 pivot = lu[ps[k]][k];
143 for (uint i = k + 1; i < n + N; i++) {
144 lu[ps[i]][k] = mult = lu[ps[i]][k] / pivot;
146 for (uint j = k + 1; j < n + N; j++) lu[ps[i]][j] -= mult * lu[ps[k]][j];
154 for (uint i = N; i < n + N; i++) {
156 for (uint j = N; j < i + N; j++) dot += lu[ps[i]][j] *
x[j];
157 x[i] = b[ps[i]] - dot;
161 for (
int i = n + N - 1; i >= N; i--) {
163 for (uint j = i + 1; j < n + N; j++) dot += lu[ps[i]][j] *
x[j];
164 x[i] = (
x[i] - dot) / lu[ps[i]][i];
167 if (rms(Vec(A *
x - b)) > 1e-9){
168 std::cerr <<
"rms(A * x -b) " << rms((
const Vec)(A *
x - b)) << std::endl;
void setMatrix(RSparseMatrix &S, int stype=-2)
Definition linSolver.cpp:110
Interface class for matrices.
Definition matrix.h:137
Definition solverWrapper.h:26
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
RVector x(const R3Vector &rv)
Definition pos.cpp:107