46#ifndef MUELU_MULTIVECTORTRANSFER_FACTORY_DEF_HPP
47#define MUELU_MULTIVECTORTRANSFER_FACTORY_DEF_HPP
50#include "Xpetra_MultiVectorFactory.hpp"
57 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
59 RCP<ParameterList> validParamList = rcp(
new ParameterList());
61 validParamList->set< std::string > (
"Vector name",
"undefined",
"Name of the vector that will be transferred on the coarse grid (level key)");
62 validParamList->set< RCP<const FactoryBase> >(
"Vector factory", Teuchos::null,
"Factory of the vector");
63 validParamList->set< RCP<const FactoryBase> >(
"R", Teuchos::null,
"Factory of the transfer operator (restriction)");
65 return validParamList;
68 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
73 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76 std::string vectorName = pL.get<std::string>(
"Vector name");
79 Input(coarseLevel,
"R");
82 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87 std::string vectorName = pL.get<std::string>(
"Vector name");
89 RCP<MultiVector> fineVector = fineLevel.
Get< RCP<MultiVector> >(vectorName,
GetFactory(
"Vector factory").get());
92 RCP<MultiVector> coarseVector = MultiVectorFactory::Build(transferOp->getRangeMap(), fineVector->getNumVectors());
93 GetOStream(
Runtime0) <<
"Transferring multivector \"" << vectorName <<
"\"" << std::endl;
95 RCP<MultiVector> onesVector = MultiVectorFactory::Build(transferOp->getDomainMap(), 1);
96 onesVector->putScalar(Teuchos::ScalarTraits<Scalar>::one());
97 RCP<MultiVector> rowSumVector = MultiVectorFactory::Build(transferOp->getRangeMap(), 1);
98 transferOp->apply(*onesVector, *rowSumVector);
99 transferOp->apply(*fineVector, *coarseVector);
101 if (vectorName ==
"Coordinates")
102 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"Use CoordinatesTransferFactory to transfer coordinates instead of MultiVectorTransferFactory.");
108 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
113 ArrayRCP<SC> expandCoord(coordinates.size()*blksize);
115 for(
int i=0; i<coordinates.size(); i++) {
116 for(
int j=0; j< blksize; j++) {
117 expandCoord[i*blksize + j] = coordinates[i];
MueLu::DefaultLocalOrdinal LocalOrdinal
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.
void Input(Level &level, const std::string &varName) const
T Get(Level &level, const std::string &varName) const
void Set(Level &level, const std::string &varName, const T &data) const
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Default implementation of FactoryAcceptor::GetFactory()
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)....
void DeclareInput(Level &finelevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
MultiVectorTransferFactory()
Constructor.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
static ArrayRCP< SC > expandCoordinates(ArrayRCP< SC > coord, LocalOrdinal blksize)
virtual const Teuchos::ParameterList & GetParameterList() const
void SetParameter(const std::string &name, const ParameterEntry &entry)
Set a parameter directly as a ParameterEntry.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
Namespace for MueLu classes and methods.
@ Runtime0
One-liner description of what is happening.