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*/