Dear Larry,
let me give a quick overview of how the measure domain type corresponds to
other components in ffc,ufc,dolfin to explain why using ds is no the right
approach.

The measures in ufl have a domain type that explicitly means
dx = integral over cells
ds = integral over exterior facets (one-sided)
dS = integral over interior facets (between two cells + and -)
+ some more specialized ones, please ignore those.

Look at <ffc>/ufc/ufc.h to see that each domain type corresponds to a class
    class <domain_type>_integral
with a variant of tabulate_tensor(...) as well as a function
    ufc::form::create_<domain_type>_integral(subdomain_id)

In the dolfin assembler, there is
  one loop over cells that calls cell_integral::tabulate_tensor(...)
  one loop over exterior facets that calls
exterior_facet_integral::tabulate_tensor(...)
  one loop over interior facets that calls
interior_facet_integral::tabulate_tensor(...)
and notice that the various tabulate_tensor signatures are tailored to
match the expected data.
(Note: it would be _possible_ to generalize the tabulate_tensor signature,
but that is a significant extra task to take on, so please ignore that
route).

What you want is
1) a new assembler loop in dolfin that iterates over the edges and collects
the relevant
sets of cells and facets, similar to the interior facet assembly but a bit
more involved
2) a ufc::edge_integral class with a tabulate_tensor signature capable of
taking the
data the assembler needs to pass to generated code
3) a ufl Measure domain_type string "edge" exactly matching the
ufc::edge_integral class
(the 1-1 mapping simplifies ffc)
4) a new shortname for the measure, e.g. "dE".

If you really need 3 different variants of edge integrals, make 3 names,
e.g.:

de - arbitrary choice of one of the cell values (min cell index, for
example)
dE - average over all the adjacent cell values
dJ - sum over the jumps at all facets around the edge in the right-handed
direction (which happens to be the one I care about the most)

So that's my summary of the measure/integral/assembler design.


However I have a clarifying question for you:
Do you mean e.g.
a)  integral over edge of (avg(f) * avg(g))
or
b)  integral over edge of (avg(f * g))
and correspondingly (with jump(f) something like (f+ - f-))
A)  sum_facets [ integral over facet of jump(f)*jump(g) ]
or
B)  sum_facets [ integral over facet of jump(f*g) ]

In other words: do you mean jumps and averages of the entire integrand,
or of specific functions and test functions within the integrand?
Because those are not the same, and I think you might be trying
to put too much into the measure definition here.

Martin


On 10 August 2015 at 21:02, Martin Sandve Alnæs <marti...@simula.no> wrote:

> Don't use ds or dx. One or more new measures must be added. I'm back from
> vacation on Friday, will reply more in depth then.
> 7. aug. 2015 12.15 skrev "Garth N. Wells" <gn...@cam.ac.uk>:
>
>>
>> On 6 August 2015 at 07:49, Lizao Li <lixx1...@umn.edu> wrote:
>>
>>> Dear all,
>>>
>>> I plan to implement edge integral assembly in 3D in FEniCS.
>>>
>>
>> Nice. We have an open feature issue on this,
>> https://bitbucket.org/fenics-project/dolfin/issues/106.
>>
>>
>>> It is good for a number of things, for example assembling the canoniacl
>>> projection for 3D Nedelec edge elements. One issue is that there are more
>>> than 3 cells intersecting at an edge in 3D.
>>>
>>
>> My concern has been whether we can do edge integration efficiently
>> without clever analysis of the form. For example, if an edge integral
>> doesn't need all data from all connect  cells (and there might be a lot of
>> connected cells), will an assembler that gets all data be performant?
>>
>>
>>> At the level of UFL, my design is to add,
>>>    ds('m')     -  arbitrary choice of one of the cell values (min cell
>>> index, for example)
>>>    ds('avg')   -  average over all the adjacent cell values
>>>    ds('jump')  -  sum over the jumps at all facets around the edge in
>>> the right-handed direction (which happens to be the one I care about the
>>> most)
>>>
>>> Suggestions, hints, and pointers to a good starting point in particular
>>> are welcome~
>>>
>>>
>> I think we need something other than ds. Perhaps we need to be able to
>> pass the topological dimension to dx. Take a look in measure.py from UFL
>> for background.
>>
>> Garth
>>
>>
>>> Best regards,
>>> ​Larry
>>> --
>>> Lizao (Larry) Li
>>> Univeristy of Minnesota
>>>
>>> _______________________________________________
>>> fenics mailing list
>>> fenics@fenicsproject.org
>>> http://fenicsproject.org/mailman/listinfo/fenics
>>>
>>>
>>
>> _______________________________________________
>> fenics mailing list
>> fenics@fenicsproject.org
>> http://fenicsproject.org/mailman/listinfo/fenics
>>
>>
_______________________________________________
fenics mailing list
fenics@fenicsproject.org
http://fenicsproject.org/mailman/listinfo/fenics

Reply via email to