forked from lijiext/lammps
first draft
copied fix_momentum, work on the Kokkos View types for the arrays. the next step is parallel_for and parallel_reduce transformations.
This commit is contained in:
parent
81a2db8a0c
commit
f6f2170369
|
@ -91,6 +91,8 @@ action fix_reaxc_species_kokkos.cpp fix_reaxc_species.cpp
|
||||||
action fix_reaxc_species_kokkos.h fix_reaxc_species.h
|
action fix_reaxc_species_kokkos.h fix_reaxc_species.h
|
||||||
action fix_setforce_kokkos.cpp
|
action fix_setforce_kokkos.cpp
|
||||||
action fix_setforce_kokkos.h
|
action fix_setforce_kokkos.h
|
||||||
|
action fix_momentum_kokkos.cpp
|
||||||
|
action fix_momentum_kokkos.h
|
||||||
action fix_wall_reflect_kokkos.cpp
|
action fix_wall_reflect_kokkos.cpp
|
||||||
action fix_wall_reflect_kokkos.h
|
action fix_wall_reflect_kokkos.h
|
||||||
action gridcomm_kokkos.cpp gridcomm.cpp
|
action gridcomm_kokkos.cpp gridcomm.cpp
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
http://lammps.sandia.gov, Sandia National Laboratories
|
||||||
|
Steve Plimpton, sjplimp@sandia.gov
|
||||||
|
|
||||||
|
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 <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "fix_momentum_kokkos.h"
|
||||||
|
#include "atom_kokkos.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "group.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "force.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing author: Dan Ibanez (SNL)
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
FixMomentumKokkos<DeviceType>::FixMomentumKokkos(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
FixMomentum(lmp, narg, arg)
|
||||||
|
{
|
||||||
|
kokkosable = 1;
|
||||||
|
atomKK = (AtomKokkos *) atom;
|
||||||
|
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
|
||||||
|
datamask_read = EMPTY_MASK;
|
||||||
|
datamask_modify = EMPTY_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void FixMomentumKokkos<DeviceType>::init()
|
||||||
|
{
|
||||||
|
//this is done in FixMomentum::init(), but will need to change
|
||||||
|
//once Group is ported to Kokkos
|
||||||
|
//masstotal = group->mass(igroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void FixMomentumKokkos<DeviceType>::end_of_step()
|
||||||
|
{
|
||||||
|
atomKK->sync(execution_space, V_MASK | MASK_MASK);
|
||||||
|
|
||||||
|
typename AT::t_v_array v = atomKK->k_v.view<DeviceType>();
|
||||||
|
typename AT::t_int_1d_randomread mask = atomKK->k_mask.view<DeviceType>();
|
||||||
|
|
||||||
|
const int nlocal = atom->nlocal;
|
||||||
|
double ekin_old,ekin_new;
|
||||||
|
ekin_old = ekin_new = 0.0;
|
||||||
|
|
||||||
|
if (dynamic)
|
||||||
|
masstotal = group->mass(igroup); // change once Group is ported to Kokkos
|
||||||
|
|
||||||
|
// do nothing if group is empty, i.e. mass is zero;
|
||||||
|
|
||||||
|
if (masstotal == 0.0) return;
|
||||||
|
|
||||||
|
// compute kinetic energy before momentum removal, if needed
|
||||||
|
|
||||||
|
if (rescale) {
|
||||||
|
|
||||||
|
atomKK->sync(execution_space, TYPE_MASK);
|
||||||
|
|
||||||
|
typename AT::t_int_1d_randomread type = atomKK->k_type;
|
||||||
|
double ke=0.0;
|
||||||
|
|
||||||
|
// D.I. : does this rmass check make sense in Kokkos mode ?
|
||||||
|
if (atom->rmass) {
|
||||||
|
atomKK->sync(execution_space, RMASS_MASK);
|
||||||
|
typename AT::t_float_1d_randomread rmass = atomKK->k_rmass;
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit)
|
||||||
|
// ke += rmass[i] *
|
||||||
|
// (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
|
||||||
|
} else {
|
||||||
|
// D.I. : why is there no MASS_MASK ?
|
||||||
|
typename AT::t_float_1d_randomread mass = atomKK->k_mass;
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit)
|
||||||
|
// ke += mass[type[i]] *
|
||||||
|
// (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
|
||||||
|
}
|
||||||
|
MPI_Allreduce(&ke,&ekin_old,1,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linear) {
|
||||||
|
double vcm[3];
|
||||||
|
group->vcm(igroup,masstotal,vcm); // will need to change when Group has Kokkos
|
||||||
|
|
||||||
|
// adjust velocities by vcm to zero linear momentum
|
||||||
|
// only adjust a component if flag is set
|
||||||
|
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit) {
|
||||||
|
// if (xflag) v[i][0] -= vcm[0];
|
||||||
|
// if (yflag) v[i][1] -= vcm[1];
|
||||||
|
// if (zflag) v[i][2] -= vcm[2];
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angular) {
|
||||||
|
double xcm[3],angmom[3],inertia[3][3],omega[3];
|
||||||
|
group->xcm(igroup,masstotal,xcm); // change when Group has Kokkos ?
|
||||||
|
group->angmom(igroup,xcm,angmom);
|
||||||
|
group->inertia(igroup,xcm,inertia);
|
||||||
|
group->omega(angmom,inertia,omega);
|
||||||
|
|
||||||
|
// adjust velocities to zero omega
|
||||||
|
// vnew_i = v_i - w x r_i
|
||||||
|
// must use unwrapped coords to compute r_i correctly
|
||||||
|
|
||||||
|
atomKK->sync(execution_space, X_MASK | IMAGE_MASK);
|
||||||
|
typename AT::t_x_array_randomread x = atomKK->k_x.view<DeviceType>();
|
||||||
|
typename AT::t_imageint_1d_randomread image = atomKK->k_image.view<DeviceType>();
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit) {
|
||||||
|
// double dx,dy,dz;
|
||||||
|
// double unwrap[3];
|
||||||
|
// domain->unmap(x[i],image[i],unwrap);
|
||||||
|
// dx = unwrap[0] - xcm[0];
|
||||||
|
// dy = unwrap[1] - xcm[1];
|
||||||
|
// dz = unwrap[2] - xcm[2];
|
||||||
|
// v[i][0] -= omega[1]*dz - omega[2]*dy;
|
||||||
|
// v[i][1] -= omega[2]*dx - omega[0]*dz;
|
||||||
|
// v[i][2] -= omega[0]*dy - omega[1]*dx;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute kinetic energy after momentum removal, if needed
|
||||||
|
|
||||||
|
if (rescale) {
|
||||||
|
|
||||||
|
double ke=0.0, factor=1.0;
|
||||||
|
typename AT::t_int_1d_randomread type = atomKK->k_type;
|
||||||
|
|
||||||
|
if (atom->rmass) {
|
||||||
|
atomKK->sync(execution_space, RMASS_MASK);
|
||||||
|
typename AT::t_float_1d_randomread rmass = atomKK->k_rmass;
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit)
|
||||||
|
// ke += rmass[i] *
|
||||||
|
// (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
|
||||||
|
} else {
|
||||||
|
// D.I. : why is there no MASS_MASK ?
|
||||||
|
typename AT::t_float_1d_randomread mass = atomKK->k_mass;
|
||||||
|
// for (int i = 0; i < nlocal; i++)
|
||||||
|
// if (mask[i] & groupbit)
|
||||||
|
// ke += mass[type[i]] *
|
||||||
|
// (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
|
||||||
|
}
|
||||||
|
MPI_Allreduce(&ke,&ekin_new,1,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
|
||||||
|
if (ekin_new != 0.0) factor = sqrt(ekin_old/ekin_new);
|
||||||
|
// for (int i = 0; i < nlocal; i++) {
|
||||||
|
// if (mask[i] & groupbit) {
|
||||||
|
// v[i][0] *= factor;
|
||||||
|
// v[i][1] *= factor;
|
||||||
|
// v[i][2] *= factor;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
http://lammps.sandia.gov, Sandia National Laboratories
|
||||||
|
Steve Plimpton, sjplimp@sandia.gov
|
||||||
|
|
||||||
|
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.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
|
||||||
|
FixStyle(momentum/kk,FixMomentumKokkos<LMPDeviceType>)
|
||||||
|
FixStyle(momentum/kk/device,FixMomentumKokkos<LMPDeviceType>)
|
||||||
|
FixStyle(momentum/kk/host,FixMomentumKokkos<LMPHostType>)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_MOMENTUM_KOKKOS_H
|
||||||
|
#define LMP_FIX_MOMENTUM_KOKKOS_H
|
||||||
|
|
||||||
|
#include "fix_momentum.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
class FixMomentumKokkos : public FixMomentum {
|
||||||
|
public:
|
||||||
|
typedef ArrayTypes<DeviceType> AT;
|
||||||
|
|
||||||
|
FixMomentum(class LAMMPS *, int, char **);
|
||||||
|
void init();
|
||||||
|
void end_of_step();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ERROR/WARNING messages:
|
||||||
|
|
||||||
|
*/
|
Loading…
Reference in New Issue