xref: /petsc/src/mat/tests/ex123.c (revision 42550bec5353b99bbf937a3bdb81525a3b04a032)
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