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