12 #ifndef ROOT_TDecompSparse
13 #define ROOT_TDecompSparse
27 const Double_t kInitTreatAsZero = 1.0e-12;
28 const Double_t kInitThresholdPivoting = 1.0e-8;
29 const Double_t kInitPrecision = 1.0e-7;
36 const Double_t kThresholdPivotingMax = 1.0e-2;
41 const Double_t kThresholdPivotingFactor = 10.0;
43 class TDecompSparse :
public TDecompBase
77 static Int_t NonZerosUpperTriang(
const TMatrixDSparse &a);
78 static void CopyUpperTriang (
const TMatrixDSparse &a,Double_t *b);
81 static void InitPivot (
const Int_t n,
const Int_t nz,TArrayI &Airn,TArrayI &Aicn,
82 TArrayI &Aiw,TArrayI &Aikeep,TArrayI &Aiw1,Int_t &nsteps,
83 const Int_t iflag,Int_t *icntl,Double_t *cntl,Int_t *info,Double_t &ops);
84 static void Factor (
const Int_t n,
const Int_t nz,TArrayI &Airn,TArrayI &Aicn,TArrayD &Aa,
85 TArrayI &Aiw,TArrayI &Aikeep,
const Int_t nsteps,Int_t &maxfrt,
86 TArrayI &Aiw1,Int_t *icntl,Double_t *cntl,Int_t *info);
87 static void Solve (
const Int_t n,TArrayD &Aa,TArrayI &Aiw,TArrayD &Aw,
const Int_t maxfrt,
88 TVectorD &b,TArrayI &Aiw1,
const Int_t nsteps,Int_t *icntl,Int_t *info);
90 static void InitPivot_sub1 (
const Int_t n,
const Int_t nz,Int_t *irn,Int_t *icn,Int_t *iw,Int_t *ipe,
91 Int_t *iq,Int_t *flag,Int_t &iwfr,Int_t *icntl,Int_t *info);
92 static void InitPivot_sub2 (
const Int_t n,Int_t *ipe,Int_t *iw,
const Int_t lw,Int_t &iwfr,Int_t *nv,
93 Int_t *nxt,Int_t *lst,Int_t *ipd,Int_t *flag,
const Int_t iovflo,Int_t &ncmpa,
94 const Double_t fratio);
95 static void InitPivot_sub2a(
const Int_t n,Int_t *ipe,Int_t *iw,
const Int_t lw,Int_t &iwfr,Int_t &ncmpa);
96 static void InitPivot_sub3 (
const Int_t n,
const Int_t nz,Int_t *irn,Int_t *icn,Int_t *perm,Int_t *iw,
97 Int_t *ipe,Int_t *iq,Int_t *flag,Int_t &iwfr,Int_t *icntl,Int_t *info);
98 static void InitPivot_sub4 (
const Int_t n,Int_t *ipe,Int_t *iw,
const Int_t lw,Int_t &iwfr,Int_t *ips,
99 Int_t *ipv,Int_t *nv,Int_t *flag,Int_t &ncmpa);
100 static void InitPivot_sub5 (
const Int_t n,Int_t *ipe,Int_t *nv,Int_t *ips,Int_t *ne,Int_t *na,Int_t *nd,
101 Int_t &nsteps,
const Int_t nemin);
102 static void InitPivot_sub6 (
const Int_t n,
const Int_t nz,Int_t *irn,Int_t *icn,Int_t *perm,Int_t *na,
103 Int_t *ne,Int_t *nd,
const Int_t nsteps,Int_t *lstki,Int_t *lstkr,Int_t *iw,
104 Int_t *info,Double_t &ops);
106 static void Factor_sub1 (
const Int_t n,
const Int_t nz,Int_t &nz1,Double_t *a,
const Int_t la,
107 Int_t *irn,Int_t *icn,Int_t *iw,
const Int_t liw,Int_t *perm,Int_t *iw2,
108 Int_t *icntl,Int_t *info);
109 static void Factor_sub2 (
const Int_t n,
const Int_t nz,Double_t *a,
const Int_t la,Int_t *iw,
110 const Int_t liw,Int_t *perm,Int_t *nstk,
const Int_t nsteps,Int_t &maxfrt,
111 Int_t *nelim,Int_t *iw2,Int_t *icntl,Double_t *cntl,Int_t *info);
112 static void Factor_sub3 (Double_t *a,Int_t *iw,Int_t &j1,Int_t &j2,
const Int_t itop,
const Int_t ireal,
113 Int_t &ncmpbr,Int_t &ncmpbi);
115 static void Solve_sub1 (
const Int_t n,Double_t *a,Int_t *iw,Double_t *w,Double_t *rhs,Int_t *iw2,
116 const Int_t nblk,Int_t &latop,Int_t *icntl);
117 static void Solve_sub2 (
const Int_t n,Double_t *a,Int_t *iw,Double_t *w,Double_t *rhs,Int_t *iw2,
118 const Int_t nblk,
const Int_t latop,Int_t *icntl);
119 static Int_t IDiag (Int_t ix,Int_t iy) {
return ((iy-1)*(2*ix-iy+2))/2; }
121 inline Int_t IError () {
return fInfo[2]; }
122 inline Int_t MinRealWorkspace() {
return fInfo[5]; }
123 inline Int_t MinIntWorkspace () {
return fInfo[6]; }
124 inline Int_t ErrorFlag () {
return fInfo[1]; }
130 inline Double_t GetThresholdPivoting() {
return fCntl[1]; }
131 inline Double_t GetTreatAsZero () {
return fCntl[3]; }
136 inline void SetThresholdPivoting(Double_t piv) { fCntl[1] = piv; }
137 inline void SetTreatAsZero (Double_t tol) { fCntl[3] = tol; }
139 virtual const TMatrixDBase &GetDecompMatrix()
const { MayNotUse(
"GetDecompMatrix()");
return fA; }
144 TDecompSparse(Int_t nRows,Int_t nr_nonZeros,Int_t verbose);
145 TDecompSparse(Int_t row_lwb,Int_t row_upb,Int_t nr_nonZeros,Int_t verbose);
146 TDecompSparse(
const TMatrixDSparse &a,Int_t verbose);
147 TDecompSparse(
const TDecompSparse &another);
148 virtual ~TDecompSparse() {}
150 inline void SetVerbose (Int_t v) { fVerbose = (v) ? 1 : 0;
151 if (fVerbose) { fIcntl[1] = fIcntl[2] = 1; fIcntl[3] = 2; }
152 else { fIcntl[1] = fIcntl[2] = fIcntl[3] = 0; }
154 virtual Int_t GetNrows ()
const {
return fA.GetNrows(); }
155 virtual Int_t GetNcols ()
const {
return fA.GetNcols(); }
157 virtual void SetMatrix (
const TMatrixDSparse &a);
159 virtual Bool_t Decompose ();
160 virtual Bool_t Solve ( TVectorD &b);
161 virtual TVectorD Solve (
const TVectorD& b,Bool_t &ok) { TVectorD x = b; ok = Solve(x);
return x; }
162 virtual Bool_t Solve ( TMatrixDColumn & )
163 { MayNotUse(
"Solve(TMatrixDColumn &)");
return kFALSE; }
164 virtual Bool_t TransSolve ( TVectorD &b) {
return Solve(b); }
165 virtual TVectorD TransSolve (
const TVectorD& b,Bool_t &ok) { TVectorD x = b; ok = Solve(x);
return x; }
166 virtual Bool_t TransSolve ( TMatrixDColumn & )
167 { MayNotUse(
"TransSolve(TMatrixDColumn &)");
return kFALSE; }
169 virtual void Det (Double_t &,Double_t &)
170 { MayNotUse(
"Det(Double_t&,Double_t&)"); }
172 void Print(Option_t *opt =
"")
const;
174 TDecompSparse &operator= (
const TDecompSparse &source);
176 ClassDef(TDecompSparse,1)