ergo
molecule.h
Go to the documentation of this file.
1 /* Ergo, version 3.2, a program for linear scaling electronic structure
2  * calculations.
3  * Copyright (C) 2012 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 <assert.h>
33 
34 #include "realtype.h"
35 
39 struct Atom {
42 };
43 
48 struct Vector3D {
50  Vector3D() {}
52  v[0] = x; v[1] = y; v[2] = z;
53  }
54  ergo_real& operator[](unsigned i) { return v[i]; }
55  ergo_real operator[](unsigned i) const { return v[i]; }
57  ergo_real dist2(const ergo_real b[]) const {
58  ergo_real d, r;
59  d = v[0]-b[0]; r = d*d;
60  d = v[1]-b[1]; r += d*d;
61  d = v[2]-b[2]; r += d*d;
62  return r;
63  }
65  ergo_real dist(const Vector3D& b) const
66  { return std::sqrt(dist2(b.v)); }
67  ergo_real dist(const ergo_real b[]) const
68  { return std::sqrt(dist2(b)); }
69 };
70 
75 class Molecule {
76  public:
77  static const int MAX_NO_OF_ATOMS=200000;
80  int noOfAtoms;
81 
83 
85  assert(noOfAtoms < MAX_NO_OF_ATOMS);
86  atoms[noOfAtoms].charge = c;
87  atoms[noOfAtoms].coords[0] = x;
88  atoms[noOfAtoms].coords[1] = y;
89  atoms[noOfAtoms].coords[2] = z;
90  noOfAtoms++;
91  }
92 
94  void getExtremeInternuclearDistances(ergo_real & minDist, ergo_real & maxDist) const;
98  ergo_real getNuclearElectricFieldEnergy(const Vector3D& electricField) const;
101  int getNumberOfElectrons() const;
102 
106  int setFromMoleculeFile(const char* fileName,
107  int netCharge,
108  char **basissetFile);
109 
110 };
111 
112 
113 #endif /* MOLECULE_HEADER */