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