MueLu Version of the Day
Loading...
Searching...
No Matches
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"
15
24
25#include "MueLu_MasterList.hpp"
26#include "MueLu_FactoryManager.hpp"
31
34
41
45
46#include "Xpetra_Operator.hpp"
47#include "Xpetra_Map_fwd.hpp"
48#include "Xpetra_Matrix_fwd.hpp"
49#include "Xpetra_MapFactory_fwd.hpp"
50#include "Xpetra_MatrixFactory_fwd.hpp"
51#include "Xpetra_MultiVectorFactory_fwd.hpp"
52#include "Xpetra_VectorFactory_fwd.hpp"
53#include "Xpetra_CrsMatrixWrap_fwd.hpp"
54
55namespace MueLu {
56
216template <class Scalar,
217 class LocalOrdinal,
218 class GlobalOrdinal,
219 class Node>
220class RefMaxwell : public VerboseObject, public Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> {
221#undef MUELU_REFMAXWELL_SHORT
223
224 public:
225 using magnitudeType = typename Teuchos::ScalarTraits<Scalar>::magnitudeType;
226 using coordinateType = typename Teuchos::ScalarTraits<Scalar>::coordinateType;
227 using RealValuedMultiVector = typename Xpetra::MultiVector<coordinateType, LO, GO, NO>;
228
232 , Hierarchy22_(Teuchos::null)
233 , disable_addon_(MasterList::getDefault<bool>("refmaxwell: disable addon"))
234 , mode_(MasterList::getDefault<std::string>("refmaxwell: mode")) {
235 }
236
238 RefMaxwell(Teuchos::RCP<Hierarchy> HH, Teuchos::RCP<Hierarchy> H22)
240 , Hierarchy22_(H22)
241 , disable_addon_(MasterList::getDefault<bool>("refmaxwell: disable addon"))
242 , mode_(MasterList::getDefault<std::string>("refmaxwell: mode")) {
243 }
244
245 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
258 Teuchos::ParameterList &List,
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
272 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
287 Teuchos::ParameterList &List,
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
313 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
320 Teuchos::ParameterList &List,
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
326 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
334 Teuchos::ParameterList &List,
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
351 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
357 Teuchos::ParameterList &List,
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
372 RefMaxwell(const Teuchos::RCP<Matrix> &D0_Matrix,
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,
377 Teuchos::ParameterList &List)
378 : SM_Matrix_(Teuchos::null) {
379 initialize(D0_Matrix, M1_Matrix, M0inv_Matrix, M1_Matrix, Nullspace11, NodalCoords, Teuchos::null, List);
380 }
381
392 RefMaxwell(const Teuchos::RCP<Matrix> &SM_Matrix,
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,
397 Teuchos::ParameterList &List,
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
411 RefMaxwell(const Teuchos::RCP<Matrix> &D0_Matrix,
412 const Teuchos::RCP<Matrix> &M1_Matrix,
413 const Teuchos::RCP<MultiVector> &Nullspace11,
414 const Teuchos::RCP<RealValuedMultiVector> &NodalCoords,
415 Teuchos::ParameterList &List)
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,
427 Teuchos::ParameterList &List,
428 bool ComputePrec = true);
429
431 virtual ~RefMaxwell() = default;
432
434 const Teuchos::RCP<const Map> getDomainMap() const;
435
437 const Teuchos::RCP<const Map> getRangeMap() const;
438
440 const Teuchos::RCP<Matrix> &getJacobian() const {
441 return SM_Matrix_;
442 }
443
445 void setParameters(Teuchos::ParameterList &list);
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,
457 Teuchos::ETransp mode = Teuchos::NO_TRANS,
458 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
459 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const;
460
462 bool hasTransposeApply() const;
463
464 void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel = Teuchos::VERB_HIGH) const;
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:
476 Teuchos::RCP<Teuchos::ParameterList> getValidParamterList();
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
568 RCP<Matrix> buildVectorNodalProlongator(const Teuchos::RCP<Matrix> &P_nodal) const;
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,
598 const Teuchos::RCP<RealValuedMultiVector> &Coords,
599 const Teuchos::RCP<MultiVector> &Material,
600 Teuchos::ParameterList &params,
601 std::string &label,
602 const bool reuse,
603 const bool isSingular = false);
604
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
639 Teuchos::RCP<Hierarchy> HierarchyCoarse11_, Hierarchy22_;
640 Teuchos::RCP<SmootherBase> PreSmoother11_, PostSmoother11_;
641 Teuchos::RCP<SmootherPrototype> PreSmootherData11_, PostSmootherData11_;
646 std::string solverName_;
648 size_t dim_;
650 Teuchos::RCP<Matrix> SM_Matrix_;
652 Teuchos::RCP<Matrix> Dk_1_, Dk_1_T_;
654 Teuchos::RCP<Matrix> Dk_2_;
656 Teuchos::RCP<Matrix> D0_;
658 Teuchos::RCP<Matrix> invMk_1_invBeta_, invMk_2_invAlpha_;
660 Teuchos::RCP<Matrix> Mk_one_, Mk_1_one_;
662 Teuchos::RCP<Matrix> M1_beta_, M1_alpha_;
664 Teuchos::RCP<MultiVector> Material_beta_, Material_alpha_;
666 Teuchos::RCP<Matrix> P11_, R11_;
668 Teuchos::RCP<Matrix> P22_, R22_;
670 Teuchos::RCP<Matrix> coarseA11_, A22_, coarseA22_;
672 Teuchos::RCP<Matrix> Addon11_;
674 Teuchos::RCP<Matrix> Addon22_;
675 Teuchos::RCP<const Map> DorigDomainMap_;
676 Teuchos::RCP<const Import> DorigImporter_;
678 Kokkos::View<bool *, typename Node::device_type::memory_space> BCrows11_, BCcols22_, BCdomain22_;
681 Teuchos::RCP<MultiVector> Nullspace11_, Nullspace22_;
683 Teuchos::RCP<RealValuedMultiVector> NodalCoords_, CoordsCoarse11_, Coords22_;
685 Teuchos::RCP<MultiVector> NullspaceCoarse11_;
687 Teuchos::RCP<MultiVector> CoarseNullspace22_;
689 Teuchos::RCP<const Import> ImporterCoarse11_, Importer22_;
693 Teuchos::ParameterList parameterList_, precList11_, precList22_;
694 Teuchos::RCP<Teuchos::ParameterList> coarseA11_AP_reuse_data_, coarseA11_RAP_reuse_data_;
695 Teuchos::RCP<Teuchos::ParameterList> A22_AP_reuse_data_, A22_RAP_reuse_data_;
700 std::string mode_;
701
704};
705
706} // namespace MueLu
707
708#define MUELU_REFMAXWELL_SHORT
709#endif // MUELU_REFMAXWELL_DECL_HPP
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
MueLu::DefaultNode Node
Static class that holds the complete list of valid MueLu parameters.
Preconditioner (wrapped as a Xpetra::Operator) for Maxwell's equations in curl-curl form.
Teuchos::RCP< MultiVector > P11resTmp_
Teuchos::RCP< Matrix > Mk_1_one_
Teuchos::RCP< RealValuedMultiVector > NodalCoords_
Coordinates.
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)
Teuchos::RCP< MultiVector > Material_beta_
material for first space
Teuchos::RCP< MultiVector > P11x_
Teuchos::RCP< MultiVector > Nullspace22_
Teuchos::RCP< MultiVector > residual_
Teuchos::RCP< Matrix > M1_beta_
mass matrices on first space with weights beta and alpha respectively
Teuchos::RCP< MultiVector > Dx_colmap_
Teuchos::RCP< Teuchos::ParameterList > coarseA11_AP_reuse_data_
Kokkos::View< bool *, typename Node::device_type::memory_space > BCrows11_
Vectors for BCs.
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)
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.
Teuchos::RCP< Teuchos::ParameterList > A22_AP_reuse_data_
Teuchos::RCP< Matrix > coarseA22_
Teuchos::RCP< MultiVector > P11res_
Temporary memory.
Teuchos::RCP< MultiVector > DxIntermediate_
Teuchos::RCP< Matrix > coarseA11_
coarse 11, 22 and coarse 22 blocks
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 > Mk_one_
mass matrices with unit weight on k-th and (k-1)-th spaces
Teuchos::RCP< Matrix > Dk_1_T_
Teuchos::RCP< Teuchos::TimeMonitor > getTimer(std::string name, RCP< const Teuchos::Comm< int > > comm=Teuchos::null) const
get a (synced) timer
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)
void allocateMemory(int numVectors) const
allocate multivectors for solve
RCP< Matrix > buildVectorNodalProlongator(const Teuchos::RCP< Matrix > &P_nodal) const
Teuchos::RCP< const Map > DorigDomainMap_
Teuchos::RCP< Matrix > SM_Matrix_
The system that is getting preconditioned.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::VERB_HIGH) const
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_
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_.
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)
void buildCoarse11Matrix()
Compute coarseA11 = P11^{T}*SM*P11 + addon efficiently.
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
Teuchos::RCP< SmootherPrototype > PostSmootherData11_
Teuchos::RCP< Teuchos::ParameterList > A22_RAP_reuse_data_
RCP< MultiVector > buildNullspace(const int spaceNumber, const Kokkos::View< bool *, typename Node::device_type > &bcs, const bool applyBCs)
Builds a nullspace.
bool hasTransposeApply() const
Indicates whether this operator supports applying the adjoint operator.
void determineSubHierarchyCommSizes(bool &doRebalancing, int &rebalanceStriding, int &numProcsCoarseA11, int &numProcsA22)
Determine how large the sub-communicators for the two hierarchies should be.
virtual ~RefMaxwell()=default
Destructor.
Teuchos::RCP< RealValuedMultiVector > Coords22_
bool disable_addon_
Some options.
Kokkos::View< bool *, typename Node::device_type::memory_space > BCdomain22_
void solveH(const MultiVector &RHS, MultiVector &X) const
apply solve to 1-1 block only
Teuchos::ParameterList precList22_
Teuchos::RCP< Matrix > A22_
typename Teuchos::ScalarTraits< Scalar >::coordinateType coordinateType
Teuchos::RCP< SmootherBase > PostSmoother11_
Teuchos::RCP< MultiVector > NullspaceCoarse11_
Nullspace for coarse (1,1) problem.
Teuchos::RCP< Matrix > Dk_2_
D_{k-2} matrix.
void setFineLevelSmoother11()
Set the fine level smoother.
Teuchos::RCP< Matrix > R11_
std::string solverName_
The name of the solver.
const Teuchos::RCP< Matrix > & getJacobian() const
Returns Jacobian matrix SM.
void dumpCoords(const RCP< RealValuedMultiVector > &X, std::string name) const
dump out real-valued multivector
Teuchos::RCP< Matrix > D0_
D_0 matrix.
Teuchos::RCP< const Import > Importer22_
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)
const Teuchos::RCP< const Map > getDomainMap() const
Returns the Xpetra::Map object associated with the domain of this operator.
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)
Teuchos::RCP< MultiVector > Dx_
Teuchos::RCP< Matrix > M1_alpha_
Teuchos::RCP< Matrix > P11_
special prolongator for 11 block and its transpose
RefMaxwell(Teuchos::RCP< Hierarchy > HH, Teuchos::RCP< Hierarchy > H22)
Constructor with Hierarchies.
Teuchos::RCP< MultiVector > DresTmp_
Teuchos::RCP< MultiVector > P11resSubComm_
Teuchos::RCP< MultiVector > P11xSubComm_
Teuchos::RCP< Hierarchy > Hierarchy22_
Teuchos::RCP< Teuchos::ParameterList > getValidParamterList()
Teuchos::RCP< Matrix > P22_
special prolongator for 22 block and its transpose
Teuchos::RCP< Hierarchy > HierarchyCoarse11_
Two hierarchies: one for the coarse (1,1)-block, another for the (2,2)-block.
Teuchos::RCP< MultiVector > CoarseNullspace22_
Nullspace for coarse (2,2) problem.
Teuchos::RCP< MultiVector > DTR11Tmp_
Teuchos::RCP< SmootherPrototype > PreSmootherData11_
int spaceNumber_
The number of the space in the deRham complex.
Teuchos::RCP< MultiVector > Dres_
void applyInverseAdditive(const MultiVector &RHS, MultiVector &X) const
apply additive algorithm for 2x2 solve
Teuchos::RCP< MultiVector > DresIntermediate_
Teuchos::RCP< Matrix > Addon22_
the addon for the 22 block
Teuchos::RCP< RealValuedMultiVector > CoordsCoarse11_
Teuchos::RCP< const Import > DorigImporter_
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
const Teuchos::RCP< const Map > getRangeMap() const
Returns the Xpetra::Map object associated with the range of this operator.
void compute(bool reuse=false)
Setup the preconditioner.
Teuchos::ParameterList precList11_
Teuchos::RCP< Matrix > Dk_1_
D_{k-1} matrix and its transpose.
Teuchos::RCP< Teuchos::ParameterList > coarseA11_RAP_reuse_data_
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 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 > Addon11_
the addon for the 11 block
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.
typename Xpetra::MultiVector< coordinateType, LO, GO, NO > RealValuedMultiVector
Teuchos::ParameterList parameterList_
Parameter lists.
void dump(const RCP< Matrix > &A, std::string name) const
dump out matrix
void rebalanceCoarse11Matrix(const int rebalanceStriding, const int numProcsCoarseA11)
rebalance the coarse A11 matrix, as well as P11, CoordsCoarse11 and Addon11
Teuchos::RCP< MultiVector > Nullspace11_
Nullspace for (1.1) block.
size_t dim_
The spatial dimension.
Teuchos::RCP< MultiVector > P11x_colmap_
Teuchos::RCP< MultiVector > DresSubComm_
void resetMatrix(Teuchos::RCP< Matrix > SM_Matrix_new, bool ComputePrec=true)
Reset system matrix.
void setParameters(Teuchos::ParameterList &list)
Set parameters.
typename Teuchos::ScalarTraits< Scalar >::magnitudeType magnitudeType
Teuchos::RCP< SmootherBase > PreSmoother11_
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< MultiVector > Material_alpha_
Teuchos::RCP< const Import > ImporterCoarse11_
Importer to coarse (1,1) hierarchy.
Teuchos::RCP< Matrix > R22_
RCP< Matrix > buildAddon(const int spaceNumber)
void solve22(const MultiVector &RHS, MultiVector &X) const
apply solve to 2-2 block only
Teuchos::RCP< Matrix > invMk_2_invAlpha_
void residual(const MultiVector &X, const MultiVector &B, MultiVector &R) const
Compute a residual R = B - (*this) * X.
Teuchos::RCP< MultiVector > DxSubComm_
Verbose class for MueLu classes.
Namespace for MueLu classes and methods.