Actual source code: ex4f90.F90

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

8:       program main
9: #include <petsc/finclude/petscvec.h>
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:        call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
26:        if (ierr /= 0) then
27:          print*,'PetscInitialize failed'
28:          stop
29:        endif

31: !  Create initial vector and duplicate it

33:        call VecCreateSeq(PETSC_COMM_SELF,n,x,ierr);CHKERRA(ierr)
34:        call VecDuplicate(x,y,ierr);CHKERRA(ierr)

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

40:        do 10 i=1,n
41:           loc(i) = i-1
42:           xwork(i) = 10.0*real(i)
43:   10   continue

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

50:        call VecSetValues(x,n,loc,xwork,INSERT_VALUES,ierr);CHKERRA(ierr)

52: !  Assemble vector

54:        call VecAssemblyBegin(x,ierr);CHKERRA(ierr)
55:        call VecAssemblyEnd(x,ierr);CHKERRA(ierr)

57: !  View vector
58:        call PetscObjectSetName(x, 'initial vector:',ierr);CHKERRA(ierr)
59:        call VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr);CHKERRA(ierr)
60:        call VecCopy(x,y,ierr);CHKERRA(ierr)

62: !  Get a pointer to vector data.
63: !    - For default PETSc vectors, VecGetArrayF90() returns a pointer to
64: !      the data array.  Otherwise, the routine is implementation dependent.
65: !    - You MUST call VecRestoreArray() when you no longer need access to
66: !      the array.

68:        call VecGetArrayF90(x,xx_v,ierr);CHKERRA(ierr)
69:        call VecGetArrayF90(y,yy_v,ierr);CHKERRA(ierr)

71: !  Modify vector data

73:        do 30 i=1,n
74:           xx_v(i) = 100.0*real(i)
75:           yy_v(i) = 1000.0*real(i)
76:   30   continue

78: !  Restore vectors

80:        call VecRestoreArrayF90(x,xx_v,ierr);CHKERRA(ierr)
81:        call VecRestoreArrayF90(y,yy_v,ierr);CHKERRA(ierr)

83: !  View vectors
84:        call PetscObjectSetName(x, 'new vector 1:',ierr);CHKERRA(ierr)
85:        call VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr);CHKERRA(ierr)

87:        call PetscObjectSetName(y, 'new vector 2:',ierr);CHKERRA(ierr)
88:        call VecView(y,PETSC_VIEWER_STDOUT_SELF,ierr);CHKERRA(ierr)

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

93:        call VecDestroy(x,ierr);CHKERRA(ierr)
94:        call VecDestroy(y,ierr);CHKERRA(ierr)
95:        call PetscFinalize(ierr)
96:        end

98: !
99: !/*TEST
100: !
101: !     test:
102: !
103: !TEST*/
```