[petsc-users] Parallel assembly FEM matrix
Nestor Cerpa
ncerpagi at umn.edu
Tue Jun 7 00:38:26 CDT 2016
Hi Lawrence,
Thank you. Now it works!
I’ve looked at the source code for DMPlexMatSetClosure() and it uses MatSetValues() so I am wondering in which situation should we use MatSetValuesLocal() ? and how to scatter the local matrices assembled with this ?
Nestor
> On Jun 6, 2016, at 2:38 AM, Lawrence Mitchell <lawrence.mitchell at imperial.ac.uk> wrote:
>
>
>> On 6 Jun 2016, at 01:43, Nestor Cerpa <ncerpagi at umn.edu> wrote:
>>
>> Hello,
>>
>> I am learning to use Petsc in order to modify my sequential FEM code to work in parallel. First, I am trying to understand how a FEM assembly loop would work in parallel using Petsc but I run into some problems.
>>
>> I made a simple example to explain the issue :
>> - I read a simple mesh (generated by gmsh) with 4 quadrilaterls and generate the corresponding DMPlex
>> - I define a scalar field on vertices
>> - Vertices on Bottom and Top boundaries are contrained (so I have 3 unknowns)
>> - I create a DM Matrix
>> - For the purpose of my example during the assembly I define an “elementary matrix” containing only ones
>>
>> When I run the program with one process I obtain what the matrix is supposed to be :
>>
>> Mat Object: 1 MPI processes
>> type: seqaij
>> row 0: (0, 2.) (2, 2.)
>> row 1: (1, 2.) (2, 2.)
>> row 2: (0, 2.) (1, 2.) (2, 4.)
>>
>> But running with two processes gives me this :
>>
>> Mat Object: 2 MPI processes
>> type: mpiaij
>> row 0: (0, 2.) (2, 0.)
>> row 1: (1, 2.) (2, 2.)
>> row 2: (0, 0.) (1, 2.) (2, 2.)
>>
>> It seems that in the way I am doing the assembly, Process 0 is not giving the contribution of its local assembly to process 1.
>>
>>
>> For the assembly I am doing something like this (the complete example is attached) :
>>
>>
>> !*************************************
>> !--- Matrix Assembly
>> !*************************************
>>
>> call DMCreateMatrix(dm,A,ierr)
>> call DMGetLocalToGlobalMapping(dm,ltog,ierr)
>> call MatSetLocalToGlobalMapping(A,ltog,ltog,ierr);
>> call ISLocalToGlobalMappingDestroy(ltog,ierr);
>>
>>
>> do icell = !--- Loop over cells
>>
>> do ic = ! Loop over closure (somehow only vertices)
>> ipoin = closure((ic-1)*2+1)
>> call DMPlexGetPointLocal(dm,ipoin,pStart,pEnd,ierr)
>> !
>> ! Something to get location of point data in a local Vec
>> !
>> enddo
>>
>> elstf(:,:) = 1.0
>>
>> do i = !Loop over rows corresponding to dofs which are not constrained
>> call MatSetValuesLocal(A,1,local_ldof(i)-1,ndof*nodes,local_ldof(:)-1, elstf(i,:),ADD_VALUES,ierr)
>> enddo
>>
>> enddo
>>
>> call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
>> call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
>>
>> !*************************************
>> !--- End Assembly
>> !*************************************
>>
>>
>>
>> There is something I am definitely missing because I don’t understand why it does not work. I was thinking maybe I need a function like DMLocallToGlobal…() but for matrices.
>
>
> You can either do this "by hand" using DMPlexGetTransitiveClosure to get the points. Or else you use DMPlexMatSetClosure to scatter the element matrix to the appropriate points in the matrix.
>
> Note there is also a matching DMPlexVecSetClosure to set values in the residual vector, and DMPlexVecGetClosure to get the values in the closure of a point.
>
> So in pseudo-code you'd probably do:
>
> for c in cells:
> DMPlexVecGetClosure(dm, NULL, coeff, c, &csize, &values)
> ! build element matrix (using values)
> ...
> DMPlexVecRestoreClosure(dm, NULL, coeff, c, &size, &values)
> DMPlexMatSetClosure(dm, NULL, NULL, mat, c, element_matrix, ADD_VALUES)
>
> Cheers,
>
> Lawrence
>
---------------------------------------------------
---------------------------------------------------
Nestor Cerpa Gilvonio
Postdoctoral research associate
Department of Earth Sciences
University of Minnesota
310 Pillsbury Drive SE
Minnepolis, MN 55455
E-mail : ncerpagi at umn.edu <mailto:cerpa003 at umn.edu>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20160607/8ac1946e/attachment.html>
More information about the petsc-users
mailing list