[petsc-users] Migrating to parallel PETSc

Bojan Niceno bojan.niceno.scientist at gmail.com
Wed Feb 16 00:30:00 CST 2022


Thanks you guys for your suggestions, I will have a look at functions you
suggested.

    Have a great day,

    Bojan

On Tue, Feb 15, 2022 at 11:29 PM Barry Smith <bsmith at petsc.dev> wrote:

>
> MatCreateMPIAIJWithArrays() and MatUpdateMPIAIJWithArrays() may be
> suitable for your use case.
>
> This should also be much more efficient in moving the matrix from your
> code to PETSc's format.
>
>   Barry
>
>
> On Feb 15, 2022, at 4:13 PM, Bojan Niceno <
> bojan.niceno.scientist at gmail.com> wrote:
>
> 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/20220216/a21fa240/attachment.html>


More information about the petsc-users mailing list