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