15c6c1daeSBarry Smith 2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 3e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 4e04113cfSBarry Smith #include <petscviewersaws.h> 5bfb97211SBarry Smith #endif 65c6c1daeSBarry Smith 7140e18c1SBarry Smith PetscFunctionList PetscViewerList = 0; 85c6c1daeSBarry Smith 99af95d99SBarry Smith #include "../src/sys/utils/hash.h" 109af95d99SBarry Smith 119af95d99SBarry Smith 129de0f6ecSBarry Smith PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton = NULL; 139de0f6ecSBarry Smith KHASH_SET_INIT_STR(HTPrinted) 149de0f6ecSBarry Smith struct _n_PetscOptionsHelpPrinted{ 159de0f6ecSBarry Smith khash_t(HTPrinted) *printed; 169de0f6ecSBarry Smith PetscSegBuffer strings; 179de0f6ecSBarry Smith }; 189de0f6ecSBarry Smith 199de0f6ecSBarry Smith #undef __FUNCT__ 209de0f6ecSBarry Smith #define __FUNCT__ "PetscOptionsHelpPrintedDestroy" 219de0f6ecSBarry Smith PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted *hp) 2294d6a431SBarry Smith { 239af95d99SBarry Smith PetscErrorCode ierr; 249de0f6ecSBarry Smith 259de0f6ecSBarry Smith PetscFunctionBegin; 269de0f6ecSBarry Smith if (!*hp) PetscFunctionReturn(0); 279de0f6ecSBarry Smith kh_destroy(HTPrinted,(*hp)->printed); 289de0f6ecSBarry Smith ierr = PetscSegBufferDestroy(&(*hp)->strings);CHKERRQ(ierr); 299de0f6ecSBarry Smith ierr = PetscFree(*hp);CHKERRQ(ierr); 309de0f6ecSBarry Smith PetscFunctionReturn(0); 319de0f6ecSBarry Smith } 329de0f6ecSBarry Smith 339de0f6ecSBarry Smith #undef __FUNCT__ 349de0f6ecSBarry Smith #define __FUNCT__ "PetscOptionsHelpPrintedCreate" 359de0f6ecSBarry Smith /*@C 369de0f6ecSBarry Smith PetscOptionsHelpPrintedCreate - Creates an object used to manage tracking which help messages have 379de0f6ecSBarry Smith been printed so they will not be printed again. 389de0f6ecSBarry Smith 399de0f6ecSBarry Smith Not collective 409de0f6ecSBarry Smith 419de0f6ecSBarry Smith Level: developer 429de0f6ecSBarry Smith 439de0f6ecSBarry Smith .seealso: PetscOptionsHelpPrintedCheck(), PetscOptionsHelpPrintChecked() 449de0f6ecSBarry Smith @*/ 459de0f6ecSBarry Smith PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted *hp) 469de0f6ecSBarry Smith { 479de0f6ecSBarry Smith PetscErrorCode ierr; 489de0f6ecSBarry Smith 499de0f6ecSBarry Smith PetscFunctionBegin; 509de0f6ecSBarry Smith ierr = PetscNew(hp);CHKERRQ(ierr); 519de0f6ecSBarry Smith (*hp)->printed = kh_init(HTPrinted); 529de0f6ecSBarry Smith ierr = PetscSegBufferCreate(sizeof(char),10000,&(*hp)->strings);CHKERRQ(ierr); 539de0f6ecSBarry Smith PetscFunctionReturn(0); 549de0f6ecSBarry Smith } 559de0f6ecSBarry Smith 569de0f6ecSBarry Smith #undef __FUNCT__ 579de0f6ecSBarry Smith #define __FUNCT__ "PetscOptionsHelpPrintedCheck" 589de0f6ecSBarry Smith /*@C 599de0f6ecSBarry Smith PetscOptionsHelpPrintedCheck - Checks if a particular pre, name pair has previous been entered (meaning the help message was printed) 609de0f6ecSBarry Smith 619de0f6ecSBarry Smith Not collective 629de0f6ecSBarry Smith 639de0f6ecSBarry Smith Input Parameters: 649de0f6ecSBarry Smith + hp - the object used to manage tracking what help messages have been printed 659de0f6ecSBarry Smith . pre - the prefix part of the string, many be NULL 669de0f6ecSBarry Smith - name - the string to look for (cannot be NULL) 679de0f6ecSBarry Smith 689de0f6ecSBarry Smith Output Parameter: 699de0f6ecSBarry Smith . found - PETSC_TRUE if the string was already set 709de0f6ecSBarry Smith 719de0f6ecSBarry Smith Level: intermediate 729de0f6ecSBarry Smith 739de0f6ecSBarry Smith 749de0f6ecSBarry Smith .seealso: PetscOptionsHelpPrintedCreate() 759de0f6ecSBarry Smith @*/ 769de0f6ecSBarry Smith PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted hp,const char *pre,const char* name,PetscBool *found) 779de0f6ecSBarry Smith { 789de0f6ecSBarry Smith size_t l1,l2; 79*c1449d8eSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 809de0f6ecSBarry Smith char *both; 819de0f6ecSBarry Smith khint_t newitem; 82*c1449d8eSBarry Smith #endif 839de0f6ecSBarry Smith PetscErrorCode ierr; 849de0f6ecSBarry Smith 859de0f6ecSBarry Smith PetscFunctionBegin; 869de0f6ecSBarry Smith ierr = PetscStrlen(pre,&l1);CHKERRQ(ierr); 879de0f6ecSBarry Smith ierr = PetscStrlen(name,&l2);CHKERRQ(ierr); 889de0f6ecSBarry Smith if (l1+l2 == 0) { 899de0f6ecSBarry Smith *found = PETSC_FALSE; 909de0f6ecSBarry Smith PetscFunctionReturn(0); 919de0f6ecSBarry Smith } 92*c1449d8eSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 939de0f6ecSBarry Smith ierr = PetscSegBufferGet(hp->strings,l1+l2+1,&both);CHKERRQ(ierr); 949de0f6ecSBarry Smith ierr = PetscStrcpy(both,pre);CHKERRQ(ierr); 959de0f6ecSBarry Smith ierr = PetscStrcat(both,name);CHKERRQ(ierr); 969de0f6ecSBarry Smith kh_put(HTPrinted,hp->printed,both,&newitem); 979de0f6ecSBarry Smith if (!newitem) { 989de0f6ecSBarry Smith ierr = PetscSegBufferUnuse(hp->strings,l1+l2+1);CHKERRQ(ierr); 999de0f6ecSBarry Smith } 1009de0f6ecSBarry Smith *found = newitem ? PETSC_FALSE : PETSC_TRUE; 101*c1449d8eSBarry Smith #else 102*c1449d8eSBarry Smith *found = PETSC_FALSE; 103*c1449d8eSBarry Smith #endif 1049de0f6ecSBarry Smith PetscFunctionReturn(0); 10594d6a431SBarry Smith } 10694d6a431SBarry Smith 1072bf49c77SBarry Smith #undef __FUNCT__ 1082bf49c77SBarry Smith #define __FUNCT__ "PetscOptionsGetViewer" 1092bf49c77SBarry Smith /*@C 1102bf49c77SBarry Smith PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user 1112bf49c77SBarry Smith 1122bf49c77SBarry Smith Collective on MPI_Comm 1132bf49c77SBarry Smith 1142bf49c77SBarry Smith Input Parameters: 1152bf49c77SBarry Smith + comm - the communicator to own the viewer 1160298fd71SBarry Smith . pre - the string to prepend to the name or NULL 1172bf49c77SBarry Smith - name - the option one is seeking 1182bf49c77SBarry Smith 1192bf49c77SBarry Smith Output Parameter: 120bb1d7374SBarry Smith + viewer - the viewer, pass NULL if not needed 121bb1d7374SBarry Smith . format - the PetscViewerFormat requested by the user, pass NULL if not needed 1222bf49c77SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 1232bf49c77SBarry Smith 1242bf49c77SBarry Smith Level: intermediate 1252bf49c77SBarry Smith 1262bf49c77SBarry Smith Notes: If no value is provided ascii:stdout is used 127d1da0b69SBarry Smith $ ascii[:[filename][:[format][:append]]] defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab, 128d1da0b69SBarry Smith for example ascii::ascii_info prints just the information about the object not all details 129d1da0b69SBarry Smith unless :append is given filename opens in write mode, overwriting what was already there 130d1da0b69SBarry Smith $ binary[:[filename][:[format][:append]]] defaults to the file binaryoutput 131acd7d2deSBarry Smith $ draw[:drawtype[:filename]] for example, draw:tikz, draw:tikz:figure.tex or draw:x 1322bf49c77SBarry Smith $ socket[:port] defaults to the standard output port 1332a359c20SBarry Smith $ saws[:communicatorname] publishes object to the Scientific Application Webserver (SAWs) 1342bf49c77SBarry Smith 135cffb1e40SBarry Smith Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur 1362bf49c77SBarry Smith 13727b0f280SBarry Smith If PETSc is configured with --with-viewfromoptions=0 this function always returns with *set of PETSC_FALSE 13827b0f280SBarry Smith 1392bf49c77SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1402bf49c77SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 1412bf49c77SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 1422bf49c77SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1432bf49c77SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1442bf49c77SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 145a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1462bf49c77SBarry Smith @*/ 147cffb1e40SBarry Smith PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) 1482bf49c77SBarry Smith { 1492bf49c77SBarry Smith char *value; 1502bf49c77SBarry Smith PetscErrorCode ierr; 15120610d12SBarry Smith PetscBool flag,hashelp; 1522bf49c77SBarry Smith 1532bf49c77SBarry Smith PetscFunctionBegin; 1542bf49c77SBarry Smith PetscValidCharPointer(name,3); 1552bf49c77SBarry Smith 15627b0f280SBarry Smith if (set) *set = PETSC_FALSE; 15727b0f280SBarry Smith #if defined(PETSC_SKIP_VIEWFROMOPTIONS) 15827b0f280SBarry Smith PetscFunctionReturn(0); 15927b0f280SBarry Smith #endif 16027b0f280SBarry Smith 161c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-help",&hashelp);CHKERRQ(ierr); 16220610d12SBarry Smith if (hashelp) { 1639de0f6ecSBarry Smith PetscBool found; 1649af95d99SBarry Smith 1659de0f6ecSBarry Smith if (!PetscOptionsHelpPrintedSingleton) { 1669de0f6ecSBarry Smith ierr = PetscOptionsHelpPrintedCreate(&PetscOptionsHelpPrintedSingleton);CHKERRQ(ierr); 1679af95d99SBarry Smith } 1689de0f6ecSBarry Smith ierr = PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrintedSingleton,pre,name,&found);CHKERRQ(ierr); 1699de0f6ecSBarry Smith if (!found) { 17094d6a431SBarry Smith if (viewer) { 17194d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm,"\n -%s%s ascii[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Prints object to stdout or ASCII file","PetscOptionsGetViewer");CHKERRQ(ierr); 17294d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s binary[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Saves object to a binary file","PetscOptionsGetViewer");CHKERRQ(ierr); 173acd7d2deSBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s draw[:drawtype[:filename]] %s (%s)\n",pre ? pre : "",name+1,"Draws object","PetscOptionsGetViewer");CHKERRQ(ierr); 17494d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s socket[:port]: %s (%s)\n",pre ? pre : "",name+1,"Pushes object to a Unix socket","PetscOptionsGetViewer");CHKERRQ(ierr); 17594d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s saws[:communicatorname]: %s (%s)\n\n",pre ? pre : "",name+1,"Publishes object to SAWs","PetscOptionsGetViewer");CHKERRQ(ierr); 17694d6a431SBarry Smith } else { 17794d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s\n",pre ? pre : "",name+1);CHKERRQ(ierr); 17894d6a431SBarry Smith } 17994d6a431SBarry Smith } 18020610d12SBarry Smith } 181685405a1SBarry Smith 182e3f3e4b6SBarry Smith if (format) *format = PETSC_VIEWER_DEFAULT; 183c5929fdfSBarry Smith ierr = PetscOptionsFindPair_Private(NULL,pre,name,&value,&flag);CHKERRQ(ierr); 1842bf49c77SBarry Smith if (flag) { 1852bf49c77SBarry Smith if (set) *set = PETSC_TRUE; 1862bf49c77SBarry Smith if (!value) { 187bb1d7374SBarry Smith if (viewer) { 1882bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 189706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 190bb1d7374SBarry Smith } 1912bf49c77SBarry Smith } else { 19235d27ee3SJed Brown char *loc0_vtype,*loc1_fname,*loc2_fmt = NULL,*loc3_fmode = NULL; 1932bf49c77SBarry Smith PetscInt cnt; 194a75e6a4aSMatthew G. Knepley const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERSAWS,PETSCVIEWERVTK,PETSCVIEWERHDF5,0}; 1952bf49c77SBarry Smith 19635d27ee3SJed Brown ierr = PetscStrallocpy(value,&loc0_vtype);CHKERRQ(ierr); 19735d27ee3SJed Brown ierr = PetscStrchr(loc0_vtype,':',&loc1_fname);CHKERRQ(ierr); 19835d27ee3SJed Brown if (loc1_fname) { 19935d27ee3SJed Brown *loc1_fname++ = 0; 20035d27ee3SJed Brown ierr = PetscStrchr(loc1_fname,':',&loc2_fmt);CHKERRQ(ierr); 20135d27ee3SJed Brown } 20235d27ee3SJed Brown if (loc2_fmt) { 20335d27ee3SJed Brown *loc2_fmt++ = 0; 20435d27ee3SJed Brown ierr = PetscStrchr(loc2_fmt,':',&loc3_fmode);CHKERRQ(ierr); 20535d27ee3SJed Brown } 20635d27ee3SJed Brown if (loc3_fmode) *loc3_fmode++ = 0; 20735d27ee3SJed Brown ierr = PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii",viewers,&cnt);CHKERRQ(ierr); 20835d27ee3SJed Brown if (cnt > (PetscInt) sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",loc0_vtype); 209bb1d7374SBarry Smith if (viewer) { 21035d27ee3SJed Brown if (!loc1_fname) { 21143b63833SBarry Smith switch (cnt) { 21243b63833SBarry Smith case 0: 2132bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 21443b63833SBarry Smith break; 21543b63833SBarry Smith case 1: 216aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) CHKERRQ(PETSC_ERR_PLIB); 21743b63833SBarry Smith break; 21843b63833SBarry Smith case 2: 219aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) CHKERRQ(PETSC_ERR_PLIB); 22043b63833SBarry Smith break; 221b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER) 22243b63833SBarry Smith case 3: 223aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) CHKERRQ(PETSC_ERR_PLIB); 22443b63833SBarry Smith break; 225b58ca069SBarry Smith #endif 22643b63833SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE) 22743b63833SBarry Smith case 4: 228aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) CHKERRQ(PETSC_ERR_PLIB); 22943b63833SBarry Smith break; 23043b63833SBarry Smith #endif 231e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 232bfb97211SBarry Smith case 5: 233e04113cfSBarry Smith if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) CHKERRQ(PETSC_ERR_PLIB); 234bfb97211SBarry Smith break; 235bfb97211SBarry Smith #endif 236a75e6a4aSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 237a75e6a4aSMatthew G. Knepley case 7: 238a75e6a4aSMatthew G. Knepley if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) CHKERRQ(PETSC_ERR_PLIB); 239a75e6a4aSMatthew G. Knepley break; 240a75e6a4aSMatthew G. Knepley #endif 241aa1c909bSJed Brown default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",loc0_vtype); 2427f677774SBarry Smith } 243706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 2447f677774SBarry Smith } else { 24535d27ee3SJed Brown if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */ 2467f677774SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 247706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 2487f677774SBarry Smith } else { 2493550efbcSJed Brown PetscFileMode fmode; 2502bf49c77SBarry Smith ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 25135d27ee3SJed Brown ierr = PetscViewerSetType(*viewer,*loc0_vtype ? loc0_vtype : "ascii");CHKERRQ(ierr); 2523550efbcSJed Brown fmode = FILE_MODE_WRITE; 2533550efbcSJed Brown if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */ 25435d27ee3SJed Brown ierr = PetscEnumFind(PetscFileModes,loc3_fmode,(PetscEnum*)&fmode,&flag);CHKERRQ(ierr); 2553550efbcSJed Brown if (!flag) SETERRQ1(comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown file mode: %s",loc3_fmode); 2567f677774SBarry Smith } 257acd7d2deSBarry Smith if (loc2_fmt) { 258acd7d2deSBarry Smith PetscBool tk; 259acd7d2deSBarry Smith ierr = PetscStrcmp(loc1_fname,"tikz",&tk);CHKERRQ(ierr); 260acd7d2deSBarry Smith if (tk) { 261acd7d2deSBarry Smith ierr = PetscViewerDrawSetInfo(*viewer,NULL,loc2_fmt,0,0,0,0);CHKERRQ(ierr); 262acd7d2deSBarry Smith *loc2_fmt = 0; 263acd7d2deSBarry Smith } 264acd7d2deSBarry Smith } 2653550efbcSJed Brown ierr = PetscViewerFileSetMode(*viewer,flag?fmode:FILE_MODE_WRITE);CHKERRQ(ierr); 26635d27ee3SJed Brown ierr = PetscViewerFileSetName(*viewer,loc1_fname);CHKERRQ(ierr); 267d1da0b69SBarry Smith ierr = PetscViewerDrawSetDrawType(*viewer,loc1_fname);CHKERRQ(ierr); 26805315717SToby Isaac } 26905315717SToby Isaac } 270bb1d7374SBarry Smith } 271bb1d7374SBarry Smith if (viewer) { 272bb1d7374SBarry Smith ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); 273bb1d7374SBarry Smith } 27435d27ee3SJed Brown if (loc2_fmt && *loc2_fmt) { 27535d27ee3SJed Brown ierr = PetscEnumFind(PetscViewerFormats,loc2_fmt,(PetscEnum*)format,&flag);CHKERRQ(ierr); 27635d27ee3SJed Brown if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2_fmt);CHKERRQ(ierr); 2777f677774SBarry Smith } 27835d27ee3SJed Brown ierr = PetscFree(loc0_vtype);CHKERRQ(ierr); 2792bf49c77SBarry Smith } 2802bf49c77SBarry Smith } 2812bf49c77SBarry Smith PetscFunctionReturn(0); 2822bf49c77SBarry Smith } 2832bf49c77SBarry Smith 2842bf49c77SBarry Smith #undef __FUNCT__ 2855c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate" 2865c6c1daeSBarry Smith /*@ 2875c6c1daeSBarry Smith PetscViewerCreate - Creates a viewing context 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith Collective on MPI_Comm 2905c6c1daeSBarry Smith 2915c6c1daeSBarry Smith Input Parameter: 2925c6c1daeSBarry Smith . comm - MPI communicator 2935c6c1daeSBarry Smith 2945c6c1daeSBarry Smith Output Parameter: 2955c6c1daeSBarry Smith . inviewer - location to put the PetscViewer context 2965c6c1daeSBarry Smith 2975c6c1daeSBarry Smith Level: advanced 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith Concepts: graphics^creating PetscViewer 3005c6c1daeSBarry Smith Concepts: file input/output^creating PetscViewer 3015c6c1daeSBarry Smith Concepts: sockets^creating PetscViewer 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith @*/ 3065c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer) 3075c6c1daeSBarry Smith { 3085c6c1daeSBarry Smith PetscViewer viewer; 3095c6c1daeSBarry Smith PetscErrorCode ierr; 3105c6c1daeSBarry Smith 3115c6c1daeSBarry Smith PetscFunctionBegin; 3125c6c1daeSBarry Smith *inviewer = 0; 313607a6623SBarry Smith ierr = PetscViewerInitializePackage();CHKERRQ(ierr); 31473107ff1SLisandro Dalcin ierr = PetscHeaderCreate(viewer,PETSC_VIEWER_CLASSID,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,NULL);CHKERRQ(ierr); 3155c6c1daeSBarry Smith *inviewer = viewer; 3165c6c1daeSBarry Smith viewer->data = 0; 3175c6c1daeSBarry Smith PetscFunctionReturn(0); 3185c6c1daeSBarry Smith } 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith #undef __FUNCT__ 3215c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetType" 3225c6c1daeSBarry Smith /*@C 3235c6c1daeSBarry Smith PetscViewerSetType - Builds PetscViewer for a particular implementation. 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Collective on PetscViewer 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith Input Parameter: 3285c6c1daeSBarry Smith + viewer - the PetscViewer context 3298f6c3df8SBarry Smith - type - for example, PETSCVIEWERASCII 3305c6c1daeSBarry Smith 3315c6c1daeSBarry Smith Options Database Command: 3325c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 3335c6c1daeSBarry Smith of available methods (for instance, ascii) 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith Level: advanced 3365c6c1daeSBarry Smith 3375c6c1daeSBarry Smith Notes: 3385c6c1daeSBarry Smith See "include/petscviewer.h" for available methods (for instance, 3398f6c3df8SBarry Smith PETSCVIEWERSOCKET) 3405c6c1daeSBarry Smith 3416a9046bcSBarry Smith .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType, PetscViewerPushFormat() 3425c6c1daeSBarry Smith @*/ 3435c6c1daeSBarry Smith PetscErrorCode PetscViewerSetType(PetscViewer viewer,PetscViewerType type) 3445c6c1daeSBarry Smith { 3455c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscViewer); 3465c6c1daeSBarry Smith PetscBool match; 3475c6c1daeSBarry Smith 3485c6c1daeSBarry Smith PetscFunctionBegin; 3495c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3505c6c1daeSBarry Smith PetscValidCharPointer(type,2); 3515c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr); 3525c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 3535c6c1daeSBarry Smith 3545c6c1daeSBarry Smith /* cleanup any old type that may be there */ 3555c6c1daeSBarry Smith if (viewer->data) { 3565c6c1daeSBarry Smith ierr = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr); 357a297a907SKarl Rupp 3580298fd71SBarry Smith viewer->ops->destroy = NULL; 3595c6c1daeSBarry Smith viewer->data = 0; 3605c6c1daeSBarry Smith } 3615c6c1daeSBarry Smith ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr); 3625c6c1daeSBarry Smith 3631c9cd337SJed Brown ierr = PetscFunctionListFind(PetscViewerList,type,&r);CHKERRQ(ierr); 3645c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type); 3655c6c1daeSBarry Smith 3665c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr); 3675c6c1daeSBarry Smith ierr = (*r)(viewer);CHKERRQ(ierr); 3685c6c1daeSBarry Smith PetscFunctionReturn(0); 3695c6c1daeSBarry Smith } 3705c6c1daeSBarry Smith 3715c6c1daeSBarry Smith #undef __FUNCT__ 3725c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegister" 3731c84c290SBarry Smith /*@C 3741c84c290SBarry Smith PetscViewerRegister - Adds a viewer 3751c84c290SBarry Smith 3761c84c290SBarry Smith Not Collective 3771c84c290SBarry Smith 3781c84c290SBarry Smith Input Parameters: 3791c84c290SBarry Smith + name_solver - name of a new user-defined viewer 3801c84c290SBarry Smith - routine_create - routine to create method context 3811c84c290SBarry Smith 3821c84c290SBarry Smith Level: developer 3831c84c290SBarry Smith Notes: 3841c84c290SBarry Smith PetscViewerRegister() may be called multiple times to add several user-defined viewers. 3851c84c290SBarry Smith 3861c84c290SBarry Smith Sample usage: 3871c84c290SBarry Smith .vb 388bdf89e91SBarry Smith PetscViewerRegister("my_viewer_type",MyViewerCreate); 3891c84c290SBarry Smith .ve 3901c84c290SBarry Smith 3911c84c290SBarry Smith Then, your solver can be chosen with the procedural interface via 3921c84c290SBarry Smith $ PetscViewerSetType(viewer,"my_viewer_type") 3931c84c290SBarry Smith or at runtime via the option 3941c84c290SBarry Smith $ -viewer_type my_viewer_type 3951c84c290SBarry Smith 3961c84c290SBarry Smith Concepts: registering^Viewers 3971c84c290SBarry Smith 3981c84c290SBarry Smith .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy() 3991c84c290SBarry Smith @*/ 400bdf89e91SBarry Smith PetscErrorCode PetscViewerRegister(const char *sname,PetscErrorCode (*function)(PetscViewer)) 4015c6c1daeSBarry Smith { 4025c6c1daeSBarry Smith PetscErrorCode ierr; 4035c6c1daeSBarry Smith 4045c6c1daeSBarry Smith PetscFunctionBegin; 405a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscViewerList,sname,function);CHKERRQ(ierr); 4065c6c1daeSBarry Smith PetscFunctionReturn(0); 4075c6c1daeSBarry Smith } 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith #undef __FUNCT__ 4105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetFromOptions" 4115c6c1daeSBarry Smith /*@C 4125c6c1daeSBarry Smith PetscViewerSetFromOptions - Sets the graphics type from the options database. 4135c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 4145c6c1daeSBarry Smith 4155c6c1daeSBarry Smith Collective on PetscViewer 4165c6c1daeSBarry Smith 4175c6c1daeSBarry Smith Input Parameter: 4185c6c1daeSBarry Smith . PetscViewer - the graphics context 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith Level: intermediate 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith Notes: 4235c6c1daeSBarry Smith Must be called after PetscViewerCreate() before the PetscViewer is used. 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Concepts: PetscViewer^setting options 4265c6c1daeSBarry Smith 4275c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith @*/ 4305c6c1daeSBarry Smith PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer) 4315c6c1daeSBarry Smith { 4325c6c1daeSBarry Smith PetscErrorCode ierr; 4335c6c1daeSBarry Smith char vtype[256]; 4345c6c1daeSBarry Smith PetscBool flg; 4355c6c1daeSBarry Smith 4365c6c1daeSBarry Smith PetscFunctionBegin; 4375c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4385c6c1daeSBarry Smith 4395c6c1daeSBarry Smith if (!PetscViewerList) { 440607a6623SBarry Smith ierr = PetscViewerRegisterAll();CHKERRQ(ierr); 4415c6c1daeSBarry Smith } 4425c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr); 443a264d7a6SBarry Smith ierr = PetscOptionsFList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char*)(((PetscObject)viewer)->type_name ? ((PetscObject)viewer)->type_name : PETSCVIEWERASCII),vtype,256,&flg);CHKERRQ(ierr); 4445c6c1daeSBarry Smith if (flg) { 4455c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr); 4465c6c1daeSBarry Smith } 4475c6c1daeSBarry Smith /* type has not been set? */ 4485c6c1daeSBarry Smith if (!((PetscObject)viewer)->type_name) { 4495c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 4505c6c1daeSBarry Smith } 4515c6c1daeSBarry Smith if (viewer->ops->setfromoptions) { 452e55864a3SBarry Smith ierr = (*viewer->ops->setfromoptions)(PetscOptionsObject,viewer);CHKERRQ(ierr); 4535c6c1daeSBarry Smith } 4545c6c1daeSBarry Smith 4555c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 4560633abcbSJed Brown ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)viewer);CHKERRQ(ierr); 457ce1779c8SBarry Smith ierr = PetscViewerViewFromOptions(viewer,NULL,"-viewer_view");CHKERRQ(ierr); 4585c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 4595c6c1daeSBarry Smith PetscFunctionReturn(0); 4605c6c1daeSBarry Smith } 461816f7b76SBarry Smith 462816f7b76SBarry Smith #undef __FUNCT__ 463816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStart" 464816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStart(PetscViewer viewer,PetscInt *mcnt,PetscInt *cnt) 465816f7b76SBarry Smith { 466816f7b76SBarry Smith PetscErrorCode ierr; 467816f7b76SBarry Smith PetscFunctionBegin; 468816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,mcnt);CHKERRQ(ierr); 469816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,cnt);CHKERRQ(ierr); 470816f7b76SBarry Smith PetscFunctionReturn(0); 471816f7b76SBarry Smith } 472816f7b76SBarry Smith 473816f7b76SBarry Smith #undef __FUNCT__ 474816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepMaster" 475816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepMaster(PetscViewer viewer,PetscInt i,PetscInt *mcnt,PetscInt cnt) 476816f7b76SBarry Smith { 477816f7b76SBarry Smith PetscErrorCode ierr; 478816f7b76SBarry Smith MPI_Comm comm; 479816f7b76SBarry Smith 480816f7b76SBarry Smith PetscFunctionBegin; 481816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 482816f7b76SBarry Smith if (i >= *mcnt) { 483816f7b76SBarry Smith *mcnt += cnt; 484816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 485816f7b76SBarry Smith } 486816f7b76SBarry Smith PetscFunctionReturn(0); 487816f7b76SBarry Smith } 488816f7b76SBarry Smith 489816f7b76SBarry Smith #undef __FUNCT__ 490816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndMaster" 491816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndMaster(PetscViewer viewer,PetscInt *mcnt) 492816f7b76SBarry Smith { 493816f7b76SBarry Smith PetscErrorCode ierr; 494816f7b76SBarry Smith MPI_Comm comm; 495816f7b76SBarry Smith PetscFunctionBegin; 496816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 497816f7b76SBarry Smith *mcnt = 0; 498816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 499816f7b76SBarry Smith PetscFunctionReturn(0); 500816f7b76SBarry Smith } 501816f7b76SBarry Smith 502816f7b76SBarry Smith #undef __FUNCT__ 503816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepWorker" 504816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepWorker(PetscViewer viewer,PetscMPIInt rank,PetscInt *mcnt) 505816f7b76SBarry Smith { 506816f7b76SBarry Smith PetscErrorCode ierr; 507816f7b76SBarry Smith MPI_Comm comm; 508816f7b76SBarry Smith PetscFunctionBegin; 509816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 510816f7b76SBarry Smith while (PETSC_TRUE) { 511816f7b76SBarry Smith if (rank < *mcnt) break; 512816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 513816f7b76SBarry Smith } 514816f7b76SBarry Smith PetscFunctionReturn(0); 515816f7b76SBarry Smith } 516816f7b76SBarry Smith 517816f7b76SBarry Smith #undef __FUNCT__ 518816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndWorker" 519816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndWorker(PetscViewer viewer,PetscInt *mcnt) 520816f7b76SBarry Smith { 521816f7b76SBarry Smith PetscErrorCode ierr; 522816f7b76SBarry Smith MPI_Comm comm; 523816f7b76SBarry Smith PetscFunctionBegin; 524816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 525816f7b76SBarry Smith while (PETSC_TRUE) { 526816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 527816f7b76SBarry Smith if (!*mcnt) break; 528816f7b76SBarry Smith } 529816f7b76SBarry Smith PetscFunctionReturn(0); 530816f7b76SBarry Smith } 531