Comparing between a PETSc matrix and a standard fortran array in compressed row format

Ben Tay zonexo at gmail.com
Sat Aug 4 03:30:10 CDT 2007


Hi,

After using MatAXPY, I used MatGetRowMaxAbs, VecAb and VecMax to get the 
row with max value, get the absolute of that value and print out the 
location/value. I managed to find some minor mistakes and corrected them 
so that the 2 matrix are identical. Unfortunately, the same thing still 
happens!

I've checked for convergence and the iteration no. is 1 and 8 for direct 
solving and HYPRE's AMG respectively.  So there's no convergence 
problem. I've also tried to change to the same pc/ksp as that of NSPCG, 
which is jacobi presconditioning + KSPBCGS but the same thing happens.

Any idea what's happening?

Thanks

Barry Smith wrote:
>   Unless the matrix values are huge then this is a big difference. 
> All you can do is print the difference matrix with ASCII MatView and
> look for large entries. This will tell you the locations of the 
> trouble entries.
>
>    Barry
>
>
> On Sat, 4 Aug 2007, Ben Tay wrote:
>
>   
>> Hi,
>>
>> I realised that the matrix storage format of NSPCG is actually ITPACK storage
>> format. Anyway, I tried to insert the values into a PETSc matrix, use MatAXPY
>> with the scalar a = -1 and then use MatNorm on the output matrix.
>>
>> Using NORM_1, NORM_FROBENIUS and NORM_INFINITY
>> <../Vec/NORM_FROBENIUS.html#NORM_FROBENIUS>, I got ~543, 3194 and 556
>> respectively. Does this mean that the matrix are different? How "much"
>> different does that means?
>>
>> So what is the next step? Is there anyway to find out the location of the
>> value which is different?
>>
>> This is my comparison subroutine:
>>
>> subroutine matrix_compare
>>
>>    !compare big_A & PETSc matrix
>>
>>    integer :: k,kk,II,JJ,ierr
>>
>>    Vec    xx_test,b_rhs_test
>>      Mat    A_mat_test
>>
>>    PetscScalar aa
>>
>>    PetscReal nrm
>>
>>    aa=-1.
>>
>>    call
>> MatCreateSeqAIJ(PETSC_COMM_SELF,total_k,total_k,10,PETSC_NULL_INTEGER,A_mat_test,ierr)
>>
>>    call VecCreateSeq(PETSC_COMM_SELF,total_k,b_rhs_test,ierr)
>>
>>    call VecDuplicate(b_rhs_test,xx_test,ierr)
>>
>>    call VecAssemblyBegin(b_rhs_test,ierr)
>>
>>    call VecAssemblyEnd(b_rhs_test,ierr)
>>
>>    call VecAssemblyBegin(xx_test,ierr)
>>
>>    call VecAssemblyEnd(xx_test,ierr)
>>
>>        do k=1,total_k
>>          do kk=1,10
>>
>>            II=k-1
>>
>>            JJ=int_A(k,kk)-1
>>                  call
>> MatSetValues(A_mat_test,1,II,1,JJ,big_A(k,kk),INSERT_VALUES,ierr)       
>>            call VecSetValue(b_rhs_test,II,q_p(k),INSERT_VALUES,ierr)
>>              end do
>>
>>    end do
>>
>> !    call MatCopy(A_mat,A_mat_test,DIFFERENT_NONZERO_PATTERN ,ierr)
>>
>>    call MatAssemblyBegin(A_mat_test,MAT_FINAL_ASSEMBLY,ierr)
>>        call MatAssemblyEnd(A_mat_test,MAT_FINAL_ASSEMBLY,ierr)
>>
>>    call MatAXPY(A_mat_test,aa,A_mat,SAME_NONZERO_PATTERN,ierr)
>>
>>    call MatNorm(A_mat_test,NORM_INFINITY,nrm,ierr)
>>
>>    print *, nrm
>>
>>    end subroutine matrix_compare
>>
>> Thanks!
>>
>>
>>
>> Barry Smith wrote:
>>     
>>>   You can use MatCreateSeqAIJWithArrays() to "convert" the NSPCG matrix into
>>> PETSc format and then MatAXPY() to difference them and then MatNorm() to see
>>> how large the result is. 
>>>   Make sure the PETSc or hypre solver is always converging. Run with
>>> -ksp_converged_reason and or -ksp_monitor. My guess is that the matrix is
>>> becoming very ill-conditioned so the solvers with the default options are
>>> failing.
>>>
>>>     Barry
>>>
>>>
>>> On Fri, 3 Aug 2007, Ben Tay wrote:
>>>
>>>   
>>>       
>>>> Hi,
>>>>
>>>> I used 2 packages to solve my poisson eqn, which is part of my NS unsteady
>>>> solver. One is the NSPCG solver package which uses the compressed row
>>>> format
>>>> to store the A matrix. The other is PETSc. I found that using both solvers
>>>> gave me similar answers for a number of time step. However, after that,
>>>> the
>>>> answer will suddenly change drastically for the PETSc case. This does not
>>>> happen for the NSPCG solver.
>>>>
>>>> For e.g. time step 1-315, oscillating airfoil case, pressure changes
>>>> smoothly,
>>>> similar answers in both cases
>>>>
>>>> at time=316, pressure changes from -3.22 to -3.2 for NSPCG, but pressure
>>>> changes from -3.21 to -60.2 for PETSc
>>>>
>>>> This happens when I use HYPRE's AMG or PETSc's direct solver LU.
>>>>
>>>> I have been trying to find out what's the cause and I can't find the
>>>> answer in
>>>> debugging. I would like to compare the values of the matrix of the 2
>>>> different
>>>> solvers and see if there's any difference. However, NSPCG's matrix is in
>>>> compressed row format while PETSc's one is just an address and it can't be
>>>> viewed easily. Moreover, it's a big matrix so it's not possible to check
>>>> by
>>>> inspection. I'm thinking of subtracting one matrix by the other and find
>>>> if
>>>> it's zero. What's the best way to solve this problem? Btw, I'm using
>>>> fortran
>>>> and there's no mpi
>>>>
>>>> Thank you.
>>>>
>>>>
>>>>
>>>>     
>>>>         
>>>   
>>>       
>>     
>
>
>   




More information about the petsc-users mailing list