1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith /* 3*5c6c1daeSBarry Smith Provides the calling sequences for all the basic PetscDraw routines. 4*5c6c1daeSBarry Smith */ 5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h> /*I "petscdraw.h" I*/ 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith #undef __FUNCT__ 8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetViewPort" 9*5c6c1daeSBarry Smith /*@ 10*5c6c1daeSBarry Smith PetscDrawSetViewPort - Sets the portion of the window (page) to which draw 11*5c6c1daeSBarry Smith routines will write. 12*5c6c1daeSBarry Smith 13*5c6c1daeSBarry Smith Collective on PetscDraw 14*5c6c1daeSBarry Smith 15*5c6c1daeSBarry Smith Input Parameters: 16*5c6c1daeSBarry Smith + xl,yl,xr,yr - upper right and lower left corners of subwindow 17*5c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 18*5c6c1daeSBarry Smith Lower left corner is (0,0). 19*5c6c1daeSBarry Smith - draw - the drawing context 20*5c6c1daeSBarry Smith 21*5c6c1daeSBarry Smith Level: advanced 22*5c6c1daeSBarry Smith 23*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 24*5c6c1daeSBarry Smith Concepts: graphics^in subset of window 25*5c6c1daeSBarry Smith 26*5c6c1daeSBarry Smith @*/ 27*5c6c1daeSBarry Smith PetscErrorCode PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr) 28*5c6c1daeSBarry Smith { 29*5c6c1daeSBarry Smith PetscErrorCode ierr; 30*5c6c1daeSBarry Smith 31*5c6c1daeSBarry Smith PetscFunctionBegin; 32*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 33*5c6c1daeSBarry Smith if (xl < 0.0 || xr > 1.0 || yl < 0.0 || yr > 1.0 || xr <= xl || yr <= yl) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"ViewPort values must be >= 0 and <= 1: Instead %G %G %G %G",xl,yl,xr,yr); 34*5c6c1daeSBarry Smith draw->port_xl = xl; draw->port_yl = yl; 35*5c6c1daeSBarry Smith draw->port_xr = xr; draw->port_yr = yr; 36*5c6c1daeSBarry Smith if (draw->ops->setviewport) { 37*5c6c1daeSBarry Smith ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr); 38*5c6c1daeSBarry Smith } 39*5c6c1daeSBarry Smith PetscFunctionReturn(0); 40*5c6c1daeSBarry Smith } 41*5c6c1daeSBarry Smith 42*5c6c1daeSBarry Smith #undef __FUNCT__ 43*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetViewPort" 44*5c6c1daeSBarry Smith /*@ 45*5c6c1daeSBarry Smith PetscDrawGetViewPort - Gets the portion of the window (page) to which draw 46*5c6c1daeSBarry Smith routines will write. 47*5c6c1daeSBarry Smith 48*5c6c1daeSBarry Smith Collective on PetscDraw 49*5c6c1daeSBarry Smith 50*5c6c1daeSBarry Smith Input Parameter: 51*5c6c1daeSBarry Smith . draw - the drawing context 52*5c6c1daeSBarry Smith 53*5c6c1daeSBarry Smith Output Parameter: 54*5c6c1daeSBarry Smith . xl,yl,xr,yr - upper right and lower left corners of subwindow 55*5c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 56*5c6c1daeSBarry Smith Lower left corner is (0,0). 57*5c6c1daeSBarry Smith 58*5c6c1daeSBarry Smith Level: advanced 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 61*5c6c1daeSBarry Smith Concepts: graphics^in subset of window 62*5c6c1daeSBarry Smith 63*5c6c1daeSBarry Smith @*/ 64*5c6c1daeSBarry Smith PetscErrorCode PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr) 65*5c6c1daeSBarry Smith { 66*5c6c1daeSBarry Smith PetscFunctionBegin; 67*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 68*5c6c1daeSBarry Smith *xl = draw->port_xl; 69*5c6c1daeSBarry Smith *yl = draw->port_yl; 70*5c6c1daeSBarry Smith *xr = draw->port_xr; 71*5c6c1daeSBarry Smith *yr = draw->port_yr; 72*5c6c1daeSBarry Smith PetscFunctionReturn(0); 73*5c6c1daeSBarry Smith } 74*5c6c1daeSBarry Smith 75*5c6c1daeSBarry Smith #undef __FUNCT__ 76*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSplitViewPort" 77*5c6c1daeSBarry Smith /*@ 78*5c6c1daeSBarry Smith PetscDrawSplitViewPort - Splits a window shared by several processes into smaller 79*5c6c1daeSBarry Smith view ports. One for each process. 80*5c6c1daeSBarry Smith 81*5c6c1daeSBarry Smith Collective on PetscDraw 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith Input Parameter: 84*5c6c1daeSBarry Smith . draw - the drawing context 85*5c6c1daeSBarry Smith 86*5c6c1daeSBarry Smith Level: advanced 87*5c6c1daeSBarry Smith 88*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 89*5c6c1daeSBarry Smith 90*5c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort() 91*5c6c1daeSBarry Smith 92*5c6c1daeSBarry Smith @*/ 93*5c6c1daeSBarry Smith PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw) 94*5c6c1daeSBarry Smith { 95*5c6c1daeSBarry Smith PetscErrorCode ierr; 96*5c6c1daeSBarry Smith PetscMPIInt rank,size; 97*5c6c1daeSBarry Smith int n; 98*5c6c1daeSBarry Smith PetscBool isnull; 99*5c6c1daeSBarry Smith PetscReal xl,xr,yl,yr,h; 100*5c6c1daeSBarry Smith 101*5c6c1daeSBarry Smith PetscFunctionBegin; 102*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 103*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 104*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 105*5c6c1daeSBarry Smith 106*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)draw)->comm,&rank);CHKERRQ(ierr); 107*5c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)draw)->comm,&size);CHKERRQ(ierr); 108*5c6c1daeSBarry Smith 109*5c6c1daeSBarry Smith n = (int)(.1 + sqrt((double)size)); 110*5c6c1daeSBarry Smith while (n*n < size) {n++;} 111*5c6c1daeSBarry Smith 112*5c6c1daeSBarry Smith h = 1.0/n; 113*5c6c1daeSBarry Smith xl = (rank % n)*h; 114*5c6c1daeSBarry Smith xr = xl + h; 115*5c6c1daeSBarry Smith yl = (rank/n)*h; 116*5c6c1daeSBarry Smith yr = yl + h; 117*5c6c1daeSBarry Smith 118*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 119*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 120*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 121*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 122*5c6c1daeSBarry Smith ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); 123*5c6c1daeSBarry Smith 124*5c6c1daeSBarry Smith draw->port_xl = xl + .1*h; 125*5c6c1daeSBarry Smith draw->port_xr = xr - .1*h; 126*5c6c1daeSBarry Smith draw->port_yl = yl + .1*h; 127*5c6c1daeSBarry Smith draw->port_yr = yr - .1*h; 128*5c6c1daeSBarry Smith 129*5c6c1daeSBarry Smith if (draw->ops->setviewport) { 130*5c6c1daeSBarry Smith ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr); 131*5c6c1daeSBarry Smith } 132*5c6c1daeSBarry Smith PetscFunctionReturn(0); 133*5c6c1daeSBarry Smith } 134*5c6c1daeSBarry Smith 135*5c6c1daeSBarry Smith #undef __FUNCT__ 136*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreate" 137*5c6c1daeSBarry Smith /*@C 138*5c6c1daeSBarry Smith PetscDrawViewPortsCreate - Splits a window into smaller 139*5c6c1daeSBarry Smith view ports. Each processor shares all the viewports. 140*5c6c1daeSBarry Smith 141*5c6c1daeSBarry Smith Collective on PetscDraw 142*5c6c1daeSBarry Smith 143*5c6c1daeSBarry Smith Input Parameters: 144*5c6c1daeSBarry Smith + draw - the drawing context 145*5c6c1daeSBarry Smith - nports - the number of ports 146*5c6c1daeSBarry Smith 147*5c6c1daeSBarry Smith Output Parameter: 148*5c6c1daeSBarry Smith . ports - a PetscDrawViewPorts context (C structure) 149*5c6c1daeSBarry Smith 150*5c6c1daeSBarry Smith Level: advanced 151*5c6c1daeSBarry Smith 152*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 153*5c6c1daeSBarry Smith 154*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() 155*5c6c1daeSBarry Smith 156*5c6c1daeSBarry Smith @*/ 157*5c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **ports) 158*5c6c1daeSBarry Smith { 159*5c6c1daeSBarry Smith PetscInt i,n; 160*5c6c1daeSBarry Smith PetscErrorCode ierr; 161*5c6c1daeSBarry Smith PetscBool isnull; 162*5c6c1daeSBarry Smith PetscReal *xl,*xr,*yl,*yr,h; 163*5c6c1daeSBarry Smith 164*5c6c1daeSBarry Smith PetscFunctionBegin; 165*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 166*5c6c1daeSBarry Smith PetscValidPointer(ports,3); 167*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 168*5c6c1daeSBarry Smith if (isnull) { 169*5c6c1daeSBarry Smith *ports = PETSC_NULL; 170*5c6c1daeSBarry Smith PetscFunctionReturn(0); 171*5c6c1daeSBarry Smith } 172*5c6c1daeSBarry Smith 173*5c6c1daeSBarry Smith ierr = PetscNew(PetscDrawViewPorts,ports);CHKERRQ(ierr); 174*5c6c1daeSBarry Smith (*ports)->draw = draw; 175*5c6c1daeSBarry Smith (*ports)->nports = nports; 176*5c6c1daeSBarry Smith 177*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 178*5c6c1daeSBarry Smith 179*5c6c1daeSBarry Smith n = (int)(.1 + sqrt((double)nports)); 180*5c6c1daeSBarry Smith while (n*n < nports) {n++;} 181*5c6c1daeSBarry Smith 182*5c6c1daeSBarry Smith ierr = PetscMalloc(n*n*sizeof(PetscReal),&xl);CHKERRQ(ierr);(*ports)->xl = xl; 183*5c6c1daeSBarry Smith ierr = PetscMalloc(n*n*sizeof(PetscReal),&xr);CHKERRQ(ierr);(*ports)->xr = xr; 184*5c6c1daeSBarry Smith ierr = PetscMalloc(n*n*sizeof(PetscReal),&yl);CHKERRQ(ierr);(*ports)->yl = yl; 185*5c6c1daeSBarry Smith ierr = PetscMalloc(n*n*sizeof(PetscReal),&yr);CHKERRQ(ierr);(*ports)->yr = yr; 186*5c6c1daeSBarry Smith 187*5c6c1daeSBarry Smith h = 1.0/n; 188*5c6c1daeSBarry Smith 189*5c6c1daeSBarry Smith for (i=0; i<n*n; i++) { 190*5c6c1daeSBarry Smith xl[i] = (i % n)*h; 191*5c6c1daeSBarry Smith xr[i] = xl[i] + h; 192*5c6c1daeSBarry Smith yl[i] = (i/n)*h; 193*5c6c1daeSBarry Smith yr[i] = yl[i] + h; 194*5c6c1daeSBarry Smith 195*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 196*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 197*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 198*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 199*5c6c1daeSBarry Smith 200*5c6c1daeSBarry Smith xl[i] += .1*h; 201*5c6c1daeSBarry Smith xr[i] -= .1*h; 202*5c6c1daeSBarry Smith yl[i] += .1*h; 203*5c6c1daeSBarry Smith yr[i] -= .1*h; 204*5c6c1daeSBarry Smith } 205*5c6c1daeSBarry Smith /* save previous drawport of window */ 206*5c6c1daeSBarry Smith ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr); 207*5c6c1daeSBarry Smith /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);*/ /* this causes flicker */ 208*5c6c1daeSBarry Smith PetscFunctionReturn(0); 209*5c6c1daeSBarry Smith } 210*5c6c1daeSBarry Smith 211*5c6c1daeSBarry Smith #undef __FUNCT__ 212*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreateRect" 213*5c6c1daeSBarry Smith /*@C 214*5c6c1daeSBarry Smith PetscDrawViewPortsCreateRect - Splits a window into smaller 215*5c6c1daeSBarry Smith view ports. Each processor shares all the viewports. The number 216*5c6c1daeSBarry Smith of views in the x- and y-directions is specified. 217*5c6c1daeSBarry Smith 218*5c6c1daeSBarry Smith Collective on PetscDraw 219*5c6c1daeSBarry Smith 220*5c6c1daeSBarry Smith Input Parameters: 221*5c6c1daeSBarry Smith + draw - the drawing context 222*5c6c1daeSBarry Smith . nx - the number of x divisions 223*5c6c1daeSBarry Smith - ny - the number of y divisions 224*5c6c1daeSBarry Smith 225*5c6c1daeSBarry Smith Output Parameter: 226*5c6c1daeSBarry Smith . ports - a PetscDrawViewPorts context (C structure) 227*5c6c1daeSBarry Smith 228*5c6c1daeSBarry Smith Level: advanced 229*5c6c1daeSBarry Smith 230*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 231*5c6c1daeSBarry Smith 232*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() 233*5c6c1daeSBarry Smith 234*5c6c1daeSBarry Smith @*/ 235*5c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **ports) 236*5c6c1daeSBarry Smith { 237*5c6c1daeSBarry Smith PetscReal *xl, *xr, *yl, *yr, hx, hy; 238*5c6c1daeSBarry Smith PetscBool isnull; 239*5c6c1daeSBarry Smith PetscInt i, j, n; 240*5c6c1daeSBarry Smith PetscErrorCode ierr; 241*5c6c1daeSBarry Smith 242*5c6c1daeSBarry Smith PetscFunctionBegin; 243*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 244*5c6c1daeSBarry Smith if ((nx < 1) || (ny < 1)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d x %d", nx, ny); 245*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr); 246*5c6c1daeSBarry Smith if (isnull) { 247*5c6c1daeSBarry Smith *ports = PETSC_NULL; 248*5c6c1daeSBarry Smith PetscFunctionReturn(0); 249*5c6c1daeSBarry Smith } 250*5c6c1daeSBarry Smith n = nx*ny; 251*5c6c1daeSBarry Smith hx = 1.0/nx; 252*5c6c1daeSBarry Smith hy = 1.0/ny; 253*5c6c1daeSBarry Smith ierr = PetscNew(PetscDrawViewPorts, ports);CHKERRQ(ierr); 254*5c6c1daeSBarry Smith (*ports)->draw = draw; 255*5c6c1daeSBarry Smith (*ports)->nports = n; 256*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr); 257*5c6c1daeSBarry Smith ierr = PetscMalloc(n*sizeof(PetscReal), &xl);CHKERRQ(ierr);(*ports)->xl = xl; 258*5c6c1daeSBarry Smith ierr = PetscMalloc(n*sizeof(PetscReal), &xr);CHKERRQ(ierr);(*ports)->xr = xr; 259*5c6c1daeSBarry Smith ierr = PetscMalloc(n*sizeof(PetscReal), &yl);CHKERRQ(ierr);(*ports)->yl = yl; 260*5c6c1daeSBarry Smith ierr = PetscMalloc(n*sizeof(PetscReal), &yr);CHKERRQ(ierr);(*ports)->yr = yr; 261*5c6c1daeSBarry Smith for (i = 0; i < nx; i++) { 262*5c6c1daeSBarry Smith for (j = 0; j < ny; j++) { 263*5c6c1daeSBarry Smith PetscInt k = j*nx+i; 264*5c6c1daeSBarry Smith 265*5c6c1daeSBarry Smith xl[k] = i*hx; 266*5c6c1daeSBarry Smith xr[k] = xl[k] + hx; 267*5c6c1daeSBarry Smith yl[k] = j*hy; 268*5c6c1daeSBarry Smith yr[k] = yl[k] + hy; 269*5c6c1daeSBarry Smith 270*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 271*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 272*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 273*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 274*5c6c1daeSBarry Smith 275*5c6c1daeSBarry Smith xl[k] += .01*hx; 276*5c6c1daeSBarry Smith xr[k] -= .01*hx; 277*5c6c1daeSBarry Smith yl[k] += .01*hy; 278*5c6c1daeSBarry Smith yr[k] -= .01*hy; 279*5c6c1daeSBarry Smith } 280*5c6c1daeSBarry Smith } 281*5c6c1daeSBarry Smith ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr); 282*5c6c1daeSBarry Smith /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); */ /* this causes flicker */ 283*5c6c1daeSBarry Smith PetscFunctionReturn(0); 284*5c6c1daeSBarry Smith } 285*5c6c1daeSBarry Smith 286*5c6c1daeSBarry Smith #undef __FUNCT__ 287*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsDestroy" 288*5c6c1daeSBarry Smith /*@C 289*5c6c1daeSBarry Smith PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object 290*5c6c1daeSBarry Smith 291*5c6c1daeSBarry Smith Collective on PetscDraw inside PetscDrawViewPorts 292*5c6c1daeSBarry Smith 293*5c6c1daeSBarry Smith Input Parameter: 294*5c6c1daeSBarry Smith . ports - the PetscDrawViewPorts object 295*5c6c1daeSBarry Smith 296*5c6c1daeSBarry Smith Level: advanced 297*5c6c1daeSBarry Smith 298*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate() 299*5c6c1daeSBarry Smith 300*5c6c1daeSBarry Smith @*/ 301*5c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports) 302*5c6c1daeSBarry Smith { 303*5c6c1daeSBarry Smith PetscErrorCode ierr; 304*5c6c1daeSBarry Smith 305*5c6c1daeSBarry Smith PetscFunctionBegin; 306*5c6c1daeSBarry Smith if (!ports) PetscFunctionReturn(0); 307*5c6c1daeSBarry Smith /* reset Drawport of Window back to previous value */ 308*5c6c1daeSBarry Smith ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr); 309*5c6c1daeSBarry Smith ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr); 310*5c6c1daeSBarry Smith ierr = PetscFree(ports->xl);CHKERRQ(ierr); 311*5c6c1daeSBarry Smith ierr = PetscFree(ports->xr);CHKERRQ(ierr); 312*5c6c1daeSBarry Smith ierr = PetscFree(ports->yl);CHKERRQ(ierr); 313*5c6c1daeSBarry Smith ierr = PetscFree(ports->yr);CHKERRQ(ierr); 314*5c6c1daeSBarry Smith ierr = PetscFree(ports);CHKERRQ(ierr); 315*5c6c1daeSBarry Smith PetscFunctionReturn(0); 316*5c6c1daeSBarry Smith } 317*5c6c1daeSBarry Smith 318*5c6c1daeSBarry Smith #undef __FUNCT__ 319*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsSet" 320*5c6c1daeSBarry Smith /*@C 321*5c6c1daeSBarry Smith PetscDrawViewPortsSet - sets a draw object to use a particular subport 322*5c6c1daeSBarry Smith 323*5c6c1daeSBarry Smith Logically Collective on PetscDraw inside PetscDrawViewPorts 324*5c6c1daeSBarry Smith 325*5c6c1daeSBarry Smith Input Parameter: 326*5c6c1daeSBarry Smith + ports - the PetscDrawViewPorts object 327*5c6c1daeSBarry Smith - port - the port number, from 0 to nports-1 328*5c6c1daeSBarry Smith 329*5c6c1daeSBarry Smith Level: advanced 330*5c6c1daeSBarry Smith 331*5c6c1daeSBarry Smith Concepts: drawing^in subset of window 332*5c6c1daeSBarry Smith 333*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate() 334*5c6c1daeSBarry Smith 335*5c6c1daeSBarry Smith @*/ 336*5c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port) 337*5c6c1daeSBarry Smith { 338*5c6c1daeSBarry Smith PetscErrorCode ierr; 339*5c6c1daeSBarry Smith 340*5c6c1daeSBarry Smith PetscFunctionBegin; 341*5c6c1daeSBarry Smith if (ports) { 342*5c6c1daeSBarry Smith if (port < 0 || port > ports->nports-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Port is out of range requested %d from 0 to %d\n",port,ports->nports); 343*5c6c1daeSBarry Smith ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr); 344*5c6c1daeSBarry Smith } 345*5c6c1daeSBarry Smith PetscFunctionReturn(0); 346*5c6c1daeSBarry Smith } 347