Salome HOME
initial project version
[tools/solverlab.git] / CDMATH / base / src / DoubleTab.cxx
1 /*
2  * DoubleTab.cxx
3  *
4  *  Created on: 22 févr. 2013
5  *      Author: mekkas
6  */
7
8
9
10 #include "DoubleTab.hxx"
11 #include <string.h>
12
13 using namespace std;
14
15 DoubleTab::~DoubleTab()
16 {
17         delete [] _values;
18 }
19
20 DoubleTab::DoubleTab()
21 {
22         _numberOfElements=0;
23         _values=NULL;
24 }
25
26 DoubleTab::DoubleTab(int size)
27 {
28         _numberOfElements=size;
29         _values = new double [size];
30 }
31
32 DoubleTab::DoubleTab(const int size, double initialValue)
33 {
34         _values = new double [size];
35         _numberOfElements=size;
36         for (int i=0;i<size;i++)
37                 _values[i] = initialValue ;
38 }
39
40 DoubleTab::DoubleTab(const int size, const double* value)
41 {
42         _values = new double [size];
43         _numberOfElements=size;
44         memcpy(_values,value,_numberOfElements*sizeof(double)) ;
45 }
46
47 void
48 DoubleTab::resize(const int size)
49 {
50         double* oldvalues=new double [_numberOfElements] ;
51         int oldsize=_numberOfElements;
52         copy(_values,_values+oldsize,oldvalues);
53         delete [] _values;
54
55         _numberOfElements+=size;
56         _values = new double [_numberOfElements] ;
57         for (int i=0;i<oldsize;i++)
58                 _values[i] = oldvalues[i] ;
59         for (int i=oldsize;i<_numberOfElements;i++)
60                 _values[i] = 0. ;
61         delete [] oldvalues;
62 }
63
64 DoubleTab::DoubleTab(const DoubleTab& dt)
65 {
66         _numberOfElements=dt.size();
67         _values = new double [_numberOfElements];
68         memcpy(_values,dt.getValues(),_numberOfElements*sizeof(double)) ;
69 }
70
71 DoubleTab&
72 DoubleTab::operator=(const DoubleTab & dt)
73 {
74         _numberOfElements=dt.size();
75     if (_values)
76         delete [] _values ;
77         _values = new double [_numberOfElements];
78         memcpy(_values,dt.getValues(),_numberOfElements*sizeof(double)) ;
79         return *this;
80 }
81
82 DoubleTab&
83 DoubleTab::operator=(double value)
84 {
85         for (int i=0;i<_numberOfElements;i++)
86                 _values[i] = value ;
87         return *this;
88 }
89
90 double&
91 DoubleTab::operator[](int i)
92 {
93         return _values[i];
94 }
95
96 const double&
97 DoubleTab::operator[](int i) const
98 {
99         return _values[i];
100 }
101
102 double&
103 DoubleTab::operator()(int i)
104 {
105         return _values[i];
106 }
107
108 const double&
109 DoubleTab::operator()(int i) const
110 {
111         return _values[i];
112 }
113
114 int
115 DoubleTab::size() const
116 {
117         return _numberOfElements;
118 }
119
120 double*
121 DoubleTab::getValues(void) const
122 {
123         return _values;
124 }
125
126 double
127 DoubleTab::max() const
128 {
129         double res=_values[0];
130         for (int i=0;i<_numberOfElements;i++)
131                 if (_values[i]>res)
132                         res=_values[i];
133         return res;
134 }
135
136 double
137 DoubleTab::min() const
138 {
139         double res=_values[0];
140         for (int i=0;i<_numberOfElements;i++)
141                 if (_values[i]<res)
142                         res=_values[i];
143         return res;
144 }
145
146 double*
147 DoubleTab::getPointer(void)
148 {
149         return _values;
150 }
151
152 DoubleTab&
153 DoubleTab::operator+=(const DoubleTab& dt)
154 {
155     if(size() != dt.size())
156     {
157         cout<<"Warning : adding DoubleTab of different sizes"<<endl;
158         cout<<"First DoubleTab size "<<size()<<", second DoubleTab size "<<dt.size()<<endl;
159     }
160         for (int i=0;i<size();i++)
161                 _values[i] += dt[i] ;
162         return *this;
163 }
164
165 DoubleTab&
166 DoubleTab::operator+=(double value)
167 {
168         for (int i=0;i<_numberOfElements;i++)
169                 _values[i] += value ;
170         return *this;
171 }
172
173 DoubleTab&
174 DoubleTab::operator*=(double value)
175 {
176         for (int i=0;i<_numberOfElements;i++)
177                 _values[i] *= value ;
178         return *this;
179 }
180
181 DoubleTab&
182 DoubleTab::operator/=(double value)
183 {
184         for (int i=0;i<_numberOfElements;i++)
185                 _values[i] /= value ;
186         return *this;
187 }
188
189 DoubleTab&
190 DoubleTab::operator-=(const DoubleTab& dt)
191 {
192     if(size() != dt.size())
193     {
194         cout<<"Warning : subtracting DoubleTab of different sizes"<<endl;
195         cout<<"First DoubleTab size "<<size()<<", second DoubleTab size "<<dt.size()<<endl;
196     }
197         for (int i=0;i<size();i++)
198                 _values[i] -= dt[i] ;
199         return *this;
200 }
201
202 DoubleTab&
203 DoubleTab::operator-=(double value)
204 {
205         for (int i=0;i<_numberOfElements;i++)
206                 _values[i] -= value ;
207         return *this;
208 }
209
210 DoubleTab
211 operator+(const DoubleTab& U,const DoubleTab& V)
212 {
213         int size = U.size();
214         DoubleTab res(size);
215         for (int i=0; i<size; i++)
216          res[i] = U[i] + V[i];
217         return res;
218 }
219
220 DoubleTab
221 operator-(const DoubleTab& U,const DoubleTab& V)
222 {
223         int size = U.size();
224         DoubleTab res(size);
225         for (int i=0; i<size; i++)
226          res[i] = U[i] - V[i];
227         return res;
228 }
229
230 double
231 operator*(const DoubleTab& U,const DoubleTab& V)
232 {
233
234         int size = U.size();
235         double res = 0.0;
236         for(int i=0; i<size; i++)
237                 res += U[i] * V[i];
238    return res;
239 }
240
241 DoubleTab
242 operator*(double value, const DoubleTab& U)
243 {
244
245         int size = U.size();
246         DoubleTab res(size);
247         for(int i=0; i<size; i++)
248                 res[i] = U[i] * value;
249    return res;
250 }
251
252 DoubleTab
253 operator*(const DoubleTab& U, double value)
254 {
255
256         int size = U.size();
257         DoubleTab res(size);
258         for(int i=0; i<size; i++)
259                 res[i] = U[i] * value;
260    return res;
261 }
262
263 DoubleTab
264 operator/(const DoubleTab& U, double value)
265 {
266
267         int size = U.size();
268         DoubleTab res(size);
269         for(int i=0; i<size; i++)
270                 res[i] = U[i] / value;
271    return res;
272 }
273
274 ostream&
275 operator<<(ostream& out, const DoubleTab& U)
276 {
277         for (int i=0; i<U.size();i++)
278         {
279                 out.width(6);
280                 out.precision(6);
281                 out<<U[i];
282                 out<<endl;
283         }
284         return out;
285 }