void ReorderFilter<MatrixType>::permuteReorderedToOriginalTempl(const Tpetra::MultiVector<DomainScalar,LocalOrdinal,GlobalOrdinal,Node> &reorderedX, Tpetra::MultiVector<RangeScalar,LocalOrdinal,GlobalOrdinal,Node> &originalY) const { TEUCHOS_TEST_FOR_EXCEPTION(reorderedX.getNumVectors() != originalY.getNumVectors(), std::runtime_error, "Ifpack2::ReorderFilter::permuteReorderedToOriginal ERROR: X.getNumVectors() != Y.getNumVectors()."); Teuchos::ArrayRCP<Teuchos::ArrayRCP<const DomainScalar> > x_ptr = reorderedX.get2dView(); Teuchos::ArrayRCP<Teuchos::ArrayRCP<RangeScalar> > y_ptr = originalY.get2dViewNonConst(); for(size_t k=0; k < reorderedX.getNumVectors(); k++) for(LocalOrdinal i=0; (size_t)i< reorderedX.getLocalLength(); i++) y_ptr[k][reverseperm_[i]] = (RangeScalar)x_ptr[k][i]; }
void ReorderFilter<MatrixType>::permuteOriginalToReorderedTempl(const Tpetra::MultiVector<DomainScalar,local_ordinal_type,global_ordinal_type,node_type> &originalX, Tpetra::MultiVector<RangeScalar,local_ordinal_type,global_ordinal_type,node_type> &reorderedY) const { TEUCHOS_TEST_FOR_EXCEPTION(originalX.getNumVectors() != reorderedY.getNumVectors(), std::runtime_error, "Ifpack2::ReorderFilter::permuteOriginalToReordered ERROR: X.getNumVectors() != Y.getNumVectors()."); Teuchos::ArrayRCP<Teuchos::ArrayRCP<const DomainScalar> > x_ptr = originalX.get2dView(); Teuchos::ArrayRCP<Teuchos::ArrayRCP<RangeScalar> > y_ptr = reorderedY.get2dViewNonConst(); for(size_t k=0; k < originalX.getNumVectors(); k++) for(local_ordinal_type i=0; (size_t)i< originalX.getLocalLength(); i++) y_ptr[k][perm_[i]] = (RangeScalar)x_ptr[k][i]; }
void SparseContainer<MatrixType,InverseType>:: applyImpl (const Tpetra::MultiVector<InverseScalar,InverseLocalOrdinal,InverseGlobalOrdinal,InverseNode>& X, Tpetra::MultiVector<InverseScalar,InverseLocalOrdinal,InverseGlobalOrdinal,InverseNode>& Y, Teuchos::ETransp mode, InverseScalar alpha, InverseScalar beta) const { TEUCHOS_TEST_FOR_EXCEPTION( Inverse_->getDomainMap ()->getNodeNumElements () != X.getLocalLength (), std::logic_error, "Ifpack2::SparseContainer::apply: Inverse_ " "operator and X have incompatible dimensions (" << Inverse_->getDomainMap ()->getNodeNumElements () << " resp. " << X.getLocalLength () << "). Please report this bug to " "the Ifpack2 developers."); TEUCHOS_TEST_FOR_EXCEPTION( Inverse_->getRangeMap ()->getNodeNumElements () != Y.getLocalLength (), std::logic_error, "Ifpack2::SparseContainer::apply: Inverse_ " "operator and Y have incompatible dimensions (" << Inverse_->getRangeMap ()->getNodeNumElements () << " resp. " << Y.getLocalLength () << "). Please report this bug to " "the Ifpack2 developers."); Inverse_->apply (X, Y, mode, alpha, beta); }
size_t findUniqueGids( Tpetra::MultiVector<gno_t, lno_t, gno_t> &keys, Tpetra::Vector<gno_t, lno_t, gno_t> &gids ) { // Input: Tpetra MultiVector of keys; key length = numVectors() // May contain duplicate keys within a processor. // May contain duplicate keys across processors. // Input: Empty Tpetra Vector with same map for holding the results // Output: Filled gids vector, containing unique global numbers for // each unique key. Global numbers are in range [0,#UniqueKeys). size_t num_keys = keys.getLocalLength(); size_t num_entries = keys.getNumVectors(); #ifdef HAVE_ZOLTAN2_MPI MPI_Comm mpicomm = Teuchos::getRawMpiComm(*(keys.getMap()->getComm())); #else // Zoltan's siMPI will be used here { int flag; MPI_Initialized(&flag); if (!flag) { int narg = 0; char **argv = NULL; MPI_Init(&narg, &argv); } } MPI_Comm mpicomm = MPI_COMM_WORLD; // Will get MPI_COMM_WORLD from siMPI #endif int num_gid = sizeof(gno_t)/sizeof(ZOLTAN_ID_TYPE) * num_entries; int num_user = sizeof(gno_t); // Buffer the keys for Zoltan_DD Teuchos::ArrayRCP<const gno_t> *tmpKeyVecs = new Teuchos::ArrayRCP<const gno_t>[num_entries]; for (size_t v = 0; v < num_entries; v++) tmpKeyVecs[v] = keys.getData(v); ZOLTAN_ID_PTR ddkeys = new ZOLTAN_ID_TYPE[num_gid * num_keys]; size_t idx = 0; for (size_t i = 0; i < num_keys; i++) { for (size_t v = 0; v < num_entries; v++) { ZOLTAN_ID_PTR ddkey = &(ddkeys[idx]); TPL_Traits<ZOLTAN_ID_PTR,gno_t>::ASSIGN(ddkey, tmpKeyVecs[v][i]); idx += TPL_Traits<ZOLTAN_ID_PTR,gno_t>::NUM_ID; } } delete [] tmpKeyVecs; // Allocate memory for the result char *ddnewgids = new char[num_user * num_keys]; // Compute the new GIDs size_t nUnique = findUniqueGidsCommon<gno_t>(num_keys, num_gid, ddkeys, ddnewgids, mpicomm); // Copy the result into the output vector gno_t *result = (gno_t *)ddnewgids; for (size_t i = 0; i < num_keys; i++) gids.replaceLocalValue(i, result[i]); // Clean up delete [] ddkeys; delete [] ddnewgids; return nUnique; }