[petsc-users] Inverse local to global mapping?

Florian Lindner mailinglists at xgm.de
Tue Feb 16 08:55:25 CST 2016


Hello,

I want to build a global vector (and matrix) from local data. The local data has a global index, which can be non-contiguous i.e. global index (0, 5, 2) is on rank 0, (1, 4, 3) is on rank 1. To keep all local data on the local part of vector I need a mapping:

Application -> PETSc
(0, 5, 2)   -> (0, 1, 2)
(1, 4, 3)   -> (3, 4, 5)

It can happen that rank 1 also need to touch vector[5] (application ordering) i.e. vector[1] (petsc ordering) on rank 0.

I can produce a mapping using index sets:

ierr = ISCreateGeneral(PETSC_COMM_WORLD, indizes.size(), indizes.data(), PETSC_COPY_VALUES, &ISlocal); CHKERRV(ierr);
ierr = ISAllGather(ISlocal, &ISglobal); CHKERRV(ierr); // Gather the IS from all processors
ierr = ISLocalToGlobalMappingCreateIS(ISglobal, &ISmapping); CHKERRV(ierr); // Make it a mapping

I construct std::vector indizes by walking though all local indizes. This way I have a mapping ISmapping that looks like that:

0 0
1 5
2 2
3 1
4 4
5 3

Now I can use that mapping: VecSetLocalToGlobalMapping(vec, mapping);

but this does not work like it should (for me). If I use VecSetValueLocal to set element 5 it gets mapped to 3, element 1 gets mapped to 5.
I want to have it reversed, accessing element 3 gets mapped to 5, element 1 to 3.

This loop:

  for (size_t i = 0; i < indizes.size(); i++) {
    ierr = VecSetValueLocal(vec, indizes[i], i*10, INSERT_VALUES); CHKERRQ(ierr);
  }

should produce a vector = [0, 10, 20, 30, 40, 50] and not [0, 50, 20, 10, 40, 30].

Are AO (application orderings) more suited for that? But afaik I can not produce a ISLocalToGlobalMapping from an AO that can be used with VecSetValueLocal, can I?

Is there a way to inverse a mapping? To produce:

0 0
1 3
2 2
3 5 
4 4
5 1


Or am I down the wrong path?

Thanks,
Florian

Example code:


#include <iostream>
#include <vector>
#include <mpi.h>
#include "petscmat.h"   
#include "petscviewer.h"
#include "petscksp.h"

using namespace std;

int main(int argc, char **argv)
{
  PetscInitialize(&argc, &argv, "", NULL);
  PetscErrorCode ierr;
  Vec vec;
  VecCreate(PETSC_COMM_SELF, &vec);

  std::vector<int> indizes = {0, 5, 2, 1, 4, 3};

  IS is;
  ISLocalToGlobalMapping mapping;
  ierr = ISCreateGeneral(PETSC_COMM_WORLD, indizes.size(),indizes.data(), PETSC_COPY_VALUES, &is); CHKERRQ(ierr);
  ierr = ISLocalToGlobalMappingCreateIS(is, &mapping); CHKERRQ(ierr);
  ierr = VecCreate(PETSC_COMM_WORLD, &vec); CHKERRQ(ierr);
  ierr = VecSetLocalToGlobalMapping(vec, mapping); CHKERRQ(ierr);

  ierr = ISLocalToGlobalMappingView(mapping, PETSC_VIEWER_STDOUT_SELF); CHKERRQ(ierr);

  ierr = VecSetSizes(vec, PETSC_DECIDE, indizes.size()); CHKERRQ(ierr);
  ierr = VecSetFromOptions(vec); CHKERRQ(ierr);

  for (size_t i = 0; i < indizes.size(); i++) {
    ierr = VecSetValueLocal(vec, indizes[i], i*10, INSERT_VALUES); CHKERRQ(ierr);
  }

  ierr = VecView(vec, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);

  PetscFinalize();
  return 0;
}



More information about the petsc-users mailing list