Ejemplo n.º 1
0
 def _make_identity(self, sh):
     "Create a higher order identity tensor to represent dv/dv."
     res = None
     if sh == ():
         # Scalar dv/dv is scalar
         return FloatValue(1.0)
     elif len(sh) == 1:
         # Vector v makes dv/dv the identity matrix
         return Identity(sh[0])
     else:
         # TODO: Add a type for this higher order identity?
         # II[i0,i1,i2,j0,j1,j2] = 1 if all((i0==j0, i1==j1, i2==j2)) else 0
         # Tensor v makes dv/dv some kind of higher rank identity tensor
         ind1 = ()
         ind2 = ()
         for d in sh:
             i, j = indices(2)
             dij = Identity(d)[i, j]
             if res is None:
                 res = dij
             else:
                 res *= dij
             ind1 += (i, )
             ind2 += (j, )
         fp = as_tensor(res, ind1 + ind2)
     return fp
Ejemplo n.º 2
0
    def facet_area(self, o):
        if self._preserve_types[o._ufl_typecode_]:
            return o

        domain = o.ufl_domain()
        tdim = domain.topological_dimension()
        if not domain.is_piecewise_linear_simplex_domain():
            # Don't lower for non-affine cells, instead leave it to
            # form compiler
            warning("Only know how to compute the facet area of an affine cell.")
            return o

        # Area of "facet" of interval (i.e. "area" of a vertex) is defined as 1.0
        if tdim == 1:
            return FloatValue(1.0)

        r = self.facet_jacobian_determinant(FacetJacobianDeterminant(domain))
        r0 = ReferenceFacetVolume(domain)
        return abs(r * r0)
Ejemplo n.º 3
0
def _simplify_abs_cellorientation(o, self, in_abs):
    if not in_abs:
        return o
    # Cell orientation is +-1
    return FloatValue(1)