Actual source code: ex44f.F90

petsc-3.4.5 2014-06-29
  1:       program main   !   Solves the linear system  J x = f
  2: #include <finclude/petscdef.h>
  3:       use petscksp; use petscdm
  4:       Vec x,f
  5:       Mat J
  6:       DM da
  7:       KSP ksp
  8:       PetscErrorCode ierr
  9:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

 11:       call DMDACreate1d(MPI_COMM_WORLD,DMDA_BOUNDARY_NONE,8,1,1,        &
 12:      &  PETSC_NULL_INTEGER,da,ierr)
 13:       call DMCreateGlobalVector(da,x,ierr)
 14:       call VecDuplicate(x,f,ierr)
 15:       call DMCreateMatrix(da,MATAIJ,J,ierr)

 17:       call ComputeRHS(da,f,ierr)
 18:       call ComputeMatrix(da,J,ierr)

 20:       call KSPCreate(MPI_COMM_WORLD,ksp,ierr)
 21:       call KSPSetOperators(ksp,J,J,SAME_NONZERO_PATTERN,ierr)
 22:       call KSPSetFromOptions(ksp,ierr)
 23:       call KSPSolve(ksp,f,x,ierr)

 25:       call MatDestroy(J,ierr)
 26:       call VecDestroy(x,ierr)
 27:       call VecDestroy(f,ierr)
 28:       call KSPDestroy(ksp,ierr)
 29:       call DMDestroy(da,ierr)
 30:       call PetscFinalize(ierr)
 31:       end
 32:       subroutine  ComputeRHS(da,x,ierr)
 33: #include <finclude/petscdef.h>
 34:       use petscdm
 35:       DM da
 36:       Vec x
 37:       PetscErrorCode ierr
 38:       PetscInt xs,xm,i,mx
 39:       PetscScalar hx
 40:       PetscScalar, pointer :: xx(:)
 41:       call DMDAGetInfo(da,PETSC_NULL_INTEGER,mx,PETSC_NULL_INTEGER,     &
 42:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 43:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 44:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 45:      &  PETSC_NULL_INTEGER,ierr)
 46:       call DMDAGetCorners(da,xs,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,  &
 47:      &  xm,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ierr)
 48:       hx     = 1.d0/(mx-1)
 49:       call VecGetArrayF90(x,xx,ierr)
 50:       do i=xs,xs+xm-1
 51:           xx(i) = i*hx
 52:       enddo
 53:       call VecRestoreArrayF90(x,xx,ierr)
 54:       return
 55:       end
 56:       subroutine ComputeMatrix(da,J,ierr)
 57: #include <finclude/petscdef.h>
 58:       use petscdm
 59:       Mat J
 60:       DM da
 61:       PetscErrorCode ierr
 62:       PetscInt xs,xm,i,mx
 63:       PetscScalar hx
 64:       call DMDAGetInfo(da,PETSC_NULL_INTEGER,mx,PETSC_NULL_INTEGER,     &
 65:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 66:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 67:      &  PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,       &
 68:      &  PETSC_NULL_INTEGER,ierr)
 69:       call DMDAGetCorners(da,xs,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,  &
 70:      &  xm,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ierr)
 71:       hx     = 1.d0/(mx-1)
 72:       do i=xs,xs+xm-1
 73:         if ((i .eq. 0) .or. (i .eq. mx-1)) then
 74:           call MatSetValue(J,i,i,1d0,INSERT_VALUES,ierr)
 75:         else
 76:           call MatSetValue(J,i,i-1,-hx,INSERT_VALUES,ierr)
 77:           call MatSetValue(J,i,i+1,-hx,INSERT_VALUES,ierr)
 78:           call MatSetValue(J,i,i,2*hx,INSERT_VALUES,ierr)
 79:         endif
 80:       enddo
 81:       call MatAssemblyBegin(J,MAT_FINAL_ASSEMBLY,ierr)
 82:       call MatAssemblyEnd(J,MAT_FINAL_ASSEMBLY,ierr)
 83:       return
 84:       end