Files
lammps/src/KOKKOS/rand_pool_wrap_kokkos.cpp
2022-10-24 11:08:26 -04:00

74 lines
2.0 KiB
C++

// clang-format off
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "rand_pool_wrap_kokkos.h"
#include "comm.h"
#include "lammps.h"
#include "kokkos.h"
#include "random_mars.h"
#include "update.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
RandPoolWrap::RandPoolWrap(int, LAMMPS *lmp) : Pointers(lmp)
{
random_thr = nullptr;
nthreads = lmp->kokkos->nthreads;
}
/* ---------------------------------------------------------------------- */
RandPoolWrap::~RandPoolWrap()
{
}
void RandPoolWrap::destroy()
{
if (random_thr) {
for (int i=1; i < nthreads; ++i)
delete random_thr[i];
delete[] random_thr;
random_thr = nullptr;
}
}
void RandPoolWrap::init(RanMars* random, int seed)
{
// deallocate pool of RNGs
if (random_thr) {
for (int i=1; i < this->nthreads; ++i)
delete random_thr[i];
delete[] random_thr;
}
// allocate pool of RNGs
// generate a random number generator instance for
// all threads != 0. make sure we use unique seeds.
nthreads = lmp->kokkos->nthreads;
random_thr = new RanMars*[nthreads];
for (int tid = 1; tid < nthreads; ++tid) {
random_thr[tid] = new RanMars(lmp, seed + comm->me
+ comm->nprocs*tid);
}
// to ensure full compatibility with the serial style
// we use the serial random number generator instance for thread 0
random_thr[0] = random;
}