10#ifndef MUELU_TOGGLECOORDINATESTRANSFER_FACTORY_DEF_HPP
11#define MUELU_TOGGLECOORDINATESTRANSFER_FACTORY_DEF_HPP
20template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
22 RCP<ParameterList> validParamList = rcp(
new ParameterList());
24 validParamList->set<RCP<const FactoryBase> >(
"Chosen P", Teuchos::null,
"Name of TogglePFactory this ToggleCoordinatesTransferFactory is connected to. Parameter provides information which execution path (prolongator) has been chosen.");
26 return validParamList;
29template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
32 TEUCHOS_TEST_FOR_EXCEPTION(!pL.isParameter(
"Chosen P"),
Exceptions::RuntimeError,
"MueLu::ToggleCoordinatesTransferFactory::DeclareInput: You have to set the 'Chosen P' parameter to a factory name of type TogglePFactory. The ToggleCoordinatesTransferFactory must be used together with a TogglePFactory!");
33 Input(coarseLevel,
"Chosen P");
34 for (std::vector<RCP<const FactoryBase> >::const_iterator it =
coordFacts_.begin(); it !=
coordFacts_.end(); ++it) {
35 coarseLevel.
DeclareInput(
"Coordinates", (*it).get(),
this);
36 (*it)->CallDeclareInput(coarseLevel);
41template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
43 FactoryMonitor m(*
this,
"Coordinate transfer toggle", coarseLevel);
45 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType, LO, GO, NO> xdMV;
47 TEUCHOS_TEST_FOR_EXCEPTION(
coordFacts_.size() != 2,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: ToggleCoordinatesTransferFactory needs two different transfer operator strategies for toggling.");
49 int chosenP =
Get<int>(coarseLevel,
"Chosen P");
50 GetOStream(
Runtime1) <<
"Transfer Coordinates" << chosenP <<
" to coarse level" << std::endl;
51 RCP<xdMV> coarseCoords = coarseLevel.
Get<RCP<xdMV> >(
"Coordinates", (
coordFacts_[chosenP]).get());
52 Set(coarseLevel,
"Coordinates", coarseCoords);
76template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
79 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
80 "MueLu::ToggleCoordinatesTransferFactory::AddCoordTransferFactory: Transfer factory is not derived from TwoLevelFactoryBase. Make sure you provide the factory which generates the coarse coordinates. Usually this is a coordinate transfer factory."
81 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
Exception indicating invalid cast attempted.
Exception throws to report errors in the internal logical of the program.
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
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().
void Release(const FactoryBase &factory)
Decrement the storage counter for all the inputs of a factory.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
virtual const Teuchos::ParameterList & GetParameterList() const
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void AddCoordTransferFactory(const RCP< const FactoryBase > &factory)
Add a coordinate transfer factory in the end of list of coordinate transfer factories.
std::vector< RCP< const FactoryBase > > coordFacts_
list of user-defined transfer coordinate factories which provide coordinates on the coarse level!
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
void DeclareInput(Level &finelevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
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.
@ Runtime1
Description of what is happening (more verbose).