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*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&args,(char*)0,help)); 175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); 185f80ce2aSJacob Faibussowitsch CHKERRMPI(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. */ 225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL)); 23c4762a1bSJed Brown 245f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(C)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(MatSeqAIJSetPreallocation(C,5,NULL)); 285f80ce2aSJacob Faibussowitsch CHKERRQ(MatMPIAIJSetPreallocation(C,5,NULL,5,NULL)); 29c4762a1bSJed Brown 305f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipRange(C,&Istart,&Iend)); 31c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 32c4762a1bSJed Brown v = -1.0; i = Ii/n; j = Ii - i*n; 335f80ce2aSJacob Faibussowitsch if (i>0) {J = Ii - n; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 345f80ce2aSJacob Faibussowitsch if (i<m-1) {J = Ii + n; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 355f80ce2aSJacob Faibussowitsch if (j>0) {J = Ii - 1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 365f80ce2aSJacob Faibussowitsch if (j<n-1) {J = Ii + 1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 375f80ce2aSJacob Faibussowitsch v = 4.0; CHKERRQ(MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES)); 38c4762a1bSJed Brown } 39c4762a1bSJed Brown 40c4762a1bSJed Brown /* Make the matrix nonsymmetric if desired */ 41c4762a1bSJed Brown if (mat_nonsymmetric) { 42c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 43c4762a1bSJed Brown v = -1.5; i = Ii/n; 445f80ce2aSJacob Faibussowitsch if (i>1) {J = Ii-n-1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} 45c4762a1bSJed Brown } 46c4762a1bSJed Brown } else { 475f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE)); 485f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE)); 49c4762a1bSJed Brown } 505f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); 515f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)C,"C")); 535f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C,NULL,"-view")); 54c4762a1bSJed Brown 55b84f494bSStefano Zampini /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ 565f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C1)); 575f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(C1)); 595f80ce2aSJacob Faibussowitsch CHKERRQ(MatSeqAIJSetPreallocation(C1,1,NULL)); 605f80ce2aSJacob Faibussowitsch CHKERRQ(MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL)); 61c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 62039c6fbaSStefano Zampini v = 1.0; 63039c6fbaSStefano Zampini i = m*n - Ii -1; 64039c6fbaSStefano Zampini j = Ii; 655f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES)); 66c4762a1bSJed Brown } 675f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY)); 695f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)C1,"C1")); 705f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C1,NULL,"-view")); 715f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(C1,MAT_COPY_VALUES,&CU)); 72b84f494bSStefano Zampini 735f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n")); 745f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)); 755f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN)); 765f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetInfo(C1,MAT_GLOBAL_SUM,&info)); 775f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded)); 785f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C1,NULL,"-view")); 795f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(CU,C1,10,&flg)); 80b84f494bSStefano Zampini if (!flg) { 815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n")); 825f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(CU,NULL,"-view")); 83b84f494bSStefano Zampini } 845f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&CU)); 85c4762a1bSJed Brown 86b84f494bSStefano Zampini /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */ 875f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2)); 885f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(C1,MAT_COPY_VALUES,&CU)); 89c4762a1bSJed Brown 90c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 91c4762a1bSJed Brown v = 1.0; 925f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES)); 93c4762a1bSJed Brown } 945f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY)); 955f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY)); 965f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)C2,"C2")); 975f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C2,NULL,"-view")); 985f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n")); 995f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)); 1005f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(CU,2.0,C2,UNKNOWN_NONZERO_PATTERN)); 1015f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetInfo(C1,MAT_GLOBAL_SUM,&info)); 1025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded)); 1035f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C1,NULL,"-view")); 1045f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(CU,C1,10,&flg)); 105b84f494bSStefano Zampini if (!flg) { 1065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1075f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(CU,NULL,"-view")); 108b84f494bSStefano Zampini } 1095f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&CU)); 110039c6fbaSStefano Zampini 111b84f494bSStefano Zampini /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */ 1125f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(C2,MAT_COPY_VALUES,&CU)); 1135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n")); 1145f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)); 1155f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN)); 1165f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetInfo(C2,MAT_GLOBAL_SUM,&info)); 1175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded)); 1185f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C2,NULL,"-view")); 1195f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(CU,C2,10,&flg)); 120b84f494bSStefano Zampini if (!flg) { 1215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n")); 1225f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(CU,NULL,"-view")); 123b84f494bSStefano Zampini } 1245f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&CU)); 125c4762a1bSJed Brown 1265f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C1)); 1275f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C2)); 1285f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 129c4762a1bSJed Brown 130*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 131*b122ec5aSJacob Faibussowitsch return 0; 132c4762a1bSJed Brown } 133c4762a1bSJed Brown 134c4762a1bSJed Brown /*TEST 135c4762a1bSJed Brown 136c4762a1bSJed Brown test: 137039c6fbaSStefano Zampini suffix: 1 138039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 139039c6fbaSStefano Zampini args: -view 140039c6fbaSStefano Zampini diff_args: -j 141039c6fbaSStefano Zampini 142039c6fbaSStefano Zampini test: 143039c6fbaSStefano Zampini output_file: output/ex132_1.out 144039c6fbaSStefano Zampini requires: cuda 145039c6fbaSStefano Zampini suffix: 1_cuda 146039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 147039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 148039c6fbaSStefano Zampini diff_args: -j 149039c6fbaSStefano Zampini 150039c6fbaSStefano Zampini test: 151039c6fbaSStefano Zampini output_file: output/ex132_1.out 152039c6fbaSStefano Zampini requires: kokkos_kernels 153039c6fbaSStefano Zampini suffix: 1_kokkos 154039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 155039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 156039c6fbaSStefano Zampini diff_args: -j 157039c6fbaSStefano Zampini 158039c6fbaSStefano Zampini test: 159039c6fbaSStefano Zampini suffix: 2 160039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 161039c6fbaSStefano Zampini args: -view -mat_nonsym 162039c6fbaSStefano Zampini diff_args: -j 163039c6fbaSStefano Zampini 164039c6fbaSStefano Zampini test: 165039c6fbaSStefano Zampini output_file: output/ex132_2.out 166039c6fbaSStefano Zampini requires: cuda 167039c6fbaSStefano Zampini suffix: 2_cuda 168039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 169039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 170039c6fbaSStefano Zampini diff_args: -j 171039c6fbaSStefano Zampini 172039c6fbaSStefano Zampini test: 173039c6fbaSStefano Zampini output_file: output/ex132_2.out 174039c6fbaSStefano Zampini requires: kokkos_kernels 175039c6fbaSStefano Zampini suffix: 2_kokkos 176039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 177039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 178039c6fbaSStefano Zampini diff_args: -j 179039c6fbaSStefano Zampini 180039c6fbaSStefano Zampini test: 181039c6fbaSStefano Zampini nsize: 2 182039c6fbaSStefano Zampini suffix: 1_par 183039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 184039c6fbaSStefano Zampini args: -view 185039c6fbaSStefano Zampini diff_args: -j 186039c6fbaSStefano Zampini 187039c6fbaSStefano Zampini test: 188039c6fbaSStefano Zampini nsize: 2 189039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 190039c6fbaSStefano Zampini requires: cuda 191039c6fbaSStefano Zampini suffix: 1_par_cuda 192039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 193039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 194039c6fbaSStefano Zampini diff_args: -j 195039c6fbaSStefano Zampini 196039c6fbaSStefano Zampini test: 197039c6fbaSStefano Zampini nsize: 2 198039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 1993078479eSJunchao Zhang requires: !sycl kokkos_kernels 200039c6fbaSStefano Zampini suffix: 1_par_kokkos 201039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 202039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 203039c6fbaSStefano Zampini diff_args: -j 204039c6fbaSStefano Zampini 205039c6fbaSStefano Zampini test: 206039c6fbaSStefano Zampini nsize: 2 207039c6fbaSStefano Zampini suffix: 2_par 208039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 209039c6fbaSStefano Zampini args: -view -mat_nonsym 210039c6fbaSStefano Zampini diff_args: -j 211039c6fbaSStefano Zampini 212039c6fbaSStefano Zampini test: 213039c6fbaSStefano Zampini nsize: 2 214039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 215039c6fbaSStefano Zampini requires: cuda 216039c6fbaSStefano Zampini suffix: 2_par_cuda 217039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 218039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 219039c6fbaSStefano Zampini diff_args: -j 220039c6fbaSStefano Zampini 221f3482364SScott Kruger testset: 222039c6fbaSStefano Zampini nsize: 2 223039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 2243078479eSJunchao Zhang requires: !sycl kokkos_kernels 225039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 226f3482364SScott Kruger args: -view -mat_type aijkokkos -mat_nonsym 227039c6fbaSStefano Zampini diff_args: -j 228f3482364SScott Kruger test: 229f3482364SScott Kruger suffix: 2_par_kokkos_no_gpu_aware 230f3482364SScott Kruger args: -use_gpu_aware_mpi 0 231f3482364SScott Kruger test: 232f3482364SScott Kruger requires: defined(HAVE_MPI_GPU_AWARE) 233f3482364SScott Kruger suffix: 2_par_kokkos_gpu_aware 234f3482364SScott Kruger args: -use_gpu_aware_mpi 1 235c4762a1bSJed Brown 236c4762a1bSJed Brown TEST*/ 237