42 #ifndef _TEUCHOS_SERIALBANDDENSEMATRIX_HPP_
43 #define _TEUCHOS_SERIALBANDDENSEMATRIX_HPP_
132 template<
typename OrdinalType,
typename ScalarType>
293 ScalarType&
operator () (OrdinalType rowIndex, OrdinalType colIndex);
303 const ScalarType&
operator () (OrdinalType rowIndex, OrdinalType colIndex)
const;
323 const ScalarType*
operator [] (OrdinalType colIndex)
const;
357 int scale (
const ScalarType alpha );
424 virtual void print(std::ostream& os)
const;
429 void copyMat(ScalarType* inputMatrix, OrdinalType strideInput,
430 OrdinalType
numRows, OrdinalType
numCols, ScalarType* outputMatrix,
433 void checkIndex( OrdinalType rowIndex, OrdinalType colIndex = 0 )
const;
448 template<
typename OrdinalType,
typename ScalarType>
452 BLAS<OrdinalType,ScalarType>(),
458 valuesCopied_ (false),
462 template<
typename OrdinalType,
typename ScalarType>
465 OrdinalType numCols_in,
471 BLAS<OrdinalType,ScalarType>(),
472 numRows_ (numRows_in),
473 numCols_ (numCols_in),
474 stride_ (kl_in+ku_in+1),
477 valuesCopied_ (true),
486 template<
typename OrdinalType,
typename ScalarType>
489 ScalarType* values_in,
490 OrdinalType stride_in,
491 OrdinalType numRows_in,
492 OrdinalType numCols_in,
497 BLAS<OrdinalType,ScalarType>(),
498 numRows_ (numRows_in),
499 numCols_ (numCols_in),
503 valuesCopied_ (false),
514 template<
typename OrdinalType,
typename ScalarType>
519 BLAS<OrdinalType,ScalarType>(),
525 valuesCopied_ (true),
545 for (OrdinalType j = 0; j <
numCols_; ++j) {
560 for (OrdinalType j=0; j<
numCols_; j++) {
569 template<
typename OrdinalType,
typename ScalarType>
573 OrdinalType numRows_in,
574 OrdinalType numCols_in,
575 OrdinalType startCol)
578 BLAS<OrdinalType,ScalarType>(),
579 numRows_ (numRows_in),
580 numCols_ (numCols_in),
581 stride_ (Source.stride_),
584 valuesCopied_ (false),
585 values_ (Source.values_)
597 template<
typename OrdinalType,
typename ScalarType>
607 template<
typename OrdinalType,
typename ScalarType>
609 OrdinalType numRows_in, OrdinalType numCols_in, OrdinalType kl_in, OrdinalType ku_in
613 numRows_ = numRows_in;
614 numCols_ = numCols_in;
618 values_ =
new ScalarType[stride_*numCols_];
620 valuesCopied_ =
true;
625 template<
typename OrdinalType,
typename ScalarType>
627 OrdinalType numRows_in, OrdinalType numCols_in, OrdinalType kl_in, OrdinalType ku_in
631 numRows_ = numRows_in;
632 numCols_ = numCols_in;
636 values_ =
new ScalarType[stride_*numCols_];
637 valuesCopied_ =
true;
642 template<
typename OrdinalType,
typename ScalarType>
644 OrdinalType numRows_in, OrdinalType numCols_in, OrdinalType kl_in, OrdinalType ku_in
649 ScalarType* values_tmp =
new ScalarType[(kl_in+ku_in+1) * numCols_in];
651 for(OrdinalType k = 0; k < (kl_in+ku_in+1) * numCols_in; k++) {
652 values_tmp[k] = zero;
654 OrdinalType numRows_tmp =
TEUCHOS_MIN(numRows_, numRows_in);
655 OrdinalType numCols_tmp =
TEUCHOS_MIN(numCols_, numCols_in);
657 copyMat(values_, stride_, numRows_tmp, numCols_tmp, values_tmp,
661 numRows_ = numRows_in;
662 numCols_ = numCols_in;
666 values_ = values_tmp;
667 valuesCopied_ =
true;
676 template<
typename OrdinalType,
typename ScalarType>
681 for(OrdinalType j = 0; j < numCols_; j++) {
683 values_[(ku_+i-j) + j*stride_] = value_in;
690 template<
typename OrdinalType,
typename ScalarType>
695 for(OrdinalType j = 0; j < numCols_; j++) {
704 template<
typename OrdinalType,
typename ScalarType>
736 const OrdinalType newsize = stride_ * numCols_;
738 values_ =
new ScalarType[newsize];
739 valuesCopied_ =
true;
758 const OrdinalType newsize = stride_ * numCols_;
760 values_ =
new ScalarType[newsize];
761 valuesCopied_ =
true;
765 copyMat(Source.
values_, Source.
stride_, numRows_, numCols_, values_, stride_, 0);
771 template<
typename OrdinalType,
typename ScalarType>
776 if ((numRows_ != Source.
numRows_) || (numCols_ != Source.
numCols_) || (kl_ != Source.
kl_) || (ku_ != Source.
ku_)) {
784 template<
typename OrdinalType,
typename ScalarType>
789 if ((numRows_ != Source.
numRows_) || (numCols_ != Source.
numCols_) || (kl_ != Source.
kl_) || (ku_ != Source.
ku_)) {
797 template<
typename OrdinalType,
typename ScalarType>
806 if ((numRows_ != Source.
numRows_) || (numCols_ != Source.
numCols_) || (kl_ != Source.
kl_) || (ku_ != Source.
ku_)) {
809 copyMat(Source.
values_, Source.
stride_, numRows_, numCols_, values_, stride_, 0);
818 template<
typename OrdinalType,
typename ScalarType>
821 #ifdef HAVE_TEUCHOS_ARRAY_BOUNDSCHECK
822 checkIndex( rowIndex, colIndex );
824 return(values_[colIndex * stride_ + ku_+rowIndex-colIndex]);
827 template<
typename OrdinalType,
typename ScalarType>
830 #ifdef HAVE_TEUCHOS_ARRAY_BOUNDSCHECK
831 checkIndex( rowIndex, colIndex );
833 return(values_[colIndex * stride_ + ku_+rowIndex-colIndex]);
836 template<
typename OrdinalType,
typename ScalarType>
839 #ifdef HAVE_TEUCHOS_ARRAY_BOUNDSCHECK
840 checkIndex( 0, colIndex );
842 return(values_ + colIndex * stride_);
845 template<
typename OrdinalType,
typename ScalarType>
848 #ifdef HAVE_TEUCHOS_ARRAY_BOUNDSCHECK
849 checkIndex( 0, colIndex );
851 return(values_ + colIndex * stride_);
858 template<
typename OrdinalType,
typename ScalarType>
866 for(j = 0; j < numCols_; j++) {
868 ptr = values_ + j * stride_ +
TEUCHOS_MAX(0, ku_-j);
877 updateFlops((kl_+ku_+1) * numCols_);
882 template<
typename OrdinalType,
typename ScalarType>
888 for (i = 0; i < numRows_; i++) {
895 updateFlops((kl_+ku_+1) * numCols_);
900 template<
typename OrdinalType,
typename ScalarType>
906 for (j = 0; j < numCols_; j++) {
912 updateFlops((kl_+ku_+1) * numCols_);
921 template<
typename OrdinalType,
typename ScalarType>
926 if((numRows_ != Operand.
numRows_) || (numCols_ != Operand.
numCols_) || (kl_ != Operand.
kl_) || (ku_ != Operand.
ku_)) {
930 for(j = 0; j < numCols_; j++) {
932 if((*
this)(i, j) != Operand(i, j)) {
942 template<
typename OrdinalType,
typename ScalarType>
945 return !((*this) == Operand);
952 template<
typename OrdinalType,
typename ScalarType>
955 this->scale( alpha );
959 template<
typename OrdinalType,
typename ScalarType>
966 for (j=0; j<numCols_; j++) {
969 *ptr = alpha * (*ptr); ptr++;
972 updateFlops( (kl_+ku_+1)*numCols_ );
977 template<
typename OrdinalType,
typename ScalarType>
985 if ((numRows_ !=
A.numRows_) || (numCols_ !=
A.numCols_) || (kl_ !=
A.kl_) || (ku_ !=
A.ku_)) {
988 for (j=0; j<numCols_; j++) {
991 *ptr =
A(i,j) * (*ptr); ptr++;
994 updateFlops( (kl_+ku_+1)*numCols_ );
999 template<
typename OrdinalType,
typename ScalarType>
1004 os <<
"Values_copied : yes" << std::endl;
1006 os <<
"Values_copied : no" << std::endl;
1007 os <<
"Rows : " << numRows_ << std::endl;
1008 os <<
"Columns : " << numCols_ << std::endl;
1009 os <<
"Lower Bandwidth : " << kl_ << std::endl;
1010 os <<
"Upper Bandwidth : " << ku_ << std::endl;
1011 os <<
"LDA : " << stride_ << std::endl;
1012 if(numRows_ == 0 || numCols_ == 0) {
1013 os <<
"(matrix is empty, no values to display)" << std::endl;
1016 for(OrdinalType i = 0; i < numRows_; i++) {
1018 os << (*this)(i,j) <<
" ";
1029 template<
typename OrdinalType,
typename ScalarType>
1035 "SerialBandDenseMatrix<T>::checkIndex: "
1036 "Row index " << rowIndex <<
" out of range [0, "<< numRows_ <<
")");
1038 "SerialBandDenseMatrix<T>::checkIndex: "
1039 "Col index " << colIndex <<
" out of range [0, "<< numCols_ <<
")");
1043 template<
typename OrdinalType,
typename ScalarType>
1046 if (valuesCopied_) {
1049 valuesCopied_ =
false;
1053 template<
typename OrdinalType,
typename ScalarType>
1055 ScalarType* inputMatrix, OrdinalType strideInput, OrdinalType numRows_in,
1056 OrdinalType numCols_in, ScalarType* outputMatrix, OrdinalType strideOutput, OrdinalType startCol, ScalarType alpha
1060 ScalarType* ptr1 = 0;
1061 ScalarType* ptr2 = 0;
1063 for(j = 0; j < numCols_in; j++) {
1064 ptr1 = outputMatrix + (j * strideOutput) +
TEUCHOS_MAX(0, ku_-j);
1065 ptr2 = inputMatrix + (j + startCol) * strideInput +
TEUCHOS_MAX(0, ku_-j);
1068 *ptr1++ += alpha*(*ptr2++);