Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > df29c83ca401d91ec9c00bfcf7fea4ea > files > 242

shedskin-0.8-2mdv2010.2.i586.rpm

#!/usr/bin/python

"""\
  atomic_sto.py - Slater Type Orbitals
"""

# Copyright (c) 2007, Mark Dewing
# Quameon is covered under the GNU General Public License.  Please see the
# file LICENSE that is part of this distribution.

import box_bc
import math
import atomic_sto_primitive
from orbital_base import orbital_base


class atomic_STO(orbital_base):
  def __init__(self):
    self.exp = 0.5
    self.primitive = atomic_sto_primitive.s()
    self.npos = [[0.0,0.0,0.0]]
    self.npos_idx = 0
    self.box = box_bc.box_nopbc()
    self.norm = 1.0

#  def set_npos_idx(self,idx):
#    pass
#
#  def set_npos(self,npos):
#    pass

  def set_exp_coeff(self,exp,coeff,orb_type,npos):
    self.coeff = coeff
    self.exp = exp
    if orb_type == 's':
      self.primitive = atomic_sto_primitive.s()

    if orb_type == 'px':
      self.primitive = atomic_sto_primitive.px()
    if orb_type == 'py':
      self.primitive = atomic_sto_primitive.py()
    if orb_type == 'pz':
      self.primitive = atomic_sto_primitive.pz()

    # cartesian d functions

    if orb_type == 'dx2':
      self.primitive = atomic_sto_primitive.dx2()
    if orb_type == 'dy2':
      self.primitive = atomic_sto_primitive.dy2()
    if orb_type == 'dz2':
      self.primitive = atomic_sto_primitive.dz2()
    if orb_type == 'dxy':
      self.primitive = atomic_sto_primitive.dxy()
    if orb_type == 'dxz':
      self.primitive = atomic_sto_primitive.dxz()
    if orb_type == 'dyz':
      self.primitive = atomic_sto_primitive.dyz()

    # canonical d functions (the two linear combinations)

    if orb_type == 'dx2y2':
      self.primitive = atomic_sto_primitive.dx2y2()
    if orb_type == 'd3z2r2':
      self.primitive = atomic_sto_primitive.d3z2r2()

#  def normalize(self):
#    overlap = 0.0
#    return 1.0

    #for c in self.coeff:
    #  overlap += c*c

    #n = len(self.coeff)
    #for i in range(n):
    #  for j in range(i):
    #    a1 = self.exp[i]
    #    a2 = self.exp[j]
    #    ovlp = (2/(a1+a2))**(3.0/2)*(a1*a2)**(3.0/4)
    #    overlap += 2*self.coeff[i]*self.coeff[j]*ovlp
    #
    #print 'qmc overlap = ',overlap
    #self.norm = 1/math.sqrt(overlap)

  def get_coords(self,p):
    (vec,r) = self.box.dist_v(p,self.npos[self.npos_idx])
    return vec[0],vec[1],vec[2],r*r

  def compute_value(self,p,n_orb):
    (x,y,z,r2) = self.get_coords(p)
    val = self.primitive.compute_value(self.exp,[x,y,z])
    return [val]

  def compute_value2(self,p,n_orb):
    (vec,r) = self.box.dist_v(p,self.npos[self.npos_idx])
    return self.primitive.compute_value(self.exp,vec)

  def compute_del(self,p,n_orb):
    (x,y,z,r2) = self.get_coords(p)
    val = self.primitive.compute_del(self.exp,[x,y,z])
    return [val]

  def compute_del_sq(self,p,n_orb):
    (x,y,z,r2) = self.get_coords(p)
    val = self.primitive.compute_del_sq(self.exp,[x,y,z])
    return [val]

  def get_vp(self):
    return [self.exp]

  def set_vp(self,vp):
    self.exp = vp[0]
    return None