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

Actual source code: ex11f.F

      1: !
      2: !
      3: !
      4: !/*T
      5: !   Concepts: vectors^norms of sub-vectors;
      6: !   Processors: n
      7: !T*/

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

     14:       Vec               x
     15:       PetscReal         norm
     16:       PetscBool  flg
     17:       PetscMPIInt rank
     18:       PetscInt n,bs,comp
     19:       PetscErrorCode ierr
     20:       PetscScalar       one

     22:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     23:       if (ierr .ne. 0) then
     24:         print*,'Unable to initialize PETSc'
     25:         stop
     26:       endif
     27:       call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)

     29:       n   = 20
     30:       one = 1.0
     31:       call PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,       &
     32:      &                        '-n',n,flg,ierr)

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

     53:       call VecCreate(PETSC_COMM_WORLD,x,ierr)
     54:       call VecSetSizes(x,PETSC_DECIDE,n,ierr)
     55:       bs = 2
     56:       call VecSetBlockSize(x,bs,ierr)
     57:       call VecSetFromOptions(x,ierr)

     59: !
     60: !     Set the vectors to entries to a constant value.
     61: !
     62:       call VecSet(x,one,ierr)

     64:       call VecNorm(x,NORM_2,norm,ierr)
     65:       if (rank .eq. 0) then
     66:          write (6,100) norm
     67:  100     format ('L_2 Norm of entire vector ',1pe9.2)
     68:       endif

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

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

     84:       call VecStrideNorm(x,comp,NORM_1,norm,ierr)
     85:       if (rank .eq. 0) then
     86:          write (6,400) norm
     87:  400     format ('L_1 Norm of subvector 0',1pe9.2)
     88:       endif

     90:       call VecStrideNorm(x,comp,NORM_INFINITY,norm,ierr)
     91:       if (rank .eq. 0) then
     92:          write (6,500) norm
     93:  500     format ('L_1 Norm of subvector 1',1pe9.2)
     94:       endif

     96: !
     97: !     Free work space.  All PETSc objects should be destroyed when they
     98: !     are no longer needed.

    100:       call VecDestroy(x,ierr)
    101:       call PetscFinalize(ierr)
    102:       end

    104: !/*TEST
    105: !
    106: !     test:
    107: !       nsize: 2
    108: !
    109: !TEST*/