1 2#include <petsc/finclude/petscsys.h> 3#include <petsc/finclude/petscbag.h> 4#include <petsc/finclude/petscviewer.h> 5 6 module ex5f90module 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 ex5f90module 26 27 module ex5f90Bag_interface_module 28 use ex5f90module 29 30 interface PetscBagGetData 31 subroutine PetscBagGetData(bag,data,ierr) 32 use ex5f90module 33 PetscBag bag 34 type(bag_data_type),pointer :: data 35 PetscErrorCode ierr 36 end subroutine PetscBagGetData 37 end interface 38 end module ex5f90Bag_interface_module 39 40 program ex5f90 41 use ex5f90Bag_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 PetscCallA(PetscInitialize(ierr)) 58 list(1) = 'a123' 59 list(2) = 'b456' 60 list(3) = 'c789' 61 list(4) = 'list' 62 list(5) = 'prefix_' 63 list(6) = '' 64! cannot just pass a 3 to PetscBagRegisterXXXArray() because it is expecting a PetscInt 65 three = 3 66 67! compute size of the data 68! 69 sizeofbag = size(transfer(dummydata,dummychar)) 70 71! create the bag 72 PetscCallA(PetscBagCreate(PETSC_COMM_WORLD,sizeofbag,bag,ierr)) 73 PetscCallA(PetscBagGetData(bag,data,ierr)) 74 PetscCallA(PetscBagSetName(bag,'demo parameters','super secret demo parameters in a bag',ierr)) 75 PetscCallA(PetscBagSetOptionsPrefix(bag, 'pbag_', ierr)) 76 77! register the data within the bag, grabbing values from the options database 78! Need to put the value into a variable for 64-bit indices 79 int56 = 56 80 PetscCallA(PetscBagRegisterInt(bag,data%nxc ,int56,'nxc','nxc_variable help message',ierr)) 81 PetscCallA(PetscBagRegisterRealArray(bag,data%rarray,three,'rarray','rarray help message',ierr)) 82! Need to put the value into a variable to pass correctly for 128 bit quad precision numbers 83 svalue = 103.20 84 PetscCallA(PetscBagRegisterScalar(bag,data%x ,svalue,'x','x variable help message',ierr)) 85 PetscCallA(PetscBagRegisterBool(bag,data%t ,PETSC_TRUE,'t','t boolean help message',ierr)) 86 PetscCallA(PetscBagRegisterBoolArray(bag,data%tarray,three,'tarray','tarray help message',ierr)) 87 PetscCallA(PetscBagRegisterString(bag,data%c,'hello','c','string help message',ierr)) 88 value = -11.00 89 PetscCallA(PetscBagRegisterReal(bag,data%y ,value,'y','y variable help message',ierr)) 90 value = 1.00 91 PetscCallA(PetscBagRegisterReal(bag,data%pos%x1 ,value,'pos_x1','tuple value 1 help message',ierr)) 92 value = 2.00 93 PetscCallA(PetscBagRegisterReal(bag,data%pos%x2 ,value,'pos_x2','tuple value 2 help message',ierr)) 94 PetscCallA(PetscBagRegisterEnum(bag,data%enum ,list,1,'enum','tuple value 2 help message',ierr)) 95 PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr)) 96 97 data%nxc = 23 98 data%rarray(1) = -1.0 99 data%rarray(2) = -2.0 100 data%rarray(3) = -3.0 101 data%x = 155.4 102 data%c = 'a whole new string' 103 data%t = PETSC_TRUE 104 data%tarray = (/PETSC_TRUE,PETSC_FALSE,PETSC_TRUE/) 105 PetscCallA(PetscBagView(bag,PETSC_VIEWER_BINARY_WORLD,ierr)) 106 107 PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'binaryoutput',FILE_MODE_READ,viewer,ierr)) 108 PetscCallA(PetscBagLoad(viewer,bag,ierr)) 109 PetscCallA(PetscViewerDestroy(viewer,ierr)) 110 PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr)) 111 112 PetscCallA(PetscBagSetFromOptions(bag,ierr)) 113 PetscCallA(PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr)) 114 PetscCallA(PetscBagDestroy(bag,ierr)) 115 116 PetscCallA(PetscFinalize(ierr)) 117 end program ex5f90 118 119! 120!/*TEST 121! 122! build: 123! requires: defined(PETSC_USING_F2003) defined(PETSC_USING_F90FREEFORM) 124! 125! test: 126! args: -pbag_rarray 4,5,88 127! 128!TEST*/ 129