[petsc-users] From CSR format to MatSetValues
w_ang_temp
w_ang_temp at 163.com
Thu Jun 14 22:18:30 CDT 2012
Hello, Matt
After my careful testing, I get some findings.
Firstly, considering the approach of setting one row at a time. I change my codes
from setting one data per time to one row per time (codes attached). I find that both
of the times are almost equal and cannot be ignored . In my opinion, the latter should
take less time than the former. the codes have been proved to have the right results
and I think my testing datas are enough to show that they almost have the same time
for setting the matrix.
Secondly, as you said in a previous post('CSR Sparse Matrix Query', 2007), there
is no Fortran interface for the function 'MatCreateMPIAIJWithArrays'. I am not sure
if it is true now because the docs do not specify this and I connot compile with
it atfer a simple test. In my opinion, you prefer to do the thing of setting values from
CSR format using the way of setting values with MatSetValus for each row rather than
using MatCreateMPIAIJWithArrays. am I right?
Thanks again.
Jim
-----coding:per row(you can compare it with the first page int this post of one data per time )-----
!NROWIN,NNZIJ,values:the CSR variables of the main function
!NROWIN,NNZIJ:one-based,so get zero-based variables rowIndex,columns
do 10,II=Istart+1,Iend
!no-zero numbers of this row
rowNum=NROWIN(II+1)-NROWIN(II)
allocate(nColPerRow(rowNum))
allocate(valuePerRow(rowNum))
kValStart=NROWIN(II)+1-1
kValEnd=NROWIN(II)+rowNum-1
!column index
nColPerRow=NNZIJ(kValStart:kValEnd)-1
valuePerRow=values(kValStart:kValEnd)
nRow=II-1
call MatSetValues(A,ione,nRow,rowNum,nColPerRow,valuePerRow,
& INSERT_VALUES,ierr)
deallocate(nColPerRow)
deallocate(valuePerRow)
10 continue
---------------------coding-----------------------------
>在 2012-06-10 20:49:13,"Matthew Knepley" <knepley at gmail.com> 写道:
>On Sun, Jun 10, 2012 at 4:48 PM, w_ang_temp <w_ang_temp at 163.com> wrote:
>Hello, Barry
> I try to use MatCreateSeqAIJWithArrays to deal with my problem. Since
>there is no example in the doc, I find some examples in the web and use it.
>And I get some errors.
> When the processor is 1(mpiexec -n 1 ./ex4f), the results are ok. While
>it is more than one, I get the errors. So I think I miss some piece of
>information about MatCreateSeqAIJWithArrays.
>1) Check the error codes. Always!
> Thanks.
> Jim
>----------------------------code-------------------------------------------
> call MatCreate(PETSC_COMM_WORLD,A,ierr)
> call MatSetType(A,MATAIJ,ierr)
> call MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,m,n,ierr)
> call MatSetFromOptions(A,ierr)
> call MatGetOwnershipRange(A,Istart,Iend,ierr)
> !NROWIN,NNZIJ,values:the CSR variables of the main function
> !NROWIN,NNZIJ:one-based,so get zero-based variables rowIndex,columns
> allocate(rowIndex(JFLNG+1))
> allocate(columns(MAXNNZ))
> rowIndex=NROWIN-1
> columns=NNZIJ-1
> call MatCreateSeqAIJWithArrays(MPI_COMM_WORLD,m,n,rowIndex,columns,
> & values,A, ierr)
>2) This can only be called in serial. In parallel, you need MatCreateMPIAIJWithArrays()
>3) I still believe you are really doing the wrong thing. The right solution is to set one row at
> a time. I will bet dollars to doughnuts that the assembly time is not noticeable in your program.
> Matt
> call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
> call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
>----------------------------code-------------------------------------------
>----------------------------Error Message----------------------------------
>.........
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120615/02916658/attachment-0001.html>
More information about the petsc-users
mailing list