46 #ifndef MUELU_TOGGLECOORDINATESTRANSFER_FACTORY_DEF_HPP
47 #define MUELU_TOGGLECOORDINATESTRANSFER_FACTORY_DEF_HPP
57 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
59 RCP<ParameterList> validParamList = rcp(
new ParameterList());
61 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.");
63 return validParamList;
66 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
68 const ParameterList& pL = GetParameterList();
69 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!");
70 Input(coarseLevel,
"Chosen P");
71 for (std::vector<RCP<const FactoryBase> >::const_iterator it = coordFacts_.begin(); it != coordFacts_.end(); ++it) {
72 coarseLevel.
DeclareInput(
"Coordinates", (*it).get(),
this);
73 (*it)->CallDeclareInput(coarseLevel);
75 hasDeclaredInput_ =
true;
78 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
80 FactoryMonitor m(*
this,
"Coordinate transfer toggle", coarseLevel);
82 typedef Xpetra::MultiVector<double,LO,GO,NO> xdMV;
84 TEUCHOS_TEST_FOR_EXCEPTION(coordFacts_.size() != 2,
Exceptions::RuntimeError,
"MueLu::TogglePFactory::Build: ToggleCoordinatesTransferFactory needs two different transfer operator strategies for toggling.");
86 int chosenP = Get< int > (coarseLevel,
"Chosen P");
87 GetOStream(
Runtime1) <<
"Transfer Coordinates" << chosenP <<
" to coarse level" << std::endl;
88 RCP<xdMV> coarseCoords = coarseLevel.
Get< RCP<xdMV> >(
"Coordinates",(coordFacts_[chosenP]).get());
89 Set(coarseLevel,
"Coordinates", coarseCoords);
106 for(
size_t t=0; t<coordFacts_.size(); ++t) {
107 coarseLevel.
Release(*(coordFacts_[t]));
113 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
116 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::rcp_dynamic_cast<const TwoLevelFactoryBase>(factory) == Teuchos::null,
Exceptions::BadCast,
117 "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."
118 "This is very strange. (Note: you can remove this exception if there's a good reason for)");
119 TEUCHOS_TEST_FOR_EXCEPTION(hasDeclaredInput_,
Exceptions::RuntimeError,
"MueLu::ToggleCoordinatesTransferFactory::AddCoordTransferFactory: Factory is being added after we have already declared input");
120 coordFacts_.push_back(factory);
124 #endif // MUELU_TOGGLECOORDINATESTRANSFER_FACTORY_DEF_HPP