Source code for espressomd.shapes

# Copyright (C) 2010-2022 The ESPResSo project
#
# This file is part of ESPResSo.
#
# ESPResSo is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ESPResSo 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import collections.abc

from .script_interface import ScriptInterfaceHelper, script_interface_register, ScriptObjectList


[docs]class Shape: _so_bind_methods = ("calc_distance", "is_inside")
[docs]@script_interface_register class Cylinder(Shape, ScriptInterfaceHelper): """ A cylinder shape. Attributes ---------- center : (3,) array_like of :obj:`float` Coordinates of the center of the cylinder. axis : (3,) array_like of :obj:`float` Axis of the cylinder. radius : :obj:`float` Radius of the cylinder. length : :obj:`float` Length of the cylinder. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. open : :obj:`bool` cylinder is open or has caps. """ _so_name = "Shapes::Cylinder"
[docs]@script_interface_register class Ellipsoid(Shape, ScriptInterfaceHelper): """ An ellipsoid. For now only ellipsoids of revolution are supported. The symmetry axis is aligned parallel to the x-direction. Attributes ---------- center : (3,) array_like of :obj:`float` Coordinates of the center of the ellipsoid. a : :obj:`float` Semiaxis along the axis of rotational symmetry. b : :obj:`float` Equatorial semiaxes. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. """ _so_name = "Shapes::Ellipsoid"
[docs]@script_interface_register class Rhomboid(Shape, ScriptInterfaceHelper): """ A parallelepiped. Attributes ---------- a : (3,) array_like of :obj:`float` First base vector. b : (3,) array_like of :obj:`float` Second base vector. c : (3,) array_like of :obj:`float` Third base vector. corner : (3,) array_like of :obj:`float` Lower left corner of the rhomboid. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. """ _so_name = "Shapes::Rhomboid"
[docs]@script_interface_register class Slitpore(Shape, ScriptInterfaceHelper): """ .. figure:: figures/slitpore.png :alt: Schematic for the Slitpore shape with labeled geometrical parameters. :align: center :height: 8.00000cm Attributes ---------- channel_width : :obj:`float` lower_smoothing_radius : :obj:`float` pore_length : :obj:`float` pore_mouth : :obj:`float` pore_width : :obj:`float` upper_smoothing_radius : :obj:`float` dividing_plane : :obj:`float` """ _so_name = "Shapes::Slitpore"
[docs]@script_interface_register class Sphere(Shape, ScriptInterfaceHelper): """ A sphere. Attributes ---------- center : (3,) array_like of :obj:`float` Center of the sphere radius : :obj:`float` Radius of the sphere. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. """ _so_name = "Shapes::Sphere"
[docs]@script_interface_register class SpheroCylinder(Shape, ScriptInterfaceHelper): """ A cylinder with hemispheres as caps. Attributes ---------- center : (3,) array_like of :obj:`float` Coordinates of the center of the cylinder. axis : (3,) array_like of :obj:`float` Axis of the cylinder. radius : :obj:`float` Radius of the cylinder. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. length : :obj:`float` Length of the cylinder (not including the caps). """ _so_name = "Shapes::SpheroCylinder"
[docs]@script_interface_register class Torus(Shape, ScriptInterfaceHelper): """ A torus shape. Attributes ---------- center : (3,) array_like of :obj:`float` Coordinates of the center of the torus. normal : (3,) array_like of :obj:`float` Normal axis of the torus. radius : :obj:`float` Radius of the torus. tube_radius : :obj:`float` Radius of the tube. direction : :obj:`int` Surface orientation, for +1 the normal points out of the mantel, for -1 it points inward. """ _so_name = "Shapes::Torus"
[docs]@script_interface_register class Wall(Shape, ScriptInterfaceHelper): """ An infinite plane. Attributes ---------- dist : :obj:`float` Distance from the origin. normal : (3,) array_like of :obj:`int` Normal vector of the plane (needs not to be length 1). """ _so_name = "Shapes::Wall"
[docs]@script_interface_register class SimplePore(Shape, ScriptInterfaceHelper): """ Two parallel infinite planes, and a cylindrical channel connecting them. The cylinder and the planes are connected by torus segments with an adjustable radius. Attributes ---------- radius: :obj:`float` The radius of the pore. length: :obj:`float` The distance between the planes. smoothing_radius: :obj:`float` Radius of the torus segments axis: (3,) array_like of :obj:`float` Axis of the cylinder and normal of the planes center: (3,) array_like of :obj:`float` Position of the center of the cylinder. """ _so_name = "Shapes::SimplePore"
[docs]@script_interface_register class HollowConicalFrustum(Shape, ScriptInterfaceHelper): """ Hollow conical frustum shape. Attributes ---------- cyl_transform_params : :class:`espressomd.math.CylindricalTransformationParameters`, Parameters of the spacial orientation of the frustum. Contained must be parameters for ``center`` and ``axis``. ``orientation`` has no effect, unless ``central_angle != 0`` r1: :obj:`float` Radius r1. r2: :obj:`float` Radius r2. length: :obj:`float` Length of the conical frustum along ``axis``. thickness: float The thickness of the frustum. Also determines the rounding radius of the edges direction: :obj:`int`, optional Surface orientation, for +1 the normal points out of the mantel, for -1 it points inside of the shape. Defaults to 1 central_angle: :obj:`float`, optional A ``central_angle`` creates an opening in the frustum along the side, centered symmetrically around the ``direction`` of ``cyl_transform_params``. Must be between ``0`` and ``2 pi``. Defaults to 0. .. image:: figures/conical_frustum.png """ _so_name = "Shapes::HollowConicalFrustum"
[docs]@script_interface_register class Union(Shape, ScriptObjectList): """A union of shapes. This shape represents a union of shapes where the distance to the union is defined by the smallest distance to any shape contained in the union. Methods ------- size() Number of shapes contained in the union. clear() Remove all shapes from the union. """ _so_name = "Shapes::Union" _so_bind_methods = Shape._so_bind_methods + ("size", "empty", "clear")
[docs] def add(self, shape): """ Add a shape to the union. Parameters ---------- shape : array_like / instance of :class:`espressomd.shapes.Shape` Shape instance(s) to be added to the union. """ def _add(self, shape): if isinstance(shape, Shape): self.call_method("add", object=shape) else: raise ValueError("Only shapes can be added.") if isinstance(shape, collections.abc.Iterable): for s in shape: _add(self, s) else: _add(self, shape)
[docs] def remove(self, shape): """ Remove a shape from the union. Parameters ---------- shape : array_like / instance of :class:`espressomd.shapes.Shape` Shape instance(s) to be removed from the union. """ def _remove(self, shape): if isinstance(shape, Shape): self.call_method("remove", object=shape) else: raise ValueError("Only shapes can be removed.") if isinstance(shape, collections.abc.Iterable): for s in shape: _remove(self, s) else: _remove(self, shape)