xref: /petsc/src/mat/tests/ex24.c (revision dfd57a172ac9fa6c7b5fe6de6ab5df85cefc2996)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests the different MatColoring implementatons and ISColoringTestValid() \n\
3c4762a1bSJed Brown                       Modifed from the code contributed by Ali Berk Kahraman. \n\n";
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown PetscErrorCode FormJacobian(Mat A)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   PetscErrorCode ierr;
9c4762a1bSJed Brown   PetscInt       M,ownbegin,ownend,i,j;
10c4762a1bSJed Brown   PetscScalar    dummy=0.0;
11c4762a1bSJed Brown 
12c4762a1bSJed Brown   PetscFunctionBeginUser;
13c4762a1bSJed Brown   ierr = MatGetSize(A,&M,NULL);CHKERRQ(ierr);
14c4762a1bSJed Brown   ierr = MatGetOwnershipRange(A,&ownbegin,&ownend);CHKERRQ(ierr);
15c4762a1bSJed Brown 
16c4762a1bSJed Brown   for (i=ownbegin; i<ownend; i++) {
17c4762a1bSJed Brown     for (j=i-3; j<i+3; j++) {
18c4762a1bSJed Brown       if (j >= 0 && j < M) {
19c4762a1bSJed Brown         ierr = MatSetValues(A,1,&i,1,&j,&dummy,INSERT_VALUES);CHKERRQ(ierr);
20c4762a1bSJed Brown       }
21c4762a1bSJed Brown     }
22c4762a1bSJed Brown   }
23c4762a1bSJed Brown   ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
24c4762a1bSJed Brown   ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
25c4762a1bSJed Brown   PetscFunctionReturn(0);
26c4762a1bSJed Brown }
27c4762a1bSJed Brown 
28c4762a1bSJed Brown int main(int argc, char *argv[])
29c4762a1bSJed Brown {
30c4762a1bSJed Brown   PetscErrorCode ierr;
31c4762a1bSJed Brown   Mat            J;
32c4762a1bSJed Brown   PetscMPIInt    size;
33c4762a1bSJed Brown   PetscInt       M=8;
34c4762a1bSJed Brown   ISColoring     iscoloring;
35c4762a1bSJed Brown   MatColoring    coloring;
36c4762a1bSJed Brown 
37c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
38ffc4695bSBarry Smith   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
39c4762a1bSJed Brown 
40c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&J);CHKERRQ(ierr);
41c4762a1bSJed Brown   ierr = MatSetSizes(J, PETSC_DECIDE, PETSC_DECIDE, M, M);CHKERRQ(ierr);
42c4762a1bSJed Brown   ierr = MatSetFromOptions(J);CHKERRQ(ierr);
43c4762a1bSJed Brown   ierr = MatSetUp(J);CHKERRQ(ierr);
44c4762a1bSJed Brown 
45c4762a1bSJed Brown   ierr = FormJacobian(J);CHKERRQ(ierr);
46c4762a1bSJed Brown   ierr = MatView(J,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
47c4762a1bSJed Brown 
48c4762a1bSJed Brown   /*
49c4762a1bSJed Brown     Color the matrix, i.e. determine groups of columns that share no common
50c4762a1bSJed Brown     rows. These columns in the Jacobian can all be computed simultaneously.
51c4762a1bSJed Brown    */
52c4762a1bSJed Brown   ierr = MatColoringCreate(J, &coloring);CHKERRQ(ierr);
53c4762a1bSJed Brown   ierr = MatColoringSetType(coloring,MATCOLORINGGREEDY);CHKERRQ(ierr);
54c4762a1bSJed Brown   ierr = MatColoringSetFromOptions(coloring);CHKERRQ(ierr);
55c4762a1bSJed Brown   ierr = MatColoringApply(coloring, &iscoloring);CHKERRQ(ierr);
56c4762a1bSJed Brown 
57c4762a1bSJed Brown   if (size == 1) {
58c4762a1bSJed Brown     ierr = MatISColoringTest(J,iscoloring);CHKERRQ(ierr);
59c4762a1bSJed Brown   }
60c4762a1bSJed Brown 
61c4762a1bSJed Brown   ierr = ISColoringDestroy(&iscoloring);CHKERRQ(ierr);
62c4762a1bSJed Brown   ierr = MatColoringDestroy(&coloring);CHKERRQ(ierr);
63c4762a1bSJed Brown   ierr = MatDestroy(&J);CHKERRQ(ierr);
64c4762a1bSJed Brown   ierr = PetscFinalize();
65c4762a1bSJed Brown   return ierr;
66c4762a1bSJed Brown }
67c4762a1bSJed Brown 
68c4762a1bSJed Brown /*TEST
69c4762a1bSJed Brown 
70c4762a1bSJed Brown    test:
71c4762a1bSJed Brown       suffix: sl
72*dfd57a17SPierre Jolivet       requires: !complex double !defined(PETSC_USE_64BIT_INDICES)
73c4762a1bSJed Brown       args: -mat_coloring_type sl
74c4762a1bSJed Brown       output_file: output/ex24_1.out
75c4762a1bSJed Brown 
76c4762a1bSJed Brown    test:
77c4762a1bSJed Brown       suffix: lf
78*dfd57a17SPierre Jolivet       requires: !complex double !defined(PETSC_USE_64BIT_INDICES)
79c4762a1bSJed Brown       args: -mat_coloring_type lf
80c4762a1bSJed Brown       output_file: output/ex24_1.out
81c4762a1bSJed Brown 
82c4762a1bSJed Brown    test:
83c4762a1bSJed Brown       suffix: id
84*dfd57a17SPierre Jolivet       requires: !complex double !defined(PETSC_USE_64BIT_INDICES)
85c4762a1bSJed Brown       args: -mat_coloring_type id
86c4762a1bSJed Brown       output_file: output/ex24_1.out
87c4762a1bSJed Brown 
88c4762a1bSJed Brown TEST*/
89