1c4762a1bSJed Brown static char help[] = "Demonstrates using PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB)\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown /*T 4c4762a1bSJed Brown Concepts: viewers 5c4762a1bSJed Brown Concepts: bags 6c4762a1bSJed Brown Processors: n 7c4762a1bSJed Brown T*/ 8c4762a1bSJed Brown #include <petscsys.h> 9c4762a1bSJed Brown #include <petscdm.h> 10c4762a1bSJed Brown #include <petscdmda.h> 11c4762a1bSJed Brown #include <petscbag.h> 12c4762a1bSJed Brown 13c4762a1bSJed Brown typedef struct { 14c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN]; 15c4762a1bSJed Brown PetscReal ra; 16c4762a1bSJed Brown PetscInt ia; 17c4762a1bSJed Brown PetscBool ta; 18c4762a1bSJed Brown } Parameter; 19c4762a1bSJed Brown 20c4762a1bSJed Brown int main(int argc,char **argv) 21c4762a1bSJed Brown { 22c4762a1bSJed Brown PetscBag bag; 23c4762a1bSJed Brown Parameter *params; 24c4762a1bSJed Brown PetscViewer viewer; 25c4762a1bSJed Brown DM da; 26c4762a1bSJed Brown Vec global,local; 27c4762a1bSJed Brown PetscMPIInt rank; 28c4762a1bSJed Brown 29c4762a1bSJed Brown /* 30c4762a1bSJed Brown Every PETSc routine should begin with the PetscInitialize() routine. 31c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options 32c4762a1bSJed Brown supplied to PETSc and options supplied to MPI. 33c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help, 34c4762a1bSJed Brown it prints the various options that can be applied at 35c4762a1bSJed Brown runtime. The user can use the "help" variable place 36c4762a1bSJed Brown additional help messages in this printout. 37c4762a1bSJed Brown */ 38*9566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 39c4762a1bSJed Brown /* Create a DMDA and an associated vector */ 40*9566063dSJacob Faibussowitsch PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE,DMDA_STENCIL_BOX,10,10,PETSC_DECIDE,PETSC_DECIDE,2,1,NULL,NULL,&da)); 41*9566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 42*9566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 43*9566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da,&global)); 44*9566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(da,&local)); 45*9566063dSJacob Faibussowitsch PetscCall(VecSet(global,-1.0)); 46*9566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(da,global,INSERT_VALUES,local)); 47*9566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(da,global,INSERT_VALUES,local)); 48*9566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 49*9566063dSJacob Faibussowitsch PetscCall(VecScale(local,rank+1)); 50*9566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalBegin(da,local,ADD_VALUES,global)); 51*9566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalEnd(da,local,ADD_VALUES,global)); 52c4762a1bSJed Brown 53c4762a1bSJed Brown /* Create an empty bag */ 54*9566063dSJacob Faibussowitsch PetscCall(PetscBagCreate(PETSC_COMM_WORLD,sizeof(Parameter),&bag)); 55*9566063dSJacob Faibussowitsch PetscCall(PetscBagGetData(bag,(void**)¶ms)); 56c4762a1bSJed Brown 57c4762a1bSJed Brown /* fill bag: register variables, defaults, names, help strings */ 58*9566063dSJacob Faibussowitsch PetscCall(PetscBagSetName(bag,"ParameterBag","contains problem parameters")); 59*9566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterString(bag,¶ms->filename,PETSC_MAX_PATH_LEN,"output_file","filename","Name of secret file")); 60*9566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterReal (bag,¶ms->ra,1.0,"param_1","The first parameter")); 61*9566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterInt (bag,¶ms->ia,5,"param_2","The second parameter")); 62*9566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterBool (bag,¶ms->ta,PETSC_TRUE,"do_output","Write output file (true/false)")); 63c4762a1bSJed Brown 64c4762a1bSJed Brown /* 65c4762a1bSJed Brown Write output file with PETSC_VIEWER_BINARY_MATLAB format 66c4762a1bSJed Brown NOTE: the output generated with this viewer can be loaded into 67c4762a1bSJed Brown MATLAB using $PETSC_DIR/share/petsc/matlab/PetscReadBinaryMatlab.m 68c4762a1bSJed Brown */ 69*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,params->filename,FILE_MODE_WRITE,&viewer)); 70*9566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB)); 71*9566063dSJacob Faibussowitsch PetscCall(PetscBagView(bag,viewer)); 72*9566063dSJacob Faibussowitsch PetscCall(DMDASetFieldName(da,0,"field1")); 73*9566063dSJacob Faibussowitsch PetscCall(DMDASetFieldName(da,1,"field2")); 74*9566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)global,"da1")); 75*9566063dSJacob Faibussowitsch PetscCall(VecView(global,viewer)); 76*9566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 77*9566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 78c4762a1bSJed Brown 79c4762a1bSJed Brown /* clean up and exit */ 80*9566063dSJacob Faibussowitsch PetscCall(PetscBagDestroy(&bag)); 81*9566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 82*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&local)); 83*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 84*9566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 85b122ec5aSJacob Faibussowitsch return 0; 86c4762a1bSJed Brown } 87c4762a1bSJed Brown 88c4762a1bSJed Brown /*TEST 89c4762a1bSJed Brown 90c4762a1bSJed Brown test: 91c4762a1bSJed Brown 92c4762a1bSJed Brown TEST*/ 93