1c4762a1bSJed Brown 2*039c6fbaSStefano 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 { 8c4762a1bSJed Brown Mat C,C1,C2; /* matrix */ 9c4762a1bSJed Brown PetscScalar v; 10c4762a1bSJed Brown PetscInt Ii,J,Istart,Iend; 11c4762a1bSJed Brown PetscErrorCode ierr; 12*039c6fbaSStefano Zampini PetscInt i,j,m = 3,n; 13*039c6fbaSStefano Zampini PetscMPIInt size; 14c4762a1bSJed Brown PetscBool mat_nonsymmetric = PETSC_FALSE; 15c4762a1bSJed Brown MatInfo info; 16c4762a1bSJed Brown 17c4762a1bSJed Brown ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 18c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr); 19ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 20c4762a1bSJed Brown n = 2*size; 21c4762a1bSJed Brown 22c4762a1bSJed Brown /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */ 23c4762a1bSJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL);CHKERRQ(ierr); 24c4762a1bSJed Brown 25c4762a1bSJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr); 26c4762a1bSJed Brown ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr); 27c4762a1bSJed Brown ierr = MatSetFromOptions(C);CHKERRQ(ierr); 28c4762a1bSJed Brown ierr = MatSeqAIJSetPreallocation(C,5,NULL);CHKERRQ(ierr); 29*039c6fbaSStefano Zampini ierr = MatMPIAIJSetPreallocation(C,5,NULL,5,NULL);CHKERRQ(ierr); 30c4762a1bSJed Brown 31c4762a1bSJed Brown ierr = MatGetOwnershipRange(C,&Istart,&Iend);CHKERRQ(ierr); 32c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 33c4762a1bSJed Brown v = -1.0; i = Ii/n; j = Ii - i*n; 34c4762a1bSJed Brown if (i>0) {J = Ii - n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 35c4762a1bSJed Brown if (i<m-1) {J = Ii + n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 36c4762a1bSJed Brown if (j>0) {J = Ii - 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 37c4762a1bSJed Brown if (j<n-1) {J = Ii + 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 38c4762a1bSJed Brown v = 4.0; ierr = MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);CHKERRQ(ierr); 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; 45c4762a1bSJed Brown if (i>1) {J = Ii-n-1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 46c4762a1bSJed Brown } 47c4762a1bSJed Brown } else { 48c4762a1bSJed Brown ierr = MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr); 49c4762a1bSJed Brown ierr = MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE);CHKERRQ(ierr); 50c4762a1bSJed Brown } 51c4762a1bSJed Brown ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 52c4762a1bSJed Brown ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 53*039c6fbaSStefano Zampini ierr = PetscObjectSetName((PetscObject)C,"C");CHKERRQ(ierr); 54*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C,NULL,"-view");CHKERRQ(ierr); 55c4762a1bSJed Brown 56*039c6fbaSStefano Zampini /* C1 = 2.0*C1 + C, C1 has different non-zeros than C */ 57c4762a1bSJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&C1);CHKERRQ(ierr); 58c4762a1bSJed Brown ierr = MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr); 59c4762a1bSJed Brown ierr = MatSetFromOptions(C1);CHKERRQ(ierr); 60c4762a1bSJed Brown ierr = MatSeqAIJSetPreallocation(C1,1,NULL);CHKERRQ(ierr); 61*039c6fbaSStefano Zampini ierr = MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL);CHKERRQ(ierr); 62c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 63*039c6fbaSStefano Zampini v = 1.0; 64*039c6fbaSStefano Zampini i = m*n - Ii -1; 65*039c6fbaSStefano Zampini j = Ii; 66*039c6fbaSStefano Zampini ierr = MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES);CHKERRQ(ierr); 67c4762a1bSJed Brown } 68c4762a1bSJed Brown ierr = MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 69c4762a1bSJed Brown ierr = MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 70*039c6fbaSStefano Zampini ierr = PetscObjectSetName((PetscObject)C1,"C1");CHKERRQ(ierr); 71*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr); 72c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n");CHKERRQ(ierr); 73c4762a1bSJed Brown ierr = MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 74c4762a1bSJed Brown ierr = MatGetInfo(C1,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 75c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr); 76*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr); 77c4762a1bSJed Brown 78*039c6fbaSStefano Zampini /* Secondly, create C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */ 79c4762a1bSJed Brown ierr = MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2);CHKERRQ(ierr); 80c4762a1bSJed Brown 81c4762a1bSJed Brown for (Ii=Istart; Ii<Iend; Ii++) { 82c4762a1bSJed Brown v = 1.0; 83c4762a1bSJed Brown ierr = MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES);CHKERRQ(ierr); 84c4762a1bSJed Brown } 85c4762a1bSJed Brown ierr = MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 86c4762a1bSJed Brown ierr = MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 87*039c6fbaSStefano Zampini ierr = PetscObjectSetName((PetscObject)C2,"C2");CHKERRQ(ierr); 88*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C2,NULL,"-view");CHKERRQ(ierr); 89*039c6fbaSStefano Zampini ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n");CHKERRQ(ierr); 90*039c6fbaSStefano Zampini ierr = MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr); 91*039c6fbaSStefano Zampini ierr = MatGetInfo(C1,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 92*039c6fbaSStefano Zampini ierr = PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr); 93*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr); 94*039c6fbaSStefano Zampini 95*039c6fbaSStefano Zampini /* Test SAME_NONZERO_PATTERN */ 96*039c6fbaSStefano Zampini ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n");CHKERRQ(ierr); 97c4762a1bSJed Brown ierr = MatAXPY(C2,2.0,C,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr); 98c4762a1bSJed Brown ierr = MatGetInfo(C2,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 99c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr); 100*039c6fbaSStefano Zampini ierr = MatViewFromOptions(C2,NULL,"-view");CHKERRQ(ierr); 101c4762a1bSJed Brown 102c4762a1bSJed Brown ierr = MatDestroy(&C1);CHKERRQ(ierr); 103c4762a1bSJed Brown ierr = MatDestroy(&C2);CHKERRQ(ierr); 104c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 105c4762a1bSJed Brown 106c4762a1bSJed Brown ierr = PetscFinalize(); 107c4762a1bSJed Brown return ierr; 108c4762a1bSJed Brown } 109c4762a1bSJed Brown 110c4762a1bSJed Brown /*TEST 111c4762a1bSJed Brown 112c4762a1bSJed Brown test: 113*039c6fbaSStefano Zampini suffix: 1 114*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 115*039c6fbaSStefano Zampini args: -view 116*039c6fbaSStefano Zampini diff_args: -j 117*039c6fbaSStefano Zampini 118*039c6fbaSStefano Zampini test: 119*039c6fbaSStefano Zampini output_file: output/ex132_1.out 120*039c6fbaSStefano Zampini requires: cuda 121*039c6fbaSStefano Zampini suffix: 1_cuda 122*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 123*039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 124*039c6fbaSStefano Zampini diff_args: -j 125*039c6fbaSStefano Zampini 126*039c6fbaSStefano Zampini test: 127*039c6fbaSStefano Zampini output_file: output/ex132_1.out 128*039c6fbaSStefano Zampini requires: kokkos_kernels 129*039c6fbaSStefano Zampini suffix: 1_kokkos 130*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 131*039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 132*039c6fbaSStefano Zampini diff_args: -j 133*039c6fbaSStefano Zampini 134*039c6fbaSStefano Zampini test: 135*039c6fbaSStefano Zampini suffix: 2 136*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 137*039c6fbaSStefano Zampini args: -view -mat_nonsym 138*039c6fbaSStefano Zampini diff_args: -j 139*039c6fbaSStefano Zampini 140*039c6fbaSStefano Zampini test: 141*039c6fbaSStefano Zampini output_file: output/ex132_2.out 142*039c6fbaSStefano Zampini requires: cuda 143*039c6fbaSStefano Zampini suffix: 2_cuda 144*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 145*039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 146*039c6fbaSStefano Zampini diff_args: -j 147*039c6fbaSStefano Zampini 148*039c6fbaSStefano Zampini test: 149*039c6fbaSStefano Zampini output_file: output/ex132_2.out 150*039c6fbaSStefano Zampini requires: kokkos_kernels 151*039c6fbaSStefano Zampini suffix: 2_kokkos 152*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 153*039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 154*039c6fbaSStefano Zampini diff_args: -j 155*039c6fbaSStefano Zampini 156*039c6fbaSStefano Zampini test: 157*039c6fbaSStefano Zampini nsize: 2 158*039c6fbaSStefano Zampini suffix: 1_par 159*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 160*039c6fbaSStefano Zampini args: -view 161*039c6fbaSStefano Zampini diff_args: -j 162*039c6fbaSStefano Zampini 163*039c6fbaSStefano Zampini test: 164*039c6fbaSStefano Zampini nsize: 2 165*039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 166*039c6fbaSStefano Zampini requires: cuda 167*039c6fbaSStefano Zampini suffix: 1_par_cuda 168*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 169*039c6fbaSStefano Zampini args: -view -mat_type aijcusparse 170*039c6fbaSStefano Zampini diff_args: -j 171*039c6fbaSStefano Zampini 172*039c6fbaSStefano Zampini test: 173*039c6fbaSStefano Zampini nsize: 2 174*039c6fbaSStefano Zampini output_file: output/ex132_1_par.out 175*039c6fbaSStefano Zampini requires: kokkos_kernels 176*039c6fbaSStefano Zampini suffix: 1_par_kokkos 177*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 178*039c6fbaSStefano Zampini args: -view -mat_type aijkokkos 179*039c6fbaSStefano Zampini diff_args: -j 180*039c6fbaSStefano Zampini 181*039c6fbaSStefano Zampini test: 182*039c6fbaSStefano Zampini nsize: 2 183*039c6fbaSStefano Zampini suffix: 2_par 184*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 185*039c6fbaSStefano Zampini args: -view -mat_nonsym 186*039c6fbaSStefano Zampini diff_args: -j 187*039c6fbaSStefano Zampini 188*039c6fbaSStefano Zampini test: 189*039c6fbaSStefano Zampini nsize: 2 190*039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 191*039c6fbaSStefano Zampini requires: cuda 192*039c6fbaSStefano Zampini suffix: 2_par_cuda 193*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 194*039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym 195*039c6fbaSStefano Zampini diff_args: -j 196*039c6fbaSStefano Zampini 197*039c6fbaSStefano Zampini test: 198*039c6fbaSStefano Zampini nsize: 2 199*039c6fbaSStefano Zampini output_file: output/ex132_2_par.out 200*039c6fbaSStefano Zampini requires: kokkos_kernels 201*039c6fbaSStefano Zampini suffix: 2_par_kokkos 202*039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object" 203*039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym 204*039c6fbaSStefano Zampini diff_args: -j 205c4762a1bSJed Brown 206c4762a1bSJed Brown TEST*/ 207