本文整理汇总了C++中Level::IsAvailable方法的典型用法代码示例。如果您正苦于以下问题:C++ Level::IsAvailable方法的具体用法?C++ Level::IsAvailable怎么用?C++ Level::IsAvailable使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Level
的用法示例。
在下文中一共展示了Level::IsAvailable方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: testBuildCheck
// test outpout of Build() and BuildSmoother()
void testBuildCheck(RCP<SmootherFactory> smooFact, Level& level, RCP<SmootherPrototype> smooProtoA, RCP<SmootherPrototype> smooProtoB, MueLu::PreOrPost preOrPost, Teuchos::FancyOStream & out, bool & success) {
// invariant: smoother prototypes kept unchanged
check(smooFact, smooProtoA, smooProtoB, out, success);
// output test
if (preOrPost == MueLu::BOTH) {
testBuildCheckOutput(smooFact, level, smooProtoA, "PreSmoother", out, success);
testBuildCheckOutput(smooFact, level, smooProtoB, "PostSmoother", out, success);
// ReUse: if pre and post prototype are the same, then pre smoother == post smoother
// otherwise, they are different (have not been tested by previous tests)
RCP<SmootherBase> smooA, smooB;
if (smooProtoA != Teuchos::null) { smooA = level.Get< RCP<SmootherBase> >("PreSmoother", smooFact.get()); }
if (smooProtoB != Teuchos::null) { smooB = level.Get< RCP<SmootherBase> >("PostSmoother", smooFact.get()); }
if (smooProtoA == smooProtoB) { TEST_EQUALITY(smooA, smooB); } else { TEST_INEQUALITY(smooA, smooB); }
} else if (preOrPost == MueLu::PRE) {
testBuildCheckOutput(smooFact, level, smooProtoA, "PreSmoother", out, success);
TEST_EQUALITY(level.IsAvailable("PostSmoother", smooFact.get()), false);
} else if (preOrPost == MueLu::POST) {
TEST_EQUALITY(level.IsAvailable("PreSmoother", smooFact.get()), false);
testBuildCheckOutput(smooFact, level, smooProtoB, "PostSmoother", out, success);
} else { TEST_EQUALITY(true, false); }
}
示例2: m
void EminPFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node, LocalMatOps>::BuildP(Level& fineLevel, Level& coarseLevel) const {
FactoryMonitor m(*this, "Prolongator minimization", coarseLevel);
const ParameterList & pL = GetParameterList();
// Set keep flags
if (pL.isParameter("Keep P0") && pL.get<bool>("Keep P0"))
coarseLevel.Keep("P0",this);
if (pL.isParameter("Keep Constraint0") && pL.get<bool>("Keep Constraint0"))
coarseLevel.Keep("Constraint0",this);
// Reuse
int Niterations;
// Get A, B
RCP<Matrix> A = Get< RCP<Matrix> > (fineLevel, "A");
RCP<MultiVector> B = Get< RCP<MultiVector> >(fineLevel, "Nullspace");
// Get P0 or make P
RCP<Matrix> P0;
if (coarseLevel.IsAvailable("P0", this)) {
P0 = coarseLevel.Get<RCP<Matrix> >("P0", this);
Niterations = pL.get<int>("Reuse Niterations");
GetOStream(Runtime0, 0) << "EminPFactory: Reusing P0"<<std::endl;
} else {
P0 = Get< RCP<Matrix> >(coarseLevel, "P");
Niterations = pL.get<int>("Niterations");
}
// Get Constraint0 or make Constraint
RCP<Constraint> X;
if (coarseLevel.IsAvailable("Constraint0", this)) {
X = coarseLevel.Get<RCP<Constraint> >("Constraint0", this);
GetOStream(Runtime0, 0) << "EminPFactory: Reusing Constraint0"<<std::endl;
} else {
X = Get< RCP<Constraint> > (coarseLevel, "Constraint");
}
RCP<Matrix> P;
CGSolver EminSolver(Niterations);
EminSolver.Iterate(*A, *X, *P0, *B, P);
Set(coarseLevel, "Constraint0", X);
Set(coarseLevel, "P", P);
Set(coarseLevel, "P0", P);
RCP<ParameterList> params = rcp(new ParameterList());
params->set("printLoadBalancingInfo", true);
GetOStream(Statistics0,0) << Utils::PrintMatrixInfo(*P, "P", params);
}
示例3: testBuildCheckOutput
// test if a smoother created by Build() is correct (check if it corresponds to the prototype)
void testBuildCheckOutput(RCP<SmootherFactory> smooFact, Level& level, RCP<SmootherPrototype> smooProto, const std::string& tag, Teuchos::FancyOStream & out, bool & success) {
if (smooProto == Teuchos::null) {
TEST_EQUALITY(level.IsAvailable(tag, smooFact.get()), false);
} else {
RCP<SmootherBase> smoother;
TEST_NOTHROW(smoother = level.Get< RCP<SmootherBase> >(tag, smooFact.get()));
TEST_INEQUALITY(smoother, Teuchos::null);
TEST_INEQUALITY(smoother, smooProto);
if (smooProto != Teuchos::null) {
RCP<FakeSmootherPrototype> smootherF;
// ouput test: smoothers same derived class as prototypes
TEST_NOTHROW(smootherF = rcp_dynamic_cast<FakeSmootherPrototype>(smoother,true));
if (smootherF != Teuchos::null) {
// output test: smoother parameters == prototype parameters
RCP<FakeSmootherPrototype> smooProtoF = rcp_dynamic_cast<FakeSmootherPrototype>(smooProto,true);
TEST_EQUALITY(smootherF->GetParam(), smooProtoF->GetParam());
// output test: smoothers are ready to be apply
TEST_EQUALITY(smootherF->IsSetup(), true);
// setup done only once.
TEST_EQUALITY(smootherF->GetNumOfSetupCall(), 1);
TEST_EQUALITY(smootherF->GetNumOfSetup(), 1);
}
}
}
}
示例4: Input
void EminPFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node, LocalMatOps>::DeclareInput(Level& fineLevel, Level& coarseLevel) const {
Input(fineLevel, "A");
static bool isAvailableP0 = false;
static bool isAvailableConstraint0 = false;
// Here is a tricky little piece of code
// We don't want to request (aka call Input) when we reuse and P0 is available
// However, we cannot run something simple like this:
// if (!coarseLevel.IsAvailable("P0", this))
// Input(coarseLevel, "P");
// The reason is that it works fine during the request stage, but fails
// in the release stage as we _construct_ P0 during Build process. Therefore,
// we need to understand whether we are in Request or Release mode
// NOTE: This is a very unique situation, please try not to propagate the
// mode check any further
if (coarseLevel.GetRequestMode() == Level::REQUEST) {
isAvailableP0 = coarseLevel.IsAvailable("P0", this);
isAvailableConstraint0 = coarseLevel.IsAvailable("Constraint0", this);
}
if (isAvailableP0 == false)
Input(coarseLevel, "P");
if (isAvailableConstraint0 == false)
Input(coarseLevel, "Constraint");
}
示例5: m
void CloneRepartitionInterface<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(Level ¤tLevel) const {
FactoryMonitor m(*this, "Build", currentLevel);
currentLevel.print(GetOStream(Statistics0,0));
// extract blocked operator A from current level
Teuchos::RCP<Matrix> A = Get< Teuchos::RCP<Matrix> > (currentLevel, "A");
Teuchos::RCP<const Teuchos::Comm< int > > comm = A->getRowMap()->getComm();
// number of Partitions only used for a shortcut.
GO numPartitions = 0;
if (currentLevel.IsAvailable("number of partitions")) {
numPartitions = currentLevel.Get<GO>("number of partitions");
GetOStream(Warnings0) << "Using user-provided \"number of partitions\", the performance is unknown" << std::endl;
}
// ======================================================================================================
// Construct decomposition vector
// ======================================================================================================
RCP<GOVector> decomposition = Teuchos::null;
// extract decomposition vector
decomposition = Get<RCP<GOVector> >(currentLevel, "Partition");
ArrayRCP<const GO> decompEntries = decomposition->getData(0);
if (decomposition.is_null()) {
GetOStream(Warnings0) << "No repartitioning necessary: partitions were left unchanged by the repartitioner" << std::endl;
Set<RCP<const Import> >(currentLevel, "Importer", Teuchos::null);
return;
}
// create new decomposition vector
Teuchos::RCP<GOVector> ret = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(A->getRowMap(), false);
ArrayRCP<GO> retDecompEntries = ret->getDataNonConst(0);
// block size of output vector
LocalOrdinal blkSize = A->GetFixedBlockSize();
// plausibility check!
size_t inLocalLength = decomposition->getLocalLength();
size_t outLocalLength = A->getRowMap()->getNodeNumElements();
size_t numLocalNodes = outLocalLength / blkSize;
TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(outLocalLength % blkSize) != 0, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: inconsistent number of local DOFs (" << outLocalLength << ") and degrees of freedoms ("<<blkSize<<")");
if (numLocalNodes > 0) {
TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(inLocalLength % numLocalNodes) != 0, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: inconsistent number of local DOFs (" << inLocalLength << ") and number of local nodes (" << numLocalNodes << ")");
LocalOrdinal inBlkSize = Teuchos::as<LocalOrdinal>(inLocalLength / numLocalNodes);
//TEUCHOS_TEST_FOR_EXCEPTION(blkSize != inBlkSize, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: input block size = " << inBlkSize << " outpub block size = " << blkSize << ". They should be the same.");
for(LO i = 0; i<Teuchos::as<LO>(numLocalNodes); i++) {
for(LO j = 0; j < blkSize; j++) {
retDecompEntries[i*blkSize + j] = Teuchos::as<GO>(decompEntries[i*inBlkSize]);
}
}
} // end if numLocalNodes > 0
Set(currentLevel, "Partition", ret);
} //Build()
示例6: Input
void RigidBodyModeFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node, LocalMatOps>::DeclareInput(Level ¤tLevel) const {
if (currentLevel.IsAvailable(nspName_, NoFactory::get()) == false && currentLevel.GetLevelID() == 0) {
Input(currentLevel, "A");
//Input(currentLevel,"Coordinates");
}
if (currentLevel.GetLevelID() !=0) {
currentLevel.DeclareInput("Nullspace", GetFactory(nspName_).get(), this); /* ! "Nullspace" and nspName_ mismatch possible here */
}
}
示例7: m
void TogglePFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(Level& fineLevel, Level &coarseLevel) const {
FactoryMonitor m(*this, "Prolongator toggle", coarseLevel);
std::ostringstream levelstr;
levelstr << coarseLevel.GetLevelID();
typedef typename Teuchos::ScalarTraits<SC>::magnitudeType Magnitude;
TEUCHOS_TEST_FOR_EXCEPTION(nspFacts_.size() != prolongatorFacts_.size(), Exceptions::RuntimeError, "MueLu::TogglePFactory::Build: The number of provided prolongator factories and coarse nullspace factories must be identical.");
TEUCHOS_TEST_FOR_EXCEPTION(nspFacts_.size() != 2, Exceptions::RuntimeError, "MueLu::TogglePFactory::Build: TogglePFactory needs two different transfer operator strategies for toggling."); // TODO adapt this/weaken this as soon as other toggling strategies are introduced.
// decision routine which prolongator factory to be used
int nProlongatorFactory = 0; // default behavior: use first prolongator in list
// extract user parameters
const Teuchos::ParameterList & pL = GetParameterList();
std::string mode = Teuchos::as<std::string>(pL.get<std::string>("toggle: mode"));
int semicoarsen_levels = Teuchos::as<int>(pL.get<int>("semicoarsen: number of levels"));
TEUCHOS_TEST_FOR_EXCEPTION(mode!="semicoarsen", Exceptions::RuntimeError, "MueLu::TogglePFactory::Build: The 'toggle: mode' parameter must be set to 'semicoarsen'. No other mode supported, yet.");
LO NumZDir = -1;
if(fineLevel.IsAvailable("NumZLayers", NoFactory::get())) {
NumZDir = fineLevel.Get<LO>("NumZLayers", NoFactory::get()); //obtain info
GetOStream(Runtime1) << "Number of layers for semicoarsening: " << NumZDir << std::endl;
}
// Make a decision which prolongator to be used.
if(fineLevel.GetLevelID() >= semicoarsen_levels || NumZDir == 1) {
nProlongatorFactory = 1;
} else {
nProlongatorFactory = 0;
}
RCP<Matrix> P = Teuchos::null;
RCP<MultiVector> coarseNullspace = Teuchos::null;
// call Build for selected transfer operator
GetOStream(Runtime0) << "TogglePFactory: call transfer factory: " << (prolongatorFacts_[nProlongatorFactory])->description() << std::endl;
prolongatorFacts_[nProlongatorFactory]->CallBuild(coarseLevel);
P = coarseLevel.Get< RCP<Matrix> >("P", (prolongatorFacts_[nProlongatorFactory]).get());
coarseNullspace = coarseLevel.Get< RCP<MultiVector> >("Nullspace", (nspFacts_[nProlongatorFactory]).get());
// Release dependencies of all prolongator and coarse level null spaces
for(size_t t=0; t<nspFacts_.size(); ++t) {
coarseLevel.Release(*(prolongatorFacts_[t]));
coarseLevel.Release(*(nspFacts_[t]));
}
// store prolongator with this factory identification.
Set(coarseLevel, "P", P);
Set(coarseLevel, "Nullspace", coarseNullspace);
} //Build()
示例8: Input
void CoordinatesTransferFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::DeclareInput(Level& fineLevel, Level& coarseLevel) const {
static bool isAvailableCoords = false;
if (coarseLevel.GetRequestMode() == Level::REQUEST)
isAvailableCoords = coarseLevel.IsAvailable("Coordinates", this);
if (isAvailableCoords == false) {
Input(fineLevel, "Coordinates");
Input(fineLevel, "Aggregates");
Input(fineLevel, "CoarseMap");
}
}
示例9: rcp
TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(ThresholdAFilterFactory, Basic, Scalar, LocalOrdinal, GlobalOrdinal, Node)
{
# include <MueLu_UseShortNames.hpp>
MUELU_TESTING_SET_OSTREAM;
MUELU_TESTING_LIMIT_EPETRA_SCOPE(Scalar,GlobalOrdinal,Node);
out << "version: " << MueLu::Version() << std::endl;
Level aLevel;
TestHelpers::TestFactory<SC, LO, GO, NO>::createSingleLevelHierarchy(aLevel);
RCP<Matrix> A = TestHelpers::TestFactory<SC, LO, GO, NO>::Build1DPoisson(20); //can be an empty operator
RCP<ThresholdAFilterFactory> AfilterFactory0 = rcp(new ThresholdAFilterFactory("A",0.1)); // keep all
RCP<ThresholdAFilterFactory> AfilterFactory1 = rcp(new ThresholdAFilterFactory("A",1.1)); // keep only diagonal
RCP<ThresholdAFilterFactory> AfilterFactory2 = rcp(new ThresholdAFilterFactory("A",3)); // keep only diagonal
aLevel.Set("A",A);
aLevel.Request("A",AfilterFactory0.get());
AfilterFactory0->Build(aLevel);
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory0.get()), true);
RCP<Matrix> A0 = aLevel.Get< RCP<Matrix> >("A",AfilterFactory0.get());
aLevel.Release("A",AfilterFactory0.get());
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory0.get()), false);
TEST_EQUALITY(A0->getNodeNumEntries(), A->getNodeNumEntries());
TEST_EQUALITY(A0->getGlobalNumEntries(), A->getGlobalNumEntries());
aLevel.Request("A",AfilterFactory1.get());
AfilterFactory1->Build(aLevel);
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory1.get()), true);
RCP<Matrix> A1 = aLevel.Get< RCP<Matrix> >("A",AfilterFactory1.get());
aLevel.Release("A",AfilterFactory1.get());
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory1.get()), false);
TEST_EQUALITY(A1->getGlobalNumEntries(), A1->getGlobalNumRows());
aLevel.Request("A",AfilterFactory2.get());
AfilterFactory2->Build(aLevel);
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory2.get()), true);
RCP<Matrix> A2 = aLevel.Get< RCP<Matrix> >("A",AfilterFactory2.get());
aLevel.Release("A",AfilterFactory2.get());
TEST_EQUALITY(aLevel.IsAvailable("A",AfilterFactory2.get()), false);
TEST_EQUALITY(A2->getGlobalNumEntries(), A2->getGlobalNumRows());
}
示例10: m
void SaPFactory_kokkos<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType>>::BuildP(Level& fineLevel, Level& coarseLevel) const {
FactoryMonitor m(*this, "Prolongator smoothing", coarseLevel);
// Add debugging information
DeviceType::execution_space::print_configuration(GetOStream(Runtime1));
typedef typename Teuchos::ScalarTraits<SC>::magnitudeType Magnitude;
// Get default tentative prolongator factory
// Getting it that way ensure that the same factory instance will be used for both SaPFactory_kokkos and NullspaceFactory.
// -- Warning: Do not use directly initialPFact_. Use initialPFact instead everywhere!
RCP<const FactoryBase> initialPFact = GetFactory("P");
if (initialPFact == Teuchos::null) { initialPFact = coarseLevel.GetFactoryManager()->GetFactory("Ptent"); }
// Level Get
RCP<Matrix> A = Get< RCP<Matrix> >(fineLevel, "A");
RCP<Matrix> Ptent = coarseLevel.Get< RCP<Matrix> >("P", initialPFact.get());
if(restrictionMode_) {
SubFactoryMonitor m2(*this, "Transpose A", coarseLevel);
A = Utilities_kokkos::Transpose(*A, true); // build transpose of A explicitly
}
//Build final prolongator
RCP<Matrix> finalP; // output
// Reuse pattern if available
RCP<ParameterList> APparams = rcp(new ParameterList);
if (coarseLevel.IsAvailable("AP reuse data", this)) {
GetOStream(static_cast<MsgType>(Runtime0 | Test)) << "Reusing previous AP data" << std::endl;
APparams = coarseLevel.Get< RCP<ParameterList> >("AP reuse data", this);
if (APparams->isParameter("graph"))
finalP = APparams->get< RCP<Matrix> >("graph");
}
const ParameterList& pL = GetParameterList();
SC dampingFactor = as<SC>(pL.get<double>("sa: damping factor"));
LO maxEigenIterations = as<LO>(pL.get<int>("sa: eigenvalue estimate num iterations"));
bool estimateMaxEigen = pL.get<bool>("sa: calculate eigenvalue estimate");
if (dampingFactor != Teuchos::ScalarTraits<SC>::zero()) {
SC lambdaMax;
{
SubFactoryMonitor m2(*this, "Eigenvalue estimate", coarseLevel);
lambdaMax = A->GetMaxEigenvalueEstimate();
if (lambdaMax == -Teuchos::ScalarTraits<SC>::one() || estimateMaxEigen) {
GetOStream(Statistics1) << "Calculating max eigenvalue estimate now (max iters = "<< maxEigenIterations << ")" << std::endl;
Magnitude stopTol = 1e-4;
lambdaMax = Utilities_kokkos::PowerMethod(*A, true, maxEigenIterations, stopTol);
A->SetMaxEigenvalueEstimate(lambdaMax);
} else {
GetOStream(Statistics1) << "Using cached max eigenvalue estimate" << std::endl;
}
GetOStream(Statistics0) << "Prolongator damping factor = " << dampingFactor/lambdaMax << " (" << dampingFactor << " / " << lambdaMax << ")" << std::endl;
}
{
SubFactoryMonitor m2(*this, "Fused (I-omega*D^{-1} A)*Ptent", coarseLevel);
RCP<Vector> invDiag = Utilities_kokkos::GetMatrixDiagonalInverse(*A);
SC omega = dampingFactor / lambdaMax;
// finalP = Ptent + (I - \omega D^{-1}A) Ptent
finalP = Xpetra::IteratorOps<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Jacobi(omega, *invDiag, *A, *Ptent, finalP, GetOStream(Statistics2), std::string("MueLu::SaP-") + toString(coarseLevel.GetLevelID()), APparams);
}
} else {
finalP = Ptent;
}
// Level Set
if (!restrictionMode_) {
// prolongation factory is in prolongation mode
Set(coarseLevel, "P", finalP);
// NOTE: EXPERIMENTAL
if (Ptent->IsView("stridedMaps"))
finalP->CreateView("stridedMaps", Ptent);
} else {
// prolongation factory is in restriction mode
RCP<Matrix> R = Utilities_kokkos::Transpose(*finalP, true);
Set(coarseLevel, "R", R);
// NOTE: EXPERIMENTAL
if (Ptent->IsView("stridedMaps"))
R->CreateView("stridedMaps", Ptent, true);
}
if (IsPrint(Statistics1)) {
RCP<ParameterList> params = rcp(new ParameterList());
params->set("printLoadBalancingInfo", true);
params->set("printCommInfo", true);
GetOStream(Statistics1) << PerfUtils::PrintMatrixInfo(*finalP, (!restrictionMode_ ? "P" : "R"), params);
}
} //Build()
示例11: m
void CloneRepartitionInterface<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(Level ¤tLevel) const {
FactoryMonitor m(*this, "Build", currentLevel);
currentLevel.print(GetOStream(Statistics0,0));
// extract blocked operator A from current level
Teuchos::RCP<Matrix> A = Get< Teuchos::RCP<Matrix> > (currentLevel, "A");
Teuchos::RCP<const Teuchos::Comm< int > > comm = A->getRowMap()->getComm();
// number of Partitions only used for a shortcut.
GO numPartitions = 0;
if (currentLevel.IsAvailable("number of partitions")) {
numPartitions = currentLevel.Get<GO>("number of partitions");
GetOStream(Warnings0) << "Using user-provided \"number of partitions\", the performance is unknown" << std::endl;
}
// ======================================================================================================
// Construct decomposition vector
// ======================================================================================================
RCP<GOVector> decomposition = Teuchos::null;
// extract decomposition vector
decomposition = Get<RCP<GOVector> >(currentLevel, "Partition");
ArrayRCP<const GO> decompEntries = decomposition->getData(0);
if (decomposition.is_null()) {
GetOStream(Warnings0) << "No repartitioning necessary: partitions were left unchanged by the repartitioner" << std::endl;
Set<RCP<const Import> >(currentLevel, "Importer", Teuchos::null);
return;
}
// create new decomposition vector
Teuchos::RCP<GOVector> ret = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(A->getRowMap(), false);
ArrayRCP<GO> retDecompEntries = ret->getDataNonConst(0);
// block size of output vector
LocalOrdinal blkSize = 1;
// check for blocking/striding information
if(A->IsView("stridedMaps") &&
Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap("stridedMaps")) != Teuchos::null) {
Xpetra::viewLabel_t oldView = A->SwitchToView("stridedMaps"); // note: "stridedMaps are always non-overlapping (correspond to range and domain maps!)
RCP<const StridedMap> strMap = Teuchos::rcp_dynamic_cast<const StridedMap>(A->getRowMap());
TEUCHOS_TEST_FOR_EXCEPTION(strMap == Teuchos::null,Exceptions::BadCast,"MueLu::CloneRepartitionInterface::Build: cast to strided row map failed.");
LocalOrdinal stridedBlock = strMap->getStridedBlockId();
if (stridedBlock == -1)
blkSize = strMap->getFixedBlockSize();
else {
std::vector<size_t> strInfo = strMap->getStridingData();
blkSize = strInfo[stridedBlock];
}
oldView = A->SwitchToView(oldView);
GetOStream(Statistics1) << "CloneRepartitionInterface::Build():" << " found blockdim=" << blkSize << " from strided maps."<< std::endl;
} else {
GetOStream(Statistics1) << "CloneRepartitionInterface::Build(): no striding information available. Use blockdim=" << blkSize << " (DofsPerNode)." << std::endl;
blkSize = A->GetFixedBlockSize();
}
// plausibility check!
size_t inLocalLength = decomposition->getLocalLength();
size_t outLocalLength = A->getRowMap()->getNodeNumElements();
// only for non-strided maps
size_t numLocalNodes = outLocalLength / blkSize;
TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(outLocalLength % blkSize) != 0, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: inconsistent number of local DOFs (" << outLocalLength << ") and degrees of freedoms (" << blkSize <<")");
if (numLocalNodes > 0) {
TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(inLocalLength % numLocalNodes) != 0, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: inconsistent number of local DOFs (" << inLocalLength << ") and number of local nodes (" << numLocalNodes << ")");
LocalOrdinal inBlkSize = Teuchos::as<LocalOrdinal>(inLocalLength / numLocalNodes);
//TEUCHOS_TEST_FOR_EXCEPTION(blkSize != inBlkSize, MueLu::Exceptions::RuntimeError,"CloneRepartitionInterface: input block size = " << inBlkSize << " outpub block size = " << blkSize << ". They should be the same.");
for(LO i = 0; i<Teuchos::as<LO>(numLocalNodes); i++) {
for(LO j = 0; j < blkSize; j++) {
retDecompEntries[i*blkSize + j] = Teuchos::as<GO>(decompEntries[i*inBlkSize]);
}
}
} // end if numLocalNodes > 0
Set(currentLevel, "Partition", ret);
} //Build()
示例12: IsAvailable
bool IsAvailable(Level & level, const std::string & varName) const {
return level.IsAvailable(varName, GetFactory(varName).get());
}
示例13: m
void RAPFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(Level& fineLevel, Level& coarseLevel) const {
{
FactoryMonitor m(*this, "Computing Ac", coarseLevel);
std::ostringstream levelstr;
levelstr << coarseLevel.GetLevelID();
TEUCHOS_TEST_FOR_EXCEPTION(hasDeclaredInput_==false, Exceptions::RuntimeError,
"MueLu::RAPFactory::Build(): CallDeclareInput has not been called before Build!");
// Set "Keeps" from params
const Teuchos::ParameterList& pL = GetParameterList();
if (pL.get<bool>("Keep AP Pattern"))
coarseLevel.Keep("AP Pattern", this);
if (pL.get<bool>("Keep RAP Pattern"))
coarseLevel.Keep("RAP Pattern", this);
RCP<Matrix> A = Get< RCP<Matrix> >(fineLevel, "A");
RCP<Matrix> P = Get< RCP<Matrix> >(coarseLevel, "P"), AP, Ac;
// Reuse pattern if available (multiple solve)
if (coarseLevel.IsAvailable("AP Pattern", this)) {
GetOStream(Runtime0) << "Ac: Using previous AP pattern" << std::endl;
AP = Get< RCP<Matrix> >(coarseLevel, "AP Pattern");
}
{
SubFactoryMonitor subM(*this, "MxM: A x P", coarseLevel);
AP = Utils::Multiply(*A, false, *P, false, AP, GetOStream(Statistics2),true,true,std::string("MueLu::A*P-")+levelstr.str());
}
if (pL.get<bool>("Keep AP Pattern"))
Set(coarseLevel, "AP Pattern", AP);
// Reuse coarse matrix memory if available (multiple solve)
if (coarseLevel.IsAvailable("RAP Pattern", this)) {
GetOStream(Runtime0) << "Ac: Using previous RAP pattern" << std::endl;
Ac = Get< RCP<Matrix> >(coarseLevel, "RAP Pattern");
// Some eigenvalue may have been cached with the matrix in the previous run.
// As the matrix values will be updated, we need to reset the eigenvalue.
Ac->SetMaxEigenvalueEstimate(-Teuchos::ScalarTraits<SC>::one());
}
// If we do not modify matrix later, allow optimization of storage.
// This is necessary for new faster Epetra MM kernels.
bool doOptimizeStorage = !pL.get<bool>("RepairMainDiagonal");
const bool doTranspose = true;
const bool doFillComplete = true;
if (pL.get<bool>("transpose: use implicit") == true) {
SubFactoryMonitor m2(*this, "MxM: P' x (AP) (implicit)", coarseLevel);
Ac = Utils::Multiply(*P, doTranspose, *AP, !doTranspose, Ac, GetOStream(Statistics2), doFillComplete, doOptimizeStorage,std::string("MueLu::R*(AP)-implicit-")+levelstr.str());
} else {
RCP<Matrix> R = Get< RCP<Matrix> >(coarseLevel, "R");
SubFactoryMonitor m2(*this, "MxM: R x (AP) (explicit)", coarseLevel);
Ac = Utils::Multiply(*R, !doTranspose, *AP, !doTranspose, Ac, GetOStream(Statistics2), doFillComplete, doOptimizeStorage,std::string("MueLu::R*(AP)-explicit-")+levelstr.str());
}
CheckRepairMainDiagonal(Ac);
if (IsPrint(Statistics1)) {
RCP<ParameterList> params = rcp(new ParameterList());;
params->set("printLoadBalancingInfo", true);
params->set("printCommInfo", true);
GetOStream(Statistics1) << PerfUtils::PrintMatrixInfo(*Ac, "Ac", params);
}
Set(coarseLevel, "A", Ac);
if (pL.get<bool>("Keep RAP Pattern"))
Set(coarseLevel, "RAP Pattern", Ac);
}
if (transferFacts_.begin() != transferFacts_.end()) {
SubFactoryMonitor m(*this, "Projections", coarseLevel);
// call Build of all user-given transfer factories
for (std::vector<RCP<const FactoryBase> >::const_iterator it = transferFacts_.begin(); it != transferFacts_.end(); ++it) {
RCP<const FactoryBase> fac = *it;
GetOStream(Runtime0) << "RAPFactory: call transfer factory: " << fac->description() << std::endl;
fac->CallBuild(coarseLevel);
// Coordinates transfer is marginally different from all other operations
// because it is *optional*, and not required. For instance, we may need
// coordinates only on level 4 if we start repartitioning from that level,
// but we don't need them on level 1,2,3. As our current Hierarchy setup
// assumes propagation of dependencies only through three levels, this
// means that we need to rely on other methods to propagate optional data.
//
// The method currently used is through RAP transfer factories, which are
// simply factories which are called at the end of RAP with a single goal:
// transfer some fine data to coarser level. Because these factories are
// kind of outside of the mainline factories, they behave different. In
// particular, we call their Build method explicitly, rather than through
// Get calls. This difference is significant, as the Get call is smart
// enough to know when to release all factory dependencies, and Build is
// dumb. This led to the following CoordinatesTransferFactory sequence:
// 1. Request level 0
// 2. Request level 1
//.........这里部分代码省略.........
示例14: m
//.........这里部分代码省略.........
MueLu_minAll(comm, (numMyNnz > 0 ? numMyNnz : maxNnz), minNnz); // min nnz over all active processors
double imbalance = Teuchos::as<double>(maxNnz)/minNnz;
if (imbalance > nonzeroImbalance)
test4 = true;
msg4 = "\n nonzero imbalance = " + Teuchos::toString(imbalance) + ", max allowable = " + Teuchos::toString(nonzeroImbalance);
}
if (!test3 && !test4) {
GetOStream(Statistics0) << "Repartitioning? NO:" << msg3 + msg4 << std::endl;
Set<RCP<const Import> >(currentLevel, "Importer", Teuchos::null);
return;
}
GetOStream(Statistics0) << "Repartitioning? YES:" << msg3 + msg4 << std::endl;
GO indexBase = rowMap->getIndexBase();
Xpetra::UnderlyingLib lib = rowMap->lib();
int myRank = comm->getRank();
int numProcs = comm->getSize();
RCP<const Teuchos::MpiComm<int> > tmpic = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
TEUCHOS_TEST_FOR_EXCEPTION(tmpic == Teuchos::null, Exceptions::RuntimeError, "Cannot cast base Teuchos::Comm to Teuchos::MpiComm object.");
RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > rawMpiComm = tmpic->getRawMpiComm();
// ======================================================================================================
// Calculate number of partitions
// ======================================================================================================
// FIXME Quick way to figure out how many partitions there should be (same algorithm as ML)
// FIXME Should take into account nnz? Perhaps only when user is using min #nnz per row threshold.
GO numPartitions;
if (currentLevel.IsAvailable("number of partitions")) {
numPartitions = currentLevel.Get<GO>("number of partitions");
GetOStream(Warnings0) << "Using user-provided \"number of partitions\", the performance is unknown" << std::endl;
} else {
if (Teuchos::as<GO>(A->getGlobalNumRows()) < minRowsPerProcessor) {
// System is too small, migrate it to a single processor
numPartitions = 1;
} else {
// Make sure that each processor has approximately minRowsPerProcessor
numPartitions = A->getGlobalNumRows() / minRowsPerProcessor;
}
numPartitions = std::min(numPartitions, Teuchos::as<GO>(numProcs));
currentLevel.Set("number of partitions", numPartitions, NoFactory::get());
}
GetOStream(Statistics0) << "Number of partitions to use = " << numPartitions << std::endl;
// ======================================================================================================
// Construct decomposition vector
// ======================================================================================================
RCP<GOVector> decomposition;
if (numPartitions == 1) {
// Trivial case: decomposition is the trivial one, all zeros. We skip the call to Zoltan_Interface
// (this is mostly done to avoid extra output messages, as even if we didn't skip there is a shortcut
// in Zoltan[12]Interface).
// TODO: We can probably skip more work in this case (like building all extra data structures)
GetOStream(Warnings0) << "Only one partition: Skip call to the repartitioner." << std::endl;
decomposition = Xpetra::VectorFactory<GO, LO, GO, NO>::Build(A->getRowMap(), true);
} else {
decomposition = Get<RCP<GOVector> >(currentLevel, "Partition");
示例15: GetParameterList
void SmootherFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BuildSmoother(Level& currentLevel, PreOrPost const preOrPost) const {
// SmootherFactory is quite tricky because of the fact that one of the smoother prototypes may be zero.
// The challenge is that we have no way of knowing how user uses this factory. For instance, lets say
// user wants to use s1 prototype as a presmoother, and s2 as a postsmoother. He could do:
// (a) create SmootherFactory(s1, s2), or
// (b) create SmootherFactory(s1, null) and SmootherFactory(null, s2)
// It may also happen that somewhere somebody set presmoother factory = postsmoother factory = (a)
// How do you do DeclareInput in this case? It could easily introduce a bug if a user does not check
// whether presmoother = postsmoother. A buggy code could look like that:
// RCP<SmootherFactory> s = rcp(new SmootherFactory(s1,s2));
// level.Request("PreSmoother", s.get());
// level.Request("PostSmoother", s.get());
// Get<RCP<SmootherBase> > pre = Get<RCP<SmootherBase> >("PreSmoother", s.get());
// Get<RCP<SmootherBase> > post = Get<RCP<SmootherBase> >("PostSmoother", s.get());
// This code would call DeclareInput in request mode twice, but as the Build method generates both Pre and Post
// smoothers, it would call DelcareInput in release mode only once, leaving requests.
// This code has another problem if s2 = Teuchos::null. In that case, despite the request for PostSmoother, the factory
// would not generate one, and second Get would throw. The real issue here is that given a Factory pointer
// there is no way to be sure that this factory would generate any of "PreSmoother" or "PostSmoother", unless you are
// able to cast it to SmootherFactory, do GetPrototypes and to check whether any of those is Teuchos::null.
const Teuchos::ParameterList& pL = GetParameterList();
RCP<SmootherPrototype> preSmoother, postSmoother;
ParameterList preSmootherParams, postSmootherParams;
if ((preOrPost & PRE) && !preSmootherPrototype_.is_null()) {
if (currentLevel.IsAvailable("PreSmoother data", this))
preSmoother = currentLevel.Get<RCP<SmootherPrototype> >("PreSmoother data", this);
else
preSmoother = preSmootherPrototype_->Copy();
int oldRank = -1;
if (!currentLevel.GetComm().is_null())
oldRank = preSmoother->SetProcRankVerbose(currentLevel.GetComm()->getRank());
preSmoother->Setup(currentLevel);
preSmootherParams = preSmoother->GetParameterList();
if (oldRank != -1)
preSmoother->SetProcRankVerbose(oldRank);
currentLevel.Set<RCP<SmootherBase> >("PreSmoother", preSmoother, this);
if (pL.get<bool>("keep smoother data"))
Set(currentLevel, "PreSmoother data", preSmoother);
}
if ((preOrPost & POST) && !postSmootherPrototype_.is_null()) {
if (preOrPost == BOTH && preSmootherPrototype_ == postSmootherPrototype_) {
// Simple reuse
// Same prototypes for pre- and post-smoothers mean that we only need to call Setup only once
postSmoother = preSmoother;
// else if (preOrPost == BOTH &&
// preSmootherPrototype_ != Teuchos::null &&
// preSmootherPrototype_->GetType() == postSmootherPrototype_->GetType()) {
// // More complex reuse case: need implementation of CopyParameters() and a smoothers smart enough to know when parameters affect the setup phase.
// // YES: post-smoother == pre-smoother
// // => copy the pre-smoother to avoid the setup phase of the post-smoother.
// postSmoother = preSmoother->Copy();
// // If the post-smoother parameters are different from
// // pre-smoother, the parameters stored in the post-smoother
// // prototype are copied in the new post-smoother object.
// postSmoother->CopyParameters(postSmootherPrototype_);
// // If parameters don't influence the Setup phase (it is the case
// // for Jacobi, Chebyshev...), PostSmoother is already setup. Nothing
// // more to do. In the case of ILU, parameters of the smoother
// // are in fact the parameters of the Setup phase. The call to
// // CopyParameters resets the smoother (only if parameters are
// // different) and we must call Setup() again.
// postSmoother->Setup(currentLevel);
// }
// // TODO: if CopyParameters do not exist, do setup twice.
} else {
if (currentLevel.IsAvailable("PostSmoother data", this)) {
postSmoother = currentLevel.Get<RCP<SmootherPrototype> >("PostSmoother data", this);
} else {
// No reuse:
// - either we only do postsmoothing without any presmoothing
// - or our postsmoother is different from presmoother
postSmoother = postSmootherPrototype_->Copy();
}
int oldRank = -1;
if (!currentLevel.GetComm().is_null())
oldRank = postSmoother->SetProcRankVerbose(GetProcRankVerbose());
postSmoother->Setup(currentLevel);
postSmootherParams = postSmoother->GetParameterList();
if (oldRank != -1)
postSmoother->SetProcRankVerbose(oldRank);
}
//.........这里部分代码省略.........