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