[petsc-users] Incomplete Cholesky Factorization in petsc

Hong hzhang at mcs.anl.gov
Tue Dec 5 12:10:27 CST 2017


Wendy,

>
> Is there a function to get row/col indices and non-zeros vector of the
> factored matrix , instead of extracting the elements one by one?
>

You can look at MatSolve_SeqSBAIJ_1_NaturalOrdering() in
petsc/src/mat/impls/sbaij/seq/sbaijfact2.c

  /* solve U^T*D*y = b by forward substitution */
  ierr = PetscMemcpy(x,b,mbs*sizeof(PetscScalar));CHKERRQ(ierr);
  for (i=0; i<mbs; i++) {
    v  = aa + ai[i];
    vj = aj + ai[i];
    xi = x[i];
    nz = ai[i+1] - ai[i] - 1; /* exclude diag[i] */
    for (j=0; j<nz; j++) x[vj[j]] += v[j]* xi;
    x[i] = xi*v[nz];  /* v[nz] = aa[diag[i]] = 1/D(i) */
  }

i -- row index
vj[j] -- col index
v[j] -- matrix value

Note: the input of this routine is a matrix icc/cholesky factor.

Hong

>
> -Wendy
>
> On Tue, Dec 5, 2017 at 9:50 AM, Hong <hzhang at mcs.anl.gov> wrote:
>
>> Wendy,
>> Petsc factor matrix as
>> A = U^T * U, U: upper triangular matrix.
>> When A is stored in seqaij format, we store U as
>> /*
>>    icc() under revised new data structure.
>>    Factored arrays bj and ba are stored as
>>      U(0,:),...,U(i,:),U(n-1,:)
>>
>>    ui=fact->i is an array of size n+1, in which
>>    ui+
>>      ui[i]:  points to 1st entry of U(i,:),i=0,...,n-1
>>      ui[n]:  points to U(n-1,n-1)+1
>>
>>   udiag=fact->diag is an array of size n,in which
>>      udiag[i]: points to diagonal of U(i,:), i=0,...,n-1
>>
>>    U(i,:) contains udiag[i] as its last entry, i.e.,
>>     U(i,:) = (u[i,i+1],...,u[i,n-1],diag[i])
>> */
>>
>> see petsc/src/mat/impls/aij/seq/aijfact.c: MatICCFactorSymbolic_SeqAIJ()
>>
>> Petsc matrix factors only work for Petsc MatSolve().
>>
>> Hong
>>
>> On Tue, Dec 5, 2017 at 9:32 AM, Wenlong Gong <wenlonggong at gmail.com>
>> wrote:
>>
>>> Barry, Thank you for the reply! It makes sense If two IC() function
>>> returns slightly different factored matrix. But the IC factor matrix from
>>> PETSc is not even close to what I get from ichol in Matlab.
>>> Ultimately I need this incomplete cholesky factorization function
>>> wrapped in R once it gives correct result. Not sure if I used the easiest
>>> way to get IC so I also seek for help on getting a concise version of IC().
>>>
>>> -Wendy
>>>
>>>
>>> On Mon, Dec 4, 2017 at 10:07 PM, Smith, Barry F. <bsmith at mcs.anl.gov>
>>> wrote:
>>>
>>>>
>>>>   I'm not sure what your goal is. In general two different IC(0) codes
>>>> might produce slightly different factorizations based on implementation
>>>> details even if they claim to run the same algorithm so I don't think there
>>>> is a reason to try to compare the factors they produce.
>>>>
>>>>   In addition PETSc, as well as most IC/ILU/LU  codes store the
>>>> factored matrices in a "non-conventional" form that is optimized for
>>>> performance so it is not easy to just pull out the "factors" to look at
>>>> them or compare them.
>>>>
>>>>     Barry
>>>>
>>>>
>>>> > On Dec 4, 2017, at 9:07 PM, Wenlong Gong <wenlonggong at gmail.com>
>>>> wrote:
>>>> >
>>>> > Hello,
>>>> >
>>>> > I'm trying to use the Incomplete Cholesky Factorization for a sparse
>>>> matrix in petsc. I started with a 10*10 matrix and used ksp and pc in order
>>>> to get the ICC(0) factor, with no fill-in, natural ordering. However, the
>>>> returned factor matrix does not match with the answer I got from matlab
>>>> ichol() function.
>>>> >
>>>> > The code with the hard-coded data is attached here. I would
>>>> appreciate if anyone could help check if I did anything wrong.Please let me
>>>> know if there is easier way to get this incomplete cholesky factor. Thanks!
>>>> >
>>>> > Best regards,
>>>> > Wendy
>>>> >
>>>> > <repex.c>
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20171205/b9cab2cf/attachment.html>


More information about the petsc-users mailing list