1 // ****************************************************************************** 2 // 3 // Title: Force Field X. 4 // Description: Force Field X - Software for Molecular Biophysics. 5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2025. 6 // 7 // This file is part of Force Field X. 8 // 9 // Force Field X is free software; you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License version 3 as published by 11 // the Free Software Foundation. 12 // 13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT 14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 // details. 17 // 18 // You should have received a copy of the GNU General Public License along with 19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple 20 // Place, Suite 330, Boston, MA 02111-1307 USA 21 // 22 // Linking this library statically or dynamically with other modules is making a 23 // combined work based on this library. Thus, the terms and conditions of the 24 // GNU General Public License cover the whole combination. 25 // 26 // As a special exception, the copyright holders of this library give you 27 // permission to link this library with independent modules to produce an 28 // executable, regardless of the license terms of these independent modules, and 29 // to copy and distribute the resulting executable under terms of your choice, 30 // provided that you also meet, for each linked independent module, the terms 31 // and conditions of the license of that module. An independent module is a 32 // module which is not derived from or based on this library. If you modify this 33 // library, you may extend this exception to your version of the library, but 34 // you are not obligated to do so. If you do not wish to do so, delete this 35 // exception statement from your version. 36 // 37 // ****************************************************************************** 38 package ffx.openmm; 39 40 import com.sun.jna.ptr.PointerByReference; 41 42 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Boolean.OpenMM_True; 43 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_computeCurrentPressure; 44 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_create; 45 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_destroy; 46 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_getDefaultPressure; 47 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_getDefaultTemperature; 48 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_getFrequency; 49 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_getRandomNumberSeed; 50 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_getScaleMoleculesAsRigid; 51 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_setDefaultPressure; 52 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_setDefaultTemperature; 53 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_setFrequency; 54 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_setRandomNumberSeed; 55 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_setScaleMoleculesAsRigid; 56 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_MonteCarloFlexibleBarostat_usesPeriodicBoundaryConditions; 57 58 /** 59 * This class uses a Monte Carlo algorithm to adjust the size of the periodic box, 60 * simulating the effect of constant pressure. It assumes the simulation is running 61 * at constant temperature, and the box size is adjusted to maintain constant pressure. 62 * Unlike MonteCarloBarostat, this version allows flexible scaling of molecules, 63 * making it suitable for systems where molecular flexibility is important. 64 * <p> 65 * This class is most useful for simulating a system at constant pressure when 66 * flexible molecular scaling is desired, such as for systems with significant 67 * intramolecular flexibility or conformational changes. 68 */ 69 public class MonteCarloFlexibleBarostat extends Force { 70 71 /** 72 * Create a MonteCarloFlexibleBarostat. 73 * 74 * @param defaultPressure The default pressure acting on the system (in bar). 75 * @param defaultTemperature The default temperature at which the system is being maintained (in Kelvin). 76 * @param frequency The frequency at which Monte Carlo pressure changes should be attempted (in time steps). 77 * @param scaleMoleculesAsRigid Whether to scale molecules as rigid bodies (1) or allow flexible scaling (0). 78 */ 79 public MonteCarloFlexibleBarostat(double defaultPressure, double defaultTemperature, 80 int frequency, int scaleMoleculesAsRigid) { 81 super(OpenMM_MonteCarloFlexibleBarostat_create(defaultPressure, defaultTemperature, frequency, scaleMoleculesAsRigid)); 82 } 83 84 /** 85 * Compute the current pressure in the system. 86 * 87 * @param context The context for which to compute the pressure. 88 * @param pressure The computed pressure (output). 89 */ 90 public void computeCurrentPressure(Context context, PointerByReference pressure) { 91 OpenMM_MonteCarloFlexibleBarostat_computeCurrentPressure(pointer, context.getPointer(), pressure); 92 } 93 94 /** 95 * Destroy the force. 96 */ 97 @Override 98 public void destroy() { 99 if (pointer != null) { 100 OpenMM_MonteCarloFlexibleBarostat_destroy(pointer); 101 pointer = null; 102 } 103 } 104 105 /** 106 * Get the default pressure (in bar). 107 * 108 * @return The default pressure acting on the system. 109 */ 110 public double getDefaultPressure() { 111 return OpenMM_MonteCarloFlexibleBarostat_getDefaultPressure(pointer); 112 } 113 114 /** 115 * Get the default temperature at which the system is being maintained (in Kelvin). 116 * 117 * @return The default temperature. 118 */ 119 public double getDefaultTemperature() { 120 return OpenMM_MonteCarloFlexibleBarostat_getDefaultTemperature(pointer); 121 } 122 123 /** 124 * Get the frequency (in time steps) at which Monte Carlo pressure changes should be attempted. 125 * 126 * @return The frequency of pressure change attempts. 127 */ 128 public int getFrequency() { 129 return OpenMM_MonteCarloFlexibleBarostat_getFrequency(pointer); 130 } 131 132 /** 133 * Get the random number seed. See setRandomNumberSeed() for details. 134 * 135 * @return The random number seed. 136 */ 137 public int getRandomNumberSeed() { 138 return OpenMM_MonteCarloFlexibleBarostat_getRandomNumberSeed(pointer); 139 } 140 141 /** 142 * Get whether molecules are scaled as rigid bodies. 143 * 144 * @return 1 if molecules are scaled as rigid bodies, 0 if flexible scaling is used. 145 */ 146 public int getScaleMoleculesAsRigid() { 147 return OpenMM_MonteCarloFlexibleBarostat_getScaleMoleculesAsRigid(pointer); 148 } 149 150 /** 151 * Set the default pressure acting on the system (in bar). 152 * 153 * @param pressure The default pressure acting on the system. 154 */ 155 public void setDefaultPressure(double pressure) { 156 OpenMM_MonteCarloFlexibleBarostat_setDefaultPressure(pointer, pressure); 157 } 158 159 /** 160 * Set the default temperature at which the system is being maintained (in Kelvin). 161 * 162 * @param temperature The default temperature. 163 */ 164 public void setDefaultTemperature(double temperature) { 165 OpenMM_MonteCarloFlexibleBarostat_setDefaultTemperature(pointer, temperature); 166 } 167 168 /** 169 * Set the frequency (in time steps) at which Monte Carlo pressure changes should be attempted. 170 * 171 * @param frequency The frequency of pressure change attempts. 172 */ 173 public void setFrequency(int frequency) { 174 OpenMM_MonteCarloFlexibleBarostat_setFrequency(pointer, frequency); 175 } 176 177 /** 178 * Set the random number seed. The precise meaning of this parameter is undefined, and is left up 179 * to each Platform to interpret in an appropriate way. It is guaranteed that if two simulations 180 * are run with different random number seeds, the sequence of random numbers will be different. 181 * On the other hand, no guarantees are made about the behavior of simulations that use the same seed. 182 * In particular, Platforms are permitted to use non-deterministic algorithms which produce different 183 * results on successive runs, even if those runs were initialized identically. 184 * <p> 185 * If seed is set to 0 (which is the default value assigned), a unique seed is chosen when a Context 186 * is created from this Force. This is done to ensure that each Context receives unique random seeds 187 * without you needing to set them explicitly. 188 * 189 * @param seed The random number seed. 190 */ 191 public void setRandomNumberSeed(int seed) { 192 OpenMM_MonteCarloFlexibleBarostat_setRandomNumberSeed(pointer, seed); 193 } 194 195 /** 196 * Set whether molecules should be scaled as rigid bodies. 197 * 198 * @param scaleMoleculesAsRigid 1 to scale molecules as rigid bodies, 0 for flexible scaling. 199 */ 200 public void setScaleMoleculesAsRigid(int scaleMoleculesAsRigid) { 201 OpenMM_MonteCarloFlexibleBarostat_setScaleMoleculesAsRigid(pointer, scaleMoleculesAsRigid); 202 } 203 204 /** 205 * Returns whether this force makes use of periodic boundary conditions. 206 * 207 * @return True if the force uses periodic boundary conditions. 208 */ 209 @Override 210 public boolean usesPeriodicBoundaryConditions() { 211 int pbc = OpenMM_MonteCarloFlexibleBarostat_usesPeriodicBoundaryConditions(pointer); 212 return pbc == OpenMM_True; 213 } 214 }