Files
lammps/lib/colvars/colvarproxy_system.cpp
2024-08-06 01:07:43 +02:00

205 lines
5.0 KiB
C++

// -*- c++ -*-
// This file is part of the Collective Variables module (Colvars).
// The original version of Colvars and its updates are located at:
// https://github.com/Colvars/colvars
// Please update all Colvars source files before making any changes.
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
#include "colvarmodule.h"
#include "colvartypes.h"
#include "colvarproxy_system.h"
colvarproxy_system::colvarproxy_system()
{
angstrom_value_ = 0.0;
kcal_mol_value_ = 0.0;
timestep_ = 1.0;
target_temperature_ = 0.0;
boltzmann_ = 0.001987191; // Default: kcal/mol/K
boundaries_type = boundaries_unsupported;
total_force_requested = false;
indirect_lambda_biasing_force = 0.0;
cached_alch_lambda_changed = false;
cached_alch_lambda = -1.0;
reset_pbc_lattice();
}
colvarproxy_system::~colvarproxy_system() {}
int colvarproxy_system::set_unit_system(std::string const & /* units */,
bool /* check_only */)
{
return COLVARS_NOT_IMPLEMENTED;
}
int colvarproxy_system::set_target_temperature(cvm::real T)
{
target_temperature_ = T;
return COLVARS_OK;
}
int colvarproxy_system::set_integration_timestep(cvm::real dt)
{
timestep_ = dt;
return COLVARS_OK;
}
cvm::real colvarproxy_system::rand_gaussian()
{
// TODO define, document and implement a user method to set the value of this
return 0.0;
}
void colvarproxy_system::add_energy(cvm::real /* energy */) {}
void colvarproxy_system::request_total_force(bool yesno)
{
if (yesno == true)
cvm::error("Error: total forces are currently not implemented.\n",
COLVARS_NOT_IMPLEMENTED);
}
bool colvarproxy_system::total_forces_enabled() const
{
return false;
}
bool colvarproxy_system::total_forces_same_step() const
{
return false;
}
inline int round_to_integer(cvm::real x)
{
return int(cvm::floor(x+0.5));
}
void colvarproxy_system::update_pbc_lattice()
{
// Periodicity is assumed in all directions
if (boundaries_type == boundaries_unsupported ||
boundaries_type == boundaries_non_periodic) {
cvm::error("Error: setting PBC lattice with unsupported boundaries.\n",
COLVARS_BUG_ERROR);
return;
}
{
cvm::rvector const v = cvm::rvector::outer(unit_cell_y, unit_cell_z);
reciprocal_cell_x = v/(v*unit_cell_x);
}
{
cvm::rvector const v = cvm::rvector::outer(unit_cell_z, unit_cell_x);
reciprocal_cell_y = v/(v*unit_cell_y);
}
{
cvm::rvector const v = cvm::rvector::outer(unit_cell_x, unit_cell_y);
reciprocal_cell_z = v/(v*unit_cell_z);
}
}
void colvarproxy_system::reset_pbc_lattice()
{
unit_cell_x.reset();
unit_cell_y.reset();
unit_cell_z.reset();
reciprocal_cell_x.reset();
reciprocal_cell_y.reset();
reciprocal_cell_z.reset();
}
cvm::rvector colvarproxy_system::position_distance(cvm::atom_pos const &pos1,
cvm::atom_pos const &pos2)
const
{
if (boundaries_type == boundaries_unsupported) {
cvm::error("Error: unsupported boundary conditions.\n", COLVARS_INPUT_ERROR);
}
cvm::rvector diff = (pos2 - pos1);
if (boundaries_type == boundaries_non_periodic) return diff;
cvm::real const x_shift = round_to_integer(reciprocal_cell_x*diff);
cvm::real const y_shift = round_to_integer(reciprocal_cell_y*diff);
cvm::real const z_shift = round_to_integer(reciprocal_cell_z*diff);
diff.x -= x_shift*unit_cell_x.x + y_shift*unit_cell_y.x +
z_shift*unit_cell_z.x;
diff.y -= x_shift*unit_cell_x.y + y_shift*unit_cell_y.y +
z_shift*unit_cell_z.y;
diff.z -= x_shift*unit_cell_x.z + y_shift*unit_cell_y.z +
z_shift*unit_cell_z.z;
return diff;
}
int colvarproxy_system::get_molid(int &)
{
cvm::error("Error: only VMD allows the use of multiple \"molecules\", "
"i.e. multiple molecular systems.", COLVARS_NOT_IMPLEMENTED);
return -1;
}
int colvarproxy_system::get_alch_lambda(cvm::real * /* lambda */)
{
return cvm::error("Error in get_alch_lambda: alchemical lambda dynamics is not supported by this build.",
COLVARS_NOT_IMPLEMENTED);
}
void colvarproxy_system::set_alch_lambda(cvm::real lambda)
{
cached_alch_lambda = lambda;
cached_alch_lambda_changed = true;
}
int colvarproxy_system::send_alch_lambda()
{
return cvm::error("Error in set_alch_lambda: alchemical lambda dynamics is not supported by this build.",
COLVARS_NOT_IMPLEMENTED);
}
int colvarproxy_system::get_dE_dlambda(cvm::real * /* force */)
{
return cvm::error("Error in get_dE_dlambda: alchemical lambda dynamics is not supported by this build.",
COLVARS_NOT_IMPLEMENTED);
}
int colvarproxy_system::apply_force_dE_dlambda(cvm::real* /* force */)
{
return cvm::error("Error in apply_force_dE_dlambda: function is not implemented by this build.",
COLVARS_NOT_IMPLEMENTED);
}
int colvarproxy_system::get_d2E_dlambda2(cvm::real*)
{
return cvm::error("Error in get_d2E_dlambda2: function is not implemented by this build.",
COLVARS_NOT_IMPLEMENTED);
}