ROOT logo
#ifndef ALISYMBDMATRIX_H
#define ALISYMBDMATRIX_H

/*********************************************************************************/
/* Symmetric Band Diagonal matrix with half band width W (+1 for diagonal)       */
/* Only lower triangle is stored in the "profile" format                         */ 
/*                                                                               */ 
/*                                                                               */
/* Author: ruben.shahoyan@cern.ch                                                */
/*                                                                               */ 
/*********************************************************************************/

//#include <string.h>
#include <TObject.h>
#include <TVectorD.h>
#include "AliMatrixSq.h"


class AliSymBDMatrix : public AliMatrixSq {
  //
 public:
  enum {kDecomposedBit = 0x1};
  //
  AliSymBDMatrix();
  AliSymBDMatrix(Int_t size, Int_t w = 0);
  AliSymBDMatrix(const AliSymBDMatrix &mat);
  virtual ~AliSymBDMatrix();
  //
  Int_t         GetBandHWidth()                                  const {return fNrows;}
  Int_t         GetNElemsStored()                                const {return fNelems;}
  void          Clear(Option_t* option="");
  void          Reset();
  //
  Float_t       GetDensity()                                     const;
  AliSymBDMatrix& operator=(const AliSymBDMatrix& src);
  Double_t      operator()(Int_t rown, Int_t coln)               const;
  Double_t&     operator()(Int_t rown, Int_t coln);
  Double_t      operator()(Int_t rown)                           const;
  Double_t&     operator()(Int_t rown);
  //
  Double_t      DiagElem(Int_t r)                                const {return (*(const AliSymBDMatrix*)this)(r,r);}
  Double_t&     DiagElem(Int_t r)                                      {return (*this)(r,r);}
  void          DecomposeLDLT();
  void          Solve(Double_t *rhs);
  void          Solve(const Double_t *rhs,Double_t *sol);
  void          Solve(TVectorD &rhs)                                   {Solve(rhs.GetMatrixArray());}
  void          Solve(const TVectorD &rhs,TVectorD &sol)               {Solve(rhs.GetMatrixArray(),sol.GetMatrixArray());}
  //
  void          Print(Option_t* option="")                       const;
  void          SetDecomposed(Bool_t v=kTRUE)                          {SetBit(kDecomposedBit,v);}
  Bool_t        IsDecomposed()                                   const {return TestBit(kDecomposedBit);}
  //
  void          MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const;
  void          MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const;
  void          AddToRow(Int_t r, Double_t *valc,Int_t *indc,Int_t n);
  //
  // protected:
  virtual             Int_t GetIndex(Int_t row,Int_t col)      const;
  virtual             Int_t GetIndex(Int_t diagID)             const;
  Double_t            GetEl(Int_t row, Int_t col)              const {return operator()(row,col);}
  void                SetEl(Int_t row, Int_t col,Double_t val)       {operator()(row,col) = val;}
  //
 protected:
  Double_t*  fElems;     //   Elements booked by constructor
  //
  ClassDef(AliSymBDMatrix,0) //Symmetric Matrix Class
};


//___________________________________________________________
inline Int_t AliSymBDMatrix::GetIndex(Int_t row,Int_t col) const
{
  // lower triangle band is actually filled
  if (row<col) Swap(row,col);
  col -= row;
  if (col < -GetBandHWidth()) return -1;
  return GetIndex(row) + col;
}

//___________________________________________________________
inline Int_t AliSymBDMatrix::GetIndex(Int_t diagID) const
{
  // Get index of the diagonal element on row diagID
  return (diagID+1)*fRowLwb-1;
}

//___________________________________________________________
inline Double_t AliSymBDMatrix::operator()(Int_t row, Int_t col) const
{
  // query element
  int idx = GetIndex(row,col);
  return (const Double_t&) idx<0 ? 0.0 : fElems[idx];
}

//___________________________________________________________
inline Double_t& AliSymBDMatrix::operator()(Int_t row, Int_t col)
{
  // get element for assingment; assignment outside of the stored range has no effect
  int idx = GetIndex(row,col);  
  if (idx>=0) return fElems[idx];
  fTol = 0; 
  return fTol;
}

//___________________________________________________________
inline Double_t AliSymBDMatrix::operator()(Int_t row) const
{
  // query diagonal 
  return (const Double_t&) fElems[GetIndex(row)];
}

//___________________________________________________________
inline Double_t& AliSymBDMatrix::operator()(Int_t row)
{
  // get diagonal for assingment; assignment outside of the stored range has no effect
  return fElems[GetIndex(row)];
}

//___________________________________________________________
inline void AliSymBDMatrix::MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const
{
  MultiplyByVec(vecIn.GetMatrixArray(), vecOut.GetMatrixArray());
}

