46 #ifndef MUELU_REBALANCEBLOCKINTERPOLATIONFACTORY_DEF_HPP_ 47 #define MUELU_REBALANCEBLOCKINTERPOLATIONFACTORY_DEF_HPP_ 49 #ifdef HAVE_MUELU_EXPERIMENTAL 51 #include <Teuchos_Tuple.hpp> 69 #include "MueLu_HierarchyUtils.hpp" 72 #include "MueLu_PerfUtils.hpp" 76 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
80 validParamList->
set<
RCP<const FactoryBase> >(
"P", Teuchos::null,
"Factory of the prolongation operator that need to be rebalanced (only used if type=Interpolation)");
81 validParamList->
set<
RCP<const FactoryBase> >(
"A", Teuchos::null,
"Factory for generating the non-rebalanced coarse level A. We need this to make sure the non-rebalanced coarse A is calculated first before rebalancing takes place.");
82 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name)) 84 #undef SET_VALID_ENTRY 90 return validParamList;
93 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
95 FactManager_.push_back(FactManager);
98 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
101 Input(coarseLevel,
"P");
102 Input(coarseLevel,
"A");
104 std::vector<Teuchos::RCP<const FactoryManagerBase> >::const_iterator it;
105 for(it = FactManager_.begin(); it!=FactManager_.end(); ++it) {
108 coarseLevel.
DeclareInput(
"Importer",(*it)->GetFactory(
"Importer").get(),
this);
112 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
121 originalTransferOp = Get< RCP<Matrix> >(coarseLevel,
"P");
137 bool bThyraRangeGIDs = rangeMapExtractor->getThyraMode();
138 bool bThyraDomainGIDs = domainMapExtractor->getThyraMode();
141 std::vector<GO> fullRangeMapVector;
142 std::vector<GO> fullDomainMapVector;
143 std::vector<RCP<const Map> > subBlockPRangeMaps;
144 std::vector<RCP<const Map> > subBlockPDomainMaps;
145 subBlockPRangeMaps.reserve(bOriginalTransferOp->Rows());
146 subBlockPDomainMaps.reserve(bOriginalTransferOp->Cols());
148 std::vector<Teuchos::RCP<Matrix> > subBlockRebP;
149 subBlockRebP.reserve(bOriginalTransferOp->Rows());
153 std::vector<Teuchos::RCP<const FactoryManagerBase> >::const_iterator it;
154 for (it = FactManager_.begin(); it != FactManager_.end(); ++it) {
169 "MueLu::RebalanceBlockInterpolationFactory::Build: inconsistent Thyra GIDs. Thyra global ids for block range " << curBlockId <<
" start with " << Pii->getRowMap()->getMinAllGlobalIndex() <<
" but should start with 0");
172 "MueLu::RebalanceBlockInterpolationFactory::Build: inconsistent Thyra GIDs. Thyra global ids for block domain " << curBlockId <<
" start with " << Pii->getColMap()->getMinAllGlobalIndex() <<
" but should start with 0");
175 if(rebalanceImporter != Teuchos::null) {
176 std::stringstream ss; ss <<
"Rebalancing prolongator block P(" << curBlockId <<
"," << curBlockId <<
")";
192 SubFactoryMonitor subM(*
this,
"Rebalancing prolongator -- fast map replacement", coarseLevel);
193 newImporter = ImportFactory::Build(rebalanceImporter->getTargetMap(), Pii->getColMap());
194 Pwii->getCrsMatrix()->replaceDomainMapAndImporter(rebalanceImporter->getTargetMap(), newImporter);
198 params->
set(
"printLoadBalancingInfo",
true);
199 std::stringstream ss2; ss2 <<
"P(" << curBlockId <<
"," << curBlockId <<
") rebalanced:";
203 subBlockRebP.push_back(Pii);
207 params->
set(
"printLoadBalancingInfo",
true);
208 std::stringstream ss; ss <<
"P(" << curBlockId <<
"," << curBlockId <<
") not rebalanced:";
211 subBlockRebP.push_back(Pii);
216 Teuchos::RCP<const StridedMap> orig_stridedRgMap = Teuchos::rcp_dynamic_cast<
const StridedMap>(rangeMapExtractor->getMap(Teuchos::as<size_t>(curBlockId),rangeMapExtractor->getThyraMode()));
218 if(orig_stridedRgMap != Teuchos::null) {
219 std::vector<size_t> stridingData = orig_stridedRgMap->getStridingData();
221 stridedRgMap = StridedMapFactory::Build(
222 originalTransferOp->getRangeMap()->lib(),
225 Pii->getRangeMap()->getIndexBase(),
227 originalTransferOp->getRangeMap()->getComm(),
228 orig_stridedRgMap->getStridedBlockId(),
229 orig_stridedRgMap->getOffset());
230 }
else stridedRgMap = Pii->getRangeMap();
233 Teuchos::RCP<const StridedMap> orig_stridedDoMap = Teuchos::rcp_dynamic_cast<
const StridedMap>(domainMapExtractor->getMap(Teuchos::as<size_t>(curBlockId),domainMapExtractor->getThyraMode()));
236 if(orig_stridedDoMap != Teuchos::null) {
237 std::vector<size_t> stridingData = orig_stridedDoMap->getStridingData();
239 stridedDoMap = StridedMapFactory::Build(originalTransferOp->getDomainMap()->lib(),
242 Pii->getDomainMap()->getIndexBase(),
244 originalTransferOp->getDomainMap()->getComm(),
245 orig_stridedDoMap->getStridedBlockId(),
246 orig_stridedDoMap->getOffset());
247 }
else stridedDoMap = Pii->getDomainMap();
253 if(Pii->IsView(
"stridedMaps")) Pii->RemoveView(
"stridedMaps");
254 Pii->CreateView(
"stridedMaps", stridedRgMap, stridedDoMap);
258 subBlockPRangeMaps.push_back(rangeMapii);
261 fullRangeMapVector.insert(fullRangeMapVector.end(), nodeRangeMapii.
begin(), nodeRangeMapii.
end());
262 if(bThyraRangeGIDs ==
false)
263 sort(fullRangeMapVector.begin(), fullRangeMapVector.end());
267 subBlockPDomainMaps.push_back(domainMapii);
270 fullDomainMapVector.insert(fullDomainMapVector.end(), nodeDomainMapii.
begin(), nodeDomainMapii.
end());
271 if(bThyraDomainGIDs ==
false)
272 sort(fullDomainMapVector.begin(), fullDomainMapVector.end());
279 GO rangeIndexBase = originalTransferOp->getRangeMap()->getIndexBase();
280 GO domainIndexBase= originalTransferOp->getDomainMap()->getIndexBase();
283 Teuchos::ArrayView<GO> fullRangeMapGIDs(fullRangeMapVector.size() ? &fullRangeMapVector[0] : 0,fullRangeMapVector.size());
286 if(stridedRgFullMap != Teuchos::null) {
287 std::vector<size_t> stridedData = stridedRgFullMap->getStridingData();
289 StridedMapFactory::Build(
290 originalTransferOp->getRangeMap()->lib(),
295 originalTransferOp->getRangeMap()->getComm(),
296 stridedRgFullMap->getStridedBlockId(),
297 stridedRgFullMap->getOffset());
301 originalTransferOp->getRangeMap()->lib(),
305 originalTransferOp->getRangeMap()->getComm());
309 Teuchos::ArrayView<GO> fullDomainMapGIDs(fullDomainMapVector.size() ? &fullDomainMapVector[0] : 0,fullDomainMapVector.size());
312 if(stridedDoFullMap != Teuchos::null) {
314 std::vector<size_t> stridedData2 = stridedDoFullMap->getStridingData();
316 StridedMapFactory::Build(
317 originalTransferOp->getDomainMap()->lib(),
322 originalTransferOp->getDomainMap()->getComm(),
323 stridedDoFullMap->getStridedBlockId(),
324 stridedDoFullMap->getOffset());
329 originalTransferOp->getDomainMap()->lib(),
333 originalTransferOp->getDomainMap()->getComm());
338 MapExtractorFactory::Build(fullRangeMap, subBlockPRangeMaps, bThyraRangeGIDs);
340 MapExtractorFactory::Build(fullDomainMap, subBlockPDomainMaps, bThyraDomainGIDs);
343 for(
size_t i = 0; i<subBlockPRangeMaps.size(); i++) {
346 bRebP->setMatrix(i,i,crsOpii);
348 bRebP->fillComplete();
350 Set(coarseLevel,
"P", Teuchos::rcp_dynamic_cast<Matrix>(bRebP));
Exception indicating invalid cast attempted.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Namespace for MueLu classes and methods.
Print statistics that do not involve significant additional computation.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
Timer to be used in factories. Similar to SubMonitor but adds a timer level by level.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
static std::string PrintMatrixInfo(const Matrix &A, const std::string &msgTag, RCP< const Teuchos::ParameterList > params=Teuchos::null)
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
Exception throws to report errors in the internal logical of the program.
An exception safe way to call the method 'Level::SetFactoryManager()'.
void AddFactoryManager(RCP< const FactoryManagerBase > FactManager)
Add a factory manager.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()