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 @*/ 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 @*/ 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 @*/ 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 @*/ 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