Hi,

Is there an easy way to gather all values of an IS across all processes in a 
communicator while removing duplicates?

Basically, I want to go from 
[0] Number of indices in set 2
[0] 0 1
[0] 1 2
[1] Number of indices in set 2
[1] 0 2
[1] 1 3

to
[0] Number of indices in set 3
[0] 0 1
[0] 1 2
[0] 2 3
[1] Number of indices in set 3
[1] 0 1
[1] 1 2
[1] 2 3

The way I do it right now is 
  ierr = ISGetTotalIndices(csIS,&labels);CHKERRQ(ierr);
  ierr = ISGetSize(csIS,&num_cs_global);CHKERRQ(ierr);
  ierr = PetscMalloc(num_cs_global * sizeof(PetscInt),&labels2);
  for (i = 0; i < num_cs_global; i++) {
    labels2[i] = labels[i];
  }
  ierr = PetscSortRemoveDupsInt(&num_cs_global,labels2);CHKERRQ(ierr);
  ierr = 
ISCreateGeneral(comm,num_cs_global,labels2,PETSC_COPY_VALUES,&csIS_global);CHKERRQ(ierr);
  ierr = ISRestoreTotalIndices(csIS,&labels);CHKERRQ(ierr);
  ierr = PetscFree(labels2);CHKERRQ(ierr);

but there has to be a better way (or at least one that does not involve copying 
from const PetscInt *labels to PetscInt *labels2, and then uses again 
PETSC_COPY_VALUES).


Blaise
-- 
Department of Mathematics and Center for Computation & Technology
Louisiana State University, Baton Rouge, LA 70803, USA
Tel. +1 (225) 578 1612, Fax  +1 (225) 578 4276 http://www.math.lsu.edu/~bourdin







Reply via email to