1 static char help[] = "Tests ISLocalToGlobalMappingView() and ISLocalToGlobalMappingLoad()\n\n"; 2 3 #include <petscis.h> 4 #include <petscviewer.h> 5 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; 11 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, MPI_C_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 } 36 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]; 47 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)); 61 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")); 69 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)); 75 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)); 81 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)); 87 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)); 94 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)); 107 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")); 114 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")); 122 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")); 130 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")); 137 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")); 145 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")); 153 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)); 157 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)); 164 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)); 172 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)); 186 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 } 196 197 /*TEST 198 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 213 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 229 230 TEST*/ 231