15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the calling sequences for all the basic PetscDraw routines. 45c6c1daeSBarry Smith */ 5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith /*@ 85c6c1daeSBarry Smith PetscDrawSetViewPort - Sets the portion of the window (page) to which draw 95c6c1daeSBarry Smith routines will write. 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith Collective on PetscDraw 125c6c1daeSBarry Smith 135c6c1daeSBarry Smith Input Parameters: 145c6c1daeSBarry Smith + xl,yl,xr,yr - upper right and lower left corners of subwindow 155c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 165c6c1daeSBarry Smith Lower left corner is (0,0). 175c6c1daeSBarry Smith - draw - the drawing context 185c6c1daeSBarry Smith 195c6c1daeSBarry Smith Level: advanced 205c6c1daeSBarry Smith 215c6c1daeSBarry Smith 225c6c1daeSBarry Smith @*/ 235c6c1daeSBarry Smith PetscErrorCode PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr) 245c6c1daeSBarry Smith { 255c6c1daeSBarry Smith PetscErrorCode ierr; 265c6c1daeSBarry Smith 275c6c1daeSBarry Smith PetscFunctionBegin; 285c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2957622a8eSBarry 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",(double)xl,(double)yl,(double)xr,(double)yr); 305c6c1daeSBarry Smith draw->port_xl = xl; draw->port_yl = yl; 315c6c1daeSBarry Smith draw->port_xr = xr; draw->port_yr = yr; 325c6c1daeSBarry Smith if (draw->ops->setviewport) { 335c6c1daeSBarry Smith ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr); 345c6c1daeSBarry Smith } 355c6c1daeSBarry Smith PetscFunctionReturn(0); 365c6c1daeSBarry Smith } 375c6c1daeSBarry Smith 385c6c1daeSBarry Smith /*@ 395c6c1daeSBarry Smith PetscDrawGetViewPort - Gets the portion of the window (page) to which draw 405c6c1daeSBarry Smith routines will write. 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith Collective on PetscDraw 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith Input Parameter: 455c6c1daeSBarry Smith . draw - the drawing context 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith Output Parameter: 485c6c1daeSBarry Smith . xl,yl,xr,yr - upper right and lower left corners of subwindow 495c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 505c6c1daeSBarry Smith Lower left corner is (0,0). 515c6c1daeSBarry Smith 525c6c1daeSBarry Smith Level: advanced 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith 555c6c1daeSBarry Smith @*/ 565c6c1daeSBarry Smith PetscErrorCode PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr) 575c6c1daeSBarry Smith { 585c6c1daeSBarry Smith PetscFunctionBegin; 595c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 608f69470aSLisandro Dalcin PetscValidRealPointer(xl,2); 618f69470aSLisandro Dalcin PetscValidRealPointer(yl,3); 628f69470aSLisandro Dalcin PetscValidRealPointer(xr,4); 638f69470aSLisandro Dalcin PetscValidRealPointer(yr,5); 645c6c1daeSBarry Smith *xl = draw->port_xl; 655c6c1daeSBarry Smith *yl = draw->port_yl; 665c6c1daeSBarry Smith *xr = draw->port_xr; 675c6c1daeSBarry Smith *yr = draw->port_yr; 685c6c1daeSBarry Smith PetscFunctionReturn(0); 695c6c1daeSBarry Smith } 705c6c1daeSBarry Smith 715c6c1daeSBarry Smith /*@ 725c6c1daeSBarry Smith PetscDrawSplitViewPort - Splits a window shared by several processes into smaller 735c6c1daeSBarry Smith view ports. One for each process. 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith Collective on PetscDraw 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Input Parameter: 785c6c1daeSBarry Smith . draw - the drawing context 795c6c1daeSBarry Smith 805c6c1daeSBarry Smith Level: advanced 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort() 835c6c1daeSBarry Smith 845c6c1daeSBarry Smith @*/ 855c6c1daeSBarry Smith PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw) 865c6c1daeSBarry Smith { 875c6c1daeSBarry Smith PetscErrorCode ierr; 885c6c1daeSBarry Smith PetscMPIInt rank,size; 89369cc0aeSBarry Smith PetscInt n; 905c6c1daeSBarry Smith PetscBool isnull; 915c6c1daeSBarry Smith PetscReal xl,xr,yl,yr,h; 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith PetscFunctionBegin; 945c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 958f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 965c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 97ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); 98ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr); 995c6c1daeSBarry Smith 100369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size)); 101a297a907SKarl Rupp while (n*n < size) n++; 1025c6c1daeSBarry Smith 1035c6c1daeSBarry Smith h = 1.0/n; 1045c6c1daeSBarry Smith xl = (rank % n)*h; 1055c6c1daeSBarry Smith xr = xl + h; 1065c6c1daeSBarry Smith yl = (rank / n)*h; 1075c6c1daeSBarry Smith yr = yl + h; 1085c6c1daeSBarry Smith 109e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1105c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 1115c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 1125c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 1135c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 114e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1155b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 1165c6c1daeSBarry Smith 117e5ab1681SLisandro Dalcin draw->port_xl = xl + .05*h; 118e5ab1681SLisandro Dalcin draw->port_xr = xr - .05*h; 119e5ab1681SLisandro Dalcin draw->port_yl = yl + .05*h; 120e5ab1681SLisandro Dalcin draw->port_yr = yr - .05*h; 1215c6c1daeSBarry Smith 1225c6c1daeSBarry Smith if (draw->ops->setviewport) { 1235c6c1daeSBarry Smith ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1245c6c1daeSBarry Smith } 1255c6c1daeSBarry Smith PetscFunctionReturn(0); 1265c6c1daeSBarry Smith } 1275c6c1daeSBarry Smith 1285c6c1daeSBarry Smith /*@C 129cf79e978SBarry Smith PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports. 1305c6c1daeSBarry Smith 1315c6c1daeSBarry Smith Collective on PetscDraw 1325c6c1daeSBarry Smith 1335c6c1daeSBarry Smith Input Parameters: 1345c6c1daeSBarry Smith + draw - the drawing context 1355c6c1daeSBarry Smith - nports - the number of ports 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Output Parameter: 1385c6c1daeSBarry Smith . ports - a PetscDrawViewPorts context (C structure) 1395c6c1daeSBarry Smith 140cf79e978SBarry Smith Options Database: 141*8e5aa403SBarry Smith . -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in separate windows 142cf79e978SBarry Smith 1435c6c1daeSBarry Smith Level: advanced 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith @*/ 148e5ab1681SLisandro Dalcin PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports) 1495c6c1daeSBarry Smith { 150e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 1515c6c1daeSBarry Smith PetscInt i,n; 1525c6c1daeSBarry Smith PetscBool isnull; 153e5ab1681SLisandro Dalcin PetscMPIInt rank; 1545c6c1daeSBarry Smith PetscReal *xl,*xr,*yl,*yr,h; 155e5ab1681SLisandro Dalcin PetscErrorCode ierr; 1565c6c1daeSBarry Smith 1575c6c1daeSBarry Smith PetscFunctionBegin; 1585c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 159e5ab1681SLisandro Dalcin if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports); 160e5ab1681SLisandro Dalcin PetscValidPointer(newports,3); 161e118a51fSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 162e5ab1681SLisandro Dalcin if (isnull) {*newports = NULL; PetscFunctionReturn(0);} 163e5ab1681SLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); 1645c6c1daeSBarry Smith 165e5ab1681SLisandro Dalcin ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports; 166e5ab1681SLisandro Dalcin ports->draw = draw; 167e5ab1681SLisandro Dalcin ports->nports = nports; 1685c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 169e5ab1681SLisandro Dalcin /* save previous drawport of window */ 170e5ab1681SLisandro Dalcin ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr); 1715c6c1daeSBarry Smith 172369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports)); 173a297a907SKarl Rupp while (n*n < nports) n++; 1745c6c1daeSBarry Smith h = 1.0/n; 1755c6c1daeSBarry Smith 176cf79e978SBarry Smith ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr); 177cf79e978SBarry Smith ports->xl = xl; 178cf79e978SBarry Smith ports->xr = xr; 179cf79e978SBarry Smith ports->yl = yl; 180cf79e978SBarry Smith ports->yr = yr; 181e5ab1681SLisandro Dalcin 182e5ab1681SLisandro Dalcin ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr); 183e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1845c6c1daeSBarry Smith for (i=0; i<n*n; i++) { 1855c6c1daeSBarry Smith xl[i] = (i % n)*h; 1865c6c1daeSBarry Smith xr[i] = xl[i] + h; 1875c6c1daeSBarry Smith yl[i] = (i / n)*h; 1885c6c1daeSBarry Smith yr[i] = yl[i] + h; 1895c6c1daeSBarry Smith 190e5ab1681SLisandro Dalcin if (!rank) { 1915c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 1925c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 1935c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 1945c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); 1955c6c1daeSBarry Smith } 196e5ab1681SLisandro Dalcin 197e5ab1681SLisandro Dalcin xl[i] += .05*h; 198e5ab1681SLisandro Dalcin xr[i] -= .05*h; 199e5ab1681SLisandro Dalcin yl[i] += .05*h; 200e5ab1681SLisandro Dalcin yr[i] -= .05*h; 201e5ab1681SLisandro Dalcin } 202e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 203e5ab1681SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 2045c6c1daeSBarry Smith PetscFunctionReturn(0); 2055c6c1daeSBarry Smith } 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith /*@C 2085c6c1daeSBarry Smith PetscDrawViewPortsCreateRect - Splits a window into smaller 2095c6c1daeSBarry Smith view ports. Each processor shares all the viewports. The number 2105c6c1daeSBarry Smith of views in the x- and y-directions is specified. 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith Collective on PetscDraw 2135c6c1daeSBarry Smith 2145c6c1daeSBarry Smith Input Parameters: 2155c6c1daeSBarry Smith + draw - the drawing context 2165c6c1daeSBarry Smith . nx - the number of x divisions 2175c6c1daeSBarry Smith - ny - the number of y divisions 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Output Parameter: 2205c6c1daeSBarry Smith . ports - a PetscDrawViewPorts context (C structure) 2215c6c1daeSBarry Smith 2225c6c1daeSBarry Smith Level: advanced 2235c6c1daeSBarry Smith 2245c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith @*/ 227e5ab1681SLisandro Dalcin PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports) 2285c6c1daeSBarry Smith { 229e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 2305c6c1daeSBarry Smith PetscReal *xl,*xr,*yl,*yr,hx,hy; 231e5ab1681SLisandro Dalcin PetscInt i,j,k,n; 2325c6c1daeSBarry Smith PetscBool isnull; 233e5ab1681SLisandro Dalcin PetscMPIInt rank; 2345c6c1daeSBarry Smith PetscErrorCode ierr; 2355c6c1daeSBarry Smith 2365c6c1daeSBarry Smith PetscFunctionBegin; 2375c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2385c6c1daeSBarry 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); 239e5ab1681SLisandro Dalcin PetscValidPointer(newports,3); 240e118a51fSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 241e5ab1681SLisandro Dalcin if (isnull) {*newports = NULL; PetscFunctionReturn(0);} 242e5ab1681SLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); 243e118a51fSLisandro Dalcin 2445c6c1daeSBarry Smith n = nx*ny; 2455c6c1daeSBarry Smith hx = 1.0/nx; 2465c6c1daeSBarry Smith hy = 1.0/ny; 247e5ab1681SLisandro Dalcin ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports; 248e5ab1681SLisandro Dalcin ports->draw = draw; 249e5ab1681SLisandro Dalcin ports->nports = n; 2505c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr); 251e5ab1681SLisandro Dalcin /* save previous drawport of window */ 252e5ab1681SLisandro Dalcin ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr); 253e5ab1681SLisandro Dalcin 254cf79e978SBarry Smith ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr); 255cf79e978SBarry Smith ports->xr = xr; 256cf79e978SBarry Smith ports->xl = xl; 257cf79e978SBarry Smith ports->yl = yl; 258cf79e978SBarry Smith ports->yr = yr; 259e5ab1681SLisandro Dalcin 260e5ab1681SLisandro Dalcin ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr); 261e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 2625c6c1daeSBarry Smith for (i = 0; i < nx; i++) { 2635c6c1daeSBarry Smith for (j = 0; j < ny; j++) { 264e5ab1681SLisandro Dalcin k = j*nx+i; 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith xl[k] = i*hx; 2675c6c1daeSBarry Smith xr[k] = xl[k] + hx; 2685c6c1daeSBarry Smith yl[k] = j*hy; 2695c6c1daeSBarry Smith yr[k] = yl[k] + hy; 2705c6c1daeSBarry Smith 271e5ab1681SLisandro Dalcin if (!rank) { 2725c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 2735c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 2745c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 2755c6c1daeSBarry Smith ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); 276e5ab1681SLisandro Dalcin } 2775c6c1daeSBarry Smith 278e5ab1681SLisandro Dalcin xl[k] += .05*hx; 279e5ab1681SLisandro Dalcin xr[k] -= .05*hx; 280e5ab1681SLisandro Dalcin yl[k] += .05*hy; 281e5ab1681SLisandro Dalcin yr[k] -= .05*hy; 2825c6c1daeSBarry Smith } 2835c6c1daeSBarry Smith } 284e5ab1681SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 285e5ab1681SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 2865c6c1daeSBarry Smith PetscFunctionReturn(0); 2875c6c1daeSBarry Smith } 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith /*@C 2905c6c1daeSBarry Smith PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object 2915c6c1daeSBarry Smith 2925c6c1daeSBarry Smith Collective on PetscDraw inside PetscDrawViewPorts 2935c6c1daeSBarry Smith 2945c6c1daeSBarry Smith Input Parameter: 2955c6c1daeSBarry Smith . ports - the PetscDrawViewPorts object 2965c6c1daeSBarry Smith 2975c6c1daeSBarry Smith Level: advanced 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate() 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith @*/ 3025c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports) 3035c6c1daeSBarry Smith { 3045c6c1daeSBarry Smith PetscErrorCode ierr; 3055c6c1daeSBarry Smith 3065c6c1daeSBarry Smith PetscFunctionBegin; 3075c6c1daeSBarry Smith if (!ports) PetscFunctionReturn(0); 3088f69470aSLisandro Dalcin PetscValidPointer(ports,1); 3095c6c1daeSBarry Smith /* reset Drawport of Window back to previous value */ 3105c6c1daeSBarry Smith ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr); 3115c6c1daeSBarry Smith ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr); 312cf79e978SBarry Smith ierr = PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr);CHKERRQ(ierr); 3135c6c1daeSBarry Smith ierr = PetscFree(ports);CHKERRQ(ierr); 3145c6c1daeSBarry Smith PetscFunctionReturn(0); 3155c6c1daeSBarry Smith } 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith /*@C 3185c6c1daeSBarry Smith PetscDrawViewPortsSet - sets a draw object to use a particular subport 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith Logically Collective on PetscDraw inside PetscDrawViewPorts 3215c6c1daeSBarry Smith 3225c6c1daeSBarry Smith Input Parameter: 3235c6c1daeSBarry Smith + ports - the PetscDrawViewPorts object 3245c6c1daeSBarry Smith - port - the port number, from 0 to nports-1 3255c6c1daeSBarry Smith 3265c6c1daeSBarry Smith Level: advanced 3275c6c1daeSBarry Smith 3285c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate() 3295c6c1daeSBarry Smith 3305c6c1daeSBarry Smith @*/ 3315c6c1daeSBarry Smith PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port) 3325c6c1daeSBarry Smith { 3335c6c1daeSBarry Smith PetscErrorCode ierr; 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith PetscFunctionBegin; 3368f69470aSLisandro Dalcin if (!ports) PetscFunctionReturn(0); 33745f3bb6eSLisandro Dalcin PetscValidPointer(ports,1); 338e5ab1681SLisandro Dalcin 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-1); 3395c6c1daeSBarry Smith ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr); 3405c6c1daeSBarry Smith PetscFunctionReturn(0); 3415c6c1daeSBarry Smith } 342