42 #ifndef TPETRA_WITHLOCALACCESS_MULTIVECTOR_HPP
43 #define TPETRA_WITHLOCALACCESS_MULTIVECTOR_HPP
46 #include "Tpetra_MultiVector.hpp"
47 #include "Tpetra_Vector.hpp"
61 template<
class SC,
class LO,
class GO,
class NT,
class ... Args>
62 struct GetMasterLocalObject<
63 LocalAccess<
Tpetra::MultiVector<SC, LO, GO, NT>, Args...>
65 template<class SC, class LO, class GO, class NT, class ... Args>
66 struct GetMasterLocalObject<
67 LocalAccess<Tpetra::Vector<SC, LO, GO, NT>, Args...>
70 template<class SC, class LO, class GO, class NT, class ... Args>
71 struct GetNonowningLocalObject<
72 LocalAccess<Tpetra::MultiVector<SC, LO, GO, NT>, Args...>
74 template<class SC, class LO, class GO, class NT, class ... Args>
75 struct GetNonowningLocalObject<
76 LocalAccess<Tpetra::Vector<SC, LO, GO, NT>, Args...>
82 struct is_host_space {
92 static constexpr
bool value =
93 std::is_same<
typename Space::execution_space::memory_space,
94 Kokkos::HostSpace>::value;
100 template<
class SC,
class LO,
class GO,
class NT,
class ... Args>
113 using execution_space =
114 typename local_access_type::execution_space;
116 Kokkos::Impl::is_execution_space<execution_space>::value,
117 "LocalAccess<Args...>::execution_space is not a valid "
118 "Kokkos execution space.");
120 using memory_space =
typename local_access_type::memory_space;
122 Kokkos::Impl::is_memory_space<memory_space>::value,
123 "LocalAccess<Args...>::memory_space is not a valid "
124 "Kokkos memory space.");
126 using access_mode =
typename local_access_type::access_mode;
128 is_access_mode<access_mode>::value,
129 "LocalAccess<Args...>::access_mode is not an Access "
142 using dual_view_type =
152 using master_local_view_type =
typename std::conditional<
153 is_host_space<execution_space>::value,
154 typename dual_view_type::t_host,
155 typename dual_view_type::t_dev>::type;
158 static_cast<int>(master_local_view_type::Rank) == 2,
159 "Rank of master_local_view_type must be 2. "
160 "Please report this bug to the Tpetra developers.");
163 static master_local_view_type
167 return master_local_view_type();
170 using access_mode =
typename local_access_type::access_mode;
171 constexpr
bool is_write_only =
172 std::is_same<access_mode, write_only>::value;
174 LA.
G_.clear_sync_state();
206 if (LA.
G_.template need_sync<execution_space>()) {
207 LA.
G_.template sync<execution_space>();
210 constexpr
bool is_read_only =
211 std::is_same<access_mode, read_only>::value;
212 if (! is_read_only) {
213 LA.
G_.template modify<execution_space>();
218 LA.
G_.template getLocalView<execution_space>();
220 return master_local_view_type(G_lcl_2d);
229 using master_local_object_type = std::unique_ptr<
230 master_local_view_type>;
233 static master_local_object_type
236 auto G_lcl_2d = getOwningPreActions(LA);
241 return master_local_object_type(
242 new master_local_view_type(G_lcl_2d));
250 >::master_local_view_type
251 >::value,
"Missing GetMasterLocalObject specialization");
257 >::master_local_view_type
258 >::value,
"Missing GetMasterLocalObject specialization");
263 template<
class SC,
class LO,
class GO,
class NT,
class ... Args>
276 using execution_space =
277 typename local_access_type::execution_space;
279 Kokkos::Impl::is_execution_space<execution_space>::value,
280 "LocalAccess<Args...>::execution_space is not a valid "
281 "Kokkos execution space.");
283 using memory_space =
typename local_access_type::memory_space;
285 Kokkos::Impl::is_memory_space<memory_space>::value,
286 "LocalAccess<Args...>::memory_space is not a valid "
287 "Kokkos memory space.");
289 using access_mode =
typename local_access_type::access_mode;
291 is_access_mode<access_mode>::value,
292 "LocalAccess<Args...>::access_mode is not an Access "
305 using dual_view_type =
310 using master_local_view_2d_type =
typename std::conditional<
311 is_host_space<execution_space>::value,
312 typename dual_view_type::t_host,
313 typename dual_view_type::t_dev>::type;
319 using master_local_view_type = decltype(
320 Kokkos::subview(master_local_view_2d_type(),
324 static_cast<int>(master_local_view_type::Rank) == 1,
325 "Rank of master_local_view_type must be 1. "
326 "Please report this bug to the Tpetra developers.");
329 static master_local_view_2d_type
333 return master_local_view_2d_type();
336 using access_mode =
typename local_access_type::access_mode;
337 constexpr
bool is_write_only =
338 std::is_same<access_mode, write_only>::value;
340 LA.
G_.clear_sync_state();
343 if (LA.
G_.template need_sync<execution_space>()) {
344 LA.
G_.template sync<execution_space>();
347 constexpr
bool is_read_only =
348 std::is_same<access_mode, read_only>::value;
349 if (! is_read_only) {
350 LA.
G_.template modify<execution_space>();
355 LA.
G_.template getLocalView<execution_space>();
357 return master_local_view_2d_type(G_lcl_2d);
366 using master_local_object_type = std::unique_ptr<
367 master_local_view_type>;
370 static master_local_object_type
373 master_local_view_2d_type G_lcl_2d = getOwningPreActions(LA);
374 master_local_view_type G_lcl_1d =
375 Kokkos::subview(G_lcl_2d, Kokkos::ALL(), 0);
381 return master_local_object_type(
382 new master_local_view_type(G_lcl_1d));
390 >::master_local_view_type
391 >::value,
"Missing GetMasterLocalObject specialization");
397 >::master_local_view_type
398 >::value,
"Missing GetMasterLocalObject specialization");
405 template<
class SC,
class LO,
class GO,
class NT,
class ... Args>
417 using access_mode =
typename local_access_type::access_mode;
418 static_assert(is_access_mode<access_mode>::value,
419 "Please report this bug to the Tpetra developers.");
421 using master_local_view_type =
423 master_local_view_type;
425 static_cast<int>(master_local_view_type::Rank) == 2,
426 "Rank of master_local_view_type must be 2.");
431 using output_data_type =
typename std::conditional<
432 std::is_same<access_mode, read_only>::value,
433 typename master_local_view_type::const_data_type,
434 typename master_local_view_type::non_const_data_type>::type;
437 using master_local_object_type =
439 master_local_object_type;
440 using nonowning_local_object_type =
441 Kokkos::View<output_data_type,
442 typename master_local_view_type::array_layout,
443 typename master_local_view_type::device_type,
444 Kokkos::MemoryTraits<Kokkos::Unmanaged> >;
446 static nonowning_local_object_type
448 const master_local_object_type& M)
450 master_local_view_type* viewPtr = M.get();
451 return viewPtr ==
nullptr ?
452 nonowning_local_object_type() :
453 nonowning_local_object_type(*viewPtr);
461 template<
class SC,
class LO,
class GO,
class NT,
class ... Args>
473 using access_mode =
typename local_access_type::access_mode;
474 static_assert(is_access_mode<access_mode>::value,
475 "Please report this bug to the Tpetra developers.");
477 using master_local_view_type =
479 master_local_view_type;
481 static_cast<int>(master_local_view_type::Rank) == 1,
482 "Rank of master_local_view_type must be 1.");
486 using output_data_type =
typename std::conditional<
487 std::is_same<access_mode, read_only>::value,
488 typename master_local_view_type::const_data_type,
489 typename master_local_view_type::non_const_data_type>::type;
492 using master_local_object_type =
494 master_local_object_type;
495 using nonowning_local_object_type =
496 Kokkos::View<output_data_type,
497 typename master_local_view_type::array_layout,
498 typename master_local_view_type::device_type,
499 Kokkos::MemoryTraits<Kokkos::Unmanaged> >;
501 static nonowning_local_object_type
503 const master_local_object_type& M)
505 master_local_view_type* viewPtr = M.get();
506 return viewPtr ==
nullptr ?
507 nonowning_local_object_type() :
508 nonowning_local_object_type(*viewPtr);
Declaration and definition of Tpetra::withLocalAccess; declaration of helper classes for users to spe...
Tag class for declaring access intent.
Declaration of access intent for a global object.
global_object_type & G_
Reference to the global object whose data the user will access.
bool isValid() const
Is access supposed to be valid?
One or more distributed dense vectors.
Kokkos::DualView< impl_scalar_type **, Kokkos::LayoutLeft, execution_space > dual_view_type
Kokkos::DualView specialization used by this class.
A distributed dense vector.
base_type::dual_view_type dual_view_type
Kokkos::DualView specialization used by this class.
Implementation details of Tpetra.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Mapping from LocalAccess to the "master" local object type.
Mapping from "master" local object type to the nonowning "local view" type that users see (as argumen...