1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 25c6c1daeSBarry Smith 35c6c1daeSBarry Smith /*@ 45c6c1daeSBarry Smith PetscDrawSetViewPort - Sets the portion of the window (page) to which draw 55c6c1daeSBarry Smith routines will write. 65c6c1daeSBarry Smith 7c3339decSBarry Smith Collective 85c6c1daeSBarry Smith 95c6c1daeSBarry Smith Input Parameters: 106b867d5aSJose E. Roman + xl - the horizontal coordinate of the lower left corner of the subwindow. 116b867d5aSJose E. Roman . yl - the vertical coordinate of the lower left corner of the subwindow. 126b867d5aSJose E. Roman . xr - the horizontal coordinate of the upper right corner of the subwindow. 136b867d5aSJose E. Roman . yr - the vertical coordinate of the upper right corner of the subwindow. 146b867d5aSJose E. Roman - draw - the drawing context 156b867d5aSJose E. Roman 162fe279fdSBarry Smith Level: advanced 172fe279fdSBarry Smith 186b867d5aSJose E. Roman Notes: 195c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 20811af0c4SBarry Smith 215c6c1daeSBarry Smith Lower left corner is (0,0). 225c6c1daeSBarry Smith 2376fbde31SPierre Jolivet .seealso: `PetscDrawGetViewPort()`, `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawViewPortsCreate()` 245c6c1daeSBarry Smith @*/ 25d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetViewPort(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr) 26d71ae5a4SJacob Faibussowitsch { 275c6c1daeSBarry Smith PetscFunctionBegin; 285c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 292c71b3e2SJacob 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); 309371c9d4SSatish Balay draw->port_xl = xl; 319371c9d4SSatish Balay draw->port_yl = yl; 329371c9d4SSatish Balay draw->port_xr = xr; 339371c9d4SSatish Balay draw->port_yr = yr; 34dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr); 353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 42c3339decSBarry Smith Collective 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith Input Parameter: 455c6c1daeSBarry Smith . draw - the drawing context 465c6c1daeSBarry Smith 4797bb3fdcSJose E. Roman Output Parameters: 486b867d5aSJose E. Roman + xl - the horizontal coordinate of the lower left corner of the subwindow. 496b867d5aSJose E. Roman . yl - the vertical coordinate of the lower left corner of the subwindow. 506b867d5aSJose E. Roman . xr - the horizontal coordinate of the upper right corner of the subwindow. 5197bb3fdcSJose E. Roman - yr - the vertical coordinate of the upper right corner of the subwindow. 526b867d5aSJose E. Roman 532fe279fdSBarry Smith Level: advanced 542fe279fdSBarry Smith 556b867d5aSJose E. Roman Notes: 565c6c1daeSBarry Smith These numbers must always be between 0.0 and 1.0. 57811af0c4SBarry Smith 585c6c1daeSBarry Smith Lower left corner is (0,0). 595c6c1daeSBarry Smith 60811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()` 615c6c1daeSBarry Smith @*/ 62d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetViewPort(PetscDraw draw, PetscReal *xl, PetscReal *yl, PetscReal *xr, PetscReal *yr) 63d71ae5a4SJacob Faibussowitsch { 645c6c1daeSBarry Smith PetscFunctionBegin; 655c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 664f572ea9SToby Isaac PetscAssertPointer(xl, 2); 674f572ea9SToby Isaac PetscAssertPointer(yl, 3); 684f572ea9SToby Isaac PetscAssertPointer(xr, 4); 694f572ea9SToby Isaac PetscAssertPointer(yr, 5); 705c6c1daeSBarry Smith *xl = draw->port_xl; 715c6c1daeSBarry Smith *yl = draw->port_yl; 725c6c1daeSBarry Smith *xr = draw->port_xr; 735c6c1daeSBarry Smith *yr = draw->port_yr; 743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith /*@ 785c6c1daeSBarry Smith PetscDrawSplitViewPort - Splits a window shared by several processes into smaller 795c6c1daeSBarry Smith view ports. One for each process. 805c6c1daeSBarry Smith 81c3339decSBarry Smith Collective 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith Input Parameter: 845c6c1daeSBarry Smith . draw - the drawing context 855c6c1daeSBarry Smith 865c6c1daeSBarry Smith Level: advanced 875c6c1daeSBarry Smith 88db781477SPatrick Sanan .seealso: `PetscDrawDivideViewPort()`, `PetscDrawSetViewPort()` 895c6c1daeSBarry Smith @*/ 90d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw) 91d71ae5a4SJacob Faibussowitsch { 925c6c1daeSBarry Smith PetscMPIInt rank, size; 93369cc0aeSBarry Smith PetscInt n; 945c6c1daeSBarry Smith PetscBool isnull; 955c6c1daeSBarry Smith PetscReal xl, xr, yl, yr, h; 965c6c1daeSBarry Smith 975c6c1daeSBarry Smith PetscFunctionBegin; 985c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 999566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 1003ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS); 1019566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 1029566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 1035c6c1daeSBarry Smith 104369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size)); 105a297a907SKarl Rupp while (n * n < size) n++; 1065c6c1daeSBarry Smith 1076497c311SBarry Smith h = 1.0 / (PetscReal)n; 1086497c311SBarry Smith xl = ((PetscReal)(rank % n)) * h; 1095c6c1daeSBarry Smith xr = xl + h; 1106497c311SBarry Smith yl = ((PetscReal)(rank / n)) * h; 1115c6c1daeSBarry Smith yr = yl + h; 1125c6c1daeSBarry Smith 113d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 1149566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl, yl, xl, yr, PETSC_DRAW_BLACK)); 1159566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl, yr, xr, yr, PETSC_DRAW_BLACK)); 1169566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr, yr, xr, yl, PETSC_DRAW_BLACK)); 1179566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr, yl, xl, yl, PETSC_DRAW_BLACK)); 118d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 1199566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 1205c6c1daeSBarry Smith 121e5ab1681SLisandro Dalcin draw->port_xl = xl + .05 * h; 122e5ab1681SLisandro Dalcin draw->port_xr = xr - .05 * h; 123e5ab1681SLisandro Dalcin draw->port_yl = yl + .05 * h; 124e5ab1681SLisandro Dalcin draw->port_yr = yr - .05 * h; 1255c6c1daeSBarry Smith 126dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr); 1273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1285c6c1daeSBarry Smith } 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith /*@C 131cf79e978SBarry Smith PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports. 1325c6c1daeSBarry Smith 133c3339decSBarry Smith Collective 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Input Parameters: 1365c6c1daeSBarry Smith + draw - the drawing context 1375c6c1daeSBarry Smith - nports - the number of ports 1385c6c1daeSBarry Smith 1395c6c1daeSBarry Smith Output Parameter: 140aec76313SJacob Faibussowitsch . newports - a `PetscDrawViewPorts` context (C structure) 1415c6c1daeSBarry Smith 142811af0c4SBarry Smith Options Database Key: 143e1dfdf8eSBarry Smith . -draw_ports - display multiple fields in the same window with PetscDrawPorts() instead of in separate windows 144cf79e978SBarry Smith 1455c6c1daeSBarry Smith Level: advanced 1465c6c1daeSBarry Smith 147cc4c1da9SBarry Smith Fortran Note: 148cc4c1da9SBarry Smith No Fortran support since `PetscDrawViewPorts` is a C struct 149cc4c1da9SBarry Smith 150db781477SPatrick Sanan .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()` 1515c6c1daeSBarry Smith @*/ 1525d83a8b1SBarry Smith PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw, PetscInt nports, PetscDrawViewPorts *newports[]) 153d71ae5a4SJacob Faibussowitsch { 154e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 1555c6c1daeSBarry Smith PetscInt i, n; 1565c6c1daeSBarry Smith PetscBool isnull; 157e5ab1681SLisandro Dalcin PetscMPIInt rank; 1585c6c1daeSBarry Smith PetscReal *xl, *xr, *yl, *yr, h; 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith PetscFunctionBegin; 1615c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1622c71b3e2SJacob Faibussowitsch PetscCheck(nports >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT, nports); 1634f572ea9SToby Isaac PetscAssertPointer(newports, 3); 1649566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 1659371c9d4SSatish Balay if (isnull) { 1669371c9d4SSatish Balay *newports = NULL; 1673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1689371c9d4SSatish Balay } 1699566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 1705c6c1daeSBarry Smith 1719371c9d4SSatish Balay PetscCall(PetscNew(&ports)); 1729371c9d4SSatish Balay *newports = ports; 173e5ab1681SLisandro Dalcin ports->draw = draw; 174e5ab1681SLisandro Dalcin ports->nports = nports; 1759566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 176e5ab1681SLisandro Dalcin /* save previous drawport of window */ 1779566063dSJacob Faibussowitsch PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr)); 1785c6c1daeSBarry Smith 179369cc0aeSBarry Smith n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports)); 180a297a907SKarl Rupp while (n * n < nports) n++; 1816497c311SBarry Smith h = 1.0 / (PetscReal)n; 1825c6c1daeSBarry Smith 1839566063dSJacob Faibussowitsch PetscCall(PetscMalloc4(n * n, &xl, n * n, &xr, n * n, &yl, n * n, &yr)); 184cf79e978SBarry Smith ports->xl = xl; 185cf79e978SBarry Smith ports->xr = xr; 186cf79e978SBarry Smith ports->yl = yl; 187cf79e978SBarry Smith ports->yr = yr; 188e5ab1681SLisandro Dalcin 1899566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0)); 190d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 1915c6c1daeSBarry Smith for (i = 0; i < n * n; i++) { 1926497c311SBarry Smith xl[i] = ((PetscReal)(i % n)) * h; 1935c6c1daeSBarry Smith xr[i] = xl[i] + h; 1946497c311SBarry Smith yl[i] = ((PetscReal)(i / n)) * h; 1955c6c1daeSBarry Smith yr[i] = yl[i] + h; 1965c6c1daeSBarry Smith 197dd400576SPatrick Sanan if (rank == 0) { 1989566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[i], yl[i], xl[i], yr[i], PETSC_DRAW_BLACK)); 1999566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[i], yr[i], xr[i], yr[i], PETSC_DRAW_BLACK)); 2009566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[i], yr[i], xr[i], yl[i], PETSC_DRAW_BLACK)); 2019566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[i], yl[i], xl[i], yl[i], PETSC_DRAW_BLACK)); 2025c6c1daeSBarry Smith } 203e5ab1681SLisandro Dalcin 204e5ab1681SLisandro Dalcin xl[i] += .05 * h; 205e5ab1681SLisandro Dalcin xr[i] -= .05 * h; 206e5ab1681SLisandro Dalcin yl[i] += .05 * h; 207e5ab1681SLisandro Dalcin yr[i] -= .05 * h; 208e5ab1681SLisandro Dalcin } 209d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 2109566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 2113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2125c6c1daeSBarry Smith } 2135c6c1daeSBarry Smith 2145c6c1daeSBarry Smith /*@C 2155c6c1daeSBarry Smith PetscDrawViewPortsCreateRect - Splits a window into smaller 2165c6c1daeSBarry Smith view ports. Each processor shares all the viewports. The number 2175c6c1daeSBarry Smith of views in the x- and y-directions is specified. 2185c6c1daeSBarry Smith 219c3339decSBarry Smith Collective 2205c6c1daeSBarry Smith 2215c6c1daeSBarry Smith Input Parameters: 2225c6c1daeSBarry Smith + draw - the drawing context 2235c6c1daeSBarry Smith . nx - the number of x divisions 2245c6c1daeSBarry Smith - ny - the number of y divisions 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith Output Parameter: 227aec76313SJacob Faibussowitsch . newports - a `PetscDrawViewPorts` context (C structure) 2285c6c1daeSBarry Smith 2295c6c1daeSBarry Smith Level: advanced 2305c6c1daeSBarry Smith 231cc4c1da9SBarry Smith Fortran Note: 232*feaf08eaSBarry Smith No Fortran support 233cc4c1da9SBarry Smith 234811af0c4SBarry Smith .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPorts` 2355c6c1daeSBarry Smith @*/ 2365d83a8b1SBarry Smith PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw, PetscInt nx, PetscInt ny, PetscDrawViewPorts *newports[]) 237d71ae5a4SJacob Faibussowitsch { 238e5ab1681SLisandro Dalcin PetscDrawViewPorts *ports; 2395c6c1daeSBarry Smith PetscReal *xl, *xr, *yl, *yr, hx, hy; 240e5ab1681SLisandro Dalcin PetscInt i, j, k, n; 2415c6c1daeSBarry Smith PetscBool isnull; 242e5ab1681SLisandro Dalcin PetscMPIInt rank; 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith PetscFunctionBegin; 2455c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2462c71b3e2SJacob 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); 2474f572ea9SToby Isaac PetscAssertPointer(newports, 4); 2489566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 2499371c9d4SSatish Balay if (isnull) { 2509371c9d4SSatish Balay *newports = NULL; 2513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2529371c9d4SSatish Balay } 2539566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank)); 254e118a51fSLisandro Dalcin 2555c6c1daeSBarry Smith n = nx * ny; 2566497c311SBarry Smith hx = 1.0 / (PetscReal)nx; 2576497c311SBarry Smith hy = 1.0 / (PetscReal)ny; 2589371c9d4SSatish Balay PetscCall(PetscNew(&ports)); 2599371c9d4SSatish Balay *newports = ports; 260e5ab1681SLisandro Dalcin ports->draw = draw; 261e5ab1681SLisandro Dalcin ports->nports = n; 2629566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 263e5ab1681SLisandro Dalcin /* save previous drawport of window */ 2649566063dSJacob Faibussowitsch PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr)); 265e5ab1681SLisandro Dalcin 2669566063dSJacob Faibussowitsch PetscCall(PetscMalloc4(n, &xl, n, &xr, n, &yl, n, &yr)); 267cf79e978SBarry Smith ports->xr = xr; 268cf79e978SBarry Smith ports->xl = xl; 269cf79e978SBarry Smith ports->yl = yl; 270cf79e978SBarry Smith ports->yr = yr; 271e5ab1681SLisandro Dalcin 2729566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0)); 273d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 2745c6c1daeSBarry Smith for (i = 0; i < nx; i++) { 2755c6c1daeSBarry Smith for (j = 0; j < ny; j++) { 276e5ab1681SLisandro Dalcin k = j * nx + i; 2775c6c1daeSBarry Smith 2786497c311SBarry Smith xl[k] = ((PetscReal)i) * hx; 2795c6c1daeSBarry Smith xr[k] = xl[k] + hx; 2806497c311SBarry Smith yl[k] = ((PetscReal)j) * hy; 2815c6c1daeSBarry Smith yr[k] = yl[k] + hy; 2825c6c1daeSBarry Smith 283dd400576SPatrick Sanan if (rank == 0) { 2849566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[k], yl[k], xl[k], yr[k], PETSC_DRAW_BLACK)); 2859566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xl[k], yr[k], xr[k], yr[k], PETSC_DRAW_BLACK)); 2869566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[k], yr[k], xr[k], yl[k], PETSC_DRAW_BLACK)); 2879566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, xr[k], yl[k], xl[k], yl[k], PETSC_DRAW_BLACK)); 288e5ab1681SLisandro Dalcin } 2895c6c1daeSBarry Smith 290e5ab1681SLisandro Dalcin xl[k] += .05 * hx; 291e5ab1681SLisandro Dalcin xr[k] -= .05 * hx; 292e5ab1681SLisandro Dalcin yl[k] += .05 * hy; 293e5ab1681SLisandro Dalcin yr[k] -= .05 * hy; 2945c6c1daeSBarry Smith } 2955c6c1daeSBarry Smith } 296d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 2979566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 2983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2995c6c1daeSBarry Smith } 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith /*@C 302811af0c4SBarry Smith PetscDrawViewPortsDestroy - frees a `PetscDrawViewPorts` object 3035c6c1daeSBarry Smith 3048f14a041SBarry Smith Collective on the `PetscDraw` inside `ports` 3055c6c1daeSBarry Smith 3065c6c1daeSBarry Smith Input Parameter: 307811af0c4SBarry Smith . ports - the `PetscDrawViewPorts` object 3085c6c1daeSBarry Smith 3095c6c1daeSBarry Smith Level: advanced 3105c6c1daeSBarry Smith 311cc4c1da9SBarry Smith Fortran Note: 312*feaf08eaSBarry Smith No Fortran support 313cc4c1da9SBarry Smith 314811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsCreate()` 3155c6c1daeSBarry Smith @*/ 316d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports) 317d71ae5a4SJacob Faibussowitsch { 3185c6c1daeSBarry Smith PetscFunctionBegin; 3193ba16761SJacob Faibussowitsch if (!ports) PetscFunctionReturn(PETSC_SUCCESS); 3204f572ea9SToby Isaac PetscAssertPointer(ports, 1); 3215c6c1daeSBarry Smith /* reset Drawport of Window back to previous value */ 3229566063dSJacob Faibussowitsch PetscCall(PetscDrawSetViewPort(ports->draw, ports->port_xl, ports->port_yl, ports->port_xr, ports->port_yr)); 3239566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&ports->draw)); 3249566063dSJacob Faibussowitsch PetscCall(PetscFree4(ports->xl, ports->xr, ports->yl, ports->yr)); 3259566063dSJacob Faibussowitsch PetscCall(PetscFree(ports)); 3263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3275c6c1daeSBarry Smith } 3285c6c1daeSBarry Smith 3295c6c1daeSBarry Smith /*@C 3305c6c1daeSBarry Smith PetscDrawViewPortsSet - sets a draw object to use a particular subport 3315c6c1daeSBarry Smith 3328f14a041SBarry Smith Logically Collective on the `PetscDraw` inside `ports` 3335c6c1daeSBarry Smith 334d8d19677SJose E. Roman Input Parameters: 335811af0c4SBarry Smith + ports - the `PetscDrawViewPorts` object 3365c6c1daeSBarry Smith - port - the port number, from 0 to nports-1 3375c6c1daeSBarry Smith 3385c6c1daeSBarry Smith Level: advanced 3395c6c1daeSBarry Smith 340cc4c1da9SBarry Smith Fortran Note: 341*feaf08eaSBarry Smith No Fortran support 342cc4c1da9SBarry Smith 343811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPortsCreate()` 3445c6c1daeSBarry Smith @*/ 345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports, PetscInt port) 346d71ae5a4SJacob Faibussowitsch { 3475c6c1daeSBarry Smith PetscFunctionBegin; 3483ba16761SJacob Faibussowitsch if (!ports) PetscFunctionReturn(PETSC_SUCCESS); 3494f572ea9SToby Isaac PetscAssertPointer(ports, 1); 3502c71b3e2SJacob 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); 3519566063dSJacob Faibussowitsch PetscCall(PetscDrawSetViewPort(ports->draw, ports->xl[port], ports->yl[port], ports->xr[port], ports->yr[port])); 3523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3535c6c1daeSBarry Smith } 354