[3809] | 1 | // This may look like C code, but it is really -*- C++ -*-
|
---|
| 2 | // This code is part of the SOPHYA library
|
---|
| 3 | // (C) Univ. Paris-Sud (C) LAL-IN2P3/CNRS (C) IRFU-CEA
|
---|
| 4 | // (C) R. Ansari, C.Magneville 2009
|
---|
| 5 |
|
---|
| 6 | #ifndef SPESQMTX_H_SEEN
|
---|
| 7 | #define SPESQMTX_H_SEEN
|
---|
| 8 |
|
---|
| 9 | #include "ndatablock.h"
|
---|
| 10 | #include "pexceptions.h"
|
---|
| 11 | #include "utilarr.h"
|
---|
| 12 | #include "tmatrix.h"
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | namespace SOPHYA {
|
---|
| 16 |
|
---|
| 17 | //--- enum definissant le type de matrice carre
|
---|
| 18 | //! enum definition for the differents special square matrix types (or flavours)
|
---|
| 19 | enum SpSqMtxType {
|
---|
| 20 | C_UndefinedMatrix = 0, //!< Base type
|
---|
| 21 | C_DiagonalMatrix = 1, //!< Diagonal Matrix
|
---|
| 22 | C_SymmetricMatrix = 4, //!< Symmetric Matrix
|
---|
| 23 | C_LowerTriangularMatrix = 8, //!< Lower Triangular Matrix
|
---|
| 24 | C_UpperTriangularMatrix = 9 //!< Upper Triangular Matrix
|
---|
| 25 | };
|
---|
| 26 |
|
---|
| 27 | //-- forward declaration for the PPF handler
|
---|
| 28 | template <class T> class FIO_SpecialSquareMatrix;
|
---|
| 29 |
|
---|
| 30 | template <class T>
|
---|
| 31 | class SpecialSquareMatrix : public AnyDataObj {
|
---|
| 32 | public :
|
---|
| 33 |
|
---|
| 34 |
|
---|
| 35 | // Constructor - size 0, SetSize() should be called before the object is used
|
---|
| 36 | explicit SpecialSquareMatrix(SpSqMtxType typ=C_UndefinedMatrix);
|
---|
| 37 |
|
---|
| 38 | // Constructeur avec specification du nombre de lignes
|
---|
| 39 | explicit SpecialSquareMatrix(sa_size_t rowSize, SpSqMtxType typ);
|
---|
| 40 |
|
---|
| 41 | // Constructor de copy (avec partage de reference de NDataBlock)
|
---|
| 42 | SpecialSquareMatrix(SpecialSquareMatrix<T> const & a, bool share=true);
|
---|
| 43 |
|
---|
| 44 | // Allocation / changement de taille - Doit etre redefinie par les classes derivees
|
---|
| 45 | virtual void SetSize(sa_size_t rowSize);
|
---|
| 46 |
|
---|
| 47 | //! Alias for SetSize()
|
---|
| 48 | inline void ReSize(sa_size_t rowSize)
|
---|
| 49 | {
|
---|
| 50 | return SetSize(rowSize);
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | //! Alias for SetSize()
|
---|
| 54 | inline void ReSizeRow(sa_size_t rowSize)
|
---|
| 55 | {
|
---|
| 56 | return SetSize(rowSize);
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | // Retourne l'objet sous forme d'une TMatrix<T>
|
---|
| 60 | virtual TMatrix<T> ConvertToStdMatrix() const;
|
---|
| 61 |
|
---|
| 62 | // Clone : duplique l'objet et ses donnees
|
---|
| 63 | virtual void Clone(SpecialSquareMatrix<T> const & a);
|
---|
| 64 |
|
---|
| 65 | // Share : recopie l'objet a avec partage des donnees des elements
|
---|
| 66 | virtual void Share(SpecialSquareMatrix<T> const & a);
|
---|
| 67 |
|
---|
| 68 | // Operation de Share() si objet temporaire, Clone() sinon
|
---|
| 69 | virtual void CloneOrShare(SpecialSquareMatrix<T> const & a);
|
---|
| 70 |
|
---|
| 71 | //! Flags the associated NDataBlock as temporary if \b fgtmp==true
|
---|
| 72 | inline void SetTemp(bool fgtmp=false) const { mElems.SetTemp(fgtmp); }
|
---|
| 73 |
|
---|
| 74 | //! Return the matrix type (Diagonal, Triangular ...)
|
---|
| 75 | inline SpSqMtxType MtxType() const { return mType; }
|
---|
| 76 | //! Return number of rows
|
---|
| 77 | inline sa_size_t NRows() const {return (int_4)mNrows;}
|
---|
| 78 | //! Return number of colums ( = NRows())
|
---|
| 79 | inline sa_size_t NCols() const {return (int_4)mNrows;}
|
---|
| 80 |
|
---|
| 81 | //! Return the total number of non zero elements
|
---|
| 82 | inline sa_size_t Size() const { return mElems.Size();}
|
---|
| 83 |
|
---|
| 84 | //! Return reference to datablock containg matrix elements NDataBlock
|
---|
| 85 | inline NDataBlock<T>& DataBlock() { return mElems; }
|
---|
| 86 | //! Return reference to datablock containg matrix elements NDataBlock
|
---|
| 87 | inline const NDataBlock<T>& DataBlock() const { return mElems; }
|
---|
| 88 |
|
---|
| 89 | //! Return a reference to the associated DVList object
|
---|
| 90 | inline DVList& Info()
|
---|
| 91 | { if (mInfo==NULL) mInfo = new DVList; return (*mInfo); }
|
---|
| 92 |
|
---|
| 93 | // Pour mettre tous les elements a la valeur a
|
---|
| 94 | virtual SpecialSquareMatrix<T>& SetCst(T a);
|
---|
| 95 |
|
---|
| 96 | //! Alias for SetT(a) - Set all matrix elements to the value \b a
|
---|
| 97 | inline SpecialSquareMatrix<T>& SetT(T a)
|
---|
| 98 | { return SetCst(a); }
|
---|
| 99 |
|
---|
| 100 | // Egalite/Recopie element par element
|
---|
| 101 | virtual SpecialSquareMatrix<T>& Set(SpecialSquareMatrix<T> const & a);
|
---|
| 102 |
|
---|
| 103 | // Remplissage avec une sequence de valeurs
|
---|
| 104 | virtual SpecialSquareMatrix<T>& SetSeq(Sequence const & seq);
|
---|
| 105 |
|
---|
| 106 | // Ajout de la constante "b: a tous les elements
|
---|
| 107 | virtual SpecialSquareMatrix<T>& AddCst(T b);
|
---|
| 108 |
|
---|
| 109 | // Soustrait "b" a tous les elements - fginv==true -> elem = b-elem
|
---|
| 110 | virtual SpecialSquareMatrix<T>& SubCst(T b, bool fginv=false);
|
---|
| 111 |
|
---|
| 112 | // Multiplie "b" a tous les elements
|
---|
| 113 | virtual SpecialSquareMatrix<T>& MulCst(T b);
|
---|
| 114 |
|
---|
| 115 | // Divise tous les elements par "b". fginv==true elem = b / elem
|
---|
| 116 | virtual SpecialSquareMatrix<T>& DivCst(T b, bool fginv=false);
|
---|
| 117 |
|
---|
| 118 | // Addition element par element: elem(l,c) = elem(l,c) + b.elem(l,c)
|
---|
| 119 | virtual SpecialSquareMatrix<T>& AddElt(SpecialSquareMatrix<T> const& b);
|
---|
| 120 |
|
---|
| 121 | // Soustraction element par element : elem(l,c) = elem(l,c) - b.elem(l,c)
|
---|
| 122 | virtual SpecialSquareMatrix<T>& SubElt(SpecialSquareMatrix<T> const& b);
|
---|
| 123 |
|
---|
| 124 | // Multiplication element par element : elem(l,c) = elem(l,c) * b.elem(l,c)
|
---|
| 125 | virtual SpecialSquareMatrix<T>& MulElt(SpecialSquareMatrix<T> const& b);
|
---|
| 126 |
|
---|
| 127 | // Division element par element : elem(l,c) = elem(l,c) / b.elem(l,c)
|
---|
| 128 | virtual SpecialSquareMatrix<T>& DivElt(SpecialSquareMatrix<T> const& b);
|
---|
| 129 |
|
---|
| 130 | //--- Operateurs = (T b) , = (SpecialSquareMatrix<T> b)
|
---|
| 131 | //! operator = a , to set all elements to the value \b a
|
---|
| 132 | inline SpecialSquareMatrix<T>& operator = (T a)
|
---|
| 133 | { return SetCst(a); }
|
---|
| 134 | //! operator = SpecialSquareMatrix<T> a , element by element copy operator
|
---|
| 135 | inline SpecialSquareMatrix<T>& operator = (SpecialSquareMatrix<T> const & a)
|
---|
| 136 | { return Set(a); }
|
---|
| 137 | //! operator = Sequence seq ,
|
---|
| 138 | inline SpecialSquareMatrix<T>& operator = (Sequence const & seq)
|
---|
| 139 | { return SetSeq(seq); }
|
---|
| 140 |
|
---|
| 141 | //--- Operateur += -= *= /= (T b)
|
---|
| 142 | //! operator += b , Add a constant value \b b to all elements
|
---|
| 143 | inline SpecialSquareMatrix<T>& operator += (T b)
|
---|
| 144 | { return AddCst(b); }
|
---|
| 145 | //! operator -= b , subtract a constant value \b b from all elements
|
---|
| 146 | inline SpecialSquareMatrix<T>& operator -= (T b)
|
---|
| 147 | { return SubCst(b); }
|
---|
| 148 | //! operator *= b , multiply all elements by a constant value \b b
|
---|
| 149 | inline SpecialSquareMatrix<T>& operator *= (T b)
|
---|
| 150 | { return MulCst(b); }
|
---|
| 151 | //! operator /= b , divide all elements by a constant value \b b
|
---|
| 152 | inline SpecialSquareMatrix<T>& operator /= (T b)
|
---|
| 153 | { return DivCst(b); }
|
---|
| 154 |
|
---|
| 155 | //! Element access operator (R/W): access to the element at position \b index - No bound checking
|
---|
| 156 | inline T& operator[](sa_size_t index)
|
---|
| 157 | { return mElems(index); }
|
---|
| 158 | //! Element access operator (RO): access to the element at position \b index - No bound checking
|
---|
| 159 | inline T operator[](sa_size_t index) const
|
---|
| 160 | { return mElems(index); }
|
---|
| 161 |
|
---|
| 162 | // Valeur min et max des elements (sauf tableaux complexes -> exception)
|
---|
| 163 | virtual void MinMax(T& min, T& max) const ;
|
---|
| 164 |
|
---|
| 165 | // Impression / representation texte sur le flot os
|
---|
| 166 | virtual ostream& Show(ostream& os) const;
|
---|
| 167 |
|
---|
| 168 | friend class FIO_SpecialSquareMatrix<T>;
|
---|
| 169 | //..............
|
---|
| 170 | protected:
|
---|
| 171 | SpSqMtxType mType; //!< Type of the square matrix (diagonal, symmetric, triangular)
|
---|
| 172 | sa_size_t mNrows; //!< size of the square matrix
|
---|
| 173 | NDataBlock<T> mElems; //!< Data block
|
---|
| 174 | DVList* mInfo; //!< Associated DVList structure
|
---|
| 175 | };
|
---|
| 176 |
|
---|
| 177 | //! print (ascii representation) operator
|
---|
| 178 | template <class T>
|
---|
| 179 | inline ostream& operator << (ostream& os, const SpecialSquareMatrix<T>& a)
|
---|
| 180 | { a.Show(os); return(os); }
|
---|
| 181 |
|
---|
| 182 | ////////////////////////////////////////////////////////////////
|
---|
| 183 | // Surcharge d'operateurs A (+,-,*,/) (T) x
|
---|
| 184 |
|
---|
| 185 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,T)
|
---|
| 186 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + constant */
|
---|
| 187 | template <class T> inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a, T b)
|
---|
| 188 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 189 | result.SetTemp(true); result.AddCst(b); return result; }
|
---|
| 190 |
|
---|
| 191 | /*! \ingroup TArray \fn operator+(T,const SpecialSquareMatrix<T>&)
|
---|
| 192 | \brief Operator SpecialSquareMatrix = constant + SpecialSquareMatrix */
|
---|
| 193 | template <class T> inline SpecialSquareMatrix<T> operator + (T b,const SpecialSquareMatrix<T>& a)
|
---|
| 194 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 195 | result.SetTemp(true); result.AddCst(b); return result; }
|
---|
| 196 |
|
---|
| 197 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,T)
|
---|
| 198 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - constant */
|
---|
| 199 | template <class T> inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a, T b)
|
---|
| 200 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 201 | result.SetTemp(true); result.SubCst(b); return result; }
|
---|
| 202 |
|
---|
| 203 | /*! \ingroup TArray \fn operator-(T,const SpecialSquareMatrix<T>&)
|
---|
| 204 | \brief Operator SpecialSquareMatrix = constant - SpecialSquareMatrix */
|
---|
| 205 | template <class T> inline SpecialSquareMatrix<T> operator - (T b,const SpecialSquareMatrix<T>& a)
|
---|
| 206 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 207 | result.SetTemp(true); result.SubCst(b, true); return result; }
|
---|
| 208 |
|
---|
| 209 | /*! \ingroup TArray \fn operator*(const SpecialSquareMatrix<T>&,T)
|
---|
| 210 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix * constant */
|
---|
| 211 | template <class T> inline SpecialSquareMatrix<T> operator * (const SpecialSquareMatrix<T>& a, T b)
|
---|
| 212 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 213 | result.SetTemp(true); result.MulCst(b); return result; }
|
---|
| 214 |
|
---|
| 215 | /*! \ingroup TArray \fn operator*(T,const SpecialSquareMatrix<T>&)
|
---|
| 216 | \brief Operator SpecialSquareMatrix = constant * SpecialSquareMatrix */
|
---|
| 217 | template <class T> inline SpecialSquareMatrix<T> operator * (T b,const SpecialSquareMatrix<T>& a)
|
---|
| 218 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 219 | result.SetTemp(true); result.MulCst(b); return result; }
|
---|
| 220 |
|
---|
| 221 | /*! \ingroup TArray \fn operator/(const SpecialSquareMatrix<T>&,T)
|
---|
| 222 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix / constant */
|
---|
| 223 | template <class T> inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a, T b)
|
---|
| 224 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 225 | result.SetTemp(true); result.DivCst(b); return result; }
|
---|
| 226 |
|
---|
| 227 | /*! \ingroup TArray \fn operator/(T,const SpecialSquareMatrix<T>&)
|
---|
| 228 | \brief Operator SpecialSquareMatrix = constant / SpecialSquareMatrix */
|
---|
| 229 | template <class T> inline SpecialSquareMatrix<T> operator / (T b, const SpecialSquareMatrix<T>& a)
|
---|
| 230 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 231 | result.SetTemp(true); result.DivCst(b, true); return result; }
|
---|
| 232 |
|
---|
| 233 |
|
---|
| 234 | ////////////////////////////////////////////////////////////////
|
---|
| 235 | // Surcharge d'operateurs C = A (+,-,&&,/) B
|
---|
| 236 |
|
---|
| 237 | /*! \ingroup TArray \fn operator+(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
| 238 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix + SpecialSquareMatrix (element by element addition) */
|
---|
| 239 | template <class T>
|
---|
| 240 | inline SpecialSquareMatrix<T> operator + (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
| 241 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 242 | result.SetTemp(true); result.AddElt(b); return result; }
|
---|
| 243 |
|
---|
| 244 | /*! \ingroup TArray \fn operator-(const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
| 245 | \brief Operator SpecialSquareMatrix = SpecialSquareMatrix - SpecialSquareMatrix (element by element subtraction) */
|
---|
| 246 | template <class T>
|
---|
| 247 | inline SpecialSquareMatrix<T> operator - (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
| 248 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 249 | result.SetTemp(true); result.SubElt(b); return result; }
|
---|
| 250 |
|
---|
| 251 | /*! \ingroup TArray \fn operator && (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
| 252 | \brief Element by element multiplication of two arrays SpecialSquareMatrix = SpecialSquareMatrix * SpecialSquareMatrix */
|
---|
| 253 |
|
---|
| 254 | template <class T>
|
---|
| 255 | inline SpecialSquareMatrix<T> operator && (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
| 256 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 257 | result.SetTemp(true); result.MulElt(b); return result; }
|
---|
| 258 |
|
---|
| 259 | /*! \ingroup TArray \fn operator / (const SpecialSquareMatrix<T>&,const SpecialSquareMatrix<T>&)
|
---|
| 260 | \brief Element by element division of two arrays SpecialSquareMatrix = SpecialSquareMatrix / SpecialSquareMatrix */
|
---|
| 261 | template <class T>
|
---|
| 262 | inline SpecialSquareMatrix<T> operator / (const SpecialSquareMatrix<T>& a,const SpecialSquareMatrix<T>& b)
|
---|
| 263 | { SpecialSquareMatrix<T> result; result.CloneOrShare(a);
|
---|
| 264 | result.SetTemp(true); result.DivElt(b); return result; }
|
---|
[3831] | 265 |
|
---|
| 266 | //--------- extern template declarations (if needed) -----------
|
---|
| 267 | #if defined ( NEED_EXT_DECL_TEMP ) && !defined( SPESQMTX_CC_BFILE )
|
---|
| 268 | extern template class SpecialSquareMatrix<uint_1>;
|
---|
| 269 | extern template class SpecialSquareMatrix<uint_2>;
|
---|
| 270 | extern template class SpecialSquareMatrix<uint_4>;
|
---|
| 271 | extern template class SpecialSquareMatrix<uint_8>;
|
---|
| 272 | extern template class SpecialSquareMatrix<int_1>;
|
---|
| 273 | extern template class SpecialSquareMatrix<int_2>;
|
---|
| 274 | extern template class SpecialSquareMatrix<int_4>;
|
---|
| 275 | extern template class SpecialSquareMatrix<int_8>;
|
---|
| 276 | extern template class SpecialSquareMatrix<r_4>;
|
---|
| 277 | extern template class SpecialSquareMatrix<r_8>;
|
---|
| 278 | extern template class SpecialSquareMatrix< complex<r_4> >;
|
---|
| 279 | extern template class SpecialSquareMatrix< complex<r_8> >;
|
---|
| 280 | #ifdef SO_LDBLE128
|
---|
| 281 | extern template class SpecialSquareMatrix<r_16>;
|
---|
| 282 | extern template class SpecialSquareMatrix< complex<r_16> >;
|
---|
| 283 | #endif
|
---|
| 284 | #endif // Fin de if defined ( NEED_EXT_DECL_TEMP )
|
---|
[3809] | 285 |
|
---|
| 286 | } // namespace SOPHYA
|
---|
| 287 |
|
---|
| 288 | #endif
|
---|