1*4e47ed04SStefano Zampini static char help[] = "Test MatSetPreallocationCOO and MatSetValuesCOO\n\n"; 2*4e47ed04SStefano Zampini 3*4e47ed04SStefano Zampini #include <petscmat.h> 4*4e47ed04SStefano Zampini #define MyMatView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),MatView(a,b); 5*4e47ed04SStefano Zampini #define MyVecView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),VecView(a,b); 6*4e47ed04SStefano Zampini int main(int argc,char **args) 7*4e47ed04SStefano Zampini { 8*4e47ed04SStefano Zampini Mat A,At,AAt; 9*4e47ed04SStefano Zampini Vec x,y,z; 10*4e47ed04SStefano Zampini PetscLayout rmap,cmap; 11*4e47ed04SStefano Zampini PetscInt n1 = 11, n2 = 9; 12*4e47ed04SStefano Zampini PetscInt i1[] = { 7, 6, 2, 0, 4, 1, 1, 0, 2, 2, 1 }; 13*4e47ed04SStefano Zampini PetscInt j1[] = { 1, 4, 3, 5, 3, 3, 4, 5, 0, 3, 1 }; 14*4e47ed04SStefano Zampini PetscInt i2[] = { 7, 6, 2, 0, 4, 1, 1, 2, 1 }; 15*4e47ed04SStefano Zampini PetscInt j2[] = { 1, 4, 3, 5, 3, 3, 4, 0, 1 }; 16*4e47ed04SStefano Zampini PetscScalar v1[] = { -1., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; 17*4e47ed04SStefano Zampini PetscScalar v2[] = { 1.,-1.,-2.,-3.,-4.,-5.,-6.,-7.,-8.,-9.,-10.}; 18*4e47ed04SStefano Zampini PetscInt N = 6, m = 8, rstart, cstart, i; 19*4e47ed04SStefano Zampini PetscMPIInt size; 20*4e47ed04SStefano Zampini PetscBool loc = PETSC_FALSE; 21*4e47ed04SStefano Zampini PetscBool locdiag = PETSC_TRUE, ismpiaij; 22*4e47ed04SStefano Zampini PetscErrorCode ierr; 23*4e47ed04SStefano Zampini 24*4e47ed04SStefano Zampini ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 25*4e47ed04SStefano Zampini ierr = PetscOptionsGetBool(NULL,NULL,"-loc",&loc,NULL);CHKERRQ(ierr); 26*4e47ed04SStefano Zampini ierr = PetscOptionsGetBool(NULL,NULL,"-locdiag",&locdiag,NULL);CHKERRQ(ierr); 27*4e47ed04SStefano Zampini 28*4e47ed04SStefano Zampini ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 29*4e47ed04SStefano Zampini if (loc) { 30*4e47ed04SStefano Zampini if (locdiag) { 31*4e47ed04SStefano Zampini ierr = MatSetSizes(A,m,N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 32*4e47ed04SStefano Zampini } else { 33*4e47ed04SStefano Zampini ierr = MatSetSizes(A,m,m+N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 34*4e47ed04SStefano Zampini } 35*4e47ed04SStefano Zampini } else { 36*4e47ed04SStefano Zampini ierr = MatSetSizes(A,m,PETSC_DECIDE,PETSC_DECIDE,N);CHKERRQ(ierr); 37*4e47ed04SStefano Zampini } 38*4e47ed04SStefano Zampini ierr = MatSetFromOptions(A);CHKERRQ(ierr); 39*4e47ed04SStefano Zampini ierr = MatGetLayouts(A,&rmap,&cmap);CHKERRQ(ierr); 40*4e47ed04SStefano Zampini ierr = PetscLayoutSetUp(rmap);CHKERRQ(ierr); 41*4e47ed04SStefano Zampini ierr = PetscLayoutSetUp(cmap);CHKERRQ(ierr); 42*4e47ed04SStefano Zampini ierr = MatCreateVecs(A,&x,&y);CHKERRQ(ierr); 43*4e47ed04SStefano Zampini ierr = MatCreateVecs(A,NULL,&z);CHKERRQ(ierr); 44*4e47ed04SStefano Zampini ierr = VecSet(x,1.);CHKERRQ(ierr); 45*4e47ed04SStefano Zampini ierr = VecSet(z,2.);CHKERRQ(ierr); 46*4e47ed04SStefano Zampini ierr = PetscLayoutGetRange(rmap,&rstart,NULL);CHKERRQ(ierr); 47*4e47ed04SStefano Zampini ierr = PetscLayoutGetRange(cmap,&cstart,NULL);CHKERRQ(ierr); 48*4e47ed04SStefano Zampini for (i = 0; i < n1; i++) i1[i] += rstart; 49*4e47ed04SStefano Zampini for (i = 0; i < n2; i++) i2[i] += rstart; 50*4e47ed04SStefano Zampini if (loc) { 51*4e47ed04SStefano Zampini if (locdiag) { 52*4e47ed04SStefano Zampini for (i = 0; i < n1; i++) j1[i] += cstart; 53*4e47ed04SStefano Zampini for (i = 0; i < n2; i++) j2[i] += cstart; 54*4e47ed04SStefano Zampini } else { 55*4e47ed04SStefano Zampini for (i = 0; i < n1; i++) j1[i] += cstart + m; 56*4e47ed04SStefano Zampini for (i = 0; i < n2; i++) j2[i] += cstart + m; 57*4e47ed04SStefano Zampini } 58*4e47ed04SStefano Zampini } 59*4e47ed04SStefano Zampini 60*4e47ed04SStefano Zampini /* test with repeated entries */ 61*4e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n1,i1,j1);CHKERRQ(ierr); 62*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr); 63*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 64*4e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 65*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 66*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr); 67*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 68*4e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,y);CHKERRQ(ierr); 69*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 70*4e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 71*4e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 72*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 73*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 74*4e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 75*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 76*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 77*4e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 78*4e47ed04SStefano Zampini 79*4e47ed04SStefano Zampini /* test with unique entries */ 80*4e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr); 81*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr); 82*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 83*4e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 84*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 85*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr); 86*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 87*4e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr); 88*4e47ed04SStefano Zampini ierr = MyVecView(z,NULL);CHKERRQ(ierr); 89*4e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr); 90*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v1,INSERT_VALUES);CHKERRQ(ierr); 91*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 92*4e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 93*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 94*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,v2,INSERT_VALUES);CHKERRQ(ierr); 95*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 96*4e47ed04SStefano Zampini ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr); 97*4e47ed04SStefano Zampini ierr = MyVecView(z,NULL);CHKERRQ(ierr); 98*4e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 99*4e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 100*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 101*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 102*4e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 103*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 104*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 105*4e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 106*4e47ed04SStefano Zampini 107*4e47ed04SStefano Zampini /* test providing diagonal first, the offdiagonal */ 108*4e47ed04SStefano Zampini ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr); 109*4e47ed04SStefano Zampini ierr = PetscObjectBaseTypeCompare((PetscObject)A,MATMPIAIJ,&ismpiaij);CHKERRQ(ierr); 110*4e47ed04SStefano Zampini if (ismpiaij && size > 1) { 111*4e47ed04SStefano Zampini Mat lA,lB; 112*4e47ed04SStefano Zampini const PetscInt *garray,*iA,*jA,*iB,*jB; 113*4e47ed04SStefano Zampini const PetscScalar *vA,*vB; 114*4e47ed04SStefano Zampini PetscScalar *coo_v; 115*4e47ed04SStefano Zampini PetscInt *coo_i,*coo_j; 116*4e47ed04SStefano Zampini PetscInt i,j,nA,nB,nnz; 117*4e47ed04SStefano Zampini PetscBool flg; 118*4e47ed04SStefano Zampini 119*4e47ed04SStefano Zampini ierr = MatMPIAIJGetSeqAIJ(A,&lA,&lB,&garray);CHKERRQ(ierr); 120*4e47ed04SStefano Zampini ierr = MatSeqAIJGetArrayRead(lA,&vA);CHKERRQ(ierr); 121*4e47ed04SStefano Zampini ierr = MatSeqAIJGetArrayRead(lB,&vB);CHKERRQ(ierr); 122*4e47ed04SStefano Zampini ierr = MatGetRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr); 123*4e47ed04SStefano Zampini ierr = MatGetRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr); 124*4e47ed04SStefano Zampini nnz = iA[nA] + iB[nB]; 125*4e47ed04SStefano Zampini ierr = PetscMalloc3(nnz,&coo_i,nnz,&coo_j,nnz,&coo_v);CHKERRQ(ierr); 126*4e47ed04SStefano Zampini nnz = 0; 127*4e47ed04SStefano Zampini for (i=0;i<nA;i++) { 128*4e47ed04SStefano Zampini for (j=iA[i];j<iA[i+1];j++,nnz++) { 129*4e47ed04SStefano Zampini coo_i[nnz] = i+rstart; 130*4e47ed04SStefano Zampini coo_j[nnz] = jA[j]+cstart; 131*4e47ed04SStefano Zampini coo_v[nnz] = vA[j]; 132*4e47ed04SStefano Zampini } 133*4e47ed04SStefano Zampini } 134*4e47ed04SStefano Zampini for (i=0;i<nB;i++) { 135*4e47ed04SStefano Zampini for (j=iB[i];j<iB[i+1];j++,nnz++) { 136*4e47ed04SStefano Zampini coo_i[nnz] = i+rstart; 137*4e47ed04SStefano Zampini coo_j[nnz] = garray[jB[j]]; 138*4e47ed04SStefano Zampini coo_v[nnz] = vB[j]; 139*4e47ed04SStefano Zampini } 140*4e47ed04SStefano Zampini } 141*4e47ed04SStefano Zampini ierr = MatRestoreRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr); 142*4e47ed04SStefano Zampini ierr = MatRestoreRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr); 143*4e47ed04SStefano Zampini ierr = MatSeqAIJRestoreArrayRead(lA,&vA);CHKERRQ(ierr); 144*4e47ed04SStefano Zampini ierr = MatSeqAIJRestoreArrayRead(lB,&vB);CHKERRQ(ierr); 145*4e47ed04SStefano Zampini 146*4e47ed04SStefano Zampini ierr = MatSetPreallocationCOO(A,nnz,coo_i,coo_j);CHKERRQ(ierr); 147*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,coo_v,ADD_VALUES);CHKERRQ(ierr); 148*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 149*4e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 150*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 151*4e47ed04SStefano Zampini ierr = MatSetValuesCOO(A,coo_v,INSERT_VALUES);CHKERRQ(ierr); 152*4e47ed04SStefano Zampini ierr = MyMatView(A,NULL);CHKERRQ(ierr); 153*4e47ed04SStefano Zampini ierr = MatMult(A,x,y);CHKERRQ(ierr); 154*4e47ed04SStefano Zampini ierr = MyVecView(y,NULL);CHKERRQ(ierr); 155*4e47ed04SStefano Zampini ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr); 156*4e47ed04SStefano Zampini ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 157*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 158*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 159*4e47ed04SStefano Zampini ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr); 160*4e47ed04SStefano Zampini ierr = MyMatView(AAt,NULL);CHKERRQ(ierr); 161*4e47ed04SStefano Zampini ierr = MatDestroy(&AAt);CHKERRQ(ierr); 162*4e47ed04SStefano Zampini ierr = MatDestroy(&At);CHKERRQ(ierr); 163*4e47ed04SStefano Zampini 164*4e47ed04SStefano Zampini ierr = PetscFree3(coo_i,coo_j,coo_v);CHKERRQ(ierr); 165*4e47ed04SStefano Zampini } 166*4e47ed04SStefano Zampini ierr = VecDestroy(&z);CHKERRQ(ierr); 167*4e47ed04SStefano Zampini ierr = VecDestroy(&x);CHKERRQ(ierr); 168*4e47ed04SStefano Zampini ierr = VecDestroy(&y);CHKERRQ(ierr); 169*4e47ed04SStefano Zampini ierr = MatDestroy(&A);CHKERRQ(ierr); 170*4e47ed04SStefano Zampini ierr = PetscFinalize(); 171*4e47ed04SStefano Zampini return ierr; 172*4e47ed04SStefano Zampini } 173*4e47ed04SStefano Zampini 174*4e47ed04SStefano Zampini 175*4e47ed04SStefano Zampini /*TEST 176*4e47ed04SStefano Zampini 177*4e47ed04SStefano Zampini test: 178*4e47ed04SStefano Zampini suffix: 1 179*4e47ed04SStefano Zampini filter: grep -v type 180*4e47ed04SStefano Zampini diff_args: -j 181*4e47ed04SStefano Zampini args: -mat_type {{seqaij mpiaij}} 182*4e47ed04SStefano Zampini 183*4e47ed04SStefano Zampini test: 184*4e47ed04SStefano Zampini requires: cuda 185*4e47ed04SStefano Zampini suffix: 1_cuda 186*4e47ed04SStefano Zampini filter: grep -v type 187*4e47ed04SStefano Zampini diff_args: -j 188*4e47ed04SStefano Zampini args: -mat_type {{seqaijcusparse mpiaijcusparse}} 189*4e47ed04SStefano Zampini output_file: output/ex123_1.out 190*4e47ed04SStefano Zampini 191*4e47ed04SStefano Zampini test: 192*4e47ed04SStefano Zampini suffix: 2 193*4e47ed04SStefano Zampini nsize: 7 194*4e47ed04SStefano Zampini filter: grep -v type 195*4e47ed04SStefano Zampini diff_args: -j 196*4e47ed04SStefano Zampini args: -mat_type mpiaij 197*4e47ed04SStefano Zampini 198*4e47ed04SStefano Zampini test: 199*4e47ed04SStefano Zampini requires: cuda 200*4e47ed04SStefano Zampini suffix: 2_cuda 201*4e47ed04SStefano Zampini nsize: 7 202*4e47ed04SStefano Zampini filter: grep -v type 203*4e47ed04SStefano Zampini diff_args: -j 204*4e47ed04SStefano Zampini args: -mat_type mpiaijcusparse 205*4e47ed04SStefano Zampini output_file: output/ex123_2.out 206*4e47ed04SStefano Zampini 207*4e47ed04SStefano Zampini test: 208*4e47ed04SStefano Zampini suffix: 3 209*4e47ed04SStefano Zampini nsize: 3 210*4e47ed04SStefano Zampini filter: grep -v type 211*4e47ed04SStefano Zampini diff_args: -j 212*4e47ed04SStefano Zampini args: -mat_type mpiaij -loc 213*4e47ed04SStefano Zampini 214*4e47ed04SStefano Zampini test: 215*4e47ed04SStefano Zampini requires: cuda 216*4e47ed04SStefano Zampini suffix: 3_cuda 217*4e47ed04SStefano Zampini nsize: 3 218*4e47ed04SStefano Zampini filter: grep -v type 219*4e47ed04SStefano Zampini diff_args: -j 220*4e47ed04SStefano Zampini args: -mat_type mpiaijcusparse -loc 221*4e47ed04SStefano Zampini output_file: output/ex123_3.out 222*4e47ed04SStefano Zampini 223*4e47ed04SStefano Zampini test: 224*4e47ed04SStefano Zampini suffix: 4 225*4e47ed04SStefano Zampini nsize: 4 226*4e47ed04SStefano Zampini filter: grep -v type 227*4e47ed04SStefano Zampini diff_args: -j 228*4e47ed04SStefano Zampini args: -mat_type mpiaij -loc -locdiag 0 229*4e47ed04SStefano Zampini 230*4e47ed04SStefano Zampini test: 231*4e47ed04SStefano Zampini requires: cuda 232*4e47ed04SStefano Zampini suffix: 4_cuda 233*4e47ed04SStefano Zampini nsize: 4 234*4e47ed04SStefano Zampini filter: grep -v type 235*4e47ed04SStefano Zampini diff_args: -j 236*4e47ed04SStefano Zampini args: -mat_type mpiaijcusparse -loc -locdiag 0 237*4e47ed04SStefano Zampini output_file: output/ex123_4.out 238*4e47ed04SStefano Zampini 239*4e47ed04SStefano Zampini TEST*/ 240