← Back to team overview

dolfin team mailing list archive

Re: [FFC-dev] Mixed/Quadrature element

 

On Wed, May 07, 2008 at 11:32:21AM +0200, Kristian Oelgaard wrote:
> Quoting Jake Ostien <tostien@xxxxxxxxx>:
> 
> > Hi,
> > 
> > I am trying to define a mixed element with one part linear Lagrange 
> > elements and one part QuadratureElement.  The error message that I get 
> > tells me that I can't take derivatives of a QuadratureElement, but I 
> > don't think that I am.  Please see the attached form.  Is this something 
> > that I should be able to do?
> 
> I think that you should be able to do this. Somehow the compiler applies the
> derivative to the mixed element (which is made up of two mixed elements) where
> it should only take the derivative of the first of the mixed elements.
> 
> Printing the basisfunctions in monomialintegration.py __init_table() I get:
> 
> [((d/dXa0[0, 1, 2])vi0[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> 17, 18, 19, 20][b0[0, 1, 2]]), ((d/dXa1[0, 1, 2])vi1[0, 1, 2, 3, 4, 5, 6, 7, 8,
> 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][b0[0, 1, 2]])]
> 
> Then, when initialising the table, the compiler will ask the finite elements to
> tabulate derivatives up to order 1, but since derivatives are not defined for
> QuadratureElements it breaks. I'm not sure where the best place to fix this
> would be...

I suggest manually making sure that you only take derivatives of the
part which is not a quadrature element (by reformulating the form).

This (as everything else) will be fixed in UFL. :-)

-- 
Anders


> Kristian
> 
> > Jake
> > 
> 
> elu  = VectorElement("Lagrange", "tetrahedron", 1)
> elHp = VectorQuadratureElement("tetrahedron", 1, 9)
> 
> sgp = MixedElement([elu, elHp])
> 
> (w, V) = TestFunctions(sgp)
> (u, Hp) = TrialFunctions(sgp)
> 
> def Mat(A):
>     return [ [A[0], A[1], A[2]],    \
>              [A[3], A[4], A[5]],    \
>              [A[6], A[7], A[8]] ]
> 
> def sym(v):
>     return 0.5*(v + transp(v))
> 
> mu = 0.3
> lmbda = 10.0
> 
> def sigma(A):
>     return mult(2.0*mu,A) + mult(lmbda,mult(trace(A),Identity(3)))
> 
> 
> a = dot(grad(w), sigma(sym(grad(u))))*dx


References