]> SALOME platform Git repositories - tools/medcoupling.git/blob - src/INTERP_KERNEL/InterpKernelDenseMatrix.txx
Salome HOME
Implementation of MEDCoupling1SGTUMesh.computeTriangleHeight and DataArrayDouble...
[tools/medcoupling.git] / src / INTERP_KERNEL / InterpKernelDenseMatrix.txx
1 // Copyright (C) 2022  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #pragma once
21
22 #include "InterpKernelDenseMatrix.hxx"
23
24 namespace INTERP_KERNEL
25 {
26   template <class T>
27   DenseMatrixT<T>::DenseMatrixT() : nn(0), mm(0), v(nullptr) {}
28
29   template <class T>
30   DenseMatrixT<T>::DenseMatrixT(mcIdType n, mcIdType m) : nn(n), mm(m), v(n>0 ? new T*[n] : nullptr)
31   {
32     mcIdType i,nel=m*n;
33     if (v) v[0] = nel>0 ? new T[nel] : nullptr;
34     for (i=1;i<n;i++) v[i] = v[i-1] + m;
35   }
36
37   template <class T>
38   DenseMatrixT<T>::DenseMatrixT(mcIdType n, mcIdType m, const T &a) : nn(n), mm(m), v(n>0 ? new T*[n] : nullptr)
39   {
40     mcIdType i,j,nel=m*n;
41     if (v) v[0] = nel>0 ? new T[nel] : nullptr;
42     for (i=1; i< n; i++) v[i] = v[i-1] + m;
43     for (i=0; i< n; i++) for (j=0; j<m; j++) v[i][j] = a;
44   }
45
46   template <class T>
47   DenseMatrixT<T>::DenseMatrixT(mcIdType n, mcIdType m, const T *a) : nn(n), mm(m), v(n>0 ? new T*[n] : nullptr)
48   {
49     mcIdType i,j,nel=m*n;
50     if (v) v[0] = nel>0 ? new T[nel] : nullptr;
51     for (i=1; i< n; i++) v[i] = v[i-1] + m;
52     for (i=0; i< n; i++) for (j=0; j<m; j++) v[i][j] = *a++;
53   }
54
55   template <class T>
56   DenseMatrixT<T>::DenseMatrixT(const DenseMatrixT &rhs) : nn(rhs.nn), mm(rhs.mm), v(nn>0 ? new T*[nn] : nullptr)
57   {
58     mcIdType i,j,nel=mm*nn;
59     if (v) v[0] = nel>0 ? new T[nel] : nullptr;
60     for (i=1; i< nn; i++) v[i] = v[i-1] + mm;
61     for (i=0; i< nn; i++) for (j=0; j<mm; j++) v[i][j] = rhs[i][j];
62   }
63
64   /*!
65   * postcondition: normal assignment via copying has been performed
66   * if matrix and rhs were different sizes, matrix
67   * has been resized to match the size of rhs
68   */
69   template <class T>
70   DenseMatrixT<T> & DenseMatrixT<T>::operator=(const DenseMatrixT<T> &rhs)
71   {
72     if (this != &rhs) {
73       mcIdType i,j,nel;
74       if (nn != rhs.nn || mm != rhs.mm) {
75         if ( v ) {
76           delete[] (v[0]);
77           delete[] (v);
78         }
79         nn=rhs.nn;
80         mm=rhs.mm;
81         v = nn>0 ? new T*[nn] : nullptr;
82         nel = mm*nn;
83         if (v) v[0] = nel>0 ? new T[nel] : nullptr;
84         for (i=1; i< nn; i++) v[i] = v[i-1] + mm;
85       }
86       for (i=0; i< nn; i++) for (j=0; j<mm; j++) v[i][j] = rhs[i][j];
87     }
88     return *this;
89   }
90   
91   template <class T>
92   void DenseMatrixT<T>::resize(mcIdType newn, mcIdType newm)
93   {
94     mcIdType i,nel;
95     if (newn != nn || newm != mm)
96     {
97       if ( v )
98       {
99         delete[] (v[0]);
100         delete[] (v);
101       }
102       nn = newn;
103       mm = newm;
104       v = nn>0 ? new T*[nn] : nullptr;
105       nel = mm*nn;
106       if (v) v[0] = nel>0 ? new T[nel] : nullptr;
107       for (i=1; i< nn; i++) v[i] = v[i-1] + mm;
108     }
109   }
110
111   template <class T>
112   void DenseMatrixT<T>::assign(mcIdType newn, mcIdType newm, const T& a)
113   {
114     mcIdType i,j,nel;
115     if (newn != nn || newm != mm)
116     {
117       if ( v )
118       {
119         delete[] (v[0]);
120         delete[] (v);
121       }
122       nn = newn;
123       mm = newm;
124       v = nn>0 ? new T*[nn] : nullptr;
125       nel = mm*nn;
126       if (v) v[0] = nel>0 ? new T[nel] : nullptr;
127       for (i=1; i< nn; i++) v[i] = v[i-1] + mm;
128     }
129     for (i=0; i< nn; i++) for (j=0; j<mm; j++) v[i][j] = a;
130   }
131
132   template <class T>
133   DenseMatrixT<T>::~DenseMatrixT()
134   {
135     if ( v )
136     {
137       delete[] (v[0]);
138       delete[] (v);
139     }
140   }
141 }