14#ifndef TBCI_F_BANDMATRIX_H
15#define TBCI_F_BANDMATRIX_H
19#include "tbci/matrix.h"
20#include "tbci/vector.h"
23#if !defined(NO_GD) && !defined(AUTO_DECL)
24# include "f_bandmatrix_gd.h"
30#ifndef TBCI_DISABLE_EXCEPT
42# pragma interface "f_bandmatrix.h"
47template <
typename T>
class Matrix;
69 unsigned int superDiags = 0,
70 unsigned int subDiags = 0)
71 {
allocate(dimension, superDiags, subDiags); }
80 inline T operator() (
unsigned int row,
unsigned int column)
const;
82 inline T&
operator() (
unsigned int row,
unsigned int column);
84 inline void setval(
const T z,
unsigned int row,
unsigned int column);
101 inline void resize(
unsigned int newDim,
unsigned int newSuper,
unsigned int newSub);
150 void allocate(
unsigned int dimension,
151 unsigned int superDiags,
152 unsigned int subDiags);
172 if (row-column >
sub)
175 if (column-row >
super)
216 for (
unsigned int i=0;
i<
dim;
i++)
217 ColVec.
set((*
this)(
i,column),
i);
226 for (
unsigned int i=0;
i<
dim; ++
i) {
228 if (!(
i-column >
sub))
229 (*this)(
i,column) = v(
i);
232 (*this)(
i,column) = v(
i);
256 if (
this == &m)
return *
this;
272 if (m1.
dim != m2.
dim)
return false;
273 for (
unsigned int j=0; j<m1.
dim; j++)
274 for (
unsigned int i=0;
i<m1.
dim;
i++)
275 if (m1(
i,j) != m2(
i,j))
return false;
284 if (m1.
dim != m2.
dim)
return true;
285 for (
unsigned int j=0; j<m1.
dim; j++)
286 for (
unsigned int i=0;
i<m1.
dim;
i++)
287 if (m1(
i,j) != m2(
i,j))
return true;
296 for (
unsigned int j=0; j<(m.
dim*(m.
sub+m.
super+1)); ++j)
308 for (
unsigned int i=0;
i<m.
dim;
i++) {
310 unsigned int left = (
i>m.
sub ?
i-m.
sub : 0);
314 for (
unsigned int j=left; j<
right; j++)
349 for (
unsigned int j=0; j<
dim; j++)
356 for (
unsigned int i=left;
i<
right;
i++)
383 for (
unsigned int j=0; j<(m.
dim*(m.
super+m.
sub+1)); ++j)
394 for (
unsigned int j=0; j<(m.
dim*(m.
super+m.
sub+1)); ++j)
426 for (
unsigned int j=0; j<(m.
dim*(m.
super+m.
sub+1)); ++j)
446 for (
unsigned r = 0; r <
dim-
super; ++r)
447 if (m(r, r+
super) != (
T)0)
469 for (
unsigned r = 0; r <
dim; ++r)
470 for (
unsigned c =
MAX(0, (
int)(r-
sub));
472 (*
this)(r,
c) = m(r,
c);
476# define LAPACK_INLINE
482 unsigned int superDiags,
483 unsigned int subDiags)
486 BCHKNR(superDiags >= dimension || subDiags >= dimension,
F_BandMatErr, Dimension conflict, (subDiags<superDiags? subDiags : superDiags));
490 unsigned int colSize =
super +
sub + 1;
513 unsigned int colSize =
super +
sub + 1;
524 unsigned int numSub(0),numSuper(0),dim(0);
535 for(
unsigned int i(0);
i<C.
size();
i++)
539 if((j>=0)&&(j<(
int)C.
size()))
543 C(
i,j)=A(
i,j)+B(
i,j);
567 for(
unsigned int i(0);
i<C.
size();
i++)
571 if((j>=0)&&(j<(
int)C.
size()))
575 C(
i,j)=A(
i,j)-B(
i,j);
589 for (
unsigned int i = 0;
i < m.
rows();
i++)
591 for (
unsigned int j = 0; j < m.
columns(); j++)
592 stream << m(
i,j) <<
" ";
593 stream <<
STD__ endl;
611 for (
unsigned int r = 0; r <
dim; ++r)
612 for (
unsigned int c =
MAX(0, (
int)(r-
super));
614 f(r,
c) = (*this)(
c,r);
long int Vector< T > & index
#define BCHK(cond, exc, txt, ind, rtval)
#define BCHKNR(cond, exc, txt, ind)
F_BandMatErr(const char *t, const long i=0)
C++ class for banded matrices using band storage in a one-dimensional array.
void allocate(unsigned int dimension, unsigned int superDiags, unsigned int subDiags)
TVector< T > transMult(const Vector< T > &v) const
F_BandMatrix< T > & transpose()
transpose() does change the object!
F_BandMatrix< T > & operator=(const F_BandMatrix< T > &m)
T aligned_value_type TALIGN(MIN_ALIGN2)
T & setval(unsigned r, unsigned c)
F_BandMatrix< T > transposed_copy() const
friend TVector< T > do_fbdmat_vec_mul FGD(const F_BandMatrix< T > &m, const Vector< T > &v)
unsigned int columns() const
F_BandMatrix< T > & swap(F_BandMatrix< T > &m)
unsigned int ldab() const
friend F_BandMatrix< T > do_fbdmat_scale FGD(const F_BandMatrix< T > &m, const T z)
T operator()(unsigned int row, unsigned int column) const
void copy(const F_BandMatrix< T > &m)
F_BandMatrix< T > & operator*=(const T z)
T *const & get_fortran_matrix() const
F_BandMatrix(const F_BandMatrix< T > &m)
F_BandMatrix< T > & operator/=(const T z)
unsigned int numSub() const
F_BandMatrix(unsigned int dimension, unsigned int superDiags=0, unsigned int subDiags=0)
void find_sub(const Matrix< T > &m)
Find number of sub diagonals.
void set_col(const Vector< T > &v, unsigned int column)
unsigned int rows() const
void find_super(const Matrix< T > &m)
Find number of super diagonals.
void resize(unsigned int newDim, unsigned int newSuper, unsigned int newSub)
friend F_BandMatrix< T > do_fbdmat_scale FGD(const T z, const F_BandMatrix< T > &m)
unsigned int numSuper() const
unsigned int size() const
void setval(const T z, unsigned int row, unsigned int column)
TVector< T > get_col(unsigned int column) const
unsigned int rows() const
number of rows
unsigned int columns() const
number of columns
Temporary Base Class Idiom: Class TVector is used for temporary variables.
unsigned long size() const
T & set(const T &val, const unsigned long i) const
TVector< T > operator*(const F_BandMatrix< T > &m, const Vector< T > &v)
TVector< T > do_fbdmat_vec_mul(const F_BandMatrix< T > &m, const Vector< T > &v)
F_BandMatrix< T > do_fbdmat_scale(const F_BandMatrix< T > &m, const T z)
F_BandMatrix< T > operator-(const F_BandMatrix< T > &m)
bool operator==(const F_BandMatrix< T > &m1, const F_BandMatrix< T > &m2)
F_BandMatrix< T > transpose(const F_BandMatrix< T > &fbd)
bool operator!=(const F_BandMatrix< T > &m1, const F_BandMatrix< T > &m2)
STD__ ostream & operator<<(STD__ ostream &stream, const F_BandMatrix< T > &m)
F_BandMatrix< T > operator+(const F_BandMatrix< T > &A, const F_BandMatrix< T > &B)
F_BandMatrix< T > operator/(const F_BandMatrix< T > &m, const T z)
T sum(const FS_Vector< dims, T > &fv)
const unsigned TMatrix< T > * res