← Back to team overview

dolfin team mailing list archive

Re: DofMapSet design

 



kent-and@xxxxxxxxx wrote:
It would be useful to lay out a plan for tackling DofMaps. Getting this
right is the key to parallel assembly, assembly optimisations and
applying Dirichlet boundary conditions by eliminating Dirichlet dofs
from the global system.


I think I will look at the Dirichlet conditions in a little while, since I
like symmetric matrices. I think I will enforce the bc at element level so
the assemble function
will need to take in bc.
A = assemble(form, mesh, bc)
or for systems
A = assemble([form00, form01, form10, form11], mesh, [bc0, bc1])
or something similar.


Some linear algebra packages only assemble terms with a positive index in the dof map, and ignore negative integers. I'm pretty sure that PETSc does this. A good start would be to use minus signs in the dof map for dofs with Dirichlet bcs.

Garth



The element-level-wise elimination should be easy enough
to extend to parallel systems.


Kent


I'm happy to take a look, but I'll need some time because I've lost my
overview of DofMaps. If someone else is already on top of it, I'd be
happy to provide feedback.

Garth


Anders Logg wrote:
On Mon, Jun 16, 2008 at 10:45:18PM +0200, Martin Sandve Alnæs wrote:
2008/6/16 Anders Logg <logg@xxxxxxxxx>:
On Mon, Jun 16, 2008 at 10:10:32PM +0200, Martin Sandve Alnæs wrote:
2008/6/16 Anders Logg <logg@xxxxxxxxx>:
On Mon, Jun 16, 2008 at 09:46:23PM +0200, Martin Sandve Alnæs wrote:
2008/6/16 Anders Logg <logg@xxxxxxxxx>:
On Mon, Jun 16, 2008 at 07:06:20PM +0200, Martin Sandve Alnæs
wrote:
I think DofMapSet should be independent of the form it was
initialized with.
I believe the sharing of a single set of dofmaps among different
forms is one
of the key tasks of this class, and that the vector with form
argument dofmaps
should rather be obtained on demand:
Agree.

  // Get vector of dofmaps (possibly not unique) for each
argument of form
  dofmapvector = dofmapset.getDofMaps(form);
What does this function do?
Gets a vector<DofMap*> with length equal to form.rank() +
form.num_coefficients(),
where each DofMap* is the same if the signature is the same.
In other words, constructs and returns what is currently a member:

    // Array of dof maps for current form
    std::vector<DofMap*> dof_map_set;

but on the fly for a given form such that DofMapSet isn't
associated with any particular form.
ok, now I understand what you mean. But I would suggest

 DofMap& dof_map = dofmapset.extractDofMap(form, i);
Agree, that was the second function I suggested.
ok.

Or are we going to pass around Arrays of DofMaps?
It was just a convenience function to replace the existing
functionality, but this functionality should probably rather
be in UFC or something.
DofMapSet? Perhaps, but that would mean putting *functionality* into
UFC which we haven't done so far (except the Python boilerplate).
I'm just guessing here, I imagine the vector of dofmaps for a form
is only used in the context of assembly, and then they can be
picked out together with other data in UFC. You or Garth put
this vector<DofMap*> in DofMapSet in the first place, feel free
to decide where to have it :)
It's also used in assemble.py for things like initializing Functions,
but I think this can be greatly enhanced once the DofMapSet is not
tied to a particular form.



------------------------------------------------------------------------

_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev

_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev





References