1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Demonstrates the use of fast Richardson for SOR. And tests\n\ 3c4762a1bSJed Brown the MatSOR() routines.\n\n"; 4c4762a1bSJed Brown 5c4762a1bSJed Brown #include <petscpc.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown int main(int argc,char **args) 8c4762a1bSJed Brown { 9c4762a1bSJed Brown Mat mat; 10c4762a1bSJed Brown Vec b,u; 11c4762a1bSJed Brown PC pc; 12c4762a1bSJed Brown PetscInt n = 5,i,col[3]; 13c4762a1bSJed Brown PetscScalar value[3]; 14c4762a1bSJed Brown 15*9566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); 16c4762a1bSJed Brown /* Create vectors */ 17*9566063dSJacob Faibussowitsch PetscCall(VecCreateSeq(PETSC_COMM_SELF,n,&b)); 18*9566063dSJacob Faibussowitsch PetscCall(VecCreateSeq(PETSC_COMM_SELF,n,&u)); 19c4762a1bSJed Brown 20c4762a1bSJed Brown /* Create and assemble matrix */ 21*9566063dSJacob Faibussowitsch PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,n,n,NULL,&mat)); 22c4762a1bSJed Brown value[0] = -1.0; value[1] = 2.0; value[2] = -1.0; 23c4762a1bSJed Brown for (i=1; i<n-1; i++) { 24c4762a1bSJed Brown col[0] = i-1; col[1] = i; col[2] = i+1; 25*9566063dSJacob Faibussowitsch PetscCall(MatSetValues(mat,1,&i,3,col,value,INSERT_VALUES)); 26c4762a1bSJed Brown } 27c4762a1bSJed Brown i = n - 1; col[0] = n - 2; col[1] = n - 1; 28*9566063dSJacob Faibussowitsch PetscCall(MatSetValues(mat,1,&i,2,col,value,INSERT_VALUES)); 29c4762a1bSJed Brown i = 0; col[0] = 0; col[1] = 1; value[0] = 2.0; value[1] = -1.0; 30*9566063dSJacob Faibussowitsch PetscCall(MatSetValues(mat,1,&i,2,col,value,INSERT_VALUES)); 31*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY)); 32*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY)); 33c4762a1bSJed Brown 34c4762a1bSJed Brown /* Create PC context and set up data structures */ 35*9566063dSJacob Faibussowitsch PetscCall(PCCreate(PETSC_COMM_WORLD,&pc)); 36*9566063dSJacob Faibussowitsch PetscCall(PCSetType(pc,PCSOR)); 37*9566063dSJacob Faibussowitsch PetscCall(PCSetFromOptions(pc)); 38*9566063dSJacob Faibussowitsch PetscCall(PCSetOperators(pc,mat,mat)); 39*9566063dSJacob Faibussowitsch PetscCall(PCSetUp(pc)); 40c4762a1bSJed Brown 41c4762a1bSJed Brown value[0] = 1.0; 42c4762a1bSJed Brown for (i=0; i<n; i++) { 43*9566063dSJacob Faibussowitsch PetscCall(VecSet(u,0.0)); 44*9566063dSJacob Faibussowitsch PetscCall(VecSetValues(u,1,&i,value,INSERT_VALUES)); 45*9566063dSJacob Faibussowitsch PetscCall(VecAssemblyBegin(u)); 46*9566063dSJacob Faibussowitsch PetscCall(VecAssemblyEnd(u)); 47*9566063dSJacob Faibussowitsch PetscCall(PCApply(pc,u,b)); 48*9566063dSJacob Faibussowitsch PetscCall(VecView(b,PETSC_VIEWER_STDOUT_SELF)); 49c4762a1bSJed Brown } 50c4762a1bSJed Brown 51c4762a1bSJed Brown /* Free data structures */ 52*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&mat)); 53*9566063dSJacob Faibussowitsch PetscCall(PCDestroy(&pc)); 54*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&u)); 55*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&b)); 56*9566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 57b122ec5aSJacob Faibussowitsch return 0; 58c4762a1bSJed Brown } 59c4762a1bSJed Brown 60c4762a1bSJed Brown /*TEST 61c4762a1bSJed Brown 62c4762a1bSJed Brown test: 63c4762a1bSJed Brown 64c4762a1bSJed Brown TEST*/ 65