Beispiel #1
0
 def __init__(self, geometry, period, **kwargs):
     """Construct Periodic1DPrism instance.
     
     Keyword args:
         shift_vector: Origin of the body.
         planes_normal: Plane definitions with normal vectors and distances.
         planes_miller: Plane definitions with miller indices and distances.
     """
     # Check for plane normals not orthogonal to axis (plane cuts axis)        
     self.periodicity = period
     axis = self.periodicity.get_axis("cartesian")
     planes_normal = self.pop_planes(geometry, kwargs)
     projections = abs(np.dot(planes_normal[:,:3], axis.transpose())) 
     if np.any(projections > EPSILON):            
         error("Some plane(s) are not parallel to axis")
         
     # Determine basal planes. Shift them with a small amount to make sure
     # atoms do not stay outside due to arithmetic errors.
     axisnorm = np.linalg.norm(axis[0])
     axis0 = axis[0] / axisnorm
     basal_planes = np.array(
         [[ axis0[0], axis0[1], axis0[2], -PERIODIC_TOLERANCE ],
          [ axis0[0], axis0[1], axis0[2], axisnorm + PERIODIC_TOLERANCE ]])
     
     # Extend planes by basal planes and call base class
     planes_normal = np.vstack(( basal_planes, planes_normal ))
     kwargs["planes_normal"] = planes_normal
     kwargs["planes_normal_coordsys"] = "cartesian"
     Polyhedron.__init__(self, geometry, period, **kwargs)
    def __init__(self, geometry, period, **kwargs):
        """Construct Periodic1DPrism instance.
        
        Keyword args:
            shift_vector: Origin of the body.
            planes_normal: Plane definitions with normal vectors and distances.
            planes_miller: Plane definitions with miller indices and distances.
        """
        # Check for plane normals not orthogonal to axis (plane cuts axis)
        self.periodicity = period
        axis = self.periodicity.get_axis("cartesian")
        planes_normal = self.pop_planes(geometry, kwargs)
        projections = abs(np.dot(planes_normal[:, :3], axis.transpose()))
        if np.any(projections > EPSILON):
            error("Some plane(s) are not parallel to axis")

        # Determine basal planes. Shift them with a small amount to make sure
        # atoms do not stay outside due to arithmetic errors.
        axisnorm = np.linalg.norm(axis[0])
        axis0 = axis[0] / axisnorm
        basal_planes = np.array(
            [[axis0[0], axis0[1], axis0[2], -PERIODIC_TOLERANCE],
             [axis0[0], axis0[1], axis0[2], axisnorm + PERIODIC_TOLERANCE]])

        # Extend planes by basal planes and call base class
        planes_normal = np.vstack((basal_planes, planes_normal))
        kwargs["planes_normal"] = planes_normal
        kwargs["planes_normal_coordsys"] = "cartesian"
        Polyhedron.__init__(self, geometry, period, **kwargs)
Beispiel #3
0
 def __init__(self, geometry, period, **kwargs):
     """Construct Periodic2DPlane instance.
     
     Keyword args:
         shift_vector: Origin of the body.
         thickness: Distance between the upper and lower plane.
     """
     self.periodicity = period
     self.thickness = kwargs.get("thickness") 
     axis1, axis2 = self.periodicity.get_axis("cartesian")
     # Surface normal vector
     surfnorm = np.cross(axis1, axis2).astype(float)
     surfnorm = surfnorm / np.linalg.norm(surfnorm)
     # Normal vector of the side planes of the polyhedron, pointing inwards
     n1 = np.cross(surfnorm, axis1)
     n1 /= np.linalg.norm(n1)
     n2 = np.cross(axis2, surfnorm)
     n2 /= np.linalg.norm(n2)
     # Distances of the side planes from the origin
     d1 = np.dot(n1, axis2)
     d2 = np.dot(n2, axis1)
     # Sign of the positive distance
     s1 = np.sign(d1)
     s2 = np.sign(d2)
     # Assemble polyhedron
     kwargs["planes_normal"] = np.array(
         [[ n1[0], n1[1], n1[2], 0.0 -s1 * PERIODIC_TOLERANCE ],
          [ n1[0], n1[1], n1[2], d1 + s1 * PERIODIC_TOLERANCE ],
          [ n2[0], n2[1], n2[2], 0.0 - s2 * PERIODIC_TOLERANCE ],
          [ n2[0], n2[1], n2[2], d2 + s2 * PERIODIC_TOLERANCE ],
          [ surfnorm[0], surfnorm[1], surfnorm[2], -self.thickness / 2.0 ],
          [ surfnorm[0], surfnorm[1], surfnorm[2], self.thickness / 2.0 ]
          ])
     kwargs["planes_normal_coordsys"] = "cartesian"
     Polyhedron.__init__(self, geometry, period, **kwargs)
    def atoms_inside(self, atoms):
        """Decides which atoms are inside the body (see Body class)."""

        atoms_inside_body = Polyhedron.atoms_inside(self, atoms)
        atoms_inside_body *= self.periodicity.mask_unique(
            atoms - self.shift_vector, atoms_inside_body)
        return atoms_inside_body
