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();
116 double *data =
new double[I[nrows]];
126 if (m == NULL) {
return NULL; }
128 MFEM_VERIFY(m->
Finalized(),
"local matrix needs to be finalized for "
132 if (
fbfi.Size() == 0)
147 for (
int i = 0; i < glob_J.Size(); i++)
151 glob_J[i] = J[i] + ldof_offset;
155 glob_J[i] = face_nbr_glob_ldof[J[i] - lvsize];
180 for (
int i = 0; i < nfaces; i++)
185 vdofs1.
Copy(vdofs_all);
186 for (
int j = 0; j < vdofs2.
Size(); j++)
191 for (
int k = 0; k <
fbfi.Size(); k++)
210 if (
mat == NULL &&
fbfi.Size() > 0)
231 pfes->GetEssentialTrueDofs(bdr_attr_is_ess, dof_list);
251 MFEM_VERIFY(
fbfi.Size() == 0,
"the case of interior face integrators is not"
287 "The ParBilinearForm must be updated with Update() before "
288 "re-assembling the ParBilinearForm.");
309 ess_rtdof_list,
X, B);
310 if (!copy_interior) { X.SetSubVectorComplement(ess_rtdof_list, 0.0); }
375 MFEM_VERIFY(
pfes != NULL,
"nfes must be a ParFiniteElementSpace!");
386 MFEM_ASSERT(
mat,
"matrix is not assembled");
387 MFEM_ASSERT(
mat->
Finalized(),
"matrix is not finalized");
398 MFEM_VERIFY(
mat->
Finalized(),
"local matrix needs to be finalized for "
405 RLP->GetBlocks(blocks,
433 const double a)
const
Ordering::Type GetOrdering() const
Return the ordering method.
int Size() const
Logical size of the array.
void EliminateRowsCols(const Array< int > &rows_cols, const HypreParVector &X, HypreParVector &B)
virtual int NumNonZeroElems() const
Returns the number of the nonzero elements in the matrix.
void SetSpace(ParFiniteElementSpace *f)
void ReduceRHS(const Vector &b, Vector &sc_b) const
void MakeRef(const HypreParMatrix &master)
Make this HypreParMatrix a reference to 'master'.
HypreParMatrix * LeftDiagMult(const SparseMatrix &D, HYPRE_Int *row_starts=NULL) const
void SetSize(int s)
Resize the vector if the new size is different.
HYPRE_Int MultTranspose(HypreParVector &x, HypreParVector &y, double alpha=1.0, double beta=0.0)
Computes y = alpha * A^t * x + beta * y.
void GetElementVDofs(int i, Array< int > &vdofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
HypreParMatrix & GetParallelMatrix()
Return the parallel hybridized matrix.
int GetNSharedFaces() const
Return the number of shared faces (3D), edges (2D), vertices (1D)
void SetDims(int rows, int nnz)
void Copy(Array ©) const
Create a copy of the current array.
HYPRE_Int * GetDofOffsets()
Data type dense matrix using column-major storage.
int Size() const
Returns the size of the vector.
void LoseData()
Call this if data has been stolen.
Abstract parallel finite element space.
virtual const SparseMatrix * GetRestrictionMatrix()
Get the R matrix which restricts a local dof vector to true dof vector.
void ComputeSolution(const Vector &b, const Vector &sc_sol, Vector &sol) const
const HYPRE_Int * GetFaceNbrGlobalDofMap()
HYPRE_Int Mult(HypreParVector &x, HypreParVector &y, double alpha=1.0, double beta=0.0)
Computes y = alpha * A * x + beta * y.
HYPRE_Int GetMyDofOffset() const
HYPRE_Int * GetTrueDofOffsets()
void EliminateBC(HypreParMatrix &A, HypreParMatrix &Ae, const Array< int > &ess_dof_list, const Vector &X, Vector &B)
void GetFaceNbrElementVDofs(int i, Array< int > &vdofs) const
void SetSize(int m, int n)
const FiniteElement * GetFaceNbrFE(int i) const
void ExchangeFaceNbrData()
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows.
int Append(const T &el)
Append element to array, resize if necessary.
Mesh * GetMesh() const
Returns the mesh.
void ComputeSolution(const Vector &b, const Vector &sol_r, Vector &sol) const
FaceElementTransformations * GetSharedFaceTransformations(int sf, bool fill2=true)
HypreParMatrix * RAP(HypreParMatrix *A, HypreParMatrix *P)
Returns the matrix P^t * A * P.
HypreParMatrix & GetParallelMatrix()
Return the parallel Schur complement matrix.
void Transpose(const Table &A, Table &At, int _ncols_A)
Transpose a Table.
int Size() const
Returns the number of TYPE I elements.
int GetVDim() const
Returns vector dimension.
double * GetData() const
Return element data.
void AddSubMatrix(const Array< int > &rows, const Array< int > &cols, const DenseMatrix &subm, int skip_zeros=1)
int * GetI() const
Return the array I.
void SetSubVectorComplement(const Array< int > &dofs, const double val)
Set all vector entries NOT in the 'dofs' array to the given 'val'.
HypreParMatrix * Dof_TrueDof_Matrix()
The true dof-to-dof interpolation matrix.
HypreParMatrix * ParallelAssemble() const
Returns the matrix "assembled" on the true dofs.
Wrapper for hypre's parallel vector class.
ParFiniteElementSpace * domain_fes
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication.
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list)
void Finalize()
Finalize the construction of the Schur complement matrix.
void Distribute(const Vector *tv)
void EliminateReducedTrueDofs(const Array< int > &ess_rtdof_list, int keep_diagonal)
Eliminate the given reduced true dofs from the Schur complement matrix S.
HypreParMatrix & GetParallelMatrixElim()
Return the eliminated part of the parallel Schur complement matrix.
Table * GetFaceToElementTable() const
Table face_nbr_element_dof
ParFiniteElementSpace * range_fes
bool HasEliminatedBC() const
void MultTranspose(const Vector &x, Vector &y) const
Multiply a vector with the transposed matrix. y = At * x.
const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement associated with i'th element.
int GetFaceNbrVSize() const
void GetParBlocks(Array2D< HypreParMatrix * > &blocks) const
void ReduceRHS(const Vector &b, Vector &b_r) const
const Table & GetElementToDofTable() const
void ReduceSolution(const Vector &sol, Vector &sc_sol) const
Table * GetFaceToAllElementTable() const
Wrapper for hypre's ParCSR matrix class.
int * GetJ() const
Return the array J.
Class for parallel meshes.
void ConvertListToReducedTrueDofs(const Array< int > &ess_tdof_list, Array< int > &ess_rtdof_list) const
ParFiniteElementSpace * ParFESpace() const