10 #ifndef TPETRA_DETAILS_RANDOM_DEF_HPP
11 #define TPETRA_DETAILS_RANDOM_DEF_HPP
13 #include "Tpetra_Details_Random_decl.hpp"
14 #include "Teuchos_TestForException.hpp"
15 #include "Kokkos_Random.hpp"
21 template <
class ExecutionSpace>
22 void finalize_pool() {
23 using PoolClass = Static_Random_XorShift64_Pool<ExecutionSpace>;
24 if (PoolClass::pool_ !=
nullptr) {
25 delete PoolClass::pool_;
27 PoolClass::pool_ =
nullptr;
31 template <
class ExecutionSpace>
32 unsigned int Static_Random_XorShift64_Pool<ExecutionSpace>::getSeedFromRank(
int mpi_rank) {
38 uint64_t myRank =
static_cast<uint64_t
>(mpi_rank);
39 uint64_t seed64 =
static_cast<uint64_t
>(std::rand()) + myRank + 17311uLL;
40 unsigned int seed =
static_cast<unsigned int>(seed64 & 0xffffffff);
44 template <
class ExecutionSpace>
45 void Static_Random_XorShift64_Pool<ExecutionSpace>::
46 resetPool(
int mpi_rank) {
50 Kokkos::push_finalize_hook(finalize_pool<ExecutionSpace>);
52 pool_ =
new Kokkos::Random_XorShift64_Pool<ExecutionSpace>(getSeedFromRank(mpi_rank));
55 template <
class ExecutionSpace>
56 bool Static_Random_XorShift64_Pool<ExecutionSpace>::
58 return pool_ !=
nullptr;
61 template <
class ExecutionSpace>
62 Kokkos::Random_XorShift64_Pool<ExecutionSpace>& Static_Random_XorShift64_Pool<ExecutionSpace>::
64 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(), std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
79 #define TPETRA_DETAILS_RANDOM_INSTANT(NODE) \
81 Kokkos::Random_XorShift64_Pool<typename NODE::execution_space>* Details::Static_Random_XorShift64_Pool<typename NODE::execution_space>::pool_ = nullptr; \
82 template class Details::Static_Random_XorShift64_Pool<typename NODE::execution_space>;
84 #endif // TPETRA_DETAILS_RANDOM_DEF_HPP