Beispiel #5
0
 def atoms_inside(self, atoms):
     """Decides which atoms are inside the body (see Body class)."""
     
     atoms_inside_body = Polyhedron.atoms_inside(self, atoms)
     atoms_inside_body *= self.periodicity.mask_unique(
         atoms - self.shift_vector, atoms_inside_body)
     return atoms_inside_body
    def __init__(self, geometry, period, **kwargs):
        """Construct Periodic3DSupercell instance.
        
        Keyword args:
            shift_vector: Origin of the body.
            thickness: Distance between the upper and lower plane.
        """
        self.periodicity = period

        axis1, axis2, axis3 = self.periodicity.get_axis("cartesian")
        # Normal vector of the side planes of the polyhedron
        n12 = np.cross(axis1, axis2)
        n23 = np.cross(axis2, axis3)
        n31 = np.cross(axis3, axis1)
        n12 /= np.linalg.norm(n12)
        n23 /= np.linalg.norm(n23)
        n31 /= np.linalg.norm(n31)
        # Distances of the side planes from the origin
        d12 = np.dot(n12, axis3)
        d23 = np.dot(n23, axis1)
        d31 = np.dot(n31, axis2)
        # Sign of positive distance
        s12 = np.sign(d12)
        s23 = np.sign(d23)
        s31 = np.sign(d31)
        # Assemble polyhedron
        kwargs["planes_normal"] = np.array([
            [n12[0], n12[1], n12[2], -s12 * PERIODIC_TOLERANCE],
            [n23[0], n23[1], n23[2], -s23 * PERIODIC_TOLERANCE],
            [n31[0], n31[1], n31[2], -s31 * PERIODIC_TOLERANCE],
            [n12[0], n12[1], n12[2], d12 + s12 * PERIODIC_TOLERANCE],
            [n23[0], n23[1], n23[2], d23 + s23 * PERIODIC_TOLERANCE],
            [n31[0], n31[1], n31[2], d31 + s31 * PERIODIC_TOLERANCE],
        ])
        kwargs["planes_normal_coordsys"] = "cartesian"
        Polyhedron.__init__(self, geometry, period, **kwargs)
Beispiel #7
0
 def __init__(self, geometry, period, **kwargs):
     """Construct Periodic3DSupercell instance.
     
     Keyword args:
         shift_vector: Origin of the body.
         thickness: Distance between the upper and lower plane.
     """
     self.periodicity = period
     
     axis1, axis2, axis3 = self.periodicity.get_axis("cartesian")
     # Normal vector of the side planes of the polyhedron
     n12 = np.cross(axis1, axis2)
     n23 = np.cross(axis2, axis3)
     n31 = np.cross(axis3, axis1)
     n12 /= np.linalg.norm(n12)
     n23 /= np.linalg.norm(n23)
     n31 /= np.linalg.norm(n31)
     # Distances of the side planes from the origin
     d12 = np.dot(n12, axis3)
     d23 = np.dot(n23, axis1)
     d31 = np.dot(n31, axis2)
     # Sign of positive distance 
     s12 = np.sign(d12)
     s23 = np.sign(d23)
     s31 = np.sign(d31)
     # Assemble polyhedron
     kwargs["planes_normal"] = np.array(
         [[ n12[0], n12[1], n12[2], -s12 * PERIODIC_TOLERANCE ],
          [ n23[0], n23[1], n23[2], -s23 * PERIODIC_TOLERANCE ],
          [ n31[0], n31[1], n31[2], -s31 * PERIODIC_TOLERANCE ],
          [ n12[0], n12[1], n12[2], d12 + s12 * PERIODIC_TOLERANCE ],
          [ n23[0], n23[1], n23[2], d23 + s23 * PERIODIC_TOLERANCE ],
          [ n31[0], n31[1], n31[2], d31 + s31 * PERIODIC_TOLERANCE ],
          ])
     kwargs["planes_normal_coordsys"] = "cartesian"
     Polyhedron.__init__(self, geometry, period, **kwargs)