Ejemplo n.º 1
0
inline void Molecule::make_geometric_matrix()
{
	geometric.resize(number_of_bonds, number_of_bonds);
	for (int i = 0; i < number_of_bonds; i++)
	{
		std::pair<int, int> bond = get_bond_by_index(i);
		sGTO first_sGTO= basis_[atoms_[bond.first].symbol];
		sGTO second_sGTO= basis_[atoms_[bond.second].symbol];
		double r = distance1(atoms_[bond.first].X, atoms_[bond.second].X);
		geometric(i,i) = basis_.overlap_integral(first_sGTO, second_sGTO, r);
	}
}
Ejemplo n.º 2
0
inline void Molecule::make_coulomb_integrals()
{
	unsigned n = atoms_.size();
	if (coulomb_.size() != n * n) coulomb_.resize(n, n);

	for (unsigned i=0; i<n; i++)
	{
		const sGTO &sgto= basis_[atoms_[i].symbol];
		for (unsigned j=0; j<i; j++)
		{
			const sGTO &sgto__= basis_[atoms_[j].symbol];
			double r = distance1(atoms_[i].X, atoms_[j].X);
			double s = basis_.coulomb_integral(sgto, sgto__, r);
			coulomb_(i,j) = s;
			coulomb_(j,i) = s;
		}
		coulomb_(i,i) = atoms_[i].hardness;
	}
}
Ejemplo n.º 3
0
inline void Molecule::make_coulomb_integrals(std::vector<double> &coulomb_matrix)
{
	unsigned n = atoms_.size();
	if (coulomb_matrix.size() != n * n) coulomb_matrix.resize(n * n);

	for (unsigned i=0; i<n; i++)
	{
		const sGTO &sgto= basis_[atoms_[i].symbol];
		for (unsigned j=0; j<i; j++)
		{
			const sGTO &sgto__= basis_[atoms_[j].symbol];
			double r = distance1(atoms_[i].X, atoms_[j].X);
			double s = basis_.coulomb_integral(sgto, sgto__, r);
			_E(n, &coulomb_matrix[0], i, j) = s;
			_E(n, &coulomb_matrix[0], j, i) = s;
		}
		_E(n, &coulomb_matrix[0], i, i) = atoms_[i].hardness;
			// for the diagonal elements, use hardness
	}
}
Ejemplo n.º 4
0
	void insert(std::string symbol, const v3dense &X)
	{
		// look up AtomSymbol to assign parameters
		for (unsigned i=0; i<RAPPLE_GODDARD_PARAM_COUNT; i++)
		{
			if (symbol == RAPPLE_GODDARD_PARAMS[i].symbol)
			{
				Atom atom;
				atom.symbol = symbol;
				atom.electronegativity = RAPPLE_GODDARD_PARAMS[i].electronegativity;
				atom.hardness = RAPPLE_GODDARD_PARAMS[i].hardness;
				atom.X[0] = X[0] * ANGSTROM_2_BORH;
				atom.X[1] = X[1] * ANGSTROM_2_BORH;
				atom.X[2] = X[2] * ANGSTROM_2_BORH;
				atoms_.push_back(atom);
				basis_.insert(_Orbital(symbol, RAPPLE_GODDARD_PARAMS[i].gaussian_exponent));
				return;
			}
		}
		std::string msg = _S("[ERROR] Unknown element type : ") + symbol;
		PRINT_ERR(msg);
	}