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();
158 if (A_local == NULL) {
return; }
159 MFEM_VERIFY(A_local->
Finalized(),
"the local matrix must be finalized");
177 int *J = A_local->
GetJ();
178 for (
int i = 0; i < glob_J.Size(); i++)
182 glob_J[i] = J[i] + ldof_offset;
186 glob_J[i] = face_nbr_glob_ldof[J[i] - lvsize];
228 for (
int i = 0; i < nfaces; i++)
231 int Elem2NbrNo = T->Elem2No - pmesh->
GetNE();
234 vdofs1.
Copy(vdofs_all);
235 for (
int j = 0; j < vdofs2.
Size(); j++)
250 AssembleFaceMatrix(*
pfes->
GetFE(T->Elem1No),
287 "Vector for holding diagonal has wrong size!");
291 MFEM_ASSERT(
p_mat.
Ptr(),
"the ParBilinearForm is not assembled!");
302 Vector local_diag(P->Height());
306 P->MultTranspose(local_diag, diag);
319 MFEM_ABORT(
"unsupported prolongation matrix type.");
330 pfes->GetEssentialTrueDofs(bdr_attr_is_ess, dof_list);
363 "the case of interior face integrators is not" 452 const int remove_zeros = 0;
455 "The ParBilinearForm must be updated with Update() before " 456 "re-assembling the ParBilinearForm.");
517 MFEM_VERIFY(
pfes != NULL,
"nfes must be a ParFiniteElementSpace!");
561 A.
MakeRAP(P_test, dA, P_trial);
566 const double a)
const 638 MFEM_ASSERT(
mat,
"Matrix is not assembled");
639 MFEM_ASSERT(
mat->
Finalized(),
"Matrix is not finalized");
671 A.
MakeRAP(R_test_transpose, dA, P_trial);
690 MFEM_VERIFY(
mat->
Finalized(),
"Local matrix needs to be finalized for " 697 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.
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 ...
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication.
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.
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1)
virtual int NumNonZeroElems() const
Returns the number of the nonzero elements in the matrix.
void ConvertFrom(OperatorHandle &A)
Convert the given OperatorHandle A to the currently set type id.
virtual const Operator * GetProlongationMatrix() const
The returned Operator is owned by the FiniteElementSpace.
void ComputeSolution(const Vector &b, const Vector &sc_sol, Vector &sol) const
const FiniteElement * GetFaceNbrFE(int i) const
int TrueVSize() const
Obsolete, kept for backward compatibility.
void SetSize(int s)
Resize the vector to size s.
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
HypreParMatrix & GetParallelMatrix()
Return the parallel hybridized matrix.
Pointer to an Operator of a specified type.
int * GetJ()
Return the array J.
void SetDims(int rows, int nnz)
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
HypreParMatrix * ParallelAssemble() const
Returns the matrix "assembled" on the true dofs.
int Size() const
Returns the size of the vector.
Data type dense matrix using column-major storage.
bool HasEliminatedBC() const
Return true if essential boundary conditions have been eliminated from the Schur complement matrix...
int * GetI()
Return the array I.
HYPRE_BigInt GetMyDofOffset() const
void EliminateReducedTrueDofs(const Array< int > &ess_rtdof_list, Matrix::DiagonalPolicy dpolicy)
Eliminate the given reduced true dofs from the Schur complement matrix S.
void GetParBlocks(Array2D< HypreParMatrix *> &blocks) const
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.
int GetFaceNbrVSize() const
virtual const SparseMatrix * GetRestrictionMatrix() const
Get the R matrix which restricts a local dof vector to true dof vector.
void DeleteAll()
Delete the whole array.
double * GetData()
Return the element data, i.e. the array A.
void ReduceRHS(const Vector &b, Vector &b_r) const
DofTransformation * GetFaceNbrElementVDofs(int i, Array< int > &vdofs) const
void SetSize(int m, int n)
void ExchangeFaceNbrData()
void HypreStealOwnership(HypreParMatrix &A_hyp, SparseMatrix &A_diag)
Make A_hyp steal ownership of its diagonal part A_diag.
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.
int Append(const T &el)
Append element 'el' to array, resize if necessary.
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 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)
ParMesh * GetParMesh() const
HypreParMatrix & GetParallelMatrix()
Return the parallel Schur complement matrix.
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...
Table * GetFaceToElementTable() const
Set the diagonal value to one.
void RAP(const DenseMatrix &A, const DenseMatrix &P, DenseMatrix &RAP)
HYPRE_BigInt GlobalTrueVSize() const
bool Finalized() const
Returns whether or not CSR format has been finalized.
void AddSubMatrix(const Array< int > &rows, const Array< int > &cols, const DenseMatrix &subm, int skip_zeros=1)
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...
int GetVDim() const
Returns vector dimension.
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...
DofTransformation * GetElementVDofs(int i, Array< int > &vdofs) const
Returns indices of degrees of freedom for the i'th element. The returned indices are offsets into an ...
Wrapper for hypre's parallel vector class.
ParFiniteElementSpace * domain_fes
Points to the same object as trial_fes.
bool IsIdentityProlongation(const Operator *P)
virtual int GetTrueVSize() const
Return the number of vector true (conforming) dofs.
virtual void MultTranspose(const Vector &x, Vector &y) const
Multiply a vector with the transposed matrix. y = At * x.
Mesh * GetMesh() const
Returns the mesh.
int GetNSharedFaces() const
Return the number of shared faces (3D), edges (2D), vertices (1D)
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...
virtual const FiniteElement * GetFE(int i) const
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
HYPRE_BigInt GlobalVSize() const
ParFiniteElementSpace * ParFESpace() const
void Finalize()
Finalize the construction of the Schur complement matrix.
void Transpose(const Table &A, Table &At, int ncols_A_)
Transpose a Table.
Table * GetFaceToAllElementTable() const
void Clear()
Clear the OperatorHandle, deleting the held Operator (if owned), while leaving the type id unchanged...
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
void Distribute(const Vector *tv)
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.
HYPRE_BigInt * GetDofOffsets() const
int GetNE() const
Returns number of elements.
virtual const Operator * GetProlongationMatrix() const
The returned Operator is owned by the FiniteElementSpace.
Operator::Type Type() const
Get the currently set operator type id.
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
OpType * As() const
Return the Operator pointer statically cast to a specified OpType. Similar to the method Get()...
int Size() const
Returns the number of TYPE I elements.
Ordering::Type GetOrdering() const
Return the ordering method.
ParFiniteElementSpace * range_fes
Points to the same object as test_fes.
virtual void AssembleDiagonal(Vector &diag) const
Computes the diagonal entries into diag. Typically, this operation only makes sense for linear Operat...
void Copy(Array ©) const
Create a copy of the internal array to the provided copy.
int GetVSize() const
Return the number of vector dofs, i.e. GetNDofs() x GetVDim().
Operator * Ptr() const
Access the underlying Operator pointer.
int Size() const
Return the logical size of the array.
ID for class HypreParMatrix.
HypreParMatrix * Dof_TrueDof_Matrix() const
The true dof-to-dof interpolation matrix.
void SetEssentialTrueDofs(const Array< int > &ess_tdof_list)
Determine and save internally essential reduced true dofs.
HYPRE_Int MultTranspose(HypreParVector &x, HypreParVector &y, double alpha=1.0, double beta=0.0) const
Computes y = alpha * A^t * x + beta * y.
Wrapper for hypre's ParCSR matrix class.
void ComputeSolution(const Vector &b, const Vector &sol_r, Vector &sol) const
Class for parallel meshes.
HYPRE_BigInt * GetTrueDofOffsets() const
const Table & GetElementToDofTable() const
Return a reference to the internal Table that stores the lists of scalar dofs, for each mesh element...
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.