On Dec 29, 2011, at 7:08 AM, Jed Brown wrote:
> On Thu, Dec 29, 2011 at 01:27, Rahul Praghanmor <praghanmor at gmail.com>
> wrote:
> I successfully implement PETSc to solve on a single zone unstructured mesh
> i.e. serial implementation has done and tested.
> Now I want to implement a PETSc on a multi-zone mesh.The mesh partitioning in
> multi-zone is done using a separate tool, Metis. The multi-zone mesh is read
> in solver.I don't understand how to do the global indexing for multi-zone
> mesh to form a global matrix required for PETSc.
>
> Start with a non-overlapping partition (usually what is provided by Metis).
> Distribute the mesh according to this partition, then compute the local size
> and use MPI_Scan() to compute the offset of your piece in the global
> ordering. You can learn the global index of ghosted points by sending it from
> owner to ghoster through the overlap.
You can optionally use the PetscLayout object (I've included the manual page
for PetscLayoutCreate() below since I just improved it) to avoid having to use
MPI_Scan() directly. You just set the local sizes based on your new number of
grid points per MPI process and use PetscLayoutSetUp() and then you can query
the global starting point (rstart) etc of each process using the other routines
mentioned in the manual page.
PetscLayoutCreate - Allocates PetscLayout space and sets the map contents
to the default.
Collective on MPI_Comm
Input Parameters:
+ comm - the MPI communicator
- map - pointer to the map
Level: developer
Notes: Typical calling sequence
PetscLayoutCreate(MPI_Comm,PetscLayout *);
PetscLayoutSetBlockSize(PetscLayout,1);
PetscLayoutSetSize(PetscLayout,n) or
PetscLayoutSetLocalSize(PetscLayout,N);
PetscLayoutSetUp(PetscLayout);
Optionally use any of the following:
PetscLayoutGetSize(PetscLayout,PetscInt *); or
PetscLayoutGetLocalSize(PetscLayout,PetscInt *;)
PetscLayoutGetRange(PetscLayout,PetscInt *rstart,PetscInt *rend); or
PetscLayoutGetRanges(PetscLayout,const PetscInt *range[])
PetscLayoutDestroy(PetscLayout);
The PetscLayout object and methods are intended to be used in the PETSc
Vec and Mat implementions; it is often not needed in
user codes unless you really gain something in their use.
Fortran Notes:
Not available from Fortran
.seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(),
PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout,
PetscLayoutDestroy(),
PetscLayoutGetRange(), PetscLayoutGetRanges(),
PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize(), PetscLayoutSetUp()