ergo
molecule.h
Go to the documentation of this file.
1 /* Ergo, version 3.4, a program for linear scaling electronic structure
2  * calculations.
3  * Copyright (C) 2014 Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Primary academic reference:
19  * Kohn−Sham Density Functional Theory Electronic Structure Calculations
20  * with Linearly Scaling Computational Time and Memory Usage,
21  * Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek,
22  * J. Chem. Theory Comput. 7, 340 (2011),
23  * <http://dx.doi.org/10.1021/ct100611z>
24  *
25  * For further information about Ergo, see <http://www.ergoscf.org>.
26  */
27 
28 #ifndef MOLECULE_HEADER
29 #define MOLECULE_HEADER
30 
31 #include <cmath>
32 #include <vector>
33 #include <cassert>
34 
35 #include "realtype.h"
36 
40 struct Atom {
43 };
44 
49 struct Vector3D {
50  ergo_real v[3];
51  Vector3D() {}
53  v[0] = x; v[1] = y; v[2] = z;
54  }
55  ergo_real& operator[](unsigned i) { return v[i]; }
56  ergo_real operator[](unsigned i) const { return v[i]; }
58  ergo_real dist2(const ergo_real b[]) const {
59  ergo_real d, r;
60  d = v[0]-b[0]; r = d*d;
61  d = v[1]-b[1]; r += d*d;
62  d = v[2]-b[2]; r += d*d;
63  return r;
64  }
66  ergo_real dist(const Vector3D& b) const
67  { return std::sqrt(dist2(b.v)); }
68  ergo_real dist(const ergo_real b[]) const
69  { return std::sqrt(dist2(b)); }
70 };
71 
76 class Molecule {
77  private:
78  std::vector<Atom> atoms;
80  int noOfAtoms;
81 
82  public:
83 
84  Molecule() : atoms(10), netCharge(0), noOfAtoms(0) {}
85 
87  int currListSize = atoms.size();
88  if(noOfAtoms >= currListSize)
89  atoms.resize(currListSize*2);
90  atoms[noOfAtoms].charge = c;
91  atoms[noOfAtoms].coords[0] = x;
92  atoms[noOfAtoms].coords[1] = y;
93  atoms[noOfAtoms].coords[2] = z;
94  noOfAtoms++;
95  }
96 
97  void clear() { noOfAtoms = 0; netCharge = 0; }
98  void setNetCharge(ergo_real netCharge_) { netCharge = netCharge_; }
99  void replaceAtom(int i, const Atom & atom) { assert(i >= 0 && i < noOfAtoms); atoms[i] = atom; }
100  void setAtomList(const std::vector<Atom> atomList) { atoms = atomList; noOfAtoms = atomList.size(); }
101  const Atom* getAtomListPtr() const { return &atoms[0]; }
102  const Atom & getAtom(int i) const { return atoms[i]; }
103  int getNoOfAtoms() const { return noOfAtoms; }
104  ergo_real getNetCharge() const { return netCharge; }
105 
107  void getExtremeInternuclearDistances(ergo_real & minDist, ergo_real & maxDist) const;
109  ergo_real getNuclearRepulsionEnergy() const;
111  ergo_real getNuclearElectricFieldEnergy(const Vector3D& electricField) const;
114  int getNumberOfElectrons() const;
116  void getNuclearRepulsionEnergyGradientContrib(ergo_real* resultGradient) const;
117 
121  int setFromMoleculeFile(const char* fileName,
122  int netCharge,
123  char **basissetFile);
124 
125 };
126 
127 
128 #endif /* MOLECULE_HEADER */
const Atom & getAtom(int i) const
Definition: molecule.h:102
double ergo_real
Definition: realtype.h:53
ergo_real dist(const ergo_real b[]) const
Definition: molecule.h:68
int getNoOfAtoms() const
Definition: molecule.h:103
ergo_real dist(const Vector3D &b) const
compute distance between two points.
Definition: molecule.h:66
A representation of Vector or point in cartesian space.
Definition: molecule.h:49
ergo_real & operator[](unsigned i)
Definition: molecule.h:55
ergo_real operator[](unsigned i) const
Definition: molecule.h:56
Representation of a molecule as a set of nuclei and total charge.
Definition: molecule.h:76
void setNetCharge(ergo_real netCharge_)
Definition: molecule.h:98
ergo_real dist2(const ergo_real b[]) const
compute square of distance between two points.
Definition: molecule.h:58
ergo_real netCharge
Definition: molecule.h:79
Simple atom representation by its charge and cartesian coordinates.
Definition: molecule.h:40
void clear()
Definition: molecule.h:97
ergo_real v[3]
Definition: molecule.h:50
Vector3D()
Definition: molecule.h:51
Molecule()
Definition: molecule.h:84
Vector3D(ergo_real x, ergo_real y, ergo_real z)
Definition: molecule.h:52
std::vector< Atom > atoms
Definition: molecule.h:78
ergo_real coords[3]
Definition: molecule.h:42
int noOfAtoms
Definition: molecule.h:80
const Atom * getAtomListPtr() const
Definition: molecule.h:101
void setAtomList(const std::vector< Atom > atomList)
Definition: molecule.h:100
void addAtom(ergo_real c, ergo_real x, ergo_real y, ergo_real z)
Definition: molecule.h:86
ergo_real charge
Definition: molecule.h:41
void replaceAtom(int i, const Atom &atom)
Definition: molecule.h:99
ergo_real getNetCharge() const
Definition: molecule.h:104