RAU_MasterStudy/thesis/old/openmm_help/omm_vfswitch.py
2025-06-04 20:04:29 +03:00

122 lines
4.1 KiB
Python

"""
Generated by CHARMM-GUI (http://www.charmm-gui.org)
omm_vfswitch.py
This module contains vdW force-switching fuctions for OpenMM.
Correspondance: jul316@lehigh.edu or wonpil@lehigh.edu
Last update: February 5, 2025
"""
from openmm import *
from openmm.app import *
from openmm.unit import *
def vfswitch(system, psf, inputs):
r_on = inputs.r_on
r_off = inputs.r_off
# custom nonbonded force for force-switch
chknbfix = False
for force in system.getForces():
if isinstance(force, NonbondedForce):
nonbonded = force
if (
isinstance(force, CustomNonbondedForce)
and force.getNumTabulatedFunctions() == 2
):
nbfix = force
chknbfix = True
if not chknbfix:
# vfswitch w/o NBFIX
vfswitch = CustomNonbondedForce(
"select(step(r-Ron),(cr12*rjunk12 - cr6*rjunk6),"
"(ccnba/r^12-ccnbb/r^6-ccnba/onoff^6+ccnbb/onoff^3));"
"cr12 = ccnba*ofdif6;"
"cr6 = ccnbb*ofdif3;"
"rjunk12 = (1.0/r^6-1.0/Roff6)^2;"
"rjunk6 = (1.0/r^3-1.0/Roff3)^2;"
"ccnba = 4.0*epsilon*sigma^12;"
"ccnbb = 4.0*epsilon*sigma^6;"
"sigma = sigma1+sigma2;"
"epsilon = epsilon1*epsilon2;"
"ofdif6 = Roff6/(Roff6 - Ron^6);"
"ofdif3 = Roff3/(Roff3 - Ron^3);"
"onoff = Roff * Ron;"
"Roff6 = Roff^6;"
"Roff3 = Roff^3;"
"Ron = %f;"
"Roff = %f;" % (r_on, r_off)
)
vfswitch.addPerParticleParameter("sigma")
vfswitch.addPerParticleParameter("epsilon")
vfswitch.setNonbondedMethod(vfswitch.CutoffPeriodic)
vfswitch.setCutoffDistance(nonbonded.getCutoffDistance())
for i in range(nonbonded.getNumParticles()):
chg, sig, eps = nonbonded.getParticleParameters(i)
nonbonded.setParticleParameters(i, chg, 0.0, 0.0) # zero-out LJ
sig = sig * 0.5
eps = eps**0.5
vfswitch.addParticle([sig, eps])
for i in range(nonbonded.getNumExceptions()):
atom1, atom2 = nonbonded.getExceptionParameters(i)[:2]
vfswitch.addExclusion(atom1, atom2)
vfswitch.setForceGroup(psf.NONBONDED_FORCE_GROUP)
system.addForce(vfswitch)
else:
# vfswitch w/ NBFIX
nbfix.setEnergyFunction(
"select(step(r-Ron),(cr12*rjunk12 - cr6*rjunk6),"
"(ccnba/r^12-ccnbb/r^6-ccnba/onoff^6+ccnbb/onoff^3));"
"cr12 = ccnba*ofdif6;"
"cr6 = ccnbb*ofdif3;"
"rjunk12 = (1.0/r^6-1.0/Roff6)^2;"
"rjunk6 = (1.0/r^3-1.0/Roff3)^2;"
"ccnbb = bcoef(type1, type2);"
"ccnba = acoef(type1, type2)^2;"
"ofdif6 = Roff6/(Roff6 - Ron^6);"
"ofdif3 = Roff3/(Roff3 - Ron^3);"
"onoff = Roff * Ron;"
"Roff6 = Roff^6;"
"Roff3 = Roff^3;"
"Ron = %f;"
"Roff = %f;" % (r_on, r_off)
)
# turn off long range correction (OpenMM Issues: #2353)
nbfix.setUseLongRangeCorrection(False)
# vfswitch14
vfswitch14 = CustomBondForce(
"select(step(r-Ron),(cr12*rjunk12 - cr6*rjunk6),"
"(ccnba/r^12-ccnbb/r^6-ccnba/onoff^6+ccnbb/onoff^3));"
"cr12 = ccnba*ofdif6;"
"cr6 = ccnbb*ofdif3;"
"rjunk12 = (1.0/r^6-1.0/Roff6)^2;"
"rjunk6 = (1.0/r^3-1.0/Roff3)^2;"
"ccnba = 4.0*epsilon*sigma^12;"
"ccnbb = 4.0*epsilon*sigma^6;"
"ofdif6 = Roff6/(Roff6 - Ron^6);"
"ofdif3 = Roff3/(Roff3 - Ron^3);"
"onoff = Roff * Ron;"
"Roff6 = Roff^6;"
"Roff3 = Roff^3;"
"Ron = %f;"
"Roff = %f;" % (r_on, r_off)
)
vfswitch14.addPerBondParameter("sigma")
vfswitch14.addPerBondParameter("epsilon")
for i in range(nonbonded.getNumExceptions()):
atom1, atom2, chg, sig, eps = nonbonded.getExceptionParameters(i)
nonbonded.setExceptionParameters(
i, atom1, atom2, chg, 0.0, 0.0
) # zero-out LJ14
vfswitch14.addBond(atom1, atom2, [sig, eps])
system.addForce(vfswitch14)
return system