47 #ifndef MUELU_DROPNEGATIVEENTRIESFACTORY_DEF_HPP 48 #define MUELU_DROPNEGATIVEENTRIESFACTORY_DEF_HPP 50 #include <Xpetra_CrsGraph.hpp> 51 #include <Xpetra_Matrix.hpp> 52 #include <Xpetra_Vector.hpp> 53 #include <Xpetra_Import.hpp> 54 #include <Xpetra_MatrixFactory.hpp> 55 #include <Xpetra_VectorFactory.hpp> 56 #include <Xpetra_ImportFactory.hpp> 57 #include <Xpetra_CrsGraphFactory.hpp> 61 #include "MueLu_FactoryManager.hpp" 64 #include "MueLu_Graph.hpp" 69 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 RCP<ParameterList> validParamList = rcp(
new ParameterList());
73 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name)) 74 #undef SET_VALID_ENTRY 76 validParamList->set< RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory of the matrix A used for filtering");
78 return validParamList;
81 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
83 Input(currentLevel,
"A");
86 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
88 FactoryMonitor m(*
this,
"Matrix filtering (springs)", currentLevel);
90 RCP<Matrix> Ain = Get< RCP<Matrix> >(currentLevel,
"A");
92 LocalOrdinal nDofsPerNode = Ain->GetFixedBlockSize();
95 Teuchos::RCP<Matrix> Aout = MatrixFactory::Build(Ain->getRowMap(), Ain->getGlobalMaxNumRowEntries(), Xpetra::StaticProfile);
97 size_t numLocalRows = Ain->getNodeNumRows();
98 for(
size_t row=0; row<numLocalRows; row++) {
99 GlobalOrdinal grid = Ain->getRowMap()->getGlobalElement(row);
101 int rDofID = Teuchos::as<int>(grid % nDofsPerNode);
104 Teuchos::ArrayView<const LocalOrdinal> indices;
105 Teuchos::ArrayView<const Scalar> vals;
106 Ain->getLocalRowView(row, indices, vals);
109 Teuchos::ArrayRCP<GlobalOrdinal> indout(indices.size(),Teuchos::ScalarTraits<GlobalOrdinal>::zero());
110 Teuchos::ArrayRCP<Scalar> valout(indices.size(),Teuchos::ScalarTraits<Scalar>::zero());
112 size_t nNonzeros = 0;
113 for(
size_t i=0; i<(size_t)indices.size(); i++) {
114 GlobalOrdinal gcid = Ain->getColMap()->getGlobalElement(indices[i]);
116 int cDofID = Teuchos::as<int>(gcid % nDofsPerNode);
117 if(rDofID == cDofID && Teuchos::ScalarTraits<Scalar>::magnitude(vals[i]) >= Teuchos::ScalarTraits<Scalar>::magnitude(Teuchos::ScalarTraits<Scalar>::zero())) {
118 indout [nNonzeros] = gcid;
119 valout [nNonzeros] = vals[i];
123 indout.resize(nNonzeros);
124 valout.resize(nNonzeros);
126 Aout->insertGlobalValues(Ain->getRowMap()->getGlobalElement(row), indout.view(0,indout.size()), valout.view(0,valout.size()));
129 Aout->fillComplete(Ain->getDomainMap(), Ain->getRangeMap());
132 Aout->SetFixedBlockSize(nDofsPerNode);
134 GetOStream(
Statistics0, 0) <<
"Nonzeros in A (input): " << Ain->getGlobalNumEntries() <<
", Nonzeros after filtering A: " << Aout->getGlobalNumEntries() << std::endl;
136 Set(currentLevel,
"A", Aout);
141 #endif // MUELU_DROPNEGATIVEENTRIESFACTORY_DEF_HPP Timer to be used in factories. Similar to Monitor but with additional timers.
Namespace for MueLu classes and methods.
Print statistics that do not involve significant additional computation.
Class that holds all level-specific information.
void DeclareInput(Level ¤tLevel) const
Input.
void Build(Level ¤tLevel) const
Build method.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.