MADNESS  version 0.9
chem/molecule.h
Go to the documentation of this file.
1 /*
2  This file is part of MADNESS.
3 
4  Copyright (C) 2007,2010 Oak Ridge National Laboratory
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20  For more information please contact:
21 
22  Robert J. Harrison
23  Oak Ridge National Laboratory
24  One Bethel Valley Road
25  P.O. Box 2008, MS-6367
26 
27  email: harrisonrj@ornl.gov
28  tel: 865-241-3937
29  fax: 865-572-0680
30 
31  $Id$
32 */
33 #ifndef MADNESS_CHEM_MOLECULE_H__INCLUDED
34 #define MADNESS_CHEM_MOLECULE_H__INCLUDED
35 
38 
39 #include <chem/corepotential.h>
40 #include <chem/atomutil.h>
41 #include <madness/world/array.h>
42 #include <vector>
43 #include <string>
44 #include <iostream>
45 #include <fstream>
46 #include <sstream>
47 #include <algorithm>
48 #include <ctype.h>
49 #include <cmath>
50 #include <madness/tensor/tensor.h>
51 #include <madness/misc/misc.h>
52 
53 namespace madness {
54 
55 class Atom {
56 public:
57  double x, y, z, q;
58  unsigned int atomic_number;
59 
60  explicit Atom(double x, double y, double z, double q, unsigned int atomic_number)
61  : x(x), y(y), z(z), q(q), atomic_number(atomic_number) {}
62 
63  Atom(const Atom& a)
64  : x(a.x), y(a.y), z(a.z), q(a.q), atomic_number(a.atomic_number) {}
65 
67  Atom()
68  : x(0), y(0), z(0), q(0), atomic_number(0) {}
69 
70 
72  return madness::vec(x, y, z);
73  }
74 
75  template <typename Archive>
76  void serialize(Archive& ar) {
77  ar & x & y & z & q & atomic_number;
78  }
79 };
80 
81 std::ostream& operator<<(std::ostream& s, const Atom& atom);
82 
83 class Molecule {
84 private:
85  // If you add more fields don't forget to serialize them
86  std::vector<Atom> atoms;
87  std::vector<double> rcut; // Reciprocal of the smoothing radius
88  double eprec; // Error in energy/atom due to smoothing
89  enum {atomic, angstrom} units;
90  CorePotentialManager core_pot;
91  madness::Tensor<double> field;
92 
93  void swapaxes(int ix, int iy);
94 
95  template <typename opT>
96  bool test_for_op(double xaxis, double yaxis, double zaxis, opT op) const;
97 
98  bool test_for_c2(double xaxis, double yaxis, double zaxis) const;
99 
100  bool test_for_sigma(double xaxis, double yaxis, double zaxis) const;
101 
102  bool test_for_inverse() const;
103 
104 public:
105 
109 
111  Molecule() : atoms(), rcut(), eprec(1e-4), core_pot(), field(3L) {};
112 
113  Molecule(const std::string& filename);
114 
115  void read_file(const std::string& filename);
116 
117  void read_core_file(const std::string& filename);
118 
119  std::string guess_file() const { return core_pot.guess_file(); };
120 
121  unsigned int n_core_orb_all() const ;
122 
123  unsigned int n_core_orb(unsigned int atn) const {
124  if (core_pot.is_defined(atn))
125  return core_pot.n_core_orb_base(atn);
126  else
127  return 0;
128  };
129 
130  unsigned int get_core_l(unsigned int atn, unsigned int c) const {
131  return core_pot.get_core_l(atn, c);
132  }
133 
134  double get_core_bc(unsigned int atn, unsigned int c) const {
135  return core_pot.get_core_bc(atn, c);
136  }
137 
138  double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const;
139 
140  double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const;
141 
142  bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); };
143 
144  bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); };
145 
146  void add_atom(double x, double y, double z, double q, int atn);
147 
148  int natom() const {
149  return atoms.size();
150  };
151 
152  void set_atom_charge(unsigned int i, double zeff);
153 
154  unsigned int get_atom_number(unsigned int i);
155 
156  void set_atom_coords(unsigned int i, double x, double y, double z);
157 
158  madness::Tensor<double> get_all_coords() const;
159 
160  std::vector< madness::Vector<double,3> > get_all_coords_vec() const;
161 
162  std::vector<double> atomic_radii;
163 
164  void set_all_coords(const madness::Tensor<double>& newcoords);
165 
166  void set_eprec(double value);
167 
168  void set_rcut(double value);
169 
170  void set_core_eprec(double value) {
171  core_pot.set_eprec(value);
172  }
173 
174  void set_core_rcut(double value) {
175  core_pot.set_rcut(value);
176  }
177 
178  double get_eprec() const {
179  return eprec;
180  }
181 
182  double bounding_cube() const;
183 
184  const Atom& get_atom(unsigned int i) const;
185 
186  void print() const;
187 
188  double inter_atomic_distance(unsigned int i,unsigned int j) const;
189 
190  double nuclear_repulsion_energy() const;
191 
192  double nuclear_repulsion_energy_pseudo() const;
193 
194  double nuclear_repulsion_derivative(int i, int j) const;
195 
196  double nuclear_dipole(int axis) const;
197 
198  double nuclear_charge_density(double x, double y, double z) const;
199 
200  double mol_nuclear_charge_density(double x, double y, double z) const;
201 
202  double smallest_length_scale() const;
203 
204  void identify_point_group();
205 
206  void center();
207 
208  void orient();
209 
210  double total_nuclear_charge() const;
211 
212  double nuclear_attraction_potential(double x, double y, double z) const;
213 
214  double molecular_core_potential(double x, double y, double z) const;
215 
216  double core_potential_derivative(int atom, int axis, double x, double y, double z) const;
217 
218  double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const;
219 
220  template <typename Archive>
221  void serialize(Archive& ar) {
222  ar & atoms & rcut & eprec & core_pot;
223  }
224 };
225 }
226 
227 #endif
double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const
Definition: chem/molecule.cc:648
unsigned int n_core_orb(unsigned int atn) const
Definition: chem/molecule.h:123
void identify_point_group()
Definition: chem/molecule.cc:417
void serialize(Archive &ar)
Definition: chem/molecule.h:76
unsigned int n_core_orb_base(const unsigned int atn) const
Definition: chem/corepotential.h:173
Header to declare stuff which has not yet found a home.
unsigned int get_atom_number(unsigned int i)
Definition: chem/molecule.cc:165
unsigned int get_core_l(unsigned int atn, unsigned int core) const
Definition: chem/corepotential.h:187
double get_eprec() const
Definition: chem/molecule.h:178
std::vector< madness::Vector< double, 3 > > get_all_coords_vec() const
Definition: chem/molecule.cc:188
void add_atom(double x, double y, double z, double q, int atn)
Definition: chem/molecule.cc:151
double q
Coordinates and charge in atomic units.
Definition: chem/molecule.h:57
void set_atom_coords(unsigned int i, double x, double y, double z)
Definition: chem/molecule.cc:170
void set_atom_charge(unsigned int i, double zeff)
Definition: chem/molecule.cc:160
const double L
Definition: 3dharmonic.cc:123
double z
Definition: chem/molecule.h:57
::std::string string
Definition: gtest-port.h:872
void set_eprec(double value)
Definition: chem/corepotential.cc:372
double smallest_length_scale() const
Definition: chem/molecule.cc:315
double nuclear_attraction_potential(double x, double y, double z) const
Definition: chem/molecule.cc:579
Molecule()
Makes a molecule with zero atoms.
Definition: chem/molecule.h:111
double get_core_bc(unsigned int atn, unsigned int c) const
Definition: chem/molecule.h:134
Atom()
Default construct makes a zero charge ghost atom at origin.
Definition: chem/molecule.h:67
double nuclear_charge_density(double x, double y, double z) const
Definition: chem/molecule.cc:622
madness::Vector< double, 3 > get_coords() const
Definition: chem/molecule.h:71
double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const
Definition: chem/molecule.cc:657
void set_rcut(double value)
Definition: chem/molecule.cc:217
void set_all_coords(const madness::Tensor< double > &newcoords)
Definition: chem/molecule.cc:199
double nuclear_repulsion_energy_pseudo() const
Definition: chem/molecule.cc:264
std::string guess_file() const
Definition: chem/corepotential.h:177
Defines and implements most of Tensor.
double nuclear_repulsion_derivative(int i, int j) const
Definition: chem/molecule.cc:296
std::vector< double > atomic_radii
Definition: chem/molecule.h:162
int natom() const
Definition: chem/molecule.h:148
void center()
Moves the center of nuclear charge to the origin.
Definition: chem/molecule.cc:325
void read_file(const std::string &filename)
Definition: chem/molecule.cc:89
double get_core_bc(unsigned int atn, unsigned int core) const
Definition: chem/corepotential.h:191
double mol_nuclear_charge_density(double x, double y, double z) const
Definition: chem/molecule.cc:568
madness::Tensor< double > get_all_coords() const
Definition: chem/molecule.cc:177
Vector< T, 1 > vec(T x)
Your friendly neighborhood factory function.
Definition: array.h:456
bool is_potential_defined_atom(int i) const
Definition: chem/molecule.h:144
double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const
Definition: chem/molecule.cc:602
FLOAT a(int j, FLOAT z)
Definition: y1.cc:86
unsigned int atomic_number
Atomic number.
Definition: chem/molecule.h:58
bool is_defined(const unsigned int atn) const
Definition: chem/corepotential.h:165
unsigned int get_core_l(unsigned int atn, unsigned int c) const
Definition: chem/molecule.h:130
double total_nuclear_charge() const
Definition: chem/molecule.cc:560
double inter_atomic_distance(unsigned int i, unsigned int j) const
Definition: chem/molecule.cc:243
void set_eprec(double value)
updates rcuts with given eprec
Definition: chem/molecule.cc:209
unsigned int n_core_orb_all() const
Definition: chem/molecule.cc:636
double nuclear_repulsion_energy() const
Definition: chem/molecule.cc:250
Abstract Atom class.
Definition: DFcode/molecule.h:54
double core_potential_derivative(int atom, int axis, double x, double y, double z) const
Definition: chem/molecule.cc:687
double x
Definition: chem/molecule.h:57
Definition: chem/molecule.h:55
double y
Definition: chem/molecule.h:57
double bounding_cube() const
Returns the half width of the bounding cube.
Definition: chem/molecule.cc:550
const double m
Definition: gfit.cc:199
Atom(const Atom &a)
Definition: chem/molecule.h:63
void set_rcut(double value)
Definition: chem/corepotential.cc:382
Definition: chem/molecule.h:83
void print() const
Definition: chem/molecule.cc:228
std::ostream & operator<<(std::ostream &s, const ContractedGaussianShell &c)
Definition: chem/molecularbasis.cc:38
void read_core_file(const std::string &filename)
Definition: chem/molecule.cc:702
std::string pointgroup_
Definition: chem/molecule.h:108
Atom(double x, double y, double z, double q, unsigned int atomic_number)
Definition: chem/molecule.h:60
void set_core_eprec(double value)
Definition: chem/molecule.h:170
Tensor< double > op(const Tensor< double > &x)
Definition: kain.cc:508
std::string guess_file() const
Definition: chem/molecule.h:119
void serialize(Archive &ar)
Definition: chem/molecule.h:221
Definition: chem/corepotential.h:148
Holds machinery to set up Functions/FuncImpls using various Factories and Interfaces.
Definition: chem/atomutil.cc:45
bool is_potential_defined(unsigned int atn) const
Definition: chem/molecule.h:142
const double c
Definition: gfit.cc:200
void orient()
Centers and orients the molecule in a standard manner.
Definition: chem/molecule.cc:491
void set_core_rcut(double value)
Definition: chem/molecule.h:174
const Atom & get_atom(unsigned int i) const
Definition: chem/molecule.cc:223
double molecular_core_potential(double x, double y, double z) const
Definition: chem/molecule.cc:670
double nuclear_dipole(int axis) const
Definition: chem/molecule.cc:278