1 #include <petscsys.h>
2 #include <petsc/private/viewerimpl.h>
3
4 struct _n_PetscViewers {
5 MPI_Comm comm;
6 PetscViewer *viewer;
7 int n;
8 };
9
10 /*@C
11 PetscViewersDestroy - Destroys a set of `PetscViewer`s created with `PetscViewersCreate()`.
12
13 Collective
14
15 Input Parameter:
16 . v - the `PetscViewers` to be destroyed.
17
18 Level: intermediate
19
20 .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerDestroy()`, `PetscViewers`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`, `PetscViewersCreate()`
21 @*/
PetscViewersDestroy(PetscViewers * v)22 PetscErrorCode PetscViewersDestroy(PetscViewers *v)
23 {
24 int i;
25
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 }
33
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
36
37 Collective
38
39 Input Parameter:
40 . comm - the MPI communicator
41
42 Output Parameter:
43 . v - the collection of `PetscViewers`
44
45 Level: intermediate
46
47 .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewerCreate()`, `PetscViewersDestroy()`
48 @*/
PetscViewersCreate(MPI_Comm comm,PetscViewers * v)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;
56
57 PetscCall(PetscCalloc1(64, &(*v)->viewer));
58 PetscFunctionReturn(PETSC_SUCCESS);
59 }
60
61 /*@C
62 PetscViewersGetViewer - Gets a `PetscViewer` from a `PetscViewers` collection
63
64 Collective if the viewer has not previously be obtained.
65
66 Input Parameters:
67 + viewers - object created with `PetscViewersCreate()`
68 - n - number of `PetscViewer` you want
69
70 Output Parameter:
71 . viewer - the `PetscViewer`
72
73 Level: intermediate
74
75 .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewersCreate()`, `PetscViewersDestroy()`
76 @*/
PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer * viewer)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;
85
86 PetscCall(PetscCalloc1(n + 64, &v));
87 PetscCall(PetscArraycpy(v, viewers->viewer, viewers->n));
88 PetscCall(PetscFree(viewers->viewer));
89
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 }
96
97 /*@C
98 PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one
99
100 Not Collective
101
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
109
110 Output Parameter:
111 . identical - `PETSC_TRUE` if the monitors are the same
112
113 Level: developer
114
115 .seealso: [](sec_viewers), `DMMonitorSetFromOptions()`, `KSPMonitorSetFromOptions()`, `SNESMonitorSetFromOptions()`, `PetscCtxDestroyFn`
116 @*/
PetscMonitorCompare(PetscErrorCode (* nmon)(void),void * nmctx,PetscCtxDestroyFn * nmdestroy,PetscErrorCode (* mon)(void),void * mctx,PetscCtxDestroyFn * mdestroy,PetscBool * identical)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 }
134