1c4762a1bSJed Brown 2039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmat.h> 5c4762a1bSJed Brown 6c4762a1bSJed Brown int main(int argc,char **args) 7c4762a1bSJed Brown { 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 16*327415f7SBarry 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++) { 33c4762a1bSJed Brown v = -1.0; i = Ii/n; j = Ii - i*n; 349566063dSJacob Faibussowitsch if (i>0) {J = Ii - n; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 359566063dSJacob Faibussowitsch if (i<m-1) {J = Ii + n; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 369566063dSJacob Faibussowitsch if (j>0) {J = Ii - 1; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 379566063dSJacob Faibussowitsch if (j<n-1) {J = Ii + 1; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 389566063dSJacob Faibussowitsch v = 4.0; PetscCall(MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES)); 39c4762a1bSJed Brown } 40c4762a1bSJed Brown 41c4762a1bSJed Brown /* Make the matrix nonsymmetric if desired */ 42c4762a1bSJed Brown if (mat_nonsymmetric) { 43c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 44c4762a1bSJed Brown v = -1.5; i = Ii/n; 459566063dSJacob Faibussowitsch if (i>1) {J = Ii-n-1; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 46c4762a1bSJed Brown } 47c4762a1bSJed Brown } else { 489566063dSJacob Faibussowitsch PetscCall(MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE)); 499566063dSJacob Faibussowitsch PetscCall(MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE)); 50c4762a1bSJed Brown } 519566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); 529566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); 539566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C,"C")); 549566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C,NULL,"-view")); 55c4762a1bSJed Brown 56b84f494bSStefano Zampini /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ 579566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD,&C1)); 589566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); 599566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C1)); 609566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C1,1,NULL)); 619566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL)); 62c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 63039c6fbaSStefano Zampini v = 1.0; 64039c6fbaSStefano Zampini i = m*n - Ii -1; 65039c6fbaSStefano Zampini j = Ii; 669566063dSJacob Faibussowitsch PetscCall(MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES)); 67c4762a1bSJed Brown } 689566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY)); 699566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY)); 709566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C1,"C1")); 719566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1,NULL,"-view")); 729566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1,MAT_COPY_VALUES,&CU)); 73b84f494bSStefano Zampini 749566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n")); 759566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)); 769566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN)); 779566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1,MAT_GLOBAL_SUM,&info)); 789566063dSJacob 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)); 799566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1,NULL,"-view")); 809566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU,C1,10,&flg)); 81b84f494bSStefano Zampini if (!flg) { 829566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n")); 839566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU,NULL,"-view")); 84b84f494bSStefano Zampini } 859566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 86c4762a1bSJed Brown 87b84f494bSStefano Zampini /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */ 889566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2)); 899566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1,MAT_COPY_VALUES,&CU)); 90c4762a1bSJed Brown 91c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 92c4762a1bSJed Brown v = 1.0; 939566063dSJacob Faibussowitsch PetscCall(MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES)); 94c4762a1bSJed Brown } 959566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY)); 969566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY)); 979566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C2,"C2")); 989566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2,NULL,"-view")); 999566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n")); 1009566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)); 1019566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU,2.0,C2,UNKNOWN_NONZERO_PATTERN)); 1029566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1,MAT_GLOBAL_SUM,&info)); 1039566063dSJacob 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)); 1049566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1,NULL,"-view")); 1059566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU,C1,10,&flg)); 106b84f494bSStefano Zampini if (!flg) { 1079566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1089566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU,NULL,"-view")); 109b84f494bSStefano Zampini } 1109566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 111039c6fbaSStefano Zampini 112b84f494bSStefano Zampini /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */ 1139566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C2,MAT_COPY_VALUES,&CU)); 1149566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n")); 1159566063dSJacob Faibussowitsch PetscCall(MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)); 1169566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN)); 1179566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C2,MAT_GLOBAL_SUM,&info)); 1189566063dSJacob 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)); 1199566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2,NULL,"-view")); 1209566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU,C2,10,&flg)); 121b84f494bSStefano Zampini if (!flg) { 1229566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1239566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU,NULL,"-view")); 124b84f494bSStefano Zampini } 1259566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU)); 126c4762a1bSJed Brown 1279566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C1)); 1289566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C2)); 1299566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 130c4762a1bSJed Brown 1319566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 132b122ec5aSJacob Faibussowitsch return 0; 133c4762a1bSJed Brown } 134c4762a1bSJed Brown 135c4762a1bSJed Brown /*TEST 136c4762a1bSJed Brown 137c4762a1bSJed Brown test: 138039c6fbaSStefano Zampini suffix: 1 139039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 140039c6fbaSStefano Zampini args: -view 141039c6fbaSStefano Zampini diff_args: -j 142039c6fbaSStefano Zampini 143039c6fbaSStefano Zampini test: 144039c6fbaSStefano Zampini output_file: output/ex132_1.out 145039c6fbaSStefano Zampini requires: cuda 146039c6fbaSStefano Zampini suffix: 1_cuda 147039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 148039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 149039c6fbaSStefano Zampini diff_args: -j 150039c6fbaSStefano Zampini 151039c6fbaSStefano Zampini test: 152039c6fbaSStefano Zampini output_file: output/ex132_1.out 153039c6fbaSStefano Zampini requires: kokkos_kernels 154039c6fbaSStefano Zampini suffix: 1_kokkos 155039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 156039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 157039c6fbaSStefano Zampini diff_args: -j 158039c6fbaSStefano Zampini 159039c6fbaSStefano Zampini test: 160039c6fbaSStefano Zampini suffix: 2 161039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 162039c6fbaSStefano Zampini args: -view -mat_nonsym 163039c6fbaSStefano Zampini diff_args: -j 164039c6fbaSStefano Zampini 165039c6fbaSStefano Zampini test: 166039c6fbaSStefano Zampini output_file: output/ex132_2.out 167039c6fbaSStefano Zampini requires: cuda 168039c6fbaSStefano Zampini suffix: 2_cuda 169039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 170039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 171039c6fbaSStefano Zampini diff_args: -j 172039c6fbaSStefano Zampini 173039c6fbaSStefano Zampini test: 174039c6fbaSStefano Zampini output_file: output/ex132_2.out 175039c6fbaSStefano Zampini requires: kokkos_kernels 176039c6fbaSStefano Zampini suffix: 2_kokkos 177039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 178039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 179039c6fbaSStefano Zampini diff_args: -j 180039c6fbaSStefano Zampini 181039c6fbaSStefano Zampini test: 182039c6fbaSStefano Zampini nsize: 2 183039c6fbaSStefano Zampini suffix: 1_par 184039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 185039c6fbaSStefano Zampini args: -view 186039c6fbaSStefano Zampini diff_args: -j 187039c6fbaSStefano Zampini 188039c6fbaSStefano Zampini test: 189039c6fbaSStefano Zampini nsize: 2 190039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 191039c6fbaSStefano Zampini requires: cuda 192039c6fbaSStefano Zampini suffix: 1_par_cuda 193039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 194039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 195039c6fbaSStefano Zampini diff_args: -j 196039c6fbaSStefano Zampini 197039c6fbaSStefano Zampini test: 198039c6fbaSStefano Zampini nsize: 2 199039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 2003078479eSJunchao Zhang requires: !sycl kokkos_kernels 201039c6fbaSStefano Zampini suffix: 1_par_kokkos 202039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 203039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 204039c6fbaSStefano Zampini diff_args: -j 205039c6fbaSStefano Zampini 206039c6fbaSStefano Zampini test: 207039c6fbaSStefano Zampini nsize: 2 208039c6fbaSStefano Zampini suffix: 2_par 209039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 210039c6fbaSStefano Zampini args: -view -mat_nonsym 211039c6fbaSStefano Zampini diff_args: -j 212039c6fbaSStefano Zampini 213039c6fbaSStefano Zampini test: 214039c6fbaSStefano Zampini nsize: 2 215039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 216039c6fbaSStefano Zampini requires: cuda 217039c6fbaSStefano Zampini suffix: 2_par_cuda 218039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 219039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 220039c6fbaSStefano Zampini diff_args: -j 221039c6fbaSStefano Zampini 222f3482364SScott Kruger testset: 223039c6fbaSStefano Zampini nsize: 2 224039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 2253078479eSJunchao Zhang requires: !sycl kokkos_kernels 226039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 227f3482364SScott Kruger args: -view -mat_type aijkokkos -mat_nonsym 228039c6fbaSStefano Zampini diff_args: -j 229f3482364SScott Kruger test: 230f3482364SScott Kruger suffix: 2_par_kokkos_no_gpu_aware 231f3482364SScott Kruger args: -use_gpu_aware_mpi 0 232f3482364SScott Kruger test: 233f3482364SScott Kruger requires: defined(HAVE_MPI_GPU_AWARE) 234f3482364SScott Kruger suffix: 2_par_kokkos_gpu_aware 235f3482364SScott Kruger args: -use_gpu_aware_mpi 1 236c4762a1bSJed Brown 237c4762a1bSJed Brown TEST*/ 238