Matrix_ComplexConversions.cxx
1 // Copyright (C) 2003-2011 Marc DuruflĂ©
2 //
3 // This file is part of the linear-algebra library Seldon,
4 // http://seldon.sourceforge.net/.
5 //
6 // Seldon is free software; you can redistribute it and/or modify it under the
7 // terms of the GNU Lesser General Public License as published by the Free
8 // Software Foundation; either version 2.1 of the License, or (at your option)
9 // any later version.
10 //
11 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY
12 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
14 // more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with Seldon. If not, see http://www.gnu.org/licenses/.
18 
19 
20 #ifndef SELDON_FILE_MATRIX_COMPLEX_CONVERSIONS_CXX
21 
22 
23 #include "Matrix_ComplexConversions.hxx"
24 
25 /*
26  Same functions as in Matrix_Conversions.cxx
27  for complex matrices (RowComplexSparse, etc)
28  */
29 
30 namespace Seldon
31 {
32 
34  template<class T, class Prop, class Allocator1, class Allocator2,
35  class Tint, class Allocator3, class Allocator4>
36  void
37  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, RowComplexSparse,
38  Allocator1>& A,
42  int index, bool sym)
43  {
44  typedef typename ClassComplexType<T>::Treal Treal;
45  int m = A.GetM();
46  long nnz = A.GetRealDataSize() + A.GetImagDataSize();
47  // Allocating arrays.
48  IndRow.Reallocate(nnz);
49  IndCol.Reallocate(nnz);
50  Val.Reallocate(nnz);
51  nnz = 0;
52  long* real_ptr = A.GetRealPtr();
53  long* imag_ptr = A.GetImagPtr();
54  int* real_ind = A.GetRealInd();
55  int* imag_ind = A.GetImagInd();
56  Treal* real_data = A.GetRealData();
57  Treal* imag_data = A.GetImagData();
58  for (int i = 0; i < m; i++)
59  {
60  long num_old = nnz;
61  long num_i = imag_ptr[i];
62  for (long j = real_ptr[i]; j < real_ptr[i+1]; j++)
63  {
64  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
65  {
66  // imaginary part alone
67  IndCol(nnz) = imag_ind[num_i] + index;
68  Val(nnz) = T(0, imag_data[num_i]);
69  nnz++; num_i++;
70  }
71 
72  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
73  {
74  // real and imaginary part are both present
75  IndCol(nnz) = real_ind[j] + index;
76  Val(nnz) = T(real_data[j], imag_data[num_i]);
77  num_i++; nnz++;
78  }
79  else
80  {
81  // real part alone
82  IndCol(nnz) = real_ind[j] + index;
83  Val(nnz) = T(real_data[j], 0);
84  nnz++;
85  }
86  }
87 
88  // last values of imaginary part
89  for (long j = num_i; j < imag_ptr[i+1]; j++)
90  {
91  IndCol(nnz) = imag_ind[j] + index;
92  Val(nnz) = T(0, imag_data[j]);
93  nnz++;
94  }
95 
96  // filling row numbers
97  for (long j = num_old; j < nnz; j++)
98  IndRow(j) = index + i;
99  }
100 
101  IndRow.Resize(nnz);
102  IndCol.Resize(nnz);
103  Val.Resize(nnz);
104  }
105 
106 
108  template<class T, class Prop, class Allocator1, class Allocator2,
109  class Tint, class Allocator3, class Allocator4>
110  void
111  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ColComplexSparse,
112  Allocator1>& A,
116  int index, bool sym)
117  {
118  typedef typename ClassComplexType<T>::Treal Treal;
119  int n = A.GetN();
120  long nnz = A.GetRealDataSize() + A.GetImagDataSize();
121  // Allocating arrays.
122  IndRow.Reallocate(nnz);
123  IndCol.Reallocate(nnz);
124  Val.Reallocate(nnz);
125  nnz = 0;
126  long* real_ptr = A.GetRealPtr();
127  long* imag_ptr = A.GetImagPtr();
128  int* real_ind = A.GetRealInd();
129  int* imag_ind = A.GetImagInd();
130  Treal* real_data = A.GetRealData();
131  Treal* imag_data = A.GetImagData();
132  for (int i = 0; i < n; i++)
133  {
134  long num_old = nnz;
135  long num_i = imag_ptr[i];
136  for (long j = real_ptr[i]; j < real_ptr[i+1]; j++)
137  {
138  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
139  {
140  // imaginary part alone
141  IndRow(nnz) = imag_ind[num_i] + index;
142  Val(nnz) = T(0, imag_data[num_i]);
143  nnz++; num_i++;
144  }
145 
146  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
147  {
148  // real and imaginary part are both present
149  IndRow(nnz) = real_ind[j] + index;
150  Val(nnz) = T(real_data[j], imag_data[num_i]);
151  num_i++; nnz++;
152  }
153  else
154  {
155  // real part alone
156  IndRow(nnz) = real_ind[j] + index;
157  Val(nnz) = T(real_data[j], 0);
158  nnz++;
159  }
160  }
161 
162  // last values of imaginary part
163  for (long j = num_i; j < imag_ptr[i+1]; j++)
164  {
165  IndRow(nnz) = imag_ind[j] + index;
166  Val(nnz) = T(0, imag_data[j]);
167  nnz++;
168  }
169 
170  // filling column numbers
171  for (long j = num_old; j < nnz; j++)
172  IndCol(j) = index + i;
173  }
174 
175  IndRow.Resize(nnz);
176  IndCol.Resize(nnz);
177  Val.Resize(nnz);
178  }
179 
180 
182  template<class T, class Prop, class Allocator1, class Allocator2,
183  class Tint, class Allocator3, class Allocator4>
184  void
185  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, RowSymComplexSparse,
186  Allocator1>& A,
190  int index, bool sym)
191  {
192  typedef typename ClassComplexType<T>::Treal Treal;
193  int m = A.GetM();
194  long nnz = A.GetDataSize();
195  long* real_ptr = A.GetRealPtr();
196  long* imag_ptr = A.GetImagPtr();
197  int* real_ind = A.GetRealInd();
198  int* imag_ind = A.GetImagInd();
199  Treal* real_data = A.GetRealData();
200  Treal* imag_data = A.GetImagData();
201 
202  if (sym)
203  {
204  // first we count the number of non-zero entries
205  // added by symmetry for each row
206  // nnz : total number of non-zero entries
207  Vector<int> NumNnzRow(m); Vector<long> PtrLower(m+1), PtrUpper(m);
208  NumNnzRow.Zero();
209  PtrLower(0) = 0;
210  PtrUpper(0) = 0;
211  nnz = 0;
212  for (int i = 0; i < m; i++)
213  {
214  long num_i = imag_ptr[i], nnz_old = nnz;
215  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
216  {
217  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
218  {
219  // imaginary part alone
220  if (imag_ind[num_i] != i)
221  NumNnzRow(imag_ind[num_i])++;
222 
223  nnz++; num_i++;
224  }
225 
226 
227  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
228  {
229  // real and imaginary part are both present
230  if (real_ind[j] != i)
231  NumNnzRow(real_ind[j])++;
232 
233  num_i++; nnz++;
234  }
235  else
236  {
237  // real part alone
238  if (real_ind[j] != i)
239  NumNnzRow(real_ind[j])++;
240 
241  nnz++;
242  }
243  }
244 
245  // last values of imaginary part
246  nnz += imag_ptr[i+1] - num_i;
247  for (long j = num_i; j < imag_ptr[i+1]; j++)
248  if (imag_ind[j] != i)
249  NumNnzRow(imag_ind[j])++;
250 
251  PtrLower(i+1) = PtrLower(i) + NumNnzRow(i) + nnz - nnz_old;
252  if (i < m-1)
253  PtrUpper(i+1) = PtrLower(i+1) + NumNnzRow(i+1);
254  }
255 
256  // total number of non-zero entries
257  nnz = PtrLower(m);
258 
259  // arrays are filled already sorted by rows
260  // PtrLower and PtrUpper are incremented progressively
261  IndRow.Reallocate(nnz);
262  IndCol.Reallocate(nnz);
263  Val.Reallocate(nnz);
264  for (int i = 0; i < m; i++)
265  {
266  long num_i = imag_ptr[i]; int jcol = 0;
267  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
268  {
269  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
270  {
271  jcol = imag_ind[num_i];
272  // imaginary part alone
273  if (jcol != i)
274  {
275  IndRow(PtrLower(jcol)) = jcol + index;
276  IndCol(PtrLower(jcol)) = i + index;
277  Val(PtrLower(jcol)) = T(0, imag_data[num_i]);
278  PtrLower(jcol)++;
279  }
280 
281  IndRow(PtrUpper(i)) = i + index;
282  IndCol(PtrUpper(i)) = jcol + index;
283  Val(PtrUpper(i)) = T(0, imag_data[num_i]);
284  PtrUpper(i)++;
285  num_i++;
286  }
287 
288 
289  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
290  {
291  jcol = real_ind[j];
292  // real and imaginary part are both present
293  if (real_ind[j] != i)
294  {
295  IndRow(PtrLower(jcol)) = jcol + index;
296  IndCol(PtrLower(jcol)) = i + index;
297  Val(PtrLower(jcol)) = T(real_data[j], imag_data[num_i]);
298  PtrLower(jcol)++;
299  }
300 
301  IndRow(PtrUpper(i)) = i + index;
302  IndCol(PtrUpper(i)) = jcol + index;
303  Val(PtrUpper(i)) = T(real_data[j], imag_data[num_i]);
304  PtrUpper(i)++;
305  num_i++;
306  }
307  else
308  {
309  jcol = real_ind[j];
310  // real part alone
311  if (real_ind[j] != i)
312  {
313  IndRow(PtrLower(jcol)) = jcol + index;
314  IndCol(PtrLower(jcol)) = i + index;
315  Val(PtrLower(jcol)) = T(real_data[j], 0);
316  PtrLower(jcol)++;
317  }
318 
319  IndRow(PtrUpper(i)) = i + index;
320  IndCol(PtrUpper(i)) = jcol + index;
321  Val(PtrUpper(i)) = T(real_data[j], 0);
322  PtrUpper(i)++;
323  }
324  }
325 
326  // last values of imaginary part
327  for (long j = num_i; j < imag_ptr[i+1]; j++)
328  {
329  jcol = imag_ind[j];
330  if (imag_ind[j] != i)
331  {
332  IndRow(PtrLower(jcol)) = jcol + index;
333  IndCol(PtrLower(jcol)) = i + index;
334  Val(PtrLower(jcol)) = T(0, imag_data[j]);
335  PtrLower(jcol)++;
336  }
337 
338  IndRow(PtrUpper(i)) = i + index;
339  IndCol(PtrUpper(i)) = jcol + index;
340  Val(PtrUpper(i)) = T(0, imag_data[j]);
341  PtrUpper(i)++;
342  }
343  }
344  }
345  else
346  {
347  // Allocating arrays.
348  IndRow.Reallocate(nnz);
349  IndCol.Reallocate(nnz);
350  Val.Reallocate(nnz);
351  nnz = 0;
352  for (int i = 0; i < m; i++)
353  {
354  long num_old = nnz;
355  long num_i = imag_ptr[i];
356  for (long j = real_ptr[i]; j < real_ptr[i+1]; j++)
357  {
358  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
359  {
360  // imaginary part alone
361  IndCol(nnz) = imag_ind[num_i] + index;
362  Val(nnz) = T(0, imag_data[num_i]);
363  nnz++; num_i++;
364  }
365 
366  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
367  {
368  // real and imaginary part are both present
369  IndCol(nnz) = real_ind[j] + index;
370  Val(nnz) = T(real_data[j], imag_data[num_i]);
371  num_i++; nnz++;
372  }
373  else
374  {
375  // real part alone
376  IndCol(nnz) = real_ind[j] + index;
377  Val(nnz) = T(real_data[j], 0);
378  nnz++;
379  }
380  }
381 
382  // last values of imaginary part
383  for (long j = num_i; j < imag_ptr[i+1]; j++)
384  {
385  IndCol(nnz) = imag_ind[j] + index;
386  Val(nnz) = T(0, imag_data[j]);
387  nnz++;
388  }
389 
390  // filling row numbers
391  for (long j = num_old; j < nnz; j++)
392  IndRow(j) = index + i;
393  }
394 
395  IndRow.Resize(nnz);
396  IndCol.Resize(nnz);
397  Val.Resize(nnz);
398  }
399  }
400 
401 
403  template<class T, class Prop, class Allocator1, class Allocator2,
404  class Tint, class Allocator3, class Allocator4>
405  void
406  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ColSymComplexSparse,
407  Allocator1>& A,
411  int index, bool sym)
412  {
413  typedef typename ClassComplexType<T>::Treal Treal;
414  int m = A.GetM();
415  long nnz = A.GetDataSize();
416  long* real_ptr = A.GetRealPtr();
417  long* imag_ptr = A.GetImagPtr();
418  int* real_ind = A.GetRealInd();
419  int* imag_ind = A.GetImagInd();
420  Treal* real_data = A.GetRealData();
421  Treal* imag_data = A.GetImagData();
422 
423  if (sym)
424  {
425  // first we count the number of non-zero entries
426  // added by symmetry for each column
427  // nnz : total number of non-zero entries
428  Vector<int> NumNnzCol(m); Vector<long> PtrUpper(m+1), PtrLower(m);
429  NumNnzCol.Zero();
430  nnz = 0;
431  for (int i = 0; i < m; i++)
432  {
433  long num_i = imag_ptr[i], nnz_old = nnz;
434  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
435  {
436  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
437  {
438  // imaginary part alone
439  if (imag_ind[num_i] != i)
440  NumNnzCol(imag_ind[num_i])++;
441 
442  nnz++; num_i++;
443  }
444 
445  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
446  {
447  // real and imaginary part are both present
448  if (real_ind[j] != i)
449  NumNnzCol(real_ind[j])++;
450 
451  num_i++; nnz++;
452  }
453  else
454  {
455  // real part alone
456  if (real_ind[j] != i)
457  NumNnzCol(real_ind[j])++;
458 
459  nnz++;
460  }
461  }
462 
463  // last values of imaginary part
464  nnz += imag_ptr[i+1] - num_i;
465  for (long j = num_i; j < imag_ptr[i+1]; j++)
466  if (imag_ind[j] != i)
467  NumNnzCol(imag_ind[j])++;
468 
469  PtrUpper(i+1) = nnz - nnz_old;
470  }
471 
472  // PtrUpper and PtrLower are computed
473  PtrUpper(0) = 0;
474  PtrLower(0) = PtrUpper(1);
475  for (int i = 0; i < m; i++)
476  {
477  long ncol_upper = PtrUpper(i+1);
478  int ncol_lower = NumNnzCol(i);
479 
480  PtrUpper(i+1) = PtrUpper(i) + ncol_upper + ncol_lower;
481  if (i < m-1)
482  PtrLower(i+1) = PtrUpper(i+1) + PtrUpper(i+2);
483  }
484 
485  // total number of non-zero entries
486  nnz = PtrUpper(m);
487 
488  // arrays are filled already sorted by rows
489  // PtrLower and PtrUpper are incremented progressively
490  IndRow.Reallocate(nnz);
491  IndCol.Reallocate(nnz);
492  Val.Reallocate(nnz);
493  for (int i = 0; i < m; i++)
494  {
495  long num_i = imag_ptr[i]; int jrow = 0;
496  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
497  {
498  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
499  {
500  jrow = imag_ind[num_i];
501  // imaginary part alone
502  if (jrow != i)
503  {
504  IndRow(PtrLower(jrow)) = i + index;
505  IndCol(PtrLower(jrow)) = jrow + index;
506  Val(PtrLower(jrow)) = T(0, imag_data[num_i]);
507  PtrLower(jrow)++;
508  }
509 
510  IndRow(PtrUpper(i)) = jrow + index;
511  IndCol(PtrUpper(i)) = i + index;
512  Val(PtrUpper(i)) = T(0, imag_data[num_i]);
513  PtrUpper(i)++;
514  num_i++;
515  }
516 
517 
518  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
519  {
520  jrow = real_ind[j];
521  // real and imaginary part are both present
522  if (real_ind[j] != i)
523  {
524  IndRow(PtrLower(jrow)) = i + index;
525  IndCol(PtrLower(jrow)) = jrow + index;
526  Val(PtrLower(jrow)) = T(real_data[j], imag_data[num_i]);
527  PtrLower(jrow)++;
528  }
529 
530  IndRow(PtrUpper(i)) = jrow + index;
531  IndCol(PtrUpper(i)) = i + index;
532  Val(PtrUpper(i)) = T(real_data[j], imag_data[num_i]);
533  PtrUpper(i)++;
534  num_i++;
535  }
536  else
537  {
538  jrow = real_ind[j];
539  // real part alone
540  if (real_ind[j] != i)
541  {
542  IndRow(PtrLower(jrow)) = i + index;
543  IndCol(PtrLower(jrow)) = jrow + index;
544  Val(PtrLower(jrow)) = T(real_data[j], 0);
545  PtrLower(jrow)++;
546  }
547 
548  IndRow(PtrUpper(i)) = jrow + index;
549  IndCol(PtrUpper(i)) = i + index;
550  Val(PtrUpper(i)) = T(real_data[j], 0);
551  PtrUpper(i)++;
552  }
553  }
554 
555  // last values of imaginary part
556  for (long j = num_i; j < imag_ptr[i+1]; j++)
557  {
558  jrow = imag_ind[j];
559  if (imag_ind[j] != i)
560  {
561  IndRow(PtrLower(jrow)) = i + index;
562  IndCol(PtrLower(jrow)) = jrow + index;
563  Val(PtrLower(jrow)) = T(0, imag_data[j]);
564  PtrLower(jrow)++;
565  }
566 
567  IndRow(PtrUpper(i)) = jrow + index;
568  IndCol(PtrUpper(i)) = i + index;
569  Val(PtrUpper(i)) = T(0, imag_data[j]);
570  PtrUpper(i)++;
571  }
572  }
573  }
574  else
575  {
576  // Allocating arrays.
577  IndRow.Reallocate(nnz);
578  IndCol.Reallocate(nnz);
579  Val.Reallocate(nnz);
580  nnz = 0;
581 
582  for (int i = 0; i < m; i++)
583  {
584  long num_old = nnz;
585  long num_i = imag_ptr[i];
586  for (long j = real_ptr[i]; j < real_ptr[i+1]; j++)
587  {
588  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
589  {
590  // imaginary part alone
591  IndRow(nnz) = imag_ind[num_i] + index;
592  Val(nnz) = T(0, imag_data[num_i]);
593  nnz++; num_i++;
594  }
595 
596  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
597  {
598  // real and imaginary part are both present
599  IndRow(nnz) = real_ind[j] + index;
600  Val(nnz) = T(real_data[j], imag_data[num_i]);
601  num_i++; nnz++;
602  }
603  else
604  {
605  // real part alone
606  IndRow(nnz) = real_ind[j] + index;
607  Val(nnz) = T(real_data[j], 0);
608  nnz++;
609  }
610  }
611 
612  // last values of imaginary part
613  for (long j = num_i; j < imag_ptr[i+1]; j++)
614  {
615  IndRow(nnz) = imag_ind[j] + index;
616  Val(nnz) = T(0, imag_data[j]);
617  nnz++;
618  }
619 
620  // filling column numbers
621  for (long j = num_old; j < nnz; j++)
622  IndCol(j) = index + i;
623  }
624 
625  IndRow.Resize(nnz);
626  IndCol.Resize(nnz);
627  Val.Resize(nnz);
628  }
629  }
630 
631 
633  template<class T, class Prop, class Allocator1, class Allocator2,
634  class Tint, class Allocator3, class Allocator4>
635  void
636  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ArrayRowComplexSparse,
637  Allocator1>& A,
641  int index, bool sym)
642  {
643  int m = A.GetM();
644  long nnz = A.GetRealDataSize() + A.GetImagDataSize();
645  // Allocating arrays.
646  IndRow.Reallocate(nnz);
647  IndCol.Reallocate(nnz);
648  Val.Reallocate(nnz);
649  nnz = 0;
650  for (int i = 0; i < m; i++)
651  {
652  long num_old = nnz;
653  int num_i = 0, size_imag = A.GetImagRowSize(i);
654  for (int j = 0; j < A.GetRealRowSize(i); j++)
655  {
656  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
657  {
658  // imaginary part alone
659  IndCol(nnz) = A.IndexImag(i, num_i) + index;
660  Val(nnz) = T(0, A.ValueImag(i, num_i));
661  nnz++; num_i++;
662  }
663 
664  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
665  {
666  // real and imaginary part are both present
667  IndCol(nnz) = A.IndexReal(i, j) + index;
668  Val(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
669  num_i++; nnz++;
670  }
671  else
672  {
673  // real part alone
674  IndCol(nnz) = A.IndexReal(i, j) + index;
675  Val(nnz) = T(A.ValueReal(i, j), 0);
676  nnz++;
677  }
678  }
679 
680  for (int j = num_i; j < size_imag; j++)
681  {
682  IndCol(nnz) = A.IndexImag(i, j) + index;
683  Val(nnz) = T(0, A.ValueImag(i, j));
684  nnz++;
685  }
686 
687  // row numbers for row i
688  for (long j = num_old; j < nnz; j++)
689  IndRow(j) = i + index;
690  }
691 
692  IndRow.Resize(nnz);
693  IndCol.Resize(nnz);
694  Val.Resize(nnz);
695  }
696 
697 
699  template<class T, class Prop, class Allocator1, class Allocator2,
700  class Tint, class Allocator3, class Allocator4>
701  void
702  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ArrayColComplexSparse,
703  Allocator1>& A,
707  int index, bool sym)
708  {
709  long nnz = A.GetRealDataSize() + A.GetImagDataSize();
710  // Allocating arrays.
711  IndRow.Reallocate(nnz);
712  IndCol.Reallocate(nnz);
713  Val.Reallocate(nnz);
714  nnz = 0;
715  for (int i = 0; i < A.GetN(); i++)
716  {
717  long num_old = nnz;
718  int num_i = 0, size_imag = A.GetImagColumnSize(i);
719  for (int j = 0; j < A.GetRealColumnSize(i); j++)
720  {
721  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
722  {
723  // imaginary part alone
724  IndRow(nnz) = A.IndexImag(i, num_i) + index;
725  Val(nnz) = T(0, A.ValueImag(i, num_i));
726  nnz++; num_i++;
727  }
728 
729  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
730  {
731  // real and imaginary part are both present
732  IndRow(nnz) = A.IndexReal(i, j) + index;
733  Val(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
734  num_i++; nnz++;
735  }
736  else
737  {
738  // real part alone
739  IndRow(nnz) = A.IndexReal(i, j) + index;
740  Val(nnz) = T(A.ValueReal(i, j), 0);
741  nnz++;
742  }
743  }
744 
745  for (int j = num_i; j < size_imag; j++)
746  {
747  IndRow(nnz) = A.IndexImag(i, j) + index;
748  Val(nnz) = T(0, A.ValueImag(i, j));
749  nnz++;
750  }
751 
752  // column numbers for row i
753  for (long j = num_old; j < nnz; j++)
754  IndCol(j) = i + index;
755  }
756 
757  IndRow.Resize(nnz);
758  IndCol.Resize(nnz);
759  Val.Resize(nnz);
760  }
761 
762 
764  template<class T, class Prop, class Allocator1, class Allocator2,
765  class Tint, class Allocator3, class Allocator4>
766  void
767  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ArrayRowSymComplexSparse,
768  Allocator1>& A,
772  int index, bool sym)
773  {
774  int m = A.GetM();
775  long nnz = A.GetDataSize();
776 
777  if (sym)
778  {
779  // first we count the number of non-zero entries
780  // added by symmetry for each row
781  // nnz : total number of non-zero entries
782  Vector<int> NumNnzRow(m); Vector<long> PtrLower(m+1), PtrUpper(m);
783  NumNnzRow.Zero();
784  PtrLower(0) = 0;
785  PtrUpper(0) = 0;
786  nnz = 0;
787  for (int i = 0; i < m; i++)
788  {
789  int num_i = 0; long nnz_old = nnz;
790  int size_imag = A.GetImagRowSize(i);
791  for (int j = 0; j < A.GetRealRowSize(i); j++)
792  {
793  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
794  {
795  // imaginary part alone
796  if (A.IndexImag(i, num_i) != i)
797  NumNnzRow(A.IndexImag(i, num_i))++;
798 
799  nnz++; num_i++;
800  }
801 
802  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
803  {
804  // real and imaginary part are both present
805  if (A.IndexReal(i, j) != i)
806  NumNnzRow(A.IndexReal(i, j))++;
807 
808  num_i++; nnz++;
809  }
810  else
811  {
812  // real part alone
813  if (A.IndexReal(i, j) != i)
814  NumNnzRow(A.IndexReal(i, j))++;
815 
816  nnz++;
817  }
818  }
819 
820  // last values of imaginary part
821  nnz += (size_imag-num_i);
822  for (int j = num_i; j < size_imag; j++)
823  if (A.IndexImag(i, j) != i)
824  NumNnzRow(A.IndexImag(i, j))++;
825 
826  PtrLower(i+1) = PtrLower(i) + NumNnzRow(i) + nnz - nnz_old;
827  if (i < m-1)
828  PtrUpper(i+1) = PtrLower(i+1) + NumNnzRow(i+1);
829  }
830 
831  // total number of non-zero entries
832  nnz = PtrLower(m);
833 
834  // arrays are filled already sorted by rows
835  // PtrLower and PtrUpper are incremented progressively
836  IndRow.Reallocate(nnz);
837  IndCol.Reallocate(nnz);
838  Val.Reallocate(nnz);
839  for (int i = 0; i < m; i++)
840  {
841  int num_i = 0, jcol = 0;
842  int size_imag = A.GetImagRowSize(i);
843  for (int j = 0; j < A.GetRealRowSize(i); j++)
844  {
845  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
846  {
847  jcol = A.IndexImag(i, num_i);
848  // imaginary part alone
849  if (jcol != i)
850  {
851  IndRow(PtrLower(jcol)) = jcol + index;
852  IndCol(PtrLower(jcol)) = i + index;
853  Val(PtrLower(jcol)) = T(0, A.ValueImag(i, num_i));
854  PtrLower(jcol)++;
855  }
856 
857  IndRow(PtrUpper(i)) = i + index;
858  IndCol(PtrUpper(i)) = jcol + index;
859  Val(PtrUpper(i)) = T(0, A.ValueImag(i, num_i));
860  PtrUpper(i)++;
861  num_i++;
862  }
863 
864 
865  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
866  {
867  jcol = A.IndexReal(i, j);
868  // real and imaginary part are both present
869  if (jcol != i)
870  {
871  IndRow(PtrLower(jcol)) = jcol + index;
872  IndCol(PtrLower(jcol)) = i + index;
873  Val(PtrLower(jcol)) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
874  PtrLower(jcol)++;
875  }
876 
877  IndRow(PtrUpper(i)) = i + index;
878  IndCol(PtrUpper(i)) = jcol + index;
879  Val(PtrUpper(i)) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
880  PtrUpper(i)++;
881  num_i++;
882  }
883  else
884  {
885  jcol = A.IndexReal(i, j);
886  // real part alone
887  if (jcol != i)
888  {
889  IndRow(PtrLower(jcol)) = jcol + index;
890  IndCol(PtrLower(jcol)) = i + index;
891  Val(PtrLower(jcol)) = T(A.ValueReal(i, j), 0);
892  PtrLower(jcol)++;
893  }
894 
895  IndRow(PtrUpper(i)) = i + index;
896  IndCol(PtrUpper(i)) = jcol + index;
897  Val(PtrUpper(i)) = T(A.ValueReal(i, j), 0);
898  PtrUpper(i)++;
899  }
900  }
901 
902  // last values of imaginary part
903  for (int j = num_i; j < size_imag; j++)
904  {
905  jcol = A.IndexImag(i, j);
906  if (jcol != i)
907  {
908  IndRow(PtrLower(jcol)) = jcol + index;
909  IndCol(PtrLower(jcol)) = i + index;
910  Val(PtrLower(jcol)) = T(0, A.ValueImag(i, j));
911  PtrLower(jcol)++;
912  }
913 
914  IndRow(PtrUpper(i)) = i + index;
915  IndCol(PtrUpper(i)) = jcol + index;
916  Val(PtrUpper(i)) = T(0, A.ValueImag(i, j));
917  PtrUpper(i)++;
918  }
919  }
920  }
921  else
922  {
923  // Allocating arrays.
924  IndRow.Reallocate(nnz);
925  IndCol.Reallocate(nnz);
926  Val.Reallocate(nnz);
927  nnz = 0;
928  for (int i = 0; i < m; i++)
929  {
930  long num_old = nnz;
931  int num_i = 0, size_imag = A.GetImagRowSize(i);
932  for (int j = 0; j < A.GetRealRowSize(i); j++)
933  {
934  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
935  {
936  // imaginary part alone
937  IndCol(nnz) = A.IndexImag(i, num_i) + index;
938  Val(nnz) = T(0, A.ValueImag(i, num_i));
939  nnz++; num_i++;
940  }
941 
942  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
943  {
944  // real and imaginary part are both present
945  IndCol(nnz) = A.IndexReal(i, j) + index;
946  Val(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
947  num_i++; nnz++;
948  }
949  else
950  {
951  // real part alone
952  IndCol(nnz) = A.IndexReal(i, j) + index;
953  Val(nnz) = T(A.ValueReal(i, j), 0);
954  nnz++;
955  }
956  }
957 
958  // last values of imaginary part
959  for (int j = num_i; j < size_imag; j++)
960  {
961  IndCol(nnz) = A.IndexImag(i, j) + index;
962  Val(nnz) = T(0, A.ValueImag(i, j));
963  nnz++;
964  }
965 
966  // filling row numbers
967  for (long j = num_old; j < nnz; j++)
968  IndRow(j) = index + i;
969  }
970 
971  IndRow.Resize(nnz);
972  IndCol.Resize(nnz);
973  Val.Resize(nnz);
974  }
975  }
976 
977 
979  template<class T, class Prop, class Allocator1, class Allocator2,
980  class Tint, class Allocator3, class Allocator4>
981  void
982  ConvertMatrix_to_Coordinates(const Matrix<T, Prop, ArrayColSymComplexSparse,
983  Allocator1>& A,
987  int index, bool sym)
988  {
989  int m = A.GetM();
990  long nnz = A.GetDataSize();
991 
992  if (sym)
993  {
994  // first we count the number of non-zero entries
995  // added by symmetry for each column
996  // nnz : total number of non-zero entries
997  Vector<int> NumNnzCol(m); Vector<long> PtrUpper(m+1), PtrLower(m);
998  NumNnzCol.Zero();
999  nnz = 0;
1000  for (int i = 0; i < m; i++)
1001  {
1002  int num_i = 0; long nnz_old = nnz;
1003  int size_imag = A.GetImagColumnSize(i);
1004  for (int j = 0; j < A.GetRealColumnSize(i); j++)
1005  {
1006  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
1007  {
1008  // imaginary part alone
1009  if (A.IndexImag(i, num_i) != i)
1010  NumNnzCol(A.IndexImag(i, num_i))++;
1011 
1012  nnz++; num_i++;
1013  }
1014 
1015  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
1016  {
1017  // real and imaginary part are both present
1018  if (A.IndexReal(i, j) != i)
1019  NumNnzCol(A.IndexReal(i, j))++;
1020 
1021  num_i++; nnz++;
1022  }
1023  else
1024  {
1025  // real part alone
1026  if (A.IndexReal(i, j) != i)
1027  NumNnzCol(A.IndexReal(i, j))++;
1028 
1029  nnz++;
1030  }
1031  }
1032 
1033  // last values of imaginary part
1034  nnz += size_imag - num_i;
1035  for (int j = num_i; j < size_imag; j++)
1036  if (A.IndexImag(i, j) != i)
1037  NumNnzCol(A.IndexImag(i, j))++;
1038 
1039  PtrUpper(i+1) = nnz - nnz_old;
1040  }
1041 
1042  // PtrUpper and PtrLower are computed
1043  PtrUpper(0) = 0;
1044  PtrLower(0) = PtrUpper(1);
1045  for (int i = 0; i < m; i++)
1046  {
1047  long ncol_upper = PtrUpper(i+1);
1048  int ncol_lower = NumNnzCol(i);
1049 
1050  PtrUpper(i+1) = PtrUpper(i) + ncol_upper + ncol_lower;
1051  if (i < m-1)
1052  PtrLower(i+1) = PtrUpper(i+1) + PtrUpper(i+2);
1053  }
1054 
1055  // total number of non-zero entries
1056  nnz = PtrUpper(m);
1057 
1058  // arrays are filled already sorted by rows
1059  // PtrLower and PtrUpper are incremented progressively
1060  IndRow.Reallocate(nnz);
1061  IndCol.Reallocate(nnz);
1062  Val.Reallocate(nnz);
1063  for (int i = 0; i < m; i++)
1064  {
1065  int num_i = 0, jrow = 0;
1066  int size_imag = A.GetImagColumnSize(i);
1067  for (int j = 0; j < A.GetRealColumnSize(i); j++)
1068  {
1069  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
1070  {
1071  jrow = A.IndexImag(i, num_i);
1072  // imaginary part alone
1073  if (jrow != i)
1074  {
1075  IndRow(PtrLower(jrow)) = i + index;
1076  IndCol(PtrLower(jrow)) = jrow + index;
1077  Val(PtrLower(jrow)) = T(0, A.ValueImag(i, num_i));
1078  PtrLower(jrow)++;
1079  }
1080 
1081  IndRow(PtrUpper(i)) = jrow + index;
1082  IndCol(PtrUpper(i)) = i + index;
1083  Val(PtrUpper(i)) = T(0, A.ValueImag(i, num_i));
1084  PtrUpper(i)++;
1085  num_i++;
1086  }
1087 
1088  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
1089  {
1090  jrow = A.IndexReal(i, j);
1091  // real and imaginary part are both present
1092  if (jrow != i)
1093  {
1094  IndRow(PtrLower(jrow)) = i + index;
1095  IndCol(PtrLower(jrow)) = jrow + index;
1096  Val(PtrLower(jrow)) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
1097  PtrLower(jrow)++;
1098  }
1099 
1100  IndRow(PtrUpper(i)) = jrow + index;
1101  IndCol(PtrUpper(i)) = i + index;
1102  Val(PtrUpper(i)) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
1103  PtrUpper(i)++;
1104  num_i++;
1105  }
1106  else
1107  {
1108  jrow = A.IndexReal(i, j);
1109  // real part alone
1110  if (jrow != i)
1111  {
1112  IndRow(PtrLower(jrow)) = i + index;
1113  IndCol(PtrLower(jrow)) = jrow + index;
1114  Val(PtrLower(jrow)) = T(A.ValueReal(i, j), 0);
1115  PtrLower(jrow)++;
1116  }
1117 
1118  IndRow(PtrUpper(i)) = jrow + index;
1119  IndCol(PtrUpper(i)) = i + index;
1120  Val(PtrUpper(i)) = T(A.ValueReal(i, j), 0);
1121  PtrUpper(i)++;
1122  }
1123  }
1124 
1125  // last values of imaginary part
1126  for (int j = num_i; j < size_imag; j++)
1127  {
1128  jrow = A.IndexImag(i, j);
1129  if (jrow != i)
1130  {
1131  IndRow(PtrLower(jrow)) = i + index;
1132  IndCol(PtrLower(jrow)) = jrow + index;
1133  Val(PtrLower(jrow)) = T(0, A.ValueImag(i, j));
1134  PtrLower(jrow)++;
1135  }
1136 
1137  IndRow(PtrUpper(i)) = jrow + index;
1138  IndCol(PtrUpper(i)) = i + index;
1139  Val(PtrUpper(i)) = T(0, A.ValueImag(i, j));
1140  PtrUpper(i)++;
1141  }
1142  }
1143  }
1144  else
1145  {
1146  // Allocating arrays.
1147  IndRow.Reallocate(nnz);
1148  IndCol.Reallocate(nnz);
1149  Val.Reallocate(nnz);
1150  nnz = 0;
1151 
1152  for (int i = 0; i < m; i++)
1153  {
1154  long num_old = nnz;
1155  int num_i = 0, size_imag = A.GetImagColumnSize(i);
1156  for (int j = 0; j < A.GetRealColumnSize(i); j++)
1157  {
1158  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
1159  {
1160  // imaginary part alone
1161  IndRow(nnz) = A.IndexImag(i, num_i) + index;
1162  Val(nnz) = T(0, A.ValueImag(i, num_i));
1163  nnz++; num_i++;
1164  }
1165 
1166  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
1167  {
1168  // real and imaginary part are both present
1169  IndRow(nnz) = A.IndexReal(i, j) + index;
1170  Val(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
1171  num_i++; nnz++;
1172  }
1173  else
1174  {
1175  // real part alone
1176  IndRow(nnz) = A.IndexReal(i, j) + index;
1177  Val(nnz) = T(A.ValueReal(i, j), 0);
1178  nnz++;
1179  }
1180  }
1181 
1182  for (int j = num_i; j < size_imag; j++)
1183  {
1184  IndRow(nnz) = A.IndexImag(i, j) + index;
1185  Val(nnz) = T(0, A.ValueImag(i, j));
1186  nnz++;
1187  }
1188 
1189  // column numbers for row i
1190  for (long j = num_old; j < nnz; j++)
1191  IndCol(j) = i + index;
1192  }
1193 
1194  IndRow.Resize(nnz);
1195  IndCol.Resize(nnz);
1196  Val.Resize(nnz);
1197  }
1198  }
1199 
1200 
1202  template<class T, class Prop, class Allocator1,
1203  class Allocator2, class Allocator3, class Allocator4>
1204  void
1205  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1206  const Vector<int, VectFull, Allocator2>& IndCol,
1208  Matrix<T, Prop, RowComplexSparse,
1209  Allocator4>& A, int index)
1210  {
1211  typedef typename ClassComplexType<T>::Treal Treal;
1212  Treal zero(0);
1213 
1214  // the size of the matrix is detected from input arrays
1215  int row_max = IndRow.GetNormInf() - index;
1216  int col_max = IndCol.GetNormInf() - index;
1217  int m = row_max + 1;
1218  int n = col_max + 1;
1219 
1220  // if A is already allocated, we don't change this size
1221  m = max(m, A.GetM());
1222  n = max(n, A.GetN());
1223 
1224  // the number of elements for each row is computed
1225  Vector<int> NumRealNnzRow(m), NumImagNnzRow(m);
1226  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1227 
1228  for (long i = 0; i < IndRow.GetM(); i++)
1229  {
1230  int irow = IndRow(i) - index;
1231  if (real(Val(i)) != zero)
1232  NumRealNnzRow(irow)++;
1233 
1234  if (imag(Val(i)) != zero)
1235  NumImagNnzRow(irow)++;
1236  }
1237 
1238  // the arrays PtrReal and PtrImag can be constructed
1239  Vector<long> PtrReal(m+1), PtrImag(m+1);
1240  PtrReal(0) = 0; PtrImag(0) = 0;
1241  for (int i = 0; i < m; i++)
1242  {
1243  PtrReal(i+1) = PtrReal(i) + NumRealNnzRow(i);
1244  PtrImag(i+1) = PtrImag(i) + NumImagNnzRow(i);
1245  }
1246 
1247  long real_nz = PtrReal(m), imag_nz = PtrImag(m);
1248 
1249  // Fills matrix 'A'.
1250  Vector<int> IndReal(real_nz), IndImag(imag_nz);
1251  Vector<Treal, VectFull, Allocator4> ValReal(real_nz), ValImag(imag_nz);
1252  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1253  for (long i = 0; i < IndRow.GetM(); i++)
1254  {
1255  int irow = IndRow(i) - index;
1256  int icol = IndCol(i) - index;
1257  if (real(Val(i)) != zero)
1258  {
1259  long num_r = PtrReal(irow) + NumRealNnzRow(irow);
1260  IndReal(num_r) = icol;
1261  ValReal(num_r) = real(Val(i));
1262  NumRealNnzRow(irow)++;
1263  }
1264 
1265  if (imag(Val(i)) != zero)
1266  {
1267  long num_i = PtrImag(irow) + NumImagNnzRow(irow);
1268  IndImag(num_i) = icol;
1269  ValImag(num_i) = imag(Val(i));
1270  NumImagNnzRow(irow)++;
1271  }
1272  }
1273 
1274  // column numbers are sorted
1275  for (int i = 0; i < m; i++)
1276  {
1277  Sort(PtrReal(i), PtrReal(i+1)-1, IndReal, ValReal);
1278  Sort(PtrImag(i), PtrImag(i+1)-1, IndImag, ValImag);
1279  }
1280 
1281  // providing pointers to A
1282  A.SetData(m, n, ValReal, PtrReal, IndReal, ValImag, PtrImag, IndImag);
1283  }
1284 
1285 
1287  template<class T, class Prop, class Allocator1,
1288  class Allocator2, class Allocator3, class Allocator4>
1289  void
1290  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1291  const Vector<int, VectFull, Allocator2>& IndCol,
1293  Matrix<T, Prop, ColComplexSparse,
1294  Allocator4>& A, int index)
1295  {
1296  typedef typename ClassComplexType<T>::Treal Treal;
1297  Treal zero(0);
1298 
1299  // the size of the matrix is detected from input arrays
1300  int row_max = IndRow.GetNormInf() - index;
1301  int col_max = IndCol.GetNormInf() - index;
1302  int m = row_max + 1;
1303  int n = col_max + 1;
1304 
1305  // if A is already allocated, we don't change this size
1306  m = max(m, A.GetM());
1307  n = max(n, A.GetN());
1308 
1309  // the number of elements for each column is computed
1310  Vector<int> NumRealNnzCol(n), NumImagNnzCol(n);
1311  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1312 
1313  for (long i = 0; i < IndCol.GetM(); i++)
1314  {
1315  int irow = IndCol(i) - index;
1316  if (real(Val(i)) != zero)
1317  NumRealNnzCol(irow)++;
1318 
1319  if (imag(Val(i)) != zero)
1320  NumImagNnzCol(irow)++;
1321  }
1322 
1323  // the arrays PtrReal and PtrImag can be constructed
1324  Vector<long> PtrReal(n+1), PtrImag(n+1);
1325  PtrReal(0) = 0; PtrImag(0) = 0;
1326  for (int i = 0; i < n; i++)
1327  {
1328  PtrReal(i+1) = PtrReal(i) + NumRealNnzCol(i);
1329  PtrImag(i+1) = PtrImag(i) + NumImagNnzCol(i);
1330  }
1331 
1332  long real_nz = PtrReal(n), imag_nz = PtrImag(n);
1333 
1334  // Fills matrix 'A'.
1335  Vector<int> IndReal(real_nz), IndImag(imag_nz);
1336  Vector<Treal, VectFull, Allocator4> ValReal(real_nz), ValImag(imag_nz);
1337  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1338  for (long i = 0; i < IndCol.GetM(); i++)
1339  {
1340  int irow = IndRow(i) - index;
1341  int icol = IndCol(i) - index;
1342  if (real(Val(i)) != zero)
1343  {
1344  long num_r = PtrReal(icol) + NumRealNnzCol(icol);
1345  IndReal(num_r) = irow;
1346  ValReal(num_r) = real(Val(i));
1347  NumRealNnzCol(icol)++;
1348  }
1349 
1350  if (imag(Val(i)) != zero)
1351  {
1352  long num_i = PtrImag(icol) + NumImagNnzCol(icol);
1353  IndImag(num_i) = irow;
1354  ValImag(num_i) = imag(Val(i));
1355  NumImagNnzCol(icol)++;
1356  }
1357  }
1358 
1359  // row numbers are sorted
1360  for (int i = 0; i < n; i++)
1361  {
1362  Sort(PtrReal(i), PtrReal(i+1)-1, IndReal, ValReal);
1363  Sort(PtrImag(i), PtrImag(i+1)-1, IndImag, ValImag);
1364  }
1365 
1366  // providing pointers to A
1367  A.SetData(m, n, ValReal, PtrReal, IndReal, ValImag, PtrImag, IndImag);
1368  }
1369 
1370 
1372  template<class T, class Prop, class Allocator1,
1373  class Allocator2, class Allocator3, class Allocator4>
1374  void
1375  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1376  const Vector<int, VectFull, Allocator2>& IndCol,
1378  Matrix<T, Prop, RowSymComplexSparse,
1379  Allocator4>& A, int index)
1380  {
1381  typedef typename ClassComplexType<T>::Treal Treal;
1382  Treal zero(0);
1383 
1384  // the number of row and columns is detected
1385  int row_max = IndRow.GetNormInf();
1386  int col_max = IndCol.GetNormInf();
1387  int m = row_max - index + 1;
1388  int n = col_max - index + 1;
1389 
1390  // if A is already allocated, we take the number of rows/columns of A
1391  m = max(m, A.GetM());
1392  n = max(n, A.GetN());
1393 
1394  // Number of elements per row.
1395  Vector<long> PtrReal(m+1), PtrImag(m+1);
1396  PtrReal.Zero(); PtrImag.Zero();
1397  for (long i = 0; i < IndRow.GetM(); i++)
1398  {
1399  int irow = IndRow(i) - index;
1400  int icol = IndCol(i) - index;
1401  if (irow <= icol)
1402  {
1403  // only upper part of the matrix is kept
1404  if (real(Val(i)) != zero)
1405  PtrReal(irow+1)++;
1406 
1407  if (imag(Val(i)) != zero)
1408  PtrImag(irow+1)++;
1409  }
1410  }
1411 
1412  // PtrReal and PtrImag are constructed
1413  for (int i = 0; i < m; i++)
1414  {
1415  PtrReal(i+1) += PtrReal(i);
1416  PtrImag(i+1) += PtrImag(i);
1417  }
1418 
1419  long real_nz = PtrReal(m), imag_nz = PtrImag(m);
1420 
1421  Vector<int> NumRealNnzRow(m), NumImagNnzRow(m);
1422  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1423 
1424  // Fills matrix 'A'.
1425  Vector<int> IndReal(real_nz), IndImag(imag_nz);
1426  Vector<Treal, VectFull, Allocator4> ValReal(real_nz), ValImag(imag_nz);
1427  for (long i = 0; i < IndRow.GetM(); i++)
1428  {
1429  int irow = IndRow(i) - index;
1430  int icol = IndCol(i) - index;
1431  if (irow <= icol)
1432  {
1433  if (real(Val(i)) != zero)
1434  {
1435  long num_r = PtrReal(irow) + NumRealNnzRow(irow);
1436  IndReal(num_r) = icol;
1437  ValReal(num_r) = real(Val(i));
1438  NumRealNnzRow(irow)++;
1439  }
1440 
1441  if (imag(Val(i)) != zero)
1442  {
1443  long num_i = PtrImag(irow) + NumImagNnzRow(irow);
1444  IndImag(num_i) = icol;
1445  ValImag(num_i) = imag(Val(i));
1446  NumImagNnzRow(irow)++;
1447  }
1448  }
1449  }
1450 
1451  // column numbers are sorted
1452  for (int i = 0; i < m; i++)
1453  {
1454  Sort(PtrReal(i), PtrReal(i+1)-1, IndReal, ValReal);
1455  Sort(PtrImag(i), PtrImag(i+1)-1, IndImag, ValImag);
1456  }
1457 
1458  // providing pointers to A
1459  A.SetData(m, n, ValReal, PtrReal, IndReal, ValImag, PtrImag, IndImag);
1460  }
1461 
1462 
1464  template<class T, class Prop, class Allocator1,
1465  class Allocator2, class Allocator3, class Allocator4>
1466  void
1467  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1468  const Vector<int, VectFull, Allocator2>& IndCol,
1470  Matrix<T, Prop, ColSymComplexSparse,
1471  Allocator4>& A, int index)
1472  {
1473  typedef typename ClassComplexType<T>::Treal Treal;
1474  Treal zero(0);
1475 
1476  // the number of row and columns is detected
1477  int row_max = IndRow.GetNormInf();
1478  int col_max = IndCol.GetNormInf();
1479  int m = row_max - index + 1;
1480  int n = col_max - index + 1;
1481 
1482  // if A is already allocated, we take the number of rows/columns of A
1483  m = max(m, A.GetM());
1484  n = max(n, A.GetN());
1485 
1486  // Number of elements per column.
1487  Vector<long> PtrReal(n+1), PtrImag(n+1);
1488  PtrReal.Zero(); PtrImag.Zero();
1489  for (long i = 0; i < IndCol.GetM(); i++)
1490  {
1491  int irow = IndRow(i) - index;
1492  int icol = IndCol(i) - index;
1493  if (irow <= icol)
1494  {
1495  // only upper part of the matrix is kept
1496  if (real(Val(i)) != zero)
1497  PtrReal(icol + 1)++;
1498 
1499  if (imag(Val(i)) != zero)
1500  PtrImag(icol + 1)++;
1501  }
1502  }
1503 
1504  // PtrReal and PtrImag are constructed
1505  for (int i = 0; i < n; i++)
1506  {
1507  PtrReal(i+1) += PtrReal(i);
1508  PtrImag(i+1) += PtrImag(i);
1509  }
1510 
1511  long real_nz = PtrReal(n), imag_nz = PtrImag(n);
1512 
1513  Vector<int> NumRealNnzCol(n), NumImagNnzCol(n);
1514  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1515 
1516  // Fills matrix 'A'.
1517  Vector<int> IndReal(real_nz), IndImag(imag_nz);
1518  Vector<Treal, VectFull, Allocator4> ValReal(real_nz), ValImag(imag_nz);
1519  for (long i = 0; i < IndCol.GetM(); i++)
1520  {
1521  int irow = IndRow(i) - index;
1522  int icol = IndCol(i) - index;
1523  if (irow <= icol)
1524  {
1525  if (real(Val(i)) != zero)
1526  {
1527  long num_r = PtrReal(icol) + NumRealNnzCol(icol);
1528  IndReal(num_r) = irow;
1529  ValReal(num_r) = real(Val(i));
1530  NumRealNnzCol(icol)++;
1531  }
1532 
1533  if (imag(Val(i)) != zero)
1534  {
1535  long num_i = PtrImag(icol) + NumImagNnzCol(icol);
1536  IndImag(num_i) = irow;
1537  ValImag(num_i) = imag(Val(i));
1538  NumImagNnzCol(icol)++;
1539  }
1540  }
1541  }
1542 
1543  // row numbers are sorted
1544  for (int i = 0; i < n; i++)
1545  {
1546  Sort(PtrReal(i), PtrReal(i+1)-1, IndReal, ValReal);
1547  Sort(PtrImag(i), PtrImag(i+1)-1, IndImag, ValImag);
1548  }
1549 
1550  // providing pointers to A
1551  A.SetData(m, n, ValReal, PtrReal, IndReal, ValImag, PtrImag, IndImag);
1552  }
1553 
1554 
1556  template<class T, class Prop, class Allocator1,
1557  class Allocator2, class Allocator3, class Allocator4>
1558  void
1559  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1560  const Vector<int, VectFull, Allocator2>& IndCol,
1562  Matrix<T, Prop, ArrayRowComplexSparse,
1563  Allocator4>& A, int index)
1564  {
1565  typedef typename ClassComplexType<T>::Treal Treal;
1566  Treal zero(0);
1567 
1568  // the size of the matrix is detected from input arrays
1569  int row_max = IndRow.GetNormInf();
1570  int col_max = IndCol.GetNormInf();
1571  int m = row_max - index + 1;
1572  int n = col_max - index + 1;
1573 
1574  // if A is already allocated, we don't change this size
1575  m = max(m, A.GetM());
1576  n = max(n, A.GetN());
1577 
1578  // the number of elements for each row is computed
1579  Vector<int> NumRealNnzRow(m), NumImagNnzRow(m);
1580  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1581 
1582  for (long i = 0; i < IndRow.GetM(); i++)
1583  {
1584  int irow = IndRow(i) - index;
1585  if (real(Val(i)) != zero)
1586  NumRealNnzRow(irow)++;
1587 
1588  if (imag(Val(i)) != zero)
1589  NumImagNnzRow(irow)++;
1590  }
1591 
1592  // The matrix A is allocated
1593  A.Reallocate(m, n);
1594  for (int i = 0; i < m; i++)
1595  {
1596  if (NumRealNnzRow(i) > 0)
1597  A.ReallocateRealRow(i, NumRealNnzRow(i));
1598 
1599  if (NumImagNnzRow(i) > 0)
1600  A.ReallocateImagRow(i, NumImagNnzRow(i));
1601  }
1602 
1603  // Fills matrix 'A'.
1604  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1605  for (long i = 0; i < IndRow.GetM(); i++)
1606  {
1607  int irow = IndRow(i) - index;
1608  int icol = IndCol(i) - index;
1609  if (real(Val(i)) != zero)
1610  {
1611  int num = NumRealNnzRow(irow);
1612  A.IndexReal(irow, num) = icol;
1613  A.ValueReal(irow, num) = real(Val(i));
1614  NumRealNnzRow(irow)++;
1615  }
1616 
1617  if (imag(Val(i)) != zero)
1618  {
1619  int num = NumImagNnzRow(irow);
1620  A.IndexImag(irow, num) = icol;
1621  A.ValueImag(irow, num) = imag(Val(i));
1622  NumImagNnzRow(irow)++;
1623  }
1624  }
1625 
1626  // column numbers are sorted
1627  A.Assemble();
1628  }
1629 
1630 
1632  template<class T, class Prop, class Allocator1,
1633  class Allocator2, class Allocator3, class Allocator4>
1634  void
1635  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1636  const Vector<int, VectFull, Allocator2>& IndCol,
1638  Matrix<T, Prop, ArrayColComplexSparse,
1639  Allocator4>& A, int index)
1640  {
1641  typedef typename ClassComplexType<T>::Treal Treal;
1642  Treal zero(0);
1643 
1644  // the size of the matrix is detected from input arrays
1645  int row_max = IndRow.GetNormInf();
1646  int col_max = IndCol.GetNormInf();
1647  int m = row_max - index + 1;
1648  int n = col_max - index + 1;
1649 
1650  // if A is already allocated, we don't change this size
1651  m = max(m, A.GetM());
1652  n = max(n, A.GetN());
1653 
1654  // the number of elements for each column is computed
1655  Vector<int> NumRealNnzCol(n), NumImagNnzCol(n);
1656  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1657 
1658  for (long i = 0; i < IndCol.GetM(); i++)
1659  {
1660  int icol = IndCol(i) - index;
1661  if (real(Val(i)) != zero)
1662  NumRealNnzCol(icol)++;
1663 
1664  if (imag(Val(i)) != zero)
1665  NumImagNnzCol(icol)++;
1666  }
1667 
1668  // The matrix A is allocated
1669  A.Reallocate(m, n);
1670  for (int i = 0; i < n; i++)
1671  {
1672  if (NumRealNnzCol(i) > 0)
1673  A.ReallocateRealColumn(i, NumRealNnzCol(i));
1674 
1675  if (NumImagNnzCol(i) > 0)
1676  A.ReallocateImagColumn(i, NumImagNnzCol(i));
1677  }
1678 
1679  // Fills matrix 'A'.
1680  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1681  for (long i = 0; i < IndRow.GetM(); i++)
1682  {
1683  int irow = IndRow(i) - index;
1684  int icol = IndCol(i) - index;
1685  if (real(Val(i)) != zero)
1686  {
1687  int num = NumRealNnzCol(icol);
1688  A.IndexReal(icol, num) = irow;
1689  A.ValueReal(icol, num) = real(Val(i));
1690  NumRealNnzCol(icol)++;
1691  }
1692 
1693  if (imag(Val(i)) != zero)
1694  {
1695  int num = NumImagNnzCol(icol);
1696  A.IndexImag(icol, num) = irow;
1697  A.ValueImag(icol, num) = imag(Val(i));
1698  NumImagNnzCol(icol)++;
1699  }
1700  }
1701 
1702  // row numbers are sorted
1703  A.Assemble();
1704  }
1705 
1706 
1708  template<class T, class Prop, class Allocator1,
1709  class Allocator2, class Allocator3, class Allocator4>
1710  void
1711  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1712  const Vector<int, VectFull, Allocator2>& IndCol,
1715  Allocator4>& A, int index)
1716  {
1717  typedef typename ClassComplexType<T>::Treal Treal;
1718  Treal zero(0);
1719 
1720  // the size of the matrix is detected from input arrays
1721  int row_max = IndRow.GetNormInf();
1722  int col_max = IndCol.GetNormInf();
1723  int m = row_max - index + 1;
1724  int n = col_max - index + 1;
1725 
1726  // if A is already allocated, we don't change this size
1727  m = max(m, A.GetM());
1728  n = max(n, A.GetN());
1729 
1730  // the number of elements for each row is computed
1731  Vector<int> NumRealNnzRow(m), NumImagNnzRow(m);
1732  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1733 
1734  for (long i = 0; i < IndRow.GetM(); i++)
1735  {
1736  int irow = IndRow(i) - index;
1737  int icol = IndCol(i) - index;
1738  if (irow <= icol)
1739  {
1740  // only upper part of the matrix is kept
1741  if (real(Val(i)) != zero)
1742  NumRealNnzRow(irow)++;
1743 
1744  if (imag(Val(i)) != zero)
1745  NumImagNnzRow(irow)++;
1746  }
1747  }
1748 
1749  // The matrix A is allocated
1750  A.Reallocate(m, n);
1751  for (int i = 0; i < m; i++)
1752  {
1753  if (NumRealNnzRow(i) > 0)
1754  A.ReallocateRealRow(i, NumRealNnzRow(i));
1755 
1756  if (NumImagNnzRow(i) > 0)
1757  A.ReallocateImagRow(i, NumImagNnzRow(i));
1758  }
1759 
1760  // Fills matrix 'A'.
1761  NumRealNnzRow.Zero(); NumImagNnzRow.Zero();
1762  for (long i = 0; i < IndRow.GetM(); i++)
1763  {
1764  int irow = IndRow(i) - index;
1765  int icol = IndCol(i) - index;
1766  if (irow <= icol)
1767  {
1768  if (real(Val(i)) != zero)
1769  {
1770  int num = NumRealNnzRow(irow);
1771  A.IndexReal(irow, num) = icol;
1772  A.ValueReal(irow, num) = real(Val(i));
1773  NumRealNnzRow(irow)++;
1774  }
1775 
1776  if (imag(Val(i)) != zero)
1777  {
1778  int num = NumImagNnzRow(irow);
1779  A.IndexImag(irow, num) = icol;
1780  A.ValueImag(irow, num) = imag(Val(i));
1781  NumImagNnzRow(irow)++;
1782  }
1783  }
1784  }
1785 
1786  // column numbers are sorted
1787  A.Assemble();
1788  }
1789 
1790 
1792  template<class T, class Prop, class Allocator1,
1793  class Allocator2, class Allocator3, class Allocator4>
1794  void
1795  ConvertMatrix_from_Coordinates(const Vector<int, VectFull, Allocator1>& IndRow,
1796  const Vector<int, VectFull, Allocator2>& IndCol,
1799  Allocator4>& A, int index)
1800  {
1801  typedef typename ClassComplexType<T>::Treal Treal;
1802  Treal zero(0);
1803 
1804  // the size of the matrix is detected from input arrays
1805  int row_max = IndRow.GetNormInf();
1806  int col_max = IndCol.GetNormInf();
1807  int m = row_max - index + 1;
1808  int n = col_max - index + 1;
1809 
1810  // if A is already allocated, we don't change this size
1811  m = max(m, A.GetM());
1812  n = max(n, A.GetN());
1813 
1814  // the number of elements for each column is computed
1815  Vector<int> NumRealNnzCol(n), NumImagNnzCol(n);
1816  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1817 
1818  for (long i = 0; i < IndCol.GetM(); i++)
1819  {
1820  int irow = IndRow(i) - index;
1821  int icol = IndCol(i) - index;
1822  if (irow <= icol)
1823  {
1824  // only upper part of the matrix is kept
1825  if (real(Val(i)) != zero)
1826  NumRealNnzCol(icol)++;
1827 
1828  if (imag(Val(i)) != zero)
1829  NumImagNnzCol(icol)++;
1830  }
1831  }
1832 
1833  // The matrix A is allocated
1834  A.Reallocate(m, n);
1835  for (int i = 0; i < n; i++)
1836  {
1837  if (NumRealNnzCol(i) > 0)
1838  A.ReallocateRealColumn(i, NumRealNnzCol(i));
1839 
1840  if (NumImagNnzCol(i) > 0)
1841  A.ReallocateImagColumn(i, NumImagNnzCol(i));
1842  }
1843 
1844  // Fills matrix 'A'.
1845  NumRealNnzCol.Zero(); NumImagNnzCol.Zero();
1846  for (long i = 0; i < IndRow.GetM(); i++)
1847  {
1848  int irow = IndRow(i) - index;
1849  int icol = IndCol(i) - index;
1850  if (irow <= icol)
1851  {
1852  if (real(Val(i)) != zero)
1853  {
1854  int num = NumRealNnzCol(icol);
1855  A.IndexReal(icol, num) = irow;
1856  A.ValueReal(icol, num) = real(Val(i));
1857  NumRealNnzCol(icol)++;
1858  }
1859 
1860  if (imag(Val(i)) != zero)
1861  {
1862  int num = NumImagNnzCol(icol);
1863  A.IndexImag(icol, num) = irow;
1864  A.ValueImag(icol, num) = imag(Val(i));
1865  NumImagNnzCol(icol)++;
1866  }
1867  }
1868  }
1869 
1870  // row numbers are sorted
1871  A.Assemble();
1872  }
1873 
1874 
1876  template<class T, class Prop, class Alloc1, class Tint0,
1877  class Tint1, class Alloc2, class Alloc3, class Alloc4>
1878  void ConvertToCSR(const Matrix<T, Prop, RowComplexSparse, Alloc1>& A,
1882  {
1883  int m = A.GetM();
1884  if (m <= 0)
1885  {
1886  Ptr.Clear();
1887  IndCol.Clear();
1888  Value.Clear();
1889  return;
1890  }
1891 
1892  typedef typename ClassComplexType<T>::Treal Treal;
1893  long* real_ptr_ = A.GetRealPtr();
1894  int* real_ind_ = A.GetRealInd();
1895  Treal* real_data_ = A.GetRealData();
1896 
1897  long* imag_ptr_ = A.GetImagPtr();
1898  int* imag_ind_ = A.GetImagInd();
1899  Treal* imag_data_ = A.GetImagData();
1900 
1901  long real_nnz = A.GetRealDataSize();
1902  long imag_nnz = A.GetImagDataSize();
1903 
1904  Ptr.Reallocate(m+1);
1905  IndCol.Reallocate(real_nnz + imag_nnz);
1906  Value.Reallocate(real_nnz + imag_nnz);
1907  long nnz = 0;
1908  Ptr(0) = 0;
1909  for (int i = 0; i < m; i++)
1910  {
1911  long num_i = imag_ptr_[i];
1912  for (long j = real_ptr_[i]; j < real_ptr_[i+1]; j++)
1913  {
1914  while ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] < real_ind_[j]))
1915  {
1916  // imaginary part alone
1917  IndCol(nnz) = imag_ind_[num_i];
1918  Value(nnz) = T(0, imag_data_[num_i]);
1919  nnz++; num_i++;
1920  }
1921 
1922  if ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] == real_ind_[j]))
1923  {
1924  // real and imaginary part are both present
1925  IndCol(nnz) = real_ind_[j];
1926  Value(nnz) = T(real_data_[j], imag_data_[num_i]);
1927  num_i++; nnz++;
1928  }
1929  else
1930  {
1931  // real part alone
1932  IndCol(nnz) = real_ind_[j];
1933  Value(nnz) = T(real_data_[j], 0);
1934  nnz++;
1935  }
1936  }
1937 
1938  // last values of imaginary part
1939  for (long j = num_i; j < imag_ptr_[i+1]; j++)
1940  {
1941  IndCol(nnz) = imag_ind_[j];
1942  Value(nnz) = T(0, imag_data_[j]);
1943  nnz++;
1944  }
1945 
1946  Ptr(i+1) = nnz;
1947  }
1948 
1949  IndCol.Resize(nnz);
1950  Value.Resize(nnz);
1951  }
1952 
1953 
1955  template<class T, class Prop, class Alloc1, class Tint0,
1956  class Tint1, class Alloc2, class Alloc3, class Alloc4>
1957  void ConvertToCSR(const Matrix<T, Prop, ColComplexSparse, Alloc1>& A,
1961  {
1962  typedef typename ClassComplexType<T>::Treal Treal;
1963  int m = A.GetM();
1964  int n = A.GetN();
1965  long nnz = A.GetDataSize();
1966  long* real_ptr = A.GetRealPtr();
1967  long* imag_ptr = A.GetImagPtr();
1968  int* real_ind = A.GetRealInd();
1969  int* imag_ind = A.GetImagInd();
1970  Treal* real_data = A.GetRealData();
1971  Treal* imag_data = A.GetImagData();
1972 
1973  // first we count the number of non-zero entries for each row
1974  Vector<int> NumNnzRow(m);
1975  NumNnzRow.Zero();
1976  for (int i = 0; i < n; i++)
1977  {
1978  long num_i = imag_ptr[i];
1979  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
1980  {
1981  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
1982  {
1983  // imaginary part alone
1984  NumNnzRow(imag_ind[num_i])++;
1985  num_i++;
1986  }
1987 
1988 
1989  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
1990  {
1991  // real and imaginary part are both present
1992  NumNnzRow(real_ind[j])++;
1993  num_i++;
1994  }
1995  else
1996  NumNnzRow(real_ind[j])++;
1997  }
1998 
1999  // last values of imaginary part
2000  for (long j = num_i; j < imag_ptr[i+1]; j++)
2001  NumNnzRow(imag_ind[j])++;
2002  }
2003 
2004  // 'Ptr' array can be constructed
2005  Ptr.Reallocate(m+1);
2006  Ptr(0) = 0;
2007  for (int i = 0; i < m; i++)
2008  Ptr(i+1) = Ptr(i) + NumNnzRow(i);
2009 
2010  // total number of non-zero entries
2011  nnz = Ptr(m);
2012 
2013  // arrays 'IndCol' and 'Val' are filled already sorted by rows
2014  IndCol.Reallocate(nnz);
2015  Val.Reallocate(nnz);
2016  NumNnzRow.Zero();
2017  for (int i = 0; i < n; i++)
2018  {
2019  long num_i = imag_ptr[i]; int jcol = 0;
2020  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2021  {
2022  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2023  {
2024  jcol = imag_ind[num_i];
2025  // imaginary part alone
2026  long num = Ptr(jcol) + NumNnzRow(jcol);
2027  IndCol(num) = i;
2028  Val(num) = T(0, imag_data[num_i]);
2029  NumNnzRow(jcol)++;
2030  num_i++;
2031  }
2032 
2033  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2034  {
2035  jcol = real_ind[j];
2036  long num = Ptr(jcol) + NumNnzRow(jcol);
2037  // real and imaginary part are both present
2038  IndCol(num) = i;
2039  Val(num) = T(real_data[j], imag_data[num_i]);
2040  NumNnzRow(jcol)++;
2041  num_i++;
2042  }
2043  else
2044  {
2045  jcol = real_ind[j];
2046  long num = Ptr(jcol) + NumNnzRow(jcol);
2047  // real part alone
2048  IndCol(num) = i;
2049  Val(num) = T(real_data[j], 0);
2050  NumNnzRow(jcol)++;
2051  }
2052  }
2053 
2054  // last values of imaginary part
2055  for (long j = num_i; j < imag_ptr[i+1]; j++)
2056  {
2057  jcol = imag_ind[j];
2058  long num = Ptr(jcol) + NumNnzRow(jcol);
2059  IndCol(num) = i;
2060  Val(num) = T(0, imag_data[j]);
2061  NumNnzRow(jcol)++;
2062  }
2063  }
2064  }
2065 
2066 
2068  template<class T, class Prop, class Alloc1, class Tint0,
2069  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2074  {
2075  int m = A.GetM();
2076  if (m <= 0)
2077  {
2078  Ptr.Clear();
2079  IndCol.Clear();
2080  Value.Clear();
2081  return;
2082  }
2083 
2084  typedef typename ClassComplexType<T>::Treal Treal;
2085  long* real_ptr_ = A.GetRealPtr();
2086  int* real_ind_ = A.GetRealInd();
2087  Treal* real_data_ = A.GetRealData();
2088 
2089  long* imag_ptr_ = A.GetImagPtr();
2090  int* imag_ind_ = A.GetImagInd();
2091  Treal* imag_data_ = A.GetImagData();
2092 
2093  long real_nnz = A.GetRealDataSize();
2094  long imag_nnz = A.GetImagDataSize();
2095 
2096  Ptr.Reallocate(m+1);
2097  IndCol.Reallocate(real_nnz + imag_nnz);
2098  Value.Reallocate(real_nnz + imag_nnz);
2099  long nnz = 0;
2100  Ptr(0) = 0;
2101  for (int i = 0; i < m; i++)
2102  {
2103  long num_i = imag_ptr_[i];
2104  for (long j = real_ptr_[i]; j < real_ptr_[i+1]; j++)
2105  {
2106  while ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] < real_ind_[j]))
2107  {
2108  // imaginary part alone
2109  IndCol(nnz) = imag_ind_[num_i];
2110  Value(nnz) = T(0, imag_data_[num_i]);
2111  nnz++; num_i++;
2112  }
2113 
2114  if ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] == real_ind_[j]))
2115  {
2116  // real and imaginary part are both present
2117  IndCol(nnz) = real_ind_[j];
2118  Value(nnz) = T(real_data_[j], imag_data_[num_i]);
2119  num_i++; nnz++;
2120  }
2121  else
2122  {
2123  // real part alone
2124  IndCol(nnz) = real_ind_[j];
2125  Value(nnz) = T(real_data_[j], 0);
2126  nnz++;
2127  }
2128  }
2129 
2130  // last values of imaginary part
2131  for (long j = num_i; j < imag_ptr_[i+1]; j++)
2132  {
2133  IndCol(nnz) = imag_ind_[j];
2134  Value(nnz) = T(0, imag_data_[j]);
2135  nnz++;
2136  }
2137 
2138  Ptr(i+1) = nnz;
2139  }
2140 
2141  IndCol.Resize(nnz);
2142  Value.Resize(nnz);
2143  }
2144 
2145 
2147  template<class T, class Prop, class Alloc1, class Tint0,
2148  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2153  {
2154  // Matrix (m,n) with nnz entries.
2155  int m = A.GetN();
2156 
2157  // Conversion in coordinate format.
2158  // ConvertMatrix_to_Coordinate provides sorted numbers (by rows here)
2159  Vector<Tint1> IndRow;
2160  ConvertMatrix_to_Coordinates(A, IndRow, IndCol, Val, 0, true);
2161 
2162  // Constructing pointer array 'Ptr'.
2163  Ptr.Reallocate(m + 1);
2164  Ptr.Fill(0);
2165 
2166  // Counting non-zero entries per row.
2167  for (long i = 0; i < IndRow.GetM(); i++)
2168  Ptr(IndRow(i) + 1)++;
2169 
2170  // Accumulation to get pointer array.
2171  Ptr(0) = 0;
2172  for (int i = 0; i < m; i++)
2173  Ptr(i + 1) += Ptr(i);
2174  }
2175 
2176 
2178  template<class T, class Prop, class Alloc1, class Tint0,
2179  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2184  {
2185  typedef typename ClassComplexType<T>::Treal Treal;
2186  int m = A.GetM();
2187  int n = A.GetN();
2188  long nnz = A.GetDataSize();
2189  long* real_ptr = A.GetRealPtr();
2190  long* imag_ptr = A.GetImagPtr();
2191  int* real_ind = A.GetRealInd();
2192  int* imag_ind = A.GetImagInd();
2193  Treal* real_data = A.GetRealData();
2194  Treal* imag_data = A.GetImagData();
2195 
2196  // first we count the number of non-zero entries for each row
2197  Vector<int> NumNnzRow(m);
2198  NumNnzRow.Zero();
2199  for (int i = 0; i < n; i++)
2200  {
2201  long num_i = imag_ptr[i];
2202  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2203  {
2204  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2205  {
2206  // imaginary part alone
2207  NumNnzRow(imag_ind[num_i])++;
2208  num_i++;
2209  }
2210 
2211 
2212  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2213  {
2214  // real and imaginary part are both present
2215  NumNnzRow(real_ind[j])++;
2216  num_i++;
2217  }
2218  else
2219  NumNnzRow(real_ind[j])++;
2220  }
2221 
2222  // last values of imaginary part
2223  for (long j = num_i; j < imag_ptr[i+1]; j++)
2224  NumNnzRow(imag_ind[j])++;
2225  }
2226 
2227  // 'Ptr' array can be constructed
2228  Ptr.Reallocate(m+1);
2229  Ptr(0) = 0;
2230  for (int i = 0; i < m; i++)
2231  Ptr(i+1) = Ptr(i) + NumNnzRow(i);
2232 
2233  // total number of non-zero entries
2234  nnz = Ptr(m);
2235 
2236  // arrays 'IndCol' and 'Val' are filled already sorted by rows
2237  IndCol.Reallocate(nnz);
2238  Val.Reallocate(nnz);
2239  NumNnzRow.Zero();
2240  for (int i = 0; i < n; i++)
2241  {
2242  long num_i = imag_ptr[i]; int jcol = 0;
2243  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2244  {
2245  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2246  {
2247  jcol = imag_ind[num_i];
2248  // imaginary part alone
2249  long num = Ptr(jcol) + NumNnzRow(jcol);
2250  IndCol(num) = i;
2251  Val(num) = T(0, imag_data[num_i]);
2252  NumNnzRow(jcol)++;
2253  num_i++;
2254  }
2255 
2256  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2257  {
2258  jcol = real_ind[j];
2259  long num = Ptr(jcol) + NumNnzRow(jcol);
2260  // real and imaginary part are both present
2261  IndCol(num) = i;
2262  Val(num) = T(real_data[j], imag_data[num_i]);
2263  NumNnzRow(jcol)++;
2264  num_i++;
2265  }
2266  else
2267  {
2268  jcol = real_ind[j];
2269  long num = Ptr(jcol) + NumNnzRow(jcol);
2270  // real part alone
2271  IndCol(num) = i;
2272  Val(num) = T(real_data[j], 0);
2273  NumNnzRow(jcol)++;
2274  }
2275  }
2276 
2277  // last values of imaginary part
2278  for (long j = num_i; j < imag_ptr[i+1]; j++)
2279  {
2280  jcol = imag_ind[j];
2281  long num = Ptr(jcol) + NumNnzRow(jcol);
2282  IndCol(num) = i;
2283  Val(num) = T(0, imag_data[j]);
2284  NumNnzRow(jcol)++;
2285  }
2286  }
2287  }
2288 
2289 
2291  template<class T, class Prop, class Alloc1, class Tint0,
2292  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2297  {
2299 
2300  // this function sorts by column numbers
2301  // by symmetry, row numbers = col numbers, we invert the two arguments
2302  // to have sorted column numbers
2303  ConvertMatrix_to_Coordinates(A, IndCol, IndRow, Val, 0, true);
2304 
2305  int m = A.GetM();
2306  Ptr.Reallocate(m+1);
2307  Ptr.Zero();
2308 
2309  for (long i = 0; i < IndCol.GetM(); i++)
2310  Ptr(IndRow(i) + 1)++;
2311 
2312  // incrementing Ptr
2313  for (int i = 2; i <= m; i++)
2314  Ptr(i) += Ptr(i-1);
2315  }
2316 
2317 
2319  template<class T, class Prop, class Alloc1, class Tint0,
2320  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2325  {
2326  int m = A.GetM();
2327  if (m <= 0)
2328  {
2329  Ptr.Clear();
2330  IndCol.Clear();
2331  Value.Clear();
2332  return;
2333  }
2334 
2335  long real_nnz = A.GetRealDataSize();
2336  long imag_nnz = A.GetImagDataSize();
2337 
2338  Ptr.Reallocate(m+1);
2339  IndCol.Reallocate(real_nnz + imag_nnz);
2340  Value.Reallocate(real_nnz + imag_nnz);
2341  long nnz = 0;
2342  Ptr(0) = 0;
2343  for (int i = 0; i < m; i++)
2344  {
2345  int num_i = 0;
2346  int size_imag = A.GetImagRowSize(i);
2347  for (int j = 0; j < A.GetRealRowSize(i); j++)
2348  {
2349  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2350  {
2351  // imaginary part alone
2352  IndCol(nnz) = A.IndexImag(i, num_i);
2353  Value(nnz) = T(0, A.ValueImag(i, num_i));
2354  nnz++; num_i++;
2355  }
2356 
2357  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2358  {
2359  // real and imaginary part are both present
2360  IndCol(nnz) = A.IndexReal(i, j);
2361  Value(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
2362  num_i++; nnz++;
2363  }
2364  else
2365  {
2366  // real part alone
2367  IndCol(nnz) = A.IndexReal(i, j);
2368  Value(nnz) = T(A.ValueReal(i, j), 0);
2369  nnz++;
2370  }
2371  }
2372 
2373  // last values of imaginary part
2374  for (int j = num_i; j < size_imag; j++)
2375  {
2376  IndCol(nnz) = A.IndexImag(i, j);
2377  Value(nnz) = T(0, A.ValueImag(i, j));
2378  nnz++;
2379  }
2380 
2381  Ptr(i+1) = nnz;
2382  }
2383 
2384  IndCol.Resize(nnz);
2385  Value.Resize(nnz);
2386  }
2387 
2388 
2390  template<class T, class Prop, class Alloc1, class Tint0,
2391  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2396  {
2397  int m = A.GetM();
2398  int n = A.GetN();
2399  long nnz = A.GetDataSize();
2400 
2401  // first we count the number of non-zero entries for each row
2402  Vector<int> NumNnzRow(m);
2403  NumNnzRow.Zero();
2404  for (int i = 0; i < n; i++)
2405  {
2406  int num_i = 0;
2407  int size_imag = A.GetImagColumnSize(i);
2408  for (int j = 0; j < A.GetRealColumnSize(i); j++)
2409  {
2410  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2411  {
2412  // imaginary part alone
2413  NumNnzRow(A.IndexImag(i, num_i))++;
2414  num_i++;
2415  }
2416 
2417  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2418  {
2419  // real and imaginary part are both present
2420  NumNnzRow(A.IndexReal(i, j))++;
2421  num_i++;
2422  }
2423  else
2424  NumNnzRow(A.IndexReal(i, j))++;
2425  }
2426 
2427  // last values of imaginary part
2428  for (int j = num_i; j < size_imag; j++)
2429  NumNnzRow(A.IndexImag(i, j))++;
2430  }
2431 
2432  // 'Ptr' array can be constructed
2433  Ptr.Reallocate(m+1);
2434  Ptr(0) = 0;
2435  for (int i = 0; i < m; i++)
2436  Ptr(i+1) = Ptr(i) + NumNnzRow(i);
2437 
2438  // total number of non-zero entries
2439  nnz = Ptr(m);
2440 
2441  // arrays 'IndCol' and 'Val' are filled already sorted by rows
2442  IndCol.Reallocate(nnz);
2443  Val.Reallocate(nnz);
2444  NumNnzRow.Zero();
2445  for (int i = 0; i < n; i++)
2446  {
2447  int num_i = 0, jcol = 0;
2448  int size_imag = A.GetImagColumnSize(i);
2449  for (int j = 0; j < A.GetRealColumnSize(i); j++)
2450  {
2451  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2452  {
2453  jcol = A.IndexImag(i, num_i);
2454  // imaginary part alone
2455  long num = Ptr(jcol) + NumNnzRow(jcol);
2456  IndCol(num) = i;
2457  Val(num) = T(0, A.ValueImag(i, num_i));
2458  NumNnzRow(jcol)++;
2459  num_i++;
2460  }
2461 
2462  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2463  {
2464  jcol = A.IndexReal(i, j);
2465  long num = Ptr(jcol) + NumNnzRow(jcol);
2466  // real and imaginary part are both present
2467  IndCol(num) = i;
2468  Val(num) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
2469  NumNnzRow(jcol)++;
2470  num_i++;
2471  }
2472  else
2473  {
2474  jcol = A.IndexReal(i, j);
2475  long num = Ptr(jcol) + NumNnzRow(jcol);
2476  // real part alone
2477  IndCol(num) = i;
2478  Val(num) = T(A.ValueReal(i, j), 0);
2479  NumNnzRow(jcol)++;
2480  }
2481  }
2482 
2483  // last values of imaginary part
2484  for (int j = num_i; j < size_imag; j++)
2485  {
2486  jcol = A.IndexImag(i, j);
2487  long num = Ptr(jcol) + NumNnzRow(jcol);
2488  IndCol(num) = i;
2489  Val(num) = T(0, A.ValueImag(i, j));
2490  NumNnzRow(jcol)++;
2491  }
2492  }
2493  }
2494 
2495 
2497  template<class T, class Prop, class Alloc1, class Tint0,
2498  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2503  {
2504  int m = A.GetM();
2505  if (m <= 0)
2506  {
2507  Ptr.Clear();
2508  IndCol.Clear();
2509  Value.Clear();
2510  return;
2511  }
2512 
2513  long real_nnz = A.GetRealDataSize();
2514  long imag_nnz = A.GetImagDataSize();
2515 
2516  Ptr.Reallocate(m+1);
2517  IndCol.Reallocate(real_nnz + imag_nnz);
2518  Value.Reallocate(real_nnz + imag_nnz);
2519  long nnz = 0;
2520  Ptr(0) = 0;
2521  for (int i = 0; i < m; i++)
2522  {
2523  int num_i = 0;
2524  int size_imag = A.GetImagRowSize(i);
2525  for (int j = 0; j < A.GetRealRowSize(i); j++)
2526  {
2527  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2528  {
2529  // imaginary part alone
2530  IndCol(nnz) = A.IndexImag(i, num_i);
2531  Value(nnz) = T(0, A.ValueImag(i, num_i));
2532  nnz++; num_i++;
2533  }
2534 
2535  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2536  {
2537  // real and imaginary part are both present
2538  IndCol(nnz) = A.IndexReal(i, j);
2539  Value(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
2540  num_i++; nnz++;
2541  }
2542  else
2543  {
2544  // real part alone
2545  IndCol(nnz) = A.IndexReal(i, j);
2546  Value(nnz) = T(A.ValueReal(i, j), 0);
2547  nnz++;
2548  }
2549  }
2550 
2551  // last values of imaginary part
2552  for (int j = num_i; j < size_imag; j++)
2553  {
2554  IndCol(nnz) = A.IndexImag(i, j);
2555  Value(nnz) = T(0, A.ValueImag(i, j));
2556  nnz++;
2557  }
2558 
2559  Ptr(i+1) = nnz;
2560  }
2561 
2562  IndCol.Resize(nnz);
2563  Value.Resize(nnz);
2564  }
2565 
2566 
2568  template<class T, class Prop, class Alloc1, class Tint0,
2569  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2574  {
2575  // Matrix (m,n) with nnz entries.
2576  int m = A.GetN();
2577 
2578  // Conversion in coordinate format.
2579  // ConvertMatrix_to_Coordinate provides sorted numbers (by rows here)
2580  Vector<Tint1> IndRow;
2581  ConvertMatrix_to_Coordinates(A, IndRow, IndCol, Value, 0, true);
2582 
2583  // Constructing pointer array 'Ptr'.
2584  Ptr.Reallocate(m + 1);
2585  Ptr.Fill(0);
2586 
2587  // Counting non-zero entries per row.
2588  for (long i = 0; i < IndRow.GetM(); i++)
2589  Ptr(IndRow(i) + 1)++;
2590 
2591  // Accumulation to get pointer array.
2592  Ptr(0) = 0;
2593  for (int i = 0; i < m; i++)
2594  Ptr(i + 1) += Ptr(i);
2595  }
2596 
2597 
2599  template<class T, class Prop, class Alloc1, class Tint0,
2600  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2605  {
2606  int m = A.GetM();
2607  int n = A.GetN();
2608  long nnz = A.GetDataSize();
2609 
2610  // first we count the number of non-zero entries for each row
2611  Vector<int> NumNnzRow(m);
2612  NumNnzRow.Zero();
2613  for (int i = 0; i < n; i++)
2614  {
2615  int num_i = 0;
2616  int size_imag = A.GetImagColumnSize(i);
2617  for (int j = 0; j < A.GetRealColumnSize(i); j++)
2618  {
2619  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2620  {
2621  // imaginary part alone
2622  NumNnzRow(A.IndexImag(i, num_i))++;
2623  num_i++;
2624  }
2625 
2626  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2627  {
2628  // real and imaginary part are both present
2629  NumNnzRow(A.IndexReal(i, j))++;
2630  num_i++;
2631  }
2632  else
2633  NumNnzRow(A.IndexReal(i, j))++;
2634  }
2635 
2636  // last values of imaginary part
2637  for (int j = num_i; j < size_imag; j++)
2638  NumNnzRow(A.IndexImag(i, j))++;
2639  }
2640 
2641  // 'Ptr' array can be constructed
2642  Ptr.Reallocate(m+1);
2643  Ptr(0) = 0;
2644  for (int i = 0; i < m; i++)
2645  Ptr(i+1) = Ptr(i) + NumNnzRow(i);
2646 
2647  // total number of non-zero entries
2648  nnz = Ptr(m);
2649 
2650  // arrays 'IndCol' and 'Val' are filled already sorted by rows
2651  IndCol.Reallocate(nnz);
2652  Val.Reallocate(nnz);
2653  NumNnzRow.Zero();
2654  for (int i = 0; i < n; i++)
2655  {
2656  int num_i = 0, jcol = 0;
2657  int size_imag = A.GetImagColumnSize(i);
2658  for (int j = 0; j < A.GetRealColumnSize(i); j++)
2659  {
2660  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
2661  {
2662  jcol = A.IndexImag(i, num_i);
2663  // imaginary part alone
2664  long num = Ptr(jcol) + NumNnzRow(jcol);
2665  IndCol(num) = i;
2666  Val(num) = T(0, A.ValueImag(i, num_i));
2667  NumNnzRow(jcol)++;
2668  num_i++;
2669  }
2670 
2671  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
2672  {
2673  jcol = A.IndexReal(i, j);
2674  long num = Ptr(jcol) + NumNnzRow(jcol);
2675  // real and imaginary part are both present
2676  IndCol(num) = i;
2677  Val(num) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
2678  NumNnzRow(jcol)++;
2679  num_i++;
2680  }
2681  else
2682  {
2683  jcol = A.IndexReal(i, j);
2684  long num = Ptr(jcol) + NumNnzRow(jcol);
2685  // real part alone
2686  IndCol(num) = i;
2687  Val(num) = T(A.ValueReal(i, j), 0);
2688  NumNnzRow(jcol)++;
2689  }
2690  }
2691 
2692  // last values of imaginary part
2693  for (int j = num_i; j < size_imag; j++)
2694  {
2695  jcol = A.IndexImag(i, j);
2696  long num = Ptr(jcol) + NumNnzRow(jcol);
2697  IndCol(num) = i;
2698  Val(num) = T(0, A.ValueImag(i, j));
2699  NumNnzRow(jcol)++;
2700  }
2701  }
2702  }
2703 
2704 
2706  template<class T, class Prop, class Alloc1, class Tint0,
2707  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2712  {
2714 
2715  // this function sorts by column numbers
2716  // by symmetry, row numbers = col numbers, we invert the two arguments
2717  // to have sorted column numbers
2718  ConvertMatrix_to_Coordinates(A, IndCol, IndRow, Val, 0, true);
2719 
2720  int m = A.GetM();
2721  Ptr.Reallocate(m+1);
2722  Ptr.Zero();
2723 
2724  for (long i = 0; i < IndCol.GetM(); i++)
2725  Ptr(IndRow(i) + 1)++;
2726 
2727  // incrementing Ptr
2728  for (int i = 2; i <= m; i++)
2729  Ptr(i) += Ptr(i-1);
2730  }
2731 
2732 
2734 
2738  template<class T, class Prop, class Alloc1, class Tint0,
2739  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2740  void ConvertToCSC(const Matrix<T, Prop, RowComplexSparse, Alloc1>& A,
2743  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
2744  {
2745  if (sym_pat)
2746  throw Undefined("ConvertToCSC", "Symmetrization of pattern not"
2747  " implemented for RowComplexSparse storage");
2748 
2749  typedef typename ClassComplexType<T>::Treal Treal;
2750  int m = A.GetM();
2751  int n = A.GetN();
2752  long nnz = A.GetDataSize();
2753  long* real_ptr = A.GetRealPtr();
2754  long* imag_ptr = A.GetImagPtr();
2755  int* real_ind = A.GetRealInd();
2756  int* imag_ind = A.GetImagInd();
2757  Treal* real_data = A.GetRealData();
2758  Treal* imag_data = A.GetImagData();
2759 
2760  // first we count the number of non-zero entries for each column
2761  Vector<int> NumNnzCol(n);
2762  NumNnzCol.Zero();
2763  for (int i = 0; i < m; i++)
2764  {
2765  long num_i = imag_ptr[i];
2766  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2767  {
2768  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2769  {
2770  // imaginary part alone
2771  NumNnzCol(imag_ind[num_i])++;
2772  num_i++;
2773  }
2774 
2775 
2776  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2777  {
2778  // real and imaginary part are both present
2779  NumNnzCol(real_ind[j])++;
2780  num_i++;
2781  }
2782  else
2783  NumNnzCol(real_ind[j])++;
2784  }
2785 
2786  // last values of imaginary part
2787  for (long j = num_i; j < imag_ptr[i+1]; j++)
2788  NumNnzCol(imag_ind[j])++;
2789  }
2790 
2791  // 'Ptr' array can be constructed
2792  Ptr.Reallocate(n+1);
2793  Ptr(0) = 0;
2794  for (int i = 0; i < n; i++)
2795  Ptr(i+1) = Ptr(i) + NumNnzCol(i);
2796 
2797  // total number of non-zero entries
2798  nnz = Ptr(n);
2799 
2800  // arrays 'IndRow' and 'Val' are filled already sorted by columns
2801  IndRow.Reallocate(nnz);
2802  Val.Reallocate(nnz);
2803  NumNnzCol.Zero();
2804  for (int i = 0; i < m; i++)
2805  {
2806  long num_i = imag_ptr[i]; int jcol = 0;
2807  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2808  {
2809  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2810  {
2811  jcol = imag_ind[num_i];
2812  // imaginary part alone
2813  long num = Ptr(jcol) + NumNnzCol(jcol);
2814  IndRow(num) = i;
2815  Val(num) = T(0, imag_data[num_i]);
2816  NumNnzCol(jcol)++;
2817  num_i++;
2818  }
2819 
2820  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2821  {
2822  jcol = real_ind[j];
2823  long num = Ptr(jcol) + NumNnzCol(jcol);
2824  // real and imaginary part are both present
2825  IndRow(num) = i;
2826  Val(num) = T(real_data[j], imag_data[num_i]);
2827  NumNnzCol(jcol)++;
2828  num_i++;
2829  }
2830  else
2831  {
2832  jcol = real_ind[j];
2833  long num = Ptr(jcol) + NumNnzCol(jcol);
2834  // real part alone
2835  IndRow(num) = i;
2836  Val(num) = T(real_data[j], 0);
2837  NumNnzCol(jcol)++;
2838  }
2839  }
2840 
2841  // last values of imaginary part
2842  for (long j = num_i; j < imag_ptr[i+1]; j++)
2843  {
2844  jcol = imag_ind[j];
2845  long num = Ptr(jcol) + NumNnzCol(jcol);
2846  IndRow(num) = i;
2847  Val(num) = T(0, imag_data[j]);
2848  NumNnzCol(jcol)++;
2849  }
2850  }
2851  }
2852 
2853 
2855  template<class T, class Prop, class Alloc1, class Tint0,
2856  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2857  void ConvertToCSC(const Matrix<T, Prop, ColComplexSparse, Alloc1>& A,
2861  bool sym_pat)
2862  {
2863  if (sym_pat)
2864  throw Undefined("ConvertToCSC", "Symmetrization of pattern not"
2865  " implemented for ColComplexSparse storage");
2866 
2867  int n = A.GetN();
2868  if (n <= 0)
2869  {
2870  Ptr.Clear();
2871  IndCol.Clear();
2872  Value.Clear();
2873  return;
2874  }
2875 
2876  typedef typename ClassComplexType<T>::Treal Treal;
2877  Treal zero(0);
2878  long* real_ptr_ = A.GetRealPtr();
2879  int* real_ind_ = A.GetRealInd();
2880  Treal* real_data_ = A.GetRealData();
2881 
2882  long* imag_ptr_ = A.GetImagPtr();
2883  int* imag_ind_ = A.GetImagInd();
2884  Treal* imag_data_ = A.GetImagData();
2885 
2886  long real_nnz = A.GetRealDataSize();
2887  long imag_nnz = A.GetImagDataSize();
2888 
2889  Ptr.Reallocate(n+1);
2890  IndCol.Reallocate(real_nnz + imag_nnz);
2891  Value.Reallocate(real_nnz + imag_nnz);
2892  long nnz = 0;
2893  Ptr(0) = 0;
2894  for (int i = 0; i < n; i++)
2895  {
2896  long num_i = imag_ptr_[i];
2897  for (long j = real_ptr_[i]; j < real_ptr_[i+1]; j++)
2898  {
2899  while ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] < real_ind_[j]))
2900  {
2901  // imaginary part alone
2902  IndCol(nnz) = imag_ind_[num_i];
2903  Value(nnz) = T(0, imag_data_[num_i]);
2904  nnz++; num_i++;
2905  }
2906 
2907  if ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] == real_ind_[j]))
2908  {
2909  // real and imaginary part are both present
2910  IndCol(nnz) = real_ind_[j];
2911  Value(nnz) = T(real_data_[j], imag_data_[num_i]);
2912  num_i++; nnz++;
2913  }
2914  else
2915  {
2916  // real part alone
2917  IndCol(nnz) = real_ind_[j];
2918  Value(nnz) = T(real_data_[j], 0);
2919  nnz++;
2920  }
2921  }
2922 
2923  // last values of imaginary part
2924  for (long j = num_i; j < imag_ptr_[i+1]; j++)
2925  {
2926  IndCol(nnz) = imag_ind_[j];
2927  Value(nnz) = T(0, imag_data_[j]);
2928  nnz++;
2929  }
2930 
2931  Ptr(i+1) = nnz;
2932  }
2933 
2934  IndCol.Resize(nnz);
2935  Value.Resize(nnz);
2936  }
2937 
2938 
2940  template<class T, class Prop, class Alloc1, class Tint0,
2941  class Tint1, class Alloc2, class Alloc3, class Alloc4>
2945  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
2946  {
2947  typedef typename ClassComplexType<T>::Treal Treal;
2948  int m = A.GetM();
2949  int n = A.GetN();
2950  long nnz = A.GetDataSize();
2951  long* real_ptr = A.GetRealPtr();
2952  long* imag_ptr = A.GetImagPtr();
2953  int* real_ind = A.GetRealInd();
2954  int* imag_ind = A.GetImagInd();
2955  Treal* real_data = A.GetRealData();
2956  Treal* imag_data = A.GetImagData();
2957 
2958  // first we count the number of non-zero entries for each column
2959  Vector<int> NumNnzCol(m);
2960  NumNnzCol.Zero();
2961  for (int i = 0; i < n; i++)
2962  {
2963  long num_i = imag_ptr[i];
2964  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
2965  {
2966  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
2967  {
2968  // imaginary part alone
2969  NumNnzCol(imag_ind[num_i])++;
2970  num_i++;
2971  }
2972 
2973 
2974  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
2975  {
2976  // real and imaginary part are both present
2977  NumNnzCol(real_ind[j])++;
2978  num_i++;
2979  }
2980  else
2981  NumNnzCol(real_ind[j])++;
2982  }
2983 
2984  // last values of imaginary part
2985  for (long j = num_i; j < imag_ptr[i+1]; j++)
2986  NumNnzCol(imag_ind[j])++;
2987  }
2988 
2989  // 'Ptr' array can be constructed
2990  Ptr.Reallocate(m+1);
2991  Ptr(0) = 0;
2992  for (int i = 0; i < m; i++)
2993  Ptr(i+1) = Ptr(i) + NumNnzCol(i);
2994 
2995  // total number of non-zero entries
2996  nnz = Ptr(m);
2997 
2998  // arrays 'IndRow' and 'Val' are filled already sorted by columns
2999  IndRow.Reallocate(nnz);
3000  Val.Reallocate(nnz);
3001  NumNnzCol.Zero();
3002  for (int i = 0; i < n; i++)
3003  {
3004  long num_i = imag_ptr[i]; int jcol = 0;
3005  for (long j = real_ptr[i]; j < real_ptr[i + 1]; j++)
3006  {
3007  while ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] < real_ind[j]))
3008  {
3009  jcol = imag_ind[num_i];
3010  // imaginary part alone
3011  long num = Ptr(jcol) + NumNnzCol(jcol);
3012  IndRow(num) = i;
3013  Val(num) = T(0, imag_data[num_i]);
3014  NumNnzCol(jcol)++;
3015  num_i++;
3016  }
3017 
3018  if ((num_i < imag_ptr[i+1]) && (imag_ind[num_i] == real_ind[j]))
3019  {
3020  jcol = real_ind[j];
3021  long num = Ptr(jcol) + NumNnzCol(jcol);
3022  // real and imaginary part are both present
3023  IndRow(num) = i;
3024  Val(num) = T(real_data[j], imag_data[num_i]);
3025  NumNnzCol(jcol)++;
3026  num_i++;
3027  }
3028  else
3029  {
3030  jcol = real_ind[j];
3031  long num = Ptr(jcol) + NumNnzCol(jcol);
3032  // real part alone
3033  IndRow(num) = i;
3034  Val(num) = T(real_data[j], 0);
3035  NumNnzCol(jcol)++;
3036  }
3037  }
3038 
3039  // last values of imaginary part
3040  for (long j = num_i; j < imag_ptr[i+1]; j++)
3041  {
3042  jcol = imag_ind[j];
3043  long num = Ptr(jcol) + NumNnzCol(jcol);
3044  IndRow(num) = i;
3045  Val(num) = T(0, imag_data[j]);
3046  NumNnzCol(jcol)++;
3047  }
3048  }
3049  }
3050 
3051 
3053  template<class T, class Prop, class Alloc1, class Tint0,
3054  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3058  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3059  {
3061 
3062  // this function sorts by row numbers
3063  // by symmetry, row numbers = col numbers, we invert the two arguments
3064  // to have sorted column numbers
3065  ConvertMatrix_to_Coordinates(A, IndCol, IndRow, Val, 0, true);
3066 
3067  int m = A.GetM();
3068  Ptr.Reallocate(m+1);
3069  Ptr.Zero();
3070 
3071  for (long i = 0; i < IndCol.GetM(); i++)
3072  Ptr(IndCol(i) + 1)++;
3073 
3074  // incrementing Ptr
3075  for (int i = 2; i <= m; i++)
3076  Ptr(i) += Ptr(i-1);
3077  }
3078 
3079 
3081  template<class T, class Prop, class Alloc1, class Tint0,
3082  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3087  bool sym_pat)
3088  {
3089  int m = A.GetM();
3090  if (m <= 0)
3091  {
3092  Ptr.Clear();
3093  IndCol.Clear();
3094  Value.Clear();
3095  return;
3096  }
3097 
3098  typedef typename ClassComplexType<T>::Treal Treal;
3099  Treal zero(0);
3100  long* real_ptr_ = A.GetRealPtr();
3101  int* real_ind_ = A.GetRealInd();
3102  Treal* real_data_ = A.GetRealData();
3103 
3104  long* imag_ptr_ = A.GetImagPtr();
3105  int* imag_ind_ = A.GetImagInd();
3106  Treal* imag_data_ = A.GetImagData();
3107 
3108  long real_nnz = A.GetRealDataSize();
3109  long imag_nnz = A.GetImagDataSize();
3110 
3111  Ptr.Reallocate(m+1);
3112  IndCol.Reallocate(real_nnz + imag_nnz);
3113  Value.Reallocate(real_nnz + imag_nnz);
3114  long nnz = 0;
3115  Ptr(0) = 0;
3116  for (int i = 0; i < m; i++)
3117  {
3118  long num_i = imag_ptr_[i];
3119  for (long j = real_ptr_[i]; j < real_ptr_[i+1]; j++)
3120  {
3121  while ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] < real_ind_[j]))
3122  {
3123  // imaginary part alone
3124  IndCol(nnz) = imag_ind_[num_i];
3125  Value(nnz) = T(0, imag_data_[num_i]);
3126  nnz++; num_i++;
3127  }
3128 
3129  if ((num_i < imag_ptr_[i+1]) && (imag_ind_[num_i] == real_ind_[j]))
3130  {
3131  // real and imaginary part are both present
3132  IndCol(nnz) = real_ind_[j];
3133  Value(nnz) = T(real_data_[j], imag_data_[num_i]);
3134  num_i++; nnz++;
3135  }
3136  else
3137  {
3138  // real part alone
3139  IndCol(nnz) = real_ind_[j];
3140  Value(nnz) = T(real_data_[j], 0);
3141  nnz++;
3142  }
3143  }
3144 
3145  // last values of imaginary part
3146  for (long j = num_i; j < imag_ptr_[i+1]; j++)
3147  {
3148  IndCol(nnz) = imag_ind_[j];
3149  Value(nnz) = T(0, imag_data_[j]);
3150  nnz++;
3151  }
3152 
3153  Ptr(i+1) = nnz;
3154  }
3155 
3156  IndCol.Resize(nnz);
3157  Value.Resize(nnz);
3158  }
3159 
3160 
3162  template<class T, class Prop, class Alloc1, class Tint0,
3163  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3167  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3168  {
3169  // Matrix (m,n) with nnz entries.
3170  int m = A.GetN();
3171 
3172  // Conversion in coordinate format.
3173  // ConvertMatrix_to_Coordinate provides sorted numbers (by columns here)
3174  Vector<Tint1> IndCol;
3175  ConvertMatrix_to_Coordinates(A, IndRow, IndCol, Val, 0, true);
3176 
3177  // Constructing pointer array 'Ptr'.
3178  Ptr.Reallocate(m + 1);
3179  Ptr.Fill(0);
3180 
3181  // Counting non-zero entries per columnx.
3182  for (long i = 0; i < IndRow.GetM(); i++)
3183  Ptr(IndCol(i) + 1)++;
3184 
3185  // Accumulation to get pointer array.
3186  Ptr(0) = 0;
3187  for (int i = 0; i < m; i++)
3188  Ptr(i + 1) += Ptr(i);
3189 
3190  }
3191 
3192 
3194 
3198  template<class T, class Prop, class Alloc1, class Tint0,
3199  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3203  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3204  {
3205  if (sym_pat)
3206  throw Undefined("ConvertToCSC", "Symmetrization of pattern not"
3207  "implemented for RowComplexSparse storage");
3208 
3209  int m = A.GetM();
3210  int n = A.GetN();
3211  long nnz = A.GetDataSize();
3212 
3213  // first we count the number of non-zero entries for each column
3214  Vector<int> NumNnzCol(n);
3215  NumNnzCol.Zero();
3216  for (int i = 0; i < m; i++)
3217  {
3218  int num_i = 0;
3219  int size_imag = A.GetImagRowSize(i);
3220  for (int j = 0; j < A.GetRealRowSize(i); j++)
3221  {
3222  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3223  {
3224  // imaginary part alone
3225  NumNnzCol(A.IndexImag(i, num_i))++;
3226  num_i++;
3227  }
3228 
3229  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3230  {
3231  // real and imaginary part are both present
3232  NumNnzCol(A.IndexReal(i, j))++;
3233  num_i++;
3234  }
3235  else
3236  NumNnzCol(A.IndexReal(i, j))++;
3237  }
3238 
3239  // last values of imaginary part
3240  for (int j = num_i; j < size_imag; j++)
3241  NumNnzCol(A.IndexImag(i, j))++;
3242  }
3243 
3244  // 'Ptr' array can be constructed
3245  Ptr.Reallocate(n+1);
3246  Ptr(0) = 0;
3247  for (int i = 0; i < n; i++)
3248  Ptr(i+1) = Ptr(i) + NumNnzCol(i);
3249 
3250  // total number of non-zero entries
3251  nnz = Ptr(n);
3252 
3253  // arrays 'IndRow' and 'Val' are filled already sorted by columns
3254  IndRow.Reallocate(nnz);
3255  Val.Reallocate(nnz);
3256  NumNnzCol.Zero();
3257  for (int i = 0; i < m; i++)
3258  {
3259  int num_i = 0, jcol = 0;
3260  int size_imag = A.GetImagRowSize(i);
3261  for (int j = 0; j < A.GetRealRowSize(i); j++)
3262  {
3263  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3264  {
3265  jcol = A.IndexImag(i, num_i);
3266  // imaginary part alone
3267  long num = Ptr(jcol) + NumNnzCol(jcol);
3268  IndRow(num) = i;
3269  Val(num) = T(0, A.ValueImag(i, num_i));
3270  NumNnzCol(jcol)++;
3271  num_i++;
3272  }
3273 
3274  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3275  {
3276  jcol = A.IndexReal(i, j);
3277  long num = Ptr(jcol) + NumNnzCol(jcol);
3278  // real and imaginary part are both present
3279  IndRow(num) = i;
3280  Val(num) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
3281  NumNnzCol(jcol)++;
3282  num_i++;
3283  }
3284  else
3285  {
3286  jcol = A.IndexReal(i, j);
3287  long num = Ptr(jcol) + NumNnzCol(jcol);
3288  // real part alone
3289  IndRow(num) = i;
3290  Val(num) = T(A.ValueReal(i, j), 0);
3291  NumNnzCol(jcol)++;
3292  }
3293  }
3294 
3295  // last values of imaginary part
3296  for (int j = num_i; j < size_imag; j++)
3297  {
3298  jcol = A.IndexImag(i, j);
3299  long num = Ptr(jcol) + NumNnzCol(jcol);
3300  IndRow(num) = i;
3301  Val(num) = T(0, A.ValueImag(i, j));
3302  NumNnzCol(jcol)++;
3303  }
3304  }
3305  }
3306 
3307 
3309  template<class T, class Prop, class Alloc1, class Tint0,
3310  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3315  bool sym_pat)
3316  {
3317  if (sym_pat)
3318  throw Undefined("ConvertToCSC", "Symmetrization of pattern not"
3319  "implemented for ColComplexSparse storage");
3320 
3321  int n = A.GetN();
3322  if (n <= 0)
3323  {
3324  Ptr.Clear();
3325  IndCol.Clear();
3326  Value.Clear();
3327  return;
3328  }
3329 
3330  typedef typename ClassComplexType<T>::Treal Treal;
3331  Treal zero(0);
3332  long real_nnz = A.GetRealDataSize();
3333  long imag_nnz = A.GetImagDataSize();
3334 
3335  Ptr.Reallocate(n+1);
3336  IndCol.Reallocate(real_nnz + imag_nnz);
3337  Value.Reallocate(real_nnz + imag_nnz);
3338  long nnz = 0;
3339  Ptr(0) = 0;
3340  for (int i = 0; i < n; i++)
3341  {
3342  int num_i = 0;
3343  int size_imag = A.GetImagColumnSize(i);
3344  for (int j = 0; j < A.GetRealColumnSize(i); j++)
3345  {
3346  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3347  {
3348  // imaginary part alone
3349  IndCol(nnz) = A.IndexImag(i, num_i);
3350  Value(nnz) = T(0, A.ValueImag(i, num_i));
3351  nnz++; num_i++;
3352  }
3353 
3354  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3355  {
3356  // real and imaginary part are both present
3357  IndCol(nnz) = A.IndexReal(i, j);
3358  Value(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
3359  num_i++; nnz++;
3360  }
3361  else
3362  {
3363  // real part alone
3364  IndCol(nnz) = A.IndexReal(i, j);
3365  Value(nnz) = T(A.ValueReal(i, j), 0);
3366  nnz++;
3367  }
3368  }
3369 
3370  // last values of imaginary part
3371  for (int j = num_i; j < size_imag; j++)
3372  {
3373  IndCol(nnz) = A.IndexImag(i, j);
3374  Value(nnz) = T(0, A.ValueImag(i, j));
3375  nnz++;
3376  }
3377 
3378  Ptr(i+1) = nnz;
3379  }
3380 
3381  IndCol.Resize(nnz);
3382  Value.Resize(nnz);
3383  }
3384 
3385 
3387  template<class T, class Prop, class Alloc1, class Tint0,
3388  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3392  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3393  {
3394  int m = A.GetM();
3395  int n = A.GetN();
3396  long nnz = A.GetDataSize();
3397 
3398  // first we count the number of non-zero entries for each column
3399  Vector<int> NumNnzCol(m);
3400  NumNnzCol.Zero();
3401  for (int i = 0; i < n; i++)
3402  {
3403  int num_i = 0;
3404  int size_imag = A.GetImagRowSize(i);
3405  for (int j = 0; j < A.GetRealRowSize(i); j++)
3406  {
3407  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3408  {
3409  // imaginary part alone
3410  NumNnzCol(A.IndexImag(i, num_i))++;
3411  num_i++;
3412  }
3413 
3414  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3415  {
3416  // real and imaginary part are both present
3417  NumNnzCol(A.IndexReal(i, j))++;
3418  num_i++;
3419  }
3420  else
3421  NumNnzCol(A.IndexReal(i, j))++;
3422  }
3423 
3424  // last values of imaginary part
3425  for (int j = num_i; j < size_imag; j++)
3426  NumNnzCol(A.IndexImag(i, j))++;
3427  }
3428 
3429  // 'Ptr' array can be constructed
3430  Ptr.Reallocate(m+1);
3431  Ptr(0) = 0;
3432  for (int i = 0; i < m; i++)
3433  Ptr(i+1) = Ptr(i) + NumNnzCol(i);
3434 
3435  // total number of non-zero entries
3436  nnz = Ptr(m);
3437 
3438  // arrays 'IndRow' and 'Val' are filled already sorted by rows
3439  IndRow.Reallocate(nnz);
3440  Val.Reallocate(nnz);
3441  NumNnzCol.Zero();
3442  for (int i = 0; i < n; i++)
3443  {
3444  int num_i = 0, jcol = 0;
3445  int size_imag = A.GetImagRowSize(i);
3446  for (int j = 0; j < A.GetRealRowSize(i); j++)
3447  {
3448  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3449  {
3450  jcol = A.IndexImag(i, num_i);
3451  // imaginary part alone
3452  long num = Ptr(jcol) + NumNnzCol(jcol);
3453  IndRow(num) = i;
3454  Val(num) = T(0, A.ValueImag(i, num_i));
3455  NumNnzCol(jcol)++;
3456  num_i++;
3457  }
3458 
3459  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3460  {
3461  jcol = A.IndexReal(i, j);
3462  long num = Ptr(jcol) + NumNnzCol(jcol);
3463  // real and imaginary part are both present
3464  IndRow(num) = i;
3465  Val(num) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
3466  NumNnzCol(jcol)++;
3467  num_i++;
3468  }
3469  else
3470  {
3471  jcol = A.IndexReal(i, j);
3472  long num = Ptr(jcol) + NumNnzCol(jcol);
3473  // real part alone
3474  IndRow(num) = i;
3475  Val(num) = T(A.ValueReal(i, j), 0);
3476  NumNnzCol(jcol)++;
3477  }
3478  }
3479 
3480  // last values of imaginary part
3481  for (int j = num_i; j < size_imag; j++)
3482  {
3483  jcol = A.IndexImag(i, j);
3484  long num = Ptr(jcol) + NumNnzCol(jcol);
3485  IndRow(num) = i;
3486  Val(num) = T(0, A.ValueImag(i, j));
3487  NumNnzCol(jcol)++;
3488  }
3489  }
3490  }
3491 
3492 
3494  template<class T, class Prop, class Alloc1, class Tint0,
3495  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3499  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3500  {
3502 
3503  // this function sorts by row numbers
3504  // by symmetry, row numbers = col numbers, we invert the two arguments
3505  // to have sorted column numbers
3506  ConvertMatrix_to_Coordinates(A, IndCol, IndRow, Val, 0, true);
3507 
3508  int m = A.GetM();
3509  Ptr.Reallocate(m+1);
3510  Ptr.Zero();
3511 
3512  for (long i = 0; i < IndCol.GetM(); i++)
3513  Ptr(IndCol(i) + 1)++;
3514 
3515  // incrementing Ptr
3516  for (int i = 2; i <= m; i++)
3517  Ptr(i) += Ptr(i-1);
3518 
3519  }
3520 
3521 
3523  template<class T, class Prop, class Alloc1, class Tint0,
3524  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3529  bool sym_pat)
3530  {
3531  int n = A.GetN();
3532  if (n <= 0)
3533  {
3534  Ptr.Clear();
3535  IndCol.Clear();
3536  Value.Clear();
3537  return;
3538  }
3539 
3540  typedef typename ClassComplexType<T>::Treal Treal;
3541  Treal zero(0);
3542  long real_nnz = A.GetRealDataSize();
3543  long imag_nnz = A.GetImagDataSize();
3544 
3545  Ptr.Reallocate(n+1);
3546  IndCol.Reallocate(real_nnz + imag_nnz);
3547  Value.Reallocate(real_nnz + imag_nnz);
3548  long nnz = 0;
3549  Ptr(0) = 0;
3550  for (int i = 0; i < n; i++)
3551  {
3552  int num_i = 0;
3553  int size_imag = A.GetImagColumnSize(i);
3554  for (int j = 0; j < A.GetRealColumnSize(i); j++)
3555  {
3556  while ((num_i < size_imag) && (A.IndexImag(i, num_i) < A.IndexReal(i, j)))
3557  {
3558  // imaginary part alone
3559  IndCol(nnz) = A.IndexImag(i, num_i);
3560  Value(nnz) = T(0, A.ValueImag(i, num_i));
3561  nnz++; num_i++;
3562  }
3563 
3564  if ((num_i < size_imag) && (A.IndexImag(i, num_i) == A.IndexReal(i, j)))
3565  {
3566  // real and imaginary part are both present
3567  IndCol(nnz) = A.IndexReal(i, j);
3568  Value(nnz) = T(A.ValueReal(i, j), A.ValueImag(i, num_i));
3569  num_i++; nnz++;
3570  }
3571  else
3572  {
3573  // real part alone
3574  IndCol(nnz) = A.IndexReal(i, j);
3575  Value(nnz) = T(A.ValueReal(i, j), 0);
3576  nnz++;
3577  }
3578  }
3579 
3580  // last values of imaginary part
3581  for (int j = num_i; j < size_imag; j++)
3582  {
3583  IndCol(nnz) = A.IndexImag(i, j);
3584  Value(nnz) = T(0, A.ValueImag(i, j));
3585  nnz++;
3586  }
3587 
3588  Ptr(i+1) = nnz;
3589  }
3590 
3591  IndCol.Resize(nnz);
3592  Value.Resize(nnz);
3593  }
3594 
3595 
3597  template<class T, class Prop, class Alloc1, class Tint0,
3598  class Tint1, class Alloc2, class Alloc3, class Alloc4>
3602  Vector<T, VectFull, Alloc4>& Val, bool sym_pat)
3603  {
3604  // Matrix (m,n) with nnz entries.
3605  int m = A.GetN();
3606 
3607  // Conversion in coordinate format.
3608  // ConvertMatrix_to_Coordinate provides sorted numbers (by columns here)
3609  Vector<Tint1> IndCol;
3610  ConvertMatrix_to_Coordinates(A, IndRow, IndCol, Val, 0, true);
3611 
3612  // Constructing pointer array 'Ptr'.
3613  Ptr.Reallocate(m + 1);
3614  Ptr.Fill(0);
3615 
3616  // Counting non-zero entries per row.
3617  for (long i = 0; i < IndRow.GetM(); i++)
3618  Ptr(IndCol(i) + 1)++;
3619 
3620  // Accumulation to get pointer array.
3621  Ptr(0) = 0;
3622  for (int i = 0; i < m; i++)
3623  Ptr(i + 1) += Ptr(i);
3624  }
3625 
3626 
3628  template<class T0, class Prop0, class Allocator0,
3629  class T1, class Prop1, class Allocator1>
3630  void
3633  {
3634  Vector<long> Ptr; Vector<int> IndCol;
3636 
3637  General prop;
3638  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3639 
3640  int m = mat_array.GetM();
3641  int n = mat_array.GetN();
3642  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3643  }
3644 
3645 
3647  template<class T0, class Prop0, class Allocator0,
3648  class T1, class Prop1, class Allocator1>
3649  void
3652  {
3653  Vector<long> Ptr; Vector<int> IndCol;
3655 
3656  Symmetric prop;
3657  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3658 
3659  int m = mat_array.GetM();
3660  int n = mat_array.GetN();
3661  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3662  }
3663 
3664 
3666  template<class T0, class Prop0, class Allocator0,
3667  class T1, class Prop1, class Allocator1>
3668  void
3671  {
3672  Vector<long> Ptr; Vector<int> IndCol;
3674 
3675  General prop;
3676  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3677 
3678  int m = mat_array.GetM();
3679  int n = mat_array.GetN();
3680  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3681  }
3682 
3683 
3685  template<class T0, class Prop0, class Allocator0,
3686  class T1, class Prop1, class Allocator1>
3687  void
3690  {
3691  Vector<long> Ptr; Vector<int> IndCol;
3693 
3694  General prop;
3695  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3696 
3697  int m = mat_array.GetM();
3698  int n = mat_array.GetN();
3699  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3700  }
3701 
3702 
3704  template<class T0, class Prop0, class Allocator0,
3705  class T1, class Prop1, class Allocator1>
3706  void
3709  {
3710  Vector<long> Ptr; Vector<int> IndCol;
3712 
3713  Symmetric prop;
3714  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3715 
3716  int m = mat_array.GetM();
3717  int n = mat_array.GetN();
3718  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3719  }
3720 
3721 
3723  template<class T0, class Prop0, class Allocator0,
3724  class T1, class Prop1, class Allocator1>
3725  void
3728  {
3729  Vector<long> Ptr; Vector<int> IndCol;
3731 
3732  General prop;
3733  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3734 
3735  int m = mat_array.GetM();
3736  int n = mat_array.GetN();
3737  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3738  }
3739 
3740 
3742  template<class T0, class Prop0, class Allocator0,
3743  class T1, class Prop1, class Allocator1>
3744  void
3747  {
3748  Vector<long> Ptr; Vector<int> IndCol;
3750 
3751  General prop;
3752  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3753 
3754  int m = mat_array.GetM();
3755  int n = mat_array.GetN();
3756  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3757  }
3758 
3759 
3761  template<class T0, class Prop0, class Allocator0,
3762  class T1, class Prop1, class Allocator1>
3763  void
3766  {
3767  Vector<long> Ptr; Vector<int> IndCol;
3769 
3770  Symmetric prop;
3771  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3772 
3773  int m = mat_array.GetM();
3774  int n = mat_array.GetN();
3775  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3776  }
3777 
3778 
3780  template<class T0, class Prop0, class Allocator0,
3781  class T1, class Prop1, class Allocator1>
3782  void
3785  {
3786  Vector<long> Ptr; Vector<int> IndCol;
3788 
3789  General prop;
3790  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3791 
3792  int m = mat_array.GetM();
3793  int n = mat_array.GetN();
3794  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3795  }
3796 
3797 
3799  template<class T0, class Prop0, class Allocator0,
3800  class T1, class Prop1, class Allocator1>
3801  void
3804  {
3805  Vector<long> Ptr; Vector<int> IndCol;
3807 
3808  General prop;
3809  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3810 
3811  int m = mat_array.GetM();
3812  int n = mat_array.GetN();
3813  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3814  }
3815 
3816 
3818  template<class T0, class Prop0, class Allocator0,
3819  class T1, class Prop1, class Allocator1>
3820  void
3823  {
3824  Vector<long> Ptr; Vector<int> IndCol;
3826 
3827  Symmetric prop;
3828  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3829 
3830  int m = mat_array.GetM();
3831  int n = mat_array.GetN();
3832  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3833  }
3834 
3835 
3837  template<class T0, class Prop0, class Allocator0,
3838  class T1, class Prop1, class Allocator1>
3839  void
3842  {
3843  Vector<long> Ptr; Vector<int> IndCol;
3845 
3846  General prop;
3847  ConvertToCSR(mat_array, prop, Ptr, IndCol, Value);
3848 
3849  int m = mat_array.GetM();
3850  int n = mat_array.GetN();
3851  mat_csr.SetData(m, n, Value, Ptr, IndCol);
3852  }
3853 
3854 
3856  template<class T0, class Prop0, class Allocator0,
3857  class T1, class Prop1, class Allocator1>
3858  void
3861  {
3862  Vector<long> Ptr; Vector<int> IndRow;
3864 
3865  General prop;
3866  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3867 
3868  int m = A.GetM();
3869  int n = A.GetN();
3870  B.SetData(m, n, Value, Ptr, IndRow);
3871  }
3872 
3873 
3875  template<class T0, class Prop0, class Allocator0,
3876  class T1, class Prop1, class Allocator1>
3877  void
3880  {
3881  Vector<long> Ptr; Vector<int> IndRow;
3883 
3884  General prop;
3885  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3886 
3887  int m = A.GetM();
3888  int n = A.GetN();
3889  B.SetData(m, n, Value, Ptr, IndRow);
3890  }
3891 
3892 
3894  template<class T0, class Prop0, class Allocator0,
3895  class T1, class Prop1, class Allocator1>
3896  void
3899  {
3900  Vector<long> Ptr; Vector<int> IndRow;
3902 
3903  Symmetric prop;
3904  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3905 
3906  int m = A.GetM();
3907  int n = A.GetN();
3908  B.SetData(m, n, Value, Ptr, IndRow);
3909  }
3910 
3911 
3913  template<class T0, class Prop0, class Allocator0,
3914  class T1, class Prop1, class Allocator1>
3915  void
3918  {
3919  Vector<long> Ptr; Vector<int> IndRow;
3921 
3922  General prop;
3923  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3924 
3925  int m = A.GetM();
3926  int n = A.GetN();
3927  B.SetData(m, n, Value, Ptr, IndRow);
3928  }
3929 
3930 
3932  template<class T0, class Prop0, class Allocator0,
3933  class T1, class Prop1, class Allocator1>
3934  void
3937  {
3938  Vector<long> Ptr; Vector<int> IndRow;
3940 
3941  General prop;
3942  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3943 
3944  int m = A.GetM();
3945  int n = A.GetN();
3946  B.SetData(m, n, Value, Ptr, IndRow);
3947  }
3948 
3949 
3951  template<class T0, class Prop0, class Allocator0,
3952  class T1, class Prop1, class Allocator1>
3953  void
3956  {
3957  Vector<long> Ptr; Vector<int> IndRow;
3959 
3960  Symmetric prop;
3961  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3962 
3963  int m = A.GetM();
3964  int n = A.GetN();
3965  B.SetData(m, n, Value, Ptr, IndRow);
3966  }
3967 
3968 
3970  template<class T0, class Prop0, class Allocator0,
3971  class T1, class Prop1, class Allocator1>
3972  void
3975  {
3976  Vector<long> Ptr; Vector<int> IndRow;
3978 
3979  General prop;
3980  ConvertToCSC(A, prop, Ptr, IndRow, Value);
3981 
3982  int m = A.GetM();
3983  int n = A.GetN();
3984  B.SetData(m, n, Value, Ptr, IndRow);
3985  }
3986 
3987 
3989  template<class T0, class Prop0, class Allocator0,
3990  class T1, class Prop1, class Allocator1>
3991  void
3994  {
3995  Vector<long> Ptr; Vector<int> IndRow;
3997 
3998  General prop;
3999  ConvertToCSC(A, prop, Ptr, IndRow, Value);
4000 
4001  int m = A.GetM();
4002  int n = A.GetN();
4003  B.SetData(m, n, Value, Ptr, IndRow);
4004  }
4005 
4006 
4008  template<class T0, class Prop0, class Allocator0,
4009  class T1, class Prop1, class Allocator1>
4010  void
4013  {
4014  Vector<long> Ptr; Vector<int> IndRow;
4016 
4017  Symmetric prop;
4018  ConvertToCSC(A, prop, Ptr, IndRow, Value);
4019 
4020  int m = A.GetM();
4021  int n = A.GetN();
4022  B.SetData(m, n, Value, Ptr, IndRow);
4023  }
4024 
4025 
4027  template<class T0, class Prop0, class Allocator0,
4028  class T1, class Prop1, class Allocator1>
4029  void
4032  {
4033  Vector<long> Ptr; Vector<int> IndRow;
4035 
4036  General prop;
4037  ConvertToCSC(A, prop, Ptr, IndRow, Value);
4038 
4039  int m = A.GetM();
4040  int n = A.GetN();
4041  B.SetData(m, n, Value, Ptr, IndRow);
4042  }
4043 
4044 
4046  template<class T0, class Prop0, class Allocator0,
4047  class T1, class Prop1, class Allocator1>
4048  void
4051  {
4052  Vector<long> Ptr; Vector<int> IndRow;
4054 
4055  General prop;
4056  ConvertToCSC(A, prop, Ptr, IndRow, Value);
4057 
4058  int m = A.GetM();
4059  int n = A.GetN();
4060  B.SetData(m, n, Value, Ptr, IndRow);
4061  }
4062 
4063 
4065  template<class T0, class Prop0, class Allocator0,
4066  class T1, class Prop1, class Allocator1>
4067  void
4070  {
4071  Vector<long> Ptr; Vector<int> IndRow;
4073 
4074  Symmetric prop;
4075  ConvertToCSC(A, prop, Ptr, IndRow, Value);
4076 
4077  int m = A.GetM();
4078  int n = A.GetN();
4079  B.SetData(m, n, Value, Ptr, IndRow);
4080  }
4081 
4082 
4084  template<class T, class Prop, class Allocator>
4087  {
4088  B = A;
4089  }
4090 
4091 
4093  template<class T, class Prop, class Allocator>
4096  {
4097  B = A;
4098  }
4099 
4100 
4102  template<class T, class Prop, class Allocator>
4105  {
4106  B = A;
4107  }
4108 
4109 
4111  template<class T, class Prop, class Allocator>
4114  {
4115  B = A;
4116  }
4117 
4118 
4120  template<class T, class Prop, class Allocator>
4123  {
4124  B = A;
4125  }
4126 
4127 
4129  template<class T, class Prop, class Allocator>
4132  {
4133  B = A;
4134  }
4135 
4136 
4138  template<class T, class Prop, class Allocator>
4141  {
4142  B = A;
4143  }
4144 
4145 
4147  template<class T, class Prop, class Allocator>
4150  {
4151  B = A;
4152  }
4153 
4154 
4156  template<class T0, class Prop0, class Allocator0,
4157  class T1, class Prop1, class Allocator1>
4158  void
4161  {
4162  int m = A.GetM(), n = A.GetN();
4163  Vector<long> Ptr; Vector<int> Ind;
4165 
4166  General sym;
4167  ConvertToCSR(A, sym, Ptr, Ind, Value);
4168 
4169  // counting number of non-zero elements
4170  typedef typename ClassComplexType<T1>::Treal Treal;
4171  long imag_nnz = 0, real_nnz = 0;
4172  Treal zero(0);
4173  for (long i = 0; i < Value.GetM(); i++)
4174  {
4175  if (real(Value(i)) != zero)
4176  real_nnz++;
4177 
4178  if (imag(Value(i)) != zero)
4179  imag_nnz++;
4180  }
4181 
4182  Vector<long> Ptr_real(m+1), Ptr_imag(m+1);
4183  Vector<int> Ind_real(real_nnz), Ind_imag(imag_nnz);
4184  Vector<Treal, VectFull, Allocator1> Val_real(real_nnz), Val_imag(imag_nnz);
4185 
4186  // filling arrays Ind_real, Ind_imag, Val_real, Val_imag
4187  Ptr_real(0) = 0; Ptr_imag(0) = 0;
4188  real_nnz = 0; imag_nnz = 0;
4189  for (int i = 0; i < m; i++)
4190  {
4191  for (long j = Ptr(i); j < Ptr(i+1); j++)
4192  {
4193  if (real(Value(j)) != zero)
4194  {
4195  Ind_real(real_nnz) = Ind(j);
4196  Val_real(real_nnz) = real(Value(j));
4197  real_nnz++;
4198  }
4199 
4200  if (imag(Value(j)) != zero)
4201  {
4202  Ind_imag(imag_nnz) = Ind(j);
4203  Val_imag(imag_nnz) = imag(Value(j));
4204  imag_nnz++;
4205  }
4206  }
4207 
4208  Ptr_real(i+1) = real_nnz;
4209  Ptr_imag(i+1) = imag_nnz;
4210  }
4211 
4212 
4213  // creating the matrix
4214  B.SetData(m, n, Val_real, Ptr_real, Ind_real,
4215  Val_imag, Ptr_imag, Ind_imag);
4216  }
4217 
4218 
4220  template<class T0, class Prop0, class Allocator0,
4221  class T1, class Prop1, class Allocator1>
4222  void
4225  {
4226  int m = A.GetM();
4227  int n = A.GetN();
4228  long* ptr_ = A.GetPtr();
4229  int* ind_ = A.GetInd();
4230  T0* data_ = A.GetData();
4231  long nnz = A.GetDataSize();
4232 
4233  // counting number of non-zero elements
4234  long imag_nnz = 0, real_nnz = 0;
4235  typedef typename ClassComplexType<T1>::Treal Treal;
4236  Treal zero(0);
4237  for (long i = 0; i < nnz; i++)
4238  {
4239  if (real(data_[i]) != zero)
4240  real_nnz++;
4241 
4242  if (imag(data_[i]) != zero)
4243  imag_nnz++;
4244  }
4245 
4246  Vector<long> Ptr_real(n+1), Ptr_imag(n+1);
4247  Vector<int> Ind_real(real_nnz), Ind_imag(imag_nnz);
4248 
4249  Vector<Treal, VectFull, Allocator1> Val_real(real_nnz), Val_imag(imag_nnz);
4250 
4251  // filling arrays Ind_real, Ind_imag, Val_real, Val_imag
4252  Ptr_real(0) = 0; Ptr_imag(0) = 0;
4253  real_nnz = 0; imag_nnz = 0;
4254  for (int i = 0; i < n; i++)
4255  {
4256  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4257  {
4258  if (real(data_[j]) != zero)
4259  {
4260  Ind_real(real_nnz) = ind_[j];
4261  Val_real(real_nnz) = real(data_[j]);
4262  real_nnz++;
4263  }
4264 
4265  if (imag(data_[j]) != zero)
4266  {
4267  Ind_imag(imag_nnz) = ind_[j];
4268  Val_imag(imag_nnz) = imag(data_[j]);
4269  imag_nnz++;
4270  }
4271  }
4272 
4273  Ptr_real(i+1) = real_nnz;
4274  Ptr_imag(i+1) = imag_nnz;
4275  }
4276 
4277 
4278  // creating the matrix
4279  B.SetData(m, n, Val_real, Ptr_real, Ind_real,
4280  Val_imag, Ptr_imag, Ind_imag);
4281  }
4282 
4283 
4285  template<class T0, class Prop0, class Allocator0,
4286  class T1, class Prop1, class Allocator1>
4287  void
4290  {
4291  int m = A.GetM(), n = A.GetN();
4292  Vector<long> Ptr; Vector<int> Ind;
4294 
4295  Symmetric sym;
4296  ConvertToCSC(A, sym, Ptr, Ind, Value);
4297 
4298  // counting number of non-zero elements
4299  long imag_nnz = 0, real_nnz = 0;
4300  typedef typename ClassComplexType<T1>::Treal Treal;
4301  Treal zero(0);
4302  for (long i = 0; i < Value.GetM(); i++)
4303  {
4304  if (real(Value(i)) != zero)
4305  real_nnz++;
4306 
4307  if (imag(Value(i)) != zero)
4308  imag_nnz++;
4309  }
4310 
4311  Vector<long> Ptr_real(m+1), Ptr_imag(m+1);
4312  Vector<int> Ind_real(real_nnz), Ind_imag(imag_nnz);
4313 
4314  Vector<Treal, VectFull, Allocator1> Val_real(real_nnz), Val_imag(imag_nnz);
4315 
4316  // filling arrays Ind_real, Ind_imag, Val_real, Val_imag
4317  Ptr_real(0) = 0; Ptr_imag(0) = 0;
4318  real_nnz = 0; imag_nnz = 0;
4319  for (int i = 0; i < m; i++)
4320  {
4321  for (long j = Ptr(i); j < Ptr(i+1); j++)
4322  {
4323  if (real(Value(j)) != zero)
4324  {
4325  Ind_real(real_nnz) = Ind(j);
4326  Val_real(real_nnz) = real(Value(j));
4327  real_nnz++;
4328  }
4329 
4330  if (imag(Value(j)) != zero)
4331  {
4332  Ind_imag(imag_nnz) = Ind(j);
4333  Val_imag(imag_nnz) = imag(Value(j));
4334  imag_nnz++;
4335  }
4336  }
4337 
4338  Ptr_real(i+1) = real_nnz;
4339  Ptr_imag(i+1) = imag_nnz;
4340  }
4341 
4342 
4343  // creating the matrix
4344  B.SetData(m, n, Val_real, Ptr_real, Ind_real,
4345  Val_imag, Ptr_imag, Ind_imag);
4346  }
4347 
4348 
4350  template<class T0, class Prop0, class Allocator0,
4351  class T1, class Prop1, class Allocator1>
4352  void
4355  {
4356  int m = A.GetM();
4357  int n = A.GetN();
4358  long* ptr_ = A.GetPtr();
4359  int* ind_ = A.GetInd();
4360  T0* data_ = A.GetData();
4361  long nnz = A.GetDataSize();
4362 
4363  // counting number of non-zero elements
4364  long imag_nnz = 0, real_nnz = 0;
4365  typedef typename ClassComplexType<T1>::Treal Treal;
4366  Treal zero(0);
4367  for (long i = 0; i < nnz; i++)
4368  {
4369  if (real(data_[i]) != zero)
4370  real_nnz++;
4371 
4372  if (imag(data_[i]) != zero)
4373  imag_nnz++;
4374  }
4375 
4376  Vector<long> Ptr_real(n+1), Ptr_imag(n+1);
4377  Vector<int> Ind_real(real_nnz), Ind_imag(imag_nnz);
4378 
4379  Vector<Treal, VectFull, Allocator1> Val_real(real_nnz), Val_imag(imag_nnz);
4380 
4381  // filling arrays Ind_real, Ind_imag, Val_real, Val_imag
4382  Ptr_real(0) = 0; Ptr_imag(0) = 0;
4383  real_nnz = 0; imag_nnz = 0;
4384  for (int i = 0; i < n; i++)
4385  {
4386  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4387  {
4388  if (real(data_[j]) != zero)
4389  {
4390  Ind_real(real_nnz) = ind_[j];
4391  Val_real(real_nnz) = real(data_[j]);
4392  real_nnz++;
4393  }
4394 
4395  if (imag(data_[j]) != zero)
4396  {
4397  Ind_imag(imag_nnz) = ind_[j];
4398  Val_imag(imag_nnz) = imag(data_[j]);
4399  imag_nnz++;
4400  }
4401  }
4402 
4403  Ptr_real(i+1) = real_nnz;
4404  Ptr_imag(i+1) = imag_nnz;
4405  }
4406 
4407 
4408  // creating the matrix
4409  B.SetData(m, n, Val_real, Ptr_real, Ind_real,
4410  Val_imag, Ptr_imag, Ind_imag);
4411  }
4412 
4413 
4415  template<class T0, class Prop0, class Allocator0,
4416  class T1, class Prop1, class Allocator1>
4417  void
4420  {
4421  int m = A.GetM(), n = A.GetN();
4423  CopyMatrix(A, Ar);
4424 
4425  typedef typename ClassComplexType<T1>::Treal Treal;
4426  Treal zero(0);
4427  B.Reallocate(m, n);
4428  for (int i = 0; i < m; i++)
4429  {
4430  int size_real = 0, size_imag = 0;
4431  for (int j = 0; j < Ar.GetRowSize(i); j++)
4432  {
4433  if (real(Ar.Value(i, j)) != zero)
4434  size_real++;
4435 
4436  if (imag(Ar.Value(i, j)) != zero)
4437  size_imag++;
4438  }
4439 
4440  B.ReallocateRealRow(i, size_real);
4441  B.ReallocateImagRow(i, size_imag);
4442  size_real = 0;
4443  size_imag = 0;
4444  for (int j = 0; j < Ar.GetRowSize(i); j++)
4445  {
4446  if (real(Ar.Value(i, j)) != zero)
4447  {
4448  B.IndexReal(i, size_real) = Ar.Index(i, j);
4449  B.ValueReal(i, size_real) = real(Ar.Value(i, j));
4450  size_real++;
4451  }
4452 
4453  if (imag(Ar.Value(i, j)) != zero)
4454  {
4455  B.IndexImag(i, size_imag) = Ar.Index(i, j);
4456  B.ValueImag(i, size_imag) = imag(Ar.Value(i, j));
4457  size_imag++;
4458  }
4459  }
4460 
4461  Ar.ClearRow(i);
4462  }
4463  }
4464 
4465 
4467  template<class T0, class Prop0, class Allocator0,
4468  class T1, class Prop1, class Allocator1>
4469  void
4472  {
4473  int m = A.GetM();
4474  int n = A.GetN();
4475  long* ptr_ = A.GetPtr();
4476  int* ind_ = A.GetInd();
4477  T0* data_ = A.GetData();
4478 
4479  typedef typename ClassComplexType<T1>::Treal Treal;
4480  Treal zero(0);
4481  B.Reallocate(m, n);
4482  for (int i = 0; i < n; i++)
4483  {
4484  int size_real = 0, size_imag = 0;
4485  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4486  {
4487  if (real(data_[j]) != zero)
4488  size_real++;
4489 
4490  if (imag(data_[j]) != zero)
4491  size_imag++;
4492  }
4493 
4494  B.ReallocateRealColumn(i, size_real);
4495  B.ReallocateImagColumn(i, size_imag);
4496  size_real = 0;
4497  size_imag = 0;
4498  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4499  {
4500  if (real(data_[j]) != zero)
4501  {
4502  B.IndexReal(i, size_real) = ind_[j];
4503  B.ValueReal(i, size_real) = real(data_[j]);
4504  size_real++;
4505  }
4506 
4507  if (imag(data_[j]) != zero)
4508  {
4509  B.IndexImag(i, size_imag) = ind_[j];
4510  B.ValueImag(i, size_imag) = imag(data_[j]);
4511  size_imag++;
4512  }
4513  }
4514  }
4515  }
4516 
4517 
4519  template<class T0, class Prop0, class Allocator0,
4520  class T1, class Prop1, class Allocator1>
4521  void
4524  {
4525  int m = A.GetM(), n = A.GetN();
4527  CopyMatrix(A, Ar);
4528 
4529  typedef typename ClassComplexType<T1>::Treal Treal;
4530  Treal zero(0);
4531  B.Reallocate(m, n);
4532  for (int i = 0; i < m; i++)
4533  {
4534  int size_real = 0, size_imag = 0;
4535  for (int j = 0; j < Ar.GetColumnSize(i); j++)
4536  {
4537  if (real(Ar.Value(i, j)) != zero)
4538  size_real++;
4539 
4540  if (imag(Ar.Value(i, j)) != zero)
4541  size_imag++;
4542  }
4543 
4544  B.ReallocateRealColumn(i, size_real);
4545  B.ReallocateImagColumn(i, size_imag);
4546  size_real = 0;
4547  size_imag = 0;
4548  for (int j = 0; j < Ar.GetColumnSize(i); j++)
4549  {
4550  if (real(Ar.Value(i, j)) != zero)
4551  {
4552  B.IndexReal(i, size_real) = Ar.Index(i, j);
4553  B.ValueReal(i, size_real) = real(Ar.Value(i, j));
4554  size_real++;
4555  }
4556 
4557  if (imag(Ar.Value(i, j)) != zero)
4558  {
4559  B.IndexImag(i, size_imag) = Ar.Index(i, j);
4560  B.ValueImag(i, size_imag) = imag(Ar.Value(i, j));
4561  size_imag++;
4562  }
4563  }
4564 
4565  Ar.ClearColumn(i);
4566  }
4567  }
4568 
4569 
4571  template<class T0, class Prop0, class Allocator0,
4572  class T1, class Prop1, class Allocator1>
4573  void
4576  {
4577  int m = A.GetM();
4578  int n = A.GetN();
4579  long* ptr_ = A.GetPtr();
4580  int* ind_ = A.GetInd();
4581  T0* data_ = A.GetData();
4582 
4583  typedef typename ClassComplexType<T1>::Treal Treal;
4584  Treal zero(0);
4585  B.Reallocate(m, n);
4586  for (int i = 0; i < n; i++)
4587  {
4588  int size_real = 0, size_imag = 0;
4589  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4590  {
4591  if (real(data_[j]) != zero)
4592  size_real++;
4593 
4594  if (imag(data_[j]) != zero)
4595  size_imag++;
4596  }
4597 
4598  B.ReallocateRealRow(i, size_real);
4599  B.ReallocateImagRow(i, size_imag);
4600  size_real = 0;
4601  size_imag = 0;
4602  for (long j = ptr_[i]; j < ptr_[i+1]; j++)
4603  {
4604  if (real(data_[j]) != zero)
4605  {
4606  B.IndexReal(i, size_real) = ind_[j];
4607  B.ValueReal(i, size_real) = real(data_[j]);
4608  size_real++;
4609  }
4610 
4611  if (imag(data_[j]) != zero)
4612  {
4613  B.IndexImag(i, size_imag) = ind_[j];
4614  B.ValueImag(i, size_imag) = imag(data_[j]);
4615  size_imag++;
4616  }
4617  }
4618  }
4619  }
4620 
4621 
4623  template<class T0, class Prop0, class Allocator0,
4624  class T1, class Prop1, class Allocator1>
4625  void
4628  {
4629  int i, k;
4630 
4631  // Non-zero entries (real and imaginary part).
4632  long nnz_real = mat_array.GetRealDataSize();
4633  long nnz_imag = mat_array.GetImagDataSize();
4634  int m = mat_array.GetM();
4635  int n = mat_array.GetN();
4636 
4637  // Allocation of arrays for CSR.
4638  typedef typename ClassComplexType<T1>::Treal Treal;
4639  Vector<Treal, VectFull, Allocator1> Val_real(nnz_real), Val_imag(nnz_imag);
4640  Vector<long> IndRow_real(m + 1);
4641  Vector<long> IndRow_imag(m + 1);
4642  Vector<int> IndCol_real(nnz_real);
4643  Vector<int> IndCol_imag(nnz_imag);
4644 
4645  long ind_real = 0, ind_imag = 0;
4646  IndRow_real(0) = 0;
4647  IndRow_imag(0) = 0;
4648  // Loop over rows.
4649  for (i = 0; i < m; i++)
4650  {
4651  for (k = 0; k < mat_array.GetRealRowSize(i); k++)
4652  {
4653  IndCol_real(ind_real) = mat_array.IndexReal(i, k);
4654  Val_real(ind_real) = mat_array.ValueReal(i, k);
4655  ind_real++;
4656  }
4657 
4658  IndRow_real(i + 1) = ind_real;
4659  for (k = 0; k < mat_array.GetImagRowSize(i); k++)
4660  {
4661  IndCol_imag(ind_imag) = mat_array.IndexImag(i, k);
4662  Val_imag(ind_imag) = mat_array.ValueImag(i, k);
4663  ind_imag++;
4664  }
4665 
4666  IndRow_imag(i + 1) = ind_imag;
4667  }
4668 
4669  mat_csr.SetData(m, n, Val_real, IndRow_real, IndCol_real,
4670  Val_imag, IndRow_imag, IndCol_imag);
4671  }
4672 
4673 
4675  template<class T0, class Prop0, class Allocator0,
4676  class T1, class Prop1, class Allocator1>
4677  void
4678  CopyMatrix(const Matrix<T0, Prop0,
4679  ArrayRowSymComplexSparse, Allocator0>& mat_array,
4681  {
4682  int i, k;
4683 
4684  // Non-zero entries (real and imaginary part).
4685  long nnz_real = mat_array.GetRealDataSize();
4686  long nnz_imag = mat_array.GetImagDataSize();
4687  int m = mat_array.GetM();
4688 
4689  // Allocation of arrays for CSR.
4690  typedef typename ClassComplexType<T1>::Treal Treal;
4691  Vector<Treal, VectFull, Allocator1> Val_real(nnz_real), Val_imag(nnz_imag);
4692  Vector<long> IndRow_real(m + 1);
4693  Vector<long> IndRow_imag(m + 1);
4694  Vector<int> IndCol_real(nnz_real);
4695  Vector<int> IndCol_imag(nnz_imag);
4696 
4697  long ind_real = 0, ind_imag = 0;
4698  IndRow_real(0) = 0;
4699  IndRow_imag(0) = 0;
4700  // Loop over rows.
4701  for (i = 0; i < m; i++)
4702  {
4703  for (k = 0; k < mat_array.GetRealRowSize(i); k++)
4704  {
4705  IndCol_real(ind_real) = mat_array.IndexReal(i, k);
4706  Val_real(ind_real) = mat_array.ValueReal(i, k);
4707  ind_real++;
4708  }
4709 
4710  IndRow_real(i + 1) = ind_real;
4711  for (int k = 0; k < mat_array.GetImagRowSize(i); k++)
4712  {
4713  IndCol_imag(ind_imag) = mat_array.IndexImag(i, k);
4714  Val_imag(ind_imag) = mat_array.ValueImag(i, k);
4715  ind_imag++;
4716  }
4717 
4718  IndRow_imag(i + 1) = ind_imag;
4719  }
4720 
4721  mat_csr.SetData(m, m, Val_real, IndRow_real, IndCol_real,
4722  Val_imag, IndRow_imag, IndCol_imag);
4723  }
4724 
4725 
4727  template<class T0, class Prop0, class Allocator0,
4728  class T1, class Prop1, class Allocator1>
4729  void
4732  {
4733  Vector<int> IndRow, IndCol;
4735 
4736  // ConvertMatrix_to_Coordinates already sorts by rows
4737  ConvertMatrix_to_Coordinates(mat_array, IndRow, IndCol, Value, 0, true);
4738 
4739  int m = mat_array.GetM();
4740  int n = mat_array.GetN();
4741  mat_csr.Reallocate(m, n);
4742  long k = 0;
4743  for (int i = 0; i < m; i++)
4744  {
4745  long k0 = k;
4746  while ((k < IndRow.GetM()) && (IndRow(k) <= i))
4747  k++;
4748 
4749  int size_row = k - k0;
4750  if (size_row > 0)
4751  {
4752  mat_csr.ReallocateRow(i, size_row);
4753  for (int j = 0; j < size_row; j++)
4754  {
4755  mat_csr.Index(i, j) = IndCol(k0 + j);
4756  mat_csr.Value(i, j) = Value(k0 + j);
4757  }
4758  }
4759  else
4760  mat_csr.ClearRow(i);
4761  }
4762  }
4763 
4764 
4765 
4767  template<class T0, class Prop0, class Allocator0,
4768  class T1, class Prop1, class Allocator1>
4769  void
4772  {
4773  int m = A.GetM();
4774  int n = A.GetN();
4775  B.Reallocate(m, n);
4776  Vector<T0> value(n);
4777  Vector<int> col_num(n);
4778  for (int i = 0; i < m; i++)
4779  {
4780  int size_real = A.GetRealRowSize(i);
4781  int size_imag = A.GetImagRowSize(i);
4782  int jr = 0, ji = 0;
4783  int size_row = 0;
4784  while (jr < size_real)
4785  {
4786  int col = A.IndexReal(i, jr);
4787  while ((ji < size_imag) && (A.IndexImag(i, ji) < col))
4788  {
4789  col_num(size_row) = A.IndexImag(i, ji);
4790  value(size_row) = T0(0, A.ValueImag(i, ji));
4791  ji++; size_row++;
4792  }
4793 
4794  if ((ji < size_imag) && (A.IndexImag(i, ji) == col))
4795  {
4796  col_num(size_row) = col;
4797  value(size_row) = T0(A.ValueReal(i, jr),
4798  A.ValueImag(i, ji));
4799  ji++; size_row++;
4800  }
4801  else
4802  {
4803  col_num(size_row) = col;
4804  value(size_row) = T0(A.ValueReal(i, jr), 0);
4805  size_row++;
4806  }
4807 
4808  jr++;
4809  }
4810 
4811  while (ji < size_imag)
4812  {
4813  col_num(size_row) = A.IndexImag(i, ji);
4814  value(size_row) = T0(0, A.ValueImag(i, ji));
4815  ji++; size_row++;
4816  }
4817 
4818  B.ReallocateRow(i, size_row);
4819  for (int j = 0; j < size_row; j++)
4820  {
4821  B.Index(i, j) = col_num(j);
4822  B.Value(i, j) = value(j);
4823  }
4824  }
4825  }
4826 
4827 
4829  template<class T0, class Prop0, class Allocator0,
4830  class T1, class Prop1, class Allocator1>
4831  void
4834  {
4835  int m = A.GetM();
4836  int n = A.GetN();
4837  B.Reallocate(m, n);
4838  Vector<T0> value(n);
4839  Vector<int> col_num(n);
4840  for (int i = 0; i < m; i++)
4841  {
4842  int size_real = A.GetRealRowSize(i);
4843  int size_imag = A.GetImagRowSize(i);
4844  int jr = 0, ji = 0;
4845  int size_row = 0;
4846  while (jr < size_real)
4847  {
4848  int col = A.IndexReal(i, jr);
4849  while ((ji < size_imag) && (A.IndexImag(i, ji) < col))
4850  {
4851  col_num(size_row) = A.IndexImag(i, ji);
4852  value(size_row) = T0(0, A.ValueImag(i, ji));
4853  ji++; size_row++;
4854  }
4855 
4856  if ((ji < size_imag) && (A.IndexImag(i, ji) == col))
4857  {
4858  col_num(size_row) = col;
4859  value(size_row) = T0(A.ValueReal(i, jr),
4860  A.ValueImag(i, ji));
4861  ji++; size_row++;
4862  }
4863  else
4864  {
4865  col_num(size_row) = col;
4866  value(size_row) = T0(A.ValueReal(i, jr), 0);
4867  size_row++;
4868  }
4869 
4870  jr++;
4871  }
4872 
4873  while (ji < size_imag)
4874  {
4875  col_num(size_row) = A.IndexImag(i, ji);
4876  value(size_row) = T0(0, A.ValueImag(i, ji));
4877  ji++; size_row++;
4878  }
4879 
4880  B.ReallocateRow(i, size_row);
4881  for (int j = 0; j < size_row; j++)
4882  {
4883  B.Index(i, j) = col_num(j);
4884  B.Value(i, j) = value(j);
4885  }
4886  }
4887  }
4888 
4889 
4891  template<class T0, class Prop0, class Allocator0,
4892  class T1, class Prop1, class Allocator1>
4893  void
4896  {
4897  Vector<int> IndRow, IndCol;
4899 
4900  // ConvertMatrix_to_Coordinates already sorts by rows
4901  ConvertMatrix_to_Coordinates(mat_array, IndRow, IndCol, Value, 0, true);
4902 
4903  int m = mat_array.GetM();
4904  int n = mat_array.GetN();
4905  mat_csr.Reallocate(m, n);
4906  long k = 0;
4907  for (int i = 0; i < m; i++)
4908  {
4909  long k0 = k;
4910  while ((k < IndRow.GetM()) && (IndRow(k) <= i))
4911  k++;
4912 
4913  int size_row = k - k0;
4914  if (size_row > 0)
4915  {
4916  mat_csr.ReallocateRow(i, size_row);
4917  for (int j = 0; j < size_row; j++)
4918  {
4919  mat_csr.Index(i, j) = IndCol(k0 + j);
4920  mat_csr.Value(i, j) = Value(k0 + j);
4921  }
4922  }
4923  else
4924  mat_csr.ClearRow(i);
4925  }
4926  }
4927 
4928 
4930  template<class T0, class Prop0, class Allocator0,
4931  class T1, class Prop1, class Allocator1>
4932  void
4935  {
4936  typedef typename ClassComplexType<T0>::Treal Treal;
4937  int m = A.GetM();
4938  int n = A.GetN();
4939  long* ptr_real = A.GetRealPtr();
4940  int* ind_real = A.GetRealInd();
4941  Treal* data_real = A.GetRealData();
4942  long* ptr_imag = A.GetImagPtr();
4943  int* ind_imag = A.GetImagInd();
4944  Treal* data_imag = A.GetImagData();
4945  B.Reallocate(m, n);
4946  Vector<T0> value(n);
4947  Vector<int> col_num(n);
4948  for (int i = 0; i < m; i++)
4949  {
4950  long jr = ptr_real[i], ji = ptr_imag[i];
4951  int size_row = 0;
4952  while (jr < ptr_real[i+1])
4953  {
4954  int col = ind_real[jr];
4955  while ((ji < ptr_imag[i+1]) && (ind_imag[ji] < col))
4956  {
4957  col_num(size_row) = ind_imag[ji];
4958  value(size_row) = T0(0, data_imag[ji]);
4959  ji++; size_row++;
4960  }
4961 
4962  if ((ji < ptr_imag[i+1]) && (ind_imag[ji] == col))
4963  {
4964  col_num(size_row) = col;
4965  value(size_row) = T0(data_real[jr],
4966  data_imag[ji]);
4967  ji++; size_row++;
4968  }
4969  else
4970  {
4971  col_num(size_row) = col;
4972  value(size_row) = T0(data_real[jr], 0);
4973  size_row++;
4974  }
4975 
4976  jr++;
4977  }
4978 
4979  while (ji < ptr_imag[i+1])
4980  {
4981  col_num(size_row) = ind_imag[ji];
4982  value(size_row) = T0(0, data_imag[ji]);
4983  ji++; size_row++;
4984  }
4985 
4986  B.ReallocateRow(i, size_row);
4987  for (int j = 0; j < size_row; j++)
4988  {
4989  B.Index(i, j) = col_num(j);
4990  B.Value(i, j) = value(j);
4991  }
4992  }
4993  }
4994 
4995 
4997  template<class T0, class Prop0, class Allocator0,
4998  class T1, class Prop1, class Allocator1>
4999  void
5002  {
5003  typedef typename ClassComplexType<T0>::Treal Treal;
5004  int m = A.GetM();
5005  int n = A.GetN();
5006  long* ptr_real = A.GetRealPtr();
5007  int* ind_real = A.GetRealInd();
5008  Treal* data_real = A.GetRealData();
5009  long* ptr_imag = A.GetImagPtr();
5010  int* ind_imag = A.GetImagInd();
5011  Treal* data_imag = A.GetImagData();
5012  B.Reallocate(m, n);
5013  Vector<T0> value(n);
5014  Vector<int> col_num(n);
5015  for (int i = 0; i < m; i++)
5016  {
5017  long jr = ptr_real[i], ji = ptr_imag[i];
5018  int size_row = 0;
5019  while (jr < ptr_real[i+1])
5020  {
5021  int col = ind_real[jr];
5022  while ((ji < ptr_imag[i+1]) && (ind_imag[ji] < col))
5023  {
5024  col_num(size_row) = ind_imag[ji];
5025  value(size_row) = T0(0, data_imag[ji]);
5026  ji++; size_row++;
5027  }
5028 
5029  if ((ji < ptr_imag[i+1]) && (ind_imag[ji] == col))
5030  {
5031  col_num(size_row) = col;
5032  value(size_row) = T0(data_real[jr],
5033  data_imag[ji]);
5034  ji++; size_row++;
5035  }
5036  else
5037  {
5038  col_num(size_row) = col;
5039  value(size_row) = T0(data_real[jr], 0);
5040  size_row++;
5041  }
5042 
5043  jr++;
5044  }
5045 
5046  while (ji < ptr_imag[i+1])
5047  {
5048  col_num(size_row) = ind_imag[ji];
5049  value(size_row) = T0(0, data_imag[ji]);
5050  ji++; size_row++;
5051  }
5052 
5053  B.ReallocateRow(i, size_row);
5054  for (int j = 0; j < size_row; j++)
5055  {
5056  B.Index(i, j) = col_num(j);
5057  B.Value(i, j) = value(j);
5058  }
5059  }
5060  }
5061 
5062 }
5063 
5064 
5065 #define SELDON_FILE_MATRIX_COMPLEX_CONVERSIONS_CXX
5066 #endif
Seldon::Matrix< T, Prop, ColSymComplexSparse, Allocator >
Column-major complex sparse-matrix class.
Definition: Matrix_SymComplexSparse.hxx:288
Seldon::RowComplexSparse
Definition: Storage.hxx:416
Seldon::ArrayColSymComplexSparse
Definition: Storage.hxx:458
Seldon::ArrayColComplexSparse
Definition: Storage.hxx:454
Seldon::Vector
Definition: SeldonHeader.hxx:207
Seldon::Matrix
Definition: SeldonHeader.hxx:226
Seldon::Matrix< T, Prop, ArrayColSymComplexSparse, Allocator >
Column-major symmetric sparse-matrix class.
Definition: Matrix_ArrayComplexSparse.hxx:430
Seldon::RowSymComplexSparse
Definition: Storage.hxx:436
Seldon::ArrayRowComplexSparse
Definition: Storage.hxx:446
Seldon::ColComplexSparse
Definition: Storage.hxx:406
Seldon::Undefined
Definition: Errors.hxx:62
Seldon::Matrix< T, Prop, ColComplexSparse, Allocator >
Column-major sparse-matrix class.
Definition: Matrix_ComplexSparse.hxx:289
Seldon::General
Definition: Properties.hxx:26
Seldon::Matrix< T, Prop, ArrayRowSymComplexSparse, Allocator >
Row-major symmetric sparse-matrix class.
Definition: Matrix_ArrayComplexSparse.hxx:492
Seldon::Matrix< T, Prop, ArrayRowComplexSparse, Allocator >
Row-major sparse-matrix class.
Definition: Matrix_ArrayComplexSparse.hxx:380
Seldon::Matrix< T, Prop, ArrayColComplexSparse, Allocator >
Column-major sparse-matrix class.
Definition: Matrix_ArrayComplexSparse.hxx:332
Seldon::ArrayRowSymComplexSparse
Definition: Storage.hxx:450
Seldon::Symmetric
Definition: Properties.hxx:30
Seldon::Matrix< T, Prop, RowComplexSparse, Allocator >
Row-major sparse-matrix class.
Definition: Matrix_ComplexSparse.hxx:319
Seldon
Seldon namespace.
Definition: Array.cxx:24
Seldon::ColSymComplexSparse
Definition: Storage.hxx:426
Seldon::Matrix< T, Prop, RowSymComplexSparse, Allocator >
Row-major complex sparse-matrix class.
Definition: Matrix_SymComplexSparse.hxx:317