1c4762a1bSJed Brown static char help[] = "Demonstrates using PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB)\n\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscsys.h>
4c4762a1bSJed Brown #include <petscdm.h>
5c4762a1bSJed Brown #include <petscdmda.h>
6c4762a1bSJed Brown #include <petscbag.h>
7c4762a1bSJed Brown
8c4762a1bSJed Brown typedef struct {
9c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN];
10c4762a1bSJed Brown PetscReal ra;
11c4762a1bSJed Brown PetscInt ia;
12c4762a1bSJed Brown PetscBool ta;
13c4762a1bSJed Brown } Parameter;
14c4762a1bSJed Brown
main(int argc,char ** argv)15d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
16d71ae5a4SJacob Faibussowitsch {
17c4762a1bSJed Brown PetscBag bag;
18c4762a1bSJed Brown Parameter *params;
19c4762a1bSJed Brown PetscViewer viewer;
20c4762a1bSJed Brown DM da;
21c4762a1bSJed Brown Vec global, local;
22c4762a1bSJed Brown PetscMPIInt rank;
23c4762a1bSJed Brown
24c4762a1bSJed Brown /*
25c4762a1bSJed Brown Every PETSc routine should begin with the PetscInitialize() routine.
26c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options
27c4762a1bSJed Brown supplied to PETSc and options supplied to MPI.
28c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help,
29c4762a1bSJed Brown it prints the various options that can be applied at
30c4762a1bSJed Brown runtime. The user can use the "help" variable place
31c4762a1bSJed Brown additional help messages in this printout.
32c4762a1bSJed Brown */
33327415f7SBarry Smith PetscFunctionBeginUser;
34c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help));
35c4762a1bSJed Brown /* Create a DMDA and an associated vector */
369566063dSJacob 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));
379566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da));
389566063dSJacob Faibussowitsch PetscCall(DMSetUp(da));
399566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global));
409566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(da, &local));
419566063dSJacob Faibussowitsch PetscCall(VecSet(global, -1.0));
429566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(da, global, INSERT_VALUES, local));
439566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(da, global, INSERT_VALUES, local));
449566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
459566063dSJacob Faibussowitsch PetscCall(VecScale(local, rank + 1));
469566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalBegin(da, local, ADD_VALUES, global));
479566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalEnd(da, local, ADD_VALUES, global));
48c4762a1bSJed Brown
49c4762a1bSJed Brown /* Create an empty bag */
509566063dSJacob Faibussowitsch PetscCall(PetscBagCreate(PETSC_COMM_WORLD, sizeof(Parameter), &bag));
51*2a8381b2SBarry Smith PetscCall(PetscBagGetData(bag, ¶ms));
52c4762a1bSJed Brown
53c4762a1bSJed Brown /* fill bag: register variables, defaults, names, help strings */
549566063dSJacob Faibussowitsch PetscCall(PetscBagSetName(bag, "ParameterBag", "contains problem parameters"));
559566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterString(bag, ¶ms->filename, PETSC_MAX_PATH_LEN, "output_file", "filename", "Name of secret file"));
569566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterReal(bag, ¶ms->ra, 1.0, "param_1", "The first parameter"));
579566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterInt(bag, ¶ms->ia, 5, "param_2", "The second parameter"));
589566063dSJacob Faibussowitsch PetscCall(PetscBagRegisterBool(bag, ¶ms->ta, PETSC_TRUE, "do_output", "Write output file (true/false)"));
59c4762a1bSJed Brown
60c4762a1bSJed Brown /*
61c4762a1bSJed Brown Write output file with PETSC_VIEWER_BINARY_MATLAB format
62c4762a1bSJed Brown NOTE: the output generated with this viewer can be loaded into
63c4762a1bSJed Brown MATLAB using $PETSC_DIR/share/petsc/matlab/PetscReadBinaryMatlab.m
64c4762a1bSJed Brown */
659566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, params->filename, FILE_MODE_WRITE, &viewer));
669566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_BINARY_MATLAB));
679566063dSJacob Faibussowitsch PetscCall(PetscBagView(bag, viewer));
689566063dSJacob Faibussowitsch PetscCall(DMDASetFieldName(da, 0, "field1"));
699566063dSJacob Faibussowitsch PetscCall(DMDASetFieldName(da, 1, "field2"));
709566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)global, "da1"));
719566063dSJacob Faibussowitsch PetscCall(VecView(global, viewer));
729566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer));
739566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer));
74c4762a1bSJed Brown
75c4762a1bSJed Brown /* clean up and exit */
769566063dSJacob Faibussowitsch PetscCall(PetscBagDestroy(&bag));
779566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da));
789566063dSJacob Faibussowitsch PetscCall(VecDestroy(&local));
799566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global));
809566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
81b122ec5aSJacob Faibussowitsch return 0;
82c4762a1bSJed Brown }
83c4762a1bSJed Brown
84c4762a1bSJed Brown /*TEST
85c4762a1bSJed Brown
86c4762a1bSJed Brown test:
873886731fSPierre Jolivet output_file: output/empty.out
88c4762a1bSJed Brown
89c4762a1bSJed Brown TEST*/
90