[petsc-users] Migrating to parallel PETSc

Bojan Niceno bojan.niceno.scientist at gmail.com
Tue Feb 15 15:13:14 CST 2022


Dear PETSc users,


I have an in-house computational fluid dynamics (CFD) solver, written in
Fortran 2008, parallelized with MPI with its own home-grown suite of linear
solvers.  The code is unstructured, performs domain decomposition with
METIS and all communication buffers, I mean connectivity between
processors, has been properly worked out.

A couple of weeks back, I decided to try out the PETSc suite of solvers.
After some initial setbacks, I managed to compile my code with PETSc and
have the sequential version working fine :-)

I have essentially using the following PETSc routines to get the code
solving linear systems with PETSc:

 I set up the working space as follows:

  call PetscInitialize(PETSC_NULL_CHARACTER, Pet % petsc_err)
  call MatCreateSeqAij(PETSC_COMM_SELF, ...
  call MatSeqAijSetColumnIndices(....
  call VecCreateSeq(PETSC_COMM_SELF,  ...  ! Create Vector x
  call VecCreateSeq(PETSC_COMM_SELF,  ...  ! Create Vector b
  call KSPCreate(PETSC_COMM_SELF,  ...

Then in order to solve a system, I do:

  call MatSetValue(Pet % petsc_A,   ! Inside a loop through matrix entries
                   i-PETSC_ONE,
                   k-PETSC_ONE, ...
  call MatAssemblyBegin(Pet % petsc_A, MAT_FINAL_ASSEMBLY, Pet % petsc_err)
  call MatAssemblyEnd  (Pet % petsc_A, MAT_FINAL_ASSEMBLY, Pet % petsc_err)

  call VecSetValue(Pet % petsc_x, ... ! Fill up x
  call VecSetValue(Pet % petsc_b, ... ! Fill up b

  call KSPSetType(Pet % petsc_ksp ... ! Set solver
  call KSPGetPC(Pet % petsc_ksp, ...  ! get preconditioner context
  call PCSetType(Pet % petsc_pc, ...  ! Set preconditioner

  call KSPSetFromOptions(Pet % petsc_ksp, Pet % petsc_err)

  call KSPSetUp         (Pet % petsc_ksp, Pet % petsc_err)


  ! Finally solve
  call KSPSolve(Pet % petsc_ksp, ...

Once this was up and running, I thought that in order to have the parallel
version I will merely have to replace the "Seq" versions of the above
functions, with their parallel counterparts.  I was expecting to find the
red function (MatSeqAijSetColumnIndices) for parallel runs, but it doesn't
seem to exist.  I have found non-seq versions of some other functions (
MatCreateAij, VecCreateSeq), but not something like MatAijSetColumnIndices,
which surprised me a bit, because I have this information in my code.

Is there a parallel counterpart of this function, and if there is none,
what should it be replaced with?  I understand that I will have to provide
non-zeros in buffers (o_nnz), which is not a big issue, but how to provide
information on columns for parallel version is not clear to me.  In a
nutshell, I would need a hint on which of the above functions could remain
the same in parallel, and which should be replaced and with what?

    Cheers,

    Bojan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20220215/a594c196/attachment-0001.html>


More information about the petsc-users mailing list