#ifdef KSPACE_CLASS
KSpaceStyle(pppm/kk,PPPMKokkos<LMPDeviceType>)
KSpaceStyle(pppm/kk/device,PPPMKokkos<LMPDeviceType>)
KSpaceStyle(pppm/kk/host,PPPMKokkos<LMPHostType>)
#else
#ifndef LMP_PPPM_KOKKOS_H
#define LMP_PPPM_KOKKOS_H
#include "pppm.h"
#include "gridcomm_kokkos.h"
#include "kokkos_base.h"
#include "kokkos_type.h"
namespace LAMMPS_NS {
struct TagPPPM_setup1{};
struct TagPPPM_setup2{};
struct TagPPPM_setup3{};
struct TagPPPM_setup4{};
struct TagPPPM_compute_gf_ik{};
struct TagPPPM_compute_gf_ik_triclinic{};
struct TagPPPM_self1{};
struct TagPPPM_self2{};
struct TagPPPM_brick2fft{};
struct TagPPPM_particle_map{};
struct TagPPPM_make_rho_zero{};
struct TagPPPM_make_rho_atomic{};
struct TagPPPM_make_rho{};
struct TagPPPM_poisson_ik1{};
struct TagPPPM_poisson_ik2{};
struct TagPPPM_poisson_ik3{};
struct TagPPPM_poisson_ik4{};
struct TagPPPM_poisson_ik5{};
struct TagPPPM_poisson_ik6{};
struct TagPPPM_poisson_ik7{};
struct TagPPPM_poisson_ik8{};
struct TagPPPM_poisson_ik9{};
struct TagPPPM_poisson_ik10{};
struct TagPPPM_poisson_ik_triclinic1{};
struct TagPPPM_poisson_ik_triclinic2{};
struct TagPPPM_poisson_ik_triclinic3{};
struct TagPPPM_poisson_ik_triclinic4{};
struct TagPPPM_poisson_ik_triclinic5{};
struct TagPPPM_poisson_ik_triclinic6{};
struct TagPPPM_poisson_peratom1{};
struct TagPPPM_poisson_peratom2{};
struct TagPPPM_poisson_peratom3{};
struct TagPPPM_poisson_peratom4{};
struct TagPPPM_poisson_peratom5{};
struct TagPPPM_poisson_peratom6{};
struct TagPPPM_poisson_peratom7{};
struct TagPPPM_poisson_peratom8{};
struct TagPPPM_poisson_peratom9{};
struct TagPPPM_poisson_peratom10{};
struct TagPPPM_poisson_peratom11{};
struct TagPPPM_poisson_peratom12{};
struct TagPPPM_poisson_peratom13{};
struct TagPPPM_poisson_peratom14{};
struct TagPPPM_fieldforce_ik{};
struct TagPPPM_fieldforce_peratom{};
struct TagPPPM_pack_forward1{};
struct TagPPPM_pack_forward2{};
struct TagPPPM_unpack_forward1{};
struct TagPPPM_unpack_forward2{};
struct TagPPPM_pack_reverse{};
struct TagPPPM_unpack_reverse{};
struct TagPPPM_slabcorr1{};
struct TagPPPM_slabcorr2{};
struct TagPPPM_slabcorr3{};
struct TagPPPM_slabcorr4{};
struct TagPPPM_timing_zero{};
template<class DeviceType>
class PPPMKokkos : public PPPM, public KokkosBase {
public:
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
PPPMKokkos(class LAMMPS *);
virtual ~PPPMKokkos();
virtual void init();
virtual void setup();
void setup_grid();
virtual void settings(int, char **);
virtual void compute(int, int);
virtual int timing_1d(int, double &);
virtual int timing_3d(int, double &);
virtual double memory_usage();
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_setup1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_setup2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_setup3, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_setup4, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_compute_gf_ik, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_compute_gf_ik_triclinic, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_self1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_self2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_brick2fft, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_particle_map, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_make_rho_zero, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_make_rho_atomic, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_make_rho, typename Kokkos::TeamPolicy<DeviceType, TagPPPM_make_rho>::member_type) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik2, const int&, EV_FLOAT &) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik3, const int&, EV_FLOAT &) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik4, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik5, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik6, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik7, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik8, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik9, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik10, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic3, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic4, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic5, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_ik_triclinic6, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom3, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom4, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom5, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom6, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom7, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom8, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom9, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom10, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom11, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom12, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom13, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_poisson_peratom14, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_fieldforce_ik, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_fieldforce_peratom, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_pack_forward1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_pack_forward2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_unpack_forward1, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_unpack_forward2, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_pack_reverse, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_unpack_reverse, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_slabcorr1, const int&, double&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_slabcorr2, const int&, double&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_slabcorr3, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_slabcorr4, const int&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagPPPM_timing_zero, const int&) const;
protected:
double unitkx,unitky,unitkz;
double scaleinv,s2;
double qscale,efact,ffact,dipole_all,dipole_r2,zprd;
double xprd,yprd,zprd_slab;
int nbx,nby,nbz,twoorder;
int numx_fft,numy_fft,numz_fft;
int numx_inout,numy_inout,numz_inout;
int numx_out,numy_out,numz_out;
int ix,iy,nlocal;
int nx,ny,nz;
typename AT::t_int_1d_um d_list_index;
typename AT::t_FFT_SCALAR_1d_um d_buf;
DAT::tdual_int_scalar k_flag;
typename AT::t_x_array_randomread x;
typename AT::t_f_array f;
typename AT::t_float_1d_randomread q;
DAT::tdual_efloat_1d k_eatom;
DAT::tdual_virial_array k_vatom;
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
int factors[3];
typename AT::t_FFT_SCALAR_3d d_density_brick;
typename AT::t_FFT_SCALAR_3d d_vdx_brick,d_vdy_brick,d_vdz_brick;
typename AT::t_FFT_SCALAR_3d d_u_brick;
typename AT::t_FFT_SCALAR_3d d_v0_brick,d_v1_brick,d_v2_brick;
typename AT::t_FFT_SCALAR_3d d_v3_brick,d_v4_brick,d_v5_brick;
typename AT::t_float_1d d_greensfn;
typename AT::t_virial_array d_vg;
typename AT::t_float_1d d_fkx;
typename AT::t_float_1d d_fky;
typename AT::t_float_1d d_fkz;
DAT::tdual_FFT_SCALAR_1d k_density_fft;
DAT::tdual_FFT_SCALAR_1d k_work1;
DAT::tdual_FFT_SCALAR_1d k_work2;
typename AT::t_FFT_SCALAR_1d d_density_fft;
typename AT::t_FFT_SCALAR_1d d_work1;
typename AT::t_FFT_SCALAR_1d d_work2;
DAT::tdual_float_1d k_gf_b;
typename AT::t_float_1d d_gf_b;
typename AT::t_FFT_SCALAR_2d_3 d_rho1d;
DAT::tdual_FFT_SCALAR_2d k_rho_coeff;
typename AT::t_FFT_SCALAR_2d d_rho_coeff;
HAT::t_FFT_SCALAR_2d h_rho_coeff;
typename Kokkos::DualView<F_FLOAT[8][7],Kokkos::LayoutRight,DeviceType>::t_host acons;
class FFT3d *fft1,*fft2;
class Remap *remap;
GridCommKokkos<DeviceType> *cg;
GridCommKokkos<DeviceType> *cg_peratom;
typename AT::t_int_1d_3 d_part2grid;
double boxlo[3];
void set_grid_global();
void set_grid_local();
void adjust_gewald();
double newton_raphson_f();
double derivf();
double final_accuracy();
virtual void allocate();
virtual void allocate_peratom();
virtual void deallocate();
virtual void deallocate_peratom();
int factorable(int);
double compute_df_kspace();
double estimate_ik_error(double, double, bigint);
virtual void compute_gf_denom();
virtual void compute_gf_ik();
virtual void particle_map();
virtual void make_rho();
virtual void brick2fft();
virtual void poisson();
virtual void poisson_ik();
virtual void fieldforce();
virtual void fieldforce_ik();
virtual void poisson_peratom();
virtual void fieldforce_peratom();
void procs2grid2d(int,int,int,int *, int*);
KOKKOS_INLINE_FUNCTION
void compute_rho1d(const int i, const FFT_SCALAR &, const FFT_SCALAR &,
const FFT_SCALAR &) const;
void compute_rho_coeff();
void slabcorr();
void pack_forward_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
void unpack_forward_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
void pack_reverse_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
void unpack_reverse_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
int triclinic; void setup_triclinic();
void compute_gf_ik_triclinic();
void poisson_ik_triclinic();
KOKKOS_INLINE_FUNCTION
double gf_denom(const double &x, const double &y,
const double &z) const {
double sx,sy,sz;
sz = sy = sx = 0.0;
for (int l = order-1; l >= 0; l--) {
sx = d_gf_b[l] + sx*x;
sy = d_gf_b[l] + sy*y;
sz = d_gf_b[l] + sz*z;
}
double s = sx*sy*sz;
return s*s;
};
};
}
#endif
#endif