std::vector<cv::Rect> RealSenseDetector::detectImpl(const ImageGrayscale &img) { std::vector<cv::Rect> rects = OpenCVDetector::detect(img); if (rects.empty()) { consecutiveDetects = 0; consecutiveNonDetects++; // depth face tracker overlap test if (consecutiveNonDetects < 4 && rsDepthFaceTracker->hasLastRoi()) { cv::Rect croi = RealSenseDepthFaceTracker::convertScale(rsDepthFaceTracker->getLastCroi(), setup.scale, setup.detectRoi); cv::Rect intersection = lastRoi & croi; cv::Rect smallerRoi = croi.area() < lastRoi.area() ? croi : lastRoi; std::cout << std::dec << " *** RealSenseDetector::detectImpl, lastRoi: " << lastRoi << ", croi: " << croi << ", intersection: " << intersection << std::endl; std::cout << std::dec << " *** RealSenseDetector::detectImpl, intersection/smallerRoi/croi/lastRoi areas: " << intersection.area() << "/" << smallerRoi.area() << "/" << croi.area() << "/" << lastRoi.area() << std::endl; if (intersection.area() > smallerRoi.area() * 0.5) { cv::Point croiCenter(croi.x + croi.width / 2, croi.y + croi.height / 2); cv::Point lregCenter(lastRoi.x + lastRoi.width / 2, lastRoi.y + lastRoi.height / 2); cv::Point displ(croiCenter - lregCenter); std::cout << std::dec << " *** RealSenseDetector::detectImpl, displ vector: " << displ << std::endl; lastRoi.x += displ.x; lastRoi.y += displ.y; rects.push_back(lastRoi); } } else { std::cout << std::dec << " *** RealSenseDetector::detectImpl, NO FACE, consecutiveNonDetects: " << consecutiveNonDetects << std::endl; } } else { consecutiveDetects++; consecutiveNonDetects = 0; lastRoi = getBiggest(rects); } return rects; }
int sci_view(char *fname) { static int l1, m1, n1, l2, m2, n2, m3, n3, l3; static int minlhs=1, maxlhs=3, minrhs=3, maxrhs=3; /* Check number of inputs (rhs=3) and outputs (lhs=3) */ CheckRhs(minrhs,maxrhs) ; CheckLhs(minlhs,maxlhs) ; /* Get X (1 ,double), Y (2, int) and C (3, string) */ GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1); GetRhsVar(2,MATRIX_OF_INTEGER_DATATYPE, &m2, &n2, &l2); GetRhsVar(3,STRING_DATATYPE, &m3, &n3, &l3); /* Call display function stk(l1)->X (double), istk(l2)->Y (int), cstk(l3)->Z (char) */ displ(stk(l1), m1, n1, istk(l2), m2, n2, cstk(l3), m3, n3); /* Return variables */ LhsVar(1) = 1; LhsVar(2) = 2; LhsVar(3) = 3; return 0; }
avtVector avtIVPVTKOffsetField::GetPositionCorrection( size_t compIndex ) const { avtVector displ( 0.0, 0.0, 0.0 ); vtkCell *cell = this->ds->GetCell( this->lastCell ); // compute the parametric coordinates double pcoords[3], weights[12]; double tol2 = 1.e-4; int subId; vtkIdType cellId = this->ds->FindCell(&this->lastPos.x, cell, this->lastCell, tol2, subId, pcoords, weights); if ( cellId < 0 ) { std::stringstream msg; debug5 << "avtIVPVTKOffsetField: could not find cell\n"; debug5 << " lastCell = " << this->lastCell << '\n'; debug5 << " lastPos = " << this->lastPos.x << ", " << this->lastPos.y << ", " << this->lastPos.z << '\n'; debug5 << " will set displacement to zero\n"; return displ; } vtkIdType idPtLo, idPtHi; avtVector ptLo( 0.0, 0.0, 0.0 ); avtVector ptHi( 0.0, 0.0, 0.0 ); if ( cell->GetCellType( ) == VTK_QUAD ) { std::vector< std::vector<double> > g(4); // 4 edges for (size_t i = 0; i < 4; ++i) { g[i].resize(3); } idPtLo = cell->GetPointId(0); idPtHi = cell->GetPointId(1); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[0][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(3); idPtHi = cell->GetPointId(2); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[1][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(0); idPtHi = cell->GetPointId(3); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[2][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(1); idPtHi = cell->GetPointId(2); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[3][i] = ptHi[i] - ptLo[i]; } for (size_t i = 0; i < 3; ++i) { displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*g[0][i]; displ[i] += this->nodeOffsets[compIndex][0] * ( pcoords[1])*g[1][i]; displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*g[2][i]; displ[i] += this->nodeOffsets[compIndex][1] * ( pcoords[0])*g[3][i]; } } else if ( cell->GetCellType( ) == VTK_HEXAHEDRON ) { std::vector< std::vector<double> > g(12); // 12 edges for (size_t i = 0; i < 12; ++i) { g[i].resize(3); } idPtLo = cell->GetPointId(0); idPtHi = cell->GetPointId(1); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[0][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(3); idPtHi = cell->GetPointId(2); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[1][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(7); idPtHi = cell->GetPointId(6); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[2][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(4); idPtHi = cell->GetPointId(5); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[3][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(0); idPtHi = cell->GetPointId(3); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[4][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(1); idPtHi = cell->GetPointId(2); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[5][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(5); idPtHi = cell->GetPointId(6); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[6][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(4); idPtHi = cell->GetPointId(7); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[7][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(0); idPtHi = cell->GetPointId(4); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[8][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(1); idPtHi = cell->GetPointId(5); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[9][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(2); idPtHi = cell->GetPointId(6); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[10][i] = ptHi[i] - ptLo[i]; } idPtLo = cell->GetPointId(3); idPtHi = cell->GetPointId(7); this->ds->GetPoint(idPtLo, &ptLo[0]); this->ds->GetPoint(idPtHi, &ptHi[0]); for (size_t i = 0; i < 3; ++i) { g[11][i] = ptHi[i] - ptLo[i]; } for ( size_t i = 0; i < 3; ++i ) { displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*(1.-pcoords[2])*g[0][i]; displ[i] += this->nodeOffsets[compIndex][0] * ( pcoords[1])*(1.-pcoords[2])*g[1][i]; displ[i] += this->nodeOffsets[compIndex][0] * ( pcoords[1])*( pcoords[2])*g[2][i]; displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*( pcoords[2])*g[3][i]; displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*(1.-pcoords[2])*g[4][i]; displ[i] += this->nodeOffsets[compIndex][1] * ( pcoords[0])*(1.-pcoords[2])*g[5][i]; displ[i] += this->nodeOffsets[compIndex][1] * ( pcoords[0])*( pcoords[2])*g[6][i]; displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*( pcoords[2])*g[7][i]; displ[i] += this->nodeOffsets[compIndex][2] * (1.-pcoords[0])*(1.-pcoords[1])*g[8][i]; displ[i] += this->nodeOffsets[compIndex][2] * ( pcoords[0])*(1.-pcoords[1])*g[9][i]; displ[i] += this->nodeOffsets[compIndex][2] * ( pcoords[0])*( pcoords[1])*g[10][i]; displ[i] += this->nodeOffsets[compIndex][2] * (1.-pcoords[0])*( pcoords[1])*g[11][i]; } } else { EXCEPTION1( ImproperUseException, "avtIVPVTKOffsetField: unsupported cell in GetPositionCorrection"); } debug5 << "-----> displacement for component " << compIndex << " is " << displ[0] << ' ' << displ[1] << ' ' << displ[2] << '\n'; return displ; }
virtual void onDraw(SkCanvas* canvas) { if (!fInitialized) { make_bitmaps(); fInitialized = true; } canvas->clear(0x00000000); SkPaint paint; SkAutoTUnref<SkImageFilter> displ(SkBitmapSource::Create(fCheckerboard)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ))->unref(); drawClippedBitmap(canvas, 0, 0, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kB_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ))->unref(); drawClippedBitmap(canvas, 100, 0, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ))->unref(); drawClippedBitmap(canvas, 200, 0, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ))->unref(); drawClippedBitmap(canvas, 300, 0, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ))->unref(); drawClippedBitmap(canvas, 400, 0, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 0, 100, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kB_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 100, 100, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 200, 100, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 300, 100, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 400, 100, paint); SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 0, 200, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kB_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 100, 200, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 200, 200, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 300, 200, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 400, 200, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 0, 300, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kB_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 100, 300, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 200, 300, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 300, 300, paint); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, NULL, &cropRect))->unref(); drawClippedBitmap(canvas, 400, 300, paint); // Tests for images of different sizes displ.reset(SkBitmapSource::Create(fSmall)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 0, 400, paint); displ.reset(SkBitmapSource::Create(fLarge)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kB_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 100, 400, paint); displ.reset(SkBitmapSource::Create(fLargeW)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 200, 400, paint); displ.reset(SkBitmapSource::Create(fLargeH)); paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref(); drawClippedBitmap(canvas, 300, 400, paint); // Test for no given displacement input. In this case, both displacement // and color should use the same bitmap, given to SkCanvas::drawBitmap() // as an input argument. paint.setImageFilter(SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kG_ChannelSelectorType, SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, NULL))->unref(); drawClippedBitmap(canvas, 400, 400, paint); }
sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* source, const Context& ctx, SkIPoint* offset) const { SkIPoint colorOffset = SkIPoint::Make(0, 0); sk_sp<SkSpecialImage> color(this->filterInput(1, source, ctx, &colorOffset)); if (!color) { return nullptr; } SkIPoint displOffset = SkIPoint::Make(0, 0); sk_sp<SkSpecialImage> displ(this->filterInput(0, source, ctx, &displOffset)); if (!displ) { return nullptr; } const SkIRect srcBounds = SkIRect::MakeXYWH(colorOffset.x(), colorOffset.y(), color->width(), color->height()); // Both paths do bounds checking on color pixel access, we don't need to // pad the color bitmap to bounds here. SkIRect bounds; if (!this->applyCropRect(ctx, srcBounds, &bounds)) { return nullptr; } SkIRect displBounds; displ = this->applyCropRect(ctx, displ.get(), &displOffset, &displBounds); if (!displ) { return nullptr; } if (!bounds.intersect(displBounds)) { return nullptr; } const SkIRect colorBounds = bounds.makeOffset(-colorOffset.x(), -colorOffset.y()); SkVector scale = SkVector::Make(fScale, fScale); ctx.ctm().mapVectors(&scale, 1); #if SK_SUPPORT_GPU if (source->isTextureBacked()) { GrContext* context = source->getContext(); sk_sp<GrTexture> colorTexture(color->asTextureRef(context)); sk_sp<GrTexture> displTexture(displ->asTextureRef(context)); if (!colorTexture || !displTexture) { return nullptr; } GrSurfaceDesc desc; desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fWidth = bounds.width(); desc.fHeight = bounds.height(); desc.fConfig = kSkia8888_GrPixelConfig; SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture(desc)); if (!dst) { return nullptr; } GrPaint paint; SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displTexture.get()); offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displOffset.fX), SkIntToScalar(colorOffset.fY - displOffset.fY)); paint.addColorFragmentProcessor( GrDisplacementMapEffect::Create(fXChannelSelector, fYChannelSelector, scale, displTexture.get(), offsetMatrix, colorTexture.get(), SkISize::Make(color->width(), color->height())))->unref(); paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); SkMatrix matrix; matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y())); SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRenderTarget())); if (!drawContext) { return nullptr; } drawContext->drawRect(GrClip::WideOpen(), paint, matrix, SkRect::Make(colorBounds)); offset->fX = bounds.left(); offset->fY = bounds.top(); return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(bounds.width(), bounds.height()), kNeedNewImageUniqueID_SpecialImage, dst); } #endif SkBitmap colorBM, displBM; if (!color->getROPixels(&colorBM) || !displ->getROPixels(&displBM)) { return nullptr; } if ((colorBM.colorType() != kN32_SkColorType) || (displBM.colorType() != kN32_SkColorType)) { return nullptr; } SkAutoLockPixels colorLock(colorBM), displLock(displBM); if (!colorBM.getPixels() || !displBM.getPixels()) { return nullptr; } SkImageInfo info = SkImageInfo::MakeN32(bounds.width(), bounds.height(), colorBM.alphaType()); SkBitmap dst; if (!dst.tryAllocPixels(info)) { return nullptr; } SkAutoLockPixels dstLock(dst); computeDisplacement(fXChannelSelector, fYChannelSelector, scale, &dst, displBM, colorOffset - displOffset, colorBM, colorBounds); offset->fX = bounds.left(); offset->fY = bounds.top(); return SkSpecialImage::MakeFromRaster(SkIRect::MakeWH(bounds.width(), bounds.height()), dst); }
int ORD::find_elim_ordering() { int ws; int wr; char eoname[512]; char eoname_other[512]; // Get size and rank from the communicator MPI_Comm_size(comm, &ws); MPI_Comm_rank(comm, &wr); double xtime = MPI_Wtime(); sprintf(eoname, "%s.order.%d", this->filename.c_str(), ws); sprintf(eoname_other, "%s.order_other.%d", this->filename.c_str(), ws); DEBUG("size: %d, rank %d \n", ws, wr); int n = G->get_num_nodes(); int x = n/ws; int xm = n%ws; int i = 0; DEBUG("n: %d x: %d xm: %d \n", n, x, xm); vector<int> xadj; vector<int> adjncy; vector<int> vtxdist(ws + 1, 0); vector<int> sizes(2*ws,0); vector<int> ordering(x+1, 0); vector<int> recvcnt(ws, 0); vector<int> displ(ws, 0); int numflag = 0; int options[10]; options[0] = 0; vtxdist[0] = 0; for (i = 1; i <= ws; i++) { vtxdist[i] = vtxdist[i - 1] + x; if (i <= xm) vtxdist[i]++; } // prepareing displacement and receive counts to use with MPI_Gatherv for (i = 0; i < ws; i++) { recvcnt[i] = x; if (i < xm) recvcnt[i] ++; if (i > 0) displ[i] += displ[i - 1] + recvcnt[i - 1]; } DEBUG("range: %d, %d\n", vtxdist[wr], vtxdist[wr + 1]); int j = 0; xadj.push_back(0); for (i = vtxdist[wr]; i < vtxdist[wr + 1]; i++) { Graph::Node *no = G->get_node(i); list<int> *l = no->get_nbrs_ptr(); list<int>::iterator it = l->begin(); for (; it != l->end(); ++it) { adjncy.push_back(*it); j++; } xadj.push_back(j); } if (METIS_OK != ParMETIS_V3_NodeND(&vtxdist.front(), &xadj.front(), &adjncy.front(), &numflag, options, &ordering.front(), &sizes.front(), &comm)) { FERROR("error occured while processing parmetis, aborting\n"); MPI_Abort(MPI_COMM_WORLD, -1); } DEBUG("output from ParMETIS\n"); double parmet_time = MPI_Wtime() - xtime; vector<int> recvbuf; n = G->get_num_nodes(); if (wr == 0) { recvbuf = vector<int>(n, 0); } if (MPI_SUCCESS != MPI_Gatherv((void *)&ordering.front(), recvcnt[wr], MPI_INT, (void *)&recvbuf.front(), &recvcnt.front(), &displ.front(), MPI_INT, 0, comm)) { FERROR("MPI error occured at Gatherv, Abort!\n"); MPI_Abort(comm, -1); } vector<int> eo(n, 0); if (wr == 0) { for (int i = 0; i < n; i++) { eo[recvbuf[i]] = i; } FILE *f = fopen(eoname_other, "w"); for (int i = 0; i < n; i++) fprintf(f, "%d\n", eo[i] + 1); fclose(f); DEBUG("ParMetis NodeND elimination ordering is in : %s\n", eoname_other); } ordering.clear(); ordering.resize(recvcnt[wr], 0); if (MPI_SUCCESS != MPI_Scatterv ((void *)&eo.front(), &recvcnt.front(), &displ.front(), MPI_INT, (void *)&ordering.front(), recvcnt[wr], MPI_INT, 0, comm)) { FERROR("MPI error occured at Scatterv, Abort! \n"); MPI_Abort(comm, -1); } DEBUG("Scatterv completed\n"); Graph::GraphCreatorFile gf; Graph::VertexWeightedGraph *wg; Graph::GraphEOUtil eoutil; Graph::GraphProperties prop; list<int>members(ordering.begin(), ordering.end()); wg = gf.create_component(G, &members, false); prop.make_canonical(wg); vector<int> ord(recvcnt[wr], 0); vector<int> ordsend(recvcnt[wr, 0]); double xxtime = MPI_Wtime(); eoutil.find_elimination_ordering(wg, &ord, GD_AMD, false); DEBUG("eo time : %f\n", MPI_Wtime() - xxtime); int sz = recvcnt[wr]; for (int i = 0; i < sz; i++) ordsend[i] = wg->get_node(ord[i])->get_label(); recvbuf.assign(n, -1); if (MPI_SUCCESS != MPI_Gatherv((void *)&ordsend.front(), recvcnt[wr], MPI_INT, (void *)&recvbuf.front(), &recvcnt.front(), &displ.front(), MPI_INT, 0, comm)) { FERROR("MPI error occured at Gatherv, Abort!\n"); MPI_Abort(comm, -1); } double p_amd_time = MPI_Wtime() - xtime; if (wr == 0) { FILE *f = fopen(eoname, "w"); for (int i = 0; i < n && wr == 0; i++) fprintf(f, "%d\n", recvbuf[i]); fclose(f); } DEBUG("ordering is written into %s\n", eoname); DEBUG("%f,%f\n", parmet_time, p_amd_time); return 0; }