[petsc-users] Distributing already assembled stiffness matrix

Jaganathan, Srikrishna srikrishna.jaganathan at fau.de
Thu Oct 19 09:52:31 CDT 2017

Thanks a lot for your detailed reply, it was very slow to insert values 
using MatSetValues , I guess its due to lack of preallocation. I still 
couldn't figure out how to calculate the parameters required to 
preallocate MatMPIAIJ. So I have the nnz array for serial preallocation 
and this is accurate. So is there any rule of thumb to arrive at decent 
numbers for d_nnz and o_nnz from nnz array ?

On 2017-10-19 14:41, Mark Adams wrote:
> On Wed, Oct 18, 2017 at 8:18 AM, Jaganathan, Srikrishna <
> srikrishna.jaganathan at fau.de> wrote:
>> Thanks for your response, its helpful.
>> I do have few more questions, most of my matrices are of compressed 
>> row
>> storage format.
>> 1)So when I was creating sequentially , I just used
>> MatCreateSeqAIJWithArrays , but the same for MPI version is quite 
>> confusing
>> to use. I don't understand how to decide on the local rows(it would be
>> really helpful if there is an example) .
> You don't use local row indices (you but you don't want to). The code 
> does
> not change. As Jed says don't use MatCreateSeqAIJWithArrays. Just use
> MatCreate. This is from ksp ex56.c:
>     /* create stiffness matrix */
>     ierr = MatCreate(comm,&Amat);CHKERRQ(ierr);
>     ierr = MatSetSizes(Amat,m,m,M,M);CHKERRQ(ierr);
>     if (!test_late_bs) {
>       ierr = MatSetBlockSize(Amat,3);CHKERRQ(ierr);
>     }
>     ierr = MatSetType(Amat,MATAIJ);CHKERRQ(ierr);
>     ierr = MatSeqAIJSetPreallocation(Amat,0,d_nnz);CHKERRQ(ierr);
>     ierr = 
> MatMPIAIJSetPreallocation(Amat,0,d_nnz,0,o_nnz);CHKERRQ(ierr);
> You can preallocate with an estimate (upper bound). See the 
> documentation
> for  MatMPIAIJSetPreallocation (Google it).
> You then run your code on one processor and PETSc will distribute it.  
> Now
> you just add values with (i,j,value) with MatSetValues (Google it). You
> will find that it is very simple.
> Now, this simple way will just chop your domain up in a dumb way. If 
> you
> have a regular grid then you will get a 1D partitioning, which will 
> work
> for a while. Otherwise you can partition this matrix. Bat that is 
> another
> story. You want to start with this simple way anyway.
>> 2)When I also tried using MatSetValues it doesn't seem to use the same
>> indexing as compressed row storage format.What type of indexing should 
>> be
>> used when MatSetValues are used and called from rank 0 for CRS 
>> Matrices?
>> On 2017-10-18 13:33, Jed Brown wrote:
>>> Easiest is to assemble into a distributed matrix from rank 0.  So
>>> instead of calling MatCreate using PETSC_COMM_SELF, use a parallel
>>> communicator (like PETSC_COMM_WORLD).  It is fine if only rank 0 
>>> calls
>>> MatSetValues, but all processes must call MatAssemblyBegin/End.
>>> "Jaganathan, Srikrishna" <srikrishna.jaganathan at fau.de> writes:
>>> Hello,
>>>> I have been trying to distribute a already existing stiffness matrix 
>>>> in
>>>> my FEM code to petsc parallel matrix object , but I am unable to 
>>>> find
>>>> any documentation regarding it. It was quite straightforward to 
>>>> create a
>>>> sequential petsc matrix object and everything was working as 
>>>> intended.I
>>>> have read some of the user comments in the mailing lists regarding
>>>> similar situation and most of the times the solution suggested is to
>>>> create stiffness matrix from the the mesh in distributed format. 
>>>> Since
>>>> its a little difficult in my case to pass the mesh data in the code 
>>>> , is
>>>> there anyway to distribute already existing stiffness matrix ?
>>>> Thanks and Regards
>>>> Srikrishna Jaganathan

More information about the petsc-users mailing list