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<double,LO,GO,NO> dMV;
93 typedef Xpetra::BlockedMultiVector<double,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);
136 #endif // MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP