Exemple #1
0
    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