46 #ifndef MUELU_REFMAXWELL_DECL_HPP
47 #define MUELU_REFMAXWELL_DECL_HPP
60 #ifdef HAVE_MUELU_KOKKOS_REFACTOR
70 #include "MueLu_TrilinosSmoother.hpp"
71 #include "MueLu_Hierarchy.hpp"
73 #include "Xpetra_Map_fwd.hpp"
74 #include "Xpetra_Matrix_fwd.hpp"
75 #include "Xpetra_MatrixFactory_fwd.hpp"
76 #include "Xpetra_MultiVectorFactory_fwd.hpp"
77 #include "Xpetra_VectorFactory_fwd.hpp"
78 #include "Xpetra_CrsMatrixWrap_fwd.hpp"
79 #include "Xpetra_ExportFactory_fwd.hpp"
81 #if defined(HAVE_MUELU_IFPACK2) && (!defined(HAVE_MUELU_EPETRA) || defined(HAVE_MUELU_INST_DOUBLE_INT_INT))
83 #include "Ifpack2_Hiptmair.hpp"
112 template <
class Scalar,
116 class RefMaxwell :
public VerboseObject,
public Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> {
118 #undef MUELU_REFMAXWELL_SHORT
123 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType
magnitudeType;
136 RefMaxwell(Teuchos::RCP<Hierarchy> HH, Teuchos::RCP<Hierarchy> H22) :
156 const Teuchos::RCP<Matrix> & D0_Matrix,
157 const Teuchos::RCP<Matrix> & M0inv_Matrix,
158 const Teuchos::RCP<Matrix> & M1_Matrix,
159 const Teuchos::RCP<MultiVector> & Nullspace,
160 const Teuchos::RCP<RealValuedMultiVector> & Coords,
161 Teuchos::ParameterList& List,
162 bool ComputePrec =
true)
164 initialize(D0_Matrix,M0inv_Matrix,M1_Matrix,Nullspace,Coords,List);
183 const Teuchos::RCP<Matrix> & M0inv_Matrix,
184 const Teuchos::RCP<Matrix> & M1_Matrix,
185 const Teuchos::RCP<MultiVector> & Nullspace,
186 const Teuchos::RCP<RealValuedMultiVector> & Coords,
189 initialize(D0_Matrix,M0inv_Matrix,M1_Matrix,Nullspace,Coords,List);
203 const Teuchos::RCP<Matrix> & D0_Matrix,
204 const Teuchos::RCP<Matrix> & M1_Matrix,
205 const Teuchos::RCP<MultiVector> & Nullspace,
206 const Teuchos::RCP<RealValuedMultiVector> & Coords,
207 Teuchos::ParameterList& List,
208 bool ComputePrec =
true)
210 initialize(D0_Matrix,Teuchos::null,M1_Matrix,Nullspace,Coords,List);
228 const Teuchos::RCP<Matrix> & M1_Matrix,
229 const Teuchos::RCP<MultiVector> & Nullspace,
230 const Teuchos::RCP<RealValuedMultiVector> & Coords,
233 initialize(D0_Matrix,Teuchos::null,M1_Matrix,Nullspace,Coords,List);
243 Teuchos::ParameterList& List,
244 bool ComputePrec =
true)
247 RCP<MultiVector> Nullspace = List.get<RCP<MultiVector> >(
"Nullspace", Teuchos::null);
248 RCP<RealValuedMultiVector> Coords = List.get<RCP<RealValuedMultiVector> >(
"Coordinates", Teuchos::null);
249 RCP<Matrix> D0_Matrix = List.get<RCP<Matrix> >(
"D0");
250 RCP<Matrix> M1_Matrix = List.get<RCP<Matrix> >(
"M1");
251 RCP<Matrix> M0inv_Matrix = List.get<RCP<Matrix> >(
"M0inv", Teuchos::null);
253 initialize(D0_Matrix,M0inv_Matrix,M1_Matrix,Nullspace,Coords,List);
255 if (SM_Matrix != Teuchos::null)
290 void resetMatrix(Teuchos::RCP<Matrix> SM_Matrix_new);
307 void apply (
const MultiVector& X, MultiVector& Y,
308 Teuchos::ETransp mode = Teuchos::NO_TRANS,
309 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
310 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const;
315 template <
class NewNode>
316 Teuchos::RCP< RefMaxwell<Scalar, LocalOrdinal, GlobalOrdinal, NewNode> >
317 clone (
const RCP<NewNode>& new_node)
const {
323 void describe(Teuchos::FancyOStream &out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::VERB_HIGH)
const;
336 void initialize(
const Teuchos::RCP<Matrix> & D0_Matrix,
337 const Teuchos::RCP<Matrix> & M0inv_Matrix,
338 const Teuchos::RCP<Matrix> & M1_Matrix,
339 const Teuchos::RCP<MultiVector> & Nullspace,
340 const Teuchos::RCP<RealValuedMultiVector> & Coords,
341 Teuchos::ParameterList& List);
346 #if defined(HAVE_MUELU_IFPACK2) && (!defined(HAVE_MUELU_EPETRA) || defined(HAVE_MUELU_INST_DOUBLE_INT_INT))
347 Teuchos::RCP<Ifpack2::Preconditioner<Scalar,LocalOrdinal,GlobalOrdinal,Node> > hiptmairPreSmoother_, hiptmairPostSmoother_;
354 #ifdef HAVE_MUELU_KOKKOS_REFACTOR
375 #define MUELU_REFMAXWELL_SHORT
376 #endif // MUELU_REFMAXWELL_DECL_HPP