forked from lijiext/lammps
95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
|
/// \file integrate.h General headers for ABF_integrate
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <vector>
|
||
|
|
||
|
#define MIN_SAMPLES 1
|
||
|
|
||
|
/// Free energy gradients class
|
||
|
class ABFdata {
|
||
|
|
||
|
protected:
|
||
|
/// Sizes of (i-1) dimension blocks
|
||
|
/// computed as Prod_(j<i) sizes[j]
|
||
|
int *blocksizes;
|
||
|
/// Minimum values of each variable
|
||
|
double *mins;
|
||
|
|
||
|
public:
|
||
|
int Nvars;
|
||
|
/// Free energy gradients (vector field)
|
||
|
double *gradients;
|
||
|
/// Sampling from the ABF calculation
|
||
|
unsigned int *count;
|
||
|
/// Bin widths
|
||
|
double *widths;
|
||
|
|
||
|
unsigned int scalar_dim;
|
||
|
unsigned int vec_dim;
|
||
|
unsigned int *histogram;
|
||
|
|
||
|
/// History-dependent bias
|
||
|
double *bias;
|
||
|
|
||
|
/// Estimate of the FE gradient computed
|
||
|
/// from MtD bias or histogram in standard MC
|
||
|
double *estimate;
|
||
|
|
||
|
/// Deviation between starting free energy gradient and
|
||
|
/// estimated one
|
||
|
double *deviation;
|
||
|
|
||
|
void write_histogram(const char *fileName);
|
||
|
void write_bias(const char *fileName);
|
||
|
void write_field(double *field, const char *fileName);
|
||
|
|
||
|
/// Grid sizes
|
||
|
int *sizes;
|
||
|
|
||
|
/// Flag stating if each variable is periodic
|
||
|
int *PBC;
|
||
|
|
||
|
/// Constructor: reads from a file
|
||
|
ABFdata(const char *gradFileName);
|
||
|
~ABFdata();
|
||
|
|
||
|
/// \brief Returns an offset for scalar fields based on a n-index.
|
||
|
/// multiply by Nvars to get an offset in a Nvars-vector field
|
||
|
unsigned int offset(const int *);
|
||
|
|
||
|
inline bool wrap(int &pos, int i);
|
||
|
|
||
|
/// Decides if an offset is outside the allowed region based on the ABF sampling
|
||
|
inline bool allowed(unsigned int offset);
|
||
|
};
|
||
|
|
||
|
|
||
|
inline bool ABFdata::wrap(int &pos, int i)
|
||
|
{
|
||
|
if (PBC[i]) {
|
||
|
if (pos == -1) {
|
||
|
pos = sizes[i] - 1;
|
||
|
return true;
|
||
|
}
|
||
|
if (pos == sizes[i]) {
|
||
|
pos = 0;
|
||
|
return true;
|
||
|
}
|
||
|
} else {
|
||
|
// No PBC
|
||
|
if (pos == -1) {
|
||
|
pos = 0;
|
||
|
return false;
|
||
|
}
|
||
|
if (pos == sizes[i]) {
|
||
|
pos = sizes[i] - 1;
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
inline bool ABFdata::allowed(unsigned int offset) {
|
||
|
return count[offset] > MIN_SAMPLES;
|
||
|
}
|