FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
adp_solver_base.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/solver/base.hpp>
10#include <kernel/global/alg_dof_parti_system.hpp>
11#include <kernel/global/matrix.hpp>
12#include <kernel/global/filter.hpp>
13#include <kernel/global/vector.hpp>
14#include <kernel/global/pmdcdsc_matrix.hpp>
15
16namespace FEAT
17{
18 namespace Solver
19 {
44 template<typename Matrix_, typename Filter_, typename SolverBase_ = Solver::SolverBase<typename Matrix_::VectorTypeL>>
45#ifndef DOXYGEN
46 class ADPSolverBase;
47#else // DOXYGEN
49 public SolverBase_
50 {
51 protected:
53 explicit ADPSolverBase(const GlobalMatrixType& matrix, const GlobalFilterType& filter);
54
56 const Dist::Comm* _get_comm() const;
57
60
63
66
69
72
75
78
81
84
96 template<typename RPT_, typename CIT_>
97 void _upload_symbolic(RPT_* row_ptr, CIT_* col_idx);
98
114 template<typename DTV_, typename RPT_, typename CIT_>
115 void _upload_numeric(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx);
116
127 template<typename DTV_>
128 void _upload_vector(DTV_* val, const LocalVectorType& vector);
129
141 template<typename DTV_>
142 void _download_vector(LocalVectorType& vector, const DTV_* val);
143 }; // class ADPSolverBase
144#endif // DOXYGEN
145
151
161 template<typename LocalMatrix_, typename Mirror_, typename LocalFilter_, typename SolverBase_>
162 class ADPSolverBase<Global::Matrix<LocalMatrix_, Mirror_, Mirror_>, Global::Filter<LocalFilter_, Mirror_>, SolverBase_> :
163 public SolverBase_
164 {
165 public:
167 typedef LocalMatrix_ LocalMatrixType;
169 typedef typename LocalMatrixType::VectorTypeL LocalVectorType;
171 typedef LocalFilter_ LocalFilterType;
173 typedef Mirror_ MirrorType;
174
181
183 typedef SolverBase_ BaseClass;
184
191
196
201
206
207 protected:
213 std::shared_ptr<AlgDofPartiSystemType> _adp_system;
214
224 explicit ADPSolverBase(const GlobalMatrixType& matrix, const GlobalFilterType& filter) :
225 BaseClass(),
226 _system_matrix(matrix),
227 _system_filter(filter),
228 _adp_system()
229 {
230 }
231
232 public:
234 const Dist::Comm* _get_comm() const
235 {
236 return this->_system_matrix.get_comm();
237 }
238
246 virtual void init_symbolic() override
247 {
248 BaseClass::init_symbolic();
249
250 // assemble the algebraic dof partitioning
251 this->_adp_system = std::make_shared<AlgDofPartiSystemType>(this->_system_matrix, this->_system_filter);
252 this->_adp_system->init_symbolic();
253 }
254
260 virtual void done_symbolic() override
261 {
262 _adp_system.reset();
263
264 BaseClass::done_symbolic();
265 }
266
267 protected:
270 {
271 return this->_adp_system->get_adp_vector_size();
272 }
273
276 {
277 return this->_adp_system->get_adp_matrix_rows();
278 }
279
282 {
283 return this->_adp_system->get_adp_matrix_cols();
284 }
285
288 {
289 return this->_adp_system->get_adp_matrix_nzes();
290 }
291
294 {
295 return this->_adp_system->get_num_global_nonzeros();
296 }
297
300 {
301 return this->_adp_system->get_num_global_dofs();
302 }
303
306 {
307 return this->_adp_system->get_num_owned_dofs();
308 }
309
312 {
313 return this->_adp_system->get_global_dof_offset();
314 }
315
318 {
319 return this->_adp_system->get_alg_dof_parti()->get_block_information();
320 }
321
333 template<typename RPT_, typename CIT_>
334 void _upload_symbolic(RPT_* row_ptr, CIT_* col_idx)
335 {
336 this->_adp_system->upload_matrix_symbolic(row_ptr, col_idx);
337 }
338
354 template<typename DTV_, typename RPT_, typename CIT_>
355 void _upload_numeric(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx)
356 {
357 this->_adp_system->upload_matrix_numeric(val, row_ptr, col_idx);
358 this->_adp_system->upload_filter();
359 this->_adp_system->filter_matrix(val, row_ptr, col_idx);
360 }
361
372 template<typename DTV_>
373 void _upload_vector(DTV_* val, const GlobalVectorType& vector)
374 {
375 this->_adp_system->upload_vector(val, vector.local());
376 }
377
388 template<typename DTV_>
389 void _upload_vector(DTV_* val, const LocalVectorType& vector)
390 {
391 this->_adp_system->upload_vector(val, vector);
392 }
393
405 template<typename DTV_>
406 void _download_vector(GlobalVectorType& vector, const DTV_* val)
407 {
408 this->_adp_system->download_vector(vector.local(), val);
409 }
410
422 template<typename DTV_>
423 void _download_vector(LocalVectorType& vector, const DTV_* val)
424 {
425 this->_adp_system->download_vector(vector, val);
426 }
427 }; // class ADPSolverBase<Global::Matrix<...>, ...>
428
434
449 template<typename MatrixB_, typename MatrixD_, typename GlobalFilter_, typename SolverBase_>
450 class ADPSolverBase<Global::PMDCDSCMatrix<MatrixB_, MatrixD_>, GlobalFilter_, SolverBase_> :
451 public SolverBase_
452 {
453 public:
457 typedef typename GlobalMatrixType::VectorTypeL GlobalVectorType;
459 typedef GlobalFilter_ GlobalFilterType;
460
462 typedef typename GlobalMatrixType::LocalMatrixTypeS LocalMatrixTypeS;
464 typedef typename LocalMatrixTypeS::VectorTypeL LocalVectorType;
465
467 typedef SolverBase_ BaseClass;
468
471
473 typedef typename LocalMatrixTypeS::DataType DataType;
475 typedef typename LocalMatrixTypeS::IndexType IndexType;
476
477 protected:
482
483 private:
494
495 protected:
505 explicit ADPSolverBase(const GlobalMatrixType& matrix, const GlobalFilterType& filter) :
506 BaseClass(),
507 _system_matrix(matrix),
508 _system_filter(filter),
509 _global_dof_count(0),
510 _global_dof_offset(0),
511 _owned_dof_count(0),
512 _owned_num_nzes(0),
513 _global_num_nzes(0)
514 {
515 }
516
517 public:
519 const Dist::Comm* _get_comm() const
520 {
521 return this->_system_matrix.get_comm();
522 }
523
530 virtual void init_symbolic() override
531 {
532 BaseClass::init_symbolic();
533
534 // compute the ADP dimensions
535 _system_matrix.adp_compute_counts(_global_dof_offset, _global_dof_count, _owned_dof_count, _owned_num_nzes, _global_num_nzes);
536 }
537
538 protected:
541 {
542 return _get_num_owned_dofs();
543 }
544
547 {
548 return _get_num_owned_dofs();
549 }
550
553 {
554 return _get_num_global_dofs();
555 }
556
559 {
560 return _owned_num_nzes;
561 }
562
565 {
566 return _global_num_nzes;
567 }
568
571 {
572 return _global_dof_count;
573 }
574
577 {
578 return _owned_dof_count;
579 }
580
583 {
584 return _global_dof_offset;
585 }
586
589 {
590 XABORTM("Block information for ADPSolverBase<PMDCDSCMatrix> not available yet!");
591 return "-N/A-";
592 }
593
605 template<typename RPT_, typename CIT_>
606 void _upload_symbolic(RPT_* row_ptr, CIT_* col_idx)
607 {
608 _system_matrix.adp_upload_symbolic(row_ptr, col_idx, _global_dof_offset);
609 }
610
626 template<typename DTV_, typename RPT_, typename CIT_>
627 void _upload_numeric(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx)
628 {
629 _system_matrix.adp_upload_numeric(val, row_ptr, col_idx);
630 this->_filter_mat(val, row_ptr, col_idx, this->_system_filter.local());
631 }
632
643 template<typename DTV_>
645 {
646 const Index n = _get_adp_vector_size();
647 const DataType* vx = vector.elements();
648
649 XASSERT(vector.size() == n);
650
651 FEAT_PRAGMA_OMP(parallel for)
652 for(Index i = 0; i < n; ++i)
653 val[i] = DTV_(vx[i]);
654 }
655
667 template<typename DTV_>
669 {
670 const Index n = _get_adp_vector_size();
671 DataType* vx = vector.elements();
672
673 XASSERT(vector.size() == n);
674
675 FEAT_PRAGMA_OMP(parallel for)
676 for(Index i = 0; i < n; ++i)
677 vx[i] = DataType(val[i]);
678 }
679
681 template<typename DTV_, typename RPT_, typename CIT_>
682 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
684 {
685 // nothing to do here
686 }
687
689 template<typename DTV_, typename RPT_, typename CIT_>
690 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
692 {
693 const IndexType n = filter.used_elements();
694 const IndexType* fil_idx = filter.get_indices();
695 for(IndexType i = 0; i < n; ++i)
696 {
697 const Index row = fil_idx[i];
698 for(RPT_ j = row_ptr[row]; j < row_ptr[row+1]; ++j)
699 val[j] = DTV_(Index(col_idx[j]) == row ? 1 : 0);
700 }
701 }
702
704 template<typename DTV_, typename RPT_, typename CIT_>
705 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
707 {
708 XASSERTM(filter.empty(), "LAFEM::MeanFilter is not supported by ADPSolverBase yet!");
709 }
710
712 template<typename DTV_, typename RPT_, typename CIT_>
713 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
715 {
716 XASSERTM(filter.empty(), "LAFEM::MeanFilter is not supported by ADPSolverBase yet!");
717 }
718
720 template<typename DTV_, typename RPT_, typename CIT_, typename SubFilter_>
721 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
723 {
724 for(const auto& sf : filter)
725 this->_filter_mat(val, row_ptr, col_idx, sf.second);
726 }
727
729 template<typename DTV_, typename RPT_, typename CIT_, typename First_, typename... Rest_>
730 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
732 {
733 this->_filter_mat(val, row_ptr, col_idx, filter.first());
734 this->_filter_mat(val, row_ptr, col_idx, filter.rest());
735 }
736
738 template<typename DTV_, typename RPT_, typename CIT_, typename First_>
739 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
740 const LAFEM::FilterChain<First_>& filter)
741 {
742 this->_filter_mat(val, row_ptr, col_idx, filter.first());
743 }
744 }; // class ADPSolverBase<Global::PMDCDSCMatrix<...>, ...>
745
751
752
764 template<typename Matrix_, typename Filter_, typename SolverBase_>
765 class ADPSolverBase :
766 public SolverBase_
767 {
769 static_assert(Matrix_::is_local, "invalid instantiation of ADPSolverBase for non-local matrix type!");
770
771 public:
773 typedef Matrix_ MatrixType;
775 typedef typename MatrixType::VectorTypeL VectorType;
777 typedef Filter_ FilterType;
778
780 typedef SolverBase_ BaseClass;
781
783 typedef typename MatrixType::DataType DataType;
785 typedef typename MatrixType::IndexType IndexType;
786
787 protected:
800
801 protected:
811 explicit ADPSolverBase(const MatrixType& matrix, const FilterType& filter) :
812 _comm_self(Dist::Comm::self()),
813 _system_matrix(matrix),
814 _system_filter(filter)
815 {
816 }
817
819 const Dist::Comm* _get_comm() const
820 {
821 return &this->_comm_self;
822 }
823
826 {
827 return _system_matrix.rows();
828 }
829
832 {
833 return _system_matrix.rows();
834 }
835
838 {
839 return _system_matrix.columns();
840 }
841
844 {
845 return _system_matrix.template used_elements<LAFEM::Perspective::pod>();
846 }
847
850 {
851 return _system_matrix.template used_elements<LAFEM::Perspective::pod>();
852 }
853
856 {
857 return _system_matrix.rows();
858 }
859
862 {
863 return _system_matrix.rows();
864 }
865
868 {
869 return Index(0);
870 }
871
874 {
875 XABORTM("Block information for ADPSolverBase<...> not available yet!");
876 return "-N/A-";
877 }
878
890 template<typename RPT_, typename CIT_>
891 void _upload_symbolic(RPT_* row_ptr, CIT_* col_idx)
892 {
893 const Index num_rows = _system_matrix.rows();
894 row_ptr[0] = RPT_(0);
895 for(Index i(0); i < num_rows; ++i)
896 {
897 row_ptr[i+1u] = row_ptr[i] + RPT_(_system_matrix.get_row_col_indices(i, &col_idx[row_ptr[i]], CIT_(0)));
898 }
899 }
900
916 template<typename DTV_, typename RPT_, typename CIT_>
917 void _upload_numeric(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx)
918 {
919 const Index num_rows = _system_matrix.rows();
920 for(Index i(0); i < num_rows; ++i)
921 {
922 _system_matrix.get_row_values(i, &val[row_ptr[i]]);
923 }
924
925 this->_filter_mat(val, row_ptr, col_idx, this->_system_filter);
926 }
927
938 template<typename DTV_>
939 void _upload_vector(DTV_* val, const VectorType& vector)
940 {
941 vector.set_vec(val);
942 }
943
955 template<typename DTV_>
956 void _download_vector(VectorType& vector, const DTV_* val)
957 {
958 vector.set_vec_inv(val);
959 }
960
962 template<typename DTV_, typename RPT_, typename CIT_>
963 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
965 {
966 // nothing to do here
967 }
968
970 template<typename DTV_, typename RPT_, typename CIT_>
971 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
973 {
974 const IndexType n = filter.used_elements();
975 const IndexType* fil_idx = filter.get_indices();
976 for(IndexType i = 0; i < n; ++i)
977 {
978 const Index row = fil_idx[i];
979 for(RPT_ j = row_ptr[row]; j < row_ptr[row+1]; ++j)
980 val[j] = DTV_(Index(col_idx[j]) == row ? 1 : 0);
981 }
982 }
983
985 template<typename DTV_, typename RPT_, typename CIT_>
986 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
988 {
989 XASSERTM(filter.empty(), "LAFEM::MeanFilter is not supported by ADPSolverBase yet!");
990 }
991
993 template<typename DTV_, typename RPT_, typename CIT_>
994 void _filter_mat(DTV_*, const RPT_*, const CIT_*,
996 {
997 XASSERTM(filter.empty(), "LAFEM::MeanFilter is not supported by ADPSolverBase yet!");
998 }
999
1001 template<typename DTV_, typename RPT_, typename CIT_, typename SubFilter_>
1002 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
1004 {
1005 for(const auto& sf : filter)
1006 this->_filter_mat(val, row_ptr, col_idx, sf.second);
1007 }
1008
1010 template<typename DTV_, typename RPT_, typename CIT_, typename First_, typename... Rest_>
1011 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
1013 {
1014 this->_filter_mat(val, row_ptr, col_idx, filter.first());
1015 this->_filter_mat(val, row_ptr, col_idx, filter.rest());
1016 }
1017
1019 template<typename DTV_, typename RPT_, typename CIT_, typename First_>
1020 void _filter_mat(DTV_* val, const RPT_* row_ptr, const CIT_* col_idx,
1021 const LAFEM::FilterChain<First_>& filter)
1022 {
1023 this->_filter_mat(val, row_ptr, col_idx, filter.first());
1024 }
1025 }; // class ADPSolverBase<...>
1026 } // namespace Solver
1027} // namespace FEAT
#define XABORTM(msg)
Abortion macro definition with custom message.
Definition: assertion.hpp:192
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
Communicator class.
Definition: dist.hpp:1349
Algebraic DOF Partitioning implementation.
LocalVectorType::DataType DataType
our data type
LocalVectorType::IndexType IndexType
our index type
Algebraic DOF partitioning linear system conversion class.
Global Filter wrapper class template.
Definition: filter.hpp:21
Global Matrix wrapper class template.
Definition: matrix.hpp:40
const Dist::Comm * get_comm() const
Returns a const pointer to the internal communicator of the gates of the matrix.
Definition: matrix.hpp:174
Mean Filter class template.
Definition: mean_filter.hpp:23
Pre-Multiplied Discontinuous Diagonal Schur-Complement Matrix.
Global vector wrapper class template.
Definition: vector.hpp:68
LocalVector_ & local()
Returns a reference to the internal local LAFEM vector object.
Definition: vector.hpp:122
Index size() const
Returns the containers size.
Definition: container.hpp:1136
Dense data vector class template.
DT_ * elements()
Get a pointer to the data array.
Filter Chainclass template.
Sequence of filters of the same type.
Mean Filter class template.
Definition: mean_filter.hpp:22
None Filter class template.
Definition: none_filter.hpp:29
CSR based sparse matrix.
Unit Filter class template.
Definition: unit_filter.hpp:29
LAFEM::SparseMatrixCSR< DataType, IndexType > ADPMatrixType
the ADP matrix type; this is always a (globally partitioned) CSR matrix
void _download_vector(GlobalVectorType &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _upload_vector(DTV_ *val, const LocalVectorType &vector)
Uploads the ADP vector values to the given array.
LAFEM::DenseVector< DataType, IndexType > ADPVectorType
the ADP vector type; this is always a (globally partitioned) dense vector
Global::AlgDofParti< LocalVectorType, MirrorType > AlgDofPartiType
the algebraic dof partitioning instance for this class
void _upload_vector(DTV_ *val, const GlobalVectorType &vector)
Uploads the ADP vector values to the given array.
Global::AlgDofPartiSystem< LocalMatrixType, LocalFilterType, MirrorType > AlgDofPartiSystemType
the algebraic dof partitioning system instance for this class
void _upload_numeric(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx)
Uploads the (filtered) ADP matrix values to the given array.
void _upload_symbolic(RPT_ *row_ptr, CIT_ *col_idx)
Uploads the ADP matrix structure to the given arrays.
void _download_vector(LocalVectorType &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterChain< First_ > &filter)
auxiliary function: filters the local ADP matrix
void _upload_numeric(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx)
Uploads the (filtered) ADP matrix values to the given array.
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const LAFEM::NoneFilter< DataType, IndexType > &)
auxiliary function: filters the local ADP matrix
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const LAFEM::MeanFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
void _download_vector(LAFEM::DenseVector< DataType, IndexType > &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::UnitFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
void _upload_symbolic(RPT_ *row_ptr, CIT_ *col_idx)
Uploads the ADP matrix structure to the given arrays.
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterChain< First_, Rest_... > &filter)
auxiliary function: filters the local ADP matrix
void _upload_vector(DTV_ *val, const LAFEM::DenseVector< DataType, IndexType > &vector)
Uploads the ADP vector values to the given array.
GlobalMatrixType::LocalMatrixTypeS LocalMatrixTypeS
the local Schur-complement matrix type
ADPSolverBase(const GlobalMatrixType &matrix, const GlobalFilterType &filter)
protected constructor
LocalMatrixTypeS::VectorTypeL LocalVectorType
our internal local vector type; always a DenseVector<DataType, IndexType>
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const Global::MeanFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterSequence< SubFilter_ > &filter)
auxiliary function: filters the local ADP matrix
Base-Class for solvers based on Algebraic-DOF-Partitioning.
const Dist::Comm * _get_comm() const
const FilterType & _system_filter
the system filter
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterSequence< SubFilter_ > &filter)
auxiliary function: filters the local ADP matrix
Dist::Comm _comm_self
self-communicator object
ADPSolverBase(const GlobalMatrixType &matrix, const GlobalFilterType &filter)
constructor
Index _get_adp_matrix_num_cols() const
SolverBase_ BaseClass
our base class
void _upload_symbolic(RPT_ *row_ptr, CIT_ *col_idx)
Uploads the ADP matrix structure to the given arrays.
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterChain< First_ > &filter)
auxiliary function: filters the local ADP matrix
void _upload_vector(DTV_ *val, const VectorType &vector)
Uploads the ADP vector values to the given array.
Index _get_num_owned_dofs() const
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::FilterChain< First_, Rest_... > &filter)
auxiliary function: filters the local ADP matrix
Index _get_global_dof_offset() const
String _get_adp_block_information() const
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const LAFEM::MeanFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
MatrixType::IndexType IndexType
our internal index type
void _download_vector(LocalVectorType &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _upload_vector(DTV_ *val, const LocalVectorType &vector)
Uploads the ADP vector values to the given array.
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const LAFEM::NoneFilter< DataType, IndexType > &)
auxiliary function: filters the local ADP matrix
Index _get_num_global_nonzeros() const
const MatrixType & _system_matrix
the system matrix
Index _get_adp_vector_size() const
MatrixType::VectorTypeL VectorType
the (local) vector type
Index _get_num_global_dofs() const
Filter_ FilterType
the (local) filter type
void _filter_mat(DTV_ *, const RPT_ *, const CIT_ *, const Global::MeanFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
ADPSolverBase(const MatrixType &matrix, const FilterType &filter)
protected constructor
void _download_vector(VectorType &vector, const DTV_ *val)
Downloads the ADP vector values from the given array.
void _filter_mat(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx, const LAFEM::UnitFilter< DataType, IndexType > &filter)
auxiliary function: filters the local ADP matrix
Index _get_adp_matrix_num_nzes() const
Index _get_adp_matrix_num_rows() const
Matrix_ MatrixType
this specialization expects a local matrix
MatrixType::DataType DataType
our internal data type
void _upload_numeric(DTV_ *val, const RPT_ *row_ptr, const CIT_ *col_idx)
Uploads the (filtered) ADP matrix values to the given array.
String class implementation.
Definition: string.hpp:47
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.