34 const size_t NSDim = Bc.getNumVectors();
38 size_t numRows =
Ppattern_->getLocalNumRows();
41 RCP<const Import> importer =
Ppattern_->getImporter();
43 X_ = MultiVectorFactory::Build(
Ppattern_->getColMap(), NSDim);
44 if (!importer.is_null())
45 X_->doImport(Bc, *importer, Xpetra::INSERT);
49 std::vector<const SC*> Xval(NSDim);
50 for (
size_t j = 0; j < NSDim; j++)
51 Xval[j] =
X_->getData(j).get();
53 SC zero = Teuchos::ScalarTraits<SC>::zero();
54 SC one = Teuchos::ScalarTraits<SC>::one();
56 Teuchos::BLAS<LO, SC> blas;
57 Teuchos::LAPACK<LO, SC> lapack;
59 ArrayRCP<LO> IPIV(NSDim);
60 ArrayRCP<SC> WORK(lwork);
62 for (
size_t i = 0; i < numRows; i++) {
63 Teuchos::ArrayView<const LO> indices;
66 size_t nnz = indices.size();
68 XXtInv_[i] = Teuchos::SerialDenseMatrix<LO, SC>(NSDim, NSDim,
false );
69 Teuchos::SerialDenseMatrix<LO, SC>& XXtInv =
XXtInv_[i];
73 for (
size_t j = 0; j < nnz; j++)
74 d += Xval[0][indices[j]] * Xval[0][indices[j]];
75 XXtInv(0, 0) = one / d;
78 Teuchos::SerialDenseMatrix<LO, SC> locX(NSDim, nnz,
false );
79 for (
size_t j = 0; j < nnz; j++)
80 for (
size_t k = 0; k < NSDim; k++)
81 locX(k, j) = Xval[k][indices[j]];
84 blas.GEMM(Teuchos::NO_TRANS, Teuchos::CONJ_TRANS, NSDim, NSDim, nnz,
85 one, locX.values(), locX.stride(),
86 locX.values(), locX.stride(),
87 zero, XXtInv.values(), XXtInv.stride());
91 lapack.GETRF(NSDim, NSDim, XXtInv.values(), XXtInv.stride(), IPIV.get(), &info);
93 lapack.GETRI(NSDim, XXtInv.values(), XXtInv.stride(), IPIV.get(), WORK.get(), lwork, &info);
103 "Row maps are incompatible");
104 const size_t NSDim =
X_->getNumVectors();
105 const size_t numRows = P.getLocalNumRows();
107 const Map& colMap = *P.getColMap();
108 const Map& PColMap = *Projected.getColMap();
110 Projected.resumeFill();
112 Teuchos::ArrayView<const LO> indices, pindices;
113 Teuchos::ArrayView<const SC> values, pvalues;
114 Teuchos::Array<SC> valuesAll(colMap.getLocalNumElements()), newValues;
116 LO invalid = Teuchos::OrdinalTraits<LO>::invalid();
117 LO oneLO = Teuchos::OrdinalTraits<LO>::one();
118 SC zero = Teuchos::ScalarTraits<SC>::zero();
119 SC one = Teuchos::ScalarTraits<SC>::one();
121 std::vector<const SC*> Xval(NSDim);
122 for (
size_t j = 0; j < NSDim; j++)
123 Xval[j] =
X_->getData(j).get();
125 for (
size_t i = 0; i < numRows; i++) {
126 P.getLocalRowView(i, indices, values);
127 Projected.getLocalRowView(i, pindices, pvalues);
129 size_t nnz = indices.size();
130 size_t pnnz = pindices.size();
132 newValues.resize(pnnz);
142 for (
size_t j = 0; j < nnz; j++)
143 valuesAll[indices[j]] = values[j];
144 for (
size_t j = 0; j < pnnz; j++) {
145 LO ind = colMap.getLocalElement(PColMap.getGlobalElement(pindices[j]));
148 newValues[j] = valuesAll[ind];
152 for (
size_t j = 0; j < nnz; j++)
153 valuesAll[indices[j]] = zero;
156 Teuchos::SerialDenseMatrix<LO, SC>& XXtInv =
XXtInv_[i];
158 Teuchos::SerialDenseMatrix<LO, SC> locX(NSDim, pnnz,
false);
159 for (
size_t j = 0; j < pnnz; j++)
160 for (
size_t k = 0; k < NSDim; k++)
161 locX(k, j) = Xval[k][pindices[j]];
163 Teuchos::SerialDenseVector<LO, SC> val(pnnz,
false), val1(NSDim,
false), val2(NSDim,
false);
164 for (
size_t j = 0; j < pnnz; j++)
165 val[j] = newValues[j];
167 Teuchos::BLAS<LO, SC> blas;
169 blas.GEMV(Teuchos::NO_TRANS, NSDim, pnnz,
170 one, locX.values(), locX.stride(),
172 zero, val1.values(), oneLO);
174 blas.GEMV(Teuchos::NO_TRANS, NSDim, NSDim,
175 one, XXtInv.values(), XXtInv.stride(),
176 val1.values(), oneLO,
177 zero, val2.values(), oneLO);
179 blas.GEMV(Teuchos::CONJ_TRANS, NSDim, pnnz,
180 one, locX.values(), locX.stride(),
181 val2.values(), oneLO,
182 zero, val.values(), oneLO);
184 for (
size_t j = 0; j < pnnz; j++)
185 newValues[j] -= val[j];
187 Projected.replaceLocalValues(i, pindices, newValues);
190 Projected.fillComplete(Projected.getDomainMap(), Projected.getRangeMap());