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