Actual source code: ex8.c
1: static char help[] = "Tests ISLocalToGlobalMappingView() and ISLocalToGlobalMappingLoad()\n\n";
3: #include <petscis.h>
4: #include <petscviewer.h>
6: static PetscErrorCode TestEqual(MPI_Comm comm, ISLocalToGlobalMapping m1, ISLocalToGlobalMapping m2, const char *tname)
7: {
8: PetscInt n1, n2, b1, b2;
9: const PetscInt *idx1, *idx2;
10: PetscBool flg;
12: PetscFunctionBegin;
13: PetscCall(ISLocalToGlobalMappingGetSize(m1, &n1));
14: PetscCall(ISLocalToGlobalMappingGetBlockSize(m1, &b1));
15: PetscCall(ISLocalToGlobalMappingGetIndices(m1, &idx1));
16: PetscCall(ISLocalToGlobalMappingGetSize(m2, &n2));
17: PetscCall(ISLocalToGlobalMappingGetBlockSize(m2, &b2));
18: PetscCall(ISLocalToGlobalMappingGetIndices(m2, &idx2));
19: flg = (PetscBool)(b1 == b2);
20: if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different block sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, b1, b2));
21: flg = (PetscBool)(n1 == n2);
22: if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, n1, n2));
23: if (flg) {
24: PetscCall(PetscArraycmp(idx1, idx2, n1, &flg));
25: if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different indices\n", tname));
26: }
27: PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &flg, 1, MPIU_BOOL, MPI_LAND, comm));
28: if (!flg) {
29: PetscCall(ISLocalToGlobalMappingView(m1, PETSC_VIEWER_STDOUT_(comm)));
30: PetscCall(ISLocalToGlobalMappingView(m2, PETSC_VIEWER_STDOUT_(comm)));
31: }
32: PetscCall(ISLocalToGlobalMappingRestoreIndices(m1, &idx1));
33: PetscCall(ISLocalToGlobalMappingRestoreIndices(m2, &idx2));
34: PetscFunctionReturn(PETSC_SUCCESS);
35: }
37: int main(int argc, char **argv)
38: {
39: ISLocalToGlobalMapping lg1l, lg1v, lg1lh, lg2l, lg2v, lg2lh;
40: IS is1, is2;
41: PetscInt n, n1, n2, b1, b2;
42: PetscInt *idx;
43: PetscMPIInt size, rank;
44: PetscViewer vx;
45: MPI_Comm comm;
46: char fname[PETSC_MAX_PATH_LEN], fnameh[PETSC_MAX_PATH_LEN];
48: PetscFunctionBeginUser;
49: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
50: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
51: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
52: PetscCall(ISCreateStride(PETSC_COMM_WORLD, size - rank, -size - 1, rank + 1, &is1));
53: PetscCall(ISGetLocalSize(is1, &n));
54: PetscCall(ISGetIndices(is1, (const PetscInt **)&idx));
55: PetscCall(ISCreateBlock(PETSC_COMM_WORLD, 3, n, idx, PETSC_COPY_VALUES, &is2));
56: PetscCall(ISRestoreIndices(is1, (const PetscInt **)&idx));
57: PetscCall(ISLocalToGlobalMappingCreateIS(is1, &lg1v));
58: PetscCall(ISLocalToGlobalMappingCreateIS(is2, &lg2v));
59: PetscCall(ISDestroy(&is1));
60: PetscCall(ISDestroy(&is2));
62: /* Test MATLAB ASCII viewer */
63: PetscCall(PetscObjectSetName((PetscObject)lg1v, "map1"));
64: PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_MATLAB));
65: PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD));
66: PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD));
67: PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
68: PetscCall(PetscObjectSetName((PetscObject)lg2v, "map2"));
70: /* Now test view/load of type binary */
71: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_WRITE, &vx));
72: PetscCall(ISLocalToGlobalMappingView(lg1v, vx));
73: PetscCall(ISLocalToGlobalMappingView(lg2v, vx));
74: PetscCall(PetscViewerDestroy(&vx));
76: PetscCall(PetscSNPrintf(fname, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_seq_%d", rank));
77: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_WRITE, &vx));
78: PetscCall(ISLocalToGlobalMappingView(lg1v, vx));
79: PetscCall(ISLocalToGlobalMappingView(lg2v, vx));
80: PetscCall(PetscViewerDestroy(&vx));
82: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_WRITE, &vx));
83: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
84: PetscCall(ISLocalToGlobalMappingView(lg1v, vx));
85: PetscCall(ISLocalToGlobalMappingView(lg2v, vx));
86: PetscCall(PetscViewerDestroy(&vx));
88: PetscCall(PetscSNPrintf(fnameh, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_noheader_seq_%d", rank));
89: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_WRITE, &vx));
90: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
91: PetscCall(ISLocalToGlobalMappingView(lg1v, vx));
92: PetscCall(ISLocalToGlobalMappingView(lg2v, vx));
93: PetscCall(PetscViewerDestroy(&vx));
95: PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 77, 0, NULL, PETSC_USE_POINTER, &lg1l));
96: PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l));
97: PetscCall(ISLocalToGlobalMappingGetSize(lg1v, &n1));
98: PetscCall(ISLocalToGlobalMappingGetBlockSize(lg1v, &b1));
99: n1 /= b1;
100: PetscCall(ISLocalToGlobalMappingGetSize(lg2v, &n2));
101: PetscCall(ISLocalToGlobalMappingGetBlockSize(lg2v, &b2));
102: n2 /= b2;
103: PetscCall(PetscMalloc1(n1, &idx));
104: PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b1, n1, idx, PETSC_OWN_POINTER, &lg1lh));
105: PetscCall(PetscMalloc1(n2, &idx));
106: PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b2, n2, idx, PETSC_OWN_POINTER, &lg2lh));
108: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vx));
109: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
110: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
111: PetscCall(PetscViewerDestroy(&vx));
112: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world 1"));
113: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world 2"));
115: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx));
116: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
117: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
118: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
119: PetscCall(PetscViewerDestroy(&vx));
120: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world_noheader 1"));
121: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world_noheader 2"));
123: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx));
124: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
125: PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx));
126: PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx));
127: PetscCall(PetscViewerDestroy(&vx));
128: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_world_map_self_noheader 1"));
129: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_world_map_self_noheader 2"));
131: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_READ, &vx));
132: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
133: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
134: PetscCall(PetscViewerDestroy(&vx));
135: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world 1"));
136: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world 2"));
138: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx));
139: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
140: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
141: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
142: PetscCall(PetscViewerDestroy(&vx));
143: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world_noheader 1"));
144: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world_noheader 2"));
146: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx));
147: PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
148: PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx));
149: PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx));
150: PetscCall(PetscViewerDestroy(&vx));
151: PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_self_map_self_noheader 1"));
152: PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_self_map_self_noheader 2"));
154: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "View world maps\n"));
155: PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD));
156: PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD));
158: PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, rank < 2, rank, &comm));
159: if (rank < 2) {
160: PetscCall(ISLocalToGlobalMappingDestroy(&lg1l));
161: PetscCall(ISLocalToGlobalMappingDestroy(&lg2l));
162: PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l));
163: PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l));
165: PetscCall(PetscViewerBinaryOpen(comm, "testfile", FILE_MODE_READ, &vx));
166: PetscCall(PetscPrintf(comm, "View world maps loaded from subcomm\n"));
167: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
168: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
169: PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm)));
170: PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm)));
171: PetscCall(PetscViewerDestroy(&vx));
173: PetscCall(ISLocalToGlobalMappingDestroy(&lg1l));
174: PetscCall(ISLocalToGlobalMappingDestroy(&lg2l));
175: PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l));
176: PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l));
177: PetscCall(PetscViewerBinaryOpen(comm, "testfile_seq_0", FILE_MODE_READ, &vx));
178: PetscCall(PetscPrintf(comm, "View sequential maps from rank 0 loaded from subcomm\n"));
179: PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx));
180: PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx));
181: PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm)));
182: PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm)));
183: PetscCall(PetscViewerDestroy(&vx));
184: }
185: PetscCallMPI(MPI_Comm_free(&comm));
187: PetscCall(ISLocalToGlobalMappingDestroy(&lg1lh));
188: PetscCall(ISLocalToGlobalMappingDestroy(&lg2lh));
189: PetscCall(ISLocalToGlobalMappingDestroy(&lg1l));
190: PetscCall(ISLocalToGlobalMappingDestroy(&lg2l));
191: PetscCall(ISLocalToGlobalMappingDestroy(&lg1v));
192: PetscCall(ISLocalToGlobalMappingDestroy(&lg2v));
193: PetscCall(PetscFinalize());
194: return 0;
195: }
197: /*TEST
199: testset:
200: args: -viewer_binary_mpiio 0
201: test:
202: output_file: output/ex8_1_1.out
203: suffix: 1_stdio_1
204: nsize: 1
205: test:
206: output_file: output/ex8_1_2.out
207: suffix: 1_stdio_2
208: nsize: 2
209: test:
210: output_file: output/ex8_1_3.out
211: suffix: 1_stdio_3
212: nsize: 3
214: testset:
215: requires: mpiio
216: args: -viewer_binary_mpiio 1
217: test:
218: output_file: output/ex8_1_1.out
219: suffix: 1_mpiio_1
220: nsize: 1
221: test:
222: output_file: output/ex8_1_2.out
223: suffix: 1_mpiio_2
224: nsize: 2
225: test:
226: output_file: output/ex8_1_3.out
227: suffix: 1_mpiio_3
228: nsize: 3
230: TEST*/