xref: /petsc/src/sys/tutorials/ex5f90.F90 (revision 607e733f3db3ee7f6f605a13295c517df8dbb9c9)
1#include <petsc/finclude/petscsys.h>
2#include <petsc/finclude/petscbag.h>
3#include <petsc/finclude/petscviewer.h>
4
5module ex5module
6  use petscsys
7  use petscbag
8!     Data structure used to contain information about the problem
9!     You can add physical values etc here
10
11  type tuple
12    PetscReal:: x1, x2
13  end type tuple
14
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
26end module ex5module
27
28program ex5f90
29  use ex5module
30  use petsc
31  implicit none
32
33  PetscBag bag
34  PetscErrorCode ierr
35  type(bag_data_type), pointer :: data
36  type(bag_data_type)          :: dummydata
37  character(len=1), pointer     :: dummychar(:)
38  PetscViewer viewer
39  PetscSizeT sizeofbag
40  character(len=99) list(6)
41  PetscInt three, int56
42  PetscReal value
43  PetscScalar svalue
44
45  PetscCallA(PetscInitialize(ierr))
46  list(1) = 'a123'
47  list(2) = 'b456'
48  list(3) = 'c789'
49  list(4) = 'list'
50  list(5) = 'prefix_'
51  list(6) = ''
52!     cannot just pass a 3 to PetscBagRegisterXXXArray() because it is expecting a PetscInt
53  three = 3
54
55!   compute size of the data
56!
57  sizeofbag = size(transfer(dummydata, dummychar))
58
59! create the bag
60  PetscCallA(PetscBagCreate(PETSC_COMM_WORLD, sizeofbag, bag, ierr))
61  PetscCallA(PetscBagGetData(bag, data, ierr))
62  PetscCallA(PetscBagSetName(bag, 'demo parameters', 'super secret demo parameters in a bag', ierr))
63  PetscCallA(PetscBagSetOptionsPrefix(bag, 'pbag_', ierr))
64
65! register the data within the bag, grabbing values from the options database
66!     Need to put the value into a variable for 64-bit indices
67  int56 = 56
68  PetscCallA(PetscBagRegisterInt(bag, data%nxc, int56, 'nxc', 'nxc_variable help message', ierr))
69  PetscCallA(PetscBagRegisterRealArray(bag, data%rarray, three, 'rarray', 'rarray help message', ierr))
70!     Need to put the value into a variable to pass correctly for 128 bit quad precision numbers
71  svalue = 103.20
72  PetscCallA(PetscBagRegisterScalar(bag, data%x, svalue, 'x', 'x variable help message', ierr))
73  PetscCallA(PetscBagRegisterBool(bag, data%t, PETSC_TRUE, 't', 't boolean help message', ierr))
74  PetscCallA(PetscBagRegisterBoolArray(bag, data%tarray, three, 'tarray', 'tarray help message', ierr))
75  PetscCallA(PetscBagRegisterString(bag, data%c, 'hello', 'c', 'string help message', ierr))
76  value = -11.00
77  PetscCallA(PetscBagRegisterReal(bag, data%y, value, 'y', 'y variable help message', ierr))
78  value = 1.00
79  PetscCallA(PetscBagRegisterReal(bag, data%pos%x1, value, 'pos_x1', 'tuple value 1 help message', ierr))
80  value = 2.00
81  PetscCallA(PetscBagRegisterReal(bag, data%pos%x2, value, 'pos_x2', 'tuple value 2 help message', ierr))
82  PetscCallA(PetscBagRegisterEnum(bag, data%enum, list, 1, 'enum', 'tuple value 2 help message', ierr))
83  PetscCallA(PetscBagView(bag, PETSC_VIEWER_STDOUT_WORLD, ierr))
84
85  data%nxc = 23
86  data%rarray(1) = -1.0
87  data%rarray(2) = -2.0
88  data%rarray(3) = -3.0
89  data%x = 155.4
90  data%c = 'a whole new string'
91  data%t = PETSC_TRUE
92  data%tarray = (/PETSC_TRUE, PETSC_FALSE, PETSC_TRUE/)
93  PetscCallA(PetscBagView(bag, PETSC_VIEWER_BINARY_WORLD, ierr))
94
95  PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, 'binaryoutput', FILE_MODE_READ, viewer, ierr))
96  PetscCallA(PetscBagLoad(viewer, bag, ierr))
97  PetscCallA(PetscViewerDestroy(viewer, ierr))
98  PetscCallA(PetscBagView(bag, PETSC_VIEWER_STDOUT_WORLD, ierr))
99
100  PetscCallA(PetscBagSetFromOptions(bag, ierr))
101  PetscCallA(PetscBagView(bag, PETSC_VIEWER_STDOUT_WORLD, ierr))
102  PetscCallA(PetscBagDestroy(bag, ierr))
103
104  PetscCallA(PetscFinalize(ierr))
105end program ex5f90
106
107!
108!/*TEST
109!
110!   test:
111!      args: -pbag_rarray 4,5,88
112!
113!TEST*/
114