Exemple #1
0
    def _writeVtkFile(self):
        """
    Function to write out vertex and cell info along with principal axes
    computed as vectors.
    """
        from enthought.tvtk.api import tvtk

        # Set up mesh info for VTK file.
        mesh = tvtk.UnstructuredGrid(points=self.vertArray)
        mesh.set_cells(self.cellType, self.cells)

        # Add scalar fields.
        minEigenName = "min_eigenvalue"
        intEigenName = "int_eigenvalue"
        maxEigenName = "max_eigenvalue"
        mesh.cell_data.scalars = self.minEigenValue
        mesh.cell_data.scalars.name = minEigenName
        s2 = mesh.cell_data.add_array(self.intEigenValue)
        mesh.cell_data.get_array(s2).name = intEigenName
        s3 = mesh.cell_data.add_array(self.maxEigenValue)
        mesh.cell_data.get_array(s3).name = maxEigenName
        mesh.update()

        # Add vector fields and write VTK file
        minAxisName = "min_principal_axis"
        intAxisName = "int_principal_axis"
        maxAxisName = "max_principal_axis"
        mesh.cell_data.vectors = self.minPrincAxis
        mesh.cell_data.vectors.name = minAxisName
        v2 = mesh.cell_data.add_array(self.intPrincAxis)
        mesh.cell_data.get_array(v2).name = intAxisName
        v3 = mesh.cell_data.add_array(self.maxPrincAxis)
        mesh.cell_data.get_array(v3).name = maxAxisName
        mesh.update()
        w = tvtk.UnstructuredGridWriter(file_name=self.vtkOutputFile,
                                        input=mesh)
        w.write()

        return
Exemple #2
0
    def _CffPredefined(self, refStress, newStress, vtkOutputFile):
        """Function to compute CFF for predefined planes and output results to a file.
        """
        from enthought.tvtk.api import tvtk

        beta = math.atan(self.frictionCoeff) / 2.0
        sinBeta = math.sin(beta)
        cosBeta = math.cos(beta)
        sin2Beta = math.sin(2.0 * beta)
        cos2Beta = math.cos(2.0 * beta)
        sinCosBeta = sinBeta * cosBeta
        sinBetaSq = sinBeta * sinBeta
        cosBetaSq = cosBeta * cosBeta
        cff = numpy.empty((self.numStressPoints), dtype=numpy.float64)
        failDir1 = numpy.empty((self.numStressPoints, self.spaceDim),
                               dtype=numpy.float64)
        failDir2 = numpy.empty((self.numStressPoints, self.spaceDim),
                               dtype=numpy.float64)
        effFrictionCoeff = self.frictionCoeff * (1.0 - self.skemptonCoeff)
        presFac = -self.skemptonCoeff / 3.0
        vec1 = numpy.array([cosBeta, 0.0, sinBeta], dtype=numpy.float64)
        vec2 = numpy.array([cosBeta, 0.0, -sinBeta], dtype=numpy.float64)

        # Loop over stress points, compute total stress and the associated
        # principal stresses, as well as the stress difference, and then
        # compute CFF.
        for point in range(self.numStressPoints):
            totStress = newStress[point, :]
            deltaStress = newStress[point, :] - refStress[point, :]
            (totPrincStress, totPrincAxes) = self._princStress(totStress)
            # Rotate stress changes into principal axis coordinate system for
            # total stress.
            deltaStressMat = numpy.array(
                [(deltaStress[0], deltaStress[3], deltaStress[5]),
                 (deltaStress[3], deltaStress[1], deltaStress[4]),
                 (deltaStress[5], deltaStress[4], deltaStress[2])],
                dtype=numpy.float64)
            prod1 = numpy.dot(totPrincAxes, deltaStressMat)
            deltaStressRot = numpy.dot(prod1, totPrincAxes.transpose())
            s33 = deltaStressRot[0, 0] * sinBetaSq - \
                2.0 * deltaStressRot[0, 2] * sinCosBeta + \
                deltaStressRot[2, 2] * cosBetaSq
            s13 = 0.5 * (deltaStressRot[2, 2] - deltaStressRot[0, 0]) * sin2Beta + \
                deltaStressRot[0, 2] * cos2Beta
            deltaNormStress = deltaStress[0] + deltaStress[1] + deltaStress[2]
            # Compute CFF depending on which model is used
            if self.isotropicPoroelastic:
                cff[point] = s13 + self.frictionCoeff * \
                    (s33 + presFac * deltaNormStress)
            else:
                cff[point] = s13 + effFrictionCoeff * s33

            # Get failure planes by rotating vector in principal axis coordinate
            # system into global coordinate system.
            # NOTE:  make sure I'm applying the rotation the right way.
            failDir1[point, :] = numpy.dot(totPrincAxes.transpose(), vec1)
            failDir2[point, :] = numpy.dot(totPrincAxes.transpose(), vec2)

        # Set up mesh info for VTK file
        mesh = tvtk.UnstructuredGrid(points=self.vertArray)
        mesh.set_cells(self.cellType, self.cells)

        # Add output fields and write VTK file
        # For now, output cff as a scalar, failDir1 as a vector, and failDir2 as
        # a general array.
        cffName = "cff"
        failDir1Name = "failure_plane_1"
        failDir2Name = "failure_plane_2"
        mesh.cell_data.scalars = cff
        mesh.cell_data.scalars.name = cffName
        mesh.cell_data.vectors = failDir1
        mesh.cell_data.vectors.name = failDir1Name
        mesh.cell_data.add_array(failDir2)
        w = tvtk.UnstructuredGridWriter(file_name=vtkOutputFile, input=mesh)
        w.write()

        return