1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/ 3*5c6c1daeSBarry Smith 4*5c6c1daeSBarry Smith #undef __FUNCT__ 5*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_Draw" 6*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) 7*5c6c1daeSBarry Smith { 8*5c6c1daeSBarry Smith PetscErrorCode ierr; 9*5c6c1daeSBarry Smith PetscInt i; 10*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data; 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith PetscFunctionBegin; 13*5c6c1daeSBarry Smith if (vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Destroying PetscViewer without first restoring singleton"); 14*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 15*5c6c1daeSBarry Smith ierr = PetscDrawAxisDestroy(&vdraw->drawaxis[i]);CHKERRQ(ierr); 16*5c6c1daeSBarry Smith ierr = PetscDrawLGDestroy(&vdraw->drawlg[i]);CHKERRQ(ierr); 17*5c6c1daeSBarry Smith ierr = PetscDrawDestroy(&vdraw->draw[i]);CHKERRQ(ierr); 18*5c6c1daeSBarry Smith } 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith ierr = PetscFree(vdraw->display);CHKERRQ(ierr); 21*5c6c1daeSBarry Smith ierr = PetscFree(vdraw->title);CHKERRQ(ierr); 22*5c6c1daeSBarry Smith ierr = PetscFree3(vdraw->draw,vdraw->drawlg,vdraw->drawaxis);CHKERRQ(ierr); 23*5c6c1daeSBarry Smith ierr = PetscFree(vdraw->bounds);CHKERRQ(ierr); 24*5c6c1daeSBarry Smith ierr = PetscFree(vdraw);CHKERRQ(ierr); 25*5c6c1daeSBarry Smith PetscFunctionReturn(0); 26*5c6c1daeSBarry Smith } 27*5c6c1daeSBarry Smith 28*5c6c1daeSBarry Smith #undef __FUNCT__ 29*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_Draw" 30*5c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) 31*5c6c1daeSBarry Smith { 32*5c6c1daeSBarry Smith PetscErrorCode ierr; 33*5c6c1daeSBarry Smith PetscInt i; 34*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data; 35*5c6c1daeSBarry Smith 36*5c6c1daeSBarry Smith PetscFunctionBegin; 37*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 38*5c6c1daeSBarry Smith if (vdraw->draw[i]) {ierr = PetscDrawSynchronizedFlush(vdraw->draw[i]);CHKERRQ(ierr);} 39*5c6c1daeSBarry Smith } 40*5c6c1daeSBarry Smith PetscFunctionReturn(0); 41*5c6c1daeSBarry Smith } 42*5c6c1daeSBarry Smith 43*5c6c1daeSBarry Smith #undef __FUNCT__ 44*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDraw" 45*5c6c1daeSBarry Smith /*@C 46*5c6c1daeSBarry Smith PetscViewerDrawGetDraw - Returns PetscDraw object from PetscViewer object. 47*5c6c1daeSBarry Smith This PetscDraw object may then be used to perform graphics using 48*5c6c1daeSBarry Smith PetscDrawXXX() commands. 49*5c6c1daeSBarry Smith 50*5c6c1daeSBarry Smith Not collective (but PetscDraw returned will be parallel object if PetscViewer is) 51*5c6c1daeSBarry Smith 52*5c6c1daeSBarry Smith Input Parameters: 53*5c6c1daeSBarry Smith + viewer - the PetscViewer (created with PetscViewerDrawOpen()) 54*5c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 55*5c6c1daeSBarry Smith 56*5c6c1daeSBarry Smith Ouput Parameter: 57*5c6c1daeSBarry Smith . draw - the draw object 58*5c6c1daeSBarry Smith 59*5c6c1daeSBarry Smith Level: intermediate 60*5c6c1daeSBarry Smith 61*5c6c1daeSBarry Smith Concepts: drawing^accessing PetscDraw context from PetscViewer 62*5c6c1daeSBarry Smith Concepts: graphics 63*5c6c1daeSBarry Smith 64*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen() 65*5c6c1daeSBarry Smith @*/ 66*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer,PetscInt windownumber,PetscDraw *draw) 67*5c6c1daeSBarry Smith { 68*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 69*5c6c1daeSBarry Smith PetscErrorCode ierr; 70*5c6c1daeSBarry Smith PetscBool isdraw; 71*5c6c1daeSBarry Smith char *title; 72*5c6c1daeSBarry Smith 73*5c6c1daeSBarry Smith PetscFunctionBegin; 74*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 75*5c6c1daeSBarry Smith if (draw) PetscValidPointer(draw,3); 76*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 77*5c6c1daeSBarry Smith if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); 78*5c6c1daeSBarry Smith if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative"); 79*5c6c1daeSBarry Smith windownumber += vdraw->draw_base; 80*5c6c1daeSBarry Smith if (windownumber >= vdraw->draw_max) { 81*5c6c1daeSBarry Smith /* allocate twice as many slots as needed */ 82*5c6c1daeSBarry Smith PetscInt draw_max = vdraw->draw_max; 83*5c6c1daeSBarry Smith PetscDraw *tdraw = vdraw->draw; 84*5c6c1daeSBarry Smith PetscDrawLG *drawlg = vdraw->drawlg; 85*5c6c1daeSBarry Smith PetscDrawAxis *drawaxis = vdraw->drawaxis; 86*5c6c1daeSBarry Smith 87*5c6c1daeSBarry Smith vdraw->draw_max = 2*windownumber; 88*5c6c1daeSBarry Smith ierr = PetscMalloc3(vdraw->draw_max,PetscDraw,&vdraw->draw,vdraw->draw_max,PetscDrawLG,&vdraw->drawlg,vdraw->draw_max,PetscDrawAxis,&vdraw->drawaxis);CHKERRQ(ierr); 89*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->draw,vdraw->draw_max*sizeof(PetscDraw));CHKERRQ(ierr); 90*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->drawlg,vdraw->draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr); 91*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->drawaxis,vdraw->draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr); 92*5c6c1daeSBarry Smith 93*5c6c1daeSBarry Smith ierr = PetscMemcpy(vdraw->draw,tdraw,draw_max*sizeof(PetscDraw));CHKERRQ(ierr); 94*5c6c1daeSBarry Smith ierr = PetscMemcpy(vdraw->drawlg,drawlg,draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr); 95*5c6c1daeSBarry Smith ierr = PetscMemcpy(vdraw->drawaxis,drawaxis,draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr); 96*5c6c1daeSBarry Smith 97*5c6c1daeSBarry Smith ierr = PetscFree3(tdraw,drawlg,drawaxis);CHKERRQ(ierr); 98*5c6c1daeSBarry Smith } 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith if (!vdraw->draw[windownumber]) { 101*5c6c1daeSBarry Smith if (!windownumber) { 102*5c6c1daeSBarry Smith title = vdraw->title; 103*5c6c1daeSBarry Smith } else { 104*5c6c1daeSBarry Smith char tmp_str[128]; 105*5c6c1daeSBarry Smith ierr = PetscSNPrintf(tmp_str, 128, "%s:%d", vdraw->title,windownumber);CHKERRQ(ierr); 106*5c6c1daeSBarry Smith title = tmp_str; 107*5c6c1daeSBarry Smith } 108*5c6c1daeSBarry Smith ierr = PetscDrawCreate(((PetscObject)viewer)->comm,vdraw->display,title,PETSC_DECIDE,PETSC_DECIDE,vdraw->w,vdraw->h,&vdraw->draw[windownumber]);CHKERRQ(ierr); 109*5c6c1daeSBarry Smith ierr = PetscDrawSetFromOptions(vdraw->draw[windownumber]);CHKERRQ(ierr); 110*5c6c1daeSBarry Smith } 111*5c6c1daeSBarry Smith if (draw) *draw = vdraw->draw[windownumber]; 112*5c6c1daeSBarry Smith if (draw) PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,-1); 113*5c6c1daeSBarry Smith PetscFunctionReturn(0); 114*5c6c1daeSBarry Smith } 115*5c6c1daeSBarry Smith 116*5c6c1daeSBarry Smith #undef __FUNCT__ 117*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawBaseAdd" 118*5c6c1daeSBarry Smith /*@C 119*5c6c1daeSBarry Smith PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw() 120*5c6c1daeSBarry Smith 121*5c6c1daeSBarry Smith Not collective (but PetscDraw returned will be parallel object if PetscViewer is) 122*5c6c1daeSBarry Smith 123*5c6c1daeSBarry Smith Input Parameters: 124*5c6c1daeSBarry Smith + viewer - the PetscViewer (created with PetscViewerDrawOpen()) 125*5c6c1daeSBarry Smith - windownumber - how much to add to the base 126*5c6c1daeSBarry Smith 127*5c6c1daeSBarry Smith Level: developer 128*5c6c1daeSBarry Smith 129*5c6c1daeSBarry Smith Concepts: drawing^accessing PetscDraw context from PetscViewer 130*5c6c1daeSBarry Smith Concepts: graphics 131*5c6c1daeSBarry Smith 132*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), PetscViewerDrawBaseSet() 133*5c6c1daeSBarry Smith @*/ 134*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer,PetscInt windownumber) 135*5c6c1daeSBarry Smith { 136*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 137*5c6c1daeSBarry Smith PetscErrorCode ierr; 138*5c6c1daeSBarry Smith PetscBool isdraw; 139*5c6c1daeSBarry Smith 140*5c6c1daeSBarry Smith PetscFunctionBegin; 141*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 142*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 143*5c6c1daeSBarry Smith if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); 144*5c6c1daeSBarry Smith if (windownumber + vdraw->draw_base < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Resulting base %D cannot be negative",windownumber+vdraw->draw_base); 145*5c6c1daeSBarry Smith vdraw->draw_base += windownumber; 146*5c6c1daeSBarry Smith PetscFunctionReturn(0); 147*5c6c1daeSBarry Smith } 148*5c6c1daeSBarry Smith 149*5c6c1daeSBarry Smith #undef __FUNCT__ 150*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawBaseSet" 151*5c6c1daeSBarry Smith /*@C 152*5c6c1daeSBarry Smith PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw() 153*5c6c1daeSBarry Smith 154*5c6c1daeSBarry Smith Not collective (but PetscDraw returned will be parallel object if PetscViewer is) 155*5c6c1daeSBarry Smith 156*5c6c1daeSBarry Smith Input Parameters: 157*5c6c1daeSBarry Smith + viewer - the PetscViewer (created with PetscViewerDrawOpen()) 158*5c6c1daeSBarry Smith - windownumber - value to set the base 159*5c6c1daeSBarry Smith 160*5c6c1daeSBarry Smith Level: developer 161*5c6c1daeSBarry Smith 162*5c6c1daeSBarry Smith Concepts: drawing^accessing PetscDraw context from PetscViewer 163*5c6c1daeSBarry Smith Concepts: graphics 164*5c6c1daeSBarry Smith 165*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), PetscViewerDrawBaseAdd() 166*5c6c1daeSBarry Smith @*/ 167*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer,PetscInt windownumber) 168*5c6c1daeSBarry Smith { 169*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 170*5c6c1daeSBarry Smith PetscErrorCode ierr; 171*5c6c1daeSBarry Smith PetscBool isdraw; 172*5c6c1daeSBarry Smith 173*5c6c1daeSBarry Smith PetscFunctionBegin; 174*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 175*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 176*5c6c1daeSBarry Smith if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); 177*5c6c1daeSBarry Smith if (windownumber < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Resulting base %D cannot be negative",windownumber); 178*5c6c1daeSBarry Smith vdraw->draw_base = windownumber; 179*5c6c1daeSBarry Smith PetscFunctionReturn(0); 180*5c6c1daeSBarry Smith } 181*5c6c1daeSBarry Smith 182*5c6c1daeSBarry Smith #undef __FUNCT__ 183*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDrawLG" 184*5c6c1daeSBarry Smith /*@C 185*5c6c1daeSBarry Smith PetscViewerDrawGetDrawLG - Returns PetscDrawLG object from PetscViewer object. 186*5c6c1daeSBarry Smith This PetscDrawLG object may then be used to perform graphics using 187*5c6c1daeSBarry Smith PetscDrawLGXXX() commands. 188*5c6c1daeSBarry Smith 189*5c6c1daeSBarry Smith Not Collective (but PetscDrawLG object will be parallel if PetscViewer is) 190*5c6c1daeSBarry Smith 191*5c6c1daeSBarry Smith Input Parameter: 192*5c6c1daeSBarry Smith + PetscViewer - the PetscViewer (created with PetscViewerDrawOpen()) 193*5c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 194*5c6c1daeSBarry Smith 195*5c6c1daeSBarry Smith Ouput Parameter: 196*5c6c1daeSBarry Smith . draw - the draw line graph object 197*5c6c1daeSBarry Smith 198*5c6c1daeSBarry Smith Level: intermediate 199*5c6c1daeSBarry Smith 200*5c6c1daeSBarry Smith Concepts: line graph^accessing context 201*5c6c1daeSBarry Smith 202*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen() 203*5c6c1daeSBarry Smith @*/ 204*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer,PetscInt windownumber,PetscDrawLG *drawlg) 205*5c6c1daeSBarry Smith { 206*5c6c1daeSBarry Smith PetscErrorCode ierr; 207*5c6c1daeSBarry Smith PetscBool isdraw; 208*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 209*5c6c1daeSBarry Smith 210*5c6c1daeSBarry Smith PetscFunctionBegin; 211*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 212*5c6c1daeSBarry Smith PetscValidPointer(drawlg,3); 213*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 214*5c6c1daeSBarry Smith if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); 215*5c6c1daeSBarry Smith if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative"); 216*5c6c1daeSBarry Smith 217*5c6c1daeSBarry Smith if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) { 218*5c6c1daeSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,windownumber,PETSC_NULL);CHKERRQ(ierr); 219*5c6c1daeSBarry Smith } 220*5c6c1daeSBarry Smith if (!vdraw->drawlg[windownumber+vdraw->draw_base]) { 221*5c6c1daeSBarry Smith ierr = PetscDrawLGCreate(vdraw->draw[windownumber+vdraw->draw_base],1,&vdraw->drawlg[windownumber+vdraw->draw_base]);CHKERRQ(ierr); 222*5c6c1daeSBarry Smith ierr = PetscLogObjectParent(viewer,vdraw->drawlg[windownumber+vdraw->draw_base]);CHKERRQ(ierr); 223*5c6c1daeSBarry Smith } 224*5c6c1daeSBarry Smith *drawlg = vdraw->drawlg[windownumber+vdraw->draw_base]; 225*5c6c1daeSBarry Smith PetscFunctionReturn(0); 226*5c6c1daeSBarry Smith } 227*5c6c1daeSBarry Smith 228*5c6c1daeSBarry Smith #undef __FUNCT__ 229*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDrawAxis" 230*5c6c1daeSBarry Smith /*@C 231*5c6c1daeSBarry Smith PetscViewerDrawGetDrawAxis - Returns PetscDrawAxis object from PetscViewer object. 232*5c6c1daeSBarry Smith This PetscDrawAxis object may then be used to perform graphics using 233*5c6c1daeSBarry Smith PetscDrawAxisXXX() commands. 234*5c6c1daeSBarry Smith 235*5c6c1daeSBarry Smith Not Collective (but PetscDrawAxis object will be parallel if PetscViewer is) 236*5c6c1daeSBarry Smith 237*5c6c1daeSBarry Smith Input Parameter: 238*5c6c1daeSBarry Smith + viewer - the PetscViewer (created with PetscViewerDrawOpen() 239*5c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 240*5c6c1daeSBarry Smith 241*5c6c1daeSBarry Smith Ouput Parameter: 242*5c6c1daeSBarry Smith . drawaxis - the draw axis object 243*5c6c1daeSBarry Smith 244*5c6c1daeSBarry Smith Level: advanced 245*5c6c1daeSBarry Smith 246*5c6c1daeSBarry Smith Concepts: line graph^accessing context 247*5c6c1daeSBarry Smith 248*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetLG(), PetscViewerDrawOpen() 249*5c6c1daeSBarry Smith @*/ 250*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer,PetscInt windownumber,PetscDrawAxis *drawaxis) 251*5c6c1daeSBarry Smith { 252*5c6c1daeSBarry Smith PetscErrorCode ierr; 253*5c6c1daeSBarry Smith PetscBool isdraw; 254*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;; 255*5c6c1daeSBarry Smith 256*5c6c1daeSBarry Smith PetscFunctionBegin; 257*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 258*5c6c1daeSBarry Smith PetscValidPointer(drawaxis,3); 259*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 260*5c6c1daeSBarry Smith if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); 261*5c6c1daeSBarry Smith if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative"); 262*5c6c1daeSBarry Smith 263*5c6c1daeSBarry Smith if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) { 264*5c6c1daeSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,windownumber,PETSC_NULL);CHKERRQ(ierr); 265*5c6c1daeSBarry Smith } 266*5c6c1daeSBarry Smith if (!vdraw->drawaxis[windownumber+vdraw->draw_base]) { 267*5c6c1daeSBarry Smith ierr = PetscDrawAxisCreate(vdraw->draw[windownumber+vdraw->draw_base],&vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); 268*5c6c1daeSBarry Smith ierr = PetscLogObjectParent(viewer,vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); 269*5c6c1daeSBarry Smith } 270*5c6c1daeSBarry Smith *drawaxis = vdraw->drawaxis[windownumber+vdraw->draw_base]; 271*5c6c1daeSBarry Smith PetscFunctionReturn(0); 272*5c6c1daeSBarry Smith } 273*5c6c1daeSBarry Smith 274*5c6c1daeSBarry Smith #undef __FUNCT__ 275*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawResize" 276*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawResize(PetscViewer v,int w,int h) 277*5c6c1daeSBarry Smith { 278*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data; 279*5c6c1daeSBarry Smith 280*5c6c1daeSBarry Smith PetscFunctionBegin; 281*5c6c1daeSBarry Smith vdraw->h = h; 282*5c6c1daeSBarry Smith vdraw->w = w; 283*5c6c1daeSBarry Smith PetscFunctionReturn(0); 284*5c6c1daeSBarry Smith } 285*5c6c1daeSBarry Smith 286*5c6c1daeSBarry Smith #undef __FUNCT__ 287*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetInfo" 288*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v,const char display[],const char title[],int x,int y,int w,int h) 289*5c6c1daeSBarry Smith { 290*5c6c1daeSBarry Smith PetscErrorCode ierr; 291*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data; 292*5c6c1daeSBarry Smith 293*5c6c1daeSBarry Smith PetscFunctionBegin; 294*5c6c1daeSBarry Smith vdraw->h = h; 295*5c6c1daeSBarry Smith vdraw->w = w; 296*5c6c1daeSBarry Smith ierr = PetscStrallocpy(display,&vdraw->display);CHKERRQ(ierr); 297*5c6c1daeSBarry Smith ierr = PetscStrallocpy(title,&vdraw->title);CHKERRQ(ierr); 298*5c6c1daeSBarry Smith PetscFunctionReturn(0); 299*5c6c1daeSBarry Smith } 300*5c6c1daeSBarry Smith 301*5c6c1daeSBarry Smith #undef __FUNCT__ 302*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawOpen" 303*5c6c1daeSBarry Smith /*@C 304*5c6c1daeSBarry Smith PetscViewerDrawOpen - Opens a window for use as a PetscViewer. If you want to 305*5c6c1daeSBarry Smith do graphics in this window, you must call PetscViewerDrawGetDraw() and 306*5c6c1daeSBarry Smith perform the graphics on the PetscDraw object. 307*5c6c1daeSBarry Smith 308*5c6c1daeSBarry Smith Collective on MPI_Comm 309*5c6c1daeSBarry Smith 310*5c6c1daeSBarry Smith Input Parameters: 311*5c6c1daeSBarry Smith + comm - communicator that will share window 312*5c6c1daeSBarry Smith . display - the X display on which to open, or null for the local machine 313*5c6c1daeSBarry Smith . title - the title to put in the title bar, or null for no title 314*5c6c1daeSBarry Smith . x, y - the screen coordinates of the upper left corner of window, or use PETSC_DECIDE 315*5c6c1daeSBarry Smith - w, h - window width and height in pixels, or may use PETSC_DECIDE or PETSC_DRAW_FULL_SIZE, PETSC_DRAW_HALF_SIZE, 316*5c6c1daeSBarry Smith PETSC_DRAW_THIRD_SIZE, PETSC_DRAW_QUARTER_SIZE 317*5c6c1daeSBarry Smith 318*5c6c1daeSBarry Smith Output Parameters: 319*5c6c1daeSBarry Smith . viewer - the PetscViewer 320*5c6c1daeSBarry Smith 321*5c6c1daeSBarry Smith Format Options: 322*5c6c1daeSBarry Smith + PETSC_VIEWER_DRAW_BASIC - displays with basic format 323*5c6c1daeSBarry Smith - PETSC_VIEWER_DRAW_LG - displays using a line graph 324*5c6c1daeSBarry Smith 325*5c6c1daeSBarry Smith Options Database Keys: 326*5c6c1daeSBarry Smith PetscViewerDrawOpen() calls PetscDrawCreate(), so see the manual page for 327*5c6c1daeSBarry Smith PetscDrawCreate() for runtime options, including 328*5c6c1daeSBarry Smith + -draw_type x or null 329*5c6c1daeSBarry Smith . -nox - Disables all x-windows output 330*5c6c1daeSBarry Smith . -display <name> - Specifies name of machine for the X display 331*5c6c1daeSBarry Smith . -geometry <x,y,w,h> - allows setting the window location and size 332*5c6c1daeSBarry Smith - -draw_pause <pause> - Sets time (in seconds) that the 333*5c6c1daeSBarry Smith program pauses after PetscDrawPause() has been called 334*5c6c1daeSBarry Smith (0 is default, -1 implies until user input). 335*5c6c1daeSBarry Smith 336*5c6c1daeSBarry Smith Level: beginner 337*5c6c1daeSBarry Smith 338*5c6c1daeSBarry Smith Note for Fortran Programmers: 339*5c6c1daeSBarry Smith Whenever indicating null character data in a Fortran code, 340*5c6c1daeSBarry Smith PETSC_NULL_CHARACTER must be employed; using PETSC_NULL is not 341*5c6c1daeSBarry Smith correct for character data! Thus, PETSC_NULL_CHARACTER can be 342*5c6c1daeSBarry Smith used for the display and title input parameters. 343*5c6c1daeSBarry Smith 344*5c6c1daeSBarry Smith Concepts: graphics^opening PetscViewer 345*5c6c1daeSBarry Smith Concepts: drawing^opening PetscViewer 346*5c6c1daeSBarry Smith 347*5c6c1daeSBarry Smith 348*5c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscViewerDestroy(), PetscViewerDrawGetDraw(), PetscViewerCreate(), PETSC_VIEWER_DRAW_, 349*5c6c1daeSBarry Smith PETSC_VIEWER_DRAW_WORLD, PETSC_VIEWER_DRAW_SELF 350*5c6c1daeSBarry Smith @*/ 351*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscViewer *viewer) 352*5c6c1daeSBarry Smith { 353*5c6c1daeSBarry Smith PetscErrorCode ierr; 354*5c6c1daeSBarry Smith 355*5c6c1daeSBarry Smith PetscFunctionBegin; 356*5c6c1daeSBarry Smith ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 357*5c6c1daeSBarry Smith ierr = PetscViewerSetType(*viewer,PETSCVIEWERDRAW);CHKERRQ(ierr); 358*5c6c1daeSBarry Smith ierr = PetscViewerDrawSetInfo(*viewer,display,title,x,y,w,h);CHKERRQ(ierr); 359*5c6c1daeSBarry Smith PetscFunctionReturn(0); 360*5c6c1daeSBarry Smith } 361*5c6c1daeSBarry Smith 362*5c6c1daeSBarry Smith #undef __FUNCT__ 363*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_Draw" 364*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_Draw(PetscViewer viewer,PetscViewer *sviewer) 365*5c6c1daeSBarry Smith { 366*5c6c1daeSBarry Smith PetscErrorCode ierr; 367*5c6c1daeSBarry Smith PetscMPIInt rank; 368*5c6c1daeSBarry Smith PetscInt i; 369*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data,*vsdraw; 370*5c6c1daeSBarry Smith 371*5c6c1daeSBarry Smith PetscFunctionBegin; 372*5c6c1daeSBarry Smith if (vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Trying to get singleton without first restoring previous"); 373*5c6c1daeSBarry Smith 374*5c6c1daeSBarry Smith /* only processor zero can use the PetscViewer draw singleton */ 375*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 376*5c6c1daeSBarry Smith if (!rank) { 377*5c6c1daeSBarry Smith ierr = PetscViewerCreate(PETSC_COMM_SELF,sviewer);CHKERRQ(ierr); 378*5c6c1daeSBarry Smith ierr = PetscViewerSetType(*sviewer,PETSCVIEWERDRAW);CHKERRQ(ierr); 379*5c6c1daeSBarry Smith vsdraw = (PetscViewer_Draw *)(*sviewer)->data; 380*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 381*5c6c1daeSBarry Smith if (vdraw->draw[i]) { 382*5c6c1daeSBarry Smith ierr = PetscDrawGetSingleton(vdraw->draw[i],&vsdraw->draw[i]);CHKERRQ(ierr); 383*5c6c1daeSBarry Smith } 384*5c6c1daeSBarry Smith } 385*5c6c1daeSBarry Smith } 386*5c6c1daeSBarry Smith vdraw->singleton_made = PETSC_TRUE; 387*5c6c1daeSBarry Smith PetscFunctionReturn(0); 388*5c6c1daeSBarry Smith } 389*5c6c1daeSBarry Smith 390*5c6c1daeSBarry Smith #undef __FUNCT__ 391*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_Draw" 392*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_Draw(PetscViewer viewer,PetscViewer *sviewer) 393*5c6c1daeSBarry Smith { 394*5c6c1daeSBarry Smith PetscErrorCode ierr; 395*5c6c1daeSBarry Smith PetscMPIInt rank; 396*5c6c1daeSBarry Smith PetscInt i; 397*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data,*vsdraw; 398*5c6c1daeSBarry Smith 399*5c6c1daeSBarry Smith PetscFunctionBegin; 400*5c6c1daeSBarry Smith if (!vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Trying to restore a singleton that was not gotten"); 401*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 402*5c6c1daeSBarry Smith if (!rank) { 403*5c6c1daeSBarry Smith vsdraw = (PetscViewer_Draw *)(*sviewer)->data; 404*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 405*5c6c1daeSBarry Smith if (vdraw->draw[i] && vsdraw->draw[i]) { 406*5c6c1daeSBarry Smith ierr = PetscDrawRestoreSingleton(vdraw->draw[i],&vsdraw->draw[i]);CHKERRQ(ierr); 407*5c6c1daeSBarry Smith } 408*5c6c1daeSBarry Smith } 409*5c6c1daeSBarry Smith ierr = PetscFree3(vsdraw->draw,vsdraw->drawlg,vsdraw->drawaxis);CHKERRQ(ierr); 410*5c6c1daeSBarry Smith ierr = PetscFree((*sviewer)->data);CHKERRQ(ierr); 411*5c6c1daeSBarry Smith ierr = PetscHeaderDestroy(sviewer);CHKERRQ(ierr); 412*5c6c1daeSBarry Smith } 413*5c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 414*5c6c1daeSBarry Smith PetscFunctionReturn(0); 415*5c6c1daeSBarry Smith } 416*5c6c1daeSBarry Smith 417*5c6c1daeSBarry Smith EXTERN_C_BEGIN 418*5c6c1daeSBarry Smith #undef __FUNCT__ 419*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_Draw" 420*5c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) 421*5c6c1daeSBarry Smith { 422*5c6c1daeSBarry Smith PetscInt i; 423*5c6c1daeSBarry Smith PetscErrorCode ierr; 424*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 425*5c6c1daeSBarry Smith 426*5c6c1daeSBarry Smith PetscFunctionBegin; 427*5c6c1daeSBarry Smith ierr = PetscNewLog(viewer,PetscViewer_Draw,&vdraw);CHKERRQ(ierr); 428*5c6c1daeSBarry Smith viewer->data = (void*)vdraw; 429*5c6c1daeSBarry Smith 430*5c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_Draw; 431*5c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_Draw; 432*5c6c1daeSBarry Smith viewer->ops->getsingleton = PetscViewerGetSingleton_Draw; 433*5c6c1daeSBarry Smith viewer->ops->restoresingleton = PetscViewerRestoreSingleton_Draw; 434*5c6c1daeSBarry Smith viewer->format = PETSC_VIEWER_NOFORMAT; 435*5c6c1daeSBarry Smith 436*5c6c1daeSBarry Smith /* these are created on the fly if requested */ 437*5c6c1daeSBarry Smith vdraw->draw_max = 5; 438*5c6c1daeSBarry Smith vdraw->draw_base = 0; 439*5c6c1daeSBarry Smith ierr = PetscMalloc3(vdraw->draw_max,PetscDraw,&vdraw->draw,vdraw->draw_max,PetscDrawLG,&vdraw->drawlg,vdraw->draw_max,PetscDrawAxis,&vdraw->drawaxis);CHKERRQ(ierr); 440*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->draw,vdraw->draw_max*sizeof(PetscDraw));CHKERRQ(ierr); 441*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->drawlg,vdraw->draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr); 442*5c6c1daeSBarry Smith ierr = PetscMemzero(vdraw->drawaxis,vdraw->draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr); 443*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 444*5c6c1daeSBarry Smith vdraw->draw[i] = 0; 445*5c6c1daeSBarry Smith vdraw->drawlg[i] = 0; 446*5c6c1daeSBarry Smith vdraw->drawaxis[i] = 0; 447*5c6c1daeSBarry Smith } 448*5c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 449*5c6c1daeSBarry Smith PetscFunctionReturn(0); 450*5c6c1daeSBarry Smith } 451*5c6c1daeSBarry Smith EXTERN_C_END 452*5c6c1daeSBarry Smith 453*5c6c1daeSBarry Smith #undef __FUNCT__ 454*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawClear" 455*5c6c1daeSBarry Smith /*@ 456*5c6c1daeSBarry Smith PetscViewerDrawClear - Clears a PetscDraw graphic associated with a PetscViewer. 457*5c6c1daeSBarry Smith 458*5c6c1daeSBarry Smith Not Collective 459*5c6c1daeSBarry Smith 460*5c6c1daeSBarry Smith Input Parameter: 461*5c6c1daeSBarry Smith . viewer - the PetscViewer 462*5c6c1daeSBarry Smith 463*5c6c1daeSBarry Smith Level: intermediate 464*5c6c1daeSBarry Smith 465*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), 466*5c6c1daeSBarry Smith 467*5c6c1daeSBarry Smith @*/ 468*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) 469*5c6c1daeSBarry Smith { 470*5c6c1daeSBarry Smith PetscErrorCode ierr; 471*5c6c1daeSBarry Smith PetscInt i; 472*5c6c1daeSBarry Smith PetscBool isdraw; 473*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 474*5c6c1daeSBarry Smith 475*5c6c1daeSBarry Smith PetscFunctionBegin; 476*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 477*5c6c1daeSBarry Smith if (isdraw) { 478*5c6c1daeSBarry Smith vdraw = (PetscViewer_Draw*)viewer->data; 479*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 480*5c6c1daeSBarry Smith if (vdraw->draw[i]) {ierr = PetscDrawClear(vdraw->draw[i]);CHKERRQ(ierr);} 481*5c6c1daeSBarry Smith } 482*5c6c1daeSBarry Smith } 483*5c6c1daeSBarry Smith PetscFunctionReturn(0); 484*5c6c1daeSBarry Smith } 485*5c6c1daeSBarry Smith 486*5c6c1daeSBarry Smith #undef __FUNCT__ 487*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetPause" 488*5c6c1daeSBarry Smith /*@ 489*5c6c1daeSBarry Smith PetscViewerDrawGetPause - Gets a pause for the first present draw 490*5c6c1daeSBarry Smith 491*5c6c1daeSBarry Smith Not Collective 492*5c6c1daeSBarry Smith 493*5c6c1daeSBarry Smith Input Parameter: 494*5c6c1daeSBarry Smith . viewer - the PetscViewer 495*5c6c1daeSBarry Smith 496*5c6c1daeSBarry Smith Output Parameter: 497*5c6c1daeSBarry Smith . pause - the pause value 498*5c6c1daeSBarry Smith 499*5c6c1daeSBarry Smith Level: intermediate 500*5c6c1daeSBarry Smith 501*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), 502*5c6c1daeSBarry Smith 503*5c6c1daeSBarry Smith @*/ 504*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer,PetscReal *pause) 505*5c6c1daeSBarry Smith { 506*5c6c1daeSBarry Smith PetscErrorCode ierr; 507*5c6c1daeSBarry Smith PetscInt i; 508*5c6c1daeSBarry Smith PetscBool isdraw; 509*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 510*5c6c1daeSBarry Smith PetscDraw draw; 511*5c6c1daeSBarry Smith 512*5c6c1daeSBarry Smith PetscFunctionBegin; 513*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 514*5c6c1daeSBarry Smith *pause = 0.0; 515*5c6c1daeSBarry Smith if (isdraw) { 516*5c6c1daeSBarry Smith vdraw = (PetscViewer_Draw*)viewer->data; 517*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 518*5c6c1daeSBarry Smith if (vdraw->draw[i]) { 519*5c6c1daeSBarry Smith ierr = PetscDrawGetPause(vdraw->draw[i],pause);CHKERRQ(ierr); 520*5c6c1daeSBarry Smith PetscFunctionReturn(0); 521*5c6c1daeSBarry Smith } 522*5c6c1daeSBarry Smith } 523*5c6c1daeSBarry Smith /* none exist yet so create one and get its pause */ 524*5c6c1daeSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 525*5c6c1daeSBarry Smith ierr = PetscDrawGetPause(vdraw->draw[0],pause);CHKERRQ(ierr); 526*5c6c1daeSBarry Smith } 527*5c6c1daeSBarry Smith PetscFunctionReturn(0); 528*5c6c1daeSBarry Smith } 529*5c6c1daeSBarry Smith 530*5c6c1daeSBarry Smith #undef __FUNCT__ 531*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetPause" 532*5c6c1daeSBarry Smith /*@ 533*5c6c1daeSBarry Smith PetscViewerDrawSetPause - Sets a pause for each PetscDraw in the viewer 534*5c6c1daeSBarry Smith 535*5c6c1daeSBarry Smith Not Collective 536*5c6c1daeSBarry Smith 537*5c6c1daeSBarry Smith Input Parameters: 538*5c6c1daeSBarry Smith + viewer - the PetscViewer 539*5c6c1daeSBarry Smith - pause - the pause value 540*5c6c1daeSBarry Smith 541*5c6c1daeSBarry Smith Level: intermediate 542*5c6c1daeSBarry Smith 543*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), 544*5c6c1daeSBarry Smith 545*5c6c1daeSBarry Smith @*/ 546*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer,PetscReal pause) 547*5c6c1daeSBarry Smith { 548*5c6c1daeSBarry Smith PetscErrorCode ierr; 549*5c6c1daeSBarry Smith PetscInt i; 550*5c6c1daeSBarry Smith PetscBool isdraw; 551*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 552*5c6c1daeSBarry Smith 553*5c6c1daeSBarry Smith PetscFunctionBegin; 554*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 555*5c6c1daeSBarry Smith if (isdraw) { 556*5c6c1daeSBarry Smith vdraw = (PetscViewer_Draw*)viewer->data; 557*5c6c1daeSBarry Smith for (i=0; i<vdraw->draw_max; i++) { 558*5c6c1daeSBarry Smith if (vdraw->draw[i]) {ierr = PetscDrawSetPause(vdraw->draw[i],pause);CHKERRQ(ierr);} 559*5c6c1daeSBarry Smith } 560*5c6c1daeSBarry Smith } 561*5c6c1daeSBarry Smith PetscFunctionReturn(0); 562*5c6c1daeSBarry Smith } 563*5c6c1daeSBarry Smith 564*5c6c1daeSBarry Smith 565*5c6c1daeSBarry Smith #undef __FUNCT__ 566*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetHold" 567*5c6c1daeSBarry Smith /*@ 568*5c6c1daeSBarry Smith PetscViewerDrawSetHold - Holds previous image when drawing new image 569*5c6c1daeSBarry Smith 570*5c6c1daeSBarry Smith Not Collective 571*5c6c1daeSBarry Smith 572*5c6c1daeSBarry Smith Input Parameters: 573*5c6c1daeSBarry Smith + viewer - the PetscViewer 574*5c6c1daeSBarry Smith - hold - indicates to hold or not 575*5c6c1daeSBarry Smith 576*5c6c1daeSBarry Smith Level: intermediate 577*5c6c1daeSBarry Smith 578*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), 579*5c6c1daeSBarry Smith 580*5c6c1daeSBarry Smith @*/ 581*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer,PetscBool hold) 582*5c6c1daeSBarry Smith { 583*5c6c1daeSBarry Smith PetscErrorCode ierr; 584*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 585*5c6c1daeSBarry Smith PetscBool isdraw; 586*5c6c1daeSBarry Smith 587*5c6c1daeSBarry Smith PetscFunctionBegin; 588*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 589*5c6c1daeSBarry Smith if (isdraw) { 590*5c6c1daeSBarry Smith vdraw = (PetscViewer_Draw*)viewer->data; 591*5c6c1daeSBarry Smith vdraw->hold = hold; 592*5c6c1daeSBarry Smith } 593*5c6c1daeSBarry Smith PetscFunctionReturn(0); 594*5c6c1daeSBarry Smith } 595*5c6c1daeSBarry Smith 596*5c6c1daeSBarry Smith #undef __FUNCT__ 597*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetHold" 598*5c6c1daeSBarry Smith /*@ 599*5c6c1daeSBarry Smith PetscViewerDrawGetHold - Holds previous image when drawing new image 600*5c6c1daeSBarry Smith 601*5c6c1daeSBarry Smith Not Collective 602*5c6c1daeSBarry Smith 603*5c6c1daeSBarry Smith Input Parameter: 604*5c6c1daeSBarry Smith . viewer - the PetscViewer 605*5c6c1daeSBarry Smith 606*5c6c1daeSBarry Smith Output Parameter: 607*5c6c1daeSBarry Smith . hold - indicates to hold or not 608*5c6c1daeSBarry Smith 609*5c6c1daeSBarry Smith Level: intermediate 610*5c6c1daeSBarry Smith 611*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), 612*5c6c1daeSBarry Smith 613*5c6c1daeSBarry Smith @*/ 614*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer,PetscBool *hold) 615*5c6c1daeSBarry Smith { 616*5c6c1daeSBarry Smith PetscErrorCode ierr; 617*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 618*5c6c1daeSBarry Smith PetscBool isdraw; 619*5c6c1daeSBarry Smith 620*5c6c1daeSBarry Smith PetscFunctionBegin; 621*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 622*5c6c1daeSBarry Smith if (isdraw) { 623*5c6c1daeSBarry Smith vdraw = (PetscViewer_Draw*)viewer->data; 624*5c6c1daeSBarry Smith *hold = vdraw->hold; 625*5c6c1daeSBarry Smith } 626*5c6c1daeSBarry Smith PetscFunctionReturn(0); 627*5c6c1daeSBarry Smith } 628*5c6c1daeSBarry Smith 629*5c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/ 630*5c6c1daeSBarry Smith /* 631*5c6c1daeSBarry Smith The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that 632*5c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 633*5c6c1daeSBarry Smith */ 634*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID; 635*5c6c1daeSBarry Smith 636*5c6c1daeSBarry Smith #undef __FUNCT__ 637*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_VIEWER_DRAW_" 638*5c6c1daeSBarry Smith /*@C 639*5c6c1daeSBarry Smith PETSC_VIEWER_DRAW_ - Creates a window PetscViewer shared by all processors 640*5c6c1daeSBarry Smith in a communicator. 641*5c6c1daeSBarry Smith 642*5c6c1daeSBarry Smith Collective on MPI_Comm 643*5c6c1daeSBarry Smith 644*5c6c1daeSBarry Smith Input Parameter: 645*5c6c1daeSBarry Smith . comm - the MPI communicator to share the window PetscViewer 646*5c6c1daeSBarry Smith 647*5c6c1daeSBarry Smith Level: intermediate 648*5c6c1daeSBarry Smith 649*5c6c1daeSBarry Smith Notes: 650*5c6c1daeSBarry Smith Unlike almost all other PETSc routines, PETSC_VIEWER_DRAW_ does not return 651*5c6c1daeSBarry Smith an error code. The window is usually used in the form 652*5c6c1daeSBarry Smith $ XXXView(XXX object,PETSC_VIEWER_DRAW_(comm)); 653*5c6c1daeSBarry Smith 654*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_WORLD, PETSC_VIEWER_DRAW_SELF, PetscViewerDrawOpen(), 655*5c6c1daeSBarry Smith @*/ 656*5c6c1daeSBarry Smith PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) 657*5c6c1daeSBarry Smith { 658*5c6c1daeSBarry Smith PetscErrorCode ierr; 659*5c6c1daeSBarry Smith PetscMPIInt flag; 660*5c6c1daeSBarry Smith PetscViewer viewer; 661*5c6c1daeSBarry Smith MPI_Comm ncomm; 662*5c6c1daeSBarry Smith 663*5c6c1daeSBarry Smith PetscFunctionBegin; 664*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&ncomm,PETSC_NULL);if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 665*5c6c1daeSBarry Smith if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) { 666*5c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Draw_keyval,0); 667*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 668*5c6c1daeSBarry Smith } 669*5c6c1daeSBarry Smith ierr = MPI_Attr_get(ncomm,Petsc_Viewer_Draw_keyval,(void **)&viewer,&flag); 670*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 671*5c6c1daeSBarry Smith if (!flag) { /* PetscViewer not yet created */ 672*5c6c1daeSBarry Smith ierr = PetscViewerDrawOpen(ncomm,0,0,PETSC_DECIDE,PETSC_DECIDE,300,300,&viewer); 673*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 674*5c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 675*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 676*5c6c1daeSBarry Smith ierr = MPI_Attr_put(ncomm,Petsc_Viewer_Draw_keyval,(void*)viewer); 677*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 678*5c6c1daeSBarry Smith } 679*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm); 680*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);} 681*5c6c1daeSBarry Smith PetscFunctionReturn(viewer); 682*5c6c1daeSBarry Smith } 683*5c6c1daeSBarry Smith 684*5c6c1daeSBarry Smith #undef __FUNCT__ 685*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetBounds" 686*5c6c1daeSBarry Smith /*@ 687*5c6c1daeSBarry Smith PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting 688*5c6c1daeSBarry Smith 689*5c6c1daeSBarry Smith Collective on PetscViewer 690*5c6c1daeSBarry Smith 691*5c6c1daeSBarry Smith Input Parameters: 692*5c6c1daeSBarry Smith + viewer - the PetscViewer (created with PetscViewerDrawOpen()) 693*5c6c1daeSBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate() 694*5c6c1daeSBarry Smith - bounds - the actual bounds, the size of this is 2*nbounds, the values are stored in the order min F_0, max F_0, min F_1, max F_1, ..... 695*5c6c1daeSBarry Smith 696*5c6c1daeSBarry Smith Level: intermediate 697*5c6c1daeSBarry Smith 698*5c6c1daeSBarry Smith Concepts: drawing^accessing PetscDraw context from PetscViewer 699*5c6c1daeSBarry Smith Concepts: graphics 700*5c6c1daeSBarry Smith 701*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen() 702*5c6c1daeSBarry Smith @*/ 703*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer,PetscInt nbounds,const PetscReal *bounds) 704*5c6c1daeSBarry Smith { 705*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 706*5c6c1daeSBarry Smith PetscErrorCode ierr; 707*5c6c1daeSBarry Smith 708*5c6c1daeSBarry Smith 709*5c6c1daeSBarry Smith PetscFunctionBegin; 710*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 711*5c6c1daeSBarry Smith vdraw->nbounds = nbounds; 712*5c6c1daeSBarry Smith ierr = PetscMalloc(2*nbounds*sizeof(PetscReal),&vdraw->bounds);CHKERRQ(ierr); 713*5c6c1daeSBarry Smith ierr = PetscMemcpy(vdraw->bounds,bounds,2*nbounds*sizeof(PetscReal));CHKERRQ(ierr); 714*5c6c1daeSBarry Smith PetscFunctionReturn(0); 715*5c6c1daeSBarry Smith } 716*5c6c1daeSBarry Smith 717*5c6c1daeSBarry Smith #undef __FUNCT__ 718*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetBounds" 719*5c6c1daeSBarry Smith /*@C 720*5c6c1daeSBarry Smith PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with PetscViewerDrawSetBounds() 721*5c6c1daeSBarry Smith 722*5c6c1daeSBarry Smith Collective on PetscViewer 723*5c6c1daeSBarry Smith 724*5c6c1daeSBarry Smith Input Parameter: 725*5c6c1daeSBarry Smith . viewer - the PetscViewer (created with PetscViewerDrawOpen()) 726*5c6c1daeSBarry Smith 727*5c6c1daeSBarry Smith Output Paramters: 728*5c6c1daeSBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate() 729*5c6c1daeSBarry Smith - bounds - the actual bounds, the size of this is 2*nbounds, the values are stored in the order min F_0, max F_0, min F_1, max F_1, ..... 730*5c6c1daeSBarry Smith 731*5c6c1daeSBarry Smith Level: intermediate 732*5c6c1daeSBarry Smith 733*5c6c1daeSBarry Smith Concepts: drawing^accessing PetscDraw context from PetscViewer 734*5c6c1daeSBarry Smith Concepts: graphics 735*5c6c1daeSBarry Smith 736*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen() 737*5c6c1daeSBarry Smith @*/ 738*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer,PetscInt *nbounds,const PetscReal **bounds) 739*5c6c1daeSBarry Smith { 740*5c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data; 741*5c6c1daeSBarry Smith 742*5c6c1daeSBarry Smith PetscFunctionBegin; 743*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 744*5c6c1daeSBarry Smith *nbounds = vdraw->nbounds; 745*5c6c1daeSBarry Smith *bounds = vdraw->bounds; 746*5c6c1daeSBarry Smith PetscFunctionReturn(0); 747*5c6c1daeSBarry Smith } 748