33 #ifndef MOLECULAR_BASIS_H
34 #define MOLECULAR_BASIS_H
38 #include <moldft/molecule.h>
53 std::vector<double> coeff;
54 std::vector<double> expnt;
61 int np = coeff.size();
62 if (np == 1) coeff[0] = 1.0e0;
65 int l_lim = 2*type - 1;
67 for (
int n=l_lim; n>1; n-=2) f *= n;
69 for (
int n=0; n<
np; ++n)
73 for (
int n1=0; n1<
np; ++n1) {
74 for (
int n2=0; n2<
np; ++n2) {
75 double S =pi32/pow(expnt[n1]+expnt[n2],1.5e0+type)/pow(2e0,type);
76 sum = sum + coeff[n1]*coeff[n2]*S;
82 for (
int n=0; n<
np; ++n) coeff[n] *= f;
87 : type(-1), coeff(), expnt(), rsqmax(0.0), numbf(0) {};
90 const std::vector<double>& coeff,
91 const std::vector<double>& expnt,
93 : type(type), coeff(coeff), expnt(expnt), numbf((type+1)*(type+2)/2) {
94 if (donorm) normalize();
95 double minexpnt = expnt[0];
96 for (
unsigned int i=1; i<expnt.size(); ++i)
97 minexpnt =
std::min(minexpnt,expnt[i]);
98 rsqmax = 18.4/minexpnt;
110 if (rsq > rsqmax)
return 0.0;
112 for (
unsigned int i=0; i<coeff.size(); ++i) {
113 double ersq = expnt[i]*rsq;
114 if (ersq < 18.4) sum += coeff[i]*
exp(-ersq);
121 double*
eval(
double rsq,
double x,
double y,
double z,
double* bf)
const {
123 if (
fabs(R) < 1e-8) {
124 for (
int i=0; i<numbf; ++i) bf[i] = 0.0;
139 static const double fac = 1.0;
162 throw "UNKNOWN ANGULAR MOMENTUM";
196 static const char* tags[4][10] = {
197 {
"s" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" } ,
198 {
"px" ,
"py" ,
"pz" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" } ,
199 {
"dxx" ,
"dxy" ,
"dxz" ,
"dyy" ,
"dyz" ,
"dzz" ,
"" ,
"" ,
"" ,
"" } ,
200 {
"fxxx",
"fxxy",
"fxxz",
"fxyy",
"fxyz",
"fxzz",
"fxzz",
"fyyy",
"fyzz",
"fzzz"}
202 MADNESS_ASSERT(ibf<numbf && ibf >= 0);
203 return tags[type][ibf];
206 template <
typename Archive>
208 ar & type & coeff & expnt & rsqmax & numbf;
214 std::vector<ContractedGaussianShell> g;
217 Tensor<double> dmat, avec, bvec;
226 for (
unsigned int i=0; i<g.size(); ++i) {
227 rmaxsq =
std::max(rmaxsq, g[i].rangesq());
233 const Tensor<double>& avec,
const Tensor<double>& bvec) {
234 this->dmat =
copy(dmat);
235 this->avec =
copy(avec);
236 this->bvec =
copy(bvec);
250 const std::vector<ContractedGaussianShell>&
get_shells()
const {
259 double*
eval(
double x,
double y,
double z,
double* bf)
const {
260 double rsq = x*x + y*y + z*z;
262 for (
int i=0; i<numbf; ++i) bf[i] = 0.0;
266 double* bfstart = bf;
267 for (
unsigned int i=0; i<g.size(); ++i) {
268 bf = g[i].eval(rsq, x, y, z, bf);
271 MADNESS_ASSERT(bf-bfstart == numbf);
278 double rsq = x*x + y*y + z*z;
279 if (rsq > rmaxsq)
return 0.0;
283 const double* p = dmat.ptr();
285 for (
int i=0; i<numbf; ++i, p+=numbf) {
287 for (
int j=0; j<numbf; ++j)
297 for (
unsigned int i=0; i<g.size(); ++i) {
298 int nbf_in_shell = g[i].
nbf();
299 if (ibf>=n && ibf<(n+nbf_in_shell)) {
300 ibf_in_shell = ibf-n;
311 return dmat.size()>0;
326 template <
typename Archive>
328 ar & g & rmaxsq & numbf & dmat & avec & bvec;
336 const double xx, yy, zz;
344 : xx(x), yy(y), zz(z), shell(shell), ibf(ibf), nbf(shell.nbf()) {}
351 , shell(aofunc.shell)
360 double rsq = x*x + y*y + z*z;
361 shell.
eval(rsq, x, y, z, bf);
365 void print_me(std::ostream& s)
const;
392 std::vector<AtomicBasis> ag;
394 template <
typename T>
395 std::vector<T> load_tixml_vector(
TiXmlElement* node,
int n,
const char* name) {
397 MADNESS_ASSERT(child);
398 std::istringstream s(child->
GetText());
400 for (
int i=0; i<n; ++i) {
401 MADNESS_ASSERT(s >> r[i]);
406 template <
typename T>
407 Tensor<T> load_tixml_matrix(
TiXmlElement* node,
int n,
int m,
const char* name) {
409 MADNESS_ASSERT(child);
410 std::istringstream s(child->
GetText());
412 for (
int i=0; i<n; ++i) {
413 for (
int j=0; j<
m; ++j) {
414 MADNESS_ASSERT(s >> r(i,j));
429 static const bool debug =
false;
432 std::cout <<
"AtomicBasisSet: Failed loading from file " << filename
435 <<
" : Col " << doc.
ErrorCol() << std::endl;
439 if (strcmp(node->
Value(),
"name") == 0) {
441 if (debug) std::cout <<
"Loading basis set " << name << std::endl;
443 else if (strcmp(node->
Value(),
"basis") == 0) {
444 const char* symbol = node->
Attribute(
"symbol");
445 if (debug) std::cout <<
" found basis set for " << symbol << std::endl;
447 std::vector<ContractedGaussianShell>
g;
449 const char* type = shell->Attribute(
"type");
451 shell->Attribute(
"nprim",&nprim);
452 if (debug) std::cout <<
" found shell " << type <<
" " << nprim << std::endl;
453 std::vector<double> expnt = load_tixml_vector<double>(shell, nprim,
"exponents");
454 if (strcmp(type,
"L") == 0) {
455 std::vector<double> scoeff = load_tixml_vector<double>(shell, nprim,
"scoefficients");
456 std::vector<double> pcoeff = load_tixml_vector<double>(shell, nprim,
"pcoefficients");
461 static const char* tag[] = {
"S",
"P",
"D",
"F",
"G"};
463 for (i=0; i<5; ++i) {
464 if (strcmp(type,tag[i]) == 0)
goto foundit;
468 std::vector<double> coeff = load_tixml_vector<double>(shell, nprim,
"coefficients");
474 else if (strcmp(node->
Value(),
"atomicguess") == 0) {
475 const char* symbol = node->
Attribute(
"symbol");
476 if (debug) std::cout <<
" atomic guess info for " << symbol << std::endl;
479 int nbf = ag[atn].nbf();
480 Tensor<double> dmat = load_tixml_matrix<double>(node,
nbf,
nbf,
"guessdensitymatrix");
481 Tensor<double> avec = load_tixml_matrix<double>(node,
nbf,
nbf,
"alphavectors");
482 Tensor<double> bvec = load_tixml_matrix<double>(node,
nbf,
nbf,
"betavectors");
483 ag[atn].set_guess_info(dmat, avec, bvec);
495 at_to_bf = std::vector<int>(molecule.
natom());
496 at_nbf = std::vector<int>(molecule.
natom());
499 for (
int i=0; i<molecule.
natom(); ++i) {
504 at_nbf[i] = ag[atn].nbf();
512 MADNESS_ASSERT(ibf >= 0);
514 for (
int i=0; i<molecule.
natom(); ++i) {
519 const int nbf_on_atom = ag[atn].nbf();
520 if (ibf >= n && (n+nbf_on_atom) > ibf) {
532 MADNESS_ASSERT(ibf >= 0);
534 for (
int i=0; i<molecule.
natom(); ++i) {
539 const int nbf_on_atom = ag[atn].nbf();
540 if (ibf >= n && (n+nbf_on_atom) > ibf) {
543 ag[atn].get_shell_from_basis_function(ibf-n, index);
557 for (
int i=0; i<molecule.
natom(); ++i) {
567 void eval(
const Molecule& molecule,
double x,
double y,
double z,
double *bf)
const {
568 for (
int i=0; i<molecule.
natom(); ++i) {
571 bf = ag[atn].eval(x-atom.
x, y-atom.
y, z-atom.
z, bf);
579 for (
int i=0; i<molecule.
natom(); ++i) {
582 sum += ag[atn].eval_guess_density(x-atom.
x, y-atom.
y, z-atom.
z);
589 return ag[atomic_number].nbf() > 0;
596 template <
typename T>
602 return std::abs(v[i]) > std::abs(v[j]);
614 template <
typename T>
616 const double thresh = 0.2*v.normf();
618 printf(
" zero vector\n");
621 long nbf = int(v.dim(0));
624 for (
long i=0; i<
nbf; ++i) {
625 if (std::abs(v(i)) > thresh) {
632 if (molecule.
natom() < 10) {
633 format =
" %2s(%1d)%4s(%2ld)%6.3f ";
635 else if (molecule.
natom() < 100) {
636 format =
" %2s(%2d)%4s(%3ld)%6.3f ";
638 else if (molecule.
natom() < 1000) {
639 format =
" %2s(%3d)%4s(%4ld)%6.3f ";
642 format =
" %2s(%4d)%4s(%5ld)%6.3f ";
645 for (
long ii=0; ii<ngot; ++ii) {
655 printf(format, element, iat, desc, ibf, v[ibf]);
663 template <
typename Archive>
int np
Definition: tdse1d.cc:166
int nbf() const
Returns the number of basis functions on the center.
Definition: DFcode/molecularbasis.h:240
double eval_radial(double rsq) const
Evaluates the radial part of the contracted function.
Definition: DFcode/molecularbasis.h:109
const double thresh
Definition: dielectric.cc:185
void print_anal(const Molecule &molecule, const Tensor< T > &v)
Given a vector of AO coefficients prints an analysis.
Definition: DFcode/molecularbasis.h:615
const Tensor< double > & get_dmat() const
Definition: DFcode/molecularbasis.h:314
NDIM const Function< R, NDIM > & g
Definition: mra.h:2179
bool is_supported(int atomic_number) const
Definition: DFcode/molecularbasis.h:587
const mpreal exp(const mpreal &v, mp_rnd_t rnd_mode)
Definition: mpreal.h:2234
const double pi
Mathematical constant pi.
Definition: constants.h:44
int angular_momentum() const
Returns the shell angular momentum.
Definition: DFcode/molecularbasis.h:170
const double R
Definition: dielectric.cc:191
void atoms_to_bfn(const Molecule &molecule, std::vector< int > &at_to_bf, std::vector< int > &at_nbf)
Makes map from atoms to first basis function on atom and number of basis functions on atom...
Definition: DFcode/molecularbasis.h:494
double eval_guess_density(const Molecule &molecule, double x, double y, double z) const
Evaluates the guess density.
Definition: DFcode/molecularbasis.h:577
void serialize(Archive &ar)
Definition: DFcode/molecularbasis.h:207
double rangesq() const
Returns square of the distance beyond which function is less than 1e-8.
Definition: DFcode/molecularbasis.h:103
double operator()(double x, double y, double z) const
Definition: DFcode/molecularbasis.h:355
ContractedGaussianShell()
Definition: DFcode/molecularbasis.h:86
void serialize(Archive &ar)
Definition: DFcode/molecularbasis.h:664
double eval_guess_density(double x, double y, double z) const
Evaluates the guess atomic density at point x, y, z relative to atomic center.
Definition: DFcode/molecularbasis.h:276
const bool debug
Definition: tdse1.cc:45
const ContractedGaussianShell & get_shell_from_basis_function(int ibf, int &ibf_in_shell) const
Return shell that contains basis function ibf and also return index of function in the shell...
Definition: DFcode/molecularbasis.h:295
const char *const symbol
Definition: chem/atomutil.h:54
double z
Definition: chem/molecule.h:57
::std::string string
Definition: gtest-port.h:872
Defines common mathematical and physical constants.
void print_me(std::ostream &s) const
Definition: chem/molecularbasis.cc:73
madness::Vector< double, 3 > get_coords_vec() const
Definition: DFcode/molecularbasis.h:384
double eval_radial(double rsq) const
Evaluates the radial part of the contracted function.
Definition: chem/molecularbasis.h:110
int nprim() const
Returns the number of primitives in the contraction.
Definition: DFcode/molecularbasis.h:180
int nbf(const Molecule &molecule) const
Given a molecule count the number of basis functions.
Definition: DFcode/molecularbasis.h:555
NDIM & f
Definition: mra.h:2179
bool operator()(long i, long j) const
Definition: DFcode/molecularbasis.h:601
int nbf() const
Returns the number of basis functions in the shell.
Definition: DFcode/molecularbasis.h:175
bool LoadFile(TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)
Definition: tinyxml.cc:924
AtomicBasisFunction get_atomic_basis_function(const Molecule &molecule, int ibf) const
Returns the ibf'th atomic basis function.
Definition: chem/molecularbasis.h:474
AtomicBasis(const std::vector< ContractedGaussianShell > &g)
Definition: DFcode/molecularbasis.h:222
int ErrorCol() const
The column where the error occured. See ErrorRow()
Definition: tinyxml.h:1475
AtomicBasis()
Definition: DFcode/molecularbasis.h:220
Represents multiple shells of contracted gaussians on a single center.
Definition: chem/molecularbasis.h:214
void eval(const Molecule &molecule, double x, double y, double z, double *bf) const
Evaluates the basis functions.
Definition: DFcode/molecularbasis.h:567
const char * get_desc(int ibf) const
Returns a string description of the basis function type.
Definition: DFcode/molecularbasis.h:195
Defines and implements most of Tensor.
int natom() const
Definition: chem/molecule.h:148
Represents a single shell of contracted, Cartesian, Gaussian primitives.
Definition: chem/molecularbasis.h:52
int ErrorRow() const
Definition: tinyxml.h:1474
const AtomicData & get_atomic_data(unsigned int atomic_number)
Definition: chem/atomutil.cc:160
int nbf(const Molecule &molecule) const
Given a molecule count the number of basis functions.
Definition: chem/molecularbasis.h:498
double * eval(double rsq, double x, double y, double z, double *bf) const
Evaluates the entire shell returning the incremented result pointer.
Definition: DFcode/molecularbasis.h:121
#define max(a, b)
Definition: lda.h:53
const char * ErrorDesc() const
Contains a textual (english) description of the error if one occurs.
Definition: tinyxml.h:1460
void set_guess_info(const Tensor< double > &dmat, const Tensor< double > &avec, const Tensor< double > &bvec)
Definition: DFcode/molecularbasis.h:232
Vector< T, 1 > vec(T x)
Your friendly neighborhood factory function.
Definition: array.h:456
double * eval(double x, double y, double z, double *bf) const
Evaluates the basis functions at point x, y, z relative to atomic center.
Definition: DFcode/molecularbasis.h:259
int get_index() const
Definition: DFcode/molecularbasis.h:371
const std::vector< double > & get_expnt() const
Returns a const reference to the exponents.
Definition: DFcode/molecularbasis.h:190
const std::vector< double > & get_coeff() const
Returns a const reference to the coefficients.
Definition: DFcode/molecularbasis.h:185
const char * get_desc(int ibf) const
Returns a string description of the basis function type.
Definition: chem/molecularbasis.h:196
Used to represent one basis function from a shell on a specific center.
Definition: chem/molecularbasis.h:335
void read_file(std::string filename)
read the atomic basis set from file
Definition: chem/molecularbasis.cc:107
Function< T, NDIM > copy(const Function< T, NDIM > &f, const std::shared_ptr< WorldDCPmapInterface< Key< NDIM > > > &pmap, bool fence=true)
Create a new copy of the function with different distribution and optional fence. ...
Definition: mra.h:1835
const mpreal min(const mpreal &x, const mpreal &y)
Definition: mpreal.h:2675
Definition: tinyxml.h:1386
const TiXmlElement * FirstChildElement() const
Convenience function to get through elements.
Definition: tinyxml.cc:431
AtomicBasisSet()
Definition: DFcode/molecularbasis.h:421
unsigned int atomic_number
Atomic number.
Definition: chem/molecule.h:58
const char * get_desc() const
Definition: chem/molecularbasis.h:376
void get_coords(double &x, double &y, double &z) const
Definition: DFcode/molecularbasis.h:379
const Tensor< double > & get_bvec() const
Definition: DFcode/molecularbasis.h:322
int basisfn_to_atom(const Molecule &molecule, int ibf) const
Returns the number of the atom the ibf'th basis function is on.
Definition: chem/molecularbasis.h:454
bool is_supported(int atomic_number) const
Definition: chem/molecularbasis.h:530
const char * get_desc() const
Definition: DFcode/molecularbasis.h:375
AtomicBasisFunction(double x, double y, double z, const ContractedGaussianShell &shell, int ibf)
Definition: DFcode/molecularbasis.h:342
tensorT sqrt(const tensorT &s, double tol=1e-8)
Computes matrix square root (not used any more?)
Definition: DFcode/moldft.cc:446
bool has_guess_info() const
Definition: chem/molecularbasis.h:311
void read_file(std::string filename)
Definition: DFcode/molecularbasis.h:428
const std::vector< ContractedGaussianShell > & get_shells() const
Returns a const reference to the shells.
Definition: DFcode/molecularbasis.h:250
double x
Definition: chem/molecule.h:57
Definition: chem/molecule.h:55
const TiXmlElement * NextSiblingElement() const
Definition: tinyxml.cc:461
double * eval(double rsq, double x, double y, double z, double *bf) const
Evaluates the entire shell returning the incremented result pointer.
Definition: chem/molecularbasis.h:122
double y
Definition: chem/molecule.h:57
const mpreal sum(const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode)
Definition: mpreal.cc:241
AtomicBasisFunction(const AtomicBasisFunction &aofunc)
Definition: DFcode/molecularbasis.h:347
const double m
Definition: gfit.cc:199
unsigned int symbol_to_atomic_number(const std::string &symbol)
Definition: chem/atomutil.cc:166
AtomicBasisFunction get_atomic_basis_function(const Molecule &molecule, int ibf) const
Returns the ibf'th atomic basis function.
Definition: DFcode/molecularbasis.h:531
Definition: chem/molecule.h:83
Definition: DFcode/molecularbasis.h:597
const Tensor< double > & get_avec() const
Definition: DFcode/molecularbasis.h:318
const char * Value() const
Definition: tinyxml.h:489
int nbf() const
Returns the number of basis functions on the center.
Definition: chem/molecularbasis.h:241
void serialize(Archive &ar)
Definition: DFcode/molecularbasis.h:327
AnalysisSorter(const Tensor< T > &v)
Definition: DFcode/molecularbasis.h:600
void print_all() const
Print basis info for all supported atoms.
Definition: chem/molecularbasis.cc:97
Contracted Gaussian basis.
Definition: chem/molecularbasis.h:391
double E0(double p)
Definition: gfit.cc:203
#define MADNESS_EXCEPTION(msg, value)
Definition: worldexc.h:88
int nshell() const
Returns the number of shells on the center.
Definition: DFcode/molecularbasis.h:245
const char * GetText() const
Definition: tinyxml.cc:871
const mpreal fabs(const mpreal &v, mp_rnd_t rnd_mode)
Definition: mpreal.h:2187
AtomicBasisSet(std::string filename)
Definition: DFcode/molecularbasis.h:424
Holds machinery to set up Functions/FuncImpls using various Factories and Interfaces.
Definition: chem/atomutil.cc:45
const char * Attribute(const char *name) const
Definition: tinyxml.cc:555
const ContractedGaussianShell & get_shell() const
Definition: DFcode/molecularbasis.h:367
void print(const Molecule &molecule) const
Print basis info for atoms in the molecule (once for each unique atom type)
Definition: chem/molecularbasis.cc:78
double * eval(double x, double y, double z, double *bf) const
Evaluates the basis functions at point x, y, z relative to atomic center.
Definition: chem/molecularbasis.h:260
const Atom & get_atom(unsigned int i) const
Definition: chem/molecule.cc:223
bool has_guess_info() const
Definition: DFcode/molecularbasis.h:310
ContractedGaussianShell(int type, const std::vector< double > &coeff, const std::vector< double > &expnt, bool donorm=true)
Definition: DFcode/molecularbasis.h:89
Definition: tinyxml.h:945
int basisfn_to_atom(const Molecule &molecule, int ibf) const
Returns the number of the atom the ibf'th basis function is on.
Definition: DFcode/molecularbasis.h:511
int nbf() const
Returns the number of basis functions in the shell.
Definition: chem/molecularbasis.h:176