Files
lammps/lib/colvars/colvarcomp_alchlambda.cpp
Giacomo Fiorin cba479bf6e Update Colvars library to version 2025-04-18
The following is a list of pull requests relevant to LAMMPS in the Colvars repository since 2024-08-06:

- 752 New tool poisson_integrator_conv
  https://github.com/Colvars/colvars/pull/752 (@jhenin)

- 733 Custom grids for all biases
  https://github.com/Colvars/colvars/pull/733 (@giacomofiorin, @jhenin)

- 776 Avoid error in acos and asin with fast-math
  https://github.com/Colvars/colvars/pull/776 (@jhenin)

- 773 fix: fix the clang build test failure of OPES
  https://github.com/Colvars/colvars/pull/773 (@HanatoK)

- 768 fix: clamp the input values of asin and acos in case of fast math on aarch64
  https://github.com/Colvars/colvars/pull/768 (@HanatoK)

- 761 Add debug code for the Jacobi failure
  https://github.com/Colvars/colvars/pull/761 (@HanatoK)

- 759 min_image fix; Saves long runs from crashes;
  https://github.com/Colvars/colvars/pull/759 (@PolyachenkoYA)

- 757 Fix MSVC OpenMP issue
  https://github.com/Colvars/colvars/pull/757 (@HanatoK)

- 755 Fix indentation of 'Init CVC' message in standard output
  https://github.com/Colvars/colvars/pull/755 (@jhenin)

- 750 Optimize and simplify the calculation of dihedral gradients
  https://github.com/Colvars/colvars/pull/750 (@HanatoK)

- 749 Add references to new Colvars paper
  https://github.com/Colvars/colvars/pull/749 (@jhenin, @giacomofiorin)

- 740 Report the specific C++ standard at init time, stop warning about C++97/03
  https://github.com/Colvars/colvars/pull/740 (@giacomofiorin)

- 731 Improve detection of hard/mathematical boundaries
  https://github.com/Colvars/colvars/pull/731 (@giacomofiorin)

- 729 Optimize the fit gradients
  https://github.com/Colvars/colvars/pull/729 (@HanatoK, @jhenin)

- 728 Fix undefined behavior when getting the current working directory from std::filesystem
  https://github.com/Colvars/colvars/pull/728 (@giacomofiorin)

- 727 Add patchversion scripting command
  https://github.com/Colvars/colvars/pull/727 (@giacomofiorin)

- 724 Fix gradients and metric functions of distanceDir
  https://github.com/Colvars/colvars/pull/724 (@giacomofiorin)

- 715 Add missing rotation in orientation component
  https://github.com/Colvars/colvars/pull/715 (@giacomofiorin)

- 713 fix: try to solve #87 for non-scala components
  https://github.com/Colvars/colvars/pull/713 (@HanatoK)

- 709 Implementation of OPES in Colvars
  https://github.com/Colvars/colvars/pull/709 (@HanatoK, @giacomofiorin, @jhenin)

- 706 BUGFIX for Segmentation fault in colvarbias_meta::calc_energy() with useGrids off
  https://github.com/Colvars/colvars/pull/706 (@alphataubio)

- 570 enable use of CVs defined by PyTorch neural network models
  https://github.com/Colvars/colvars/pull/570 (@zwpku, @giacomofiorin, @HanatoK, @jhenin)

Authors: @alphataubio, @EzryStIago, @giacomofiorin, @HanatoK, @jhenin, @PolyachenkoYA, @zwpku
2025-04-30 15:32:30 -04:00

130 lines
3.3 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 <algorithm>
#include "colvarmodule.h"
#include "colvarvalue.h"
#include "colvar.h"
#include "colvarcomp.h"
colvar::alch_lambda::alch_lambda()
{
set_function_type("alchLambda");
provide(f_cvc_explicit_gradient, false);
provide(f_cvc_gradient, false); // Cannot apply forces on this CVC
provide(f_cvc_collect_atom_ids, false);
provide(f_cvc_inv_gradient); // Projected force is TI derivative
provide(f_cvc_Jacobian); // Zero
x.type(colvarvalue::type_scalar);
// Query initial value from back-end; will be overwritten if restarting from a state file
cvm::proxy->get_alch_lambda(&x.real_value);
}
int colvar::alch_lambda::init_alchemy(int factor)
{
// We need calculation every time step
// default in Tinker-HP and NAMD2, must be enforced in NAMD3
// Also checks back-end settings, ie. that alchemy is enabled
// (in NAMD3: alchType TI, computeEnergies at the right frequency)
// Forbid MTS until fully implemented
if (factor != 1) {
return cvm::error("Error: timeStepFactor > 1 is not yet supported for alchemical variables.");
}
cvm::proxy->request_alch_energy_freq(factor);
return COLVARS_OK;
}
void colvar::alch_lambda::calc_value()
{
// By default, follow external parameter
// This might get overwritten by driving extended dynamics
// (in apply_force() below)
cvm::proxy->get_alch_lambda(&x.real_value);
cvm::proxy->get_dE_dlambda(&ft.real_value);
ft.real_value *= -1.0; // Convert energy derivative to force
// Include any force due to bias on Flambda
ft.real_value += cvm::proxy->indirect_lambda_biasing_force;
cvm::proxy->indirect_lambda_biasing_force = 0.0;
}
void colvar::alch_lambda::calc_force_invgrads()
{
// All the work is done in calc_value()
}
void colvar::alch_lambda::calc_Jacobian_derivative()
{
jd = 0.0;
}
void colvar::alch_lambda::apply_force(colvarvalue const & /* force */)
{
// Forces, if any, are applied in colvar::update_extended_Lagrangian()
}
colvar::alch_Flambda::alch_Flambda()
{
set_function_type("alch_Flambda");
disable(f_cvc_explicit_gradient);
disable(f_cvc_gradient);
x.type(colvarvalue::type_scalar);
}
void colvar::alch_Flambda::calc_value()
{
// Special workflow:
// at the beginning of the timestep we get a force instead of calculating the value
// Query initial value from back-end
cvm::proxy->get_dE_dlambda(&x.real_value);
x.real_value *= -1.0; // Energy derivative to force
}
void colvar::alch_Flambda::calc_gradients()
{
}
void colvar::alch_Flambda::apply_force(colvarvalue const &force)
{
// Convert force on Flambda to force on dE/dlambda
cvm::real f = -1.0 * force.real_value;
// Send scalar force to back-end, which will distribute it onto atoms
cvm::proxy->apply_force_dE_dlambda(&f);
// Propagate force on Flambda to lambda internally
cvm::real d2E_dlambda2;
cvm::proxy->get_d2E_dlambda2(&d2E_dlambda2);
// This accumulates a force, it needs to be zeroed when taken into account by lambda
cvm::proxy->indirect_lambda_biasing_force += d2E_dlambda2 * f;
}