1c4762a1bSJed Brown 2039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmat.h> 5c4762a1bSJed Brown 6*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 7*d71ae5a4SJacob Faibussowitsch { 8b84f494bSStefano Zampini Mat C, C1, C2, CU; 9c4762a1bSJed Brown PetscScalar v; 10c4762a1bSJed Brown PetscInt Ii, J, Istart, Iend; 11039c6fbaSStefano Zampini PetscInt i, j, m = 3, n; 12039c6fbaSStefano Zampini PetscMPIInt size; 13b84f494bSStefano Zampini PetscBool mat_nonsymmetric = PETSC_FALSE, flg; 14c4762a1bSJed Brown MatInfo info; 15c4762a1bSJed Brown 16327415f7SBarry Smith PetscFunctionBeginUser; 179566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 199566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 20c4762a1bSJed Brown n = 2 * size; 21c4762a1bSJed Brown 22c4762a1bSJed Brown /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */ 239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-mat_nonsym", &mat_nonsymmetric, NULL)); 24c4762a1bSJed Brown 259566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 269566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n)); 279566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C)); 289566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C, 5, NULL)); 299566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL)); 30c4762a1bSJed Brown 319566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(C, &Istart, &Iend)); 32c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 339371c9d4SSatish Balay v = -1.0; 349371c9d4SSatish Balay i = Ii / n; 359371c9d4SSatish Balay j = Ii - i * n; 369371c9d4SSatish Balay if (i > 0) { 379371c9d4SSatish Balay J = Ii - n; 389371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 399371c9d4SSatish Balay } 409371c9d4SSatish Balay if (i < m - 1) { 419371c9d4SSatish Balay J = Ii + n; 429371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 439371c9d4SSatish Balay } 449371c9d4SSatish Balay if (j > 0) { 459371c9d4SSatish Balay J = Ii - 1; 469371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 479371c9d4SSatish Balay } 489371c9d4SSatish Balay if (j < n - 1) { 499371c9d4SSatish Balay J = Ii + 1; 509371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 519371c9d4SSatish Balay } 529371c9d4SSatish Balay v = 4.0; 539371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 54c4762a1bSJed Brown } 55c4762a1bSJed Brown 56c4762a1bSJed Brown /* Make the matrix nonsymmetric if desired */ 57c4762a1bSJed Brown if (mat_nonsymmetric) { 58c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 599371c9d4SSatish Balay v = -1.5; 609371c9d4SSatish Balay i = Ii / n; 619371c9d4SSatish Balay if (i > 1) { 629371c9d4SSatish Balay J = Ii - n - 1; 639371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 649371c9d4SSatish Balay } 65c4762a1bSJed Brown } 66c4762a1bSJed Brown } else { 679566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRIC, PETSC_TRUE)); 689566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRY_ETERNAL, PETSC_TRUE)); 69c4762a1bSJed Brown } 709566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 719566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 729566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C, "C")); 739566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C, NULL, "-view")); 74c4762a1bSJed Brown 75b84f494bSStefano Zampini /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ 769566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C1)); 779566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C1, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n)); 789566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C1)); 799566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C1, 1, NULL)); 809566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C1, 1, NULL, 1, NULL)); 81c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 82039c6fbaSStefano Zampini v = 1.0; 83039c6fbaSStefano Zampini i = m * n - Ii - 1; 84039c6fbaSStefano Zampini j = Ii; 859566063dSJacob Faibussowitsch PetscCall(MatSetValues(C1, 1, &i, 1, &j, &v, ADD_VALUES)); 86c4762a1bSJed Brown } 879566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C1, MAT_FINAL_ASSEMBLY)); 889566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C1, MAT_FINAL_ASSEMBLY)); 899566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C1, "C1")); 909566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 919566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU)); 92b84f494bSStefano Zampini 939566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n")); 949566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C, DIFFERENT_NONZERO_PATTERN)); 959566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN)); 969566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info)); 979566063dSJacob 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)); 989566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 999566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg)); 100b84f494bSStefano Zampini if (!flg) { 1019566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n")); 1029566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 103b84f494bSStefano Zampini } 1049566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 105c4762a1bSJed Brown 106b84f494bSStefano Zampini /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */ 1079566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &C2)); 1089566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU)); 109c4762a1bSJed Brown 110c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 111c4762a1bSJed Brown v = 1.0; 1129566063dSJacob Faibussowitsch PetscCall(MatSetValues(C2, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 113c4762a1bSJed Brown } 1149566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C2, MAT_FINAL_ASSEMBLY)); 1159566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C2, MAT_FINAL_ASSEMBLY)); 1169566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C2, "C2")); 1179566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view")); 1189566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n")); 1199566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C2, SUBSET_NONZERO_PATTERN)); 1209566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C2, UNKNOWN_NONZERO_PATTERN)); 1219566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info)); 1229566063dSJacob 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)); 1239566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view")); 1249566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg)); 125b84f494bSStefano Zampini if (!flg) { 1269566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1279566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 128b84f494bSStefano Zampini } 1299566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 130039c6fbaSStefano Zampini 131b84f494bSStefano Zampini /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */ 1329566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C2, MAT_COPY_VALUES, &CU)); 1339566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n")); 1349566063dSJacob Faibussowitsch PetscCall(MatAXPY(C2, 2.0, C, SAME_NONZERO_PATTERN)); 1359566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN)); 1369566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C2, MAT_GLOBAL_SUM, &info)); 1379566063dSJacob 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)); 1389566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view")); 1399566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C2, 10, &flg)); 140b84f494bSStefano Zampini if (!flg) { 1419566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1429566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view")); 143b84f494bSStefano Zampini } 1449566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 145c4762a1bSJed Brown 1469566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C1)); 1479566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C2)); 1489566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 149c4762a1bSJed Brown 1509566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 151b122ec5aSJacob Faibussowitsch return 0; 152c4762a1bSJed Brown } 153c4762a1bSJed Brown 154c4762a1bSJed Brown /*TEST 155c4762a1bSJed Brown 156c4762a1bSJed Brown test: 157039c6fbaSStefano Zampini suffix: 1 158039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 159039c6fbaSStefano Zampini args: -view 160039c6fbaSStefano Zampini diff_args: -j 161039c6fbaSStefano Zampini 162039c6fbaSStefano Zampini test: 163039c6fbaSStefano Zampini output_file: output/ex132_1.out 164039c6fbaSStefano Zampini requires: cuda 165039c6fbaSStefano Zampini suffix: 1_cuda 166039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 167039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 168039c6fbaSStefano Zampini diff_args: -j 169039c6fbaSStefano Zampini 170039c6fbaSStefano Zampini test: 171039c6fbaSStefano Zampini output_file: output/ex132_1.out 172039c6fbaSStefano Zampini requires: kokkos_kernels 173039c6fbaSStefano Zampini suffix: 1_kokkos 174039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 175039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 176039c6fbaSStefano Zampini diff_args: -j 177039c6fbaSStefano Zampini 178039c6fbaSStefano Zampini test: 179039c6fbaSStefano Zampini suffix: 2 180039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 181039c6fbaSStefano Zampini args: -view -mat_nonsym 182039c6fbaSStefano Zampini diff_args: -j 183039c6fbaSStefano Zampini 184039c6fbaSStefano Zampini test: 185039c6fbaSStefano Zampini output_file: output/ex132_2.out 186039c6fbaSStefano Zampini requires: cuda 187039c6fbaSStefano Zampini suffix: 2_cuda 188039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 189039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 190039c6fbaSStefano Zampini diff_args: -j 191039c6fbaSStefano Zampini 192039c6fbaSStefano Zampini test: 193039c6fbaSStefano Zampini output_file: output/ex132_2.out 194039c6fbaSStefano Zampini requires: kokkos_kernels 195039c6fbaSStefano Zampini suffix: 2_kokkos 196039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 197039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 198039c6fbaSStefano Zampini diff_args: -j 199039c6fbaSStefano Zampini 200039c6fbaSStefano Zampini test: 201039c6fbaSStefano Zampini nsize: 2 202039c6fbaSStefano Zampini suffix: 1_par 203039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 204039c6fbaSStefano Zampini args: -view 205039c6fbaSStefano Zampini diff_args: -j 206039c6fbaSStefano Zampini 207039c6fbaSStefano Zampini test: 208039c6fbaSStefano Zampini nsize: 2 209039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 210039c6fbaSStefano Zampini requires: cuda 211039c6fbaSStefano Zampini suffix: 1_par_cuda 212039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 213039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 214039c6fbaSStefano Zampini diff_args: -j 215039c6fbaSStefano Zampini 216039c6fbaSStefano Zampini test: 217039c6fbaSStefano Zampini nsize: 2 218039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 219dcfd994dSJunchao Zhang requires: kokkos_kernels 220039c6fbaSStefano Zampini suffix: 1_par_kokkos 221039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 222039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 223039c6fbaSStefano Zampini diff_args: -j 224039c6fbaSStefano Zampini 225039c6fbaSStefano Zampini test: 226039c6fbaSStefano Zampini nsize: 2 227039c6fbaSStefano Zampini suffix: 2_par 228039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 229039c6fbaSStefano Zampini args: -view -mat_nonsym 230039c6fbaSStefano Zampini diff_args: -j 231039c6fbaSStefano Zampini 232039c6fbaSStefano Zampini test: 233039c6fbaSStefano Zampini nsize: 2 234039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 235039c6fbaSStefano Zampini requires: cuda 236039c6fbaSStefano Zampini suffix: 2_par_cuda 237039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 238039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 239039c6fbaSStefano Zampini diff_args: -j 240039c6fbaSStefano Zampini 241f3482364SScott Kruger testset: 242039c6fbaSStefano Zampini nsize: 2 243039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 244dcfd994dSJunchao Zhang requires: kokkos_kernels 245039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 246f3482364SScott Kruger args: -view -mat_type aijkokkos -mat_nonsym 247039c6fbaSStefano Zampini diff_args: -j 248f3482364SScott Kruger test: 249f3482364SScott Kruger suffix: 2_par_kokkos_no_gpu_aware 250f3482364SScott Kruger args: -use_gpu_aware_mpi 0 251f3482364SScott Kruger test: 252f3482364SScott Kruger requires: defined(HAVE_MPI_GPU_AWARE) 253f3482364SScott Kruger suffix: 2_par_kokkos_gpu_aware 254f3482364SScott Kruger args: -use_gpu_aware_mpi 1 255c4762a1bSJed Brown 256c4762a1bSJed Brown TEST*/ 257