### How to get local matrices of each cell of a mesh ?

374
views
0
13 months ago by
How to get local matrices of each cell of a mesh ?

Say I have :
mesh = UnitSquareMesh(8, 8)
V = FunctionSpace(mesh, 'P', 1)
u = TrialFunction(V)
v = TestFunction(V)

How to get the submatrix (extracted from a) that corresponds to each cell of the mesh:
for cell in cells(mesh):
aLoc = a[cell.getdof(), cell.getdof()] # How to grab what's associated to each cell ?

Franck
Community: FEniCS Project

5
13 months ago by

I'm brand new at this, but does assemble_local work?

mesh = UnitSquareMesh(8, 8)

V = FunctionSpace(mesh, 'P', 1)
u = TrialFunction(V)
v = TestFunction(V)

for cell in cells(mesh):
aLoc = assemble_local(a, cell)


See https://fenicsproject.org/olddocs/dolfin/2016.2.0/python/programmers-reference/fem/assembling_local/assemble_local.html

Andy

Still need to check... But I would say yes !
written 13 months ago by FH
It depends what you really want to get.
A = assemble(a)
dofmap = V.dofmap()

for cell in cells(mesh):
dofs = dofmap.cell_dofs(cell.index())
aLoc = A.array()[dofs, :][:, dofs]​

first assembles the form and then extracts the rows/columns for the dofs corresponding to the cell.

assemble_local(a, cell)

assembles the form only on the particular cell. For example, for

mesh = UnitSquareMesh(8, 8)

you will get 128 same tensors.

Nevertheless, the form is always assembled in one way or another.

written 13 months ago by Adam Janecka
I believe this is it: first, I need "neumann" matrices (the ones of each element without boundary conditions - they are all the same as all elements are triangles: I must use assemble_local for that), then I need the "dirichlet" matrices (the ones of each element with boundary conditions - they will not be the same: I must use dofmap.cell_dofs for that). At least, that's what I understand so far.
written 13 months ago by FH
1
13 months ago by
mesh = UnitSquareMesh(8, 8)

V = FunctionSpace(mesh, 'P', 1)
u = TrialFunction(V)
v = TestFunction(V)

A = assemble(a)

dofmap = V.dofmap()

for cell in cells(mesh):
dofs = dofmap.cell_dofs(cell.index())
aLoc = A.array()[dofs, :][:, dofs]

Does this work for you?

0
13 months ago by
Does only half the job !

Your solution is working great after a has been assembled into A: that's the half of my initial need. Thanks for that !

Now still stuck with the other half of the question: same problem for local unassembled matrices (that is before assembly).
I tried this:
aLoc = a[dofs, :][:, dofs]
TypeError: 'Form' object has no attribute '__getitem__'
and this:
aLoc = a.array()[dofs, :][:, dofs]
AttributeError: 'Form' object has no attribute 'array'
... Without success

How to get local matrices of each cell of a mesh before assembly ?

Franck