Date: 2022-03-04T17:37:29+00:00

Actual source code: ex4f.F

      1: !
      2: !
      3: !  Description:  Illustrates the use of VecSetValues() to set
      4: !  multiple values at once; demonstrates VecGetArray().
      5: !
      6: !/*T
      7: !   Concepts: vectors^assembling;
      8: !   Concepts: vectors^arrays of vectors;
      9: !   Processors: 1
     10: !T*/
     11: ! -----------------------------------------------------------------------

     13:       program main
     14: #include <petsc/finclude/petscvec.h>
     15:       use petscvec
     16:       implicit none

     18: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     19: !                   Macro definitions
     20: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     21: !
     22: !  Macros to make clearer the process of setting values in vectors and
     23: !  getting values from vectors.
     24: !
     25: !   - The element xx_a(ib) is element ib+1 in the vector x
     26: !   - Here we add 1 to the base array index to facilitate the use of
     27: !     conventional Fortran 1-based array indexing.
     28: !
     29: #define xx_a(ib)  xx_v(xx_i + (ib))
     30: #define yy_a(ib)  yy_v(yy_i + (ib))

     32: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     33: !                 Beginning of program
     34: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     36:        PetscScalar xwork(6)
     37:        PetscScalar xx_v(1),yy_v(1)
     38:        PetscInt     i,n,loc(6),isix
     39:        PetscErrorCode ierr
     40:        PetscOffset xx_i,yy_i
     41:        Vec         x,y

     43:        call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     44:        if (ierr .ne. 0) then
     45:          print*,'PetscInitialize failed'
     46:          stop
     47:        endif
     48:        n = 6
     49:        isix = 6

     51: !  Create initial vector and duplicate it

     53:        call VecCreateSeq(PETSC_COMM_SELF,n,x,ierr)
     54:        call VecDuplicate(x,y,ierr)

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

     60:        do 10 i=1,n
     61:           loc(i) = i-1
     62:           xwork(i) = 10.0*real(i)
     63:   10   continue

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

     70:        call VecSetValues(x,isix,loc,xwork,INSERT_VALUES,ierr)

     72: !  Assemble vector

     74:        call VecAssemblyBegin(x,ierr)
     75:        call VecAssemblyEnd(x,ierr)

     77: !  View vector
     78:        call PetscObjectSetName(x, 'initial vector:',ierr)
     79:        call VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr)
     80:        call VecCopy(x,y,ierr)

     82: !  Get a pointer to vector data.
     83: !    - For default PETSc vectors, VecGetArray() returns a pointer to
     84: !      the data array.  Otherwise, the routine is implementation dependent.
     85: !    - You MUST call VecRestoreArray() when you no longer need access to
     86: !      the array.
     87: !    - Note that the Fortran interface to VecGetArray() differs from the
     88: !      C version.  See the users manual for details.

     90:        call VecGetArray(x,xx_v,xx_i,ierr)
     91:        call VecGetArray(y,yy_v,yy_i,ierr)

     93: !  Modify vector data

     95:        do 30 i=1,n
     96:           xx_a(i) = 100.0*real(i)
     97:           yy_a(i) = 1000.0*real(i)
     98:   30   continue

    100: !  Restore vectors

    102:        call VecRestoreArray(x,xx_v,xx_i,ierr)
    103:        call VecRestoreArray(y,yy_v,yy_i,ierr)

    105: !  View vectors
    106:        call PetscObjectSetName(x, 'new vector 1:',ierr)
    107:        call VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr)

    109:        call PetscObjectSetName(y, 'new vector 2:',ierr)
    110:        call VecView(y,PETSC_VIEWER_STDOUT_SELF,ierr)

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

    115:        call VecDestroy(x,ierr)
    116:        call VecDestroy(y,ierr)
    117:        call PetscFinalize(ierr)
    118:        end

    120: !/*TEST
    121: !
    122: !     test:
    123: !
    124: !TEST*/