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-2024.
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.potential.nonbonded.octree;
39  
40  import java.util.logging.Logger;
41  
42  /**
43   * OctreePoint: Object class for Octree method presented in the Fast Multipole Method (FMM) tutorial
44   * from the Barba Group: https://github.com/barbagroup/FMM_tutorial
45   */
46  public class OctreePoint {
47  
48    private static final Logger logger = Logger.getLogger(OctreePoint.class.getName());
49  
50    /** Coordinates of the point */
51    private double x;
52  
53    private double y;
54    private double z;
55  
56    /** Maximum value for random point coordinate Default = 1.0 */
57    private double domain = 1.0;
58  
59    public OctreePoint(double[] coords, double domain) {
60  
61      // Set max for random point coordinate generation
62      setDomain(domain);
63  
64      // Assign input coordinates, if they are given
65      // Otherwise, assign random coordinates between 0 and domain
66      if (coords.length > 0) {
67        if (coords.length == 3) {
68          this.x = coords[0];
69          this.y = coords[1];
70          this.z = coords[2];
71        } else {
72          logger.warning("Coordinate array must have three points");
73        }
74      } else {
75        this.x = this.domain * Math.random();
76        this.y = this.domain * Math.random();
77        this.z = this.domain * Math.random();
78      }
79    }
80  
81    public double distance(OctreePoint other) {
82      return Math.sqrt(
83          Math.pow((this.x - other.x), 2)
84              + Math.pow((this.y - other.y), 2)
85              + Math.pow((this.z - other.z), 2));
86    }
87  
88    public double distance(OctreeCell other) {
89      return Math.sqrt(
90          Math.pow((this.x - other.getX()), 2)
91              + Math.pow((this.y - other.getY()), 2)
92              + Math.pow((this.z - other.getZ()), 2));
93    }
94  
95    public double getX() {
96      return this.x;
97    }
98  
99    public double getY() {
100     return this.y;
101   }
102 
103   public double getZ() {
104     return this.z;
105   }
106 
107   public void setDomain(double domain) {
108     this.domain = domain;
109   }
110 }