/* $RCSfile$
* $Author$
* $Date$
* $Revision$
*
* Copyright (C) 2001-2007 Stephan Michels <stephan@vern.chem.tu-berlin.de>
*
* Contact: cdk-devel@lists.sf.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package org.openscience.cdk.math.qm;
import org.openscience.cdk.math.Matrix;
import org.openscience.cdk.math.Vector;
/**
* This class represents a set of orbitals
*
* @author Stephan Michels <stephan@vern.chem.tu-berlin.de>
* @cdk.githash
* @cdk.created 2001-06-14
* @cdk.module qm
*/
public class Orbitals
{
private int count_basis;
private int count_orbitals;
private Matrix C;
private IBasis basis;
private int count_electrons = 1;
/**
* Constructs orbitals with a specified base set
*/
public Orbitals(IBasis basis)
{
this.basis = basis;
count_orbitals = count_basis = basis.getSize();
C = new Matrix(count_basis, count_basis);
for(int i=0; i<count_basis; i++)
for(int j=0; j<count_basis; j++)
if (i==j)
C.matrix[i][j] = 1d;
else
C.matrix[i][j] = 0d;
}
/**
* Constructs orbitals with a specified base set and a coefficient matrix
*/
public Orbitals(IBasis basis, Matrix C)
{
this.basis = basis;
count_basis = basis.getSize();
if (count_basis==C.rows)
{
this.C = C;
count_orbitals = C.columns;
}
else
{
this.C = new Matrix(count_basis, count_basis);
for(int i=0; i<count_basis; i++)
for(int j=0; j<count_basis; j++)
if (i==j)
this.C.matrix[i][j] = 1d;
else
this.C.matrix[i][j] = 0d;
count_orbitals = count_basis;
}
}
/**
* Set a coefficient matrix
*/
public void setCoefficients(Matrix C)
{
if (count_basis==C.rows)
{
this.C = C;
count_orbitals = C.columns;
}
}
/**
* Get the coefficient matrix
*/
public Matrix getCoefficients()
{
return C;
}
/**
* Get the function value of a orbital at the position (x,y,z)
*/
public double getValue(int index, double x, double y, double z)
{
double sum = 0;
for(int i=0; i<count_basis; i++)
if (C.matrix[i][index]!=0d)
sum += C.matrix[i][index]*basis.getValue(i, x, y, z);
return sum;
}
/**
* Get the function value of a orbital
*/
public Vector getValues(int index, Matrix m)
{
if (m.rows!=3)
return null;
Vector result = basis.getValues(0, m).mul(C.matrix[0][index]);
for(int i=1; i<count_basis; i++)
if (C.matrix[i][index]!=0d)
result.add(basis.getValues(i, m).mul(C.matrix[0][index]));
return result;
}
/**
* Returns the basis set of this orbitals
*/
public IBasis getBasis()
{
return basis;
}
/**
* Set the count of bases
*/
public int getCountBasis()
{
return count_basis;
}
/**
* Returns the count of orbitals
*/
public int getCountOrbitals()
{
return count_orbitals;
}
/**
* Sets the count of electrons, which occupies the orbitals
*/
public void setCountElectrons(int count)
{
if (count>0)
count_electrons = count;
}
/**
* Gets the count of electrons, which occupies the orbitals
*/
public int getCountElectrons()
{
return count_electrons;
}
}