[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Global to Local Vector Mapping




Tim,

    Sorry for the delay. You will need to call VecGetOwnershipRanges().

Unfortunately it does not exist in either C or Fortran. I have put it into petsc-dev.
You can add the following line to include/petscvec.h
EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetOwnershipRanges(Vec,const PetscInt *[]);
add the following lines in src/vec/vec/interface/vector.c
#undef __FUNCT__
#define __FUNCT__ "VecGetOwnershipRanges"
/*@C
VecGetOwnershipRanges - Returns the range of indices owned by EACH processor,
assuming that the vectors are laid out with the
first n1 elements on the first processor, next n2 elements on the
second, etc. For certain parallel layouts this range may not be
well defined.


   Not Collective

   Input Parameter:
.  x - the vector

Output Parameters:
. range - array of length size+1 with the start and end+1 for each process


   Note:
   The high argument is one more than the last element stored locally.

   Fortran: You must PASS in an array of length size+1

   Level: beginner

   Concepts: ownership^of vectors
   Concepts: vector^ownership of elements

.seealso: MatGetOwnershipRange(), MatGetOwnershipRanges(), VecGetOwnershipRange()
@*/
PetscErrorCode PETSCVEC_DLLEXPORT VecGetOwnershipRanges(Vec x,const PetscInt *ranges[])
{
PetscErrorCode ierr;


  PetscFunctionBegin;
  PetscValidHeaderSpecific(x,VEC_COOKIE,1);
  PetscValidType(x,1);
  ierr = PetscMapGetGlobalRange(&x->map,ranges);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}

Run make in that directory, then add to src/vec/vec/interface/ftn- custom/zvectorf.c
#if defined(PETSC_HAVE_FORTRAN_CAPS)
#define vecgetownershipranges_ VECGETOWNERSHIPRANGES
#elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
#define vecgetownershipranges_ vecgetownershipranges
#endif


void PETSC_STDCALL vecgetownershipranges_(Vec *x,PetscInt *range,PetscErrorCode *ierr)
{
PetscMPIInt size;
const PetscInt *r;


  *ierr = MPI_Comm_size((*x)->map.comm,&size);if (*ierr) return;
  *ierr = VecGetOwnershipRanges(*x,&r);if (*ierr) return;
  *ierr = PetscMemcpy(range,r,(size+1)*sizeof(PetscInt));
}
and again run make in that directory.

   Let us know if any problems come up,

   Barry


On Dec 3, 2007, at 12:23 PM, Tim Stitt wrote:

I have a problem Matthew...this is a Fortran code..which I don't think this routine is compatible with. Is there any other way?

Matthew Knepley wrote:
On Dec 3, 2007 11:49 AM, Tim Stitt <timothy.stitt@xxxxxxxx> wrote:

Hi all,

Is there a quick way to map a global index for a parallel vector to a
local mapping tuple (p,i) were 'p' represents the process containing the
value and 'i' is the local index number on that process?



PetscMapGetGlobalRange(&v->map,const &range); for(p = 0; p < numProcs; ++p) if (range[p+1] > globalInd) break; localInd = globalInd - range[p];

  Matt


As always, thanks in advance for any information provided.

Tim.

--
Dr. Timothy Stitt <timothy_dot_stitt_at_ichec.ie>
HPC Application Consultant - ICHEC (www.ichec.ie)

Dublin Institute for Advanced Studies
5 Merrion Square - Dublin 2 - Ireland

+353-1-6621333 (tel) / +353-1-6621477 (fax)









--
Dr. Timothy Stitt <timothy_dot_stitt_at_ichec.ie>
HPC Application Consultant - ICHEC (www.ichec.ie)

Dublin Institute for Advanced Studies
5 Merrion Square - Dublin 2 - Ireland

+353-1-6621333 (tel) / +353-1-6621477 (fax)