root / ase / io / vtkxml.py @ 14
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 |