From: Andrew R. <and...@us...> - 2004-05-21 15:09:36
|
Update of /cvsroot/plplot/plplot/examples/f77 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7265/examples/f77 Modified Files: x22f.fm4 Log Message: Add plvect and plsvect to the common API. Add java, python and tcl bindings and examples for plvect and plsvect. Modify example 22 and make C, C++, fortran, java, python and tcl versions consistent. C, C++, fortran and tcl versions of example 22 now produce identical results. There appear to be some rounding errors with java and python. Index: x22f.fm4 =================================================================== RCS file: /cvsroot/plplot/plplot/examples/f77/x22f.fm4,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- x22f.fm4 24 Feb 2004 10:06:08 -0000 1.2 +++ x22f.fm4 21 May 2004 15:09:26 -0000 1.3 @@ -2,6 +2,7 @@ C Vector plot demo. C C Copyright (C) 2004 Alan W. Irwin +C Copyright (C) 2004 Andrew Ross C C This file is part of PLplot. C @@ -21,15 +22,6 @@ C Does several contour plots using different coordinate mappings. implicit none - real*8 PI - parameter (PI = 3.1415926535897932384d0) - integer i, j, nx, ny, npts - parameter (nx=10, ny=10) - - real*8 u(nx, ny), v(nx, ny), xg(nx,ny), yg(nx,ny) - - real*8 dx, dy, dr, xmin, xmax, ymin, ymax - real*8 xx, yy, r, theta, scaling integer narr, fill parameter (narr=6) @@ -46,95 +38,231 @@ C Process command-line arguments call plparseopts(PL_PARSE_FULL) + call plinit + + + call circulation + + fill = 0 + +C Set arrow style using arrow_x and arrow_y the +C plot using these arrows + call plsvect(arrow_x, arrow_y, narr, fill) + call constriction + +C Set arrow style using arrow_x and arrow_y the +C plot using these arrows + fill = 1 + call plsvect(arrow2_x, arrow2_y, narr, fill) + call constriction + + call potential + + call plend + + end + +C vector plot of the circulation around the origin + subroutine circulation() + implicit none + + integer i, j, nx, ny + parameter (nx=20, ny=20) + + real*8 u(nx, ny), v(nx, ny), xg(nx,ny), yg(nx,ny) + + real*8 dx, dy, xmin, xmax, ymin, ymax + real*8 xx, yy, scaling + dx = 1.0d0 dy = 1.0d0 - npts = nx*ny - xmin = -nx/2.0d0*dx - xmax = nx/2.0d0*dx - ymin = -ny/2.0d0*dy - ymax = ny/2.0d0*dy + xmin = -dble(nx)/2.0d0*dx + xmax = dble(nx)/2.0d0*dx + ymin = -dble(ny)/2.0d0*dy + ymax = dble(ny)/2.0d0*dy -C Calculate the data matrices. do i=1,nx - xx = dble(i-1-0.5*nx+0.5)*dx + xx = (dble(i)-nx/2.0d0-0.5d0)*dx do j=1,ny - yy = dble(j-1-0.5*ny+0.5)*dy + yy = (dble(j)-ny/2.0d0-0.5d0)*dy xg(i,j) = xx yg(i,j) = yy u(i,j) = yy v(i,j) = -xx enddo enddo - print*,xg(nx/2,ny/2),yg(nx/2,ny/2) - - call plinit -C Plot vectors using default arrow style call plenv(xmin, xmax, ymin, ymax, 0, 0) call pllab('(x)', '(y)', - & '#frPLplot Example 22 - vector plot') + & '#frPLplot Example 22 - circulation') call plcol0(2) -C Plot using auto scaling scaling = 0.0d0 call plvec2(u,v,nx,ny,scaling,xg,yg) call plcol0(1) - fill = 0 + end -C Create user defined arrow style and plot vectors using new style - call plsvect(arrow_x, arrow_y, narr, fill) - call plenv(xmin, xmax, ymin, ymax, 0, 0) - call pllab('(x)', '(y)', - & '#frPLplot Example 22 - user defined arrow') - call plcol0(2) -C Plot using 0.5 * auto scaling - scaling = -0.5 - call plvec2(u,v,nx,ny,scaling,xg,yg) - call plcol0(1) +C vector plot of the flow through a constricted pipe + subroutine constriction() + implicit none - fill = 1 + real*8 PI + parameter (PI = 3.1415926535897932384d0) + + integer i, j, nx, ny + parameter (nx=20, ny=20) + + real*8 u(nx, ny), v(nx, ny), xg(nx,ny), yg(nx,ny) + + real*8 dx, dy, xmin, xmax, ymin, ymax + real*8 xx, yy, Q, b, dbdx, scaling + + dx = 1.0d0 + dy = 1.0d0 + + xmin = -dble(nx)/2.0d0*dx + xmax = dble(nx)/2.0d0*dx + ymin = -dble(ny)/2.0d0*dy + ymax = dble(ny)/2.0d0*dy + + Q = 2.0d0 + do i=1,nx + xx = (dble(i)-dble(nx)/2.0d0-0.5d0)*dx + do j=1,ny + yy = (dble(j)-dble(ny)/2.0d0-0.5d0)*dy + xg(i,j) = xx + yg(i,j) = yy + b = ymax/4.0d0*(3.0d0-cos(PI*xx/xmax)) + if (abs(yy).lt.b) then + dbdx = ymax/4.0d0*sin(PI*xx/xmax)*yy/b + u(i,j) = Q*ymax/b + v(i,j) = u(i,j)*dbdx + else + u(i,j) = 0.0d0 + v(i,j) = 0.0d0 + endif + enddo + enddo -C Create user defined arrow style and plot vectors using new style - call plsvect(arrow2_x, arrow2_y, narr, fill) call plenv(xmin, xmax, ymin, ymax, 0, 0) call pllab('(x)', '(y)', - & '#frPLplot Example 22 - filled arrow') + & '#frPLplot Example 22 - constriction') call plcol0(2) -C Plot using user supplied scaling - scaling = 0.3 + scaling = -0.5d0 call plvec2(u,v,nx,ny,scaling,xg,yg) call plcol0(1) -C Example of a polar plot + end -C Calculate the data matrices. - dr = 0.5 - do i=1,nx - r = dble((i-1)*dr) - do j=1,ny - theta = dble(2.0d0*PI/dble(ny-1)*dble(j-1)) - xg(i,j) = r*cos(theta) - yg(i,j) = r*sin(theta) - u(i,j) = yg(i,j) - v(i,j) = -xg(i,j) + subroutine potential() + implicit none + + real*8 PI + parameter (PI = 3.1415926535897932384d0) + + integer i, j, nr, ntheta, nper, nlevel + parameter (nr=20, ntheta=20, nper=100, nlevel=10) + + real*8 u(nr, ntheta), v(nr, ntheta), z(nr, ntheta) + real*8 xg(nr,ntheta), yg(nr,ntheta) + real*8 clevel(nlevel), px(nper), py(nper) + + real*8 xmin, xmax, ymin, ymax, zmin, zmax, rmax + real*8 xx, yy, r, theta, scaling, dz + + real*8 eps, q1, d1, q1i, d1i, q2, d2, q2i, d2i + real*8 div1, div1i, div2, div2i + + rmax = dble(nr) + + eps = 2.0d0 + + q1 = 1.0d0; + d1 = rmax/4.0d0; + + q1i = - q1*rmax/d1; + d1i = rmax**2.0d0/d1; + + q2 = -1.0d0; + d2 = rmax/4.0d0; + + q2i = - q2*rmax/d2; + d2i = rmax**2.0d0/d2; + + do i = 1, nr + r = 0.5 + dble(i-1) + do j = 1, ntheta + theta = 2.*PI/dble(ntheta-1)*(dble(j)-0.5) + xx = r*cos(theta) + yy = r*sin(theta) + xg(i,j) = xx + yg(i,j) = yy + div1 = sqrt((xg(i,j)-d1)**2 + (yg(i,j)-d1)**2 + eps**2) + div1i = sqrt((xg(i,j)-d1i)**2 + (yg(i,j)-d1i)**2 + eps**2) + + div2 = sqrt((xg(i,j)-d2)**2 + (yg(i,j)+d2)**2 + eps**2) + div2i = sqrt((xg(i,j)-d2i)**2 + (yg(i,j)+d2i)**2 + eps**2) + + z(i,j) = q1/div1 + q1i/div1i + q2/div2 + q2i/div2i + u(i,j) = -q1*(xx-d1)/div1**3 - q1i*(xx-d1i)/div1i**3 - + 1 q2*(xx-d2)/div2**3 - q2i*(xx-d2i)/div2i**3 + v(i,j) = -q1*(yy-d1)/div1**3 - q1i*(yy-d1i)/div1i**3 - + 1 q2*(yy+d2)/div2**3 - q2i*(yy+d2i)/div2i**3 enddo enddo - xmin = -nx*dr - xmax = nx*dr - ymin = -ny*dr - ymax = ny*dr + call a2mnmx(xg, nr, ntheta, xmin, xmax, nr) + call a2mnmx(yg, nr, ntheta, ymin, ymax, nr) + call a2mnmx(z, nr, ntheta, zmin, zmax, nr) call plenv(xmin, xmax, ymin, ymax, 0, 0) call pllab('(x)', '(y)', - & '#frPLplot Example 22 - polar vector plot') + & '#frPLplot Example 22 - potential gradient vector plot') + +C plot contours of the potential + dz = abs(zmax - zmin)/dble (nlevel) + do i = 1, nlevel + clevel(i) = zmin + (i-0.5d0)*dz + enddo + call plcol0(3) + call pllsty(2) + call plcon2(z,nr,ntheta,1,nr,1,ntheta,clevel,nlevel,xg,yg) + call pllsty(1) + call plcol0(1) + call plcol0(2) - scaling = 0.5 - call plvec2(u,v,nx,ny,scaling,xg,yg) + scaling = 25.0d0 + call plvec2(u,v,nr,ntheta,scaling,xg,yg) call plcol0(1) - call plend - + do i=1,nper + theta = 2.0d0*PI/dble(nper-1)*dble(i) + px(i) = rmax*cos(theta) + py(i) = rmax*sin(theta) + enddo + + call plline(nper,px,py) + + end + +C---------------------------------------------------------------------------- +C Subroutine a2mnmx +C Minimum and the maximum elements of a 2-d array. + + subroutine a2mnmx(f, nx, ny, fmin, fmax, xdim) + implicit none + + integer i, j, nx, ny, xdim + real*8 f(xdim, ny), fmin, fmax + + fmax = f(1, 1) + fmin = fmax + do j = 1, ny + do i = 1, nx + fmax = max(fmax, f(i, j)) + fmin = min(fmin, f(i, j)) + enddo + enddo end |