/*$Id: isltog.c,v 1.32 1999/10/13 20:37:00 bsmith Exp bsmith $*/ #include "sys.h" /*I "sys.h" I*/ #include "src/vec/is/isimpl.h" /*I "is.h" I*/ #undef __FUNC__ #define __FUNC__ "ISLocalToGlobalMappingView" /*@C ISLocalToGlobalMappingView - View a local to global mapping Not Collective Input Parameters: . ltog - local to global mapping . viewer - viewer Level: advanced .keywords: IS, local-to-global mapping, create .seealso: ISLocalToGlobalMappingDestroy(), ISLocalToGlobalMappingCreate() @*/ int ISLocalToGlobalMappingView(ISLocalToGlobalMapping mapping,Viewer viewer) { int i,ierr; PetscTruth isascii; PetscFunctionBegin; PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE); if (!viewer) viewer = VIEWER_STDOUT_SELF; PetscValidHeaderSpecific(viewer,VIEWER_COOKIE); PetscCheckSameComm(mapping,viewer); ierr = PetscTypeCompare((PetscObject)viewer,ASCII_VIEWER,&isascii);CHKERRQ(ierr); if (isascii) { for ( i=0; in; i++ ) { ierr = ViewerASCIISynchronizedPrintf(viewer,"%d %d\n",i,mapping->indices[i]);CHKERRQ(ierr); } ierr = ViewerFlush(viewer);CHKERRQ(ierr); } else { SETERRQ1(1,1,"Viewer type %s not supported for ISLocalToGlobalMapping",((PetscObject)viewer)->type_name); } PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "ISLocalToGlobalMappingCreateIS" /*@C ISLocalToGlobalMappingCreateIS - Creates a mapping between a local (0 to n) ordering and a global parallel ordering. Not collective Input Parameter: . is - index set containing the global numbers for each local Output Parameter: . mapping - new mapping data structure Level: advanced .keywords: IS, local-to-global mapping, create .seealso: ISLocalToGlobalMappingDestroy(), ISLocalToGlobalMappingCreate() @*/ int ISLocalToGlobalMappingCreateIS(IS is,ISLocalToGlobalMapping *mapping) { int n,*indices,ierr; MPI_Comm comm; PetscFunctionBegin; PetscValidHeaderSpecific(is,IS_COOKIE); ierr = PetscObjectGetComm((PetscObject)is,&comm);CHKERRQ(ierr); ierr = ISGetSize(is,&n);CHKERRQ(ierr); ierr = ISGetIndices(is,&indices);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingCreate(comm,n,indices,mapping);CHKERRQ(ierr); ierr = ISRestoreIndices(is,&indices);CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "ISLocalToGlobalMappingCreate" /*@C ISLocalToGlobalMappingCreate - Creates a mapping between a local (0 to n) ordering and a global parallel ordering. Not Collective Input Parameters: + comm - MPI communicator of size 1. . n - the number of local elements - indices - the global index for each local element Output Parameter: . mapping - new mapping data structure Level: advanced .keywords: IS, local-to-global mapping, create .seealso: ISLocalToGlobalMappingDestroy(), ISLocalToGlobalMappingCreateIS() @*/ int ISLocalToGlobalMappingCreate(MPI_Comm cm,int n,const int indices[],ISLocalToGlobalMapping *mapping) { int ierr; PetscFunctionBegin; PetscValidIntPointer(indices); PetscValidPointer(mapping); PetscHeaderCreate(*mapping,_p_ISLocalToGlobalMapping,int,IS_LTOGM_COOKIE,0,"ISLocalToGlobalMapping", cm,ISLocalToGlobalMappingDestroy,ISLocalToGlobalMappingView); PLogObjectCreate(*mapping); PLogObjectMemory(*mapping,sizeof(struct _p_ISLocalToGlobalMapping)+n*sizeof(int)); (*mapping)->n = n; (*mapping)->indices = (int *) PetscMalloc((n+1)*sizeof(int));CHKPTRQ((*mapping)->indices); ierr = PetscMemcpy((*mapping)->indices,indices,n*sizeof(int));CHKERRQ(ierr); /* Do not create the global to local mapping. This is only created if ISGlobalToLocalMapping() is called */ (*mapping)->globals = 0; PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "ISLocalToGlobalMappingDestroy" /*@ ISLocalToGlobalMappingDestroy - Destroys a mapping between a local (0 to n) ordering and a global parallel ordering. Note Collective Input Parameters: . mapping - mapping data structure Level: advanced .keywords: IS, local-to-global mapping, destroy .seealso: ISLocalToGlobalMappingCreate() @*/ int ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping mapping) { int ierr; PetscFunctionBegin; PetscValidPointer(mapping); if (--mapping->refct > 0) PetscFunctionReturn(0); if (mapping->refct < 0) { SETERRQ(1,1,"Mapping already destroyed"); } ierr = PetscFree(mapping->indices);CHKERRQ(ierr); if (mapping->globals) {ierr = PetscFree(mapping->globals);CHKERRQ(ierr);} PLogObjectDestroy(mapping); PetscHeaderDestroy(mapping); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "ISLocalToGlobalMappingApplyIS" /*@ ISLocalToGlobalMappingApplyIS - Creates from an IS in the local numbering a new index set using the global numbering defined in an ISLocalToGlobalMapping context. Not collective Input Parameters: + mapping - mapping between local and global numbering - is - index set in local numbering Output Parameters: . newis - index set in global numbering Level: advanced .keywords: IS, local-to-global mapping, apply .seealso: ISLocalToGlobalMappingApply(), ISLocalToGlobalMappingCreate(), ISLocalToGlobalMappingDestroy(), ISGlobalToLocalMappingApply() @*/ int ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping mapping, IS is, IS *newis) { int ierr,n,i,*idxin,*idxmap,*idxout; PetscFunctionBegin; PetscValidPointer(mapping); PetscValidHeaderSpecific(is,IS_COOKIE); PetscValidPointer(newis); ierr = ISGetSize(is,&n);CHKERRQ(ierr); ierr = ISGetIndices(is,&idxin);CHKERRQ(ierr); idxmap = mapping->indices; idxout = (int *) PetscMalloc((n+1)*sizeof(int));CHKPTRQ(idxout); for ( i=0; iindices,Nmax = mapping->n; PetscFunctionBegin; for ( i=0; i= Nmax) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,1,"Local index %d too large %d (max)",in[i],Nmax); out[i] = idx[in[i]]; } PetscFunctionReturn(0); } /* -----------------------------------------------------------------------------------------*/ #undef __FUNC__ #define __FUNC__ "ISGlobalToLocalMappingSetUp_Private" /* Creates the global fields in the ISLocalToGlobalMapping structure */ static int ISGlobalToLocalMappingSetUp_Private(ISLocalToGlobalMapping mapping) { int i,*idx = mapping->indices,n = mapping->n,end,start,*globals; PetscFunctionBegin; end = 0; start = 100000000; for ( i=0; i end) end = idx[i]; } if (start > end) {start = 0; end = -1;} mapping->globalstart = start; mapping->globalend = end; globals = mapping->globals = (int *) PetscMalloc((end-start+2)*sizeof(int));CHKPTRQ(mapping->globals); for ( i=0; iglobals) { ierr = ISGlobalToLocalMappingSetUp_Private(mapping);CHKERRQ(ierr); } globals = mapping->globals; start = mapping->globalstart; end = mapping->globalend; if (type == IS_GTOLM_MASK) { if (idxout) { for ( i=0; i end) idxout[i] = -1; else idxout[i] = globals[idx[i] - start]; } } if (nout) *nout = n; } else { if (idxout) { for ( i=0; i end) continue; tmp = globals[idx[i] - start]; if (tmp < 0) continue; idxout[nf++] = tmp; } } else { for ( i=0; i end) continue; tmp = globals[idx[i] - start]; if (tmp < 0) continue; nf++; } } if (nout) *nout = nf; } PetscFunctionReturn(0); }