46#ifndef MUELU_NULLSPACEFACTORY_KOKKOS_DEF_HPP
47#define MUELU_NULLSPACEFACTORY_KOKKOS_DEF_HPP
51#include <Xpetra_Matrix.hpp>
52#include <Xpetra_MultiVectorFactory.hpp>
59 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class DeviceType>
61 RCP<ParameterList> validParamList = rcp(
new ParameterList());
63 validParamList->set< RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory of the fine level matrix (only needed if default null space is generated)");
64 validParamList->set< RCP<const FactoryBase> >(
"Nullspace", Teuchos::null,
"Generating factory of the fine level null space");
67 validParamList->set< std::string >(
"Fine level nullspace",
"Nullspace",
"Variable name which is used to store null space multi vector on the finest level (default=\"Nullspace\"). For block matrices also \"Nullspace1\" to \"Nullspace9\" are accepted to describe the null space vectors for the (i,i) block (i=1..9).");
70 validParamList->set< RCP<const FactoryBase> >(
"Nullspace1", Teuchos::null,
"Generating factory of the fine level null space associated with the (1,1) block in your n x n block matrix.");
71 validParamList->set< RCP<const FactoryBase> >(
"Nullspace2", Teuchos::null,
"Generating factory of the fine level null space associated with the (2,2) block in your n x n block matrix.");
72 validParamList->set< RCP<const FactoryBase> >(
"Nullspace3", Teuchos::null,
"Generating factory of the fine level null space associated with the (3,3) block in your n x n block matrix.");
73 validParamList->set< RCP<const FactoryBase> >(
"Nullspace4", Teuchos::null,
"Generating factory of the fine level null space associated with the (4,4) block in your n x n block matrix.");
74 validParamList->set< RCP<const FactoryBase> >(
"Nullspace5", Teuchos::null,
"Generating factory of the fine level null space associated with the (5,5) block in your n x n block matrix.");
75 validParamList->set< RCP<const FactoryBase> >(
"Nullspace6", Teuchos::null,
"Generating factory of the fine level null space associated with the (6,6) block in your n x n block matrix.");
76 validParamList->set< RCP<const FactoryBase> >(
"Nullspace7", Teuchos::null,
"Generating factory of the fine level null space associated with the (7,7) block in your n x n block matrix.");
77 validParamList->set< RCP<const FactoryBase> >(
"Nullspace8", Teuchos::null,
"Generating factory of the fine level null space associated with the (8,8) block in your n x n block matrix.");
78 validParamList->set< RCP<const FactoryBase> >(
"Nullspace9", Teuchos::null,
"Generating factory of the fine level null space associated with the (9,9) block in your n x n block matrix.");
80 return validParamList;
83 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class DeviceType>
85 const ParameterList& pL = GetParameterList();
86 std::string nspName = pL.get<std::string>(
"Fine level nullspace");
92 Input(currentLevel,
"A");
101 "MueLu::NullspaceFactory::DeclareInput(): You must declare an existing factory which "
102 "produces the variable \"Nullspace\" in the NullspaceFactory (e.g. a TentativePFactory).");
103 currentLevel.
DeclareInput(
"Nullspace", GetFactory(nspName).get(),
this);
107 template<
class NullspaceType,
class LO>
112 typedef typename NullspaceType::value_type
SC;
113 typedef Kokkos::ArithTraits<SC>
ATS;
121 KOKKOS_INLINE_FUNCTION
124 for (LO i = 0; i <
numPDEs; i++)
128 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class DeviceType>
132 RCP<MultiVector> nullspace;
135 const ParameterList& pL = GetParameterList();
136 std::string nspName = pL.get<std::string>(
"Fine level nullspace");
143 GetOStream(
Runtime1) <<
"Use user-given nullspace " << nspName <<
":"
144 <<
" nullspace dimension=" << nullspace->getNumVectors()
145 <<
" nullspace length=" << nullspace->getGlobalLength() << std::endl;
149 auto A = Get< RCP<Matrix> >(currentLevel,
"A");
153 if (A->IsView(
"stridedMaps") ==
true) {
154 Xpetra::viewLabel_t oldView = A->SwitchToView(
"stridedMaps");
155 TEUCHOS_TEST_FOR_EXCEPTION(rcp_dynamic_cast<const StridedMap>(A->getRowMap()).is_null(),
Exceptions::BadCast,
156 "MueLu::CoalesceFactory::Build: cast to strided row map failed.");
157 numPDEs = rcp_dynamic_cast<const StridedMap>(A->getRowMap())->getFixedBlockSize();
158 oldView = A->SwitchToView(oldView);
161 GetOStream(
Runtime1) <<
"Generating canonical nullspace: dimension = " << numPDEs << std::endl;
163 nullspace = MultiVectorFactory::Build(A->getDomainMap(), numPDEs);
164 auto nullspaceView = nullspace->getDeviceLocalView(Xpetra::Access::OverwriteAll);
166 int numBlocks = nullspace->getLocalLength() / numPDEs;
168 NullspaceFunctor<
decltype(nullspaceView), LO> nullspaceFunctor(nullspaceView, numPDEs);
169 Kokkos::parallel_for(
"MueLu:NullspaceF:Build:for",
range_type(0,numBlocks), nullspaceFunctor);
176 nullspace = currentLevel.
Get< RCP<MultiVector> >(
"Nullspace", GetFactory(nspName).get());
180 Set(currentLevel,
"Nullspace", nullspace);
Exception indicating invalid cast attempted.
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.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
int GetLevelID() const
Return level number.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
static const NoFactory * get()
Kokkos::RangePolicy< local_ordinal_type, execution_space > range_type
NullspaceFunctor(NullspaceType nullspace_, LO numPDEs_)
KOKKOS_INLINE_FUNCTION void operator()(const LO j) const
NullspaceType::value_type SC
Kokkos::ArithTraits< SC > ATS
Namespace for MueLu classes and methods.
@ Runtime1
Description of what is happening (more verbose)