Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 3 : 4 : // This library is free software; you can redistribute it and/or 5 : // modify it under the terms of the GNU Lesser General Public 6 : // License as published by the Free Software Foundation; either 7 : // version 2.1 of the License, or (at your option) any later version. 8 : 9 : // This library is distributed in the hope that it will be useful, 10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 : // Lesser General Public License for more details. 13 : 14 : // You should have received a copy of the GNU Lesser General Public 15 : // License along with this library; if not, write to the Free Software 16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 : 18 : #ifndef LIBMESH_PETSC_MATRIX_SHELL_MATRIX_H 19 : #define LIBMESH_PETSC_MATRIX_SHELL_MATRIX_H 20 : 21 : #include "libmesh/libmesh_config.h" 22 : 23 : #ifdef LIBMESH_HAVE_PETSC 24 : 25 : #include "libmesh/petsc_matrix_base.h" 26 : #include "libmesh/petsc_shell_matrix.h" 27 : 28 : namespace libMesh 29 : { 30 : 31 : /** 32 : * This class allows to use a PETSc shell matrix as a PetscMatrix 33 : * 34 : * \author Alexander Lindsay 35 : * \date 2024 36 : */ 37 : template <typename T> 38 340 : class PetscMatrixShellMatrix : public PetscMatrixBase<T> 39 : { 40 : public: 41 : explicit PetscMatrixShellMatrix(const Parallel::Communicator & comm_in); 42 : 43 : virtual void init(const numeric_index_type m, 44 : const numeric_index_type n, 45 : const numeric_index_type m_l, 46 : const numeric_index_type n_l, 47 : const numeric_index_type = 30, 48 : const numeric_index_type = 10, 49 : const numeric_index_type blocksize = 1) override; 50 : 51 : /** 52 : * Initialize this matrix using the sparsity structure computed by \p dof_map. 53 : * @param type The serial/parallel/ghosted type of the matrix 54 : */ 55 : virtual void init(ParallelType = PARALLEL) override; 56 : 57 : virtual SparseMatrix<T> & operator=(const SparseMatrix<T> &) override; 58 : 59 0 : virtual bool require_sparsity_pattern() const override { return false; } 60 : 61 : private: 62 : // Make this private because we mark as initialized after we've done our initialization, and we 63 : // don't want derived classes to mistakenly register their data as initialized (or not) 64 : using PetscMatrixBase<T>::_is_initialized; 65 : 66 : /// Whether to omit constrained degrees of freedom 67 : const bool _omit_constrained_dofs; 68 : 69 : friend void init_shell_mat<PetscMatrixShellMatrix<T>>(PetscMatrixShellMatrix<T> & obj); 70 : friend void init_shell_mat<PetscMatrixShellMatrix<T>>(PetscMatrixShellMatrix<T> & obj, 71 : const numeric_index_type m, 72 : const numeric_index_type n, 73 : const numeric_index_type m_l, 74 : const numeric_index_type n_l, 75 : const numeric_index_type blocksize_in); 76 : }; 77 : 78 : //----------------------------------------------------------------------- 79 : // PetscMatrixShellMatrix inline members 80 : template <typename T> 81 350 : PetscMatrixShellMatrix<T>::PetscMatrixShellMatrix(const Parallel::Communicator & comm_in) 82 350 : : PetscMatrixBase<T>(comm_in), _omit_constrained_dofs(false) 83 : { 84 10 : } 85 : 86 : template <typename T> 87 : SparseMatrix<T> & 88 0 : PetscMatrixShellMatrix<T>::operator=(const SparseMatrix<T> &) 89 : { 90 0 : libmesh_error(); 91 : } 92 : 93 : } // namespace libMesh 94 : 95 : #endif // LIBMESH_HAVE_PETSC 96 : #endif // LIBMESH_SPARSE_SHELL_MATRIX_H