/*@C PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports. Collective on PetscDraw Input Parameters: + draw - the drawing context - nports - the number of ports Output Parameter: . ports - a PetscDrawViewPorts context (C structure) Options Database: . -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in seperate windows Level: advanced Concepts: drawing^in subset of window .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() @*/ PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports) { PetscDrawViewPorts *ports; PetscInt i,n; PetscBool isnull; PetscMPIInt rank; PetscReal *xl,*xr,*yl,*yr,h; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports); PetscValidPointer(newports,3); ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); if (isnull) {*newports = NULL; PetscFunctionReturn(0);} ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports; ports->draw = draw; ports->nports = nports; ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); /* save previous drawport of window */ ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr); n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports)); while (n*n < nports) n++; h = 1.0/n; ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr); ports->xl = xl; ports->xr = xr; ports->yl = yl; ports->yr = yr; ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr); ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); for (i=0; i<n*n; i++) { xl[i] = (i % n)*h; xr[i] = xl[i] + h; yl[i] = (i / n)*h; yr[i] = yl[i] + h; if (!rank) { ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); } xl[i] += .05*h; xr[i] -= .05*h; yl[i] += .05*h; yr[i] -= .05*h; } ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); ierr = PetscDrawFlush(draw);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports. Collective on PetscDraw Input Parameters: + draw - the drawing context - nports - the number of ports Output Parameter: . ports - a PetscDrawViewPorts context (C structure) Level: advanced Concepts: drawing^in subset of window .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() @*/ PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **ports) { PetscInt i,n; PetscErrorCode ierr; PetscBool isnull; PetscReal *xl,*xr,*yl,*yr,h; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); PetscValidPointer(ports,3); ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); if (isnull) { *ports = NULL; PetscFunctionReturn(0); } ierr = PetscNew(ports);CHKERRQ(ierr); (*ports)->draw = draw; (*ports)->nports = nports; ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports)); while (n*n < nports) n++; ierr = PetscMalloc1(n*n,&xl);CHKERRQ(ierr);(*ports)->xl = xl; ierr = PetscMalloc1(n*n,&xr);CHKERRQ(ierr);(*ports)->xr = xr; ierr = PetscMalloc1(n*n,&yl);CHKERRQ(ierr);(*ports)->yl = yl; ierr = PetscMalloc1(n*n,&yr);CHKERRQ(ierr);(*ports)->yr = yr; h = 1.0/n; for (i=0; i<n*n; i++) { xl[i] = (i % n)*h; xr[i] = xl[i] + h; yl[i] = (i/n)*h; yr[i] = yl[i] + h; ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr); xl[i] += .1*h; xr[i] -= .1*h; yl[i] += .1*h; yr[i] -= .1*h; } /* save previous drawport of window */ ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr); /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);*/ /* this causes flicker */ PetscFunctionReturn(0); }
/*@C PetscDrawViewPortsCreateRect - Splits a window into smaller view ports. Each processor shares all the viewports. The number of views in the x- and y-directions is specified. Collective on PetscDraw Input Parameters: + draw - the drawing context . nx - the number of x divisions - ny - the number of y divisions Output Parameter: . ports - a PetscDrawViewPorts context (C structure) Level: advanced Concepts: drawing^in subset of window .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() @*/ PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **ports) { PetscReal *xl, *xr, *yl, *yr, hx, hy; PetscBool isnull; PetscInt i, j, n; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if ((nx < 1) || (ny < 1)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d x %d", nx, ny); ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr); if (isnull) { *ports = NULL; PetscFunctionReturn(0); } n = nx*ny; hx = 1.0/nx; hy = 1.0/ny; ierr = PetscNew(ports);CHKERRQ(ierr); (*ports)->draw = draw; (*ports)->nports = n; ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr); ierr = PetscMalloc1(n, &xl);CHKERRQ(ierr);(*ports)->xl = xl; ierr = PetscMalloc1(n, &xr);CHKERRQ(ierr);(*ports)->xr = xr; ierr = PetscMalloc1(n, &yl);CHKERRQ(ierr);(*ports)->yl = yl; ierr = PetscMalloc1(n, &yr);CHKERRQ(ierr);(*ports)->yr = yr; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { PetscInt k = j*nx+i; xl[k] = i*hx; xr[k] = xl[k] + hx; yl[k] = j*hy; yr[k] = yl[k] + hy; ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); xl[k] += .01*hx; xr[k] -= .01*hx; yl[k] += .01*hy; yr[k] -= .01*hy; } } ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr); /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); */ /* this causes flicker */ PetscFunctionReturn(0); }
/*@C PetscDrawViewPortsCreateRect - Splits a window into smaller view ports. Each processor shares all the viewports. The number of views in the x- and y-directions is specified. Collective on PetscDraw Input Parameters: + draw - the drawing context . nx - the number of x divisions - ny - the number of y divisions Output Parameter: . ports - a PetscDrawViewPorts context (C structure) Level: advanced Concepts: drawing^in subset of window .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy() @*/ PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports) { PetscDrawViewPorts *ports; PetscReal *xl,*xr,*yl,*yr,hx,hy; PetscInt i,j,k,n; PetscBool isnull; PetscMPIInt rank; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if ((nx < 1) || (ny < 1)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d x %d", nx, ny); PetscValidPointer(newports,3); ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); if (isnull) {*newports = NULL; PetscFunctionReturn(0);} ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); n = nx*ny; hx = 1.0/nx; hy = 1.0/ny; ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports; ports->draw = draw; ports->nports = n; ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr); /* save previous drawport of window */ ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr); ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr); ports->xr = xr; ports->xl = xl; ports->yl = yl; ports->yr = yr; ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr); ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { k = j*nx+i; xl[k] = i*hx; xr[k] = xl[k] + hx; yl[k] = j*hy; yr[k] = yl[k] + hy; if (!rank) { ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr); } xl[k] += .05*hx; xr[k] -= .05*hx; yl[k] += .05*hy; yr[k] -= .05*hy; } } ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); ierr = PetscDrawFlush(draw);CHKERRQ(ierr); PetscFunctionReturn(0); }