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