46 #ifndef MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP
47 #define MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP
49 #include "Xpetra_ImportFactory.hpp"
50 #include "Xpetra_MultiVectorFactory.hpp"
51 #include "Xpetra_MapFactory.hpp"
52 #include "Xpetra_IO.hpp"
54 #include "MueLu_CoarseMapFactory.hpp"
55 #include "MueLu_Aggregates.hpp"
63 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
65 RCP<ParameterList> validParamList = rcp(
new ParameterList());
67 validParamList->set<RCP<const FactoryBase> >(
"Coordinates", Teuchos::null,
"Factory for coordinates generation");
68 validParamList->set<RCP<const FactoryBase> >(
"CoarseMap", Teuchos::null,
"Generating factory of the coarse map");
69 return validParamList;
72 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
74 Input(coarseLevel,
"CoarseMap");
77 const size_t numSubFactories = NumFactories();
78 for(
size_t i=0; i<numSubFactories; i++) {
79 const RCP<const FactoryBase>& myFactory = subFactories_[i];
80 coarseLevel.
DeclareInput(
"Coordinates", myFactory.getRawPtr(),
this);
84 for (std::vector<RCP<const FactoryBase> >::const_iterator it = subFactories_.begin(); it != subFactories_.end(); ++it)
85 (*it)->CallDeclareInput(coarseLevel);
88 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,LO,GO,NO> dMV;
93 typedef Xpetra::BlockedMultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,LO,GO,NO> dBV;
94 typedef Xpetra::BlockedMap<LO,GO,NO> BlockedMap;
96 GetOStream(
Runtime0) <<
"Transferring (blocked) coordinates" << std::endl;
98 const size_t numSubFactories = NumFactories();
100 std::vector<RCP<dMV> > subBlockCoords(numSubFactories);
102 if (coarseLevel.
IsAvailable(
"Coordinates",
this)) {
103 GetOStream(
Runtime0) <<
"Reusing coordinates" << std::endl;
108 for(
size_t i=0; i<numSubFactories; i++) {
109 GetOStream(
Runtime1) <<
"Generating Coordinates for block " << i <<
"/"<<numSubFactories <<std::endl;
110 const RCP<const FactoryBase>& myFactory = subFactories_[i];
111 myFactory->CallBuild(coarseLevel);
112 subBlockCoords[i] = coarseLevel.
Get<RCP<dMV> >(
"Coordinates", myFactory.get());
117 RCP<const BlockedMap> coarseMap = Get< RCP<const BlockedMap> >(coarseLevel,
"CoarseMap");
120 RCP<dBV> bcoarseCoords = rcp(
new dBV(coarseMap,subBlockCoords));
123 RCP<dMV> coarseCoords = bcoarseCoords->Merge();
124 Set<RCP<dMV> >(coarseLevel,
"Coordinates", coarseCoords);
127 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
129 subFactories_.push_back(factory);
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void DeclareInput(Level &finelevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
void AddFactory(const RCP< const FactoryBase > &factory)
Add (sub) coords factory in the end of list of factories in BlockedCoordinatesTransferFactory.
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()
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.
@ Runtime0
One-liner description of what is happening.
@ Runtime1
Description of what is happening (more verbose)