View Javadoc
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.drude;
39  
40  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_computeDrudeTemperature;
41  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_computeSystemTemperature;
42  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_create;
43  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_destroy;
44  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_getDrudeFriction;
45  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_getFriction;
46  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_getTemperature;
47  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_setDrudeFriction;
48  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_setFriction;
49  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_setTemperature;
50  import static edu.uiowa.jopenmm.OpenMMDrudeLibrary.OpenMM_DrudeLangevinIntegrator_step;
51  
52  /**
53   * This Integrator simulates systems that include Drude particles.  It applies two different Langevin
54   * thermostats to different parts of the system.  The first is applied to ordinary particles (ones that
55   * are not part of a Drude particle pair), as well as to the center of mass of each Drude particle pair.
56   * A second thermostat, typically with a much lower temperature, is applied to the relative internal
57   * displacement of each pair.
58   * <p>
59   * This integrator can optionally set an upper limit on how far any Drude particle is ever allowed to
60   * get from its parent particle.  This can sometimes help to improve stability.  The limit is enforced
61   * with a hard wall constraint.  By default the limit is set to 0.02 nm.
62   * <p>
63   * This Integrator requires the System to include a DrudeForce, which it uses to identify the Drude
64   * particles.
65   */
66  public class DrudeLangevinIntegrator extends DrudeIntegrator {
67  
68    /**
69     * Create a DrudeLangevinIntegrator.
70     *
71     * @param stepSize         the step size with which to integrator the system (in picoseconds)
72     * @param temperature      the temperature of the main heat bath (in Kelvin)
73     * @param friction         the friction coefficient which couples the system to the main heat bath (in inverse picoseconds)
74     * @param drudeTemperature the temperature of the heat bath applied to internal coordinates of Drude particles (in Kelvin)
75     * @param drudeFriction    the friction coefficient which couples the system to the heat bath applied to internal coordinates of Drude particles (in inverse picoseconds)
76     */
77    public DrudeLangevinIntegrator(double stepSize, double temperature, double friction,
78                                   double drudeTemperature, double drudeFriction) {
79      super(OpenMM_DrudeLangevinIntegrator_create(stepSize, temperature, friction,
80          drudeTemperature, drudeFriction));
81    }
82  
83    /**
84     * Compute the instantaneous temperature of the Drude system, measured in Kelvin.
85     * This is calculated based on the kinetic energy of the internal motion of Drude pairs
86     * and should remain close to the prescribed Drude temperature.
87     */
88    public double computeDrudeTemperature() {
89      return OpenMM_DrudeLangevinIntegrator_computeDrudeTemperature(pointer);
90    }
91  
92    /**
93     * Compute the instantaneous temperature of the System, measured in Kelvin.
94     * This is calculated based on the kinetic energy of the ordinary particles (ones
95     * not attached to a Drude particle), as well as the center of mass motion of the
96     * Drude particle pairs.  It does not include the internal motion of the pairs.
97     * On average, this should be approximately equal to the value returned by
98     * getTemperature().
99     */
100   public double computeSystemTemperature() {
101     return OpenMM_DrudeLangevinIntegrator_computeSystemTemperature(pointer);
102   }
103 
104   /**
105    * Destroy the integrator.
106    * <p>
107    * This method releases the memory associated with the DrudeLangevinIntegrator object.
108    * After calling this method, the integrator should not be used.
109    */
110   @Override
111   public void destroy() {
112     if (pointer != null) {
113       OpenMM_DrudeLangevinIntegrator_destroy(pointer);
114       pointer = null;
115     }
116   }
117 
118   /**
119    * Get the friction coefficient which determines how strongly the internal coordinates of Drude particles
120    * are coupled to the heat bath (in inverse ps).
121    *
122    * @return the friction coefficient, measured in 1/ps
123    */
124   public double getDrudeFriction() {
125     return OpenMM_DrudeLangevinIntegrator_getDrudeFriction(pointer);
126   }
127 
128   /**
129    * Get the friction coefficient which determines how strongly the system is coupled to
130    * the main heat bath (in inverse ps).
131    *
132    * @return the friction coefficient, measured in 1/ps
133    */
134   public double getFriction() {
135     return OpenMM_DrudeLangevinIntegrator_getFriction(pointer);
136   }
137 
138   /**
139    * Get the temperature of the main heat bath (in Kelvin).
140    *
141    * @return the temperature of the heat bath, measured in Kelvin
142    */
143   public double getTemperature() {
144     return OpenMM_DrudeLangevinIntegrator_getTemperature(pointer);
145   }
146 
147   /**
148    * Set the friction coefficient which determines how strongly the internal coordinates of Drude particles
149    * are coupled to the heat bath (in inverse ps).
150    *
151    * @param friction the friction coefficient, measured in 1/ps
152    */
153   public void setDrudeFriction(double friction) {
154     OpenMM_DrudeLangevinIntegrator_setDrudeFriction(pointer, friction);
155   }
156 
157   /**
158    * Set the friction coefficient which determines how strongly the system is coupled to
159    * the main heat bath (in inverse ps).
160    *
161    * @param friction the friction coefficient, measured in 1/ps
162    */
163   public void setFriction(double friction) {
164     OpenMM_DrudeLangevinIntegrator_setFriction(pointer, friction);
165   }
166 
167   /**
168    * Set the temperature of the main heat bath (in Kelvin).
169    *
170    * @param temperature the temperature of the heat bath, measured in Kelvin
171    */
172   public void setTemperature(double temperature) {
173     OpenMM_DrudeLangevinIntegrator_setTemperature(pointer, temperature);
174   }
175 
176   /**
177    * Advance a simulation through time by taking a series of time steps.
178    *
179    * @param steps the number of time steps to take
180    */
181   @Override
182   public void step(int steps) {
183     OpenMM_DrudeLangevinIntegrator_step(pointer, steps);
184   }
185 }