#ifndef COLVARPROXY_LAMMPS_H
#define COLVARPROXY_LAMMPS_H
#include "colvarproxy_lammps_version.h"
#include <mpi.h>
#include <cstddef>
#include <string>
#include <vector>
#include "colvarmodule.h"
#include "colvarproxy.h"
#include "colvartypes.h"
#include "random_park.h"
#include "lammps.h"
#include "domain.h"
#include "force.h"
#include "update.h"
class colvarproxy_lammps : public colvarproxy {
protected:
LAMMPS_NS::LAMMPS *_lmp;
LAMMPS_NS::RanPark *_random;
double t_target, my_timestep, my_boltzmann, my_angstrom;
double bias_energy;
int restart_every;
int previous_step;
bool first_timestep;
bool total_force_requested;
bool do_exit;
std::vector<int> atoms_types;
MPI_Comm inter_comm; int inter_me, inter_num;
public:
friend class cvm::atom;
colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, const char *,
const char *, const int, const double, MPI_Comm);
virtual ~colvarproxy_lammps();
void init(const char*);
int setup();
private:
colvarproxy_lammps() {};
colvarproxy_lammps(const colvarproxy_lammps &) {};
public:
void set_temperature(double t) { t_target = t; };
bool total_forces_enabled() const { return total_force_requested; };
bool total_forces_same_step() const { return true; };
bool want_exit() const { return do_exit; };
double compute();
void serialize_status(std::string &);
bool deserialize_status(std::string &);
void write_output_files();
void add_config_file(char const *config_filename);
void add_config_string(const std::string &config);
public:
inline cvm::real unit_angstrom() { return my_angstrom; };
inline cvm::real boltzmann() { return my_boltzmann; };
inline cvm::real temperature() { return t_target; };
inline cvm::real dt() { return my_timestep; };
inline size_t restart_frequency() { return restart_every; };
void add_energy(cvm::real energy) { bias_energy += energy; };
void request_total_force(bool yesno) { total_force_requested = yesno; };
void log(std::string const &message);
void error(std::string const &message);
void fatal_error(std::string const &message);
cvm::rvector position_distance(cvm::atom_pos const &pos1,
cvm::atom_pos const &pos2) const;
int backup_file(char const *filename);
cvm::real rand_gaussian(void) { return _random->gaussian(); };
int init_atom(int atom_number);
int check_atom_id(int atom_number);
inline std::vector<int> *modify_atom_types() { return &atoms_types; }
public:
virtual bool replica_enabled() { return (inter_comm != MPI_COMM_NULL); }
virtual int replica_index() { return inter_me; }
virtual int replica_num() { return inter_num; }
virtual void replica_comm_barrier();
virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep);
virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep);
};
#endif