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 9*94d6a431SBarry Smith /* 10*94d6a431SBarry Smith A standard run of an implicit TS generated 60 help message hashes, 11*94d6a431SBarry Smith thus we reserve room for 5 combinations of prefixes. If that is not 12*94d6a431SBarry Smith enough then any additional help messages will be printed multiple times. 13*94d6a431SBarry Smith */ 14*94d6a431SBarry Smith #define PETSCSTRINGHASHSIZE 300 15*94d6a431SBarry Smith typedef struct { 16*94d6a431SBarry Smith int cnt; 17*94d6a431SBarry Smith unsigned long hashes[PETSCSTRINGHASHSIZE]; 18*94d6a431SBarry Smith } PetscStrHash; 19*94d6a431SBarry Smith 20*94d6a431SBarry Smith /* 21*94d6a431SBarry Smith This is the djb2 due to Dan Bernstein http://www.cse.yorku.ca/~oz/hash.html 22*94d6a431SBarry Smith */ 23*94d6a431SBarry Smith PETSC_STATIC_INLINE unsigned long PetscStrHashHash(const char *pre,const char *str) 24*94d6a431SBarry Smith { 25*94d6a431SBarry Smith unsigned long hash = 5381; 26*94d6a431SBarry Smith int c; 27*94d6a431SBarry Smith 28*94d6a431SBarry Smith if (pre) { 29*94d6a431SBarry Smith while ((c = *pre++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 30*94d6a431SBarry Smith } 31*94d6a431SBarry Smith while ((c = *str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 32*94d6a431SBarry Smith return hash; 33*94d6a431SBarry Smith } 34*94d6a431SBarry Smith 35*94d6a431SBarry Smith PETSC_STATIC_INLINE PetscBool PetscStrHashCheck(PetscStrHash *ht,const char *pre,const char *str) 36*94d6a431SBarry Smith { 37*94d6a431SBarry Smith unsigned long h = PetscStrHashHash(pre,str); 38*94d6a431SBarry Smith int i; 39*94d6a431SBarry Smith for (i=0; i<ht->cnt; i++) { 40*94d6a431SBarry Smith if (ht->hashes[i] == h) return PETSC_TRUE; 41*94d6a431SBarry Smith } 42*94d6a431SBarry Smith if (ht->cnt >= PETSCSTRINGHASHSIZE) return PETSC_FALSE; 43*94d6a431SBarry Smith ht->hashes[ht->cnt++] = h; 44*94d6a431SBarry Smith return PETSC_FALSE; 45*94d6a431SBarry Smith } 46*94d6a431SBarry Smith 47*94d6a431SBarry Smith 482bf49c77SBarry Smith #undef __FUNCT__ 492bf49c77SBarry Smith #define __FUNCT__ "PetscOptionsGetViewer" 502bf49c77SBarry Smith /*@C 512bf49c77SBarry Smith PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user 522bf49c77SBarry Smith 532bf49c77SBarry Smith Collective on MPI_Comm 542bf49c77SBarry Smith 552bf49c77SBarry Smith Input Parameters: 562bf49c77SBarry Smith + comm - the communicator to own the viewer 570298fd71SBarry Smith . pre - the string to prepend to the name or NULL 582bf49c77SBarry Smith - name - the option one is seeking 592bf49c77SBarry Smith 602bf49c77SBarry Smith Output Parameter: 61bb1d7374SBarry Smith + viewer - the viewer, pass NULL if not needed 62bb1d7374SBarry Smith . format - the PetscViewerFormat requested by the user, pass NULL if not needed 632bf49c77SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 642bf49c77SBarry Smith 652bf49c77SBarry Smith Level: intermediate 662bf49c77SBarry Smith 672bf49c77SBarry Smith Notes: If no value is provided ascii:stdout is used 68d1da0b69SBarry Smith $ ascii[:[filename][:[format][:append]]] defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab, 69d1da0b69SBarry Smith for example ascii::ascii_info prints just the information about the object not all details 70d1da0b69SBarry Smith unless :append is given filename opens in write mode, overwriting what was already there 71d1da0b69SBarry Smith $ binary[:[filename][:[format][:append]]] defaults to the file binaryoutput 7220610d12SBarry Smith $ draw[:drawtype] for example, draw:tikz or draw:x 732bf49c77SBarry Smith $ socket[:port] defaults to the standard output port 742a359c20SBarry Smith $ saws[:communicatorname] publishes object to the Scientific Application Webserver (SAWs) 752bf49c77SBarry Smith 76cffb1e40SBarry Smith Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur 772bf49c77SBarry Smith 7827b0f280SBarry Smith If PETSc is configured with --with-viewfromoptions=0 this function always returns with *set of PETSC_FALSE 7927b0f280SBarry Smith 802bf49c77SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 812bf49c77SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 822bf49c77SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 832bf49c77SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 842bf49c77SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 852bf49c77SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 86a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 872bf49c77SBarry Smith @*/ 88cffb1e40SBarry Smith PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) 892bf49c77SBarry Smith { 902bf49c77SBarry Smith char *value; 912bf49c77SBarry Smith PetscErrorCode ierr; 9220610d12SBarry Smith PetscBool flag,hashelp; 93*94d6a431SBarry Smith static PetscStrHash ht; 942bf49c77SBarry Smith 952bf49c77SBarry Smith PetscFunctionBegin; 962bf49c77SBarry Smith PetscValidCharPointer(name,3); 972bf49c77SBarry Smith 9827b0f280SBarry Smith if (set) *set = PETSC_FALSE; 9927b0f280SBarry Smith #if defined(PETSC_SKIP_VIEWFROMOPTIONS) 10027b0f280SBarry Smith PetscFunctionReturn(0); 10127b0f280SBarry Smith #endif 10227b0f280SBarry Smith 103c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-help",&hashelp);CHKERRQ(ierr); 10420610d12SBarry Smith if (hashelp) { 105*94d6a431SBarry Smith if (!PetscStrHashCheck(&ht,pre,name)) { 106*94d6a431SBarry Smith if (viewer) { 107*94d6a431SBarry 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); 108*94d6a431SBarry 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); 109*94d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s draw[:drawtype]: %s (%s)\n",pre ? pre : "",name+1,"Draws object","PetscOptionsGetViewer");CHKERRQ(ierr); 110*94d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s socket[:port]: %s (%s)\n",pre ? pre : "",name+1,"Pushes object to a Unix socket","PetscOptionsGetViewer");CHKERRQ(ierr); 111*94d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s saws[:communicatorname]: %s (%s)\n\n",pre ? pre : "",name+1,"Publishes object to SAWs","PetscOptionsGetViewer");CHKERRQ(ierr); 112*94d6a431SBarry Smith } else { 113*94d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s\n",pre ? pre : "",name+1);CHKERRQ(ierr); 114*94d6a431SBarry Smith } 115*94d6a431SBarry Smith } 11620610d12SBarry Smith } 117685405a1SBarry Smith 118e3f3e4b6SBarry Smith if (format) *format = PETSC_VIEWER_DEFAULT; 119c5929fdfSBarry Smith ierr = PetscOptionsFindPair_Private(NULL,pre,name,&value,&flag);CHKERRQ(ierr); 1202bf49c77SBarry Smith if (flag) { 1212bf49c77SBarry Smith if (set) *set = PETSC_TRUE; 1222bf49c77SBarry Smith if (!value) { 123bb1d7374SBarry Smith if (viewer) { 1242bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 125706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 126bb1d7374SBarry Smith } 1272bf49c77SBarry Smith } else { 12835d27ee3SJed Brown char *loc0_vtype,*loc1_fname,*loc2_fmt = NULL,*loc3_fmode = NULL; 1292bf49c77SBarry Smith PetscInt cnt; 130a75e6a4aSMatthew G. Knepley const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERSAWS,PETSCVIEWERVTK,PETSCVIEWERHDF5,0}; 1312bf49c77SBarry Smith 13235d27ee3SJed Brown ierr = PetscStrallocpy(value,&loc0_vtype);CHKERRQ(ierr); 13335d27ee3SJed Brown ierr = PetscStrchr(loc0_vtype,':',&loc1_fname);CHKERRQ(ierr); 13435d27ee3SJed Brown if (loc1_fname) { 13535d27ee3SJed Brown *loc1_fname++ = 0; 13635d27ee3SJed Brown ierr = PetscStrchr(loc1_fname,':',&loc2_fmt);CHKERRQ(ierr); 13735d27ee3SJed Brown } 13835d27ee3SJed Brown if (loc2_fmt) { 13935d27ee3SJed Brown *loc2_fmt++ = 0; 14035d27ee3SJed Brown ierr = PetscStrchr(loc2_fmt,':',&loc3_fmode);CHKERRQ(ierr); 14135d27ee3SJed Brown } 14235d27ee3SJed Brown if (loc3_fmode) *loc3_fmode++ = 0; 14335d27ee3SJed Brown ierr = PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii",viewers,&cnt);CHKERRQ(ierr); 14435d27ee3SJed Brown if (cnt > (PetscInt) sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",loc0_vtype); 145bb1d7374SBarry Smith if (viewer) { 14635d27ee3SJed Brown if (!loc1_fname) { 14743b63833SBarry Smith switch (cnt) { 14843b63833SBarry Smith case 0: 1492bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 15043b63833SBarry Smith break; 15143b63833SBarry Smith case 1: 152aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) CHKERRQ(PETSC_ERR_PLIB); 15343b63833SBarry Smith break; 15443b63833SBarry Smith case 2: 155aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) CHKERRQ(PETSC_ERR_PLIB); 15643b63833SBarry Smith break; 157b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER) 15843b63833SBarry Smith case 3: 159aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) CHKERRQ(PETSC_ERR_PLIB); 16043b63833SBarry Smith break; 161b58ca069SBarry Smith #endif 16243b63833SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE) 16343b63833SBarry Smith case 4: 164aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) CHKERRQ(PETSC_ERR_PLIB); 16543b63833SBarry Smith break; 16643b63833SBarry Smith #endif 167e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 168bfb97211SBarry Smith case 5: 169e04113cfSBarry Smith if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) CHKERRQ(PETSC_ERR_PLIB); 170bfb97211SBarry Smith break; 171bfb97211SBarry Smith #endif 172a75e6a4aSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 173a75e6a4aSMatthew G. Knepley case 7: 174a75e6a4aSMatthew G. Knepley if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) CHKERRQ(PETSC_ERR_PLIB); 175a75e6a4aSMatthew G. Knepley break; 176a75e6a4aSMatthew G. Knepley #endif 177aa1c909bSJed Brown default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",loc0_vtype); 1787f677774SBarry Smith } 179706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 1807f677774SBarry Smith } else { 18135d27ee3SJed Brown if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */ 1827f677774SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 183706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 1847f677774SBarry Smith } else { 1853550efbcSJed Brown PetscFileMode fmode; 1862bf49c77SBarry Smith ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 18735d27ee3SJed Brown ierr = PetscViewerSetType(*viewer,*loc0_vtype ? loc0_vtype : "ascii");CHKERRQ(ierr); 1883550efbcSJed Brown fmode = FILE_MODE_WRITE; 1893550efbcSJed Brown if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */ 19035d27ee3SJed Brown ierr = PetscEnumFind(PetscFileModes,loc3_fmode,(PetscEnum*)&fmode,&flag);CHKERRQ(ierr); 1913550efbcSJed Brown if (!flag) SETERRQ1(comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown file mode: %s",loc3_fmode); 1927f677774SBarry Smith } 1933550efbcSJed Brown ierr = PetscViewerFileSetMode(*viewer,flag?fmode:FILE_MODE_WRITE);CHKERRQ(ierr); 19435d27ee3SJed Brown ierr = PetscViewerFileSetName(*viewer,loc1_fname);CHKERRQ(ierr); 195d1da0b69SBarry Smith ierr = PetscViewerDrawSetDrawType(*viewer,loc1_fname);CHKERRQ(ierr); 19605315717SToby Isaac } 19705315717SToby Isaac } 198bb1d7374SBarry Smith } 199bb1d7374SBarry Smith if (viewer) { 200bb1d7374SBarry Smith ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); 201bb1d7374SBarry Smith } 20235d27ee3SJed Brown if (loc2_fmt && *loc2_fmt) { 20335d27ee3SJed Brown ierr = PetscEnumFind(PetscViewerFormats,loc2_fmt,(PetscEnum*)format,&flag);CHKERRQ(ierr); 20435d27ee3SJed Brown if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2_fmt);CHKERRQ(ierr); 2057f677774SBarry Smith } 20635d27ee3SJed Brown ierr = PetscFree(loc0_vtype);CHKERRQ(ierr); 2072bf49c77SBarry Smith } 2082bf49c77SBarry Smith } 2092bf49c77SBarry Smith PetscFunctionReturn(0); 2102bf49c77SBarry Smith } 2112bf49c77SBarry Smith 2122bf49c77SBarry Smith #undef __FUNCT__ 2135c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate" 2145c6c1daeSBarry Smith /*@ 2155c6c1daeSBarry Smith PetscViewerCreate - Creates a viewing context 2165c6c1daeSBarry Smith 2175c6c1daeSBarry Smith Collective on MPI_Comm 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Input Parameter: 2205c6c1daeSBarry Smith . comm - MPI communicator 2215c6c1daeSBarry Smith 2225c6c1daeSBarry Smith Output Parameter: 2235c6c1daeSBarry Smith . inviewer - location to put the PetscViewer context 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith Level: advanced 2265c6c1daeSBarry Smith 2275c6c1daeSBarry Smith Concepts: graphics^creating PetscViewer 2285c6c1daeSBarry Smith Concepts: file input/output^creating PetscViewer 2295c6c1daeSBarry Smith Concepts: sockets^creating PetscViewer 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType 2325c6c1daeSBarry Smith 2335c6c1daeSBarry Smith @*/ 2345c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer) 2355c6c1daeSBarry Smith { 2365c6c1daeSBarry Smith PetscViewer viewer; 2375c6c1daeSBarry Smith PetscErrorCode ierr; 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith PetscFunctionBegin; 2405c6c1daeSBarry Smith *inviewer = 0; 241607a6623SBarry Smith ierr = PetscViewerInitializePackage();CHKERRQ(ierr); 24273107ff1SLisandro Dalcin ierr = PetscHeaderCreate(viewer,PETSC_VIEWER_CLASSID,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,NULL);CHKERRQ(ierr); 2435c6c1daeSBarry Smith *inviewer = viewer; 2445c6c1daeSBarry Smith viewer->data = 0; 2455c6c1daeSBarry Smith PetscFunctionReturn(0); 2465c6c1daeSBarry Smith } 2475c6c1daeSBarry Smith 2485c6c1daeSBarry Smith #undef __FUNCT__ 2495c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetType" 2505c6c1daeSBarry Smith /*@C 2515c6c1daeSBarry Smith PetscViewerSetType - Builds PetscViewer for a particular implementation. 2525c6c1daeSBarry Smith 2535c6c1daeSBarry Smith Collective on PetscViewer 2545c6c1daeSBarry Smith 2555c6c1daeSBarry Smith Input Parameter: 2565c6c1daeSBarry Smith + viewer - the PetscViewer context 2578f6c3df8SBarry Smith - type - for example, PETSCVIEWERASCII 2585c6c1daeSBarry Smith 2595c6c1daeSBarry Smith Options Database Command: 2605c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 2615c6c1daeSBarry Smith of available methods (for instance, ascii) 2625c6c1daeSBarry Smith 2635c6c1daeSBarry Smith Level: advanced 2645c6c1daeSBarry Smith 2655c6c1daeSBarry Smith Notes: 2665c6c1daeSBarry Smith See "include/petscviewer.h" for available methods (for instance, 2678f6c3df8SBarry Smith PETSCVIEWERSOCKET) 2685c6c1daeSBarry Smith 2696a9046bcSBarry Smith .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType, PetscViewerPushFormat() 2705c6c1daeSBarry Smith @*/ 2715c6c1daeSBarry Smith PetscErrorCode PetscViewerSetType(PetscViewer viewer,PetscViewerType type) 2725c6c1daeSBarry Smith { 2735c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscViewer); 2745c6c1daeSBarry Smith PetscBool match; 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith PetscFunctionBegin; 2775c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2785c6c1daeSBarry Smith PetscValidCharPointer(type,2); 2795c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr); 2805c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2815c6c1daeSBarry Smith 2825c6c1daeSBarry Smith /* cleanup any old type that may be there */ 2835c6c1daeSBarry Smith if (viewer->data) { 2845c6c1daeSBarry Smith ierr = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr); 285a297a907SKarl Rupp 2860298fd71SBarry Smith viewer->ops->destroy = NULL; 2875c6c1daeSBarry Smith viewer->data = 0; 2885c6c1daeSBarry Smith } 2895c6c1daeSBarry Smith ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr); 2905c6c1daeSBarry Smith 2911c9cd337SJed Brown ierr = PetscFunctionListFind(PetscViewerList,type,&r);CHKERRQ(ierr); 2925c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type); 2935c6c1daeSBarry Smith 2945c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr); 2955c6c1daeSBarry Smith ierr = (*r)(viewer);CHKERRQ(ierr); 2965c6c1daeSBarry Smith PetscFunctionReturn(0); 2975c6c1daeSBarry Smith } 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith #undef __FUNCT__ 3005c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegister" 3011c84c290SBarry Smith /*@C 3021c84c290SBarry Smith PetscViewerRegister - Adds a viewer 3031c84c290SBarry Smith 3041c84c290SBarry Smith Not Collective 3051c84c290SBarry Smith 3061c84c290SBarry Smith Input Parameters: 3071c84c290SBarry Smith + name_solver - name of a new user-defined viewer 3081c84c290SBarry Smith - routine_create - routine to create method context 3091c84c290SBarry Smith 3101c84c290SBarry Smith Level: developer 3111c84c290SBarry Smith Notes: 3121c84c290SBarry Smith PetscViewerRegister() may be called multiple times to add several user-defined viewers. 3131c84c290SBarry Smith 3141c84c290SBarry Smith Sample usage: 3151c84c290SBarry Smith .vb 316bdf89e91SBarry Smith PetscViewerRegister("my_viewer_type",MyViewerCreate); 3171c84c290SBarry Smith .ve 3181c84c290SBarry Smith 3191c84c290SBarry Smith Then, your solver can be chosen with the procedural interface via 3201c84c290SBarry Smith $ PetscViewerSetType(viewer,"my_viewer_type") 3211c84c290SBarry Smith or at runtime via the option 3221c84c290SBarry Smith $ -viewer_type my_viewer_type 3231c84c290SBarry Smith 3241c84c290SBarry Smith Concepts: registering^Viewers 3251c84c290SBarry Smith 3261c84c290SBarry Smith .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy() 3271c84c290SBarry Smith @*/ 328bdf89e91SBarry Smith PetscErrorCode PetscViewerRegister(const char *sname,PetscErrorCode (*function)(PetscViewer)) 3295c6c1daeSBarry Smith { 3305c6c1daeSBarry Smith PetscErrorCode ierr; 3315c6c1daeSBarry Smith 3325c6c1daeSBarry Smith PetscFunctionBegin; 333a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscViewerList,sname,function);CHKERRQ(ierr); 3345c6c1daeSBarry Smith PetscFunctionReturn(0); 3355c6c1daeSBarry Smith } 3365c6c1daeSBarry Smith 3375c6c1daeSBarry Smith #undef __FUNCT__ 3385c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetFromOptions" 3395c6c1daeSBarry Smith /*@C 3405c6c1daeSBarry Smith PetscViewerSetFromOptions - Sets the graphics type from the options database. 3415c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 3425c6c1daeSBarry Smith 3435c6c1daeSBarry Smith Collective on PetscViewer 3445c6c1daeSBarry Smith 3455c6c1daeSBarry Smith Input Parameter: 3465c6c1daeSBarry Smith . PetscViewer - the graphics context 3475c6c1daeSBarry Smith 3485c6c1daeSBarry Smith Level: intermediate 3495c6c1daeSBarry Smith 3505c6c1daeSBarry Smith Notes: 3515c6c1daeSBarry Smith Must be called after PetscViewerCreate() before the PetscViewer is used. 3525c6c1daeSBarry Smith 3535c6c1daeSBarry Smith Concepts: PetscViewer^setting options 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith @*/ 3585c6c1daeSBarry Smith PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer) 3595c6c1daeSBarry Smith { 3605c6c1daeSBarry Smith PetscErrorCode ierr; 3615c6c1daeSBarry Smith char vtype[256]; 3625c6c1daeSBarry Smith PetscBool flg; 3635c6c1daeSBarry Smith 3645c6c1daeSBarry Smith PetscFunctionBegin; 3655c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3665c6c1daeSBarry Smith 3675c6c1daeSBarry Smith if (!PetscViewerList) { 368607a6623SBarry Smith ierr = PetscViewerRegisterAll();CHKERRQ(ierr); 3695c6c1daeSBarry Smith } 3705c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr); 371a264d7a6SBarry 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); 3725c6c1daeSBarry Smith if (flg) { 3735c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr); 3745c6c1daeSBarry Smith } 3755c6c1daeSBarry Smith /* type has not been set? */ 3765c6c1daeSBarry Smith if (!((PetscObject)viewer)->type_name) { 3775c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 3785c6c1daeSBarry Smith } 3795c6c1daeSBarry Smith if (viewer->ops->setfromoptions) { 380e55864a3SBarry Smith ierr = (*viewer->ops->setfromoptions)(PetscOptionsObject,viewer);CHKERRQ(ierr); 3815c6c1daeSBarry Smith } 3825c6c1daeSBarry Smith 3835c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 3840633abcbSJed Brown ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)viewer);CHKERRQ(ierr); 385ce1779c8SBarry Smith ierr = PetscViewerViewFromOptions(viewer,NULL,"-viewer_view");CHKERRQ(ierr); 3865c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 3875c6c1daeSBarry Smith PetscFunctionReturn(0); 3885c6c1daeSBarry Smith } 389816f7b76SBarry Smith 390816f7b76SBarry Smith #undef __FUNCT__ 391816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStart" 392816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStart(PetscViewer viewer,PetscInt *mcnt,PetscInt *cnt) 393816f7b76SBarry Smith { 394816f7b76SBarry Smith PetscErrorCode ierr; 395816f7b76SBarry Smith PetscFunctionBegin; 396816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,mcnt);CHKERRQ(ierr); 397816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,cnt);CHKERRQ(ierr); 398816f7b76SBarry Smith PetscFunctionReturn(0); 399816f7b76SBarry Smith } 400816f7b76SBarry Smith 401816f7b76SBarry Smith #undef __FUNCT__ 402816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepMaster" 403816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepMaster(PetscViewer viewer,PetscInt i,PetscInt *mcnt,PetscInt cnt) 404816f7b76SBarry Smith { 405816f7b76SBarry Smith PetscErrorCode ierr; 406816f7b76SBarry Smith MPI_Comm comm; 407816f7b76SBarry Smith 408816f7b76SBarry Smith PetscFunctionBegin; 409816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 410816f7b76SBarry Smith if (i >= *mcnt) { 411816f7b76SBarry Smith *mcnt += cnt; 412816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 413816f7b76SBarry Smith } 414816f7b76SBarry Smith PetscFunctionReturn(0); 415816f7b76SBarry Smith } 416816f7b76SBarry Smith 417816f7b76SBarry Smith #undef __FUNCT__ 418816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndMaster" 419816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndMaster(PetscViewer viewer,PetscInt *mcnt) 420816f7b76SBarry Smith { 421816f7b76SBarry Smith PetscErrorCode ierr; 422816f7b76SBarry Smith MPI_Comm comm; 423816f7b76SBarry Smith PetscFunctionBegin; 424816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 425816f7b76SBarry Smith *mcnt = 0; 426816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 427816f7b76SBarry Smith PetscFunctionReturn(0); 428816f7b76SBarry Smith } 429816f7b76SBarry Smith 430816f7b76SBarry Smith #undef __FUNCT__ 431816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepWorker" 432816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepWorker(PetscViewer viewer,PetscMPIInt rank,PetscInt *mcnt) 433816f7b76SBarry Smith { 434816f7b76SBarry Smith PetscErrorCode ierr; 435816f7b76SBarry Smith MPI_Comm comm; 436816f7b76SBarry Smith PetscFunctionBegin; 437816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 438816f7b76SBarry Smith while (PETSC_TRUE) { 439816f7b76SBarry Smith if (rank < *mcnt) break; 440816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 441816f7b76SBarry Smith } 442816f7b76SBarry Smith PetscFunctionReturn(0); 443816f7b76SBarry Smith } 444816f7b76SBarry Smith 445816f7b76SBarry Smith #undef __FUNCT__ 446816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndWorker" 447816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndWorker(PetscViewer viewer,PetscInt *mcnt) 448816f7b76SBarry Smith { 449816f7b76SBarry Smith PetscErrorCode ierr; 450816f7b76SBarry Smith MPI_Comm comm; 451816f7b76SBarry Smith PetscFunctionBegin; 452816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 453816f7b76SBarry Smith while (PETSC_TRUE) { 454816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 455816f7b76SBarry Smith if (!*mcnt) break; 456816f7b76SBarry Smith } 457816f7b76SBarry Smith PetscFunctionReturn(0); 458816f7b76SBarry Smith } 459