46 #ifndef MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP
47 #define MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP
50 #include "Xpetra_MultiVectorFactory.hpp"
51 #include "Xpetra_MapFactory.hpp"
61 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
67 return validParamList;
70 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 Input(coarseLevel,
"CoarseMap");
75 const size_t numSubFactories = NumFactories();
76 for (
size_t i = 0; i < numSubFactories; i++) {
82 for (std::vector<
RCP<const FactoryBase> >::const_iterator it = subFactories_.begin(); it != subFactories_.end(); ++it)
83 (*it)->CallDeclareInput(coarseLevel);
86 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
93 GetOStream(
Runtime0) <<
"Transferring (blocked) coordinates" << std::endl;
95 const size_t numSubFactories = NumFactories();
96 std::vector<RCP<const Map> > subBlockMaps(numSubFactories);
97 std::vector<RCP<dMV> > subBlockCoords(numSubFactories);
100 GetOStream(
Runtime0) <<
"Reusing coordinates" << std::endl;
105 for (
size_t i = 0; i < numSubFactories; i++) {
106 GetOStream(
Runtime1) <<
"Generating Coordinates for block " << i <<
"/" << numSubFactories << std::endl;
109 subBlockCoords[i] = coarseLevel.
Get<
RCP<dMV> >(
"Coordinates", myFactory.
get());
110 subBlockMaps[i] = subBlockCoords[i]->getMap();
121 bool thyraMode = coarseMap->getThyraMode();
126 if (rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(0, thyraMode)) != Teuchos::null)
127 blkSize = rcp_dynamic_cast<
const StridedMap>(coarseMap->getMap(0, thyraMode))->getFixedBlockSize();
129 for (
size_t i = 1; i < numSubFactories; i++) {
131 if (rcp_dynamic_cast<const StridedMap>(coarseMap->getMap(i, thyraMode)) != Teuchos::null)
132 otherBlkSize = rcp_dynamic_cast<
const StridedMap>(coarseMap->getMap(i, thyraMode))->getFixedBlockSize();
136 GO indexBase = coarseMap->getFullMap()->getIndexBase();
137 size_t numElements = elementAList.
size() / blkSize;
141 for (LO i = 0; i < Teuchos::as<LO>(numElements); i++)
142 elementList[i] = (elementAList[i * blkSize] - indexBase) / blkSize + indexBase;
144 RCP<const Map> coarseCoordMap = MapFactory::Build(coarseMap->getFullMap()->lib(),
147 coarseCoordMapBlocked =
rcp(
new BlockedMap(coarseCoordMap, subBlockMaps, thyraMode));
151 RCP<dBV> bcoarseCoords =
rcp(
new dBV(coarseCoordMapBlocked, subBlockCoords));
154 RCP<dMV> coarseCoords = bcoarseCoords->Merge();
155 Set<RCP<dMV> >(coarseLevel,
"Coordinates", coarseCoords);
158 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
160 subFactories_.push_back(factory);
165 #endif // MUELU_BLOCKEDCOORDINATESTRANSFER_FACTORY_DEF_HPP
void DeclareInput(Level &finelevel, Level &coarseLevel) const
Specifies the data that this class needs, and the factories that generate that data.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
virtual void CallBuild(Level &requestedLevel) const =0
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)
One-liner description of what is happening.
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
void AddFactory(const RCP< const FactoryBase > &factory)
Add (sub) coords factory in the end of list of factories in BlockedCoordinatesTransferFactory.
Exception throws to report errors in the internal logical of the program.
Description of what is happening (more verbose)
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.