Statistiques
| Révision :

root / ase / visualize / vtk / atoms.py @ 3

Historique | Voir | Annoter | Télécharger (4,62 ko)

1 1 tkerber
2 1 tkerber
import numpy as np
3 1 tkerber
4 1 tkerber
from ase import Atoms
5 1 tkerber
6 1 tkerber
from ase.visualize.vtk.sources import vtkAtomSource, vtkForceSource, \
7 1 tkerber
                                      vtkVelocitySource
8 1 tkerber
from ase.visualize.vtk.cell import vtkUnitCellModule, vtkAxesModule
9 1 tkerber
from ase.visualize.vtk.grid import vtkAtomicPositions
10 1 tkerber
from ase.visualize.vtk.module import vtkModuleAnchor, vtkGlyphModule
11 1 tkerber
12 1 tkerber
# -------------------------------------------------------------------
13 1 tkerber
14 1 tkerber
class vtkAtoms(vtkModuleAnchor, vtkAtomicPositions):
15 1 tkerber
    """Provides fundamental representation for ``Atoms``-specific data in VTK.
16 1 tkerber

17 1 tkerber
    The ``vtkAtoms`` class plots atoms during simulations, extracting the
18 1 tkerber
    relevant information from the list of atoms. It is created using
19 1 tkerber
    the list of atoms as an argument to the constructor. Then one or more
20 1 tkerber
    visualization modules can be attached using add_module(name, module).
21 1 tkerber

22 1 tkerber
    Example:
23 1 tkerber

24 1 tkerber
    >>> va = vtkAtoms(atoms)
25 1 tkerber
    >>> va.add_forces()
26 1 tkerber
    >>> va.add_axes()
27 1 tkerber
    >>> XXX va.add_to_renderer(vtk_ren)
28 1 tkerber

29 1 tkerber
    """
30 1 tkerber
    def __init__(self, atoms, scale=1):
31 1 tkerber
        """Construct a fundamental VTK-representation of atoms.
32 1 tkerber

33 1 tkerber
        atoms: Atoms object or list of Atoms objects
34 1 tkerber
            The atoms to be plotted.
35 1 tkerber

36 1 tkerber
        scale = 1: float or int
37 1 tkerber
            Relative scaling of all Atoms-specific visualization.
38 1 tkerber

39 1 tkerber
        """
40 1 tkerber
        assert isinstance(atoms, Atoms)
41 1 tkerber
        self.atoms = atoms
42 1 tkerber
43 1 tkerber
        self.scale = scale
44 1 tkerber
45 1 tkerber
        vtkModuleAnchor.__init__(self)
46 1 tkerber
        vtkAtomicPositions.__init__(self, self.atoms.get_positions(),
47 1 tkerber
                                    vtkUnitCellModule(self.atoms))
48 1 tkerber
49 1 tkerber
        self.force = None
50 1 tkerber
        self.velocity = None
51 1 tkerber
52 1 tkerber
        symbols = self.atoms.get_chemical_symbols()
53 1 tkerber
        for symbol in np.unique(symbols):
54 1 tkerber
            # Construct mask for all atoms with this symbol
55 1 tkerber
            mask = np.array(symbols) == symbol
56 1 tkerber
            if mask.all():
57 1 tkerber
                subset = None
58 1 tkerber
            else:
59 1 tkerber
                subset = np.argwhere(mask).ravel()
60 1 tkerber
61 1 tkerber
            # Get relevant VTK unstructured grid
62 1 tkerber
            vtk_ugd = self.get_unstructured_grid(subset)
63 1 tkerber
64 1 tkerber
            # Create atomic glyph source for this symbol
65 1 tkerber
            glyph_source = vtkAtomSource(symbol, self.scale)
66 1 tkerber
67 1 tkerber
            # Create glyph module and anchor it
68 1 tkerber
            self.add_module(symbol, vtkGlyphModule(vtk_ugd, glyph_source))
69 1 tkerber
70 1 tkerber
    def has_forces(self):
71 1 tkerber
        return self.force is not None
72 1 tkerber
73 1 tkerber
    def has_velocities(self):
74 1 tkerber
        return self.velocity is not None
75 1 tkerber
76 1 tkerber
    def add_cell(self):
77 1 tkerber
        """Add a box outline of the cell using atoms.get_cell(). The existing
78 1 tkerber
        ``vtkUnitCellModule`` is added to the module anchor under ``cell``."""
79 1 tkerber
        self.add_module('cell', self.cell)
80 1 tkerber
81 1 tkerber
    def add_axes(self):
82 1 tkerber
        """Add an orientation indicator for the cartesian axes. An appropriate
83 1 tkerber
        ``vtkAxesModule`` is added to the module anchor under ``axes``."""
84 1 tkerber
        self.add_module('axes', vtkAxesModule(self.cell))
85 1 tkerber
86 1 tkerber
    def add_forces(self):
87 1 tkerber
        """Add force vectors for the atoms using atoms.get_forces(). A
88 1 tkerber
        ``vtkGlyphModule`` is added to the module anchor under ``force``."""
89 1 tkerber
        if self.has_forces():
90 1 tkerber
            raise RuntimeError('Forces already present.')
91 1 tkerber
        elif self.has_velocities():
92 1 tkerber
            raise NotImplementedError('Can\'t add forces due to velocities.')
93 1 tkerber
94 1 tkerber
        # Add forces to VTK unstructured grid as vector data
95 1 tkerber
        vtk_fda = self.add_vector_property(self.atoms.get_forces(), 'force')
96 1 tkerber
97 1 tkerber
        # Calculate max norm of the forces
98 1 tkerber
        fmax = vtk_fda.GetMaxNorm()
99 1 tkerber
100 1 tkerber
        # Get relevant VTK unstructured grid
101 1 tkerber
        vtk_ugd = self.get_unstructured_grid()
102 1 tkerber
103 1 tkerber
        self.force = vtkGlyphModule(vtk_ugd, vtkForceSource(fmax, self.scale),
104 1 tkerber
                                    scalemode='vector', colormode=None)
105 1 tkerber
        self.add_module('force', self.force)
106 1 tkerber
107 1 tkerber
    def add_velocities(self):
108 1 tkerber
        """Add velocity vectors for the atoms using atoms.get_velocities(). A
109 1 tkerber
        ``vtkGlyphModule`` is added to the module anchor under ``velocity``."""
110 1 tkerber
        if self.has_velocities():
111 1 tkerber
            raise RuntimeError('Velocities already present.')
112 1 tkerber
        elif self.has_forces():
113 1 tkerber
            raise NotImplementedError('Can\'t add velocities due to forces.')
114 1 tkerber
115 1 tkerber
        # Add velocities to VTK unstructured grid as vector data
116 1 tkerber
        vtk_vda = self.add_vector_property(self.atoms.get_velocities(), 'velocity')
117 1 tkerber
118 1 tkerber
        # Calculate max norm of the velocities
119 1 tkerber
        vmax = vtk_vda.GetMaxNorm()
120 1 tkerber
121 1 tkerber
        # Get relevant VTK unstructured grid
122 1 tkerber
        vtk_ugd = self.get_unstructured_grid()
123 1 tkerber
124 1 tkerber
        self.velocity = vtkGlyphModule(vtk_ugd, vtkVelocitySource(vmax, self.scale),
125 1 tkerber
                                       scalemode='vector', colormode=None)
126 1 tkerber
        self.add_module('velocity', self.velocity)