1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h> /*I "petscsys.h" I*/ 3*5c6c1daeSBarry Smith #include <stdarg.h> 4*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 5*5c6c1daeSBarry Smith #include <stdlib.h> 6*5c6c1daeSBarry Smith #endif 7*5c6c1daeSBarry Smith 8*5c6c1daeSBarry Smith typedef struct { 9*5c6c1daeSBarry Smith char *string; /* string where info is stored */ 10*5c6c1daeSBarry Smith char *head; /* pointer to begining of unused portion */ 11*5c6c1daeSBarry Smith size_t curlen,maxlen; 12*5c6c1daeSBarry Smith } PetscViewer_String; 13*5c6c1daeSBarry Smith 14*5c6c1daeSBarry Smith #undef __FUNCT__ 15*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_String" 16*5c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_String(PetscViewer viewer) 17*5c6c1daeSBarry Smith { 18*5c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String *)viewer->data; 19*5c6c1daeSBarry Smith PetscErrorCode ierr; 20*5c6c1daeSBarry Smith 21*5c6c1daeSBarry Smith PetscFunctionBegin; 22*5c6c1daeSBarry Smith ierr = PetscFree(vstr);CHKERRQ(ierr); 23*5c6c1daeSBarry Smith PetscFunctionReturn(0); 24*5c6c1daeSBarry Smith } 25*5c6c1daeSBarry Smith 26*5c6c1daeSBarry Smith #undef __FUNCT__ 27*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSPrintf" 28*5c6c1daeSBarry Smith /*@C 29*5c6c1daeSBarry Smith PetscViewerStringSPrintf - Prints information to a PetscViewer string. 30*5c6c1daeSBarry Smith 31*5c6c1daeSBarry Smith Logically Collective on PetscViewer (Hmmm, each processor maintains a separate string) 32*5c6c1daeSBarry Smith 33*5c6c1daeSBarry Smith Input Parameters: 34*5c6c1daeSBarry Smith + v - a string PetscViewer, formed by PetscViewerStringOpen() 35*5c6c1daeSBarry Smith - format - the format of the input 36*5c6c1daeSBarry Smith 37*5c6c1daeSBarry Smith Level: developer 38*5c6c1daeSBarry Smith 39*5c6c1daeSBarry Smith Fortran Note: 40*5c6c1daeSBarry Smith This routine is not supported in Fortran. 41*5c6c1daeSBarry Smith 42*5c6c1daeSBarry Smith Concepts: printing^to string 43*5c6c1daeSBarry Smith 44*5c6c1daeSBarry Smith .seealso: PetscViewerStringOpen() 45*5c6c1daeSBarry Smith @*/ 46*5c6c1daeSBarry Smith PetscErrorCode PetscViewerStringSPrintf(PetscViewer viewer,const char format[],...) 47*5c6c1daeSBarry Smith { 48*5c6c1daeSBarry Smith va_list Argp; 49*5c6c1daeSBarry Smith size_t fullLength; 50*5c6c1daeSBarry Smith size_t shift; 51*5c6c1daeSBarry Smith PetscErrorCode ierr; 52*5c6c1daeSBarry Smith PetscBool isstring; 53*5c6c1daeSBarry Smith char tmp[4096]; 54*5c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String*)viewer->data; 55*5c6c1daeSBarry Smith 56*5c6c1daeSBarry Smith PetscFunctionBegin; 57*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 58*5c6c1daeSBarry Smith PetscValidCharPointer(format,2); 59*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr); 60*5c6c1daeSBarry Smith if (!isstring) PetscFunctionReturn(0); 61*5c6c1daeSBarry Smith if (!vstr->string) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerStringSetString() before using"); 62*5c6c1daeSBarry Smith 63*5c6c1daeSBarry Smith va_start(Argp,format); 64*5c6c1daeSBarry Smith ierr = PetscVSNPrintf(tmp,4096,format,&fullLength,Argp);CHKERRQ(ierr); 65*5c6c1daeSBarry Smith va_end(Argp); 66*5c6c1daeSBarry Smith 67*5c6c1daeSBarry Smith ierr = PetscStrlen(tmp,&shift);CHKERRQ(ierr); 68*5c6c1daeSBarry Smith if (shift >= vstr->maxlen - vstr->curlen - 1) shift = vstr->maxlen - vstr->curlen - 1; 69*5c6c1daeSBarry Smith ierr = PetscStrncpy(vstr->head,tmp,shift);CHKERRQ(ierr); 70*5c6c1daeSBarry Smith 71*5c6c1daeSBarry Smith vstr->head += shift; 72*5c6c1daeSBarry Smith vstr->curlen += shift; 73*5c6c1daeSBarry Smith PetscFunctionReturn(0); 74*5c6c1daeSBarry Smith } 75*5c6c1daeSBarry Smith 76*5c6c1daeSBarry Smith #undef __FUNCT__ 77*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringOpen" 78*5c6c1daeSBarry Smith /*@C 79*5c6c1daeSBarry Smith PetscViewerStringOpen - Opens a string as a PetscViewer. This is a very 80*5c6c1daeSBarry Smith simple PetscViewer; information on the object is simply stored into 81*5c6c1daeSBarry Smith the string in a fairly nice way. 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith Collective on MPI_Comm 84*5c6c1daeSBarry Smith 85*5c6c1daeSBarry Smith Input Parameters: 86*5c6c1daeSBarry Smith + comm - the communicator 87*5c6c1daeSBarry Smith . string - the string to use 88*5c6c1daeSBarry Smith - len - the string length 89*5c6c1daeSBarry Smith 90*5c6c1daeSBarry Smith Output Parameter: 91*5c6c1daeSBarry Smith . lab - the PetscViewer 92*5c6c1daeSBarry Smith 93*5c6c1daeSBarry Smith Level: advanced 94*5c6c1daeSBarry Smith 95*5c6c1daeSBarry Smith Fortran Note: 96*5c6c1daeSBarry Smith This routine is not supported in Fortran. 97*5c6c1daeSBarry Smith 98*5c6c1daeSBarry Smith Concepts: PetscViewerString^creating 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerStringSPrintf() 101*5c6c1daeSBarry Smith @*/ 102*5c6c1daeSBarry Smith PetscErrorCode PetscViewerStringOpen(MPI_Comm comm,char string[],PetscInt len,PetscViewer *lab) 103*5c6c1daeSBarry Smith { 104*5c6c1daeSBarry Smith PetscErrorCode ierr; 105*5c6c1daeSBarry Smith 106*5c6c1daeSBarry Smith PetscFunctionBegin; 107*5c6c1daeSBarry Smith ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr); 108*5c6c1daeSBarry Smith ierr = PetscViewerSetType(*lab,PETSCVIEWERSTRING);CHKERRQ(ierr); 109*5c6c1daeSBarry Smith ierr = PetscViewerStringSetString(*lab,string,len);CHKERRQ(ierr); 110*5c6c1daeSBarry Smith PetscFunctionReturn(0); 111*5c6c1daeSBarry Smith } 112*5c6c1daeSBarry Smith 113*5c6c1daeSBarry Smith #undef __FUNCT__ 114*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_String" 115*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_String(PetscViewer viewer,PetscViewer *sviewer) 116*5c6c1daeSBarry Smith { 117*5c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String*)viewer->data; 118*5c6c1daeSBarry Smith PetscErrorCode ierr; 119*5c6c1daeSBarry Smith 120*5c6c1daeSBarry Smith PetscFunctionBegin; 121*5c6c1daeSBarry Smith ierr = PetscViewerStringOpen(PETSC_COMM_SELF,vstr->head,vstr->maxlen-vstr->curlen,sviewer);CHKERRQ(ierr); 122*5c6c1daeSBarry Smith PetscFunctionReturn(0); 123*5c6c1daeSBarry Smith } 124*5c6c1daeSBarry Smith 125*5c6c1daeSBarry Smith #undef __FUNCT__ 126*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_String" 127*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_String(PetscViewer viewer,PetscViewer *sviewer) 128*5c6c1daeSBarry Smith { 129*5c6c1daeSBarry Smith PetscErrorCode ierr; 130*5c6c1daeSBarry Smith PetscViewer_String *iviewer = (PetscViewer_String*)(*sviewer)->data; 131*5c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String*)viewer->data; 132*5c6c1daeSBarry Smith 133*5c6c1daeSBarry Smith PetscFunctionBegin; 134*5c6c1daeSBarry Smith vstr->head = iviewer->head; 135*5c6c1daeSBarry Smith vstr->curlen += iviewer->curlen; 136*5c6c1daeSBarry Smith ierr = PetscViewerDestroy(sviewer);CHKERRQ(ierr); 137*5c6c1daeSBarry Smith PetscFunctionReturn(0); 138*5c6c1daeSBarry Smith } 139*5c6c1daeSBarry Smith 140*5c6c1daeSBarry Smith EXTERN_C_BEGIN 141*5c6c1daeSBarry Smith #undef __FUNCT__ 142*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_String" 143*5c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate_String(PetscViewer v) 144*5c6c1daeSBarry Smith { 145*5c6c1daeSBarry Smith PetscViewer_String *vstr; 146*5c6c1daeSBarry Smith PetscErrorCode ierr; 147*5c6c1daeSBarry Smith 148*5c6c1daeSBarry Smith PetscFunctionBegin; 149*5c6c1daeSBarry Smith v->ops->destroy = PetscViewerDestroy_String; 150*5c6c1daeSBarry Smith v->ops->view = 0; 151*5c6c1daeSBarry Smith v->ops->flush = 0; 152*5c6c1daeSBarry Smith v->ops->getsingleton = PetscViewerGetSingleton_String; 153*5c6c1daeSBarry Smith v->ops->restoresingleton = PetscViewerRestoreSingleton_String; 154*5c6c1daeSBarry Smith ierr = PetscNewLog(v,PetscViewer_String,&vstr);CHKERRQ(ierr); 155*5c6c1daeSBarry Smith v->data = (void*)vstr; 156*5c6c1daeSBarry Smith vstr->string = 0; 157*5c6c1daeSBarry Smith PetscFunctionReturn(0); 158*5c6c1daeSBarry Smith } 159*5c6c1daeSBarry Smith EXTERN_C_END 160*5c6c1daeSBarry Smith 161*5c6c1daeSBarry Smith #undef __FUNCT__ 162*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerStringSetString" 163*5c6c1daeSBarry Smith /*@C 164*5c6c1daeSBarry Smith 165*5c6c1daeSBarry Smith PetscViewerStringSetString - sets the string that a string viewer will print to 166*5c6c1daeSBarry Smith 167*5c6c1daeSBarry Smith Logically Collective on PetscViewer 168*5c6c1daeSBarry Smith 169*5c6c1daeSBarry Smith Input Parameters: 170*5c6c1daeSBarry Smith + viewer - string viewer you wish to attach string to 171*5c6c1daeSBarry Smith . string - the string to print data into 172*5c6c1daeSBarry Smith - len - the length of the string 173*5c6c1daeSBarry Smith 174*5c6c1daeSBarry Smith Level: advanced 175*5c6c1daeSBarry Smith 176*5c6c1daeSBarry Smith .seealso: PetscViewerStringOpen() 177*5c6c1daeSBarry Smith @*/ 178*5c6c1daeSBarry Smith PetscErrorCode PetscViewerStringSetString(PetscViewer viewer,char string[],PetscInt len) 179*5c6c1daeSBarry Smith { 180*5c6c1daeSBarry Smith PetscViewer_String *vstr = (PetscViewer_String*)viewer->data; 181*5c6c1daeSBarry Smith PetscErrorCode ierr; 182*5c6c1daeSBarry Smith PetscBool isstring; 183*5c6c1daeSBarry Smith 184*5c6c1daeSBarry Smith PetscFunctionBegin; 185*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 186*5c6c1daeSBarry Smith PetscValidCharPointer(string,2); 187*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring);CHKERRQ(ierr); 188*5c6c1daeSBarry Smith if (!isstring) PetscFunctionReturn(0); 189*5c6c1daeSBarry Smith if (len <= 2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"String must have length at least 2"); 190*5c6c1daeSBarry Smith 191*5c6c1daeSBarry Smith ierr = PetscMemzero(string,len*sizeof(char));CHKERRQ(ierr); 192*5c6c1daeSBarry Smith vstr->string = string; 193*5c6c1daeSBarry Smith vstr->head = string; 194*5c6c1daeSBarry Smith vstr->curlen = 0; 195*5c6c1daeSBarry Smith vstr->maxlen = len; 196*5c6c1daeSBarry Smith PetscFunctionReturn(0); 197*5c6c1daeSBarry Smith } 198*5c6c1daeSBarry Smith 199*5c6c1daeSBarry Smith 200*5c6c1daeSBarry Smith 201*5c6c1daeSBarry Smith 202*5c6c1daeSBarry Smith 203*5c6c1daeSBarry Smith 204