def getData(self, dname): """ return the data with given name dname from the VTK file. The function returns a ``Scalar``, ``Vector`` or ``Tensor`` escript Data object with the appropriate ``FunctionSpace``. """ from esys.escript import Scalar, Vector, ReducedFunction, ContinuousFunction print "searching for data set `%s`" % (dname, ) edata = None # check cell data: if edata is None: data = self.__vtkdb.GetCellData() for ia in xrange(data.GetNumberOfArrays()): if data.GetArrayName(ia) == dname: a = data.GetArray(ia) if a.GetNumberOfComponents() == 1: edata = Scalar(0., ReducedFunction(self.getDomain())) elif a.GetNumberOfComponents() == 3: edata = Vector(0., ReducedFunction(self.getDomain())) else: raise ValueError("unable to load %s components." % (a.GetNumberOfComponents(), )) print "'%s' imported as cell data with shape %s." % ( dname, str(edata.getShape())) indxmap = self.__elementidmap ndata = self.__vtkdb.GetNumberOfPoints() # check point data: if edata is None: data = self.__vtkdb.GetPointData() for ia in xrange(data.GetNumberOfArrays()): if data.GetArrayName(ia) == dname: a = data.GetArray(ia) if a.GetNumberOfComponents() == 1: edata = Scalar(0., ContinuousFunction(self.getDomain())) elif a.GetNumberOfComponents() == 3: edata = Vector(0., ContinuousFunction(self.getDomain())) else: raise ValueError("unable to load %s components." % (a.GetNumberOfComponents(), )) print "'%s' imported as point data with shape %s." % ( dname, str(edata.getShape())) indxmap = self.__nodeidmap ndata = self.__vtkdb.GetNumberOfCells() # all went wrong if edata is None: raise ValueError("unable to find data for '%s' in file %s." % (dname, self.getVTKFileName())) #edata.expand() if indxmap: if a.GetNumberOfComponents() == 1: for j in xrange(edata.getNumberOfDataPoints()): idx = edata.getFunctionSpace( ).getReferenceIDFromDataPointNo(j) if idx in indxmap: edata.setValueOfDataPoint(j, a.GetTuple1(indxmap[idx])) else: for j in xrange(edata.getNumberOfDataPoints()): idx = edata.getFunctionSpace( ).getReferenceIDFromDataPointNo(i) if idx in indxmap: edata.setValueOfDataPoint(j, a.GetTuple(indxmap[idx])) else: if a.GetNumberOfComponents() == 1: for j in xrange(min(edata.getNumberOfDataPoints(), ndata)): edata.setValueOfDataPoint(j, a.GetTuple1(j)) else: for j in xrange(min(edata.getNumberOfDataPoints(), ndata)): edata.setValueOfDataPoint(j, a.GetTuple(j)) return edata