void dft_PolyA11_Tpetra_Operator<Scalar,MatrixType>:: Check (bool verbose) const { RCP<VEC > x = rcp(new VEC(getDomainMap())); RCP<VEC > b = rcp(new VEC(getRangeMap())); x->randomize(); // Fill x with random numbers apply(*x, *b); // Forward operation applyInverse(*b, *b); // Reverse operation b->update(-STS::one(), *x, STS::one()); // Should be zero Scalar absResid = b->norm2(); Scalar normX = x->norm2(); Scalar resid = absResid / normX; if (verbose) { std::cout << "A11 self-check residual = " << resid << std::endl; } TEUCHOS_TEST_FOR_EXCEPTION(resid > 1.0E-12, std::runtime_error, "Bad residual.\n"); } //end Check
void InputRange::getRangeVector(WirelessModels::NodeModel nodeType, WirelessTypes::ChannelType channelType, WirelessTypes::InputRanges& result) { const auto& rangeMap = getRangeMap(nodeType, channelType); for(auto& range : rangeMap) { result.push_back(range.second); } }
static void run_performance_test (const Input& in) { typedef LO Int; typedef tif_utest::BlockCrsMatrixMaker<Scalar, LO, GO> bcmm; typedef tif_utest::BlockTriDiContainerTester<Scalar, LO, GO> btdct; // Performance test. Use BlockTriDiContainer directly. typename bcmm::StructuredBlock sb(in.ni, in.nj, in.nk, in.contiguous); typename bcmm::StructuredBlockPart sbp = bcmm::make_StructuredBlockPart(sb, in.isplit, in.jsplit, in.comm->getRank()); auto g = bcmm::make_crs_graph(in.comm, sb, sbp); auto A = bcmm::make_bcrs_matrix(sb, g, in.bs); const auto T = btdct::make_BTDC(sb, sbp, A, in.use_overlap_comm, in.nonuniform_lines, in.jacobi, in.use_seq_method); const auto X = bcmm::make_multivector(sb, A, in.bs, in.nrhs); const auto B = Teuchos::rcp(new typename bcmm::Tpetra_MultiVector(A->getRangeMap(), in.nrhs)); A->apply(*X, *B); const auto X_solve = Teuchos::rcp(new typename bcmm::Tpetra_MultiVector(A->getDomainMap(), in.nrhs)); Teuchos::TimeMonitor::zeroOutTimers(); T->initialize(); auto input = T->createDefaultApplyParameters(); input.zeroStartingSolution = true; input.maxNumSweeps = in.iterations; input.tolerance = in.tol; input.checkToleranceEvery = in.check_tol_every; int sweep = 0; { TEUCHOS_FUNC_TIME_MONITOR("Performance test"); for (Int repeat = 0; repeat < in.repeat; ++repeat) { T->compute(); sweep = T->applyInverseJacobi(*B, *X_solve, input); } } const auto rd = bcmm::reldif(*X, *X_solve); if (in.verbose && in.comm->getRank() == 0) std::cout << "Performance test rd = " << rd << "\n"; if (in.comm->getRank() == 0) { const auto n0 = T->getNorms0(); const auto nf = T->getNormsFinal(); bool ok = true; if (n0.size() > 0) { std::stringstream ss; ss << "Norm reduction:"; for (int i = 0; i < n0.size(); ++i) { const auto r = nf[i] / n0[i]; ss << " " << r; if (r > in.tol && sweep != in.iterations) ok = false; } ss << "\n"; if (in.verbose) std::cout << ss.str(); if ( ! ok) std::cout << "FAIL: norm-based termination\n"; } } Teuchos::TimeMonitor::summarize(); }
void dft_PolyA22_Tpetra_Operator<Scalar,MatrixType>:: Check (bool verbose) const { RCP<VEC > x = rcp(new VEC(getDomainMap())); RCP<VEC > b = rcp(new VEC(getRangeMap())); x->randomize(); // Fill x with random numbers apply(*x, *b); // Forward operation if (hasDensityOnCms_) { if (F_location_ == 1) //F in NE { // Inverse is not exact, so we must modify b2 first: RCP<MV> x1 = x->offsetViewNonConst(cmsMap_, 0); // Start x1 to view first numCmsElements elements of x RCP<MV> b2 = b->offsetViewNonConst(densityMap_, cmsMap_->getNodeNumElements()); // Start b2 to view last numDensity elements of b RCP<MV > DCx1 = rcp(new MV(*b2)); densityOnCmsMatrixOp_->apply(*x1, *DCx1); b2->update(-STS::one(), *DCx1, STS::one()); // b2 = b2 - DC*x1 } else { // Inverse is not exact, so we must modify b1 first: RCP<MV> x2 = x->offsetViewNonConst(cmsMap_, densityMap_->getNodeNumElements()); //Start x2 to view last numCms elements of x RCP<MV> b1 = b->offsetViewNonConst(densityMap_, 0); // Start b1 to view first numDensity elements of b RCP<MV > DCx2 = rcp(new MV(*b1)); densityOnCmsMatrixOp_->apply(*x2, *DCx2); b1->update(-STS::one(), *DCx2, STS::one()); // b1 = b1 - DC*x2 } } // Reverse operation applyInverse(*b, *b); b->update(-STS::one(), *x, STS::one()); // Should be zero Scalar resid = b->norm2(); if (verbose) { std::cout << "A22 self-check residual = " << resid << std::endl; } TEUCHOS_TEST_FOR_EXCEPTION(resid > 1.0E-12, std::runtime_error, "Bad residual.\n"); } //end Check
WirelessTypes::InputRange InputRange::eepromValToInputRange(uint16 eepromValue, WirelessModels::NodeModel nodeType, WirelessTypes::ChannelType channelType) { const InputRangeMap& ranges = getRangeMap(nodeType, channelType); try { return ranges.at(eepromValue); } catch(std::out_of_range&) { return WirelessTypes::range_invalid; } }
uint16 InputRange::inputRangeToEepromVal(WirelessTypes::InputRange range, WirelessModels::NodeModel nodeType, WirelessTypes::ChannelType channelType) { const InputRangeMap& ranges = getRangeMap(nodeType, channelType); for(auto& r : ranges) { if(r.second == range) { return r.first; } } throw Error_NotSupported("Invalid Input Range Value"); }
//TODO : Get ride of "Tpetra"::OptimizeOption void fillComplete(const RCP<ParameterList> ¶ms=null) { for (size_t r=0; r<Rows(); ++r) { for (size_t c=0; c<Cols(); ++c) { if(getMatrix(r,c)->isFillComplete() == false) getMatrix(r,c)->fillComplete(getDomainMap(c),getRangeMap(r),params); } } // get full row map //fullrowmap_ = Xpetra::MapFactory<LocalOrdinal,GlobalOrdinal,Node>::Build(rangemaps_->getFullMap()->lib(), rangemaps_->getFullMap()->getNodeNumElements(), rangemaps_->getFullMap()->getNodeElementList(), rangemaps_->getFullMap()->getIndexBase(), rangemaps_->getFullMap()->getComm());//rangemaps_->FullMap(); //->Clone(); fullrowmap_ = Xpetra::MapFactory<LocalOrdinal,GlobalOrdinal,Node>::Build(rangemaps_->getFullMap()->lib(), rangemaps_->getFullMap()->getGlobalNumElements(), rangemaps_->getFullMap()->getNodeElementList(), rangemaps_->getFullMap()->getIndexBase(), rangemaps_->getFullMap()->getComm());//rangemaps_->FullMap(); //->Clone(); // TODO: check me, clean up, use only ArrayView instead of std::vector // build full col map fullcolmap_ = Teuchos::null; // delete old full column map if (fullcolmap_ == Teuchos::null) { std::vector<GlobalOrdinal> colmapentries; for (size_t c=0; c<Cols(); ++c) { std::set<GlobalOrdinal> colset; for (size_t r=0; r<Rows(); ++r) { if(getMatrix(r,c) != Teuchos::null) { Teuchos::RCP<const Map> colmap = getMatrix(r,c)->getColMap(); copy(colmap->getNodeElementList().getRawPtr(), colmap->getNodeElementList().getRawPtr()+colmap->getNodeNumElements(), inserter(colset,colset.begin())); } } colmapentries.reserve(colmapentries.size()+colset.size()); copy(colset.begin(), colset.end(), back_inserter(colmapentries)); sort(colmapentries.begin(), colmapentries.end()); typename std::vector<GlobalOrdinal>::iterator gendLocation; gendLocation = std::unique(colmapentries.begin(), colmapentries.end()); colmapentries.erase(gendLocation,colmapentries.end()); } // sum up number of local elements size_t numGlobalElements = 0; sumAll(rangemaps_->getFullMap()->getComm(), colmapentries.size(), numGlobalElements) const Teuchos::ArrayView<const GlobalOrdinal> aView = Teuchos::ArrayView<const GlobalOrdinal>(colmapentries); fullcolmap_ = Xpetra::MapFactory<LocalOrdinal,GlobalOrdinal,Node>::Build(rangemaps_->getFullMap()->lib(), numGlobalElements, aView, 0,rangemaps_->getFullMap()->getComm()); //fullcolmap_ = Xpetra::MapFactory<LocalOrdinal,GlobalOrdinal,Node>::Build(rangemaps_->getFullMap()->lib(), domainmaps_->getFullMap()->getGlobalNumElements(), aView, 0,domainmaps_->getFullMap()->getComm()); }
void dft_HardSphereA22_Tpetra_Operator<Scalar,MatrixType>:: formA22Matrix () { if (A22Matrix_ == Teuchos::null) { A22Matrix_ = rcp(new MAT(getRangeMap(), 1)); A22Matrix_->setObjectLabel("HardSphereA22::A22Matrix"); } LocalOrdinal numRows = getRangeMap()->getNodeNumElements(); Teuchos::ArrayRCP<const Scalar> vectorValues = densityOnDensityMatrix_->get1dView(); for (LocalOrdinal i=OTLO::zero(); i<numRows; i++) { GlobalOrdinal row = A22Matrix_->getRowMap()->getGlobalElement(i); Scalar value = vectorValues[i]; GlobalOrdinal col = row; Array<GlobalOrdinal> cols(1); Array<MatScalar> vals(1); cols[0] = col; vals[0] = Teuchos::as<MatScalar>(value); A22Matrix_->insertGlobalValues(row, cols, vals); } A22Matrix_->fillComplete(); }
void dft_HardSphereA22_Tpetra_Operator<Scalar,MatrixType>:: apply (const MV& X, MV& Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta) const { TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); #endif Y.elementWiseMultiply(STS::one(), *densityOnDensityMatrix_, X, STS::zero()); }
void dft_HardSphereA22_Tpetra_Operator<Scalar,MatrixType>:: applyInverse (const MV& X, MV& Y) const { // Our algorithm is: // Y = D \ X TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); #endif Y.elementWiseMultiply(STS::one(), *densityOnDensityInverse_, X, STS::zero()); }
void dft_PolyA11_Tpetra_Operator<Scalar,MatrixType>:: applyInverse (const MV& X, MV& Y) const { TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); printf("\n\n\n\ndft_PolyA11_Tpetra_Operator::applyInverse()\n\n\n\n"); #endif Scalar ONE = STS::one(); Scalar ZERO = STS::zero(); size_t NumVectors = Y.getNumVectors(); size_t numMyElements = ownedMap_->getNodeNumElements(); RCP<MV > Ytmp = rcp(new MV(ownedMap_,NumVectors)); Y=X; // We can safely do this RCP<MV > curY = Y.offsetViewNonConst(ownedMap_, 0); RCP<VEC> diagVec = invDiagonal_->offsetViewNonConst(ownedMap_, 0)->getVectorNonConst(0); curY->elementWiseMultiply(ONE, *diagVec, *curY, ZERO); // Scale Y by the first block diagonal // Loop over block 1 through numBlocks (indexing 0 to numBlocks-1) for (LocalOrdinal i=OTLO::zero(); i< numBlocks_-1; i++) { // Update views of Y and diagonal blocks curY = Y.offsetViewNonConst(ownedMap_, (i+1)*numMyElements); diagVec = invDiagonal_->offsetViewNonConst(ownedMap_, (i+1)*numMyElements)->getVectorNonConst(0); matrixOperator_[i]->apply(Y, *Ytmp); // Multiply block lower triangular block curY->update(-ONE, *Ytmp, ONE); // curY = curX - Ytmp (Note that curX is in curY from initial copy Y = X) curY->elementWiseMultiply(ONE, *diagVec, *curY, ZERO); // Scale Y by the first block diagonal } } //end applyInverse
// Returns explicit matrix representation of operator if available. Teuchos::RCP<Tpetra_CrsMatrix> LCM:: Schwarz_BoundaryJacobian:: getExplicitOperator() const { auto const max_num_cols = getDomainMap()->getNodeNumElements(); Teuchos::RCP<Tpetra_CrsMatrix> K = Teuchos::rcp( new Tpetra_CrsMatrix(getRangeMap(), getDomainMap(), max_num_cols)); auto const zero = Teuchos::ScalarTraits<ST>::zero(); K->setAllToScalar(zero); K->fillComplete(); return K; }
void dft_PolyA11_Tpetra_Operator<Scalar,MatrixType>:: apply (const MV& X, MV& Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta) const { TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); #endif size_t numMyElements = ownedMap_->getNodeNumElements(); RCP<MV > curY = Y.offsetViewNonConst(ownedMap_, 0); for (LocalOrdinal i=OTLO::zero(); i< numBlocks_-1; i++) { curY = Y.offsetViewNonConst(ownedMap_, (i+1)*numMyElements); matrixOperator_[i]->apply(X, *curY); // This gives a result that is off-diagonal-matrix*X } Y.elementWiseMultiply(STS::one(),*diagonal_, X, STS::one()); // Add diagonal contribution } //end Apply
void dft_PolyA22_Tpetra_Operator<Scalar,MatrixType>:: apply (const MV& X, MV& Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta) const { TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); #endif Scalar ONE = STS::one(); Scalar ZERO = STS::zero(); if (F_location_ == 1) { //F in NE size_t numCmsElements = cmsMap_->getNodeNumElements(); // Y1 is a view of the first numCms elements of Y RCP<MV> Y1 = Y.offsetViewNonConst(cmsMap_, 0); // Y2 is a view of the last numDensity elements of Y RCP<MV> Y2 = Y.offsetViewNonConst(densityMap_, numCmsElements); // X1 is a view of the first numCms elements of X RCP<const MV> X1 = X.offsetView(cmsMap_, 0); // X2 is a view of the last numDensity elements of X RCP<const MV> X2 = X.offsetView(densityMap_, numCmsElements); // First block row cmsOnDensityMatrixOp_->apply(*X2, *Y1); cmsOnCmsMatrixOp_->apply(*X1, *tmpCmsVec_); Y1->update(ONE, *tmpCmsVec_, ONE); // Second block row if (hasDensityOnCms_) { densityOnCmsMatrixOp_->apply(*X1, *Y2); Y2->elementWiseMultiply(ONE, *densityOnDensityMatrix_, *X2, ONE); } else { Y2->elementWiseMultiply(ONE, *densityOnDensityMatrix_, *X2, ZERO); } } else { //F in SW size_t numDensityElements = densityMap_->getNodeNumElements(); // Y1 is a view of the first numDensity elements of Y RCP<MV> Y1 = Y.offsetViewNonConst(densityMap_, 0); // Y2 is a view of the last numCms elements of Y RCP<MV> Y2 = Y.offsetViewNonConst(cmsMap_, numDensityElements); // X1 is a view of the first numDensity elements of X RCP<const MV> X1 = X.offsetView(densityMap_, 0); // X2 is a view of the last numCms elements of X RCP<const MV> X2 = X.offsetView(cmsMap_, numDensityElements); // First block row if (hasDensityOnCms_) { densityOnCmsMatrixOp_->apply(*X2, *Y1); Y1->elementWiseMultiply(ONE, *densityOnDensityMatrix_, *X1, ONE); } else { Y1->elementWiseMultiply(ONE, *densityOnDensityMatrix_, *X1, ZERO); } // Second block row cmsOnDensityMatrixOp_->apply(*X1, *Y2); cmsOnCmsMatrixOp_->apply(*X2, *tmpCmsVec_); Y2->update(ONE, *tmpCmsVec_, ONE); } } //end Apply
void dft_PolyA22_Tpetra_Operator<Scalar,MatrixType>:: applyInverse (const MV& X, MV& Y) const { // The true A22 block is of the form: // | Dcc F | // | Ddc Ddd | // where // Dcc is Cms on Cms (diagonal), // F is Cms on Density (fairly dense) // Ddc is Density on Cms (diagonal with small coefficient values), // Ddd is Density on Density (diagonal). // // We will approximate A22 with: // | Dcc F | // | 0 Ddd | // replacing Ddc with a zero matrix for the applyInverse method only. // Our algorithm is then: // Y2 = Ddd \ X2 // Y1 = Dcc \ (X1 - F*Y2) // Or, if F is in the SW quadrant: // The true A22 block is of the form: // | Ddd Ddc | // | F Dcc | // where // Ddd is Density on Density (diagonal), // Ddc is Density on Cms (diagonal with small coefficient values), // F is Cms on Density (fairly dense), // Dcc is Cms on Cms (diagonal). // // We will approximate A22 with: // | Ddd 0 | // | F Dcc | // replacing Ddc with a zero matrix for the applyInverse method only. // Our algorithm is then: // Y1 = Ddd \ X1 // Y2 = Dcc \ (X2 - F*Y1) TEUCHOS_TEST_FOR_EXCEPT(Y.getNumVectors()!=X.getNumVectors()); #ifdef KDEBUG TEUCHOS_TEST_FOR_EXCEPT(!X.getMap()->isSameAs(*getDomainMap())); TEUCHOS_TEST_FOR_EXCEPT(!Y.getMap()->isSameAs(*getRangeMap())); printf("\n\n\n\ndft_PolyA22_Tpetra_Operator::applyInverse()\n\n\n\n"); #endif Scalar ONE = STS::one(); Scalar ZERO = STS::zero(); if (F_location_ == 1) { //F in NE size_t numCmsElements = cmsMap_->getNodeNumElements(); // Y1 is a view of the first numCms elements of Y RCP<MV > Y1 = Y.offsetViewNonConst(cmsMap_, 0); // Y2 is a view of the last numDensity elements of Y RCP<MV > Y2 = Y.offsetViewNonConst(densityMap_, numCmsElements); // X1 is a view of the first numCms elements of X RCP<const MV > X1 = X.offsetView(cmsMap_, 0); // X2 is a view of the last numDensity elements of X RCP<const MV > X2 = X.offsetView(densityMap_, numCmsElements); // Second block row: Y2 = DD\X2 Y2->elementWiseMultiply(ONE, *densityOnDensityInverse_, *X2, ZERO); // First block row: Y1 = CC \ (X1 - CD*Y2) cmsOnDensityMatrixOp_->apply(*Y2, *tmpCmsVec_); tmpCmsVec_->update(ONE, *X1, -ONE); cmsOnCmsInverseOp_->apply(*tmpCmsVec_, *Y1); } else { //F in SW size_t numDensityElements = densityMap_->getNodeNumElements(); // Y1 is a view of the first numDensity elements of Y RCP<MV > Y1 = Y.offsetViewNonConst(densityMap_, 0); // Y2 is a view of the last numCms elements of Y RCP<MV > Y2 = Y.offsetViewNonConst(cmsMap_, numDensityElements); // X1 is a view of the first numDensity elements of X RCP<const MV > X1 = X.offsetView(densityMap_, 0); // X2 is a view of the last numCms elements of X RCP<const MV > X2 = X.offsetView(cmsMap_, numDensityElements); // First block row: Y1 = DD\X1 Y1->elementWiseMultiply(ONE, *densityOnDensityInverse_, *X1, ZERO); // Second block row: Y2 = CC \ (X2 - CD*Y1) cmsOnDensityMatrixOp_->apply(*Y1, *tmpCmsVec_); tmpCmsVec_->update(ONE, *X2, -ONE); cmsOnCmsInverseOp_->apply(*tmpCmsVec_, *Y2); } } //end applyInverse