xref: /petsc/src/sys/classes/viewer/interface/viewers.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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
125c6c1daeSBarry Smith    PetscViewersDestroy - Destroys a set of PetscViewers created with PetscViewersCreate().
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Collective on PetscViewers
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith    Input Parameters:
175c6c1daeSBarry Smith .  v - the PetscViewers to be destroyed.
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Level: intermediate
205c6c1daeSBarry Smith 
21db781477SPatrick Sanan .seealso: `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`, `PetscViewersCreate()`
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith @*/
249371c9d4SSatish Balay PetscErrorCode PetscViewersDestroy(PetscViewers *v) {
255c6c1daeSBarry Smith   int i;
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith   PetscFunctionBegin;
285c6c1daeSBarry Smith   if (!*v) PetscFunctionReturn(0);
29*48a46eb9SPierre Jolivet   for (i = 0; i < (*v)->n; i++) PetscCall(PetscViewerDestroy(&(*v)->viewer[i]));
309566063dSJacob Faibussowitsch   PetscCall(PetscFree((*v)->viewer));
319566063dSJacob Faibussowitsch   PetscCall(PetscFree(*v));
325c6c1daeSBarry Smith   PetscFunctionReturn(0);
335c6c1daeSBarry Smith }
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith /*@C
365c6c1daeSBarry Smith    PetscViewersCreate - Creates a container to hold a set of PetscViewers.
375c6c1daeSBarry Smith 
38d083f849SBarry Smith    Collective
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith    Input Parameter:
415c6c1daeSBarry Smith .   comm - the MPI communicator
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Output Parameter:
445c6c1daeSBarry Smith .  v - the collection of PetscViewers
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Level: intermediate
475c6c1daeSBarry Smith 
48db781477SPatrick Sanan .seealso: `PetscViewerCreate()`, `PetscViewersDestroy()`
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith @*/
519371c9d4SSatish Balay PetscErrorCode PetscViewersCreate(MPI_Comm comm, PetscViewers *v) {
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));
595c6c1daeSBarry Smith   PetscFunctionReturn(0);
605c6c1daeSBarry Smith }
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith /*@C
635c6c1daeSBarry Smith    PetscViewersGetViewer - Gets a PetscViewer from a PetscViewer collection
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith    Not Collective, but PetscViewer will be collective object on PetscViewers
665c6c1daeSBarry Smith 
67d8d19677SJose E. Roman    Input Parameters:
685c6c1daeSBarry Smith +   viewers - object created with PetscViewersCreate()
695c6c1daeSBarry Smith -   n - number of PetscViewer you want
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith    Output Parameter:
725c6c1daeSBarry Smith .  viewer - the PetscViewer
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Level: intermediate
755c6c1daeSBarry Smith 
76db781477SPatrick Sanan .seealso: `PetscViewersCreate()`, `PetscViewersDestroy()`
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith @*/
799371c9d4SSatish Balay PetscErrorCode PetscViewersGetViewer(PetscViewers viewers, PetscInt n, PetscViewer *viewer) {
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   }
94*48a46eb9SPierre Jolivet   if (!viewers->viewer[n]) PetscCall(PetscViewerCreate(viewers->comm, &viewers->viewer[n]));
955c6c1daeSBarry Smith   *viewer = viewers->viewer[n];
965c6c1daeSBarry Smith   PetscFunctionReturn(0);
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 
102a50e088cSMatthew G. Knepley   Not collective
1035c6c1daeSBarry Smith 
104a50e088cSMatthew G. Knepley   Input Parameters:
105a50e088cSMatthew G. Knepley + nmon      - The new monitor
106a50e088cSMatthew G. Knepley . nmctx     - The new monitor context, or NULL
107a50e088cSMatthew G. Knepley . nmdestroy - The new monitor destroy function, or NULL
108a50e088cSMatthew G. Knepley . mon       - The old monitor
109a50e088cSMatthew G. Knepley . mctx      - The old monitor context, or NULL
110a50e088cSMatthew G. Knepley - mdestroy  - The old monitor destroy function, or NULL
1115c6c1daeSBarry Smith 
112a50e088cSMatthew G. Knepley   Output Parameter:
113a50e088cSMatthew G. Knepley . identical - PETSC_TRUE if the monitors are the same
1145c6c1daeSBarry Smith 
115a50e088cSMatthew G. Knepley   Level: developer
1165c6c1daeSBarry Smith 
117a50e088cSMatthew G. Knepley .seealsp: DMMonitorSetFromOptions(), KSPMonitorSetFromOptions(), SNESMonitorSetFromOptions()
118a50e088cSMatthew G. Knepley */
1199371c9d4SSatish Balay PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscErrorCode (*nmdestroy)(void **), PetscErrorCode (*mon)(void), void *mctx, PetscErrorCode (*mdestroy)(void **), PetscBool *identical) {
120362febeeSStefano Zampini   PetscFunctionBegin;
1213ca90d2dSJacob Faibussowitsch   PetscValidBoolPointer(identical, 7);
122a50e088cSMatthew G. Knepley   *identical = PETSC_FALSE;
123a50e088cSMatthew G. Knepley   if (nmon == mon && nmdestroy == mdestroy) {
124a50e088cSMatthew G. Knepley     if (nmctx == mctx) *identical = PETSC_TRUE;
125a50e088cSMatthew G. Knepley     else if (nmdestroy == (PetscErrorCode(*)(void **))PetscViewerAndFormatDestroy) {
126a50e088cSMatthew G. Knepley       PetscViewerAndFormat *old = (PetscViewerAndFormat *)mctx, *newo = (PetscViewerAndFormat *)nmctx;
127a50e088cSMatthew G. Knepley       if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
128a50e088cSMatthew G. Knepley     }
129a50e088cSMatthew G. Knepley     if (*identical) {
130*48a46eb9SPierre Jolivet       if (mdestroy) PetscCall((*mdestroy)(&nmctx));
131a50e088cSMatthew G. Knepley     }
132a50e088cSMatthew G. Knepley   }
133a50e088cSMatthew G. Knepley   PetscFunctionReturn(0);
134a50e088cSMatthew G. Knepley }
135