This update consists exclusively of bugfixes or maintenance-related changes. The following is a list of pull requests in the Colvars repository since the previous update to LAMMPS: - 532 Add XYZ trajectory reading feature https://github.com/Colvars/colvars/pull/532 (@jhenin, @giacomofiorin) - 531 Delete objects quietly, unless explicitly requested via script (including VMD) https://github.com/Colvars/colvars/pull/531 (@giacomofiorin) - 530 Append newline to log and error messages if not already present https://github.com/Colvars/colvars/pull/530 (@giacomofiorin) - 528 Forward-declare OpenMP lock https://github.com/Colvars/colvars/pull/528 (@giacomofiorin) - 527 Remove unneeded STL container https://github.com/Colvars/colvars/pull/527 (@giacomofiorin) - 526 Allow collecting configuration files and strings before setting up interface https://github.com/Colvars/colvars/pull/526 (@giacomofiorin, @jhenin) - 523 Fallback to linearCombination when customFunction is missing in customColvar https://github.com/Colvars/colvars/pull/523 (@HanatoK, @giacomofiorin) - 522 Use iostream::fail() to check for I/O error https://github.com/Colvars/colvars/pull/522 (@jhenin) - 520 Fix ref count https://github.com/Colvars/colvars/pull/520 (@giacomofiorin) - 513 Set target temperature through a common code path https://github.com/Colvars/colvars/pull/513 (@giacomofiorin, @jhenin) - 509 Safer detection of Windows with recent Microsoft Visual Studio versions https://github.com/Colvars/colvars/pull/509 (@akohlmey) - 508 Update LAMMPS patching method to reflect Lepton availability https://github.com/Colvars/colvars/pull/508 (@giacomofiorin) - 497 Increase the precision of write_multicol https://github.com/Colvars/colvars/pull/497 (@HanatoK) - 496 Only perform MTS automatic enable/disable for timeStepFactor > 1 https://github.com/Colvars/colvars/pull/496 (@giacomofiorin) - 493 Remove unused branch of quaternion input function https://github.com/Colvars/colvars/pull/493 (@giacomofiorin) - 489 Ensure there are spaces between the fields in the header https://github.com/Colvars/colvars/pull/489 (@HanatoK) - 487 Use map of output streams, and return references to its elements https://github.com/Colvars/colvars/pull/487 (@giacomofiorin, @jhenin) - 486 Remember first step of moving restraint https://github.com/Colvars/colvars/pull/486 (@jhenin) - 485 Add decoupling option for moving restraints https://github.com/Colvars/colvars/pull/485 (@jhenin) - 483 Update Lepton via patching procedure https://github.com/Colvars/colvars/pull/483 (@giacomofiorin) - 481 Make file-reading operations of input data abstractable https://github.com/Colvars/colvars/pull/481 (@giacomofiorin) Authors: @akohlmey, @giacomofiorin, @HanatoK, @jhenin
262 lines
7.0 KiB
C++
262 lines
7.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.
|
|
|
|
/// \file Definition of the more complex members of colvar_grid<> template
|
|
|
|
#ifndef COLVARGRID_DEF_H
|
|
#define COLVARGRID_DEF_H
|
|
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
|
|
#include "colvarmodule.h"
|
|
#include "colvarproxy.h"
|
|
#include "colvar.h"
|
|
#include "colvargrid.h"
|
|
|
|
|
|
template <class T>
|
|
std::istream & colvar_grid<T>::read_multicol(std::istream &is, bool add)
|
|
{
|
|
// Data in the header: nColvars, then for each
|
|
// xiMin, dXi, nPoints, periodic flag
|
|
|
|
std::string hash;
|
|
cvm::real lower, width, x;
|
|
size_t n, periodic_flag;
|
|
bool remap;
|
|
std::vector<T> new_value;
|
|
std::vector<int> nx_read;
|
|
std::vector<int> bin;
|
|
|
|
if ( cv.size() > 0 && cv.size() != nd ) {
|
|
cvm::error("Cannot read grid file: number of variables in file differs from number referenced by grid.\n");
|
|
return is;
|
|
}
|
|
|
|
if ( !(is >> hash) || (hash != "#") ) {
|
|
cvm::error("Error reading grid at position "+
|
|
cvm::to_str(static_cast<size_t>(is.tellg()))+
|
|
" in stream(read \"" + hash + "\")\n", COLVARS_INPUT_ERROR);
|
|
return is;
|
|
}
|
|
|
|
is >> n;
|
|
if ( n != nd ) {
|
|
cvm::error("Error reading grid: wrong number of collective variables.\n");
|
|
return is;
|
|
}
|
|
|
|
nx_read.resize(n);
|
|
bin.resize(n);
|
|
new_value.resize(mult);
|
|
|
|
if (this->has_parent_data && add) {
|
|
new_data.resize(data.size());
|
|
}
|
|
|
|
remap = false;
|
|
for (size_t i = 0; i < nd; i++ ) {
|
|
if ( !(is >> hash) || (hash != "#") ) {
|
|
cvm::error("Error reading grid at position "+
|
|
cvm::to_str(static_cast<size_t>(is.tellg()))+
|
|
" in stream(read \"" + hash + "\")\n");
|
|
return is;
|
|
}
|
|
|
|
is >> lower >> width >> nx_read[i] >> periodic_flag;
|
|
|
|
|
|
if ( (cvm::fabs(lower - lower_boundaries[i].real_value) > 1.0e-10) ||
|
|
(cvm::fabs(width - widths[i] ) > 1.0e-10) ||
|
|
(nx_read[i] != nx[i]) ) {
|
|
cvm::log("Warning: reading from different grid definition (colvar "
|
|
+ cvm::to_str(i+1) + "); remapping data on new grid.\n");
|
|
remap = true;
|
|
}
|
|
}
|
|
|
|
if ( remap ) {
|
|
// re-grid data
|
|
while (is.good()) {
|
|
bool end_of_file = false;
|
|
|
|
for (size_t i = 0; i < nd; i++ ) {
|
|
if ( !(is >> x) ) end_of_file = true;
|
|
bin[i] = value_to_bin_scalar(x, i);
|
|
}
|
|
if (end_of_file) break;
|
|
|
|
for (size_t imult = 0; imult < mult; imult++) {
|
|
is >> new_value[imult];
|
|
}
|
|
|
|
if ( index_ok(bin) ) {
|
|
for (size_t imult = 0; imult < mult; imult++) {
|
|
value_input(bin, new_value[imult], imult, add);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// do not re-grid the data but assume the same grid is used
|
|
for (std::vector<int> ix = new_index(); index_ok(ix); incr(ix) ) {
|
|
for (size_t i = 0; i < nd; i++ ) {
|
|
is >> x;
|
|
}
|
|
for (size_t imult = 0; imult < mult; imult++) {
|
|
is >> new_value[imult];
|
|
value_input(ix, new_value[imult], imult, add);
|
|
}
|
|
}
|
|
}
|
|
has_data = true;
|
|
return is;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
int colvar_grid<T>::read_multicol(std::string const &filename,
|
|
std::string description,
|
|
bool add)
|
|
{
|
|
std::istream &is = cvm::main()->proxy->input_stream(filename, description);
|
|
if (!is) {
|
|
return COLVARS_FILE_ERROR;
|
|
}
|
|
if (colvar_grid<T>::read_multicol(is, add)) {
|
|
cvm::main()->proxy->close_input_stream(filename);
|
|
return COLVARS_OK;
|
|
}
|
|
return COLVARS_FILE_ERROR;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
std::ostream & colvar_grid<T>::write_multicol(std::ostream &os) const
|
|
{
|
|
// Save the output formats
|
|
std::ios_base::fmtflags prev_flags(os.flags());
|
|
|
|
// Data in the header: nColvars, then for each
|
|
// xiMin, dXi, nPoints, periodic
|
|
|
|
os << std::setw(2) << "# " << nd << "\n";
|
|
// Write the floating numbers in full precision
|
|
os.setf(std::ios::scientific, std::ios::floatfield);
|
|
for (size_t i = 0; i < nd; i++) {
|
|
os << "# "
|
|
<< std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << lower_boundaries[i] << " "
|
|
<< std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << widths[i] << " "
|
|
<< std::setw(10) << nx[i] << " "
|
|
<< periodic[i] << "\n";
|
|
}
|
|
|
|
for (std::vector<int> ix = new_index(); index_ok(ix); incr(ix) ) {
|
|
|
|
if (ix.back() == 0) {
|
|
// if the last index is 0, add a new line to mark the new record
|
|
os << "\n";
|
|
}
|
|
|
|
for (size_t i = 0; i < nd; i++) {
|
|
os << " "
|
|
<< std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec)
|
|
<< bin_to_value_scalar(ix[i], i);
|
|
}
|
|
os << " ";
|
|
for (size_t imult = 0; imult < mult; imult++) {
|
|
os << " "
|
|
<< std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec)
|
|
<< value_output(ix, imult);
|
|
}
|
|
os << "\n";
|
|
}
|
|
|
|
// Restore the output formats
|
|
os.flags(prev_flags);
|
|
|
|
return os;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
int colvar_grid<T>::write_multicol(std::string const &filename,
|
|
std::string description) const
|
|
{
|
|
int error_code = COLVARS_OK;
|
|
std::ostream &os = cvm::main()->proxy->output_stream(filename, description);
|
|
if (!os) {
|
|
return COLVARS_FILE_ERROR;
|
|
}
|
|
error_code |= colvar_grid<T>::write_multicol(os) ? COLVARS_OK :
|
|
COLVARS_FILE_ERROR;
|
|
cvm::main()->proxy->close_output_stream(filename);
|
|
return error_code;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
std::ostream & colvar_grid<T>::write_opendx(std::ostream &os) const
|
|
{
|
|
// write the header
|
|
os << "object 1 class gridpositions counts";
|
|
size_t icv;
|
|
for (icv = 0; icv < num_variables(); icv++) {
|
|
os << " " << number_of_points(icv);
|
|
}
|
|
os << "\n";
|
|
|
|
os << "origin";
|
|
for (icv = 0; icv < num_variables(); icv++) {
|
|
os << " " << (lower_boundaries[icv].real_value + 0.5 * widths[icv]);
|
|
}
|
|
os << "\n";
|
|
|
|
for (icv = 0; icv < num_variables(); icv++) {
|
|
os << "delta";
|
|
for (size_t icv2 = 0; icv2 < num_variables(); icv2++) {
|
|
if (icv == icv2) os << " " << widths[icv];
|
|
else os << " " << 0.0;
|
|
}
|
|
os << "\n";
|
|
}
|
|
|
|
os << "object 2 class gridconnections counts";
|
|
for (icv = 0; icv < num_variables(); icv++) {
|
|
os << " " << number_of_points(icv);
|
|
}
|
|
os << "\n";
|
|
|
|
os << "object 3 class array type double rank 0 items "
|
|
<< number_of_points() << " data follows\n";
|
|
|
|
write_raw(os);
|
|
|
|
os << "object \"collective variables scalar field\" class field\n";
|
|
return os;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
int colvar_grid<T>::write_opendx(std::string const &filename,
|
|
std::string description) const
|
|
{
|
|
int error_code = COLVARS_OK;
|
|
std::ostream &os = cvm::main()->proxy->output_stream(filename, description);
|
|
if (!os) {
|
|
return COLVARS_FILE_ERROR;
|
|
}
|
|
error_code |= colvar_grid<T>::write_opendx(os) ? COLVARS_OK :
|
|
COLVARS_FILE_ERROR;
|
|
cvm::main()->proxy->close_output_stream(filename);
|
|
return error_code;
|
|
}
|
|
|
|
#endif
|