Date: 2025-03-29T05:58:55+00:00

Actual source code: ex12f.F90

      1: program main

      3: #include <petsc/finclude/petscvec.h>

      5: use petscvec
      6: implicit none

      8:   PetscErrorCode ierr
      9:   Vec   v,s
     10:   PetscInt,parameter ::      n   = 20
     11:   PetscScalar,parameter ::   sone = 1.0
     12:   PetscBool :: flg
     13:   PetscInt,parameter :: zero = 0, one = 1, two = 2

     15:   PetscCallA(PetscInitialize(ierr))

     17:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-n',n,flg,ierr))

     19:   ! Create multi-component vector with 2 components
     20:   PetscCallA(VecCreate(PETSC_COMM_WORLD,v,ierr))
     21:   PetscCallA(VecSetSizes(v,PETSC_DECIDE,n,ierr))
     22:   PetscCallA(VecSetBlockSize(v,two,ierr))
     23:   PetscCallA(VecSetFromOptions(v,ierr))

     25:   ! Create single-component vector
     26:   PetscCallA(VecCreate(PETSC_COMM_WORLD,s,ierr))
     27:   PetscCallA(VecSetSizes(s,PETSC_DECIDE,n/2,ierr))
     28:   PetscCallA(VecSetFromOptions(s,ierr))

     30:   !Set the vectors to entries to a constant value.
     31:   PetscCallA(VecSet(v,sone,ierr))

     33:   !Get the first component from the multi-component vector to the single vector
     34:   PetscCallA(VecStrideGather(v,zero,s,INSERT_VALUES,ierr))

     36:   PetscCallA(VecView(s,PETSC_VIEWER_STDOUT_WORLD,ierr))

     38:   !Put the values back into the second component
     39:   PetscCallA(VecStrideScatter(s,one,v,ADD_VALUES,ierr))

     41:   PetscCallA(VecView(v,PETSC_VIEWER_STDOUT_WORLD,ierr))

     43:   ! Free work space.All PETSc objects should be destroyed when they are no longer needed.
     44:   PetscCallA(VecDestroy(v,ierr))
     45:   PetscCallA(VecDestroy(s,ierr))
     46:   PetscCallA(PetscFinalize(ierr))

     48:   end program

     50: !/*TEST
     51: !
     52: !     test:
     53: !       nsize: 2
     54: !       output_file: output/ex12_1.out
     55: !
     56: !TEST*/