Actual source code: pmap.c

      1: #define PETSCVEC_DLL
      2: /*
      3:    This file contains routines for basic map object implementation.
      4: */

     6:  #include vecimpl.h

     10: PetscErrorCode PetscMapDestroy_MPI(PetscMap m)
     11: {
     13:   return(0);
     14: }

     16: static struct _PetscMapOps DvOps = {
     17:   PETSC_NULL,
     18:   PetscMapDestroy_MPI,
     19: };

     24: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapCreate_MPI(PetscMap m)
     25: {
     26:   PetscMPIInt    rank,size;
     27:   PetscInt       p;

     31:   PetscMemcpy(m->ops, &DvOps, sizeof(DvOps));

     33:   MPI_Comm_size(m->comm, &size);
     34:   MPI_Comm_rank(m->comm, &rank);
     35:   PetscSplitOwnership(m->comm,&m->n,&m->N);
     36:   PetscMalloc((size+1)*sizeof(PetscInt), &m->range);
     37:   MPI_Allgather(&m->n, 1, MPIU_INT, m->range+1, 1, MPIU_INT, m->comm);

     39:   m->range[0] = 0;
     40:   for(p = 2; p <= size; p++) {
     41:     m->range[p] += m->range[p-1];
     42:   }

     44:   m->rstart = m->range[rank];
     45:   m->rend   = m->range[rank+1];
     46:   return(0);
     47: }

     52: /*@C
     53:    PetscMapCreateMPI - Creates a map object.

     55:    Collective on MPI_Comm
     56:
     57:    Input Parameters:
     58: +  comm - the MPI communicator to use
     59: .  n - local vector length (or PETSC_DECIDE to have calculated if N is given)
     60: -  N - global vector length (or PETSC_DECIDE to have calculated if n is given)

     62:    Output Parameter:
     63: .  mm - the map object

     65:    Suggested by:
     66:    Robert Clay and Alan Williams, developers of ISIS++, Sandia National Laboratories.

     68:    Level: developer

     70:    Concepts: maps^creating

     72: .seealso: PetscMapDestroy(), PetscMapGetLocalSize(), PetscMapGetSize(), PetscMapGetGlobalRange(),
     73:           PetscMapGetLocalRange()

     75: @*/
     76: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapCreateMPI(MPI_Comm comm,PetscInt n,PetscInt N,PetscMap *m)
     77: {

     81:   PetscMapCreate(comm, m);
     82:   PetscMapSetLocalSize(*m, n);
     83:   PetscMapSetSize(*m, N);
     84:   PetscMapSetType(*m, MAP_MPI);
     85:   return(0);
     86: }