From: Andrew R. <and...@us...> - 2004-05-21 15:10:05
|
Update of /cvsroot/plplot/plplot/examples/c++ In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7265/examples/c++ Modified Files: x22.cc 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: x22.cc =================================================================== RCS file: /cvsroot/plplot/plplot/examples/c++/x22.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- x22.cc 3 Mar 2004 17:41:16 -0000 1.6 +++ x22.cc 21 May 2004 15:09:25 -0000 1.7 @@ -39,18 +39,222 @@ class x22 { public: - x22(int, char **); + x22(int, char **); private: - plstream *pls; + void circulation(); + void constriction(); + void potential(); + void f2mnmx(PLFLT **f, PLINT nx, PLINT ny, PLFLT *fmin, PLFLT *fmax); + + PLFLT MIN(PLFLT x, PLFLT y) { return (x<y?x:y);}; + PLFLT MAX(PLFLT x, PLFLT y) { return (x>y?x:y);}; + + plstream *pls; + + PLFLT **u, **v; + PLcGrid2 cgrid2; + int nx, ny; }; +// Vector plot of the circulation about the origin +void +x22::circulation() { + int i,j; + PLFLT dx, dy, x, y; + PLFLT xmin, xmax, ymin, ymax; + + dx = 1.0; + dy = 1.0; + + xmin = -nx/2*dx; + xmax = nx/2*dx; + ymin = -ny/2*dy; + ymax = ny/2*dy; + + + // Create data - cirulation around the origin. + for (i = 0; i<nx; i++) { + for (j = 0; j<ny; j++) { + x = (i-nx/2+0.5)*dx; + y = (j-ny/2+0.5)*dy; + cgrid2.xg[i][j] = x; + cgrid2.yg[i][j] = y; + u[i][j] = y; + v[i][j] = -x; + } + } + + // Plot vectors with default arrows + pls->env(xmin, xmax, ymin, ymax, 0, 0); + pls->lab("(x)", "(y)", "#frPLplot Example 22 - circulation"); + pls->col0(2); + pls->vect(u,v,nx,ny,0.0,pltr2,(void *)&cgrid2); + pls->col0(1); + +} + +// Vector plot of flow through a constricted pipe +void +x22::constriction() { + int i,j; + PLFLT dx, dy, x, y; + PLFLT xmin, xmax, ymin, ymax; + PLFLT Q, b, dbdx; + + dx = 1.0; + dy = 1.0; + + xmin = -nx/2*dx; + xmax = nx/2*dx; + ymin = -ny/2*dy; + ymax = ny/2*dy; + + Q = 2.0; + for (i = 0; i<nx; i++) { + for (j = 0; j<ny; j++) { + x = (i-nx/2+0.5)*dx; + y = (j-ny/2+0.5)*dy; + cgrid2.xg[i][j] = x; + cgrid2.yg[i][j] = y; + b = ymax/4.0*(3-cos(M_PI*x/xmax)); + if (fabs(y) < b) { + dbdx = ymax/4.0*sin(M_PI*x/xmax)* + y/b; + u[i][j] = Q*ymax/b; + v[i][j] = dbdx*u[i][j]; + } + else { + u[i][j] = 0.0; + v[i][j] = 0.0; + } + } + } + + pls->env(xmin, xmax, ymin, ymax, 0, 0); + pls->lab("(x)", "(y)", "#frPLplot Example 22 - constriction"); + pls->col0(2); + pls->vect(u,v,nx,ny,-0.5,pltr2,(void *)&cgrid2); + pls->col0(1); + +} + +// Vector plot of the gradient of a shielded potential (see example 9) +void +x22::potential() { + + const int nper = 100; + const int nlevel = 10; + + int i,j, nr, ntheta; + PLFLT eps, q1, d1, q1i, d1i, q2, d2, q2i, d2i; + PLFLT div1, div1i, div2, div2i; + PLFLT **z, r, theta, x, y, dz; + PLFLT xmin, xmax, ymin, ymax, rmax, zmax, zmin; + PLFLT px[nper], py[nper], clevel[nlevel]; + + nr = nx; + ntheta = ny; + + // Create data to be plotted + pls->Alloc2dGrid(&z,nr,ntheta); + + // Potential inside a conducting cylinder (or sphere) by method of images. + // Charge 1 is placed at (d1, d1), with image charge at (d2, d2). + // Charge 2 is placed at (d1, -d1), with image charge at (d2, -d2). + // Also put in smoothing term at small distances. + + rmax = (double) nr; + + eps = 2.; + + q1 = 1.; + d1 = rmax/4.; + + q1i = - q1*rmax/d1; + d1i = pow(rmax, 2.)/d1; + + q2 = -1.; + d2 = rmax/4.; + + q2i = - q2*rmax/d2; + d2i = pow(rmax, 2.)/d2; + + for (i = 0; i < nr; i++) { + r = 0.5 + (double) i; + for (j = 0; j < ntheta; j++) { + theta = 2.*M_PI/(ntheta-1)*(0.5+(double)j); + x = r*cos(theta); + y = r*sin(theta); + cgrid2.xg[i][j] = x; + cgrid2.yg[i][j] = y; + div1 = sqrt(pow(x-d1, 2.) + pow(y-d1, 2.) + pow(eps, 2.)); + div1i = sqrt(pow(x-d1i, 2.) + pow(y-d1i, 2.) + pow(eps, 2.)); + div2 = sqrt(pow(x-d2, 2.) + pow(y+d2, 2.) + pow(eps, 2.)); + div2i = sqrt(pow(x-d2i, 2.) + pow(y+d2i, 2.) + pow(eps, 2.)); + z[i][j] = q1/div1 + q1i/div1i + q2/div2 + q2i/div2i; + u[i][j] = -q1*(x-d1)/pow(div1,3.) - q1i*(x-d1i)/pow(div1i,3.0) + - q2*(x-d2)/pow(div2,3.) - q2i*(x-d2i)/pow(div2i,3.); + v[i][j] = -q1*(y-d1)/pow(div1,3.) - q1i*(y-d1i)/pow(div1i,3.0) + - q2*(y+d2)/pow(div2,3.) - q2i*(y+d2i)/pow(div2i,3.); + } + } + + f2mnmx(cgrid2.xg, nr, ntheta, &xmin, &xmax); + f2mnmx(cgrid2.yg, nr, ntheta, &ymin, &ymax); + f2mnmx(z, nr, ntheta, &zmin, &zmax); + + pls->env(xmin, xmax, ymin, ymax, 0, 0); + pls->lab("(x)", "(y)", "#frPLplot Example 22 - potential gradient vector plot"); + // Plot contours of the potential + dz = (zmax-zmin)/(double) nlevel; + for (i = 0; i < nlevel; i++) { + clevel[i] = zmin + ((double) i + 0.5)*dz; + } + pls->col0(3); + pls->lsty(2); + pls->cont(z,nr,ntheta,1,nr,1,ntheta,clevel,nlevel,pltr2,(void *) &cgrid2); + pls->lsty(1); + pls->col0(1); + + // Plot the vectors of the gradient of the potential + pls->col0(2); + pls->vect(u,v,nr,ntheta,25.0,pltr2,(void *)&cgrid2); + pls->col0(1); + + // Plot the perimeter of the cylinder + for (i=0;i<nper;i++) { + theta = (2.*M_PI/(nper-1))*(double)i; + px[i] = rmax*cos(theta); + py[i] = rmax*sin(theta); + } + pls->line(nper,px,py); + + pls->Free2dGrid(z,nr,ntheta); + +} + +void +x22::f2mnmx(PLFLT **f, PLINT nx, PLINT ny, PLFLT *fmin, PLFLT *fmax) +{ + int i, j; + + *fmax = f[0][0]; + *fmin = *fmax; + + for (i = 0; i < nx; i++) { + for (j = 0; j < ny; j++) { + *fmax = MAX(*fmax, f[i][j]); + *fmin = MIN(*fmin, f[i][j]); + } + } +} + x22::x22( int argc, char ** argv ) { - PLFLT **u, **v; - PLcGrid2 cgrid2; + PLINT narr, fill; // Set of points making a polygon to use as the arrow PLFLT arrow_x[6] = {-0.5, 0.5, 0.3, 0.5, 0.3, 0.5}; @@ -58,10 +262,6 @@ PLFLT arrow2_x[6] = {-0.5, 0.3, 0.3, 0.5, 0.3, 0.3}; PLFLT arrow2_y[6] = {0.0, 0.0, 0.2, 0.0, -0.2, 0.0}; - int i,j, nx, ny, npts; - PLFLT dx, dy, dr, r, theta; - PLFLT xmin, xmax, ymin, ymax; - PLINT narr, fill; // Create new plstream pls = new plstream(); @@ -74,12 +274,8 @@ pls->init(); - dx = 1.0; - dy = 1.0; - - nx = 10; - ny = 10; - npts = nx*ny; + nx = 20; + ny = 20; // Allocate arrays pls->Alloc2dGrid(&cgrid2.xg,nx,ny); @@ -90,27 +286,7 @@ cgrid2.nx = nx; cgrid2.ny = ny; - xmin = -nx/2*dx; - xmax = nx/2*dx; - ymin = -ny/2*dy; - ymax = ny/2*dy; - - // Create data - cirulation around the origin. - for (i = 0; i<nx; i++) { - for (j = 0; j<ny; j++) { - cgrid2.xg[i][j] = (i-nx/2+0.5)*dx; - cgrid2.yg[i][j] = (j-ny/2+0.5)*dy; - u[i][j] = cgrid2.yg[i][j]; - v[i][j] = -cgrid2.xg[i][j]; - } - } - - // Plot vectors with default arrows - pls->env(xmin, xmax, ymin, ymax, 0, 0); - pls->lab("(x)", "(y)", "#frPLplot Example 22 - vector plot"); - pls->col0(2); - plvect(u,v,nx,ny,0.0,pltr2,(void *)&cgrid2); - pls->col0(1); + circulation(); narr = 6; fill = 0; @@ -118,46 +294,15 @@ // Set arrow style using arrow_x and arrow_y then // plot using these arrows. pls->svect(arrow_x, arrow_y, narr, fill); - pls->env(xmin, xmax, ymin, ymax, 0, 0); - pls->lab("(x)", "(y)", "#frPLplot Example 22 - user defined arrow"); - pls->col0(2); - plvect(u,v,nx,ny,-0.5,pltr2,(void *)&cgrid2); - pls->col0(1); - - fill = 1; + constriction(); // Set arrow style using arrow2_x and arrow2_y then // plot using these filled arrows. + fill = 1; pls->svect(arrow2_x, arrow2_y, narr, fill); - pls->env(xmin, xmax, ymin, ymax, 0, 0); - pls->lab("(x)", "(y)", "#frPLplot Example 22 - filled arrow"); - pls->col0(2); - plvect(u,v,nx,ny,0.3,pltr2,(void *)&cgrid2); - pls->col0(1); - - dr = 0.5; - - for (i = 0; i<nx; i++) { - r = i*dr; - for (j = 0; j<ny; j++) { - theta = 2.*M_PI/(ny-1)*(double)j; - cgrid2.xg[i][j] = r*cos(theta); - cgrid2.yg[i][j] = r*sin(theta); - u[i][j] = cgrid2.yg[i][j]; - v[i][j] = -cgrid2.xg[i][j]; - } - } - - xmin = -nx*dr; - xmax = nx*dr; - ymin = -nx*dr; - ymax = nx*dr; + constriction(); - pls->env(xmin, xmax, ymin, ymax, 0, 0); - pls->lab("(x)", "(y)", "#frPLplot Example 22 - polar vector plot"); - pls->col0(2); - pls->vect(u,v,nx,ny,0.5,pltr2,(void *)&cgrid2); - pls->col0(1); + potential(); pls->Free2dGrid(cgrid2.xg,nx,ny); pls->Free2dGrid(cgrid2.yg,nx,ny); @@ -169,8 +314,8 @@ } int main( int argc, char ** argv ) { - x22 *x = new x22( argc, argv ); - delete x; + x22 *x = new x22( argc, argv ); + delete x; } |