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");
133 if (
fbfi.Size() == 0)
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++)
217 for (
int k = 0; k <
fbfi.Size(); k++)
236 if (
mat == NULL &&
fbfi.Size() > 0)
257 pfes->GetEssentialTrueDofs(bdr_attr_is_ess, dof_list);
277 MFEM_VERIFY(
fbfi.Size() == 0,
"the case of interior face integrators is not"
373 const int remove_zeros = 0;
376 "The ParBilinearForm must be updated with Update() before "
377 "re-assembling the ParBilinearForm.");
438 MFEM_VERIFY(
pfes != NULL,
"nfes must be a ParFiniteElementSpace!");
482 A.
MakeRAP(P_test, dA, P_trial);
487 const double a)
const
559 MFEM_ASSERT(
mat,
"Matrix is not assembled");
560 MFEM_ASSERT(
mat->
Finalized(),
"Matrix is not finalized");
571 MFEM_VERIFY(
mat->
Finalized(),
"Local matrix needs to be finalized for "
578 RLP->GetBlocks(blocks,
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.
HYPRE_Int * GetDofOffsets() const
virtual const Operator * GetProlongationMatrix() const
The returned Operator is owned by the FiniteElementSpace.
HypreParMatrix * LeftDiagMult(const SparseMatrix &D, HYPRE_Int *row_starts=NULL) const
Multiply the HypreParMatrix on the left by a block-diagonal parallel matrix D and return the result a...
void SetSize(int s)
Resize the vector to size s.
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.
int TrueVSize() const
Obsolete, kept for backward compatibility.
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)
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
const HYPRE_Int * GetFaceNbrGlobalDofMap()
HYPRE_Int GetMyDofOffset() 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.
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 'el' to array, resize if necessary.
Mesh * GetMesh() const
Returns the mesh.
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.
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.
Set the diagonal value to one.
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.
bool Finalized() const
Returns whether or not CSR format has been finalized.
HYPRE_Int GlobalVSize() const
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.
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 Clear()
Clear the OperatorHandle, deleting the held Operator (if owned), while leaving the type id unchanged...
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.
Table * GetFaceToElementTable() const
void SetOperatorOwner(bool own=true)
Set the ownership flag for the held Operator.
Table face_nbr_element_dof
void MakeSquareBlockDiag(MPI_Comm comm, HYPRE_Int glob_size, HYPRE_Int *row_starts, SparseMatrix *diag)
Reset the OperatorHandle to hold a parallel square block-diagonal matrix using the currently set type...
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.
const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
void MakeRectangularBlockDiag(MPI_Comm comm, HYPRE_Int glob_num_rows, HYPRE_Int glob_num_cols, HYPRE_Int *row_starts, HYPRE_Int *col_starts, SparseMatrix *diag)
Reset the OperatorHandle to hold a parallel rectangular block-diagonal matrix using the currently set...
int GetFaceNbrVSize() const
HYPRE_Int * GetTrueDofOffsets() 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...
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.
ParFiniteElementSpace * ParFESpace() const