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


195
views
0
5 months ago by
FH  
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)
a = dot(grad(u), grad(v))*dx

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

3 Answers


5
4 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)
a = dot(grad(u), grad(v))*dx

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 4 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 4 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 4 months ago by FH  
1
4 months ago by
mesh = UnitSquareMesh(8, 8)

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

a = dot(grad(u), grad(v))*dx
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
4 months ago by
FH  
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
Please login to add an answer/comment or follow this question.

Similar posts:
Search »