FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
power_row_matrix.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/lafem/power_vector.hpp>
10#include <kernel/lafem/sparse_layout.hpp>
11#include <kernel/lafem/meta_element.hpp>
12#include <kernel/lafem/container.hpp>
13
14
15#include <fstream>
16
17namespace FEAT
18{
19 namespace LAFEM
20 {
35 template<
36 typename SubType_,
37 int blocks_>
39 {
40 // Note: the case = 1 is specialized below
41 static_assert(blocks_ > 1, "invalid block size");
42
43 // declare this class template as a friend for recursive inheritance
44 template<typename, int>
45 friend class PowerRowMatrix;
46
48 typedef PowerRowMatrix<SubType_, blocks_-1> RestClass;
49
50 public:
52 typedef SubType_ SubMatrixType;
54 typedef typename SubMatrixType::DataType DataType;
56 typedef typename SubMatrixType::IndexType IndexType;
58 static constexpr SparseLayoutId layout_id = SubMatrixType::layout_id;
60 typedef typename SubMatrixType::VectorTypeL VectorTypeL;
64 template <typename DT2_ = DataType, typename IT2_ = IndexType>
66
68 static constexpr int num_row_blocks = 1;
70 static constexpr int num_col_blocks = blocks_;
71
72 protected:
77
79 explicit PowerRowMatrix(SubMatrixType&& the_first, RestClass&& the_rest) :
80 _first(std::move(the_first)),
81 _rest(std::move(the_rest))
82 {
83 }
84
85 public:
88 {
89 }
90
93 _first(layout),
94 _rest(layout)
95 {
96 }
97
100 _first(std::move(other._first)),
101 _rest(std::move(other._rest))
102 {
103 }
104
113 explicit PowerRowMatrix(FileMode mode, String filename)
114 {
115 read_from(mode, filename);
116 }
117
128 explicit PowerRowMatrix(FileMode mode, std::istream& file, String directory = "")
129 {
130 String line;
131 do {
132 if (file.eof())
133 XABORTM("Wrong Input-file");
134 std::getline(file, line);
135 line.trim_me();
136 } while (line.find("%%") == 0 || line == "");
137
138 SubMatrixType tmp_first(mode, directory + line);
139 _first = std::move(tmp_first);
140
141 RestClass tmp_rest(mode, file, directory);
142 _rest = std::move(tmp_rest);
143 }
144
151 void read_from(FileMode mode, String filename)
152 {
153 String directory;
154 auto found = filename.rfind("/");
155 if (found != std::string::npos)
156 {
157 directory = filename.substr(0, found + 1);
158 }
159
160 std::ifstream file(filename.c_str(), std::ifstream::in);
161 if (! file.is_open())
162 XABORTM("Unable to open Matrix file " + filename);
163
164 String line;
165 std::getline(file, line);
166 if (line.find("%%MatrixMarket powerrowmatrix coordinate real general") == String::npos)
167 XABORTM("Input-file is not a complatible file");
168
169 PowerRowMatrix other(mode, file, directory);
170
171 _first = std::move(other._first);
172 _rest = std::move(other._rest);
173
174 file.close();
175 }
176
179 {
180 if(this != &other)
181 {
182 _first = std::move(other._first);
183 _rest = std::move(other._rest);
184 }
185 return *this;
186 }
187
192
195 {
196 }
197
204 void write_out(FileMode mode, String filename) const
205 {
206 std::ofstream file(filename.c_str(), std::ofstream::out);
207 if (! file.is_open())
208 XABORTM("Unable to open Matrix file " + filename);
209
210 String suffix, directory;
211 auto found = filename.rfind(".");
212 if (found != std::string::npos)
213 {
214 suffix = filename.substr(found);
215 filename.erase(found);
216 }
217 found = filename.rfind("/");
218 if (found != std::string::npos)
219 {
220 directory = filename.substr(0, found + 1);
221 filename.erase(0, found + 1);
222 }
223
224 file << "%%MatrixMarket powerrowmatrix coordinate real general\n";
225 for (Index i(1); i <= blocks_; ++i)
226 {
227 file << filename << "_pr" << i << suffix << "\n";
228 }
229
230 file.close();
231
232 this->write_out_submatrices(mode, directory, filename, suffix);
233 }
234
243 void write_out_submatrices(FileMode mode, String directory, String prefix, String suffix, Index length = blocks_) const
244 {
245 _first.write_out(mode, directory + prefix + "_pr" + stringify(length + 1 - blocks_) + suffix);
246 _rest.write_out_submatrices(mode, directory, prefix, suffix, length);
247 }
248
253 {
254 return PowerRowMatrix(_first.clone(mode), _rest.clone(mode));
255 }
256
258 std::size_t bytes() const
259 {
260 return _first.bytes() + _rest.bytes();
261 }
262
275 template<int i_, int j_>
277 {
278 static_assert(i_ == 0, "invalid sub-matrix index");
279 static_assert((0 <= j_) && (j_ < blocks_), "invalid sub-matrix index");
281 }
282
284 template<int i_, int j_>
285 const SubMatrixType& at() const
286 {
287 static_assert(i_ == 0, "invalid sub-matrix index");
288 static_assert((0 <= j_) && (j_ < blocks_), "invalid sub-matrix index");
290 }
291
301 SubMatrixType& get(int i, int j)
302 {
303 XASSERTM((i == 0) && (0 <= j) && (j < blocks_), "invalid sub-matrix index");
304 return (j == 0) ? _first : _rest.get(i, j-1);
305 }
306
308 const SubMatrixType& get(int i, int j) const
309 {
310 XASSERTM((i == 0) && (0 <= j) && (j < blocks_), "invalid sub-matrix index");
311 return (j == 0) ? _first : _rest.get(i, j-1);
312 }
313
315 SubMatrixType& first()
316 {
317 return _first;
318 }
319
320 const SubMatrixType& first() const
321 {
322 return _first;
323 }
324
325 RestClass& rest()
326 {
327 return _rest;
328 }
329
330 const RestClass& rest() const
331 {
332 return _rest;
333 }
334
335 int row_blocks() const
336 {
337 return num_row_blocks;
338 }
339
340 int col_blocks() const
341 {
342 return num_col_blocks;
343 }
345
352 template <Perspective perspective_ = Perspective::native>
353 Index rows() const
354 {
355 return first().template rows<perspective_>();
356 }
357
364 template <Perspective perspective_ = Perspective::native>
366 {
367 return first().template columns<perspective_>() + rest().template columns<perspective_>();
368 }
369
376 template <Perspective perspective_ = Perspective::native>
378 {
379 return first().template used_elements<perspective_>() + rest().template used_elements<perspective_>();
380 }
381
383 static String name()
384 {
385 return String("PowerRowMatrix<") + SubMatrixType::name() + "," + stringify(blocks_) + ">";
386 }
387
388 template <Perspective perspective_ = Perspective::native>
389 Index size() const
390 {
391 return rows(perspective_) * columns(perspective_);
392 }
393
401 {
402 first().format(value);
403 rest().format(value);
404 }
405
409 void clear()
410 {
411 first().clear();
412 rest().clear();
413 }
414
427 void apply(VectorTypeL& r, const VectorTypeR& x) const
428 {
429 first().apply(r, x.first());
430 rest().apply(r, x.rest(), r, DataType(1));
431 }
432
434 {
435 XASSERTM(r.size() == this->rows(), "Vector size of r does not match!");
436 XASSERTM(x.size() == this->columns(), "Vector size of x does not match!");
437
438 DenseVector<DataType, IndexType> x_first(x, first().columns(), 0);
439 DenseVector<DataType, IndexType> x_rest(x, rest().columns(), first().columns());
440
441 first().apply(r, x_first);
442 rest().apply(r, x_rest, r, DataType(1));
443 }
444
457 void apply_transposed(VectorTypeR& r, const VectorTypeL& x) const
458 {
459 first().apply_transposed(r.first(), x);
460 rest().apply_transposed(r.rest(), x);
461 }
462
464 {
465 XASSERTM(r.size() == this->columns(), "Vector size of r does not match!");
466 XASSERTM(x.size() == this->rows(), "Vector size of x does not match!");
467
468 DenseVector<DataType, IndexType> r_first(r, first().columns(), 0);
469 DenseVector<DataType, IndexType> r_rest(r, rest().columns(), first().columns());
470
471 first().apply_transposed(r_first, x);
472 rest().apply_transposed(r_rest, x);
473 }
474
491 void apply(VectorTypeL& r, const VectorTypeR& x, const VectorTypeL& y, DataType alpha = DataType(1)) const
492 {
493 first().apply(r, x.first(), y, alpha);
494 rest().apply(r, x.rest(), r, alpha);
495 }
496
498 const DenseVector<DataType , IndexType>& y, DataType alpha = DataType(1)) const
499 {
500 XASSERTM(r.size() == this->rows(), "Vector size of r does not match!");
501 XASSERTM(x.size() == this->columns(), "Vector size of x does not match!");
502 XASSERTM(y.size() == this->rows(), "Vector size of y does not match!");
503
504 DenseVector<DataType, IndexType> x_first(x, first().columns(), 0);
505 DenseVector<DataType, IndexType> x_rest(x, rest().columns(), first().columns());
506
507 first().apply(r, x_first, y, alpha);
508 rest().apply(r, x_rest, r, alpha);
509 }
510
527 void apply_transposed(VectorTypeR& r, const VectorTypeL& x, const VectorTypeR& y, DataType alpha = DataType(1)) const
528 {
529 first().apply_transposed(r.first(), x, y.first(), alpha);
530 rest().apply_transposed(r.rest(), x, y.rest(), alpha);
531 }
532
534 const DenseVector<DataType , IndexType>& y, DataType alpha = DataType(1)) const
535 {
536 XASSERTM(r.size() == this->columns(), "Vector size of r does not match!");
537 XASSERTM(x.size() == this->rows(), "Vector size of x does not match!");
538 XASSERTM(y.size() == this->columns(), "Vector size of y does not match!");
539
540 DenseVector<DataType, IndexType> r_first(r, first().columns(), 0);
541 DenseVector<DataType, IndexType> r_rest(r, rest().columns(), first().columns());
542
543 DenseVector<DataType, IndexType> y_first(y, first().columns(), 0);
544 DenseVector<DataType, IndexType> y_rest(y, rest().columns(), first().columns());
545
546 first().apply(r_first, x, y_first, alpha);
547 rest().apply(r_rest, x, y_rest, alpha);
548 }
549
557 {
558 DataType max_rel_diff = Math::max(this->first().max_rel_diff(x.first()), this->rest().max_rel_diff(x.rest()));
559 return max_rel_diff;
560 }
561
570 bool same_layout(const PowerRowMatrix& x) const
571 {
572 return (this->name() == x.name()) && (this->first().same_layout(x.first())) && (this->rest().same_layout(x.rest()));
573 }
574
577 {
578 return first().create_vector_l();
579 }
580
583 {
584 return VectorTypeR(first().create_vector_r(), rest().create_vector_r());
585 }
586
589 {
590 return this->first().get_length_of_line(row) + this->rest().get_length_of_line(row);
591 }
592
595 void set_line(const Index row, DataType * const pval_set, IndexType * const pcol_set,
596 const Index col_start, const Index stride = 1) const
597 {
598 const Index length_of_base(this->first().get_length_of_line(row));
599
600 this->first().set_line(row, pval_set, pcol_set, col_start, stride);
601 this->rest().set_line(row, pval_set + stride * length_of_base, pcol_set + stride * length_of_base, col_start + this->first().template columns<Perspective::pod>(), stride);
602 }
603
604 void set_line_reverse(const Index row, const DataType * const pval_set, const Index stride = 1)
605 {
606 const Index length_of_base(this->first().get_length_of_line(row));
607
608 this->first().set_line_reverse(row, pval_set, stride);
609 this->rest().set_line_reverse(row, pval_set + stride * length_of_base, stride);
610 }
612
614 std::uint64_t get_checkpoint_size(SerialConfig& config)
615 {
616 return sizeof(std::uint64_t) + _first.get_checkpoint_size(config) + _rest.get_checkpoint_size(config); //sizeof(std::uint64_t) bits needed to store lenght of checkpointed _first
617 }
618
620 void restore_from_checkpoint_data(std::vector<char> & data)
621 {
622 std::uint64_t isize = *(std::uint64_t*) data.data(); //get size of checkpointed _first
623 std::vector<char>::iterator start = std::begin(data) + sizeof(std::uint64_t);
624 std::vector<char>::iterator last_of_first = std::begin(data) + sizeof(std::uint64_t) + (int) isize;
625 std::vector<char> buffer_first(start, last_of_first);
626 _first.restore_from_checkpoint_data(buffer_first);
627
628 data.erase(std::begin(data), last_of_first);
630 }
631
633 std::uint64_t set_checkpoint_data(std::vector<char>& data, SerialConfig& config)
634 {
635 std::size_t old_size = data.size();
636 data.insert(std::end(data), sizeof(std::uint64_t), 0); //add placeholder
637 std::uint64_t ireal_size = _first.set_checkpoint_data(data, config); //add data of _first to the overall checkpoint and save its size
638 char* csize = reinterpret_cast<char*>(&ireal_size);
639 for(std::size_t i(0) ; i < sizeof(std::uint64_t) ; ++i) //overwrite the guessed datalength
640 {
641 data[old_size +i] = csize[i];
642 }
643
644 return sizeof(std::uint64_t) + ireal_size + _rest.set_checkpoint_data(data, config); //generate and add checkpoint data for the _rest
645 }
646
654 template <typename SubType2_>
656 {
657 this->first().convert(other.first());
658 this->rest().convert(other.rest());
659 }
660
661 template <typename SubType2_>
662 void convert_reverse(PowerRowMatrix<SubType2_, blocks_> & other) const
663 {
664 this->first().convert_reverse(other.first());
665 this->rest().convert_reverse(other.rest());
666 }
667 };
668
670 template<typename SubType_>
671 class PowerRowMatrix<SubType_, 1>
672 {
673 template<typename, int>
674 friend class PowerRowMatrix;
675
676 public:
677 typedef SubType_ SubMatrixType;
678 typedef typename SubMatrixType::DataType DataType;
679 typedef typename SubMatrixType::IndexType IndexType;
681 static constexpr SparseLayoutId layout_id = SubMatrixType::layout_id;
683 typedef typename SubMatrixType::VectorTypeL VectorTypeL;
685 typedef PowerVector<typename SubMatrixType::VectorTypeR, 1> VectorTypeR;
687 template <typename DT2_ = DataType, typename IT2_ = IndexType>
688 using ContainerType = PowerRowMatrix<typename SubType_::template ContainerType<DT2_, IT2_>, 1>;
689
690 static constexpr int num_row_blocks = 1;
691 static constexpr int num_col_blocks = 1;
692
693 protected:
695
697 explicit PowerRowMatrix(SubMatrixType&& the_first) :
698 _first(std::move(the_first))
699 {
700 }
701
702 public:
704 PowerRowMatrix()
705 {
706 }
707
709 explicit PowerRowMatrix(const SparseLayout<IndexType, layout_id>& layout) :
710 _first(layout)
711 {
712 }
713
715 PowerRowMatrix(PowerRowMatrix&& other) :
716 _first(std::move(other._first))
717 {
718 }
719
721 explicit PowerRowMatrix(FileMode mode, const String& filename)
722 {
723 read_from(mode, filename);
724 }
725
727 explicit PowerRowMatrix(FileMode mode, std::istream& file, const String& directory = "")
728 {
729 String line;
730 do {
731 if (file.eof())
732 XABORTM("Wrong Input-file");
733 std::getline(file, line);
734 line.trim_me();
735 } while (line.find("%%") == 0 || line == "");
736
737 SubMatrixType tmp_first(mode, directory + line);
738 _first = std::move(tmp_first);
739 }
740
741 void read_from(FileMode mode, const String& filename)
742 {
743 String directory;
744 auto found = filename.rfind("/");
745 if (found != std::string::npos)
746 {
747 directory = filename.substr(0, found + 1);
748 }
749
750 std::ifstream file(filename.c_str(), std::ifstream::in);
751 if (! file.is_open())
752 XABORTM("Unable to open Matrix file " + filename);
753
754 PowerRowMatrix other(mode, file, directory);
755
756 _first = std::move(other._first);
757
758 file.close();
759 }
760
762 PowerRowMatrix& operator=(PowerRowMatrix&& other)
763 {
764 if(this != &other)
765 {
766 _first = std::move(other._first);
767 }
768 return *this;
769 }
770
772 PowerRowMatrix(const PowerRowMatrix&) = delete;
774 PowerRowMatrix& operator=(const PowerRowMatrix&) = delete;
775
777 virtual ~PowerRowMatrix()
778 {
779 }
780
781 void write_out(FileMode mode, String filename) const
782 {
783 std::ofstream file(filename.c_str(), std::ofstream::out);
784 if (! file.is_open())
785 XABORTM("Unable to open Matrix file " + filename);
786
787 String suffix, directory;
788 auto found = filename.rfind(".");
789 if (found != std::string::npos)
790 {
791 suffix = filename.substr(found);
792 filename.erase(found);
793 }
794 found = filename.rfind("/");
795 if (found != std::string::npos)
796 {
797 directory = filename.substr(0, found + 1);
798 filename.erase(0, found + 1);
799 }
800
801 file << "%%MatrixMarket powerrowmatrix coordinate real general\n";
802 file << filename << "_pr" << 1 << suffix << "\n";
803
804 file.close();
805
806 this->write_out_submatrices(mode, directory, filename, suffix);
807 }
808
809 void write_out_submatrices(FileMode mode, const String& directory, const String& prefix, const String& suffix, Index length = 1) const
810 {
811 _first.write_out(mode, directory + prefix + "_pr" + stringify(length) + suffix);
812 }
813
814 PowerRowMatrix clone(LAFEM::CloneMode mode = LAFEM::CloneMode::Weak) const
815 {
816 return PowerRowMatrix(_first.clone(mode));
817 }
818
820 std::size_t bytes() const
821 {
822 return _first.bytes();
823 }
824
825
826 template<int i, int j>
828 {
829 static_assert(i == 0, "invalid sub-matrix index");
830 static_assert(j == 0, "invalid sub-matrix index");
831 return _first;
832 }
833
834 template<int i, int j>
835 const SubMatrixType& at() const
836 {
837 static_assert(i == 0, "invalid sub-matrix index");
838 static_assert(j == 0, "invalid sub-matrix index");
839 return _first;
840 }
841
842 SubMatrixType& get(int i, int j)
843 {
844 XASSERTM((i == 0) && (j == 0), "invalid sub-matrix index");
845 return _first;
846 }
847
848 const SubMatrixType& get(int i, int j) const
849 {
850 XASSERTM((i == 0) && (j == 0), "invalid sub-matrix index");
851 return _first;
852 }
853
854 SubMatrixType& first()
855 {
856 return _first;
857 }
858
859 const SubMatrixType& first() const
860 {
861 return _first;
862 }
863
864 int row_blocks() const
865 {
866 return 1;
867 }
868
869 int col_blocks() const
870 {
871 return 1;
872 }
873
874 template <Perspective perspective_ = Perspective::native>
875 Index rows() const
876 {
877 return first().template rows<perspective_>();
878 }
879
880 template <Perspective perspective_ = Perspective::native>
881 Index columns() const
882 {
883 return first().template columns<perspective_>();
884 }
885
886 template <Perspective perspective_ = Perspective::native>
887 Index used_elements() const
888 {
889 return first().template used_elements<perspective_>();
890 }
891
892 static String name()
893 {
894 return String("PowerRowMatrix<") + SubMatrixType::name() + "," + stringify(1) + ">";
895 }
896
897 template <Perspective perspective_ = Perspective::native>
898 Index size() const
899 {
900 return rows(perspective_) * columns(perspective_);
901 }
902
903 void format(DataType value = DataType(0))
904 {
905 first().format(value);
906 }
907
908 void clear()
909 {
910 first().clear();
911 }
912
913 void apply(VectorTypeL& r, const VectorTypeR& x) const
914 {
915 first().apply(r, x.first());
916 }
917
918 void apply(DenseVector<DataType, IndexType>& r, const DenseVector<DataType, IndexType>& x) const
919 {
920 first().apply(r, x);
921 }
922
923 void apply(VectorTypeL& r, const VectorTypeR& x, const VectorTypeL& y, DataType alpha = DataType(1)) const
924 {
925 first().apply(r, x.first(), y, alpha);
926 }
927
928 void apply(DenseVector<DataType, IndexType>& r, const DenseVector<DataType, IndexType>& x,
929 const DenseVector<DataType, IndexType>& y, DataType alpha = DataType(1)) const
930 {
931 first().apply(r, x, y, alpha);
932 }
933
934 void apply_transposed(VectorTypeR& r, const VectorTypeL& x) const
935 {
936 first().apply_transposed(r.first(), x);
937 }
938
939 void apply_transposed(DenseVector<DataType, IndexType>& r, const DenseVector<DataType, IndexType>& x) const
940 {
941 first().apply_transposed(r, x);
942 }
943
944 void apply_transposed(VectorTypeR& r, const VectorTypeL& x, const VectorTypeR& y, DataType alpha = DataType(1)) const
945 {
946 first().apply_transposed(r.first(), x, y.first(), alpha);
947 }
948
949 void apply_transposed(DenseVector<DataType, IndexType>& r, const DenseVector<DataType, IndexType>& x,
950 const DenseVector<DataType, IndexType>& y, DataType alpha = DataType(1)) const
951 {
952 first().apply_transposed(r, x, y, alpha);
953 }
954
961 DataType max_rel_diff(const PowerRowMatrix& x) const
962 {
963 return this->first().max_rel_diff(x.first());
964 }
965
974 bool same_layout(const PowerRowMatrix& x) const
975 {
976 return (this->name() == x.name()) && (this->first().same_layout(x.first()));
977 }
978
981 {
982 return VectorTypeL(first().create_vector_l());
983 }
984
987 {
988 return VectorTypeR(first().create_vector_r());
989 }
990
992 Index get_length_of_line(const Index row) const
993 {
994 return this->first().get_length_of_line(row);
995 }
996
998 void set_line(const Index row, DataType * const pval_set, IndexType * const pcol_set,
999 const Index col_start, const Index stride = 1) const
1000 {
1001 this->first().set_line(row, pval_set, pcol_set, col_start, stride);
1002 }
1003
1004 void set_line_reverse(const Index row, const DataType * const pval_set, const Index stride = 1)
1005 {
1006 this->first().set_line_reverse(row, pval_set, stride);
1007 }
1008
1010 std::uint64_t get_checkpoint_size(SerialConfig& config)
1011 {
1012 return _first.get_checkpoint_size(config);
1013 }
1014
1016 void restore_from_checkpoint_data(std::vector<char> & data)
1017 {
1018 _first.restore_from_checkpoint_data(data);
1019 }
1020
1022 std::uint64_t set_checkpoint_data(std::vector<char>& data, SerialConfig& config)
1023 {
1024 return _first.set_checkpoint_data(data, config);
1025 }
1026
1034 template <typename SubType2_>
1035 void convert(const PowerRowMatrix<SubType2_, 1> & other)
1036 {
1037 this->first().convert(other.first());
1038 }
1039
1040 template <typename SubType2_>
1041 void convert_reverse(PowerRowMatrix<SubType2_, 1> & other) const
1042 {
1043 this->first().convert_reverse(other.first());
1044 }
1045 };
1047 } // namespace LAFEM
1048} // namespace FEAT
#define XABORTM(msg)
Abortion macro definition with custom message.
Definition: assertion.hpp:192
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
Index size() const
Returns the containers size.
Definition: container.hpp:1136
Dense data vector class template.
Power-Row-Matrix meta class template.
Index rows() const
Returns the total number of rows in this matrix.
void convert(const PowerRowMatrix< SubType2_, blocks_ > &other)
Conversion method.
const SubMatrixType & get(int i, int j) const
Returns a sub-matrix block.
SubMatrixType & get(int i, int j)
Returns a sub-matrix block.
PowerRowMatrix< SubType_, blocks_-1 > RestClass
rest-class typedef
PowerRowMatrix(const PowerRowMatrix &)=delete
deleted copy-ctor
void write_out_submatrices(FileMode mode, String directory, String prefix, String suffix, Index length=blocks_) const
Write out submatrices to file.
void apply(VectorTypeL &r, const VectorTypeR &x) const
Applies this matrix onto a vector.
SubMatrixType & at()
Returns a sub-matrix block.
bool same_layout(const PowerRowMatrix &x) const
Checks if the structural layout of this matrix matches that of another matrix. This excludes comparis...
Index used_elements() const
Returns the total number of non-zeros in this matrix.
PowerRowMatrix(FileMode mode, String filename)
Constructor.
void read_from(FileMode mode, String filename)
Read in matrix from file.
void write_out(FileMode mode, String filename) const
Write out matrix to file.
PowerRowMatrix & operator=(const PowerRowMatrix &)=delete
deleted copy-assign operator
VectorTypeR create_vector_r() const
Returns a new compatible R-Vector.
SubMatrixType::IndexType IndexType
sub-matrix index type
PowerVector< typename SubMatrixType::VectorTypeR, blocks_ > VectorTypeR
Compatible R-vector type.
Index columns() const
Returns the total number of columns in this matrix.
void apply(VectorTypeL &r, const VectorTypeR &x, const VectorTypeL &y, DataType alpha=DataType(1)) const
Applies this matrix onto a vector.
VectorTypeL create_vector_l() const
Returns a new compatible L-Vector.
std::size_t bytes() const
Returns the total amount of bytes allocated.
PowerRowMatrix(PowerRowMatrix &&other)
move ctor
void restore_from_checkpoint_data(std::vector< char > &data)
Extract object from checkpoint.
PowerRowMatrix(SubMatrixType &&the_first, RestClass &&the_rest)
base-class constructor; this one is protected for a reason
SubMatrixType::VectorTypeL VectorTypeL
Compatible L-vector type.
void format(DataType value=DataType(0))
Reset all elements of the container to a given value or zero if missing.
static constexpr int num_col_blocks
number of column blocks (horizontal size)
static constexpr int num_row_blocks
number of row blocks (vertical size)
void apply_transposed(VectorTypeR &r, const VectorTypeL &x, const VectorTypeR &y, DataType alpha=DataType(1)) const
Applies this matrix onto a vector.
std::uint64_t get_checkpoint_size(SerialConfig &config)
Calculate size.
SubType_ SubMatrixType
sub-matrix type
std::uint64_t set_checkpoint_data(std::vector< char > &data, SerialConfig &config)
DataType max_rel_diff(const PowerRowMatrix &x) const
Retrieve the maximum relative difference of this matrix and another one y.max_rel_diff(x) returns .
PowerRowMatrix(const SparseLayout< IndexType, layout_id > &layout)
sub-matrix layout ctor
static String name()
Returns a descriptive string for this container.
SubMatrixType::DataType DataType
sub-matrix data type
static constexpr SparseLayoutId layout_id
sub-matrix layout type
void clear()
Free all allocated arrays.
SubMatrixType _first
the first sub-matrix
virtual ~PowerRowMatrix()
virtual destructor
Index get_length_of_line(const Index row) const
Returns the number of NNZ-elements of the selected row.
PowerRowMatrix< typename SubType_::template ContainerType< DT2_, IT2_ >, blocks_ > ContainerType
Our 'base' class type.
PowerRowMatrix & operator=(PowerRowMatrix &&other)
move-assign operator
RestClass _rest
the remaining part
PowerRowMatrix(FileMode mode, std::istream &file, String directory="")
Constructor.
PowerRowMatrix clone(LAFEM::CloneMode mode=LAFEM::CloneMode::Weak) const
Creates and returns a deep copy of this matrix.
const SubMatrixType & at() const
Returns a sub-matrix block.
void apply_transposed(VectorTypeR &r, const VectorTypeL &x) const
Applies this matrix onto a vector.
Power-Vector meta class template.
Config class for serialize parameter.
Definition: container.hpp:47
Layout scheme for sparse matrix containers.
String class implementation.
Definition: string.hpp:46
String & trim_me(const String &charset)
Trims this string.
Definition: string.hpp:358
@ other
generic/other permutation strategy
SparseLayoutId
Definition: base.hpp:63
T_ max(T_ a, T_ b)
Returns the maximum of two values.
Definition: math.hpp:137
@ rest
restriction (multigrid)
FEAT namespace.
Definition: adjactor.hpp:12
String stringify(const T_ &item)
Converts an item into a String.
Definition: string.hpp:944
@ value
specifies whether the space should supply basis function values
std::uint64_t Index
Index data type.
Power container element helper class template.