void ZoltanInterface<LocalOrdinal, GlobalOrdinal, Node, LocalMatOps>:: GetProblemGeometry(void *data, int numGIDEntries, int numLIDEntries, int numObjectIDs, ZOLTAN_ID_PTR gids, ZOLTAN_ID_PTR lids, int dim, double *coordinates, int *ierr) { if (data == NULL) { *ierr = ZOLTAN_FATAL; return; } MultiVector *Coords = (MultiVector*) data; if (dim != Teuchos::as<int>(Coords->getNumVectors())) { //FIXME I'm assuming dim should be 1, 2, or 3 coming in?! *ierr = ZOLTAN_FATAL; return; } TEUCHOS_TEST_FOR_EXCEPTION(numObjectIDs != Teuchos::as<int>(Coords->getLocalLength()), Exceptions::Incompatible, "Length of coordinates must be the same as the number of objects"); ArrayRCP<ArrayRCP<const SC> > CoordsData(dim); for (int j = 0; j < dim; ++j) CoordsData[j] = Coords->getData(j); size_t numElements = Coords->getLocalLength(); for (size_t i = 0; i < numElements; ++i) for (int j = 0; j < dim; ++j) coordinates[i*dim+j] = (double) CoordsData[j][i]; *ierr = ZOLTAN_OK; } //GetProblemGeometry
void Amesos2Smoother<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Apply(MultiVector& X, const MultiVector& B, bool InitialGuessIsZero) const { TEUCHOS_TEST_FOR_EXCEPTION(SmootherPrototype::IsSetup() == false, Exceptions::RuntimeError, "MueLu::Amesos2Smoother::Apply(): Setup() has not been called"); RCP<Tpetra_MultiVector> tX, tB; if (!useTransformation_) { tX = Utilities::MV2NonConstTpetraMV2(X); tB = Utilities::MV2NonConstTpetraMV2(const_cast<MultiVector&>(B)); } else { // Copy data of the original vectors into the transformed ones size_t numVectors = X.getNumVectors(); size_t length = X.getLocalLength(); TEUCHOS_TEST_FOR_EXCEPTION(numVectors > 1, Exceptions::RuntimeError, "MueLu::Amesos2Smoother::Apply: Fixing coarse matrix for Amesos2 for multivectors has not been implemented yet."); ArrayRCP<const SC> Xdata = X. getData(0), Bdata = B. getData(0); ArrayRCP<SC> X_data = X_->getDataNonConst(0), B_data = B_->getDataNonConst(0); for (size_t i = 0; i < length; i++) { X_data[i] = Xdata[i]; B_data[i] = Bdata[i]; } tX = Utilities::MV2NonConstTpetraMV2(*X_); tB = Utilities::MV2NonConstTpetraMV2(*B_); } prec_->setX(tX); prec_->setB(tB); prec_->solve(); prec_->setX(Teuchos::null); prec_->setB(Teuchos::null); if (useTransformation_) { // Copy data from the transformed vectors into the original ones size_t length = X.getLocalLength(); ArrayRCP<SC> Xdata = X. getDataNonConst(0); ArrayRCP<const SC> X_data = X_->getData(0); for (size_t i = 0; i < length; i++) Xdata[i] = X_data[i]; } }