10#ifndef TPETRA_BLOCKCRSMATRIX_HELPERS_DEF_HPP
11#define TPETRA_BLOCKCRSMATRIX_HELPERS_DEF_HPP
15#include "Tpetra_BlockCrsMatrix.hpp"
16#include "Tpetra_CrsMatrix.hpp"
17#include "Tpetra_HashTable.hpp"
18#include "Tpetra_Import.hpp"
19#include "Tpetra_Map.hpp"
20#include "Tpetra_MultiVector.hpp"
21#include "Teuchos_ParameterList.hpp"
22#include "Teuchos_ScalarTraits.hpp"
28template <
class Scalar,
class LO,
class GO,
class Node>
30 Teuchos::ParameterList
pl;
36template <
class Scalar,
class LO,
class GO,
class Node>
43template <
class Scalar,
class LO,
class GO,
class Node>
45 Teuchos::ParameterList
pl;
49template <
class Scalar,
class LO,
class GO,
class Node>
54 typedef Teuchos::OrdinalTraits<GO>
TOT;
63 const int myRank = comm->getRank();
64 const size_t numProcs = comm->getSize();
68 if (
params.isParameter(
"always use parallel algorithm"))
71 if (
params.isParameter(
"print MatrixMarket header"))
75 std::time_t
now = std::time(
NULL);
78 Teuchos::ScalarTraits<Scalar>::isComplex ?
"complex" :
"real";
88 os <<
"%%MatrixMarket matrix coordinate " <<
dataTypeStr <<
" general" << std::endl;
90 os <<
"% written from " <<
numProcs <<
" processes" << std::endl;
91 os <<
"% point representation of Tpetra::BlockCrsMatrix" << std::endl;
92 size_t numRows =
A.getGlobalNumRows();
93 size_t numCols =
A.getGlobalNumCols();
94 os <<
"% " <<
numRows <<
" block rows, " << numCols <<
" block columns" << std::endl;
103 size_t numRows = rowMap->getLocalNumElements();
132 std::runtime_error,
"Tpetra::blockCrsMatrixWriter: (pid " <<
myRank <<
") map size should be zero, but is " <<
curStripSize);
165template <
class Scalar,
class LO,
class GO,
class Node>
172 using impl_scalar_type =
typename bcrs_type::impl_scalar_type;
174 size_t numRows =
A.getGlobalNumRows();
178 const int myRank = comm->getRank();
184 "Tpetra::writeMatrixStrip: "
185 "mesh row index base != mesh column index base");
189 std::runtime_error,
"Tpetra::writeMatrixStrip: pid " <<
myRank <<
" should have 0 rows but has " <<
A.getLocalNumRows());
191 std::runtime_error,
"Tpetra::writeMatrixStrip: pid " <<
myRank <<
" should have 0 columns but has " <<
A.getLocalNumCols());
196 "Tpetra::writeMatrixStrip: "
197 "number of rows on pid 0 does not match global number of rows");
204 if (
params.isParameter(
"precision")) {
209 if (
params.isParameter(
"zero-based indexing")) {
210 if (
params.get<
bool>(
"zero-based indexing") ==
true)
224 for (LO
k = 0;
k < numEntries; ++
k) {
235 if (Teuchos::ScalarTraits<impl_scalar_type>::isComplex) {
239 << Teuchos::ScalarTraits<impl_scalar_type>::imag(
curVal);
252 "Tpetra::writeMatrixStrip: "
253 "error getting view of local row "
258template <
class Scalar,
class LO,
class GO,
class Node>
259Teuchos::RCP<Tpetra::CrsGraph<LO, GO, Node>>
270 using Teuchos::Array;
271 using Teuchos::ArrayView;
278 using local_graph_device_type =
typename crs_matrix_type::local_graph_device_type;
279 using row_map_type =
typename local_graph_device_type::row_map_type::non_const_type;
280 using entries_type =
typename local_graph_device_type::entries_type::non_const_type;
282 using offset_type =
typename row_map_type::non_const_value_type;
284 using execution_space =
typename Node::execution_space;
285 using range_type = Kokkos::RangePolicy<execution_space, LO>;
300 Kokkos::DefaultExecutionSpace().fence();
303 if (
meshColMap.is_null())
throw std::runtime_error(
"ERROR: Cannot create mesh colmap");
321 "Tpetra::getBlockCrsGraph: "
322 "local number of non zero entries is not a multiple of blockSize^2 ");
328 Kokkos::parallel_for(
346 Kokkos::DefaultExecutionSpace().fence();
355 "Tpetra::getBlockCrsGraph: "
356 "local number of non zero entries is not a multiple of blockSize^2 ");
362 Kokkos::parallel_for(
393 Kokkos::DefaultExecutionSpace().fence();
399template <
class Scalar,
class LO,
class GO,
class Node>
400Teuchos::RCP<BlockCrsMatrix<Scalar, LO, GO, Node>>
411 using Teuchos::Array;
412 using Teuchos::ArrayView;
418 using local_graph_device_type =
typename crs_matrix_type::local_graph_device_type;
419 using local_matrix_device_type =
typename crs_matrix_type::local_matrix_device_type;
420 using row_map_type =
typename local_graph_device_type::row_map_type::non_const_type;
421 using values_type =
typename local_matrix_device_type::values_type::non_const_type;
423 using offset_type =
typename row_map_type::non_const_value_type;
425 using execution_space =
typename Node::execution_space;
426 using range_type = Kokkos::RangePolicy<execution_space, LO>;
445 Kokkos::parallel_for(
463 Kokkos::DefaultExecutionSpace().fence();
482 Kokkos::parallel_for(
489 Kokkos::parallel_for(
494 Kokkos::parallel_for(
500 offset_type
block_inv =
static_cast<offset_type
>(-1);
510 if (
block_inv !=
static_cast<offset_type
>(-1))
521 Kokkos::DefaultExecutionSpace().fence();
527template <
class Scalar,
class LO,
class GO,
class Node>
528Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LO, GO, Node>>
531 using execution_space =
typename Node::execution_space;
532 using dev_row_view_t =
typename crs_t::local_graph_device_type::row_map_type::non_const_type;
533 using dev_col_view_t =
typename crs_t::local_graph_device_type::entries_type::non_const_type;
534 using dev_val_view_t =
typename crs_t::local_matrix_device_type::values_type::non_const_type;
535 using range_type = Kokkos::RangePolicy<execution_space, size_t>;
536 using team_policy = Kokkos::TeamPolicy<execution_space>;
537 using member_type =
typename team_policy::member_type;
538 using scratch_view = Kokkos::View<bool *, typename execution_space::scratch_memory_space>;
539 using Ordinal =
typename dev_row_view_t::non_const_value_type;
556 const int max_threads = execution_space().concurrency();
567 Kokkos::parallel_for(
573 Kokkos::PerTeam(
team), [&]() {
582 Kokkos::parallel_for(
605 Kokkos::PerTeam(
team), [&]() {
621 Kokkos::parallel_for(
661 KokkosKernels::Impl::kk_exclusive_parallel_prefix_sum<
670 Kokkos::parallel_for(
676 Kokkos::PerTeam(
team), [&]() {
685 Kokkos::parallel_for(
708 Kokkos::PerTeam(
team), [&]() {
721 Kokkos::parallel_for(
761 Kokkos::parallel_for(
762 "sizing", range_type(0, nrows),
KOKKOS_LAMBDA(
const size_t row) {
771 KokkosKernels::Impl::kk_exclusive_parallel_prefix_sum<
776 Kokkos::parallel_for(
777 "entries", range_type(0, nrows),
KOKKOS_LAMBDA(
const size_t row) {
810template <
class Scalar,
class LO,
class GO,
class Node>
811Teuchos::RCP<Tpetra::CrsMatrix<Scalar, LO, GO, Node>>
814 using dev_row_view_t =
typename crs_t::local_graph_device_type::row_map_type::non_const_type;
815 using dev_col_view_t =
typename crs_t::local_graph_device_type::entries_type::non_const_type;
816 using dev_val_view_t =
typename crs_t::local_matrix_device_type::values_type::non_const_type;
817#if KOKKOS_VERSION >= 40799
818 using impl_scalar_t =
typename KokkosKernels::ArithTraits<Scalar>::val_type;
820 using impl_scalar_t =
typename Kokkos::ArithTraits<Scalar>::val_type;
822#if KOKKOS_VERSION >= 40799
823 using STS = KokkosKernels::ArithTraits<impl_scalar_t>;
825 using STS = Kokkos::ArithTraits<impl_scalar_t>;
827 using Ordinal =
typename dev_row_view_t::non_const_value_type;
828 using execution_space =
typename Node::execution_space;
829 using range_type = Kokkos::RangePolicy<execution_space, size_t>;
841 Kokkos::parallel_for(
842 "sizing", range_type(0, nrows),
KOKKOS_LAMBDA(
const size_t row) {
855 KokkosKernels::Impl::kk_exclusive_parallel_prefix_sum<
860 Kokkos::parallel_for(
861 "entries", range_type(0, nrows),
KOKKOS_LAMBDA(
const size_t row) {
883template <
class LO,
class GO,
class Node>
884Teuchos::RCP<const Tpetra::Map<LO, GO, Node>>
886 typedef Teuchos::OrdinalTraits<Tpetra::global_size_t>
TOT;
890 using execution_space =
typename Node::execution_space;
891 using range_type = Kokkos::RangePolicy<execution_space, size_t>;
897 Kokkos::parallel_for(
923 Teuchos::RCP<const map_type>
meshMap = Teuchos::rcp(
new map_type(TOT::invalid(),
meshGids(), 0,
pointMap.getComm()));
928template <
class LO,
class GO,
class Node>
929Teuchos::RCP<const Tpetra::Map<LO, GO, Node>>
931 typedef Teuchos::OrdinalTraits<Tpetra::global_size_t>
TOT;
949template <
class Scalar,
class LO,
class GO,
class Node>
950Teuchos::RCP<CrsMatrix<Scalar, LO, GO, Node>>
952 using Teuchos::Array;
953 using Teuchos::ArrayView;
960 using crs_graph_type =
typename block_crs_matrix_type::crs_graph_type;
961 using local_graph_device_type =
typename crs_matrix_type::local_graph_device_type;
962 using local_matrix_device_type =
typename crs_matrix_type::local_matrix_device_type;
963 using row_map_type =
typename local_graph_device_type::row_map_type::non_const_type;
964 using entries_type =
typename local_graph_device_type::entries_type::non_const_type;
965 using values_type =
typename local_matrix_device_type::values_type::non_const_type;
970 using little_block_type =
typename block_crs_matrix_type::const_little_block_type;
971 using offset_type =
typename row_map_type::non_const_value_type;
972 using column_type =
typename entries_type::non_const_value_type;
974 using execution_space =
typename Node::execution_space;
975 using range_type = Kokkos::RangePolicy<execution_space, LO>;
978 const offset_type
bs2 = blocksize * blocksize;
1009 Kokkos::parallel_for(
1013 for (LO
j = 0;
j < blocksize;
j++) {
1023 Kokkos::parallel_for(
1062#define TPETRA_BLOCKCRSMATRIX_HELPERS_INSTANT(S, LO, GO, NODE) \
1063 template void blockCrsMatrixWriter(BlockCrsMatrix<S, LO, GO, NODE> const &A, std::string const &fileName); \
1064 template void blockCrsMatrixWriter(BlockCrsMatrix<S, LO, GO, NODE> const &A, std::string const &fileName, Teuchos::ParameterList const ¶ms); \
1065 template void blockCrsMatrixWriter(BlockCrsMatrix<S, LO, GO, NODE> const &A, std::ostream &os); \
1066 template void blockCrsMatrixWriter(BlockCrsMatrix<S, LO, GO, NODE> const &A, std::ostream &os, Teuchos::ParameterList const ¶ms); \
1067 template void writeMatrixStrip(BlockCrsMatrix<S, LO, GO, NODE> const &A, std::ostream &os, Teuchos::ParameterList const ¶ms); \
1068 template Teuchos::RCP<BlockCrsMatrix<S, LO, GO, NODE>> convertToBlockCrsMatrix(const CrsMatrix<S, LO, GO, NODE> &pointMatrix, const LO &blockSize, bool use_LID); \
1069 template Teuchos::RCP<CrsMatrix<S, LO, GO, NODE>> fillLogicalBlocks(const CrsMatrix<S, LO, GO, NODE> &pointMatrix, const LO &blockSize); \
1070 template Teuchos::RCP<CrsMatrix<S, LO, GO, NODE>> unfillFormerBlockCrs(const CrsMatrix<S, LO, GO, NODE> &pointMatrix); \
1071 template Teuchos::RCP<CrsMatrix<S, LO, GO, NODE>> convertToCrsMatrix(const BlockCrsMatrix<S, LO, GO, NODE> &blockMatrix); \
1072 template Teuchos::RCP<CrsGraph<LO, GO, NODE>> getBlockCrsGraph(const Tpetra::CrsMatrix<S, LO, GO, NODE> &pointMatrix, const LO &blockSize, bool use_local_ID);
1077#define TPETRA_CREATEMESHMAP_INSTANT(LO, GO, NODE) \
1078 template Teuchos::RCP<const Map<LO, GO, NODE>> createMeshMap(const LO &blockSize, const Map<LO, GO, NODE> &pointMap, bool use_local_ID); \
1079 template Teuchos::RCP<const Map<LO, GO, NODE>> createPointMap(const LO &blockSize, const Map<LO, GO, NODE> &blockMap);
Struct that holds views of the contents of a CrsMatrix.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Teuchos::RCP< Tpetra::CrsMatrix< Scalar, LO, GO, Node > > fillLogicalBlocks(const Tpetra::CrsMatrix< Scalar, LO, GO, Node > &pointMatrix, const LO &blockSize)
Fill all point entries in a logical block of a CrsMatrix with zeroes. This should be called before co...
Teuchos::RCP< Tpetra::CrsMatrix< Scalar, LO, GO, Node > > unfillFormerBlockCrs(const Tpetra::CrsMatrix< Scalar, LO, GO, Node > &pointMatrix)
Unfill all point entries in a logical block of a CrsMatrix with zeroes. This can be called after conv...
void writeMatrixStrip(BlockCrsMatrix< Scalar, LO, GO, Node > const &A, std::ostream &os, Teuchos::ParameterList const ¶ms)
Helper function called by blockCrsMatrixWriter.
Teuchos::RCP< Tpetra::CrsGraph< LO, GO, Node > > getBlockCrsGraph(const Tpetra::CrsMatrix< Scalar, LO, GO, Node > &pointMatrix, const LO &blockSize, bool use_local_ID=true)
Non-member constructor that creates the CrsGraph of a BlockCrsMatrix from an existing point CrsMatrix...
Teuchos::RCP< const Tpetra::Map< LO, GO, Node > > createPointMap(LO const &blockSize, const Tpetra::Map< LO, GO, Node > &blockMap)
Helper function to generate a point map from a block map (with a given block size) GIDs associated wi...
Teuchos::RCP< CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > createCrsGraph(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t maxNumEntriesPerRow=0, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Nonmember function to create an empty CrsGraph given a row Map and the max number of entries allowed ...
Teuchos::RCP< CrsMatrix< Scalar, LO, GO, Node > > convertToCrsMatrix(const Tpetra::BlockCrsMatrix< Scalar, LO, GO, Node > &blockMatrix)
Non-member constructor that creates a point CrsMatrix from an existing BlockCrsMatrix.
Teuchos::RCP< const Tpetra::Map< LO, GO, Node > > createMeshMap(LO const &blockSize, const Tpetra::Map< LO, GO, Node > &pointMap, bool use_local_ID=false)
Helper function to generate a mesh map from a point map. Important! It's assumed that point GIDs asso...
void blockCrsMatrixWriter(BlockCrsMatrix< Scalar, LO, GO, Node > const &A, std::string const &fileName)
Helper function to write a BlockCrsMatrix. Calls the 3-argument version.
@ INSERT
Insert new values that don't currently exist.
Teuchos::RCP< BlockCrsMatrix< Scalar, LO, GO, Node > > convertToBlockCrsMatrix(const Tpetra::CrsMatrix< Scalar, LO, GO, Node > &pointMatrix, const LO &blockSize, bool use_local_ID=true)
Non-member constructor that creates a BlockCrsMatrix from an existing point CrsMatrix.