190 symmetrize (
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
195 using range_type = Kokkos::RangePolicy<execution_space, size_t>;
198 using row_ptrs_array =
typename local_graph_device_type::row_map_type::non_const_type ;
199 using col_inds_array =
typename local_graph_device_type::entries_type::non_const_type;
201 using global_col_inds_array =
typename Kokkos::View<GlobalOrdinal*, device_type>;
203 auto graph = origGraph_;
204 auto domain_map = graph->getDomainMap();
205 auto range_map = graph->getRangeMap();
206 auto row_map = graph->getRowMap();
207 auto col_map = graph->getColMap();
208 RCP<const map_type> col_map_sym;
209 RCP<const Import<LocalOrdinal,GlobalOrdinal,Node> > importer;
211 TEUCHOS_ASSERT(domain_map->isSameAs(*range_map));
212 TEUCHOS_ASSERT(domain_map->isSameAs(*row_map));
217 auto col_map_T = graphT->getColMap();
218 TEUCHOS_ASSERT(!col_map_T.is_null());
219 TEUCHOS_ASSERT(domain_map->isSameAs(*graphT->getDomainMap()));
221 bool graphSorted = graph->isSorted();
222 bool graphTSorted = graphT->isSorted();
223 bool sorted = graphSorted && graphTSorted;
224 bool matchingColMaps = col_map->isSameAs(*col_map_T);
226 auto lclGraph = graph->getLocalGraphDevice();
227 auto lclGraphT = graphT->getLocalGraphDevice();
229 using KKH_LO = KokkosKernels::Experimental::KokkosKernelsHandle<size_t, LocalOrdinal,
impl_scalar_type,
230 typename Node::execution_space,
typename Node::memory_space,
typename Node::memory_space>;
231 using KKH_GO = KokkosKernels::Experimental::KokkosKernelsHandle<size_t, GlobalOrdinal,
impl_scalar_type,
232 typename Node::execution_space,
typename Node::memory_space,
typename Node::memory_space>;
234 auto rowptrs = lclGraph.row_map;
235 auto rowptrsT = lclGraphT.row_map;
236 auto colinds = lclGraph.entries;
237 auto colindsT = lclGraphT.entries;
239 auto nrows = rowptrs.extent(0) - 1;
240 auto rowptrsSym = row_ptrs_array(Kokkos::ViewAllocateWithoutInitializing(
"row ptrs sym"), nrows + 1);
242 col_inds_array colindsSym;
244 if(!matchingColMaps) {
246 auto lclColmap = col_map->getLocalMap();
247 global_col_inds_array colindsConverted(Kokkos::ViewAllocateWithoutInitializing(
"colinds (converted)"), colinds.extent(0));
248 ConvertLocalToGlobalFunctor<GlobalOrdinal, col_inds_array, global_col_inds_array, local_map_type> convert(colinds, colindsConverted, lclColmap);
249 Kokkos::parallel_for(
"colInds (converted)", range_type(0, colinds.extent(0)), convert);
252 auto lclColmapT = col_map_T->getLocalMap();
253 global_col_inds_array colindsTConverted(Kokkos::ViewAllocateWithoutInitializing(
"colindsT (converted)"), colindsT.extent(0));
254 ConvertLocalToGlobalFunctor<GlobalOrdinal, col_inds_array, global_col_inds_array, local_map_type> convertT(colindsT, colindsTConverted, lclColmapT);
255 Kokkos::parallel_for(
"colIndsT (converted)", range_type(0, colindsT.extent(0)), convertT);
259 handle.create_spadd_handle(
false);
260 auto addHandle = handle.get_spadd_handle();
262 global_col_inds_array globalColindsSym;
264 KokkosSparse::Experimental::spadd_symbolic
266#
if KOKKOSKERNELS_VERSION >= 40299
267 nrows, graph->getGlobalNumCols(),
269 rowptrs, colindsConverted, rowptrsT, colindsTConverted, rowptrsSym);
270 globalColindsSym = global_col_inds_array(Kokkos::ViewAllocateWithoutInitializing(
"global colinds sym"), addHandle->get_c_nnz());
272 UnsortedNumericIndicesOnlyFunctor<
273 size_t, GlobalOrdinal,
274 typename row_ptrs_array::const_type,
typename row_ptrs_array::const_type, row_ptrs_array,
275 typename global_col_inds_array::const_type,
typename global_col_inds_array::const_type, global_col_inds_array>
276 unsortedNumeric(rowptrs, rowptrsT, rowptrsSym,
277 colindsConverted, colindsTConverted, globalColindsSym,
278 addHandle->get_a_pos(), addHandle->get_b_pos());
279 Kokkos::parallel_for(
"KokkosSparse::SpAdd:Numeric::InputNotSorted",
280 range_type(0, nrows), unsortedNumeric);
284 (col_map_sym, domain_map, globalColindsSym);
287 auto lclColmapSym = col_map_sym->getLocalMap();
288 colindsSym = col_inds_array(
"colindsSym", globalColindsSym.extent(0));
289 ConvertGlobalToLocalFunctor<LocalOrdinal, GlobalOrdinal, col_inds_array, global_col_inds_array, typename map_type::local_map_type> convertSym(colindsSym, globalColindsSym, lclColmapSym);
290 Kokkos::parallel_for(range_type(0, globalColindsSym.extent(0)), convertSym);
296 handle.create_spadd_handle(sorted);
297 auto addHandle = handle.get_spadd_handle();
299 KokkosSparse::Experimental::spadd_symbolic
301#
if KOKKOSKERNELS_VERSION >= 40299
302 nrows, graph->getGlobalNumCols(),
304 rowptrs, colinds, rowptrsT, colindsT, rowptrsSym);
305 colindsSym = col_inds_array(Kokkos::ViewAllocateWithoutInitializing(
"C colinds"), addHandle->get_c_nnz());
308 SortedNumericIndicesOnlyFunctor<
309 size_t, LocalOrdinal,
310 typename row_ptrs_array::const_type,
typename row_ptrs_array::const_type, row_ptrs_array,
311 typename col_inds_array::const_type,
typename col_inds_array::const_type, col_inds_array>
312 sortedNumeric(rowptrs, rowptrsT, rowptrsSym,
313 colinds, colindsT, colindsSym);
314 Kokkos::parallel_for(
"KokkosSparse::SpAdd:Numeric::InputSorted",
315 range_type(0, nrows), sortedNumeric);
318 UnsortedNumericIndicesOnlyFunctor<
319 size_t, LocalOrdinal,
320 typename row_ptrs_array::const_type,
typename row_ptrs_array::const_type, row_ptrs_array,
321 typename col_inds_array::const_type,
typename col_inds_array::const_type, col_inds_array>
322 unsortedNumeric(rowptrs, rowptrsT, rowptrsSym,
323 colinds, colindsT, colindsSym,
324 addHandle->get_a_pos(), addHandle->get_b_pos());
325 Kokkos::parallel_for(
"KokkosSparse::SpAdd:Numeric::InputNotSorted",
326 range_type(0, nrows), unsortedNumeric);
330 col_map_sym = col_map;
331 importer = graph->getImporter();
336 KokkosSparse::sort_crs_graph<execution_space, row_ptrs_array, col_inds_array>(rowptrsSym, colindsSym);
340 RCP<Teuchos::ParameterList> graphParams = Teuchos::null;
342 graphParams = rcp(
new Teuchos::ParameterList);
343 graphParams->set(
"sorted",
false);
346 return rcp (
new crs_graph_type (lclGraphSym,
409 using Teuchos::rcp_dynamic_cast;
410 using LO = LocalOrdinal;
411 using GO = GlobalOrdinal;
415#ifdef HAVE_TPETRA_MMM_TIMINGS
416 std::string prefix = std::string(
"Tpetra ") + label_ +
": ";
417 using Teuchos::TimeMonitor;
418 TimeMonitor MM (*TimeMonitor::getNewTimer (prefix +
"Transpose Local"));
421 const bool sort = [&] () {
422 constexpr bool sortDefault =
true;
423 const char sortParamName[] =
"sort";
424 return params.get () ==
nullptr ? sortDefault :
425 params->get (sortParamName, sortDefault);
432 using c_rowmap_t =
typename local_graph_device_type::row_map_type;
433 using c_entries_t =
typename local_graph_device_type::entries_type;
434 using rowmap_t =
typename local_graph_device_type::row_map_type::non_const_type;
435 using entries_t =
typename local_graph_device_type::entries_type::non_const_type;
436 LocalOrdinal numCols = origGraph_->
getColMap()->getLocalNumElements();
437 rowmap_t lclGraphT_rowmap(
"Transpose rowmap", numCols + 1);
438 entries_t lclGraphT_entries(
439 Kokkos::ViewAllocateWithoutInitializing(
"Transpose entries"), lclGraph.entries.extent(0));
440 KokkosSparse::Impl::transpose_graph<
441 c_rowmap_t, c_entries_t,
443 rowmap_t,
typename local_graph_device_type::execution_space>(
444 lclGraph.numRows(), numCols,
445 lclGraph.row_map, lclGraph.entries,
446 lclGraphT_rowmap, lclGraphT_entries);
449 KokkosSparse::sort_crs_graph<
450 typename local_graph_device_type::execution_space,
451 rowmap_t, entries_t>(
460 const auto origExport = origGraph_->getExporter ();
461 RCP<const import_type> myImport = origExport.is_null () ?
462 Teuchos::null : rcp (
new import_type (*origExport));
463 const auto origImport = origGraph_->getImporter ();
464 RCP<const export_type> myExport = origImport.is_null () ?
465 Teuchos::null : rcp (
new export_type (*origImport));
467 RCP<Teuchos::ParameterList> graphParams = Teuchos::null;
469 graphParams = rcp(
new Teuchos::ParameterList);
470 graphParams->set(
"sorted",
false);
473 return rcp (
new crs_graph_type (lclGraphT,
474 origGraph_->getColMap (),
475 origGraph_->getRowMap (),
476 origGraph_->getRangeMap (),
477 origGraph_->getDomainMap (),
478 myImport, myExport, graphParams));