12 #include "../config/config.hpp"
17 #include "../general/sort_pairs.hpp"
46 int s1 = lelem_ldof.
Size(), s2 = nelem_ndof.
Size();
47 const int *I1 = lelem_ldof.
GetI(), *J1 = lelem_ldof.
GetJ();
48 const int *I2 = nelem_ndof.
GetI(), *J2 = nelem_ndof.
GetJ();
49 const int nnz1 = I1[s1], nnz2 = I2[s2];
51 elem_dof.
SetDims(s1 + s2, nnz1 + nnz2);
53 int *I = elem_dof.
GetI(), *J = elem_dof.
GetJ();
54 for (
int i = 0; i <= s1; i++)
58 for (
int j = 0; j < nnz1; j++)
62 for (
int i = 0; i <= s2; i++)
64 I[s1+i] = I2[i] + nnz1;
66 for (
int j = 0; j < nnz2; j++)
68 J[nnz1+j] = J2[j] +
height;
105 mfem::Mult(*face_lelem, lelem_ldof, face_ldof);
113 int *I = dof_dof.
GetI();
114 int *J = dof_dof.
GetJ();
115 int nrows = dof_dof.
Size();
128 if (A_local == NULL) {
return; }
129 MFEM_VERIFY(A_local->
Finalized(),
"the local matrix must be finalized");
147 int *J = A_local->
GetJ();
148 for (
int i = 0; i < glob_J.Size(); i++)
152 glob_J[i] = J[i] + ldof_offset;
156 glob_J[i] = face_nbr_glob_ldof[J[i] - lvsize];
198 for (
int i = 0; i < nfaces; i++)
204 vdofs1.
Copy(vdofs_all);
205 for (
int j = 0; j < vdofs2.
Size(); j++)
257 "Vector for holding diagonal has wrong size!");
261 MFEM_ASSERT(
p_mat.
Ptr(),
"the ParBilinearForm is not assembled!");
272 Vector local_diag(P->Height());
276 P->MultTranspose(local_diag, diag);
289 MFEM_ABORT(
"unsupported prolongation matrix type.");
300 pfes->GetEssentialTrueDofs(bdr_attr_is_ess, dof_list);
335 "the case of interior face integrators is not"
425 const int remove_zeros = 0;
428 "The ParBilinearForm must be updated with Update() before "
429 "re-assembling the ParBilinearForm.");
490 MFEM_VERIFY(
pfes != NULL,
"nfes must be a ParFiniteElementSpace!");
534 A.
MakeRAP(P_test, dA, P_trial);
539 const double a)
const
611 MFEM_ASSERT(
mat,
"Matrix is not assembled");
612 MFEM_ASSERT(
mat->
Finalized(),
"Matrix is not finalized");
637 A.
MakeRAP(R_test_transpose, dA, P_trial);
655 MFEM_VERIFY(
mat->
Finalized(),
"Local matrix needs to be finalized for "
662 RLP->GetBlocks(blocks,
MemoryType GetHypreMemoryType()
The MemoryType used by MFEM when allocating arrays for Hypre objects.
virtual void FormRectangularSystemMatrix(OperatorHandle &A)
Return in A a parallel (on truedofs) version of this operator.
Ordering::Type GetOrdering() const
Return the ordering method.
int Size() const
Return the logical size of the array.
void EliminateRowsCols(const Array< int > &rows_cols, const HypreParVector &X, HypreParVector &B)
void SetSubVector(const Array< int > &dofs, const double value)
Set the entries listed in dofs to the given value.
int GetVSize() const
Return the number of vector dofs, i.e. GetNDofs() x GetVDim().
virtual int NumNonZeroElems() const
Returns the number of the nonzero elements in the matrix.
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1)
void ConvertFrom(OperatorHandle &A)
Convert the given OperatorHandle A to the currently set type id.
OpType * As() const
Return the Operator pointer statically cast to a specified OpType. Similar to the method Get()...
ParMesh * GetParMesh() const
HypreParMatrix * RAP(const HypreParMatrix *A, const HypreParMatrix *P)
Returns the matrix P^t * A * P.
virtual const Operator * GetProlongationMatrix() const
The returned Operator is owned by the FiniteElementSpace.
void SetSize(int s)
Resize the vector to size s.
int TrueVSize() const
Obsolete, kept for backward compatibility.
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
HypreParMatrix & GetParallelMatrix()
Return the parallel hybridized matrix.
int GetNSharedFaces() const
Return the number of shared faces (3D), edges (2D), vertices (1D)
Pointer to an Operator of a specified type.
int * GetJ()
Return the array J.
void SetDims(int rows, int nnz)
Operator::Type Type() const
Get the currently set operator type id.
void Copy(Array ©) const
Create a copy of the internal array to the provided copy.
void EliminateBC(const OperatorHandle &A_e, const Array< int > &ess_dof_list, const Vector &X, Vector &B) const
Eliminate essential dofs from the solution X into the r.h.s. B.
Data type dense matrix using column-major storage.
int Size() const
Returns the size of the vector.
void ReduceSystem(Vector &x, Vector &b, Vector &X, Vector &B, int copy_interior=0) const
Set the reduced solution X and r.h.s B vectors from the full linear system solution x and r...
int * GetI()
Return the array I.
int GetNE() const
Returns number of elements.
void EliminateReducedTrueDofs(const Array< int > &ess_rtdof_list, Matrix::DiagonalPolicy dpolicy)
Eliminate the given reduced true dofs from the Schur complement matrix S.
void LoseData()
Call this if data has been stolen.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void SetSpace(FiniteElementSpace *f)
Associate a new FiniteElementSpace with the ParGridFunction.
Abstract parallel finite element space.
void ComputeSolution(const Vector &b, const Vector &sc_sol, Vector &sol) const
void DeleteAll()
Delete the whole array.
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
double * GetData()
Return the element data, i.e. the array A.
virtual int GetTrueVSize() const
Return the number of local vector true dofs.
void AbsMultTranspose(double a, const Vector &x, double b, Vector &y) const
Computes y = a * |At| * x + b * y, using entry-wise absolute values of the transpose of the matrix A...
void SetSize(int m, int n)
HYPRE_BigInt GlobalVSize() const
const FiniteElement * GetFaceNbrFE(int i) const
DofTransformation * GetElementVDofs(int i, Array< int > &vdofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
void ExchangeFaceNbrData()
virtual const FiniteElement * GetFE(int i) const
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
int Append(const T &el)
Append element 'el' to array, resize if necessary.
void EnsureMultTranspose() const
Ensures that the matrix is capable of performing MultTranspose(), AddMultTranspose(), and AbsMultTranspose().
Mesh * GetMesh() const
Returns the mesh.
void mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
const HYPRE_BigInt * GetFaceNbrGlobalDofMap()
void ComputeSolution(const Vector &b, const Vector &sol_r, Vector &sol) const
void EliminateRowsCols(OperatorHandle &A, const Array< int > &ess_dof_list)
Reset the OperatorHandle to be the eliminated part of A after elimination of the essential dofs ess_d...
FaceElementTransformations * GetSharedFaceTransformations(int sf, bool fill2=true)
HypreParMatrix * Dof_TrueDof_Matrix() const
The true dof-to-dof interpolation matrix.
HypreParMatrix & GetParallelMatrix()
Return the parallel Schur complement matrix.
virtual const Operator * GetProlongationMatrix() const
The returned Operator is owned by the FiniteElementSpace.
HYPRE_BigInt GetMyDofOffset() const
virtual int GetTrueVSize() const
Return the number of vector true (conforming) dofs.
int Size() const
Returns the number of TYPE I elements.
int GetVDim() const
Returns vector dimension.
Set the diagonal value to one.
HYPRE_BigInt * GetDofOffsets() const
void AddSubMatrix(const Array< int > &rows, const Array< int > &cols, const DenseMatrix &subm, int skip_zeros=1)
Operator * Ptr() const
Access the underlying Operator pointer.
Dynamic 2D array using row-major layout.
void SetSubVectorComplement(const Array< int > &dofs, const double val)
Set all vector entries NOT in the dofs Array to the given val.
void MakeRectangularBlockDiag(MPI_Comm comm, HYPRE_BigInt glob_num_rows, HYPRE_BigInt glob_num_cols, HYPRE_BigInt *row_starts, HYPRE_BigInt *col_starts, SparseMatrix *diag)
Reset the OperatorHandle to hold a parallel rectangular block-diagonal matrix using the currently set...
bool Finalized() const
Returns whether or not CSR format has been finalized.
HypreParMatrix * ParallelAssemble() const
Returns the matrix "assembled" on the true dofs.
Wrapper for hypre's parallel vector class.
ParFiniteElementSpace * domain_fes
Points to the same object as trial_fes.
HYPRE_BigInt * GetTrueDofOffsets() const
bool IsIdentityProlongation(const Operator *P)
void MakeSquareBlockDiag(MPI_Comm comm, HYPRE_BigInt glob_size, HYPRE_BigInt *row_starts, SparseMatrix *diag)
Reset the OperatorHandle to hold a parallel square block-diagonal matrix using the currently set type...
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication.
void Finalize()
Finalize the construction of the Schur complement matrix.
void Transpose(const Table &A, Table &At, int ncols_A_)
Transpose a Table.
void Clear()
Clear the OperatorHandle, deleting the held Operator (if owned), while leaving the type id unchanged...
void Distribute(const Vector *tv)
HYPRE_Int MultTranspose(HypreParVector &x, HypreParVector &y, double alpha=1.0, double beta=0.0) const
Computes y = alpha * A^t * x + beta * y.
virtual void RecoverFEMSolution(const Vector &X, const Vector &b, Vector &x)
Reconstruct a solution vector x (e.g. a GridFunction) from the solution X of a constrained linear sys...
int height
Dimension of the output / number of rows in the matrix.
Table * GetFaceToElementTable() const
Vector & Add(const double a, const Vector &Va)
(*this) += a * Va
void SetOperatorOwner(bool own=true)
Set the ownership flag for the held Operator.
Table face_nbr_element_dof
virtual void AssembleDiagonal(Vector &diag) const
Computes the diagonal entries into diag. Typically, this operation only makes sense for linear Operat...
virtual const SparseMatrix * GetRestrictionMatrix() const
Get the R matrix which restricts a local dof vector to true dof vector.
ParFiniteElementSpace * range_fes
Points to the same object as test_fes.
bool HasEliminatedBC() const
Return true if essential boundary conditions have been eliminated from the Schur complement matrix...
void MultTranspose(const Vector &x, Vector &y) const
Multiply a vector with the transposed matrix. y = At * x.
int GetFaceNbrVSize() const
void GetParBlocks(Array2D< HypreParMatrix * > &blocks) const
ID for class HypreParMatrix.
void ReduceRHS(const Vector &b, Vector &b_r) const
const Table & GetElementToDofTable() const
Return a reference to the internal Table that stores the lists of scalar dofs, for each mesh element...
HypreParMatrix * LeftDiagMult(const SparseMatrix &D, HYPRE_BigInt *row_starts=NULL) const
Multiply the HypreParMatrix on the left by a block-diagonal parallel matrix D and return the result a...
void SetEssentialTrueDofs(const Array< int > &ess_tdof_list)
Determine and save internally essential reduced true dofs.
Table * GetFaceToAllElementTable() const
Wrapper for hypre's ParCSR matrix class.
Class for parallel meshes.
void MakePtAP(OperatorHandle &A, OperatorHandle &P)
Reset the OperatorHandle to hold the product P^t A P.
int width
Dimension of the input / number of columns in the matrix.
void MakeRAP(OperatorHandle &Rt, OperatorHandle &A, OperatorHandle &P)
Reset the OperatorHandle to hold the product R A P, where R = Rt^t.
void Reset(OpType *A, bool own_A=true)
Reset the OperatorHandle to the given OpType pointer, A.
DofTransformation * GetFaceNbrElementVDofs(int i, Array< int > &vdofs) const
ParFiniteElementSpace * ParFESpace() const