3
0
mirror of https://github.com/triqs/dft_tools synced 2024-10-31 19:23:45 +01:00
dft_tools/pytriqs/lattice/lattice_tools.pyx
tayral 3aa380ba9d Fixed abs bug in bravais_lattice + added method
When constructing the last unit vector in 2D, the sanity check was wrong because of usage of abs instead of std::abs.

Added method energy_on_bz_path_2 that returns the energy *matrix* at each k point on a given path instead of the eigenvalues of this matrix. The name of the function should be changed (to energy_matrix_on_bz_path?)

Renaming energies_on_bz_path_2 to energy_matrix_on_bz_path
2014-05-08 12:09:58 +01:00

117 lines
4.8 KiB
Cython

from dcomplex cimport *
from shared_ptr cimport *
from arrays cimport *
from libcpp.pair cimport pair
from libcpp.vector cimport vector
from libcpp.string cimport string as std_string
#from extractor cimport *
#from h5 cimport *
from cython.operator cimport dereference as deref, preincrement as inc #dereference and increment operator
import numpy
cdef extern from "triqs/lattice/brillouin_zone.hpp" :
cdef cppclass bravais_lattice_c " triqs::lattice::bravais_lattice" :
bravais_lattice_c(matrix[double] & units, vector[tqa_vector[double]] &, vector[std_string] &) except +
int n_orbitals()
matrix[double] units()
int dim()
tqa_vector[double] lattice_to_real_coordinates (tqa_vector_view[double] &)
cdef extern from "triqs/lattice/tight_binding.hpp" namespace "triqs::gf" :
cdef cppclass tight_binding " triqs::lattice::tight_binding" :
tight_binding(bravais_lattice_c & units, vector[vector[long]] &, vector[matrix[dcomplex]] &) except +
#Fix the name conflict pv wiht a pxd, cf doc....?
array_view[complex,THREE] hopping_stack_c "hopping_stack" (tight_binding & TB, array_view[double,TWO] & k_stack)
pair [array[double,ONE],array[double,TWO]] dos_c "dos" (tight_binding & TB, size_t nkpts, size_t neps)
pair [array[double,ONE],array[double,ONE]] dos_patch_c "dos_patch" (tight_binding & TB, array_view[double,TWO] & triangles, size_t neps, size_t ndiv)
array_view[double,TWO] energies_on_bz_path_c "energies_on_bz_path" (tight_binding & TB, tqa_vector[double] & K1, tqa_vector[double] & K2, size_t n_pts)
array_view[complex,THREE] energy_matrix_on_bz_path_c "energy_matrix_on_bz_path" (tight_binding & TB, tqa_vector[double] & K1, tqa_vector[double] & K2, size_t n_pts)
array_view[double,TWO] energies_on_bz_grid_c "energies_on_bz_grid" (tight_binding & TB, size_t n_pts)
cdef class BravaisLattice :
"""
"""
cdef bravais_lattice_c * _c
def __init__(self, units, orbital_positions = None ) :
""" """
cdef vector[std_string] names
cdef vector[tqa_vector[double]] atom_pos
orbital_positions = orbital_positions if orbital_positions else dict ("", (0,0,0) )
for name, pos in orbital_positions.items():
names.push_back(name)
atom_pos.push_back(tqa_vector[double](pos))
self._c = new bravais_lattice_c( matrix[double](units),atom_pos, names)
def __dealloc__(self):
del self._c
def lattice_to_real_coordinates(self, R) :
"""
Transform into real coordinates.
:param x_in: coordinates in the basis of the unit vectors
:rtype: Output coordinates in R^3 (real coordinates) as an array
"""
return self._c.lattice_to_real_coordinates ( tqa_vector_view[double] (R)).to_python()
property dim :
"""Dimension of the lattice"""
def __get__(self) :
"""Dimension of the lattice"""
return self._c.dim()
def n_orbitals(self) :
"""Number of orbitals"""
return self._c.n_orbitals()
cdef class TightBinding:
"""
"""
cdef tight_binding * _c
def __init__(self, BravaisLattice bravais_lattice, hopping ) :
""" """
#self._c = new tight_binding(deref(bravais_lattice._c))
#cdef vector[long] d
cdef vector[matrix[dcomplex]] mats
cdef vector[vector[long]] displs
for displ, mat in hopping.items() :
displs.push_back(displ)
#d = displ
mats.push_back(matrix[dcomplex] (numpy.array(mat, dtype =float)))
#self._c.push_back( d, matrix[double] (numpy.array(mat, dtype =float)))
self._c = new tight_binding(deref(bravais_lattice._c), displs, mats)
def __dealloc__(self):
del self._c
# -------------------------------------------
def hopping_stack (TightBinding TB, k_stack) :
""" """
return hopping_stack_c(deref(TB._c), array_view[double,TWO](k_stack)).to_python()
def dos ( TightBinding TB, int nkpts, int neps):
""" """
a = dos_c(deref(TB._c), nkpts, neps)
return (a.first.to_python(), a.second.to_python())
def dos_patch ( TightBinding TB, triangles, int neps, int ndiv):
""" """
a = dos_patch_c(deref(TB._c), array_view[double,TWO] (triangles), neps, ndiv)
return (a.first.to_python(), a.second.to_python())
def energies_on_bz_path ( TightBinding TB, K1, K2, n_pts) :
""" """
return energies_on_bz_path_c (deref(TB._c), tqa_vector[double](K1), tqa_vector[double] (K2), n_pts).to_python()
def energy_matrix_on_bz_path ( TightBinding TB, K1, K2, n_pts) :
""" """
return energy_matrix_on_bz_path_c (deref(TB._c), tqa_vector[double](K1), tqa_vector[double] (K2), n_pts).to_python()
def energies_on_bz_grid ( TightBinding TB, n_pts) :
""" """
return energies_on_bz_grid_c (deref(TB._c), n_pts).to_python()