Actual source code: ex21.c
1: static const char help[] = "Test VecScatterCopy() on an SF with duplicated leaves \n\n";
3: #include <petscvec.h>
4: #include <petscsf.h>
6: /*
7: Contributed-by: "Hammond, Glenn E" <glenn.hammond@pnnl.gov>
8: */
9: int main(int argc, char *argv[])
10: {
11: PetscMPIInt size;
12: PetscInt n;
13: PetscInt *indices;
14: Vec vec;
15: Vec vec2;
16: IS is;
17: IS is2;
18: VecScatter scatter;
19: VecScatter scatter2;
21: PetscFunctionBeginUser;
22: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
23: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
24: PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This example requires 1 process");
26: n = 4;
27: PetscCall(PetscMalloc1(n, &indices));
28: indices[0] = 0;
29: indices[1] = 1;
30: indices[2] = 2;
31: indices[3] = 3;
32: PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, indices, PETSC_COPY_VALUES, &is));
33: PetscCall(PetscFree(indices));
34: PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, n, n, &vec));
36: n = 4;
37: PetscCall(PetscMalloc1(n, &indices));
38: indices[0] = 0;
39: indices[1] = 0;
40: indices[2] = 1;
41: indices[3] = 1;
42: PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, indices, PETSC_COPY_VALUES, &is2));
43: PetscCall(PetscFree(indices));
44: PetscCall(VecCreateFromOptions(PETSC_COMM_WORLD, NULL, 1, n / 2, n / 2, &vec2));
46: PetscCall(VecScatterCreate(vec, is, vec2, is2, &scatter));
47: PetscCall(ISDestroy(&is));
48: PetscCall(ISDestroy(&is2));
50: PetscCall(VecScatterCopy(scatter, &scatter2));
52: PetscCall(VecDestroy(&vec));
53: PetscCall(VecDestroy(&vec2));
54: PetscCall(VecScatterDestroy(&scatter));
55: PetscCall(VecScatterDestroy(&scatter2));
56: PetscCall(PetscFinalize());
57: }
59: /*TEST
60: test:
61: nsize: 1
62: output_file: output/empty.out
63: TEST*/