13 #include "operator.hpp" 14 #include "../general/forall.hpp" 70 "Number of columns mismatch in Operator::Mult!");
71 for (
int i = 0; i < X.
Size(); i++)
73 MFEM_ASSERT(X[i] && Y[i],
"Missing Vector in Operator::Mult!");
82 "Number of columns mismatch in Operator::MultTranspose!");
83 for (
int i = 0; i < X.
Size(); i++)
85 MFEM_ASSERT(X[i] && Y[i],
"Missing Vector in Operator::MultTranspose!");
94 "Number of columns mismatch in Operator::AddMult!");
95 for (
int i = 0; i < X.
Size(); i++)
97 MFEM_ASSERT(X[i] && Y[i],
"Missing Vector in Operator::AddMult!");
106 "Number of columns mismatch in Operator::AddMultTranspose!");
107 for (
int i = 0; i < X.
Size(); i++)
109 MFEM_ASSERT(X[i] && Y[i],
"Missing Vector in Operator::AddMultTranspose!");
222 trial_tdof_list, test_tdof_list,
254 if (n == 0) { n =
width; }
255 if (m == 0) { m =
height; }
260 os << setiosflags(ios::scientific | ios::showpos);
261 for (
int i = 0; i < n; i++)
265 for (
int j = 0; j < m; j++)
269 os << j+1 <<
" " << i+1 <<
" " << y(j) <<
'\n';
284 mfem_error(
"TimeDependentOperator::ExplicitMult() is not overridden!");
290 mfem_error(
"TimeDependentOperator::ImplicitMult() is not overridden!");
295 mfem_error(
"TimeDependentOperator::Mult() is not overridden!");
301 mfem_error(
"TimeDependentOperator::ImplicitSolve() is not overridden!");
307 mfem_error(
"TimeDependentOperator::GetImplicitGradient() is " 314 mfem_error(
"TimeDependentOperator::GetExplicitGradient() is " 323 mfem_error(
"TimeDependentOperator::SUNImplicitSetup() is not overridden!");
329 mfem_error(
"TimeDependentOperator::SUNImplicitSolve() is not overridden!");
335 mfem_error(
"TimeDependentOperator::SUNMassSetup() is not overridden!");
341 mfem_error(
"TimeDependentOperator::SUNMassSolve() is not overridden!");
347 mfem_error(
"TimeDependentOperator::SUNMassMult() is not overridden!");
356 mfem_error(
"SecondOrderTimeDependentOperator::Mult() is not overridden!");
365 mfem_error(
"SecondOrderTimeDependentOperator::ImplicitSolve() is not overridden!");
370 bool ownA,
bool ownB)
372 A(A), B(B), ownA(ownA), ownB(ownB), z(A->
Width())
375 "incompatible Operators: A->Width() = " << A->
Width()
376 <<
", B->Height() = " << B->
Height());
383 "Operator B of a ProductOperator should not be in iterative mode");
390 if (ownA) {
delete A; }
391 if (ownB) {
delete B; }
397 :
Operator(Rt_.Width(), P_.Width()), Rt(Rt_), A(A_), P(P_)
400 "incompatible Operators: Rt.Height() = " << Rt.
Height()
401 <<
", A.Height() = " << A.
Height());
403 "incompatible Operators: A.Width() = " << A.
Width()
404 <<
", P.Height() = " << P.
Height());
407 const Solver* SolverA =
dynamic_cast<const Solver*
>(&A);
411 "Operator A of an RAPOperator should not be in iterative mode");
414 const Solver* SolverP =
dynamic_cast<const Solver*
>(&P);
418 "Operator P of an RAPOperator should not be in iterative mode");
431 bool ownA,
bool ownB,
bool ownC)
434 , ownA(ownA), ownB(ownB), ownC(ownC)
437 "incompatible Operators: A->Width() = " << A->
Width()
438 <<
", B->Height() = " << B->
Height());
440 "incompatible Operators: B->Width() = " << B->
Width()
441 <<
", C->Height() = " << C->
Height());
448 "Operator B of a TripleProductOperator should not be in iterative mode");
455 "Operator C of a TripleProductOperator should not be in iterative mode");
467 if (ownA) {
delete A; }
468 if (ownB) {
delete B; }
469 if (ownC) {
delete C; }
476 :
Operator(A->Height(), A->Width()), A(A), own_A(own_A_),
477 diag_policy(diag_policy_)
503 const int id = idx[i];
510 const int id = idx[i];
515 MFEM_ABORT(
"unknown diagonal policy");
530 const int id = idx[i];
539 auto d_b =
b.ReadWrite();
542 const int id = idx[i];
561 mfem::forall(csz, [=] MFEM_HOST_DEVICE (
int i) { d_z[idx[i]] = 0.0; });
573 const int id = idx[i];
580 const int id = idx[i];
599 :
Operator(A->Height(), A->Width()), A(A), own_A(own_A_)
624 const int id = trial_idx[i];
634 auto d_b =
b.ReadWrite();
637 d_b[test_idx[i]] = 0.0;
711 int numSteps,
double tolerance,
int seed)
719 double eigenvalue = 1.0;
721 for (
int iter = 0; iter < numSteps; ++iter)
726 if (comm != MPI_COMM_NULL)
741 double eigenvalueNew;
743 if (comm != MPI_COMM_NULL)
754 double diff = std::abs((eigenvalueNew - eigenvalue) / eigenvalue);
756 eigenvalue = eigenvalueNew;
759 if (diff < tolerance)
const T * Read(bool on_dev=true) const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), on_dev).
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 ...
static MemoryClass GetMemoryClass()
(DEPRECATED) Equivalent to GetDeviceMemoryClass().
void FormRectangularSystemOperator(const Array< int > &trial_tdof_list, const Array< int > &test_tdof_list, Operator *&A)
Return in A a parallel (on truedofs) version of this rectangular operator (including constraints)...
ConstrainedOperator(Operator *A, const Array< int > &list, bool own_A=false, DiagonalPolicy diag_policy=DIAG_ONE)
Constructor from a general Operator and a list of essential indices/dofs.
virtual void AddMultTranspose(const Vector &x, Vector &y, const double a=1.0) const
Operator transpose application: y+=A^t(x) (default) or y+=a*A^t(x).
virtual Operator & GetImplicitGradient(const Vector &x, const Vector &k, double shift) const
Return an Operator representing (dF/dk shift + dF/dx) at the given x, k, and the currently set time...
virtual ~ProductOperator()
Array< int > constraint_list
List of constrained indices/dofs.
virtual void ImplicitSolve(const double fac0, const double fac1, const Vector &x, const Vector &dxdt, Vector &k)
Solve the equation: k = f(x + fac0 k, dxdt + fac1 k, t), for the unknown k at the current time t...
void EliminateRHS(const Vector &x, Vector &b) const
Eliminate columns corresponding to "essential boundary condition" values specified in x from the give...
void SyncMemory(const Vector &v) const
Update the memory location of the vector to match v.
void SetSize(int s)
Resize the vector to size s.
virtual void AddMult(const Vector &x, Vector &y, const double a=1.0) const
Operator application: y+=A(x) (default) or y+=a*A(x).
virtual void ImplicitSolve(const double dt, const Vector &x, Vector &k)
Solve the equation: k = f(x + dt k, t), for the unknown k at the current time t.
virtual void UseDevice(bool use_dev) const
Enable execution of Vector operations using the mfem::Device.
virtual const Operator * GetRestriction() const
Restriction operator from input vectors for the operator to linear algebra (linear system) vectors...
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
int Size() const
Returns the size of the vector.
void InitTVectors(const Operator *Po, const Operator *Ri, const Operator *Pi, Vector &x, Vector &b, Vector &X, Vector &B) const
Initializes memory for true vectors of linear system.
virtual MemoryClass GetMemoryClass() const
Return the MemoryClass preferred by the Operator.
virtual const double * Read(bool on_dev=true) const
Shortcut for mfem::Read(vec.GetMemory(), vec.Size(), on_dev).
void FormDiscreteOperator(Operator *&A)
Return in A a parallel (on truedofs) version of this rectangular operator.
ProductOperator(const Operator *A, const Operator *B, bool ownA, bool ownB)
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
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 ...
bool iterative_mode
If true, use the second argument of Mult() as an initial guess.
void Randomize(int seed=0)
Set random values in the vector.
void PrintMatlab(std::ostream &out, int n, int m=0) const
Prints operator with input size n and output size m in Matlab format.
void FormRectangularConstrainedSystemOperator(const Array< int > &trial_tdof_list, const Array< int > &test_tdof_list, RectangularConstrainedOperator *&Aout)
see FormRectangularSystemOperator()
Array< int > test_constraints
virtual int SUNImplicitSolve(const Vector &b, Vector &x, double tol)
Solve the ODE linear system as setup by the method SUNImplicitSetup().
void FormRectangularLinearSystem(const Array< int > &trial_tdof_list, const Array< int > &test_tdof_list, Vector &x, Vector &b, Operator *&A, Vector &X, Vector &B)
Form a column-constrained linear system using a matrix-free approach.
virtual void Mult(const Vector &x, Vector &y) const
Perform the action of the operator: y = k = f(x, t), where k solves the algebraic equation F(x...
General product operator: x -> (A*B)(x) = A(B(x)).
virtual void ArrayAddMultTranspose(const Array< const Vector *> &X, Array< Vector *> &Y, const double a=1.0) const
Operator transpose application on a matrix: Y+=A^t(X) (default) or Y+=a*A^t(X).
static MemoryClass GetDeviceMemoryClass()
Get the current Device MemoryClass. This is the MemoryClass used by most MFEM device kernels to acces...
void mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
virtual void ArrayMult(const Array< const Vector *> &X, Array< Vector *> &Y) const
Operator application on a matrix: Y=A(X).
void FormConstrainedSystemOperator(const Array< int > &ess_tdof_list, ConstrainedOperator *&Aout)
see FormSystemOperator()
virtual int SUNMassSetup()
Setup the mass matrix in the ODE system .
The operator x -> R*A*P*x constructed through the actions of R^T, A and P.
virtual void Mult(const Vector &x, Vector &y) const
Rectangular-constrained operator action.
Set the diagonal value to one.
RAPOperator(const Operator &Rt_, const Operator &A_, const Operator &P_)
Construct the RAP operator given R^T, A and P.
virtual const Operator * GetProlongation() const
Prolongation operator from linear algebra (linear system) vectors, to input vectors for the operator...
void SetSubVectorComplement(const Array< int > &dofs, const double val)
Set all vector entries NOT in the dofs Array to the given val.
bool IsIdentityProlongation(const Operator *P)
virtual const Operator * GetOutputRestriction() const
Restriction operator from output vectors for the operator to linear algebra (linear system) vectors...
Array< int > trial_constraints
virtual void ExplicitMult(const Vector &x, Vector &y) const
Perform the action of the explicit part of the operator, G: y = G(x, t) where t is the current time...
virtual int SUNMassSolve(const Vector &b, Vector &x, double tol)
Solve the mass matrix linear system as setup by the method SUNMassSetup().
void EliminateRHS(const Vector &x, Vector &b) const
Eliminate "essential boundary condition" values specified in x from the given right-hand side b...
void forall(int N, lambda &&body)
Vector w
Auxiliary vectors.
MemoryType
Memory types supported by MFEM.
virtual void AssembleDiagonal(Vector &diag) const
Diagonal of A, modified according to the used DiagonalPolicy.
void FormLinearSystem(const Array< int > &ess_tdof_list, Vector &x, Vector &b, Operator *&A, Vector &X, Vector &B, int copy_interior=0)
Form a constrained linear system using a matrix-free approach.
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
The transpose of a given operator. Switches the roles of the methods Mult() and MultTranspose().
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.
virtual void ArrayMultTranspose(const Array< const Vector *> &X, Array< Vector *> &Y) const
Action of the transpose operator on a matrix: Y=A^t(X).
virtual void Mult(const Vector &x, const Vector &dxdt, Vector &y) const
Perform the action of the operator: y = k = f(x,@ dxdt, t), where k solves the algebraic equation F(x...
double InnerProduct(HypreParVector *x, HypreParVector *y)
virtual double * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), on_dev).
Vector & Add(const double a, const Vector &Va)
(*this) += a * Va
Rectangular Operator for imposing essential boundary conditions on the input space using only the act...
virtual ~TripleProductOperator()
virtual Operator & GetExplicitGradient(const Vector &x) const
Return an Operator representing dG/dx at the given point x and the currently set time.
void FormSystemOperator(const Array< int > &ess_tdof_list, Operator *&A)
Return in A a parallel (on truedofs) version of this square operator.
DiagonalPolicy
Defines operator diagonal policy upon elimination of rows and/or columns.
General triple product operator x -> A*B*C*x, with ownership of the factors.
MemoryType GetMemoryType(MemoryClass mc)
Return a suitable MemoryType for a given MemoryClass.
virtual void AssembleDiagonal(Vector &diag) const
Computes the diagonal entries into diag. Typically, this operation only makes sense for linear Operat...
virtual int SUNImplicitSetup(const Vector &x, const Vector &fx, int jok, int *jcur, double gamma)
Setup the ODE linear system or , where .
TripleProductOperator(const Operator *A, const Operator *B, const Operator *C, bool ownA, bool ownB, bool ownC)
virtual int SUNMassMult(const Vector &x, Vector &v)
Compute the mass matrix-vector product .
virtual void ArrayAddMult(const Array< const Vector *> &X, Array< Vector *> &Y, const double a=1.0) const
Operator application on a matrix: Y+=A(X) (default) or Y+=a*A(X).
Operator * SetupRAP(const Operator *Pi, const Operator *Po)
Returns RAP Operator of this, using input/output Prolongation matrices Pi corresponds to "P"...
int Size() const
Return the logical size of the array.
void MakeRef(T *, int)
Make this Array a reference to a pointer.
void MakeRef(Vector &base, int offset, int size)
Reset the Vector to be a reference to a sub-vector of base.
virtual const Operator * GetOutputProlongation() const
Prolongation operator from linear algebra (linear system) vectors, to output vectors for the operator...
DiagonalPolicy diag_policy
Diagonal policy for constrained dofs.
virtual void Mult(const Vector &x, Vector &y) const
Constrained operator action.
Operator * A
The unconstrained Operator.
Square Operator for imposing essential boundary conditions using only the action, Mult()...
double EstimateLargestEigenvalue(Operator &opr, Vector &v0, int numSteps=10, double tolerance=1e-8, int seed=12345)
Returns an estimate of the largest eigenvalue of the operator opr using the iterative power method...
Set the diagonal value to zero.
int width
Dimension of the input / number of columns in the matrix.
virtual void ImplicitMult(const Vector &x, const Vector &k, Vector &y) const
Perform the action of the implicit part of the operator, F: y = F(x, k, t) where t is the current tim...
RectangularConstrainedOperator(Operator *A, const Array< int > &trial_list, const Array< int > &test_list, bool own_A=false)
Constructor from a general Operator and a list of essential indices/dofs.