lammps/lib/atc/LammpsInterface.h

295 lines
7.4 KiB
C++

#ifndef LAMMPS_INTERFACE_H
#define LAMMPS_INTERFACE_H
#include <iostream>
#include <stdlib.h>
#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