[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)