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,
711 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
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[]);
1173 const GlobalOrdinal inds[],
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,
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,
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;
1304 const LocalOrdinal inds[],
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,
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,
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
1461 const GlobalOrdinal inds[],
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);
1555 const LocalOrdinal inds[],
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,
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,
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;
1743 const LocalOrdinal inds[],
1745 const LocalOrdinal numElts,
1747 const bool atomic = useAtomicUpdatesByDefault)
const;
1783 const GlobalOrdinal inds[],
1785 const LocalOrdinal numElts,
1787 const bool atomic = useAtomicUpdatesByDefault)
const;
1816 transformLocalValues (
const LocalOrdinal lclRow,
1817 const LocalOrdinal numInputEnt,
1819 const LocalOrdinal inputCols[],
1821 const bool atomic = useAtomicUpdatesByDefault)
const;
1850 transformGlobalValues (
const GlobalOrdinal gblRow,
1851 const LocalOrdinal numInputEnt,
1853 const GlobalOrdinal inputCols[],
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,
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,
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,
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;
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,
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
2934 const LocalOrdinal err = this->
getLocalRowView (lclRow, numEnt, valTmp, ind);
2937 val = reinterpret_cast<const OutputScalarType*> (valTmp);
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
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 ();
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
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 ();
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[],
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[],
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);
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;
4213 const Teuchos::RCP<const map_type>& domainMap,
4214 const Teuchos::RCP<const map_type>& rangeMap,
4215 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
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;
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;
4315 const GlobalOrdinal gblColInds[],
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,
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
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);
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);
4472 typedef DistObject<char, LocalOrdinal, GlobalOrdinal, Node> dist_object_type;
4476 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
4477 typedef Kokkos::Details::ArithTraits<impl_scalar_type> STS;
4478 typedef Kokkos::Details::ArithTraits<mag_type> STM;
4479 typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
4480 typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
4484 enum GraphAllocationStatus {
4485 GraphAlreadyAllocated,
4486 GraphNotYetAllocated
4493 Teuchos::ArrayRCP<Teuchos::Array<impl_scalar_type> >
4494 allocateValues2D ();
4513 void allocateValues (ELocalGlobal lg, GraphAllocationStatus gas);
4526 const RowInfo& rowInfo);
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