8 #include "CfbRebridgeBase.h" 9 #include <mcMd/mcSimulation/McSystem.h> 11 #include <mcMd/chemistry/Atom.h> 12 #include <mcMd/chemistry/Bond.h> 30 #ifdef MCMD_NOMASKBONDED 31 UTIL_THROW(
"CfbRebridgeBase is unusable ifdef MCMD_NOMASKBONDED");
35 UTIL_THROW(
"CfbRebrigeBase is unusable with dihedrals");
51 read<int>(in,
"nTrial",
nTrial_);
59 read<double>(in,
"kappa10",
kappa10_);
67 loadParameter<int>(ar,
"nTrial",
nTrial_);
68 loadParameter<double>(ar,
"length21",
length21_);
69 loadParameter<double>(ar,
"length10",
length10_);
70 loadParameter<double>(ar,
"kappa10",
kappa10_);
95 double lmin, lmax, del, pi;
108 angTable[0] = pi/2.0;
110 normalTable[0] = 2.0;
115 orientationBiasTable(lmin, angTable[0], kappaTable[0], normalTable[0]);
119 del = (lmax - lmin) /
double(MaxBin_-2);
120 l20 = lmin - del/2.0;
121 for (i=1; i<MaxBin_-1; i++) {
124 orientationBiasTable(l20, angTable[i], kappaTable[i], normalTable[i]);
128 l20Table[MaxBin_-1] = lmax;
129 angTable[MaxBin_-1] = 0.0;
131 computeNormalization(angTable[MaxBin_-1], kappaTable[MaxBin_-1],
132 normalTable[MaxBin_-1]);
153 int prevBType,
int nextBType,
154 double &rosenbluth,
double &energy)
159 Vector bondVec, trialPos, u_20, u_21;
160 double trialEnergy, bondEnergy, wExt, length, lengthSq;
161 double l_20, l_21, bias;
162 double prefAng, kappaAng, normConst;
168 l_20 = sqrt(lengthSq);
173 l_21 = sqrt(lengthSq);
180 energy += bondEnergy;
190 if (
system().hasAnglePotential()) {
196 if (
system().hasExternalPotential()) {
201 energy += trialEnergy;
204 getAngKappaNorm(l_20, prefAng, kappaAng, normConst);
205 orientationBias(u_21, u_20, prefAng, kappaAng, bias);
208 rosenbluth = normConst / bias;
211 wExt =
boltzmann(trialEnergy + bondEnergy);
215 for (iTrial=0; iTrial <
nTrial_ - 1; iTrial++) {
220 trialPos.
add(prevPos, bondVec);
224 l_21 = sqrt(lengthSq);
226 orientationBias(u_21, u_20, prefAng, kappaAng, bias);
229 if (bias >
random().uniform(0.0, 1.0)) {
245 if (
system().hasAnglePotential()) {
251 if (
system().hasExternalPotential()) {
256 wExt +=
boltzmann(trialEnergy + bondEnergy);
270 int prevBType,
int nextBType,
271 double &rosenbluth,
double &energy)
275 Vector u_20, u_21, bondVec;
280 double beta, length, lengthSq, wExt;
281 double prefAng, kappaAng, normConst;
287 l_20 = sqrt(lengthSq);
293 randomBondLength(&
random(), beta, prevBType);
301 getAngKappaNorm(l_20, prefAng, kappaAng, normConst);
304 for (iTrial=0; iTrial <
nTrial_; iTrial++) {
309 trialPos[iTrial].
add(prevPos, bondVec);
313 l_21 = sqrt(lengthSq);
315 orientationBias(u_21, u_20, prefAng, kappaAng, bias[iTrial]);
318 if (bias[iTrial] >
random().uniform(0.0, 1.0)) {
327 partPtr->
position() = trialPos[iTrial];
332 trialEnergy[iTrial] = 0.0;
336 if (
system().hasAnglePotential()) {
337 trialEnergy[iTrial] +=
343 if (
system().hasExternalPotential()) {
344 trialEnergy[iTrial] +=
350 boltzmann(trialEnergy[iTrial] + bondEnergy[iTrial]);
351 wExt += trialProb[iTrial];
355 for (iTrial=0; iTrial <
nTrial_; iTrial++) {
356 trialProb[iTrial] = trialProb[iTrial] / wExt;
363 energy += trialEnergy[iTrial];
366 energy += bondEnergy[iTrial];
369 partPtr->
position() = trialPos[iTrial];
372 rosenbluth = wExt * normConst / bias[iTrial];
380 int *bonds,
double &rosenbluth,
double &energy)
385 int prevBType, nextBType;
386 double rosen_r, energy_r;
393 prevPtr = thisPtr - sign;
394 nextPtr = thisPtr + sign;
397 nextBType = bonds[0];
398 prevBType = bonds[1];
402 prevBType, nextBType, rosen_r, energy_r);
406 rosenbluth *= rosen_r;
411 for (
int i = 0; i < nActive - 1; ++i) {
415 prevBType = bonds[i+2];
416 deleteEndAtom(thisPtr, prevPtr, prevBType, rosen_r, energy_r);
421 rosenbluth *= rosen_r;
431 int *bonds,
double &rosenbluth,
double &energy)
436 int prevBType, nextBType;
437 double rosen_f, energy_f;
445 prevPtr = thisPtr - sign;
447 for (
int i = 0; i < nActive - 1; ++i) {
448 prevBType = bonds[nActive - i];
449 addEndAtom(thisPtr, prevPtr, prevBType, rosen_f, energy_f);
454 rosenbluth *= rosen_f;
463 prevPtr = thisPtr - sign;
464 nextPtr = thisPtr + sign;
465 prevBType = bonds[1];
466 nextBType = bonds[0];
470 prevBType, nextBType, rosen_f, energy_f);
475 rosenbluth *= rosen_f;
489 void CfbRebridgeBase::orientationBiasTable
490 (
double l_20,
double &prefAng,
double &kappaAng,
double &normConst)
502 prefAng = acos(-1.0)/2.0;
505 prefAng = acos(-1.0);
520 prefAng = acos(cos_ang);
522 kappaAng =
kappa10_ * kappaAng * kappaAng * (1.0 - cos_ang*cos_ang);
527 if (kappaAng < 1.0E-7) {
530 computeNormalization(prefAng, kappaAng, normConst);
538 void CfbRebridgeBase::computeNormalization
539 (
double prefAng,
double kappaAng,
double &normConst)
542 double delta, x, sum, tmp;
547 delta = acos(-1.0)/double(N);
552 for (i=0; i < N-1; i=i+2) {
555 sum += 2.0 *
boltzmann( tmp * (x-prefAng)*(x-prefAng) ) * sin(x);
558 sum += 4.0 *
boltzmann( tmp * (x-prefAng)*(x-prefAng) ) * sin(x);
560 normConst = delta*sum/3.0;
static const int MaxTrial_
Maximum allowed number of trial positions for a regrown atom.
virtual void setup()
Initialize the arrays for preferential angle, effective spring constant and normalization factor...
virtual ~CfbRebridgeBase()
Destructor.
A System for use in a Markov chain Monte Carlo simulation.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
A Vector is a Cartesian vector.
virtual double atomEnergy(const Atom &atom) const =0
Calculate the external energy for one Atom.
void addEndAtom(Atom *endPtr, Atom *pvtPtr, int bondType, double &rosenbluth, double &energy)
Configuration bias algorithm for adding an atom to a chain end.
Vector & add(const Vector &v1, const Vector &v2)
Add vectors v1 and v2.
double distanceSq(const Vector &r1, const Vector &r2) const
Return square distance between positions r1 and r2.
Include this file to include all MC potential energy classes at once.
BondPotential & bondPotential() const
Return the BondPotential by reference.
bool hasDihedralPotential() const
Does a dihedral potential exist?.
void deleteMiddleAtom(Atom *partPtr, Atom *prevPtr, Atom *nextPtr, int prevBType, int nextBType, double &rosenbluth, double &energy)
Configuration bias algorithm for deleting a particle between two monomers and compute the correspondi...
void addAtom(Atom &atom)
Add an Atom to the CellList.
virtual void readParameters(std::istream &in)
Read species type, nTrial, and parameters needed to evaluate the orientation bias.
File containing preprocessor macros for error handling.
long drawFrom(double probability[], long size)
Choose one of several outcomes with a specified set of probabilities.
double kappa10_
Spring constant (1-0 bond).
Saving / output archive for binary ostream.
void addMiddleAtom(Atom *partPtr, Atom *prevPtr, Atom *nextPtr, int prevBType, int nextBType, double &rosenbluth, double &energy)
Configuration bias algorithm for adding the last particle with special bias in favor of closing the b...
double boltzmann(double energy)
Boltzmann weight associated with an energy difference.
void addSequence(int nActive, int sign, Atom *beginPtr, int *bonds, double &rosenbluth, double &energy)
Configuration bias algorithm for adding a consequtive sequence of atoms.
double beta() const
Return the inverse temperature.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
McSystem & system()
Get parent McSystem.
virtual double atomEnergy(const Atom &atom) const
Calculate the covalent angle energy for one Atom.
ExternalPotential & externalPotential() const
Return ExternalPotential by reference.
A point particle within a Molecule.
Utility classes for scientific computation.
void shift(Vector &r) const
Shift Cartesian Vector r to its primary image.
Random & random()
Get Random number generator of parent Simulation.
McPairPotential & pairPotential() const
Return the McPairPotential by reference.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
virtual double energy(double rSq, int type) const =0
Returns potential energy for one bond.
void deleteSequence(int nActive, int sign, Atom *endPtr, int *bonds, double &rosenbluth, double &energy)
Configuration bias algorithm for deleting a consequtive sequence of atoms.
void deleteEndAtom(Atom *endPtr, Atom *pvtPtr, int bondType, double &rosenbluth, double &energy)
CFB algorithm for deleting an end atom from a flexible chain.
Saving archive for binary istream.
Single-processor Monte Carlo (MC) and molecular dynamics (MD).
double length10_
Equilibrium bond lengths (1-0 bonds).
int nTrial_
Actual number of trial positions for each regrown atom.
AnglePotential & anglePotential() const
Return AnglePotential by reference.
const Vector & position() const
Get the position Vector by const reference.
Base class for configuration bias (CFB) end regrowth moves.
CfbRebridgeBase(McSystem &system)
Constructor.
void deleteAtom(Atom &atom)
Remove an Atom from the CellList.
EnergyEnsemble & energyEnsemble()
Get EnergyEnsemble object of parent McSystem.
virtual double atomEnergy(const Atom &atom) const =0
Calculate the nonbonded pair energy for one Atom.
void unitVector(Vector &v)
Generate unit vector with uniform probability over the unit sphere.
Boundary & boundary()
Get Boundary object of parent McSystem.
double length21_
Equilibrium bond lengths (2-1 bond).