15c6c1daeSBarry Smith #include <petscsys.h>
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>
35c6c1daeSBarry Smith
45c6c1daeSBarry Smith struct _n_PetscViewers {
55c6c1daeSBarry Smith MPI_Comm comm;
65c6c1daeSBarry Smith PetscViewer *viewer;
75c6c1daeSBarry Smith int n;
85c6c1daeSBarry Smith };
95c6c1daeSBarry Smith
105c6c1daeSBarry Smith /*@C
11811af0c4SBarry Smith PetscViewersDestroy - Destroys a set of `PetscViewer`s created with `PetscViewersCreate()`.
125c6c1daeSBarry Smith
13c3339decSBarry Smith Collective
145c6c1daeSBarry Smith
152fe279fdSBarry Smith Input Parameter:
16c410d8ccSBarry Smith . v - the `PetscViewers` to be destroyed.
175c6c1daeSBarry Smith
185c6c1daeSBarry Smith Level: intermediate
195c6c1daeSBarry Smith
20c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerDestroy()`, `PetscViewers`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`, `PetscViewersCreate()`
215c6c1daeSBarry Smith @*/
PetscViewersDestroy(PetscViewers * v)22d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersDestroy(PetscViewers *v)
23d71ae5a4SJacob Faibussowitsch {
245c6c1daeSBarry Smith int i;
255c6c1daeSBarry Smith
265c6c1daeSBarry Smith PetscFunctionBegin;
273ba16761SJacob Faibussowitsch if (!*v) PetscFunctionReturn(PETSC_SUCCESS);
2848a46eb9SPierre Jolivet for (i = 0; i < (*v)->n; i++) PetscCall(PetscViewerDestroy(&(*v)->viewer[i]));
299566063dSJacob Faibussowitsch PetscCall(PetscFree((*v)->viewer));
309566063dSJacob Faibussowitsch PetscCall(PetscFree(*v));
313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
325c6c1daeSBarry Smith }
335c6c1daeSBarry Smith
345c6c1daeSBarry Smith /*@C
35c410d8ccSBarry Smith PetscViewersCreate - Creates a container to hold a set of `PetscViewer`'s. The container is essentially a sparse, growable in length array of `PetscViewer`s
365c6c1daeSBarry Smith
37d083f849SBarry Smith Collective
385c6c1daeSBarry Smith
395c6c1daeSBarry Smith Input Parameter:
405c6c1daeSBarry Smith . comm - the MPI communicator
415c6c1daeSBarry Smith
425c6c1daeSBarry Smith Output Parameter:
43c410d8ccSBarry Smith . v - the collection of `PetscViewers`
445c6c1daeSBarry Smith
455c6c1daeSBarry Smith Level: intermediate
465c6c1daeSBarry Smith
47c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewerCreate()`, `PetscViewersDestroy()`
485c6c1daeSBarry Smith @*/
PetscViewersCreate(MPI_Comm comm,PetscViewers * v)49d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersCreate(MPI_Comm comm, PetscViewers *v)
50d71ae5a4SJacob Faibussowitsch {
515c6c1daeSBarry Smith PetscFunctionBegin;
524f572ea9SToby Isaac PetscAssertPointer(v, 2);
539566063dSJacob Faibussowitsch PetscCall(PetscNew(v));
545c6c1daeSBarry Smith (*v)->n = 64;
555c6c1daeSBarry Smith (*v)->comm = comm;
56a297a907SKarl Rupp
579566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(64, &(*v)->viewer));
583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
595c6c1daeSBarry Smith }
605c6c1daeSBarry Smith
615c6c1daeSBarry Smith /*@C
62c410d8ccSBarry Smith PetscViewersGetViewer - Gets a `PetscViewer` from a `PetscViewers` collection
635c6c1daeSBarry Smith
6401311c95SBarry Smith Collective if the viewer has not previously be obtained.
655c6c1daeSBarry Smith
66d8d19677SJose E. Roman Input Parameters:
67811af0c4SBarry Smith + viewers - object created with `PetscViewersCreate()`
68811af0c4SBarry Smith - n - number of `PetscViewer` you want
695c6c1daeSBarry Smith
705c6c1daeSBarry Smith Output Parameter:
71811af0c4SBarry Smith . viewer - the `PetscViewer`
725c6c1daeSBarry Smith
735c6c1daeSBarry Smith Level: intermediate
745c6c1daeSBarry Smith
75c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewers`, `PetscViewersCreate()`, `PetscViewersDestroy()`
765c6c1daeSBarry Smith @*/
PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer * viewer)77d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersGetViewer(PetscViewers viewers, PetscInt n, PetscViewer *viewer)
78d71ae5a4SJacob Faibussowitsch {
795c6c1daeSBarry Smith PetscFunctionBegin;
804f572ea9SToby Isaac PetscAssertPointer(viewers, 1);
814f572ea9SToby Isaac PetscAssertPointer(viewer, 3);
8208401ef6SPierre Jolivet PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot access using a negative index - %" PetscInt_FMT, n);
835c6c1daeSBarry Smith if (n >= viewers->n) {
845c6c1daeSBarry Smith PetscViewer *v;
855c6c1daeSBarry Smith
866497c311SBarry Smith PetscCall(PetscCalloc1(n + 64, &v));
879566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(v, viewers->viewer, viewers->n));
889566063dSJacob Faibussowitsch PetscCall(PetscFree(viewers->viewer));
89a297a907SKarl Rupp
905c6c1daeSBarry Smith viewers->viewer = v;
915c6c1daeSBarry Smith }
9248a46eb9SPierre Jolivet if (!viewers->viewer[n]) PetscCall(PetscViewerCreate(viewers->comm, &viewers->viewer[n]));
935c6c1daeSBarry Smith *viewer = viewers->viewer[n];
943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
955c6c1daeSBarry Smith }
965c6c1daeSBarry Smith
97aec76313SJacob Faibussowitsch /*@C
98a50e088cSMatthew G. Knepley PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one
995c6c1daeSBarry Smith
10020f4b53cSBarry Smith Not Collective
1015c6c1daeSBarry Smith
102a50e088cSMatthew G. Knepley Input Parameters:
103a50e088cSMatthew G. Knepley + nmon - The new monitor
10401311c95SBarry Smith . nmctx - The new monitor context, or `NULL`
105*49abdd8aSBarry Smith . nmdestroy - The new monitor context destroy function, or `NULL`, see `PetscCtxDestroyFn` for its calling sequence
106a50e088cSMatthew G. Knepley . mon - The old monitor
10701311c95SBarry Smith . mctx - The old monitor context, or `NULL`
108*49abdd8aSBarry Smith - mdestroy - The old monitor context destroy function, or `NULL`, see `PetscCtxDestroyFn` for its calling sequence
1095c6c1daeSBarry Smith
110a50e088cSMatthew G. Knepley Output Parameter:
111811af0c4SBarry Smith . identical - `PETSC_TRUE` if the monitors are the same
1125c6c1daeSBarry Smith
113a50e088cSMatthew G. Knepley Level: developer
1145c6c1daeSBarry Smith
115*49abdd8aSBarry Smith .seealso: [](sec_viewers), `DMMonitorSetFromOptions()`, `KSPMonitorSetFromOptions()`, `SNESMonitorSetFromOptions()`, `PetscCtxDestroyFn`
116aec76313SJacob Faibussowitsch @*/
PetscMonitorCompare(PetscErrorCode (* nmon)(void),void * nmctx,PetscCtxDestroyFn * nmdestroy,PetscErrorCode (* mon)(void),void * mctx,PetscCtxDestroyFn * mdestroy,PetscBool * identical)117*49abdd8aSBarry Smith PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscCtxDestroyFn *nmdestroy, PetscErrorCode (*mon)(void), void *mctx, PetscCtxDestroyFn *mdestroy, PetscBool *identical)
118d71ae5a4SJacob Faibussowitsch {
119362febeeSStefano Zampini PetscFunctionBegin;
1204f572ea9SToby Isaac PetscAssertPointer(identical, 7);
121a50e088cSMatthew G. Knepley *identical = PETSC_FALSE;
122a50e088cSMatthew G. Knepley if (nmon == mon && nmdestroy == mdestroy) {
123a50e088cSMatthew G. Knepley if (nmctx == mctx) *identical = PETSC_TRUE;
124*49abdd8aSBarry Smith else if (nmdestroy == (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy) {
125a50e088cSMatthew G. Knepley PetscViewerAndFormat *old = (PetscViewerAndFormat *)mctx, *newo = (PetscViewerAndFormat *)nmctx;
126a50e088cSMatthew G. Knepley if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
127a50e088cSMatthew G. Knepley }
128a50e088cSMatthew G. Knepley if (*identical) {
12948a46eb9SPierre Jolivet if (mdestroy) PetscCall((*mdestroy)(&nmctx));
130a50e088cSMatthew G. Knepley }
131a50e088cSMatthew G. Knepley }
1323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
133a50e088cSMatthew G. Knepley }
134