#endif
 AliSymBDMatrix.h:1
 AliSymBDMatrix.h:2
 AliSymBDMatrix.h:3
 AliSymBDMatrix.h:4
 AliSymBDMatrix.h:5
 AliSymBDMatrix.h:6
 AliSymBDMatrix.h:7
 AliSymBDMatrix.h:8
 AliSymBDMatrix.h:9
 AliSymBDMatrix.h:10
 AliSymBDMatrix.h:11
 AliSymBDMatrix.h:12
 AliSymBDMatrix.h:13
 AliSymBDMatrix.h:14
 AliSymBDMatrix.h:15
 AliSymBDMatrix.h:16
 AliSymBDMatrix.h:17
 AliSymBDMatrix.h:18
 AliSymBDMatrix.h:19
 AliSymBDMatrix.h:20
 AliSymBDMatrix.h:21
 AliSymBDMatrix.h:22
 AliSymBDMatrix.h:23
 AliSymBDMatrix.h:24
 AliSymBDMatrix.h:25
 AliSymBDMatrix.h:26
 AliSymBDMatrix.h:27
 AliSymBDMatrix.h:28
 AliSymBDMatrix.h:29
 AliSymBDMatrix.h:30
 AliSymBDMatrix.h:31
 AliSymBDMatrix.h:32
 AliSymBDMatrix.h:33
 AliSymBDMatrix.h:34
 AliSymBDMatrix.h:35
 AliSymBDMatrix.h:36
 AliSymBDMatrix.h:37
 AliSymBDMatrix.h:38
 AliSymBDMatrix.h:39
 AliSymBDMatrix.h:40
 AliSymBDMatrix.h:41
 AliSymBDMatrix.h:42
 AliSymBDMatrix.h:43
 AliSymBDMatrix.h:44
 AliSymBDMatrix.h:45
 AliSymBDMatrix.h:46
 AliSymBDMatrix.h:47
 AliSymBDMatrix.h:48
 AliSymBDMatrix.h:49
 AliSymBDMatrix.h:50
 AliSymBDMatrix.h:51
 AliSymBDMatrix.h:52
 AliSymBDMatrix.h:53
 AliSymBDMatrix.h:54
 AliSymBDMatrix.h:55
 AliSymBDMatrix.h:56
 AliSymBDMatrix.h:57
 AliSymBDMatrix.h:58
 AliSymBDMatrix.h:59
 AliSymBDMatrix.h:60
 AliSymBDMatrix.h:61
 AliSymBDMatrix.h:62
 AliSymBDMatrix.h:63
 AliSymBDMatrix.h:64
 AliSymBDMatrix.h:65
 AliSymBDMatrix.h:66
 AliSymBDMatrix.h:67
 AliSymBDMatrix.h:68
 AliSymBDMatrix.h:69
 AliSymBDMatrix.h:70
 AliSymBDMatrix.h:71
 AliSymBDMatrix.h:72
 AliSymBDMatrix.h:73
 AliSymBDMatrix.h:74
 AliSymBDMatrix.h:75
 AliSymBDMatrix.h:76
 AliSymBDMatrix.h:77
 AliSymBDMatrix.h:78
 AliSymBDMatrix.h:79
 AliSymBDMatrix.h:80
 AliSymBDMatrix.h:81
 AliSymBDMatrix.h:82
 AliSymBDMatrix.h:83
 AliSymBDMatrix.h:84
 AliSymBDMatrix.h:85
 AliSymBDMatrix.h:86
 AliSymBDMatrix.h:87
 AliSymBDMatrix.h:88
 AliSymBDMatrix.h:89
 AliSymBDMatrix.h:90
 AliSymBDMatrix.h:91
 AliSymBDMatrix.h:92
 AliSymBDMatrix.h:93
 AliSymBDMatrix.h:94
 AliSymBDMatrix.h:95
 AliSymBDMatrix.h:96
 AliSymBDMatrix.h:97
 AliSymBDMatrix.h:98
 AliSymBDMatrix.h:99
 AliSymBDMatrix.h:100
 AliSymBDMatrix.h:101
 AliSymBDMatrix.h:102
 AliSymBDMatrix.h:103
 AliSymBDMatrix.h:104
 AliSymBDMatrix.h:105
 AliSymBDMatrix.h:106
 AliSymBDMatrix.h:107
 AliSymBDMatrix.h:108
 AliSymBDMatrix.h:109
 AliSymBDMatrix.h:110
 AliSymBDMatrix.h:111
 AliSymBDMatrix.h:112
 AliSymBDMatrix.h:113
 AliSymBDMatrix.h:114
 AliSymBDMatrix.h:115
 AliSymBDMatrix.h:116
 AliSymBDMatrix.h:117
 AliSymBDMatrix.h:118
 AliSymBDMatrix.h:119
 AliSymBDMatrix.h:120
 AliSymBDMatrix.h:121
 AliSymBDMatrix.h:122
 AliSymBDMatrix.h:123
 AliSymBDMatrix.h:124
 AliSymBDMatrix.h:125