root / ase / io / vtkxml.py @ 19
Historique | Voir | Annoter | Télécharger (5,21 ko)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | #from Numeric import asarray as Numeric_asarray
|
3 | 1 | tkerber | |
4 | 1 | tkerber | #from ase.units import Bohr
|
5 | 1 | tkerber | #from ase.parallel import paropen
|
6 | 1 | tkerber | |
7 | 1 | tkerber | fast = False
|
8 | 1 | tkerber | |
9 | 1 | tkerber | # -------------------------------------------------------------------
|
10 | 1 | tkerber | |
11 | 1 | tkerber | from vtk import vtkStructuredPoints, vtkDoubleArray, vtkXMLImageDataWriter |
12 | 1 | tkerber | |
13 | 1 | tkerber | def write_vti(filename, atoms, data): |
14 | 1 | tkerber | |
15 | 1 | tkerber | #if isinstance(fileobj, str):
|
16 | 1 | tkerber | # fileobj = paropen(fileobj, 'w')
|
17 | 1 | tkerber | |
18 | 1 | tkerber | if isinstance(atoms, list): |
19 | 1 | tkerber | if len(atoms) > 1: |
20 | 1 | tkerber | raise ValueError('Can only write one configuration to a VTI file!') |
21 | 1 | tkerber | atoms = atoms[0]
|
22 | 1 | tkerber | |
23 | 1 | tkerber | if data is None: |
24 | 1 | tkerber | raise ValueError('VTK XML Image Data (VTI) format requires data!') |
25 | 1 | tkerber | |
26 | 1 | tkerber | data = np.asarray(data) |
27 | 1 | tkerber | |
28 | 1 | tkerber | if data.dtype == complex: |
29 | 1 | tkerber | data = np.abs(data) |
30 | 1 | tkerber | |
31 | 1 | tkerber | cell = atoms.get_cell() |
32 | 1 | tkerber | |
33 | 1 | tkerber | assert np.all(cell==np.diag(cell.diagonal())), 'Unit cell must be orthogonal' |
34 | 1 | tkerber | |
35 | 1 | tkerber | bbox = np.array(zip(np.zeros(3),cell.diagonal())).ravel() |
36 | 1 | tkerber | |
37 | 1 | tkerber | # Create a VTK grid of structured points
|
38 | 1 | tkerber | spts = vtkStructuredPoints() |
39 | 1 | tkerber | spts.SetWholeBoundingBox(bbox) |
40 | 1 | tkerber | spts.SetDimensions(data.shape) |
41 | 1 | tkerber | spts.SetSpacing(cell.diagonal() / data.shape) |
42 | 1 | tkerber | #spts.SetSpacing(paw.gd.h_c * Bohr)
|
43 | 1 | tkerber | |
44 | 1 | tkerber | #print 'paw.gd.h_c * Bohr=',paw.gd.h_c * Bohr
|
45 | 1 | tkerber | #print 'atoms.cell.diagonal() / data.shape=', cell.diagonal()/data.shape
|
46 | 1 | tkerber | #assert np.all(paw.gd.h_c * Bohr==cell.diagonal()/data.shape)
|
47 | 1 | tkerber | |
48 | 1 | tkerber | #s = paw.wfs.kpt_u[0].psit_nG[0].copy()
|
49 | 1 | tkerber | #data = paw.get_pseudo_wave_function(band=0, kpt=0, spin=0, pad=False)
|
50 | 1 | tkerber | #spts.point_data.scalars = data.swapaxes(0,2).flatten()
|
51 | 1 | tkerber | #spts.point_data.scalars.name = 'scalars'
|
52 | 1 | tkerber | |
53 | 1 | tkerber | # Allocate a VTK array of type double and copy data
|
54 | 1 | tkerber | da = vtkDoubleArray() |
55 | 1 | tkerber | da.SetName('scalars')
|
56 | 1 | tkerber | da.SetNumberOfComponents(1)
|
57 | 1 | tkerber | da.SetNumberOfTuples(np.prod(data.shape)) |
58 | 1 | tkerber | |
59 | 1 | tkerber | for i,d in enumerate(data.swapaxes(0,2).flatten()): |
60 | 1 | tkerber | da.SetTuple1(i,d) |
61 | 1 | tkerber | |
62 | 1 | tkerber | # Assign the VTK array as point data of the grid
|
63 | 1 | tkerber | spd = spts.GetPointData() # type(spd) is vtkPointData
|
64 | 1 | tkerber | spd.SetScalars(da) |
65 | 1 | tkerber | |
66 | 1 | tkerber | """
|
67 | 1 | tkerber | from vtk.util.vtkImageImportFromArray import vtkImageImportFromArray
|
68 | 1 | tkerber | iia = vtkImageImportFromArray()
|
69 | 1 | tkerber | #iia.SetArray(Numeric_asarray(data.swapaxes(0,2).flatten()))
|
70 | 1 | tkerber | iia.SetArray(Numeric_asarray(data))
|
71 | 1 | tkerber | ida = iia.GetOutput()
|
72 | 1 | tkerber | ipd = ida.GetPointData()
|
73 | 1 | tkerber | ipd.SetName('scalars')
|
74 | 1 | tkerber | spd.SetScalars(ipd.GetScalars())
|
75 | 1 | tkerber | """
|
76 | 1 | tkerber | |
77 | 1 | tkerber | # Save the ImageData dataset to a VTK XML file.
|
78 | 1 | tkerber | w = vtkXMLImageDataWriter() |
79 | 1 | tkerber | |
80 | 1 | tkerber | if fast:
|
81 | 1 | tkerber | w.SetDataModeToAppend() |
82 | 1 | tkerber | w.EncodeAppendedDataOff() |
83 | 1 | tkerber | else:
|
84 | 1 | tkerber | w.SetDataModeToAscii() |
85 | 1 | tkerber | |
86 | 1 | tkerber | w.SetFileName(filename) |
87 | 1 | tkerber | w.SetInput(spts) |
88 | 1 | tkerber | w.Write() |
89 | 1 | tkerber | |
90 | 1 | tkerber | # -------------------------------------------------------------------
|
91 | 1 | tkerber | |
92 | 1 | tkerber | from vtk import vtkStructuredGrid, vtkPoints, vtkXMLStructuredGridWriter |
93 | 1 | tkerber | |
94 | 1 | tkerber | def write_vts(filename, atoms, data=None): |
95 | 1 | tkerber | raise NotImplementedError |
96 | 1 | tkerber | |
97 | 1 | tkerber | # -------------------------------------------------------------------
|
98 | 1 | tkerber | |
99 | 1 | tkerber | from vtk import vtkUnstructuredGrid, vtkPoints, vtkXMLUnstructuredGridWriter |
100 | 1 | tkerber | |
101 | 1 | tkerber | def write_vtu(filename, atoms, data=None): |
102 | 1 | tkerber | |
103 | 1 | tkerber | #if isinstance(fileobj, str):
|
104 | 1 | tkerber | # fileobj = paropen(fileobj, 'w')
|
105 | 1 | tkerber | |
106 | 1 | tkerber | if isinstance(atoms, list): |
107 | 1 | tkerber | if len(atoms) > 1: |
108 | 1 | tkerber | raise ValueError('Can only write one configuration to a VTI file!') |
109 | 1 | tkerber | atoms = atoms[0]
|
110 | 1 | tkerber | |
111 | 1 | tkerber | """
|
112 | 1 | tkerber | if data is None:
|
113 | 1 | tkerber | raise ValueError('VTK XML Unstructured Grid (VTI) format requires data!')
|
114 | 1 | tkerber |
|
115 | 1 | tkerber | data = np.asarray(data)
|
116 | 1 | tkerber |
|
117 | 1 | tkerber | if data.dtype == complex:
|
118 | 1 | tkerber | data = np.abs(data)
|
119 | 1 | tkerber | """
|
120 | 1 | tkerber | |
121 | 1 | tkerber | cell = atoms.get_cell() |
122 | 1 | tkerber | |
123 | 1 | tkerber | assert np.all(cell==np.diag(cell.diagonal())), 'Unit cell must be orthogonal' #TODO bounding box with general unit cell?! |
124 | 1 | tkerber | |
125 | 1 | tkerber | bbox = np.array(zip(np.zeros(3),cell.diagonal())).ravel() |
126 | 1 | tkerber | |
127 | 1 | tkerber | # Create a VTK grid of structured points
|
128 | 1 | tkerber | ugd = vtkUnstructuredGrid() |
129 | 1 | tkerber | ugd.SetWholeBoundingBox(bbox) |
130 | 1 | tkerber | |
131 | 1 | tkerber | """
|
132 | 1 | tkerber | # Allocate a VTK array of type double and copy data
|
133 | 1 | tkerber | da = vtkDoubleArray()
|
134 | 1 | tkerber | da.SetName('scalars')
|
135 | 1 | tkerber | da.SetNumberOfComponents(3)
|
136 | 1 | tkerber | da.SetNumberOfTuples(len(atoms))
|
137 | 1 | tkerber |
|
138 | 1 | tkerber | for i,pos in enumerate(atoms.get_positions()):
|
139 | 1 | tkerber | da.SetTuple3(i,pos[0],pos[1],pos[2])
|
140 | 1 | tkerber | """
|
141 | 1 | tkerber | p = vtkPoints() |
142 | 1 | tkerber | p.SetNumberOfPoints(len(atoms))
|
143 | 1 | tkerber | p.SetDataTypeToDouble() |
144 | 1 | tkerber | for i,pos in enumerate(atoms.get_positions()): |
145 | 1 | tkerber | p.InsertPoint(i,pos[0],pos[1],pos[2]) |
146 | 1 | tkerber | |
147 | 1 | tkerber | |
148 | 1 | tkerber | ugd.SetPoints(p) |
149 | 1 | tkerber | |
150 | 1 | tkerber | # Assign the VTK array as point data of the grid
|
151 | 1 | tkerber | #upd = ugd.GetPointData() # type(spd) is vtkPointData
|
152 | 1 | tkerber | #upd.SetScalars(da)
|
153 | 1 | tkerber | |
154 | 1 | tkerber | |
155 | 1 | tkerber | # Save the UnstructuredGrid dataset to a VTK XML file.
|
156 | 1 | tkerber | w = vtkXMLUnstructuredGridWriter() |
157 | 1 | tkerber | |
158 | 1 | tkerber | if fast:
|
159 | 1 | tkerber | w.SetDataModeToAppend() |
160 | 1 | tkerber | w.EncodeAppendedDataOff() |
161 | 1 | tkerber | else:
|
162 | 1 | tkerber | w.GetCompressor().SetCompressionLevel(0)
|
163 | 1 | tkerber | w.SetDataModeToAscii() |
164 | 1 | tkerber | |
165 | 1 | tkerber | w.SetFileName(filename) |
166 | 1 | tkerber | w.SetInput(ugd) |
167 | 1 | tkerber | w.Write() |
168 | 1 | tkerber | |
169 | 1 | tkerber | |
170 | 1 | tkerber | # -------------------------------------------------------------------
|
171 | 1 | tkerber | |
172 | 1 | tkerber | def read_vti(filename): |
173 | 1 | tkerber | raise NotImplementedError |
174 | 1 | tkerber | |
175 | 1 | tkerber | def read_vts(filename): |
176 | 1 | tkerber | raise NotImplementedError |
177 | 1 | tkerber | |
178 | 1 | tkerber | def read_vtu(filename): |
179 | 1 | tkerber | raise NotImplementedError |
180 | 1 | tkerber | |
181 | 1 | tkerber | # -------------------------------------------------------------------
|
182 | 1 | tkerber | |
183 | 1 | tkerber | from vtk import vtkXMLFileReadTester |
184 | 1 | tkerber | |
185 | 1 | tkerber | def probe_vtkxml(filename): |
186 | 1 | tkerber | """something..."""
|
187 | 1 | tkerber | |
188 | 1 | tkerber | r = vtkXMLFileReadTester() |
189 | 1 | tkerber | r.SetFileName(filename) |
190 | 1 | tkerber | |
191 | 1 | tkerber | if r.TestReadFile():
|
192 | 1 | tkerber | return r.GetFileDataType()
|
193 | 1 | tkerber | else:
|
194 | 1 | tkerber | return None |