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; 799de0f6ecSBarry Smith char *both; 809de0f6ecSBarry Smith khint_t newitem; 819de0f6ecSBarry Smith PetscErrorCode ierr; 829de0f6ecSBarry Smith 839de0f6ecSBarry Smith PetscFunctionBegin; 849de0f6ecSBarry Smith ierr = PetscStrlen(pre,&l1);CHKERRQ(ierr); 859de0f6ecSBarry Smith ierr = PetscStrlen(name,&l2);CHKERRQ(ierr); 869de0f6ecSBarry Smith if (l1+l2 == 0) { 879de0f6ecSBarry Smith *found = PETSC_FALSE; 889de0f6ecSBarry Smith PetscFunctionReturn(0); 899de0f6ecSBarry Smith } 909de0f6ecSBarry Smith ierr = PetscSegBufferGet(hp->strings,l1+l2+1,&both);CHKERRQ(ierr); 919de0f6ecSBarry Smith ierr = PetscStrcpy(both,pre);CHKERRQ(ierr); 929de0f6ecSBarry Smith ierr = PetscStrcat(both,name);CHKERRQ(ierr); 939de0f6ecSBarry Smith kh_put(HTPrinted,hp->printed,both,&newitem); 949de0f6ecSBarry Smith if (!newitem) { 959de0f6ecSBarry Smith ierr = PetscSegBufferUnuse(hp->strings,l1+l2+1);CHKERRQ(ierr); 969de0f6ecSBarry Smith } 979de0f6ecSBarry Smith *found = newitem ? PETSC_FALSE : PETSC_TRUE; 989de0f6ecSBarry Smith PetscFunctionReturn(0); 9994d6a431SBarry Smith } 10094d6a431SBarry Smith 1012bf49c77SBarry Smith #undef __FUNCT__ 1022bf49c77SBarry Smith #define __FUNCT__ "PetscOptionsGetViewer" 1032bf49c77SBarry Smith /*@C 1042bf49c77SBarry Smith PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user 1052bf49c77SBarry Smith 1062bf49c77SBarry Smith Collective on MPI_Comm 1072bf49c77SBarry Smith 1082bf49c77SBarry Smith Input Parameters: 1092bf49c77SBarry Smith + comm - the communicator to own the viewer 1100298fd71SBarry Smith . pre - the string to prepend to the name or NULL 1112bf49c77SBarry Smith - name - the option one is seeking 1122bf49c77SBarry Smith 1132bf49c77SBarry Smith Output Parameter: 114bb1d7374SBarry Smith + viewer - the viewer, pass NULL if not needed 115bb1d7374SBarry Smith . format - the PetscViewerFormat requested by the user, pass NULL if not needed 1162bf49c77SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 1172bf49c77SBarry Smith 1182bf49c77SBarry Smith Level: intermediate 1192bf49c77SBarry Smith 1202bf49c77SBarry Smith Notes: If no value is provided ascii:stdout is used 121d1da0b69SBarry Smith $ ascii[:[filename][:[format][:append]]] defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab, 122d1da0b69SBarry Smith for example ascii::ascii_info prints just the information about the object not all details 123d1da0b69SBarry Smith unless :append is given filename opens in write mode, overwriting what was already there 124d1da0b69SBarry Smith $ binary[:[filename][:[format][:append]]] defaults to the file binaryoutput 125*acd7d2deSBarry Smith $ draw[:drawtype[:filename]] for example, draw:tikz, draw:tikz:figure.tex or draw:x 1262bf49c77SBarry Smith $ socket[:port] defaults to the standard output port 1272a359c20SBarry Smith $ saws[:communicatorname] publishes object to the Scientific Application Webserver (SAWs) 1282bf49c77SBarry Smith 129cffb1e40SBarry Smith Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur 1302bf49c77SBarry Smith 13127b0f280SBarry Smith If PETSc is configured with --with-viewfromoptions=0 this function always returns with *set of PETSC_FALSE 13227b0f280SBarry Smith 1332bf49c77SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1342bf49c77SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 1352bf49c77SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 1362bf49c77SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1372bf49c77SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1382bf49c77SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 139a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1402bf49c77SBarry Smith @*/ 141cffb1e40SBarry Smith PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) 1422bf49c77SBarry Smith { 1432bf49c77SBarry Smith char *value; 1442bf49c77SBarry Smith PetscErrorCode ierr; 14520610d12SBarry Smith PetscBool flag,hashelp; 1462bf49c77SBarry Smith 1472bf49c77SBarry Smith PetscFunctionBegin; 1482bf49c77SBarry Smith PetscValidCharPointer(name,3); 1492bf49c77SBarry Smith 15027b0f280SBarry Smith if (set) *set = PETSC_FALSE; 15127b0f280SBarry Smith #if defined(PETSC_SKIP_VIEWFROMOPTIONS) 15227b0f280SBarry Smith PetscFunctionReturn(0); 15327b0f280SBarry Smith #endif 15427b0f280SBarry Smith 155c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-help",&hashelp);CHKERRQ(ierr); 15620610d12SBarry Smith if (hashelp) { 1579de0f6ecSBarry Smith PetscBool found; 1589af95d99SBarry Smith 1599de0f6ecSBarry Smith if (!PetscOptionsHelpPrintedSingleton) { 1609de0f6ecSBarry Smith ierr = PetscOptionsHelpPrintedCreate(&PetscOptionsHelpPrintedSingleton);CHKERRQ(ierr); 1619af95d99SBarry Smith } 1629de0f6ecSBarry Smith ierr = PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrintedSingleton,pre,name,&found);CHKERRQ(ierr); 1639de0f6ecSBarry Smith if (!found) { 16494d6a431SBarry Smith if (viewer) { 16594d6a431SBarry 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); 16694d6a431SBarry 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); 167*acd7d2deSBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s draw[:drawtype[:filename]] %s (%s)\n",pre ? pre : "",name+1,"Draws object","PetscOptionsGetViewer");CHKERRQ(ierr); 16894d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s socket[:port]: %s (%s)\n",pre ? pre : "",name+1,"Pushes object to a Unix socket","PetscOptionsGetViewer");CHKERRQ(ierr); 16994d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s saws[:communicatorname]: %s (%s)\n\n",pre ? pre : "",name+1,"Publishes object to SAWs","PetscOptionsGetViewer");CHKERRQ(ierr); 17094d6a431SBarry Smith } else { 17194d6a431SBarry Smith ierr = (*PetscHelpPrintf)(comm," -%s%s\n",pre ? pre : "",name+1);CHKERRQ(ierr); 17294d6a431SBarry Smith } 17394d6a431SBarry Smith } 17420610d12SBarry Smith } 175685405a1SBarry Smith 176e3f3e4b6SBarry Smith if (format) *format = PETSC_VIEWER_DEFAULT; 177c5929fdfSBarry Smith ierr = PetscOptionsFindPair_Private(NULL,pre,name,&value,&flag);CHKERRQ(ierr); 1782bf49c77SBarry Smith if (flag) { 1792bf49c77SBarry Smith if (set) *set = PETSC_TRUE; 1802bf49c77SBarry Smith if (!value) { 181bb1d7374SBarry Smith if (viewer) { 1822bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 183706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 184bb1d7374SBarry Smith } 1852bf49c77SBarry Smith } else { 18635d27ee3SJed Brown char *loc0_vtype,*loc1_fname,*loc2_fmt = NULL,*loc3_fmode = NULL; 1872bf49c77SBarry Smith PetscInt cnt; 188a75e6a4aSMatthew G. Knepley const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERSAWS,PETSCVIEWERVTK,PETSCVIEWERHDF5,0}; 1892bf49c77SBarry Smith 19035d27ee3SJed Brown ierr = PetscStrallocpy(value,&loc0_vtype);CHKERRQ(ierr); 19135d27ee3SJed Brown ierr = PetscStrchr(loc0_vtype,':',&loc1_fname);CHKERRQ(ierr); 19235d27ee3SJed Brown if (loc1_fname) { 19335d27ee3SJed Brown *loc1_fname++ = 0; 19435d27ee3SJed Brown ierr = PetscStrchr(loc1_fname,':',&loc2_fmt);CHKERRQ(ierr); 19535d27ee3SJed Brown } 19635d27ee3SJed Brown if (loc2_fmt) { 19735d27ee3SJed Brown *loc2_fmt++ = 0; 19835d27ee3SJed Brown ierr = PetscStrchr(loc2_fmt,':',&loc3_fmode);CHKERRQ(ierr); 19935d27ee3SJed Brown } 20035d27ee3SJed Brown if (loc3_fmode) *loc3_fmode++ = 0; 20135d27ee3SJed Brown ierr = PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii",viewers,&cnt);CHKERRQ(ierr); 20235d27ee3SJed Brown if (cnt > (PetscInt) sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",loc0_vtype); 203bb1d7374SBarry Smith if (viewer) { 20435d27ee3SJed Brown if (!loc1_fname) { 20543b63833SBarry Smith switch (cnt) { 20643b63833SBarry Smith case 0: 2072bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 20843b63833SBarry Smith break; 20943b63833SBarry Smith case 1: 210aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) CHKERRQ(PETSC_ERR_PLIB); 21143b63833SBarry Smith break; 21243b63833SBarry Smith case 2: 213aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) CHKERRQ(PETSC_ERR_PLIB); 21443b63833SBarry Smith break; 215b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER) 21643b63833SBarry Smith case 3: 217aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) CHKERRQ(PETSC_ERR_PLIB); 21843b63833SBarry Smith break; 219b58ca069SBarry Smith #endif 22043b63833SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE) 22143b63833SBarry Smith case 4: 222aa1c909bSJed Brown if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) CHKERRQ(PETSC_ERR_PLIB); 22343b63833SBarry Smith break; 22443b63833SBarry Smith #endif 225e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 226bfb97211SBarry Smith case 5: 227e04113cfSBarry Smith if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) CHKERRQ(PETSC_ERR_PLIB); 228bfb97211SBarry Smith break; 229bfb97211SBarry Smith #endif 230a75e6a4aSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5) 231a75e6a4aSMatthew G. Knepley case 7: 232a75e6a4aSMatthew G. Knepley if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) CHKERRQ(PETSC_ERR_PLIB); 233a75e6a4aSMatthew G. Knepley break; 234a75e6a4aSMatthew G. Knepley #endif 235aa1c909bSJed Brown default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",loc0_vtype); 2367f677774SBarry Smith } 237706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 2387f677774SBarry Smith } else { 23935d27ee3SJed Brown if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */ 2407f677774SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 241706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 2427f677774SBarry Smith } else { 2433550efbcSJed Brown PetscFileMode fmode; 2442bf49c77SBarry Smith ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 24535d27ee3SJed Brown ierr = PetscViewerSetType(*viewer,*loc0_vtype ? loc0_vtype : "ascii");CHKERRQ(ierr); 2463550efbcSJed Brown fmode = FILE_MODE_WRITE; 2473550efbcSJed Brown if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */ 24835d27ee3SJed Brown ierr = PetscEnumFind(PetscFileModes,loc3_fmode,(PetscEnum*)&fmode,&flag);CHKERRQ(ierr); 2493550efbcSJed Brown if (!flag) SETERRQ1(comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown file mode: %s",loc3_fmode); 2507f677774SBarry Smith } 251*acd7d2deSBarry Smith if (loc2_fmt) { 252*acd7d2deSBarry Smith PetscBool tk; 253*acd7d2deSBarry Smith ierr = PetscStrcmp(loc1_fname,"tikz",&tk);CHKERRQ(ierr); 254*acd7d2deSBarry Smith if (tk) { 255*acd7d2deSBarry Smith ierr = PetscViewerDrawSetInfo(*viewer,NULL,loc2_fmt,0,0,0,0);CHKERRQ(ierr); 256*acd7d2deSBarry Smith *loc2_fmt = 0; 257*acd7d2deSBarry Smith } 258*acd7d2deSBarry Smith } 2593550efbcSJed Brown ierr = PetscViewerFileSetMode(*viewer,flag?fmode:FILE_MODE_WRITE);CHKERRQ(ierr); 26035d27ee3SJed Brown ierr = PetscViewerFileSetName(*viewer,loc1_fname);CHKERRQ(ierr); 261d1da0b69SBarry Smith ierr = PetscViewerDrawSetDrawType(*viewer,loc1_fname);CHKERRQ(ierr); 26205315717SToby Isaac } 26305315717SToby Isaac } 264bb1d7374SBarry Smith } 265bb1d7374SBarry Smith if (viewer) { 266bb1d7374SBarry Smith ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); 267bb1d7374SBarry Smith } 26835d27ee3SJed Brown if (loc2_fmt && *loc2_fmt) { 26935d27ee3SJed Brown ierr = PetscEnumFind(PetscViewerFormats,loc2_fmt,(PetscEnum*)format,&flag);CHKERRQ(ierr); 27035d27ee3SJed Brown if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2_fmt);CHKERRQ(ierr); 2717f677774SBarry Smith } 27235d27ee3SJed Brown ierr = PetscFree(loc0_vtype);CHKERRQ(ierr); 2732bf49c77SBarry Smith } 2742bf49c77SBarry Smith } 2752bf49c77SBarry Smith PetscFunctionReturn(0); 2762bf49c77SBarry Smith } 2772bf49c77SBarry Smith 2782bf49c77SBarry Smith #undef __FUNCT__ 2795c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate" 2805c6c1daeSBarry Smith /*@ 2815c6c1daeSBarry Smith PetscViewerCreate - Creates a viewing context 2825c6c1daeSBarry Smith 2835c6c1daeSBarry Smith Collective on MPI_Comm 2845c6c1daeSBarry Smith 2855c6c1daeSBarry Smith Input Parameter: 2865c6c1daeSBarry Smith . comm - MPI communicator 2875c6c1daeSBarry Smith 2885c6c1daeSBarry Smith Output Parameter: 2895c6c1daeSBarry Smith . inviewer - location to put the PetscViewer context 2905c6c1daeSBarry Smith 2915c6c1daeSBarry Smith Level: advanced 2925c6c1daeSBarry Smith 2935c6c1daeSBarry Smith Concepts: graphics^creating PetscViewer 2945c6c1daeSBarry Smith Concepts: file input/output^creating PetscViewer 2955c6c1daeSBarry Smith Concepts: sockets^creating PetscViewer 2965c6c1daeSBarry Smith 2975c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith @*/ 3005c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer) 3015c6c1daeSBarry Smith { 3025c6c1daeSBarry Smith PetscViewer viewer; 3035c6c1daeSBarry Smith PetscErrorCode ierr; 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith PetscFunctionBegin; 3065c6c1daeSBarry Smith *inviewer = 0; 307607a6623SBarry Smith ierr = PetscViewerInitializePackage();CHKERRQ(ierr); 30873107ff1SLisandro Dalcin ierr = PetscHeaderCreate(viewer,PETSC_VIEWER_CLASSID,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,NULL);CHKERRQ(ierr); 3095c6c1daeSBarry Smith *inviewer = viewer; 3105c6c1daeSBarry Smith viewer->data = 0; 3115c6c1daeSBarry Smith PetscFunctionReturn(0); 3125c6c1daeSBarry Smith } 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith #undef __FUNCT__ 3155c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetType" 3165c6c1daeSBarry Smith /*@C 3175c6c1daeSBarry Smith PetscViewerSetType - Builds PetscViewer for a particular implementation. 3185c6c1daeSBarry Smith 3195c6c1daeSBarry Smith Collective on PetscViewer 3205c6c1daeSBarry Smith 3215c6c1daeSBarry Smith Input Parameter: 3225c6c1daeSBarry Smith + viewer - the PetscViewer context 3238f6c3df8SBarry Smith - type - for example, PETSCVIEWERASCII 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Options Database Command: 3265c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 3275c6c1daeSBarry Smith of available methods (for instance, ascii) 3285c6c1daeSBarry Smith 3295c6c1daeSBarry Smith Level: advanced 3305c6c1daeSBarry Smith 3315c6c1daeSBarry Smith Notes: 3325c6c1daeSBarry Smith See "include/petscviewer.h" for available methods (for instance, 3338f6c3df8SBarry Smith PETSCVIEWERSOCKET) 3345c6c1daeSBarry Smith 3356a9046bcSBarry Smith .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType, PetscViewerPushFormat() 3365c6c1daeSBarry Smith @*/ 3375c6c1daeSBarry Smith PetscErrorCode PetscViewerSetType(PetscViewer viewer,PetscViewerType type) 3385c6c1daeSBarry Smith { 3395c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscViewer); 3405c6c1daeSBarry Smith PetscBool match; 3415c6c1daeSBarry Smith 3425c6c1daeSBarry Smith PetscFunctionBegin; 3435c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3445c6c1daeSBarry Smith PetscValidCharPointer(type,2); 3455c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr); 3465c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 3475c6c1daeSBarry Smith 3485c6c1daeSBarry Smith /* cleanup any old type that may be there */ 3495c6c1daeSBarry Smith if (viewer->data) { 3505c6c1daeSBarry Smith ierr = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr); 351a297a907SKarl Rupp 3520298fd71SBarry Smith viewer->ops->destroy = NULL; 3535c6c1daeSBarry Smith viewer->data = 0; 3545c6c1daeSBarry Smith } 3555c6c1daeSBarry Smith ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr); 3565c6c1daeSBarry Smith 3571c9cd337SJed Brown ierr = PetscFunctionListFind(PetscViewerList,type,&r);CHKERRQ(ierr); 3585c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type); 3595c6c1daeSBarry Smith 3605c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr); 3615c6c1daeSBarry Smith ierr = (*r)(viewer);CHKERRQ(ierr); 3625c6c1daeSBarry Smith PetscFunctionReturn(0); 3635c6c1daeSBarry Smith } 3645c6c1daeSBarry Smith 3655c6c1daeSBarry Smith #undef __FUNCT__ 3665c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegister" 3671c84c290SBarry Smith /*@C 3681c84c290SBarry Smith PetscViewerRegister - Adds a viewer 3691c84c290SBarry Smith 3701c84c290SBarry Smith Not Collective 3711c84c290SBarry Smith 3721c84c290SBarry Smith Input Parameters: 3731c84c290SBarry Smith + name_solver - name of a new user-defined viewer 3741c84c290SBarry Smith - routine_create - routine to create method context 3751c84c290SBarry Smith 3761c84c290SBarry Smith Level: developer 3771c84c290SBarry Smith Notes: 3781c84c290SBarry Smith PetscViewerRegister() may be called multiple times to add several user-defined viewers. 3791c84c290SBarry Smith 3801c84c290SBarry Smith Sample usage: 3811c84c290SBarry Smith .vb 382bdf89e91SBarry Smith PetscViewerRegister("my_viewer_type",MyViewerCreate); 3831c84c290SBarry Smith .ve 3841c84c290SBarry Smith 3851c84c290SBarry Smith Then, your solver can be chosen with the procedural interface via 3861c84c290SBarry Smith $ PetscViewerSetType(viewer,"my_viewer_type") 3871c84c290SBarry Smith or at runtime via the option 3881c84c290SBarry Smith $ -viewer_type my_viewer_type 3891c84c290SBarry Smith 3901c84c290SBarry Smith Concepts: registering^Viewers 3911c84c290SBarry Smith 3921c84c290SBarry Smith .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy() 3931c84c290SBarry Smith @*/ 394bdf89e91SBarry Smith PetscErrorCode PetscViewerRegister(const char *sname,PetscErrorCode (*function)(PetscViewer)) 3955c6c1daeSBarry Smith { 3965c6c1daeSBarry Smith PetscErrorCode ierr; 3975c6c1daeSBarry Smith 3985c6c1daeSBarry Smith PetscFunctionBegin; 399a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscViewerList,sname,function);CHKERRQ(ierr); 4005c6c1daeSBarry Smith PetscFunctionReturn(0); 4015c6c1daeSBarry Smith } 4025c6c1daeSBarry Smith 4035c6c1daeSBarry Smith #undef __FUNCT__ 4045c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetFromOptions" 4055c6c1daeSBarry Smith /*@C 4065c6c1daeSBarry Smith PetscViewerSetFromOptions - Sets the graphics type from the options database. 4075c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith Collective on PetscViewer 4105c6c1daeSBarry Smith 4115c6c1daeSBarry Smith Input Parameter: 4125c6c1daeSBarry Smith . PetscViewer - the graphics context 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Level: intermediate 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith Notes: 4175c6c1daeSBarry Smith Must be called after PetscViewerCreate() before the PetscViewer is used. 4185c6c1daeSBarry Smith 4195c6c1daeSBarry Smith Concepts: PetscViewer^setting options 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 4225c6c1daeSBarry Smith 4235c6c1daeSBarry Smith @*/ 4245c6c1daeSBarry Smith PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer) 4255c6c1daeSBarry Smith { 4265c6c1daeSBarry Smith PetscErrorCode ierr; 4275c6c1daeSBarry Smith char vtype[256]; 4285c6c1daeSBarry Smith PetscBool flg; 4295c6c1daeSBarry Smith 4305c6c1daeSBarry Smith PetscFunctionBegin; 4315c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith if (!PetscViewerList) { 434607a6623SBarry Smith ierr = PetscViewerRegisterAll();CHKERRQ(ierr); 4355c6c1daeSBarry Smith } 4365c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr); 437a264d7a6SBarry 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); 4385c6c1daeSBarry Smith if (flg) { 4395c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr); 4405c6c1daeSBarry Smith } 4415c6c1daeSBarry Smith /* type has not been set? */ 4425c6c1daeSBarry Smith if (!((PetscObject)viewer)->type_name) { 4435c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 4445c6c1daeSBarry Smith } 4455c6c1daeSBarry Smith if (viewer->ops->setfromoptions) { 446e55864a3SBarry Smith ierr = (*viewer->ops->setfromoptions)(PetscOptionsObject,viewer);CHKERRQ(ierr); 4475c6c1daeSBarry Smith } 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 4500633abcbSJed Brown ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)viewer);CHKERRQ(ierr); 451ce1779c8SBarry Smith ierr = PetscViewerViewFromOptions(viewer,NULL,"-viewer_view");CHKERRQ(ierr); 4525c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 4535c6c1daeSBarry Smith PetscFunctionReturn(0); 4545c6c1daeSBarry Smith } 455816f7b76SBarry Smith 456816f7b76SBarry Smith #undef __FUNCT__ 457816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStart" 458816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStart(PetscViewer viewer,PetscInt *mcnt,PetscInt *cnt) 459816f7b76SBarry Smith { 460816f7b76SBarry Smith PetscErrorCode ierr; 461816f7b76SBarry Smith PetscFunctionBegin; 462816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,mcnt);CHKERRQ(ierr); 463816f7b76SBarry Smith ierr = PetscViewerBinaryGetFlowControl(viewer,cnt);CHKERRQ(ierr); 464816f7b76SBarry Smith PetscFunctionReturn(0); 465816f7b76SBarry Smith } 466816f7b76SBarry Smith 467816f7b76SBarry Smith #undef __FUNCT__ 468816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepMaster" 469816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepMaster(PetscViewer viewer,PetscInt i,PetscInt *mcnt,PetscInt cnt) 470816f7b76SBarry Smith { 471816f7b76SBarry Smith PetscErrorCode ierr; 472816f7b76SBarry Smith MPI_Comm comm; 473816f7b76SBarry Smith 474816f7b76SBarry Smith PetscFunctionBegin; 475816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 476816f7b76SBarry Smith if (i >= *mcnt) { 477816f7b76SBarry Smith *mcnt += cnt; 478816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 479816f7b76SBarry Smith } 480816f7b76SBarry Smith PetscFunctionReturn(0); 481816f7b76SBarry Smith } 482816f7b76SBarry Smith 483816f7b76SBarry Smith #undef __FUNCT__ 484816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndMaster" 485816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndMaster(PetscViewer viewer,PetscInt *mcnt) 486816f7b76SBarry Smith { 487816f7b76SBarry Smith PetscErrorCode ierr; 488816f7b76SBarry Smith MPI_Comm comm; 489816f7b76SBarry Smith PetscFunctionBegin; 490816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 491816f7b76SBarry Smith *mcnt = 0; 492816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 493816f7b76SBarry Smith PetscFunctionReturn(0); 494816f7b76SBarry Smith } 495816f7b76SBarry Smith 496816f7b76SBarry Smith #undef __FUNCT__ 497816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepWorker" 498816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepWorker(PetscViewer viewer,PetscMPIInt rank,PetscInt *mcnt) 499816f7b76SBarry Smith { 500816f7b76SBarry Smith PetscErrorCode ierr; 501816f7b76SBarry Smith MPI_Comm comm; 502816f7b76SBarry Smith PetscFunctionBegin; 503816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 504816f7b76SBarry Smith while (PETSC_TRUE) { 505816f7b76SBarry Smith if (rank < *mcnt) break; 506816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 507816f7b76SBarry Smith } 508816f7b76SBarry Smith PetscFunctionReturn(0); 509816f7b76SBarry Smith } 510816f7b76SBarry Smith 511816f7b76SBarry Smith #undef __FUNCT__ 512816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndWorker" 513816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndWorker(PetscViewer viewer,PetscInt *mcnt) 514816f7b76SBarry Smith { 515816f7b76SBarry Smith PetscErrorCode ierr; 516816f7b76SBarry Smith MPI_Comm comm; 517816f7b76SBarry Smith PetscFunctionBegin; 518816f7b76SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 519816f7b76SBarry Smith while (PETSC_TRUE) { 520816f7b76SBarry Smith ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr); 521816f7b76SBarry Smith if (!*mcnt) break; 522816f7b76SBarry Smith } 523816f7b76SBarry Smith PetscFunctionReturn(0); 524816f7b76SBarry Smith } 525