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