42 #ifndef TPETRA_CRSMATRIX_DECL_HPP 43 #define TPETRA_CRSMATRIX_DECL_HPP 54 #include "Tpetra_RowMatrix_decl.hpp" 55 #include "Tpetra_Exceptions.hpp" 56 #include "Tpetra_DistObject.hpp" 57 #include "Tpetra_CrsGraph.hpp" 58 #include "Tpetra_Vector.hpp" 64 #include "KokkosSparse.hpp" 69 #include "KokkosSparse_sor_sequential_impl.hpp" 124 template<
class CrsMatrixType>
125 Teuchos::RCP<CrsMatrixType>
127 const Import<
typename CrsMatrixType::local_ordinal_type,
128 typename CrsMatrixType::global_ordinal_type,
129 typename CrsMatrixType::node_type>& importer,
130 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
131 typename CrsMatrixType::global_ordinal_type,
132 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
133 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
134 typename CrsMatrixType::global_ordinal_type,
135 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
136 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
191 template<
class CrsMatrixType>
192 Teuchos::RCP<CrsMatrixType>
194 const Import<
typename CrsMatrixType::local_ordinal_type,
195 typename CrsMatrixType::global_ordinal_type,
196 typename CrsMatrixType::node_type>& rowImporter,
197 const Import<
typename CrsMatrixType::local_ordinal_type,
198 typename CrsMatrixType::global_ordinal_type,
199 typename CrsMatrixType::node_type>& domainImporter,
200 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
201 typename CrsMatrixType::global_ordinal_type,
202 typename CrsMatrixType::node_type> >& domainMap,
203 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
204 typename CrsMatrixType::global_ordinal_type,
205 typename CrsMatrixType::node_type> >& rangeMap,
206 const Teuchos::RCP<Teuchos::ParameterList>& params);
241 template<
class CrsMatrixType>
242 Teuchos::RCP<CrsMatrixType>
244 const Export<
typename CrsMatrixType::local_ordinal_type,
245 typename CrsMatrixType::global_ordinal_type,
246 typename CrsMatrixType::node_type>& exporter,
247 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
248 typename CrsMatrixType::global_ordinal_type,
249 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
250 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
251 typename CrsMatrixType::global_ordinal_type,
252 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
253 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
288 template<
class CrsMatrixType>
289 Teuchos::RCP<CrsMatrixType>
291 const Export<
typename CrsMatrixType::local_ordinal_type,
292 typename CrsMatrixType::global_ordinal_type,
293 typename CrsMatrixType::node_type>& rowExporter,
294 const Export<
typename CrsMatrixType::local_ordinal_type,
295 typename CrsMatrixType::global_ordinal_type,
296 typename CrsMatrixType::node_type>& domainExporter,
297 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
298 typename CrsMatrixType::global_ordinal_type,
299 typename CrsMatrixType::node_type> >& domainMap,
300 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
301 typename CrsMatrixType::global_ordinal_type,
302 typename CrsMatrixType::node_type> >& rangeMap,
303 const Teuchos::RCP<Teuchos::ParameterList>& params);
420 template <
class Scalar = ::Tpetra::Details::DefaultTypes::scalar_type,
422 class GlobalOrdinal = ::Tpetra::Details::DefaultTypes::global_ordinal_type,
425 public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
426 public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
463 typedef typename Kokkos::Details::ArithTraits<impl_scalar_type>::mag_type
mag_type;
490 typedef typename local_graph_type::entries_type::non_const_type t_LocalOrdinal_1D
TPETRA_DEPRECATED;
518 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
519 size_t maxNumEntriesPerRow,
521 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
540 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
541 const Teuchos::ArrayRCP<const size_t>& NumEntriesPerRowToAlloc,
543 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
567 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
568 const Teuchos::RCP<const map_type>& colMap,
569 size_t maxNumEntriesPerRow,
571 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
595 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
596 const Teuchos::RCP<const map_type>& colMap,
597 const Teuchos::ArrayRCP<const size_t>& NumEntriesPerRowToAlloc,
599 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
625 explicit CrsMatrix (
const Teuchos::RCP<const crs_graph_type>& graph,
626 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
651 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
652 const Teuchos::RCP<const map_type>& colMap,
653 const typename local_matrix_type::row_map_type& rowPointers,
654 const typename local_graph_type::entries_type::non_const_type& columnIndices,
655 const typename local_matrix_type::values_type& values,
656 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
681 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
682 const Teuchos::RCP<const map_type>& colMap,
683 const Teuchos::ArrayRCP<size_t>& rowPointers,
684 const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
685 const Teuchos::ArrayRCP<Scalar>& values,
686 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
708 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
709 const Teuchos::RCP<const map_type>& colMap,
710 const local_matrix_type& lclMatrix,
711 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
739 CrsMatrix (
const local_matrix_type& lclMatrix,
740 const Teuchos::RCP<const map_type>& rowMap,
741 const Teuchos::RCP<const map_type>& colMap,
742 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
743 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
744 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
747 template <
class S2,
class LO2,
class GO2,
class N2>
774 template <
class Node2>
775 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node2> >
776 clone (
const Teuchos::RCP<Node2>& node2,
777 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const 779 using Teuchos::Array;
780 using Teuchos::ArrayRCP;
781 using Teuchos::ArrayView;
783 using Teuchos::ParameterList;
786 using Teuchos::sublist;
789 const char tfecfFuncName[] =
"clone";
792 bool fillCompleteClone =
true;
793 bool useLocalIndices = this->
hasColMap ();
795 if (! params.is_null ()) {
796 fillCompleteClone = params->get (
"fillComplete clone", fillCompleteClone);
797 useLocalIndices = params->get (
"Locally indexed clone", useLocalIndices);
799 bool staticProfileClone =
true;
800 staticProfileClone = params->get (
"Static profile clone", staticProfileClone);
804 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
805 ! this->
hasColMap () && useLocalIndices, std::runtime_error,
806 ": You requested that the returned clone have local indices, but the " 807 "the source matrix does not have a column Map yet.");
809 RCP<const Map2> clonedRowMap = this->
getRowMap ()->template clone<Node2> (node2);
812 RCP<CrsMatrix2> clonedMatrix;
813 ArrayRCP<const size_t> numEntriesPerRow;
814 size_t numEntriesForAll = 0;
815 bool boundSameForAllLocalRows =
false;
816 staticGraph_->getNumEntriesPerLocalRowUpperBound (numEntriesPerRow,
818 boundSameForAllLocalRows);
819 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
820 numEntriesForAll != 0 &&
821 static_cast<size_t> (numEntriesPerRow.size ()) != 0,
822 std::logic_error,
": getNumEntriesPerLocalRowUpperBound returned a " 823 "nonzero numEntriesForAll = " << numEntriesForAll <<
" , as well as a " 824 "numEntriesPerRow array of nonzero length " << numEntriesPerRow.size ()
825 <<
". This should never happen. Please report this bug to the Tpetra " 827 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
828 numEntriesForAll != 0 && ! boundSameForAllLocalRows,
829 std::logic_error,
": getNumEntriesPerLocalRowUpperBound returned a " 830 "nonzero numEntriesForAll = " << numEntriesForAll <<
" , but claims " 831 "(via its third output value) that the upper bound is not the same for " 832 "all rows. This should never happen. Please report this bug to the " 833 "Tpetra developers.");
834 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
835 numEntriesPerRow.size () != 0 && boundSameForAllLocalRows,
836 std::logic_error,
": getNumEntriesPerLocalRowUpperBound returned a " 837 "numEntriesPerRow array of nonzero length " << numEntriesPerRow.size ()
838 <<
", but claims (via its third output value) that the upper bound is " 839 "not the same for all rows. This should never happen. Please report " 840 "this bug to the Tpetra developers.");
842 RCP<ParameterList> matParams =
843 params.is_null () ? null : sublist (params,
"CrsMatrix");
844 if (useLocalIndices) {
845 RCP<const Map2> clonedColMap =
846 this->
getColMap ()->template clone<Node2> (node2);
847 if (numEntriesPerRow.is_null ()) {
848 clonedMatrix = rcp (
new CrsMatrix2 (clonedRowMap, clonedColMap,
849 numEntriesForAll, pftype,
853 clonedMatrix = rcp (
new CrsMatrix2 (clonedRowMap, clonedColMap,
854 numEntriesPerRow, pftype,
859 if (numEntriesPerRow.is_null ()) {
860 clonedMatrix = rcp (
new CrsMatrix2 (clonedRowMap, numEntriesForAll,
864 clonedMatrix = rcp (
new CrsMatrix2 (clonedRowMap, numEntriesPerRow,
869 numEntriesPerRow = Teuchos::null;
870 numEntriesForAll = 0;
872 if (useLocalIndices) {
873 clonedMatrix->allocateValues (LocalIndices,
874 CrsMatrix2::GraphNotYetAllocated);
876 ArrayView<const LocalOrdinal> linds;
877 ArrayView<const Scalar> vals;
878 for (LocalOrdinal lrow = clonedRowMap->getMinLocalIndex ();
879 lrow <= clonedRowMap->getMaxLocalIndex ();
883 clonedMatrix->insertLocalValues (lrow, linds, vals);
888 Array<LocalOrdinal> linds;
890 for (LocalOrdinal lrow = clonedRowMap->getMinLocalIndex ();
891 lrow <= clonedRowMap->getMaxLocalIndex ();
894 if (theNumEntries > static_cast<size_t> (linds.size ())) {
895 linds.resize (theNumEntries);
897 if (theNumEntries > static_cast<size_t> (vals.size ())) {
898 vals.resize (theNumEntries);
901 linds (), vals (), theNumEntries);
902 if (theNumEntries != 0) {
903 clonedMatrix->insertLocalValues (lrow, linds (0, theNumEntries),
904 vals (0, theNumEntries));
910 clonedMatrix->allocateValues (GlobalIndices,
911 CrsMatrix2::GraphNotYetAllocated);
913 ArrayView<const GlobalOrdinal> ginds;
914 ArrayView<const Scalar> vals;
915 for (GlobalOrdinal grow = clonedRowMap->getMinGlobalIndex ();
916 grow <= clonedRowMap->getMaxGlobalIndex ();
919 if (ginds.size () > 0) {
920 clonedMatrix->insertGlobalValues (grow, ginds, vals);
925 Array<GlobalOrdinal> ginds;
927 for (GlobalOrdinal grow = clonedRowMap->getMinGlobalIndex ();
928 grow <= clonedRowMap->getMaxGlobalIndex ();
931 if (theNumEntries > static_cast<size_t> (ginds.size ())) {
932 ginds.resize (theNumEntries);
934 if (theNumEntries > static_cast<size_t> (vals.size ())) {
935 vals.resize (theNumEntries);
938 if (theNumEntries != 0) {
939 clonedMatrix->insertGlobalValues (grow, ginds (0, theNumEntries),
940 vals (0, theNumEntries));
946 if (fillCompleteClone) {
947 RCP<const Map2> clonedRangeMap;
948 RCP<const Map2> clonedDomainMap;
952 clonedRangeMap = this->
getRangeMap ()->template clone<Node2> (node2);
955 clonedRangeMap = clonedRowMap;
959 clonedDomainMap = this->
getDomainMap ()->template clone<Node2> (node2);
962 clonedDomainMap = clonedRowMap;
965 catch (std::exception &e) {
966 const bool caughtExceptionOnClone =
true;
967 TEUCHOS_TEST_FOR_EXCEPTION
968 (caughtExceptionOnClone, std::runtime_error,
969 Teuchos::typeName (*
this) <<
"::clone: Caught the following " 970 "exception while cloning range and domain Maps on a clone of " 971 "type " << Teuchos::typeName (*clonedMatrix) <<
": " << e.what ());
974 RCP<ParameterList> fillparams =
975 params.is_null () ? Teuchos::null : sublist (params,
"fillComplete");
977 clonedMatrix->fillComplete (clonedDomainMap, clonedRangeMap,
980 catch (std::exception &e) {
981 const bool caughtExceptionOnClone =
true;
982 TEUCHOS_TEST_FOR_EXCEPTION(
983 caughtExceptionOnClone, std::runtime_error,
984 Teuchos::typeName (*
this) <<
"::clone: Caught the following " 985 "exception while calling fillComplete() on a clone of type " 986 << Teuchos::typeName (*clonedMatrix) <<
": " << e.what ());
1070 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1071 const Teuchos::ArrayView<const Scalar>& vals);
1089 const LocalOrdinal numEnt,
1090 const Scalar vals[],
1091 const GlobalOrdinal inds[]);
1135 const Teuchos::ArrayView<const LocalOrdinal> &cols,
1136 const Teuchos::ArrayView<const Scalar> &vals);
1154 const LocalOrdinal numEnt,
1155 const Scalar vals[],
1156 const LocalOrdinal cols[]);
1170 replaceGlobalValuesImpl (impl_scalar_type rowVals[],
1171 const crs_graph_type& graph,
1173 const GlobalOrdinal inds[],
1174 const impl_scalar_type newVals[],
1175 const LocalOrdinal numElts)
const;
1214 template<
class GlobalIndicesViewType,
1215 class ImplScalarViewType>
1218 const typename UnmanagedView<GlobalIndicesViewType>::type& inputInds,
1219 const typename UnmanagedView<ImplScalarViewType>::type& inputVals)
const 1227 static_assert (Kokkos::is_view<GlobalIndicesViewType>::value,
1228 "First template parameter GlobalIndicesViewType must be " 1230 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1231 "Second template parameter ImplScalarViewType must be a " 1233 static_assert (static_cast<int> (GlobalIndicesViewType::rank) == 1,
1234 "First template parameter GlobalIndicesViewType must " 1236 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1237 "Second template parameter ImplScalarViewType must have " 1239 static_assert (std::is_same<
1240 typename GlobalIndicesViewType::non_const_value_type,
1241 global_ordinal_type>::value,
1242 "First template parameter GlobalIndicesViewType must " 1243 "contain values of type global_ordinal_type.");
1244 static_assert (std::is_same<
1245 typename ImplScalarViewType::non_const_value_type,
1246 impl_scalar_type>::value,
1247 "Second template parameter ImplScalarViewType must " 1248 "contain values of type impl_scalar_type.");
1249 typedef LocalOrdinal LO;
1250 const LO numInputEnt = inputInds.extent (0);
1251 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1252 return Teuchos::OrdinalTraits<LO>::invalid ();
1254 const Scalar*
const inVals =
1255 reinterpret_cast<const Scalar*
> (inputVals.data ());
1265 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1266 const Teuchos::ArrayView<const Scalar>& vals)
const;
1285 const LocalOrdinal numEnt,
1286 const Scalar vals[],
1287 const GlobalOrdinal cols[])
const;
1301 replaceLocalValuesImpl (impl_scalar_type rowVals[],
1302 const crs_graph_type& graph,
1304 const LocalOrdinal inds[],
1305 const impl_scalar_type newVals[],
1306 const LocalOrdinal numElts)
const;
1344 template<
class LocalIndicesViewType,
1345 class ImplScalarViewType>
1348 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1349 const typename UnmanagedView<ImplScalarViewType>::type& inputVals)
const 1357 static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1358 "First template parameter LocalIndicesViewType must be " 1360 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1361 "Second template parameter ImplScalarViewType must be a " 1363 static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1364 "First template parameter LocalIndicesViewType must " 1366 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1367 "Second template parameter ImplScalarViewType must have " 1369 static_assert (std::is_same<
1370 typename LocalIndicesViewType::non_const_value_type,
1371 local_ordinal_type>::value,
1372 "First template parameter LocalIndicesViewType must " 1373 "contain values of type local_ordinal_type.");
1374 static_assert (std::is_same<
1375 typename ImplScalarViewType::non_const_value_type,
1376 impl_scalar_type>::value,
1377 "Second template parameter ImplScalarViewType must " 1378 "contain values of type impl_scalar_type.");
1380 typedef LocalOrdinal LO;
1381 const LO numInputEnt = inputInds.extent (0);
1382 if (numInputEnt != inputVals.extent (0)) {
1383 return Teuchos::OrdinalTraits<LO>::invalid ();
1385 const Scalar*
const inVals =
1386 reinterpret_cast<const Scalar*
> (inputVals.data ());
1388 inVals, inputInds.data ());
1396 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1397 const Teuchos::ArrayView<const Scalar>& vals)
const;
1418 const LocalOrdinal numEnt,
1419 const Scalar inputVals[],
1420 const LocalOrdinal inputCols[])
const;
1427 static const bool useAtomicUpdatesByDefault =
1428 #ifdef KOKKOS_ENABLE_SERIAL 1429 ! std::is_same<execution_space, Kokkos::Serial>::value;
1432 #endif // KOKKOS_ENABLE_SERIAL 1458 sumIntoGlobalValuesImpl (impl_scalar_type rowVals[],
1459 const crs_graph_type& graph,
1461 const GlobalOrdinal inds[],
1462 const impl_scalar_type newVals[],
1463 const LocalOrdinal numElts,
1464 const bool atomic = useAtomicUpdatesByDefault)
const;
1505 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1506 const Teuchos::ArrayView<const Scalar>& vals,
1507 const bool atomic = useAtomicUpdatesByDefault);
1533 const LocalOrdinal numEnt,
1534 const Scalar vals[],
1535 const GlobalOrdinal cols[],
1536 const bool atomic = useAtomicUpdatesByDefault);
1552 sumIntoLocalValuesImpl (impl_scalar_type rowVals[],
1553 const crs_graph_type& graph,
1555 const LocalOrdinal inds[],
1556 const impl_scalar_type newVals[],
1557 const LocalOrdinal numElts,
1558 const bool atomic = useAtomicUpdatesByDefault)
const;
1597 template<
class LocalIndicesViewType,
1598 class ImplScalarViewType>
1601 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1602 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1603 const bool atomic = useAtomicUpdatesByDefault)
const 1611 static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1612 "First template parameter LocalIndicesViewType must be " 1614 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1615 "Second template parameter ImplScalarViewType must be a " 1617 static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1618 "First template parameter LocalIndicesViewType must " 1620 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1621 "Second template parameter ImplScalarViewType must have " 1623 static_assert (std::is_same<
1624 typename LocalIndicesViewType::non_const_value_type,
1625 local_ordinal_type>::value,
1626 "First template parameter LocalIndicesViewType must " 1627 "contain values of type local_ordinal_type.");
1628 static_assert (std::is_same<
1629 typename ImplScalarViewType::non_const_value_type,
1630 impl_scalar_type>::value,
1631 "Second template parameter ImplScalarViewType must " 1632 "contain values of type impl_scalar_type.");
1633 typedef LocalOrdinal LO;
1634 const LO numInputEnt = inputInds.extent (0);
1635 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1636 return Teuchos::OrdinalTraits<LO>::invalid ();
1640 reinterpret_cast<const Scalar*> (inputVals.data ()),
1676 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1677 const Teuchos::ArrayView<const Scalar>& vals,
1678 const bool atomic = useAtomicUpdatesByDefault)
const;
1703 const LocalOrdinal numEnt,
1704 const Scalar vals[],
1705 const LocalOrdinal cols[],
1706 const bool atomic = useAtomicUpdatesByDefault)
const;
1740 transformLocalValues (impl_scalar_type rowVals[],
1741 const crs_graph_type& graph,
1743 const LocalOrdinal inds[],
1744 const impl_scalar_type newVals[],
1745 const LocalOrdinal numElts,
1746 std::function<impl_scalar_type (
const impl_scalar_type&,
const impl_scalar_type&) > f,
1747 const bool atomic = useAtomicUpdatesByDefault)
const;
1780 transformGlobalValues (impl_scalar_type rowVals[],
1781 const crs_graph_type& graph,
1783 const GlobalOrdinal inds[],
1784 const impl_scalar_type newVals[],
1785 const LocalOrdinal numElts,
1786 std::function<impl_scalar_type (
const impl_scalar_type&,
const impl_scalar_type&) > f,
1787 const bool atomic = useAtomicUpdatesByDefault)
const;
1816 transformLocalValues (
const LocalOrdinal lclRow,
1817 const LocalOrdinal numInputEnt,
1818 const impl_scalar_type inputVals[],
1819 const LocalOrdinal inputCols[],
1820 std::function<impl_scalar_type (
const impl_scalar_type&,
const impl_scalar_type&) > f,
1821 const bool atomic = useAtomicUpdatesByDefault)
const;
1850 transformGlobalValues (
const GlobalOrdinal gblRow,
1851 const LocalOrdinal numInputEnt,
1852 const impl_scalar_type inputVals[],
1853 const GlobalOrdinal inputCols[],
1854 std::function<impl_scalar_type (
const impl_scalar_type&,
const impl_scalar_type&) > f,
1855 const bool atomic = useAtomicUpdatesByDefault)
const;
1901 template<
class LocalIndicesViewType,
1902 class ImplScalarViewType,
1903 class BinaryFunction>
1906 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1907 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1909 const bool atomic = useAtomicUpdatesByDefault)
const 1917 static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1918 "First template parameter LocalIndicesViewType must be " 1920 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1921 "Second template parameter ImplScalarViewType must be a " 1923 static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1924 "First template parameter LocalIndicesViewType must " 1926 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1927 "Second template parameter ImplScalarViewType must have " 1929 static_assert (std::is_same<
1930 typename LocalIndicesViewType::non_const_value_type,
1931 local_ordinal_type>::value,
1932 "First template parameter LocalIndicesViewType must " 1933 "contain values of type local_ordinal_type.");
1934 static_assert (std::is_same<
1935 typename ImplScalarViewType::non_const_value_type,
1936 impl_scalar_type>::value,
1937 "Second template parameter ImplScalarViewType must " 1938 "contain values of type impl_scalar_type.");
1939 typedef LocalOrdinal LO;
1940 const LO numInputEnt = inputInds.extent (0);
1941 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1942 return Teuchos::OrdinalTraits<LO>::invalid ();
1944 return this->transformLocalValues (lclRow,
1993 template<
class BinaryFunction,
class InputMemorySpace>
1996 const Kokkos::View<
const GlobalOrdinal*,
1998 Kokkos::MemoryUnmanaged>& inputInds,
1999 const Kokkos::View<
const impl_scalar_type*,
2001 Kokkos::MemoryUnmanaged>& inputVals,
2003 const bool atomic = useAtomicUpdatesByDefault)
const 2005 typedef LocalOrdinal LO;
2006 const LO numInputEnt = inputInds.extent (0);
2007 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
2008 return Teuchos::OrdinalTraits<LO>::invalid ();
2010 return this->transformGlobalValues (gblRow,
2022 void scale (
const Scalar& alpha);
2048 setAllValues (
const typename local_matrix_type::row_map_type& ptr,
2049 const typename local_graph_type::entries_type::non_const_type& ind,
2050 const typename local_matrix_type::values_type& val);
2077 const Teuchos::ArrayRCP<LocalOrdinal>& ind,
2078 const Teuchos::ArrayRCP<Scalar>& val);
2081 getAllValues (Teuchos::ArrayRCP<const size_t>& rowPointers,
2082 Teuchos::ArrayRCP<const LocalOrdinal>& columnIndices,
2083 Teuchos::ArrayRCP<const Scalar>& values)
const;
2132 void resumeFill (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2192 fillComplete (
const Teuchos::RCP<const map_type>& domainMap,
2193 const Teuchos::RCP<const map_type>& rangeMap,
2194 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2223 fillComplete (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2253 const Teuchos::RCP<const map_type>& rangeMap,
2254 const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2255 const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2256 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2268 replaceColMap (
const Teuchos::RCP<const map_type>& newColMap);
2353 const Teuchos::RCP<const map_type>& newColMap,
2354 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2355 const bool sortEachRow =
true);
2371 Teuchos::RCP<const import_type>& newImporter);
2394 Teuchos::RCP<const Teuchos::Comm<int> >
getComm()
const override;
2397 Teuchos::RCP<node_type>
getNode ()
const override;
2400 Teuchos::RCP<const map_type>
getRowMap ()
const override;
2403 Teuchos::RCP<const map_type>
getColMap ()
const override;
2406 Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2410 Teuchos::RCP<const crs_graph_type>
getCrsGraph ()
const;
2423 const crs_graph_type& getCrsGraphRef ()
const;
2791 const Teuchos::ArrayView<GlobalOrdinal>& Indices,
2792 const Teuchos::ArrayView<Scalar>& Values,
2793 size_t& NumEntries)
const override;
2814 const Teuchos::ArrayView<LocalOrdinal>& colInds,
2815 const Teuchos::ArrayView<Scalar>& vals,
2816 size_t& numEntries)
const override;
2833 Teuchos::ArrayView<const GlobalOrdinal>& indices,
2834 Teuchos::ArrayView<const Scalar>& values)
const override;
2851 Teuchos::ArrayView<const LocalOrdinal>& indices,
2852 Teuchos::ArrayView<const Scalar>& values)
const override;
2882 LocalOrdinal& numEnt,
2883 const LocalOrdinal*& lclColInds,
2884 const Scalar*& vals)
const override;
2913 LocalOrdinal& numEnt,
2914 const impl_scalar_type*& val,
2915 const LocalOrdinal*& ind)
const;
2924 template<
class OutputScalarType>
2925 typename std::enable_if<! std::is_same<OutputScalarType, impl_scalar_type>::value &&
2926 std::is_convertible<impl_scalar_type, OutputScalarType>::value,
2929 LocalOrdinal& numEnt,
2930 const OutputScalarType*& val,
2931 const LocalOrdinal*& ind)
const 2933 const impl_scalar_type* valTmp = NULL;
2934 const LocalOrdinal err = this->
getLocalRowView (lclRow, numEnt, valTmp, ind);
2937 val =
reinterpret_cast<const OutputScalarType*
> (valTmp);
3018 const Kokkos::View<
const size_t*, device_type,
3019 Kokkos::MemoryUnmanaged>& offsets)
const;
3045 const Teuchos::ArrayView<const size_t>& offsets)
const;
3113 template <
class DomainScalar,
class RangeScalar>
3117 Teuchos::ETransp mode,
3119 RangeScalar beta)
const 3121 using Teuchos::NO_TRANS;
3125 typedef typename MultiVector<RangeScalar, LocalOrdinal, GlobalOrdinal,
3127 #ifdef HAVE_TPETRA_DEBUG 3128 const char tfecfFuncName[] =
"localMultiply: ";
3129 #endif // HAVE_TPETRA_DEBUG 3131 const range_impl_scalar_type theAlpha =
static_cast<range_impl_scalar_type
> (alpha);
3132 const range_impl_scalar_type theBeta =
static_cast<range_impl_scalar_type
> (beta);
3133 const bool conjugate = (mode == Teuchos::CONJ_TRANS);
3134 const bool transpose = (mode != Teuchos::NO_TRANS);
3135 auto X_lcl = X.template getLocalView<device_type> ();
3136 auto Y_lcl = Y.template getLocalView<device_type> ();
3138 #ifdef HAVE_TPETRA_DEBUG 3139 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3141 "X.getNumVectors() = " << X.
getNumVectors () <<
" != Y.getNumVectors() = " 3143 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3145 std::runtime_error,
"NO_TRANS case: X has the wrong number of local rows. " 3146 "X.getLocalLength() = " << X.
getLocalLength () <<
" != getColMap()->" 3147 "getNodeNumElements() = " <<
getColMap ()->getNodeNumElements () <<
".");
3148 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3150 std::runtime_error,
"NO_TRANS case: Y has the wrong number of local rows. " 3151 "Y.getLocalLength() = " << Y.
getLocalLength () <<
" != getRowMap()->" 3152 "getNodeNumElements() = " <<
getRowMap ()->getNodeNumElements () <<
".");
3153 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3155 std::runtime_error,
"TRANS or CONJ_TRANS case: X has the wrong number of " 3156 "local rows. X.getLocalLength() = " << X.
getLocalLength () <<
" != " 3157 "getRowMap()->getNodeNumElements() = " 3158 <<
getRowMap ()->getNodeNumElements () <<
".");
3159 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3161 std::runtime_error,
"TRANS or CONJ_TRANS case: X has the wrong number of " 3162 "local rows. Y.getLocalLength() = " << Y.
getLocalLength () <<
" != " 3163 "getColMap()->getNodeNumElements() = " 3164 <<
getColMap ()->getNodeNumElements () <<
".");
3165 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3166 (! isFillComplete (), std::runtime_error,
"The matrix is not fill " 3167 "complete. You must call fillComplete() (possibly with domain and range " 3168 "Map arguments) without an intervening resumeFill() call before you may " 3169 "call this method.");
3170 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
3172 "X and Y must be constant stride.");
3175 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
3176 X_lcl.data () == Y_lcl.data () &&
3177 X_lcl.data () != NULL,
3178 std::runtime_error,
"X and Y may not alias one another.");
3179 #endif // HAVE_TPETRA_DEBUG 3183 KokkosSparse::spmv (conjugate ? KokkosSparse::ConjugateTranspose : KokkosSparse::Transpose,
3186 X.template getLocalView<device_type> (),
3188 Y.template getLocalView<device_type> ());
3191 KokkosSparse::spmv (KokkosSparse::NoTranspose,
3194 X.template getLocalView<device_type> (),
3196 Y.template getLocalView<device_type> ());
3235 const Teuchos::ETransp mode = Teuchos::NO_TRANS,
3236 const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one (),
3237 const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero ())
const;
3265 template <
class DomainScalar,
class RangeScalar>
3270 const RangeScalar& dampingFactor,
3273 typedef LocalOrdinal LO;
3274 typedef GlobalOrdinal GO;
3277 typedef typename Node::device_type::memory_space dev_mem_space;
3278 typedef Kokkos::HostSpace host_mem_space;
3280 typedef typename k_local_graph_type::size_type offset_type;
3281 const char prefix[] =
"Tpetra::CrsMatrix::localGaussSeidel: ";
3283 TEUCHOS_TEST_FOR_EXCEPTION
3284 (! this->isFillComplete (), std::runtime_error,
3285 prefix <<
"The matrix is not fill complete.");
3288 TEUCHOS_TEST_FOR_EXCEPTION
3290 prefix <<
"B.getNumVectors() = " << numVecs <<
" != " 3292 TEUCHOS_TEST_FOR_EXCEPTION
3295 <<
" != this->getNodeNumRows() = " << lclNumRows <<
".");
3300 const_cast<DMV&
> (B).
template sync<host_mem_space> ();
3301 X.template sync<host_mem_space> ();
3302 X.template modify<host_mem_space> ();
3303 const_cast<MMV&
> (D).
template sync<host_mem_space> ();
3305 auto B_lcl = B.template getLocalView<host_mem_space> ();
3306 auto X_lcl = X.template getLocalView<host_mem_space> ();
3307 auto D_lcl = D.template getLocalView<host_mem_space> ();
3309 offset_type B_stride[8], X_stride[8], D_stride[8];
3310 B_lcl.stride (B_stride);
3311 X_lcl.stride (X_stride);
3312 D_lcl.stride (D_stride);
3315 k_local_graph_type lclGraph = lclMatrix.graph;
3316 typename local_matrix_type::row_map_type ptr = lclGraph.row_map;
3317 typename local_matrix_type::index_type ind = lclGraph.entries;
3318 typename local_matrix_type::values_type val = lclMatrix.values;
3319 const offset_type*
const ptrRaw = ptr.data ();
3320 const LO*
const indRaw = ind.data ();
3321 const impl_scalar_type*
const valRaw = val.data ();
3323 const std::string dir ((direction == Forward) ?
"F" :
"B");
3329 KokkosSparse::Impl::Sequential::gaussSeidel (static_cast<LO> (lclNumRows),
3330 static_cast<LO> (numVecs),
3331 ptrRaw, indRaw, valRaw,
3332 B_lcl.data (), B_stride[1],
3333 X_lcl.data (), X_stride[1],
3335 static_cast<impl_scalar_type
> (dampingFactor),
3337 const_cast<DMV&
> (B).
template sync<dev_mem_space> ();
3338 X.template sync<dev_mem_space> ();
3339 const_cast<MMV&
> (D).
template sync<dev_mem_space> ();
3368 template <
class DomainScalar,
class RangeScalar>
3373 const Teuchos::ArrayView<LocalOrdinal>& rowIndices,
3374 const RangeScalar& dampingFactor,
3377 typedef LocalOrdinal LO;
3378 typedef GlobalOrdinal GO;
3381 typedef typename Node::device_type::memory_space dev_mem_space;
3382 typedef Kokkos::HostSpace host_mem_space;
3384 typedef typename k_local_graph_type::size_type offset_type;
3385 const char prefix[] =
"Tpetra::CrsMatrix::reorderedLocalGaussSeidel: ";
3387 TEUCHOS_TEST_FOR_EXCEPTION
3388 (! this->isFillComplete (), std::runtime_error,
3389 prefix <<
"The matrix is not fill complete.");
3392 TEUCHOS_TEST_FOR_EXCEPTION
3394 prefix <<
"B.getNumVectors() = " << numVecs <<
" != " 3396 TEUCHOS_TEST_FOR_EXCEPTION
3399 <<
" != this->getNodeNumRows() = " << lclNumRows <<
".");
3400 TEUCHOS_TEST_FOR_EXCEPTION
3401 (static_cast<size_t> (rowIndices.size ()) < lclNumRows,
3402 std::invalid_argument, prefix <<
"rowIndices.size() = " 3403 << rowIndices.size () <<
" < this->getNodeNumRows() = " 3404 << lclNumRows <<
".");
3409 const_cast<DMV&
> (B).
template sync<host_mem_space> ();
3410 X.template sync<host_mem_space> ();
3411 X.template modify<host_mem_space> ();
3412 const_cast<MMV&
> (D).
template sync<host_mem_space> ();
3414 auto B_lcl = B.template getLocalView<host_mem_space> ();
3415 auto X_lcl = X.template getLocalView<host_mem_space> ();
3416 auto D_lcl = D.template getLocalView<host_mem_space> ();
3418 offset_type B_stride[8], X_stride[8], D_stride[8];
3419 B_lcl.stride (B_stride);
3420 X_lcl.stride (X_stride);
3421 D_lcl.stride (D_stride);
3425 typename local_matrix_type::index_type ind = lclGraph.entries;
3426 typename local_matrix_type::row_map_type ptr = lclGraph.row_map;
3427 typename local_matrix_type::values_type val = lclMatrix.values;
3428 const offset_type*
const ptrRaw = ptr.data ();
3429 const LO*
const indRaw = ind.data ();
3430 const impl_scalar_type*
const valRaw = val.data ();
3432 const std::string dir = (direction == Forward) ?
"F" :
"B";
3437 KokkosSparse::Impl::Sequential::reorderedGaussSeidel (static_cast<LO> (lclNumRows),
3438 static_cast<LO> (numVecs),
3439 ptrRaw, indRaw, valRaw,
3445 rowIndices.getRawPtr (),
3446 static_cast<LO
> (lclNumRows),
3447 static_cast<impl_scalar_type> (dampingFactor),
3449 const_cast<DMV&
> (B).
template sync<dev_mem_space> ();
3450 X.template sync<dev_mem_space> ();
3451 const_cast<MMV&
> (D).
template sync<dev_mem_space> ();
3457 Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
3477 Teuchos::ETransp mode = Teuchos::NO_TRANS,
3478 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
3479 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const override;
3491 Teuchos::RCP<const map_type>
getDomainMap ()
const override;
3499 Teuchos::RCP<const map_type>
getRangeMap ()
const override;
3573 const Scalar& dampingFactor,
3575 const int numSweeps)
const;
3647 const Teuchos::ArrayView<LocalOrdinal>& rowIndices,
3648 const Scalar& dampingFactor,
3650 const int numSweeps)
const;
3684 const Scalar& dampingFactor,
3686 const int numSweeps,
3687 const bool zeroInitialGuess)
const;
3722 const Teuchos::ArrayView<LocalOrdinal>& rowIndices,
3723 const Scalar& dampingFactor,
3725 const int numSweeps,
3726 const bool zeroInitialGuess)
const;
3738 virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
3739 add (
const Scalar& alpha,
3744 const Teuchos::RCP<Teuchos::ParameterList>& params)
const override;
3756 describe (Teuchos::FancyOStream& out,
3757 const Teuchos::EVerbosityLevel verbLevel =
3758 Teuchos::Describable::verbLevel_default)
const override;
3768 typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
3794 const size_t numSameIDs,
3795 const LocalOrdinal permuteToLIDs[],
3796 const LocalOrdinal permuteFromLIDs[],
3797 const size_t numPermutes);
3802 const size_t numSameIDs,
3803 const Kokkos::DualView<const local_ordinal_type*, device_type>& permuteToLIDs,
3804 const Kokkos::DualView<const local_ordinal_type*, device_type>& permuteFromLIDs)
override;
3808 const Kokkos::DualView<const local_ordinal_type*, device_type>& exportLIDs,
3809 Kokkos::DualView<char*, buffer_device_type>& exports,
3810 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3811 size_t& constantNumPackets,
3818 unpackAndCombineNewImpl (
const Kokkos::DualView<const LocalOrdinal*, device_type>& importLIDs,
3819 const Kokkos::DualView<const char*, buffer_device_type>& imports,
3820 const Kokkos::DualView<const size_t*, buffer_device_type>& numPacketsPerLID,
3821 const size_t constantNumPackets,
3824 const bool atomic = useAtomicUpdatesByDefault);
3828 unpackAndCombineNewImplNonStatic (
const Kokkos::DualView<const LocalOrdinal*, device_type>& importLIDs,
3829 const Kokkos::DualView<const char*, buffer_device_type>& imports,
3830 const Kokkos::DualView<const size_t*, buffer_device_type>& numPacketsPerLID,
3831 const size_t constantNumPackets,
3847 unpackAndCombineNew (
const Kokkos::DualView<const local_ordinal_type*, device_type>& importLIDs,
3848 const Kokkos::DualView<const char*, buffer_device_type>& imports,
3849 const Kokkos::DualView<const size_t*, buffer_device_type>& numPacketsPerLID,
3850 const size_t constantNumPackets,
3962 packNew (
const Kokkos::DualView<const local_ordinal_type*, device_type>& exportLIDs,
3963 Kokkos::DualView<char*, buffer_device_type>& exports,
3964 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3965 size_t& constantNumPackets,
3976 packNonStaticNew (
const Kokkos::DualView<const local_ordinal_type*, device_type>& exportLIDs,
3977 Kokkos::DualView<char*, buffer_device_type>& exports,
3978 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3979 size_t& constantNumPackets,
4012 packRow (
char exports[],
4013 const size_t offset,
4014 const size_t numEnt,
4015 const GlobalOrdinal gidsIn[],
4016 const impl_scalar_type valsIn[],
4017 const size_t numBytesPerValue)
const;
4043 packRowStatic (
char*
const numEntOut,
4046 const size_t numEnt,
4047 const LocalOrdinal lclRow)
const;
4075 unpackRow (GlobalOrdinal gidsOut[],
4076 impl_scalar_type valsOut[],
4077 const char imports[],
4078 const size_t offset,
4079 const size_t numBytes,
4080 const size_t numEnt,
4081 const size_t numBytesPerValue);
4092 allocatePackSpaceNew (Kokkos::DualView<char*, buffer_device_type>& exports,
4093 size_t& totalNumEntries,
4094 const Kokkos::DualView<const local_ordinal_type*, device_type>& exportLIDs)
const;
4105 template<
class CrsMatrixType>
4106 friend Teuchos::RCP<CrsMatrixType>
4108 const Import<
typename CrsMatrixType::local_ordinal_type,
4109 typename CrsMatrixType::global_ordinal_type,
4110 typename CrsMatrixType::node_type>& importer,
4111 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4112 typename CrsMatrixType::global_ordinal_type,
4113 typename CrsMatrixType::node_type> >& domainMap,
4114 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4115 typename CrsMatrixType::global_ordinal_type,
4116 typename CrsMatrixType::node_type> >& rangeMap,
4117 const Teuchos::RCP<Teuchos::ParameterList>& params);
4120 template<
class CrsMatrixType>
4121 friend Teuchos::RCP<CrsMatrixType>
4123 const Import<
typename CrsMatrixType::local_ordinal_type,
4124 typename CrsMatrixType::global_ordinal_type,
4125 typename CrsMatrixType::node_type>& rowImporter,
4126 const Import<
typename CrsMatrixType::local_ordinal_type,
4127 typename CrsMatrixType::global_ordinal_type,
4128 typename CrsMatrixType::node_type>& domainImporter,
4129 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4130 typename CrsMatrixType::global_ordinal_type,
4131 typename CrsMatrixType::node_type> >& domainMap,
4132 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4133 typename CrsMatrixType::global_ordinal_type,
4134 typename CrsMatrixType::node_type> >& rangeMap,
4135 const Teuchos::RCP<Teuchos::ParameterList>& params);
4139 template<
class CrsMatrixType>
4140 friend Teuchos::RCP<CrsMatrixType>
4142 const Export<
typename CrsMatrixType::local_ordinal_type,
4143 typename CrsMatrixType::global_ordinal_type,
4144 typename CrsMatrixType::node_type>& exporter,
4145 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4146 typename CrsMatrixType::global_ordinal_type,
4147 typename CrsMatrixType::node_type> >& domainMap,
4148 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4149 typename CrsMatrixType::global_ordinal_type,
4150 typename CrsMatrixType::node_type> >& rangeMap,
4151 const Teuchos::RCP<Teuchos::ParameterList>& params);
4154 template<
class CrsMatrixType>
4155 friend Teuchos::RCP<CrsMatrixType>
4157 const Export<
typename CrsMatrixType::local_ordinal_type,
4158 typename CrsMatrixType::global_ordinal_type,
4159 typename CrsMatrixType::node_type>& rowExporter,
4160 const Export<
typename CrsMatrixType::local_ordinal_type,
4161 typename CrsMatrixType::global_ordinal_type,
4162 typename CrsMatrixType::node_type>& domainExporter,
4163 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4164 typename CrsMatrixType::global_ordinal_type,
4165 typename CrsMatrixType::node_type> >& domainMap,
4166 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4167 typename CrsMatrixType::global_ordinal_type,
4168 typename CrsMatrixType::node_type> >& rangeMap,
4169 const Teuchos::RCP<Teuchos::ParameterList>& params);
4189 const import_type& importer,
4190 const Teuchos::RCP<const map_type>& domainMap,
4191 const Teuchos::RCP<const map_type>& rangeMap,
4192 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
4211 const import_type& rowImporter,
4212 const import_type& domainImporter,
4213 const Teuchos::RCP<const map_type>& domainMap,
4214 const Teuchos::RCP<const map_type>& rangeMap,
4215 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
4235 const export_type& exporter,
4236 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
4237 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
4238 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
4257 const export_type& rowExporter,
4258 const export_type& domainExporter,
4259 const Teuchos::RCP<const map_type>& domainMap,
4260 const Teuchos::RCP<const map_type>& rangeMap,
4261 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
4287 const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
4288 const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> > & domainTransfer,
4289 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
4290 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
4291 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
4313 insertGlobalValuesImpl (crs_graph_type& graph,
4315 const GlobalOrdinal gblColInds[],
4316 const impl_scalar_type vals[],
4317 const size_t numInputEnt);
4329 insertGlobalValuesFiltered (
const GlobalOrdinal globalRow,
4330 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
4331 const Teuchos::ArrayView<const Scalar>& values);
4345 combineGlobalValues (
const GlobalOrdinal globalRowIndex,
4346 const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
4347 const Teuchos::ArrayView<const Scalar>& values,
4368 combineGlobalValuesRaw (
const LocalOrdinal lclRow,
4369 const LocalOrdinal numEnt,
4370 const impl_scalar_type vals[],
4371 const GlobalOrdinal cols[],
4385 template<
class BinaryFunction>
4387 transformGlobalValues (
const GlobalOrdinal globalRow,
4388 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
4389 const Teuchos::ArrayView<const Scalar>& values,
4391 const bool atomic = useAtomicUpdatesByDefault)
const 4393 typedef impl_scalar_type IST;
4394 typedef LocalOrdinal LO;
4395 typedef GlobalOrdinal GO;
4397 const LO numInputEnt =
static_cast<LO
> (indices.size ());
4398 if (static_cast<LO> (values.size ()) != numInputEnt) {
4399 return Teuchos::OrdinalTraits<LO>::invalid ();
4402 const GO*
const inputCols = indices.getRawPtr ();
4403 const IST*
const inputVals =
4404 reinterpret_cast<const IST*
> (values.getRawPtr ());
4405 return this->transformGlobalValues (globalRow, numInputEnt, inputVals,
4406 inputCols, f, atomic);
4416 insertNonownedGlobalValues (
const GlobalOrdinal globalRow,
4417 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
4418 const Teuchos::ArrayView<const Scalar>& values);
4463 insertIndicesAndValues (crs_graph_type& graph,
4465 const typename crs_graph_type::SLocalGlobalViews& newInds,
4466 const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
4467 const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
4468 const ELocalGlobal lg,
4469 const ELocalGlobal I);
4476 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
4477 typedef Kokkos::Details::ArithTraits<impl_scalar_type> STS;
4478 typedef Kokkos::Details::ArithTraits<mag_type> STM;
4481 typedef crs_graph_type
Graph;
4484 enum GraphAllocationStatus {
4485 GraphAlreadyAllocated,
4486 GraphNotYetAllocated
4493 Teuchos::ArrayRCP<Teuchos::Array<impl_scalar_type> >
4494 allocateValues2D ();
4513 void allocateValues (ELocalGlobal lg, GraphAllocationStatus gas);
4618 const bool force =
false)
const;
4643 const bool force =
false)
const;
4656 const Teuchos::ETransp mode,
4682 LocalOrdinal& numEnt,
4683 const RowInfo& rowinfo)
const;
4705 LocalOrdinal& numEnt,
4706 const RowInfo& rowinfo)
const;
4715 Teuchos::ArrayView<const impl_scalar_type>
getView (
RowInfo rowinfo)
const;
4728 Teuchos::ArrayView<impl_scalar_type>
4739 Kokkos::View<const impl_scalar_type*, execution_space, Kokkos::MemoryUnmanaged>
4740 getRowView (
const RowInfo& rowInfo)
const;
4753 Kokkos::View<impl_scalar_type*, execution_space, Kokkos::MemoryUnmanaged>
4754 getRowViewNonConst (
const RowInfo& rowInfo)
const;
4763 void fillLocalMatrix (
const Teuchos::RCP<Teuchos::ParameterList>& params);
4787 Teuchos::RCP<const Graph> staticGraph_;
4788 Teuchos::RCP< Graph> myGraph_;
4807 typename local_matrix_type::values_type k_values1D_;
4808 Teuchos::ArrayRCP<Teuchos::Array<impl_scalar_type> > values2D_;
4852 std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4867 template<
class ViewType,
class OffsetViewType>
4868 struct pack_functor {
4872 OffsetViewType src_offset_;
4873 OffsetViewType dst_offset_;
4874 typedef typename OffsetViewType::non_const_value_type scalar_index_type;
4876 pack_functor (ViewType dst, ViewType src,
4877 OffsetViewType dst_offset, OffsetViewType src_offset) :
4880 src_offset_ (src_offset),
4881 dst_offset_ (dst_offset)
4884 KOKKOS_INLINE_FUNCTION
4885 void operator () (
const LocalOrdinal row)
const {
4886 scalar_index_type srcPos = src_offset_(row);
4887 const scalar_index_type dstEnd = dst_offset_(row+1);
4888 scalar_index_type dstPos = dst_offset_(row);
4889 for ( ; dstPos < dstEnd; ++dstPos, ++srcPos) {
4890 dst_(dstPos) = src_(srcPos);
4905 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
4906 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4908 size_t maxNumEntriesPerRow = 0,
4909 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
4912 return Teuchos::rcp (
new matrix_type (map, maxNumEntriesPerRow,
4916 template<
class CrsMatrixType>
4917 Teuchos::RCP<CrsMatrixType>
4919 const Import<
typename CrsMatrixType::local_ordinal_type,
4920 typename CrsMatrixType::global_ordinal_type,
4921 typename CrsMatrixType::node_type>& importer,
4922 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4923 typename CrsMatrixType::global_ordinal_type,
4924 typename CrsMatrixType::node_type> >& domainMap,
4925 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4926 typename CrsMatrixType::global_ordinal_type,
4927 typename CrsMatrixType::node_type> >& rangeMap,
4928 const Teuchos::RCP<Teuchos::ParameterList>& params)
4930 Teuchos::RCP<CrsMatrixType> destMatrix;
4931 sourceMatrix->importAndFillComplete (destMatrix, importer, domainMap, rangeMap, params);
4935 template<
class CrsMatrixType>
4936 Teuchos::RCP<CrsMatrixType>
4938 const Import<
typename CrsMatrixType::local_ordinal_type,
4939 typename CrsMatrixType::global_ordinal_type,
4940 typename CrsMatrixType::node_type>& rowImporter,
4941 const Import<
typename CrsMatrixType::local_ordinal_type,
4942 typename CrsMatrixType::global_ordinal_type,
4943 typename CrsMatrixType::node_type>& domainImporter,
4944 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4945 typename CrsMatrixType::global_ordinal_type,
4946 typename CrsMatrixType::node_type> >& domainMap,
4947 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4948 typename CrsMatrixType::global_ordinal_type,
4949 typename CrsMatrixType::node_type> >& rangeMap,
4950 const Teuchos::RCP<Teuchos::ParameterList>& params)
4952 Teuchos::RCP<CrsMatrixType> destMatrix;
4953 sourceMatrix->importAndFillComplete (destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4957 template<
class CrsMatrixType>
4958 Teuchos::RCP<CrsMatrixType>
4960 const Export<
typename CrsMatrixType::local_ordinal_type,
4961 typename CrsMatrixType::global_ordinal_type,
4962 typename CrsMatrixType::node_type>& exporter,
4963 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4964 typename CrsMatrixType::global_ordinal_type,
4965 typename CrsMatrixType::node_type> >& domainMap,
4966 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4967 typename CrsMatrixType::global_ordinal_type,
4968 typename CrsMatrixType::node_type> >& rangeMap,
4969 const Teuchos::RCP<Teuchos::ParameterList>& params)
4971 Teuchos::RCP<CrsMatrixType> destMatrix;
4972 sourceMatrix->exportAndFillComplete (destMatrix, exporter, domainMap, rangeMap, params);
4976 template<
class CrsMatrixType>
4977 Teuchos::RCP<CrsMatrixType>
4979 const Export<
typename CrsMatrixType::local_ordinal_type,
4980 typename CrsMatrixType::global_ordinal_type,
4981 typename CrsMatrixType::node_type>& rowExporter,
4982 const Export<
typename CrsMatrixType::local_ordinal_type,
4983 typename CrsMatrixType::global_ordinal_type,
4984 typename CrsMatrixType::node_type>& domainExporter,
4985 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4986 typename CrsMatrixType::global_ordinal_type,
4987 typename CrsMatrixType::node_type> >& domainMap,
4988 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4989 typename CrsMatrixType::global_ordinal_type,
4990 typename CrsMatrixType::node_type> >& rangeMap,
4991 const Teuchos::RCP<Teuchos::ParameterList>& params)
4993 Teuchos::RCP<CrsMatrixType> destMatrix;
4994 sourceMatrix->exportAndFillComplete (destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
5006 #endif // TPETRA_CRSMATRIX_DECL_HPP Base class for distributed Tpetra objects that support data redistribution.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const override
Compute a sparse matrix-MultiVector multiply.
Teuchos::RCP< const map_type > getDomainMap() const override
The domain Map of this matrix.
bool isLowerTriangularImpl() const override
DO NOT CALL THIS METHOD; THIS IS NOT FOR USERS.
global_size_t getGlobalNumDiagsImpl() const override
DO NOT CALL THIS METHOD; THIS IS NOT FOR USERS.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
global_size_t getGlobalNumEntries() const override
The global number of entries in this matrix.
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &offsets) const
Get offsets of the diagonal entries in the matrix.
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
local_matrix_type::row_map_type::non_const_type t_RowPtrsNC TPETRA_DEPRECATED
DEPRECATED; use local_matrix_type::row_map_type::non_const_type instead.
LocalOrdinal getLocalRowViewRaw(const LocalOrdinal lclRow, LocalOrdinal &numEnt, const LocalOrdinal *&lclColInds, const Scalar *&vals) const override
Get a constant, nonpersisting, locally indexed view of the given row of the matrix, using "raw" pointers instead of Teuchos::ArrayView.
Teuchos::RCP< CrsMatrixType > exportAndFillCompleteCrsMatrix(const Teuchos::RCP< const CrsMatrixType > &sourceMatrix, const Export< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &exporter, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Nonmember CrsMatrix constructor that fuses Export and fillComplete().
Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > createCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t maxNumEntriesPerRow=0, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Non-member function to create an empty CrsMatrix given a row map and a non-zero profile.
Teuchos::RCP< MV > importMV_
Column Map MultiVector used in apply() and gaussSeidel().
void gaussSeidel(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const Scalar &dampingFactor, const ESweepDirection direction, const int numSweeps) const
"Hybrid" Jacobi + (Gauss-Seidel or SOR) on .
local_matrix_type::row_map_type t_RowPtrs TPETRA_DEPRECATED
DEPRECATED; use local_matrix_type::row_map_type instead.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const override
Print this object with the given verbosity level to the given output stream.
Teuchos::ArrayView< const impl_scalar_type > getView(RowInfo rowinfo) const
Constant view of all entries (including extra space) in the given row.
bool hasTransposeApply() const override
Whether apply() allows applying the transpose or conjugate transpose.
bool isStaticGraph() const
Indicates that the graph is static, so that new entries cannot be added to this matrix.
size_t mergeRowIndicesAndValues(crs_graph_type &graph, const RowInfo &rowInfo)
Merge duplicate row indices in the given row, along with their corresponding values.
A distributed dense vector.
std::map< GlobalOrdinal, std::pair< Teuchos::Array< GlobalOrdinal >, Teuchos::Array< Scalar > > > nonlocals_
Nonlocal data added using insertGlobalValues().
void getGlobalRowCopy(GlobalOrdinal GlobalRow, const Teuchos::ArrayView< GlobalOrdinal > &Indices, const Teuchos::ArrayView< Scalar > &Values, size_t &NumEntries) const override
Fill given arrays with a deep copy of the locally owned entries of the matrix in a given row...
void importAndFillComplete(Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &destMatrix, const import_type &importer, const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null) const
Import from this to the given destination matrix, and make the result fill complete.
void fillLocalMatrix(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Fill data into the local matrix.
KokkosSparse::CrsMatrix< impl_scalar_type, LocalOrdinal, execution_space, void, typename local_graph_type::size_type > local_matrix_type
The specialization of Kokkos::CrsMatrix that represents the part of the sparse matrix on each MPI pro...
Scalar scalar_type
This class' first template parameter; the type of each entry in the matrix.
Classes::Export< LocalOrdinal, GlobalOrdinal, Node > Export
Alias for Tpetra::Classes::Export.
void getLocalRowView(LocalOrdinal LocalRow, Teuchos::ArrayView< const LocalOrdinal > &indices, Teuchos::ArrayView< const Scalar > &values) const override
Get a constant, nonpersisting view of a row of this matrix, using local row and column indices...
size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const override
Number of entries in the sparse matrix in the given local row, on the calling (MPI) process...
One or more distributed dense vectors.
void globalAssemble()
Communicate nonlocal contributions to other processes.
Teuchos::RCP< const map_type > getRowMap() const override
The Map that describes the row distribution in this matrix.
GlobalOrdinal getIndexBase() const override
The index base for global indices for this matrix.
Map< LocalOrdinal, GlobalOrdinal, Node > map_type
The Map specialization suitable for this CrsMatrix specialization.
Kokkos::Details::ArithTraits< Scalar >::val_type impl_scalar_type
The type used internally in place of Scalar.
Classes::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > CrsMatrix
Alias for Tpetra::Classes::CrsMatrix.
bool isUpperTriangularImpl() const override
DO NOT CALL THIS METHOD; THIS IS NOT FOR USERS.
size_t getNodeNumRows() const override
The number of matrix rows owned by the calling process.
Declaration and generic definition of traits class that tells Tpetra::CrsMatrix how to pack and unpac...
DistObject< SC, LO, GO, NT >::buffer_device_type buffer_device_type
Kokkos::Device specialization for communication buffers.
void getGlobalRowView(GlobalOrdinal GlobalRow, Teuchos::ArrayView< const GlobalOrdinal > &indices, Teuchos::ArrayView< const Scalar > &values) const override
Get a constant, nonpersisting view of a row of this matrix, using global row and column indices...
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the left with the given Vector.
virtual bool checkSizes(const SrcDistObject &source) override
Compare the source and target (this) objects for compatibility.
bool isGloballyIndexed() const override
Whether the matrix is globally indexed on the calling process.
std::enable_if<! std::is_same< OutputScalarType, impl_scalar_type >::value &&std::is_convertible< impl_scalar_type, OutputScalarType >::value, LocalOrdinal >::type getLocalRowView(const LocalOrdinal lclRow, LocalOrdinal &numEnt, const OutputScalarType *&val, const LocalOrdinal *&ind) const
Get a constant, nonpersisting view of a row of this matrix, using local row and column indices...
Teuchos::RCP< node_type > getNode() const override
The Kokkos Node instance.
local_matrix_type::values_type getLocalValuesView() const
Get the Kokkos local values.
ProfileType getProfileType() const
Returns true if the matrix was allocated with static data structures.
Classes::Import< LocalOrdinal, GlobalOrdinal, Node > Import
Alias for Tpetra::Classes::Import.
size_t getLocalLength() const
Local number of rows on the calling process.
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
bool isFillActive() const
Whether the matrix is not fill complete.
LocalOrdinal sumIntoGlobalValues(const GlobalOrdinal globalRow, const Teuchos::ArrayView< const GlobalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals, const bool atomic=useAtomicUpdatesByDefault)
Sum into one or more sparse matrix entries, using global indices.
Teuchos::RCP< const RowGraph< LocalOrdinal, GlobalOrdinal, Node > > getGraph() const override
This matrix's graph, as a RowGraph.
void replaceDomainMapAndImporter(const Teuchos::RCP< const map_type > &newDomainMap, Teuchos::RCP< const import_type > &newImporter)
Replace the current domain Map and Import with the given objects.
Allocation information for a locally owned row in a CrsGraph or CrsMatrix.
LocalOrdinal sumIntoLocalValues(const LocalOrdinal localRow, const typename UnmanagedView< LocalIndicesViewType >::type &inputInds, const typename UnmanagedView< ImplScalarViewType >::type &inputVals, const bool atomic=useAtomicUpdatesByDefault) const
Sum into one or more sparse matrix entries, using local row and column indices.
int local_ordinal_type
Default value of Scalar template parameter.
Classes::Map< LocalOrdinal, GlobalOrdinal, Node > Map
Alias for Tpetra::Classes::Map.
void clearGlobalConstants()
Clear matrix properties that require collectives.
void reorderedGaussSeidelCopy(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const Teuchos::ArrayView< LocalOrdinal > &rowIndices, const Scalar &dampingFactor, const ESweepDirection direction, const int numSweeps, const bool zeroInitialGuess) const
Version of reorderedGaussSeidel(), with fewer requirements on X.
size_t getNumVectors() const
Number of columns in the multivector.
size_t getNodeNumEntries() const override
The local number of entries in this matrix.
::Tpetra::Details::EStorageStatus storageStatus_
Status of the matrix's storage, when not in a fill-complete state.
LocalOrdinal transformLocalValues(const LocalOrdinal lclRow, const typename UnmanagedView< LocalIndicesViewType >::type &inputInds, const typename UnmanagedView< ImplScalarViewType >::type &inputVals, BinaryFunction f, const bool atomic=useAtomicUpdatesByDefault) const
Transform CrsMatrix entries in place, using local indices to select the entries in the row to transfo...
crs_graph_type::local_graph_type local_graph_type
The part of the sparse matrix's graph on each MPI process.
Node::device_type device_type
The Kokkos device type.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag) const override
Get a copy of the diagonal entries of the matrix.
void localGaussSeidel(const MultiVector< DomainScalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< RangeScalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const RangeScalar &dampingFactor, const ESweepDirection direction) const
Gauss-Seidel or SOR on .
local_matrix_type k_local_matrix_type TPETRA_DEPRECATED
DEPRECATED; use local_matrix_type instead.
void packNew(const Kokkos::DualView< const local_ordinal_type *, device_type > &exportLIDs, Kokkos::DualView< char *, buffer_device_type > &exports, const Kokkos::DualView< size_t *, buffer_device_type > &numPacketsPerLID, size_t &constantNumPackets, Distributor &dist) const
Pack this object's data for an Import or Export.
Sparse matrix that presents a row-oriented interface that lets users read or modify entries...
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the right with the given Vector.
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
The communicator over which the matrix is distributed.
size_t global_size_t
Global size_t object.
void sortAndMergeIndicesAndValues(const bool sorted, const bool merged)
Sort and merge duplicate local column indices in all rows on the calling process, along with their co...
Teuchos::RCP< const map_type > getColMap() const override
The Map that describes the column distribution in this matrix.
void insertLocalValues(const LocalOrdinal localRow, const Teuchos::ArrayView< const LocalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals)
Insert one or more entries into the matrix, using local column indices.
void applyNonTranspose(const MV &X_in, MV &Y_in, Scalar alpha, Scalar beta) const
Special case of apply() for mode == Teuchos::NO_TRANS.
Export< LocalOrdinal, GlobalOrdinal, Node > export_type
The Export specialization suitable for this CrsMatrix specialization.
Teuchos::RCP< MV > exportMV_
Row Map MultiVector used in apply().
size_t getNodeNumDiagsImpl() const override
DO NOT CALL THIS METHOD; THIS IS NOT FOR USERS.
void replaceColMap(const Teuchos::RCP< const map_type > &newColMap)
Replace the matrix's column Map with the given Map.
bool isFillComplete() const override
Whether the matrix is fill complete.
LocalOrdinal getViewRawConst(const impl_scalar_type *&vals, LocalOrdinal &numEnt, const RowInfo &rowinfo) const
Const pointer to all entries (including extra space) in the given row.
Import< LocalOrdinal, GlobalOrdinal, Node > import_type
The Import specialization suitable for this CrsMatrix specialization.
size_t getNodeNumCols() const override
The number of columns connected to the locally owned rows of this matrix.
ESweepDirection
Sweep direction for Gauss-Seidel or Successive Over-Relaxation (SOR).
Teuchos::RCP< MV > getColumnMapMultiVector(const MV &X_domainMap, const bool force=false) const
Create a (or fetch a cached) column Map MultiVector.
void reorderedLocalGaussSeidel(const MultiVector< DomainScalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< RangeScalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const Teuchos::ArrayView< LocalOrdinal > &rowIndices, const RangeScalar &dampingFactor, const ESweepDirection direction) const
Reordered Gauss-Seidel or SOR on .
Teuchos::RCP< CrsMatrix< T, LocalOrdinal, GlobalOrdinal, Node > > convert() const
Return another CrsMatrix with the same entries, but converted to a different Scalar type T...
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to alpha.
Sets up and executes a communication plan for a Tpetra DistObject.
CombineMode
Rule for combining data in an Import or Export.
void exportAndFillComplete(Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &destMatrix, const export_type &exporter, const Teuchos::RCP< const map_type > &domainMap=Teuchos::null, const Teuchos::RCP< const map_type > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null) const
Export from this to the given destination matrix, and make the result fill complete.
LocalOrdinal transformGlobalValues(const GlobalOrdinal gblRow, const Kokkos::View< const GlobalOrdinal *, InputMemorySpace, Kokkos::MemoryUnmanaged > &inputInds, const Kokkos::View< const impl_scalar_type *, InputMemorySpace, Kokkos::MemoryUnmanaged > &inputVals, BinaryFunction f, const bool atomic=useAtomicUpdatesByDefault) const
Transform CrsMatrix entries in place, using global indices to select the entries in the row to transf...
LocalOrdinal local_ordinal_type
This class' second template parameter; the type of local indices.
bool TPETRA_DEPRECATED isLowerTriangular() const override
Whether the matrix is locally lower triangular.
size_t getNodeMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, on this process.
LocalOrdinal replaceGlobalValues(const GlobalOrdinal globalRow, const typename UnmanagedView< GlobalIndicesViewType >::type &inputInds, const typename UnmanagedView< ImplScalarViewType >::type &inputVals) const
Replace one or more entries' values, using global indices.
void gaussSeidelCopy(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const Scalar &dampingFactor, const ESweepDirection direction, const int numSweeps, const bool zeroInitialGuess) const
Version of gaussSeidel(), with fewer requirements on X.
bool isLocallyIndexed() const override
Whether the matrix is locally indexed on the calling process.
Forward declaration of Tpetra::CrsMatrix.
void fillComplete(const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Tell the matrix that you are done changing its structure or values, and that you are ready to do comp...
size_t TPETRA_DEPRECATED getNodeNumDiags() const override
Number of diagonal entries in the matrix's graph, on the calling process.
Abstract base class for objects that can be the source of an Import or Export operation.
mag_type getFrobeniusNorm() const override
Compute and return the Frobenius norm of the matrix.
void setAllValues(const typename local_matrix_type::row_map_type &ptr, const typename local_graph_type::entries_type::non_const_type &ind, const typename local_matrix_type::values_type &val)
Set the local matrix using three (compressed sparse row) arrays.
A read-only, row-oriented interface to a sparse matrix.
device_type::execution_space execution_space
The Kokkos execution space.
void reindexColumns(crs_graph_type *const graph, const Teuchos::RCP< const map_type > &newColMap, const Teuchos::RCP< const import_type > &newImport=Teuchos::null, const bool sortEachRow=true)
Reindex the column indices in place, and replace the column Map. Optionally, replace the Import objec...
void unpackAndCombineNew(const Kokkos::DualView< const local_ordinal_type *, device_type > &importLIDs, const Kokkos::DualView< const char *, buffer_device_type > &imports, const Kokkos::DualView< const size_t *, buffer_device_type > &numPacketsPerLID, const size_t constantNumPackets, Distributor &distor, const CombineMode CM) override
Unpack the imported column indices and values, and combine into matrix; implements "new" DistObject i...
::Kokkos::Compat::KokkosDeviceWrapperNode< execution_space > node_type
Default value of Node template parameter.
local_graph_type::entries_type::non_const_type t_LocalOrdinal_1D TPETRA_DEPRECATED
DEPRECATED; use local_graph_type::entries_type::non_const_type instead.
mag_type frobNorm_
Cached Frobenius norm of the (global) matrix.
Kokkos::StaticCrsGraph< LocalOrdinal, Kokkos::LayoutLeft, execution_space > local_graph_type
The type of the part of the sparse graph on each MPI process.
LocalOrdinal replaceLocalValues(const LocalOrdinal localRow, const typename UnmanagedView< LocalIndicesViewType >::type &inputInds, const typename UnmanagedView< ImplScalarViewType >::type &inputVals) const
Replace one or more entries' values, using local row and column indices.
Node node_type
This class' fourth template parameter; the Kokkos device type.
void scale(const Scalar &alpha)
Scale the matrix's values: this := alpha*this.
bool TPETRA_DEPRECATED isUpperTriangular() const override
Whether the matrix is locally upper triangular.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
LocalOrdinal getViewRaw(impl_scalar_type *&vals, LocalOrdinal &numEnt, const RowInfo &rowinfo) const
Nonconst pointer to all entries (including extra space) in the given row.
void insertGlobalValues(const GlobalOrdinal globalRow, const Teuchos::ArrayView< const GlobalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals)
Insert one or more entries into the matrix, using global column indices.
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap) override
Remove processes owning zero rows from the Maps and their communicator.
void checkInternalState() const
Check that this object's state is sane; throw if it's not.
bool fillComplete_
Whether the matrix is fill complete.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
void expertStaticFillComplete(const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< const import_type > &importer=Teuchos::null, const Teuchos::RCP< const export_type > &exporter=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Perform a fillComplete on a matrix that already has data.
Teuchos::RCP< const crs_graph_type > getCrsGraph() const
This matrix's graph, as a CrsGraph.
void getLocalRowCopy(LocalOrdinal localRow, const Teuchos::ArrayView< LocalOrdinal > &colInds, const Teuchos::ArrayView< Scalar > &vals, size_t &numEntries) const override
Fill given arrays with a deep copy of the locally owned entries of the matrix in a given row...
void reorderedGaussSeidel(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &D, const Teuchos::ArrayView< LocalOrdinal > &rowIndices, const Scalar &dampingFactor, const ESweepDirection direction, const int numSweeps) const
Reordered "Hybrid" Jacobi + (Gauss-Seidel or SOR) on .
void fillLocalGraphAndMatrix(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Fill data into the local graph and matrix.
Teuchos::RCP< MV > getRowMapMultiVector(const MV &Y_rangeMap, const bool force=false) const
Create a (or fetch a cached) row Map MultiVector.
GlobalOrdinal global_ordinal_type
This class' third template parameter; the type of global indices.
global_size_t getGlobalNumRows() const override
Number of global elements in the row map of this matrix.
Teuchos::RCP< CrsMatrixType > importAndFillCompleteCrsMatrix(const Teuchos::RCP< const CrsMatrixType > &sourceMatrix, const Import< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &importer, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Nonmember CrsMatrix constructor that fuses Import and fillComplete().
A parallel distribution of indices over processes.
Teuchos::ArrayView< impl_scalar_type > getViewNonConst(const RowInfo &rowinfo) const
Nonconst view of all entries (including extra space) in the given row.
virtual Teuchos::RCP< RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > add(const Scalar &alpha, const RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) const override
Implementation of RowMatrix::add: return alpha*A + beta*this.
Teuchos::RCP< const map_type > getRangeMap() const override
The range Map of this matrix.
friend class CrsMatrix
Alias for Tpetra::Classes::CrsMatrix.
CrsGraph< LocalOrdinal, GlobalOrdinal, Node > crs_graph_type
The CrsGraph specialization suitable for this CrsMatrix specialization.
size_t getGlobalMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, over all processes in the matrix's communicator...
virtual bool useNewInterface() override
Whether the subclass implements the "old" or "new" (Kokkos-friendly) interface.
void applyTranspose(const MV &X_in, MV &Y_in, const Teuchos::ETransp mode, Scalar alpha, Scalar beta) const
Special case of apply() for mode != Teuchos::NO_TRANS.
size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const override
Number of entries in the sparse matrix in the given globa row, on the calling (MPI) process...
local_matrix_type lclMatrix_
The local sparse matrix.
bool isStorageOptimized() const
Returns true if storage has been optimized.
void computeGlobalConstants()
Compute matrix properties that require collectives.
Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node2 > > clone(const Teuchos::RCP< Node2 > &node2, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null) const
Create a deep copy of this CrsMatrix, where the copy may have a different Node type.
virtual ~CrsMatrix()
Destructor.
Mix-in to avoid spurious deprecation warnings due to #2630.
virtual bool supportsRowViews() const override
Return true if getLocalRowView() and getGlobalRowView() are valid for this object.
std::string description() const override
A one-line description of this object.
EStorageStatus
Status of the graph's or matrix's storage, when not in a fill-complete state.
bool isConstantStride() const
Whether this multivector has constant stride between columns.
global_size_t TPETRA_DEPRECATED getGlobalNumDiags() const override
Number of diagonal entries in the matrix's graph, over all processes in the matrix's communicator...
Kokkos::Details::ArithTraits< impl_scalar_type >::mag_type mag_type
Type of a norm result.
void localMultiply(const MultiVector< DomainScalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< RangeScalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode, RangeScalar alpha, RangeScalar beta) const
Compute a sparse matrix-MultiVector product local to each process.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
void resumeFill(const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Resume operations that may change the values or structure of the matrix.
local_matrix_type::values_type t_ValuesType TPETRA_DEPRECATED
DEPRECATED; use local_matrix_type::values_type instead.
local_matrix_type getLocalMatrix() const
The local sparse matrix.
void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas)
Allocate values (and optionally indices) using the Node.