1c4762a1bSJed Brown 2039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmat.h> 5c4762a1bSJed Brown 69371c9d4SSatish Balay int main(int argc, char **args) { 7b84f494bSStefano Zampini Mat C, C1, C2, CU; 8c4762a1bSJed Brown PetscScalar v; 9c4762a1bSJed Brown PetscInt Ii, J, Istart, Iend; 10039c6fbaSStefano Zampini PetscInt i, j, m = 3, n; 11039c6fbaSStefano Zampini PetscMPIInt size; 12b84f494bSStefano Zampini PetscBool mat_nonsymmetric = PETSC_FALSE, flg; 13c4762a1bSJed Brown MatInfo info; 14c4762a1bSJed Brown 15327415f7SBarry Smith PetscFunctionBeginUser; 169566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 179566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 189566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 19c4762a1bSJed Brown n = 2 * size; 20c4762a1bSJed Brown 21c4762a1bSJed Brown /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */ 229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-mat_nonsym", &mat_nonsymmetric, NULL)); 23c4762a1bSJed Brown 249566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 259566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n)); 269566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C)); 279566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C, 5, NULL)); 289566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL)); 29c4762a1bSJed Brown 309566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(C, &Istart, &Iend)); 31c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 329371c9d4SSatish Balay v = -1.0; 339371c9d4SSatish Balay i = Ii / n; 349371c9d4SSatish Balay j = Ii - i * n; 359371c9d4SSatish Balay if (i > 0) { 369371c9d4SSatish Balay J = Ii - n; 379371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 389371c9d4SSatish Balay } 399371c9d4SSatish Balay if (i < m - 1) { 409371c9d4SSatish Balay J = Ii + n; 419371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 429371c9d4SSatish Balay } 439371c9d4SSatish Balay if (j > 0) { 449371c9d4SSatish Balay J = Ii - 1; 459371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 469371c9d4SSatish Balay } 479371c9d4SSatish Balay if (j < n - 1) { 489371c9d4SSatish Balay J = Ii + 1; 499371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 509371c9d4SSatish Balay } 519371c9d4SSatish Balay v = 4.0; 529371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 53c4762a1bSJed Brown } 54c4762a1bSJed Brown 55c4762a1bSJed Brown /* Make the matrix nonsymmetric if desired */ 56c4762a1bSJed Brown if (mat_nonsymmetric) { 57c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 589371c9d4SSatish Balay v = -1.5; 599371c9d4SSatish Balay i = Ii / n; 609371c9d4SSatish Balay if (i > 1) { 619371c9d4SSatish Balay J = Ii - n - 1; 629371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 639371c9d4SSatish Balay } 64c4762a1bSJed Brown } 65c4762a1bSJed Brown } else { 669566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRIC, PETSC_TRUE)); 679566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRY_ETERNAL, PETSC_TRUE)); 68c4762a1bSJed Brown } 699566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 709566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 719566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C, "C")); 729566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C, NULL, "-view")); 73c4762a1bSJed Brown 74b84f494bSStefano Zampini /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ 759566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C1)); 769566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C1, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n)); 779566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C1)); 789566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C1, 1, NULL)); 799566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C1, 1, NULL, 1, NULL)); 80c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 81039c6fbaSStefano Zampini v = 1.0; 82039c6fbaSStefano Zampini i = m * n - Ii - 1; 83039c6fbaSStefano Zampini j = Ii; 849566063dSJacob Faibussowitsch PetscCall(MatSetValues(C1, 1, &i, 1, &j, &v, ADD_VALUES)); 85c4762a1bSJed Brown } 869566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C1, MAT_FINAL_ASSEMBLY)); 879566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C1, MAT_FINAL_ASSEMBLY)); 889566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C1, "C1")); 899566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 909566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU)); 91b84f494bSStefano Zampini 929566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n")); 939566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C, DIFFERENT_NONZERO_PATTERN)); 949566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN)); 959566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info)); 969566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded)); 979566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 989566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg)); 99b84f494bSStefano Zampini if (!flg) { 1009566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n")); 1019566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 102b84f494bSStefano Zampini } 1039566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 104c4762a1bSJed Brown 105b84f494bSStefano Zampini /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */ 1069566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &C2)); 1079566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU)); 108c4762a1bSJed Brown 109c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 110c4762a1bSJed Brown v = 1.0; 1119566063dSJacob Faibussowitsch PetscCall(MatSetValues(C2, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 112c4762a1bSJed Brown } 1139566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C2, MAT_FINAL_ASSEMBLY)); 1149566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C2, MAT_FINAL_ASSEMBLY)); 1159566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C2, "C2")); 1169566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view")); 1179566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n")); 1189566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C2, SUBSET_NONZERO_PATTERN)); 1199566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C2, UNKNOWN_NONZERO_PATTERN)); 1209566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info)); 1219566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded)); 1229566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 1239566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg)); 124b84f494bSStefano Zampini if (!flg) { 1259566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1269566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 127b84f494bSStefano Zampini } 1289566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 129039c6fbaSStefano Zampini 130b84f494bSStefano Zampini /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */ 1319566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C2, MAT_COPY_VALUES, &CU)); 1329566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n")); 1339566063dSJacob Faibussowitsch PetscCall(MatAXPY(C2, 2.0, C, SAME_NONZERO_PATTERN)); 1349566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN)); 1359566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C2, MAT_GLOBAL_SUM, &info)); 1369566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded)); 1379566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view")); 1389566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C2, 10, &flg)); 139b84f494bSStefano Zampini if (!flg) { 1409566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1419566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 142b84f494bSStefano Zampini } 1439566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 144c4762a1bSJed Brown 1459566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C1)); 1469566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C2)); 1479566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 148c4762a1bSJed Brown 1499566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 150b122ec5aSJacob Faibussowitsch return 0; 151c4762a1bSJed Brown } 152c4762a1bSJed Brown 153c4762a1bSJed Brown /*TEST 154c4762a1bSJed Brown 155c4762a1bSJed Brown test: 156039c6fbaSStefano Zampini suffix: 1 157039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 158039c6fbaSStefano Zampini args: -view 159039c6fbaSStefano Zampini diff_args: -j 160039c6fbaSStefano Zampini 161039c6fbaSStefano Zampini test: 162039c6fbaSStefano Zampini output_file: output/ex132_1.out 163039c6fbaSStefano Zampini requires: cuda 164039c6fbaSStefano Zampini suffix: 1_cuda 165039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 166039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 167039c6fbaSStefano Zampini diff_args: -j 168039c6fbaSStefano Zampini 169039c6fbaSStefano Zampini test: 170039c6fbaSStefano Zampini output_file: output/ex132_1.out 171039c6fbaSStefano Zampini requires: kokkos_kernels 172039c6fbaSStefano Zampini suffix: 1_kokkos 173039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 174039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 175039c6fbaSStefano Zampini diff_args: -j 176039c6fbaSStefano Zampini 177039c6fbaSStefano Zampini test: 178039c6fbaSStefano Zampini suffix: 2 179039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 180039c6fbaSStefano Zampini args: -view -mat_nonsym 181039c6fbaSStefano Zampini diff_args: -j 182039c6fbaSStefano Zampini 183039c6fbaSStefano Zampini test: 184039c6fbaSStefano Zampini output_file: output/ex132_2.out 185039c6fbaSStefano Zampini requires: cuda 186039c6fbaSStefano Zampini suffix: 2_cuda 187039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 188039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 189039c6fbaSStefano Zampini diff_args: -j 190039c6fbaSStefano Zampini 191039c6fbaSStefano Zampini test: 192039c6fbaSStefano Zampini output_file: output/ex132_2.out 193039c6fbaSStefano Zampini requires: kokkos_kernels 194039c6fbaSStefano Zampini suffix: 2_kokkos 195039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 196039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 197039c6fbaSStefano Zampini diff_args: -j 198039c6fbaSStefano Zampini 199039c6fbaSStefano Zampini test: 200039c6fbaSStefano Zampini nsize: 2 201039c6fbaSStefano Zampini suffix: 1_par 202039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 203039c6fbaSStefano Zampini args: -view 204039c6fbaSStefano Zampini diff_args: -j 205039c6fbaSStefano Zampini 206039c6fbaSStefano Zampini test: 207039c6fbaSStefano Zampini nsize: 2 208039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 209039c6fbaSStefano Zampini requires: cuda 210039c6fbaSStefano Zampini suffix: 1_par_cuda 211039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 212039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 213039c6fbaSStefano Zampini diff_args: -j 214039c6fbaSStefano Zampini 215039c6fbaSStefano Zampini test: 216039c6fbaSStefano Zampini nsize: 2 217039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 218*dcfd994dSJunchao Zhang requires: kokkos_kernels 219039c6fbaSStefano Zampini suffix: 1_par_kokkos 220039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 221039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 222039c6fbaSStefano Zampini diff_args: -j 223039c6fbaSStefano Zampini 224039c6fbaSStefano Zampini test: 225039c6fbaSStefano Zampini nsize: 2 226039c6fbaSStefano Zampini suffix: 2_par 227039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 228039c6fbaSStefano Zampini args: -view -mat_nonsym 229039c6fbaSStefano Zampini diff_args: -j 230039c6fbaSStefano Zampini 231039c6fbaSStefano Zampini test: 232039c6fbaSStefano Zampini nsize: 2 233039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 234039c6fbaSStefano Zampini requires: cuda 235039c6fbaSStefano Zampini suffix: 2_par_cuda 236039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 237039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 238039c6fbaSStefano Zampini diff_args: -j 239039c6fbaSStefano Zampini 240f3482364SScott Kruger testset: 241039c6fbaSStefano Zampini nsize: 2 242039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 243*dcfd994dSJunchao Zhang requires: kokkos_kernels 244039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 245f3482364SScott Kruger args: -view -mat_type aijkokkos -mat_nonsym 246039c6fbaSStefano Zampini diff_args: -j 247f3482364SScott Kruger test: 248f3482364SScott Kruger suffix: 2_par_kokkos_no_gpu_aware 249f3482364SScott Kruger args: -use_gpu_aware_mpi 0 250f3482364SScott Kruger test: 251f3482364SScott Kruger requires: defined(HAVE_MPI_GPU_AWARE) 252f3482364SScott Kruger suffix: 2_par_kokkos_gpu_aware 253f3482364SScott Kruger args: -use_gpu_aware_mpi 1 254c4762a1bSJed Brown 255c4762a1bSJed Brown TEST*/ 256