14e47ed04SStefano Zampini static char help[] = "Test MatSetPreallocationCOO and MatSetValuesCOO\n\n"; 24e47ed04SStefano Zampini 34e47ed04SStefano Zampini #include <petscmat.h> 44e47ed04SStefano Zampini #define MyMatView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),MatView(a,b); 54e47ed04SStefano Zampini #define MyVecView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),VecView(a,b); 64e47ed04SStefano Zampini int main(int argc,char **args) 74e47ed04SStefano Zampini { 84e47ed04SStefano Zampini Mat A,At,AAt; 94e47ed04SStefano Zampini Vec x,y,z; 104e47ed04SStefano Zampini PetscLayout rmap,cmap; 114e47ed04SStefano Zampini PetscInt n1 = 11, n2 = 9; 124e47ed04SStefano Zampini PetscInt i1[] = { 7, 6, 2, 0, 4, 1, 1, 0, 2, 2, 1 }; 134e47ed04SStefano Zampini PetscInt j1[] = { 1, 4, 3, 5, 3, 3, 4, 5, 0, 3, 1 }; 144e47ed04SStefano Zampini PetscInt i2[] = { 7, 6, 2, 0, 4, 1, 1, 2, 1 }; 154e47ed04SStefano Zampini PetscInt j2[] = { 1, 4, 3, 5, 3, 3, 4, 0, 1 }; 164e47ed04SStefano Zampini PetscScalar v1[] = { -1., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; 174e47ed04SStefano Zampini PetscScalar v2[] = { 1.,-1.,-2.,-3.,-4.,-5.,-6.,-7.,-8.,-9.,-10.}; 184e47ed04SStefano Zampini PetscInt N = 6, m = 8, rstart, cstart, i; 194e47ed04SStefano Zampini PetscMPIInt size; 204e47ed04SStefano Zampini PetscBool loc = PETSC_FALSE; 214e47ed04SStefano Zampini PetscBool locdiag = PETSC_TRUE, ismpiaij; 224e47ed04SStefano Zampini PetscErrorCode ierr; 234e47ed04SStefano Zampini 244e47ed04SStefano Zampini ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 254e47ed04SStefano Zampini ierr = PetscOptionsGetBool(NULL,NULL,"-loc",&loc,NULL);CHKERRQ(ierr); 264e47ed04SStefano Zampini ierr = PetscOptionsGetBool(NULL,NULL,"-locdiag",&locdiag,NULL);CHKERRQ(ierr); 274e47ed04SStefano Zampini 284e47ed04SStefano Zampini ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 294e47ed04SStefano Zampini if (loc) { 304e47ed04SStefano Zampini if (locdiag) { 314e47ed04SStefano Zampini ierr = MatSetSizes(A,m,N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 324e47ed04SStefano Zampini } else { 334e47ed04SStefano Zampini ierr = MatSetSizes(A,m,m+N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 344e47ed04SStefano Zampini } 354e47ed04SStefano Zampini } else { 364e47ed04SStefano Zampini ierr = MatSetSizes(A,m,PETSC_DECIDE,PETSC_DECIDE,N);CHKERRQ(ierr); 374e47ed04SStefano Zampini } 384e47ed04SStefano Zampini ierr = MatSetFromOptions(A);CHKERRQ(ierr); 394e47ed04SStefano Zampini ierr = MatGetLayouts(A,&rmap,&cmap);CHKERRQ(ierr); 404e47ed04SStefano Zampini ierr = PetscLayoutSetUp(rmap);CHKERRQ(ierr); 414e47ed04SStefano Zampini ierr = PetscLayoutSetUp(cmap);CHKERRQ(ierr); 424e47ed04SStefano Zampini ierr = MatCreateVecs(A,&x,&y);CHKERRQ(ierr); 434e47ed04SStefano Zampini ierr = MatCreateVecs(A,NULL,&z);CHKERRQ(ierr); 444e47ed04SStefano Zampini ierr = VecSet(x,1.);CHKERRQ(ierr); 454e47ed04SStefano Zampini ierr = VecSet(z,2.);CHKERRQ(ierr); 464e47ed04SStefano Zampini ierr = PetscLayoutGetRange(rmap,&rstart,NULL);CHKERRQ(ierr); 474e47ed04SStefano Zampini ierr = PetscLayoutGetRange(cmap,&cstart,NULL);CHKERRQ(ierr); 484e47ed04SStefano Zampini for (i = 0; i < n1; i++) i1[i] += rstart; 494e47ed04SStefano Zampini for (i = 0; i < n2; i++) i2[i] += rstart; 504e47ed04SStefano Zampini if (loc) { 514e47ed04SStefano Zampini if (locdiag) { 524e47ed04SStefano Zampini for (i = 0; i < n1; i++) j1[i] += cstart; 534e47ed04SStefano Zampini for (i = 0; i < n2; i++) j2[i] += cstart; 544e47ed04SStefano Zampini } else { 554e47ed04SStefano Zampini for (i = 0; i < n1; i++) j1[i] += cstart + m; 564e47ed04SStefano Zampini for (i = 0; i < n2; i++) j2[i] += cstart + m; 574e47ed04SStefano Zampini } 584e47ed04SStefano Zampini } 594e47ed04SStefano Zampini 604e47ed04SStefano Zampini /* test with repeated entries */ 614e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n1,i1,j1);CHKERRQ(ierr); 624e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr); 634e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 644e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 654e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 664e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr); 674e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 684e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,y);CHKERRQ(ierr); 694e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 704e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 714e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 724e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 734e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 744e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 754e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 764e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 774e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 78e61fc153SStefano Zampini /* INSERT_VALUES will overwrite matrix entries but 79e61fc153SStefano Zampini still perform the sum of the repeated entries */ 80e61fc153SStefano Zampini ierr = MatSetValuesCOO(A,v2,INSERT_VALUES);CHKERRQ(ierr); 81e61fc153SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 824e47ed04SStefano Zampini 834e47ed04SStefano Zampini /* test with unique entries */ 844e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr); 854e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr); 864e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 874e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 884e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 894e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr); 904e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 914e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr); 924e47ed04SStefano Zampini ierr = MyVecView(z,NULL);CHKERRQ(ierr); 934e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr); 944e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,INSERT_VALUES);CHKERRQ(ierr); 954e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 964e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 974e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 984e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,INSERT_VALUES);CHKERRQ(ierr); 994e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 1004e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr); 1014e47ed04SStefano Zampini ierr = MyVecView(z,NULL);CHKERRQ(ierr); 1024e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 1034e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 1044e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 1054e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 1064e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 1074e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 1084e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 1094e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 1104e47ed04SStefano Zampini 1114e47ed04SStefano Zampini /* test providing diagonal first, the offdiagonal */ 11255b25c41SPierre Jolivet ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRMPI(ierr); 1134e47ed04SStefano Zampini ierr = PetscObjectBaseTypeCompare((PetscObject)A,MATMPIAIJ,&ismpiaij);CHKERRQ(ierr); 1144e47ed04SStefano Zampini if (ismpiaij && size > 1) { 1154e47ed04SStefano Zampini Mat lA,lB; 1164e47ed04SStefano Zampini const PetscInt *garray,*iA,*jA,*iB,*jB; 1174e47ed04SStefano Zampini const PetscScalar *vA,*vB; 1184e47ed04SStefano Zampini PetscScalar *coo_v; 1194e47ed04SStefano Zampini PetscInt *coo_i,*coo_j; 1204e47ed04SStefano Zampini PetscInt i,j,nA,nB,nnz; 1214e47ed04SStefano Zampini PetscBool flg; 1224e47ed04SStefano Zampini 1234e47ed04SStefano Zampini ierr = MatMPIAIJGetSeqAIJ(A,&lA,&lB,&garray);CHKERRQ(ierr); 1244e47ed04SStefano Zampini ierr = MatSeqAIJGetArrayRead(lA,&vA);CHKERRQ(ierr); 1254e47ed04SStefano Zampini ierr = MatSeqAIJGetArrayRead(lB,&vB);CHKERRQ(ierr); 1264e47ed04SStefano Zampini ierr = MatGetRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr); 1274e47ed04SStefano Zampini ierr = MatGetRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr); 1284e47ed04SStefano Zampini nnz = iA[nA] + iB[nB]; 1294e47ed04SStefano Zampini ierr = PetscMalloc3(nnz,&coo_i,nnz,&coo_j,nnz,&coo_v);CHKERRQ(ierr); 1304e47ed04SStefano Zampini nnz = 0; 1314e47ed04SStefano Zampini for (i=0;i<nA;i++) { 1324e47ed04SStefano Zampini for (j=iA[i];j<iA[i+1];j++,nnz++) { 1334e47ed04SStefano Zampini coo_i[nnz] = i+rstart; 1344e47ed04SStefano Zampini coo_j[nnz] = jA[j]+cstart; 1354e47ed04SStefano Zampini coo_v[nnz] = vA[j]; 1364e47ed04SStefano Zampini } 1374e47ed04SStefano Zampini } 1384e47ed04SStefano Zampini for (i=0;i<nB;i++) { 1394e47ed04SStefano Zampini for (j=iB[i];j<iB[i+1];j++,nnz++) { 1404e47ed04SStefano Zampini coo_i[nnz] = i+rstart; 1414e47ed04SStefano Zampini coo_j[nnz] = garray[jB[j]]; 1424e47ed04SStefano Zampini coo_v[nnz] = vB[j]; 1434e47ed04SStefano Zampini } 1444e47ed04SStefano Zampini } 1454e47ed04SStefano Zampini ierr = MatRestoreRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr); 1464e47ed04SStefano Zampini ierr = MatRestoreRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr); 1474e47ed04SStefano Zampini ierr = MatSeqAIJRestoreArrayRead(lA,&vA);CHKERRQ(ierr); 1484e47ed04SStefano Zampini ierr = MatSeqAIJRestoreArrayRead(lB,&vB);CHKERRQ(ierr); 1494e47ed04SStefano Zampini 1504e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,nnz,coo_i,coo_j);CHKERRQ(ierr); 1514e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,coo_v,ADD_VALUES);CHKERRQ(ierr); 1524e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 1534e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 1544e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 1554e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,coo_v,INSERT_VALUES);CHKERRQ(ierr); 1564e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 1574e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 1584e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 1594e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 1604e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 1614e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 1624e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 1634e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 1644e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 1654e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 1664e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 1674e47ed04SStefano Zampini 1684e47ed04SStefano Zampini ierr = PetscFree3(coo_i,coo_j,coo_v);CHKERRQ(ierr); 1694e47ed04SStefano Zampini } 1704e47ed04SStefano Zampini ierr = VecDestroy(&z);CHKERRQ(ierr); 1714e47ed04SStefano Zampini ierr = VecDestroy(&x);CHKERRQ(ierr); 1724e47ed04SStefano Zampini ierr = VecDestroy(&y);CHKERRQ(ierr); 1734e47ed04SStefano Zampini ierr = MatDestroy(&A);CHKERRQ(ierr); 1744e47ed04SStefano Zampini ierr = PetscFinalize(); 1754e47ed04SStefano Zampini return ierr; 1764e47ed04SStefano Zampini } 1774e47ed04SStefano Zampini 1784e47ed04SStefano Zampini /*TEST 1794e47ed04SStefano Zampini 1804e47ed04SStefano Zampini test: 1814e47ed04SStefano Zampini suffix: 1 1824e47ed04SStefano Zampini filter: grep -v type 1834e47ed04SStefano Zampini diff_args: -j 1844e47ed04SStefano Zampini args: -mat_type {{seqaij mpiaij}} 1854e47ed04SStefano Zampini 1864e47ed04SStefano Zampini test: 1874e47ed04SStefano Zampini requires: cuda 1884e47ed04SStefano Zampini suffix: 1_cuda 1894e47ed04SStefano Zampini filter: grep -v type 1904e47ed04SStefano Zampini diff_args: -j 1914e47ed04SStefano Zampini args: -mat_type {{seqaijcusparse mpiaijcusparse}} 1924e47ed04SStefano Zampini output_file: output/ex123_1.out 1934e47ed04SStefano Zampini 1944e47ed04SStefano Zampini test: 1954e47ed04SStefano Zampini suffix: 2 1964e47ed04SStefano Zampini nsize: 7 1974e47ed04SStefano Zampini filter: grep -v type 1984e47ed04SStefano Zampini diff_args: -j 1994e47ed04SStefano Zampini args: -mat_type mpiaij 2004e47ed04SStefano Zampini 2014e47ed04SStefano Zampini test: 2024e47ed04SStefano Zampini requires: cuda 2034e47ed04SStefano Zampini suffix: 2_cuda 2044e47ed04SStefano Zampini nsize: 7 2054e47ed04SStefano Zampini filter: grep -v type 2064e47ed04SStefano Zampini diff_args: -j 2074e47ed04SStefano Zampini args: -mat_type mpiaijcusparse 2084e47ed04SStefano Zampini output_file: output/ex123_2.out 2094e47ed04SStefano Zampini 2104e47ed04SStefano Zampini test: 2114e47ed04SStefano Zampini suffix: 3 2124e47ed04SStefano Zampini nsize: 3 2134e47ed04SStefano Zampini filter: grep -v type 2144e47ed04SStefano Zampini diff_args: -j 2154e47ed04SStefano Zampini args: -mat_type mpiaij -loc 2164e47ed04SStefano Zampini 2174e47ed04SStefano Zampini test: 2184e47ed04SStefano Zampini requires: cuda 2194e47ed04SStefano Zampini suffix: 3_cuda 2204e47ed04SStefano Zampini nsize: 3 2214e47ed04SStefano Zampini filter: grep -v type 2224e47ed04SStefano Zampini diff_args: -j 2234e47ed04SStefano Zampini args: -mat_type mpiaijcusparse -loc 2244e47ed04SStefano Zampini output_file: output/ex123_3.out 2254e47ed04SStefano Zampini 2264e47ed04SStefano Zampini test: 2274e47ed04SStefano Zampini suffix: 4 2284e47ed04SStefano Zampini nsize: 4 2294e47ed04SStefano Zampini filter: grep -v type 2304e47ed04SStefano Zampini diff_args: -j 2314e47ed04SStefano Zampini args: -mat_type mpiaij -loc -locdiag 0 2324e47ed04SStefano Zampini 2334e47ed04SStefano Zampini test: 2344e47ed04SStefano Zampini requires: cuda 2354e47ed04SStefano Zampini suffix: 4_cuda 2364e47ed04SStefano Zampini nsize: 4 2374e47ed04SStefano Zampini filter: grep -v type 2384e47ed04SStefano Zampini diff_args: -j 2394e47ed04SStefano Zampini args: -mat_type mpiaijcusparse -loc -locdiag 0 2404e47ed04SStefano Zampini output_file: output/ex123_4.out 2414e47ed04SStefano Zampini 242*42550becSJunchao Zhang test: 243*42550becSJunchao Zhang requires: !sycl kokkos_kernels 244*42550becSJunchao Zhang suffix: 3_kokkos 245*42550becSJunchao Zhang nsize: 3 246*42550becSJunchao Zhang filter: grep -v type 247*42550becSJunchao Zhang diff_args: -j 248*42550becSJunchao Zhang args: -mat_type aijkokkos -loc 249*42550becSJunchao Zhang output_file: output/ex123_3.out 250*42550becSJunchao Zhang 251*42550becSJunchao Zhang test: 252*42550becSJunchao Zhang requires: !sycl kokkos_kernels 253*42550becSJunchao Zhang suffix: 4_kokkos 254*42550becSJunchao Zhang nsize: 4 255*42550becSJunchao Zhang filter: grep -v type 256*42550becSJunchao Zhang diff_args: -j 257*42550becSJunchao Zhang args: -mat_type aijkokkos -loc -locdiag 0 258*42550becSJunchao Zhang output_file: output/ex123_4.out 259*42550becSJunchao Zhang 2604e47ed04SStefano Zampini TEST*/ 261