[firedrake] Issues with LMA of vertical derivative on extruded meshes
Lawrence Mitchell
lawrence.mitchell at imperial.ac.uk
Mon Jan 5 11:45:58 GMT 2015
On 22 Dec 2014, at 14:15, Eike Mueller <eike.h.mueller at googlemail.com> wrote:
> Dear firedrakers,
>
> I came across a problem when doing a local matrix assembly of the weak derivative matrix from a DG space (W3) to a vertical-only HDiv space (W2_vert), i.e.:
>
> order_vertical = 0
> U2 = FiniteElement('DG',interval,0)
> V0 = FiniteElement('CG',interval,1)
> V1 = FiniteElement('DG',interval,order_vertical)
>
> W2_vert = FunctionSpace(mesh,HDiv(OuterProductElement(U2,V0)))
> W3 = FunctionSpace(mesh,OuterProductElement(U2,V1))
>
> phi = TestFunction(W3)
> psi = TrialFunction(W3)
> u = TestFunction(W2_vert)
> w = TrialFunction(W2_vert)
>
> form_D = phi*div(w)*dx
> form_DT = div(u)*psi*dx
>
> I work with an extruded mesh with one vertical layer, for details, see the attached code which exposes the issue.
>
> When I do a local matrix assembly for form_D and form_DT, I get the following entries of the LMA's (the grid has three cells, and I attach a 2x1 or 1x2 matrix representing the LMA at each cell, hence the three entries in the arrays below).
>
> *** D: W2_vert -> W3 ***
> [[-1. 1.]
> [-1. 1.]
> [ 1. -1.]]
> *** DT: W3 -> W2_vert ***
> [[-1. -1.]
> [-1. -1.]
> [ 1. 1.]]
>
> i.e. it looks fine for D, but the result is clearly wrong for DT, which should be the transpose of D. It does not even contain the same number of +1's and -1's.
> I can't really see what I'm doing wrong here. Furthermore, it does seem to work if I change set order_vertical from 0 to 1.
>
> I have to admit that I copied the code in build_lma() method from Lawrence, without trying to understand it in detail, but I thought it was sufficiently generic to deal with any UFL forms?
>
> Thanks a lot for any help, I'm lost as to what is going wrong here,
This is a side-effect of switching coffee optimisations on by default. The code to build the LMA matrix is slightly hacky. Basically it takes the kernel used to generate a local element tensor a matrix, and relies on being able to type pun to insert into a Dat of appropriate size.
When running with coffee optimisations on, the matrix assembly kernel is modified to pad the local element tensor to a multiple of the vector length (for aligned accesses).
But the code generation doesn't then do the right thing for inserting into the Dat (there needs to be a pack-unpack stage).
You can get what plausibly looks correct by turning coffee optimisations off (at least the number of 1s and -1s is correct). I note that there's no way to do this on a per assemble call.
It happens to work for order_vertical=1 because in that case the element tensor is /already/ a multiple of the vector length in size and hence does not get padded.
The right way to do this is probably to have an assemble LMA operator I suppose.
Lawrence
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mailman.ic.ac.uk/pipermail/firedrake/attachments/20150105/9c524b22/attachment.sig>
More information about the firedrake
mailing list