MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_RefMaxwell_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // MueLu: A package for multigrid based preconditioning
4 //
5 // Copyright 2012 NTESS and the MueLu contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef MUELU_REFMAXWELL_DECL_HPP
11 #define MUELU_REFMAXWELL_DECL_HPP
12 
13 #include "MueLu_ConfigDefs.hpp"
14 #include "MueLu_BaseClass.hpp"
15 
20 #include "MueLu_SaPFactory_fwd.hpp"
23 #include "MueLu_Utilities_fwd.hpp"
24 
25 #include "MueLu_MasterList.hpp"
26 #include "MueLu_FactoryManager.hpp"
29 #include "MueLu_PerfUtils_fwd.hpp"
30 #include "MueLu_RAPFactory_fwd.hpp"
31 
34 
41 
44 #include "MueLu_Hierarchy_fwd.hpp"
45 
46 #include "Xpetra_Operator.hpp"
47 #include "Xpetra_Map_fwd.hpp"
48 #include "Xpetra_Matrix_fwd.hpp"
54 
55 namespace MueLu {
56 
216 template <class Scalar,
217  class LocalOrdinal,
218  class GlobalOrdinal,
219  class Node>
220 class RefMaxwell : public VerboseObject, public Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> {
221 #undef MUELU_REFMAXWELL_SHORT
222 #include "MueLu_UseShortNames.hpp"
223 
224  public:
228 
231  : HierarchyCoarse11_(Teuchos::null)
232  , Hierarchy22_(Teuchos::null)
233  , disable_addon_(MasterList::getDefault<bool>("refmaxwell: disable addon"))
234  , mode_(MasterList::getDefault<std::string>("refmaxwell: mode")) {
235  }
236 
239  : HierarchyCoarse11_(HH)
240  , Hierarchy22_(H22)
241  , disable_addon_(MasterList::getDefault<bool>("refmaxwell: disable addon"))
242  , mode_(MasterList::getDefault<std::string>("refmaxwell: mode")) {
243  }
244 
246  const Teuchos::RCP<Matrix> &Dk_1,
247  const Teuchos::RCP<Matrix> &Dk_2,
248  const Teuchos::RCP<Matrix> &D0,
249  const Teuchos::RCP<Matrix> &M1_beta,
250  const Teuchos::RCP<Matrix> &M1_alpha,
251  const Teuchos::RCP<Matrix> &Mk_one,
252  const Teuchos::RCP<Matrix> &Mk_1_one,
253  const Teuchos::RCP<Matrix> &invMk_1_invBeta,
254  const Teuchos::RCP<Matrix> &invMk_2_invAlpha,
255  const Teuchos::RCP<MultiVector> &Nullspace11,
256  const Teuchos::RCP<MultiVector> &Nullspace22,
257  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
259  bool ComputePrec = true) {
260  int spaceNumber = List.get<int>("refmaxwell: space number", 1);
261  initialize(spaceNumber,
262  Dk_1, Dk_2, D0,
263  M1_beta, M1_alpha,
264  Mk_one, Mk_1_one,
265  invMk_1_invBeta, invMk_2_invAlpha,
266  Nullspace11, Nullspace22, NodalCoords,
267  Teuchos::null, Teuchos::null,
268  List);
269  resetMatrix(SM_Matrix, ComputePrec);
270  }
271 
273  const Teuchos::RCP<Matrix> &Dk_1,
274  const Teuchos::RCP<Matrix> &Dk_2,
275  const Teuchos::RCP<Matrix> &D0,
276  const Teuchos::RCP<Matrix> &M1_beta,
277  const Teuchos::RCP<Matrix> &M1_alpha,
278  const Teuchos::RCP<Matrix> &Mk_one,
279  const Teuchos::RCP<Matrix> &Mk_1_one,
280  const Teuchos::RCP<Matrix> &invMk_1_invBeta,
281  const Teuchos::RCP<Matrix> &invMk_2_invAlpha,
282  const Teuchos::RCP<MultiVector> &Nullspace11,
283  const Teuchos::RCP<MultiVector> &Nullspace22,
284  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
285  const Teuchos::RCP<MultiVector> &Material_beta,
286  const Teuchos::RCP<MultiVector> &Material_alpha,
288  bool ComputePrec = true) {
289  int spaceNumber = List.get<int>("refmaxwell: space number", 1);
290  initialize(spaceNumber,
291  Dk_1, Dk_2, D0,
292  M1_beta, M1_alpha,
293  Mk_one, Mk_1_one,
294  invMk_1_invBeta, invMk_2_invAlpha,
295  Nullspace11, Nullspace22, NodalCoords,
296  Material_beta, Material_alpha,
297  List);
298  resetMatrix(SM_Matrix, ComputePrec);
299  }
300 
314  const Teuchos::RCP<Matrix> &D0_Matrix,
315  const Teuchos::RCP<Matrix> &Ms_Matrix,
316  const Teuchos::RCP<Matrix> &M0inv_Matrix,
317  const Teuchos::RCP<Matrix> &M1_Matrix,
318  const Teuchos::RCP<MultiVector> &Nullspace11,
319  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
321  bool ComputePrec = true) {
322  initialize(D0_Matrix, Ms_Matrix, M0inv_Matrix, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
323  resetMatrix(SM_Matrix, ComputePrec);
324  }
325 
327  const Teuchos::RCP<Matrix> &D0_Matrix,
328  const Teuchos::RCP<Matrix> &Ms_Matrix,
329  const Teuchos::RCP<Matrix> &M0inv_Matrix,
330  const Teuchos::RCP<Matrix> &M1_Matrix,
331  const Teuchos::RCP<MultiVector> &Nullspace11,
332  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
333  const Teuchos::RCP<MultiVector> &Material,
335  bool ComputePrec = true) {
336  initialize(D0_Matrix, Ms_Matrix, M0inv_Matrix, M1_Matrix, Nullspace11, NodalCoords, Material, List);
337  resetMatrix(SM_Matrix, ComputePrec);
338  }
339 
352  const Teuchos::RCP<Matrix> &D0_Matrix,
353  const Teuchos::RCP<Matrix> &M0inv_Matrix,
354  const Teuchos::RCP<Matrix> &M1_Matrix,
355  const Teuchos::RCP<MultiVector> &Nullspace11,
356  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
358  bool ComputePrec = true) {
359  initialize(D0_Matrix, M1_Matrix, M0inv_Matrix, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
360  resetMatrix(SM_Matrix, ComputePrec);
361  }
362 
373  const Teuchos::RCP<Matrix> &M0inv_Matrix,
374  const Teuchos::RCP<Matrix> &M1_Matrix,
375  const Teuchos::RCP<MultiVector> &Nullspace11,
376  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
378  : SM_Matrix_(Teuchos::null) {
379  initialize(D0_Matrix, M1_Matrix, M0inv_Matrix, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
380  }
381 
393  const Teuchos::RCP<Matrix> &D0_Matrix,
394  const Teuchos::RCP<Matrix> &M1_Matrix,
395  const Teuchos::RCP<MultiVector> &Nullspace11,
396  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
398  bool ComputePrec) {
399  initialize(D0_Matrix, M1_Matrix, Teuchos::null, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
400  resetMatrix(SM_Matrix, ComputePrec);
401  }
402 
412  const Teuchos::RCP<Matrix> &M1_Matrix,
413  const Teuchos::RCP<MultiVector> &Nullspace11,
414  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
416  : SM_Matrix_(Teuchos::null) {
417  initialize(D0_Matrix, M1_Matrix, Teuchos::null, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
418  }
419 
426  RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
428  bool ComputePrec = true);
429 
431  virtual ~RefMaxwell() {}
432 
435 
437  const Teuchos::RCP<const Map> getRangeMap() const;
438 
441  return SM_Matrix_;
442  }
443 
446 
448  void compute(bool reuse = false);
449 
451  void resetMatrix(Teuchos::RCP<Matrix> SM_Matrix_new, bool ComputePrec = true);
452 
456  void apply(const MultiVector &X, MultiVector &Y,
460 
462  bool hasTransposeApply() const;
463 
465 
467  void residual(const MultiVector &X,
468  const MultiVector &B,
469  MultiVector &R) const {
470  using STS = Teuchos::ScalarTraits<Scalar>;
471  R.update(STS::one(), B, STS::zero());
472  this->apply(X, R, Teuchos::NO_TRANS, -STS::one(), STS::one());
473  }
474 
475  private:
477 
490  void initialize(const Teuchos::RCP<Matrix> &D0_Matrix,
491  const Teuchos::RCP<Matrix> &Ms_Matrix,
492  const Teuchos::RCP<Matrix> &M0inv_Matrix,
493  const Teuchos::RCP<Matrix> &M1_Matrix,
494  const Teuchos::RCP<MultiVector> &Nullspace11,
495  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
496  const Teuchos::RCP<MultiVector> &Material,
497  Teuchos::ParameterList &List);
498 
516  void initialize(const int k,
517  const Teuchos::RCP<Matrix> &Dk_1,
518  const Teuchos::RCP<Matrix> &Dk_2,
519  const Teuchos::RCP<Matrix> &D0,
520  const Teuchos::RCP<Matrix> &M1_beta,
521  const Teuchos::RCP<Matrix> &M1_alpha,
522  const Teuchos::RCP<Matrix> &Mk_one,
523  const Teuchos::RCP<Matrix> &Mk_1_one,
524  const Teuchos::RCP<Matrix> &invMk_1_invBeta,
525  const Teuchos::RCP<Matrix> &invMk_2_invAlpha,
526  const Teuchos::RCP<MultiVector> &Nullspace11,
527  const Teuchos::RCP<MultiVector> &Nullspace22,
528  const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
529  const Teuchos::RCP<MultiVector> &Material_beta,
530  const Teuchos::RCP<MultiVector> &Material_alpha,
531  Teuchos::ParameterList &List);
532 
534  void determineSubHierarchyCommSizes(bool &doRebalancing, int &rebalanceStriding, int &numProcsCoarseA11, int &numProcsA22);
535 
537  void buildCoarse11Matrix();
538 
540  void rebalanceCoarse11Matrix(const int rebalanceStriding, const int numProcsCoarseA11);
541 
543  void build22Matrix(const bool reuse, const bool doRebalancing, const int rebalanceStriding, const int numProcsA22);
544 
545  public: // due to Cuda build errors otherwise
547  RCP<MultiVector> buildNullspace(const int spaceNumber, const Kokkos::View<bool *, typename Node::device_type> &bcs, const bool applyBCs);
548 
550  Teuchos::RCP<Matrix> buildProjection(const int spaceNumber, const RCP<MultiVector> &EdgeNullspace) const;
551 
558  void buildNodalProlongator(const Teuchos::RCP<Matrix> &A_nodal,
559  Teuchos::RCP<Matrix> &P_nodal,
560  Teuchos::RCP<MultiVector> &Nullspace_nodal,
561  Teuchos::RCP<RealValuedMultiVector> &Coords_nodal) const;
562 
569 
579  void buildProlongator(const int spaceNumber,
580  const Teuchos::RCP<Matrix> &A_nodal_Matrix,
581  const RCP<MultiVector> &EdgeNullspace,
582  Teuchos::RCP<Matrix> &edgeProlongator,
583  Teuchos::RCP<MultiVector> &coarseEdgeNullspace,
584  Teuchos::RCP<RealValuedMultiVector> &coarseNodalCoords) const;
585 
590  RCP<Matrix> buildAddon(const int spaceNumber);
591 
592  private:
594  void setupSubSolve(Teuchos::RCP<Hierarchy> &hierarchy,
595  Teuchos::RCP<Operator> &thyraPrecOp,
596  const Teuchos::RCP<Matrix> &A,
597  const Teuchos::RCP<MultiVector> &Nullspace,
599  const Teuchos::RCP<MultiVector> &Material,
600  Teuchos::ParameterList &params,
601  std::string &label,
602  const bool reuse,
603  const bool isSingular = false);
604 
606  void setFineLevelSmoother11();
607 
609  void applyInverseAdditive(const MultiVector &RHS, MultiVector &X) const;
610 
612  void solveH(const MultiVector &RHS, MultiVector &X) const;
613 
615  void solve22(const MultiVector &RHS, MultiVector &X) const;
616 
618  void allocateMemory(int numVectors) const;
619 
621  void dump(const RCP<Matrix> &A, std::string name) const;
622 
624  void dump(const RCP<MultiVector> &X, std::string name) const;
625 
627  void dumpCoords(const RCP<RealValuedMultiVector> &X, std::string name) const;
628 
630  void dump(const Teuchos::ArrayRCP<bool> &v, std::string name) const;
631 
633  void dump(const Kokkos::View<bool *, typename Node::device_type> &v, std::string name) const;
634 
636  Teuchos::RCP<Teuchos::TimeMonitor> getTimer(std::string name, RCP<const Teuchos::Comm<int> > comm = Teuchos::null) const;
637 
646  std::string solverName_;
648  size_t dim_;
678  Kokkos::View<bool *, typename Node::device_type::memory_space> BCrows11_, BCcols22_, BCdomain22_;
700  std::string mode_;
701 
704 };
705 
706 } // namespace MueLu
707 
708 #define MUELU_REFMAXWELL_SHORT
709 #endif // MUELU_REFMAXWELL_DECL_HPP
const Teuchos::RCP< Matrix > & getJacobian() const
Returns Jacobian matrix SM.
Teuchos::RCP< const Import > Importer22_
size_t dim_
The spatial dimension.
RCP< Matrix > buildAddon(const int spaceNumber)
Teuchos::RCP< SmootherPrototype > PreSmootherData11_
Teuchos::RCP< Matrix > R22_
MueLu::DefaultLocalOrdinal LocalOrdinal
Kokkos::View< bool *, typename Node::device_type::memory_space > BCdomain22_
void solve22(const MultiVector &RHS, MultiVector &X) const
apply solve to 2-2 block only
Teuchos::RCP< SmootherBase > PreSmoother11_
Teuchos::RCP< Teuchos::ParameterList > A22_RAP_reuse_data_
void dumpCoords(const RCP< RealValuedMultiVector > &X, std::string name) const
dump out real-valued multivector
const Teuchos::RCP< const Map > getRangeMap() const
Returns the Xpetra::Map object associated with the range of this operator.
Xpetra::MultiVector< coordinateType, LO, GO, NO > RealValuedMultiVector
Teuchos::RCP< MultiVector > Material_alpha_
Kokkos::View< bool *, typename Node::device_type::memory_space > BCrows11_
Vectors for BCs.
Teuchos::RCP< MultiVector > CoarseNullspace22_
Nullspace for coarse (2,2) problem.
T & get(const std::string &name, T def_value)
void setFineLevelSmoother11()
Set the fine level smoother.
Teuchos::RCP< Matrix > SM_Matrix_
The system that is getting preconditioned.
Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > MultiVector
Teuchos::RCP< Matrix > Mk_one_
mass matrices with unit weight on k-th and (k-1)-th spaces
std::string solverName_
The name of the solver.
Teuchos::RCP< Matrix > buildProjection(const int spaceNumber, const RCP< MultiVector > &EdgeNullspace) const
Builds a projection from a vector values space into a vector valued nodal space.
Teuchos::RCP< MultiVector > DxIntermediate_
void buildNodalProlongator(const Teuchos::RCP< Matrix > &A_nodal, Teuchos::RCP< Matrix > &P_nodal, Teuchos::RCP< MultiVector > &Nullspace_nodal, Teuchos::RCP< RealValuedMultiVector > &Coords_nodal) const
Teuchos::RCP< Matrix > A22_
void determineSubHierarchyCommSizes(bool &doRebalancing, int &rebalanceStriding, int &numProcsCoarseA11, int &numProcsA22)
Determine how large the sub-communicators for the two hierarchies should be.
Teuchos::RCP< SmootherBase > PostSmoother11_
void solveH(const MultiVector &RHS, MultiVector &X) const
apply solve to 1-1 block only
Teuchos::RCP< Matrix > Addon11_
the addon for the 11 block
Teuchos::RCP< MultiVector > Material_beta_
material for first space
Teuchos::RCP< Matrix > Mk_1_one_
void setParameters(Teuchos::ParameterList &list)
Set parameters.
MueLu::DefaultNode Node
Teuchos::RCP< Matrix > invMk_2_invAlpha_
Teuchos::ScalarTraits< Scalar >::magnitudeType magnitudeType
Teuchos::RCP< Matrix > D0_
D_0 matrix.
Teuchos::RCP< MultiVector > P11res_
Temporary memory.
RCP< MultiVector > buildNullspace(const int spaceNumber, const Kokkos::View< bool *, typename Node::device_type > &bcs, const bool applyBCs)
Builds a nullspace.
Verbose class for MueLu classes.
Static class that holds the complete list of valid MueLu parameters.
Teuchos::RCP< MultiVector > P11x_colmap_
Preconditioner (wrapped as a Xpetra::Operator) for Maxwell&#39;s equations in curl-curl form...
Teuchos::RCP< const Import > ImporterCoarse11_
Importer to coarse (1,1) hierarchy.
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List, bool ComputePrec)
Teuchos::RCP< MultiVector > P11resSubComm_
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &M0inv_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List, bool ComputePrec=true)
void allocateMemory(int numVectors) const
allocate multivectors for solve
Teuchos::RCP< Matrix > coarseA22_
Teuchos::RCP< MultiVector > residual_
Teuchos::RCP< MultiVector > DxSubComm_
void initialize(const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &Ms_Matrix, const Teuchos::RCP< Matrix > &M0inv_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, const Teuchos::RCP< MultiVector > &Material, Teuchos::ParameterList &List)
void applyInverseAdditive(const MultiVector &RHS, MultiVector &X) const
apply additive algorithm for 2x2 solve
Teuchos::RCP< MultiVector > P11resTmp_
Teuchos::RCP< Matrix > Dk_2_
D_{k-2} matrix.
Teuchos::RCP< Matrix > invMk_1_invBeta_
inverse of mass matrices on (k-1)-th and (k-2)-th space with weights 1/beta and 1/alpha respectively ...
Kokkos::View< bool *, typename Node::device_type::memory_space > BCcols22_
MueLu::DefaultScalar Scalar
void resetMatrix(Teuchos::RCP< Matrix > SM_Matrix_new, bool ComputePrec=true)
Reset system matrix.
MueLu::DefaultGlobalOrdinal GlobalOrdinal
void rebalanceCoarse11Matrix(const int rebalanceStriding, const int numProcsCoarseA11)
rebalance the coarse A11 matrix, as well as P11, CoordsCoarse11 and Addon11
Teuchos::ParameterList precList11_
Teuchos::RCP< const Import > DorigImporter_
Teuchos::RCP< Matrix > P11_
special prolongator for 11 block and its transpose
Teuchos::RCP< Hierarchy > Hierarchy22_
RCP< Matrix > buildVectorNodalProlongator(const Teuchos::RCP< Matrix > &P_nodal) const
Teuchos::RCP< MultiVector > Dres_
void dump(const RCP< Matrix > &A, std::string name) const
dump out matrix
void buildCoarse11Matrix()
Compute coarseA11 = P11^{T}*SM*P11 + addon efficiently.
int spaceNumber_
The number of the space in the deRham complex.
Teuchos::RCP< Teuchos::ParameterList > coarseA11_RAP_reuse_data_
Teuchos::RCP< Hierarchy > HierarchyCoarse11_
Two hierarchies: one for the coarse (1,1)-block, another for the (2,2)-block.
Teuchos::RCP< MultiVector > DTR11Tmp_
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &Dk_1, const Teuchos::RCP< Matrix > &Dk_2, const Teuchos::RCP< Matrix > &D0, const Teuchos::RCP< Matrix > &M1_beta, const Teuchos::RCP< Matrix > &M1_alpha, const Teuchos::RCP< Matrix > &Mk_one, const Teuchos::RCP< Matrix > &Mk_1_one, const Teuchos::RCP< Matrix > &invMk_1_invBeta, const Teuchos::RCP< Matrix > &invMk_2_invAlpha, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< MultiVector > &Nullspace22, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List, bool ComputePrec=true)
Teuchos::RCP< Matrix > Dk_1_T_
RCP< Operator > thyraPrecOp22_
void build22Matrix(const bool reuse, const bool doRebalancing, const int rebalanceStriding, const int numProcsA22)
Setup A22 = D0^T SM D0 and rebalance it, as well as D0 and Coords_.
Teuchos::RCP< RealValuedMultiVector > CoordsCoarse11_
Teuchos::RCP< MultiVector > NullspaceCoarse11_
Nullspace for coarse (1,1) problem.
Teuchos::RCP< Matrix > M1_alpha_
Teuchos::RCP< Teuchos::TimeMonitor > getTimer(std::string name, RCP< const Teuchos::Comm< int > > comm=Teuchos::null) const
get a (synced) timer
void compute(bool reuse=false)
Setup the preconditioner.
Teuchos::RCP< MultiVector > P11xSubComm_
Teuchos::RCP< const Map > DorigDomainMap_
Teuchos::RCP< Teuchos::ParameterList > getValidParamterList()
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::VERB_HIGH) const
bool disable_addon_
Some options.
RefMaxwell(const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List)
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &Ms_Matrix, const Teuchos::RCP< Matrix > &M0inv_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List, bool ComputePrec=true)
virtual ~RefMaxwell()
Destructor.
Teuchos::RCP< Matrix > M1_beta_
mass matrices on first space with weights beta and alpha respectively
Teuchos::RCP< Matrix > coarseA11_
coarse 11, 22 and coarse 22 blocks
Teuchos::ParameterList parameterList_
Parameter lists.
Teuchos::RCP< Matrix > P22_
special prolongator for 22 block and its transpose
Teuchos::RCP< RealValuedMultiVector > Coords22_
Teuchos::RCP< MultiVector > Nullspace11_
Nullspace for (1.1) block.
Teuchos::RCP< MultiVector > Dx_colmap_
Teuchos::RCP< MultiVector > Nullspace22_
Teuchos::RCP< MultiVector > DresIntermediate_
Teuchos::RCP< MultiVector > P11x_
Teuchos::RCP< Matrix > R11_
void apply(const MultiVector &X, MultiVector &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
RefMaxwell(const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &M0inv_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, Teuchos::ParameterList &List)
void setupSubSolve(Teuchos::RCP< Hierarchy > &hierarchy, Teuchos::RCP< Operator > &thyraPrecOp, const Teuchos::RCP< Matrix > &A, const Teuchos::RCP< MultiVector > &Nullspace, const Teuchos::RCP< RealValuedMultiVector > &Coords, const Teuchos::RCP< MultiVector > &Material, Teuchos::ParameterList &params, std::string &label, const bool reuse, const bool isSingular=false)
Setup a subsolve.
const Teuchos::RCP< const Map > getDomainMap() const
Returns the Xpetra::Map object associated with the domain of this operator.
void residual(const MultiVector &X, const MultiVector &B, MultiVector &R) const
Compute a residual R = B - (*this) * X.
Teuchos::RCP< MultiVector > DresSubComm_
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &D0_Matrix, const Teuchos::RCP< Matrix > &Ms_Matrix, const Teuchos::RCP< Matrix > &M0inv_Matrix, const Teuchos::RCP< Matrix > &M1_Matrix, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, const Teuchos::RCP< MultiVector > &Material, Teuchos::ParameterList &List, bool ComputePrec=true)
Teuchos::RCP< Teuchos::ParameterList > coarseA11_AP_reuse_data_
Teuchos::RCP< MultiVector > DresTmp_
Teuchos::RCP< Matrix > Addon22_
the addon for the 22 block
RefMaxwell(const Teuchos::RCP< Matrix > &SM_Matrix, const Teuchos::RCP< Matrix > &Dk_1, const Teuchos::RCP< Matrix > &Dk_2, const Teuchos::RCP< Matrix > &D0, const Teuchos::RCP< Matrix > &M1_beta, const Teuchos::RCP< Matrix > &M1_alpha, const Teuchos::RCP< Matrix > &Mk_one, const Teuchos::RCP< Matrix > &Mk_1_one, const Teuchos::RCP< Matrix > &invMk_1_invBeta, const Teuchos::RCP< Matrix > &invMk_2_invAlpha, const Teuchos::RCP< MultiVector > &Nullspace11, const Teuchos::RCP< MultiVector > &Nullspace22, const Teuchos::RCP< RealValuedMultiVector > &NodalCoords, const Teuchos::RCP< MultiVector > &Material_beta, const Teuchos::RCP< MultiVector > &Material_alpha, Teuchos::ParameterList &List, bool ComputePrec=true)
RCP< Operator > thyraPrecOpH_
Teuchos::ScalarTraits< Scalar >::coordinateType coordinateType
RefMaxwell(Teuchos::RCP< Hierarchy > HH, Teuchos::RCP< Hierarchy > H22)
Constructor with Hierarchies.
void buildProlongator(const int spaceNumber, const Teuchos::RCP< Matrix > &A_nodal_Matrix, const RCP< MultiVector > &EdgeNullspace, Teuchos::RCP< Matrix > &edgeProlongator, Teuchos::RCP< MultiVector > &coarseEdgeNullspace, Teuchos::RCP< RealValuedMultiVector > &coarseNodalCoords) const
Teuchos::RCP< Teuchos::ParameterList > A22_AP_reuse_data_
Teuchos::RCP< SmootherPrototype > PostSmootherData11_
Teuchos::RCP< MultiVector > Dx_
Teuchos::RCP< RealValuedMultiVector > NodalCoords_
Coordinates.
Teuchos::ParameterList precList22_
Teuchos::RCP< Matrix > Dk_1_
D_{k-1} matrix and its transpose.
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.