25 RCP<ParameterList> validParamList = rcp(
new ParameterList());
27#define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
29 validParamList->getEntry(
"emin: constraint type").setValidator(rcp(
new Teuchos::StringValidator(Teuchos::tuple<std::string>(
"nullspace",
"maxwell"))));
32 validParamList->getEntry(
"emin: least squares solver type").setValidator(rcp(
new Teuchos::StringValidator(Teuchos::tuple<std::string>(
"Belos",
"direct"))));
35 validParamList->set<RCP<const FactoryBase>>(
"FineNullspace", Teuchos::null,
"Generating factory for the nullspace");
36 validParamList->set<RCP<const FactoryBase>>(
"CoarseNullspace", Teuchos::null,
"Generating factory for the nullspace");
37 validParamList->set<RCP<const FactoryBase>>(
"FineD0", Teuchos::null,
"Generating factory for the fine discrete gradient");
38 validParamList->set<RCP<const FactoryBase>>(
"CoarseD0", Teuchos::null,
"Generating factory for the coarse discrete gradient");
39 validParamList->set<RCP<const FactoryBase>>(
"Ppattern", Teuchos::null,
"Generating factory for the nonzero pattern");
40 validParamList->set<RCP<const FactoryBase>>(
"PnodalEmin", Teuchos::null,
"Generating factory for nodal P");
42 return validParamList;
63 auto Ppattern = Get<RCP<const CrsGraph>>(coarseLevel,
"Ppattern");
64 RCP<Constraint> constraint;
65 const ParameterList& pL = GetParameterList();
67 std::string solverType = pL.get<std::string>(
"emin: least squares solver type");
69 if (pL.get<std::string>(
"emin: constraint type") ==
"nullspace") {
70 RCP<MultiVector> fineNullspace = Get<RCP<MultiVector>>(fineLevel,
"Nullspace",
"FineNullspace");
71 RCP<MultiVector> coarseNullspace = Get<RCP<MultiVector>>(coarseLevel,
"Nullspace",
"CoarseNullspace");
74 constraint = rcp(
new DenseConstraint(fineNullspace, coarseNullspace, Ppattern, solverType));
77 RCP<Matrix> fineD0 = Get<RCP<Matrix>>(fineLevel,
"D0",
"FineD0");
78 RCP<Matrix> coarseD0 = Get<RCP<Matrix>>(coarseLevel,
"D0",
"CoarseD0");
79 RCP<Matrix> Pnodal = Get<RCP<Matrix>>(coarseLevel,
"PnodalEmin",
"PnodalEmin");
80 RCP<SparseConstraint> sparse_constraint;
83 sparse_constraint = rcp(
new SparseConstraint(Pnodal, fineD0, coarseD0, Ppattern, solverType));
90 auto X = sparse_constraint->GetConstraintMatrix();
91 auto vecPProjected = MultiVectorFactory::Build(sparse_constraint->getDomainMap(), 1);
92 auto temp = MultiVectorFactory::Build(X->getRangeMap(), 1);
93 auto rhs = MultiVectorFactory::Build(X->getRangeMap(), 1);
104 RCP<Matrix> fineD0_Pnodal;
105 fineD0_Pnodal = MatrixMatrix::Multiply(*fineD0,
false, *Pnodal,
false, fineD0_Pnodal, GetOStream(
Runtime0),
true,
true);
106 sparse_constraint->AssignMatrixEntriesToConstraintVector(*fineD0_Pnodal, *rhs);
110 sparse_constraint->LeastSquaresSolve(*rhs, *temp);
111 X->apply(*temp, *vecPProjected, Teuchos::TRANS);
113 auto P0 = sparse_constraint->GetMatrixWithEntriesFromVector(*vecPProjected);
115 Set(coarseLevel,
"P", P0);
116 constraint = sparse_constraint;
119 Set(coarseLevel,
"Constraint", constraint);