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