54 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> dMV;
55 typedef Xpetra::BlockedMultiVector<typename Teuchos::ScalarTraits<Scalar>::coordinateType, LO, GO, NO> dBV;
57 GetOStream(
Runtime0) <<
"Transferring (blocked) coordinates" << std::endl;
59 const size_t numSubFactories = NumFactories();
60 std::vector<RCP<const Map> > subBlockMaps(numSubFactories);
61 std::vector<RCP<dMV> > subBlockCoords(numSubFactories);
64 GetOStream(
Runtime0) <<
"Reusing coordinates" << std::endl;
69 for (
size_t i = 0; i < numSubFactories; i++) {
70 GetOStream(
Runtime1) <<
"Generating Coordinates for block " << i <<
"/" << numSubFactories << std::endl;
71 const RCP<const FactoryBase>& myFactory = subFactories_[i];
72 myFactory->CallBuild(coarseLevel);
73 subBlockCoords[i] = coarseLevel.
Get<RCP<dMV> >(
"Coordinates", myFactory.get());
74 subBlockMaps[i] = subBlockCoords[i]->getMap();
78 RCP<const BlockedMap> coarseCoordMapBlocked;
84 RCP<const BlockedMap> coarseMap = Get<RCP<const BlockedMap> >(coarseLevel,
"CoarseMap");
85 bool thyraMode = coarseMap->getThyraMode();
87 ArrayView<const GO> elementAList = coarseMap->getFullMap()->getLocalElementList();
90 if (rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(0, thyraMode)) != Teuchos::null)
91 blkSize = rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(0, thyraMode))->getFixedBlockSize();
93 for (
size_t i = 1; i < numSubFactories; i++) {
95 if (rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(i, thyraMode)) != Teuchos::null)
96 otherBlkSize = rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(i, thyraMode))->getFixedBlockSize();
97 TEUCHOS_TEST_FOR_EXCEPTION(otherBlkSize != blkSize,
Exceptions::RuntimeError,
"BlockedCoordinatesTransferFactory: Subblocks have different Block sizes. This is not yet supported.");
100 GO indexBase = coarseMap->getFullMap()->getIndexBase();
101 size_t numElements = elementAList.size() / blkSize;
102 Array<GO> elementList(numElements);
105 for (LO i = 0; i < Teuchos::as<LO>(numElements); i++)
106 elementList[i] = (elementAList[i * blkSize] - indexBase) / blkSize + indexBase;
108 RCP<const Map> coarseCoordMap = MapFactory::Build(coarseMap->getFullMap()->lib(),
109 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(), elementList, indexBase, coarseMap->getFullMap()->getComm());
111 coarseCoordMapBlocked = rcp(
new BlockedMap(coarseCoordMap, subBlockMaps, thyraMode));
115 RCP<dBV> bcoarseCoords = rcp(
new dBV(coarseCoordMapBlocked, subBlockCoords));
118 RCP<dMV> coarseCoords = bcoarseCoords->Merge();
119 Set<RCP<dMV> >(coarseLevel,
"Coordinates", coarseCoords);