106class OperatorBase :
public dealii::EnableObserverPointer
109 typedef OperatorBase<dim, Number, n_components> This;
111 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
112 typedef std::pair<unsigned int, unsigned int> Range;
113 typedef CellIntegrator<dim, n_components, Number> IntegratorCell;
114 typedef FaceIntegrator<dim, n_components, Number> IntegratorFace;
116 static unsigned int const dimension = dim;
117 static unsigned int const vectorization_length = dealii::VectorizedArray<Number>::size();
119 typedef dealii::LAPACKFullMatrix<Number> LAPACKMatrix;
121 typedef dealii::FullMatrix<dealii::TrilinosScalar> FullMatrix_;
125 virtual ~OperatorBase()
127 if(data.sparse_matrix_type == SparseMatrixType::PETSc)
129#ifdef DEAL_II_WITH_PETSC
130 if(system_matrix_petsc.m() > 0)
132 PetscErrorCode ierr = VecDestroy(&petsc_vector_dst);
133 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
134 ierr = VecDestroy(&petsc_vector_src);
135 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
145 set_time(
double const time)
const;
153 dealii::AffineConstraints<Number>
const &
154 get_affine_constraints()
const;
156 dealii::MatrixFree<dim, Number>
const &
157 get_matrix_free()
const;
160 get_dof_index()
const;
163 get_dof_index_inhomogeneous()
const;
166 get_quad_index()
const;
173 operator_is_singular()
const;
176 vmult(VectorType & dst, VectorType
const & src)
const;
179 vmult_add(VectorType & dst, VectorType
const & src)
const;
182 vmult_interface_down(VectorType & dst, VectorType
const & src)
const;
185 vmult_add_interface_up(VectorType & dst, VectorType
const & src)
const;
187 dealii::types::global_dof_index
190 dealii::types::global_dof_index
194 el(
unsigned int const,
unsigned int const)
const;
197 is_empty_locally()
const;
200 initialize_dof_vector(VectorType & vector)
const;
207 set_inhomogeneous_constrained_values(VectorType & solution)
const;
210 set_constrained_dofs_to_zero(VectorType & vector)
const;
213 calculate_inverse_diagonal(VectorType & diagonal)
const;
220 initialize_block_diagonal_preconditioner(
bool const initialize)
const;
227 update_block_diagonal_preconditioner()
const;
239#ifdef DEAL_II_WITH_TRILINOS
241 init_system_matrix(dealii::TrilinosWrappers::SparseMatrix & system_matrix,
242 MPI_Comm
const & mpi_comm)
const;
245 calculate_system_matrix(dealii::TrilinosWrappers::SparseMatrix & system_matrix)
const;
251#ifdef DEAL_II_WITH_PETSC
253 init_system_matrix(dealii::PETScWrappers::MPI::SparseMatrix & system_matrix,
254 MPI_Comm
const & mpi_comm)
const;
257 calculate_system_matrix(dealii::PETScWrappers::MPI::SparseMatrix & system_matrix)
const;
266 get_constant_modes(std::vector<std::vector<bool>> & constant_modes,
267 std::vector<std::vector<double>> & constant_modes_values)
const;
276 apply(VectorType & dst, VectorType
const & src)
const;
282 apply_add(VectorType & dst, VectorType
const & src)
const;
285 assemble_matrix_if_matrix_based()
const;
292 apply_matrix_based(VectorType & dst, VectorType
const & src)
const;
298 apply_matrix_based_add(VectorType & dst, VectorType
const & src)
const;
315 rhs(VectorType & dst)
const;
321 rhs_add(VectorType & dst)
const;
338 evaluate(VectorType & dst, VectorType
const & src)
const;
344 evaluate_add(VectorType & dst, VectorType
const & src)
const;
350 calculate_diagonal(VectorType & diagonal)
const;
353 add_diagonal(VectorType & diagonal)
const;
359 add_block_diagonal_matrices(std::vector<LAPACKMatrix> & matrices)
const;
362 apply_inverse_block_diagonal_matrix_based(VectorType & dst, VectorType
const & src)
const;
370 initialize_block_diagonal_preconditioner_matrix_free(
bool const initialize)
const;
375 update_block_diagonal_preconditioner_matrix_free()
const;
379 initialize_block_diagonal_preconditioner_matrix_based(
bool const initialize)
const;
383 update_block_diagonal_preconditioner_matrix_based()
const;
386 apply_add_block_diagonal_elementwise(
unsigned int const cell,
387 dealii::VectorizedArray<Number> *
const dst,
388 dealii::VectorizedArray<Number>
const *
const src,
389 unsigned int const problem_size)
const;
395 compute_factorized_additive_schwarz_matrices()
const;
398 apply_inverse_additive_schwarz_matrices(VectorType & dst, VectorType
const & src)
const;
402 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
403 dealii::AffineConstraints<Number>
const & constraints,
407 reinit_cell(IntegratorCell & integrator,
unsigned int const cell)
const;
410 reinit_face(IntegratorFace & integrator_m,
411 IntegratorFace & integrator_p,
412 unsigned int const face)
const;
415 reinit_boundary_face(IntegratorFace & integrator_m,
unsigned int const face)
const;
418 reinit_face_cell_based(IntegratorFace & integrator_m,
419 IntegratorFace & integrator_p,
420 unsigned int const cell,
421 unsigned int const face,
422 dealii::types::boundary_id
const boundary_id)
const;
431 do_cell_integral(IntegratorCell & integrator)
const;
434 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const;
437 do_boundary_integral(IntegratorFace & integrator,
438 OperatorType
const & operator_type,
439 dealii::types::boundary_id
const & boundary_id)
const;
442 do_boundary_integral_continuous(IntegratorFace & integrator,
443 OperatorType
const & operator_type,
444 dealii::types::boundary_id
const & boundary_id)
const;
449 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const;
452 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const;
462 do_face_int_integral_cell_based(IntegratorFace & integrator_m,
463 IntegratorFace & integrator_p)
const;
480 mutable dealii::AffineConstraints<double> constraint_double;
504 ElementwisePreconditionerBase;
505 typedef Elementwise::
506 IterativeSolver<dim, n_components, Number, ElementwiseOperator, ElementwisePreconditionerBase>
509 mutable std::shared_ptr<ElementwiseOperator> elementwise_operator;
510 mutable std::shared_ptr<ElementwisePreconditionerBase> elementwise_preconditioner;
511 mutable std::shared_ptr<ElementwiseSolver> elementwise_solver;
515 reinit_cell_derived(IntegratorCell & integrator,
unsigned int const cell)
const;
518 reinit_face_derived(IntegratorFace & integrator_m,
519 IntegratorFace & integrator_p,
520 unsigned int const face)
const;
523 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const;
526 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
527 IntegratorFace & integrator_p,
528 unsigned int const cell,
529 unsigned int const face,
530 dealii::types::boundary_id
const boundary_id)
const;
540 create_standard_basis(
unsigned int j, IntegratorCell & integrator)
const;
543 create_standard_basis(
unsigned int j, IntegratorFace & integrator)
const;
546 create_standard_basis(
unsigned int j,
547 IntegratorFace & integrator_1,
548 IntegratorFace & integrator_2)
const;
560 cell_loop_full_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
562 VectorType
const & src,
563 Range
const & range)
const;
569 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
571 VectorType
const & src,
572 Range
const & range)
const;
578 face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
580 VectorType
const & src,
581 Range
const & range)
const;
591 boundary_face_loop_hom_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
593 VectorType
const & src,
594 Range
const & range)
const;
598 boundary_face_loop_inhom_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
600 VectorType
const & src,
601 Range
const & range)
const;
605 boundary_face_loop_full_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
607 VectorType
const & src,
608 Range
const & range)
const;
616 cell_loop_empty(dealii::MatrixFree<dim, Number>
const & matrix_free,
618 VectorType
const & src,
619 Range
const & range)
const;
622 face_loop_empty(dealii::MatrixFree<dim, Number>
const & matrix_free,
624 VectorType
const & src,
625 Range
const & range)
const;
631 cell_compute_matrix(IntegratorCell & integrator)
const;
634 face_compute_matrix(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const;
637 boundary_face_compute_matrix(IntegratorFace & integrator_m)
const;
640 cell_based_loop_diagonal(dealii::MatrixFree<dim, Number>
const & matrix_free,
642 VectorType
const & src,
643 Range
const & range)
const;
649 cell_loop_block_diagonal(dealii::MatrixFree<dim, Number>
const & matrix_free,
650 std::vector<LAPACKMatrix> & matrices,
651 std::vector<LAPACKMatrix>
const & src,
652 Range
const & range)
const;
655 face_loop_block_diagonal(dealii::MatrixFree<dim, Number>
const & matrix_free,
656 std::vector<LAPACKMatrix> & matrices,
657 std::vector<LAPACKMatrix>
const & src,
658 Range
const & range)
const;
661 boundary_face_loop_block_diagonal(dealii::MatrixFree<dim, Number>
const & matrix_free,
662 std::vector<LAPACKMatrix> & matrices,
663 std::vector<LAPACKMatrix>
const & src,
664 Range
const & range)
const;
668 cell_based_loop_block_diagonal(dealii::MatrixFree<dim, Number>
const & matrix_free,
669 std::vector<LAPACKMatrix> & matrices,
670 std::vector<LAPACKMatrix>
const & src,
671 Range
const & range)
const;
679 cell_loop_apply_inverse_block_diagonal_matrix_based(
680 dealii::MatrixFree<dim, Number>
const & matrix_free,
682 VectorType
const & src,
683 Range
const & range)
const;
689 template<
typename SparseMatrix>
691 internal_init_system_matrix(SparseMatrix & system_matrix,
692 dealii::DynamicSparsityPattern & dsp,
693 MPI_Comm
const & mpi_comm)
const;
695 template<
typename SparseMatrix>
697 internal_calculate_system_matrix(SparseMatrix & system_matrix)
const;
703 set_constrained_dofs_to_one(VectorType & vector)
const;
710 evaluate_face_integrals()
const;
715 template<
typename SparseMatrix>
717 internal_compute_factorized_additive_schwarz_matrices()
const;
733 mutable std::vector<LAPACKMatrix> matrices;
738 mutable VectorType weights;
740 unsigned int n_mpi_processes;
743 mutable bool system_matrix_based_been_initialized;
745#ifdef DEAL_II_WITH_TRILINOS
746 mutable dealii::TrilinosWrappers::SparseMatrix system_matrix_trilinos;
749#ifdef DEAL_II_WITH_PETSC
750 mutable dealii::PETScWrappers::MPI::SparseMatrix system_matrix_petsc;
753 mutable Vec petsc_vector_src;
754 mutable Vec petsc_vector_dst;