10#include <kernel/backend.hpp>
11#include <kernel/lafem/saddle_point_matrix.hpp>
12#include <kernel/lafem/sparse_matrix_bcsr.hpp>
13#include <kernel/lafem/sparse_matrix_csr.hpp>
14#include <kernel/lafem/dense_vector.hpp>
15#include <kernel/lafem/dense_vector_blocked.hpp>
16#include <kernel/lafem/tuple_vector.hpp>
17#include <kernel/lafem/mean_filter.hpp>
18#include <kernel/lafem/none_filter.hpp>
19#include <kernel/lafem/slip_filter.hpp>
20#include <kernel/lafem/unit_filter.hpp>
21#include <kernel/lafem/unit_filter_blocked.hpp>
22#include <kernel/lafem/tuple_filter.hpp>
23#include <kernel/lafem/filter_chain.hpp>
24#include <kernel/lafem/filter_sequence.hpp>
25#include <kernel/global/matrix.hpp>
26#include <kernel/global/vector.hpp>
27#include <kernel/global/filter.hpp>
28#include <kernel/global/mean_filter.hpp>
29#include <kernel/solver/base.hpp>
30#include <kernel/solver/cudss.hpp>
31#include <kernel/solver/mkl_dss.hpp>
32#include <kernel/solver/umfpack.hpp>
49 typename SolverDT_,
typename SolverIT_,
50 typename MatrixA_,
typename MatrixB_,
typename MatrixD_,
51 typename MatrixS_ = LAFEM::SparseMatrixCSR<typename MatrixA_::DataType, typename MatrixA_::IndexType>>
118 template<
typename SolverDT_,
typename SolverIT_,
typename DT_,
typename IT_,
int dim_>
120 SolverDT_, SolverIT_,
121 LAFEM::SparseMatrixBCSR<DT_, IT_, dim_, dim_>,
192 bool _filters_already_set =
false;
195 bool _have_mean_filter_p =
false;
198 bool _need_main_diagonal =
false;
204 std::vector<IT_>
_slip_row_ptr, _slip_col_idx, _slip_fil_dqu, _slip_fil_idx;
251 this->_need_main_diagonal = need_it;
259 return this->_solver_matrix;
267 return this->_solver_filter;
289 const IT_ nv = IT_(vector_v.template size<LAFEM::Perspective::pod>());
290 const IT_ np = IT_(vector_p.
size());
291 const IT_ nx = IT_(vector.
size());
293 XASSERTM(nx == IT_(this->_solver_matrix.
rows()),
"invalid solver vector size");
294 XASSERTM(nv + np <= nx,
"invalid velocity/pressure vector size");
297 const DT_* vec_v = vector_v.template elements<LAFEM::Perspective::pod>();
298 const DT_* vec_p = vector_p.
elements();
301 for(IT_ i(0); i < nv; ++i, ++j)
304 for(IT_ i(0); i < np; ++i, ++j)
322 const IT_ nv = IT_(vector_v.template size<LAFEM::Perspective::pod>());
323 const IT_ np = IT_(vector_p.
size());
324 const IT_ nx = IT_(vector.
size());
326 XASSERTM(nx == IT_(this->_solver_matrix.
rows()),
"invalid solver vector size");
327 XASSERTM(nv + np <= nx,
"invalid velocity/pressure vector size");
330 DT_* vec_v = vector_v.template elements<LAFEM::Perspective::pod>();
334 for(IT_ i(0); i < nv; ++i, ++j)
335 vec_v[i] = DT_(vec[j]);
337 for(IT_ i(0); i < np; ++i, ++j)
338 vec_p[i] = DT_(vec[j]);
350 template<
typename FilterV_,
typename FilterP_>
353 XASSERTM(!this->_filters_already_set,
"Filter have already been set");
354 this->_add_filter_velo(filter.template at<0>(),
nullptr);
355 this->_add_filter_pres(filter.template at<1>(),
nullptr);
356 this->_filters_already_set =
true;
368 template<
typename FilterV_,
typename FilterP_>
371 XASSERTM(this->_filters_already_set,
"Filters have not been set yet");
373 this->_add_filter_velo(filter.template at<0>(), &fuc);
374 this->_add_filter_pres(filter.template at<1>(), &fuc);
385 const IT_ idim = IT_(dim_);
386 const IT_ num_dofs_v = IT_(_matrix_a.
rows());
387 const IT_ num_dofs_p = IT_(_matrix_d.
rows());
395 if(_matrix_s !=
nullptr)
402 this->_have_mean_filter_p = !this->_mean_filter_p_dual.
empty();
405 const IT_ num_slip_dofs = this->_compute_slip_matrix_layout();
408 this->_compute_unit_mask_v();
409 this->_compute_unit_mask_p();
412 const IT_ num_total_dofs = idim*num_dofs_v + num_dofs_p + num_slip_dofs + IT_(_have_mean_filter_p ? 1 : 0);
418 const IT_ num_nze_s = IT_(_matrix_s !=
nullptr ? _matrix_s->
used_elements() : 0u);
421 IT_ max_nze = idim*idim*num_nze_a + idim*(num_nze_b + num_nze_d) + num_nze_s;
424 max_nze += IT_(2)*num_slip_dofs*idim;
427 if(this->_have_mean_filter_p)
428 max_nze += IT_(2)*num_dofs_p;
431 if(this->_need_main_diagonal)
432 max_nze += num_dofs_p + IT_(2)*num_slip_dofs*idim + IT_(1);
435 std::vector<IT_> row_ptr, col_idx;
436 row_ptr.resize(num_total_dofs + IT_(1u), ~IT_(0));
437 col_idx.resize(max_nze, ~IT_(0));
438 row_ptr[0u] = IT_(0u);
452 const IT_* row_ptr_a = _matrix_a.
row_ptr();
453 const IT_* col_idx_a = _matrix_a.
col_ind();
454 const IT_* row_ptr_b = _matrix_b.
row_ptr();
455 const IT_* col_idx_b = _matrix_b.
col_ind();
456 const IT_* row_ptr_d = _matrix_d.
row_ptr();
457 const IT_* col_idx_d = _matrix_d.
col_ind();
458 const IT_* row_ptr_s = (_matrix_s !=
nullptr ? _matrix_s->
row_ptr() :
nullptr);
459 const IT_* col_idx_s = (_matrix_s !=
nullptr ? _matrix_s->
col_ind() :
nullptr);
464 for(IT_ i(0); i < num_dofs_v; ++i)
467 if(_unit_mask_v[i] != 0)
470 for(IT_ k(0); k < idim; ++k)
472 col_idx[op] = i*idim + k;
473 row_ptr[++row] = ++op;
479 for(IT_ j(0); j < idim; ++j)
482 for(IT_ ip(row_ptr_a[i]); ip < row_ptr_a[i+1]; ++ip)
483 for(IT_ k(0); k < idim; ++k, ++op)
484 col_idx[op] = idim* col_idx_a[ip] + k;
486 for(IT_ ip(row_ptr_b[i]); ip < row_ptr_b[i+1]; ++ip, ++op)
487 col_idx[op] = idim*num_dofs_v + col_idx_b[ip];
489 for(IT_ ip(_slip_row_ptr[i]); ip < _slip_row_ptr[i+1]; ++ip, ++op)
490 col_idx[op] = idim*num_dofs_v + num_dofs_p + _slip_col_idx[ip];
496 XASSERT(row == idim*num_dofs_v);
499 for(IT_ i(0); i < num_dofs_p; ++i)
502 if(_unit_mask_p[i] != 0)
504 col_idx[op] = idim*num_dofs_v + i;
505 row_ptr[++row] = ++op;
511 for(IT_ ip(row_ptr_d[i]); ip < row_ptr_d[i+1]; ++ip)
512 for(IT_ k(0); k < idim; ++k, ++op)
513 col_idx[op] = idim*col_idx_d[ip] + k;
515 if(row_ptr_s !=
nullptr)
517 if(this->_need_main_diagonal)
520 bool have_diag =
false;
521 for(IT_ ip(row_ptr_s[i]); ip < row_ptr_s[i+1]; ++ip, ++op)
523 if(!have_diag && (col_idx_s[ip] > i))
528 col_idx[op] = idim*num_dofs_v + col_idx_s[ip];
529 have_diag = have_diag || (col_idx_s[ip] == i);
534 for(IT_ ip(row_ptr_s[i]); ip < row_ptr_s[i+1]; ++ip, ++op)
535 col_idx[op] = idim*num_dofs_v + col_idx_s[ip];
538 else if(this->_need_main_diagonal)
544 if(this->_have_mean_filter_p)
545 col_idx[op++] = idim*num_dofs_v + num_slip_dofs + num_dofs_p;
551 for(
auto it(_slip_filters_v.begin()); it != _slip_filters_v.end(); ++it)
553 const IT_ nsx = IT_(it->used_elements());
554 const IT_* idx = it->get_indices();
555 for(IT_ j(0); j < nsx; ++j)
557 for(IT_ k(0); k < idim; ++k, ++op)
558 col_idx[op] = idim*idx[j] + k;
559 if(this->_need_main_diagonal)
567 if(this->_have_mean_filter_p)
569 for(IT_ j(0); j < num_dofs_p; ++j, ++op)
570 col_idx[op] = idim*num_dofs_v + j;
571 if(this->_need_main_diagonal)
577 XASSERT(row == num_total_dofs);
580 const Index num_nze = op;
583 this->_solver_matrix =
SolverMatrixType(num_total_dofs, num_total_dofs, num_nze);
587 for(IT_ i(0); i <= num_total_dofs; ++i)
592 for(IT_ i(0); i < num_nze; ++i)
604 const IT_ num_dofs_v = IT_(_matrix_a.
rows());
605 const IT_ num_dofs_p = IT_(_matrix_d.
rows());
619 const IT_* row_ptr_a = _matrix_a.
row_ptr();
620 const auto* val_a = _matrix_a.
val();
621 const IT_* row_ptr_b = _matrix_b.
row_ptr();
622 const auto* val_b = _matrix_b.
val();
623 const IT_* row_ptr_d = _matrix_d.
row_ptr();
624 const auto* val_d = _matrix_d.
val();
625 const IT_* row_ptr_s = (_matrix_s !=
nullptr ? _matrix_s->
row_ptr() :
nullptr);
626 const IT_* col_idx_s = (_matrix_s !=
nullptr ? _matrix_s->
col_ind() :
nullptr);
627 const auto* val_s = (_matrix_s !=
nullptr ? _matrix_s->
val() :
nullptr);
633 for(IT_ i(0); i < num_dofs_v; ++i)
636 if(_unit_mask_v[i] != 0)
639 for(
int k(0); k < dim_; ++k, ++op)
645 for(
int j(0); j < dim_; ++j)
648 for(IT_ ip(row_ptr_a[i]); ip < row_ptr_a[i+1]; ++ip)
649 for(
int k(0); k < dim_; ++k, ++op)
652 for(IT_ ip(row_ptr_b[i]); ip < row_ptr_b[i+1]; ++ip, ++op)
655 for(IT_ ip(_slip_row_ptr[i]); ip < _slip_row_ptr[i+1]; ++ip, ++op)
658 const auto& nu = this->_slip_filters_v.at(_slip_fil_dqu[ip]).get_values()[_slip_fil_idx[ip]];
666 for(IT_ i(0); i < num_dofs_p; ++i)
669 if(_unit_mask_p[i] != 0)
677 for(IT_ ip(row_ptr_d[i]); ip < row_ptr_d[i+1]; ++ip)
678 for(
int k(0); k < dim_; ++k, ++op)
681 if(row_ptr_s !=
nullptr)
683 if(this->_need_main_diagonal)
685 bool have_diag =
false;
686 for(IT_ ip(row_ptr_s[i]); ip < row_ptr_s[i+1]; ++ip, ++op)
688 if(!have_diag && (col_idx_s[ip] > i))
694 have_diag = have_diag || (col_idx_s[ip] == i);
699 for(IT_ ip(row_ptr_s[i]); ip < row_ptr_s[i+1]; ++ip, ++op)
703 else if(this->_need_main_diagonal)
710 if(this->_have_mean_filter_p)
712 const auto* v = _mean_filter_p_dual.
elements();
718 for(
auto it(_slip_filters_v.begin()); it != _slip_filters_v.end(); ++it)
720 const IT_ nsx = IT_(it->used_elements());
721 const auto* nu = it->get_values();
722 for(IT_ j(0); j < nsx; ++j)
724 for(
int k(0); k < dim_; ++k, ++op)
726 if(this->_need_main_diagonal)
732 if(this->_have_mean_filter_p)
734 const auto* v = _mean_filter_p_dual.
elements();
735 for(IT_ j(0); j < num_dofs_p; ++j, ++op)
737 if(this->_need_main_diagonal)
760 _slip_row_ptr.clear();
761 _slip_col_idx.clear();
762 _slip_fil_dqu.clear();
763 _slip_fil_idx.clear();
764 _slip_filters_v.clear();
765 _unit_filters_v.clear();
766 _unit_filters_p.clear();
767 _mean_filter_p_dual.
clear();
768 _unit_mask_v.clear();
769 _unit_mask_p.clear();
770 _have_mean_filter_p =
false;
771 _filters_already_set =
false;
784 if(!old_filter.get_filter_vector().same_layout(filter.get_filter_vector()))
785 XABORTM(
"velocity unit filter layout has changed");
806 if(!old_filter.get_filter_vector().same_layout(filter.get_filter_vector()))
807 XABORTM(
"velocity slip filter layout has changed");
826 template<
typename First_>
829 this->_add_filter_velo(filter.first(), fuc);
833 template<
typename First_,
typename Second_,
typename... Rest_>
836 this->_add_filter_velo(filter.first(), fuc);
837 this->_add_filter_velo(filter.rest(), fuc);
841 template<
typename SubFilter_>
844 for(
auto it = filter.begin(); it != filter.end(); ++it)
846 this->_add_filter_velo(it->second, fuc);
851 template<
typename LocFilter_,
typename Mirror_>
854 this->_add_filter_velo(filter.local(), fuc);
866 if(!old_filter.get_filter_vector().same_layout(filter.get_filter_vector()))
867 XABORTM(
"pressure unit filter layout has changed");
883 XASSERTM(this->_mean_filter_p_dual.
empty() == filter.get_vec_dual().empty(),
"pressure mean filter has changed");
893 XASSERTM(this->_mean_filter_p_dual.
empty() == filter.get_vec_dual().empty(),
"pressure mean filter has changed");
905 template<
typename First_>
908 this->_add_filter_pres(filter.first(), fuc);
912 template<
typename First_,
typename Second_,
typename... Rest_>
915 this->_add_filter_pres(filter.first(), fuc);
916 this->_add_filter_pres(filter.rest(), fuc);
920 template<
typename SubFilter_>
923 for(
auto it = filter.begin(); it != filter.end(); ++it)
925 this->_add_filter_pres(it->second, fuc);
930 template<
typename LocFilter_,
typename Mirror_>
933 this->_add_filter_pres(filter.local(), fuc);
939 const IT_ nv = IT_(_matrix_a.
rows());
941 _slip_row_ptr.clear();
942 _slip_col_idx.clear();
943 _slip_fil_dqu.clear();
944 _slip_fil_idx.clear();
945 _slip_row_ptr.resize(nv+1u, IT_(0));
947 if(this->_slip_filters_v.empty())
952 for(std::size_t it(0u); it < this->_slip_filters_v.size(); ++it)
954 const IT_ ni = IT_(this->_slip_filters_v.at(it).used_elements());
955 const IT_* idx = this->_slip_filters_v.at(it).get_indices();
956 for(IT_ i(0); i < ni; ++i)
957 ++_slip_row_ptr.at(idx[i]+1);
966 for(IT_ i(0); i < nv; ++i)
968 _slip_row_ptr[i+1u] += _slip_row_ptr[i];
972 _slip_col_idx.resize(count);
973 _slip_fil_dqu.resize(count);
974 _slip_fil_idx.resize(count);
977 std::vector<IT_> aux(_slip_row_ptr);
981 for(std::size_t it(0u); it < this->_slip_filters_v.size(); ++it)
983 const IT_ ni = IT_(this->_slip_filters_v.at(it).used_elements());
984 const IT_* idx = this->_slip_filters_v.at(it).get_indices();
987 for(IT_ i(0); i < ni; ++i)
989 IT_& px = aux[idx[i]];
990 _slip_col_idx[px] = offset + i;
991 _slip_fil_dqu[px] = IT_(it);
992 _slip_fil_idx[px] = i;
1006 _unit_mask_v.clear();
1007 _unit_mask_v.resize(_matrix_a.
rows(), 0);
1009 for(
const auto& it : this->_unit_filters_v)
1011 const IT_ n = IT_(it.used_elements());
1012 const IT_* idx = it.get_indices();
1013 for(IT_ k(0); k < n; ++k)
1014 _unit_mask_v.at(idx[k]) = 1;
1022 _unit_mask_p.clear();
1023 _unit_mask_p.resize(_matrix_d.
rows(), 0);
1025 for(
const auto& it : this->_unit_filters_p)
1027 const IT_ n = IT_(it.used_elements());
1028 const IT_* idx = it.get_indices();
1029 for(IT_ k(0); k < n; ++k)
1030 _unit_mask_p.at(idx[k]) = 1;
1037#ifdef FEAT_HAVE_CUDSS
1043#ifdef FEAT_HAVE_UMFPACK
1055 template<
typename Matrix_,
typename Filter_>
1066 template<
typename MatrixA_,
typename MatrixB_,
typename MatrixD_,
typename FilterV_,
typename FilterP_>
1068 public Solver::SolverBase<LAFEM::TupleVector<typename MatrixB_::VectorTypeL, typename MatrixD_::VectorTypeL>>
1092#if defined(FEAT_HAVE_CUDSS) || defined(DOXYGEN)
1093 static constexpr bool have_backend_cudss =
true;
1095 static constexpr bool have_backend_cudss =
false;
1099#if defined(FEAT_HAVE_MKL) || defined(DOXYGEN)
1100 static constexpr bool have_backend_mkldss =
true;
1102 static constexpr bool have_backend_mkldss =
false;
1106#if defined(FEAT_HAVE_UMFPACK) || defined(DOXYGEN)
1107 static constexpr bool have_backend_umfpack =
true;
1109 static constexpr bool have_backend_umfpack =
false;
1127#if defined(FEAT_HAVE_CUDSS) || defined(DOXYGEN)
1131#if defined(FEAT_HAVE_MKL) || defined(DOXYGEN)
1135#if defined(FEAT_HAVE_UMFPACK) || defined(DOXYGEN)
1163 _matrix_sys(matrix_sys),
1164 _filter_sys(filter_sys),
1165 _stokes_core(_matrix_sys.block_a(), _matrix_sys.block_b(), _matrix_sys.block_d()),
1168#ifdef FEAT_HAVE_CUDSS
1175 _direct_solver = _cudss_solver;
1177 _stokes_core.set_need_main_diagonal(
true);
1187 _direct_solver = _mkldss_solver;
1189 _stokes_core.set_need_main_diagonal(
true);
1193#ifdef FEAT_HAVE_UMFPACK
1198 _direct_solver = _umfpack_solver;
1202 XABORTM(
"DirectStokesSolver can only be used if at least one of {cuDSS, MKL DSS, UMFPACK} is available");
1228#ifdef FEAT_HAVE_CUDSS
1230 return "DirectStokesSolver<SaddlePointMatrix>[CUDSS]";
1234 return "DirectStokesSolver<SaddlePointMatrix>[MKLDSS]";
1236#ifdef FEAT_HAVE_UMFPACK
1238 return "DirectStokesSolver<SaddlePointMatrix>[UMFPACK]";
1240 return "DirectStokesSolver<SaddlePointMatrix>[???]";
1246 BaseClass::init_symbolic();
1249 _stokes_core.set_filters(_filter_sys);
1252 _stokes_core.init_symbolic();
1254 _direct_solver->init_symbolic();
1257 _vec_sol = _stokes_core.create_solver_vector();
1258 _vec_rhs = _stokes_core.create_solver_vector();
1264 BaseClass::init_numeric();
1267 _stokes_core.update_filters(_filter_sys);
1270 _stokes_core.init_numeric();
1272 _direct_solver->init_numeric();
1279 _direct_solver->done_numeric();
1280 _stokes_core.done_numeric();
1281 BaseClass::done_numeric();
1290 _direct_solver->done_symbolic();
1291 _stokes_core.done_symbolic();
1292 BaseClass::done_symbolic();
1313 _stokes_core.upload_vector(this->_vec_rhs, vec_def.template at<0>(), vec_def.template at<1>());
1316 Solver::Status status = _direct_solver->apply(this->_vec_sol, this->_vec_rhs);
1319 _stokes_core.download_vector(this->_vec_sol, vec_cor.template at<0>(), vec_cor.template at<1>());
1339 template<
typename LocalMatrix_,
typename LocalFilter_,
typename Mirror_>
1341 public Solver::SolverBase<Global::Vector<typename LocalMatrix_::VectorTypeR, Mirror_>>
1365 _matrix_sys(matrix_sys),
1366 _filter_sys(filter_sys),
1367 _local_solver(_matrix_sys.local(), _filter_sys.local())
1374 return "DirectStokesSolver<Global::Matrix>";
1384 XASSERTM(comm->
size() <= 1,
"DirectStokesSolver can only work on one process");
1387 BaseClass::init_symbolic();
1388 _local_solver.init_symbolic();
1394 BaseClass::init_numeric();
1395 _local_solver.init_numeric();
1401 _local_solver.done_numeric();
1402 BaseClass::done_numeric();
1408 _local_solver.done_symbolic();
1409 BaseClass::done_symbolic();
1429 return _local_solver.apply(vec_sol.
local(), vec_rhs.
local());
1445 template<
typename Matrix_,
typename Filter_>
1448 return std::make_shared<DirectStokesSolver<Matrix_, Filter_>>(matrix, filter);
#define XABORTM(msg)
Abortion macro definition with custom message.
#define XASSERT(expr)
Assertion macro definition.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
int size() const
Returns the size of this communicator.
Global Filter wrapper class template.
Global Matrix wrapper class template.
const Dist::Comm * get_comm() const
Returns a const pointer to the internal communicator of the gates of the matrix.
Mean Filter class template.
Global vector wrapper class template.
LocalVector_ & local()
Returns a reference to the internal local LAFEM vector object.
bool empty() const
Checks whether the container is empty.
Index size() const
Returns the containers size.
virtual void clear()
Free all allocated arrays.
Blocked Dense data vector class template.
Dense data vector class template.
DT_ * elements()
Get a pointer to the data array.
DenseVector clone(CloneMode clone_mode=CloneMode::Deep) const
Clone operation.
Filter Chainclass template.
Sequence of filters of the same type.
Mean Filter class template.
Blocked None Filter class template.
None Filter class template.
Saddle-Point matrix meta class template.
Slip Filter class template.
SlipFilter clone(CloneMode clone_mode=CloneMode::Deep) const
Creates a clone of itself.
CSR based blocked sparse matrix.
Index rows() const
Retrieve matrix row count.
IT_ * col_ind()
Retrieve column indices array.
IT_ * row_ptr()
Retrieve row start index array.
Index columns() const
Retrieve matrix column count.
Index used_elements() const
Retrieve non zero element count.
auto val() const -> const typename Intern::BCSRPerspectiveHelper< DT_, BlockHeight_, BlockWidth_, perspective_ >::Type *
Retrieve non zero element array.
VectorTypeR create_vector_r() const
Returns a new compatible R-Vector.
IT_ * col_ind()
Retrieve column indices array.
DT_ * val()
Retrieve non zero element array.
Index rows() const
Retrieve matrix row count.
Index columns() const
Retrieve matrix column count.
Index used_elements() const
Retrieve non zero element count.
IT_ * row_ptr()
Retrieve row start index array.
TupleVector meta-filter class template.
Variadic TupleVector class template.
Unit Filter Blocked class template.
UnitFilterBlocked clone(CloneMode clone_mode=CloneMode::Deep) const
Creates a clone of itself.
Unit Filter class template.
UnitFilter clone(CloneMode clone_mode=CloneMode::Deep) const
Creates a clone of itself.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_matrix_b const MatrixTypeB & _matrix_b
reference to matrix block B
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::set_filters void set_filters(const LAFEM::TupleFilter< FilterV_, FilterP_ > &filter)
Sets the velocity and pressure filters.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::VectorTypeP LAFEM::DenseVector< DT_, IT_ > VectorTypeP
the type of the pressure vector
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_mean_filter_p_dual VectorTypeP _mean_filter_p_dual
pressure mean filter (may be nullptr or an empty vector if no pressure mean filter is to be applied)
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::upload_vector virtual void upload_vector(SolverVectorType &vector, const VectorTypeV &vector_v, const VectorTypeP &vector_p) const
Uploads a velocity/pressure vector pair to a solver vector.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::init_symbolic virtual void init_symbolic()
Performs the symbolic initialization.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::operator= DirectStokesCore & operator=(const DirectStokesCore &)=delete
no copy allowed
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const LAFEM::FilterChain< First_ > &filter, FilterUpdateCounter *fuc)
adds or updates a velocity filter chain
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::update_filters void update_filters(const LAFEM::TupleFilter< FilterV_, FilterP_ > &filter)
Updates the velocity and pressure filters.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_unit_filters_v std::deque< UnitFilterTypeV > _unit_filters_v
deque of velocity unit filters
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_unit_filters_p std::deque< UnitFilterTypeP > _unit_filters_p
deque of pressure unit filters
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::done_numeric virtual void done_numeric()
Releases all data allocated during numerical initialization.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::DirectStokesCore DirectStokesCore(const MatrixTypeA &matrix_a, const MatrixTypeB &matrix_b, const MatrixTypeD &matrix_d, const MatrixTypeS *matrix_s=nullptr)
Constructor.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_compute_unit_mask_p void _compute_unit_mask_p()
computes the pressure unit filter mask
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_slip_filters_v std::deque< SlipFilterTypeV > _slip_filters_v
deque of velocity slip filters
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const LAFEM::FilterSequence< SubFilter_ > &filter, FilterUpdateCounter *fuc)
adds or updates a pressure filter sequence
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_compute_unit_mask_v void _compute_unit_mask_v()
computes the velocity unit filter mask
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::NoneFilterTypeP LAFEM::NoneFilter< DT_, IT_ > NoneFilterTypeP
the none filter type for the pressure
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const LAFEM::FilterChain< First_, Second_, Rest_... > &filter, FilterUpdateCounter *fuc)
adds or updates a pressure filter chain
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const NoneFilterTypeV &, FilterUpdateCounter *)
adds or updates a velocity none filter (dummy function)
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_slip_row_ptr std::vector< IT_ > _slip_row_ptr
slip filter matrix Q entries
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::UnitFilterTypeV LAFEM::UnitFilterBlocked< DT_, IT_, dim_ > UnitFilterTypeV
the unit filter type for the velocity
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const NoneFilterTypeP &, FilterUpdateCounter *)
adds or updates a pressure none filter (dummy function)
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const UnitFilterTypeP &filter, FilterUpdateCounter *fuc)
adds or updates a pressure unit filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const LAFEM::FilterSequence< SubFilter_ > &filter, FilterUpdateCounter *fuc)
adds or updates a velocity filter sequence
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const LAFEM::MeanFilter< DT_, IT_ > &filter, FilterUpdateCounter *fuc)
adds or updates a pressure mean filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_compute_slip_matrix_layout IT_ _compute_slip_matrix_layout()
computes the slip matrix layout Q^T and returns the total number of slip DOFs
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_matrix_d const MatrixTypeD & _matrix_d
reference to matrix block D
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::NoneFilterTypeV LAFEM::NoneFilterBlocked< DT_, IT_, dim_ > NoneFilterTypeV
the none filter type for the velocity
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::MatrixTypeD LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ > MatrixTypeD
the type of the matrix block D
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const LAFEM::FilterChain< First_ > &filter, FilterUpdateCounter *fuc)
adds or updates a pressure filter chain
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SolverVectorType LAFEM::DenseVector< SolverDataType, SolverIndexType > SolverVectorType
the solver vector type
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::download_vector virtual void download_vector(const SolverVectorType &vector, VectorTypeV &vector_v, VectorTypeP &vector_p) const
Downloads a velocity/pressure vector pair from a solver vector.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SolverFilterType LAFEM::NoneFilter< SolverDataType, SolverIndexType > SolverFilterType
the solver filter type
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::MatrixTypeB LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 > MatrixTypeB
the type of the matrix block B
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::DirectStokesCore DirectStokesCore(const DirectStokesCore &)=delete
no copy allowed
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::VectorTypeV LAFEM::DenseVectorBlocked< DT_, IT_, dim_ > VectorTypeV
the type of the velocity vector
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const LAFEM::FilterChain< First_, Second_, Rest_... > &filter, FilterUpdateCounter *fuc)
adds or updates a velocity filter chain
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::create_solver_vector SolverVectorType create_solver_vector() const
Creates a new solver vector, whose contents are left uninitialized.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const Global::MeanFilter< DT_, IT_ > &filter, FilterUpdateCounter *fuc)
adds or updates a pressure mean filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SolverDataType SolverDT_ SolverDataType
the data type to be used by the solver
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::set_need_main_diagonal void set_need_main_diagonal(bool need_it)
Specifies whether the solver matrix needs to contain all main diagonal entries.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SolverIndexType SolverIT_ SolverIndexType
the index type to be used by the solver
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::MatrixTypeA LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ > MatrixTypeA
the type of the matrix block A
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const Global::Filter< LocFilter_, Mirror_ > &filter, FilterUpdateCounter *fuc)
adds or updates a global velocity filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_pres void _add_filter_pres(const Global::Filter< LocFilter_, Mirror_ > &filter, FilterUpdateCounter *fuc)
adds or updates a global pressure filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_matrix_a const MatrixTypeA & _matrix_a
reference to matrix block A
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::MatrixTypeS LAFEM::SparseMatrixCSR< DT_, IT_ > MatrixTypeS
the type of the matrix block S
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::init_numeric virtual void init_numeric()
Performs the numeric initialization.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_unit_mask_v std::vector< int > _unit_mask_v
unit filter masks for velocity and pressure
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_matrix_s const MatrixTypeS * _matrix_s
pointer to matrix block S (may be nullptr or an empty matrix)
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::get_solver_matrix const SolverMatrixType & get_solver_matrix() const
Returns a const reference to the solver matrix.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SlipFilterTypeV LAFEM::SlipFilter< DT_, IT_, dim_ > SlipFilterTypeV
the slip filter type for the velocity
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::~DirectStokesCore virtual ~DirectStokesCore()
virtual destructor
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::get_solver_filter const SolverFilterType & get_solver_filter() const
Returns a const reference to the solver filter, which is always an empty NoneFilter.
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const SlipFilterTypeV &filter, FilterUpdateCounter *fuc)
adds or updates a velocity slip filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::UnitFilterTypeP LAFEM::UnitFilter< DT_, IT_ > UnitFilterTypeP
the unit filter type for the pressure
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::SolverMatrixType LAFEM::SparseMatrixCSR< SolverDataType, SolverIndexType > SolverMatrixType
the solver matrix type
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::FilterUpdateCounter std::array< std::size_t, 3u > FilterUpdateCounter
type for filter counting
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_solver_filter SolverFilterType _solver_filter
the solver filter (a NoneFilter)
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_add_filter_velo void _add_filter_velo(const UnitFilterTypeV &filter, FilterUpdateCounter *fuc)
adds or updates a velocity unit filter
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::_solver_matrix SolverMatrixType _solver_matrix
the solver matrix
FEAT::Solver::DirectStokesCore< SolverDT_, SolverIT_, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, dim_ >, LAFEM::SparseMatrixBCSR< DT_, IT_, dim_, 1 >, LAFEM::SparseMatrixBCSR< DT_, IT_, 1, dim_ >, LAFEM::SparseMatrixCSR< DT_, IT_ > >::done_symbolic virtual void done_symbolic()
Releases all data allocated during symbolic initialization.
Core class for conversion of Stokes systems to CSR format for direct solvers.
virtual void done_numeric() override
Releases all data allocated during numeric initialization.
Solver::SolverBase< SystemVectorType > BaseClass
our base class
Global::Matrix< LocalMatrix_, Mirror_, Mirror_ > SystemMatrixType
our system matrix type
virtual String name() const override
Returns the name of the solver.
Global::Vector< typename LocalMatrix_::VectorTypeR, Mirror_ > SystemVectorType
our system vector type
const SystemFilterType & _filter_sys
the system filter
Global::Filter< LocalFilter_, Mirror_ > SystemFilterType
our system filter type
virtual void done_symbolic() override
Releases all data allocated during symbolic initialization.
virtual void init_symbolic() override
Performs the symbolic initialization.
virtual Solver::Status apply(SystemVectorType &vec_sol, const SystemVectorType &vec_rhs) override
Applies the direct Stokes solver.
const SystemMatrixType & _matrix_sys
the system matrix
virtual void init_numeric() override
Performs the numeric initialization.
DirectStokesSolver< LocalMatrix_, LocalFilter_ > _local_solver
our local solver
const SystemFilterType & _filter_sys
the system filter
virtual void init_numeric() override
Performs the numeric initialization.
LAFEM::TupleFilter< FilterV_, FilterP_ > SystemFilterType
our system filter type
SolverVectorType _vec_sol
our RHS/SOL vectors
virtual Solver::Status apply(SystemVectorType &vec_cor, const SystemVectorType &vec_def) override
Applies the direct Stokes solver.
StokesCoreType::SolverVectorType SolverVectorType
the solver vector type
std::shared_ptr< Solver::Umfpack > _umfpack_solver
our UMFPACK solver object; used if no other direct solver was chosen
virtual void done_symbolic() override
Releases all data allocated during symbolic initialization.
std::shared_ptr< Solver::CUDSS > _cudss_solver
our CUDSS solver object; used if preferred backend is PreferredBackend::cuda
StokesCoreType::SolverFilterType SolverFilterType
the solver filter type; this is always a NoneFilter
std::shared_ptr< Solver::MKLDSS > _mkldss_solver
our MKLDSS solver object; used if preferred backend is PreferredBackend::mkl
Solver::SolverBase< SystemVectorType > BaseClass
our base class
virtual void done_numeric() override
Releases all data allocated during numeric initialization.
DirectStokesSolver(const SystemMatrixType &matrix_sys, const SystemFilterType &filter_sys)
Constructor for preferred backend.
const SystemMatrixType & _matrix_sys
the system matrix
LAFEM::TupleVector< typename MatrixB_::VectorTypeL, typename MatrixD_::VectorTypeL > SystemVectorType
our system vector type
DirectStokesCore< double, Index, MatrixA_, MatrixB_, MatrixD_ > StokesCoreType
the direct Stokes core class type
StokesCoreType::SolverMatrixType SolverMatrixType
the solver matrix type
std::shared_ptr< Solver::SolverBase< SolverVectorType > > _direct_solver
the actual direct solver; opaque SolverBase pointer
virtual String name() const override
Returns the name of the solver.
virtual void init_symbolic() override
Performs the symbolic initialization.
StokesCoreType _stokes_core
the direct stokes core
LAFEM::SaddlePointMatrix< MatrixA_, MatrixB_, MatrixD_ > SystemMatrixType
our system matrix type
DirectStokesSolver(const SystemMatrixType &matrix_sys, const SystemFilterType &filter_sys, PreferredBackend backend)
Constructor.
Direct Stokes solver class template.
Polymorphic solver interface.
String class implementation.
std::shared_ptr< MKLDSS > new_mkl_dss(const LAFEM::SparseMatrixCSR< double, Index > &matrix)
Creates a new MKLDSS solver object.
std::shared_ptr< DirectStokesSolver< Matrix_, Filter_ > > new_direct_stokes_solver(const Matrix_ &matrix, const Filter_ &filter)
Creates a new DirectStokesSolver object.
std::shared_ptr< CUDSS > new_cudss(const LAFEM::SparseMatrixCSR< double, Index > &matrix)
Creates a new CUDSS solver object.
Status
Solver status return codes enumeration.
static constexpr bool direct_stokes_solver_available
specifies whether at least one backend for the DirectStokesSolver class is available
std::shared_ptr< Umfpack > new_umfpack(const LAFEM::SparseMatrixCSR< double, Index > &matrix)
Creates a new Umfpack solver object.
PreferredBackend
The backend that shall be used in all compute heavy calculations.
std::uint64_t Index
Index data type.