15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the registration process for PETSc PetscDraw routines 45c6c1daeSBarry Smith */ 5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6111ee811SBarry Smith #include <petscviewer.h> /*I "petscviewer.h" I*/ 7111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS) 8111ee811SBarry Smith #include <petscviewersaws.h> 9111ee811SBarry Smith #endif 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith /* 125c6c1daeSBarry Smith Contains the list of registered PetscDraw routines 135c6c1daeSBarry Smith */ 1402c9f0b5SLisandro Dalcin PetscFunctionList PetscDrawList = NULL; 155c6c1daeSBarry Smith 160076e027SBarry Smith /*@C 170076e027SBarry Smith PetscDrawView - Prints the PetscDraw data structure. 180076e027SBarry Smith 190076e027SBarry Smith Collective on PetscDraw 200076e027SBarry Smith 210076e027SBarry Smith Input Parameters: 220076e027SBarry Smith + indraw - the PetscDraw context 230076e027SBarry Smith - viewer - visualization context 240076e027SBarry Smith 25236f5a4dSBarry Smith See PetscDrawSetFromOptions() for options database keys 260076e027SBarry Smith 270076e027SBarry Smith Note: 280076e027SBarry Smith The available visualization contexts include 290076e027SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 300076e027SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 310076e027SBarry Smith output where only the first processor opens 320076e027SBarry Smith the file. All other processors send their 330076e027SBarry Smith data to the first processor to print. 340076e027SBarry Smith 350076e027SBarry Smith The user can open an alternative visualization context with 360076e027SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 370076e027SBarry Smith 380076e027SBarry Smith Level: beginner 390076e027SBarry Smith 400076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen() 410076e027SBarry Smith @*/ 420076e027SBarry Smith PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) 430076e027SBarry Smith { 440076e027SBarry Smith PetscBool isdraw; 45e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 46536b137fSBarry Smith PetscBool issaws; 470076e027SBarry Smith #endif 480076e027SBarry Smith 490076e027SBarry Smith PetscFunctionBegin; 500076e027SBarry Smith PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); 51f55353a2SBarry Smith if (!viewer) { 529566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer)); 53f55353a2SBarry Smith } 540076e027SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 550076e027SBarry Smith PetscCheckSameComm(indraw,1,viewer,2); 560076e027SBarry Smith 579566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer)); 589566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw)); 59e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws)); 610076e027SBarry Smith #endif 620076e027SBarry Smith if (isdraw) { 630076e027SBarry Smith PetscDraw draw; 640076e027SBarry Smith char str[36]; 650076e027SBarry Smith PetscReal x,y,bottom,h; 660076e027SBarry Smith 679566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer,0,&draw)); 689566063dSJacob Faibussowitsch PetscCall(PetscDrawGetCurrentPoint(draw,&x,&y)); 699566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(str,"PetscDraw: ",sizeof(str))); 709566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str))); 719566063dSJacob Faibussowitsch PetscCall(PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h)); 720076e027SBarry Smith bottom = y - h; 739566063dSJacob Faibussowitsch PetscCall(PetscDrawPushCurrentPoint(draw,x,bottom)); 74e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 75536b137fSBarry Smith } else if (issaws) { 76d45a07a7SBarry Smith PetscMPIInt rank; 77d45a07a7SBarry Smith 789566063dSJacob Faibussowitsch PetscCall(PetscObjectName((PetscObject)indraw)); 799566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 80dd400576SPatrick Sanan if (!((PetscObject)indraw)->amsmem && rank == 0) { 819566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)indraw,viewer)); 820076e027SBarry Smith } 830076e027SBarry Smith #endif 840076e027SBarry Smith } else if (indraw->ops->view) { 859566063dSJacob Faibussowitsch PetscCall((*indraw->ops->view)(indraw,viewer)); 860076e027SBarry Smith } 870076e027SBarry Smith PetscFunctionReturn(0); 880076e027SBarry Smith } 890076e027SBarry Smith 905c6c1daeSBarry Smith /*@C 91fe2efc57SMark PetscDrawViewFromOptions - View from Options 92fe2efc57SMark 93fe2efc57SMark Collective on PetscDraw 94fe2efc57SMark 95fe2efc57SMark Input Parameters: 96fe2efc57SMark + A - the PetscDraw context 97736c3998SJose E. Roman . obj - Optional object 98736c3998SJose E. Roman - name - command line option 99fe2efc57SMark 100fe2efc57SMark Level: intermediate 101fe2efc57SMark .seealso: PetscDraw, PetscDrawView, PetscObjectViewFromOptions(), PetscDrawCreate() 102fe2efc57SMark @*/ 103fe2efc57SMark PetscErrorCode PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[]) 104fe2efc57SMark { 105fe2efc57SMark PetscFunctionBegin; 106fe2efc57SMark PetscValidHeaderSpecific(A,PETSC_DRAW_CLASSID,1); 1079566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 108fe2efc57SMark PetscFunctionReturn(0); 109fe2efc57SMark } 110fe2efc57SMark 111fe2efc57SMark /*@C 1125c6c1daeSBarry Smith PetscDrawCreate - Creates a graphics context. 1135c6c1daeSBarry Smith 114d083f849SBarry Smith Collective 1155c6c1daeSBarry Smith 116d8d19677SJose E. Roman Input Parameters: 1175c6c1daeSBarry Smith + comm - MPI communicator 118e1dfdf8eSBarry Smith . display - X display when using X Windows 1195c6c1daeSBarry Smith . title - optional title added to top of window 1205c6c1daeSBarry Smith . x,y - coordinates of lower left corner of window or PETSC_DECIDE 1215c6c1daeSBarry Smith - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 1225c6c1daeSBarry Smith or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 1235c6c1daeSBarry Smith 1245c6c1daeSBarry Smith Output Parameter: 1255c6c1daeSBarry Smith . draw - location to put the PetscDraw context 1265c6c1daeSBarry Smith 1275c6c1daeSBarry Smith Level: beginner 1285c6c1daeSBarry Smith 129ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(), 130ba1e01c4SBarry Smith PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(), 131ba1e01c4SBarry Smith PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(), 132ba1e01c4SBarry Smith PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(), 133ba1e01c4SBarry Smith PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(), 134ba1e01c4SBarry Smith PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(), 13550d92d24SPierre Jolivet PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(), 136ba1e01c4SBarry Smith PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(), 137ba1e01c4SBarry Smith PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(), 138ba1e01c4SBarry Smith PetscDrawZoom(), PetscDrawGetBoundingBox() 139ba1e01c4SBarry Smith 1405c6c1daeSBarry Smith @*/ 1415c6c1daeSBarry Smith PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 1425c6c1daeSBarry Smith { 1435c6c1daeSBarry Smith PetscDraw draw; 144e118a51fSLisandro Dalcin PetscReal dpause = 0.0; 1455c6c1daeSBarry Smith PetscBool flag; 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith PetscFunctionBegin; 1489566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 14902c9f0b5SLisandro Dalcin *indraw = NULL; 1509566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView)); 151a297a907SKarl Rupp 1528f69470aSLisandro Dalcin draw->data = NULL; 1539566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display,&draw->display)); 1549566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title,&draw->title)); 1555c6c1daeSBarry Smith draw->x = x; 1565c6c1daeSBarry Smith draw->y = y; 1575c6c1daeSBarry Smith draw->w = w; 1585c6c1daeSBarry Smith draw->h = h; 1595c6c1daeSBarry Smith draw->pause = 0.0; 1605c6c1daeSBarry Smith draw->coor_xl = 0.0; 1615c6c1daeSBarry Smith draw->coor_xr = 1.0; 1625c6c1daeSBarry Smith draw->coor_yl = 0.0; 1635c6c1daeSBarry Smith draw->coor_yr = 1.0; 1645c6c1daeSBarry Smith draw->port_xl = 0.0; 1655c6c1daeSBarry Smith draw->port_xr = 1.0; 1665c6c1daeSBarry Smith draw->port_yl = 0.0; 1675c6c1daeSBarry Smith draw->port_yr = 1.0; 168e118a51fSLisandro Dalcin draw->popup = NULL; 169a297a907SKarl Rupp 1709566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag)); 1715c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1728067a7d5SLisandro Dalcin 1730298fd71SBarry Smith draw->savefilename = NULL; 1748067a7d5SLisandro Dalcin draw->saveimageext = NULL; 1758067a7d5SLisandro Dalcin draw->savemovieext = NULL; 1765b399a63SLisandro Dalcin draw->savefilecount = 0; 1778067a7d5SLisandro Dalcin draw->savesinglefile = PETSC_FALSE; 1783d242201SLisandro Dalcin draw->savemoviefps = PETSC_DECIDE; 179a297a907SKarl Rupp 1809566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCurrentPoint(draw,.5,.9)); 181a297a907SKarl Rupp 1825c6c1daeSBarry Smith draw->boundbox_xl = .5; 1835c6c1daeSBarry Smith draw->boundbox_xr = .5; 1845c6c1daeSBarry Smith draw->boundbox_yl = .9; 1855c6c1daeSBarry Smith draw->boundbox_yr = .9; 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith *indraw = draw; 1885c6c1daeSBarry Smith PetscFunctionReturn(0); 1895c6c1daeSBarry Smith } 1905c6c1daeSBarry Smith 1915c6c1daeSBarry Smith /*@C 1925c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith Collective on PetscDraw 1955c6c1daeSBarry Smith 196d8d19677SJose E. Roman Input Parameters: 1975c6c1daeSBarry Smith + draw - the graphics context 1985c6c1daeSBarry Smith - type - for example, PETSC_DRAW_X 1995c6c1daeSBarry Smith 2005c6c1daeSBarry Smith Options Database Command: 201236f5a4dSBarry Smith . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x) 202236f5a4dSBarry Smith 203ba1e01c4SBarry Smith See PetscDrawSetFromOptions() for additional options database keys 2045c6c1daeSBarry Smith 2055c6c1daeSBarry Smith Level: intermediate 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith Notes: 2085c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 209ba1e01c4SBarry Smith PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE) 2105c6c1daeSBarry Smith 211ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType 2125c6c1daeSBarry Smith @*/ 2135c6c1daeSBarry Smith PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 2145c6c1daeSBarry Smith { 2155c6c1daeSBarry Smith PetscBool match; 2165c6c1daeSBarry Smith PetscBool flg=PETSC_FALSE; 2175f80ce2aSJacob Faibussowitsch PetscErrorCode (*r)(PetscDraw); 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith PetscFunctionBegin; 2205c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2215c6c1daeSBarry Smith PetscValidCharPointer(type,2); 2225c6c1daeSBarry Smith 2239566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)draw,type,&match)); 2245c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith /* User requests no graphics */ 2279566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg)); 2285c6c1daeSBarry Smith 2295c6c1daeSBarry Smith /* 2305c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2315c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2325c6c1daeSBarry Smith testing. 2335c6c1daeSBarry Smith */ 2345c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2355c6c1daeSBarry Smith if (!flg) { 2369566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type,PETSC_DRAW_X,&match)); 2375c6c1daeSBarry Smith if (match) { 2385c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2395c6c1daeSBarry Smith flg = PETSC_TRUE; 2409566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn)); 241e1dfdf8eSBarry Smith if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n"); 2425c6c1daeSBarry Smith } 2435c6c1daeSBarry Smith } 2445c6c1daeSBarry Smith #endif 2450b50c7b2SBarry Smith if (flg) { 2469566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type,"tikz",&flg)); 2479c8bf542SScott Kruger if (!flg) type = PETSC_DRAW_NULL; 2489c8bf542SScott Kruger } 2499c8bf542SScott Kruger 2509566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type,PETSC_DRAW_NULL,&match)); 2519c8bf542SScott Kruger if (match) { 2529566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL)); 2539566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL)); 2549566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL)); 2559566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL)); 2569566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL)); 2570b50c7b2SBarry Smith } 2585c6c1daeSBarry Smith 2599566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscDrawList,type,&r)); 26028b400f6SJacob Faibussowitsch PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 2619566063dSJacob Faibussowitsch if (draw->ops->destroy) PetscCall((*draw->ops->destroy)(draw)); 2629566063dSJacob Faibussowitsch PetscCall(PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps))); 2639566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)draw,type)); 2649566063dSJacob Faibussowitsch PetscCall((*r)(draw)); 2655c6c1daeSBarry Smith PetscFunctionReturn(0); 2665c6c1daeSBarry Smith } 2675c6c1daeSBarry Smith 2685c6c1daeSBarry Smith /*@C 2695c6c1daeSBarry Smith PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 2705c6c1daeSBarry Smith 2715c6c1daeSBarry Smith Not Collective 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith Input Parameter: 2745c6c1daeSBarry Smith . draw - Krylov context 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith Output Parameters: 2775c6c1daeSBarry Smith . name - name of PetscDraw method 2785c6c1daeSBarry Smith 2795c6c1daeSBarry Smith Level: advanced 2805c6c1daeSBarry Smith 281ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType 282ba1e01c4SBarry Smith 2835c6c1daeSBarry Smith @*/ 2845c6c1daeSBarry Smith PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 2855c6c1daeSBarry Smith { 2865c6c1daeSBarry Smith PetscFunctionBegin; 2875c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2885c6c1daeSBarry Smith PetscValidPointer(type,2); 2895c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2905c6c1daeSBarry Smith PetscFunctionReturn(0); 2915c6c1daeSBarry Smith } 2925c6c1daeSBarry Smith 293607a6623SBarry Smith /*@C 2941c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2951c84c290SBarry Smith 2961c84c290SBarry Smith Not Collective 2971c84c290SBarry Smith 2981c84c290SBarry Smith Input Parameters: 2990076e027SBarry Smith + name_solver - name of a new user-defined graphics class 3001c84c290SBarry Smith - routine_create - routine to create method context 3011c84c290SBarry Smith 3021c84c290SBarry Smith Level: developer 3031c84c290SBarry Smith 3041c84c290SBarry Smith Notes: 3050076e027SBarry Smith PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 3061c84c290SBarry Smith 3071c84c290SBarry Smith Sample usage: 3081c84c290SBarry Smith .vb 309bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 3101c84c290SBarry Smith .ve 3111c84c290SBarry Smith 3120076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 3131c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 3141c84c290SBarry Smith or at runtime via the option 3151c84c290SBarry Smith $ -draw_type my_draw_type 3161c84c290SBarry Smith 317ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType() 3181c84c290SBarry Smith @*/ 319bdf89e91SBarry Smith PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) 3205c6c1daeSBarry Smith { 3215c6c1daeSBarry Smith PetscFunctionBegin; 3229566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 3239566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscDrawList,sname,function)); 3245c6c1daeSBarry Smith PetscFunctionReturn(0); 3255c6c1daeSBarry Smith } 3265c6c1daeSBarry Smith 3277faeec8aSLisandro Dalcin /*@C 3287faeec8aSLisandro Dalcin PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 3297faeec8aSLisandro Dalcin PetscDraw options in the database. 3307faeec8aSLisandro Dalcin 3317faeec8aSLisandro Dalcin Logically Collective on PetscDraw 3327faeec8aSLisandro Dalcin 333d8d19677SJose E. Roman Input Parameters: 3347faeec8aSLisandro Dalcin + draw - the draw context 3357faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names 3367faeec8aSLisandro Dalcin 3377faeec8aSLisandro Dalcin Level: advanced 3387faeec8aSLisandro Dalcin 339ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate() 3407faeec8aSLisandro Dalcin @*/ 3417faeec8aSLisandro Dalcin PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[]) 3427faeec8aSLisandro Dalcin { 3437faeec8aSLisandro Dalcin PetscFunctionBegin; 3447faeec8aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3459566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw,prefix)); 3467faeec8aSLisandro Dalcin PetscFunctionReturn(0); 3477faeec8aSLisandro Dalcin } 3487faeec8aSLisandro Dalcin 3495c6c1daeSBarry Smith /*@ 3505c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 351e1dfdf8eSBarry Smith Defaults to a PETSc X Windows graphics. 3525c6c1daeSBarry Smith 3535c6c1daeSBarry Smith Collective on PetscDraw 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Input Parameter: 3565c6c1daeSBarry Smith . draw - the graphics context 3575c6c1daeSBarry Smith 3585c6c1daeSBarry Smith Options Database Keys: 3595c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 360e1dfdf8eSBarry Smith . -nox_warning - when X Windows support is not installed this prevents the warning message from being printed 3617450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 36273f7a4c5SBarry Smith . -draw_marker_type - <x,point> 363e1dfdf8eSBarry Smith . -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file 364e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window 365a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 366df8d4941SLisandro Dalcin . -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with 'filename/filename_%d.ext' 367df8d4941SLisandro Dalcin . -draw_save_on_clear - saves an image on each clear, mainly for debugging 368df8d4941SLisandro Dalcin - -draw_save_on_flush - saves an image on each flush, mainly for debugging 3695c6c1daeSBarry Smith 3705c6c1daeSBarry Smith Level: intermediate 3715c6c1daeSBarry Smith 37295452b02SPatrick Sanan Notes: 37395452b02SPatrick Sanan Must be called after PetscDrawCreate() before the PetscDraw is used. 3745c6c1daeSBarry Smith 375ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause() 3765c6c1daeSBarry Smith 3775c6c1daeSBarry Smith @*/ 3785c6c1daeSBarry Smith PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 3795c6c1daeSBarry Smith { 3805c6c1daeSBarry Smith PetscBool flg,nox; 3815c6c1daeSBarry Smith char vtype[256]; 3825c6c1daeSBarry Smith const char *def; 3835c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3845c6c1daeSBarry Smith PetscBool warn; 3855c6c1daeSBarry Smith #endif 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith PetscFunctionBegin; 3885c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3895c6c1daeSBarry Smith 3909566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 3915c6c1daeSBarry Smith 392a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 393a297a907SKarl Rupp else { 3949566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox)); 3955c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3965c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3975c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3985c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3995c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 4005c6c1daeSBarry Smith #else 4019566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn)); 402e1dfdf8eSBarry Smith if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n"); 4035c6c1daeSBarry Smith #endif 4045c6c1daeSBarry Smith } 405*d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)draw); 4069566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg)); 4075c6c1daeSBarry Smith if (flg) { 4089566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw,vtype)); 4095c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 4109566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw,def)); 4115c6c1daeSBarry Smith } 4129566063dSJacob Faibussowitsch PetscCall(PetscOptionsName("-nox","Run without graphics","None",&nox)); 4135c6c1daeSBarry Smith { 41449c04938SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 41549c04938SLisandro Dalcin char movieext[32]; 41649c04938SLisandro Dalcin PetscBool image,movie; 4179566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"")); 4189566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"")); 4199566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image)); 4209566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie)); 4219566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL)); 4229566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL)); 4239566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSave(draw,filename)); 4249566063dSJacob Faibussowitsch if (movie) PetscCall(PetscDrawSetSaveMovie(draw,movieext)); 4259566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image)); 4269566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSaveFinalImage(draw,filename)); 4279566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL)); 4289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL)); 4295c6c1daeSBarry Smith } 4309566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL)); 4319566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL)); 43273f7a4c5SBarry Smith 4335c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 4349566063dSJacob Faibussowitsch PetscCall(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw)); 435ce1779c8SBarry Smith 4369566063dSJacob Faibussowitsch PetscCall(PetscDrawViewFromOptions(draw,NULL,"-draw_view")); 437*d0609cedSBarry Smith PetscOptionsEnd(); 4385c6c1daeSBarry Smith PetscFunctionReturn(0); 4395c6c1daeSBarry Smith } 440