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;
39  
40  import com.sun.jna.ptr.DoubleByReference;
41  import com.sun.jna.ptr.IntByReference;
42  import com.sun.jna.ptr.PointerByReference;
43  
44  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Continuous3DFunction_create;
45  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Continuous3DFunction_destroy;
46  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Continuous3DFunction_getFunctionParameters;
47  import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Continuous3DFunction_setFunctionParameters;
48  
49  /**
50   * This is a TabulatedFunction that computes a continuous three dimensional function.
51   */
52  public class Continuous3DFunction extends TabulatedFunction {
53  
54    /**
55     * Create a Continuous3DFunction f(x,y,z) based on a set of tabulated values.
56     *
57     * @param values   the tabulated values of the function f(x,y,z) at xsize uniformly spaced values of x between xmin
58     *                 and xmax, ysize values of y between ymin and ymax, and zsize values of z between zmin and zmax.
59     *                 A natural cubic spline is used to interpolate between the tabulated values.  The function is
60     *                 assumed to be zero when x, y, or z is outside its specified range.  The values should be ordered so
61     *                 that values[i+xsize*j+xsize*ysize*k] = f(x_i,y_j,z_k), where x_i is the i'th uniformly spaced value of x.
62     *                 This must be of length xsize*ysize*zsize.
63     * @param xsize    the number of table elements along the x direction
64     * @param ysize    the number of table elements along the y direction
65     * @param zsize    the number of table elements along the z direction
66     * @param xmin     the value of x corresponding to the first element of values
67     * @param xmax     the value of x corresponding to the last element of values
68     * @param ymin     the value of y corresponding to the first element of values
69     * @param ymax     the value of y corresponding to the last element of values
70     * @param zmin     the value of z corresponding to the first element of values
71     * @param zmax     the value of z corresponding to the last element of values
72     * @param periodic whether the interpolated function is periodic
73     */
74    public Continuous3DFunction(PointerByReference values, int xsize, int ysize, int zsize, double xmin, double xmax,
75                                double ymin, double ymax, double zmin, double zmax, boolean periodic) {
76      super(OpenMM_Continuous3DFunction_create(xsize, ysize, zsize, values, xmin, xmax, ymin, ymax, zmin, zmax, periodic ? 1 : 0));
77    }
78  
79    /**
80     * Destroy the continuous 3D function.
81     */
82    @Override
83    public void destroy() {
84      if (pointer != null) {
85        OpenMM_Continuous3DFunction_destroy(pointer);
86        pointer = null;
87      }
88    }
89  
90    /**
91     * Get the parameters for the tabulated function.
92     *
93     * @param values the tabulated values of the function f(x,y,z) at xsize uniformly spaced values of x between xmin
94     *               and xmax, ysize values of y between ymin and ymax, and zsize values of z between zmin and zmax.
95     *               A natural cubic spline is used to interpolate between the tabulated values.  The function is
96     *               assumed to be zero when x, y, or z is outside its specified range.  The values should be ordered so
97     *               that values[i+xsize*j+xsize*ysize*k] = f(x_i,y_j,z_k), where x_i is the i'th uniformly spaced value of x.
98     *               This must be of length xsize*ysize*zsize.
99     * @param xsize  the number of table elements along the x direction
100    * @param ysize  the number of table elements along the y direction
101    * @param zsize  the number of table elements along the z direction
102    * @param xmin   the value of x corresponding to the first element of values
103    * @param xmax   the value of x corresponding to the last element of values
104    * @param ymin   the value of y corresponding to the first element of values
105    * @param ymax   the value of y corresponding to the last element of values
106    * @param zmin   the value of z corresponding to the first element of values
107    * @param zmax   the value of z corresponding to the last element of values
108    */
109   public void getFunctionParameters(PointerByReference values, IntByReference xsize, IntByReference ysize, IntByReference zsize,
110                                     DoubleByReference xmin, DoubleByReference xmax,
111                                     DoubleByReference ymin, DoubleByReference ymax,
112                                     DoubleByReference zmin, DoubleByReference zmax) {
113     OpenMM_Continuous3DFunction_getFunctionParameters(pointer, xsize, ysize, zsize, values, xmin, xmax, ymin, ymax, zmin, zmax);
114   }
115 
116   /**
117    * Set the parameters for the tabulated function.
118    *
119    * @param values the tabulated values of the function f(x,y,z) at xsize uniformly spaced values of x between xmin
120    *               and xmax, ysize values of y between ymin and ymax, and zsize values of z between zmin and zmax.
121    *               A natural cubic spline is used to interpolate between the tabulated values.  The function is
122    *               assumed to be zero when x, y, or z is outside its specified range.  The values should be ordered so
123    *               that values[i+xsize*j+xsize*ysize*k] = f(x_i,y_j,z_k), where x_i is the i'th uniformly spaced value of x.
124    *               This must be of length xsize*ysize*zsize.
125    * @param xsize  the number of table elements along the x direction
126    * @param ysize  the number of table elements along the y direction
127    * @param zsize  the number of table elements along the z direction
128    * @param xmin   the value of x corresponding to the first element of values
129    * @param xmax   the value of x corresponding to the last element of values
130    * @param ymin   the value of y corresponding to the first element of values
131    * @param ymax   the value of y corresponding to the last element of values
132    * @param zmin   the value of z corresponding to the first element of values
133    * @param zmax   the value of z corresponding to the last element of values
134    */
135   public void setFunctionParameters(PointerByReference values, int xsize, int ysize, int zsize,
136                                     double xmin, double xmax, double ymin, double ymax,
137                                     double zmin, double zmax) {
138     OpenMM_Continuous3DFunction_setFunctionParameters(pointer, xsize, ysize, zsize, values, xmin, xmax, ymin, ymax, zmin, zmax);
139   }
140 }