Date: 2022-08-02T03:13:37+00:00

Actual source code: ex11f.F

      1: !
      2: !
      3: !

      5:       program main
      6: #include <petsc/finclude/petscvec.h>
      7:       use petscvec
      8:       implicit none

     10:       Vec               x
     11:       PetscReal         norm
     12:       PetscBool  flg
     13:       PetscMPIInt rank
     14:       PetscInt n,bs,comp
     15:       PetscErrorCode ierr
     16:       PetscScalar       one

     18:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     19:       if (ierr .ne. 0) then
     20:         print*,'Unable to initialize PETSc'
     21:         stop
     22:       endif
     23:       call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)

     25:       n   = 20
     26:       one = 1.0
     27:       call PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,       &
     28:      &                        '-n',n,flg,ierr)

     30: !
     31: !     Create a vector, specifying only its global dimension.
     32: !     When using VecCreate(), VecSetSizes() and VecSetFromOptions(),
     33: !     the vector format (currently parallel,
     34: !     shared, or sequential) is determined at runtime.  Also, the parallel
     35: !     partitioning of the vector is determined by PETSc at runtime.
     36: !
     37: !     Routines for creating particular vector types directly are:
     38: !        VecCreateSeq() - uniprocessor vector
     39: !        VecCreateMPI() - distributed vector, where the user can
     40: !                         determine the parallel partitioning
     41: !        VecCreateShared() - parallel vector that uses shared memory
     42: !                            (available only on the SGI); otherwise,
     43: !                            is the same as VecCreateMPI()
     44: !
     45: !     With VecCreate(), VecSetSizes() and VecSetFromOptions() the option
     46: !     -vec_type mpi or -vec_type shared causes the
     47: !     particular type of vector to be formed.

     49:       call VecCreate(PETSC_COMM_WORLD,x,ierr)
     50:       call VecSetSizes(x,PETSC_DECIDE,n,ierr)
     51:       bs = 2
     52:       call VecSetBlockSize(x,bs,ierr)
     53:       call VecSetFromOptions(x,ierr)

     55: !
     56: !     Set the vectors to entries to a constant value.
     57: !
     58:       call VecSet(x,one,ierr)

     60:       call VecNorm(x,NORM_2,norm,ierr)
     61:       if (rank .eq. 0) then
     62:          write (6,100) norm
     63:  100     format ('L_2 Norm of entire vector ',1pe9.2)
     64:       endif

     66:       comp = 0
     67:       call VecStrideNorm(x,comp,NORM_2,norm,ierr)
     68:       if (rank .eq. 0) then
     69:          write (6,200) norm
     70:  200     format ('L_2 Norm of subvector 0',1pe9.2)
     71:       endif

     73:       comp = 1
     74:       call VecStrideNorm(x,comp,NORM_2,norm,ierr)
     75:       if (rank .eq. 0) then
     76:          write (6,300) norm
     77:  300     format ('L_2 Norm of subvector 1',1pe9.2)
     78:       endif

     80:       call VecStrideNorm(x,comp,NORM_1,norm,ierr)
     81:       if (rank .eq. 0) then
     82:          write (6,400) norm
     83:  400     format ('L_1 Norm of subvector 0',1pe9.2)
     84:       endif

     86:       call VecStrideNorm(x,comp,NORM_INFINITY,norm,ierr)
     87:       if (rank .eq. 0) then
     88:          write (6,500) norm
     89:  500     format ('L_1 Norm of subvector 1',1pe9.2)
     90:       endif

     92: !
     93: !     Free work space.  All PETSc objects should be destroyed when they
     94: !     are no longer needed.

     96:       call VecDestroy(x,ierr)
     97:       call PetscFinalize(ierr)
     98:       end

    100: !/*TEST
    101: !
    102: !     test:
    103: !       nsize: 2
    104: !
    105: !TEST*/