15c6c1daeSBarry Smith 2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscsys.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith typedef struct { 55c6c1daeSBarry Smith char *string; /* string where info is stored */ 6a5b23f4aSJose E. Roman char *head; /* pointer to beginning of unused portion */ 75c6c1daeSBarry Smith size_t curlen, maxlen; 836a9e3b9SBarry Smith PetscBool ownstring; /* string viewer is responsable for freeing the string */ 95c6c1daeSBarry Smith } PetscViewer_String; 105c6c1daeSBarry Smith 11*9371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer) { 125c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith PetscFunctionBegin; 151baa6e33SBarry Smith if (vstr->ownstring) PetscCall(PetscFree(vstr->string)); 169566063dSJacob Faibussowitsch PetscCall(PetscFree(vstr)); 175c6c1daeSBarry Smith PetscFunctionReturn(0); 185c6c1daeSBarry Smith } 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith /*@C 215c6c1daeSBarry Smith PetscViewerStringSPrintf - Prints information to a PetscViewer string. 225c6c1daeSBarry Smith 235c6c1daeSBarry Smith Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string) 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith Input Parameters: 265c6c1daeSBarry Smith + v - a string PetscViewer, formed by PetscViewerStringOpen() 275c6c1daeSBarry Smith - format - the format of the input 285c6c1daeSBarry Smith 295c6c1daeSBarry Smith Level: developer 305c6c1daeSBarry Smith 315c6c1daeSBarry Smith Fortran Note: 325c6c1daeSBarry Smith This routine is not supported in Fortran. 335c6c1daeSBarry Smith 34db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSetString()`, `PETSCVIEWERSTRING` 355c6c1daeSBarry Smith @*/ 36*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSPrintf(PetscViewer viewer, const char format[], ...) { 375c6c1daeSBarry Smith va_list Argp; 385c6c1daeSBarry Smith size_t fullLength; 3989d949e2SBarry Smith size_t shift, cshift; 405c6c1daeSBarry Smith PetscBool isstring; 415c6c1daeSBarry Smith char tmp[4096]; 425c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith PetscFunctionBegin; 455c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 465c6c1daeSBarry Smith PetscValidCharPointer(format, 2); 479566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 485c6c1daeSBarry Smith if (!isstring) PetscFunctionReturn(0); 4928b400f6SJacob Faibussowitsch PetscCheck(vstr->string, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Must call PetscViewerStringSetString() before using"); 505c6c1daeSBarry Smith 515c6c1daeSBarry Smith va_start(Argp, format); 529566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(tmp, 4096, format, &fullLength, Argp)); 535c6c1daeSBarry Smith va_end(Argp); 549566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tmp, &shift)); 5589d949e2SBarry Smith cshift = shift + 1; 5689d949e2SBarry Smith if (cshift >= vstr->maxlen - vstr->curlen - 1) cshift = vstr->maxlen - vstr->curlen - 1; 579566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(vstr->head, tmp, cshift)); 585c6c1daeSBarry Smith vstr->head += shift; 595c6c1daeSBarry Smith vstr->curlen += shift; 605c6c1daeSBarry Smith PetscFunctionReturn(0); 615c6c1daeSBarry Smith } 625c6c1daeSBarry Smith 635c6c1daeSBarry Smith /*@C 645c6c1daeSBarry Smith PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very 655c6c1daeSBarry Smith simple PetscViewer; information on the object is simply stored into 665c6c1daeSBarry Smith the string in a fairly nice way. 675c6c1daeSBarry Smith 68d083f849SBarry Smith Collective 695c6c1daeSBarry Smith 705c6c1daeSBarry Smith Input Parameters: 715c6c1daeSBarry Smith + comm - the communicator 725c6c1daeSBarry Smith . string - the string to use 735c6c1daeSBarry Smith - len - the string length 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith Output Parameter: 765c6c1daeSBarry Smith . lab - the PetscViewer 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith Level: advanced 795c6c1daeSBarry Smith 805c6c1daeSBarry Smith Fortran Note: 815c6c1daeSBarry Smith This routine is not supported in Fortran. 825c6c1daeSBarry Smith 83db781477SPatrick Sanan .seealso: `PetscViewerDestroy()`, `PetscViewerStringSPrintf()`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSetString()`, `PETSCVIEWERSTRING` 845c6c1daeSBarry Smith @*/ 85*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringOpen(MPI_Comm comm, char string[], size_t len, PetscViewer *lab) { 865c6c1daeSBarry Smith PetscFunctionBegin; 879566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, lab)); 889566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*lab, PETSCVIEWERSTRING)); 899566063dSJacob Faibussowitsch PetscCall(PetscViewerStringSetString(*lab, string, len)); 905c6c1daeSBarry Smith PetscFunctionReturn(0); 915c6c1daeSBarry Smith } 925c6c1daeSBarry Smith 93*9371c9d4SSatish Balay PetscErrorCode PetscViewerGetSubViewer_String(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) { 945c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 955c6c1daeSBarry Smith 965c6c1daeSBarry Smith PetscFunctionBegin; 979566063dSJacob Faibussowitsch PetscCall(PetscViewerStringOpen(PETSC_COMM_SELF, vstr->head, vstr->maxlen - vstr->curlen, sviewer)); 985c6c1daeSBarry Smith PetscFunctionReturn(0); 995c6c1daeSBarry Smith } 1005c6c1daeSBarry Smith 101*9371c9d4SSatish Balay PetscErrorCode PetscViewerRestoreSubViewer_String(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) { 1025c6c1daeSBarry Smith PetscViewer_String *iviewer = (PetscViewer_String *)(*sviewer)->data; 1035c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 1045c6c1daeSBarry Smith 1055c6c1daeSBarry Smith PetscFunctionBegin; 1065c6c1daeSBarry Smith vstr->head = iviewer->head; 1075c6c1daeSBarry Smith vstr->curlen += iviewer->curlen; 1089566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(sviewer)); 1095c6c1daeSBarry Smith PetscFunctionReturn(0); 1105c6c1daeSBarry Smith } 1115c6c1daeSBarry Smith 1128556b5ebSBarry Smith /*MC 1138556b5ebSBarry Smith PETSCVIEWERSTRING - A viewer that writes to a string 1148556b5ebSBarry Smith 115db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PetscViewerStringSPrintf()`, `PetscViewerSocketOpen()`, `PetscViewerDrawOpen()`, `PETSCVIEWERSOCKET`, 116db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, `PETSCVIEWERDRAW`, 117db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, 118db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 1198556b5ebSBarry Smith 1201b266c99SBarry Smith Level: beginner 1218556b5ebSBarry Smith M*/ 1228556b5ebSBarry Smith 123*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_String(PetscViewer v) { 1245c6c1daeSBarry Smith PetscViewer_String *vstr; 1255c6c1daeSBarry Smith 1265c6c1daeSBarry Smith PetscFunctionBegin; 1275c6c1daeSBarry Smith v->ops->destroy = PetscViewerDestroy_String; 12802c9f0b5SLisandro Dalcin v->ops->view = NULL; 12902c9f0b5SLisandro Dalcin v->ops->flush = NULL; 130559f443fSBarry Smith v->ops->getsubviewer = PetscViewerGetSubViewer_String; 131559f443fSBarry Smith v->ops->restoresubviewer = PetscViewerRestoreSubViewer_String; 1329566063dSJacob Faibussowitsch PetscCall(PetscNewLog(v, &vstr)); 1335c6c1daeSBarry Smith v->data = (void *)vstr; 13402c9f0b5SLisandro Dalcin vstr->string = NULL; 1355c6c1daeSBarry Smith PetscFunctionReturn(0); 1365c6c1daeSBarry Smith } 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith /*@C 1395c6c1daeSBarry Smith 14036a9e3b9SBarry Smith PetscViewerStringGetStringRead - Returns the string that a string viewer uses 14136a9e3b9SBarry Smith 14236a9e3b9SBarry Smith Logically Collective on PetscViewer 14336a9e3b9SBarry Smith 14436a9e3b9SBarry Smith Input Parameter: 14536a9e3b9SBarry Smith . viewer - string viewer 14636a9e3b9SBarry Smith 147fd292e60Sprj- Output Parameters: 14836a9e3b9SBarry Smith + string - the string, optional use NULL if you do not need 14936a9e3b9SBarry Smith - len - the length of the string, optional use NULL if you do 15036a9e3b9SBarry Smith 15136a9e3b9SBarry Smith Notes: Do not write to the string nor free it 15236a9e3b9SBarry Smith 15336a9e3b9SBarry Smith Level: advanced 15436a9e3b9SBarry Smith 155db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringSetString()`, `PetscViewerStringSPrintf()`, 156db781477SPatrick Sanan `PetscViewerStringSetOwnString()` 15736a9e3b9SBarry Smith @*/ 158*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringGetStringRead(PetscViewer viewer, const char *string[], size_t *len) { 15936a9e3b9SBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 16036a9e3b9SBarry Smith PetscBool isstring; 16136a9e3b9SBarry Smith 16236a9e3b9SBarry Smith PetscFunctionBegin; 16336a9e3b9SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 1649566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 16528b400f6SJacob Faibussowitsch PetscCheck(isstring, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Only for PETSCVIEWERSTRING"); 16636a9e3b9SBarry Smith if (string) *string = vstr->string; 16736a9e3b9SBarry Smith if (len) *len = vstr->maxlen; 16836a9e3b9SBarry Smith PetscFunctionReturn(0); 16936a9e3b9SBarry Smith } 17036a9e3b9SBarry Smith 17136a9e3b9SBarry Smith /*@C 17236a9e3b9SBarry Smith 1735c6c1daeSBarry Smith PetscViewerStringSetString - sets the string that a string viewer will print to 1745c6c1daeSBarry Smith 1755c6c1daeSBarry Smith Logically Collective on PetscViewer 1765c6c1daeSBarry Smith 1775c6c1daeSBarry Smith Input Parameters: 1785c6c1daeSBarry Smith + viewer - string viewer you wish to attach string to 1795c6c1daeSBarry Smith . string - the string to print data into 1805c6c1daeSBarry Smith - len - the length of the string 1815c6c1daeSBarry Smith 182effebcafSBarry Smith Notes: The function does not copy the string, it uses it directly therefore you cannot free 18336a9e3b9SBarry Smith the string until the viewer is destroyed. If you call PetscViewerStringSetOwnString() the ownership 18436a9e3b9SBarry Smith passes to the viewer and it will be responsable for freeing it. In this case the string must be 18536a9e3b9SBarry Smith obtained with PetscMalloc(). 18636a9e3b9SBarry Smith 1875c6c1daeSBarry Smith Level: advanced 1885c6c1daeSBarry Smith 189db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSPrintf()`, 190db781477SPatrick Sanan `PetscViewerStringSetOwnString()` 1915c6c1daeSBarry Smith @*/ 192*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSetString(PetscViewer viewer, char string[], size_t len) { 1935c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 1945c6c1daeSBarry Smith PetscBool isstring; 1955c6c1daeSBarry Smith 1965c6c1daeSBarry Smith PetscFunctionBegin; 1975c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 1985c6c1daeSBarry Smith PetscValidCharPointer(string, 2); 1999566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 2005c6c1daeSBarry Smith if (!isstring) PetscFunctionReturn(0); 20108401ef6SPierre Jolivet PetscCheck(len > 2, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "String must have length at least 2"); 2025c6c1daeSBarry Smith 2039566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(string, len)); 2045c6c1daeSBarry Smith vstr->string = string; 2055c6c1daeSBarry Smith vstr->head = string; 2065c6c1daeSBarry Smith vstr->curlen = 0; 2075c6c1daeSBarry Smith vstr->maxlen = len; 2085c6c1daeSBarry Smith PetscFunctionReturn(0); 2095c6c1daeSBarry Smith } 2105c6c1daeSBarry Smith 21136a9e3b9SBarry Smith /*@C 21236a9e3b9SBarry Smith 21336a9e3b9SBarry Smith PetscViewerStringSetOwnString - tells the viewer that it now owns the string and is responsible for freeing it 21436a9e3b9SBarry Smith 21536a9e3b9SBarry Smith Logically Collective on PetscViewer 21636a9e3b9SBarry Smith 21736a9e3b9SBarry Smith Input Parameters: 21836a9e3b9SBarry Smith . viewer - string viewer 21936a9e3b9SBarry Smith 22036a9e3b9SBarry Smith Notes: If you call this the string must have been obtained with PetscMalloc() and you cannot free the string 22136a9e3b9SBarry Smith 22236a9e3b9SBarry Smith Level: advanced 22336a9e3b9SBarry Smith 224db781477SPatrick Sanan .seealso: `PetscViewerStringOpen()`, `PETSCVIEWERSTRING`, `PetscViewerStringGetStringRead()`, `PetscViewerStringSPrintf()`, 225db781477SPatrick Sanan `PetscViewerStringSetString()` 22636a9e3b9SBarry Smith @*/ 227*9371c9d4SSatish Balay PetscErrorCode PetscViewerStringSetOwnString(PetscViewer viewer) { 22836a9e3b9SBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 22936a9e3b9SBarry Smith PetscBool isstring; 23036a9e3b9SBarry Smith 23136a9e3b9SBarry Smith PetscFunctionBegin; 23236a9e3b9SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 2339566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 23436a9e3b9SBarry Smith if (!isstring) PetscFunctionReturn(0); 23536a9e3b9SBarry Smith 23636a9e3b9SBarry Smith vstr->ownstring = PETSC_TRUE; 23736a9e3b9SBarry Smith PetscFunctionReturn(0); 23836a9e3b9SBarry Smith } 239