#ifdef KSPACE_CLASS
KSpaceStyle(msm,MSM)
#else
#ifndef LMP_MSM_H
#define LMP_MSM_H
#include "kspace.h"
namespace LAMMPS_NS {
class MSM : public KSpace {
public:
MSM(class LAMMPS *);
virtual ~MSM();
void init();
void setup();
virtual void settings(int, char **);
virtual void compute(int, int);
protected:
int me,nprocs;
double precision;
int nfactors;
int *factors;
double qqrd2e;
double cutoff;
double volume;
double *delxinv,*delyinv,*delzinv;
double h_x,h_y,h_z;
double C_p;
int *nx_msm,*ny_msm,*nz_msm;
int *nxlo_in,*nylo_in,*nzlo_in;
int *nxhi_in,*nyhi_in,*nzhi_in;
int *nxlo_out,*nylo_out,*nzlo_out;
int *nxhi_out,*nyhi_out,*nzhi_out;
int *ngrid,*active_flag;
int *alpha,*betax,*betay,*betaz;
int nxlo_out_all,nylo_out_all,nzlo_out_all;
int nxhi_out_all,nyhi_out_all,nzhi_out_all;
int nxlo_direct,nxhi_direct,nylo_direct;
int nyhi_direct,nzlo_direct,nzhi_direct;
int nmax_direct;
int nlower,nupper;
int peratom_allocate_flag;
int levels;
MPI_Comm *world_levels;
double ****qgrid;
double ****egrid;
double ****v0grid,****v1grid,****v2grid;
double ****v3grid,****v4grid,****v5grid;
double **g_direct;
double **v0_direct,**v1_direct,**v2_direct;
double **v3_direct,**v4_direct,**v5_direct;
double *g_direct_top;
double *v0_direct_top,*v1_direct_top,*v2_direct_top;
double *v3_direct_top,*v4_direct_top,*v5_direct_top;
double **phi1d,**dphi1d;
int procgrid[3]; int myloc[3]; int ***procneigh_levels; class GridComm **cg;
class GridComm **cg_peratom;
class GridComm *cg_all;
class GridComm *cg_peratom_all;
int current_level;
int **part2grid; int nmax;
double *boxlo;
void set_grid_global();
void set_proc_grid(int);
void set_grid_local();
void setup_grid();
double estimate_1d_error(double,double);
double estimate_3d_error();
double estimate_total_error();
void allocate();
void allocate_peratom();
void deallocate();
void deallocate_peratom();
void allocate_levels();
void deallocate_levels();
int factorable(int,int&,int&);
void particle_map();
void make_rho();
virtual void direct(int);
void direct_peratom(int);
void direct_top(int);
void direct_peratom_top(int);
void restriction(int);
void prolongation(int);
void grid_swap_forward(int,double*** &);
void grid_swap_reverse(int,double*** &);
void fieldforce();
void fieldforce_peratom();
void compute_phis(const double &, const double &, const double &);
void compute_phis_and_dphis(const double &, const double &, const double &);
inline double compute_phi(const double &);
inline double compute_dphi(const double &);
void get_g_direct();
void get_virial_direct();
void get_g_direct_top(int);
void get_virial_direct_top(int);
int triclinic;
void pack_forward(int, double *, int, int *);
void unpack_forward(int, double *, int, int *);
void pack_reverse(int, double *, int, int *);
void unpack_reverse(int, double *, int, int *);
};
}
#endif
#endif