//      LAPACK++ (V. 1.1)
//      (C) 1992-1996 All Rights Reserved.


#include "arch.h"
#ifndef _LA_SYMM_TRIDIAG_MAT_DOUBLE_H_
#define _LA_SYMM_TRIDIAG_MAT_DOUBLE_H_

#include LA_VECTOR_DOUBLE_H

class DLLIMPORT LaSymmTridiagMatDouble
{   
        int size_;
        LaVectorDouble d_;          /* main diag */
        LaVectorDouble dl_;         /* lower diag */
        static double outofbounds_; /* return this address, when addresing 
                                        out of bounds */
        static int debug_;        // print debug info.
        static int *info_;        // print matrix info only, not values
                                  //   originally 0, set to 1, and then
                                  //   reset to 0 after use.

    public:

        // constructors / destructor
    
        inline LaSymmTridiagMatDouble();
        inline LaSymmTridiagMatDouble(int N);
        inline LaSymmTridiagMatDouble(const LaSymmTridiagMatDouble &);
        inline ~LaSymmTridiagMatDouble();

        // operators and member functions

                double& operator()(int i, int j);
                double operator()(int i, int j) const;
                LaVectorDouble diag(int); /* 0 main, -1 lower, 1 upper */
                LaVectorDouble diag(int) const;
        inline LaSymmTridiagMatDouble& ref(LaSymmTridiagMatDouble&); 
        inline LaSymmTridiagMatDouble& copy(const LaSymmTridiagMatDouble&); 
        inline const LaSymmTridiagMatDouble& info() const {
            int *t = info_;
            *t = 1;
            return *this;};
        inline int debug() const {    // return debug flag.
            return debug_;}
        inline int size() const; 



        friend DLLIMPORT std::ostream& operator<<(std::ostream&,const LaSymmTridiagMatDouble&);


};

DLLIMPORT std::ostream& operator<<(std::ostream& s, const LaSymmTridiagMatDouble& td);

    // constructors

inline LaSymmTridiagMatDouble::LaSymmTridiagMatDouble(): 
        d_(), dl_()
{
    size_ = 0;
}

inline LaSymmTridiagMatDouble::LaSymmTridiagMatDouble(int N): 
        d_(N), dl_(N-1)
{
    size_ = N;
}
    
inline LaSymmTridiagMatDouble::LaSymmTridiagMatDouble(const LaSymmTridiagMatDouble& td): d_(td.d_), dl_(td.dl_)
{
    size_ = td.size_;
}

    // destructor

inline LaSymmTridiagMatDouble::~LaSymmTridiagMatDouble()
{
}


    // operators and member functions



inline LaSymmTridiagMatDouble& LaSymmTridiagMatDouble::ref(LaSymmTridiagMatDouble&T) 
{
    d_.ref(T.d_);
    dl_.ref(T.dl_); 
    size_ = T.size_;

    return *this;
}


inline LaSymmTridiagMatDouble& LaSymmTridiagMatDouble::copy(const LaSymmTridiagMatDouble&T) 
{
    d_.copy(T.d_);
    dl_.copy(T.dl_);    
    size_ = T.size_;

    return *this;
}

inline int LaSymmTridiagMatDouble::size() const
{
    return size_;
}



#endif 
// _LA_SYMM_TRIDIAG_MAT_DOUBLE_H_


syntax highlighted by Code2HTML, v. 0.9.1