Actual source code: ex5f90.F90

  1: #include <petsc/finclude/petscsys.h>
  2: #include <petsc/finclude/petscbag.h>
  3: #include <petsc/finclude/petscviewer.h>

  5:       module ex5f90module
  6:       use petscsys
  7:       use petscbag
  8: !     Data structure used to contain information about the problem
  9: !     You can add physical values etc here

 11:       type tuple
 12:          PetscReal:: x1,x2
 13:       end type tuple

 15:       type bag_data_type
 16:          PetscScalar :: x
 17:          PetscReal :: y
 18:          PetscInt  :: nxc
 19:          PetscReal :: rarray(3)
 20:          PetscBool  :: t
 21:          PetscBool  :: tarray(3)
 22:          PetscEnum :: enum
 23:          character*(80) :: c
 24:          type(tuple) :: pos
 25:       end type bag_data_type
 26:       end module ex5f90module

 28:       module ex5f90Bag_interface_module
 29:       use ex5f90module

 31:       interface PetscBagGetData
 32:          subroutine PetscBagGetData(bag,data,ierr)
 33:            use ex5f90module
 34:            PetscBag bag
 35:            type(bag_data_type),pointer :: data
 36:            PetscErrorCode ierr
 37:          end subroutine PetscBagGetData
 38:       end interface
 39:       end module ex5f90Bag_interface_module

 41:       program ex5f90
 42:       use ex5f90Bag_interface_module
 43:       use petsc
 44:       implicit none

 46:       PetscBag bag
 47:       PetscErrorCode ierr
 48:       type(bag_data_type), pointer :: data
 49:       type(bag_data_type)          :: dummydata
 50:       character(len=1),pointer     :: dummychar(:)
 51:       PetscViewer viewer
 52:       PetscSizeT sizeofbag
 53:       Character(len=99) list(6)
 54:       PetscInt three,int56
 55:       PetscReal value
 56:       PetscScalar svalue

 58:       PetscCallA(PetscInitialize(ierr))
 59:       list(1) = 'a123'
 60:       list(2) = 'b456'
 61:       list(3) = 'c789'
 62:       list(4) = 'list'
 63:       list(5) = 'prefix_'
 64:       list(6) = ''
 65: !     cannot just pass a 3 to PetscBagRegisterXXXArray() because it is expecting a PetscInt
 66:       three   = 3

 68: !   compute size of the data
 69: !
 70:       sizeofbag = size(transfer(dummydata,dummychar))

 72: ! create the bag
 73:       PetscCallA(PetscBagCreate(PETSC_COMM_WORLD,sizeofbag,bag,ierr))
 74:       PetscCallA(PetscBagGetData(bag,data,ierr))
 75:       PetscCallA(PetscBagSetName(bag,'demo parameters','super secret demo parameters in a bag',ierr))
 76:       PetscCallA(PetscBagSetOptionsPrefix(bag, 'pbag_', ierr))

 78: ! register the data within the bag, grabbing values from the options database
 79: !     Need to put the value into a variable for 64-bit indices
 80:       int56 = 56
 81:       PetscCallA(PetscBagRegisterInt(bag,data%nxc ,int56,'nxc','nxc_variable help message',ierr))
 82:       PetscCallA(PetscBagRegisterRealArray(bag,data%rarray,three,'rarray','rarray help message',ierr))
 83: !     Need to put the value into a variable to pass correctly for 128 bit quad precision numbers
 84:       svalue = 103.20
 85:       PetscCallA(PetscBagRegisterScalar(bag,data%x ,svalue,'x','x variable help message',ierr))
 86:       PetscCallA(PetscBagRegisterBool(bag,data%t ,PETSC_TRUE,'t','t boolean help message',ierr))
 87:       PetscCallA(PetscBagRegisterBoolArray(bag,data%tarray,three,'tarray','tarray help message',ierr))
 88:       PetscCallA(PetscBagRegisterString(bag,data%c,'hello','c','string help message',ierr))
 89:       value = -11.00
 90:       PetscCallA(PetscBagRegisterReal(bag,data%y ,value,'y','y variable help message',ierr))
 91:       value = 1.00
 92:       PetscCallA(PetscBagRegisterReal(bag,data%pos%x1 ,value,'pos_x1','tuple value 1 help message',ierr))
 93:       value = 2.00
 94:       PetscCallA(PetscBagRegisterReal(bag,data%pos%x2 ,value,'pos_x2','tuple value 2 help message',ierr))
 95:       PetscCallA(PetscBagRegisterEnum(bag,data%enum ,list,1,'enum','tuple value 2 help message',ierr))
 96:       PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr))

 98:       data%nxc = 23
 99:       data%rarray(1) = -1.0
100:       data%rarray(2) = -2.0
101:       data%rarray(3) = -3.0
102:       data%x   = 155.4
103:       data%c   = 'a whole new string'
104:       data%t   = PETSC_TRUE
105:       data%tarray   = (/PETSC_TRUE,PETSC_FALSE,PETSC_TRUE/)
106:       PetscCallA(PetscBagView(bag,PETSC_VIEWER_BINARY_WORLD,ierr))

108:       PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'binaryoutput',FILE_MODE_READ,viewer,ierr))
109:       PetscCallA(PetscBagLoad(viewer,bag,ierr))
110:       PetscCallA(PetscViewerDestroy(viewer,ierr))
111:       PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr))

113:       PetscCallA(PetscBagSetFromOptions(bag,ierr))
114:       PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr))
115:       PetscCallA(PetscBagDestroy(bag,ierr))

117:       PetscCallA(PetscFinalize(ierr))
118:       end program ex5f90

120: !
121: !/*TEST
122: !
123: !   build:
124: !      requires: defined(PETSC_USING_F2003) defined(PETSC_USING_F90FREEFORM)
125: !
126: !   test:
127: !      args: -pbag_rarray 4,5,88
128: !
129: !TEST*/