#ifndef COLVARPROXY_H
#define COLVARPROXY_H
#include <fstream>
#include <list>
#include "colvarmodule.h"
#include "colvartypes.h"
#include "colvarvalue.h"
class colvarscript;
class colvarproxy_system {
public:
colvarproxy_system();
virtual ~colvarproxy_system();
virtual cvm::real unit_angstrom() = 0;
virtual cvm::real boltzmann() = 0;
virtual cvm::real temperature() = 0;
virtual cvm::real dt() = 0;
virtual cvm::real rand_gaussian(void) = 0;
virtual void add_energy(cvm::real energy) = 0;
virtual cvm::rvector position_distance(cvm::atom_pos const &pos1,
cvm::atom_pos const &pos2) const;
void update_pbc_lattice();
void reset_pbc_lattice();
virtual void request_total_force(bool yesno);
virtual bool total_forces_enabled() const;
virtual bool total_forces_same_step() const;
protected:
enum Boundaries_type {
boundaries_non_periodic,
boundaries_pbc_ortho,
boundaries_pbc_triclinic,
boundaries_unsupported
};
Boundaries_type boundaries_type;
cvm::rvector unit_cell_x, unit_cell_y, unit_cell_z;
cvm::rvector reciprocal_cell_x, reciprocal_cell_y, reciprocal_cell_z;
};
class colvarproxy_atoms {
public:
colvarproxy_atoms();
virtual ~colvarproxy_atoms();
virtual int init_atom(int atom_number) = 0;
virtual int check_atom_id(int atom_number) = 0;
virtual int init_atom(cvm::residue_id const &residue,
std::string const &atom_name,
std::string const &segment_id);
virtual int check_atom_id(cvm::residue_id const &residue,
std::string const &atom_name,
std::string const &segment_id);
virtual void clear_atom(int index);
virtual int load_atoms(char const *filename,
cvm::atom_group &atoms,
std::string const &pdb_field,
double pdb_field_value = 0.0);
virtual int load_coords(char const *filename,
std::vector<cvm::atom_pos> &pos,
std::vector<int> const &sorted_ids,
std::string const &pdb_field,
double pdb_field_value = 0.0);
int reset();
inline int get_atom_id(int index) const
{
return atoms_ids[index];
}
inline cvm::real get_atom_mass(int index) const
{
return atoms_masses[index];
}
inline cvm::real get_atom_charge(int index) const
{
return atoms_charges[index];
}
inline cvm::rvector get_atom_position(int index) const
{
return atoms_positions[index];
}
inline cvm::rvector get_atom_total_force(int index) const
{
return atoms_total_forces[index];
}
inline void apply_atom_force(int index, cvm::rvector const &new_force)
{
atoms_new_colvar_forces[index] += new_force;
}
inline cvm::rvector get_atom_velocity(int index)
{
cvm::error("Error: reading the current velocity of an atom "
"is not yet implemented.\n",
COLVARS_NOT_IMPLEMENTED);
return cvm::rvector(0.0);
}
inline std::vector<int> *modify_atom_ids()
{
return &atoms_ids;
}
inline std::vector<cvm::real> *modify_atom_masses()
{
updated_masses_ = true;
return &atoms_masses;
}
inline std::vector<cvm::real> *modify_atom_charges()
{
updated_charges_ = true;
return &atoms_charges;
}
inline std::vector<cvm::rvector> *modify_atom_positions()
{
return &atoms_positions;
}
inline std::vector<cvm::rvector> *modify_atom_total_forces()
{
return &atoms_total_forces;
}
inline std::vector<cvm::rvector> *modify_atom_new_colvar_forces()
{
return &atoms_new_colvar_forces;
}
inline bool updated_masses() const
{
return updated_masses_;
}
inline bool updated_charges() const
{
return updated_charges_;
}
protected:
std::vector<int> atoms_ids;
std::vector<size_t> atoms_ncopies;
std::vector<cvm::real> atoms_masses;
std::vector<cvm::real> atoms_charges;
std::vector<cvm::rvector> atoms_positions;
std::vector<cvm::rvector> atoms_total_forces;
std::vector<cvm::rvector> atoms_new_colvar_forces;
bool updated_masses_, updated_charges_;
int add_atom_slot(int atom_id);
};
class colvarproxy_atom_groups {
public:
colvarproxy_atom_groups();
virtual ~colvarproxy_atom_groups();
int reset();
virtual int scalable_group_coms();
virtual int init_atom_group(std::vector<int> const &atoms_ids);
virtual void clear_atom_group(int index);
inline int get_atom_group_id(int index) const
{
return atom_groups_ids[index];
}
inline cvm::real get_atom_group_mass(int index) const
{
return atom_groups_masses[index];
}
inline cvm::real get_atom_group_charge(int index) const
{
return atom_groups_charges[index];
}
inline cvm::rvector get_atom_group_com(int index) const
{
return atom_groups_coms[index];
}
inline cvm::rvector get_atom_group_total_force(int index) const
{
return atom_groups_total_forces[index];
}
inline void apply_atom_group_force(int index, cvm::rvector const &new_force)
{
atom_groups_new_colvar_forces[index] += new_force;
}
inline cvm::rvector get_atom_group_velocity(int index)
{
cvm::error("Error: reading the current velocity of an atom group is not yet implemented.\n",
COLVARS_NOT_IMPLEMENTED);
return cvm::rvector(0.0);
}
protected:
std::vector<int> atom_groups_ids;
std::vector<size_t> atom_groups_ncopies;
std::vector<cvm::real> atom_groups_masses;
std::vector<cvm::real> atom_groups_charges;
std::vector<cvm::rvector> atom_groups_coms;
std::vector<cvm::rvector> atom_groups_total_forces;
std::vector<cvm::rvector> atom_groups_new_colvar_forces;
int add_atom_group_slot(int atom_group_id);
};
class colvarproxy_smp {
public:
colvarproxy_smp();
virtual ~colvarproxy_smp();
bool b_smp_active;
virtual int smp_enabled();
virtual int smp_colvars_loop();
virtual int smp_biases_loop();
virtual int smp_biases_script_loop();
virtual int smp_thread_id();
virtual int smp_num_threads();
virtual int smp_lock();
virtual int smp_trylock();
virtual int smp_unlock();
protected:
void *omp_lock_state;
};
class colvarproxy_replicas {
public:
colvarproxy_replicas();
virtual ~colvarproxy_replicas();
virtual bool replica_enabled();
virtual int replica_index();
virtual int replica_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);
};
class colvarproxy_script {
public:
colvarproxy_script();
virtual ~colvarproxy_script();
virtual char const *script_obj_to_str(unsigned char *obj);
virtual std::vector<std::string> script_obj_to_str_vector(unsigned char *obj);
colvarscript *script;
bool force_script_defined;
bool have_scripts;
virtual int run_force_callback();
virtual int run_colvar_callback(
std::string const &name,
std::vector<const colvarvalue *> const &cvcs,
colvarvalue &value);
virtual int run_colvar_gradient_callback(
std::string const &name,
std::vector<const colvarvalue *> const &cvcs,
std::vector<cvm::matrix2d<cvm::real> > &gradient);
};
class colvarproxy_tcl {
public:
colvarproxy_tcl();
virtual ~colvarproxy_tcl();
int tcl_available();
char const *tcl_obj_to_str(unsigned char *obj);
int tcl_run_force_callback();
int tcl_run_colvar_callback(
std::string const &name,
std::vector<const colvarvalue *> const &cvcs,
colvarvalue &value);
int tcl_run_colvar_gradient_callback(
std::string const &name,
std::vector<const colvarvalue *> const &cvcs,
std::vector<cvm::matrix2d<cvm::real> > &gradient);
protected:
void *tcl_interp_;
virtual void init_tcl_pointers();
};
class colvarproxy_io {
public:
colvarproxy_io();
virtual ~colvarproxy_io();
virtual int get_frame(long int &);
virtual int set_frame(long int);
virtual std::ostream *output_stream(std::string const &output_name,
std::ios_base::openmode mode =
std::ios_base::out);
virtual std::ostream *get_output_stream(std::string const &output_name);
virtual int flush_output_stream(std::ostream *os);
virtual int close_output_stream(std::string const &output_name);
virtual int backup_file(char const *filename);
inline int backup_file(std::string const &filename)
{
return backup_file(filename.c_str());
}
int remove_file(char const *filename);
inline int remove_file(std::string const &filename)
{
return remove_file(filename.c_str());
}
int rename_file(char const *filename, char const *newfilename);
inline int rename_file(std::string const &filename,
std::string const &newfilename)
{
return rename_file(filename.c_str(), newfilename.c_str());
}
inline std::string & input_prefix()
{
return input_prefix_str;
}
inline std::string & restart_output_prefix()
{
return restart_output_prefix_str;
}
inline std::string & output_prefix()
{
return output_prefix_str;
}
protected:
std::string input_prefix_str, output_prefix_str, restart_output_prefix_str;
std::list<std::ostream *> output_files;
std::list<std::string> output_stream_names;
};
class colvarproxy
: public colvarproxy_system,
public colvarproxy_atoms,
public colvarproxy_atom_groups,
public colvarproxy_smp,
public colvarproxy_replicas,
public colvarproxy_script,
public colvarproxy_tcl,
public colvarproxy_io
{
public:
colvarmodule *colvars;
colvarproxy();
virtual ~colvarproxy();
virtual int request_deletion();
inline bool delete_requested()
{
return b_delete_requested;
}
virtual int reset();
virtual int setup();
virtual int update_input();
virtual int update_output();
virtual void log(std::string const &message) = 0;
virtual void error(std::string const &message) = 0;
virtual void fatal_error(std::string const &message) = 0;
virtual size_t restart_frequency();
inline bool simulation_running() const
{
return b_simulation_running;
}
int get_version_from_string(char const *version_string);
int version_number() const
{
return version_int;
}
protected:
bool b_simulation_running;
bool b_delete_requested;
int version_int;
};
#endif