Actual source code: ex19f.F90

  1: !
  2: !
  3: #include <petsc/finclude/petscvec.h>
  4: program main
  5:   use petscvec
  6:   implicit none
  7: !
  8: !  This example demonstrates basic use of the PETSc Fortran interface
  9: !  to vectors.
 10: !
 11:   PetscInt n
 12:   PetscErrorCode ierr
 13:   PetscBool flg
 14:   PetscScalar dot
 15:   PetscScalar, parameter :: one = 1.0, two = 2.0, three = 3.0
 16:   PetscReal norm, rdot
 17:   Vec x, y, w
 18:   PetscOptions options

 20:   PetscCallA(PetscInitialize(ierr))
 21:   PetscCallA(PetscOptionsCreate(options, ierr))
 22:   n = 20
 23:   PetscCallA(PetscOptionsGetInt(options, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))
 24:   PetscCallA(PetscOptionsDestroy(options, ierr))

 26: ! Create a vector, then duplicate it
 27:   PetscCallA(VecCreate(PETSC_COMM_WORLD, x, ierr))
 28:   PetscCallA(VecSetSizes(x, PETSC_DECIDE, n, ierr))
 29:   PetscCallA(VecSetFromOptions(x, ierr))
 30:   PetscCallA(VecDuplicate(x, y, ierr))
 31:   PetscCallA(VecDuplicate(x, w, ierr))

 33:   PetscCallA(VecSet(x, one, ierr))
 34:   PetscCallA(VecSet(y, two, ierr))

 36:   PetscCallA(VecDot(x, y, dot, ierr))
 37:   rdot = PetscRealPart(dot)
 38:   write (6, 100) rdot
 39: 100 format('Result of inner product ', f10.4)

 41:   PetscCallA(VecScale(x, two, ierr))
 42:   PetscCallA(VecNorm(x, NORM_2, norm, ierr))
 43:   write (6, 110) norm
 44: 110 format('Result of scaling ', f10.4)

 46:   PetscCallA(VecCopy(x, w, ierr))
 47:   PetscCallA(VecNorm(w, NORM_2, norm, ierr))
 48:   write (6, 120) norm
 49: 120 format('Result of copy ', f10.4)

 51:   PetscCallA(VecAXPY(y, three, x, ierr))
 52:   PetscCallA(VecNorm(y, NORM_2, norm, ierr))
 53:   write (6, 130) norm
 54: 130 format('Result of axpy ', f10.4)

 56:   PetscCallA(VecDestroy(x, ierr))
 57:   PetscCallA(VecDestroy(y, ierr))
 58:   PetscCallA(VecDestroy(w, ierr))
 59:   PetscCallA(PetscFinalize(ierr))
 60: end

 62: !/*TEST
 63: !
 64: !     test:
 65: !
 66: !TEST*/