MADNESS  version 0.9
jacob/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_MOLECULE_H
34 #define MADNESS_MOLECULE_H
35 
38 
39 #include <jacob/corepotential.h>
40 #include <jacob/atomutil.h>
41 #include <vector>
42 #include <string>
43 #include <iostream>
44 #include <fstream>
45 #include <sstream>
46 #include <algorithm>
47 #include <ctype.h>
48 #include <cmath>
49 #include <madness/tensor/tensor.h>
50 #include <madness/misc/misc.h>
51 #include <madness/world/array.h>
52 
53 
54 class Atom {
55 public:
56  double x, y, z, q;
57  unsigned int atomic_number;
58 
59  explicit Atom(double x, double y, double z, double q, unsigned int atomic_number)
60  : x(x), y(y), z(z), q(q), atomic_number(atomic_number) {}
61 
62  Atom(const Atom& a)
63  : x(a.x), y(a.y), z(a.z), q(a.q), atomic_number(a.atomic_number) {}
64 
66  Atom()
67  : x(0), y(0), z(0), q(0), atomic_number(0) {}
68 
69  template <typename Archive>
70  void serialize(Archive& ar) {
71  ar & x & y & z & q & atomic_number;
72  }
73 };
74 
75 std::ostream& operator<<(std::ostream& s, const Atom& atom);
76 
77 class Molecule {
78 private:
79  // If you add more fields don't forget to serialize them
80  std::vector<Atom> atoms;
81  std::vector<double> rcut; // Reciprocal of the smoothing radius
82  std::vector<double> rsqasymptotic;// value od r*r beyond which the potential is assymptotic 1./r Jacob added
83  double eprec; // Error in energy/atom due to smoothing
84  CorePotentialManager core_pot;
85  madness::Tensor<double> field;
86 
87  void swapaxes(int ix, int iy);
88 
89  template <typename opT>
90  bool test_for_op(double xaxis, double yaxis, double zaxis, opT op) const;
91 
92  bool test_for_c2(double xaxis, double yaxis, double zaxis) const;
93 
94  bool test_for_sigma(double xaxis, double yaxis, double zaxis) const;
95 
96  bool test_for_inverse() const;
97 
98 public:
100  Molecule() : atoms(), rcut(), rsqasymptotic(), eprec(1e-4), core_pot(), field(3L) {};
101 
102  void read_file(const std::string& filename);
103 
104  void read_core_file(const std::string& filename);
105 
106  std::string guess_file() const { return core_pot.guess_file(); };
107 
108  unsigned int n_core_orb_all() const ;
109 
110  unsigned int n_core_orb(unsigned int atn) const {
111  if (core_pot.is_defined(atn))
112  return core_pot.n_core_orb_base(atn);
113  else
114  return 0;
115  };
116 
117  unsigned int get_core_l(unsigned int atn, unsigned int c) const {
118  return core_pot.get_core_l(atn, c);
119  }
120 
121  double get_core_bc(unsigned int atn, unsigned int c) const {
122  return core_pot.get_core_bc(atn, c);
123  }
124 
125  double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const;
126 
127  double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const;
128 
129  bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); };
130 
131  bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); };
132 
133  void add_atom(double x, double y, double z, double q, int atn);
134 
135  int natom() const {
136  return atoms.size();
137  };
138 
139  void set_atom_coords(unsigned int i, double x, double y, double z);
140 
141  madness::Tensor<double> get_all_coords() const;
142 
143  std::vector< madness::Vector<double,3> > get_all_coords_vec() const;
144 
145  std::vector<double> atomic_radii;
146 
147  std::vector<double> charge_center();
148 
149  void set_all_coords(const madness::Tensor<double>& newcoords);
150 
151 
152  void set_eprec(double value);
153 
154  void set_rcut(double value);
155 
156  void set_core_eprec(double value) {
157  core_pot.set_eprec(value);
158  }
159 
160  void set_core_rcut(double value) {
161  core_pot.set_rcut(value);
162  }
163 
164  double get_eprec() const {
165  return eprec;
166  }
167 
168  double bounding_cube() const;
169 
170  const Atom& get_atom(unsigned int i) const;
171 
172  void print() const;
173 
174  double inter_atomic_distance(unsigned int i,unsigned int j) const;
175 
176  double nuclear_repulsion_energy() const;
177 
178  double nuclear_repulsion_derivative(int i, int j) const;
179 
180  double nuclear_dipole(int axis) const;
181 
182  double nuclear_charge_density(double x, double y, double z) const;//nuclear charge density jacob added
183 
184  double smallest_length_scale() const;
185 
186  void identify_point_group();
187 
188  void center();
189 
190  void orient();
191 
192  double Qnxx() const;
193 
194  double Qnyy() const;
195 
196  double Qnzz() const;
197 
198  double Qnxz() const;
199 
200  double Qnxy() const;
201 
202  double Qnyz() const;
203 
204  double total_nuclear_charge() const;
205 
206  double nuclear_attraction_potential(double x, double y, double z) const;
207 
208  double molecular_core_potential(double x, double y, double z) const;
209 
210  double core_potential_derivative(int atom, int axis, double x, double y, double z) const;
211 
212  double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const;
213 
214  template <typename Archive>
215  void serialize(Archive& ar) {
216  ar & atoms & rcut & rsqasymptotic & field & eprec & core_pot & atomic_radii;
217  }
218 };
219 
220 
221 #endif
double inter_atomic_distance(unsigned int i, unsigned int j) const
Definition: DFcode/molecule.cc:242
double z
Definition: DFcode/molecule.h:56
void set_eprec(double value)
updates rcuts with given eprec
Definition: DFcode/molecule.cc:208
double molecular_core_potential(double x, double y, double z) const
Definition: DFcode/molecule.cc:639
Header to declare stuff which has not yet found a home.
unsigned int n_core_orb_all() const
Definition: DFcode/molecule.cc:605
double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const
Definition: DFcode/molecule.cc:626
std::string guess_file() const
Definition: DFcode/corepotential.h:175
bool is_potential_defined(unsigned int atn) const
Definition: jacob/molecule.h:129
const double L
Definition: 3dharmonic.cc:123
::std::string string
Definition: gtest-port.h:872
double Qnzz() const
Definition: jacob/molecule.cc:373
double nuclear_attraction_potential(double x, double y, double z) const
Definition: DFcode/molecule.cc:550
double x
Definition: DFcode/molecule.h:56
double get_core_bc(unsigned int atn, unsigned int c) const
Definition: jacob/molecule.h:121
std::vector< double > atomic_radii
Definition: jacob/molecule.h:145
Definition: DFcode/corepotential.h:146
void add_atom(double x, double y, double z, double q, int atn)
Definition: DFcode/molecule.cc:161
Atom(double x, double y, double z, double q, unsigned int atomic_number)
Definition: jacob/molecule.h:59
int natom() const
Definition: jacob/molecule.h:135
double Qnyy() const
Definition: jacob/molecule.cc:364
double total_nuclear_charge() const
Definition: DFcode/molecule.cc:542
void set_eprec(double value)
double smallest_length_scale() const
Definition: DFcode/molecule.cc:300
Definition: DFcode/molecule.h:82
std::vector< madness::Vector< double, 3 > > get_all_coords_vec() const
Definition: DFcode/molecule.cc:187
double Qnxy() const
Definition: jacob/molecule.cc:391
unsigned int n_core_orb(unsigned int atn) const
Definition: jacob/molecule.h:110
void identify_point_group()
Definition: DFcode/molecule.cc:402
double core_potential_derivative(int atom, int axis, double x, double y, double z) const
Definition: DFcode/molecule.cc:654
Atom()
Default construct makes a zero charge ghost atom at origin.
Definition: jacob/molecule.h:66
Defines and implements most of Tensor.
void read_core_file(const std::string &filename)
Definition: DFcode/molecule.cc:669
void set_rcut(double value)
Definition: DFcode/molecule.cc:216
double q
Coordinates and charge in atomic units.
Definition: DFcode/molecule.h:56
double Qnxx() const
Definition: jacob/molecule.cc:355
double nuclear_dipole(int axis) const
Definition: DFcode/molecule.cc:263
FLOAT a(int j, FLOAT z)
Definition: y1.cc:86
Atom(const Atom &a)
Definition: jacob/molecule.h:62
double get_eprec() const
Definition: jacob/molecule.h:164
void print() const
Definition: DFcode/molecule.cc:227
std::string guess_file() const
Definition: jacob/molecule.h:106
void set_core_rcut(double value)
Definition: jacob/molecule.h:160
void set_all_coords(const madness::Tensor< double > &newcoords)
Definition: DFcode/molecule.cc:198
Molecule()
Makes a molecule with zero atoms.
Definition: jacob/molecule.h:100
double Qnyz() const
Definition: jacob/molecule.cc:400
Abstract Atom class.
Definition: DFcode/molecule.h:54
void set_rcut(double value)
double bounding_cube() const
Returns the half width of the bounding cube.
Definition: DFcode/molecule.cc:532
void read_file(const std::string &filename)
Definition: DFcode/molecule.cc:92
const double m
Definition: gfit.cc:199
unsigned int get_core_l(unsigned int atn, unsigned int core) const
Definition: DFcode/corepotential.h:185
double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const
Definition: DFcode/molecule.cc:617
bool is_potential_defined_atom(int i) const
Definition: jacob/molecule.h:131
double get_core_bc(unsigned int atn, unsigned int core) const
Definition: DFcode/corepotential.h:189
double y
Definition: DFcode/molecule.h:56
const Atom & get_atom(unsigned int i) const
Definition: DFcode/molecule.cc:222
std::vector< double > charge_center()
get the coordinates of the nuclear charge center
Definition: jacob/molecule.cc:169
void orient()
Centers and orients the molecule in a standard manner.
Definition: DFcode/molecule.cc:473
unsigned int n_core_orb_base(const unsigned int atn) const
Definition: DFcode/corepotential.h:171
Tensor< double > op(const Tensor< double > &x)
Definition: kain.cc:508
unsigned int get_core_l(unsigned int atn, unsigned int c) const
Definition: jacob/molecule.h:117
double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const
Definition: DFcode/molecule.cc:571
bool is_defined(const unsigned int atn) const
Definition: DFcode/corepotential.h:163
void serialize(Archive &ar)
Definition: jacob/molecule.h:215
void set_atom_coords(unsigned int i, double x, double y, double z)
Definition: DFcode/molecule.cc:168
double nuclear_repulsion_energy() const
Definition: DFcode/molecule.cc:249
std::ostream & operator<<(std::ostream &s, const Atom &atom)
Definition: DFcode/molecule.cc:64
void center()
Moves the center of nuclear charge to the origin.
Definition: DFcode/molecule.cc:310
const double c
Definition: gfit.cc:200
unsigned int atomic_number
Atomic number.
Definition: DFcode/molecule.h:57
void serialize(Archive &ar)
Definition: jacob/molecule.h:70
double nuclear_repulsion_derivative(int i, int j) const
Definition: DFcode/molecule.cc:281
double Qnxz() const
Definition: jacob/molecule.cc:382
double nuclear_charge_density(double x, double y, double z) const
Definition: DFcode/molecule.cc:591
madness::Tensor< double > get_all_coords() const
Definition: DFcode/molecule.cc:176
void set_core_eprec(double value)
Definition: jacob/molecule.h:156