MueLu Version of the Day
Loading...
Searching...
No Matches
MueLu_BlockedCoarseMapFactory_def.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_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_
11#define MUELU_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_
12
13#include <Xpetra_MultiVector.hpp>
14#include <Xpetra_StridedMapFactory.hpp>
15#include <Xpetra_Matrix.hpp>
16
18#include "MueLu_Level.hpp"
19#include "MueLu_Aggregates.hpp"
20#include "MueLu_Monitor.hpp"
21
22#include "MueLu_Factory.hpp"
23
24namespace MueLu {
25
26template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
28 RCP<ParameterList> validParamList = rcp(new ParameterList());
29
30 validParamList->set<RCP<const FactoryBase>>("Aggregates", Teuchos::null, "Generating factory for aggregates.");
31 validParamList->set<RCP<const FactoryBase>>("Nullspace", Teuchos::null, "Generating factory for null space.");
32 validParamList->set<RCP<const FactoryBase>>("CoarseMap", Teuchos::null, "Generating factory of previous coarse map. (must be set by user!).");
33
34 // do we need this?
35 validParamList->set<std::string>("Striding info", "{}", "Striding information");
36 validParamList->set<LocalOrdinal>("Strided block id", -1, "Strided block id");
37
38 return validParamList;
39}
40
41template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
43 this->Input(currentLevel, "Aggregates");
44 this->Input(currentLevel, "Nullspace");
45
46 // Get CoarseMap from previously defined block
47 RCP<const FactoryBase> prevCoarseMapFact = this->GetFactory("CoarseMap");
48 TEUCHOS_TEST_FOR_EXCEPTION(prevCoarseMapFact == Teuchos::null, Exceptions::RuntimeError, "MueLu::BlockedCoarseMapFactory::getDomainMapOffset: user did not specify CoarseMap of previous block. Do not forget to set the CoarseMap factory.");
49 currentLevel.DeclareInput("CoarseMap", prevCoarseMapFact.get(), this);
50}
51
52template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
54 FactoryMonitor m(*this, "Build", currentLevel);
55
56 GlobalOrdinal domainGIDOffset = GetDomainGIDOffset(currentLevel);
57 CoarseMapFactory::BuildCoarseMap(currentLevel, domainGIDOffset);
58}
59
60template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
62 Level &currentLevel) const {
63 RCP<const FactoryBase> prevCoarseMapFact = this->GetFactory("CoarseMap");
64 RCP<const Map> subPDomainMap = currentLevel.Get<RCP<const Map>>("CoarseMap", prevCoarseMapFact.get());
65 GlobalOrdinal maxGlobalIndex = subPDomainMap->getMaxAllGlobalIndex();
66
67 return maxGlobalIndex + Teuchos::ScalarTraits<GlobalOrdinal>::one();
68}
69
70} // namespace MueLu
71
72#endif /* MUELU_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_ */
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
void Build(Level &currentLevel) const final
Build an object with this factory.
void DeclareInput(Level &currentLevel) const final
Specifies the data that this class needs, and the factories that generate that data.
virtual GlobalOrdinal GetDomainGIDOffset(Level &currentLevel) const final
Compute domain GID offset from another CoarseMap.
RCP< const ParameterList > GetValidParameterList() const final
Return a const parameter list of valid parameters that setParameterList() will accept.
virtual void BuildCoarseMap(Level &currentLevel, const GlobalOrdinal domainGIDOffset) const
Build the coarse map using the domain GID offset.
Exception throws to report errors in the internal logical of the program.
Timer to be used in factories. Similar to Monitor but with additional timers.
Class that holds all level-specific information.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
Namespace for MueLu classes and methods.