use of ffx.potential.bonded.StretchBend in project ffx by mjschnie.
the class ForceFieldEnergyOpenMM method addStretchBendForce.
private void addStretchBendForce() {
StretchBend[] stretchBends = super.getStretchBends();
if (stretchBends == null || stretchBends.length < 1) {
return;
}
int nStretchBends = stretchBends.length;
amoebaStretchBendForce = OpenMM_AmoebaStretchBendForce_create();
for (int i = 0; i < nStretchBends; i++) {
StretchBend stretchBend = stretchBends[i];
int i1 = stretchBend.getAtom(0).getXyzIndex() - 1;
int i2 = stretchBend.getAtom(1).getXyzIndex() - 1;
int i3 = stretchBend.getAtom(2).getXyzIndex() - 1;
double angle = stretchBend.angleEq;
double beq0 = stretchBend.bond0Eq;
double beq1 = stretchBend.bond1Eq;
double fc0 = stretchBend.force0;
double fc1 = stretchBend.force1;
OpenMM_AmoebaStretchBendForce_addStretchBend(amoebaStretchBendForce, i1, i2, i3, beq0 * OpenMM_NmPerAngstrom, beq1 * OpenMM_NmPerAngstrom, OpenMM_RadiansPerDegree * angle, (OpenMM_KJPerKcal / OpenMM_NmPerAngstrom) * fc0, (OpenMM_KJPerKcal / OpenMM_NmPerAngstrom) * fc1);
}
OpenMM_System_addForce(system, amoebaStretchBendForce);
logger.log(Level.INFO, " Added Stretch Bends ({0})", nStretchBends);
}
use of ffx.potential.bonded.StretchBend in project ffx by mjschnie.
the class ForceFieldEnergy method reInit.
/**
* Need to remove degree of freedom that are lost to prevent heating.
*/
public void reInit() {
int[] molecule;
if (esvTerm) {
atoms = esvSystem.getExtendedAndBackgroundAtoms();
molecule = esvSystem.getExtendedAndBackgroundMolecule();
} else {
atoms = molecularAssembly.getAtomArray();
molecule = molecularAssembly.getMoleculeNumbers();
}
nAtoms = atoms.length;
/* TODO Decide on only growing vs. always modifying xyz.
if (xyz.length < 3 * nAtoms) {
xyz = new double[nAtoms * 3];
} */
xyz = new double[nAtoms * 3];
getCoordinates(xyz);
// Check that atom ordering is correct and count number of Active atoms.
for (int i = 0; i < nAtoms; i++) {
Atom atom = atoms[i];
int index = atom.getXyzIndex() - 1;
if (index != i) {
atom.setXyzIndex(i + 1);
}
}
// Collect, count, pack and sort bonds.
if (bondTerm) {
ArrayList<ROLS> bond = molecularAssembly.getBondList();
nBonds = 0;
for (ROLS r : bond) {
if (keep((Bond) r)) {
nBonds++;
}
}
if (nBonds > bonds.length) {
bonds = new Bond[nBonds];
}
Arrays.fill(bonds, null);
nBonds = 0;
for (ROLS r : bond) {
if (keep((Bond) r)) {
bonds[nBonds++] = (Bond) r;
}
}
Arrays.sort(bonds, 0, nBonds);
if (nBonds > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Bonds: %10d", nBonds));
}
} else {
nBonds = 0;
bonds = null;
}
// Collect, count, pack and sort angles.
if (angleTerm) {
ArrayList<ROLS> angle = molecularAssembly.getAngleList();
nAngles = 0;
for (ROLS r : angle) {
if (keep((Angle) r)) {
nAngles++;
}
}
if (nAngles > angles.length) {
angles = new Angle[nAngles];
}
Arrays.fill(angles, null);
nAngles = 0;
for (ROLS r : angle) {
if (keep((Angle) r)) {
angles[nAngles++] = (Angle) r;
}
}
Arrays.sort(angles, 0, nAngles);
if (nAngles > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Angles: %10d", nAngles));
}
} else {
nAngles = 0;
angles = null;
}
// Collect, count, pack and sort stretch-bends.
if (stretchBendTerm) {
ArrayList<ROLS> stretchBend = molecularAssembly.getStretchBendList();
nStretchBends = 0;
for (ROLS r : stretchBend) {
if (keep((StretchBend) r)) {
nStretchBends++;
}
}
if (nStretchBends > stretchBends.length) {
stretchBends = new StretchBend[nStretchBends];
}
Arrays.fill(stretchBends, null);
nStretchBends = 0;
for (ROLS r : stretchBend) {
if (keep((StretchBend) r)) {
stretchBends[nStretchBends++] = (StretchBend) r;
}
}
Arrays.sort(stretchBends, 0, nStretchBends);
if (nStretchBends > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Stretch-Bends: %10d", nStretchBends));
}
} else {
nStretchBends = 0;
stretchBends = null;
}
// Collect, count, pack and sort Urey-Bradleys.
if (ureyBradleyTerm) {
ArrayList<ROLS> ureyBradley = molecularAssembly.getUreyBradleyList();
nUreyBradleys = 0;
for (ROLS r : ureyBradley) {
if (keep((UreyBradley) r)) {
nUreyBradleys++;
}
}
if (nUreyBradleys > ureyBradleys.length) {
ureyBradleys = new UreyBradley[nUreyBradleys];
}
fill(ureyBradleys, null);
nUreyBradleys = 0;
for (ROLS r : ureyBradley) {
if (keep((UreyBradley) r)) {
ureyBradleys[nUreyBradleys++] = (UreyBradley) r;
}
}
Arrays.sort(ureyBradleys, 0, nUreyBradleys);
if (nUreyBradleys > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Urey-Bradleys: %10d", nUreyBradleys));
}
} else {
nUreyBradleys = 0;
ureyBradleys = null;
}
/**
* Set a multiplier on the force constants of bonded terms containing
* hydrogens.
*/
if (rigidHydrogens) {
if (bonds != null) {
for (Bond bond : bonds) {
if (bond.containsHydrogen()) {
bond.setRigidScale(rigidScale);
}
}
}
if (angles != null) {
for (Angle angle : angles) {
if (angle.containsHydrogen()) {
angle.setRigidScale(rigidScale);
}
}
}
if (stretchBends != null) {
for (StretchBend stretchBend : stretchBends) {
if (stretchBend.containsHydrogen()) {
stretchBend.setRigidScale(rigidScale);
}
}
}
if (ureyBradleys != null) {
for (UreyBradley ureyBradley : ureyBradleys) {
if (ureyBradley.containsHydrogen()) {
ureyBradley.setRigidScale(rigidScale);
}
}
}
}
// Collect, count, pack and sort out-of-plane bends.
if (outOfPlaneBendTerm) {
ArrayList<ROLS> outOfPlaneBend = molecularAssembly.getOutOfPlaneBendList();
nOutOfPlaneBends = 0;
for (ROLS r : outOfPlaneBend) {
if (keep((OutOfPlaneBend) r)) {
nOutOfPlaneBends++;
}
}
if (nOutOfPlaneBends > outOfPlaneBends.length) {
outOfPlaneBends = new OutOfPlaneBend[nOutOfPlaneBends];
}
fill(outOfPlaneBends, null);
nOutOfPlaneBends = 0;
for (ROLS r : outOfPlaneBend) {
if (keep((OutOfPlaneBend) r)) {
outOfPlaneBends[nOutOfPlaneBends++] = (OutOfPlaneBend) r;
}
}
Arrays.sort(outOfPlaneBends, 0, nOutOfPlaneBends);
if (nOutOfPlaneBends > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Out-of-Plane Bends: %10d", nOutOfPlaneBends));
}
} else {
nOutOfPlaneBends = 0;
outOfPlaneBends = null;
}
// Collect, count, pack and sort torsions.
if (torsionTerm) {
ArrayList<ROLS> torsion = molecularAssembly.getTorsionList();
nTorsions = 0;
for (ROLS r : torsion) {
if (keep((Torsion) r)) {
nTorsions++;
}
}
if (nTorsions >= torsions.length) {
torsions = new Torsion[nTorsions];
}
fill(torsions, null);
nTorsions = 0;
for (ROLS r : torsion) {
if (keep((Torsion) r)) {
torsions[nTorsions++] = (Torsion) r;
}
}
// Arrays.sort(torsions);
if (nTorsions > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Torsions: %10d", nTorsions));
}
} else {
nTorsions = 0;
torsions = null;
}
// Collect, count, pack and sort pi-orbital torsions.
if (piOrbitalTorsionTerm) {
ArrayList<ROLS> piOrbitalTorsion = molecularAssembly.getPiOrbitalTorsionList();
nPiOrbitalTorsions = 0;
for (ROLS r : piOrbitalTorsion) {
if (keep((PiOrbitalTorsion) r)) {
nPiOrbitalTorsions++;
}
}
if (nPiOrbitalTorsions >= piOrbitalTorsions.length) {
piOrbitalTorsions = new PiOrbitalTorsion[nPiOrbitalTorsions];
}
fill(piOrbitalTorsions, null);
nPiOrbitalTorsions = 0;
for (ROLS r : piOrbitalTorsion) {
if (keep((PiOrbitalTorsion) r)) {
piOrbitalTorsions[nPiOrbitalTorsions++] = (PiOrbitalTorsion) r;
}
}
if (nPiOrbitalTorsions > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Pi-Orbital Torsions: %10d", nPiOrbitalTorsions));
}
} else {
nPiOrbitalTorsions = 0;
piOrbitalTorsions = null;
}
// Collect, count, pack and sort torsion-torsions.
if (torsionTorsionTerm) {
ArrayList<ROLS> torsionTorsion = molecularAssembly.getTorsionTorsionList();
nTorsionTorsions = 0;
for (ROLS r : torsionTorsion) {
if (keep((TorsionTorsion) r)) {
nTorsionTorsions++;
}
}
if (nTorsionTorsions >= torsionTorsions.length) {
torsionTorsions = new TorsionTorsion[nTorsionTorsions];
}
fill(torsionTorsions, null);
nTorsionTorsions = 0;
for (ROLS r : torsionTorsion) {
if (keep((TorsionTorsion) r)) {
torsionTorsions[nTorsionTorsions++] = (TorsionTorsion) r;
}
}
if (nTorsionTorsions > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Torsion-Torsions: %10d", nTorsionTorsions));
}
} else {
nTorsionTorsions = 0;
torsionTorsions = null;
}
// Collect, count, pack and sort improper torsions.
if (improperTorsionTerm) {
ArrayList<ROLS> improperTorsion = molecularAssembly.getImproperTorsionList();
nImproperTorsions = 0;
for (ROLS r : improperTorsion) {
if (keep((ImproperTorsion) r)) {
nImproperTorsions++;
}
}
if (nImproperTorsions >= improperTorsions.length) {
improperTorsions = new ImproperTorsion[nImproperTorsions];
}
fill(improperTorsions, null);
nImproperTorsions = 0;
for (ROLS r : improperTorsion) {
if (keep((ImproperTorsion) r)) {
improperTorsions[nImproperTorsions++] = (ImproperTorsion) r;
}
}
if (nImproperTorsions > 0 && logger.isLoggable(Level.FINEST)) {
logger.finest(format(" Improper Torsions: %10d", nImproperTorsions));
}
} else {
nImproperTorsions = 0;
improperTorsions = null;
}
if (vanderWaalsTerm) {
if (esvTerm) {
vanderWaals.setAtoms(esvSystem.getExtendedAtoms(), esvSystem.getExtendedMolecule());
} else {
vanderWaals.setAtoms(atoms, molecule);
}
}
if (multipoleTerm) {
if (esvTerm) {
particleMeshEwald.setAtoms(esvSystem.getExtendedAtoms(), esvSystem.getExtendedMolecule());
} else {
particleMeshEwald.setAtoms(atoms, molecule);
}
}
if (ncsTerm) {
logger.severe(" NCS energy term cannot be used with variable systems sizes.");
}
if (restrainTerm) {
logger.severe(" Restrain energy term cannot be used with variable systems sizes.");
}
if (comTerm) {
logger.severe(" COM restrain energy term cannot be used with variable systems sizes.");
}
bondedRegion = new BondedRegion();
}
Aggregations