#ifndef LAMMPS_INTERFACE_H #define LAMMPS_INTERFACE_H #include #include #include "mpi.h" #include "../../src/lammps.h" #include "ATC_TypeDefs.h" // Forward class declarations for LAMMPS_NS namespace namespace LAMMPS_NS { class LAMMPS; class NeighList; class Compute; } namespace ATC { /** * @class LammpsInterface * @brief Singleton class that handles all interfacing with the lammps code */ class LammpsInterface { public: // Enumeration for lattice type. this MUST match the enum in src/lattice.cpp enum LatticeType { NONE=0, SC, BCC, FCC, HCP, DIAMOND, SQ, SQ2, HEX, CUSTOM }; // Enumeration for units type. this is internal to ATC enum UnitsType { UNKNOWN=0, LJ, REAL, METAL }; /** Static instance of this class */ static LammpsInterface * instance(); /** Set lammps pointer */ void set_lammps(LAMMPS_NS::LAMMPS * lammps) { lammps_ = lammps; MPI_Comm_rank(lammps_->world, & commRank_); } /** \name Methods that interface with Lammps base class */ /*@{*/ MPI_Comm world(); void allsum(double * send_buf, double * rec_buf, int count = 1) { MPI_Allreduce(send_buf, rec_buf, count, MPI_DOUBLE, MPI_SUM, lammps_->world); MPI_Barrier(lammps_->world); } void int_allsum(int * send_buf, int * rec_buf, int count = 1) { MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_SUM, lammps_->world); MPI_Barrier(lammps_->world); } void allmax(double * send_buf, double * rec_buf, int count = 1) { MPI_Allreduce(send_buf, rec_buf, count, MPI_DOUBLE, MPI_MAX, lammps_->world); MPI_Barrier(lammps_->world); } void int_allmax(int * send_buf, int * rec_buf, int count = 1) { MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_MAX, lammps_->world); MPI_Barrier(lammps_->world); } void logical_or(int * send_buf, int * rec_buf, int count = 1) { MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_LOR, lammps_->world); MPI_Barrier(lammps_->world); } int comm_rank(void) { return commRank_;} /*@}*/ /** \name Methods that interface with Atom class */ /*@{*/ int nlocal(); int nghost(); int nmax(); double natoms(); double ** xatom(); int ntypes(); const double ** xatom() const; double ** vatom(); double ** fatom(); int * atom_mask(); int * atom_type(); int * atom_tag(); double * atom_mass(); double atom_mass(int iType); double * atom_rmass(); double * atom_charge(); void unwrap_coordinates(int iatom, double* xatom); /*@}*/ /** \name Methods that interface with Domain class */ /*@{*/ int dimension(); int nregion(); void get_box_bounds(double & boxxlo, double & boxxhi, double & boxylo, double & boxyhi, double & boxzlo, double &boxzhi); int xperiodic(); int yperiodic(); int zperiodic(); int nperiodic(); void get_box_periodicity(int & xperiodic, int & yperiodic, int & zperiodic); int get_region_id(const char * regionName); double domain_xprd(); double domain_yprd(); double domain_zprd(); double domain_xy(); double domain_xz(); double domain_yz(); int domain_triclinic(); /*@}*/ /** \name Methods that interface with Update class */ UnitsType units_style(); /*@}*/ /** \name Methods that interface with Lattice class */ /*@{*/ double xlattice(); double ylattice(); double zlattice(); LatticeType lattice_style(); int get_n_basis(); void get_basis(double **basis); void get_unit_cell(double *a1, double *a2, double *a3); /** these functions are more than just simple pass throughs */ int num_atoms_per_cell(void); double volume_per_atom(void); void get_lattice(MATRIX &N, MATRIX &B); /*@}*/ /** \name Methods that interface with Force class */ /*@{*/ double boltz(); double mvv2e(); double ftm2v(); double nktv2p(); double qqr2e(); double qe2f(); double dielectric(); double qqrd2e(); double pair_force(int i, int j, double rsq, double& fmag_over_rmag); double pair_cutoff(); int single_enable(); /** these functions are more than just simple pass throughs */ /** Boltzmann's constant in M,L,T,t units */ double kBoltzmann(void); /** Dulong-Petit heat capacity per volume in M,L,T,t units */ double heat_capacity(void); /** mass per volume in reference configuraturation in M,L units */ double mass_density(void); /** ratio of permittivity of free space over elemental charge in V, L units */ double epsilon0(void) {return 0.00552635; } // [V A]^-1 // NOTE this won't work for LJ/SI/CGS units where [L] != A /*@}*/ /** \name Methods that interface with Group class */ /*@{*/ int ngroup(); int group_bit(int iGroup); int find_group(const char * c); int group_inverse_mask(int iGroup); char * group_name(int iGroup); void group_bounds(int iGroup, double * b); /*@}*/ /** \name Methods that interface with Memory class */ /*@{*/ double * create_1d_double_array(int nlo, int nhi, const char *name); void destroy_1d_double_array(double * d, int i); double ** create_2d_double_array(int n1, int n2, const char *name); void destroy_2d_double_array(double **d); double **grow_2d_double_array(double **array, int n1, int n2, const char *name); int ** create_2d_int_array(int n1, int n2, const char *name); void destroy_2d_int_array(int **i); int ** grow_2d_int_array(int **array, int n1, int n2, const char *name); /*@}*/ /** \name Methods that interface with Update class */ /*@{*/ double dt(); int ntimestep(); int nsteps(); /*@}*/ /** \name Methods that interface with neighbor list */ /*@{*/ void init_list(int id, LAMMPS_NS::NeighList *ptr); int neighbor_list_inum(); int * neighbor_list_numneigh(); int * neighbor_list_ilist(); int ** neighbor_list_firstneigh(); int neighbor_ago(); /*@}*/ /** \name Methods that interface with Region class */ /*@{*/ char * region_name(int iRegion); char * region_style(int iRegion); double region_xlo(int iRegion); double region_xhi(int iRegion); double region_ylo(int iRegion); double region_yhi(int iRegion); double region_zlo(int iRegion); double region_zhi(int iRegion); double region_xscale(int iRegion); double region_yscale(int iRegion); double region_zscale(int iRegion); int region_match(int iRegion, double x, double y, double z); /*@}*/ /** \name Methods that interface with compute class */ enum COMPUTE_INVOKED {DUMMY0,INVOKED_SCALAR,INVOKED_VECTOR,DUMMMY3,INVOKED_PERATOM}; int find_compute(const char* tag); LAMMPS_NS::Compute* get_compute(const char* tag); double* compute_scalar_data(const char* tag); double** compute_vector_data(const char* tag); int compute_ncols(const char* tag); /*@}*/ /** \name Methods that interface with compute pe/atom class */ /*@{*/ int atomPE_create(void); void atomPE_init(void); void atomPE_addstep(int step); double * atomPE_compute(void); /*@}*/ /** Return lammps pointer -- only as a last resort! */ LAMMPS_NS::LAMMPS * get_lammps_ptr(); protected: LAMMPS_NS::LAMMPS * lammps_; /** access to neighbor list */ LAMMPS_NS::NeighList *list_; /** constructor */ LammpsInterface(); /** comm rank */ int commRank_; /** compute pe/atom */ LAMMPS_NS::Compute * atomPE_; private: static LammpsInterface * myInstance_; }; } // end namespace ATC #endif