Documents/NamdSample/namd210/lib/abf/distance.tcl (64 lines of code) (raw):
###################################################
# ABF procedures for a distance between two atoms #
# Jerome Henin <jerome.henin@uhp-nancy.fr> #
###################################################
set ABFcoordID "Distance between two atoms (beware of constraints!)"
# Define coordinate-specific optional parameters with default values
array set ABFoptions {
temp 300.0
dxi 0.1
dSmooth 0.3
}
###############################################################
# ABFstartup : declares atoms whose coordinates are requested #
###############################################################
proc ABFstartup {} {
namespace eval ABFcoord {
set abf1 $::ABF::abf1
set abf2 $::ABF::abf2
addatom $abf1
addatom $abf2
}
}
################################################################
# ABFcoord : reads coord, returns value of reaction coordinate #
# called first #
################################################################
proc ABFcoord {} {
namespace eval ABFcoord {
loadcoords coords
set r [veclength [vecsub $coords($abf2) $coords($abf1)]]
return $r
}
}
############################################################
# ABForce : returns force along reaction coordinate #
# called third #
############################################################
proc ABForce {} {
namespace eval ABFcoord {
set dr [vecsub $coords($abf2) $coords($abf1)]
set nv [vecnorm $dr] ;# unity vector
loadtotalforces forces
set df [vecsub $forces($abf2) $forces($abf1)]
# Not including Jacobian term (2kT / r)
return [expr {[vecdot $df $nv]/ 2.0}]
}
}
###############################################################################
# ABFapply : applies the force given as a parameter along reaction coordinate #
###############################################################################
proc ABFapply {force} {
set ABFcoord::force $force
namespace eval ABFcoord {
set dr [vecsub $coords($abf2) $coords($abf1)]
set r [veclength $dr]
set nv [vecnorm $dr] ;# unity vector abf1 -> abf2
set force [expr {$force - 2.0 * 0.001986 * $::ABF::temp / $r}]
# compensate for the Jacobian term
set F2 [vecscale $force $nv]
addforce $abf1 [vecinvert $F2]
addforce $abf2 $F2
return $force
}
}