dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #09930
Re: Matrix concatenation
On Tue, Sep 30, 2008 at 05:03:38PM +0200, Evan Lezar wrote:
>
>
> On Tue, Sep 30, 2008 at 3:22 PM, Matthew Knepley <knepley@xxxxxxxxx> wrote:
>
> On Tue, Sep 30, 2008 at 4:46 AM, Evan Lezar <evanlezar@xxxxxxxxx> wrote:
> > On Tue, Sep 30, 2008 at 10:53 AM, Jed Brown <jed@xxxxxxxx> wrote:
> >>
> >> On Tue 2008-09-30 10:48, Evan Lezar wrote:
> >> > I was wondering what the best way is to concatenate PETSc matrices? I
> >> > am
> >> > currently using the set() method, but this takes quite a bit of time.
> >>
> >> What are you trying to do? You should probably preallocate the full
> >> matrix from the beginning.
> >
> > I am assembling a number of submatrices. And then trying to concatenate
> > them to form one large eigensystem. I do pre-allocate the matrix that I
> > want to place the entries in.
>
> I agree with Jed. The best way to do this is to assemble the full system
> matrix,
> and then if submatrices are required, you pull them out using
> MatGetSubmatrix().
>
> The only situation I can see that is different is in some algorithms
> like FETI in
> which submatrices are unassembled. Then you would have to use a MATIS
> structure, or something else depending on your algorithm.
>
> Matt
>
> > It may be that I would be able to use mixed elements to do the same
> thing.
> > I will see if I can get a code snippet together.
> >
> > Evan
> >
>
>
> I am trying to model the transverse and axial components of the electric field
> in a waveguide - using Nededec vector elements and Lagrange elements
> respectively.
>
> Consider the code snippet below that describes the matrices:
>
> ====================================
>
> vector_element = FiniteElement("Nedelec", "triangle", 1)
> nodal_element = FiniteElement("Lagrange", "triangle", 1)
>
> N_v = TestFunction(vector_element);
> N_u = TrialFunction(vector_element);
>
> L_v = TestFunction(nodal_element);
> L_u = TrialFunction(nodal_element);
>
> """ define the forms """
> a_tt = dot(curl_t(N_v), curl_t(N_u))*dx - dot(N_v, N_u)*dx
>
> b_tt = dot(N_v, N_u)*dx
> b_tz = dot(N_v, grad(L_u))*dx
> b_zt = dot(grad(L_v), N_u)*dx
>
> b_zz = dot(grad(L_v), grad(L_u))*dx - L_v*L_u*dx
>
> """ define the mesh """
> width = 22.86e-3
> height = 10.16e-3
> mesh = Rectangle(0, width, 0, height, 1, 2, 0)
> mesh.refine()
> mesh.refine()
> c = 2.99792458e8
>
> """ Assemble the sub-matrices """
>
> B_tt = PETScMatrix()
> assemble(b_tt, mesh, tensor=B_tt)
> B_tz = assemble(b_tz, mesh)
> B_zt = assemble(b_zt, mesh)
> B_zz = assemble(b_zz, mesh)
>
> A_tt = PETScMatrix()
> assemble((a_tt, mesh, tensor=A_tt)
>
> =============================
> I then need to construct the following matrices to solve an eigensystem:
>
> L = [ B_tt, B_tz ]
> [ B_zt, B_zz ]
>
> and
>
> R = [ B_tt + k*A_tt, B_tz ]
> [ B_zt, B_zz ]
>
>
>
> So, is someone knows how I can define a mixed element that achieves the same it
> would be much appreciated, or a means to concatenate the matrices effectively.
>
> Evan
Just do
vector_element = FiniteElement("Nedelec", "triangle", 1)
nodal_element = FiniteElement("Lagrange", "triangle", 1)
element = vector_element + nodal_element
(N_v, L_v) = TestFunctions(element)
(N_v, L_u) = TrialFunctions(element)
b = dot(N_v, N_u)*dx + dot(N_v, grad(L_u))*dx + dot(grad(L_v), N_u)*dx + dot(grad(L_v), grad(L_u))*dx - L_v*L_u*dx
B = assemble(B)
--
Anders
Attachment:
signature.asc
Description: Digital signature
References