Actual source code: viewers.c

  1: #include <petscsys.h>
  2: #include <petsc/private/viewerimpl.h>

  4: struct _n_PetscViewers {
  5:   MPI_Comm     comm;
  6:   PetscViewer *viewer;
  7:   int          n;
  8: };

 10: /*@C
 11:   PetscViewersDestroy - Destroys a set of `PetscViewer`s created with `PetscViewersCreate()`.

 13:   Collective

 15:   Input Parameter:
 16: . v - the `PetscViewers` to be destroyed.

 18:   Level: intermediate

 20: .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerDestroy()`, `PetscViewers`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`, `PetscViewersCreate()`
 21: @*/
 22: PetscErrorCode PetscViewersDestroy(PetscViewers *v)
 23: {
 24:   int i;

 26:   PetscFunctionBegin;
 27:   if (!*v) PetscFunctionReturn(PETSC_SUCCESS);
 28:   for (i = 0; i < (*v)->n; i++) PetscCall(PetscViewerDestroy(&(*v)->viewer[i]));
 29:   PetscCall(PetscFree((*v)->viewer));
 30:   PetscCall(PetscFree(*v));
 31:   PetscFunctionReturn(PETSC_SUCCESS);
 32: }

 34: /*@C
 35:   PetscViewersCreate - Creates a container to hold a set of `PetscViewer`'s. The container is essentially a sparse, growable in length array of `PetscViewer`s

 37:   Collective

 39:   Input Parameter:
 40: . comm - the MPI communicator

 42:   Output Parameter:
 43: . v - the collection of `PetscViewers`

 45:   Level: intermediate

 47: .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewerCreate()`, `PetscViewersDestroy()`
 48: @*/
 49: PetscErrorCode PetscViewersCreate(MPI_Comm comm, PetscViewers *v)
 50: {
 51:   PetscFunctionBegin;
 52:   PetscAssertPointer(v, 2);
 53:   PetscCall(PetscNew(v));
 54:   (*v)->n    = 64;
 55:   (*v)->comm = comm;

 57:   PetscCall(PetscCalloc1(64, &(*v)->viewer));
 58:   PetscFunctionReturn(PETSC_SUCCESS);
 59: }

 61: /*@C
 62:   PetscViewersGetViewer - Gets a `PetscViewer` from a `PetscViewers` collection

 64:   Collective if the viewer has not previously be obtained.

 66:   Input Parameters:
 67: + viewers - object created with `PetscViewersCreate()`
 68: - n       - number of `PetscViewer` you want

 70:   Output Parameter:
 71: . viewer - the `PetscViewer`

 73:   Level: intermediate

 75: .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewersCreate()`, `PetscViewersDestroy()`
 76: @*/
 77: PetscErrorCode PetscViewersGetViewer(PetscViewers viewers, PetscInt n, PetscViewer *viewer)
 78: {
 79:   PetscFunctionBegin;
 80:   PetscAssertPointer(viewers, 1);
 81:   PetscAssertPointer(viewer, 3);
 82:   PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot access using a negative index - %" PetscInt_FMT, n);
 83:   if (n >= viewers->n) {
 84:     PetscViewer *v;

 86:     PetscCall(PetscCalloc1(n + 64, &v));
 87:     PetscCall(PetscArraycpy(v, viewers->viewer, viewers->n));
 88:     PetscCall(PetscFree(viewers->viewer));

 90:     viewers->viewer = v;
 91:   }
 92:   if (!viewers->viewer[n]) PetscCall(PetscViewerCreate(viewers->comm, &viewers->viewer[n]));
 93:   *viewer = viewers->viewer[n];
 94:   PetscFunctionReturn(PETSC_SUCCESS);
 95: }

 97: /*@C
 98:   PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one

100:   Not Collective

102:   Input Parameters:
103: + nmon      - The new monitor
104: . nmctx     - The new monitor context, or `NULL`
105: . nmdestroy - The new monitor context destroy function, or `NULL`, see `PetscCtxDestroyFn` for its calling sequence
106: . mon       - The old monitor
107: . mctx      - The old monitor context, or `NULL`
108: - mdestroy  - The old monitor context destroy function, or `NULL`, see `PetscCtxDestroyFn` for its calling sequence

110:   Output Parameter:
111: . identical - `PETSC_TRUE` if the monitors are the same

113:   Level: developer

115: .seealso: [](sec_viewers), `DMMonitorSetFromOptions()`, `KSPMonitorSetFromOptions()`, `SNESMonitorSetFromOptions()`, `PetscCtxDestroyFn`
116: @*/
117: PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscCtxDestroyFn *nmdestroy, PetscErrorCode (*mon)(void), void *mctx, PetscCtxDestroyFn *mdestroy, PetscBool *identical)
118: {
119:   PetscFunctionBegin;
120:   PetscAssertPointer(identical, 7);
121:   *identical = PETSC_FALSE;
122:   if (nmon == mon && nmdestroy == mdestroy) {
123:     if (nmctx == mctx) *identical = PETSC_TRUE;
124:     else if (nmdestroy == (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy) {
125:       PetscViewerAndFormat *old = (PetscViewerAndFormat *)mctx, *newo = (PetscViewerAndFormat *)nmctx;
126:       if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
127:     }
128:     if (*identical) {
129:       if (mdestroy) PetscCall((*mdestroy)(&nmctx));
130:     }
131:   }
132:   PetscFunctionReturn(PETSC_SUCCESS);
133: }