from ATK.KohnSham import * from numpy import * def cross (a,b): return array([a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]]) def invertVectors (v): v1 = v[0] v2 = v[1] v3 = v[2] norm = dot(v1,cross(v2,v3)) r1 = cross(v2,v3) r2 = cross(v3,v1) r3 = cross(v1,v2) return 2.*pi*array([r1,r2,r3])/norm def primitiveVectors (lattice): V = identity(3)*1. for i in range(3): for j in range(3): V[i,j] = lattice.primitiveVectors()[i][j].inUnitsOf(Ang) return V def reciprocalVectors (bulk_config): return invertVectors(primitiveVectors(bulk_config.bravaisLattice())) def convertCartesianCoordsToLattice (bulk_config,cartesian_coordinates): import numpy from numpy.linear_algebra import inverse as matrixinverse V = numpy.transpose(reciprocalVectors(bulk_config)) return numpy.matrixmultiply( matrixinverse(V), numpy.transpose( cartesian_coordinates ) )