xref: /petsc/src/sys/classes/viewer/interface/viewers.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <petscsys.h>
3af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith struct _n_PetscViewers {
65c6c1daeSBarry Smith   MPI_Comm     comm;
75c6c1daeSBarry Smith   PetscViewer *viewer;
85c6c1daeSBarry Smith   int          n;
95c6c1daeSBarry Smith };
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith /*@C
12811af0c4SBarry Smith    PetscViewersDestroy - Destroys a set of `PetscViewer`s created with `PetscViewersCreate()`.
135c6c1daeSBarry Smith 
14c3339decSBarry Smith    Collective
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith    Input Parameters:
17811af0c4SBarry Smith .  v - the `PetscViewer`s to be destroyed.
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Level: intermediate
205c6c1daeSBarry Smith 
2101311c95SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerDestroy()`, `PetscViewers()`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`, `PetscViewersCreate()`
225c6c1daeSBarry Smith @*/
23d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersDestroy(PetscViewers *v)
24d71ae5a4SJacob Faibussowitsch {
255c6c1daeSBarry Smith   int i;
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith   PetscFunctionBegin;
283ba16761SJacob Faibussowitsch   if (!*v) PetscFunctionReturn(PETSC_SUCCESS);
2948a46eb9SPierre Jolivet   for (i = 0; i < (*v)->n; i++) PetscCall(PetscViewerDestroy(&(*v)->viewer[i]));
309566063dSJacob Faibussowitsch   PetscCall(PetscFree((*v)->viewer));
319566063dSJacob Faibussowitsch   PetscCall(PetscFree(*v));
323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
335c6c1daeSBarry Smith }
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith /*@C
36811af0c4SBarry 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
375c6c1daeSBarry Smith 
38d083f849SBarry Smith    Collective
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith    Input Parameter:
415c6c1daeSBarry Smith .   comm - the MPI communicator
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Output Parameter:
44811af0c4SBarry Smith .  v - the collection of `PetscViewer`s
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Level: intermediate
475c6c1daeSBarry Smith 
48d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewersDestroy()`
495c6c1daeSBarry Smith @*/
50d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersCreate(MPI_Comm comm, PetscViewers *v)
51d71ae5a4SJacob Faibussowitsch {
525c6c1daeSBarry Smith   PetscFunctionBegin;
533ca90d2dSJacob Faibussowitsch   PetscValidPointer(v, 2);
549566063dSJacob Faibussowitsch   PetscCall(PetscNew(v));
555c6c1daeSBarry Smith   (*v)->n    = 64;
565c6c1daeSBarry Smith   (*v)->comm = comm;
57a297a907SKarl Rupp 
589566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(64, &(*v)->viewer));
593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
605c6c1daeSBarry Smith }
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith /*@C
63811af0c4SBarry Smith    PetscViewersGetViewer - Gets a `PetscViewer` from a `PetscViewer` collection
645c6c1daeSBarry Smith 
6501311c95SBarry Smith    Collective if the viewer has not previously be obtained.
665c6c1daeSBarry Smith 
67d8d19677SJose E. Roman    Input Parameters:
68811af0c4SBarry Smith +   viewers - object created with `PetscViewersCreate()`
69811af0c4SBarry Smith -   n - number of `PetscViewer` you want
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith    Output Parameter:
72811af0c4SBarry Smith .  viewer - the `PetscViewer`
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Level: intermediate
755c6c1daeSBarry Smith 
76d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewersCreate()`, `PetscViewersDestroy()`
775c6c1daeSBarry Smith @*/
78d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewersGetViewer(PetscViewers viewers, PetscInt n, PetscViewer *viewer)
79d71ae5a4SJacob Faibussowitsch {
805c6c1daeSBarry Smith   PetscFunctionBegin;
813ca90d2dSJacob Faibussowitsch   PetscValidPointer(viewers, 1);
823ca90d2dSJacob Faibussowitsch   PetscValidPointer(viewer, 3);
8308401ef6SPierre Jolivet   PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot access using a negative index - %" PetscInt_FMT, n);
845c6c1daeSBarry Smith   if (n >= viewers->n) {
855c6c1daeSBarry Smith     PetscViewer *v;
865c6c1daeSBarry Smith     int          newn = n + 64; /* add 64 new ones at a time */
875c6c1daeSBarry Smith 
889566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(newn, &v));
899566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(v, viewers->viewer, viewers->n));
909566063dSJacob Faibussowitsch     PetscCall(PetscFree(viewers->viewer));
91a297a907SKarl Rupp 
925c6c1daeSBarry Smith     viewers->viewer = v;
935c6c1daeSBarry Smith   }
9448a46eb9SPierre Jolivet   if (!viewers->viewer[n]) PetscCall(PetscViewerCreate(viewers->comm, &viewers->viewer[n]));
955c6c1daeSBarry Smith   *viewer = viewers->viewer[n];
963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
975c6c1daeSBarry Smith }
985c6c1daeSBarry Smith 
99a50e088cSMatthew G. Knepley /*
100a50e088cSMatthew G. Knepley   PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one
1015c6c1daeSBarry Smith 
102*20f4b53cSBarry Smith   Not Collective
1035c6c1daeSBarry Smith 
104a50e088cSMatthew G. Knepley   Input Parameters:
105a50e088cSMatthew G. Knepley + nmon      - The new monitor
10601311c95SBarry Smith . nmctx     - The new monitor context, or `NULL`
10701311c95SBarry Smith . nmdestroy - The new monitor destroy function, or `NULL`
108a50e088cSMatthew G. Knepley . mon       - The old monitor
10901311c95SBarry Smith . mctx      - The old monitor context, or `NULL`
11001311c95SBarry Smith - mdestroy  - The old monitor destroy function, or `NULL`
1115c6c1daeSBarry Smith 
112a50e088cSMatthew G. Knepley   Output Parameter:
113811af0c4SBarry Smith . identical - `PETSC_TRUE` if the monitors are the same
1145c6c1daeSBarry Smith 
115a50e088cSMatthew G. Knepley   Level: developer
1165c6c1daeSBarry Smith 
117d1f92df0SBarry Smith .seealso: [](sec_viewers), `DMMonitorSetFromOptions()`, `KSPMonitorSetFromOptions()`, `SNESMonitorSetFromOptions()`
118a50e088cSMatthew G. Knepley */
119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscErrorCode (*nmdestroy)(void **), PetscErrorCode (*mon)(void), void *mctx, PetscErrorCode (*mdestroy)(void **), PetscBool *identical)
120d71ae5a4SJacob Faibussowitsch {
121362febeeSStefano Zampini   PetscFunctionBegin;
1223ca90d2dSJacob Faibussowitsch   PetscValidBoolPointer(identical, 7);
123a50e088cSMatthew G. Knepley   *identical = PETSC_FALSE;
124a50e088cSMatthew G. Knepley   if (nmon == mon && nmdestroy == mdestroy) {
125a50e088cSMatthew G. Knepley     if (nmctx == mctx) *identical = PETSC_TRUE;
126a50e088cSMatthew G. Knepley     else if (nmdestroy == (PetscErrorCode(*)(void **))PetscViewerAndFormatDestroy) {
127a50e088cSMatthew G. Knepley       PetscViewerAndFormat *old = (PetscViewerAndFormat *)mctx, *newo = (PetscViewerAndFormat *)nmctx;
128a50e088cSMatthew G. Knepley       if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
129a50e088cSMatthew G. Knepley     }
130a50e088cSMatthew G. Knepley     if (*identical) {
13148a46eb9SPierre Jolivet       if (mdestroy) PetscCall((*mdestroy)(&nmctx));
132a50e088cSMatthew G. Knepley     }
133a50e088cSMatthew G. Knepley   }
1343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
135a50e088cSMatthew G. Knepley }
136