Preallocation for external direct solvers

Paul T. Bauman pbauman at ices.utexas.edu
Sat Apr 14 17:01:58 CDT 2007


Barry Smith wrote:
>    Paul,
>
>     This is a bug in how MatSetFromOptions() changes the type. You can
> use instead 
>    MatConvert(J,MATAIJMUMPS,MAT_REUSE_MATRIX,J,ierr)
> for now and I will investigate how the bug can be fixed.
>
>   Another, maybe better alternative is to use
>   MatCreate(comm,J,ierr)
>   MatSetSizes(J,....)
>   MatSetFromOptions(J,ierr)
>   MatSeqAIJSetPreallocation(....)
>   MatMPIAIJSetPreallocation(...)
>   
This option worked well.  Thank you very much.

Paul

>   Sorry and thanks for reporting the problem,
>
>    Barry
>
>   The bug is that MatSetType() does not know that AIJMUMPS is inherited from
> AIJ and hence destroys the AIJ data structure (including the preallocation 
> information) before creating a whole new AIJMUMPS matrix.
>
> On Sat, 14 Apr 2007, Paul T. Bauman wrote:
>
>   
>> Hello,
>>
>> I'm developing some code and am using direct solvers (for the moment), in
>> particular MUMPS and SuperLU. I noticed that PETSc is not preallocating the
>> memory for it even though I specify maximum number of entries per row.
>>
>>       call MatCreateSeqAIJ(PETSC_COMM_WORLD,total_num_dofs,total_num_dofs, &
>>            max_number_nonzeros_row,PETSC_NULL_INTEGER, J ,ierr)
>>
>>       call MatSetFromOptions(J,ierr)
>>
>>       call SNESSetJacobian(snes,J,J,FormJacobian,PETSC_NULL_OBJECT,ierr)
>>
>> When I print -info:
>>
>> [0] User provided function(): (Fortran):PETSc successfully started: procs 1
>> [0] User provided function(): Running on machine: dhcp-67-30.ices.utexas.edu
>> [0] PetscCommDuplicate(): Duplicating a communicator 1140850688 -2080374784
>> max tags = 2147483647
>> [0] PetscCommDuplicate(): Using internal PETSc communicator 1140850688
>> -2080374784
>> [0] PetscCommDuplicate(): Using internal PETSc communicator 1140850688
>> -2080374784
>> [0] PetscCommDuplicate(): Using internal PETSc communicator 1140850688
>> -2080374784
>> [0] PetscCommDuplicate(): Using internal PETSc communicator 1140850688
>> -2080374784
>> [0] MatConvert_AIJ_AIJMUMPS(): Using MUMPS for LU factorization and solves.
>> [0] PetscCommDuplicate(): Using internal PETSc communicator 1140850688
>> -2080374784
>>  0 SNES Function norm 8.500000000000e-01
>> [0] MatSetUpPreallocation(): Warning not preallocating matrix storage
>>
>> So, of course, this really slows down the code for even small problems (20000
>> dof).  Same story for SuperLU. Should I use a different call to do the
>> preallocation?
>>
>> Thanks for any suggestions.
>>
>> Best,
>>
>> Paul
>>
>>
>>     




More information about the petsc-users mailing list