| [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 | 
|---|
| [3870] | 4 | //  (C) R. Ansari, C.Magneville    2009-2010 | 
|---|
| [3809] | 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 | 
|---|