Date: 2026-07-30T21:14:35+00:00

Actual source code: ex4f90.F90

      1: !
      2: !
      3: !  Description:  Illustrates the use of VecSetValues() to set
      4: !  multiple values at once; demonstrates VecGetArray().
      5: !
      6: ! -----------------------------------------------------------------------

      8: #include <petsc/finclude/petscvec.h>
      9: program main
     10:   use petscvec
     11:   implicit none

     13: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     14: !                 Beginning of program
     15: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     17:   PetscInt, parameter :: n = 6
     18:   PetscScalar, dimension(n) ::  xwork
     19:   PetscScalar, pointer, dimension(:) ::  xx_v, yy_v
     20:   PetscInt, dimension(n) :: loc
     21:   PetscInt i
     22:   PetscErrorCode ierr
     23:   Vec x, y

     25:   PetscCallA(PetscInitialize(ierr))

     27: !  Create initial vector and duplicate it

     29:   PetscCallA(VecCreateSeq(PETSC_COMM_SELF, n, x, ierr))
     30:   PetscCallA(VecDuplicate(x, y, ierr))

     32: !  Fill work arrays with vector entries and locations.  Note that
     33: !  the vector indices are 0-based in PETSc (for both Fortran and
     34: !  C vectors)

     36:   do i = 1, n
     37:     loc(i) = i - 1
     38:     xwork(i) = 10.0*real(i)
     39:   end do

     41: !  Set vector values.  Note that we set multiple entries at once.
     42: !  Of course, usually one would create a work array that is the
     43: !  natural size for a particular problem (not one that is as long
     44: !  as the full vector).

     46:   PetscCallA(VecSetValues(x, n, loc, xwork, INSERT_VALUES, ierr))

     48: !  Assemble vector

     50:   PetscCallA(VecAssemblyBegin(x, ierr))
     51:   PetscCallA(VecAssemblyEnd(x, ierr))

     53: !  View vector
     54:   PetscCallA(PetscObjectSetName(x, 'initial vector:', ierr))
     55:   PetscCallA(VecView(x, PETSC_VIEWER_STDOUT_SELF, ierr))
     56:   PetscCallA(VecCopy(x, y, ierr))

     58: !  Get a pointer to vector data.
     59: !    - For default PETSc vectors, VecGetArray() returns a pointer to
     60: !      the data array.  Otherwise, the routine is implementation dependent.
     61: !    - You MUST call VecRestoreArray() when you no longer need access to
     62: !      the array.

     64:   PetscCallA(VecGetArray(x, xx_v, ierr))
     65:   PetscCallA(VecGetArray(y, yy_v, ierr))

     67: !  Modify vector data

     69:   do i = 1, n
     70:     xx_v(i) = 100.0*real(i)
     71:     yy_v(i) = 1000.0*real(i)
     72:   end do

     74: !  Restore vectors

     76:   PetscCallA(VecRestoreArray(x, xx_v, ierr))
     77:   PetscCallA(VecRestoreArray(y, yy_v, ierr))

     79: !  View vectors
     80:   PetscCallA(PetscObjectSetName(x, 'new vector 1:', ierr))
     81:   PetscCallA(VecView(x, PETSC_VIEWER_STDOUT_SELF, ierr))

     83:   PetscCallA(PetscObjectSetName(y, 'new vector 2:', ierr))
     84:   PetscCallA(VecView(y, PETSC_VIEWER_STDOUT_SELF, ierr))

     86: !  Free work space.  All PETSc objects should be destroyed when they
     87: !  are no longer needed.

     89:   PetscCallA(VecDestroy(x, ierr))
     90:   PetscCallA(VecDestroy(y, ierr))
     91:   PetscCallA(PetscFinalize(ierr))
     92: end

     94: !
     95: !/*TEST
     96: !
     97: !     test:
     98: !
     99: !TEST*/