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 11*c3339decSBarry Smith Collective 125c6c1daeSBarry Smith 135c6c1daeSBarry Smith Input Parameters: 146b867d5aSJose E. Roman + xl - the horizontal coordinate of the lower left corner of the subwindow. 156b867d5aSJose E. Roman . yl - the vertical coordinate of the lower left corner of the subwindow. 166b867d5aSJose E. Roman . xr - the horizontal coordinate of the upper right corner of the subwindow. 176b867d5aSJose E. Roman . yr - the vertical coordinate of the upper right corner of the subwindow. 186b867d5aSJose E. Roman - draw - the drawing context 196b867d5aSJose E. Roman 206b867d5aSJose E. Roman Notes: 215c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 22811af0c4SBarry Smith 235c6c1daeSBarry Smith Lower left corner is (0,0). 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith Level: advanced 265c6c1daeSBarry Smith 27811af0c4SBarry Smith .seealso: `PetscDrawGetViewPort(), ``PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawViewPortsCreate()` 285c6c1daeSBarry Smith @*/ 29d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetViewPort(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr) 30d71ae5a4SJacob Faibussowitsch { 315c6c1daeSBarry Smith PetscFunctionBegin; 325c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 332c71b3e2SJacob Faibussowitsch PetscCheck(xl >= 0.0 && xr <= 1.0 && yl >= 0.0 && yr <= 1.0 && xr > xl && yr > yl, 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); 349371c9d4SSatish Balay draw->port_xl = xl; 359371c9d4SSatish Balay draw->port_yl = yl; 369371c9d4SSatish Balay draw->port_xr = xr; 379371c9d4SSatish Balay draw->port_yr = yr; 38dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr); 395c6c1daeSBarry Smith PetscFunctionReturn(0); 405c6c1daeSBarry Smith } 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith /*@ 435c6c1daeSBarry Smith PetscDrawGetViewPort - Gets the portion of the window (page) to which draw 445c6c1daeSBarry Smith routines will write. 455c6c1daeSBarry Smith 46*c3339decSBarry Smith Collective 475c6c1daeSBarry Smith 485c6c1daeSBarry Smith Input Parameter: 495c6c1daeSBarry Smith . draw - the drawing context 505c6c1daeSBarry Smith 5197bb3fdcSJose E. Roman Output Parameters: 526b867d5aSJose E. Roman + xl - the horizontal coordinate of the lower left corner of the subwindow. 536b867d5aSJose E. Roman . yl - the vertical coordinate of the lower left corner of the subwindow. 546b867d5aSJose E. Roman . xr - the horizontal coordinate of the upper right corner of the subwindow. 5597bb3fdcSJose E. Roman - yr - the vertical coordinate of the upper right corner of the subwindow. 566b867d5aSJose E. Roman 576b867d5aSJose E. Roman Notes: 585c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 59811af0c4SBarry Smith 605c6c1daeSBarry Smith Lower left corner is (0,0). 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith Level: advanced 635c6c1daeSBarry Smith 64811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()` 655c6c1daeSBarry Smith @*/ 66d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetViewPort(PetscDraw draw, PetscReal *xl, PetscReal *yl, PetscReal *xr, PetscReal *yr) 67d71ae5a4SJacob Faibussowitsch { 685c6c1daeSBarry Smith PetscFunctionBegin; 695c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 708f69470aSLisandro Dalcin PetscValidRealPointer(xl, 2); 718f69470aSLisandro Dalcin PetscValidRealPointer(yl, 3); 728f69470aSLisandro Dalcin PetscValidRealPointer(xr, 4); 738f69470aSLisandro Dalcin PetscValidRealPointer(yr, 5); 745c6c1daeSBarry Smith *xl = draw->port_xl; 755c6c1daeSBarry Smith *yl = draw->port_yl; 765c6c1daeSBarry Smith *xr = draw->port_xr; 775c6c1daeSBarry Smith *yr = draw->port_yr; 785c6c1daeSBarry Smith PetscFunctionReturn(0); 795c6c1daeSBarry Smith } 805c6c1daeSBarry Smith 815c6c1daeSBarry Smith /*@ 825c6c1daeSBarry Smith PetscDrawSplitViewPort - Splits a window shared by several processes into smaller 835c6c1daeSBarry Smith view ports. One for each process. 845c6c1daeSBarry Smith 85*c3339decSBarry Smith Collective 865c6c1daeSBarry Smith 875c6c1daeSBarry Smith Input Parameter: 885c6c1daeSBarry Smith . draw - the drawing context 895c6c1daeSBarry Smith 905c6c1daeSBarry Smith Level: advanced 915c6c1daeSBarry Smith 92db781477SPatrick Sanan .seealso: `PetscDrawDivideViewPort()`, `PetscDrawSetViewPort()` 935c6c1daeSBarry Smith @*/ 94d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw) 95d71ae5a4SJacob Faibussowitsch { 965c6c1daeSBarry Smith PetscMPIInt rank, size; 97369cc0aeSBarry Smith PetscInt n; 985c6c1daeSBarry Smith PetscBool isnull; 995c6c1daeSBarry Smith PetscReal xl, xr, yl, yr, h; 1005c6c1daeSBarry Smith 1015c6c1daeSBarry Smith PetscFunctionBegin; 1025c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1039566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 1045c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 1059566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 1069566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 1075c6c1daeSBarry Smith 108369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size)); 109a297a907SKarl Rupp while (n * n < size) n++; 1105c6c1daeSBarry Smith 1115c6c1daeSBarry Smith h = 1.0 / n; 1125c6c1daeSBarry Smith xl = (rank % n) * h; 1135c6c1daeSBarry Smith xr = xl + h; 1145c6c1daeSBarry Smith yl = (rank / n) * h; 1155c6c1daeSBarry Smith yr = yl + h; 1165c6c1daeSBarry Smith 117d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 1189566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl, yl, xl, yr, PETSC_DRAW_BLACK)); 1199566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl, yr, xr, yr, PETSC_DRAW_BLACK)); 1209566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr, yr, xr, yl, PETSC_DRAW_BLACK)); 1219566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr, yl, xl, yl, PETSC_DRAW_BLACK)); 122d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 1239566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 1245c6c1daeSBarry Smith 125e5ab1681SLisandro Dalcin draw->port_xl = xl + .05 * h; 126e5ab1681SLisandro Dalcin draw->port_xr = xr - .05 * h; 127e5ab1681SLisandro Dalcin draw->port_yl = yl + .05 * h; 128e5ab1681SLisandro Dalcin draw->port_yr = yr - .05 * h; 1295c6c1daeSBarry Smith 130dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr); 1315c6c1daeSBarry Smith PetscFunctionReturn(0); 1325c6c1daeSBarry Smith } 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith /*@C 135cf79e978SBarry Smith PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports. 1365c6c1daeSBarry Smith 137*c3339decSBarry Smith Collective 1385c6c1daeSBarry Smith 1395c6c1daeSBarry Smith Input Parameters: 1405c6c1daeSBarry Smith + draw - the drawing context 1415c6c1daeSBarry Smith - nports - the number of ports 1425c6c1daeSBarry Smith 1435c6c1daeSBarry Smith Output Parameter: 144811af0c4SBarry Smith . ports - a `PetscDrawViewPorts` context (C structure) 1455c6c1daeSBarry Smith 146811af0c4SBarry Smith Options Database Key: 147e1dfdf8eSBarry Smith . -draw_ports - display multiple fields in the same window with PetscDrawPorts() instead of in separate windows 148cf79e978SBarry Smith 1495c6c1daeSBarry Smith Level: advanced 1505c6c1daeSBarry Smith 151db781477SPatrick Sanan .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()` 1525c6c1daeSBarry Smith @*/ 153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw, PetscInt nports, PetscDrawViewPorts **newports) 154d71ae5a4SJacob Faibussowitsch { 155e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 1565c6c1daeSBarry Smith PetscInt i, n; 1575c6c1daeSBarry Smith PetscBool isnull; 158e5ab1681SLisandro Dalcin PetscMPIInt rank; 1595c6c1daeSBarry Smith PetscReal *xl, *xr, *yl, *yr, h; 1605c6c1daeSBarry Smith 1615c6c1daeSBarry Smith PetscFunctionBegin; 1625c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1632c71b3e2SJacob Faibussowitsch PetscCheck(nports >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT, nports); 164e5ab1681SLisandro Dalcin PetscValidPointer(newports, 3); 1659566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 1669371c9d4SSatish Balay if (isnull) { 1679371c9d4SSatish Balay *newports = NULL; 1689371c9d4SSatish Balay PetscFunctionReturn(0); 1699371c9d4SSatish Balay } 1709566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 1715c6c1daeSBarry Smith 1729371c9d4SSatish Balay PetscCall(PetscNew(&ports)); 1739371c9d4SSatish Balay *newports = ports; 174e5ab1681SLisandro Dalcin ports->draw = draw; 175e5ab1681SLisandro Dalcin ports->nports = nports; 1769566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 177e5ab1681SLisandro Dalcin /* save previous drawport of window */ 1789566063dSJacob Faibussowitsch PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr)); 1795c6c1daeSBarry Smith 180369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports)); 181a297a907SKarl Rupp while (n * n < nports) n++; 1825c6c1daeSBarry Smith h = 1.0 / n; 1835c6c1daeSBarry Smith 1849566063dSJacob Faibussowitsch PetscCall(PetscMalloc4(n * n, &xl, n * n, &xr, n * n, &yl, n * n, &yr)); 185cf79e978SBarry Smith ports->xl = xl; 186cf79e978SBarry Smith ports->xr = xr; 187cf79e978SBarry Smith ports->yl = yl; 188cf79e978SBarry Smith ports->yr = yr; 189e5ab1681SLisandro Dalcin 1909566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0)); 191d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 1925c6c1daeSBarry Smith for (i = 0; i < n * n; i++) { 1935c6c1daeSBarry Smith xl[i] = (i % n) * h; 1945c6c1daeSBarry Smith xr[i] = xl[i] + h; 1955c6c1daeSBarry Smith yl[i] = (i / n) * h; 1965c6c1daeSBarry Smith yr[i] = yl[i] + h; 1975c6c1daeSBarry Smith 198dd400576SPatrick Sanan if (rank == 0) { 1999566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[i], yl[i], xl[i], yr[i], PETSC_DRAW_BLACK)); 2009566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[i], yr[i], xr[i], yr[i], PETSC_DRAW_BLACK)); 2019566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[i], yr[i], xr[i], yl[i], PETSC_DRAW_BLACK)); 2029566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[i], yl[i], xl[i], yl[i], PETSC_DRAW_BLACK)); 2035c6c1daeSBarry Smith } 204e5ab1681SLisandro Dalcin 205e5ab1681SLisandro Dalcin xl[i] += .05 * h; 206e5ab1681SLisandro Dalcin xr[i] -= .05 * h; 207e5ab1681SLisandro Dalcin yl[i] += .05 * h; 208e5ab1681SLisandro Dalcin yr[i] -= .05 * h; 209e5ab1681SLisandro Dalcin } 210d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 2119566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 2125c6c1daeSBarry Smith PetscFunctionReturn(0); 2135c6c1daeSBarry Smith } 2145c6c1daeSBarry Smith 2155c6c1daeSBarry Smith /*@C 2165c6c1daeSBarry Smith PetscDrawViewPortsCreateRect - Splits a window into smaller 2175c6c1daeSBarry Smith view ports. Each processor shares all the viewports. The number 2185c6c1daeSBarry Smith of views in the x- and y-directions is specified. 2195c6c1daeSBarry Smith 220*c3339decSBarry Smith Collective 2215c6c1daeSBarry Smith 2225c6c1daeSBarry Smith Input Parameters: 2235c6c1daeSBarry Smith + draw - the drawing context 2245c6c1daeSBarry Smith . nx - the number of x divisions 2255c6c1daeSBarry Smith - ny - the number of y divisions 2265c6c1daeSBarry Smith 2275c6c1daeSBarry Smith Output Parameter: 228811af0c4SBarry Smith . ports - a `PetscDrawViewPorts` context (C structure) 2295c6c1daeSBarry Smith 2305c6c1daeSBarry Smith Level: advanced 2315c6c1daeSBarry Smith 232811af0c4SBarry Smith .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPorts` 2335c6c1daeSBarry Smith @*/ 234d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw, PetscInt nx, PetscInt ny, PetscDrawViewPorts **newports) 235d71ae5a4SJacob Faibussowitsch { 236e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 2375c6c1daeSBarry Smith PetscReal *xl, *xr, *yl, *yr, hx, hy; 238e5ab1681SLisandro Dalcin PetscInt i, j, k, n; 2395c6c1daeSBarry Smith PetscBool isnull; 240e5ab1681SLisandro Dalcin PetscMPIInt rank; 2415c6c1daeSBarry Smith 2425c6c1daeSBarry Smith PetscFunctionBegin; 2435c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2442c71b3e2SJacob Faibussowitsch PetscCheck(nx >= 1 && ny >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT " x %" PetscInt_FMT, nx, ny); 245064a246eSJacob Faibussowitsch PetscValidPointer(newports, 4); 2469566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 2479371c9d4SSatish Balay if (isnull) { 2489371c9d4SSatish Balay *newports = NULL; 2499371c9d4SSatish Balay PetscFunctionReturn(0); 2509371c9d4SSatish Balay } 2519566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 252e118a51fSLisandro Dalcin 2535c6c1daeSBarry Smith n = nx * ny; 2545c6c1daeSBarry Smith hx = 1.0 / nx; 2555c6c1daeSBarry Smith hy = 1.0 / ny; 2569371c9d4SSatish Balay PetscCall(PetscNew(&ports)); 2579371c9d4SSatish Balay *newports = ports; 258e5ab1681SLisandro Dalcin ports->draw = draw; 259e5ab1681SLisandro Dalcin ports->nports = n; 2609566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 261e5ab1681SLisandro Dalcin /* save previous drawport of window */ 2629566063dSJacob Faibussowitsch PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr)); 263e5ab1681SLisandro Dalcin 2649566063dSJacob Faibussowitsch PetscCall(PetscMalloc4(n, &xl, n, &xr, n, &yl, n, &yr)); 265cf79e978SBarry Smith ports->xr = xr; 266cf79e978SBarry Smith ports->xl = xl; 267cf79e978SBarry Smith ports->yl = yl; 268cf79e978SBarry Smith ports->yr = yr; 269e5ab1681SLisandro Dalcin 2709566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0)); 271d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 2725c6c1daeSBarry Smith for (i = 0; i < nx; i++) { 2735c6c1daeSBarry Smith for (j = 0; j < ny; j++) { 274e5ab1681SLisandro Dalcin k = j * nx + i; 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith xl[k] = i * hx; 2775c6c1daeSBarry Smith xr[k] = xl[k] + hx; 2785c6c1daeSBarry Smith yl[k] = j * hy; 2795c6c1daeSBarry Smith yr[k] = yl[k] + hy; 2805c6c1daeSBarry Smith 281dd400576SPatrick Sanan if (rank == 0) { 2829566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[k], yl[k], xl[k], yr[k], PETSC_DRAW_BLACK)); 2839566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[k], yr[k], xr[k], yr[k], PETSC_DRAW_BLACK)); 2849566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[k], yr[k], xr[k], yl[k], PETSC_DRAW_BLACK)); 2859566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[k], yl[k], xl[k], yl[k], PETSC_DRAW_BLACK)); 286e5ab1681SLisandro Dalcin } 2875c6c1daeSBarry Smith 288e5ab1681SLisandro Dalcin xl[k] += .05 * hx; 289e5ab1681SLisandro Dalcin xr[k] -= .05 * hx; 290e5ab1681SLisandro Dalcin yl[k] += .05 * hy; 291e5ab1681SLisandro Dalcin yr[k] -= .05 * hy; 2925c6c1daeSBarry Smith } 2935c6c1daeSBarry Smith } 294d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 2959566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 2965c6c1daeSBarry Smith PetscFunctionReturn(0); 2975c6c1daeSBarry Smith } 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith /*@C 300811af0c4SBarry Smith PetscDrawViewPortsDestroy - frees a `PetscDrawViewPorts` object 3015c6c1daeSBarry Smith 302811af0c4SBarry Smith Collective on the PetscDraw inside ports 3035c6c1daeSBarry Smith 3045c6c1daeSBarry Smith Input Parameter: 305811af0c4SBarry Smith . ports - the `PetscDrawViewPorts` object 3065c6c1daeSBarry Smith 3075c6c1daeSBarry Smith Level: advanced 3085c6c1daeSBarry Smith 309811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsCreate()` 3105c6c1daeSBarry Smith @*/ 311d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports) 312d71ae5a4SJacob Faibussowitsch { 3135c6c1daeSBarry Smith PetscFunctionBegin; 3145c6c1daeSBarry Smith if (!ports) PetscFunctionReturn(0); 3158f69470aSLisandro Dalcin PetscValidPointer(ports, 1); 3165c6c1daeSBarry Smith /* reset Drawport of Window back to previous value */ 3179566063dSJacob Faibussowitsch PetscCall(PetscDrawSetViewPort(ports->draw, ports->port_xl, ports->port_yl, ports->port_xr, ports->port_yr)); 3189566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&ports->draw)); 3199566063dSJacob Faibussowitsch PetscCall(PetscFree4(ports->xl, ports->xr, ports->yl, ports->yr)); 3209566063dSJacob Faibussowitsch PetscCall(PetscFree(ports)); 3215c6c1daeSBarry Smith PetscFunctionReturn(0); 3225c6c1daeSBarry Smith } 3235c6c1daeSBarry Smith 3245c6c1daeSBarry Smith /*@C 3255c6c1daeSBarry Smith PetscDrawViewPortsSet - sets a draw object to use a particular subport 3265c6c1daeSBarry Smith 327811af0c4SBarry Smith Logically Collective on the `PetscDraw` inside ports 3285c6c1daeSBarry Smith 329d8d19677SJose E. Roman Input Parameters: 330811af0c4SBarry Smith + ports - the `PetscDrawViewPorts` object 3315c6c1daeSBarry Smith - port - the port number, from 0 to nports-1 3325c6c1daeSBarry Smith 3335c6c1daeSBarry Smith Level: advanced 3345c6c1daeSBarry Smith 335811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPortsCreate()` 3365c6c1daeSBarry Smith @*/ 337d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports, PetscInt port) 338d71ae5a4SJacob Faibussowitsch { 3395c6c1daeSBarry Smith PetscFunctionBegin; 3408f69470aSLisandro Dalcin if (!ports) PetscFunctionReturn(0); 34145f3bb6eSLisandro Dalcin PetscValidPointer(ports, 1); 3422c71b3e2SJacob Faibussowitsch PetscCheck(port >= 0 && (port <= ports->nports - 1), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Port is out of range requested %" PetscInt_FMT " from 0 to %" PetscInt_FMT, port, ports->nports - 1); 3439566063dSJacob Faibussowitsch PetscCall(PetscDrawSetViewPort(ports->draw, ports->xl[port], ports->yl[port], ports->xr[port], ports->yr[port])); 3445c6c1daeSBarry Smith PetscFunctionReturn(0); 3455c6c1daeSBarry Smith } 346