void Stokes::FACOps::xeqScheduleRRestriction(int p_dst, int p_src, int v_dst, int v_src, int dest_ln) { /* p */ { if (!p_rrestriction_coarsen_schedules[dest_ln]) { TBOX_ERROR("Expected schedule not found."); } SAMRAI::xfer::CoarsenAlgorithm coarsener(d_dim); coarsener.registerCoarsen(p_dst,p_src,p_rrestriction_coarsen_operator); coarsener.resetSchedule(p_rrestriction_coarsen_schedules[dest_ln]); p_rrestriction_coarsen_schedules[dest_ln]->coarsenData(); } /* v */ { if (!v_rrestriction_coarsen_schedules[dest_ln]) { TBOX_ERROR("Expected schedule not found."); } SAMRAI::xfer::CoarsenAlgorithm coarsener(d_dim); coarsener.registerCoarsen(v_dst,v_src,v_rrestriction_coarsen_operator); coarsener.resetSchedule(v_rrestriction_coarsen_schedules[dest_ln]); v_rrestriction_coarsen_schedules[dest_ln]->coarsenData(); } }
/** * KMetis Algorithm */ void partition(MetisGraph* metisGraph, int nparts) { int coarsenTo = (int) max(metisGraph->getNumNodes() / (40 * intlog2(nparts)), 20 * (nparts)); int maxVertexWeight = (int) (1.5 * ((metisGraph->getNumNodes()) / (double) coarsenTo)); Coarsener coarsener(false, coarsenTo, maxVertexWeight); Galois::StatTimer T; T.start(); Galois::Timer t; t.start(); MetisGraph* mcg = coarsener.coarsen(metisGraph); t.stop(); cout<<"coarsening time: " << t.get() << " ms"<<endl; float* totalPartitionWeights = new float[nparts]; std::fill_n(totalPartitionWeights, nparts, 1 / (float) nparts); maxVertexWeight = (int) (1.5 * ((mcg->getNumNodes()) / COARSEN_FRACTION)); PMetis pmetis(20, maxVertexWeight); Galois::Timer init_part_t; init_part_t.start(); pmetis.mlevelRecursiveBisection(mcg, nparts, totalPartitionWeights, 0, 0); init_part_t.stop(); cout << "initial partition time: "<< init_part_t.get() << " ms"<<endl; Galois::Timer refine_t; std::fill_n(totalPartitionWeights, nparts, 1 / (float) nparts); refine_t.start(); refineKWay(mcg, metisGraph, totalPartitionWeights, (float) 1.03, nparts); refine_t.stop(); cout << "refine time: " << refine_t.get() << " ms"<<endl; delete[] totalPartitionWeights; T.stop(); }