v2DM-DOCI  1.0
Container.cpp
Go to the documentation of this file.
1 /*
2  * @BEGIN LICENSE
3  *
4  * Copyright (C) 2014-2015 Ward Poelmans
5  *
6  * This file is part of v2DM-DOCI.
7  *
8  * v2DM-DOCI is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * Foobar is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
20  *
21  * @END LICENSE
22  */
23 
24 #include <assert.h>
25 
26 #include "Container.h"
27 
28 using namespace doci2DM;
29 
34 Container::Container(int n, int m)
35 {
36  matrix.reset(new BlockMatrix(n));
37 
38  vector.reset(new BlockVector(n));
39 }
40 
42 {
43  matrix.reset(new BlockMatrix(*orig.matrix));
44  vector.reset(new BlockVector(*orig.vector));
45 }
46 
48 {
49  matrix = std::move(orig.matrix);
50  vector = std::move(orig.vector);
51 }
52 
59 void Container::setMatrixDim(int block,int dim,int degen)
60 {
61  matrix->setDim(block, dim, degen);
62 }
63 
70 void Container::setVectorDim(int block,int dim,int degen)
71 {
72  vector->setDim(block, dim, degen);
73 }
74 
76 {
77  (*matrix) = *orig.matrix;
78  (*vector) = *orig.vector;
79 
80  return *this;
81 }
82 
84 {
85  matrix = std::move(orig.matrix);
86  vector = std::move(orig.vector);
87 
88  return *this;
89 }
90 
92 {
93  (*matrix) = a;
94  (*vector) = a;
95 
96  return *this;
97 }
98 
100 {
101  (*matrix) += *orig.matrix;
102  (*vector) += *orig.vector;
103 
104  return *this;
105 
106 }
107 
109 {
110  (*matrix) -= *orig.matrix;
111  (*vector) -= *orig.vector;
112 
113  return *this;
114 }
115 
116 Container &Container::daxpy(double alpha,const Container &orig)
117 {
118  matrix->daxpy(alpha, *orig.matrix);
119  vector->daxpy(alpha, *orig.vector);
120 
121  return *this;
122 }
123 
125 {
126  (*matrix) *= a;
127  (*vector) *= a;
128 
129  return *this;
130 }
131 
133 {
134  (*matrix) /= a;
135  (*vector) /= a;
136 
137  return *this;
138 }
139 
147 {
148  matrix->mprod(*A.matrix, *B.matrix);
149  vector->mprod(*A.vector, *B.vector);
150 
151  return *this;
152 }
153 
154 double &Container::operator()(int block,int i,int j)
155 {
156  return (*matrix)(block,i,j);
157 }
158 
159 double Container::operator()(int block,int i,int j) const
160 {
161  return (*matrix)(block,i,j);
162 }
163 
164 double &Container::operator()(int block,int i)
165 {
166  return (*vector)(block,i);
167 }
168 
169 double Container::operator()(int block,int i) const
170 {
171  return (*vector)(block,i);
172 }
173 
175 {
176  return (*matrix)[i];
177 }
178 
179 const Matrix & Container::getMatrix(int i) const
180 {
181  return (*matrix)[i];
182 }
183 
185 {
186  return (*vector)[i];
187 }
188 
189 const Vector & Container::getVector(int i) const
190 {
191  return (*vector)[i];
192 }
193 
194 
196 {
197  return (*matrix);
198 }
199 
201 {
202  return (*matrix);
203 }
204 
206 {
207  return (*vector);
208 }
209 
211 {
212  return (*vector);
213 }
214 
215 int Container::gnr() const
216 {
217  return matrix->gnr() + vector->gnr();
218 }
219 
221 {
222  return matrix->gnr();
223 }
224 
226 {
227  return vector->gnr();
228 }
229 
230 int Container::gdimMatrix(int i) const
231 {
232  return matrix->gdim(i);
233 }
234 
235 int Container::gdimVector(int i) const
236 {
237  return vector->gdim(i);
238 }
239 
240 int Container::gdegMatrix(int i) const
241 {
242  return matrix->gdeg(i);
243 }
244 
245 int Container::gdegVector(int i) const
246 {
247  return vector->gdeg(i);
248 }
249 
250 double Container::trace() const
251 {
252  return matrix->trace() + vector->trace();
253 }
254 
255 double Container::ddot(const Container &A) const
256 {
257  return matrix->ddot(*A.matrix) + vector->ddot(*A.vector);
258 }
259 
261 {
262  matrix->invert();
263  vector->invert();
264 }
265 
266 void Container::dscal(double a)
267 {
268  matrix->dscal(a);
269  vector->dscal(a);
270 }
271 
273 {
274  matrix->fill_Random();
275  vector->fill_Random();
276 }
277 
279 {
280  matrix->fill_Random(seed);
281  vector->fill_Random(seed);
282 }
283 
284 
285 void Container::sqrt(int option)
286 {
287  matrix->sqrt(option);
288  vector->sqrt(option);
289 }
290 
291 void Container::L_map(const Container &A,const Container &B)
292 {
293  matrix->L_map(*A.matrix,*B.matrix);
294  vector->L_map(*A.vector,*B.vector);
295 }
296 
298 {
299  matrix->symmetrize();
300 }
301 
303 {
304  matrix->sep_pm(*pos.matrix, *neg.matrix);
305  vector->sep_pm(*pos.vector, *neg.vector);
306 }
307 
308 namespace doci2DM
309 {
310  std::ostream &operator<<(std::ostream &output,const doci2DM::Container &container)
311  {
312  output << "Matrices: " << std::endl;
313  output << *container.matrix << std::endl;
314 
315  output << "Vectors: " << std::endl;
316  output << *container.vector << std::endl;
317 
318  return output;
319  }
320 }
321 
322 /* vim: set ts=3 sw=3 expandtab :*/
double trace() const
Definition: Container.cpp:250
Matrix & getMatrix(int)
Definition: Container.cpp:174
Container & operator=(const Container &)
Definition: Container.cpp:75
int gnVector() const
Definition: Container.cpp:225
BlockStructure< Matrix > BlockMatrix
Vector & getVector(int)
Definition: Container.cpp:184
Container & mprod(const Container &, const Container &)
Definition: Container.cpp:146
double ddot(const Container &) const
Definition: Container.cpp:255
void setMatrixDim(int, int, int)
Definition: Container.cpp:59
std::ostream & operator<<(std::ostream &output, const doci2DM::BlockStructure< MyBlockType > &blocks_p)
int gdimVector(int) const
Definition: Container.cpp:235
std::unique_ptr< BlockMatrix > matrix
Definition: Container.h:150
int gnr() const
Definition: Container.cpp:215
Container & operator-=(const Container &)
Definition: Container.cpp:108
int gdegMatrix(int) const
Definition: Container.cpp:240
void sep_pm(Container &, Container &)
Definition: Container.cpp:302
Container & operator+=(const Container &)
Definition: Container.cpp:99
BlockVector & getVectors()
Definition: Container.cpp:205
Container(int n, int m)
Definition: Container.cpp:34
Container & operator/=(double)
Definition: Container.cpp:132
BlockStructure< Vector > BlockVector
Container & daxpy(double alpha, const Container &)
Definition: Container.cpp:116
void dscal(double)
Definition: Container.cpp:266
int gdegVector(int) const
Definition: Container.cpp:245
double & operator()(int block, int i, int j)
Definition: Container.cpp:154
std::unique_ptr< BlockVector > vector
Definition: Container.h:151
int gdimMatrix(int) const
Definition: Container.cpp:230
void L_map(const Container &, const Container &)
Definition: Container.cpp:291
BlockMatrix & getMatrices()
Definition: Container.cpp:195
int gnMatrix() const
Definition: Container.cpp:220
void setVectorDim(int, int, int)
Definition: Container.cpp:70
Container & operator*=(double)
Definition: Container.cpp:124