xref: /petsc/src/sys/classes/viewer/interface/viewers.c (revision 08401ef684002a709c6d3db98a0c9f54a8bcf1ec)
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 
215c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewersCreate()
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith @*/
245c6c1daeSBarry Smith PetscErrorCode  PetscViewersDestroy(PetscViewers *v)
255c6c1daeSBarry Smith {
265c6c1daeSBarry Smith   int            i;
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith   PetscFunctionBegin;
295c6c1daeSBarry Smith   if (!*v) PetscFunctionReturn(0);
305c6c1daeSBarry Smith   for (i=0; i<(*v)->n; i++) {
319566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&(*v)->viewer[i]));
325c6c1daeSBarry Smith   }
339566063dSJacob Faibussowitsch   PetscCall(PetscFree((*v)->viewer));
349566063dSJacob Faibussowitsch   PetscCall(PetscFree(*v));
355c6c1daeSBarry Smith   PetscFunctionReturn(0);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith /*@C
395c6c1daeSBarry Smith    PetscViewersCreate - Creates a container to hold a set of PetscViewers.
405c6c1daeSBarry Smith 
41d083f849SBarry Smith    Collective
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Input Parameter:
445c6c1daeSBarry Smith .   comm - the MPI communicator
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Output Parameter:
475c6c1daeSBarry Smith .  v - the collection of PetscViewers
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith    Level: intermediate
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewersDestroy()
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith @*/
545c6c1daeSBarry Smith PetscErrorCode  PetscViewersCreate(MPI_Comm comm,PetscViewers *v)
555c6c1daeSBarry Smith {
565c6c1daeSBarry Smith   PetscFunctionBegin;
573ca90d2dSJacob Faibussowitsch   PetscValidPointer(v,2);
589566063dSJacob Faibussowitsch   PetscCall(PetscNew(v));
595c6c1daeSBarry Smith   (*v)->n    = 64;
605c6c1daeSBarry Smith   (*v)->comm = comm;
61a297a907SKarl Rupp 
629566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(64,&(*v)->viewer));
635c6c1daeSBarry Smith   PetscFunctionReturn(0);
645c6c1daeSBarry Smith }
655c6c1daeSBarry Smith 
665c6c1daeSBarry Smith /*@C
675c6c1daeSBarry Smith    PetscViewersGetViewer - Gets a PetscViewer from a PetscViewer collection
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith    Not Collective, but PetscViewer will be collective object on PetscViewers
705c6c1daeSBarry Smith 
71d8d19677SJose E. Roman    Input Parameters:
725c6c1daeSBarry Smith +   viewers - object created with PetscViewersCreate()
735c6c1daeSBarry Smith -   n - number of PetscViewer you want
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith    Output Parameter:
765c6c1daeSBarry Smith .  viewer - the PetscViewer
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith    Level: intermediate
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith .seealso: PetscViewersCreate(), PetscViewersDestroy()
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith @*/
835c6c1daeSBarry Smith PetscErrorCode  PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer *viewer)
845c6c1daeSBarry Smith {
855c6c1daeSBarry Smith   PetscFunctionBegin;
863ca90d2dSJacob Faibussowitsch   PetscValidPointer(viewers,1);
873ca90d2dSJacob Faibussowitsch   PetscValidPointer(viewer,3);
88*08401ef6SPierre Jolivet   PetscCheck(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot access using a negative index - %" PetscInt_FMT,n);
895c6c1daeSBarry Smith   if (n >= viewers->n) {
905c6c1daeSBarry Smith     PetscViewer *v;
915c6c1daeSBarry Smith     int         newn = n + 64; /* add 64 new ones at a time */
925c6c1daeSBarry Smith 
939566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(newn,&v));
949566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(v,viewers->viewer,viewers->n));
959566063dSJacob Faibussowitsch     PetscCall(PetscFree(viewers->viewer));
96a297a907SKarl Rupp 
975c6c1daeSBarry Smith     viewers->viewer = v;
985c6c1daeSBarry Smith   }
995c6c1daeSBarry Smith   if (!viewers->viewer[n]) {
1009566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(viewers->comm,&viewers->viewer[n]));
1015c6c1daeSBarry Smith   }
1025c6c1daeSBarry Smith   *viewer = viewers->viewer[n];
1035c6c1daeSBarry Smith   PetscFunctionReturn(0);
1045c6c1daeSBarry Smith }
1055c6c1daeSBarry Smith 
106a50e088cSMatthew G. Knepley /*
107a50e088cSMatthew G. Knepley   PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one
1085c6c1daeSBarry Smith 
109a50e088cSMatthew G. Knepley   Not collective
1105c6c1daeSBarry Smith 
111a50e088cSMatthew G. Knepley   Input Parameters:
112a50e088cSMatthew G. Knepley + nmon      - The new monitor
113a50e088cSMatthew G. Knepley . nmctx     - The new monitor context, or NULL
114a50e088cSMatthew G. Knepley . nmdestroy - The new monitor destroy function, or NULL
115a50e088cSMatthew G. Knepley . mon       - The old monitor
116a50e088cSMatthew G. Knepley . mctx      - The old monitor context, or NULL
117a50e088cSMatthew G. Knepley - mdestroy  - The old monitor destroy function, or NULL
1185c6c1daeSBarry Smith 
119a50e088cSMatthew G. Knepley   Output Parameter:
120a50e088cSMatthew G. Knepley . identical - PETSC_TRUE if the monitors are the same
1215c6c1daeSBarry Smith 
122a50e088cSMatthew G. Knepley   Level: developer
1235c6c1daeSBarry Smith 
124a50e088cSMatthew G. Knepley .seealsp: DMMonitorSetFromOptions(), KSPMonitorSetFromOptions(), SNESMonitorSetFromOptions()
125a50e088cSMatthew G. Knepley */
126a50e088cSMatthew G. Knepley PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscErrorCode (*nmdestroy)(void **), PetscErrorCode (*mon)(void), void *mctx, PetscErrorCode (*mdestroy)(void **), PetscBool *identical)
127a50e088cSMatthew G. Knepley {
128362febeeSStefano Zampini   PetscFunctionBegin;
1293ca90d2dSJacob Faibussowitsch   PetscValidBoolPointer(identical,7);
130a50e088cSMatthew G. Knepley   *identical = PETSC_FALSE;
131a50e088cSMatthew G. Knepley   if (nmon == mon && nmdestroy == mdestroy) {
132a50e088cSMatthew G. Knepley     if (nmctx == mctx) *identical = PETSC_TRUE;
133a50e088cSMatthew G. Knepley     else if (nmdestroy == (PetscErrorCode (*)(void**)) PetscViewerAndFormatDestroy) {
134a50e088cSMatthew G. Knepley       PetscViewerAndFormat *old = (PetscViewerAndFormat*)mctx, *newo = (PetscViewerAndFormat*)nmctx;
135a50e088cSMatthew G. Knepley       if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
136a50e088cSMatthew G. Knepley     }
137a50e088cSMatthew G. Knepley     if (*identical) {
138a50e088cSMatthew G. Knepley       if (mdestroy) {
1399566063dSJacob Faibussowitsch         PetscCall((*mdestroy)(&nmctx));
140a50e088cSMatthew G. Knepley       }
141a50e088cSMatthew G. Knepley     }
142a50e088cSMatthew G. Knepley   }
143a50e088cSMatthew G. Knepley   PetscFunctionReturn(0);
144a50e088cSMatthew G. Knepley }
145