C ALGORITHM 833, COLLECTED ALGORITHMS FROM ACM. C THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE, C VOL. 30, NO. 2, June, 2004, P. 200--211. #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Doc/ # Doc/csrfpack.doc # Fortran77/ # Fortran77/Drivers/ # Fortran77/Drivers/Makefile # Fortran77/Drivers/csrftest.eps # Fortran77/Drivers/csrftest.prt # Fortran77/Drivers/data # Fortran77/Drivers/driver.f # Fortran77/Drivers/gplot.eps # Fortran77/Drivers/res # Fortran77/Drivers/rplot.eps # Fortran77/Drivers/tgplot.eps # Fortran77/Drivers/tplot.eps # Fortran77/Src/ # Fortran77/Src/src.f # This archive created: Wed Aug 25 13:20:05 2004 export PATH; PATH=/bin:$PATH if test ! -d 'Doc' then mkdir 'Doc' fi cd 'Doc' if test -f 'csrfpack.doc' then echo shar: will not over-write existing file "'csrfpack.doc'" else cat << "SHAR_EOF" > 'csrfpack.doc' CSRFPACK.DOC 01/31/2004 Overview: CSRFPACK is a Fortran-77 software package which constructs a once-continuously differentiable convex bivariate function F that interpolates a set of N strictly convex data points (data points for which the piecewise linear interpolant on some triangulation is convex, and no four points are coplanar). The interpolant F is obtained by applying convo- lution smoothing to a piecewise linear Hermite interpolant H of the data values and a set of convexity-preserving nodal gradients. Usage: The program is distributed in the form of two source code files and a sample input data set: csrftest.f, csrfpack.f, and csrftest.dat. The driver, csrftest.f, prompts for the name of an input data set which consists of the number of data points N (read with format I5) followed by a sequence of N ordered triples of data point coordinates (x,y,z) read with format 3E23.15: the x, y, and z components are read from columns 1 to 23, 24 to 46, and 47 to 69, respecively, and each must include a decimal point (and optional expo- nent). The output consists of the following files. csrftest.prt: Print file with parameter values and error messages. csrftest.out: Data set (suitable for a surface plotting package) consisting of interpolated values on a triangulation of a uniform grid in the bounding box (the smallest rectangle with sides parallel to the axes that contains the nodes). csrftest.eps: Encapsulated Postscript file containing a contour plot of the interpolatory surface. tplot.eps: Encapsulated Postscript file containing a plot of the convexity-preserving triangulation of the nodes. gplot.eps: Encapsulated Postscript file containing a plot of the gradient feasibility diagram and nodal gradients. tgplot.eps: Encapsulated Postscript file containing a plot of the gradient triangulation. rplot.eps: Encapsulated Postscript file containing a plot of the cell diagram and nodes. Various options governing the behavior of the code are easily specified by altering PARAMETER and DATA statements in the driver. Computational procedure and code structure: The procedure consists of the following ten steps: 1) Construct a convexity-preserving triangulation T, if it exists, of the data points (nodes and data values): Subroutine TRMSHC. Remove extraneous boundary edges (nearly null triangles): Subroutine DELBE. 2) Construct a gradient feasibility diagram (the straight line dual of T): a set of N convex polygons that parti- tion the plane and such that, for any choice of nodal gradients, one from each polygon, the piecewise linear Hermite interpolant H of the nodal values and gradients is convex: Subroutine VLIST. 3) Select a set of nodal gradients by taking the centroids of the gradient feasibility regions or (in the case of boundary nodes) truncated regions: Subroutine GLIST. 4) Optionally, create level-2 Encapsulated PostScript files containing plots of T and/or the dual of T (along with the nodal gradients): Subroutines PLTTR and PLTGR. 5) Optionally, compute a scale factor EPS defining a quad- ratic function q(p) = EPS*, and adjust the data values and gradients by subtracting nodal values and gradients of q, where EPS is defined so that a strictly convex Hermite interpolant of the original data can be constructed from a convex Hermite interpolant of the adjusted data (Subroutine ADDQT). 6) Construct a convexity-preserving triangulation Tg of the (possibly adjusted) nodal gradients and negative z- intercepts of the affine nodal functions defined by the (adjusted) data values and nodal gradients: Subroutine TRMSHC. 7) Construct a cell diagram (the straight line dual of Tg): a set of N convex polygons R_i that partition the plane and such that the restriction of H to R_i is the i-th affine nodal function f_i, where f_i(p) = + z_i for nodes p_i, (adjusted) data values z_i and (adjusted) gradients g_i for i = 1 to N and H(p) = Max(i=1,N){f_i(p)}: Subroutine VLIST. 8) Optionally, create level-2 Encapsulated PostScript files containing plots of Tg and/or the dual of Tg (along with the nodes): Subroutines PLTTR and PLTGR. 9) Compute the distance D_i from each node p_i to the nearest boundary point of cell R_i: Subroutine DELTAI. 10) Compute weights W_i and quadrature points q_ij defining the quadrature rule Q(p) = Sum(i=1,NR) [ W_i*Sum(j=1,NA) H(p+q_ij) ] for approximating F(p) = Integral[ H(p+q)* Phi(q) ]dq, where the integral is over the disk D0 of radius Dmin = Min(i=1,N){D_i} centered at the origin, and Phi(q) = phi(Norm(q)/Dmin), normalized to have inte- gral 1, for phi(t) = 1 - 3*t**2 + 2*t**3 (t in [0,1]): Subroutine GETQW. Subprograms: The subprograms in csrfpack.f are alphabetically ordered except for Subroutine CSURF which appears at the beginning of the file. The header comments in CSURF duplicate much of the documentation provided here. The subprograms that are likely to be called directly by a driver program are as follows. CSURF: Subroutine which computes parameters defining the smooth interpolatory surface F, and optionally creates plots of the triangulations and their duals, by executing the 10-step procedure outlined above. FGRID: Subroutine which uses FVAL to evaluate F at the vertices of a rectangular grid. FVAL: Subroutine which, given a point p and the output parameters from Subroutine CSURF, returns the value and gradient of F at p. PLTCNT: Subroutine which, given a set of function values z = F(x,y) at the vertices of a rectangular grid, creates an Encapsulated PostScript file contain- ing a contour plot of the piecewise bilinear interpolant of the function values. PLTTR: Subroutine which creates an Encapsulated PostScript file containing a plot of a triangulation created by Subroutine TRMSHC. TRMSHC: Subroutine which constructs a convexity-preserving triangulation, if it exists, of a set of N data points. Additional high-level subprograms that are called by CSURF are the following. ADDQT: Subroutine which, given a set of strictly convex Hermite data (nodes, data values, and nodal gradi- ents such that there exists a convex Hermite interpolant of the data values and gradients, and no four data points are coplanar), adjusts the data values and gradients (using a quadratic correction term) such that a strictly convex Her- mite interpolant of the data can be constructed from a convex Hermite interpolant of the adjusted data. DELBE: Subroutine which removes extraneous boundary edges (nearly null triangles) to avoid large errors caused by steep gradients on the boundary. The calling program specifies a lower bound on the acceptable aspect ratio (ratio of the radius of the inscribed circle to that of the circumcircle) of boundary triangles. DELTAI: Subroutine which, given a set of nodes p_i, data values z_i, and a data structure representing a convexity-preserving gradient triangulation Tg (Subroutine TRMSHC), returns the perpendicular distances D_i from each node p_i to the boundary of R_i. GETQW: Subroutine which computes the weights and quadra- ture points defining the quadrature rule for approximating values of F. GLIST: Subroutine which, given a convexity-preserving triangulation and its straight-line dual computed by Subroutine VLIST, returns a set of nodal gradi- ents for which there exists a convex Hermite interpolant of the data values and gradients. The nodal gradients are taken to be the centroids of the gradient feasibility regions (or truncated regions). PLTGR: Subroutine which creates an Encapsulated PostScript file containing a plot of the straight-line dual of a triangulation along with the set of nodal gradients. VLIST: Subroutine which, given a convexity-preserving triangulation, computes its straight-line dual, returning the vertices and adjacency information defining the gradient feasibility regions or cell diagram. The header comments in Subroutine TRMSHC include a list of additional user-callable subprograms related to the triangu- lations. Many of these are, with the exception of minor changes in comments, identical to subprograms in TRIPACK (ACM TOMS Algorithm 751). The triangulation data structure is the same as that of TRIPACK, and the structure defining T is overwritten by the structure for Tg. SHAR_EOF fi # end of overwriting check cd .. if test ! -d 'Fortran77' then mkdir 'Fortran77' fi cd 'Fortran77' if test ! -d 'Drivers' then mkdir 'Drivers' fi cd 'Drivers' if test -f 'Makefile' then echo shar: will not over-write existing file "'Makefile'" else cat << "SHAR_EOF" > 'Makefile' include makefile.inc all: Res src.o: $(INCSRC)/src.f $(F77) $(F77OPTS) -c $(INCSRC)/src.f DRIVERS= driver1 RESULTS= Res Libs1= $(PORT) Objs1= driver.o src.o driver1: $(Objs1) $(F77LINK) $(F77LINKOPTS) -o driver1 $(Objs1) $(Libs1) Res: driver1 data ./driver1 Res diffres:Res res echo "Differences in results from driver" $(DIFF) Res res clean: rm -rf *.o $(DRIVERS) $(CLEANUP) $(RESULTS) SHAR_EOF fi # end of overwriting check if test -f 'csrftest.eps' then echo shar: will not over-write existing file "'csrftest.eps'" else cat << "SHAR_EOF" > 'csrftest.eps' %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 198 288 414 504 %%Title: Contour Plot %%Creator: CSRFPACK %%EndComments 198 288 moveto 198 504 lineto 414 504 lineto 414 288 lineto closepath stroke 306.000000 396.000000 translate 108.000000 108.000000 scale 0.018519 setlinewidth -0.076923 -0.447278 moveto -0.025641 -0.458596 lineto 0.025641 -0.458596 lineto 0.076923 -0.447278 lineto 0.096731 -0.435897 lineto 0.128205 -0.404434 lineto 0.145212 -0.384615 lineto 0.179487 -0.340402 lineto 0.184421 -0.333333 lineto 0.215099 -0.282051 lineto 0.230769 -0.250617 lineto 0.239767 -0.230769 lineto 0.258365 -0.179487 lineto 0.272313 -0.128205 lineto 0.281612 -0.076923 lineto 0.282051 -0.072076 lineto 0.285911 -0.025641 lineto 0.285911 0.025641 lineto 0.282051 0.072076 lineto 0.281612 0.076923 lineto 0.272313 0.128205 lineto 0.258365 0.179487 lineto 0.239767 0.230769 lineto 0.230769 0.250617 lineto 0.215099 0.282051 lineto 0.184421 0.333333 lineto 0.179487 0.340402 lineto 0.145212 0.384615 lineto 0.128205 0.404434 lineto 0.096731 0.435897 lineto 0.076923 0.447278 lineto 0.025641 0.458596 lineto -0.025641 0.458596 lineto -0.076923 0.447278 lineto -0.096731 0.435897 lineto -0.128205 0.404434 lineto -0.145212 0.384615 lineto -0.179487 0.340402 lineto -0.184421 0.333333 lineto -0.215099 0.282051 lineto -0.230769 0.250617 lineto -0.239767 0.230769 lineto -0.258365 0.179487 lineto -0.272313 0.128205 lineto -0.281612 0.076923 lineto -0.282051 0.072076 lineto -0.285911 0.025641 lineto -0.285911 -0.025641 lineto -0.282051 -0.072076 lineto -0.281612 -0.076923 lineto -0.272313 -0.128205 lineto -0.258365 -0.179487 lineto -0.239767 -0.230769 lineto -0.230769 -0.250617 lineto -0.215099 -0.282051 lineto -0.184421 -0.333333 lineto -0.179487 -0.340402 lineto -0.145212 -0.384615 lineto -0.128205 -0.404434 lineto -0.096731 -0.435897 lineto -0.076923 -0.447278 lineto stroke -0.230769 -0.549960 moveto -0.179487 -0.570717 lineto -0.128205 -0.579400 lineto -0.076923 -0.584615 lineto -0.025641 -0.587274 lineto 0.025641 -0.587274 lineto 0.076923 -0.584615 lineto 0.128205 -0.579400 lineto 0.179487 -0.570717 lineto 0.230769 -0.549960 lineto 0.245673 -0.538462 lineto 0.282051 -0.498038 lineto 0.291078 -0.487179 lineto 0.329444 -0.435897 lineto 0.333333 -0.430049 lineto 0.361229 -0.384615 lineto 0.384615 -0.341084 lineto 0.388483 -0.333333 lineto 0.410414 -0.282051 lineto 0.428691 -0.230769 lineto 0.435897 -0.205491 lineto 0.442818 -0.179487 lineto 0.453054 -0.128205 lineto 0.459878 -0.076923 lineto 0.463291 -0.025641 lineto 0.463291 0.025641 lineto 0.459878 0.076923 lineto 0.453054 0.128205 lineto 0.442818 0.179487 lineto 0.435897 0.205491 lineto 0.428691 0.230769 lineto 0.410414 0.282051 lineto 0.388483 0.333333 lineto 0.384615 0.341084 lineto 0.361229 0.384615 lineto 0.333333 0.430049 lineto 0.329444 0.435897 lineto 0.291078 0.487179 lineto 0.282051 0.498038 lineto 0.245673 0.538462 lineto 0.230769 0.549960 lineto 0.179487 0.570717 lineto 0.128205 0.579400 lineto 0.076923 0.584615 lineto 0.025641 0.587274 lineto -0.025641 0.587274 lineto -0.076923 0.584615 lineto -0.128205 0.579400 lineto -0.179487 0.570717 lineto -0.230769 0.549960 lineto -0.245673 0.538462 lineto -0.282051 0.498038 lineto -0.291078 0.487179 lineto -0.329444 0.435897 lineto -0.333333 0.430049 lineto -0.361229 0.384615 lineto -0.384615 0.341084 lineto -0.388483 0.333333 lineto -0.410414 0.282051 lineto -0.428691 0.230769 lineto -0.435897 0.205491 lineto -0.442818 0.179487 lineto -0.453054 0.128205 lineto -0.459878 0.076923 lineto -0.463291 0.025641 lineto -0.463291 -0.025641 lineto -0.459878 -0.076923 lineto -0.453054 -0.128205 lineto -0.442818 -0.179487 lineto -0.435897 -0.205491 lineto -0.428691 -0.230769 lineto -0.410414 -0.282051 lineto -0.388483 -0.333333 lineto -0.384615 -0.341084 lineto -0.361229 -0.384615 lineto -0.333333 -0.430049 lineto -0.329444 -0.435897 lineto -0.291078 -0.487179 lineto -0.282051 -0.498038 lineto -0.245673 -0.538462 lineto -0.230769 -0.549960 lineto stroke -0.128205 -0.693948 moveto -0.076923 -0.698551 lineto -0.025641 -0.700852 lineto 0.025641 -0.700852 lineto 0.076923 -0.698551 lineto 0.128205 -0.693948 lineto 0.140392 -0.692308 lineto 0.179487 -0.686798 lineto 0.230769 -0.677160 lineto 0.282051 -0.665168 lineto 0.333333 -0.646961 lineto 0.343033 -0.641026 lineto 0.384615 -0.599515 lineto 0.392913 -0.589744 lineto 0.433120 -0.538462 lineto 0.435897 -0.534565 lineto 0.467426 -0.487179 lineto 0.487179 -0.454191 lineto 0.497451 -0.435897 lineto 0.523044 -0.384615 lineto 0.538462 -0.349310 lineto 0.545029 -0.333333 lineto 0.563097 -0.282051 lineto 0.578154 -0.230769 lineto 0.589744 -0.181425 lineto 0.590174 -0.179487 lineto 0.598707 -0.128205 lineto 0.604395 -0.076923 lineto 0.607239 -0.025641 lineto 0.607239 0.025641 lineto 0.604395 0.076923 lineto 0.598707 0.128205 lineto 0.590174 0.179487 lineto 0.589744 0.181425 lineto 0.578154 0.230769 lineto 0.563097 0.282051 lineto 0.545029 0.333333 lineto 0.538462 0.349310 lineto 0.523044 0.384615 lineto 0.497451 0.435897 lineto 0.487179 0.454191 lineto 0.467426 0.487179 lineto 0.435897 0.534565 lineto 0.433120 0.538462 lineto 0.392913 0.589744 lineto 0.384615 0.599515 lineto 0.343033 0.641026 lineto 0.333333 0.646961 lineto 0.282051 0.665168 lineto 0.230769 0.677160 lineto 0.179487 0.686798 lineto 0.140392 0.692308 lineto 0.128205 0.693948 lineto 0.076923 0.698551 lineto 0.025641 0.700852 lineto -0.025641 0.700852 lineto -0.076923 0.698551 lineto -0.128205 0.693948 lineto -0.140392 0.692308 lineto -0.179487 0.686798 lineto -0.230769 0.677160 lineto -0.282051 0.665168 lineto -0.333333 0.646961 lineto -0.343033 0.641026 lineto -0.384615 0.599515 lineto -0.392913 0.589744 lineto -0.433120 0.538462 lineto -0.435897 0.534565 lineto -0.467426 0.487179 lineto -0.487179 0.454191 lineto -0.497451 0.435897 lineto -0.523044 0.384615 lineto -0.538462 0.349310 lineto -0.545029 0.333333 lineto -0.563097 0.282051 lineto -0.578154 0.230769 lineto -0.589744 0.181425 lineto -0.590174 0.179487 lineto -0.598707 0.128205 lineto -0.604395 0.076923 lineto -0.607239 0.025641 lineto -0.607239 -0.025641 lineto -0.604395 -0.076923 lineto -0.598707 -0.128205 lineto -0.590174 -0.179487 lineto -0.589744 -0.181425 lineto -0.578154 -0.230769 lineto -0.563097 -0.282051 lineto -0.545029 -0.333333 lineto -0.538462 -0.349310 lineto -0.523044 -0.384615 lineto -0.497451 -0.435897 lineto -0.487179 -0.454191 lineto -0.467426 -0.487179 lineto -0.435897 -0.534565 lineto -0.433120 -0.538462 lineto -0.392913 -0.589744 lineto -0.384615 -0.599515 lineto -0.343033 -0.641026 lineto -0.333333 -0.646961 lineto -0.282051 -0.665168 lineto -0.230769 -0.677160 lineto -0.179487 -0.686798 lineto -0.140392 -0.692308 lineto -0.128205 -0.693948 lineto stroke -0.128205 -0.797732 moveto -0.076923 -0.801956 lineto -0.025641 -0.804067 lineto 0.025641 -0.804067 lineto 0.076923 -0.801956 lineto 0.128205 -0.797732 lineto 0.151361 -0.794872 lineto 0.179487 -0.791248 lineto 0.230769 -0.782439 lineto 0.282051 -0.771427 lineto 0.333333 -0.758213 lineto 0.382498 -0.743590 lineto 0.384615 -0.742906 lineto 0.435897 -0.719059 lineto 0.468160 -0.692308 lineto 0.487179 -0.670452 lineto 0.510925 -0.641026 lineto 0.538462 -0.604243 lineto 0.548678 -0.589744 lineto 0.581803 -0.538462 lineto 0.589744 -0.524939 lineto 0.610687 -0.487179 lineto 0.636285 -0.435897 lineto 0.641026 -0.425214 lineto 0.658093 -0.384615 lineto 0.676957 -0.333333 lineto 0.692308 -0.284647 lineto 0.693085 -0.282051 lineto 0.705887 -0.230769 lineto 0.716128 -0.179487 lineto 0.723809 -0.128205 lineto 0.728930 -0.076923 lineto 0.731490 -0.025641 lineto 0.731490 0.025641 lineto 0.728930 0.076923 lineto 0.723809 0.128205 lineto 0.716128 0.179487 lineto 0.705887 0.230769 lineto 0.693085 0.282051 lineto 0.692308 0.284647 lineto 0.676957 0.333333 lineto 0.658093 0.384615 lineto 0.641026 0.425214 lineto 0.636285 0.435897 lineto 0.610687 0.487179 lineto 0.589744 0.524939 lineto 0.581803 0.538462 lineto 0.548678 0.589744 lineto 0.538462 0.604243 lineto 0.510925 0.641026 lineto 0.487179 0.670452 lineto 0.468160 0.692308 lineto 0.435897 0.719059 lineto 0.384615 0.742906 lineto 0.382498 0.743590 lineto 0.333333 0.758213 lineto 0.282051 0.771427 lineto 0.230769 0.782439 lineto 0.179487 0.791248 lineto 0.151361 0.794872 lineto 0.128205 0.797732 lineto 0.076923 0.801956 lineto 0.025641 0.804067 lineto -0.025641 0.804067 lineto -0.076923 0.801956 lineto -0.128205 0.797732 lineto -0.151361 0.794872 lineto -0.179487 0.791248 lineto -0.230769 0.782439 lineto -0.282051 0.771427 lineto -0.333333 0.758213 lineto -0.382498 0.743590 lineto -0.384615 0.742906 lineto -0.435897 0.719059 lineto -0.468160 0.692308 lineto -0.487179 0.670452 lineto -0.510925 0.641026 lineto -0.538462 0.604243 lineto -0.548678 0.589744 lineto -0.581803 0.538462 lineto -0.589744 0.524939 lineto -0.610687 0.487179 lineto -0.636285 0.435897 lineto -0.641026 0.425214 lineto -0.658093 0.384615 lineto -0.676957 0.333333 lineto -0.692308 0.284647 lineto -0.693085 0.282051 lineto -0.705887 0.230769 lineto -0.716128 0.179487 lineto -0.723809 0.128205 lineto -0.728930 0.076923 lineto -0.731490 0.025641 lineto -0.731490 -0.025641 lineto -0.728930 -0.076923 lineto -0.723809 -0.128205 lineto -0.716128 -0.179487 lineto -0.705887 -0.230769 lineto -0.693085 -0.282051 lineto -0.692308 -0.284647 lineto -0.676957 -0.333333 lineto -0.658093 -0.384615 lineto -0.641026 -0.425214 lineto -0.636285 -0.435897 lineto -0.610687 -0.487179 lineto -0.589744 -0.524939 lineto -0.581803 -0.538462 lineto -0.548678 -0.589744 lineto -0.538462 -0.604243 lineto -0.510925 -0.641026 lineto -0.487179 -0.670452 lineto -0.468160 -0.692308 lineto -0.435897 -0.719059 lineto -0.384615 -0.742906 lineto -0.382498 -0.743590 lineto -0.333333 -0.758213 lineto -0.282051 -0.771427 lineto -0.230769 -0.782439 lineto -0.179487 -0.791248 lineto -0.151361 -0.794872 lineto -0.128205 -0.797732 lineto stroke -0.025641 -0.899380 moveto 0.025641 -0.899380 lineto 0.076736 -0.897436 lineto 0.076923 -0.897428 lineto 0.128205 -0.893372 lineto 0.179487 -0.887288 lineto 0.230769 -0.879175 lineto 0.282051 -0.869034 lineto 0.333333 -0.856865 lineto 0.372025 -0.846154 lineto 0.384615 -0.842525 lineto 0.435897 -0.825632 lineto 0.487179 -0.806595 lineto 0.512051 -0.794872 lineto 0.538462 -0.776596 lineto 0.570434 -0.743590 lineto 0.589744 -0.720055 lineto 0.611289 -0.692308 lineto 0.641026 -0.651066 lineto 0.647885 -0.641026 lineto 0.680223 -0.589744 lineto 0.692308 -0.568837 lineto 0.708990 -0.538462 lineto 0.734593 -0.487179 lineto 0.743590 -0.467156 lineto 0.756968 -0.435897 lineto 0.776476 -0.384615 lineto 0.793546 -0.333333 lineto 0.794872 -0.328686 lineto 0.807573 -0.282051 lineto 0.819213 -0.230769 lineto 0.828524 -0.179487 lineto 0.835508 -0.128205 lineto 0.840163 -0.076923 lineto 0.842491 -0.025641 lineto 0.842491 0.025641 lineto 0.840163 0.076923 lineto 0.835508 0.128205 lineto 0.828524 0.179487 lineto 0.819213 0.230769 lineto 0.807573 0.282051 lineto 0.794872 0.328686 lineto 0.793546 0.333333 lineto 0.776476 0.384615 lineto 0.756968 0.435897 lineto 0.743590 0.467156 lineto 0.734593 0.487179 lineto 0.708990 0.538462 lineto 0.692308 0.568837 lineto 0.680223 0.589744 lineto 0.647885 0.641026 lineto 0.641026 0.651066 lineto 0.611289 0.692308 lineto 0.589744 0.720055 lineto 0.570434 0.743590 lineto 0.538462 0.776596 lineto 0.512051 0.794872 lineto 0.487179 0.806595 lineto 0.435897 0.825632 lineto 0.384615 0.842525 lineto 0.372025 0.846154 lineto 0.333333 0.856865 lineto 0.282051 0.869034 lineto 0.230769 0.879175 lineto 0.179487 0.887288 lineto 0.128205 0.893372 lineto 0.076923 0.897428 lineto 0.076736 0.897436 lineto 0.025641 0.899380 lineto -0.025641 0.899380 lineto -0.076736 0.897436 lineto -0.076923 0.897428 lineto -0.128205 0.893372 lineto -0.179487 0.887288 lineto -0.230769 0.879175 lineto -0.282051 0.869034 lineto -0.333333 0.856865 lineto -0.372025 0.846154 lineto -0.384615 0.842525 lineto -0.435897 0.825632 lineto -0.487179 0.806595 lineto -0.512051 0.794872 lineto -0.538462 0.776596 lineto -0.570434 0.743590 lineto -0.589744 0.720055 lineto -0.611289 0.692308 lineto -0.641026 0.651066 lineto -0.647885 0.641026 lineto -0.680223 0.589744 lineto -0.692308 0.568837 lineto -0.708990 0.538462 lineto -0.734593 0.487179 lineto -0.743590 0.467156 lineto -0.756968 0.435897 lineto -0.776476 0.384615 lineto -0.793546 0.333333 lineto -0.794872 0.328686 lineto -0.807573 0.282051 lineto -0.819213 0.230769 lineto -0.828524 0.179487 lineto -0.835508 0.128205 lineto -0.840163 0.076923 lineto -0.842491 0.025641 lineto -0.842491 -0.025641 lineto -0.840163 -0.076923 lineto -0.835508 -0.128205 lineto -0.828524 -0.179487 lineto -0.819213 -0.230769 lineto -0.807573 -0.282051 lineto -0.794872 -0.328686 lineto -0.793546 -0.333333 lineto -0.776476 -0.384615 lineto -0.756968 -0.435897 lineto -0.743590 -0.467156 lineto -0.734593 -0.487179 lineto -0.708990 -0.538462 lineto -0.692308 -0.568837 lineto -0.680223 -0.589744 lineto -0.647885 -0.641026 lineto -0.641026 -0.651066 lineto -0.611289 -0.692308 lineto -0.589744 -0.720055 lineto -0.570434 -0.743590 lineto -0.538462 -0.776596 lineto -0.512051 -0.794872 lineto -0.487179 -0.806595 lineto -0.435897 -0.825632 lineto -0.384615 -0.842525 lineto -0.372025 -0.846154 lineto -0.333333 -0.856865 lineto -0.282051 -0.869034 lineto -0.230769 -0.879175 lineto -0.179487 -0.887288 lineto -0.128205 -0.893372 lineto -0.076923 -0.897428 lineto -0.076736 -0.897436 lineto -0.025641 -0.899380 lineto stroke -0.282051 -0.959850 moveto -0.230769 -0.969248 lineto -0.179487 -0.976766 lineto -0.128205 -0.982404 lineto -0.076923 -0.986163 lineto -0.025641 -0.988043 lineto 0.025641 -0.988043 lineto 0.076923 -0.986163 lineto 0.128205 -0.982404 lineto 0.179487 -0.976766 lineto 0.230769 -0.969248 lineto 0.282051 -0.959850 lineto 0.332676 -0.948718 lineto 0.333333 -0.948568 lineto 0.384615 -0.934911 lineto 0.435897 -0.919303 lineto 0.487179 -0.901732 lineto 0.498463 -0.897436 lineto 0.538462 -0.881581 lineto 0.589744 -0.858242 lineto 0.609219 -0.846154 lineto 0.641026 -0.816077 lineto 0.659235 -0.794872 lineto 0.692308 -0.752915 lineto 0.699291 -0.743590 lineto 0.735135 -0.692308 lineto 0.743590 -0.679281 lineto 0.767238 -0.641026 lineto 0.794872 -0.592599 lineto 0.796427 -0.589744 lineto 0.822034 -0.538462 lineto 0.845312 -0.487179 lineto 0.846154 -0.485120 lineto 0.865390 -0.435897 lineto 0.883204 -0.384615 lineto 0.897436 -0.337793 lineto 0.898735 -0.333333 lineto 0.911540 -0.282051 lineto 0.922210 -0.230769 lineto 0.930747 -0.179487 lineto 0.937149 -0.128205 lineto 0.941417 -0.076923 lineto 0.943551 -0.025641 lineto 0.943551 0.025641 lineto 0.941417 0.076923 lineto 0.937149 0.128205 lineto 0.930747 0.179487 lineto 0.922210 0.230769 lineto 0.911540 0.282051 lineto 0.898735 0.333333 lineto 0.897436 0.337793 lineto 0.883204 0.384615 lineto 0.865390 0.435897 lineto 0.846154 0.485120 lineto 0.845312 0.487179 lineto 0.822034 0.538462 lineto 0.796427 0.589744 lineto 0.794872 0.592599 lineto 0.767238 0.641026 lineto 0.743590 0.679281 lineto 0.735135 0.692308 lineto 0.699291 0.743590 lineto 0.692308 0.752915 lineto 0.659235 0.794872 lineto 0.641026 0.816077 lineto 0.609219 0.846154 lineto 0.589744 0.858242 lineto 0.538462 0.881581 lineto 0.498463 0.897436 lineto 0.487179 0.901732 lineto 0.435897 0.919303 lineto 0.384615 0.934911 lineto 0.333333 0.948568 lineto 0.332676 0.948718 lineto 0.282051 0.959850 lineto 0.230769 0.969248 lineto 0.179487 0.976766 lineto 0.128205 0.982404 lineto 0.076923 0.986163 lineto 0.025641 0.988043 lineto -0.025641 0.988043 lineto -0.076923 0.986163 lineto -0.128205 0.982404 lineto -0.179487 0.976766 lineto -0.230769 0.969248 lineto -0.282051 0.959850 lineto -0.332676 0.948718 lineto -0.333333 0.948568 lineto -0.384615 0.934911 lineto -0.435897 0.919303 lineto -0.487179 0.901732 lineto -0.498463 0.897436 lineto -0.538462 0.881581 lineto -0.589744 0.858242 lineto -0.609219 0.846154 lineto -0.641026 0.816077 lineto -0.659235 0.794872 lineto -0.692308 0.752915 lineto -0.699291 0.743590 lineto -0.735135 0.692308 lineto -0.743590 0.679281 lineto -0.767238 0.641026 lineto -0.794872 0.592599 lineto -0.796427 0.589744 lineto -0.822034 0.538462 lineto -0.845312 0.487179 lineto -0.846154 0.485120 lineto -0.865390 0.435897 lineto -0.883204 0.384615 lineto -0.897436 0.337793 lineto -0.898735 0.333333 lineto -0.911540 0.282051 lineto -0.922210 0.230769 lineto -0.930747 0.179487 lineto -0.937149 0.128205 lineto -0.941417 0.076923 lineto -0.943551 0.025641 lineto -0.943551 -0.025641 lineto -0.941417 -0.076923 lineto -0.937149 -0.128205 lineto -0.930747 -0.179487 lineto -0.922210 -0.230769 lineto -0.911540 -0.282051 lineto -0.898735 -0.333333 lineto -0.897436 -0.337793 lineto -0.883204 -0.384615 lineto -0.865390 -0.435897 lineto -0.846154 -0.485120 lineto -0.845312 -0.487179 lineto -0.822034 -0.538462 lineto -0.796427 -0.589744 lineto -0.794872 -0.592599 lineto -0.767238 -0.641026 lineto -0.743590 -0.679281 lineto -0.735135 -0.692308 lineto -0.699291 -0.743590 lineto -0.692308 -0.752915 lineto -0.659235 -0.794872 lineto -0.641026 -0.816077 lineto -0.609219 -0.846154 lineto -0.589744 -0.858242 lineto -0.538462 -0.881581 lineto -0.498463 -0.897436 lineto -0.487179 -0.901732 lineto -0.435897 -0.919303 lineto -0.384615 -0.934911 lineto -0.333333 -0.948568 lineto -0.332676 -0.948718 lineto -0.282051 -0.959850 lineto stroke -0.455156 -1.000000 moveto -0.487179 -0.988797 lineto -0.538462 -0.968220 lineto -0.583412 -0.948718 lineto -0.589744 -0.945812 lineto -0.641026 -0.920114 lineto -0.682160 -0.897436 lineto -0.692308 -0.889428 lineto -0.738061 -0.846154 lineto -0.743590 -0.839260 lineto -0.777509 -0.794872 lineto -0.794872 -0.770530 lineto -0.813215 -0.743590 lineto -0.845806 -0.692308 lineto -0.846154 -0.691717 lineto -0.874769 -0.641026 lineto -0.897436 -0.597524 lineto -0.901321 -0.589744 lineto -0.924797 -0.538462 lineto -0.946138 -0.487179 lineto -0.948718 -0.480291 lineto -0.964681 -0.435897 lineto -0.981071 -0.384615 lineto -0.995413 -0.333333 lineto -1.000000 -0.314199 lineto stroke 0.455156 -1.000000 moveto 0.487179 -0.988797 lineto 0.538462 -0.968220 lineto 0.583412 -0.948718 lineto 0.589744 -0.945812 lineto 0.641026 -0.920114 lineto 0.682160 -0.897436 lineto 0.692308 -0.889428 lineto 0.738061 -0.846154 lineto 0.743590 -0.839260 lineto 0.777509 -0.794872 lineto 0.794872 -0.770530 lineto 0.813215 -0.743590 lineto 0.845806 -0.692308 lineto 0.846154 -0.691717 lineto 0.874769 -0.641026 lineto 0.897436 -0.597524 lineto 0.901321 -0.589744 lineto 0.924797 -0.538462 lineto 0.946138 -0.487179 lineto 0.948718 -0.480291 lineto 0.964681 -0.435897 lineto 0.981071 -0.384615 lineto 0.995413 -0.333333 lineto 1.000000 -0.314199 lineto stroke 1.000000 0.314199 moveto 0.995413 0.333333 lineto 0.981071 0.384615 lineto 0.964681 0.435897 lineto 0.948718 0.480291 lineto 0.946138 0.487179 lineto 0.924797 0.538462 lineto 0.901321 0.589744 lineto 0.897436 0.597524 lineto 0.874769 0.641026 lineto 0.846154 0.691717 lineto 0.845806 0.692308 lineto 0.813215 0.743590 lineto 0.794872 0.770530 lineto 0.777509 0.794872 lineto 0.743590 0.839260 lineto 0.738061 0.846154 lineto 0.692308 0.889428 lineto 0.682160 0.897436 lineto 0.641026 0.920114 lineto 0.589744 0.945812 lineto 0.583412 0.948718 lineto 0.538462 0.968220 lineto 0.487179 0.988797 lineto 0.455156 1.000000 lineto stroke -0.455156 1.000000 moveto -0.487179 0.988797 lineto -0.538462 0.968220 lineto -0.583412 0.948718 lineto -0.589744 0.945812 lineto -0.641026 0.920114 lineto -0.682160 0.897436 lineto -0.692308 0.889428 lineto -0.738061 0.846154 lineto -0.743590 0.839260 lineto -0.777509 0.794872 lineto -0.794872 0.770530 lineto -0.813215 0.743590 lineto -0.845806 0.692308 lineto -0.846154 0.691717 lineto -0.874769 0.641026 lineto -0.897436 0.597524 lineto -0.901321 0.589744 lineto -0.924797 0.538462 lineto -0.946138 0.487179 lineto -0.948718 0.480291 lineto -0.964681 0.435897 lineto -0.981071 0.384615 lineto -0.995413 0.333333 lineto -1.000000 0.314199 lineto stroke -0.632914 -1.000000 moveto -0.641026 -0.996051 lineto -0.692308 -0.969465 lineto -0.730035 -0.948718 lineto -0.743590 -0.940615 lineto -0.794872 -0.906165 lineto -0.806332 -0.897436 lineto -0.846154 -0.849247 lineto -0.848519 -0.846154 lineto -0.884148 -0.794872 lineto -0.897436 -0.774470 lineto -0.916712 -0.743590 lineto -0.946590 -0.692308 lineto -0.948718 -0.688374 lineto -0.973310 -0.641026 lineto -0.997896 -0.589744 lineto -1.000000 -0.584957 lineto stroke 0.632914 -1.000000 moveto 0.641026 -0.996051 lineto 0.692308 -0.969465 lineto 0.730035 -0.948718 lineto 0.743590 -0.940615 lineto 0.794872 -0.906165 lineto 0.806332 -0.897436 lineto 0.846154 -0.849247 lineto 0.848519 -0.846154 lineto 0.884148 -0.794872 lineto 0.897436 -0.774470 lineto 0.916712 -0.743590 lineto 0.946590 -0.692308 lineto 0.948718 -0.688374 lineto 0.973310 -0.641026 lineto 0.997896 -0.589744 lineto 1.000000 -0.584957 lineto stroke 1.000000 0.584957 moveto 0.997896 0.589744 lineto 0.973310 0.641026 lineto 0.948718 0.688374 lineto 0.946590 0.692308 lineto 0.916712 0.743590 lineto 0.897436 0.774470 lineto 0.884148 0.794872 lineto 0.848519 0.846154 lineto 0.846154 0.849247 lineto 0.806332 0.897436 lineto 0.794872 0.906165 lineto 0.743590 0.940615 lineto 0.730035 0.948718 lineto 0.692308 0.969465 lineto 0.641026 0.996051 lineto 0.632914 1.000000 lineto stroke -0.632914 1.000000 moveto -0.641026 0.996051 lineto -0.692308 0.969465 lineto -0.730035 0.948718 lineto -0.743590 0.940615 lineto -0.794872 0.906165 lineto -0.806332 0.897436 lineto -0.846154 0.849247 lineto -0.848519 0.846154 lineto -0.884148 0.794872 lineto -0.897436 0.774470 lineto -0.916712 0.743590 lineto -0.946590 0.692308 lineto -0.948718 0.688374 lineto -0.973310 0.641026 lineto -0.997896 0.589744 lineto -1.000000 0.584957 lineto stroke -0.770975 -1.000000 moveto -0.794872 -0.986041 lineto -0.846154 -0.954389 lineto -0.854821 -0.948718 lineto -0.897436 -0.912235 lineto -0.912340 -0.897436 lineto -0.948718 -0.846795 lineto -0.949158 -0.846154 lineto -0.981940 -0.794872 lineto -1.000000 -0.764736 lineto stroke 0.770975 -1.000000 moveto 0.794872 -0.986041 lineto 0.846154 -0.954389 lineto 0.854821 -0.948718 lineto 0.897436 -0.912235 lineto 0.912340 -0.897436 lineto 0.948718 -0.846795 lineto 0.949158 -0.846154 lineto 0.981940 -0.794872 lineto 1.000000 -0.764736 lineto stroke 1.000000 0.764736 moveto 0.981940 0.794872 lineto 0.949158 0.846154 lineto 0.948718 0.846795 lineto 0.912340 0.897436 lineto 0.897436 0.912235 lineto 0.854821 0.948718 lineto 0.846154 0.954389 lineto 0.794872 0.986041 lineto 0.770975 1.000000 lineto stroke -0.770975 1.000000 moveto -0.794872 0.986041 lineto -0.846154 0.954389 lineto -0.854821 0.948718 lineto -0.897436 0.912235 lineto -0.912340 0.897436 lineto -0.948718 0.846795 lineto -0.949158 0.846154 lineto -0.981940 0.794872 lineto -1.000000 0.764736 lineto stroke -0.891669 -1.000000 moveto -0.897436 -0.996239 lineto -0.948718 -0.960571 lineto -0.964410 -0.948718 lineto -1.000000 -0.907983 lineto stroke 0.891669 -1.000000 moveto 0.897436 -0.996239 lineto 0.948718 -0.960571 lineto 0.964410 -0.948718 lineto 1.000000 -0.907983 lineto stroke 1.000000 0.907983 moveto 0.964410 0.948718 lineto 0.948718 0.960571 lineto 0.897436 0.996239 lineto 0.891669 1.000000 lineto stroke -0.891669 1.000000 moveto -0.897436 0.996239 lineto -0.948718 0.960571 lineto -0.964410 0.948718 lineto -1.000000 0.907983 lineto stroke showpage %%EOF  SHAR_EOF fi # end of overwriting check if test -f 'csrftest.prt' then echo shar: will not over-write existing file "'csrftest.prt'" else cat << "SHAR_EOF" > 'csrftest.prt' CSRFTEST.PRT N = 8 XMIN = -0.100D+01 XMAX = 0.100D+01 YMIN = -0.100D+01 YMAX = 0.100D+01 TOLBE = 0.100D-01 STRICT = T NR = 8 NA = 24 Number of boundary edge deletions: ND = 0 Scale factor for quadratic term: EPS = 0.865D+00 Min. distance node to cell boundary: DMIN = 0.537D-01 SHAR_EOF fi # end of overwriting check if test -f 'data' then echo shar: will not over-write existing file "'data'" else cat << "SHAR_EOF" > 'data' 8 -1.00 -1.00 2.0000 1.00 -1.00 2.0000 0.00 -0.60 0.1296 -0.40 0.00 0.0256 0.40 0.00 0.0256 0.00 0.60 0.1296 -1.00 1.00 2.0000 1.00 1.00 2.0000 SHAR_EOF fi # end of overwriting check if test -f 'driver.f' then echo shar: will not over-write existing file "'driver.f'" else cat << "SHAR_EOF" > 'driver.f' C C C CSRFTEST C 06/25/02 C C This program is a test driver for the software package C CSRFPACK which constructs a convex once-continuously C differentiable bivariate function that interpolates a set C of data values at arbitrarily distributed nodes in the C plane. C C The user must provide an input data set consisting of C the number of data points N (Format I5) and a sequence of C N ordered triples (X,Y,Z) with nodal coordinates (X,Y) and C data values Z: Format 3E23.15. C C Provided the data defines a convex function, the output C consists of the following files: C C csrftest.prt: Print file with parameter values and error C messages. C csrftest.eps: Encapsulated Postscript file containing a C contour plot of the interpolatory surface. C csrftest.out: Data set suitable for a surface plotting C package consisting of interpolated values C on a triangulation of a uniform grid in the C bounding box (the smallest rectangle with C sides parallel to the axes that contains C the nodes). C tplot.eps: Encapsulated Postscript file containing the C convexity-preserving triangulation of the C nodes. C gplot.eps: Encapsulated Postscript file containing the C gradient feasibility diagram and nodal C gradients C tgplot.eps: Encapsulated Postscript file containing the C gradient triangulation. C rplot.eps: Encapsulated Postscript file containing the C cell diagram and nodes. C C Previously existing files with the above names are over- C written. C INTEGER LC, LWK, N2, N6, NA, NMAX, NR, NX, NY C C Maximum number of nodes NMAX: C PARAMETER (NMAX=300, N2=2*NMAX, N6=6*NMAX) C C Number of grid points NX (horizontally) and NY C (vertically) defining the uniform grid. C PARAMETER (NX=40, NY=40, LWK=NX*NY+(NX*NY)/2, . LC=NX*NY+LWK) C C Number of quadrature points in the radial and angular C directions: C PARAMETER (NR=8, NA=24) C CHARACTER*60 FNAME DOUBLE PRECISION C(NMAX), D(NMAX), DMIN, DX, DXL(N2), . DY, DYL(N2), EPS, F(NX,NY), GX(NMAX), . GY(NMAX), PLTSIZ, PX(NX), PY(NY), . QX(NR,NA), QY(NR,NA), TOLBE, W(NR), . X(NMAX), XC(LC), XMAX, XMIN, Y(NMAX), . YC(LC), YMAX, YMIN, Z(NMAX) INTEGER I, IER, IPLOT, IWK(LWK), J, K, LCON, . LEND(NMAX), LIN, LIST(N6), LISTV(N6), LOUT, . LPRT, LPTR(N6), LNEW, N, NCON, ND, NEAR(NMAX), . NEXT(NMAX), NV LOGICAL STRICT C C Data: C C Plot option in the range 0 to 15: IPLOT = (b3,b2,b1,b0), C with bits specifying which Postscript files are created: C C b0: tplot.eps C b1: gplot.eps C b2: tgplot.eps C b3: rplot.eps C DATA IPLOT/15/ C C Number of contour values in the contour plot. C DATA NCON/10/ C C PostScript plot size: 1.0 <= PLTSIZ <= 7.5. C DATA PLTSIZ/3.0/ C C Strict convexity option (quadratic correction term C requiring an O(N**2) algorithm). C DATA STRICT/.TRUE./ C C Positive tolerance for removing boundary triangles. C DATA TOLBE/1.D-2/ C C LIN,LOUT = Logical unit numbers for input and output. C DATA LCON/1/, LIN/5/, LOUT/6/, LPRT/4/ C C Input/output formats: C 300 FORMAT (I5) 310 FORMAT (3E23.15) 320 FORMAT (A60) 330 FORMAT (3I6) C C Get an input file name and open it. C C 1 WRITE (*,100) C 100 FORMAT (///13X,'CSRFTEST: CSRFPACK Test Program'// C . 5X,'Specify a data set file name (at most 60', C . ' characters):'/) C READ (*,320,ERR=1) FNAME C OPEN (LIN,FILE=FNAME,STATUS='OLD',ERR=1) C C Read N and the nodal coordinates and data values from C unit LIN. C READ (LIN,300) N IF (N .LT. 3 .OR. N .GT. NMAX) THEN WRITE (*,110) NMAX 110 FORMAT (//5X,'Invalid data. N must be in the ', . 'range 3 to ',I5,'.') STOP ENDIF READ (LIN,310) (X(I),Y(I),Z(I), I = 1,N) C C Compute the bounding box corner coordinates (XMIN,YMIN) C and (XMAX,YMAX) and the uniform grid points C (((PX(i),PY(j)), i = 1,NX), j = 1,NY). C XMIN = X(1) XMAX = X(1) YMIN = Y(1) YMAX = Y(1) DO 2 I = 2,N IF (X(I) .LT. XMIN) XMIN = X(I) IF (X(I) .GT. XMAX) XMAX = X(I) IF (Y(I) .LT. YMIN) YMIN = Y(I) IF (Y(I) .GT. YMAX) YMAX = Y(I) 2 CONTINUE DX = (XMAX-XMIN)/DBLE(NX-1) DY = (YMAX-YMIN)/DBLE(NY-1) DO 3 I = 1,NX PX(I) = XMIN + DBLE(I-1)*DX 3 CONTINUE DO 4 J = 1,NY PY(J) = YMIN + DBLE(J-1)*DY 4 CONTINUE C C Create a print file with parameter values. C OPEN (LPRT,FILE='csrftest.prt') WRITE (LPRT,120) N, XMIN, XMAX, YMIN, YMAX, TOLBE, . STRICT, NR, NA 120 FORMAT (///27X,'CSRFTEST.PRT'// . 10X,'N = ',I5/ . 10X,'XMIN = ',D10.3,3X,'XMAX = ',D10.3/ . 10X,'YMIN = ',D10.3,3X,'YMAX = ',D10.3/ . 10X,'TOLBE = ',D10.3/ . 10X,'STRICT = ',L1/ . 10X,'NR = ',I2/ . 10X,'NA = ',I2) C C Construct the interpolatory surface F. C CALL CSURF (N,X,Y,TOLBE,IPLOT,PLTSIZ,STRICT,NR,NA, ND, . Z,C,LIST,LPTR,LEND,LNEW,NEAR,NEXT,NV, . LISTV,DXL,DYL,GX,GY,EPS,D,DMIN,W,QX,QY, . IER) IF (IER .NE. 0) THEN IF (IER .NE. -11) GO TO 10 C C DMIN = 0. C WRITE (*,130) WRITE (LPRT,130) ENDIF 130 FORMAT (//10X,'*** The surface is not strictly ', . 'convex: DMIN = 0. ***'//) C C Output computed parameter values to the print file. C WRITE (LPRT,140) ND, EPS, DMIN WRITE (*,140) ND, EPS, DMIN 140 FORMAT (//10X,'Number of boundary edge deletions: ', . 'ND = ',I3/ . 10X,'Scale factor for quadratic term: ', . 'EPS = ',D10.3/ . 10X,'Min. distance node to cell boundary: ', . ' DMIN = ',D10.3) C C Compute interpolated values on the uniform grid. C CALL FGRID (NX,NY,PX,PY,EPS,GX,GY,C,LIST,LPTR, . LEND,DMIN,NR,NA,W,QX,QY, F,IER) C C Create a contour plot of the interpolatory surface on the C NX by NY uniform grid. C OPEN (LCON,FILE='csrftest.eps') CALL PLTCNT (LCON,PLTSIZ,NX,NY,PX,PY,F,NCON,IWK,XC, . YC, IER) C C Create the output data set using the natural ordering of C the rectangular grid points: left-to-right within C bottom-to-top. C C Write the number of vertices followed by the sequence of C vertex coordinate triples. C C OPEN (LOUT,FILE='csrftest.out') WRITE (LOUT,300) NX*NY DO 6 J = 1,NY DO 5 I = 1,NX WRITE (LOUT,310) PX(I), PY(J), F(I,J) 5 CONTINUE 6 CONTINUE C C Write the number of triangles followed by the sequence of C triangles (CCW-ordered vertex indices). For each of the C (NX-1)*(NY-1) cells, k is the vertex index of the upper C right corner, and the cell is partitioned by the C diagonal with slope 1. C WRITE (LOUT,300) 2*(NX-1)*(NY-1) DO 8 J = 2,NY DO 7 I = 2,NX K = NX*(J-1) + I WRITE (LOUT,330) K-NX-1, K-NX, K WRITE (LOUT,330) K-NX-1, K, K-1 7 CONTINUE 8 CONTINUE STOP C C Error in CSURF. C 10 WRITE (LPRT,400) IER WRITE (*,400) IER 400 FORMAT (///10X,'Error flag ',I4,' returned by CSURF.') IF (IER .EQ. -2) THEN WRITE (LPRT,410) WRITE (*,410) ENDIF 410 FORMAT (/10X,'The first three nodes are collinear.') IF (IER .EQ. -3) THEN WRITE (LPRT,420) WRITE (*,420) ENDIF 420 FORMAT (/10X,'A convex triangulation does not exist ', . '(ADDNDC error -3).') IF (IER .EQ. -4) THEN WRITE (LPRT,430) WRITE (*,430) ENDIF 430 FORMAT (/10X,'A convex triangulation does not exist ', . '(ADDNDC error -4).') IF (IER .GT. 0) THEN WRITE (LPRT,440) WRITE (*,440) ENDIF 440 FORMAT (/10X,'Duplicate nodes.') STOP END SHAR_EOF fi # end of overwriting check if test -f 'gplot.eps' then echo shar: will not over-write existing file "'gplot.eps'" else cat << "SHAR_EOF" > 'gplot.eps' %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 237 288 375 504 %%Title: Triangulation Dual %%Creator: CSRFPACK %%EndComments 2.000000 setlinewidth 246 301 moveto 246 491 lineto 366 491 lineto 366 301 lineto closepath stroke 306.500000 396.000000 translate 9.216923 9.308722 scale 0.107958 setlinewidth gsave -6.564013 -10.205482 moveto 6.564013 -10.205482 lineto 6.564013 10.205482 lineto -6.564013 10.205482 lineto closepath clip newpath 0.000000 -4.676000 moveto -1.421895 -1.121263 lineto -1.421895 -1.121263 moveto -3.290667 0.000000 lineto -3.290667 0.000000 moveto -5.470011 0.000000 lineto stroke [ 0.431834 0.431834] 0 setdash -5.470011 0.000000 moveto 0.000000 -8.504569 lineto stroke [] 0 setdash -5.470011 0.000000 moveto -6.564013 0.000000 lineto stroke 3.290667 0.000000 moveto 1.421895 -1.121263 lineto 0.000000 -4.676000 moveto 0.000000 -8.504569 lineto stroke [ 0.431834 0.431834] 0 setdash 0.000000 -8.504569 moveto 5.470011 0.000000 lineto stroke [] 0 setdash 0.000000 -8.504569 moveto 0.000000 -10.205482 lineto stroke 1.421895 -1.121263 moveto 0.000000 -0.173333 lineto 0.000000 -4.676000 moveto 1.421895 -1.121263 lineto -1.421895 -1.121263 moveto 0.000000 -0.173333 lineto 0.000000 -0.173333 moveto 0.000000 0.173333 lineto 0.000000 0.173333 moveto -1.421895 1.121263 lineto 3.290667 0.000000 moveto 1.421895 1.121263 lineto 1.421895 1.121263 moveto 0.000000 4.676000 lineto 0.000000 0.173333 moveto 1.421895 1.121263 lineto -3.290667 0.000000 moveto -1.421895 1.121263 lineto -1.421895 1.121263 moveto 0.000000 4.676000 lineto 0.000000 4.676000 moveto 0.000000 8.504569 lineto stroke [ 0.431834 0.431834] 0 setdash 0.000000 8.504569 moveto -5.470011 0.000000 lineto stroke [] 0 setdash 0.000000 8.504569 moveto 0.000000 10.205482 lineto stroke 3.290667 0.000000 moveto 5.470011 0.000000 lineto stroke [ 0.431834 0.431834] 0 setdash 5.470011 0.000000 moveto 0.000000 8.504569 lineto stroke [] 0 setdash 5.470011 0.000000 moveto 6.455517 0.000000 lineto stroke stroke grestore /Helvetica findfont 1.079585 scalefont setfont 0.431834 setlinewidth 1 setlinecap -2.036514 -2.860366 moveto -2.036514 -2.860366 lineto ( 1) show 2.036514 -2.860366 moveto 2.036514 -2.860366 lineto ( 2) show 0.000000 -1.772965 moveto 0.000000 -1.772965 lineto ( 3) show -1.226891 0.000000 moveto -1.226891 0.000000 lineto ( 4) show 1.226891 0.000000 moveto 1.226891 0.000000 lineto ( 5) show 0.000000 1.772965 moveto 0.000000 1.772965 lineto ( 6) show -2.036514 2.860366 moveto -2.036514 2.860366 lineto ( 7) show 2.036514 2.860366 moveto 2.036514 2.860366 lineto ( 8) show stroke /Helvetica findfont 1.727335 scalefont setfont () stringwidth pop 2 div neg 0.000000 add 15.387488 moveto () show -6.564013 -15.603405 moveto (Window: WX1 = -.656E+01, WX2 = 0.656E+01) show (Window: ) stringwidth pop -6.564013 add -19.058076 moveto ( WY1 = -.102E+02, WY2 = 0.102E+02) show stroke showpage %%EOF  SHAR_EOF fi # end of overwriting check if test -f 'res' then echo shar: will not over-write existing file "'res'" else cat << "SHAR_EOF" > 'res' Number of boundary edge deletions: ND = 0 Scale factor for quadratic term: EPS = 0.865D+00 Min. distance node to cell boundary: DMIN = 0.537D-01 1600 -0.100000000000000E+01 -0.100000000000000E+01 0.200000000000000E+01 -0.948717948717949E+00 -0.100000000000000E+01 0.189783809135176E+01 -0.897435897435897E+00 -0.100000000000000E+01 0.180022563546293E+01 -0.846153846153846E+00 -0.100000000000000E+01 0.170716263233351E+01 -0.794871794871795E+00 -0.100000000000000E+01 0.161864908196349E+01 -0.743589743589744E+00 -0.100000000000000E+01 0.153468498435289E+01 -0.692307692307692E+00 -0.100000000000000E+01 0.145527033950169E+01 -0.641025641025641E+00 -0.100000000000000E+01 0.138040514740989E+01 -0.589743589743590E+00 -0.100000000000000E+01 0.131008940807751E+01 -0.538461538461539E+00 -0.100000000000000E+01 0.124498771030370E+01 -0.487179487179487E+00 -0.100000000000000E+01 0.118709592731142E+01 -0.435897435897436E+00 -0.100000000000000E+01 0.114217396163629E+01 -0.384615384615385E+00 -0.100000000000000E+01 0.110513367671179E+01 -0.333333333333333E+00 -0.100000000000000E+01 0.107328750739594E+01 -0.282051282051282E+00 -0.100000000000000E+01 0.104599079083950E+01 -0.230769230769231E+00 -0.100000000000000E+01 0.102324352704246E+01 -0.179487179487180E+00 -0.100000000000000E+01 0.100504571600483E+01 -0.128205128205128E+00 -0.100000000000000E+01 0.991397357726606E+00 -0.769230769230770E-01 -0.100000000000000E+01 0.982298452207791E+00 -0.256410256410257E-01 -0.100000000000000E+01 0.977748999448383E+00 0.256410256410255E-01 -0.100000000000000E+01 0.977748999448383E+00 0.769230769230769E-01 -0.100000000000000E+01 0.982298452207791E+00 0.128205128205128E+00 -0.100000000000000E+01 0.991397357726606E+00 0.179487179487180E+00 -0.100000000000000E+01 0.100504571600483E+01 0.230769230769231E+00 -0.100000000000000E+01 0.102324352704246E+01 0.282051282051282E+00 -0.100000000000000E+01 0.104599079083950E+01 0.333333333333333E+00 -0.100000000000000E+01 0.107328750739594E+01 0.384615384615385E+00 -0.100000000000000E+01 0.110513367671179E+01 0.435897435897436E+00 -0.100000000000000E+01 0.114217396163629E+01 0.487179487179487E+00 -0.100000000000000E+01 0.118709592731142E+01 0.538461538461538E+00 -0.100000000000000E+01 0.124498771030370E+01 0.589743589743590E+00 -0.100000000000000E+01 0.131008940807751E+01 0.641025641025641E+00 -0.100000000000000E+01 0.138040514740989E+01 0.692307692307692E+00 -0.100000000000000E+01 0.145527033950169E+01 0.743589743589744E+00 -0.100000000000000E+01 0.153468498435289E+01 0.794871794871795E+00 -0.100000000000000E+01 0.161864908196349E+01 0.846153846153846E+00 -0.100000000000000E+01 0.170716263233351E+01 0.897435897435897E+00 -0.100000000000000E+01 0.180022563546293E+01 0.948717948717949E+00 -0.100000000000000E+01 0.189783809135176E+01 0.100000000000000E+01 -0.100000000000000E+01 0.200000000000000E+01 -0.100000000000000E+01 -0.948717948717949E+00 0.186344865502907E+01 -0.948717948717949E+00 -0.948717948717949E+00 0.175727024113503E+01 -0.897435897435897E+00 -0.948717948717949E+00 0.165754319997262E+01 -0.846153846153846E+00 -0.948717948717949E+00 0.156365361037181E+01 -0.794871794871795E+00 -0.948717948717949E+00 0.147490700285212E+01 -0.743589743589744E+00 -0.948717948717949E+00 0.139027425528602E+01 -0.692307692307692E+00 -0.948717948717949E+00 0.131085961043482E+01 -0.641025641025641E+00 -0.948717948717949E+00 0.123599441834303E+01 -0.589743589743590E+00 -0.948717948717949E+00 0.116647363619207E+01 -0.538461538461539E+00 -0.948717948717949E+00 0.110630270073596E+01 -0.487179487179487E+00 -0.948717948717949E+00 0.105869278425277E+01 -0.435897435897436E+00 -0.948717948717949E+00 0.101739701609052E+01 -0.384615384615385E+00 -0.948717948717949E+00 0.981001394015262E+00 -0.333333333333333E+00 -0.948717948717949E+00 0.949155224699409E+00 -0.282051282051282E+00 -0.948717948717949E+00 0.921858508142965E+00 -0.230769230769231E+00 -0.948717948717949E+00 0.899111244345927E+00 -0.179487179487180E+00 -0.948717948717949E+00 0.880913433308297E+00 -0.128205128205128E+00 -0.948717948717949E+00 0.867265075030074E+00 -0.769230769230770E-01 -0.948717948717949E+00 0.858166169511259E+00 -0.256410256410257E-01 -0.948717948717949E+00 0.853616716751852E+00 0.256410256410255E-01 -0.948717948717949E+00 0.853616716751852E+00 0.769230769230769E-01 -0.948717948717949E+00 0.858166169511259E+00 0.128205128205128E+00 -0.948717948717949E+00 0.867265075030074E+00 0.179487179487180E+00 -0.948717948717949E+00 0.880913433308297E+00 0.230769230769231E+00 -0.948717948717949E+00 0.899111244345927E+00 0.282051282051282E+00 -0.948717948717949E+00 0.921858508142964E+00 0.333333333333333E+00 -0.948717948717949E+00 0.949155224699409E+00 0.384615384615385E+00 -0.948717948717949E+00 0.981001394015262E+00 0.435897435897436E+00 -0.948717948717949E+00 0.101739701609052E+01 0.487179487179487E+00 -0.948717948717949E+00 0.105869278425277E+01 0.538461538461538E+00 -0.948717948717949E+00 0.110630270073596E+01 0.589743589743590E+00 -0.948717948717949E+00 0.116647363619207E+01 0.641025641025641E+00 -0.948717948717949E+00 0.123599441834303E+01 0.692307692307692E+00 -0.948717948717949E+00 0.131085961043482E+01 0.743589743589744E+00 -0.948717948717949E+00 0.139027425528602E+01 0.794871794871795E+00 -0.948717948717949E+00 0.147490700285212E+01 0.846153846153846E+00 -0.948717948717949E+00 0.156365361037181E+01 0.897435897435897E+00 -0.948717948717949E+00 0.165754319997262E+01 0.948717948717949E+00 -0.948717948717949E+00 0.175727024113503E+01 0.100000000000000E+01 -0.948717948717949E+00 0.186344865502907E+01 -0.100000000000000E+01 -0.897435897435897E+00 0.177068302001030E+01 -0.948717948717949E+00 -0.897435897435897E+00 0.165676988276991E+01 -0.897435897435897E+00 -0.897435897435897E+00 0.154787330609002E+01 -0.846153846153846E+00 -0.897435897435897E+00 0.144457528396239E+01 -0.794871794871795E+00 -0.897435897435897E+00 0.134761592868233E+01 -0.743589743589744E+00 -0.897435897435897E+00 0.125742653786910E+01 -0.692307692307692E+00 -0.897435897435897E+00 0.117409408179471E+01 -0.641025641025641E+00 -0.897435897435897E+00 0.109803771796443E+01 -0.589743589743590E+00 -0.897435897435897E+00 0.103537280861387E+01 -0.538461538461539E+00 -0.897435897435897E+00 0.984417586274985E+00 -0.487179487179487E+00 -0.897435897435897E+00 0.938759260988066E+00 -0.435897435897436E+00 -0.897435897435897E+00 0.897814186153399E+00 -0.384615384615385E+00 -0.897435897435897E+00 0.861418564078138E+00 -0.333333333333333E+00 -0.897435897435897E+00 0.829572394762286E+00 -0.282051282051282E+00 -0.897435897435897E+00 0.802275678205841E+00 -0.230769230769231E+00 -0.897435897435897E+00 0.779528414408803E+00 -0.179487179487180E+00 -0.897435897435897E+00 0.761330603371173E+00 -0.128205128205128E+00 -0.897435897435897E+00 0.747682245092951E+00 -0.769230769230770E-01 -0.897435897435897E+00 0.738583339574136E+00 -0.256410256410257E-01 -0.897435897435897E+00 0.734033886814728E+00 0.256410256410255E-01 -0.897435897435897E+00 0.734033886814728E+00 0.769230769230769E-01 -0.897435897435897E+00 0.738583339574136E+00 0.128205128205128E+00 -0.897435897435897E+00 0.747682245092951E+00 0.179487179487180E+00 -0.897435897435897E+00 0.761330603371173E+00 0.230769230769231E+00 -0.897435897435897E+00 0.779528414408803E+00 0.282051282051282E+00 -0.897435897435897E+00 0.802275678205841E+00 0.333333333333333E+00 -0.897435897435897E+00 0.829572394762286E+00 0.384615384615385E+00 -0.897435897435897E+00 0.861418564078138E+00 0.435897435897436E+00 -0.897435897435897E+00 0.897814186153399E+00 0.487179487179487E+00 -0.897435897435897E+00 0.938759260988066E+00 0.538461538461538E+00 -0.897435897435897E+00 0.984417586274985E+00 0.589743589743590E+00 -0.897435897435897E+00 0.103537280861387E+01 0.641025641025641E+00 -0.897435897435897E+00 0.109803771796443E+01 0.692307692307692E+00 -0.897435897435897E+00 0.117409408179471E+01 0.743589743589744E+00 -0.897435897435897E+00 0.125742653786910E+01 0.794871794871795E+00 -0.897435897435897E+00 0.134761592868233E+01 0.846153846153846E+00 -0.897435897435897E+00 0.144457528396239E+01 0.897435897435897E+00 -0.897435897435897E+00 0.154787330609002E+01 0.948717948717949E+00 -0.897435897435897E+00 0.165676988276991E+01 0.100000000000000E+01 -0.897435897435897E+00 0.177068302001030E+01 -0.100000000000000E+01 -0.846153846153846E+00 0.169241628783410E+01 -0.948717948717949E+00 -0.846153846153846E+00 0.157854491805334E+01 -0.897435897435897E+00 -0.846153846153846E+00 0.146922300103199E+01 -0.846153846153846E+00 -0.846153846153846E+00 0.136445053677005E+01 -0.794871794871795E+00 -0.846153846153846E+00 0.126422752526751E+01 -0.743589743589744E+00 -0.846153846153846E+00 0.116887230389915E+01 -0.692307692307692E+00 -0.846153846153846E+00 0.107771641202966E+01 -0.641025641025641E+00 -0.846153846153846E+00 0.992409805869940E+00 -0.589743589743590E+00 -0.846153846153846E+00 0.922106057487607E+00 -0.538461538461539E+00 -0.846153846153846E+00 0.869232170940707E+00 -0.487179487179487E+00 -0.846153846153846E+00 0.823725883810350E+00 -0.435897435897436E+00 -0.846153846153846E+00 0.782780808975682E+00 -0.384615384615385E+00 -0.846153846153846E+00 0.746385186900422E+00 -0.333333333333333E+00 -0.846153846153846E+00 0.714539017584570E+00 -0.282051282051282E+00 -0.846153846153846E+00 0.687242301028124E+00 -0.230769230769231E+00 -0.846153846153846E+00 0.664495037231087E+00 -0.179487179487180E+00 -0.846153846153846E+00 0.646297226193457E+00 -0.128205128205128E+00 -0.846153846153846E+00 0.632648867915234E+00 -0.769230769230770E-01 -0.846153846153846E+00 0.623549962396419E+00 -0.256410256410257E-01 -0.846153846153846E+00 0.619000509637012E+00 0.256410256410255E-01 -0.846153846153846E+00 0.619000509637012E+00 0.769230769230769E-01 -0.846153846153846E+00 0.623549962396419E+00 0.128205128205128E+00 -0.846153846153846E+00 0.632648867915234E+00 0.179487179487180E+00 -0.846153846153846E+00 0.646297226193457E+00 0.230769230769231E+00 -0.846153846153846E+00 0.664495037231087E+00 0.282051282051282E+00 -0.846153846153846E+00 0.687242301028124E+00 0.333333333333333E+00 -0.846153846153846E+00 0.714539017584569E+00 0.384615384615385E+00 -0.846153846153846E+00 0.746385186900422E+00 0.435897435897436E+00 -0.846153846153846E+00 0.782780808975682E+00 0.487179487179487E+00 -0.846153846153846E+00 0.823725883810350E+00 0.538461538461538E+00 -0.846153846153846E+00 0.869232170940707E+00 0.589743589743590E+00 -0.846153846153846E+00 0.922106057487607E+00 0.641025641025641E+00 -0.846153846153846E+00 0.992409805869940E+00 0.692307692307692E+00 -0.846153846153846E+00 0.107771641202966E+01 0.743589743589744E+00 -0.846153846153846E+00 0.116887230389915E+01 0.794871794871795E+00 -0.846153846153846E+00 0.126422752526751E+01 0.846153846153846E+00 -0.846153846153846E+00 0.136445053677005E+01 0.897435897435897E+00 -0.846153846153846E+00 0.146922300103199E+01 0.948717948717949E+00 -0.846153846153846E+00 0.157854491805334E+01 0.100000000000000E+01 -0.846153846153846E+00 0.169241628783410E+01 -0.100000000000000E+01 -0.794871794871795E+00 0.161962504368358E+01 -0.948717948717949E+00 -0.794871794871795E+00 0.150575367390282E+01 -0.897435897435897E+00 -0.794871794871795E+00 0.139643175688147E+01 -0.846153846153846E+00 -0.794871794871795E+00 0.129165929261953E+01 -0.794871794871795E+00 -0.794871794871795E+00 0.119143628111699E+01 -0.743589743589744E+00 -0.794871794871795E+00 0.109576272237387E+01 -0.692307692307692E+00 -0.794871794871795E+00 0.100463861639015E+01 -0.641025641025641E+00 -0.794871794871795E+00 0.918063963165833E+00 -0.589743589743590E+00 -0.794871794871795E+00 0.836264005765522E+00 -0.538461538461539E+00 -0.794871794871795E+00 0.765365429768427E+00 -0.487179487179487E+00 -0.794871794871795E+00 0.713328774835341E+00 -0.435897435897436E+00 -0.794871794871795E+00 0.672296884557373E+00 -0.384615384615385E+00 -0.794871794871795E+00 0.635901262482113E+00 -0.333333333333333E+00 -0.794871794871795E+00 0.604055093166261E+00 -0.282051282051282E+00 -0.794871794871795E+00 0.576758376609816E+00 -0.230769230769231E+00 -0.794871794871795E+00 0.554011112812778E+00 -0.179487179487180E+00 -0.794871794871795E+00 0.535813301775148E+00 -0.128205128205128E+00 -0.794871794871795E+00 0.522164943496926E+00 -0.769230769230770E-01 -0.794871794871795E+00 0.513066037978111E+00 -0.256410256410257E-01 -0.794871794871795E+00 0.508516585218703E+00 0.256410256410255E-01 -0.794871794871795E+00 0.508516585218703E+00 0.769230769230769E-01 -0.794871794871795E+00 0.513066037978111E+00 0.128205128205128E+00 -0.794871794871795E+00 0.522164943496926E+00 0.179487179487180E+00 -0.794871794871795E+00 0.535813301775148E+00 0.230769230769231E+00 -0.794871794871795E+00 0.554011112812778E+00 0.282051282051282E+00 -0.794871794871795E+00 0.576758376609816E+00 0.333333333333333E+00 -0.794871794871795E+00 0.604055093166261E+00 0.384615384615385E+00 -0.794871794871795E+00 0.635901262482113E+00 0.435897435897436E+00 -0.794871794871795E+00 0.672296884557373E+00 0.487179487179487E+00 -0.794871794871795E+00 0.713328774835341E+00 0.538461538461538E+00 -0.794871794871795E+00 0.765365429768427E+00 0.589743589743590E+00 -0.794871794871795E+00 0.836264005765522E+00 0.641025641025641E+00 -0.794871794871795E+00 0.918063963165833E+00 0.692307692307692E+00 -0.794871794871795E+00 0.100463861639015E+01 0.743589743589744E+00 -0.794871794871795E+00 0.109576272237387E+01 0.794871794871795E+00 -0.794871794871795E+00 0.119143628111699E+01 0.846153846153846E+00 -0.794871794871795E+00 0.129165929261953E+01 0.897435897435897E+00 -0.794871794871795E+00 0.139643175688147E+01 0.948717948717949E+00 -0.794871794871795E+00 0.150575367390282E+01 0.100000000000000E+01 -0.794871794871795E+00 0.161962504368358E+01 -0.100000000000000E+01 -0.743589743589744E+00 0.155138325229247E+01 -0.948717948717949E+00 -0.743589743589744E+00 0.143751188251171E+01 -0.897435897435897E+00 -0.743589743589744E+00 0.132818996549036E+01 -0.846153846153846E+00 -0.743589743589744E+00 0.122341750122842E+01 -0.794871794871795E+00 -0.743589743589744E+00 0.112319448972588E+01 -0.743589743589744E+00 -0.743589743589744E+00 0.102752093098275E+01 -0.692307692307692E+00 -0.743589743589744E+00 0.936396824999033E+00 -0.641025641025641E+00 -0.743589743589744E+00 0.849822171774721E+00 -0.589743589743590E+00 -0.743589743589744E+00 0.767796971309816E+00 -0.538461538461539E+00 -0.743589743589744E+00 0.690168382382113E+00 -0.487179487179487E+00 -0.743589743589744E+00 0.620045800451552E+00 -0.435897435897436E+00 -0.743589743589744E+00 0.567343180849449E+00 -0.384615384615385E+00 -0.743589743589744E+00 0.529628966518923E+00 -0.333333333333333E+00 -0.743589743589744E+00 0.498120621507359E+00 -0.282051282051282E+00 -0.743589743589744E+00 0.470823904950914E+00 -0.230769230769231E+00 -0.743589743589744E+00 0.448076641153877E+00 -0.179487179487180E+00 -0.743589743589744E+00 0.429878830116247E+00 -0.128205128205128E+00 -0.743589743589744E+00 0.416230471838024E+00 -0.769230769230770E-01 -0.743589743589744E+00 0.407131566319209E+00 -0.256410256410257E-01 -0.743589743589744E+00 0.402582113559802E+00 0.256410256410255E-01 -0.743589743589744E+00 0.402582113559802E+00 0.769230769230769E-01 -0.743589743589744E+00 0.407131566319209E+00 0.128205128205128E+00 -0.743589743589744E+00 0.416230471838024E+00 0.179487179487180E+00 -0.743589743589744E+00 0.429878830116247E+00 0.230769230769231E+00 -0.743589743589744E+00 0.448076641153877E+00 0.282051282051282E+00 -0.743589743589744E+00 0.470823904950914E+00 0.333333333333333E+00 -0.743589743589744E+00 0.498120621507359E+00 0.384615384615385E+00 -0.743589743589744E+00 0.529628966518923E+00 0.435897435897436E+00 -0.743589743589744E+00 0.567343180849449E+00 0.487179487179487E+00 -0.743589743589744E+00 0.620045800451552E+00 0.538461538461538E+00 -0.743589743589744E+00 0.690168382382112E+00 0.589743589743590E+00 -0.743589743589744E+00 0.767796971309815E+00 0.641025641025641E+00 -0.743589743589744E+00 0.849822171774721E+00 0.692307692307692E+00 -0.743589743589744E+00 0.936396824999033E+00 0.743589743589744E+00 -0.743589743589744E+00 0.102752093098275E+01 0.794871794871795E+00 -0.743589743589744E+00 0.112319448972588E+01 0.846153846153846E+00 -0.743589743589744E+00 0.122341750122842E+01 0.897435897435897E+00 -0.743589743589744E+00 0.132818996549036E+01 0.948717948717949E+00 -0.743589743589744E+00 0.143751188251171E+01 0.100000000000000E+01 -0.743589743589744E+00 0.155138325229247E+01 -0.100000000000000E+01 -0.692307692307692E+00 0.148769091366076E+01 -0.948717948717949E+00 -0.692307692307692E+00 0.137381954388000E+01 -0.897435897435897E+00 -0.692307692307692E+00 0.126449762685865E+01 -0.846153846153846E+00 -0.692307692307692E+00 0.115972516259671E+01 -0.794871794871795E+00 -0.692307692307692E+00 0.105950215109418E+01 -0.743589743589744E+00 -0.692307692307692E+00 0.963828592351048E+00 -0.692307692307692E+00 -0.692307692307692E+00 0.872704486367328E+00 -0.641025641025641E+00 -0.692307692307692E+00 0.786129833143015E+00 -0.589743589743590E+00 -0.692307692307692E+00 0.704104632678110E+00 -0.538461538461539E+00 -0.692307692307692E+00 0.626628884972613E+00 -0.487179487179487E+00 -0.692307692307692E+00 0.553409154236310E+00 -0.435897435897436E+00 -0.692307692307692E+00 0.485781799882419E+00 -0.384615384615385E+00 -0.692307692307692E+00 0.431975135475335E+00 -0.333333333333333E+00 -0.692307692307692E+00 0.396278958169219E+00 -0.282051282051282E+00 -0.692307692307692E+00 0.369438886051420E+00 -0.230769230769231E+00 -0.692307692307692E+00 0.346691622254383E+00 -0.179487179487180E+00 -0.692307692307692E+00 0.328493811216753E+00 -0.128205128205128E+00 -0.692307692307692E+00 0.314845452938530E+00 -0.769230769230770E-01 -0.692307692307692E+00 0.305746547419715E+00 -0.256410256410257E-01 -0.692307692307692E+00 0.301197094660308E+00 0.256410256410255E-01 -0.692307692307692E+00 0.301197094660308E+00 0.769230769230769E-01 -0.692307692307692E+00 0.305746547419715E+00 0.128205128205128E+00 -0.692307692307692E+00 0.314845452938530E+00 0.179487179487180E+00 -0.692307692307692E+00 0.328493811216753E+00 0.230769230769231E+00 -0.692307692307692E+00 0.346691622254383E+00 0.282051282051282E+00 -0.692307692307692E+00 0.369438886051420E+00 0.333333333333333E+00 -0.692307692307692E+00 0.396278958169219E+00 0.384615384615385E+00 -0.692307692307692E+00 0.431975135475335E+00 0.435897435897436E+00 -0.692307692307692E+00 0.485781799882419E+00 0.487179487179487E+00 -0.692307692307692E+00 0.553409154236310E+00 0.538461538461538E+00 -0.692307692307692E+00 0.626628884972612E+00 0.589743589743590E+00 -0.692307692307692E+00 0.704104632678110E+00 0.641025641025641E+00 -0.692307692307692E+00 0.786129833143015E+00 0.692307692307692E+00 -0.692307692307692E+00 0.872704486367328E+00 0.743589743589744E+00 -0.692307692307692E+00 0.963828592351048E+00 0.794871794871795E+00 -0.692307692307692E+00 0.105950215109418E+01 0.846153846153846E+00 -0.692307692307692E+00 0.115972516259671E+01 0.897435897435897E+00 -0.692307692307692E+00 0.126449762685865E+01 0.948717948717949E+00 -0.692307692307692E+00 0.137381954388000E+01 0.100000000000000E+01 -0.692307692307692E+00 0.148769091366076E+01 -0.100000000000000E+01 -0.641025641025641E+00 0.142854802778846E+01 -0.948717948717949E+00 -0.641025641025641E+00 0.131467665800771E+01 -0.897435897435897E+00 -0.641025641025641E+00 0.120535474098636E+01 -0.846153846153846E+00 -0.641025641025641E+00 0.110058227672441E+01 -0.794871794871795E+00 -0.641025641025641E+00 0.100035926522188E+01 -0.743589743589744E+00 -0.641025641025641E+00 0.904685706478751E+00 -0.692307692307692E+00 -0.641025641025641E+00 0.813561600495030E+00 -0.641025641025641E+00 -0.641025641025641E+00 0.726986947270718E+00 -0.589743589743590E+00 -0.641025641025641E+00 0.644961746805813E+00 -0.538461538461539E+00 -0.641025641025641E+00 0.567485999100315E+00 -0.487179487179487E+00 -0.641025641025641E+00 0.494559704154225E+00 -0.435897435897436E+00 -0.641025641025641E+00 0.426182861967542E+00 -0.384615384615385E+00 -0.641025641025641E+00 0.361960907342905E+00 -0.333333333333333E+00 -0.641025641025641E+00 0.307855087598779E+00 -0.282051282051282E+00 -0.641025641025641E+00 0.272411758173098E+00 -0.230769230769231E+00 -0.641025641025641E+00 0.249856056114297E+00 -0.179487179487180E+00 -0.641025641025641E+00 0.231658245076666E+00 -0.128205128205128E+00 -0.641025641025641E+00 0.218009886798444E+00 -0.769230769230770E-01 -0.641025641025641E+00 0.208910981279629E+00 -0.256410256410257E-01 -0.641025641025641E+00 0.204361528520221E+00 0.256410256410255E-01 -0.641025641025641E+00 0.204361528520221E+00 0.769230769230769E-01 -0.641025641025641E+00 0.208910981279629E+00 0.128205128205128E+00 -0.641025641025641E+00 0.218009886798444E+00 0.179487179487180E+00 -0.641025641025641E+00 0.231658245076666E+00 0.230769230769231E+00 -0.641025641025641E+00 0.249856056114297E+00 0.282051282051282E+00 -0.641025641025641E+00 0.272411758173098E+00 0.333333333333333E+00 -0.641025641025641E+00 0.307855087598778E+00 0.384615384615385E+00 -0.641025641025641E+00 0.361960907342905E+00 0.435897435897436E+00 -0.641025641025641E+00 0.426182861967542E+00 0.487179487179487E+00 -0.641025641025641E+00 0.494559704154225E+00 0.538461538461538E+00 -0.641025641025641E+00 0.567485999100315E+00 0.589743589743590E+00 -0.641025641025641E+00 0.644961746805812E+00 0.641025641025641E+00 -0.641025641025641E+00 0.726986947270718E+00 0.692307692307692E+00 -0.641025641025641E+00 0.813561600495030E+00 0.743589743589744E+00 -0.641025641025641E+00 0.904685706478751E+00 0.794871794871795E+00 -0.641025641025641E+00 0.100035926522188E+01 0.846153846153846E+00 -0.641025641025641E+00 0.110058227672441E+01 0.897435897435897E+00 -0.641025641025641E+00 0.120535474098636E+01 0.948717948717949E+00 -0.641025641025641E+00 0.131467665800771E+01 0.100000000000000E+01 -0.641025641025641E+00 0.142854802778846E+01 -0.100000000000000E+01 -0.589743589743590E+00 0.137395459467557E+01 -0.948717948717949E+00 -0.589743589743590E+00 0.126008322489482E+01 -0.897435897435897E+00 -0.589743589743590E+00 0.115076130787347E+01 -0.846153846153846E+00 -0.589743589743590E+00 0.104598884361152E+01 -0.794871794871795E+00 -0.589743589743590E+00 0.945765832108988E+00 -0.743589743589744E+00 -0.589743589743590E+00 0.850092273365861E+00 -0.692307692307692E+00 -0.589743589743590E+00 0.758968167382140E+00 -0.641025641025641E+00 -0.589743589743590E+00 0.672393514157828E+00 -0.589743589743590E+00 -0.589743589743590E+00 0.590368313692923E+00 -0.538461538461539E+00 -0.589743589743590E+00 0.512892565987425E+00 -0.487179487179487E+00 -0.589743589743590E+00 0.439966271041335E+00 -0.435897435897436E+00 -0.589743589743590E+00 0.371589428854652E+00 -0.384615384615385E+00 -0.589743589743590E+00 0.307762039427377E+00 -0.333333333333333E+00 -0.589743589743590E+00 0.247829867884073E+00 -0.282051282051282E+00 -0.589743589743590E+00 0.195052802680826E+00 -0.230769230769231E+00 -0.589743589743590E+00 0.158680890736555E+00 -0.179487179487180E+00 -0.589743589743590E+00 0.138536019907117E+00 -0.128205128205128E+00 -0.589743589743590E+00 0.125723773417765E+00 -0.769230769230770E-01 -0.589743589743590E+00 0.116624867898950E+00 -0.256410256410257E-01 -0.589743589743590E+00 0.112075415139543E+00 0.256410256410255E-01 -0.589743589743590E+00 0.112075415139543E+00 0.769230769230769E-01 -0.589743589743590E+00 0.116624867898950E+00 0.128205128205128E+00 -0.589743589743590E+00 0.125723773417765E+00 0.179487179487180E+00 -0.589743589743590E+00 0.138536019907117E+00 0.230769230769231E+00 -0.589743589743590E+00 0.158680890736555E+00 0.282051282051282E+00 -0.589743589743590E+00 0.195052802680826E+00 0.333333333333333E+00 -0.589743589743590E+00 0.247829867884073E+00 0.384615384615385E+00 -0.589743589743590E+00 0.307762039427377E+00 0.435897435897436E+00 -0.589743589743590E+00 0.371589428854652E+00 0.487179487179487E+00 -0.589743589743590E+00 0.439966271041335E+00 0.538461538461538E+00 -0.589743589743590E+00 0.512892565987425E+00 0.589743589743590E+00 -0.589743589743590E+00 0.590368313692922E+00 0.641025641025641E+00 -0.589743589743590E+00 0.672393514157827E+00 0.692307692307692E+00 -0.589743589743590E+00 0.758968167382140E+00 0.743589743589744E+00 -0.589743589743590E+00 0.850092273365861E+00 0.794871794871795E+00 -0.589743589743590E+00 0.945765832108988E+00 0.846153846153846E+00 -0.589743589743590E+00 0.104598884361152E+01 0.897435897435897E+00 -0.589743589743590E+00 0.115076130787347E+01 0.948717948717949E+00 -0.589743589743590E+00 0.126008322489482E+01 0.100000000000000E+01 -0.589743589743590E+00 0.137395459467557E+01 -0.100000000000000E+01 -0.538461538461539E+00 0.132391061432209E+01 -0.948717948717949E+00 -0.538461538461539E+00 0.121003924454133E+01 -0.897435897435897E+00 -0.538461538461539E+00 0.110071732751998E+01 -0.846153846153846E+00 -0.538461538461539E+00 0.995944863258041E+00 -0.794871794871795E+00 -0.538461538461539E+00 0.895721851755506E+00 -0.743589743589744E+00 -0.538461538461539E+00 0.800048293012378E+00 -0.692307692307692E+00 -0.538461538461539E+00 0.708924187028658E+00 -0.641025641025641E+00 -0.538461538461539E+00 0.622349533804345E+00 -0.589743589743590E+00 -0.538461538461539E+00 0.540324333339440E+00 -0.538461538461539E+00 -0.538461538461539E+00 0.462848585633942E+00 -0.487179487179487E+00 -0.538461538461539E+00 0.389922290687852E+00 -0.435897435897436E+00 -0.538461538461539E+00 0.321545448501170E+00 -0.384615384615385E+00 -0.538461538461539E+00 0.257718059073894E+00 -0.333333333333333E+00 -0.538461538461539E+00 0.198440122406027E+00 -0.282051282051282E+00 -0.538461538461539E+00 0.143711638497567E+00 -0.230769230769231E+00 -0.538461538461539E+00 0.931583608199815E-01 -0.179487179487180E+00 -0.538461538461539E+00 0.558300955060633E-01 -0.128205128205128E+00 -0.538461538461539E+00 0.371045762966257E-01 -0.769230769230770E-01 -0.538461538461539E+00 0.288882072776792E-01 -0.256410256410257E-01 -0.538461538461539E+00 0.243387545182717E-01 0.256410256410255E-01 -0.538461538461539E+00 0.243387545182717E-01 0.769230769230769E-01 -0.538461538461539E+00 0.288882072776792E-01 0.128205128205128E+00 -0.538461538461539E+00 0.371045762966257E-01 0.179487179487180E+00 -0.538461538461539E+00 0.558300955060633E-01 0.230769230769231E+00 -0.538461538461539E+00 0.931583608199816E-01 0.282051282051282E+00 -0.538461538461539E+00 0.143711638497567E+00 0.333333333333333E+00 -0.538461538461539E+00 0.198440122406027E+00 0.384615384615385E+00 -0.538461538461539E+00 0.257718059073894E+00 0.435897435897436E+00 -0.538461538461539E+00 0.321545448501170E+00 0.487179487179487E+00 -0.538461538461539E+00 0.389922290687852E+00 0.538461538461538E+00 -0.538461538461539E+00 0.462848585633942E+00 0.589743589743590E+00 -0.538461538461539E+00 0.540324333339440E+00 0.641025641025641E+00 -0.538461538461539E+00 0.622349533804345E+00 0.692307692307692E+00 -0.538461538461539E+00 0.708924187028658E+00 0.743589743589744E+00 -0.538461538461539E+00 0.800048293012378E+00 0.794871794871795E+00 -0.538461538461539E+00 0.895721851755505E+00 0.846153846153846E+00 -0.538461538461539E+00 0.995944863258040E+00 0.897435897435897E+00 -0.538461538461539E+00 0.110071732751998E+01 0.948717948717949E+00 -0.538461538461539E+00 0.121003924454133E+01 0.100000000000000E+01 -0.538461538461539E+00 0.132391061432209E+01 -0.100000000000000E+01 -0.487179487179487E+00 0.127841608672802E+01 -0.948717948717949E+00 -0.487179487179487E+00 0.116454471694726E+01 -0.897435897435897E+00 -0.487179487179487E+00 0.105522279992591E+01 -0.846153846153846E+00 -0.487179487179487E+00 0.950450335663966E+00 -0.794871794871795E+00 -0.487179487179487E+00 0.850227324161430E+00 -0.743589743589744E+00 -0.487179487179487E+00 0.754553765418303E+00 -0.692307692307692E+00 -0.487179487179487E+00 0.663429659434583E+00 -0.641025641025641E+00 -0.487179487179487E+00 0.576855006210270E+00 -0.589743589743590E+00 -0.487179487179487E+00 0.494829805745365E+00 -0.538461538461539E+00 -0.487179487179487E+00 0.417354058039867E+00 -0.487179487179487E+00 -0.487179487179487E+00 0.344427763093777E+00 -0.435897435897436E+00 -0.487179487179487E+00 0.276050920907094E+00 -0.384615384615385E+00 -0.487179487179487E+00 0.212223531479819E+00 -0.333333333333333E+00 -0.487179487179487E+00 0.152945594811952E+00 -0.282051282051282E+00 -0.487179487179487E+00 0.982171109034915E-01 -0.230769230769231E+00 -0.487179487179487E+00 0.480380797544390E-01 -0.179487179487180E+00 -0.487179487179487E+00 0.144057018620015E-02 -0.128205128205128E+00 -0.487179487179487E+00 -0.357183521603745E-01 -0.769230769230770E-01 -0.487179487179487E+00 -0.546681235040287E-01 -0.256410256410257E-01 -0.487179487179487E+00 -0.600225060693017E-01 0.256410256410255E-01 -0.487179487179487E+00 -0.600225060693017E-01 0.769230769230769E-01 -0.487179487179487E+00 -0.546681235040287E-01 0.128205128205128E+00 -0.487179487179487E+00 -0.357183521603744E-01 0.179487179487180E+00 -0.487179487179487E+00 0.144057018620024E-02 0.230769230769231E+00 -0.487179487179487E+00 0.480380797544390E-01 0.282051282051282E+00 -0.487179487179487E+00 0.982171109034914E-01 0.333333333333333E+00 -0.487179487179487E+00 0.152945594811952E+00 0.384615384615385E+00 -0.487179487179487E+00 0.212223531479819E+00 0.435897435897436E+00 -0.487179487179487E+00 0.276050920907094E+00 0.487179487179487E+00 -0.487179487179487E+00 0.344427763093777E+00 0.538461538461538E+00 -0.487179487179487E+00 0.417354058039867E+00 0.589743589743590E+00 -0.487179487179487E+00 0.494829805745365E+00 0.641025641025641E+00 -0.487179487179487E+00 0.576855006210270E+00 0.692307692307692E+00 -0.487179487179487E+00 0.663429659434583E+00 0.743589743589744E+00 -0.487179487179487E+00 0.754553765418303E+00 0.794871794871795E+00 -0.487179487179487E+00 0.850227324161430E+00 0.846153846153846E+00 -0.487179487179487E+00 0.950450335663965E+00 0.897435897435897E+00 -0.487179487179487E+00 0.105522279992591E+01 0.948717948717949E+00 -0.487179487179487E+00 0.116454471694726E+01 0.100000000000000E+01 -0.487179487179487E+00 0.127841608672802E+01 -0.100000000000000E+01 -0.435897435897436E+00 0.123747101189335E+01 -0.948717948717949E+00 -0.435897435897436E+00 0.112359964211259E+01 -0.897435897435897E+00 -0.435897435897436E+00 0.101427772509124E+01 -0.846153846153846E+00 -0.435897435897436E+00 0.909505260829298E+00 -0.794871794871795E+00 -0.435897435897436E+00 0.809282249326763E+00 -0.743589743589744E+00 -0.435897435897436E+00 0.713608690583635E+00 -0.692307692307692E+00 -0.435897435897436E+00 0.622484584599915E+00 -0.641025641025641E+00 -0.435897435897436E+00 0.535909931375602E+00 -0.589743589743590E+00 -0.435897435897436E+00 0.453884730910697E+00 -0.538461538461539E+00 -0.435897435897436E+00 0.376408983205200E+00 -0.487179487179487E+00 -0.435897435897436E+00 0.303482688259109E+00 -0.435897435897436E+00 -0.435897435897436E+00 0.235105846072427E+00 -0.384615384615385E+00 -0.435897435897436E+00 0.171278456645152E+00 -0.333333333333333E+00 -0.435897435897436E+00 0.112000519977284E+00 -0.282051282051282E+00 -0.435897435897436E+00 0.572720360688239E-01 -0.230769230769231E+00 -0.435897435897436E+00 0.709300491977133E-02 -0.179487179487180E+00 -0.435897435897436E+00 -0.385365734698738E-01 -0.128205128205128E+00 -0.435897435897436E+00 -0.807611477337210E-01 -0.769230769230770E-01 -0.435897435897436E+00 -0.115999916502517E+00 -0.256410256410257E-01 -0.435897435897436E+00 -0.136032466385504E+00 0.256410256410255E-01 -0.435897435897436E+00 -0.136032466385504E+00 0.769230769230769E-01 -0.435897435897436E+00 -0.115999916502517E+00 0.128205128205128E+00 -0.435897435897436E+00 -0.807611477337210E-01 0.179487179487180E+00 -0.435897435897436E+00 -0.385365734698737E-01 0.230769230769231E+00 -0.435897435897436E+00 0.709300491977138E-02 0.282051282051282E+00 -0.435897435897436E+00 0.572720360688238E-01 0.333333333333333E+00 -0.435897435897436E+00 0.112000519977284E+00 0.384615384615385E+00 -0.435897435897436E+00 0.171278456645152E+00 0.435897435897436E+00 -0.435897435897436E+00 0.235105846072427E+00 0.487179487179487E+00 -0.435897435897436E+00 0.303482688259109E+00 0.538461538461538E+00 -0.435897435897436E+00 0.376408983205199E+00 0.589743589743590E+00 -0.435897435897436E+00 0.453884730910697E+00 0.641025641025641E+00 -0.435897435897436E+00 0.535909931375602E+00 0.692307692307692E+00 -0.435897435897436E+00 0.622484584599915E+00 0.743589743589744E+00 -0.435897435897436E+00 0.713608690583635E+00 0.794871794871795E+00 -0.435897435897436E+00 0.809282249326762E+00 0.846153846153846E+00 -0.435897435897436E+00 0.909505260829298E+00 0.897435897435897E+00 -0.435897435897436E+00 0.101427772509124E+01 0.948717948717949E+00 -0.435897435897436E+00 0.112359964211259E+01 0.100000000000000E+01 -0.435897435897436E+00 0.123747101189335E+01 -0.100000000000000E+01 -0.384615384615385E+00 0.120107538981809E+01 -0.948717948717949E+00 -0.384615384615385E+00 0.108720402003733E+01 -0.897435897435897E+00 -0.384615384615385E+00 0.977882103015981E+00 -0.846153846153846E+00 -0.384615384615385E+00 0.873109638754038E+00 -0.794871794871795E+00 -0.384615384615385E+00 0.772886627251503E+00 -0.743589743589744E+00 -0.384615384615385E+00 0.677213068508375E+00 -0.692307692307692E+00 -0.384615384615385E+00 0.586088962524655E+00 -0.641025641025641E+00 -0.384615384615385E+00 0.499514309300342E+00 -0.589743589743590E+00 -0.384615384615385E+00 0.417489108835437E+00 -0.538461538461539E+00 -0.384615384615385E+00 0.340013361129939E+00 -0.487179487179487E+00 -0.384615384615385E+00 0.267087066183849E+00 -0.435897435897436E+00 -0.384615384615385E+00 0.198710223997167E+00 -0.384615384615385E+00 -0.384615384615385E+00 0.134882834569891E+00 -0.333333333333333E+00 -0.384615384615385E+00 0.756048979020239E-01 -0.282051282051282E+00 -0.384615384615385E+00 0.208764139935637E-01 -0.230769230769231E+00 -0.384615384615385E+00 -0.293026171554888E-01 -0.179487179487180E+00 -0.384615384615385E+00 -0.749321955451339E-01 -0.128205128205128E+00 -0.384615384615385E+00 -0.116012321175371E+00 -0.769230769230770E-01 -0.384615384615385E+00 -0.152542994046201E+00 -0.256410256410257E-01 -0.384615384615385E+00 -0.185045590870964E+00 0.256410256410255E-01 -0.384615384615385E+00 -0.185045590870964E+00 0.769230769230769E-01 -0.384615384615385E+00 -0.152542994046201E+00 0.128205128205128E+00 -0.384615384615385E+00 -0.116012321175371E+00 0.179487179487180E+00 -0.384615384615385E+00 -0.749321955451338E-01 0.230769230769231E+00 -0.384615384615385E+00 -0.293026171554887E-01 0.282051282051282E+00 -0.384615384615385E+00 0.208764139935637E-01 0.333333333333333E+00 -0.384615384615385E+00 0.756048979020238E-01 0.384615384615385E+00 -0.384615384615385E+00 0.134882834569891E+00 0.435897435897436E+00 -0.384615384615385E+00 0.198710223997167E+00 0.487179487179487E+00 -0.384615384615385E+00 0.267087066183849E+00 0.538461538461538E+00 -0.384615384615385E+00 0.340013361129939E+00 0.589743589743590E+00 -0.384615384615385E+00 0.417489108835437E+00 0.641025641025641E+00 -0.384615384615385E+00 0.499514309300342E+00 0.692307692307692E+00 -0.384615384615385E+00 0.586088962524655E+00 0.743589743589744E+00 -0.384615384615385E+00 0.677213068508375E+00 0.794871794871795E+00 -0.384615384615385E+00 0.772886627251502E+00 0.846153846153846E+00 -0.384615384615385E+00 0.873109638754038E+00 0.897435897435897E+00 -0.384615384615385E+00 0.977882103015980E+00 0.948717948717949E+00 -0.384615384615385E+00 0.108720402003733E+01 0.100000000000000E+01 -0.384615384615385E+00 0.120107538981809E+01 -0.100000000000000E+01 -0.333333333333333E+00 0.116922922050224E+01 -0.948717948717949E+00 -0.333333333333333E+00 0.105535785072148E+01 -0.897435897435897E+00 -0.333333333333333E+00 0.946035933700128E+00 -0.846153846153846E+00 -0.333333333333333E+00 0.841263469438186E+00 -0.794871794871795E+00 -0.333333333333333E+00 0.741040457935650E+00 -0.743589743589744E+00 -0.333333333333333E+00 0.645366899192523E+00 -0.692307692307692E+00 -0.333333333333333E+00 0.554242793208802E+00 -0.641025641025641E+00 -0.333333333333333E+00 0.467668139984490E+00 -0.589743589743590E+00 -0.333333333333333E+00 0.385642939519585E+00 -0.538461538461539E+00 -0.333333333333333E+00 0.308167191814087E+00 -0.487179487179487E+00 -0.333333333333333E+00 0.235240896867997E+00 -0.435897435897436E+00 -0.333333333333333E+00 0.166864054681314E+00 -0.384615384615385E+00 -0.333333333333333E+00 0.103036665254039E+00 -0.333333333333333E+00 -0.333333333333333E+00 0.437587285861713E-01 -0.282051282051282E+00 -0.333333333333333E+00 -0.109697553222888E-01 -0.230769230769231E+00 -0.333333333333333E+00 -0.611487864713413E-01 -0.179487179487180E+00 -0.333333333333333E+00 -0.106778364860986E+00 -0.128205128205128E+00 -0.333333333333333E+00 -0.147858490491224E+00 -0.769230769230770E-01 -0.333333333333333E+00 -0.184389163362054E+00 -0.256410256410257E-01 -0.333333333333333E+00 -0.217089173051830E+00 0.256410256410255E-01 -0.333333333333333E+00 -0.217089173051830E+00 0.769230769230769E-01 -0.333333333333333E+00 -0.184389163362054E+00 0.128205128205128E+00 -0.333333333333333E+00 -0.147858490491224E+00 0.179487179487180E+00 -0.333333333333333E+00 -0.106778364860986E+00 0.230769230769231E+00 -0.333333333333333E+00 -0.611487864713413E-01 0.282051282051282E+00 -0.333333333333333E+00 -0.109697553222889E-01 0.333333333333333E+00 -0.333333333333333E+00 0.437587285861712E-01 0.384615384615385E+00 -0.333333333333333E+00 0.103036665254039E+00 0.435897435897436E+00 -0.333333333333333E+00 0.166864054681314E+00 0.487179487179487E+00 -0.333333333333333E+00 0.235240896867997E+00 0.538461538461538E+00 -0.333333333333333E+00 0.308167191814087E+00 0.589743589743590E+00 -0.333333333333333E+00 0.385642939519584E+00 0.641025641025641E+00 -0.333333333333333E+00 0.467668139984489E+00 0.692307692307692E+00 -0.333333333333333E+00 0.554242793208802E+00 0.743589743589744E+00 -0.333333333333333E+00 0.645366899192523E+00 0.794871794871795E+00 -0.333333333333333E+00 0.741040457935650E+00 0.846153846153846E+00 -0.333333333333333E+00 0.841263469438185E+00 0.897435897435897E+00 -0.333333333333333E+00 0.946035933700128E+00 0.948717948717949E+00 -0.333333333333333E+00 0.105535785072148E+01 0.100000000000000E+01 -0.333333333333333E+00 0.116922922050224E+01 -0.100000000000000E+01 -0.282051282051282E+00 0.114193250394579E+01 -0.948717948717949E+00 -0.282051282051282E+00 0.102806113416503E+01 -0.897435897435897E+00 -0.282051282051282E+00 0.918739217143683E+00 -0.846153846153846E+00 -0.282051282051282E+00 0.813966752881740E+00 -0.794871794871795E+00 -0.282051282051282E+00 0.713743741379205E+00 -0.743589743589744E+00 -0.282051282051282E+00 0.618070182636077E+00 -0.692307692307692E+00 -0.282051282051282E+00 0.526946076652357E+00 -0.641025641025641E+00 -0.282051282051282E+00 0.440371423428044E+00 -0.589743589743590E+00 -0.282051282051282E+00 0.358346222963139E+00 -0.538461538461539E+00 -0.282051282051282E+00 0.280870475257642E+00 -0.487179487179487E+00 -0.282051282051282E+00 0.207944180311552E+00 -0.435897435897436E+00 -0.282051282051282E+00 0.139567338124869E+00 -0.384615384615385E+00 -0.282051282051282E+00 0.757399486975938E-01 -0.333333333333333E+00 -0.282051282051282E+00 0.164620120297262E-01 -0.282051282051282E+00 -0.282051282051282E+00 -0.382664718787339E-01 -0.230769230769231E+00 -0.282051282051282E+00 -0.884455030277864E-01 -0.179487179487180E+00 -0.282051282051282E+00 -0.134075081417432E+00 -0.128205128205128E+00 -0.282051282051282E+00 -0.175155207047669E+00 -0.769230769230770E-01 -0.282051282051282E+00 -0.211685879918499E+00 -0.256410256410257E-01 -0.282051282051282E+00 -0.244385889608275E+00 0.256410256410255E-01 -0.282051282051282E+00 -0.244385889608275E+00 0.769230769230769E-01 -0.282051282051282E+00 -0.211685879918499E+00 0.128205128205128E+00 -0.282051282051282E+00 -0.175155207047669E+00 0.179487179487180E+00 -0.282051282051282E+00 -0.134075081417431E+00 0.230769230769231E+00 -0.282051282051282E+00 -0.884455030277864E-01 0.282051282051282E+00 -0.282051282051282E+00 -0.382664718787339E-01 0.333333333333333E+00 -0.282051282051282E+00 0.164620120297261E-01 0.384615384615385E+00 -0.282051282051282E+00 0.757399486975938E-01 0.435897435897436E+00 -0.282051282051282E+00 0.139567338124869E+00 0.487179487179487E+00 -0.282051282051282E+00 0.207944180311552E+00 0.538461538461538E+00 -0.282051282051282E+00 0.280870475257642E+00 0.589743589743590E+00 -0.282051282051282E+00 0.358346222963139E+00 0.641025641025641E+00 -0.282051282051282E+00 0.440371423428044E+00 0.692307692307692E+00 -0.282051282051282E+00 0.526946076652357E+00 0.743589743589744E+00 -0.282051282051282E+00 0.618070182636077E+00 0.794871794871795E+00 -0.282051282051282E+00 0.713743741379205E+00 0.846153846153846E+00 -0.282051282051282E+00 0.813966752881740E+00 0.897435897435897E+00 -0.282051282051282E+00 0.918739217143683E+00 0.948717948717949E+00 -0.282051282051282E+00 0.102806113416503E+01 0.100000000000000E+01 -0.282051282051282E+00 0.114193250394579E+01 -0.100000000000000E+01 -0.230769230769231E+00 0.111918524014875E+01 -0.948717948717949E+00 -0.230769230769231E+00 0.100531387036800E+01 -0.897435897435897E+00 -0.230769230769231E+00 0.895991953346646E+00 -0.846153846153846E+00 -0.230769230769231E+00 0.791219489084703E+00 -0.794871794871795E+00 -0.230769230769231E+00 0.690996477582168E+00 -0.743589743589744E+00 -0.230769230769231E+00 0.595322918839040E+00 -0.692307692307692E+00 -0.230769230769231E+00 0.504198812855320E+00 -0.641025641025641E+00 -0.230769230769231E+00 0.417624159631007E+00 -0.589743589743590E+00 -0.230769230769231E+00 0.335598959166102E+00 -0.538461538461539E+00 -0.230769230769231E+00 0.258123211460604E+00 -0.487179487179487E+00 -0.230769230769231E+00 0.185196916514514E+00 -0.435897435897436E+00 -0.230769230769231E+00 0.116820074327831E+00 -0.384615384615385E+00 -0.230769230769231E+00 0.529926849005563E-01 -0.333333333333333E+00 -0.230769230769231E+00 -0.628525176731129E-02 -0.282051282051282E+00 -0.230769230769231E+00 -0.610137356757714E-01 -0.230769230769231E+00 -0.230769230769231E+00 -0.111192766824824E+00 -0.179487179487180E+00 -0.230769230769231E+00 -0.156822345214469E+00 -0.128205128205128E+00 -0.230769230769231E+00 -0.197902470844707E+00 -0.769230769230770E-01 -0.230769230769231E+00 -0.234433143715537E+00 -0.256410256410257E-01 -0.230769230769231E+00 -0.267133153405313E+00 0.256410256410255E-01 -0.230769230769231E+00 -0.267133153405313E+00 0.769230769230769E-01 -0.230769230769231E+00 -0.234433143715537E+00 0.128205128205128E+00 -0.230769230769231E+00 -0.197902470844707E+00 0.179487179487180E+00 -0.230769230769231E+00 -0.156822345214469E+00 0.230769230769231E+00 -0.230769230769231E+00 -0.111192766824824E+00 0.282051282051282E+00 -0.230769230769231E+00 -0.610137356757715E-01 0.333333333333333E+00 -0.230769230769231E+00 -0.628525176731137E-02 0.384615384615385E+00 -0.230769230769231E+00 0.529926849005563E-01 0.435897435897436E+00 -0.230769230769231E+00 0.116820074327831E+00 0.487179487179487E+00 -0.230769230769231E+00 0.185196916514514E+00 0.538461538461538E+00 -0.230769230769231E+00 0.258123211460604E+00 0.589743589743590E+00 -0.230769230769231E+00 0.335598959166102E+00 0.641025641025641E+00 -0.230769230769231E+00 0.417624159631007E+00 0.692307692307692E+00 -0.230769230769231E+00 0.504198812855320E+00 0.743589743589744E+00 -0.230769230769231E+00 0.595322918839040E+00 0.794871794871795E+00 -0.230769230769231E+00 0.690996477582167E+00 0.846153846153846E+00 -0.230769230769231E+00 0.791219489084702E+00 0.897435897435897E+00 -0.230769230769231E+00 0.895991953346645E+00 0.948717948717949E+00 -0.230769230769231E+00 0.100531387036800E+01 0.100000000000000E+01 -0.230769230769231E+00 0.111918524014875E+01 -0.100000000000000E+01 -0.179487179487180E+00 0.110098742911112E+01 -0.948717948717949E+00 -0.179487179487180E+00 0.987116059330366E+00 -0.897435897435897E+00 -0.179487179487180E+00 0.877794142309015E+00 -0.846153846153846E+00 -0.179487179487180E+00 0.773021678047073E+00 -0.794871794871795E+00 -0.179487179487180E+00 0.672798666544538E+00 -0.743589743589744E+00 -0.179487179487180E+00 0.577125107801410E+00 -0.692307692307692E+00 -0.179487179487180E+00 0.486001001817690E+00 -0.641025641025641E+00 -0.179487179487180E+00 0.399426348593377E+00 -0.589743589743590E+00 -0.179487179487180E+00 0.317401148128472E+00 -0.538461538461539E+00 -0.179487179487180E+00 0.239925400422974E+00 -0.487179487179487E+00 -0.179487179487180E+00 0.166999105476884E+00 -0.435897435897436E+00 -0.179487179487180E+00 0.986222632902014E-01 -0.384615384615385E+00 -0.179487179487180E+00 0.347948738629262E-01 -0.333333333333333E+00 -0.179487179487180E+00 -0.244830628049413E-01 -0.282051282051282E+00 -0.179487179487180E+00 -0.792115467134015E-01 -0.230769230769231E+00 -0.179487179487180E+00 -0.129390577862454E+00 -0.179487179487180E+00 -0.179487179487180E+00 -0.175020156252099E+00 -0.128205128205128E+00 -0.179487179487180E+00 -0.216100281882337E+00 -0.769230769230770E-01 -0.179487179487180E+00 -0.252630954753167E+00 -0.256410256410257E-01 -0.179487179487180E+00 -0.285330964442943E+00 0.256410256410255E-01 -0.179487179487180E+00 -0.285330964442943E+00 0.769230769230769E-01 -0.179487179487180E+00 -0.252630954753167E+00 0.128205128205128E+00 -0.179487179487180E+00 -0.216100281882337E+00 0.179487179487180E+00 -0.179487179487180E+00 -0.175020156252099E+00 0.230769230769231E+00 -0.179487179487180E+00 -0.129390577862454E+00 0.282051282051282E+00 -0.179487179487180E+00 -0.792115467134015E-01 0.333333333333333E+00 -0.179487179487180E+00 -0.244830628049414E-01 0.384615384615385E+00 -0.179487179487180E+00 0.347948738629262E-01 0.435897435897436E+00 -0.179487179487180E+00 0.986222632902014E-01 0.487179487179487E+00 -0.179487179487180E+00 0.166999105476884E+00 0.538461538461538E+00 -0.179487179487180E+00 0.239925400422974E+00 0.589743589743590E+00 -0.179487179487180E+00 0.317401148128472E+00 0.641025641025641E+00 -0.179487179487180E+00 0.399426348593377E+00 0.692307692307692E+00 -0.179487179487180E+00 0.486001001817690E+00 0.743589743589744E+00 -0.179487179487180E+00 0.577125107801410E+00 0.794871794871795E+00 -0.179487179487180E+00 0.672798666544537E+00 0.846153846153846E+00 -0.179487179487180E+00 0.773021678047072E+00 0.897435897435897E+00 -0.179487179487180E+00 0.877794142309015E+00 0.948717948717949E+00 -0.179487179487180E+00 0.987116059330366E+00 0.100000000000000E+01 -0.179487179487180E+00 0.110098742911112E+01 -0.100000000000000E+01 -0.128205128205128E+00 0.108733907083290E+01 -0.948717948717949E+00 -0.128205128205128E+00 0.973467701052143E+00 -0.897435897435897E+00 -0.128205128205128E+00 0.864145784030793E+00 -0.846153846153846E+00 -0.128205128205128E+00 0.759373319768850E+00 -0.794871794871795E+00 -0.128205128205128E+00 0.659150308266315E+00 -0.743589743589744E+00 -0.128205128205128E+00 0.563476749523187E+00 -0.692307692307692E+00 -0.128205128205128E+00 0.472352643539467E+00 -0.641025641025641E+00 -0.128205128205128E+00 0.385777990315154E+00 -0.589743589743590E+00 -0.128205128205128E+00 0.303752789850249E+00 -0.538461538461539E+00 -0.128205128205128E+00 0.226277042144752E+00 -0.487179487179487E+00 -0.128205128205128E+00 0.153350747198661E+00 -0.435897435897436E+00 -0.128205128205128E+00 0.849739050119788E-01 -0.384615384615385E+00 -0.128205128205128E+00 0.211465155847037E-01 -0.333333333333333E+00 -0.128205128205128E+00 -0.381314210831639E-01 -0.282051282051282E+00 -0.128205128205128E+00 -0.928599049916240E-01 -0.230769230769231E+00 -0.128205128205128E+00 -0.143038936140677E+00 -0.179487179487180E+00 -0.128205128205128E+00 -0.188668514530322E+00 -0.128205128205128E+00 -0.128205128205128E+00 -0.229748640160559E+00 -0.769230769230770E-01 -0.128205128205128E+00 -0.266279313031389E+00 -0.256410256410257E-01 -0.128205128205128E+00 -0.298979322721165E+00 0.256410256410255E-01 -0.128205128205128E+00 -0.298979322721165E+00 0.769230769230769E-01 -0.128205128205128E+00 -0.266279313031389E+00 0.128205128205128E+00 -0.128205128205128E+00 -0.229748640160559E+00 0.179487179487180E+00 -0.128205128205128E+00 -0.188668514530322E+00 0.230769230769231E+00 -0.128205128205128E+00 -0.143038936140677E+00 0.282051282051282E+00 -0.128205128205128E+00 -0.928599049916241E-01 0.333333333333333E+00 -0.128205128205128E+00 -0.381314210831640E-01 0.384615384615385E+00 -0.128205128205128E+00 0.211465155847037E-01 0.435897435897436E+00 -0.128205128205128E+00 0.849739050119788E-01 0.487179487179487E+00 -0.128205128205128E+00 0.153350747198661E+00 0.538461538461538E+00 -0.128205128205128E+00 0.226277042144751E+00 0.589743589743590E+00 -0.128205128205128E+00 0.303752789850249E+00 0.641025641025641E+00 -0.128205128205128E+00 0.385777990315154E+00 0.692307692307692E+00 -0.128205128205128E+00 0.472352643539467E+00 0.743589743589744E+00 -0.128205128205128E+00 0.563476749523187E+00 0.794871794871795E+00 -0.128205128205128E+00 0.659150308266315E+00 0.846153846153846E+00 -0.128205128205128E+00 0.759373319768850E+00 0.897435897435897E+00 -0.128205128205128E+00 0.864145784030793E+00 0.948717948717949E+00 -0.128205128205128E+00 0.973467701052143E+00 0.100000000000000E+01 -0.128205128205128E+00 0.108733907083290E+01 -0.100000000000000E+01 -0.769230769230770E-01 0.107824016531409E+01 -0.948717948717949E+00 -0.769230769230770E-01 0.964368795533328E+00 -0.897435897435897E+00 -0.769230769230770E-01 0.855046878511978E+00 -0.846153846153846E+00 -0.769230769230770E-01 0.750274414250035E+00 -0.794871794871795E+00 -0.769230769230770E-01 0.650051402747500E+00 -0.743589743589744E+00 -0.769230769230770E-01 0.554377844004372E+00 -0.692307692307692E+00 -0.769230769230770E-01 0.463253738020652E+00 -0.641025641025641E+00 -0.769230769230770E-01 0.376679084796339E+00 -0.589743589743590E+00 -0.769230769230770E-01 0.294653884331434E+00 -0.538461538461539E+00 -0.769230769230770E-01 0.217178136625937E+00 -0.487179487179487E+00 -0.769230769230770E-01 0.144251841679846E+00 -0.435897435897436E+00 -0.769230769230770E-01 0.758749994931638E-01 -0.384615384615385E+00 -0.769230769230770E-01 0.120476100658886E-01 -0.333333333333333E+00 -0.769230769230770E-01 -0.472303266019789E-01 -0.282051282051282E+00 -0.769230769230770E-01 -0.101958810510439E+00 -0.230769230769231E+00 -0.769230769230770E-01 -0.152137841659492E+00 -0.179487179487180E+00 -0.769230769230770E-01 -0.197767420049137E+00 -0.128205128205128E+00 -0.769230769230770E-01 -0.238847545679374E+00 -0.769230769230770E-01 -0.769230769230770E-01 -0.275378218550204E+00 -0.256410256410257E-01 -0.769230769230770E-01 -0.308078228239980E+00 0.256410256410255E-01 -0.769230769230770E-01 -0.308078228239980E+00 0.769230769230769E-01 -0.769230769230770E-01 -0.275378218550204E+00 0.128205128205128E+00 -0.769230769230770E-01 -0.238847545679374E+00 0.179487179487180E+00 -0.769230769230770E-01 -0.197767420049137E+00 0.230769230769231E+00 -0.769230769230770E-01 -0.152137841659492E+00 0.282051282051282E+00 -0.769230769230770E-01 -0.101958810510439E+00 0.333333333333333E+00 -0.769230769230770E-01 -0.472303266019790E-01 0.384615384615385E+00 -0.769230769230770E-01 0.120476100658887E-01 0.435897435897436E+00 -0.769230769230770E-01 0.758749994931638E-01 0.487179487179487E+00 -0.769230769230770E-01 0.144251841679846E+00 0.538461538461538E+00 -0.769230769230770E-01 0.217178136625936E+00 0.589743589743590E+00 -0.769230769230770E-01 0.294653884331434E+00 0.641025641025641E+00 -0.769230769230770E-01 0.376679084796339E+00 0.692307692307692E+00 -0.769230769230770E-01 0.463253738020652E+00 0.743589743589744E+00 -0.769230769230770E-01 0.554377844004372E+00 0.794871794871795E+00 -0.769230769230770E-01 0.650051402747500E+00 0.846153846153846E+00 -0.769230769230770E-01 0.750274414250035E+00 0.897435897435897E+00 -0.769230769230770E-01 0.855046878511978E+00 0.948717948717949E+00 -0.769230769230770E-01 0.964368795533328E+00 0.100000000000000E+01 -0.769230769230770E-01 0.107824016531409E+01 -0.100000000000000E+01 -0.256410256410257E-01 0.107369071255468E+01 -0.948717948717949E+00 -0.256410256410257E-01 0.959819342773921E+00 -0.897435897435897E+00 -0.256410256410257E-01 0.850497425752570E+00 -0.846153846153846E+00 -0.256410256410257E-01 0.745724961490628E+00 -0.794871794871795E+00 -0.256410256410257E-01 0.645501949988093E+00 -0.743589743589744E+00 -0.256410256410257E-01 0.549828391244965E+00 -0.692307692307692E+00 -0.256410256410257E-01 0.458704285261244E+00 -0.641025641025641E+00 -0.256410256410257E-01 0.372129632036932E+00 -0.589743589743590E+00 -0.256410256410257E-01 0.290104431572027E+00 -0.538461538461539E+00 -0.256410256410257E-01 0.212628683866529E+00 -0.487179487179487E+00 -0.256410256410257E-01 0.139702388920439E+00 -0.435897435897436E+00 -0.256410256410257E-01 0.713255467337563E-01 -0.384615384615385E+00 -0.256410256410257E-01 0.749815730648112E-02 -0.333333333333333E+00 -0.256410256410257E-01 -0.517797793613864E-01 -0.282051282051282E+00 -0.256410256410257E-01 -0.106508263269847E+00 -0.230769230769231E+00 -0.256410256410257E-01 -0.156687294418899E+00 -0.179487179487180E+00 -0.256410256410257E-01 -0.202316872808544E+00 -0.128205128205128E+00 -0.256410256410257E-01 -0.243396998438782E+00 -0.769230769230770E-01 -0.256410256410257E-01 -0.279927671309612E+00 -0.256410256410257E-01 -0.256410256410257E-01 -0.312627680999388E+00 0.256410256410255E-01 -0.256410256410257E-01 -0.312627680999388E+00 0.769230769230769E-01 -0.256410256410257E-01 -0.279927671309612E+00 0.128205128205128E+00 -0.256410256410257E-01 -0.243396998438782E+00 0.179487179487180E+00 -0.256410256410257E-01 -0.202316872808544E+00 0.230769230769231E+00 -0.256410256410257E-01 -0.156687294418899E+00 0.282051282051282E+00 -0.256410256410257E-01 -0.106508263269847E+00 0.333333333333333E+00 -0.256410256410257E-01 -0.517797793613865E-01 0.384615384615385E+00 -0.256410256410257E-01 0.749815730648115E-02 0.435897435897436E+00 -0.256410256410257E-01 0.713255467337563E-01 0.487179487179487E+00 -0.256410256410257E-01 0.139702388920439E+00 0.538461538461538E+00 -0.256410256410257E-01 0.212628683866529E+00 0.589743589743590E+00 -0.256410256410257E-01 0.290104431572027E+00 0.641025641025641E+00 -0.256410256410257E-01 0.372129632036932E+00 0.692307692307692E+00 -0.256410256410257E-01 0.458704285261244E+00 0.743589743589744E+00 -0.256410256410257E-01 0.549828391244965E+00 0.794871794871795E+00 -0.256410256410257E-01 0.645501949988092E+00 0.846153846153846E+00 -0.256410256410257E-01 0.745724961490627E+00 0.897435897435897E+00 -0.256410256410257E-01 0.850497425752570E+00 0.948717948717949E+00 -0.256410256410257E-01 0.959819342773921E+00 0.100000000000000E+01 -0.256410256410257E-01 0.107369071255468E+01 -0.100000000000000E+01 0.256410256410255E-01 0.107369071255468E+01 -0.948717948717949E+00 0.256410256410255E-01 0.959819342773921E+00 -0.897435897435897E+00 0.256410256410255E-01 0.850497425752570E+00 -0.846153846153846E+00 0.256410256410255E-01 0.745724961490628E+00 -0.794871794871795E+00 0.256410256410255E-01 0.645501949988093E+00 -0.743589743589744E+00 0.256410256410255E-01 0.549828391244965E+00 -0.692307692307692E+00 0.256410256410255E-01 0.458704285261244E+00 -0.641025641025641E+00 0.256410256410255E-01 0.372129632036932E+00 -0.589743589743590E+00 0.256410256410255E-01 0.290104431572027E+00 -0.538461538461539E+00 0.256410256410255E-01 0.212628683866529E+00 -0.487179487179487E+00 0.256410256410255E-01 0.139702388920439E+00 -0.435897435897436E+00 0.256410256410255E-01 0.713255467337563E-01 -0.384615384615385E+00 0.256410256410255E-01 0.749815730648110E-02 -0.333333333333333E+00 0.256410256410255E-01 -0.517797793613864E-01 -0.282051282051282E+00 0.256410256410255E-01 -0.106508263269847E+00 -0.230769230769231E+00 0.256410256410255E-01 -0.156687294418899E+00 -0.179487179487180E+00 0.256410256410255E-01 -0.202316872808544E+00 -0.128205128205128E+00 0.256410256410255E-01 -0.243396998438782E+00 -0.769230769230770E-01 0.256410256410255E-01 -0.279927671309612E+00 -0.256410256410257E-01 0.256410256410255E-01 -0.312627680999388E+00 0.256410256410255E-01 0.256410256410255E-01 -0.312627680999388E+00 0.769230769230769E-01 0.256410256410255E-01 -0.279927671309612E+00 0.128205128205128E+00 0.256410256410255E-01 -0.243396998438782E+00 0.179487179487180E+00 0.256410256410255E-01 -0.202316872808544E+00 0.230769230769231E+00 0.256410256410255E-01 -0.156687294418899E+00 0.282051282051282E+00 0.256410256410255E-01 -0.106508263269847E+00 0.333333333333333E+00 0.256410256410255E-01 -0.517797793613865E-01 0.384615384615385E+00 0.256410256410255E-01 0.749815730648112E-02 0.435897435897436E+00 0.256410256410255E-01 0.713255467337563E-01 0.487179487179487E+00 0.256410256410255E-01 0.139702388920439E+00 0.538461538461538E+00 0.256410256410255E-01 0.212628683866529E+00 0.589743589743590E+00 0.256410256410255E-01 0.290104431572027E+00 0.641025641025641E+00 0.256410256410255E-01 0.372129632036932E+00 0.692307692307692E+00 0.256410256410255E-01 0.458704285261244E+00 0.743589743589744E+00 0.256410256410255E-01 0.549828391244965E+00 0.794871794871795E+00 0.256410256410255E-01 0.645501949988092E+00 0.846153846153846E+00 0.256410256410255E-01 0.745724961490627E+00 0.897435897435897E+00 0.256410256410255E-01 0.850497425752570E+00 0.948717948717949E+00 0.256410256410255E-01 0.959819342773921E+00 0.100000000000000E+01 0.256410256410255E-01 0.107369071255468E+01 -0.100000000000000E+01 0.769230769230769E-01 0.107824016531409E+01 -0.948717948717949E+00 0.769230769230769E-01 0.964368795533328E+00 -0.897435897435897E+00 0.769230769230769E-01 0.855046878511978E+00 -0.846153846153846E+00 0.769230769230769E-01 0.750274414250035E+00 -0.794871794871795E+00 0.769230769230769E-01 0.650051402747500E+00 -0.743589743589744E+00 0.769230769230769E-01 0.554377844004372E+00 -0.692307692307692E+00 0.769230769230769E-01 0.463253738020652E+00 -0.641025641025641E+00 0.769230769230769E-01 0.376679084796339E+00 -0.589743589743590E+00 0.769230769230769E-01 0.294653884331434E+00 -0.538461538461539E+00 0.769230769230769E-01 0.217178136625937E+00 -0.487179487179487E+00 0.769230769230769E-01 0.144251841679846E+00 -0.435897435897436E+00 0.769230769230769E-01 0.758749994931638E-01 -0.384615384615385E+00 0.769230769230769E-01 0.120476100658886E-01 -0.333333333333333E+00 0.769230769230769E-01 -0.472303266019789E-01 -0.282051282051282E+00 0.769230769230769E-01 -0.101958810510439E+00 -0.230769230769231E+00 0.769230769230769E-01 -0.152137841659492E+00 -0.179487179487180E+00 0.769230769230769E-01 -0.197767420049137E+00 -0.128205128205128E+00 0.769230769230769E-01 -0.238847545679374E+00 -0.769230769230770E-01 0.769230769230769E-01 -0.275378218550204E+00 -0.256410256410257E-01 0.769230769230769E-01 -0.308078228239980E+00 0.256410256410255E-01 0.769230769230769E-01 -0.308078228239980E+00 0.769230769230769E-01 0.769230769230769E-01 -0.275378218550204E+00 0.128205128205128E+00 0.769230769230769E-01 -0.238847545679374E+00 0.179487179487180E+00 0.769230769230769E-01 -0.197767420049137E+00 0.230769230769231E+00 0.769230769230769E-01 -0.152137841659492E+00 0.282051282051282E+00 0.769230769230769E-01 -0.101958810510439E+00 0.333333333333333E+00 0.769230769230769E-01 -0.472303266019790E-01 0.384615384615385E+00 0.769230769230769E-01 0.120476100658887E-01 0.435897435897436E+00 0.769230769230769E-01 0.758749994931638E-01 0.487179487179487E+00 0.769230769230769E-01 0.144251841679846E+00 0.538461538461538E+00 0.769230769230769E-01 0.217178136625936E+00 0.589743589743590E+00 0.769230769230769E-01 0.294653884331434E+00 0.641025641025641E+00 0.769230769230769E-01 0.376679084796339E+00 0.692307692307692E+00 0.769230769230769E-01 0.463253738020652E+00 0.743589743589744E+00 0.769230769230769E-01 0.554377844004372E+00 0.794871794871795E+00 0.769230769230769E-01 0.650051402747500E+00 0.846153846153846E+00 0.769230769230769E-01 0.750274414250035E+00 0.897435897435897E+00 0.769230769230769E-01 0.855046878511978E+00 0.948717948717949E+00 0.769230769230769E-01 0.964368795533328E+00 0.100000000000000E+01 0.769230769230769E-01 0.107824016531409E+01 -0.100000000000000E+01 0.128205128205128E+00 0.108733907083290E+01 -0.948717948717949E+00 0.128205128205128E+00 0.973467701052143E+00 -0.897435897435897E+00 0.128205128205128E+00 0.864145784030793E+00 -0.846153846153846E+00 0.128205128205128E+00 0.759373319768850E+00 -0.794871794871795E+00 0.128205128205128E+00 0.659150308266315E+00 -0.743589743589744E+00 0.128205128205128E+00 0.563476749523187E+00 -0.692307692307692E+00 0.128205128205128E+00 0.472352643539467E+00 -0.641025641025641E+00 0.128205128205128E+00 0.385777990315154E+00 -0.589743589743590E+00 0.128205128205128E+00 0.303752789850249E+00 -0.538461538461539E+00 0.128205128205128E+00 0.226277042144752E+00 -0.487179487179487E+00 0.128205128205128E+00 0.153350747198661E+00 -0.435897435897436E+00 0.128205128205128E+00 0.849739050119788E-01 -0.384615384615385E+00 0.128205128205128E+00 0.211465155847037E-01 -0.333333333333333E+00 0.128205128205128E+00 -0.381314210831639E-01 -0.282051282051282E+00 0.128205128205128E+00 -0.928599049916240E-01 -0.230769230769231E+00 0.128205128205128E+00 -0.143038936140677E+00 -0.179487179487180E+00 0.128205128205128E+00 -0.188668514530322E+00 -0.128205128205128E+00 0.128205128205128E+00 -0.229748640160559E+00 -0.769230769230770E-01 0.128205128205128E+00 -0.266279313031389E+00 -0.256410256410257E-01 0.128205128205128E+00 -0.298979322721165E+00 0.256410256410255E-01 0.128205128205128E+00 -0.298979322721165E+00 0.769230769230769E-01 0.128205128205128E+00 -0.266279313031389E+00 0.128205128205128E+00 0.128205128205128E+00 -0.229748640160559E+00 0.179487179487180E+00 0.128205128205128E+00 -0.188668514530322E+00 0.230769230769231E+00 0.128205128205128E+00 -0.143038936140677E+00 0.282051282051282E+00 0.128205128205128E+00 -0.928599049916241E-01 0.333333333333333E+00 0.128205128205128E+00 -0.381314210831640E-01 0.384615384615385E+00 0.128205128205128E+00 0.211465155847037E-01 0.435897435897436E+00 0.128205128205128E+00 0.849739050119788E-01 0.487179487179487E+00 0.128205128205128E+00 0.153350747198661E+00 0.538461538461538E+00 0.128205128205128E+00 0.226277042144751E+00 0.589743589743590E+00 0.128205128205128E+00 0.303752789850249E+00 0.641025641025641E+00 0.128205128205128E+00 0.385777990315154E+00 0.692307692307692E+00 0.128205128205128E+00 0.472352643539467E+00 0.743589743589744E+00 0.128205128205128E+00 0.563476749523187E+00 0.794871794871795E+00 0.128205128205128E+00 0.659150308266315E+00 0.846153846153846E+00 0.128205128205128E+00 0.759373319768850E+00 0.897435897435897E+00 0.128205128205128E+00 0.864145784030793E+00 0.948717948717949E+00 0.128205128205128E+00 0.973467701052143E+00 0.100000000000000E+01 0.128205128205128E+00 0.108733907083290E+01 -0.100000000000000E+01 0.179487179487180E+00 0.110098742911112E+01 -0.948717948717949E+00 0.179487179487180E+00 0.987116059330366E+00 -0.897435897435897E+00 0.179487179487180E+00 0.877794142309015E+00 -0.846153846153846E+00 0.179487179487180E+00 0.773021678047073E+00 -0.794871794871795E+00 0.179487179487180E+00 0.672798666544538E+00 -0.743589743589744E+00 0.179487179487180E+00 0.577125107801410E+00 -0.692307692307692E+00 0.179487179487180E+00 0.486001001817690E+00 -0.641025641025641E+00 0.179487179487180E+00 0.399426348593377E+00 -0.589743589743590E+00 0.179487179487180E+00 0.317401148128472E+00 -0.538461538461539E+00 0.179487179487180E+00 0.239925400422974E+00 -0.487179487179487E+00 0.179487179487180E+00 0.166999105476884E+00 -0.435897435897436E+00 0.179487179487180E+00 0.986222632902014E-01 -0.384615384615385E+00 0.179487179487180E+00 0.347948738629262E-01 -0.333333333333333E+00 0.179487179487180E+00 -0.244830628049413E-01 -0.282051282051282E+00 0.179487179487180E+00 -0.792115467134015E-01 -0.230769230769231E+00 0.179487179487180E+00 -0.129390577862454E+00 -0.179487179487180E+00 0.179487179487180E+00 -0.175020156252099E+00 -0.128205128205128E+00 0.179487179487180E+00 -0.216100281882337E+00 -0.769230769230770E-01 0.179487179487180E+00 -0.252630954753167E+00 -0.256410256410257E-01 0.179487179487180E+00 -0.285330964442943E+00 0.256410256410255E-01 0.179487179487180E+00 -0.285330964442943E+00 0.769230769230769E-01 0.179487179487180E+00 -0.252630954753167E+00 0.128205128205128E+00 0.179487179487180E+00 -0.216100281882337E+00 0.179487179487180E+00 0.179487179487180E+00 -0.175020156252099E+00 0.230769230769231E+00 0.179487179487180E+00 -0.129390577862454E+00 0.282051282051282E+00 0.179487179487180E+00 -0.792115467134015E-01 0.333333333333333E+00 0.179487179487180E+00 -0.244830628049414E-01 0.384615384615385E+00 0.179487179487180E+00 0.347948738629262E-01 0.435897435897436E+00 0.179487179487180E+00 0.986222632902014E-01 0.487179487179487E+00 0.179487179487180E+00 0.166999105476884E+00 0.538461538461538E+00 0.179487179487180E+00 0.239925400422974E+00 0.589743589743590E+00 0.179487179487180E+00 0.317401148128472E+00 0.641025641025641E+00 0.179487179487180E+00 0.399426348593377E+00 0.692307692307692E+00 0.179487179487180E+00 0.486001001817690E+00 0.743589743589744E+00 0.179487179487180E+00 0.577125107801410E+00 0.794871794871795E+00 0.179487179487180E+00 0.672798666544537E+00 0.846153846153846E+00 0.179487179487180E+00 0.773021678047072E+00 0.897435897435897E+00 0.179487179487180E+00 0.877794142309015E+00 0.948717948717949E+00 0.179487179487180E+00 0.987116059330366E+00 0.100000000000000E+01 0.179487179487180E+00 0.110098742911112E+01 -0.100000000000000E+01 0.230769230769231E+00 0.111918524014875E+01 -0.948717948717949E+00 0.230769230769231E+00 0.100531387036800E+01 -0.897435897435897E+00 0.230769230769231E+00 0.895991953346646E+00 -0.846153846153846E+00 0.230769230769231E+00 0.791219489084703E+00 -0.794871794871795E+00 0.230769230769231E+00 0.690996477582168E+00 -0.743589743589744E+00 0.230769230769231E+00 0.595322918839040E+00 -0.692307692307692E+00 0.230769230769231E+00 0.504198812855320E+00 -0.641025641025641E+00 0.230769230769231E+00 0.417624159631007E+00 -0.589743589743590E+00 0.230769230769231E+00 0.335598959166102E+00 -0.538461538461539E+00 0.230769230769231E+00 0.258123211460604E+00 -0.487179487179487E+00 0.230769230769231E+00 0.185196916514514E+00 -0.435897435897436E+00 0.230769230769231E+00 0.116820074327831E+00 -0.384615384615385E+00 0.230769230769231E+00 0.529926849005563E-01 -0.333333333333333E+00 0.230769230769231E+00 -0.628525176731129E-02 -0.282051282051282E+00 0.230769230769231E+00 -0.610137356757714E-01 -0.230769230769231E+00 0.230769230769231E+00 -0.111192766824824E+00 -0.179487179487180E+00 0.230769230769231E+00 -0.156822345214469E+00 -0.128205128205128E+00 0.230769230769231E+00 -0.197902470844707E+00 -0.769230769230770E-01 0.230769230769231E+00 -0.234433143715537E+00 -0.256410256410257E-01 0.230769230769231E+00 -0.267133153405313E+00 0.256410256410255E-01 0.230769230769231E+00 -0.267133153405313E+00 0.769230769230769E-01 0.230769230769231E+00 -0.234433143715537E+00 0.128205128205128E+00 0.230769230769231E+00 -0.197902470844707E+00 0.179487179487180E+00 0.230769230769231E+00 -0.156822345214469E+00 0.230769230769231E+00 0.230769230769231E+00 -0.111192766824824E+00 0.282051282051282E+00 0.230769230769231E+00 -0.610137356757715E-01 0.333333333333333E+00 0.230769230769231E+00 -0.628525176731137E-02 0.384615384615385E+00 0.230769230769231E+00 0.529926849005563E-01 0.435897435897436E+00 0.230769230769231E+00 0.116820074327831E+00 0.487179487179487E+00 0.230769230769231E+00 0.185196916514514E+00 0.538461538461538E+00 0.230769230769231E+00 0.258123211460604E+00 0.589743589743590E+00 0.230769230769231E+00 0.335598959166102E+00 0.641025641025641E+00 0.230769230769231E+00 0.417624159631007E+00 0.692307692307692E+00 0.230769230769231E+00 0.504198812855320E+00 0.743589743589744E+00 0.230769230769231E+00 0.595322918839040E+00 0.794871794871795E+00 0.230769230769231E+00 0.690996477582167E+00 0.846153846153846E+00 0.230769230769231E+00 0.791219489084702E+00 0.897435897435897E+00 0.230769230769231E+00 0.895991953346645E+00 0.948717948717949E+00 0.230769230769231E+00 0.100531387036800E+01 0.100000000000000E+01 0.230769230769231E+00 0.111918524014875E+01 -0.100000000000000E+01 0.282051282051282E+00 0.114193250394579E+01 -0.948717948717949E+00 0.282051282051282E+00 0.102806113416503E+01 -0.897435897435897E+00 0.282051282051282E+00 0.918739217143683E+00 -0.846153846153846E+00 0.282051282051282E+00 0.813966752881740E+00 -0.794871794871795E+00 0.282051282051282E+00 0.713743741379205E+00 -0.743589743589744E+00 0.282051282051282E+00 0.618070182636077E+00 -0.692307692307692E+00 0.282051282051282E+00 0.526946076652357E+00 -0.641025641025641E+00 0.282051282051282E+00 0.440371423428044E+00 -0.589743589743590E+00 0.282051282051282E+00 0.358346222963139E+00 -0.538461538461539E+00 0.282051282051282E+00 0.280870475257642E+00 -0.487179487179487E+00 0.282051282051282E+00 0.207944180311552E+00 -0.435897435897436E+00 0.282051282051282E+00 0.139567338124869E+00 -0.384615384615385E+00 0.282051282051282E+00 0.757399486975937E-01 -0.333333333333333E+00 0.282051282051282E+00 0.164620120297262E-01 -0.282051282051282E+00 0.282051282051282E+00 -0.382664718787339E-01 -0.230769230769231E+00 0.282051282051282E+00 -0.884455030277865E-01 -0.179487179487180E+00 0.282051282051282E+00 -0.134075081417432E+00 -0.128205128205128E+00 0.282051282051282E+00 -0.175155207047669E+00 -0.769230769230770E-01 0.282051282051282E+00 -0.211685879918499E+00 -0.256410256410257E-01 0.282051282051282E+00 -0.244385889608275E+00 0.256410256410255E-01 0.282051282051282E+00 -0.244385889608275E+00 0.769230769230769E-01 0.282051282051282E+00 -0.211685879918499E+00 0.128205128205128E+00 0.282051282051282E+00 -0.175155207047669E+00 0.179487179487180E+00 0.282051282051282E+00 -0.134075081417432E+00 0.230769230769231E+00 0.282051282051282E+00 -0.884455030277864E-01 0.282051282051282E+00 0.282051282051282E+00 -0.382664718787340E-01 0.333333333333333E+00 0.282051282051282E+00 0.164620120297261E-01 0.384615384615385E+00 0.282051282051282E+00 0.757399486975938E-01 0.435897435897436E+00 0.282051282051282E+00 0.139567338124869E+00 0.487179487179487E+00 0.282051282051282E+00 0.207944180311552E+00 0.538461538461538E+00 0.282051282051282E+00 0.280870475257641E+00 0.589743589743590E+00 0.282051282051282E+00 0.358346222963139E+00 0.641025641025641E+00 0.282051282051282E+00 0.440371423428044E+00 0.692307692307692E+00 0.282051282051282E+00 0.526946076652357E+00 0.743589743589744E+00 0.282051282051282E+00 0.618070182636077E+00 0.794871794871795E+00 0.282051282051282E+00 0.713743741379205E+00 0.846153846153846E+00 0.282051282051282E+00 0.813966752881740E+00 0.897435897435897E+00 0.282051282051282E+00 0.918739217143683E+00 0.948717948717949E+00 0.282051282051282E+00 0.102806113416503E+01 0.100000000000000E+01 0.282051282051282E+00 0.114193250394579E+01 -0.100000000000000E+01 0.333333333333333E+00 0.116922922050224E+01 -0.948717948717949E+00 0.333333333333333E+00 0.105535785072148E+01 -0.897435897435897E+00 0.333333333333333E+00 0.946035933700128E+00 -0.846153846153846E+00 0.333333333333333E+00 0.841263469438185E+00 -0.794871794871795E+00 0.333333333333333E+00 0.741040457935650E+00 -0.743589743589744E+00 0.333333333333333E+00 0.645366899192523E+00 -0.692307692307692E+00 0.333333333333333E+00 0.554242793208802E+00 -0.641025641025641E+00 0.333333333333333E+00 0.467668139984489E+00 -0.589743589743590E+00 0.333333333333333E+00 0.385642939519584E+00 -0.538461538461539E+00 0.333333333333333E+00 0.308167191814087E+00 -0.487179487179487E+00 0.333333333333333E+00 0.235240896867997E+00 -0.435897435897436E+00 0.333333333333333E+00 0.166864054681314E+00 -0.384615384615385E+00 0.333333333333333E+00 0.103036665254039E+00 -0.333333333333333E+00 0.333333333333333E+00 0.437587285861713E-01 -0.282051282051282E+00 0.333333333333333E+00 -0.109697553222889E-01 -0.230769230769231E+00 0.333333333333333E+00 -0.611487864713414E-01 -0.179487179487180E+00 0.333333333333333E+00 -0.106778364860986E+00 -0.128205128205128E+00 0.333333333333333E+00 -0.147858490491224E+00 -0.769230769230770E-01 0.333333333333333E+00 -0.184389163362054E+00 -0.256410256410257E-01 0.333333333333333E+00 -0.217089173051830E+00 0.256410256410255E-01 0.333333333333333E+00 -0.217089173051830E+00 0.769230769230769E-01 0.333333333333333E+00 -0.184389163362054E+00 0.128205128205128E+00 0.333333333333333E+00 -0.147858490491224E+00 0.179487179487180E+00 0.333333333333333E+00 -0.106778364860986E+00 0.230769230769231E+00 0.333333333333333E+00 -0.611487864713413E-01 0.282051282051282E+00 0.333333333333333E+00 -0.109697553222889E-01 0.333333333333333E+00 0.333333333333333E+00 0.437587285861712E-01 0.384615384615385E+00 0.333333333333333E+00 0.103036665254039E+00 0.435897435897436E+00 0.333333333333333E+00 0.166864054681314E+00 0.487179487179487E+00 0.333333333333333E+00 0.235240896867997E+00 0.538461538461538E+00 0.333333333333333E+00 0.308167191814087E+00 0.589743589743590E+00 0.333333333333333E+00 0.385642939519584E+00 0.641025641025641E+00 0.333333333333333E+00 0.467668139984489E+00 0.692307692307692E+00 0.333333333333333E+00 0.554242793208802E+00 0.743589743589744E+00 0.333333333333333E+00 0.645366899192522E+00 0.794871794871795E+00 0.333333333333333E+00 0.741040457935650E+00 0.846153846153846E+00 0.333333333333333E+00 0.841263469438185E+00 0.897435897435897E+00 0.333333333333333E+00 0.946035933700128E+00 0.948717948717949E+00 0.333333333333333E+00 0.105535785072148E+01 0.100000000000000E+01 0.333333333333333E+00 0.116922922050224E+01 -0.100000000000000E+01 0.384615384615385E+00 0.120107538981809E+01 -0.948717948717949E+00 0.384615384615385E+00 0.108720402003733E+01 -0.897435897435897E+00 0.384615384615385E+00 0.977882103015981E+00 -0.846153846153846E+00 0.384615384615385E+00 0.873109638754038E+00 -0.794871794871795E+00 0.384615384615385E+00 0.772886627251503E+00 -0.743589743589744E+00 0.384615384615385E+00 0.677213068508375E+00 -0.692307692307692E+00 0.384615384615385E+00 0.586088962524655E+00 -0.641025641025641E+00 0.384615384615385E+00 0.499514309300342E+00 -0.589743589743590E+00 0.384615384615385E+00 0.417489108835437E+00 -0.538461538461539E+00 0.384615384615385E+00 0.340013361129939E+00 -0.487179487179487E+00 0.384615384615385E+00 0.267087066183849E+00 -0.435897435897436E+00 0.384615384615385E+00 0.198710223997167E+00 -0.384615384615385E+00 0.384615384615385E+00 0.134882834569891E+00 -0.333333333333333E+00 0.384615384615385E+00 0.756048979020239E-01 -0.282051282051282E+00 0.384615384615385E+00 0.208764139935637E-01 -0.230769230769231E+00 0.384615384615385E+00 -0.293026171554888E-01 -0.179487179487180E+00 0.384615384615385E+00 -0.749321955451339E-01 -0.128205128205128E+00 0.384615384615385E+00 -0.116012321175371E+00 -0.769230769230770E-01 0.384615384615385E+00 -0.152542994046201E+00 -0.256410256410257E-01 0.384615384615385E+00 -0.185045590870964E+00 0.256410256410255E-01 0.384615384615385E+00 -0.185045590870964E+00 0.769230769230769E-01 0.384615384615385E+00 -0.152542994046201E+00 0.128205128205128E+00 0.384615384615385E+00 -0.116012321175371E+00 0.179487179487180E+00 0.384615384615385E+00 -0.749321955451338E-01 0.230769230769231E+00 0.384615384615385E+00 -0.293026171554887E-01 0.282051282051282E+00 0.384615384615385E+00 0.208764139935637E-01 0.333333333333333E+00 0.384615384615385E+00 0.756048979020238E-01 0.384615384615385E+00 0.384615384615385E+00 0.134882834569891E+00 0.435897435897436E+00 0.384615384615385E+00 0.198710223997167E+00 0.487179487179487E+00 0.384615384615385E+00 0.267087066183849E+00 0.538461538461538E+00 0.384615384615385E+00 0.340013361129939E+00 0.589743589743590E+00 0.384615384615385E+00 0.417489108835437E+00 0.641025641025641E+00 0.384615384615385E+00 0.499514309300342E+00 0.692307692307692E+00 0.384615384615385E+00 0.586088962524655E+00 0.743589743589744E+00 0.384615384615385E+00 0.677213068508375E+00 0.794871794871795E+00 0.384615384615385E+00 0.772886627251502E+00 0.846153846153846E+00 0.384615384615385E+00 0.873109638754038E+00 0.897435897435897E+00 0.384615384615385E+00 0.977882103015980E+00 0.948717948717949E+00 0.384615384615385E+00 0.108720402003733E+01 0.100000000000000E+01 0.384615384615385E+00 0.120107538981809E+01 -0.100000000000000E+01 0.435897435897436E+00 0.123747101189335E+01 -0.948717948717949E+00 0.435897435897436E+00 0.112359964211259E+01 -0.897435897435897E+00 0.435897435897436E+00 0.101427772509124E+01 -0.846153846153846E+00 0.435897435897436E+00 0.909505260829298E+00 -0.794871794871795E+00 0.435897435897436E+00 0.809282249326763E+00 -0.743589743589744E+00 0.435897435897436E+00 0.713608690583635E+00 -0.692307692307692E+00 0.435897435897436E+00 0.622484584599915E+00 -0.641025641025641E+00 0.435897435897436E+00 0.535909931375602E+00 -0.589743589743590E+00 0.435897435897436E+00 0.453884730910697E+00 -0.538461538461539E+00 0.435897435897436E+00 0.376408983205200E+00 -0.487179487179487E+00 0.435897435897436E+00 0.303482688259109E+00 -0.435897435897436E+00 0.435897435897436E+00 0.235105846072427E+00 -0.384615384615385E+00 0.435897435897436E+00 0.171278456645152E+00 -0.333333333333333E+00 0.435897435897436E+00 0.112000519977284E+00 -0.282051282051282E+00 0.435897435897436E+00 0.572720360688239E-01 -0.230769230769231E+00 0.435897435897436E+00 0.709300491977133E-02 -0.179487179487180E+00 0.435897435897436E+00 -0.385365734698738E-01 -0.128205128205128E+00 0.435897435897436E+00 -0.807611477337210E-01 -0.769230769230770E-01 0.435897435897436E+00 -0.115999916502517E+00 -0.256410256410257E-01 0.435897435897436E+00 -0.136032466385504E+00 0.256410256410255E-01 0.435897435897436E+00 -0.136032466385504E+00 0.769230769230769E-01 0.435897435897436E+00 -0.115999916502517E+00 0.128205128205128E+00 0.435897435897436E+00 -0.807611477337210E-01 0.179487179487180E+00 0.435897435897436E+00 -0.385365734698737E-01 0.230769230769231E+00 0.435897435897436E+00 0.709300491977138E-02 0.282051282051282E+00 0.435897435897436E+00 0.572720360688238E-01 0.333333333333333E+00 0.435897435897436E+00 0.112000519977284E+00 0.384615384615385E+00 0.435897435897436E+00 0.171278456645152E+00 0.435897435897436E+00 0.435897435897436E+00 0.235105846072427E+00 0.487179487179487E+00 0.435897435897436E+00 0.303482688259109E+00 0.538461538461538E+00 0.435897435897436E+00 0.376408983205199E+00 0.589743589743590E+00 0.435897435897436E+00 0.453884730910697E+00 0.641025641025641E+00 0.435897435897436E+00 0.535909931375602E+00 0.692307692307692E+00 0.435897435897436E+00 0.622484584599915E+00 0.743589743589744E+00 0.435897435897436E+00 0.713608690583635E+00 0.794871794871795E+00 0.435897435897436E+00 0.809282249326762E+00 0.846153846153846E+00 0.435897435897436E+00 0.909505260829298E+00 0.897435897435897E+00 0.435897435897436E+00 0.101427772509124E+01 0.948717948717949E+00 0.435897435897436E+00 0.112359964211259E+01 0.100000000000000E+01 0.435897435897436E+00 0.123747101189335E+01 -0.100000000000000E+01 0.487179487179487E+00 0.127841608672802E+01 -0.948717948717949E+00 0.487179487179487E+00 0.116454471694726E+01 -0.897435897435897E+00 0.487179487179487E+00 0.105522279992591E+01 -0.846153846153846E+00 0.487179487179487E+00 0.950450335663966E+00 -0.794871794871795E+00 0.487179487179487E+00 0.850227324161430E+00 -0.743589743589744E+00 0.487179487179487E+00 0.754553765418303E+00 -0.692307692307692E+00 0.487179487179487E+00 0.663429659434583E+00 -0.641025641025641E+00 0.487179487179487E+00 0.576855006210270E+00 -0.589743589743590E+00 0.487179487179487E+00 0.494829805745365E+00 -0.538461538461539E+00 0.487179487179487E+00 0.417354058039867E+00 -0.487179487179487E+00 0.487179487179487E+00 0.344427763093777E+00 -0.435897435897436E+00 0.487179487179487E+00 0.276050920907094E+00 -0.384615384615385E+00 0.487179487179487E+00 0.212223531479819E+00 -0.333333333333333E+00 0.487179487179487E+00 0.152945594811952E+00 -0.282051282051282E+00 0.487179487179487E+00 0.982171109034915E-01 -0.230769230769231E+00 0.487179487179487E+00 0.480380797544390E-01 -0.179487179487180E+00 0.487179487179487E+00 0.144057018620015E-02 -0.128205128205128E+00 0.487179487179487E+00 -0.357183521603745E-01 -0.769230769230770E-01 0.487179487179487E+00 -0.546681235040287E-01 -0.256410256410257E-01 0.487179487179487E+00 -0.600225060693017E-01 0.256410256410255E-01 0.487179487179487E+00 -0.600225060693017E-01 0.769230769230769E-01 0.487179487179487E+00 -0.546681235040287E-01 0.128205128205128E+00 0.487179487179487E+00 -0.357183521603745E-01 0.179487179487180E+00 0.487179487179487E+00 0.144057018620024E-02 0.230769230769231E+00 0.487179487179487E+00 0.480380797544390E-01 0.282051282051282E+00 0.487179487179487E+00 0.982171109034914E-01 0.333333333333333E+00 0.487179487179487E+00 0.152945594811952E+00 0.384615384615385E+00 0.487179487179487E+00 0.212223531479819E+00 0.435897435897436E+00 0.487179487179487E+00 0.276050920907094E+00 0.487179487179487E+00 0.487179487179487E+00 0.344427763093777E+00 0.538461538461538E+00 0.487179487179487E+00 0.417354058039867E+00 0.589743589743590E+00 0.487179487179487E+00 0.494829805745365E+00 0.641025641025641E+00 0.487179487179487E+00 0.576855006210270E+00 0.692307692307692E+00 0.487179487179487E+00 0.663429659434583E+00 0.743589743589744E+00 0.487179487179487E+00 0.754553765418303E+00 0.794871794871795E+00 0.487179487179487E+00 0.850227324161430E+00 0.846153846153846E+00 0.487179487179487E+00 0.950450335663965E+00 0.897435897435897E+00 0.487179487179487E+00 0.105522279992591E+01 0.948717948717949E+00 0.487179487179487E+00 0.116454471694726E+01 0.100000000000000E+01 0.487179487179487E+00 0.127841608672802E+01 -0.100000000000000E+01 0.538461538461538E+00 0.132391061432209E+01 -0.948717948717949E+00 0.538461538461538E+00 0.121003924454133E+01 -0.897435897435897E+00 0.538461538461538E+00 0.110071732751998E+01 -0.846153846153846E+00 0.538461538461538E+00 0.995944863258041E+00 -0.794871794871795E+00 0.538461538461538E+00 0.895721851755505E+00 -0.743589743589744E+00 0.538461538461538E+00 0.800048293012378E+00 -0.692307692307692E+00 0.538461538461538E+00 0.708924187028657E+00 -0.641025641025641E+00 0.538461538461538E+00 0.622349533804345E+00 -0.589743589743590E+00 0.538461538461538E+00 0.540324333339440E+00 -0.538461538461539E+00 0.538461538461538E+00 0.462848585633942E+00 -0.487179487179487E+00 0.538461538461538E+00 0.389922290687852E+00 -0.435897435897436E+00 0.538461538461538E+00 0.321545448501169E+00 -0.384615384615385E+00 0.538461538461538E+00 0.257718059073894E+00 -0.333333333333333E+00 0.538461538461538E+00 0.198440122406027E+00 -0.282051282051282E+00 0.538461538461538E+00 0.143711638497566E+00 -0.230769230769231E+00 0.538461538461538E+00 0.931583608199813E-01 -0.179487179487180E+00 0.538461538461538E+00 0.558300955060629E-01 -0.128205128205128E+00 0.538461538461538E+00 0.371045762966254E-01 -0.769230769230770E-01 0.538461538461538E+00 0.288882072776789E-01 -0.256410256410257E-01 0.538461538461538E+00 0.243387545182713E-01 0.256410256410255E-01 0.538461538461538E+00 0.243387545182713E-01 0.769230769230769E-01 0.538461538461538E+00 0.288882072776788E-01 0.128205128205128E+00 0.538461538461538E+00 0.371045762966254E-01 0.179487179487180E+00 0.538461538461538E+00 0.558300955060630E-01 0.230769230769231E+00 0.538461538461538E+00 0.931583608199813E-01 0.282051282051282E+00 0.538461538461538E+00 0.143711638497566E+00 0.333333333333333E+00 0.538461538461538E+00 0.198440122406027E+00 0.384615384615385E+00 0.538461538461538E+00 0.257718059073894E+00 0.435897435897436E+00 0.538461538461538E+00 0.321545448501169E+00 0.487179487179487E+00 0.538461538461538E+00 0.389922290687852E+00 0.538461538461538E+00 0.538461538461538E+00 0.462848585633942E+00 0.589743589743590E+00 0.538461538461538E+00 0.540324333339440E+00 0.641025641025641E+00 0.538461538461538E+00 0.622349533804345E+00 0.692307692307692E+00 0.538461538461538E+00 0.708924187028657E+00 0.743589743589744E+00 0.538461538461538E+00 0.800048293012378E+00 0.794871794871795E+00 0.538461538461538E+00 0.895721851755505E+00 0.846153846153846E+00 0.538461538461538E+00 0.995944863258040E+00 0.897435897435897E+00 0.538461538461538E+00 0.110071732751998E+01 0.948717948717949E+00 0.538461538461538E+00 0.121003924454133E+01 0.100000000000000E+01 0.538461538461538E+00 0.132391061432209E+01 -0.100000000000000E+01 0.589743589743590E+00 0.137395459467557E+01 -0.948717948717949E+00 0.589743589743590E+00 0.126008322489482E+01 -0.897435897435897E+00 0.589743589743590E+00 0.115076130787347E+01 -0.846153846153846E+00 0.589743589743590E+00 0.104598884361152E+01 -0.794871794871795E+00 0.589743589743590E+00 0.945765832108988E+00 -0.743589743589744E+00 0.589743589743590E+00 0.850092273365860E+00 -0.692307692307692E+00 0.589743589743590E+00 0.758968167382140E+00 -0.641025641025641E+00 0.589743589743590E+00 0.672393514157827E+00 -0.589743589743590E+00 0.589743589743590E+00 0.590368313692922E+00 -0.538461538461539E+00 0.589743589743590E+00 0.512892565987425E+00 -0.487179487179487E+00 0.589743589743590E+00 0.439966271041335E+00 -0.435897435897436E+00 0.589743589743590E+00 0.371589428854652E+00 -0.384615384615385E+00 0.589743589743590E+00 0.307762039427377E+00 -0.333333333333333E+00 0.589743589743590E+00 0.247829867884073E+00 -0.282051282051282E+00 0.589743589743590E+00 0.195052802680826E+00 -0.230769230769231E+00 0.589743589743590E+00 0.158680890736555E+00 -0.179487179487180E+00 0.589743589743590E+00 0.138536019907117E+00 -0.128205128205128E+00 0.589743589743590E+00 0.125723773417765E+00 -0.769230769230770E-01 0.589743589743590E+00 0.116624867898950E+00 -0.256410256410257E-01 0.589743589743590E+00 0.112075415139543E+00 0.256410256410255E-01 0.589743589743590E+00 0.112075415139543E+00 0.769230769230769E-01 0.589743589743590E+00 0.116624867898950E+00 0.128205128205128E+00 0.589743589743590E+00 0.125723773417765E+00 0.179487179487180E+00 0.589743589743590E+00 0.138536019907117E+00 0.230769230769231E+00 0.589743589743590E+00 0.158680890736555E+00 0.282051282051282E+00 0.589743589743590E+00 0.195052802680826E+00 0.333333333333333E+00 0.589743589743590E+00 0.247829867884073E+00 0.384615384615385E+00 0.589743589743590E+00 0.307762039427377E+00 0.435897435897436E+00 0.589743589743590E+00 0.371589428854652E+00 0.487179487179487E+00 0.589743589743590E+00 0.439966271041335E+00 0.538461538461538E+00 0.589743589743590E+00 0.512892565987425E+00 0.589743589743590E+00 0.589743589743590E+00 0.590368313692922E+00 0.641025641025641E+00 0.589743589743590E+00 0.672393514157827E+00 0.692307692307692E+00 0.589743589743590E+00 0.758968167382140E+00 0.743589743589744E+00 0.589743589743590E+00 0.850092273365860E+00 0.794871794871795E+00 0.589743589743590E+00 0.945765832108988E+00 0.846153846153846E+00 0.589743589743590E+00 0.104598884361152E+01 0.897435897435897E+00 0.589743589743590E+00 0.115076130787347E+01 0.948717948717949E+00 0.589743589743590E+00 0.126008322489482E+01 0.100000000000000E+01 0.589743589743590E+00 0.137395459467557E+01 -0.100000000000000E+01 0.641025641025641E+00 0.142854802778846E+01 -0.948717948717949E+00 0.641025641025641E+00 0.131467665800771E+01 -0.897435897435897E+00 0.641025641025641E+00 0.120535474098636E+01 -0.846153846153846E+00 0.641025641025641E+00 0.110058227672441E+01 -0.794871794871795E+00 0.641025641025641E+00 0.100035926522188E+01 -0.743589743589744E+00 0.641025641025641E+00 0.904685706478751E+00 -0.692307692307692E+00 0.641025641025641E+00 0.813561600495030E+00 -0.641025641025641E+00 0.641025641025641E+00 0.726986947270718E+00 -0.589743589743590E+00 0.641025641025641E+00 0.644961746805813E+00 -0.538461538461539E+00 0.641025641025641E+00 0.567485999100315E+00 -0.487179487179487E+00 0.641025641025641E+00 0.494559704154225E+00 -0.435897435897436E+00 0.641025641025641E+00 0.426182861967542E+00 -0.384615384615385E+00 0.641025641025641E+00 0.361960907342905E+00 -0.333333333333333E+00 0.641025641025641E+00 0.307855087598779E+00 -0.282051282051282E+00 0.641025641025641E+00 0.272411758173098E+00 -0.230769230769231E+00 0.641025641025641E+00 0.249856056114297E+00 -0.179487179487180E+00 0.641025641025641E+00 0.231658245076666E+00 -0.128205128205128E+00 0.641025641025641E+00 0.218009886798444E+00 -0.769230769230770E-01 0.641025641025641E+00 0.208910981279629E+00 -0.256410256410257E-01 0.641025641025641E+00 0.204361528520221E+00 0.256410256410255E-01 0.641025641025641E+00 0.204361528520221E+00 0.769230769230769E-01 0.641025641025641E+00 0.208910981279629E+00 0.128205128205128E+00 0.641025641025641E+00 0.218009886798444E+00 0.179487179487180E+00 0.641025641025641E+00 0.231658245076666E+00 0.230769230769231E+00 0.641025641025641E+00 0.249856056114297E+00 0.282051282051282E+00 0.641025641025641E+00 0.272411758173098E+00 0.333333333333333E+00 0.641025641025641E+00 0.307855087598778E+00 0.384615384615385E+00 0.641025641025641E+00 0.361960907342905E+00 0.435897435897436E+00 0.641025641025641E+00 0.426182861967542E+00 0.487179487179487E+00 0.641025641025641E+00 0.494559704154225E+00 0.538461538461538E+00 0.641025641025641E+00 0.567485999100315E+00 0.589743589743590E+00 0.641025641025641E+00 0.644961746805812E+00 0.641025641025641E+00 0.641025641025641E+00 0.726986947270718E+00 0.692307692307692E+00 0.641025641025641E+00 0.813561600495030E+00 0.743589743589744E+00 0.641025641025641E+00 0.904685706478751E+00 0.794871794871795E+00 0.641025641025641E+00 0.100035926522188E+01 0.846153846153846E+00 0.641025641025641E+00 0.110058227672441E+01 0.897435897435897E+00 0.641025641025641E+00 0.120535474098636E+01 0.948717948717949E+00 0.641025641025641E+00 0.131467665800771E+01 0.100000000000000E+01 0.641025641025641E+00 0.142854802778846E+01 -0.100000000000000E+01 0.692307692307692E+00 0.148769091366076E+01 -0.948717948717949E+00 0.692307692307692E+00 0.137381954388000E+01 -0.897435897435897E+00 0.692307692307692E+00 0.126449762685865E+01 -0.846153846153846E+00 0.692307692307692E+00 0.115972516259671E+01 -0.794871794871795E+00 0.692307692307692E+00 0.105950215109418E+01 -0.743589743589744E+00 0.692307692307692E+00 0.963828592351048E+00 -0.692307692307692E+00 0.692307692307692E+00 0.872704486367328E+00 -0.641025641025641E+00 0.692307692307692E+00 0.786129833143015E+00 -0.589743589743590E+00 0.692307692307692E+00 0.704104632678110E+00 -0.538461538461539E+00 0.692307692307692E+00 0.626628884972613E+00 -0.487179487179487E+00 0.692307692307692E+00 0.553409154236310E+00 -0.435897435897436E+00 0.692307692307692E+00 0.485781799882419E+00 -0.384615384615385E+00 0.692307692307692E+00 0.431975135475335E+00 -0.333333333333333E+00 0.692307692307692E+00 0.396278958169219E+00 -0.282051282051282E+00 0.692307692307692E+00 0.369438886051420E+00 -0.230769230769231E+00 0.692307692307692E+00 0.346691622254383E+00 -0.179487179487180E+00 0.692307692307692E+00 0.328493811216753E+00 -0.128205128205128E+00 0.692307692307692E+00 0.314845452938530E+00 -0.769230769230770E-01 0.692307692307692E+00 0.305746547419715E+00 -0.256410256410257E-01 0.692307692307692E+00 0.301197094660308E+00 0.256410256410255E-01 0.692307692307692E+00 0.301197094660308E+00 0.769230769230769E-01 0.692307692307692E+00 0.305746547419715E+00 0.128205128205128E+00 0.692307692307692E+00 0.314845452938530E+00 0.179487179487180E+00 0.692307692307692E+00 0.328493811216753E+00 0.230769230769231E+00 0.692307692307692E+00 0.346691622254383E+00 0.282051282051282E+00 0.692307692307692E+00 0.369438886051420E+00 0.333333333333333E+00 0.692307692307692E+00 0.396278958169219E+00 0.384615384615385E+00 0.692307692307692E+00 0.431975135475335E+00 0.435897435897436E+00 0.692307692307692E+00 0.485781799882419E+00 0.487179487179487E+00 0.692307692307692E+00 0.553409154236310E+00 0.538461538461538E+00 0.692307692307692E+00 0.626628884972612E+00 0.589743589743590E+00 0.692307692307692E+00 0.704104632678110E+00 0.641025641025641E+00 0.692307692307692E+00 0.786129833143015E+00 0.692307692307692E+00 0.692307692307692E+00 0.872704486367328E+00 0.743589743589744E+00 0.692307692307692E+00 0.963828592351048E+00 0.794871794871795E+00 0.692307692307692E+00 0.105950215109418E+01 0.846153846153846E+00 0.692307692307692E+00 0.115972516259671E+01 0.897435897435897E+00 0.692307692307692E+00 0.126449762685865E+01 0.948717948717949E+00 0.692307692307692E+00 0.137381954388000E+01 0.100000000000000E+01 0.692307692307692E+00 0.148769091366076E+01 -0.100000000000000E+01 0.743589743589744E+00 0.155138325229247E+01 -0.948717948717949E+00 0.743589743589744E+00 0.143751188251171E+01 -0.897435897435897E+00 0.743589743589744E+00 0.132818996549036E+01 -0.846153846153846E+00 0.743589743589744E+00 0.122341750122842E+01 -0.794871794871795E+00 0.743589743589744E+00 0.112319448972588E+01 -0.743589743589744E+00 0.743589743589744E+00 0.102752093098275E+01 -0.692307692307692E+00 0.743589743589744E+00 0.936396824999033E+00 -0.641025641025641E+00 0.743589743589744E+00 0.849822171774721E+00 -0.589743589743590E+00 0.743589743589744E+00 0.767796971309816E+00 -0.538461538461539E+00 0.743589743589744E+00 0.690168382382113E+00 -0.487179487179487E+00 0.743589743589744E+00 0.620045800451552E+00 -0.435897435897436E+00 0.743589743589744E+00 0.567343180849449E+00 -0.384615384615385E+00 0.743589743589744E+00 0.529628966518923E+00 -0.333333333333333E+00 0.743589743589744E+00 0.498120621507359E+00 -0.282051282051282E+00 0.743589743589744E+00 0.470823904950914E+00 -0.230769230769231E+00 0.743589743589744E+00 0.448076641153877E+00 -0.179487179487180E+00 0.743589743589744E+00 0.429878830116247E+00 -0.128205128205128E+00 0.743589743589744E+00 0.416230471838024E+00 -0.769230769230770E-01 0.743589743589744E+00 0.407131566319209E+00 -0.256410256410257E-01 0.743589743589744E+00 0.402582113559802E+00 0.256410256410255E-01 0.743589743589744E+00 0.402582113559802E+00 0.769230769230769E-01 0.743589743589744E+00 0.407131566319209E+00 0.128205128205128E+00 0.743589743589744E+00 0.416230471838024E+00 0.179487179487180E+00 0.743589743589744E+00 0.429878830116247E+00 0.230769230769231E+00 0.743589743589744E+00 0.448076641153877E+00 0.282051282051282E+00 0.743589743589744E+00 0.470823904950914E+00 0.333333333333333E+00 0.743589743589744E+00 0.498120621507359E+00 0.384615384615385E+00 0.743589743589744E+00 0.529628966518923E+00 0.435897435897436E+00 0.743589743589744E+00 0.567343180849449E+00 0.487179487179487E+00 0.743589743589744E+00 0.620045800451552E+00 0.538461538461538E+00 0.743589743589744E+00 0.690168382382112E+00 0.589743589743590E+00 0.743589743589744E+00 0.767796971309815E+00 0.641025641025641E+00 0.743589743589744E+00 0.849822171774721E+00 0.692307692307692E+00 0.743589743589744E+00 0.936396824999033E+00 0.743589743589744E+00 0.743589743589744E+00 0.102752093098275E+01 0.794871794871795E+00 0.743589743589744E+00 0.112319448972588E+01 0.846153846153846E+00 0.743589743589744E+00 0.122341750122842E+01 0.897435897435897E+00 0.743589743589744E+00 0.132818996549036E+01 0.948717948717949E+00 0.743589743589744E+00 0.143751188251171E+01 0.100000000000000E+01 0.743589743589744E+00 0.155138325229247E+01 -0.100000000000000E+01 0.794871794871795E+00 0.161962504368358E+01 -0.948717948717949E+00 0.794871794871795E+00 0.150575367390282E+01 -0.897435897435897E+00 0.794871794871795E+00 0.139643175688147E+01 -0.846153846153846E+00 0.794871794871795E+00 0.129165929261953E+01 -0.794871794871795E+00 0.794871794871795E+00 0.119143628111699E+01 -0.743589743589744E+00 0.794871794871795E+00 0.109576272237387E+01 -0.692307692307692E+00 0.794871794871795E+00 0.100463861639015E+01 -0.641025641025641E+00 0.794871794871795E+00 0.918063963165833E+00 -0.589743589743590E+00 0.794871794871795E+00 0.836264005765522E+00 -0.538461538461539E+00 0.794871794871795E+00 0.765365429768427E+00 -0.487179487179487E+00 0.794871794871795E+00 0.713328774835340E+00 -0.435897435897436E+00 0.794871794871795E+00 0.672296884557373E+00 -0.384615384615385E+00 0.794871794871795E+00 0.635901262482113E+00 -0.333333333333333E+00 0.794871794871795E+00 0.604055093166260E+00 -0.282051282051282E+00 0.794871794871795E+00 0.576758376609815E+00 -0.230769230769231E+00 0.794871794871795E+00 0.554011112812778E+00 -0.179487179487180E+00 0.794871794871795E+00 0.535813301775148E+00 -0.128205128205128E+00 0.794871794871795E+00 0.522164943496925E+00 -0.769230769230770E-01 0.794871794871795E+00 0.513066037978110E+00 -0.256410256410257E-01 0.794871794871795E+00 0.508516585218703E+00 0.256410256410255E-01 0.794871794871795E+00 0.508516585218703E+00 0.769230769230769E-01 0.794871794871795E+00 0.513066037978110E+00 0.128205128205128E+00 0.794871794871795E+00 0.522164943496925E+00 0.179487179487180E+00 0.794871794871795E+00 0.535813301775148E+00 0.230769230769231E+00 0.794871794871795E+00 0.554011112812778E+00 0.282051282051282E+00 0.794871794871795E+00 0.576758376609815E+00 0.333333333333333E+00 0.794871794871795E+00 0.604055093166260E+00 0.384615384615385E+00 0.794871794871795E+00 0.635901262482113E+00 0.435897435897436E+00 0.794871794871795E+00 0.672296884557373E+00 0.487179487179487E+00 0.794871794871795E+00 0.713328774835340E+00 0.538461538461538E+00 0.794871794871795E+00 0.765365429768426E+00 0.589743589743590E+00 0.794871794871795E+00 0.836264005765521E+00 0.641025641025641E+00 0.794871794871795E+00 0.918063963165833E+00 0.692307692307692E+00 0.794871794871795E+00 0.100463861639015E+01 0.743589743589744E+00 0.794871794871795E+00 0.109576272237387E+01 0.794871794871795E+00 0.794871794871795E+00 0.119143628111699E+01 0.846153846153846E+00 0.794871794871795E+00 0.129165929261953E+01 0.897435897435897E+00 0.794871794871795E+00 0.139643175688147E+01 0.948717948717949E+00 0.794871794871795E+00 0.150575367390282E+01 0.100000000000000E+01 0.794871794871795E+00 0.161962504368358E+01 -0.100000000000000E+01 0.846153846153846E+00 0.169241628783410E+01 -0.948717948717949E+00 0.846153846153846E+00 0.157854491805334E+01 -0.897435897435897E+00 0.846153846153846E+00 0.146922300103199E+01 -0.846153846153846E+00 0.846153846153846E+00 0.136445053677005E+01 -0.794871794871795E+00 0.846153846153846E+00 0.126422752526751E+01 -0.743589743589744E+00 0.846153846153846E+00 0.116887230389915E+01 -0.692307692307692E+00 0.846153846153846E+00 0.107771641202966E+01 -0.641025641025641E+00 0.846153846153846E+00 0.992409805869940E+00 -0.589743589743590E+00 0.846153846153846E+00 0.922106057487606E+00 -0.538461538461539E+00 0.846153846153846E+00 0.869232170940706E+00 -0.487179487179487E+00 0.846153846153846E+00 0.823725883810350E+00 -0.435897435897436E+00 0.846153846153846E+00 0.782780808975682E+00 -0.384615384615385E+00 0.846153846153846E+00 0.746385186900422E+00 -0.333333333333333E+00 0.846153846153846E+00 0.714539017584569E+00 -0.282051282051282E+00 0.846153846153846E+00 0.687242301028124E+00 -0.230769230769231E+00 0.846153846153846E+00 0.664495037231087E+00 -0.179487179487180E+00 0.846153846153846E+00 0.646297226193457E+00 -0.128205128205128E+00 0.846153846153846E+00 0.632648867915234E+00 -0.769230769230770E-01 0.846153846153846E+00 0.623549962396419E+00 -0.256410256410257E-01 0.846153846153846E+00 0.619000509637011E+00 0.256410256410255E-01 0.846153846153846E+00 0.619000509637011E+00 0.769230769230769E-01 0.846153846153846E+00 0.623549962396419E+00 0.128205128205128E+00 0.846153846153846E+00 0.632648867915234E+00 0.179487179487180E+00 0.846153846153846E+00 0.646297226193457E+00 0.230769230769231E+00 0.846153846153846E+00 0.664495037231087E+00 0.282051282051282E+00 0.846153846153846E+00 0.687242301028124E+00 0.333333333333333E+00 0.846153846153846E+00 0.714539017584569E+00 0.384615384615385E+00 0.846153846153846E+00 0.746385186900422E+00 0.435897435897436E+00 0.846153846153846E+00 0.782780808975682E+00 0.487179487179487E+00 0.846153846153846E+00 0.823725883810350E+00 0.538461538461538E+00 0.846153846153846E+00 0.869232170940706E+00 0.589743589743590E+00 0.846153846153846E+00 0.922106057487606E+00 0.641025641025641E+00 0.846153846153846E+00 0.992409805869940E+00 0.692307692307692E+00 0.846153846153846E+00 0.107771641202966E+01 0.743589743589744E+00 0.846153846153846E+00 0.116887230389915E+01 0.794871794871795E+00 0.846153846153846E+00 0.126422752526751E+01 0.846153846153846E+00 0.846153846153846E+00 0.136445053677005E+01 0.897435897435897E+00 0.846153846153846E+00 0.146922300103199E+01 0.948717948717949E+00 0.846153846153846E+00 0.157854491805334E+01 0.100000000000000E+01 0.846153846153846E+00 0.169241628783410E+01 -0.100000000000000E+01 0.897435897435897E+00 0.177068302001030E+01 -0.948717948717949E+00 0.897435897435897E+00 0.165676988276991E+01 -0.897435897435897E+00 0.897435897435897E+00 0.154787330609002E+01 -0.846153846153846E+00 0.897435897435897E+00 0.144457528396239E+01 -0.794871794871795E+00 0.897435897435897E+00 0.134761592868233E+01 -0.743589743589744E+00 0.897435897435897E+00 0.125742653786910E+01 -0.692307692307692E+00 0.897435897435897E+00 0.117409408179471E+01 -0.641025641025641E+00 0.897435897435897E+00 0.109803771796443E+01 -0.589743589743590E+00 0.897435897435897E+00 0.103537280861387E+01 -0.538461538461539E+00 0.897435897435897E+00 0.984417586274985E+00 -0.487179487179487E+00 0.897435897435897E+00 0.938759260988066E+00 -0.435897435897436E+00 0.897435897435897E+00 0.897814186153398E+00 -0.384615384615385E+00 0.897435897435897E+00 0.861418564078138E+00 -0.333333333333333E+00 0.897435897435897E+00 0.829572394762286E+00 -0.282051282051282E+00 0.897435897435897E+00 0.802275678205840E+00 -0.230769230769231E+00 0.897435897435897E+00 0.779528414408803E+00 -0.179487179487180E+00 0.897435897435897E+00 0.761330603371173E+00 -0.128205128205128E+00 0.897435897435897E+00 0.747682245092950E+00 -0.769230769230770E-01 0.897435897435897E+00 0.738583339574135E+00 -0.256410256410257E-01 0.897435897435897E+00 0.734033886814728E+00 0.256410256410255E-01 0.897435897435897E+00 0.734033886814728E+00 0.769230769230769E-01 0.897435897435897E+00 0.738583339574135E+00 0.128205128205128E+00 0.897435897435897E+00 0.747682245092950E+00 0.179487179487180E+00 0.897435897435897E+00 0.761330603371173E+00 0.230769230769231E+00 0.897435897435897E+00 0.779528414408803E+00 0.282051282051282E+00 0.897435897435897E+00 0.802275678205840E+00 0.333333333333333E+00 0.897435897435897E+00 0.829572394762286E+00 0.384615384615385E+00 0.897435897435897E+00 0.861418564078138E+00 0.435897435897436E+00 0.897435897435897E+00 0.897814186153398E+00 0.487179487179487E+00 0.897435897435897E+00 0.938759260988066E+00 0.538461538461538E+00 0.897435897435897E+00 0.984417586274985E+00 0.589743589743590E+00 0.897435897435897E+00 0.103537280861387E+01 0.641025641025641E+00 0.897435897435897E+00 0.109803771796443E+01 0.692307692307692E+00 0.897435897435897E+00 0.117409408179471E+01 0.743589743589744E+00 0.897435897435897E+00 0.125742653786910E+01 0.794871794871795E+00 0.897435897435897E+00 0.134761592868233E+01 0.846153846153846E+00 0.897435897435897E+00 0.144457528396239E+01 0.897435897435897E+00 0.897435897435897E+00 0.154787330609002E+01 0.948717948717949E+00 0.897435897435897E+00 0.165676988276991E+01 0.100000000000000E+01 0.897435897435897E+00 0.177068302001030E+01 -0.100000000000000E+01 0.948717948717949E+00 0.186344865502907E+01 -0.948717948717949E+00 0.948717948717949E+00 0.175727024113503E+01 -0.897435897435897E+00 0.948717948717949E+00 0.165754319997262E+01 -0.846153846153846E+00 0.948717948717949E+00 0.156365361037181E+01 -0.794871794871795E+00 0.948717948717949E+00 0.147490700285212E+01 -0.743589743589744E+00 0.948717948717949E+00 0.139027425528602E+01 -0.692307692307692E+00 0.948717948717949E+00 0.131085961043482E+01 -0.641025641025641E+00 0.948717948717949E+00 0.123599441834303E+01 -0.589743589743590E+00 0.948717948717949E+00 0.116647363619207E+01 -0.538461538461539E+00 0.948717948717949E+00 0.110630270073596E+01 -0.487179487179487E+00 0.948717948717949E+00 0.105869278425277E+01 -0.435897435897436E+00 0.948717948717949E+00 0.101739701609052E+01 -0.384615384615385E+00 0.948717948717949E+00 0.981001394015262E+00 -0.333333333333333E+00 0.948717948717949E+00 0.949155224699409E+00 -0.282051282051282E+00 0.948717948717949E+00 0.921858508142965E+00 -0.230769230769231E+00 0.948717948717949E+00 0.899111244345927E+00 -0.179487179487180E+00 0.948717948717949E+00 0.880913433308297E+00 -0.128205128205128E+00 0.948717948717949E+00 0.867265075030074E+00 -0.769230769230770E-01 0.948717948717949E+00 0.858166169511259E+00 -0.256410256410257E-01 0.948717948717949E+00 0.853616716751852E+00 0.256410256410255E-01 0.948717948717949E+00 0.853616716751852E+00 0.769230769230769E-01 0.948717948717949E+00 0.858166169511259E+00 0.128205128205128E+00 0.948717948717949E+00 0.867265075030074E+00 0.179487179487180E+00 0.948717948717949E+00 0.880913433308297E+00 0.230769230769231E+00 0.948717948717949E+00 0.899111244345927E+00 0.282051282051282E+00 0.948717948717949E+00 0.921858508142964E+00 0.333333333333333E+00 0.948717948717949E+00 0.949155224699409E+00 0.384615384615385E+00 0.948717948717949E+00 0.981001394015262E+00 0.435897435897436E+00 0.948717948717949E+00 0.101739701609052E+01 0.487179487179487E+00 0.948717948717949E+00 0.105869278425277E+01 0.538461538461538E+00 0.948717948717949E+00 0.110630270073596E+01 0.589743589743590E+00 0.948717948717949E+00 0.116647363619207E+01 0.641025641025641E+00 0.948717948717949E+00 0.123599441834303E+01 0.692307692307692E+00 0.948717948717949E+00 0.131085961043482E+01 0.743589743589744E+00 0.948717948717949E+00 0.139027425528602E+01 0.794871794871795E+00 0.948717948717949E+00 0.147490700285212E+01 0.846153846153846E+00 0.948717948717949E+00 0.156365361037181E+01 0.897435897435897E+00 0.948717948717949E+00 0.165754319997262E+01 0.948717948717949E+00 0.948717948717949E+00 0.175727024113503E+01 0.100000000000000E+01 0.948717948717949E+00 0.186344865502907E+01 -0.100000000000000E+01 0.100000000000000E+01 0.200000000000000E+01 -0.948717948717949E+00 0.100000000000000E+01 0.189783809135176E+01 -0.897435897435897E+00 0.100000000000000E+01 0.180022563546293E+01 -0.846153846153846E+00 0.100000000000000E+01 0.170716263233351E+01 -0.794871794871795E+00 0.100000000000000E+01 0.161864908196349E+01 -0.743589743589744E+00 0.100000000000000E+01 0.153468498435289E+01 -0.692307692307692E+00 0.100000000000000E+01 0.145527033950169E+01 -0.641025641025641E+00 0.100000000000000E+01 0.138040514740989E+01 -0.589743589743590E+00 0.100000000000000E+01 0.131008940807751E+01 -0.538461538461539E+00 0.100000000000000E+01 0.124498771030370E+01 -0.487179487179487E+00 0.100000000000000E+01 0.118709592731142E+01 -0.435897435897436E+00 0.100000000000000E+01 0.114217396163629E+01 -0.384615384615385E+00 0.100000000000000E+01 0.110513367671179E+01 -0.333333333333333E+00 0.100000000000000E+01 0.107328750739594E+01 -0.282051282051282E+00 0.100000000000000E+01 0.104599079083950E+01 -0.230769230769231E+00 0.100000000000000E+01 0.102324352704246E+01 -0.179487179487180E+00 0.100000000000000E+01 0.100504571600483E+01 -0.128205128205128E+00 0.100000000000000E+01 0.991397357726606E+00 -0.769230769230770E-01 0.100000000000000E+01 0.982298452207791E+00 -0.256410256410257E-01 0.100000000000000E+01 0.977748999448383E+00 0.256410256410255E-01 0.100000000000000E+01 0.977748999448383E+00 0.769230769230769E-01 0.100000000000000E+01 0.982298452207791E+00 0.128205128205128E+00 0.100000000000000E+01 0.991397357726606E+00 0.179487179487180E+00 0.100000000000000E+01 0.100504571600483E+01 0.230769230769231E+00 0.100000000000000E+01 0.102324352704246E+01 0.282051282051282E+00 0.100000000000000E+01 0.104599079083950E+01 0.333333333333333E+00 0.100000000000000E+01 0.107328750739594E+01 0.384615384615385E+00 0.100000000000000E+01 0.110513367671179E+01 0.435897435897436E+00 0.100000000000000E+01 0.114217396163629E+01 0.487179487179487E+00 0.100000000000000E+01 0.118709592731142E+01 0.538461538461538E+00 0.100000000000000E+01 0.124498771030370E+01 0.589743589743590E+00 0.100000000000000E+01 0.131008940807751E+01 0.641025641025641E+00 0.100000000000000E+01 0.138040514740989E+01 0.692307692307692E+00 0.100000000000000E+01 0.145527033950169E+01 0.743589743589744E+00 0.100000000000000E+01 0.153468498435289E+01 0.794871794871795E+00 0.100000000000000E+01 0.161864908196349E+01 0.846153846153846E+00 0.100000000000000E+01 0.170716263233351E+01 0.897435897435897E+00 0.100000000000000E+01 0.180022563546293E+01 0.948717948717949E+00 0.100000000000000E+01 0.189783809135176E+01 0.100000000000000E+01 0.100000000000000E+01 0.200000000000000E+01 3042 1 2 42 1 42 41 2 3 43 2 43 42 3 4 44 3 44 43 4 5 45 4 45 44 5 6 46 5 46 45 6 7 47 6 47 46 7 8 48 7 48 47 8 9 49 8 49 48 9 10 50 9 50 49 10 11 51 10 51 50 11 12 52 11 52 51 12 13 53 12 53 52 13 14 54 13 54 53 14 15 55 14 55 54 15 16 56 15 56 55 16 17 57 16 57 56 17 18 58 17 58 57 18 19 59 18 59 58 19 20 60 19 60 59 20 21 61 20 61 60 21 22 62 21 62 61 22 23 63 22 63 62 23 24 64 23 64 63 24 25 65 24 65 64 25 26 66 25 66 65 26 27 67 26 67 66 27 28 68 27 68 67 28 29 69 28 69 68 29 30 70 29 70 69 30 31 71 30 71 70 31 32 72 31 72 71 32 33 73 32 73 72 33 34 74 33 74 73 34 35 75 34 75 74 35 36 76 35 76 75 36 37 77 36 77 76 37 38 78 37 78 77 38 39 79 38 79 78 39 40 80 39 80 79 41 42 82 41 82 81 42 43 83 42 83 82 43 44 84 43 84 83 44 45 85 44 85 84 45 46 86 45 86 85 46 47 87 46 87 86 47 48 88 47 88 87 48 49 89 48 89 88 49 50 90 49 90 89 50 51 91 50 91 90 51 52 92 51 92 91 52 53 93 52 93 92 53 54 94 53 94 93 54 55 95 54 95 94 55 56 96 55 96 95 56 57 97 56 97 96 57 58 98 57 98 97 58 59 99 58 99 98 59 60 100 59 100 99 60 61 101 60 101 100 61 62 102 61 102 101 62 63 103 62 103 102 63 64 104 63 104 103 64 65 105 64 105 104 65 66 106 65 106 105 66 67 107 66 107 106 67 68 108 67 108 107 68 69 109 68 109 108 69 70 110 69 110 109 70 71 111 70 111 110 71 72 112 71 112 111 72 73 113 72 113 112 73 74 114 73 114 113 74 75 115 74 115 114 75 76 116 75 116 115 76 77 117 76 117 116 77 78 118 77 118 117 78 79 119 78 119 118 79 80 120 79 120 119 81 82 122 81 122 121 82 83 123 82 123 122 83 84 124 83 124 123 84 85 125 84 125 124 85 86 126 85 126 125 86 87 127 86 127 126 87 88 128 87 128 127 88 89 129 88 129 128 89 90 130 89 130 129 90 91 131 90 131 130 91 92 132 91 132 131 92 93 133 92 133 132 93 94 134 93 134 133 94 95 135 94 135 134 95 96 136 95 136 135 96 97 137 96 137 136 97 98 138 97 138 137 98 99 139 98 139 138 99 100 140 99 140 139 100 101 141 100 141 140 101 102 142 101 142 141 102 103 143 102 143 142 103 104 144 103 144 143 104 105 145 104 145 144 105 106 146 105 146 145 106 107 147 106 147 146 107 108 148 107 148 147 108 109 149 108 149 148 109 110 150 109 150 149 110 111 151 110 151 150 111 112 152 111 152 151 112 113 153 112 153 152 113 114 154 113 154 153 114 115 155 114 155 154 115 116 156 115 156 155 116 117 157 116 157 156 117 118 158 117 158 157 118 119 159 118 159 158 119 120 160 119 160 159 121 122 162 121 162 161 122 123 163 122 163 162 123 124 164 123 164 163 124 125 165 124 165 164 125 126 166 125 166 165 126 127 167 126 167 166 127 128 168 127 168 167 128 129 169 128 169 168 129 130 170 129 170 169 130 131 171 130 171 170 131 132 172 131 172 171 132 133 173 132 173 172 133 134 174 133 174 173 134 135 175 134 175 174 135 136 176 135 176 175 136 137 177 136 177 176 137 138 178 137 178 177 138 139 179 138 179 178 139 140 180 139 180 179 140 141 181 140 181 180 141 142 182 141 182 181 142 143 183 142 183 182 143 144 184 143 184 183 144 145 185 144 185 184 145 146 186 145 186 185 146 147 187 146 187 186 147 148 188 147 188 187 148 149 189 148 189 188 149 150 190 149 190 189 150 151 191 150 191 190 151 152 192 151 192 191 152 153 193 152 193 192 153 154 194 153 194 193 154 155 195 154 195 194 155 156 196 155 196 195 156 157 197 156 197 196 157 158 198 157 198 197 158 159 199 158 199 198 159 160 200 159 200 199 161 162 202 161 202 201 162 163 203 162 203 202 163 164 204 163 204 203 164 165 205 164 205 204 165 166 206 165 206 205 166 167 207 166 207 206 167 168 208 167 208 207 168 169 209 168 209 208 169 170 210 169 210 209 170 171 211 170 211 210 171 172 212 171 212 211 172 173 213 172 213 212 173 174 214 173 214 213 174 175 215 174 215 214 175 176 216 175 216 215 176 177 217 176 217 216 177 178 218 177 218 217 178 179 219 178 219 218 179 180 220 179 220 219 180 181 221 180 221 220 181 182 222 181 222 221 182 183 223 182 223 222 183 184 224 183 224 223 184 185 225 184 225 224 185 186 226 185 226 225 186 187 227 186 227 226 187 188 228 187 228 227 188 189 229 188 229 228 189 190 230 189 230 229 190 191 231 190 231 230 191 192 232 191 232 231 192 193 233 192 233 232 193 194 234 193 234 233 194 195 235 194 235 234 195 196 236 195 236 235 196 197 237 196 237 236 197 198 238 197 238 237 198 199 239 198 239 238 199 200 240 199 240 239 201 202 242 201 242 241 202 203 243 202 243 242 203 204 244 203 244 243 204 205 245 204 245 244 205 206 246 205 246 245 206 207 247 206 247 246 207 208 248 207 248 247 208 209 249 208 249 248 209 210 250 209 250 249 210 211 251 210 251 250 211 212 252 211 252 251 212 213 253 212 253 252 213 214 254 213 254 253 214 215 255 214 255 254 215 216 256 215 256 255 216 217 257 216 257 256 217 218 258 217 258 257 218 219 259 218 259 258 219 220 260 219 260 259 220 221 261 220 261 260 221 222 262 221 262 261 222 223 263 222 263 262 223 224 264 223 264 263 224 225 265 224 265 264 225 226 266 225 266 265 226 227 267 226 267 266 227 228 268 227 268 267 228 229 269 228 269 268 229 230 270 229 270 269 230 231 271 230 271 270 231 232 272 231 272 271 232 233 273 232 273 272 233 234 274 233 274 273 234 235 275 234 275 274 235 236 276 235 276 275 236 237 277 236 277 276 237 238 278 237 278 277 238 239 279 238 279 278 239 240 280 239 280 279 241 242 282 241 282 281 242 243 283 242 283 282 243 244 284 243 284 283 244 245 285 244 285 284 245 246 286 245 286 285 246 247 287 246 287 286 247 248 288 247 288 287 248 249 289 248 289 288 249 250 290 249 290 289 250 251 291 250 291 290 251 252 292 251 292 291 252 253 293 252 293 292 253 254 294 253 294 293 254 255 295 254 295 294 255 256 296 255 296 295 256 257 297 256 297 296 257 258 298 257 298 297 258 259 299 258 299 298 259 260 300 259 300 299 260 261 301 260 301 300 261 262 302 261 302 301 262 263 303 262 303 302 263 264 304 263 304 303 264 265 305 264 305 304 265 266 306 265 306 305 266 267 307 266 307 306 267 268 308 267 308 307 268 269 309 268 309 308 269 270 310 269 310 309 270 271 311 270 311 310 271 272 312 271 312 311 272 273 313 272 313 312 273 274 314 273 314 313 274 275 315 274 315 314 275 276 316 275 316 315 276 277 317 276 317 316 277 278 318 277 318 317 278 279 319 278 319 318 279 280 320 279 320 319 281 282 322 281 322 321 282 283 323 282 323 322 283 284 324 283 324 323 284 285 325 284 325 324 285 286 326 285 326 325 286 287 327 286 327 326 287 288 328 287 328 327 288 289 329 288 329 328 289 290 330 289 330 329 290 291 331 290 331 330 291 292 332 291 332 331 292 293 333 292 333 332 293 294 334 293 334 333 294 295 335 294 335 334 295 296 336 295 336 335 296 297 337 296 337 336 297 298 338 297 338 337 298 299 339 298 339 338 299 300 340 299 340 339 300 301 341 300 341 340 301 302 342 301 342 341 302 303 343 302 343 342 303 304 344 303 344 343 304 305 345 304 345 344 305 306 346 305 346 345 306 307 347 306 347 346 307 308 348 307 348 347 308 309 349 308 349 348 309 310 350 309 350 349 310 311 351 310 351 350 311 312 352 311 352 351 312 313 353 312 353 352 313 314 354 313 354 353 314 315 355 314 355 354 315 316 356 315 356 355 316 317 357 316 357 356 317 318 358 317 358 357 318 319 359 318 359 358 319 320 360 319 360 359 321 322 362 321 362 361 322 323 363 322 363 362 323 324 364 323 364 363 324 325 365 324 365 364 325 326 366 325 366 365 326 327 367 326 367 366 327 328 368 327 368 367 328 329 369 328 369 368 329 330 370 329 370 369 330 331 371 330 371 370 331 332 372 331 372 371 332 333 373 332 373 372 333 334 374 333 374 373 334 335 375 334 375 374 335 336 376 335 376 375 336 337 377 336 377 376 337 338 378 337 378 377 338 339 379 338 379 378 339 340 380 339 380 379 340 341 381 340 381 380 341 342 382 341 382 381 342 343 383 342 383 382 343 344 384 343 384 383 344 345 385 344 385 384 345 346 386 345 386 385 346 347 387 346 387 386 347 348 388 347 388 387 348 349 389 348 389 388 349 350 390 349 390 389 350 351 391 350 391 390 351 352 392 351 392 391 352 353 393 352 393 392 353 354 394 353 394 393 354 355 395 354 395 394 355 356 396 355 396 395 356 357 397 356 397 396 357 358 398 357 398 397 358 359 399 358 399 398 359 360 400 359 400 399 361 362 402 361 402 401 362 363 403 362 403 402 363 364 404 363 404 403 364 365 405 364 405 404 365 366 406 365 406 405 366 367 407 366 407 406 367 368 408 367 408 407 368 369 409 368 409 408 369 370 410 369 410 409 370 371 411 370 411 410 371 372 412 371 412 411 372 373 413 372 413 412 373 374 414 373 414 413 374 375 415 374 415 414 375 376 416 375 416 415 376 377 417 376 417 416 377 378 418 377 418 417 378 379 419 378 419 418 379 380 420 379 420 419 380 381 421 380 421 420 381 382 422 381 422 421 382 383 423 382 423 422 383 384 424 383 424 423 384 385 425 384 425 424 385 386 426 385 426 425 386 387 427 386 427 426 387 388 428 387 428 427 388 389 429 388 429 428 389 390 430 389 430 429 390 391 431 390 431 430 391 392 432 391 432 431 392 393 433 392 433 432 393 394 434 393 434 433 394 395 435 394 435 434 395 396 436 395 436 435 396 397 437 396 437 436 397 398 438 397 438 437 398 399 439 398 439 438 399 400 440 399 440 439 401 402 442 401 442 441 402 403 443 402 443 442 403 404 444 403 444 443 404 405 445 404 445 444 405 406 446 405 446 445 406 407 447 406 447 446 407 408 448 407 448 447 408 409 449 408 449 448 409 410 450 409 450 449 410 411 451 410 451 450 411 412 452 411 452 451 412 413 453 412 453 452 413 414 454 413 454 453 414 415 455 414 455 454 415 416 456 415 456 455 416 417 457 416 457 456 417 418 458 417 458 457 418 419 459 418 459 458 419 420 460 419 460 459 420 421 461 420 461 460 421 422 462 421 462 461 422 423 463 422 463 462 423 424 464 423 464 463 424 425 465 424 465 464 425 426 466 425 466 465 426 427 467 426 467 466 427 428 468 427 468 467 428 429 469 428 469 468 429 430 470 429 470 469 430 431 471 430 471 470 431 432 472 431 472 471 432 433 473 432 473 472 433 434 474 433 474 473 434 435 475 434 475 474 435 436 476 435 476 475 436 437 477 436 477 476 437 438 478 437 478 477 438 439 479 438 479 478 439 440 480 439 480 479 441 442 482 441 482 481 442 443 483 442 483 482 443 444 484 443 484 483 444 445 485 444 485 484 445 446 486 445 486 485 446 447 487 446 487 486 447 448 488 447 488 487 448 449 489 448 489 488 449 450 490 449 490 489 450 451 491 450 491 490 451 452 492 451 492 491 452 453 493 452 493 492 453 454 494 453 494 493 454 455 495 454 495 494 455 456 496 455 496 495 456 457 497 456 497 496 457 458 498 457 498 497 458 459 499 458 499 498 459 460 500 459 500 499 460 461 501 460 501 500 461 462 502 461 502 501 462 463 503 462 503 502 463 464 504 463 504 503 464 465 505 464 505 504 465 466 506 465 506 505 466 467 507 466 507 506 467 468 508 467 508 507 468 469 509 468 509 508 469 470 510 469 510 509 470 471 511 470 511 510 471 472 512 471 512 511 472 473 513 472 513 512 473 474 514 473 514 513 474 475 515 474 515 514 475 476 516 475 516 515 476 477 517 476 517 516 477 478 518 477 518 517 478 479 519 478 519 518 479 480 520 479 520 519 481 482 522 481 522 521 482 483 523 482 523 522 483 484 524 483 524 523 484 485 525 484 525 524 485 486 526 485 526 525 486 487 527 486 527 526 487 488 528 487 528 527 488 489 529 488 529 528 489 490 530 489 530 529 490 491 531 490 531 530 491 492 532 491 532 531 492 493 533 492 533 532 493 494 534 493 534 533 494 495 535 494 535 534 495 496 536 495 536 535 496 497 537 496 537 536 497 498 538 497 538 537 498 499 539 498 539 538 499 500 540 499 540 539 500 501 541 500 541 540 501 502 542 501 542 541 502 503 543 502 543 542 503 504 544 503 544 543 504 505 545 504 545 544 505 506 546 505 546 545 506 507 547 506 547 546 507 508 548 507 548 547 508 509 549 508 549 548 509 510 550 509 550 549 510 511 551 510 551 550 511 512 552 511 552 551 512 513 553 512 553 552 513 514 554 513 554 553 514 515 555 514 555 554 515 516 556 515 556 555 516 517 557 516 557 556 517 518 558 517 558 557 518 519 559 518 559 558 519 520 560 519 560 559 521 522 562 521 562 561 522 523 563 522 563 562 523 524 564 523 564 563 524 525 565 524 565 564 525 526 566 525 566 565 526 527 567 526 567 566 527 528 568 527 568 567 528 529 569 528 569 568 529 530 570 529 570 569 530 531 571 530 571 570 531 532 572 531 572 571 532 533 573 532 573 572 533 534 574 533 574 573 534 535 575 534 575 574 535 536 576 535 576 575 536 537 577 536 577 576 537 538 578 537 578 577 538 539 579 538 579 578 539 540 580 539 580 579 540 541 581 540 581 580 541 542 582 541 582 581 542 543 583 542 583 582 543 544 584 543 584 583 544 545 585 544 585 584 545 546 586 545 586 585 546 547 587 546 587 586 547 548 588 547 588 587 548 549 589 548 589 588 549 550 590 549 590 589 550 551 591 550 591 590 551 552 592 551 592 591 552 553 593 552 593 592 553 554 594 553 594 593 554 555 595 554 595 594 555 556 596 555 596 595 556 557 597 556 597 596 557 558 598 557 598 597 558 559 599 558 599 598 559 560 600 559 600 599 561 562 602 561 602 601 562 563 603 562 603 602 563 564 604 563 604 603 564 565 605 564 605 604 565 566 606 565 606 605 566 567 607 566 607 606 567 568 608 567 608 607 568 569 609 568 609 608 569 570 610 569 610 609 570 571 611 570 611 610 571 572 612 571 612 611 572 573 613 572 613 612 573 574 614 573 614 613 574 575 615 574 615 614 575 576 616 575 616 615 576 577 617 576 617 616 577 578 618 577 618 617 578 579 619 578 619 618 579 580 620 579 620 619 580 581 621 580 621 620 581 582 622 581 622 621 582 583 623 582 623 622 583 584 624 583 624 623 584 585 625 584 625 624 585 586 626 585 626 625 586 587 627 586 627 626 587 588 628 587 628 627 588 589 629 588 629 628 589 590 630 589 630 629 590 591 631 590 631 630 591 592 632 591 632 631 592 593 633 592 633 632 593 594 634 593 634 633 594 595 635 594 635 634 595 596 636 595 636 635 596 597 637 596 637 636 597 598 638 597 638 637 598 599 639 598 639 638 599 600 640 599 640 639 601 602 642 601 642 641 602 603 643 602 643 642 603 604 644 603 644 643 604 605 645 604 645 644 605 606 646 605 646 645 606 607 647 606 647 646 607 608 648 607 648 647 608 609 649 608 649 648 609 610 650 609 650 649 610 611 651 610 651 650 611 612 652 611 652 651 612 613 653 612 653 652 613 614 654 613 654 653 614 615 655 614 655 654 615 616 656 615 656 655 616 617 657 616 657 656 617 618 658 617 658 657 618 619 659 618 659 658 619 620 660 619 660 659 620 621 661 620 661 660 621 622 662 621 662 661 622 623 663 622 663 662 623 624 664 623 664 663 624 625 665 624 665 664 625 626 666 625 666 665 626 627 667 626 667 666 627 628 668 627 668 667 628 629 669 628 669 668 629 630 670 629 670 669 630 631 671 630 671 670 631 632 672 631 672 671 632 633 673 632 673 672 633 634 674 633 674 673 634 635 675 634 675 674 635 636 676 635 676 675 636 637 677 636 677 676 637 638 678 637 678 677 638 639 679 638 679 678 639 640 680 639 680 679 641 642 682 641 682 681 642 643 683 642 683 682 643 644 684 643 684 683 644 645 685 644 685 684 645 646 686 645 686 685 646 647 687 646 687 686 647 648 688 647 688 687 648 649 689 648 689 688 649 650 690 649 690 689 650 651 691 650 691 690 651 652 692 651 692 691 652 653 693 652 693 692 653 654 694 653 694 693 654 655 695 654 695 694 655 656 696 655 696 695 656 657 697 656 697 696 657 658 698 657 698 697 658 659 699 658 699 698 659 660 700 659 700 699 660 661 701 660 701 700 661 662 702 661 702 701 662 663 703 662 703 702 663 664 704 663 704 703 664 665 705 664 705 704 665 666 706 665 706 705 666 667 707 666 707 706 667 668 708 667 708 707 668 669 709 668 709 708 669 670 710 669 710 709 670 671 711 670 711 710 671 672 712 671 712 711 672 673 713 672 713 712 673 674 714 673 714 713 674 675 715 674 715 714 675 676 716 675 716 715 676 677 717 676 717 716 677 678 718 677 718 717 678 679 719 678 719 718 679 680 720 679 720 719 681 682 722 681 722 721 682 683 723 682 723 722 683 684 724 683 724 723 684 685 725 684 725 724 685 686 726 685 726 725 686 687 727 686 727 726 687 688 728 687 728 727 688 689 729 688 729 728 689 690 730 689 730 729 690 691 731 690 731 730 691 692 732 691 732 731 692 693 733 692 733 732 693 694 734 693 734 733 694 695 735 694 735 734 695 696 736 695 736 735 696 697 737 696 737 736 697 698 738 697 738 737 698 699 739 698 739 738 699 700 740 699 740 739 700 701 741 700 741 740 701 702 742 701 742 741 702 703 743 702 743 742 703 704 744 703 744 743 704 705 745 704 745 744 705 706 746 705 746 745 706 707 747 706 747 746 707 708 748 707 748 747 708 709 749 708 749 748 709 710 750 709 750 749 710 711 751 710 751 750 711 712 752 711 752 751 712 713 753 712 753 752 713 714 754 713 754 753 714 715 755 714 755 754 715 716 756 715 756 755 716 717 757 716 757 756 717 718 758 717 758 757 718 719 759 718 759 758 719 720 760 719 760 759 721 722 762 721 762 761 722 723 763 722 763 762 723 724 764 723 764 763 724 725 765 724 765 764 725 726 766 725 766 765 726 727 767 726 767 766 727 728 768 727 768 767 728 729 769 728 769 768 729 730 770 729 770 769 730 731 771 730 771 770 731 732 772 731 772 771 732 733 773 732 773 772 733 734 774 733 774 773 734 735 775 734 775 774 735 736 776 735 776 775 736 737 777 736 777 776 737 738 778 737 778 777 738 739 779 738 779 778 739 740 780 739 780 779 740 741 781 740 781 780 741 742 782 741 782 781 742 743 783 742 783 782 743 744 784 743 784 783 744 745 785 744 785 784 745 746 786 745 786 785 746 747 787 746 787 786 747 748 788 747 788 787 748 749 789 748 789 788 749 750 790 749 790 789 750 751 791 750 791 790 751 752 792 751 792 791 752 753 793 752 793 792 753 754 794 753 794 793 754 755 795 754 795 794 755 756 796 755 796 795 756 757 797 756 797 796 757 758 798 757 798 797 758 759 799 758 799 798 759 760 800 759 800 799 761 762 802 761 802 801 762 763 803 762 803 802 763 764 804 763 804 803 764 765 805 764 805 804 765 766 806 765 806 805 766 767 807 766 807 806 767 768 808 767 808 807 768 769 809 768 809 808 769 770 810 769 810 809 770 771 811 770 811 810 771 772 812 771 812 811 772 773 813 772 813 812 773 774 814 773 814 813 774 775 815 774 815 814 775 776 816 775 816 815 776 777 817 776 817 816 777 778 818 777 818 817 778 779 819 778 819 818 779 780 820 779 820 819 780 781 821 780 821 820 781 782 822 781 822 821 782 783 823 782 823 822 783 784 824 783 824 823 784 785 825 784 825 824 785 786 826 785 826 825 786 787 827 786 827 826 787 788 828 787 828 827 788 789 829 788 829 828 789 790 830 789 830 829 790 791 831 790 831 830 791 792 832 791 832 831 792 793 833 792 833 832 793 794 834 793 834 833 794 795 835 794 835 834 795 796 836 795 836 835 796 797 837 796 837 836 797 798 838 797 838 837 798 799 839 798 839 838 799 800 840 799 840 839 801 802 842 801 842 841 802 803 843 802 843 842 803 804 844 803 844 843 804 805 845 804 845 844 805 806 846 805 846 845 806 807 847 806 847 846 807 808 848 807 848 847 808 809 849 808 849 848 809 810 850 809 850 849 810 811 851 810 851 850 811 812 852 811 852 851 812 813 853 812 853 852 813 814 854 813 854 853 814 815 855 814 855 854 815 816 856 815 856 855 816 817 857 816 857 856 817 818 858 817 858 857 818 819 859 818 859 858 819 820 860 819 860 859 820 821 861 820 861 860 821 822 862 821 862 861 822 823 863 822 863 862 823 824 864 823 864 863 824 825 865 824 865 864 825 826 866 825 866 865 826 827 867 826 867 866 827 828 868 827 868 867 828 829 869 828 869 868 829 830 870 829 870 869 830 831 871 830 871 870 831 832 872 831 872 871 832 833 873 832 873 872 833 834 874 833 874 873 834 835 875 834 875 874 835 836 876 835 876 875 836 837 877 836 877 876 837 838 878 837 878 877 838 839 879 838 879 878 839 840 880 839 880 879 841 842 882 841 882 881 842 843 883 842 883 882 843 844 884 843 884 883 844 845 885 844 885 884 845 846 886 845 886 885 846 847 887 846 887 886 847 848 888 847 888 887 848 849 889 848 889 888 849 850 890 849 890 889 850 851 891 850 891 890 851 852 892 851 892 891 852 853 893 852 893 892 853 854 894 853 894 893 854 855 895 854 895 894 855 856 896 855 896 895 856 857 897 856 897 896 857 858 898 857 898 897 858 859 899 858 899 898 859 860 900 859 900 899 860 861 901 860 901 900 861 862 902 861 902 901 862 863 903 862 903 902 863 864 904 863 904 903 864 865 905 864 905 904 865 866 906 865 906 905 866 867 907 866 907 906 867 868 908 867 908 907 868 869 909 868 909 908 869 870 910 869 910 909 870 871 911 870 911 910 871 872 912 871 912 911 872 873 913 872 913 912 873 874 914 873 914 913 874 875 915 874 915 914 875 876 916 875 916 915 876 877 917 876 917 916 877 878 918 877 918 917 878 879 919 878 919 918 879 880 920 879 920 919 881 882 922 881 922 921 882 883 923 882 923 922 883 884 924 883 924 923 884 885 925 884 925 924 885 886 926 885 926 925 886 887 927 886 927 926 887 888 928 887 928 927 888 889 929 888 929 928 889 890 930 889 930 929 890 891 931 890 931 930 891 892 932 891 932 931 892 893 933 892 933 932 893 894 934 893 934 933 894 895 935 894 935 934 895 896 936 895 936 935 896 897 937 896 937 936 897 898 938 897 938 937 898 899 939 898 939 938 899 900 940 899 940 939 900 901 941 900 941 940 901 902 942 901 942 941 902 903 943 902 943 942 903 904 944 903 944 943 904 905 945 904 945 944 905 906 946 905 946 945 906 907 947 906 947 946 907 908 948 907 948 947 908 909 949 908 949 948 909 910 950 909 950 949 910 911 951 910 951 950 911 912 952 911 952 951 912 913 953 912 953 952 913 914 954 913 954 953 914 915 955 914 955 954 915 916 956 915 956 955 916 917 957 916 957 956 917 918 958 917 958 957 918 919 959 918 959 958 919 920 960 919 960 959 921 922 962 921 962 961 922 923 963 922 963 962 923 924 964 923 964 963 924 925 965 924 965 964 925 926 966 925 966 965 926 927 967 926 967 966 927 928 968 927 968 967 928 929 969 928 969 968 929 930 970 929 970 969 930 931 971 930 971 970 931 932 972 931 972 971 932 933 973 932 973 972 933 934 974 933 974 973 934 935 975 934 975 974 935 936 976 935 976 975 936 937 977 936 977 976 937 938 978 937 978 977 938 939 979 938 979 978 939 940 980 939 980 979 940 941 981 940 981 980 941 942 982 941 982 981 942 943 983 942 983 982 943 944 984 943 984 983 944 945 985 944 985 984 945 946 986 945 986 985 946 947 987 946 987 986 947 948 988 947 988 987 948 949 989 948 989 988 949 950 990 949 990 989 950 951 991 950 991 990 951 952 992 951 992 991 952 953 993 952 993 992 953 954 994 953 994 993 954 955 995 954 995 994 955 956 996 955 996 995 956 957 997 956 997 996 957 958 998 957 998 997 958 959 999 958 999 998 959 960 1000 959 1000 999 961 962 1002 961 1002 1001 962 963 1003 962 1003 1002 963 964 1004 963 1004 1003 964 965 1005 964 1005 1004 965 966 1006 965 1006 1005 966 967 1007 966 1007 1006 967 968 1008 967 1008 1007 968 969 1009 968 1009 1008 969 970 1010 969 1010 1009 970 971 1011 970 1011 1010 971 972 1012 971 1012 1011 972 973 1013 972 1013 1012 973 974 1014 973 1014 1013 974 975 1015 974 1015 1014 975 976 1016 975 1016 1015 976 977 1017 976 1017 1016 977 978 1018 977 1018 1017 978 979 1019 978 1019 1018 979 980 1020 979 1020 1019 980 981 1021 980 1021 1020 981 982 1022 981 1022 1021 982 983 1023 982 1023 1022 983 984 1024 983 1024 1023 984 985 1025 984 1025 1024 985 986 1026 985 1026 1025 986 987 1027 986 1027 1026 987 988 1028 987 1028 1027 988 989 1029 988 1029 1028 989 990 1030 989 1030 1029 990 991 1031 990 1031 1030 991 992 1032 991 1032 1031 992 993 1033 992 1033 1032 993 994 1034 993 1034 1033 994 995 1035 994 1035 1034 995 996 1036 995 1036 1035 996 997 1037 996 1037 1036 997 998 1038 997 1038 1037 998 999 1039 998 1039 1038 999 1000 1040 999 1040 1039 1001 1002 1042 1001 1042 1041 1002 1003 1043 1002 1043 1042 1003 1004 1044 1003 1044 1043 1004 1005 1045 1004 1045 1044 1005 1006 1046 1005 1046 1045 1006 1007 1047 1006 1047 1046 1007 1008 1048 1007 1048 1047 1008 1009 1049 1008 1049 1048 1009 1010 1050 1009 1050 1049 1010 1011 1051 1010 1051 1050 1011 1012 1052 1011 1052 1051 1012 1013 1053 1012 1053 1052 1013 1014 1054 1013 1054 1053 1014 1015 1055 1014 1055 1054 1015 1016 1056 1015 1056 1055 1016 1017 1057 1016 1057 1056 1017 1018 1058 1017 1058 1057 1018 1019 1059 1018 1059 1058 1019 1020 1060 1019 1060 1059 1020 1021 1061 1020 1061 1060 1021 1022 1062 1021 1062 1061 1022 1023 1063 1022 1063 1062 1023 1024 1064 1023 1064 1063 1024 1025 1065 1024 1065 1064 1025 1026 1066 1025 1066 1065 1026 1027 1067 1026 1067 1066 1027 1028 1068 1027 1068 1067 1028 1029 1069 1028 1069 1068 1029 1030 1070 1029 1070 1069 1030 1031 1071 1030 1071 1070 1031 1032 1072 1031 1072 1071 1032 1033 1073 1032 1073 1072 1033 1034 1074 1033 1074 1073 1034 1035 1075 1034 1075 1074 1035 1036 1076 1035 1076 1075 1036 1037 1077 1036 1077 1076 1037 1038 1078 1037 1078 1077 1038 1039 1079 1038 1079 1078 1039 1040 1080 1039 1080 1079 1041 1042 1082 1041 1082 1081 1042 1043 1083 1042 1083 1082 1043 1044 1084 1043 1084 1083 1044 1045 1085 1044 1085 1084 1045 1046 1086 1045 1086 1085 1046 1047 1087 1046 1087 1086 1047 1048 1088 1047 1088 1087 1048 1049 1089 1048 1089 1088 1049 1050 1090 1049 1090 1089 1050 1051 1091 1050 1091 1090 1051 1052 1092 1051 1092 1091 1052 1053 1093 1052 1093 1092 1053 1054 1094 1053 1094 1093 1054 1055 1095 1054 1095 1094 1055 1056 1096 1055 1096 1095 1056 1057 1097 1056 1097 1096 1057 1058 1098 1057 1098 1097 1058 1059 1099 1058 1099 1098 1059 1060 1100 1059 1100 1099 1060 1061 1101 1060 1101 1100 1061 1062 1102 1061 1102 1101 1062 1063 1103 1062 1103 1102 1063 1064 1104 1063 1104 1103 1064 1065 1105 1064 1105 1104 1065 1066 1106 1065 1106 1105 1066 1067 1107 1066 1107 1106 1067 1068 1108 1067 1108 1107 1068 1069 1109 1068 1109 1108 1069 1070 1110 1069 1110 1109 1070 1071 1111 1070 1111 1110 1071 1072 1112 1071 1112 1111 1072 1073 1113 1072 1113 1112 1073 1074 1114 1073 1114 1113 1074 1075 1115 1074 1115 1114 1075 1076 1116 1075 1116 1115 1076 1077 1117 1076 1117 1116 1077 1078 1118 1077 1118 1117 1078 1079 1119 1078 1119 1118 1079 1080 1120 1079 1120 1119 1081 1082 1122 1081 1122 1121 1082 1083 1123 1082 1123 1122 1083 1084 1124 1083 1124 1123 1084 1085 1125 1084 1125 1124 1085 1086 1126 1085 1126 1125 1086 1087 1127 1086 1127 1126 1087 1088 1128 1087 1128 1127 1088 1089 1129 1088 1129 1128 1089 1090 1130 1089 1130 1129 1090 1091 1131 1090 1131 1130 1091 1092 1132 1091 1132 1131 1092 1093 1133 1092 1133 1132 1093 1094 1134 1093 1134 1133 1094 1095 1135 1094 1135 1134 1095 1096 1136 1095 1136 1135 1096 1097 1137 1096 1137 1136 1097 1098 1138 1097 1138 1137 1098 1099 1139 1098 1139 1138 1099 1100 1140 1099 1140 1139 1100 1101 1141 1100 1141 1140 1101 1102 1142 1101 1142 1141 1102 1103 1143 1102 1143 1142 1103 1104 1144 1103 1144 1143 1104 1105 1145 1104 1145 1144 1105 1106 1146 1105 1146 1145 1106 1107 1147 1106 1147 1146 1107 1108 1148 1107 1148 1147 1108 1109 1149 1108 1149 1148 1109 1110 1150 1109 1150 1149 1110 1111 1151 1110 1151 1150 1111 1112 1152 1111 1152 1151 1112 1113 1153 1112 1153 1152 1113 1114 1154 1113 1154 1153 1114 1115 1155 1114 1155 1154 1115 1116 1156 1115 1156 1155 1116 1117 1157 1116 1157 1156 1117 1118 1158 1117 1158 1157 1118 1119 1159 1118 1159 1158 1119 1120 1160 1119 1160 1159 1121 1122 1162 1121 1162 1161 1122 1123 1163 1122 1163 1162 1123 1124 1164 1123 1164 1163 1124 1125 1165 1124 1165 1164 1125 1126 1166 1125 1166 1165 1126 1127 1167 1126 1167 1166 1127 1128 1168 1127 1168 1167 1128 1129 1169 1128 1169 1168 1129 1130 1170 1129 1170 1169 1130 1131 1171 1130 1171 1170 1131 1132 1172 1131 1172 1171 1132 1133 1173 1132 1173 1172 1133 1134 1174 1133 1174 1173 1134 1135 1175 1134 1175 1174 1135 1136 1176 1135 1176 1175 1136 1137 1177 1136 1177 1176 1137 1138 1178 1137 1178 1177 1138 1139 1179 1138 1179 1178 1139 1140 1180 1139 1180 1179 1140 1141 1181 1140 1181 1180 1141 1142 1182 1141 1182 1181 1142 1143 1183 1142 1183 1182 1143 1144 1184 1143 1184 1183 1144 1145 1185 1144 1185 1184 1145 1146 1186 1145 1186 1185 1146 1147 1187 1146 1187 1186 1147 1148 1188 1147 1188 1187 1148 1149 1189 1148 1189 1188 1149 1150 1190 1149 1190 1189 1150 1151 1191 1150 1191 1190 1151 1152 1192 1151 1192 1191 1152 1153 1193 1152 1193 1192 1153 1154 1194 1153 1194 1193 1154 1155 1195 1154 1195 1194 1155 1156 1196 1155 1196 1195 1156 1157 1197 1156 1197 1196 1157 1158 1198 1157 1198 1197 1158 1159 1199 1158 1199 1198 1159 1160 1200 1159 1200 1199 1161 1162 1202 1161 1202 1201 1162 1163 1203 1162 1203 1202 1163 1164 1204 1163 1204 1203 1164 1165 1205 1164 1205 1204 1165 1166 1206 1165 1206 1205 1166 1167 1207 1166 1207 1206 1167 1168 1208 1167 1208 1207 1168 1169 1209 1168 1209 1208 1169 1170 1210 1169 1210 1209 1170 1171 1211 1170 1211 1210 1171 1172 1212 1171 1212 1211 1172 1173 1213 1172 1213 1212 1173 1174 1214 1173 1214 1213 1174 1175 1215 1174 1215 1214 1175 1176 1216 1175 1216 1215 1176 1177 1217 1176 1217 1216 1177 1178 1218 1177 1218 1217 1178 1179 1219 1178 1219 1218 1179 1180 1220 1179 1220 1219 1180 1181 1221 1180 1221 1220 1181 1182 1222 1181 1222 1221 1182 1183 1223 1182 1223 1222 1183 1184 1224 1183 1224 1223 1184 1185 1225 1184 1225 1224 1185 1186 1226 1185 1226 1225 1186 1187 1227 1186 1227 1226 1187 1188 1228 1187 1228 1227 1188 1189 1229 1188 1229 1228 1189 1190 1230 1189 1230 1229 1190 1191 1231 1190 1231 1230 1191 1192 1232 1191 1232 1231 1192 1193 1233 1192 1233 1232 1193 1194 1234 1193 1234 1233 1194 1195 1235 1194 1235 1234 1195 1196 1236 1195 1236 1235 1196 1197 1237 1196 1237 1236 1197 1198 1238 1197 1238 1237 1198 1199 1239 1198 1239 1238 1199 1200 1240 1199 1240 1239 1201 1202 1242 1201 1242 1241 1202 1203 1243 1202 1243 1242 1203 1204 1244 1203 1244 1243 1204 1205 1245 1204 1245 1244 1205 1206 1246 1205 1246 1245 1206 1207 1247 1206 1247 1246 1207 1208 1248 1207 1248 1247 1208 1209 1249 1208 1249 1248 1209 1210 1250 1209 1250 1249 1210 1211 1251 1210 1251 1250 1211 1212 1252 1211 1252 1251 1212 1213 1253 1212 1253 1252 1213 1214 1254 1213 1254 1253 1214 1215 1255 1214 1255 1254 1215 1216 1256 1215 1256 1255 1216 1217 1257 1216 1257 1256 1217 1218 1258 1217 1258 1257 1218 1219 1259 1218 1259 1258 1219 1220 1260 1219 1260 1259 1220 1221 1261 1220 1261 1260 1221 1222 1262 1221 1262 1261 1222 1223 1263 1222 1263 1262 1223 1224 1264 1223 1264 1263 1224 1225 1265 1224 1265 1264 1225 1226 1266 1225 1266 1265 1226 1227 1267 1226 1267 1266 1227 1228 1268 1227 1268 1267 1228 1229 1269 1228 1269 1268 1229 1230 1270 1229 1270 1269 1230 1231 1271 1230 1271 1270 1231 1232 1272 1231 1272 1271 1232 1233 1273 1232 1273 1272 1233 1234 1274 1233 1274 1273 1234 1235 1275 1234 1275 1274 1235 1236 1276 1235 1276 1275 1236 1237 1277 1236 1277 1276 1237 1238 1278 1237 1278 1277 1238 1239 1279 1238 1279 1278 1239 1240 1280 1239 1280 1279 1241 1242 1282 1241 1282 1281 1242 1243 1283 1242 1283 1282 1243 1244 1284 1243 1284 1283 1244 1245 1285 1244 1285 1284 1245 1246 1286 1245 1286 1285 1246 1247 1287 1246 1287 1286 1247 1248 1288 1247 1288 1287 1248 1249 1289 1248 1289 1288 1249 1250 1290 1249 1290 1289 1250 1251 1291 1250 1291 1290 1251 1252 1292 1251 1292 1291 1252 1253 1293 1252 1293 1292 1253 1254 1294 1253 1294 1293 1254 1255 1295 1254 1295 1294 1255 1256 1296 1255 1296 1295 1256 1257 1297 1256 1297 1296 1257 1258 1298 1257 1298 1297 1258 1259 1299 1258 1299 1298 1259 1260 1300 1259 1300 1299 1260 1261 1301 1260 1301 1300 1261 1262 1302 1261 1302 1301 1262 1263 1303 1262 1303 1302 1263 1264 1304 1263 1304 1303 1264 1265 1305 1264 1305 1304 1265 1266 1306 1265 1306 1305 1266 1267 1307 1266 1307 1306 1267 1268 1308 1267 1308 1307 1268 1269 1309 1268 1309 1308 1269 1270 1310 1269 1310 1309 1270 1271 1311 1270 1311 1310 1271 1272 1312 1271 1312 1311 1272 1273 1313 1272 1313 1312 1273 1274 1314 1273 1314 1313 1274 1275 1315 1274 1315 1314 1275 1276 1316 1275 1316 1315 1276 1277 1317 1276 1317 1316 1277 1278 1318 1277 1318 1317 1278 1279 1319 1278 1319 1318 1279 1280 1320 1279 1320 1319 1281 1282 1322 1281 1322 1321 1282 1283 1323 1282 1323 1322 1283 1284 1324 1283 1324 1323 1284 1285 1325 1284 1325 1324 1285 1286 1326 1285 1326 1325 1286 1287 1327 1286 1327 1326 1287 1288 1328 1287 1328 1327 1288 1289 1329 1288 1329 1328 1289 1290 1330 1289 1330 1329 1290 1291 1331 1290 1331 1330 1291 1292 1332 1291 1332 1331 1292 1293 1333 1292 1333 1332 1293 1294 1334 1293 1334 1333 1294 1295 1335 1294 1335 1334 1295 1296 1336 1295 1336 1335 1296 1297 1337 1296 1337 1336 1297 1298 1338 1297 1338 1337 1298 1299 1339 1298 1339 1338 1299 1300 1340 1299 1340 1339 1300 1301 1341 1300 1341 1340 1301 1302 1342 1301 1342 1341 1302 1303 1343 1302 1343 1342 1303 1304 1344 1303 1344 1343 1304 1305 1345 1304 1345 1344 1305 1306 1346 1305 1346 1345 1306 1307 1347 1306 1347 1346 1307 1308 1348 1307 1348 1347 1308 1309 1349 1308 1349 1348 1309 1310 1350 1309 1350 1349 1310 1311 1351 1310 1351 1350 1311 1312 1352 1311 1352 1351 1312 1313 1353 1312 1353 1352 1313 1314 1354 1313 1354 1353 1314 1315 1355 1314 1355 1354 1315 1316 1356 1315 1356 1355 1316 1317 1357 1316 1357 1356 1317 1318 1358 1317 1358 1357 1318 1319 1359 1318 1359 1358 1319 1320 1360 1319 1360 1359 1321 1322 1362 1321 1362 1361 1322 1323 1363 1322 1363 1362 1323 1324 1364 1323 1364 1363 1324 1325 1365 1324 1365 1364 1325 1326 1366 1325 1366 1365 1326 1327 1367 1326 1367 1366 1327 1328 1368 1327 1368 1367 1328 1329 1369 1328 1369 1368 1329 1330 1370 1329 1370 1369 1330 1331 1371 1330 1371 1370 1331 1332 1372 1331 1372 1371 1332 1333 1373 1332 1373 1372 1333 1334 1374 1333 1374 1373 1334 1335 1375 1334 1375 1374 1335 1336 1376 1335 1376 1375 1336 1337 1377 1336 1377 1376 1337 1338 1378 1337 1378 1377 1338 1339 1379 1338 1379 1378 1339 1340 1380 1339 1380 1379 1340 1341 1381 1340 1381 1380 1341 1342 1382 1341 1382 1381 1342 1343 1383 1342 1383 1382 1343 1344 1384 1343 1384 1383 1344 1345 1385 1344 1385 1384 1345 1346 1386 1345 1386 1385 1346 1347 1387 1346 1387 1386 1347 1348 1388 1347 1388 1387 1348 1349 1389 1348 1389 1388 1349 1350 1390 1349 1390 1389 1350 1351 1391 1350 1391 1390 1351 1352 1392 1351 1392 1391 1352 1353 1393 1352 1393 1392 1353 1354 1394 1353 1394 1393 1354 1355 1395 1354 1395 1394 1355 1356 1396 1355 1396 1395 1356 1357 1397 1356 1397 1396 1357 1358 1398 1357 1398 1397 1358 1359 1399 1358 1399 1398 1359 1360 1400 1359 1400 1399 1361 1362 1402 1361 1402 1401 1362 1363 1403 1362 1403 1402 1363 1364 1404 1363 1404 1403 1364 1365 1405 1364 1405 1404 1365 1366 1406 1365 1406 1405 1366 1367 1407 1366 1407 1406 1367 1368 1408 1367 1408 1407 1368 1369 1409 1368 1409 1408 1369 1370 1410 1369 1410 1409 1370 1371 1411 1370 1411 1410 1371 1372 1412 1371 1412 1411 1372 1373 1413 1372 1413 1412 1373 1374 1414 1373 1414 1413 1374 1375 1415 1374 1415 1414 1375 1376 1416 1375 1416 1415 1376 1377 1417 1376 1417 1416 1377 1378 1418 1377 1418 1417 1378 1379 1419 1378 1419 1418 1379 1380 1420 1379 1420 1419 1380 1381 1421 1380 1421 1420 1381 1382 1422 1381 1422 1421 1382 1383 1423 1382 1423 1422 1383 1384 1424 1383 1424 1423 1384 1385 1425 1384 1425 1424 1385 1386 1426 1385 1426 1425 1386 1387 1427 1386 1427 1426 1387 1388 1428 1387 1428 1427 1388 1389 1429 1388 1429 1428 1389 1390 1430 1389 1430 1429 1390 1391 1431 1390 1431 1430 1391 1392 1432 1391 1432 1431 1392 1393 1433 1392 1433 1432 1393 1394 1434 1393 1434 1433 1394 1395 1435 1394 1435 1434 1395 1396 1436 1395 1436 1435 1396 1397 1437 1396 1437 1436 1397 1398 1438 1397 1438 1437 1398 1399 1439 1398 1439 1438 1399 1400 1440 1399 1440 1439 1401 1402 1442 1401 1442 1441 1402 1403 1443 1402 1443 1442 1403 1404 1444 1403 1444 1443 1404 1405 1445 1404 1445 1444 1405 1406 1446 1405 1446 1445 1406 1407 1447 1406 1447 1446 1407 1408 1448 1407 1448 1447 1408 1409 1449 1408 1449 1448 1409 1410 1450 1409 1450 1449 1410 1411 1451 1410 1451 1450 1411 1412 1452 1411 1452 1451 1412 1413 1453 1412 1453 1452 1413 1414 1454 1413 1454 1453 1414 1415 1455 1414 1455 1454 1415 1416 1456 1415 1456 1455 1416 1417 1457 1416 1457 1456 1417 1418 1458 1417 1458 1457 1418 1419 1459 1418 1459 1458 1419 1420 1460 1419 1460 1459 1420 1421 1461 1420 1461 1460 1421 1422 1462 1421 1462 1461 1422 1423 1463 1422 1463 1462 1423 1424 1464 1423 1464 1463 1424 1425 1465 1424 1465 1464 1425 1426 1466 1425 1466 1465 1426 1427 1467 1426 1467 1466 1427 1428 1468 1427 1468 1467 1428 1429 1469 1428 1469 1468 1429 1430 1470 1429 1470 1469 1430 1431 1471 1430 1471 1470 1431 1432 1472 1431 1472 1471 1432 1433 1473 1432 1473 1472 1433 1434 1474 1433 1474 1473 1434 1435 1475 1434 1475 1474 1435 1436 1476 1435 1476 1475 1436 1437 1477 1436 1477 1476 1437 1438 1478 1437 1478 1477 1438 1439 1479 1438 1479 1478 1439 1440 1480 1439 1480 1479 1441 1442 1482 1441 1482 1481 1442 1443 1483 1442 1483 1482 1443 1444 1484 1443 1484 1483 1444 1445 1485 1444 1485 1484 1445 1446 1486 1445 1486 1485 1446 1447 1487 1446 1487 1486 1447 1448 1488 1447 1488 1487 1448 1449 1489 1448 1489 1488 1449 1450 1490 1449 1490 1489 1450 1451 1491 1450 1491 1490 1451 1452 1492 1451 1492 1491 1452 1453 1493 1452 1493 1492 1453 1454 1494 1453 1494 1493 1454 1455 1495 1454 1495 1494 1455 1456 1496 1455 1496 1495 1456 1457 1497 1456 1497 1496 1457 1458 1498 1457 1498 1497 1458 1459 1499 1458 1499 1498 1459 1460 1500 1459 1500 1499 1460 1461 1501 1460 1501 1500 1461 1462 1502 1461 1502 1501 1462 1463 1503 1462 1503 1502 1463 1464 1504 1463 1504 1503 1464 1465 1505 1464 1505 1504 1465 1466 1506 1465 1506 1505 1466 1467 1507 1466 1507 1506 1467 1468 1508 1467 1508 1507 1468 1469 1509 1468 1509 1508 1469 1470 1510 1469 1510 1509 1470 1471 1511 1470 1511 1510 1471 1472 1512 1471 1512 1511 1472 1473 1513 1472 1513 1512 1473 1474 1514 1473 1514 1513 1474 1475 1515 1474 1515 1514 1475 1476 1516 1475 1516 1515 1476 1477 1517 1476 1517 1516 1477 1478 1518 1477 1518 1517 1478 1479 1519 1478 1519 1518 1479 1480 1520 1479 1520 1519 1481 1482 1522 1481 1522 1521 1482 1483 1523 1482 1523 1522 1483 1484 1524 1483 1524 1523 1484 1485 1525 1484 1525 1524 1485 1486 1526 1485 1526 1525 1486 1487 1527 1486 1527 1526 1487 1488 1528 1487 1528 1527 1488 1489 1529 1488 1529 1528 1489 1490 1530 1489 1530 1529 1490 1491 1531 1490 1531 1530 1491 1492 1532 1491 1532 1531 1492 1493 1533 1492 1533 1532 1493 1494 1534 1493 1534 1533 1494 1495 1535 1494 1535 1534 1495 1496 1536 1495 1536 1535 1496 1497 1537 1496 1537 1536 1497 1498 1538 1497 1538 1537 1498 1499 1539 1498 1539 1538 1499 1500 1540 1499 1540 1539 1500 1501 1541 1500 1541 1540 1501 1502 1542 1501 1542 1541 1502 1503 1543 1502 1543 1542 1503 1504 1544 1503 1544 1543 1504 1505 1545 1504 1545 1544 1505 1506 1546 1505 1546 1545 1506 1507 1547 1506 1547 1546 1507 1508 1548 1507 1548 1547 1508 1509 1549 1508 1549 1548 1509 1510 1550 1509 1550 1549 1510 1511 1551 1510 1551 1550 1511 1512 1552 1511 1552 1551 1512 1513 1553 1512 1553 1552 1513 1514 1554 1513 1554 1553 1514 1515 1555 1514 1555 1554 1515 1516 1556 1515 1556 1555 1516 1517 1557 1516 1557 1556 1517 1518 1558 1517 1558 1557 1518 1519 1559 1518 1559 1558 1519 1520 1560 1519 1560 1559 1521 1522 1562 1521 1562 1561 1522 1523 1563 1522 1563 1562 1523 1524 1564 1523 1564 1563 1524 1525 1565 1524 1565 1564 1525 1526 1566 1525 1566 1565 1526 1527 1567 1526 1567 1566 1527 1528 1568 1527 1568 1567 1528 1529 1569 1528 1569 1568 1529 1530 1570 1529 1570 1569 1530 1531 1571 1530 1571 1570 1531 1532 1572 1531 1572 1571 1532 1533 1573 1532 1573 1572 1533 1534 1574 1533 1574 1573 1534 1535 1575 1534 1575 1574 1535 1536 1576 1535 1576 1575 1536 1537 1577 1536 1577 1576 1537 1538 1578 1537 1578 1577 1538 1539 1579 1538 1579 1578 1539 1540 1580 1539 1580 1579 1540 1541 1581 1540 1581 1580 1541 1542 1582 1541 1582 1581 1542 1543 1583 1542 1583 1582 1543 1544 1584 1543 1584 1583 1544 1545 1585 1544 1585 1584 1545 1546 1586 1545 1586 1585 1546 1547 1587 1546 1587 1586 1547 1548 1588 1547 1588 1587 1548 1549 1589 1548 1589 1588 1549 1550 1590 1549 1590 1589 1550 1551 1591 1550 1591 1590 1551 1552 1592 1551 1592 1591 1552 1553 1593 1552 1593 1592 1553 1554 1594 1553 1594 1593 1554 1555 1595 1554 1595 1594 1555 1556 1596 1555 1596 1595 1556 1557 1597 1556 1597 1596 1557 1558 1598 1557 1598 1597 1558 1559 1599 1558 1599 1598 1559 1560 1600 1559 1600 1599 SHAR_EOF fi # end of overwriting check if test -f 'rplot.eps' then echo shar: will not over-write existing file "'rplot.eps'" else cat << "SHAR_EOF" > 'rplot.eps' %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 235 288 377 504 %%Title: Triangulation Dual %%Creator: CSRFPACK %%EndComments 2.000000 setlinewidth 244 301 moveto 244 491 lineto 368 491 lineto 368 301 lineto closepath stroke 306.500000 396.000000 translate 36.126372 36.058062 scale 0.027707 setlinewidth gsave -1.730038 -2.634640 moveto 1.730038 -2.634640 lineto 1.730038 2.634640 lineto -1.730038 2.634640 lineto closepath clip newpath 0.000000 -1.376122 moveto -0.647574 -0.874045 lineto -0.647574 -0.874045 moveto -1.441698 -1.034448 lineto stroke [ 0.110827 0.110827] 0 setdash -1.441698 -1.034448 moveto 0.000000 -2.195533 lineto stroke [] 0 setdash -1.441698 -1.034448 moveto -1.730038 -1.092689 lineto stroke 0.000000 -1.376122 moveto 0.000000 -2.195533 lineto stroke [ 0.110827 0.110827] 0 setdash 0.000000 -2.195533 moveto 1.441698 -1.034448 lineto stroke [] 0 setdash 0.000000 -2.195533 moveto 0.000000 -2.634640 lineto stroke 0.647574 -0.874045 moveto 0.000000 -0.402757 lineto 0.000000 -1.376122 moveto 0.647574 -0.874045 lineto -0.647574 -0.874045 moveto 0.000000 -0.402757 lineto 0.000000 -0.402757 moveto 0.000000 0.402757 lineto 0.000000 0.402757 moveto -0.647574 0.874045 lineto -0.647574 0.874045 moveto -1.441698 1.034448 lineto stroke [ 0.110827 0.110827] 0 setdash -1.441698 1.034448 moveto -1.441698 -1.034448 lineto stroke [] 0 setdash -1.441698 1.034448 moveto -1.730038 1.092689 lineto stroke 0.647574 -0.874045 moveto 1.441698 -1.034448 lineto stroke [ 0.110827 0.110827] 0 setdash 1.441698 -1.034448 moveto 1.441698 1.034448 lineto stroke [] 0 setdash 1.441698 -1.034448 moveto 1.702358 -1.087098 lineto stroke 0.647574 0.874045 moveto 0.000000 1.376122 lineto 0.000000 0.402757 moveto 0.647574 0.874045 lineto -0.647574 0.874045 moveto 0.000000 1.376122 lineto 0.000000 1.376122 moveto 0.000000 2.195533 lineto stroke [ 0.110827 0.110827] 0 setdash 0.000000 2.195533 moveto -1.441698 1.034448 lineto stroke [] 0 setdash 0.000000 2.195533 moveto 0.000000 2.634640 lineto stroke 0.647574 0.874045 moveto 1.441698 1.034448 lineto stroke [ 0.110827 0.110827] 0 setdash 1.441698 1.034448 moveto 0.000000 2.195533 lineto stroke [] 0 setdash 1.441698 1.034448 moveto 1.702358 1.087098 lineto stroke stroke grestore /Helvetica findfont 0.277068 scalefont setfont 0.110827 setlinewidth 1 setlinecap -1.000000 -1.000000 moveto -1.000000 -1.000000 lineto ( 1) show 1.000000 -1.000000 moveto 1.000000 -1.000000 lineto ( 2) show 0.000000 -0.600000 moveto 0.000000 -0.600000 lineto ( 3) show -0.400000 0.000000 moveto -0.400000 0.000000 lineto ( 4) show 0.400000 0.000000 moveto 0.400000 0.000000 lineto ( 5) show 0.000000 0.600000 moveto 0.000000 0.600000 lineto ( 6) show -1.000000 1.000000 moveto -1.000000 1.000000 lineto ( 7) show 1.000000 1.000000 moveto 1.000000 1.000000 lineto ( 8) show stroke /Helvetica findfont 0.443309 scalefont setfont () stringwidth pop 2 div neg 0.000000 add 3.964566 moveto () show -1.730038 -4.019980 moveto (Window: WX1 = -.173E+01, WX2 = 0.173E+01) show (Window: ) stringwidth pop -1.730038 add -4.906598 moveto ( WY1 = -.263E+01, WY2 = 0.263E+01) show stroke showpage %%EOF  SHAR_EOF fi # end of overwriting check if test -f 'tgplot.eps' then echo shar: will not over-write existing file "'tgplot.eps'" else cat << "SHAR_EOF" > 'tgplot.eps' %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 255 288 357 504 %%Title: Triangulation %%Creator: CSRFPACK %%EndComments 2.000000 setlinewidth 261 301 moveto 261 491 lineto 351 491 lineto 351 301 lineto closepath stroke 306.000000 396.000000 translate 70.104011 70.031916 scale 0.014272 setlinewidth gsave -0.641903 -1.356524 moveto 0.641903 -1.356524 lineto 0.641903 1.356524 lineto -0.641903 1.356524 lineto closepath clip newpath -0.306585 -1.130437 moveto 0.306585 -1.130437 lineto -0.306585 -1.130437 moveto 0.000000 -0.735007 lineto -0.306585 -1.130437 moveto -0.534919 0.000000 lineto 0.306585 -1.130437 moveto 0.534919 0.000000 lineto 0.306585 -1.130437 moveto 0.000000 -0.735007 lineto 0.000000 -0.735007 moveto 0.534919 0.000000 lineto 0.000000 -0.735007 moveto -0.534919 0.000000 lineto -0.534919 0.000000 moveto 0.534919 0.000000 lineto -0.534919 0.000000 moveto 0.000000 0.735007 lineto -0.534919 0.000000 moveto -0.306585 1.130437 lineto 0.534919 0.000000 moveto 0.306585 1.130437 lineto 0.534919 0.000000 moveto 0.000000 0.735007 lineto 0.000000 0.735007 moveto 0.306585 1.130437 lineto 0.000000 0.735007 moveto -0.306585 1.130437 lineto -0.306585 1.130437 moveto 0.306585 1.130437 lineto stroke grestore /Helvetica findfont 0.142719 scalefont setfont -0.306585 -1.130437 moveto ( 1) show 0.306585 -1.130437 moveto ( 2) show 0.000000 -0.735007 moveto ( 3) show -0.534919 0.000000 moveto ( 4) show 0.534919 0.000000 moveto ( 5) show 0.000000 0.735007 moveto ( 6) show -0.306585 1.130437 moveto ( 7) show 0.306585 1.130437 moveto ( 8) show /Helvetica findfont 0.228350 scalefont setfont () stringwidth pop 2 div neg 0.000000 add 2.041574 moveto () show -0.641903 -2.070117 moveto (Window: WX1 = -.642E+00, WX2 = 0.642E+00) show (Window: ) stringwidth pop -0.641903 add -2.526817 moveto ( WY1 = -.136E+01, WY2 = 0.136E+01) show stroke showpage %%EOF  SHAR_EOF fi # end of overwriting check if test -f 'tplot.eps' then echo shar: will not over-write existing file "'tplot.eps'" else cat << "SHAR_EOF" > 'tplot.eps' %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 198 288 414 504 %%Title: Triangulation %%Creator: CSRFPACK %%EndComments 2.000000 setlinewidth 211 301 moveto 211 491 lineto 401 491 lineto 401 301 lineto closepath stroke 306.000000 396.000000 translate 79.166667 79.166667 scale 0.012632 setlinewidth gsave -1.200000 -1.200000 moveto 1.200000 -1.200000 lineto 1.200000 1.200000 lineto -1.200000 1.200000 lineto closepath clip newpath -1.000000 -1.000000 moveto 1.000000 -1.000000 lineto -1.000000 -1.000000 moveto 0.000000 -0.600000 lineto -1.000000 -1.000000 moveto -0.400000 0.000000 lineto -1.000000 -1.000000 moveto -1.000000 1.000000 lineto 1.000000 -1.000000 moveto 1.000000 1.000000 lineto 1.000000 -1.000000 moveto 0.400000 0.000000 lineto 1.000000 -1.000000 moveto 0.000000 -0.600000 lineto 0.000000 -0.600000 moveto 0.400000 0.000000 lineto 0.000000 -0.600000 moveto -0.400000 0.000000 lineto -0.400000 0.000000 moveto -1.000000 1.000000 lineto -0.400000 0.000000 moveto 0.400000 0.000000 lineto -0.400000 0.000000 moveto 0.000000 0.600000 lineto 0.400000 0.000000 moveto 1.000000 1.000000 lineto 0.400000 0.000000 moveto 0.000000 0.600000 lineto 0.000000 0.600000 moveto 1.000000 1.000000 lineto 0.000000 0.600000 moveto -1.000000 1.000000 lineto -1.000000 1.000000 moveto 1.000000 1.000000 lineto stroke grestore /Helvetica findfont 0.126316 scalefont setfont -1.000000 -1.000000 moveto ( 1) show 1.000000 -1.000000 moveto ( 2) show 0.000000 -0.600000 moveto ( 3) show -0.400000 0.000000 moveto ( 4) show 0.400000 0.000000 moveto ( 5) show 0.000000 0.600000 moveto ( 6) show -1.000000 1.000000 moveto ( 7) show 1.000000 1.000000 moveto ( 8) show /Helvetica findfont 0.202105 scalefont setfont () stringwidth pop 2 div neg 0.000000 add 1.806316 moveto () show -1.200000 -1.831579 moveto (Window: WX1 = -.120E+01, WX2 = 0.120E+01) show (Window: ) stringwidth pop -1.200000 add -2.235789 moveto ( WY1 = -.120E+01, WY2 = 0.120E+01) show stroke showpage %%EOF  SHAR_EOF fi # end of overwriting check cd .. if test ! -d 'Src' then mkdir 'Src' fi cd 'Src' if test -f 'src.f' then echo shar: will not over-write existing file "'src.f'" else cat << "SHAR_EOF" > 'src.f' SUBROUTINE CSURF (N,X,Y,TOLBE,IPLOT,PLTSIZ,STRICT,NR, . NA, ND,Z,C,LIST,LPTR,LEND,LNEW,NEAR, . NEXT,NV,LISTV,DXL,DYL,GX,GY,EPS,D, . DMIN,W,QX,QY,IER) INTEGER N, IPLOT, NR, NA, ND, LIST(*), LPTR(*), . LEND(N), LNEW, NEAR(N), NEXT(N), NV, LISTV(*), . IER LOGICAL STRICT DOUBLE PRECISION X(N), Y(N), TOLBE, PLTSIZ, Z(N), . C(N), DXL(*), DYL(*), GX(N), GY(N), . EPS, D(N), DMIN, W(NR), QX(NR,NA), . QY(NR,NA) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/15/98 C C This subroutine constructs a once-continuously differ- C entiable convex bivariate function F that interpolates a C set of N strictly convex data points (data points for C which the piecewise linear interpolant on some triangula- C tion is convex, and no four points are coplanar). Refer C to Subroutines FVAL and FGRID for a means of evaluating F. C C The interpolant F is obtained by applying convolution C smoothing to a piecewise linear Hermite interpolant H of C the data values and a set of convexity-preserving nodal C gradients. The procedure consists of the following ten C steps: C C 1) Construct a convexity-preserving triangulation T, if C it exists, of the data points (nodes and data C values): Subroutine TRMSHC. Remove extraneous C boundary edges (nearly null triangles): Subroutine C DELBE. C 2) Construct a gradient feasibility diagram (the straight C line dual of T): a set of N convex polygons that C partition the plane and such that, for any choice of C nodal gradients, one from each polygon, the piece- C wise linear Hermite interpolant H of the nodal C values and gradients is convex: Subroutine VLIST. C 3) Select a set of nodal gradients by taking the cen- C troids of the gradient feasibility regions or (in C the case of boundary nodes) truncated regions: Sub- C routine GLIST. C 4) Optionally, create level-2 Encapsulated PostScript C files containing plots of T and/or the dual of T C (along with the nodal gradients): Subroutines PLTTR C and PLTGR. C 5) Optionally, compute a scale factor EPS defining a C quadratic function q(p) = EPS*, and adjust the C data values and gradients by subtracting nodal C values and gradients of q, where EPS is defined so C that a strictly convex Hermite interpolant of the C original data can be constructed from a convex Her- C mite interpolant of the adjusted data (Subroutine C ADDQT). C 6) Construct a convexity-preserving triangulation Tg of C the (possibly adjusted) nodal gradients and negative C z-intercepts of the affine nodal functions defined C by the (adjusted) data values and nodal gradients: C Subroutine TRMSHC. C 7) Construct a cell diagram (the straight line dual of C Tg): a set of N convex polygons R_i that partition C the plane and such that the restriction of H to R_i C is the i-th affine nodal function f_i, where f_i(p) C = + z_i for nodes p_i, (adjusted) data C values z_i and (adjusted) gradients g_i for i = 1 to C N and H(p) = Max(i=1,N){f_i(p)}: Subroutine VLIST. C 8) Optionally, create level-2 Encapsulated PostScript C files containing plots of Tg and/or the dual of Tg C (along with the nodes): Subroutines PLTTR and C PLTGR. C 9) Compute the distance D_i from each node p_i to the C nearest boundary point of cell R_i: Subroutine C DELTAI. C 10) Compute weights W_i and quadrature points q_ij de- C fining the quadrature rule C Q(p) = Sum(i=1,NR) [ W_i*Sum(j=1,NA) H(p+q_ij) ] C for approximating F(p) = Integral[H(p+q)*Phi(q)]dq, C where the integral is over the disk D0 of radius C Dmin = Min(i=1,N){D_i} centered at the origin, and C Phi(q) = phi(Norm(q)/Dmin), normalized to have C integral 1, for phi(t) = 1 - 3*t**2 + 2*t**3 (t in C [0,1]): Subroutine GETQW. C C The following is a list of related subprograms which a C user may wish to call directly: C C ADDQT - Given a set of strictly convex Hermite data C (nodes, data values, and nodal gradients such C that there exists a convex Hermite interpolant C of the data values and gradients, and no four C data points are coplanar), adjusts the data C values and gradients such that a strictly con- C vex Hermite interpolant of the data can be C constructed from a convex Hermite interpolant C of the adjusted data. C C PLTCNT - Given a set of function values Z = f(x,y) at the C vertices of a rectangular grid, creates a C level-2 Encapsulated PostScript plot contain- C ing a contour plot of the piecewise bilinear C interpolant of the function values. Refer to C Subroutine FGRID. C C DELTAI - Given a set of nodes p_i, data values z_i, and C nodal gradients g_i for which there exists a C convex Hermite interpolatory surface, let R_i C denote the set of points p such that f_i(p) >= C f_j(p) for all j, where f_i is the affine C nodal function that interpolates the Hermite C data: f_i(p) = + z_i. DELTAI C returns the perpendicular distance from each C node p_i to the boundary of R_i. C C FGRID - Evaluates F at the vertices of a rectangular C grid. C C FVAL - Given a point p and the output parameters from C Subroutine CSURF, returns the value and gradi- C ent of F at p. C C GETQW - Computes weights and quadrature points defining C a rule for approximating values of F. C C GLIST - Given a convexity-preserving triangulation and C its straight-line dual computed by VLIST, re- C turns a set of nodal gradients for which there C exists a convex Hermite interpolant of the C data values and gradients. The nodal gradi- C ents are taken to be the centroids of the C gradient feasibility regions (or truncated C regions). C C LGRAD - Computes the gradient of the linear interpolant C of data values at the vertices of a user- C specified triangle. C C PLTGR - Creates a level-2 Encapsulated PostScript plot C of the straight-line dual of a triangulation C along with a set of nodal gradients. C C PLTTR - Creates a level-2 Encapsulated PostScript plot C of a triangulation. C C TRMSHC - Constructs a convexity-preserving triangulation, C if it exists, of a set of N arbitrarily dis- C tributed points in the plane (referred to as C nodes) with associated data values. C C VLIST - Given a convexity-preserving triangulation, com- C putes its straight-line dual: the set of all C nodal gradients for which there exists a con- C vex Hermite interpolant of the data values and C gradients. C C Refer to the header comments in Subroutine TRMSHC for a C list of additional user-callable subprograms related to C the triangulations. The remaining subprograms in this C package appear in alphabetical order. C C C On input: C C N = Number of nodes and data values. N .GE. 3. C C X,Y = Arrays of length N containing the Cartesian C coordinates of the nodes. (X(K),Y(K)) is re- C ferred to as node K, and K is referred to as C a nodal index. The first three nodes must not C be collinear. C C TOLBE = Positive tolerance used (in Subroutine C DELBE) as a lower bound on the acceptable C aspect ratio (ratio of the radius of the C inscribed circle to that of the circum- C circle) of boundary triangles. This should C be at least 1.E-6 in order to avoid failure C in LGRAD (called by VLIST) and should be C larger (1.E-2) to avoid large errors caused C by steep gradients on the boundary. A large C value, on the other hand, may lead to fail- C ure with IER = -7 or -8 if the data is C convex but not strictly convex. C C IPLOT = Plot option in the range 0 to 15. Denoting C the sequence of bits (high order to low C order) by (b3,b2,b1,b0), each bit specifies C an option as follows: C b0 = 1 iff the triangulation T is to be C plotted (tplot.eps), C b1 = 1 iff the gradient feasibility dia- C gram with the nodal gradients is to C be plotted (gplot.eps), C b2 = 1 iff the gradient triangulation Tg C is to be plotted (tgplot.eps), C b3 = 1 iff the cell diagram with the nodes C is to be plotted (rplot.eps). C The file names are shown in parentheses for C each option. If a requested plot is not C created (and no other error occurred) it is C because an error occurred in opening or C writing to the plot file. No error flag is C returned in this case. C C PLTSIZ = Plot size in inches (or dummy parameter if C IPLOT = 0). A window containing the data C is mapped, with aspect ratio preserved, to C a rectangular viewport with maximum side- C length equal to .88*PLTSIZ (leaving room C for labels outside the viewport). The C viewport is centered on the 8.5 by 11 inch C page, and its boundary is drawn. 1.0 .LE. C PLTSIZ .LE. 8.5. C C STRICT = Logical variable with value TRUE iff the C data is to be adjusted so that a strictly C convex interpolant can be computed. This C requires an O(N**2) algorithm to compute C EPS and dominates the cost of constructing C the interpolant. C C NR = Number of intervals in the radial direction C defining a partitioning of the disk D0, and C number of quadrature weights. NR = 8 should C be sufficient. NR > 0. C C NA = Number of intervals in the angular direction C defining the partitioning of D0. NA = 3*NR is C recommended. NA > 1. C C The above parameters are not altered by this routine. C C Z = Array of length N containing the data values. C C C = Array of length at least N. C C LIST,LPTR = Integer arrays of length at least 6N-12. C C LEND,NEAR,NEXT = Integer arrays of length at least C N. NEAR and NEXT are work space C arrays used by Subroutine TRMSHC. C C LISTV = Integer array of length at least 6*N-12. C C DXL,DYL = Arrays of length at least 2*N-2. C C GX,GY,D = Arrays of length at least N. C C W = Array of length at least NR. C C QX,QY = Arrays of length at least NR*NA. C C On output: C C ND = Number of boundary edges deleted by DELBE. C C Z = Array of data values or, if STRICT = TRUE, C adjusted data values. C C C = Array containing negative z-intercepts (constant C terms) of the affine nodal functions: C(i) = C - z_i for i = 1 to N. C C LIST,LPTR,LEND,LNEW = Data structure defining the C gradient triangulation Tg. C Refer to Subroutine TRMSHC. C C NEAR,NEXT = Garbage. C C NV = Number of cell diagram vertices, including a C pseudo-vertex on each boundary edge (used to C truncate the unbounded regions): NV = NT+NB = C 2*N-2, where NB is the number of boundary nodes C and NT = 2*N-NB-2 is the number of triangles. C C LISTV = Array containing vertex indexes (indexes to C DXL and DYL) stored in one-to-one corres- C pondence with LIST/LPTR entries. Refer to C Subroutine VLIST. C C DXL,DYL = Arrays of length NV containing the ver- C tices of the cell diagram in the first NT C positions and pseudo-vertices in the last C NB positions. C C GX,GY = Arrays containing the components of the C nodal gradients or, if STRICT = TRUE, the C adjusted nodal gradients. C C EPS = Scale factor defining the quadratic term (0 if C STRICT = FALSE). C C D = Array containing the distance from each node to C its cell boundary. C C DMIN = Smallest element of D. C C W = Array containing quadrature weights W_i. C C QX,QY = Arrays dimensioned NR by NA containing the C components of the quadrature points: q_ij = C (QX(i,j),QY(i,j)) for i = 1 to NR and j = 1 C to NA. C C IER = Error indicator: C IER = 0 if no error was encountered. C IER = -1 if N, IPLOT, PLTSIZ, NR, or NA is C outside its valid range on input. C IER = -2 if the first three nodes are C collinear. C IER = -3 if a convex triangulation does not C exist (and Subroutine ADDNDC returned C IER = -3). C IER = -4 if a convex triangulation does not C exist (and Subroutine ADDNDC returned C IER = -4). C IER = L if nodes L and M coincide for some C M > L. The linked list represents C a triangulation of nodes 1 to M-1 C in this case. C IER = -5 if a nonpositive triangle area was C returned by Subroutine LGRAD (called C by VLIST) implying an invalid triang- C ulation T. C IER = -6 if the first three nodal gradients C are collinear. C IER = -7 if a convex triangulation of the C nodal gradients does not exist (and C Subroutine ADDNDC returned IER = -3). C IER = -8 if a convex triangulation of the C nodal gradients does not exist (and C Subroutine ADDNDC returned IER = -4). C IER = -9 if a nonpositive triangle area was C returned by Subroutine LGRAD (called C by VLIST) implying an invalid triang- C ulation Tg. C IER = -10 if the Hermite data is not convex C (Subroutine DELTAI returned IER = C 3). C IER = -11 if the Hermite data is not strictly C convex (D includes a zero entry and C the domain D0 therefore has radius C 0). C C The error conditions are tested in the order specified. C Error flags -5, -6, ..., -10 are unlikely but could occur C as a result of floating-point inaccuracy. Error flag -11 C may occur if the data is convex but not strictly convex. C W, QX, and QY are not altered in this case, but F is well- C defined (it coincides with H) and may be evaluated by FVAL C or FGRID. Also, note the comments regarding error flags C -7 and -8 in the description of TOLBE above. C C Modules required by CSURF: ADDNDC, ADDQT, BDYADD, CIRCUM, C DELARC, DELBE, DELNB, C DELTAI, DSTORE, GETQW, C GLIST, INSERT, INTADD, C JRAND, LEFT, LGRAD, LSTPTR, C PLTGR, PLTTR, SWAP, SWPTC, C TRFIND, TRMSHC, VLIST C C*********************************************************** C CHARACTER*80 TITLE DOUBLE PRECISION DX, DY, WX1, WX2, WY1, WY2 INTEGER I, IERR, IPLT, LU0, LU1, LU2, LU3 LOGICAL NUMBR C C Local parameters: C C I = Nodal index C IERR = Error flag for calls to VLIST C IPLT = Local copy of IPLOT (right-shifted 0 to 3 C times) C LU0,..,LU3 = Logical unit numbers for PostScript plots C NUMBR = Logical variable with value TRUE iff nodal C indexes are to be displayed on the plots C WX1,WY1 = Lower left corner of a window against which C a plot is clipped C WX2,WY2 = Upper rigjt corner of a window against which C a plot is clipped C TITLE = Title for the PostScript plots -- must be C enclosed in parentheses C DATA LU0/70/, LU1/71/, LU2/72/, LU3/73/ NUMBR = N .LE. 100 C C Test for an invalid input parameter. C IER = -1 IF (N .LT. 3 .OR. IPLOT .LT. 0 .OR. IPLOT .GT. 15 . .OR. PLTSIZ .LT. 1.D0 .OR. PLTSIZ .GT. 8.5D0 . .OR. NR .LT. 1 .OR. NA .LT. 2) RETURN C C Construct the convexity-preserving triangulation T. C CALL TRMSHC (N,X,Y,Z, LIST,LPTR,LEND,LNEW,NEAR,NEXT, . IER) IF (IER .NE. 0) RETURN C C Remove nearly null triangles from the boundary. These C could result in very innaccurate vertices in the C gradient feasibility diagram. C CALL DELBE (N,X,Y,TOLBE, LIST,LPTR,LEND,LNEW, ND) C C Construct the gradient feasibility diagram (the straight C line dual of T). C CALL VLIST (N,X,Y,Z,LIST,LPTR,LEND, NV,LISTV,DXL,DYL, . IERR) IF (IERR .NE. 0) THEN IER = -5 RETURN ENDIF C C Select a set of nodal gradients by taking the centroids of C the gradient feasibility regions or (in the case of C boundary nodes) truncated regions. C CALL GLIST (N,LIST,LPTR,LEND,LISTV,DXL,DYL, GX,GY, . IERR) C C Plot T and/or its dual (along with the nodal gradients). C IPLT = IPLOT IF (IPLT .NE. 2*(IPLT/2)) THEN OPEN (LU0,FILE='tplot.eps') WX1 = X(1) WX2 = WX1 WY1 = Y(1) WY2 = WY1 DO 1 I = 2,N IF (X(I) .LT. WX1) WX1 = X(I) IF (X(I) .GT. WX2) WX2 = X(I) IF (Y(I) .LT. WY1) WY1 = Y(I) IF (Y(I) .GT. WY2) WY2 = Y(I) 1 CONTINUE DX = WX2-WX1 DY = WY2-WY1 WX1 = WX1 - 0.1D0*DX WX2 = WX2 + 0.1D0*DX WY1 = WY1 - 0.1D0*DY WY2 = WY2 + 0.1D0*DY TITLE = '()' CALL PLTTR (LU0,PLTSIZ,WX1,WX2,WY1,WY2,N,X,Y,LIST, . LPTR,LEND,TITLE,NUMBR, IERR) ENDIF IPLT = IPLT/2 IF (IPLT .NE. 2*(IPLT/2)) THEN OPEN (LU1,FILE='gplot.eps') WX1 = DXL(1) WX2 = WX1 WY1 = DYL(1) WY2 = WY1 DO 2 I = 2,NV IF (DXL(I) .LT. WX1) WX1 = DXL(I) IF (DXL(I) .GT. WX2) WX2 = DXL(I) IF (DYL(I) .LT. WY1) WY1 = DYL(I) IF (DYL(I) .GT. WY2) WY2 = DYL(I) 2 CONTINUE DX = WX2-WX1 DY = WY2-WY1 WX1 = WX1 - 0.1D0*DX WX2 = WX2 + 0.1D0*DX WY1 = WY1 - 0.1D0*DY WY2 = WY2 + 0.1D0*DY TITLE = '()' CALL PLTGR (LU1,PLTSIZ,WX1,WX2,WY1,WY2,N,LIST,LPTR, . LEND,NV,LISTV,DXL,DYL,GX,GY,TITLE, . NUMBR, IERR) ENDIF C C Compute the scale factor EPS for the quadratic function C q(p) = EPS*, and adjust the data values and C gradients if STRICT = TRUE. C IF (STRICT) THEN CALL ADDQT (N,X,Y, Z,GX,GY, EPS,IERR) ELSE EPS = 0. ENDIF C C Compute the negative z-intercepts (constant terms) C of the affine nodal functions: C(i) = - z_i C for i = 1 to N. C DO 3 I = 1,N C(I) = GX(I)*X(I) + GY(I)*Y(I) - Z(I) 3 CONTINUE C C Construct the convexity-preserving triangulation Tg of C the nodal gradients and negative z-intercepts. The C nodal triangulation data structure is overwritten. C CALL TRMSHC (N,GX,GY,C, LIST,LPTR,LEND,LNEW,NEAR, . NEXT,IERR) IF (IERR .NE. 0) THEN IER = -12 IF (IERR .EQ. -2) IER = -6 IF (IERR .EQ. -3) IER = -7 IF (IERR .EQ. -4) IER = -8 RETURN ENDIF C C Construct the cell diagram (the straight line dual of Tg). C The data structure defining the dual of T is over- C written. C CALL VLIST (N,GX,GY,C,LIST,LPTR,LEND, NV,LISTV,DXL, . DYL,IERR) IF (IERR .NE. 0) THEN IER = -9 RETURN ENDIF C C Plot Tg and/or its dual (along with the nodes). C IPLT = IPLT/2 IF (IPLT .NE. 2*(IPLT/2)) THEN OPEN (LU2,FILE='tgplot.eps') WX1 = GX(1) WX2 = WX1 WY1 = GY(1) WY2 = WY1 DO 4 I = 2,N IF (GX(I) .LT. WX1) WX1 = GX(I) IF (GX(I) .GT. WX2) WX2 = GX(I) IF (GY(I) .LT. WY1) WY1 = GY(I) IF (GY(I) .GT. WY2) WY2 = GY(I) 4 CONTINUE DX = WX2-WX1 DY = WY2-WY1 WX1 = WX1 - 0.1D0*DX WX2 = WX2 + 0.1D0*DX WY1 = WY1 - 0.1D0*DY WY2 = WY2 + 0.1D0*DY TITLE = '()' CALL PLTTR (LU2,PLTSIZ,WX1,WX2,WY1,WY2,N,GX,GY, . LIST,LPTR,LEND,TITLE,NUMBR, IERR) ENDIF IPLT = IPLT/2 IF (IPLT .NE. 2*(IPLT/2)) THEN OPEN (LU3,FILE='rplot.eps') WX1 = DXL(1) WX2 = WX1 WY1 = DYL(1) WY2 = WY1 DO 5 I = 2,NV IF (DXL(I) .LT. WX1) WX1 = DXL(I) IF (DXL(I) .GT. WX2) WX2 = DXL(I) IF (DYL(I) .LT. WY1) WY1 = DYL(I) IF (DYL(I) .GT. WY2) WY2 = DYL(I) 5 CONTINUE DX = WX2-WX1 DY = WY2-WY1 WX1 = WX1 - 0.1D0*DX WX2 = WX2 + 0.1D0*DX WY1 = WY1 - 0.1D0*DY WY2 = WY2 + 0.1D0*DY TITLE = '()' CALL PLTGR (LU3,PLTSIZ,WX1,WX2,WY1,WY2,N,LIST,LPTR, . LEND,NV,LISTV,DXL,DYL,X,Y,TITLE, . NUMBR, IERR) ENDIF C C Compute the distance from each node to its cell boundary, C and compute DMIN. C CALL DELTAI (N,X,Y,Z,GX,GY,LIST,LPTR,LEND, D,IERR) IF (IERR .NE. 0) THEN IER = -10 RETURN ENDIF DMIN = 1.D20 DO 6 I = 1,N IF (D(I) .LT. DMIN) DMIN = D(I) 6 CONTINUE IF (DMIN .LE. 0.) THEN IER = -11 RETURN ENDIF C C Compute weights and quadrature points defining the rule C for approximating values of F. C CALL GETQW (NR,NA,DMIN, W,QX,QY,IERR) RETURN END SUBROUTINE ADDNDC (NST,K,X,Y,Z, LIST,LPTR,LEND, . LNEW, IER) INTEGER NST, K, LIST(*), LPTR(*), LEND(K), LNEW, IER DOUBLE PRECISION X(K), Y(K), Z(K) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 06/27/98 C C This subroutine adds node K to a convex (data-dependent) C triangulation of nodes 1,...,K-1, producing a convex tri- C angulation, if it exists, of nodes 1,...,K. Refer to C Subroutine TRMSHC. C C The algorithm consists of the following steps: node K C is located relative to the triangulation (TRFIND), its C index is added to the data structure (INTADD or BDYADD), C and a sequence of swaps (SWPTC and SWAP) are applied to C the edges opposite K so that all edges incident on node K C and opposite node K are locally optimal (satisfy the con- C vexity test). C C C On input: C C NST = Index of a node at which TRFIND begins its C search. Search time depends on the proximity C of this node to K. If NST < 1, the search is C begun at node K-1. C C K = Nodal index (index for X, Y, Z, and LEND) of the C new node to be added. K .GE. 4. C C X,Y,Z = Arrays of length .GE. K containing Car- C tesian coordinates of the nodes and data C values. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Data structure associated with C the triangulation of nodes 1 C to K-1. The array lengths are C assumed to be large enough to C add node K. Refer to Subrou- C tine TRMSHC. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with C the addition of node K as the C last entry unless IER .NE. 0, C in which case the arrays are C not altered (except in the C case of IER = -4). C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = -1 if K is outside its valid range C on input. C IER = -2 if all nodes (including K) are col- C linear. C IER = -3 if node K is contained in a triangle C and data point K lies above the cor- C responding surface triangle. A C convex triangulation does not exist C in this case. C IER = -4 if, following the addition of node K C to the data structure, an error con- C dition was flagged by Function SWPTC C indicating that a convex triangula- C tion does not exist. C IER = L if nodes L and K coincide for some C L < K. C C Modules required by ADDNDC: BDYADD, DSTORE, INSERT, C INTADD, JRAND, LEFT, C LSTPTR, SWAP, SWPTC, TRFIND C C Intrinsic function called by ADDNDC: ABS C C*********************************************************** C DOUBLE PRECISION DX1, DX2, DX3, DY1, DY2, DY3, DZ1, . DZ2, DZ3, XK, YK, ZK INTEGER LSTPTR INTEGER I1, I2, I3, IERR, IN1, IO1, IO2, IST, KK, KM1, . L, LP, LPF, LPO1 LOGICAL SWPTC C C Local parameters: C C DX1,..,DZ3 = Components of the vectors from surface C point K to the vertices of a surface C triangle C I1,I2,I3 = Vertex indexes of a triangle containing K C IERR = Error flag for calls to SWPTC C IN1 = Vertex opposite K: first neighbor of IO2 C that precedes IO1. IN1,IO1,IO2 are in C counterclockwise order. C IO1,IO2 = Adjacent neighbors of K defining an edge to C be tested for a swap C IST = Index of node at which TRFIND begins its C search C KK = Local copy of K C KM1 = K-1 C L = Vertex index (I1, I2, or I3) returned in IER C if node K coincides with a vertex C LP = LIST index (pointer) C LPF = LIST pointer to the first neighbor of K C LPO1 = LIST pointer to IO1 C XK,YK = Cartesian coordinates of node K C KK = K IF (KK .LT. 4) GO TO 3 C C Initialization: C KM1 = KK - 1 IST = NST IF (IST .LT. 1) IST = KM1 XK = X(KK) YK = Y(KK) ZK = Z(KK) C C Find a triangle (I1,I2,I3) containing K or the rightmost C (I1) and leftmost (I2) visible boundary nodes as viewed C from node K. C CALL TRFIND (IST,XK,YK,KM1,X,Y,LIST,LPTR,LEND, I1,I2, . I3) C C Test for collinear nodes. C IF (I1 .EQ. 0) GO TO 4 IF (I3 .NE. 0) THEN C C Node K is contained in triangle (I1,I2,I3). C C Test for duplicate nodes. C L = I1 IF (XK .EQ. X(L) .AND. YK .EQ. Y(L)) GO TO 5 L = I2 IF (XK .EQ. X(L) .AND. YK .EQ. Y(L)) GO TO 5 L = I3 IF (XK .EQ. X(L) .AND. YK .EQ. Y(L)) GO TO 5 C C Test for a nonconvex surface. C DX1 = X(I1) - XK DX2 = X(I2) - XK DX3 = X(I3) - XK C DY1 = Y(I1) - YK DY2 = Y(I2) - YK DY3 = Y(I3) - YK C DZ1 = Z(I1) - ZK DZ2 = Z(I2) - ZK DZ3 = Z(I3) - ZK C IF (DX1*(DY2*DZ3-DY3*DZ2) - DY1*(DX2*DZ3-DX3*DZ2) + . DZ1*(DX2*DY3-DX3*DY2) .LT. 0.) GO TO 6 C C Add node K to the data structure. C CALL INTADD (KK,I1,I2,I3, LIST,LPTR,LEND,LNEW ) ELSE C C Node K is exterior to the triangulation. C CALL BDYADD (KK,I1,I2, LIST,LPTR,LEND,LNEW ) ENDIF IER = 0 C C Initialize variables for optimization of the C triangulation. C LP = LEND(KK) LPF = LPTR(LP) IO2 = LIST(LPF) LPO1 = LPTR(LPF) IO1 = ABS(LIST(LPO1)) C C Begin loop: find the node opposite K. C 1 LP = LSTPTR(LEND(IO1),IO2,LIST,LPTR) IF (LIST(LP) .LT. 0) GO TO 2 LP = LPTR(LP) IN1 = ABS(LIST(LP)) C C Swap test: if a swap occurs, two new edges are C opposite K and must be tested. C IF ( SWPTC(IN1,KK,IO1,IO2,X,Y,Z, IERR) ) THEN CALL SWAP (IN1,KK,IO1,IO2, LIST,LPTR,LEND, LPO1) IO1 = IN1 GO TO 1 ELSE C C Test for a nonconvex triangulation. C IF (IERR .NE. 0) GO TO 7 ENDIF C C No swap occurred. Test for termination and reset C IO2 and IO1. C 2 IF (LPO1 .EQ. LPF .OR. LIST(LPO1) .LT. 0) RETURN IO2 = IO1 LPO1 = LPTR(LPO1) IO1 = ABS(LIST(LPO1)) GO TO 1 C C KK < 4. C 3 IER = -1 RETURN C C All nodes are collinear. C 4 IER = -2 RETURN C C Nodes L and K coincide. C 5 IER = L RETURN C C Nonconvex triangulation. C 6 IER = -3 RETURN C C Error flag returned by SWPTC. C 7 IER = -4 RETURN END SUBROUTINE ADDQT (N,X,Y, Z,GX,GY, EPS,IER) INTEGER N, IER DOUBLE PRECISION X(N), Y(N), Z(N), GX(N), GY(N), EPS C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/27/96 C C Given a set of strictly convex Hermite data (nodes p_i, C data values z_i, and nodal gradients g_i, i = 1 to N, such C that there exists a convex Hermite interpolant of the data C values and gradients, and no four data points are co- C planar), this subroutine adjusts the data values and C gradients such that a strictly convex Hermite interpolant C of the data can be constructed from a convex Hermite C interpolant of the adjusted data. The adjusted data val- C ues and gradients are defined as follows: C C Z_i = z_i - eps* and G_i = g_i - 2*eps*p_i C C for eps < min {(z_j-z_i-)/}, C C where the minimum is over all distinct values of i and j C in the range 1 to N. By convexity of the data, eps > 0, C and it follows from the definition of eps that Z_j - Z_i - C > 0, and the adjusted data is therefore also C strictly convex. Letting h denote a convex interpolant of C the adjusted data, the function F(p) = h(p) + eps* is C a strictly convex interpolant of the original data since C eps* is strictly convex. C C The value of eps is arbitrarily chosen to be 0.95 times C its upper bound. Computation of the bound requires O(N*N) C operations. C C C On input: C C N = Number of nodes, data values, and gradients. C N .GE. 3. C C X,Y = Arrays of length N containing the Cartesian C coordinates of a set of distinct nodes. C C The above parameters are not altered by this routine. C C Z = Array of length N containing the data values. C C GX,GY = Arrays of length N containing the components C of the nodal gradients. C C On output: C C Z = Adjusted data values unless IER > 0. C C GX,GY = Adjusted nodal gradients unless IER > 0. C C EPS = Scale factor for the quadratic term unless C IER > 0. EPS = 0 if the data is not strictly C convex. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if N < 3. C IER = 2 if a pair of nodes coincide. C C Modules required by ADDQT: None C C Intrinsic function called by ADDQT: MIN C C*********************************************************** C DOUBLE PRECISION DS, DX, DY, DZ, S, T1, T2, TMIN INTEGER I, J DATA S/0.95D0/ C C Local parameters: C C DS = C DX,DY = Components of p_j-p_i C DZ = z_j-z_i C I,J = Nodal indexes and DO-loop indexes C S = Scale factor for the upper bound on EPS C T1 = Term associated with i,j in the bound on EPS C T2 = Term associated with j,i in the bound on EPS C TMIN = Bound on EPS C IF (N .LT. 3) GO TO 11 TMIN = 1.D20 C C Loop on pairs of nodal indexes I,J in the upper triangle. C DO 2 I = 1,N-1 DO 1 J = I+1,N DX = X(J)-X(I) DY = Y(J)-Y(I) DS = DX*DX + DY*DY IF (DS .EQ. 0.) GO TO 12 DZ = Z(J)-Z(I) T1 = ( DZ - GX(I)*DX-GY(I)*DY )/DS T2 = -( DZ - GX(J)*DX-GY(J)*DY )/DS IF (T1 .LE. 0. .OR. T2 .LE. 0.) GO TO 4 TMIN = MIN(TMIN,T1,T2) 1 CONTINUE 2 CONTINUE EPS = S*TMIN C C Adjust the data values and nodal gradients. C DO 3 I = 1,N Z(I) = Z(I) - EPS*(X(I)**2 + Y(I)**2) GX(I) = GX(I) - 2.D0*EPS*X(I) GY(I) = GY(I) - 2.D0*EPS*Y(I) 3 CONTINUE GO TO 5 C C The data is not strictly convex. C 4 EPS = 0. C C No error encountered. C 5 IER = 0 RETURN C C N < 3. C 11 IER = 1 RETURN C C Nodes I and J coincide. C 12 IER = 2 RETURN END DOUBLE PRECISION FUNCTION AREAP (X,Y,NB,NODES) INTEGER NB, NODES(NB) DOUBLE PRECISION X(*), Y(*) C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/21/90 C C Given a sequence of NB points in the plane, this func- C tion computes the signed area bounded by the closed poly- C gonal curve which passes through the points in the C specified order. Each simple closed curve is positively C oriented (bounds positive area) if and only if the points C are specified in counterclockwise order. The last point C of the curve is taken to be the first point specified, and C this point should therefore not be specified twice. C C The area of a triangulation may be computed by calling C AREAP with values of NB and NODES determined by Subroutine C BNODES. C C C On input: C C X,Y = Arrays of length N containing the Cartesian C coordinates of a set of points in the plane C for some N .GE. NB. C C NB = Length of NODES. C C NODES = Array of length NB containing the ordered C sequence of nodal indexes (in the range C 1 to N) which define the polygonal curve. C C Input parameters are not altered by this function. C C On output: C C AREAP = Signed area bounded by the polygonal curve, C or zero if NB < 3. C C Modules required by AREAP: None C C*********************************************************** C DOUBLE PRECISION A INTEGER I, ND1, ND2, NNB C C Local parameters: C C A = Partial sum of signed (and doubled) trapezoid C areas C I = DO-loop and NODES index C ND1,ND2 = Elements of NODES C NNB = Local copy of NB C NNB = NB A = 0. IF (NNB .LT. 3) GO TO 2 ND2 = NODES(NNB) C C Loop on line segments NODES(I-1) -> NODES(I), where C NODES(0) = NODES(NB), adding twice the signed trapezoid C areas (integrals of the linear interpolants) to A. C DO 1 I = 1,NNB ND1 = ND2 ND2 = NODES(I) A = A + (X(ND2)-X(ND1))*(Y(ND1)+Y(ND2)) 1 CONTINUE C C A contains twice the negative signed area of the region. C 2 AREAP = -A/2.D0 RETURN END SUBROUTINE BDYADD (KK,I1,I2, LIST,LPTR,LEND,LNEW ) INTEGER KK, I1, I2, LIST(*), LPTR(*), LEND(*), LNEW C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 02/22/91 C C This subroutine adds a boundary node to a triangulation C of a set of points in the plane. The data structure is C updated with the insertion of node KK, but no optimization C is performed. C C C On input: C C KK = Index of a node to be connected to the sequence C of all visible boundary nodes. KK .GE. 1 and C KK must not be equal to I1 or I2. C C I1 = First (rightmost as viewed from KK) boundary C node in the triangulation which is visible from C node KK (the line segment KK-I1 intersects no C edges. C C I2 = Last (leftmost) boundary node which is visible C from node KK. I1 and I2 may be determined by C Subroutine TRFIND. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Triangulation data structure. C Nodes I1 and I2 must be in- C cluded in the triangulation. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with C the addition of node KK. Node C KK is connected to I1, I2, and C all boundary nodes in between. C C Module required by BDYADD: INSERT C C*********************************************************** C INTEGER K, LP, LSAV, N1, N2, NEXT, NSAV C C Local parameters: C C K = Local copy of KK C LP = LIST pointer C LSAV = LIST pointer C N1,N2 = Local copies of I1 and I2, respectively C NEXT = Boundary node visible from K C NSAV = Boundary node visible from K C K = KK N1 = I1 N2 = I2 C C Add K as the last neighbor of N1. C LP = LEND(N1) LSAV = LPTR(LP) LPTR(LP) = LNEW LIST(LNEW) = -K LPTR(LNEW) = LSAV LEND(N1) = LNEW LNEW = LNEW + 1 NEXT = -LIST(LP) LIST(LP) = NEXT NSAV = NEXT C C Loop on the remaining boundary nodes between N1 and N2, C adding K as the first neighbor. C 1 LP = LEND(NEXT) CALL INSERT (K,LP,LIST,LPTR,LNEW) IF (NEXT .EQ. N2) GO TO 2 NEXT = -LIST(LP) LIST(LP) = NEXT GO TO 1 C C Add the boundary nodes between N1 and N2 as neighbors C of node K. C 2 LSAV = LNEW LIST(LNEW) = N1 LPTR(LNEW) = LNEW + 1 LNEW = LNEW + 1 NEXT = NSAV C 3 IF (NEXT .EQ. N2) GO TO 4 LIST(LNEW) = NEXT LPTR(LNEW) = LNEW + 1 LNEW = LNEW + 1 LP = LEND(NEXT) NEXT = LIST(LP) GO TO 3 C 4 LIST(LNEW) = -N2 LPTR(LNEW) = LSAV LEND(K) = LNEW LNEW = LNEW + 1 RETURN END SUBROUTINE BNODES (N,LIST,LPTR,LEND, NODES,NB,NE,NT) INTEGER N, LIST(*), LPTR(*), LEND(N), NODES(*), NB, . NE, NT C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/01/88 C C Given a triangulation of N points in the plane, this C subroutine returns an array containing the indexes, in C counterclockwise order, of the nodes on the boundary of C the convex hull of the set of points. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 3. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. C C The above parameters are not altered by this routine. C C NODES = Integer array of length at least NB C (NB .LE. N). C C On output: C C NODES = Ordered sequence of boundary node indexes C in the range 1 to N. C C NB = Number of boundary nodes. C C NE,NT = Number of edges and triangles, respectively, C in the triangulation. C C Modules required by BNODES: None C C*********************************************************** C INTEGER K, LP, N0, NST C C Local parameters: C C K = NODES index C LP = LIST pointer C N0 = Boundary node to be added to NODES C NST = First element of nodes (arbitrarily chosen to be C the one with smallest index) C NST = 1 1 LP = LEND(NST) IF (LIST(LP) .LT. 0) GO TO 2 NST = NST + 1 GO TO 1 C C Initialization. C 2 NODES(1) = NST K = 1 N0 = NST C C Traverse the boundary in counterclockwise order. C 3 LP = LEND(N0) LP = LPTR(LP) N0 = LIST(LP) IF (N0 .EQ. NST) GO TO 4 K = K + 1 NODES(K) = N0 GO TO 3 C C Termination. C 4 NB = K NT = 2*N - NB - 2 NE = NT + N - 1 RETURN END SUBROUTINE CIRCUM (X1,Y1,X2,Y2,X3,Y3,RATIO, XC,YC,CR, . SA,AR) LOGICAL RATIO DOUBLE PRECISION X1, Y1, X2, Y2, X3, Y3, XC, YC, CR, . SA, AR C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 12/10/96 C C Given three vertices defining a triangle, this subrou- C tine returns the circumcenter, circumradius, signed C triangle area, and, optionally, the aspect ratio of the C triangle. C C C On input: C C X1,...,Y3 = Cartesian coordinates of the vertices. C C RATIO = Logical variable with value TRUE if and only C if the aspect ratio is to be computed. C C Input parameters are not altered by this routine. C C On output: C C XC,YC = Cartesian coordinates of the circumcenter C (center of the circle defined by the three C points) unless SA = 0, in which XC and YC C are not altered. C C CR = Circumradius (radius of the circle defined by C the three points) unless SA = 0 (infinite C radius), in which case CR is not altered. C C SA = Signed triangle area with positive value if C and only if the vertices are specified in C counterclockwise order: (X3,Y3) is strictly C to the left of the directed line from (X1,Y1) C toward (X2,Y2). C C AR = Aspect ratio r/CR, where r is the radius of the C inscribed circle, unless RATIO = FALSE, in C which case AR is not altered. AR is in the C range 0 to .5, with value 0 iff SA = 0 and C value .5 iff the vertices define an equilateral C triangle. C C Modules required by CIRCUM: None C C Intrinsic functions called by CIRCUM: ABS, SQRT C C*********************************************************** C DOUBLE PRECISION DS(3), FX, FY, U(3), V(3) INTEGER I C C Set U(K) and V(K) to the x and y components, respectively, C of the directed edge opposite vertex K. C U(1) = X3 - X2 U(2) = X1 - X3 U(3) = X2 - X1 V(1) = Y3 - Y2 V(2) = Y1 - Y3 V(3) = Y2 - Y1 C C Set SA to the signed triangle area. C SA = (U(1)*V(2) - U(2)*V(1))/2.D0 IF (SA .EQ. 0.) THEN IF (RATIO) AR = 0. RETURN ENDIF C C Set DS(K) to the squared distance from the origin to C vertex K. C DS(1) = X1*X1 + Y1*Y1 DS(2) = X2*X2 + Y2*Y2 DS(3) = X3*X3 + Y3*Y3 C C Compute factors of XC and YC. C FX = 0. FY = 0. DO 1 I = 1,3 FX = FX - DS(I)*V(I) FY = FY + DS(I)*U(I) 1 CONTINUE XC = FX/(4.D0*SA) YC = FY/(4.D0*SA) CR = SQRT( (XC-X1)**2 + (YC-Y1)**2 ) IF (.NOT. RATIO) RETURN C C Compute the squared edge lengths and aspect ratio. C DO 2 I = 1,3 DS(I) = U(I)*U(I) + V(I)*V(I) 2 CONTINUE AR = 2.D0*ABS(SA)/ . ( (SQRT(DS(1)) + SQRT(DS(2)) + SQRT(DS(3)))*CR ) RETURN END SUBROUTINE CNTOUR (NX,NY,X,Y,Z,CVAL,LC,NCMAX,IWK, XC, . YC,ILC,NC,IER) INTEGER NX, NY, LC, NCMAX, IWK(NX,*), ILC(NCMAX), NC, . IER DOUBLE PRECISION X(NX), Y(NY), Z(NX,NY), CVAL, XC(LC), . YC(LC) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 04/28/90 C C Given a set of function values Z = F(X,Y) at the verti- C ces of an NX by NY rectangular grid, this subroutine de- C termines a set of contour lines associated with F = CVAL. C A contour line is specified by an ordered sequence of C points (XC,YC), each lying on a grid edge and computed C from the linear interpolant of the function values at the C endpoints of the edge. The accuracy of the contour lines C is thus directly related to the number of grid points. If C a contour line forms a closed curve, the first point coin- C cides with the last point. Otherwise, the first and last C points lie on the grid boundary. C C Note that the problem is ill-conditioned in the vicinity C of a double zero of F-CVAL. Thus, if a grid cell is C crossed by two contour lines (all four sides intersected), C three different configurations are possible, corresponding C to a local minimum, a local maximum, or a saddle point. C It is arbitrarily assumed in this case that the contour C lines intersect, representing a saddle point. Also, in C order to treat the case of F = CVAL at a vertex in a con- C sistent manner, this case is always treated as F > CVAL. C Hence, if F takes on the same value at both ends of an C edge, it is assumed that no contour line intersects that C edge. In particular, a constant function, including C F = CVAL, results in no contour lines. C C On input: C C NX = Number of grid points in the x direction. C NX .GE. 2. C C NY = Number of grid points in the y direction. C NY .GE. 2. C C X = Array of length NX containing a strictly in- C creasing sequence of values. C C Y = Array of length NY containing a strictly in- C creasing sequence of values. C C Z = Array of function values at the vertices of the C rectangular grid. Z(I,J) = F(X(I),Y(J)) for C I = 1,...,NX and J = 1,...,NY. C C CVAL = Constant function value defining a contour C line as the set of points (X,Y) such that C F(X,Y) = CVAL. C C LC = Length of arrays XC and YC, and maximum allow- C able number of points defining contour lines. C LC = 2(NX-1)(NY-1) + (NX*NY+1)/2 is (probably C more than) sufficient. LC .GE. 2. C C NCMAX = Length of array ILC, and maximum allowable C number of contour lines. NCMAX = (NX*NY+1)/ C 2 is sufficient. NCMAX .GE. 1. C C The above parameters are not altered by this routine. C C IWK = Integer array of length .GE. NX*(NY-1) to be C used as work space. C C XC,YC = Arrays of length LC. C C ILC = Integer array of length NCMAX. C C On output: C C XC,YC = Arrays containing the coordinates of NC con- C tour lines. For K = 1,...,NC, contour line C K is defined by the sequence of points with C indexes ILC(K-1)+1,...,ILC(K) where ILC(0) = C 0. C C ILC = Array containing the indexes (to XC and YC) C associated with the terminal point of contour C line K in position K for K = 1,...,NC (if NC C .GT. 0). C C NC = Number of contour lines whose points are stored C in XC and YC. C C IER = Error indicator: C IER = 0 if no errors were encountered and all C contour lines were found. C IER = 1 if NX, NY, LC, or NCMAX is outside its C valid range. NC = 0 and XC, YC, and C ILC are not altered in this case. C IER = 2 if X or Y is not strictly increasing. C NC = 0 and XC, YC, and ILC are not C altered in this case. C IER = K for K > LC, where K is the required C length of XC and YC, if more storage C space is required to complete the C specification of contour line NC and/ C or additional contour lines up to a C total of NCMAX. NC .GE. 1 and ILC(NC) C = LC in this case. C IER = -1 if more than NCMAX contour lines are C present (more space is required in C ILC). NC = NCMAX, and LC may or may C not be sufficient for the additional C contour lines in this case. (This is C not determined.) C C In the unlikely event of an internal failure, a message C is printed on logical unit LUN (specified in the DATA C statement below). IER may be 0 in this case. C C Modules required by CNTOUR: None C C*********************************************************** C DOUBLE PRECISION CV, W, XF, XN, XP, YF, YN, YP, Z1, Z2 INTEGER I, I1, I2, IB, IN, IND, ISID, ISIDB, ISIDN, . J, J1, J2, JB, JN, K, LCON, LMX, LUN, NCMX, . NCON, NI, NIM1, NJ, NJM1 LOGICAL BDRY DATA LUN/0/ C C Store parameters in local variables. C NI = NX NJ = NY NIM1 = NI - 1 NJM1 = NJ - 1 CV = CVAL LMX = LC NCMX = NCMAX NC = 0 C C Test for invalid input parameters. C IER = 1 IF (NI .LT. 2 .OR. NJ .LT. 2 .OR. LMX .LT. 2 .OR. . NCMX .LT. 1) RETURN C C Test for nonincreasing values of X or Y. C IER = 2 DO 1 I = 2,NI IF (X(I) .LE. X(I-1)) RETURN 1 CONTINUE DO 2 J = 2,NJ IF (Y(J) .LE. Y(J-1)) RETURN 2 CONTINUE C C Loop on grid cells, initializing edge indicators (stored C in IWK) to zeros. For each cell, the indicator IND is a C 4-bit integer with each bit corresponding to an edge of C the cell, and having value 1 iff the edge has been pro- C cessed. Note that two IND values must be adjusted when C an interior edge is processed. The cell sides (edges) C are numbered (1,2,4,8) in counterclockwise order start- C ing from the bottom. This corresponds to an ordering of C the weighted IND bits from low order to high order. C Grid cells are identified with their lower left corners. C DO 4 J = 1,NJM1 DO 3 I = 1,NIM1 IWK(I,J) = 0 3 CONTINUE 4 CONTINUE C C First determine open contours by looping on boundary edges C in counterclockwise order starting from the lower left. C For each unprocessed boundary edge intersected by a con- C tour line, the contour line is determined and IWK is up- C dated to reflect the edges intersected. The boundary C cell (lower left corner) is indexed by (IB,JB) and the C boundary edge is specified by ISIDB. NCON and LCON are C local variables containing the number of contour lines C encountered and the current length of XC and YC. C NCON = 0 LCON = 0 ISIDB = 1 IB = 1 JB = 1 C C Top of loop on boundary edges. The edge has been C processed iff IND/ISIDB is odd. C 5 IND = IWK(IB,JB) IF (IND/ISIDB .NE. 2*((IND/ISIDB)/2)) GO TO 9 C C Update the edge indicator and store the vertex indexes of C the endpoints of the edge. C IWK(IB,JB) = IND + ISIDB IF (ISIDB .EQ. 1) THEN I1 = IB J1 = JB I2 = IB + 1 J2 = JB ELSEIF (ISIDB .EQ. 2) THEN I1 = IB + 1 J1 = JB I2 = IB + 1 J2 = JB + 1 ELSEIF (ISIDB .EQ. 4) THEN I1 = IB + 1 J1 = JB + 1 I2 = IB J2 = JB + 1 ELSE I1 = IB J1 = JB + 1 I2 = IB J2 = JB ENDIF C C Proceed to the next edge if there is no intersection. C Z1 = Z(I1,J1) Z2 = Z(I2,J2) IF ((Z1 .LT. CV .AND. Z2 .LT. CV) .OR. . (Z1 .GE. CV .AND. Z2 .GE. CV)) GO TO 9 C C Store the zero of the linear interpolant of Z1-CV and C Z2-CV as the first point of an open contour unless C NCMAX contour lines have been found or there is in- C sufficient space reserved for XC and YC. C IF (NCON .EQ. NCMX) THEN IER = -1 GO TO 16 ENDIF NCON = NCON + 1 LCON = LCON + 1 W = (CV-Z1)/(Z2-Z1) XP = X(I1) + W*(X(I2)-X(I1)) YP = Y(J1) + W*(Y(J2)-Y(J1)) IF (LCON .LE. LMX) THEN XC(LCON) = XP YC(LCON) = YP ENDIF C C Initialize for loop on cells intersected by the open C contour line. C I = IB J = JB ISID = ISIDB C C Traverse the contour line. Cell (I,J) was entered on side C ISID = (I1,J1)->(I2,J2). Find an exit edge E (unproces- C sed edge intersected by the contour) by looping on the C remaining three sides, starting with the side opposite C ISID. C 6 IND = IWK(I,J) DO 7 K = 1,3 ISID = 2*ISID IF (K .NE. 2) ISID = 2*ISID IF (ISID .GT. 15) ISID = ISID/16 IF (ISID .EQ. 1) THEN I1 = I J1 = J I2 = I + 1 J2 = J ELSEIF (ISID .EQ. 2) THEN I1 = I + 1 J1 = J I2 = I + 1 J2 = J + 1 ELSEIF (ISID .EQ. 4) THEN I1 = I + 1 J1 = J + 1 I2 = I J2 = J + 1 ELSE I1 = I J1 = J + 1 I2 = I J2 = J ENDIF C C Test for a 1 in bit position ISID of cell (I,J) and bypass C the edge if it has been previously encountered. C IF (IND/ISID .NE. 2*((IND/ISID)/2)) GO TO 7 C C Update IWK for edge E = (I1,J1)->(I2,J2). (IN,JN) indexes C the cell which shares E with cell (I,J), and ISIDN is C the side number of E in (IN,JN). BDRY is true iff E is C a boundary edge (with no neighboring cell). C IWK(I,J) = IWK(I,J) + ISID IF (ISID .LE. 2) THEN IN = I1 JN = J2 - 1 ISIDN = 4*ISID ELSE IN = I1 - 1 JN = J2 ISIDN = ISID/4 ENDIF BDRY = IN .EQ. 0 .OR. IN .EQ. NI .OR. . JN .EQ. 0 .OR. JN .EQ. NJ IF (.NOT. BDRY) IWK(IN,JN) = IWK(IN,JN) + ISIDN C C Exit the loop on sides if E is intersected by the contour. C Z1 = Z(I1,J1) Z2 = Z(I2,J2) IF ((Z1 .LT. CV .AND. Z2 .GE. CV) .OR. . (Z1 .GE. CV .AND. Z2 .LT. CV)) GO TO 8 7 CONTINUE C* C Error -- No exit point found. Print a message and exit C the contour traversal loop. C WRITE (LUN,100) NCON 100 FORMAT (///5X,'Error in CNTOUR: Contour line L ', . 'begins on the boundary'/5X,'and terminates ', . 'in the interior for L =',I4/) ILC(NCON) = LCON GO TO 9 C* C Add the intersection point (XN,YN) to the list unless it C coincides with the previous point (XP,YP) or there is C not enough space in XC and YC. C 8 W = (CV-Z1)/(Z2-Z1) XN = X(I1) + W*(X(I2)-X(I1)) YN = Y(J1) + W*(Y(J2)-Y(J1)) IF (XN .NE. XP .OR. YN .NE. YP) THEN LCON = LCON + 1 XP = XN YP = YN IF (LCON .LE. LMX) THEN XC(LCON) = XN YC(LCON) = YN ENDIF ENDIF C C Bottom of contour traversal loop. If E is not a boundary C edge, reverse the edge direction (endpoint indexes) and C update the cell index and side number. C IF (.NOT. BDRY) THEN I = I1 J = J1 I1 = I2 J1 = J2 I2 = I J2 = J I = IN J = JN ISID = ISIDN GO TO 6 ENDIF C C Update ILC with a pointer to the end of the contour line. C ILC(NCON) = LCON C C Bottom of loop on boundary edges. Update the boundary C cell index and side number, and test for termination. C 9 IF (ISIDB .EQ. 1) THEN IF (IB .LT. NIM1) THEN IB = IB + 1 ELSE ISIDB = 2 ENDIF ELSEIF (ISIDB .EQ. 2) THEN IF (JB .LT. NJM1) THEN JB = JB + 1 ELSE ISIDB = 4 ENDIF ELSEIF (ISIDB .EQ. 4) THEN IF (IB .GT. 1) THEN IB = IB - 1 ELSE ISIDB = 8 ENDIF ELSE IF (JB .GT. 1) THEN JB = JB - 1 ELSE ISIDB = 16 ENDIF ENDIF IF (ISIDB .LT. 16) GO TO 5 C C Determine closed contours by looping on interior edges -- C the first two sides (bottom and right) of each cell, C excluding boundary edges. The beginning cell is indexed C by (IB,JB), and the beginning side number is ISIDB. C DO 15 JB = 1,NJM1 DO 14 IB = 1,NIM1 DO 13 ISIDB = 1,2 IF (JB .EQ. 1 .AND. ISIDB .EQ. 1) GO TO 13 IF (IB .EQ. NIM1 .AND. ISIDB .EQ. 2) GO TO 13 C C Bypass the edge if it was previously encountered C (IND/ISIDB odd). C IND = IWK(IB,JB) IF (IND/ISIDB .NE. 2*((IND/ISIDB)/2)) GO TO 13 C C Determine the endpoint indexes of the beginning edge E = C (I1,J1)->(I2,J2), find the index (I,J) and side number C ISID of the cell which shares E with (IB,JB), and up- C date IWK. C IF (ISIDB .EQ. 1) THEN I1 = IB J1 = JB I2 = IB + 1 J2 = JB I = IB J = JB - 1 ISID = 4 ELSE I1 = IB + 1 J1 = JB I2 = IB + 1 J2 = JB + 1 I = I1 J = J1 ISID = 8 ENDIF IWK(IB,JB) = IND + ISIDB IWK(I,J) = IWK(I,J) + ISID C C Proceed to the next interior edge if there is no C intersection. C Z1 = Z(I1,J1) Z2 = Z(I2,J2) IF ((Z1 .LT. CV .AND. Z2 .LT. CV) .OR. . (Z1 .GE. CV .AND. Z2 .GE. CV)) GO TO 13 C C Store the intersection point as the first point of a C closed contour unless NCMAX contour lines have been C found or there is insufficient space in XC and YC. C IF (NCON .EQ. NCMX) THEN IER = -1 GO TO 16 ENDIF NCON = NCON + 1 LCON = LCON + 1 W = (CV-Z1)/(Z2-Z1) XP = X(I1) + W*(X(I2)-X(I1)) YP = Y(J1) + W*(Y(J2)-Y(J1)) IF (LCON .LE. LMX) THEN XC(LCON) = XP YC(LCON) = YP ENDIF XF = XP YF = YP C C Traverse the contour line. Cell (I,J) was entered on side C ISID = edge (I2,J2)->(I1,J1). Reverse the edge direc- C tion. C 10 IN = I1 JN = J1 I1 = I2 J1 = J2 I2 = IN J2 = JN IND = IWK(I,J) C C Find an exit edge E by looping on the remaining three C sides, starting with the side opposite ISID. C DO 11 K = 1,3 ISID = 2*ISID IF (K .NE. 2) ISID = 2*ISID IF (ISID .GT. 15) ISID = ISID/16 IF (ISID .EQ. 1) THEN I1 = I J1 = J I2 = I + 1 J2 = J ELSEIF (ISID .EQ. 2) THEN I1 = I + 1 J1 = J I2 = I + 1 J2 = J + 1 ELSEIF (ISID .EQ. 4) THEN I1 = I + 1 J1 = J + 1 I2 = I J2 = J + 1 ELSE I1 = I J1 = J + 1 I2 = I J2 = J ENDIF C C Bypass the edge if it has been previously encountered. C IF (IND/ISID .NE. 2*((IND/ISID)/2)) GO TO 11 C C Determine the index (IN,JN) and side number ISIDN of the C cell which shares edge E = (I1,J1)->(I2,J2) with cell C (I,J), and update IWK. C IF (ISID .LE. 2) THEN IN = I1 JN = J2 - 1 ISIDN = 4*ISID ELSE IN = I1 - 1 JN = J2 ISIDN = ISID/4 ENDIF IWK(I,J) = IWK(I,J) + ISID IWK(IN,JN) = IWK(IN,JN) + ISIDN C C Exit the loop on sides if E is intersected. C Z1 = Z(I1,J1) Z2 = Z(I2,J2) IF ((Z1 .LT. CV .AND. Z2 .GE. CV) .OR. . (Z1 .GE. CV .AND. Z2 .LT. CV)) GO TO 12 11 CONTINUE C* C Error -- No exit point found. Print a message and exit C the contour traversal loop. C WRITE (LUN,110) NCON 110 FORMAT (///5X,'Error in CNTOUR: Contour line L ', . 'is open but'/5X,'does not intersect the ', . 'boundary for L =',I4/) ILC(NCON) = LCON GO TO 13 C* C Add the intersection point to the list unless it coincides C with the previous point or there is not enough space in C XC and YC. C 12 W = (CV-Z1)/(Z2-Z1) XN = X(I1) + W*(X(I2)-X(I1)) YN = Y(J1) + W*(Y(J2)-Y(J1)) IF (XN .NE. XP .OR. YN .NE. YP) THEN LCON = LCON + 1 XP = XN YP = YN IF (LCON .LE. LMX) THEN XC(LCON) = XN YC(LCON) = YN ENDIF ENDIF C C Bottom of contour traversal loop. If the next cell is not C the beginning cell, update the cell index and side num- C ber. C IF (IN .NE. IB .OR. JN .NE. JB) THEN I = IN J = JN ISID = ISIDN GO TO 10 ENDIF C C Add the first point as the last point (unless the first C and last points already coincide), and update ILC. C IF (XP .NE. XF .OR. YP .NE. YF) THEN LCON = LCON + 1 IF (LCON .LE. LMX) THEN XC(LCON) = XF YC(LCON) = YF ENDIF ENDIF ILC(NCON) = LCON C C Bottom of loop on interior edges. C 13 CONTINUE 14 CONTINUE 15 CONTINUE IER = 0 C C Test for insufficient storage reserved for XC and YC. C 16 IF (LCON .GT. LMX) IER = LCON NC = NCON RETURN END SUBROUTINE DELARC (N,IO1,IO2, LIST,LPTR,LEND, . LNEW, IER) INTEGER N, IO1, IO2, LIST(*), LPTR(*), LEND(N), LNEW, . IER C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 11/12/94 C C This subroutine deletes a boundary arc from a triangula- C tion. It may be used to remove a null triangle from the C convex hull boundary. Note, however, that if the union of C triangles is rendered nonconvex, Subroutines DELNDC and C TRFIND may fail. Thus, Subroutines ADDNDC and DELNDC C should not be called following an arc deletion. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 4. C C IO1,IO2 = Indexes (in the range 1 to N) of a pair of C adjacent boundary nodes defining the arc C to be removed. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Triangulation data structure C created by Subroutine TRMSHC. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with C the removal of arc IO1-IO2 C unless IER > 0. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if N, IO1, or IO2 is outside its valid C range, or IO1 = IO2. C IER = 2 if IO1-IO2 is not a boundary arc. C IER = 3 if the node opposite IO1-IO2 is al- C ready a boundary node, and thus IO1 C or IO2 has only two neighbors or a C deletion would result in two triangu- C lations sharing a single node. C IER = 4 if one of the nodes is a neighbor of C the other, but not vice versa, imply- C ing an invalid triangulation data C structure. C C Modules required by DELARC: DELNB, LSTPTR C C Intrinsic function called by DELARC: ABS C C*********************************************************** C INTEGER LSTPTR INTEGER LP, LPH, LPL, N1, N2, N3 C C Local parameters: C C LP = LIST index (pointer) C LPH = Pointer (or flag) returned by DELNB C LPL = Pointer to the last neighbor of N1, N2, or N3 C N1,N2 = Local copies of IO1 and IO2 ordered so that N1-N2 C is a (directed) edge C N3 = Node opposite N1->N2 C N1 = IO1 N2 = IO2 C C Test for errors, and set N1->N2 to the directed boundary C edge associated with IO1-IO2: (N1,N2,N3) is a triangle C for some N3. C IF (N .LT. 4 .OR. N1 .LT. 1 .OR. N1 .GT. N .OR. . N2 .LT. 1 .OR. N2 .GT. N .OR. N1 .EQ. N2) THEN IER = 1 RETURN ENDIF C LPL = LEND(N2) IF (-LIST(LPL) .NE. N1) THEN N1 = N2 N2 = IO1 LPL = LEND(N2) IF (-LIST(LPL) .NE. N1) THEN IER = 2 RETURN ENDIF ENDIF C C Set N3 to the node opposite N1->N2 (the second neighbor C of N1), and test for error 3 (N3 already a boundary C node). C LPL = LEND(N1) LP = LPTR(LPL) LP = LPTR(LP) N3 = ABS(LIST(LP)) LPL = LEND(N3) IF (LIST(LPL) .LE. 0) THEN IER = 3 RETURN ENDIF C C Delete N2 as a neighbor of N1, making N3 the first C neighbor, and test for error 4 (N2 not a neighbor C of N1). Note that previously computed pointers may C no longer be valid following the call to DELNB. C CALL DELNB (N1,N2,N, LIST,LPTR,LEND,LNEW, LPH) IF (LPH .LT. 0) THEN IER = 4 RETURN ENDIF C C Delete N1 as a neighbor of N2, making N3 the new last C neighbor. C CALL DELNB (N2,N1,N, LIST,LPTR,LEND,LNEW, LPH) C C Make N3 a boundary node with first neighbor N2 and last C neighbor N1. C LP = LSTPTR(LEND(N3),N1,LIST,LPTR) LEND(N3) = LP LIST(LP) = -N1 C C No errors encountered. C IER = 0 RETURN END SUBROUTINE DELBE (N,X,Y,TOL, LIST,LPTR,LEND,LNEW, ND) INTEGER N, LIST(*), LPTR(*), LEND(N), LNEW, ND DOUBLE PRECISION X(N), Y(N), TOL C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/27/96 C C This subroutine deletes extraneous boundary edges from a C triangulation. For each triangle (N1,N2,N3) such that C N1->N2 is a boundary edge and N3 is an interior node, if C the aspect ratio (ratio of the radius of the inscribed C circle to that of the circumcircle) falls below tolerance C TOL, edge N1->N2 (and triangle (N1,N2,N3)) is removed. C (Following the removal, N1->N3 and N3->N2 become candi- C dates for removal.) C Triangles with aspect ratio zero (signed area zero) lead C to failure in Subroutine LGRAD (and hence VLIST), and tri- C angles with small aspect ratio lead to inaccuracy in C triangle gradients (vertices of the gradient feasibility C diagram computed by VLIST). On the other hand, if the C triangulation is rendered nonconvex by removing a boundary C edge, Subroutines DELNDC and TRFIND (and hence ADDNDC) may C fail. Thus, if it is necessary to add or delete a node C following a call to this routine, the tolerance should be C very small. C C C On input: C C N = Number of nodes in the triangulation. No comp- C utation takes place if N < 4 or TOL <= 0. C C X,Y = Arrays of length N containing the Cartesian C coordinates of the nodes. C C TOL = Positive tolerance used as a lower bound on C the acceptable aspect ratio of boundary tri- C angles. A reasonable value is 1.E-5. c C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Data structure defining the C triangulation. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with ND C boundary edge removals. C C ND = Number of boundary edges removed, or -1 if an C error flag was returned by DELARC indicating C an invalid triangulation data structure. C C Modules required by DELBE: CIRCUM, DELARC, DELNB, LSTPTR C C*********************************************************** C DOUBLE PRECISION AR, CR, SA, XC, YC INTEGER IER, LP, LPL, N0, N1, N2, N3 C C Local parameters: C C AR = Aspect ratio of triangle (N1,N2,N3) C CR = Circumradius of triangle (N1,N2,N3) C IER = Error flag for calls to DELARC C LP = LIST index of (pointer to) the first or second C neighbor of N1 C LPL = Pointer to the last neighbor of N0 or N1 C N0 = Nodal index of the first boundary node (the one C with smallest index) C N1,N2 = Indexes of the endpoints of a boundary edge C N3 = Index of the node opposite N1->N2 C SA = Signed area of triangle (N1,N2,N3) C XC,YC = Components of the circumcenter of triangle C (N1,N2,N3) C ND = 0 C C Test for invalid input. C IF (N .LT. 4 .OR. TOL .LE. 0.) RETURN C C Set N0 and N2 to the first boundary node encountered. C N0 = 0 1 N0 = N0 + 1 LPL = LEND(N0) IF (LIST(LPL) .GT. 0) GO TO 1 N2 = N0 C C CCW loop on boundary edges N1->N2. C 2 N1 = N2 LPL = LEND(N1) LP = LPTR(LPL) N2 = LIST(LP) C C Set N3 to the node opposite N1->N2 -- the second neighbor C of N1. C LP = LPTR(LP) N3 = LIST(LP) C C Bypass triangles for which N3 is a boundary node. C IF (N3 .LT. 0) GO TO 3 IF (LIST(LEND(N3)) .LT. 0) GO TO 3 C C Compute the aspect ratio AR of triangle (N1,N2,N3). C CALL CIRCUM (X(N1),Y(N1),X(N2),Y(N2),X(N3),Y(N3), . .TRUE., XC,YC,CR,SA,AR) IF (AR .LT. TOL) THEN C C Remove edge N1-N2 and test for an invalid data structure. C CALL DELARC (N,N1,N2, LIST,LPTR,LEND,LNEW, IER) IF (IER .NE. 0) THEN ND = -1 RETURN ENDIF C C Update ND and process edge N1->N3 next. C ND = ND + 1 N2 = N1 GO TO 2 ENDIF C C Bottom of loop on boundary edges. C 3 IF (N2 .NE. N0) GO TO 2 C C No error encountered. C RETURN END SUBROUTINE DELNB (N0,NB,N, LIST,LPTR,LEND,LNEW, LPH) INTEGER N0, NB, N, LIST(*), LPTR(*), LEND(N), LNEW, . LPH C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/30/98 C C This subroutine deletes a neighbor NB from the adjacency C list of node N0 (but N0 is not deleted from the adjacency C list of NB) and, if NB is a boundary node, makes N0 a C boundary node. For pointer (LIST index) LPH to NB as a C neighbor of N0, the empty LIST,LPTR location LPH is filled C in with the values at LNEW-1, pointer LNEW-1 (in LPTR and C possibly in LEND) is changed to LPH, and LNEW is decremen- C ted. This requires a search of LEND and LPTR entailing an C expected operation count of O(N). C C C On input: C C N0,NB = Indexes, in the range 1 to N, of a pair of C nodes such that NB is a neighbor of N0. C (N0 need not be a neighbor of NB.) C C N = Number of nodes in the triangulation. N .GE. 3. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Data structure defining the C triangulation. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with C the removal of NB from the ad- C jacency list of N0 unless C LPH < 0. C C LPH = List pointer to the hole (NB as a neighbor of C N0) filled in by the values at LNEW-1 or error C indicator: C LPH > 0 if no errors were encountered. C LPH = -1 if N0, NB, or N is outside its valid C range. C LPH = -2 if NB is not a neighbor of N0. C C Modules required by DELNB: None C C Intrinsic function called by DELNB: ABS C C*********************************************************** C INTEGER I, LNW, LP, LPB, LPL, LPP, NN C C Local parameters: C C I = DO-loop index C LNW = LNEW-1 (output value of LNEW) C LP = LIST pointer of the last neighbor of NB C LPB = Pointer to NB as a neighbor of N0 C LPL = Pointer to the last neighbor of N0 C LPP = Pointer to the neighbor of N0 that precedes NB C NN = Local copy of N C NN = N C C Test for error 1. C IF (N0 .LT. 1 .OR. N0 .GT. NN .OR. NB .LT. 1 .OR. . NB .GT. NN .OR. NN .LT. 3) THEN LPH = -1 RETURN ENDIF C C Find pointers to neighbors of N0: C C LPL points to the last neighbor, C LPP points to the neighbor NP preceding NB, and C LPB points to NB. C LPL = LEND(N0) LPP = LPL LPB = LPTR(LPP) 1 IF (LIST(LPB) .EQ. NB) GO TO 2 LPP = LPB LPB = LPTR(LPP) IF (LPB .NE. LPL) GO TO 1 C C Test for error 2 (NB not found). C IF (ABS(LIST(LPB)) .NE. NB) THEN LPH = -2 RETURN ENDIF C C NB is the last neighbor of N0. Make NP the new last C neighbor and, if NB is a boundary node, then make N0 C a boundary node. C LEND(N0) = LPP LP = LEND(NB) IF (LIST(LP) .LT. 0) LIST(LPP) = -LIST(LPP) GO TO 3 C C NB is not the last neighbor of N0. If NB is a boundary C node and N0 is not, then make N0 a boundary node with C last neighbor NP. C 2 LP = LEND(NB) IF (LIST(LP) .LT. 0 .AND. LIST(LPL) .GT. 0) THEN LEND(N0) = LPP LIST(LPP) = -LIST(LPP) ENDIF C C Update LPTR so that the neighbor following NB now fol- C lows NP, and fill in the hole at location LPB. C 3 LPTR(LPP) = LPTR(LPB) LNW = LNEW-1 LIST(LPB) = LIST(LNW) LPTR(LPB) = LPTR(LNW) DO 4 I = NN,1,-1 IF (LEND(I) .EQ. LNW) THEN LEND(I) = LPB GO TO 5 ENDIF 4 CONTINUE C 5 DO 6 I = 1,LNW-1 IF (LPTR(I) .EQ. LNW) THEN LPTR(I) = LPB ENDIF 6 CONTINUE C C No errors encountered. C LNEW = LNW LPH = LPB RETURN END SUBROUTINE DELNDC (K, N,X,Y,Z,LIST,LPTR,LEND,LNEW,LWK, . IWK, IER) INTEGER K, N, LIST(*), LPTR(*), LEND(*), LNEW, LWK, . IWK(2,*), IER DOUBLE PRECISION X(*), Y(*), Z(*) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 06/29/98 C C This subroutine deletes node K (along with all edges C incident on node K) from a convex triangulation of N C nodes, and inserts edges as necessary to produce a tri- C angulation of the remaining N-1 nodes. If a convex C triangulation is input, a convex triangulation will re- C sult, and thus, DELNDC reverses the effect of a call to C Subroutine ADDNDC. C C C On input: C C K = Index (for X, Y, and Z) of the node to be C deleted. 1 .LE. K .LE. N. C C K is not altered by this routine. C C N = Number of nodes in the triangulation on input. C N .GE. 4. Note that N will be decremented C following the deletion. C C X,Y,Z = Arrays of length N containing the coordi- C nates of the nodes and data values. C C LIST,LPTR,LEND,LNEW = Data structure defining the C triangulation. Refer to Sub- C routine TRMSHC. C C LWK = Number of columns reserved for IWK. LWK must C be at least NNB-3, where NNB is the number of C neighbors of node K, including an extra C pseudo-node if K is a boundary node. C C IWK = Integer work array dimensioned 2 by LWK (or C array of length .GE. 2*LWK). C C On output: C C N = Number of nodes in the triangulation on output. C The input value is decremented unless 1 .LE. IER C .LE. 4. C C X,Y,Z = Updated arrays (with elements K+1,...,N+1 C shifted up one position, thus overwriting C element K) unless 1 .LE. IER .LE. 4. C C LIST,LPTR,LEND,LNEW = Updated triangulation data C structure reflecting the dele- C tion unless IER > 0. Note C that the data structure may C have been altered if IER C .GE. 3. C C LWK = Number of IWK columns required unless IER = 1 C or IER = 3. C C IWK = Indexes of the endpoints of the new edges C added unless LWK = 0 or 1 .LE. IER .LE. 4. C (Edges are associated with columns, or pairs C of adjacent elements if IWK is declared as a C singly-subscripted array.) C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if K or N is outside its valid range C or LWK < 0 on input. C IER = 2 if more space is required in IWK. C Refer to LWK. C IER = 3 if the triangulation data structure is C invalid on input. C IER = 4 if K is an interior node with four or C more neighbors, and the number of C neighbors could not be reduced to C three by swaps. This could be caused C by floating point errors with collin- C ear nodes or by an invalid data C structure. C IER = 5 if an error flag was returned by C OPTIM. An error message is written to C the standard output unit in this event. C C Note that the deletion may result in all remaining nodes C being collinear. This situation is not flagged. C C Modules required by DELNDC: DELNB, LEFT, LSTPTR, NBCNT, C OPTIM, SWAP, SWPTC C C Intrinsic function called by DELNDC: ABS C C*********************************************************** C DOUBLE PRECISION X1, X2, XL, XR, Y1, Y2, YL, YR INTEGER LSTPTR, NBCNT LOGICAL LEFT INTEGER I, IERR, IWL, J, LNW, LP, LP21, LPF, LPH, LPL, . LPL2, LPN, LWKL, N1, N2, NFRST, NIT, NL, NN, . NNB, NR LOGICAL BDRY C C Local parameters: C C BDRY = Logical variable with value TRUE iff N1 is a C boundary node C I,J = DO-loop indexes C IERR = Error flag returned by OPTIM C IWL = Number of IWK columns containing edges C LNW = Local copy of LNEW C LP = LIST pointer C LP21 = LIST pointer returned by SWAP C LPF,LPL = Pointers to the first and last neighbors of N1 C LPH = Pointer (or flag) returned by DELNB C LPL2 = Pointer to the last neighbor of N2 C LPN = Pointer to a neighbor of N1 C LWKL = Input value of LWK C N1 = Local copy of K C N2 = Neighbor of N1 C NFRST = First neighbor of N1: LIST(LPF) C NIT = Number of iterations in OPTIM C NR,NL = Neighbors of N1 preceding (to the right of) and C following (to the left of) N2, respectively C NN = Number of nodes in the triangulation C NNB = Number of neighbors of N1 (including a pseudo- C node representing the boundary if N1 is a C boundary node) C X1,Y1 = Coordinates of N1 C X2,Y2 = Coordinates of N2 C XL,YL = Coordinates of NL C XR,YR = Coordinates of NR C C C Set N1 to K and NNB to the number of neighbors of N1 (plus C one if N1 is a boundary node), and test for errors. LPF C and LPL are LIST indexes of the first and last neighbors C of N1, IWL is the number of IWK columns containing C edges, and BDRY is TRUE iff N1 is a boundary node. C N1 = K NN = N IF (N1 .LT. 1 .OR. N1 .GT. NN .OR. NN .LT. 4 .OR. . LWK .LT. 0) GO TO 21 LPL = LEND(N1) LPF = LPTR(LPL) NNB = NBCNT(LPL,LPTR) BDRY = LIST(LPL) .LT. 0 IF (BDRY) NNB = NNB + 1 IF (NNB .LT. 3) GO TO 23 LWKL = LWK LWK = NNB - 3 IF (LWKL .LT. LWK) GO TO 22 IWL = 0 IF (NNB .EQ. 3) GO TO 5 C C Initialize for loop on edges N1-N2 for neighbors N2 of N1, C beginning with the second neighbor. NR and NL are the C neighbors preceding and following N2, respectively, and C LP indexes NL. The loop is exited when all possible C swaps have been applied to edges incident on N1. If N1 C is interior, the number of neighbors will be reduced C to 3. C X1 = X(N1) Y1 = Y(N1) NFRST = LIST(LPF) NR = NFRST XR = X(NR) YR = Y(NR) LP = LPTR(LPF) N2 = LIST(LP) X2 = X(N2) Y2 = Y(N2) LP = LPTR(LP) C C Top of loop: set NL to the neighbor following N2. C 2 NL = ABS(LIST(LP)) IF (NL .EQ. NFRST .AND. BDRY) GO TO 5 XL = X(NL) YL = Y(NL) C C Test for a convex quadrilateral. To avoid an incorrect C test caused by collinearity, use the fact that if N1 C is a boundary node, then N1 LEFT NR->NL and if N2 is C a boundary node, then N2 LEFT NL->NR. C LPL2 = LEND(N2) IF ( (BDRY .OR. LEFT(XR,YR,XL,YL,X1,Y1)) .AND. . (LIST(LPL2) .LT. 0 .OR. . LEFT(XL,YL,XR,YR,X2,Y2)) ) GO TO 3 C C Nonconvex quadrilateral -- no swap is possible. C NR = N2 XR = X2 YR = Y2 GO TO 4 C C The quadrilateral defined by adjacent triangles C (N1,N2,NL) and (N2,N1,NR) is convex. Swap in C NL-NR and store it in IWK. Indexes larger than N1 C must be decremented since N1 will be deleted from C X and Y. C 3 CALL SWAP (NL,NR,N1,N2, LIST,LPTR,LEND, LP21) IWL = IWL + 1 IF (NL .LE. N1) THEN IWK(1,IWL) = NL ELSE IWK(1,IWL) = NL - 1 ENDIF IF (NR .LE. N1) THEN IWK(2,IWL) = NR ELSE IWK(2,IWL) = NR - 1 ENDIF C C Recompute the LIST indexes LPL,LP and decrement NNB. C LPL = LEND(N1) NNB = NNB - 1 IF (NNB .EQ. 3) GO TO 5 LP = LSTPTR(LPL,NL,LIST,LPTR) IF (NR .EQ. NFRST) GO TO 4 C C NR is not the first neighbor of N1. C Back up and test N1-NR for a swap again: Set N2 to C NR and NR to the previous neighbor of N1 -- the C neighbor of NR which follows N1. LP21 points to NL C as a neighbor of NR. C N2 = NR X2 = XR Y2 = YR LP21 = LPTR(LP21) LP21 = LPTR(LP21) NR = ABS(LIST(LP21)) XR = X(NR) YR = Y(NR) GO TO 2 C C Bottom of loop -- test for invalid termination. C 4 IF (N2 .EQ. NFRST) GO TO 24 N2 = NL X2 = XL Y2 = YL LP = LPTR(LP) GO TO 2 C C Delete N1 from the adjacency list of N2 for all neighbors C N2 of N1. LPL points to the last neighbor of N1. C LNEW is stored in local variable LNW. C 5 LP = LPL LNW = LNEW C C Loop on neighbors N2 of N1, beginning with the first. C 6 LP = LPTR(LP) N2 = ABS(LIST(LP)) CALL DELNB (N2,N1,N, LIST,LPTR,LEND,LNW, LPH) IF (LPH .LT. 0) GO TO 23 C C LP and LPL may require alteration. C IF (LPL .EQ. LNW) LPL = LPH IF (LP .EQ. LNW) LP = LPH IF (LP .NE. LPL) GO TO 6 C C Delete N1 from X, Y, Z, and LEND, and remove its adjacency C list from LIST and LPTR. LIST entries (nodal indexes) C which are larger than N1 must be decremented. C NN = NN - 1 IF (N1 .GT. NN) GO TO 9 DO 7 I = N1,NN X(I) = X(I+1) Y(I) = Y(I+1) Z(I) = Z(I+1) LEND(I) = LEND(I+1) 7 CONTINUE C DO 8 I = 1,LNW-1 IF (LIST(I) .GT. N1) LIST(I) = LIST(I) - 1 IF (LIST(I) .LT. -N1) LIST(I) = LIST(I) + 1 8 CONTINUE C C For LPN = first to last neighbors of N1, delete the C preceding neighbor (indexed by LP). C C Each empty LIST,LPTR location LP is filled in with the C values at LNW-1, and LNW is decremented. All pointers C (including those in LPTR and LEND) with value LNW-1 C must be changed to LP. C C LPL points to the last neighbor of N1. C 9 IF (BDRY) NNB = NNB - 1 LPN = LPL DO 13 J = 1,NNB LNW = LNW - 1 LP = LPN LPN = LPTR(LP) LIST(LP) = LIST(LNW) LPTR(LP) = LPTR(LNW) IF (LPTR(LPN) .EQ. LNW) LPTR(LPN) = LP IF (LPN .EQ. LNW) LPN = LP DO 10 I = NN,1,-1 IF (LEND(I) .EQ. LNW) THEN LEND(I) = LP GO TO 11 ENDIF 10 CONTINUE C 11 DO 12 I = LNW-1,1,-1 IF (LPTR(I) .EQ. LNW) LPTR(I) = LP 12 CONTINUE 13 CONTINUE C C Update N and LNEW, and optimize the patch of triangles C containing K (on input) by applying swaps to the edges C in IWK. C N = NN LNEW = LNW IF (IWL .GT. 0) THEN NIT = 4*IWL CALL OPTIM (X,Y,Z,IWL, LIST,LPTR,LEND,NIT,IWK, IERR) IF (IERR .NE. 0) GO TO 25 ENDIF C C Successful termination. C IER = 0 RETURN C C Invalid input parameter. C 21 IER = 1 RETURN C C Insufficient space reserved for IWK. C 22 IER = 2 RETURN C C Invalid triangulation data structure. NNB < 3 on input or C N2 is a neighbor of N1 but N1 is not a neighbor of N2. C 23 IER = 3 RETURN C C K is an interior node with 4 or more neighbors, but the C number of neighbors could not be reduced. C 24 IER = 4 RETURN C C Error flag returned by OPTIM. C 25 IER = 5 WRITE (*,100) NIT, IERR RETURN 100 FORMAT (//5X,'*** DELNDC: Error flag returned by ', . 'OPTIM: NIT = ',I4,', IER = ',I1,' ***'/) END SUBROUTINE DELTAI (N,X,Y,Z,GX,GY,LIST,LPTR,LEND, D, . IER) INTEGER N, LIST(*), LPTR(*), LEND(N), IER DOUBLE PRECISION X(N), Y(N), Z(N), GX(N), GY(N), D(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/27/96 C C Given a set of nodes p_i, data values z_i, and nodal C gradients g_i, i = 1 to N, for which there exists a convex C Hermite interpolatory surface, the affine nodal function C f_i(p) = + z_i defines a tangent plane at C (p_i,z_i), and H(p) = max (over i = 1 to N) {f_i(p)} is a C convex piecewise linear interpolant of the Hermite data. C Let R_i denote the set of points p such that f_i(p) >= C f_j(p) for j = 1 to N. Then f_i is the restriction of H C to R_i. For strictly convex data, R_i is a convex region C containing a neighborhood of p_i. The set of such regions C partitions the plane into a cell diagram. C C Remarkably, it can be shown that the cell diagram is the C straight-line dual of a convexity-preserving triangulation C of the nodal gradients and negative z-intercepts (constant C terms) of the affine nodal functions. C C This subroutine returns a set of radii d_i such that C H(p) = f_i(p) for all p in a disk of radius d_i centered C at p_i; i.e., d_i is the perpendicular distance from p_i C to the boundary of R_i. The algorithm has complexity C O(N). C C C On input: C C N = Number of nodes, data values, and gradients. C N .GE. 3. C C X,Y = Arrays of length N containing the Cartesian C coordinates of the nodes. C C Z = Array of length N containing the data values. C C GX,GY = Arrays of length N containing the components C of the nodal gradients. These must be dis- C tinct. C C LIST,LPTR,LEND = Data structure defining the gradi- C ent triangulation. Refer to C Subroutine TRMSHC. C C The above parameters are not altered by this routine. C C D = Array of length at least N. C C On output: C C D = Array containing the distance from each node to C its cell boundary unless IER > 0. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if N < 3. C IER = 2 if a pair of nodal gradients coincide. C IER = 3 if the Hermite data is not convex. C C Modules required by DELTAI: None C C Intrinsic functions called by DELTAI: ABS, SQRT C C*********************************************************** C DOUBLE PRECISION DGS, DGX, DGY, DI, DIJ, TOL INTEGER I, J, LP, LPL C C Local parameters: C C DGS = Euclidean norm squared of g_j - g_i C DGX, DGY = Components of g_j - g_i C DI = Local copy of D(I) -- minimum over J of the C DIJ values C DIJ = Perpendicular distance from node p_i to cell C edge e_ij C I,J = Indexes of a pair of adjacent nodal gradients C corresponding to cell edge e_ij C LP = LIST index of J as a neighbor of I C LPL = Pointer to the last neighbor of vertex I C TOL = Tolerance for distinguishing between a zero C distance and a negative value (error 3) C DATA TOL/1.D-6/ C C Test for error 1. C IF (N .LT. 3) GO TO 11 C C Loop on nodal indexes I. C DO 2 I = 1,N DI = 1.D20 C C Loop on indexes J of neighbors of I in the gradient trian- C gulation. The triangulation edge corresponds to the C cell edge e_ij shared by cells I and J. LPL points to C the last neighbor of I. C LPL = LEND(I) LP = LPL 1 LP = LPTR(LP) J = ABS(LIST(LP)) C C Compute the perpendicular distance DIJ from p_i to edge C e_ij: C DIJ = |L(p_i)|/|grad(L)| = C (z_i - f_j(p_i))/|g_j - g_i| = C (z_i - z_j - )/|g_j - g_i|, C C where L(p) = f_i(p) - f_j(p) is a linear function with C zeros on e_ij. C DGX = GX(J)-GX(I) DGY = GY(J)-GY(I) DGS = DGX*DGX + DGY*DGY IF (DGS .EQ. 0.) GO TO 12 DIJ = ( Z(I)-Z(J) - GX(J)*(X(I)-X(J)) . - GY(J)*(Y(I)-Y(J)) )/SQRT(DGS) IF (DIJ .LT. 0.) THEN C C Treat DIJ as 0 if it is in [-TOL,0]. C IF (DIJ .LT. -TOL) GO TO 13 DIJ = 0. ENDIF IF (DIJ .LT. DI) DI = DIJ IF (LP .NE. LPL) GO TO 1 C C Store DI. C D(I) = DI 2 CONTINUE C C No error encountered. C IER = 0 RETURN C C N < 3. C 11 IER = 1 RETURN C C Nodal gradients I and J coincide. C 12 IER = 2 RETURN C C f_j(p_i) > z_i, and the Hermite data is therefore not C convex. C 13 IER = 3 RETURN END DOUBLE PRECISION FUNCTION DSTORE (X) DOUBLE PRECISION X C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 02/25/96 C C This function forces its argument X to be stored in a C memory location, thus providing a means of determining C floating point number characteristics (such as the machine C precision) when it is necessary to avoid computation in C high precision registers. C C On input: C C X = Double precision value to be stored. C C X is not altered by this function. C C On output: C C DSTORE = Value of X after it has been stored and C possibly truncated or rounded to the double C precision word length. C C Modules required by DSTORE: None C C*********************************************************** C DOUBLE PRECISION Y COMMON/STCOM/Y Y = X DSTORE = Y RETURN END SUBROUTINE FGRID (NX,NY,PX,PY,EPS,GX,GY,C,LIST,LPTR, . LEND,DMIN,NR,NA,W,QX,QY, F,IER) INTEGER NX, NY, LIST(*), LPTR(*), LEND(*), NR, NA, IER DOUBLE PRECISION PX(NX), PY(NY), EPS, GX(*), GY(*), . C(*), DMIN, W(NR), QX(NR,NA), . QY(NR,NA), F(NX,NY) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/27/96 C C This subroutine returns the values of the convex bivar- C iate function F (defined in Subroutine CSURF) at the C vertices of an NX by NY rectangular grid. C C C On input: C C NX = Number of grid points in the x direction. C NX .GE. 2. C C NY = Number of grid points in the y direction. C NY .GE. 2. C C PX = Array of length NX containing a strictly in- C creasing sequence of values. C C PY = Array of length NY containing a strictly in- C creasing sequence of values. C C EPS,...,QY = Parameters defining the interpolant F. C These should be input unaltered from a C call to Subroutine CSURF (with IER = 0 C or IER = -11 on output). C C The above parameters are not altered by this routine. C C F = Array of length at least NX*NY. C C On output: C C F = Array of function values at the vertices of the C rectangular grid. F(I,J) = F(X(I),Y(J)) for C I = 1,...,NX and J = 1,...,NY. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if NX < 2, NY < 2, EPS < 0, DMIN < 0, C NR < 1, or NA < 2. C IER = 2 if PX or PY is not strictly C increasing. C C Module required by FGRID: FVAL C C*********************************************************** C DOUBLE PRECISION FX, FY INTEGER I, J, KST C C Local parameters: C C FX,FY = Components of the gradient of F -- not saved C I,J = Indexes for PX and PY, respectively C KST = Nodal index used as the starting point for the C search in Subroutine FVAL C KST = 1 C C Test for invalid input parameters. C IF (NX .LT. 2 .OR. NY .LT. 2 .OR. EPS .LT. 0. . .OR. DMIN .LT. 0. .OR. NR .LT. 1 .OR. . NA .LT. 2) GO TO 11 C C Test for nonincreasing values of PX or PY. C DO 1 I = 2,NX IF (PX(I) .LE. PX(I-1)) GO TO 12 1 CONTINUE DO 2 J = 2,NY IF (PY(J) .LE. PY(J-1)) GO TO 12 2 CONTINUE C C Loop on grid points. C DO 4 J = 1,NY DO 3 I = 1,NX CALL FVAL (PX(I),PY(J),EPS,GX,GY,C,LIST,LPTR,LEND, . DMIN,NR,NA,W,QX,QY, KST, F(I,J),FX,FY) 3 CONTINUE 4 CONTINUE C C No error encountered. C IER = 0 RETURN C C Invalid input parameter. C 11 IER = 1 RETURN C C PX or PY is not strictly increasing. C 12 IER = 2 RETURN END SUBROUTINE FVAL (PX,PY,EPS,GX,GY,C,LIST,LPTR,LEND, . DMIN,NR,NA,W,QX,QY, KST, F,FX,FY) INTEGER LIST(*), LPTR(*), LEND(*), NR, NA, KST DOUBLE PRECISION PX, PY, EPS, GX(*), GY(*), C(*), . DMIN, W(NR), QX(NR,NA), QY(NR,NA), F, . FX, FY C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/20/96 C C This subroutine returns the value and gradient of F at a C point p, where F is defined in Subroutine CSURF. Evalua- C tion of the gradient adds relatively little to the cost of C evaluating F. C C C On input: C C PX,PY = Components of the evaluation point p. C C EPS,...,QY = Parameters defining the interpolant F. C These should be input unaltered from a C call to Subroutine CSURF (with IER = 0 C on output). C C The above parameters are not altered by this routine. C C KST = Nodal index in the range 1 to N defining a C cell R_k, k = KST, at which a search for p C is started. If F is evaluated at the elements C of an ordered sequence of points, the value of C KST returned by a previous call to FVAL is C a good choice. C C It is assumed without a test that all input parameters C are within their valid ranges. C C On output: C C KST = Index of the cell R_k that contains p. C C F = Value of the interpolant at p. C C FX,FY = Components of the gradient of F at p. C C Modules required by FVAL: None C C Intrinsic functions called by FVAL: ABS, SQRT C C*********************************************************** C DOUBLE PRECISION FK, FL, FS, FXS, FYS, QXIJ, QYIJ INTEGER I, J, K, L, LP, LPL C C Local parameters: C C FK = Value of the affine nodal function f_k at p or C at p+q_ij for quadrature point q_ij C FL = Value of the affine nodal function f_l at p or C at p+q_ij for quadrature point q_ij C FS = Sum(j=1,NA){H(p+q_ij)} for some i (1 to NR) C FXS,FYS = Components of the gradient of FS C I = Index for W and row index for QX and QY C J = Column index for QX and QY C K,L = Nodal (cell) indexes, where L is a neighbor of C K in the gradient triangulation C LP = Pointer (LIST index) to L as a neighbor of K C LPL = Pointer to the last neighbor of K in the C gradient triangulation C QXIJ,QYIJ = Components of p+q_ij C K = KST C C Find k such that p is in R_k: f_k(p) GE f_l(p) for all C neighbors l of k, where f_k(p) = - c_k. C FK = GX(K)*PX + GY(K)*PY - C(K) 1 LPL = LEND(K) LP = LPL 2 LP = LPTR(LP) L = ABS(LIST(LP)) FL = GX(L)*PX + GY(L)*PY - C(L) IF (FK .LT. FL) THEN K = L FK = FL GO TO 1 ENDIF IF (LP .NE. LPL) GO TO 2 C C Update KST, and initialize F and (FX,FY) to the quadratic C function q(p) = EPS* and its gradient 2*EPS*p, C respectively. (Refer to Subroutine ADDQT.) The inter- C polated value and gradient will be added. C KST = K F = EPS*(PX*PX + PY*PY) FX = 2.D0*EPS*PX FY = 2.D0*EPS*PY C C F(p) = H(p) = f_k(p) if the disk of radius DMIN centered C at p is contained in R_k; i.e., the distance from p to C each edge e_kl of R_k is at least DMIN; i.e., for each C neighbor l of k, L(p)/abs(grad(L)) >= DMIN, where L(p) = C f_k(p)-f_l(p) and grad(L) denotes the gradient of L (a C linear function with zeros on e_kl). C 3 LP = LPTR(LP) L = ABS(LIST(LP)) FL = GX(L)*PX + GY(L)*PY - C(L) IF (FK-FL .LT. DMIN*SQRT((GX(K)-GX(L))**2 + . (GY(K)-GY(L))**2)) GO TO 4 IF (LP .NE. LPL) GO TO 3 C C F(p) = H(p). C F = F + FK FX = FX + GX(K) FY = FY + GY(K) RETURN C C F(p) must be approximated by the quadrature rule C C Sum(i=1,NR){ W_i*Sum(j=1,NA){H(p+q_ij)} } C C (Refer to Subroutine GETQW.) C 4 DO 7 I = 1,NR C C Accumulate Sum(j=1,NA){H(p+q_ij)} and its gradient in C FS, FXS, and FYS. C FS = 0. FXS = 0. FYS = 0. DO 6 J = 1,NA C C Store the translated quadrature point p+q_ij. C QXIJ = PX + QX(I,J) QYIJ = PY + QY(I,J) C C Find k such that p+q_ij is in R_k. The search begins with C the index of the cell containing the previous quadrature C point (or p if I = J = 1). C FK = GX(K)*QXIJ + GY(K)*QYIJ - C(K) LP = LPL 5 LP = LPTR(LP) L = ABS(LIST(LP)) FL = GX(L)*QXIJ + GY(L)*QYIJ - C(L) IF (FK .LT. FL) THEN K = L FK = FL LPL = LEND(K) LP = LPL GO TO 5 ENDIF IF (LP .NE. LPL) GO TO 5 C C Update FS and (FXS,FYS) with the value and gradient of f_k C at (p+q_ij). C FS = FS + FK FXS = FXS + GX(K) FYS = FYS + GY(K) 6 CONTINUE C C Update F and (FX,FY). C F = F + W(I)*FS FX = FX + W(I)*FXS FY = FY + W(I)*FYS 7 CONTINUE RETURN END SUBROUTINE GETQW (NR,NA,D, W,QX,QY,IER) INTEGER NR, NA, IER DOUBLE PRECISION D, W(NR), QX(NR,NA), QY(NR,NA) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/29/96 C C This subroutine computes weights and abscissae defining C a quadrature rule for approximating C C F(p) = Integral [H(p+q)*Phi(q)]dq, C C where the integral is over the disk D0 of radius D center- C ed at the origin, and Phi(q) = phi(Norm(q)/D), normalized C to have integral 1, for phi(t) = 1 - 3*t**2 + 2*t**3 (t in C [0,1]). The disk D0 is partitioned uniformly by radius C and angle resulting in Nr*Na subregions, where region C (i,j) is defined by polar coordinates r in [(i-1)*D/Nr, C i*D/Nr] and angle a in [(j-1)*(2*pi)/Na,j*(2*pi)/Na]. The C quadrature points (abscissae) are the centroids of the C subregions, and the weights are the centroid values of Phi C scaled by the subregion areas. The rule is thus C C Sum(i = 1 to Nr) [W_i*Sum(j = 1 to Na) H(p+q_ij) ], C C where W_i = (10/3)*[(2*i-1)/(Nr**2*Na)]*phi((2*i-1)/(2*Nr)) C and q_ij = [(2*i-1)/(2*Nr)]*D*(cos(a_j),sin(a_j)) for C a_j = [(2*j-1)/(2*Na)]*(2*pi). C C If the radius D of D0 depends on the evaluation point p, C it is still only necessary to call this routine once with C D = 1, and then to scale the quadrature points appropri- C ately for each evaluation of F; i.e., the approximation to C F(p) is C C Sum(i = 1 to Nr) [W_i*Sum(j = 1 to Na) H(p+D*q_ij) ]. C C C On input: C C NR = Number of intervals Nr in the radial direction C defining the partitioning of D0. NR = 8 should C be sufficient. NR > 0. C C NA = Number of intervals Na in the angular direction C defining the partitioning of D0. NA = 3*NR is C recommended. NA > 1. C C D = Radius of the disk D0 -- the domain of integra- C tion and support of Phi. D > 0. C C The above parameters are not altered by this routine. C C W = Array of length at least NR. C C QX,QY = Arrays of length at least NR*NA. C C On output: C C W = Array containing quadrature weights W_i unless C IER > 0. C C QX,QY = Arrays dimensioned NR by NA containing the C components of the quadrature points: q_ij = C (QX(i,j),QY(i,j)) for i = 1 to NR and j = 1 C to NA, unless IER > 0. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if NR .LE. 0, NA .LE. 1, or D .LE. 0. C C Modules required by GETQW: None C C Intrinsic functions called by GETQW: ATAN, COS, DBLE, SIN C C*********************************************************** C DOUBLE PRECISION AJ, PHIT, PIDNA, RI, S, T, TWONR INTEGER I, J C C Local parameters: C C AJ = Angular coordinate of a quadrature point: C ((2*j-1)/NA)*pi C I,J = Indexes for W, QX, and QY C PHIT = phi(T) C PIDNA = pi/NA C RI = Radial coordinate of a quadrature point: T*D C S = Scale factor for weight W(I): (10/3)/(NR**2*NA) C T = Evaluation point for phi: (2*i-1)/(2*NR) C TWONR = 2*NR C IF (NR .LE. 0 .OR. NA .LE. 1 .OR. D .LE. 0.) . GO TO 11 C C Compute constants. C PIDNA = 4.D0*ATAN(1.D0)/DBLE(NA) S = 10.D0/(3.D0*DBLE(NR*NR*NA)) TWONR = 2*NR C C Outer loop on radial index I. C DO 2 I = 1,NR T = DBLE(2*I-1)/TWONR RI = T*D PHIT = (2.D0*T-3.D0)*T*T + 1.D0 W(I) = S*DBLE(2*I-1)*PHIT C C Inner loop on angular coordinate J. C DO 1 J = 1,NA AJ = DBLE(2*J-1)*PIDNA QX(I,J) = RI*COS(AJ) QY(I,J) = RI*SIN(AJ) 1 CONTINUE 2 CONTINUE C C No errors encountered. C IER = 0 RETURN C C Invalid input parameter. C 11 IER = 1 RETURN END SUBROUTINE GLIST (N,LIST,LPTR,LEND,LISTV,DXL,DYL, GX, . GY,IER) INTEGER N, LIST(*), LPTR(*), LEND(N), LISTV(*), IER DOUBLE PRECISION DXL(*), DYL(*), GX(N), GY(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/13/96 C C Given a convexity-preserving triangulation of a set of C nodes and data values, along with its dual, the gradient C feasibility diagram, this subroutine returns a set of C nodal gradients for which there exists a convex Hermite C interpolant of the data values and gradients. C C The nodal gradients are taken to be the centroids of C the feasibility regions or truncated feasibility regions. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 3. C Note that, if N = 3, the three truncated feasi- C bility regions degenerate to the same point (the C gradient of the linear interpolant) which is C returned as the gradient of all three nodes. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMSHC. C C The above parameters should be unaltered from the values C input to Subroutine VLIST (which should be called to ob- C tain LISTV, DXL, and DYL). C C LISTV = Integer array containing feasibility region C vertex indexes (indexes to DXL and DYL) C stored in one-to-one correspondence with C LIST/LPTR entries. Refer to Subroutine C VLIST. C C DXL,DYL = Arrays of length NV = 2*N-2 containing C the vertices (components of the gradients C associated with triangles) and pseudo- C vertices. Refer to Subroutine VLIST. C C The above parameters are not altered by this routine. C C GX,GY = Arrays of length at least N. C C On output: C C GX,GY = Arrays of length N containing the components C of the nodal gradients (centroids of the C gradient feasibility regions or truncated C regions) unless IER > 0. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if N < 3. C C Modules required by GLIST: None C C Intrinsic function called by GLIST: DBLE C C*********************************************************** C DOUBLE PRECISION SX, SY INTEGER KV, LP, LP1L, LP2L, N1, N2, NN, NNB C C Local parameters: C C KV = Index of a vertex of N1's gradient feasibility C region C LP = LIST index (pointer) C LP2L = Pointer to the last neighbor of N2 C LP1L = Pointer to the last neighbor of N1 C N1,N2 = Nodal indexes C NN = Local copy of N C NNB = Number of vertices in the feasibility region C associated with node N1 C SX,SY = Components of the sum of vertices in the C feasibility region associated with N1 C NN = N IF (NN .LT. 3) GO TO 11 C C Compute the centroids of the gradient feasibility regions. C C Loop on nodes N1, accumulating the sums SX and SY of the C components of the NNB vertices of the associated C feasibility region. C DO 2 N1 = 1,NN NNB = 0 SX = 0. SY = 0. LP1L = LEND(N1) LP = LP1L C C Loop on neighbors of N1. C 1 LP = LPTR(LP) KV = LISTV(LP) NNB = NNB + 1 SX = SX + DXL(KV) SY = SY + DYL(KV) IF (LP .NE. LP1L) GO TO 1 IF (LIST(LP1L) .LT. 0) THEN C C N1 is a boundary node. Add in the contributions from C the pseudo-vertex associated with its first neighbor C N2. C LP = LPTR(LP1L) N2 = LIST(LP) LP2L = LEND(N2) KV = LISTV(LP2L) NNB = NNB + 1 SX = SX + DXL(KV) SY = SY + DYL(KV) ENDIF C C Compute and store the centroid. C GX(N1) = SX/DBLE(NNB) GY(N1) = SY/DBLE(NNB) 2 CONTINUE C C No error encountered. C IER = 0 RETURN C C N < 3. C 11 IER = 1 RETURN END SUBROUTINE INSERT (K,LP, LIST,LPTR,LNEW ) INTEGER K, LP, LIST(*), LPTR(*), LNEW C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/01/88 C C This subroutine inserts K as a neighbor of N1 following C N2, where LP is the LIST pointer of N2 as a neighbor of C N1. Note that, if N2 is the last neighbor of N1, K will C become the first neighbor (even if N1 is a boundary node). C C C On input: C C K = Index of the node to be inserted. C C LP = LIST pointer of N2 as a neighbor of N1. C C The above parameters are not altered by this routine. C C LIST,LPTR,LNEW = Data structure defining the trian- C gulation. C C On output: C C LIST,LPTR,LNEW = Data structure updated with the C addition of node K. C C Modules required by INSERT: None C C*********************************************************** C INTEGER LSAV C LSAV = LPTR(LP) LPTR(LP) = LNEW LIST(LNEW) = K LPTR(LNEW) = LSAV LNEW = LNEW + 1 RETURN END SUBROUTINE INTADD (KK,I1,I2,I3, LIST,LPTR,LEND,LNEW ) INTEGER KK, I1, I2, I3, LIST(*), LPTR(*), LEND(*), . LNEW C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 02/22/91 C C This subroutine adds an interior node to a triangulation C of a set of points in the plane. The data structure is C updated with the insertion of node KK into the triangle C whose vertices are I1, I2, and I3. No optimization of the C triangulation is performed. C C C On input: C C KK = Index of the node to be inserted. KK .GE. 1 C and KK must not be equal to I1, I2, or I3. C C I1,I2,I3 = Indexes of the counterclockwise-ordered C sequence of vertices of a triangle which C contains node KK. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND,LNEW = Data structure defining the C triangulation. Triangle C (I1,I2,I3) must be included C in the triangulation. C C On output: C C LIST,LPTR,LEND,LNEW = Data structure updated with C the addition of node KK. KK C will be connected to nodes I1, C I2, and I3. C C Modules required by INTADD: INSERT, LSTPTR C C*********************************************************** C INTEGER LSTPTR INTEGER K, LP, N1, N2, N3 C C Local parameters: C C K = Local copy of KK C LP = LIST pointer C N1,N2,N3 = Local copies of I1, I2, and I3 C K = KK C C Initialization. C N1 = I1 N2 = I2 N3 = I3 C C Add K as a neighbor of I1, I2, and I3. C LP = LSTPTR(LEND(N1),N2,LIST,LPTR) CALL INSERT (K,LP, LIST,LPTR,LNEW ) LP = LSTPTR(LEND(N2),N3,LIST,LPTR) CALL INSERT (K,LP, LIST,LPTR,LNEW ) LP = LSTPTR(LEND(N3),N1,LIST,LPTR) CALL INSERT (K,LP, LIST,LPTR,LNEW ) C C Add I1, I2, and I3 as neighbors of K. C LIST(LNEW) = N1 LIST(LNEW+1) = N2 LIST(LNEW+2) = N3 LPTR(LNEW) = LNEW + 1 LPTR(LNEW+1) = LNEW + 2 LPTR(LNEW+2) = LNEW LEND(K) = LNEW + 2 LNEW = LNEW + 3 RETURN END INTEGER FUNCTION JRAND (N, IX,IY,IZ ) INTEGER N, IX, IY, IZ C C*********************************************************** C C From STRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/28/98 C C This function returns a uniformly distributed pseudo- C random integer in the range 1 to N. C C C On input: C C N = Maximum value to be returned. C C N is not altered by this function. C C IX,IY,IZ = Integer seeds initialized to values in C the range 1 to 30,000 before the first C call to JRAND, and not altered between C subsequent calls (unless a sequence of C random numbers is to be repeated by C reinitializing the seeds). C C On output: C C IX,IY,IZ = Updated integer seeds. C C JRAND = Random integer in the range 1 to N. C C Reference: B. A. Wichmann and I. D. Hill, "An Efficient C and Portable Pseudo-random Number Generator", C Applied Statistics, Vol. 31, No. 2, 1982, C pp. 188-190. C C Modules required by JRAND: None C C Intrinsic functions called by JRAND: INT, MOD, REAL C C*********************************************************** C REAL U, X C C Local parameters: C C U = Pseudo-random number uniformly distributed in the C interval (0,1). C X = Pseudo-random number in the range 0 to 3 whose frac- C tional part is U. C IX = MOD(171*IX,30269) IY = MOD(172*IY,30307) IZ = MOD(170*IZ,30323) X = (REAL(IX)/30269.) + (REAL(IY)/30307.) + . (REAL(IZ)/30323.) U = X - INT(X) JRAND = REAL(N)*U + 1. RETURN END LOGICAL FUNCTION LEFT (X1,Y1,X2,Y2,X0,Y0) DOUBLE PRECISION X1, Y1, X2, Y2, X0, Y0 C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/01/88 C C This function determines whether node N0 is to the left C or to the right of the line through N1-N2 as viewed by an C observer at N1 facing N2. C C C On input: C C X1,Y1 = Coordinates of N1. C C X2,Y2 = Coordinates of N2. C C X0,Y0 = Coordinates of N0. C C Input parameters are not altered by this function. C C On output: C C LEFT = TRUE if and only if (X0,Y0) is on or to the C left of the directed line N1->N2. C C Modules required by LEFT: None C C*********************************************************** C DOUBLE PRECISION DX1, DY1, DX2, DY2 C C Local parameters: C C DX1,DY1 = X,Y components of the vector N1->N2 C DX2,DY2 = X,Y components of the vector N1->N0 C DX1 = X2-X1 DY1 = Y2-Y1 DX2 = X0-X1 DY2 = Y0-Y1 C C If the sign of the vector cross product of N1->N2 and C N1->N0 is positive, then sin(A) > 0, where A is the C angle between the vectors, and thus A is in the range C (0,180) degrees. C LEFT = DX1*DY2 .GE. DX2*DY1 RETURN END SUBROUTINE LGRAD (X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3, FX,FY, . SA) DOUBLE PRECISION X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, . FX, FY, SA C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/13/96 C C Given three points defining a non-vertical plane, and C hence a bivariate linear function F, this subroutine re- C turns the gradient of F and the signed area of the C triangle obtained by projecting the points onto the x-y C plane. C C C On input: C C X1,Y1,Z1 = Cartesian coordinates of the first vertex C (X1,Y1) and associated function value C Z1 = F(X1,Y1). C C X2,Y2,Z2 = Cartesian coordinates of the second ver- C tex (X2,Y2) and associated function value C Z2 = F(X2,Y2). C C X3,Y3,Z3 = Cartesian coordinates of the third vertex C (X3,Y3) and associated function value C Z3 = F(X3,Y3). C C Input parameters are not altered by this routine. C C On output: C C FX,FY = Components of the gradient of F -- partial C derivatives with respect to x and y, respec- C tively, unless SA = 0, in which case the C gradient is not defined. C C SA = Signed area of the triangle with vertices C (X1,Y1), (X2,Y2), and (X3,Y3). SA > 0 if and C only if the vertices are in counterclockwise C order: (X3,Y3) is strictly to the left of the C directed line from (X1,Y1) to (X2,Y2). C C Modules required by LGRAD: None C C*********************************************************** C DOUBLE PRECISION A, DX1, DX2, DY1, DY2, DZ1, DZ2 C C Local parameters: C C A = Twice the signed triangle area: z-component of C (V1-V3) X (V2-V3) for vertices V1, V2, and V3 C DX1,DY1 = Components of V1-V3 C DX2,DY2 = Components of V2-V3 C DZ1,DZ2 = Z1-Z3 and Z2-Z3, respectively C DX1 = X1-X3 DY1 = Y1-Y3 DX2 = X2-X3 DY2 = Y2-Y3 C A = DX1*DY2 - DX2*DY1 SA = A/2.D0 IF (A .EQ. 0.) RETURN C DZ1 = Z1-Z3 DZ2 = Z2-Z3 FX = (DZ1*DY2 - DZ2*DY1)/A FY = (DX1*DZ2 - DX2*DZ1)/A RETURN END INTEGER FUNCTION LSTPTR (LPL,NB,LIST,LPTR) INTEGER LPL, NB, LIST(*), LPTR(*) C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/01/88 C C This function returns the index (LIST pointer) of NB in C the adjacency list for N0, where LPL = LEND(N0). C C C On input: C C LPL = LEND(N0) C C NB = Index of the node whose pointer is to be re- C turned. NB must be connected to N0. C C LIST,LPTR = Data structure defining the triangula- C tion. C C Input parameters are not altered by this function. C C On output: C C LSTPTR = Pointer such that LIST(LSTPTR) = NB or C LIST(LSTPTR) = -NB, unless NB is not a C neighbor of N0, in which case LSTPTR = LPL. C C Modules required by LSTPTR: None C C*********************************************************** C INTEGER LP, ND C C Local parameters: C C LP = LIST pointer C ND = Nodal index C LP = LPTR(LPL) 1 ND = LIST(LP) IF (ND .EQ. NB) GO TO 2 LP = LPTR(LP) IF (LP .NE. LPL) GO TO 1 C 2 LSTPTR = LP RETURN END INTEGER FUNCTION NBCNT (LPL,LPTR) INTEGER LPL, LPTR(*) C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/01/88 C C This function returns the number of neighbors of a node C N0 in a triangulation. C C C On input: C C LPL = LIST pointer to the last neighbor of N0 -- C LPL = LEND(N0). C C LPTR = Array of pointers associated with LIST. C C Input parameters are not altered by this function. C C On output: C C NBCNT = Number of neighbors of N0. C C Modules required by NBCNT: None C C*********************************************************** C INTEGER K, LP C C Local parameters: C C K = Counter for computing the number of neighbors C LP = LIST pointer C LP = LPL K = 1 C 1 LP = LPTR(LP) IF (LP .EQ. LPL) GO TO 2 K = K + 1 GO TO 1 C 2 NBCNT = K RETURN END SUBROUTINE OPTIM (X,Y,Z,NE, LIST,LPTR,LEND,NIT, . IWK, IER) INTEGER NE, LIST(*), LPTR(*), LEND(*), NIT, IWK(2,NE), . IER DOUBLE PRECISION X(*), Y(*), Z(*) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/12/96 C C Given a set of NE triangulation edges, this subroutine C optimizes the portion of the triangulation consisting of C the quadrilaterals (pairs of adjacent triangles) which C have the edges as diagonals by applying the swap test C and appropriate swaps to the edges. C C An iteration consists of applying the swap test and C swaps to all NE edges in the order in which they are C stored. The iteration is repeated until no swap occurs C or NIT iterations have been performed. The bound on the C number of iterations may be necessary to prevent an C infinite loop caused by cycling (reversing the effect of a C previous swap) due to floating point inaccuracy when four C or more data points are nearly coplanar. C C C On input: C C X,Y,Z = Arrays containing the nodal coordinates and C data values. C C NE = Number of edges in the set. NE .GE. 0. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMSHC. C C NIT = Maximum number of iterations to be performed. C A reasonable value is 3*NE. NIT .GE. 1. C C IWK = Integer array dimensioned 2 by NE containing C the nodal indexes of the edge endpoints (pairs C of endpoints are stored in columns). C C On output: C C LIST,LPTR,LEND = Updated triangulation data struc- C ture reflecting the swaps. C C NIT = Number of iterations performed. C C IWK = Endpoint indexes of the new set of edges C reflecting the swaps. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if a swap occurred on the last of C MAXIT iterations, where MAXIT is the C value of NIT on input. The new set C of edges in not necessarily optimal C in this case. C IER = 2 if NE < 0 or NIT < 1 on input. C IER = 3 if IWK(2,I) is not a neighbor of C IWK(1,I) for some I in the range 1 C to NE. A swap may have occurred in C this case. C IER = 4 if an error flag was returned by C Function SWPTC: the triangulation C is not convex. C C Modules required by OPTIM: LSTPTR, SWAP, SWPTC C C Intrinsic function called by OPTIM: ABS C C*********************************************************** C INTEGER I, IERR, IO1, IO2, ITER, LP, LP21, LPL, LPP, . MAXIT, N1, N2, NNE LOGICAL SWPTC LOGICAL SWP C C Local parameters: C C I = Column index for IWK C IERR = Error flag for calls to SWPTC C IO1,IO2 = Nodal indexes of the endpoints of an edge in IWK C ITER = Iteration count C LP = LIST pointer C LP21 = Parameter returned by SWAP (not used) C LPL = Pointer to the last neighbor of IO1 C LPP = Pointer to the node preceding IO2 as a neighbor C of IO1 C MAXIT = Input value of NIT C N1,N2 = Nodes opposite IO1->IO2 and IO2->IO1, C respectively C NNE = Local copy of NE C SWP = Flag set to TRUE iff a swap occurs in the C optimization loop C NNE = NE MAXIT = NIT IF (NNE .LT. 0 .OR. MAXIT .LT. 1) GO TO 7 C C Initialize iteration count ITER and test for NE = 0. C ITER = 0 IF (NNE .EQ. 0) GO TO 5 C C Top of loop -- C SWP = TRUE iff a swap occurred in the current iteration. C 1 IF (ITER .EQ. MAXIT) GO TO 6 ITER = ITER + 1 SWP = .FALSE. C C Inner loop on edges IO1-IO2 -- C DO 4 I = 1,NNE IO1 = IWK(1,I) IO2 = IWK(2,I) C C Set N1 and N2 to the nodes opposite IO1->IO2 and C IO2->IO1, respectively. Determine the following: C C LPL = pointer to the last neighbor of IO1, C LP = pointer to IO2 as a neighbor of IO1, and C LPP = pointer to the node N2 preceding IO2. C LPL = LEND(IO1) LPP = LPL LP = LPTR(LPP) 2 IF (LIST(LP) .EQ. IO2) GO TO 3 LPP = LP LP = LPTR(LPP) IF (LP .NE. LPL) GO TO 2 C C IO2 should be the last neighbor of IO1. Test for no C edge and bypass the swap test if IO1 is a boundary C node. C IF (ABS(LIST(LP)) .NE. IO2) GO TO 8 IF (LIST(LP) .LT. 0) GO TO 4 C C Store N1 and N2, or bypass the swap test if IO1 is a C boundary node and IO2 is its first neighbor. C 3 N2 = LIST(LPP) IF (N2 .LT. 0) GO TO 4 LP = LPTR(LP) N1 = ABS(LIST(LP)) C C Test IO1-IO2 for a swap, and update IWK if necessary. C IF ( SWPTC(N1,N2,IO1,IO2,X,Y,Z, IERR) ) THEN SWP = .TRUE. CALL SWAP (N1,N2,IO1,IO2, LIST,LPTR,LEND, LP21) IWK(1,I) = N1 IWK(2,I) = N2 ENDIF IF (IERR .NE. 0) GO TO 9 4 CONTINUE IF (SWP) GO TO 1 C C Successful termination. C 5 NIT = ITER IER = 0 RETURN C C MAXIT iterations performed without convergence. C 6 NIT = MAXIT IER = 1 RETURN C C Invalid input parameter. C 7 NIT = 0 IER = 2 RETURN C C IO2 is not a neighbor of IO1. C 8 NIT = ITER IER = 3 RETURN C C Non-convex triangulation. C 9 NIT = ITER IER = 4 RETURN END SUBROUTINE PLTCNT (LUN,PLTSIZ,NX,NY,PX,PY,PZ,NCON,IWK, . XC,YC, IER) INTEGER LUN, NX, NY, NCON, IWK(*), IER DOUBLE PRECISION PLTSIZ, PX(NX), PY(NY), PZ(NX,NY), . XC(*), YC(*) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 04/12/97 C C Given a set of function values PZ = F(X,Y) at the ver- C tices of an NX by NY rectangular grid, this subroutine C creates a level-2 Encapsulated PostScript (EPS) file C containing a contour plot of the piecewise bilinear inter- C polant of the function values. C C The accuracy of the contour lines increases with the C number of grid points. Refer to Subroutine CNTOUR for C further details. C C C On input: C C LUN = Logical unit number in the range 0 to 99. C The unit should be opened with an appropriate C file name before the call to this routine. C C PLTSIZ = Plot size in inches. A window containing C the plot is mapped, with aspect ratio C preserved, to a rectangular viewport with C maximum side-length PLTSIZ. The viewport C is centered on the 8.5 by 11 inch page, and C its boundary is drawn. 1.0 .LE. PLTSIZ C .LE. 7.5. C C NX = Number of grid points in the x direction. C NX .GE. 2. C C NY = Number of grid points in the y direction. C NY .GE. 2. C C PX = Array of length NX containing a strictly in- C creasing sequence of values. C C PY = Array of length NY containing a strictly in- C creasing sequence of values. C C PZ = Array of function values at the vertices of the C rectangular grid. PZ(I,J) = F(PX(I),PY(J)) for C I = 1,...,NX and J = 1,...,NY. C C NCON = Number of contour values. The contour values C are uniformly distributed over the range of C PZ values. NCON .GE. 1. C C The above parameters are not altered by this routine. C C IWK = Integer array of length at least 1.5*NX*NY to C be used as work space. C C XC,YC = Arrays of length at least 2.5*NX*NY to C be used as work space. C C On output: C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if LUN, PLTSIZ, NX, NY, or NCON is C outside its valid range. C IER = 2 if PX or PY is not strictly C increasing. C IER = 3 if the range of PZ values has zero C width (F is constant). C IER = 4 if an error was encountered in writing C to unit LUN. C IER = 5 if an unexpected error flag was re- C turned by Subroutine CNTOUR. This C should not occur. C C In the unlikely event of an internal failure, a message C is printed on the standard output device. IER may be 0 C in this case. C C Module required by PLTCNT: CNTOUR C C Intrinsic functions called by PLTCNT: CHAR, DBLE C C*********************************************************** C DOUBLE PRECISION CVAL, DX, DY, DZ, PZIJ, R, SFX, SFY, . T, TX, TY, ZMAX, ZMIN INTEGER I, IC, IERR, IH, IPX1, IPX2, IPY1, IPY2, IW, . J, K, KV, LC, NC, NCMAX C C Local parameters: C C CVAL = Contour value between ZMIN and ZMAX C DX = Window width PX(NX)-PX(1)N C DY = Window height PY(NY)-PY(1) C DZ = Interval between contour values: C (ZMAX-ZMIN)/(NCON+1) C I,J = Row and column indexes for PZ C IC = Index (for IWK) of a contour line associated C with contour value CVAL: 1 to NC C IERR = Error flag for calls to CNTOUR C IH = Height of the bounding box (viewport) in C points C IPX1,IPY1 = X and y coordinates (in points) of the lower C left corner of the bounding box C IPX2,IPY2 = X and y coordinates (in points) of the upper C right corner of the bounding box C IW = Width of the bounding box in points C K = Index (for XC and YC) of a point on a contour C line C KV = DO-loop index for loop on contour values C LC = Length of arrays XC and YC C NC = Number of contour lines associated with C contour value CVAL C NCMAX = Maximum allowable value of NC C PZIJ = PZ(I,J) C R = Aspect ratio DX/DY C SFX,SFY = Scale factors for mapping window coordinates C to viewport coordinates C T = Temporary variable C TX,TY = Translation vector for mapping window coordi- C nates to viewport coordinates C ZMIN,ZMAX = Minimum and maximum of the PZ values C C C Test for error 1. C IF (LUN .LT. 0 .OR. LUN .GT. 99 .OR. . PLTSIZ .LT. 1.D0 .OR. PLTSIZ .GT. 7.5D0 .OR. . NX .LT. 2 .OR. NY .LT. 2 .OR. NCON .LT. 1) . GO TO 11 C C Compute the aspect ratio of the window. C DX = PX(NX) - PX(1) DY = PY(NY) - PY(1) IF (DX .EQ. 0. .OR. DY .EQ. 0.) GO TO 12 R = DX/DY C C Compute the range of PZ values and the interval between C contour values. C ZMIN = PZ(1,1) ZMAX = ZMIN DO 2 J = 1,NY DO 1 I = 1,NX PZIJ = PZ(I,J) IF (PZIJ .LT. ZMIN) ZMIN = PZIJ IF (PZIJ .GT. ZMAX) ZMAX = PZIJ 1 CONTINUE 2 CONTINUE DZ = (ZMAX-ZMIN)/DBLE(NCON+1) IF (DZ .LE. 0.) GO TO 13 C C Compute the lower left (IPX1,IPY1) and upper right C (IPX2,IPY2) corner coordinates of the bounding box C (the viewport). The coordinates, specified in default C user space units (points, at 72 points/inch with origin C at the lower left corner of the page), are chosen to C preserve the aspect ratio R, and to center the plot on C the 8.5 by 11 inch page. The center of the page is C (306,396), and T = PLTSIZ/2 in points. C T = 36.D0*PLTSIZ IF (R .GE. 1.D0) THEN IPX1 = 306 - NINT(T) IPX2 = 306 + NINT(T) IPY1 = 396 - NINT(T/R) IPY2 = 396 + NINT(T/R) ELSE IPX1 = 306 - NINT(T*R) IPX2 = 306 + NINT(T*R) IPY1 = 396 - NINT(T) IPY2 = 396 + NINT(T) ENDIF C C Output header comments. C WRITE (LUN,100,ERR=14) IPX1, IPY1, IPX2, IPY2 100 FORMAT ('%!PS-Adobe-3.0 EPSF-3.0'/ . '%%BoundingBox:',4I4/ . '%%Title: Contour Plot'/ . '%%Creator: CSRFPACK'/ . '%%EndComments') C C Draw the bounding box. C WRITE (LUN,110,ERR=14) IPX1, IPY1 WRITE (LUN,120,ERR=14) IPX1, IPY2 WRITE (LUN,120,ERR=14) IPX2, IPY2 WRITE (LUN,120,ERR=14) IPX2, IPY1 WRITE (LUN,130,ERR=14) WRITE (LUN,140,ERR=14) 110 FORMAT (2I4,' moveto') 120 FORMAT (2I4,' lineto') 130 FORMAT ('closepath') 140 FORMAT ('stroke') C C Set up a mapping from the window to the viewport. C IW = IPX2 - IPX1 IH = IPY2 - IPY1 SFX = DBLE(IW)/DX SFY = DBLE(IH)/DY TX = IPX1 - SFX*PX(1) TY = IPY1 - SFY*PY(1) WRITE (LUN,150,ERR=14) TX, TY, SFX, SFY 150 FORMAT (2F12.6,' translate'/ . 2F12.6,' scale') C C Set the line thickness to 2 points. (Since the scale C factors are applied to everything, the width must be C specified in world coordinates.) C T = 4.D0/(SFX+SFY) WRITE (LUN,160,ERR=14) T 160 FORMAT (F12.6,' setlinewidth') C C Compute parameters for CNTOUR: C C NCMAX = Maximum allowable number of contour lines C associated with each contour value. C LC = Length of arrays XC and YC and maximum allowable C number of points defining all the contour lines C associated with a contour value. C NCMAX = (NX*NY+1)/2 LC = 2*(NX-1)*(NY-1) + NCMAX C C Loop on contour values CVAL uniformly spaced in the open C interval (ZMIN,ZMAX). C CVAL = ZMIN DO 5 KV = 1,NCON CVAL = CVAL + DZ C C Compute a sequence of NC contour lines associated with C F = CVAL. For IC = 1 to NC, IWK(IC) is the index (for C XC and YC) of the last point of contour IC. C CALL CNTOUR (NX,NY,PX,PY,PZ,CVAL,LC,NCMAX, . IWK(NCMAX+1), XC,YC,IWK,NC,IERR) IF (IERR .EQ. 2) GO TO 12 IF (IERR .NE. 0) GO TO 15 C C Draw the NC contours. C IC = 0 K = 0 3 IC = IC + 1 K = K + 1 C C Create a path consisting of contour IC. C WRITE (LUN,170,ERR=14) XC(K), YC(K) 170 FORMAT (2F12.6,' moveto') 4 K = K + 1 WRITE (LUN,180,ERR=14) XC(K), YC(K) 180 FORMAT (2F12.6,' lineto') IF (K .NE. IWK(IC)) GO TO 4 C C Paint the path. C WRITE (LUN,140,ERR=14) IF (IC .NE. NC) GO TO 3 5 CONTINUE C C Output the showpage command and end-of-file indicator. C WRITE (LUN,200,ERR=14) 200 FORMAT ('showpage'/ . '%%EOF') C C HP's interpreters require a one-byte End-of-PostScript-Job C indicator (to eliminate a timeout error message): C ASCII 4. C WRITE (LUN,210,ERR=14) CHAR(4) 210 FORMAT (A1) C C No error encountered. C IER = 0 RETURN C C Invalid input parameter. C 11 IER = 1 RETURN C C PX or PY is not strictly increasing. C 12 IER = 2 RETURN C C DZ = 0. C 13 IER = 3 RETURN C C Error writing to unit LUN. C 14 IER = 4 RETURN C C Error flag returned by CNTOUR. C 15 IER = 5 RETURN END SUBROUTINE PLTGR (LUN,PLTSIZ,WX1,WX2,WY1,WY2,N,LIST, . LPTR,LEND,NV,LISTV,DXL,DYL,GX,GY, . TITLE,NUMBR, IER) CHARACTER*(*) TITLE INTEGER LUN, N, LIST(*), LPTR(*), LEND(N), NV, . LISTV(*), IER LOGICAL NUMBR DOUBLE PRECISION PLTSIZ, WX1, WX2, WY1, WY2, DXL(NV), . DYL(NV), GX(N), GY(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/15/98 C C Given a convexity-preserving triangulation of a set of C nodes and data values, along with its straight-line dual, C the gradient feasibility diagram, and a set of nodal grad- C ients, this subroutine creates a level-2 Encapsulated C PostScript (EPS) file containing a plot of the feasibility C diagram and nodal gradients. C C C On input: C C LUN = Logical unit number in the range 0 to 99. C The unit should be opened with an appropriate C file name before the call to this routine. C C PLTSIZ = Plot size in inches. The window is mapped, C with aspect ratio preserved, to a rectangu- C lar viewport with maximum side-length equal C to .88*PLTSIZ (leaving room for labels out- C side the viewport). The viewport is C centered on the 8.5 by 11 inch page, and C its boundary is drawn. 1.0 .LE. PLTSIZ C .LE. 8.5. C C WX1,WX2,WY1,WY2 = Parameters defining a rectangular C window against which the feasibil- C ity diagram is clipped. Only the C portion of the diagram that lies C in the window is drawn. (WX1,WY1) C and (WX2,WY2) are the lower left C and upper right corners, respec- C tively. WX1 < WX2 and WY1 < WY2. C C N = Number of nodes in the triangulation. N .GE. 3. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMSHC. C C NV = Number of feasibility region vertices, includ- C ing pseudo-vertices associated with boundary C edges: NV = NT+NB = 2*N-2, where NT = 2*N-NB-2 C is the number of triangles. C C LISTV = Integer array containing feasibility region C vertex indexes (indexes to DXL and DYL) C stored in one-to-one correspondence with C LIST/LPTR entries. Refer to Subroutine C VLIST. C C DXL,DYL = Arrays of length NV containing the C vertices (components of the gradients C associated with triangles) and pseudo- C vertices. Refer to Subroutine VLIST. C C GX,GY = Arrays of length N containing the components C of the nodal gradients (centroids of the C gradient feasibility regions or truncated C regions). Refer to Subroutine GLIST. C C TITLE = Type CHARACTER variable or constant contain- C ing a string to be centered above the plot. C The string must be enclosed in parentheses; C i.e., the first and last characters must be C '(' and ')', respectively, but these are not C displayed. TITLE may have at most 80 char- C acters including the parentheses. C C NUMBR = Option indicator: If NUMBR = TRUE, the C nodal indexes are plotted next to the nodal C gradients. C C Input parameters are not altered by this routine. C C On output: C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if LUN, PLTSIZ, N, or NV is outside C its valid range. C IER = 2 if WX1 >= WX2 or WY1 >= WY2. C IER = 3 if an error was encountered in writing C to unit LUN. C C Various plotting options can be controlled by altering C the data statement below. C C Modules required by PLTGR: None C C Intrinsic functions called by PLTGR: CHAR, DBLE, NINT C C*********************************************************** C DOUBLE PRECISION DASHL, DX, DY, FSIZN, FSIZT, R, SFX, . SFY, T, TX, TY, X1, X2, XB1, XB2, XP, . Y1, Y2, YB1, YB2, YP INTEGER IH, IPX1, IPX2, IPY1, IPY2, IW, KV0, KV1, KV2, . LP, LP1L, LPL, N0, N1 LOGICAL ANNOT C DATA ANNOT/.TRUE./, DASHL/4.D0/, FSIZN/10.D0/, . FSIZT/16.D0/ C C Local parameters: C C ANNOT = Logical variable with value TRUE iff the plot C is to be annotated with the values of WX1, C WX2, WY1, and WY2 C DASHL = Length (in points, at 72 points per inch) of C dashes and spaces in a dashed line pattern C used for connecting pseudo-vertices C DX = Window width WX2-WX1 C DY = Window height WY2-WY1 C FSIZN = Font size in points for labeling nodal gradi- C ents with their indexes if NUMBR = TRUE C FSIZT = Font size in points for the title (and C annotation if ANNOT = TRUE) C IH = Height of the viewport in points C IPX1,IPY1 = X and y coordinates (in points) of the lower C left corner of the bounding box or viewport C IPX2,IPY2 = X and y coordinates (in points) of the upper C right corner of the bounding box or viewport C IW = Width of the viewport in points C KV0 = Index of the first vertex of an unbounded C feasibility region C KV1,KV2 = Endpoint indexes of a feasibility region edge C LP = LIST index (pointer) of a neighbor of N0 C LP1L = Pointer to the last neighbor of N1 C LPL = Pointer to the last neighbor of N0 C N0 = Nodal index and DO-loop index C N1 = Index of the first neighbor of N0 C R = Aspect ratio DX/DY C SFX,SFY = Scale factors for mapping world coordinates C (window coordinates in [WX1,WX2] X [WY1,WY2]) C to viewport coordinates in [IPX1,IPX2] X C [IPY1,IPY2] C T = Temporary variable C TX,TY = Translation vector for mapping world coordi- C nates to viewport coordinates C X1,Y1 = Components of vertex KV1: DXL(KV1), DYL(KV1) C X2,Y2 = Components of vertex KV2: DXL(KV2), DYL(KV2) C XB1,YB1 = Components of the lower left corner of the C viewport in world coordinates C XB2,YB2 = Components of the upper right corner of the C viewport in world coordinates C XP,YP = Components of the point at which an edge C of an unbounded region intersects the C viewport, or components of a nodal gradient C and/or label location C C C Test for error 1. C IF (LUN .LT. 0 .OR. LUN .GT. 99 .OR. . PLTSIZ .LT. 1.D0 .OR. PLTSIZ .GT. 7.5D0 .OR. . N .LT. 3 .OR. NV .NE. 2*N-2) GO TO 11 C C Compute the aspect ratio of the window. C DX = WX2 - WX1 DY = WY2 - WY1 IF (DX .LE. 0. .OR. DY .LE. 0.) GO TO 12 R = DX/DY C C Compute the lower left (IPX1,IPY1) and upper right C (IPX2,IPY2) corner coordinates of the bounding box. C The coordinates, specified in default user space units C (points, at 72 points/inch with origin at the lower C left corner of the page), are chosen to preserve the C aspect ratio R, and to center the plot on the 8.5 by 11 C inch page. The center of the page is (306,396), and C T = PLTSIZ/2 in points. C T = 36.D0*PLTSIZ IF (R .GE. 1.D0) THEN IPX1 = 306 - NINT(T) IPX2 = 306 + NINT(T) IPY1 = 396 - NINT(T/R) IPY2 = 396 + NINT(T/R) ELSE IPX1 = 306 - NINT(T*R) IPX2 = 306 + NINT(T*R) IPY1 = 396 - NINT(T) IPY2 = 396 + NINT(T) ENDIF C C Output header comments. C WRITE (LUN,100,ERR=13) IPX1, IPY1, IPX2, IPY2 100 FORMAT ('%!PS-Adobe-3.0 EPSF-3.0'/ . '%%BoundingBox:',4I4/ . '%%Title: Triangulation Dual'/ . '%%Creator: CSRFPACK'/ . '%%EndComments') C C Set (IPX1,IPY1) and (IPX2,IPY2) to the corner coordinates C of a viewport obtained by shrinking the bounding box by C 12% in each dimension. C IW = NINT(0.88D0*DBLE(IPX2-IPX1)) IH = NINT(0.88D0*DBLE(IPY2-IPY1)) IPX1 = 306 - IW/2 IPX2 = 306 + IW/2 IPY1 = 396 - IH/2 IPY2 = 396 + IH/2 C C Set the line thickness to 2 points, and draw the C viewport boundary. C T = 2.D0 WRITE (LUN,110,ERR=13) T WRITE (LUN,120,ERR=13) IPX1, IPY1 WRITE (LUN,130,ERR=13) IPX1, IPY2 WRITE (LUN,130,ERR=13) IPX2, IPY2 WRITE (LUN,130,ERR=13) IPX2, IPY1 WRITE (LUN,140,ERR=13) WRITE (LUN,150,ERR=13) 110 FORMAT (F12.6,' setlinewidth') 120 FORMAT (2I4,' moveto') 130 FORMAT (2I4,' lineto') 140 FORMAT ('closepath') 150 FORMAT ('stroke') C C Set up a mapping from the window to the viewport. C SFX = DBLE(IW)/DX SFY = DBLE(IH)/DY TX = IPX1 - SFX*WX1 TY = IPY1 - SFY*WY1 WRITE (LUN,160,ERR=13) TX, TY, SFX, SFY 160 FORMAT (2F12.6,' translate'/ . 2F12.6,' scale') C C Compute the viewport corners (XB1,YB1) and (XB2,YB2) C in world coordinates (by applying the inverse window- C to-viewport mapping to (IPX1,IPY1) and (IPX2,IPY2)). C XB1 = (IPX1-TX)/SFX XB2 = (IPX2-TX)/SFX YB1 = (IPY1-TY)/SFY YB2 = (IPY2-TY)/SFY C C Set the line thickness to 1 point. (Since the scale C factors are applied to everything, the width must be C specified in world coordinates.) C T = 2.D0/(SFX+SFY) WRITE (LUN,110,ERR=13) T C C Save the current graphics state, and set the clip path to C the boundary of the window. C WRITE (LUN,170,ERR=13) WRITE (LUN,180,ERR=13) WX1, WY1 WRITE (LUN,190,ERR=13) WX2, WY1 WRITE (LUN,190,ERR=13) WX2, WY2 WRITE (LUN,190,ERR=13) WX1, WY2 WRITE (LUN,200,ERR=13) 170 FORMAT ('gsave') 180 FORMAT (2F12.6,' moveto') 190 FORMAT (2F12.6,' lineto') 200 FORMAT ('closepath clip newpath') C C Set T to the world-coordinate equivalent of DASHL C (for drawing the boundary of the truncated feasibility C diagram). C T = 2.D0*DASHL/(SFX+SFY) C C Loop on nodes N0 corresponding to feasibility regions. C LPL indexes the last neighbor of N0. C DO 3 N0 = 1,N LPL = LEND(N0) C C Set KV2 to the first vertex index. C IF (LIST(LPL) .GT. 0) THEN C C N0 is an interior node. The first vertex coincides with C the last. C KV2 = LISTV(LPL) ELSE C C N0 is a boundary node. The first vertex is the last C vertex of the first neighbor N1 of N0. A copy of KV2 C is saved in KV0. C LP = LPTR(LPL) N1 = LIST(LP) LP1L = LEND(N1) KV2 = LISTV(LP1L) KV0 = KV2 ENDIF C C Loop on neighbors NB of N0. For each triangulation edge C N0-NB, set KV1-KV2 to the corresponding feasibility C region edge. C LP = LPL 1 LP = LPTR(LP) KV1 = KV2 KV2 = LISTV(LP) C C Add edge KV1-KV2 to the path iff KV2 > KV1. C IF (KV2 .GT. KV1) WRITE (LUN,210,ERR=13) DXL(KV1), . DYL(KV1), DXL(KV2), DYL(KV2) 210 FORMAT (2F12.6,' moveto',2F12.6,' lineto') IF (LP .NE. LPL) GO TO 1 IF (LIST(LPL) .LT. 0) THEN C C N0 is a boundary node. Paint the current path, draw a C dashed line between KV2 and KV0, and restore the solid C line attribute. C WRITE (LUN,150,ERR=13) WRITE (LUN,220,ERR=13) T, T, DXL(KV2), DYL(KV2), . DXL(KV0), DYL(KV0) 220 FORMAT ('[',2F12.6,'] 0 setdash'/ . 2F12.6,' moveto',2F12.6,' lineto'/ . ' stroke'/ . ' [] 0 setdash') C C Extend KV1->KV2 to the boundary of the viewport. C X1 = DXL(KV1) Y1 = DYL(KV1) X2 = DXL(KV2) Y2 = DYL(KV2) IF (X1 .NE. X2) THEN C C Find the intersection (XP,YP) with the left or right C boundary. C IF (X1 .LT. X2) THEN XP = XB2 ELSE XP = XB1 ENDIF YP = Y1 + ((XP-X1)/(X2-X1))*(Y2-Y1) C C Test for the point of intersection inside the viewport. C IF (YP .GE. YB1 .AND. YP .LE. YB2) GO TO 2 ENDIF C C Find the intersection with the top or bottom boundary. C IF (Y1 .LT. Y2) THEN YP = YB2 ELSE YP = YB1 ENDIF XP = X1 + ((YP-Y1)/(Y2-Y1))*(X2-X1) C C Draw the line segment from KV2 to (XP,YP). C 2 WRITE (LUN,210,ERR=13) X2, Y2, XP, YP WRITE (LUN,150,ERR=13) ENDIF 3 CONTINUE C C Paint the path and restore the saved graphics state (with C no clip path). C WRITE (LUN,150,ERR=13) WRITE (LUN,230,ERR=13) 230 FORMAT ('grestore') IF (NUMBR) THEN C C Nodal gradients in the window are to be labeled with their C indexes. Convert FSIZN from points to world coordinates C and output the commands to select a font and scale it. C T = FSIZN*2.D0/(SFX+SFY) WRITE (LUN,240,ERR=13) T 240 FORMAT ('/Helvetica findfont'/ . F12.6,' scalefont setfont') ENDIF C C Draw dots (degenerate paths with a rounded line cap) C corresponding to the nodal gradients (XP,YP). C T = 8.D0/(SFX+SFY) WRITE (LUN,250,ERR=13) T 250 FORMAT (F12.6,' setlinewidth'/ . '1 setlinecap') DO 4 N0 = 1,N XP = GX(N0) YP = GY(N0) IF (XP .LT. WX1 .OR. XP .GT. WX2 .OR. . YP .LT. WY1 .OR. YP .GT. WY2) GO TO 4 WRITE (LUN,210,ERR=13) XP, YP, XP, YP IF (NUMBR) THEN C C Draw the label N0. The first character will have its C lower left corner about one character width to the C right of the nodal position. C WRITE (LUN,260,ERR=13) N0 260 FORMAT ('(',I3,') show') ENDIF 4 CONTINUE C C Paint the path. C WRITE (LUN,150,ERR=13) C C Convert FSIZT from points to world coordinates, and output C the commands to select a font and scale it. C T = FSIZT*2.D0/(SFX+SFY) WRITE (LUN,240,ERR=13) T C C Display TITLE centered above the plot: C YP = WY2 + 3.D0*T WRITE (LUN,270,ERR=13) TITLE, (WX1+WX2)/2.D0, YP 270 FORMAT (A80/' stringwidth pop 2 div neg ',F12.6, . ' add ',F12.6,' moveto') WRITE (LUN,280,ERR=13) TITLE 280 FORMAT (A80/' show') IF (ANNOT) THEN C C Display the window extrema below the plot. C XP = WX1 YP = WY1 - 100.D0/(SFX+SFY) WRITE (LUN,180,ERR=13) XP, YP WRITE (LUN,290,ERR=13) WX1, WX2 YP = YP - 2.D0*T WRITE (LUN,300,ERR=13) XP, YP, WY1, WY2 290 FORMAT ('(Window: WX1 = ',E9.3,', WX2 = ',E9.3, . ') show') 300 FORMAT ('(Window: ) stringwidth pop ',F12.6,' add', . F12.6,' moveto'/ . '( WY1 = ',E9.3,', WY2 = ',E9.3,') show') ENDIF C C Paint the path and output the showpage command and C end-of-file indicator. C WRITE (LUN,310,ERR=13) 310 FORMAT ('stroke'/ . 'showpage'/ . '%%EOF') C C HP's interpreters require a one-byte End-of-PostScript-Job C indicator (to eliminate a timeout error message): C ASCII 4. C WRITE (LUN,320,ERR=13) CHAR(4) 320 FORMAT (A1) C C No error encountered. C IER = 0 RETURN C C Invalid input parameter. C 11 IER = 1 RETURN C C DX or DY is not positive. C 12 IER = 2 RETURN C C Error writing to unit LUN. C 13 IER = 3 RETURN END SUBROUTINE PLTTR (LUN,PLTSIZ,WX1,WX2,WY1,WY2,N,X,Y, . LIST,LPTR,LEND,TITLE,NUMBR, IER) CHARACTER*(*) TITLE INTEGER LUN, N, LIST(*), LPTR(*), LEND(N), IER LOGICAL NUMBR DOUBLE PRECISION PLTSIZ, WX1, WX2, WY1, WY2, X(N), . Y(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/15/98 C C This subroutine creates a level-2 Encapsulated Post- C Script (EPS) file containing a triangulation plot. C C C On input: C C LUN = Logical unit number in the range 0 to 99. C The unit should be opened with an appropriate C file name before the call to this routine. C C PLTSIZ = Plot size in inches. The window is mapped, C with aspect ratio preserved, to a rectangu- C lar viewport with maximum side-length equal C to .88*PLTSIZ (leaving room for labels out- C side the viewport). The viewport is C centered on the 8.5 by 11 inch page, and C its boundary is drawn. 1.0 .LE. PLTSIZ C .LE. 8.5. C C WX1,WX2,WY1,WY2 = Parameters defining a rectangular C window against which the triangu- C lation is clipped. (Only the C portion of the triangulation that C lies in the window is drawn.) C (WX1,WY1) and (WX2,WY2) are the C lower left and upper right cor- C ners, respectively. WX1 < WX2 and C WY1 < WY2. C C N = Number of nodes in the triangulation. N .GE. 3. C C X,Y = Arrays of length N containing the nodal coor- C dinates. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMSHC. C C TITLE = Type CHARACTER variable or constant contain- C ing a string to be centered above the plot. C The string must be enclosed in parentheses; C i.e., the first and last characters must be C '(' and ')', respectively, but these are not C displayed. TITLE may have at most 80 char- C acters including the parentheses. C C NUMBR = Option indicator: If NUMBR = TRUE, the C nodal indexes are plotted next to the nodes. C C Input parameters are not altered by this routine. C C On output: C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if LUN, PLTSIZ, or N is outside its C valid range. C IER = 2 if WX1 >= WX2 or WY1 >= WY2. C IER = 3 if an error was encountered in writing C to unit LUN. C C Various plotting options can be controlled by altering C the data statement below. C C Modules required by PLTTR: None C C Intrinsic functions called by PLTTR: ABS, CHAR, DBLE, C NINT C C*********************************************************** C DOUBLE PRECISION DX, DY, FSIZN, FSIZT, R, SFX, SFY, T, . TX, TY, X0, Y0 INTEGER IH, IPX1, IPX2, IPY1, IPY2, IW, LP, LPL, N0, . N1 LOGICAL ANNOT C DATA ANNOT/.TRUE./, FSIZN/10.D0/, FSIZT/16.D0/ C C Local parameters: C C ANNOT = Logical variable with value TRUE iff the plot C is to be annotated with the values of WX1, C WX2, WY1, and WY2 C DX = Window width XMAX-XMIN C DY = Window height YMAX-YMIN C FSIZN = Font size in points for labeling nodes with C their indexes if NUMBR = TRUE C FSIZT = Font size in points for the title (and C annotation if ANNOT = TRUE) C IH = Height of the viewport in points C IPX1,IPY1 = X and y coordinates (in points) of the lower C left corner of the bounding box or viewport C IPX2,IPY2 = X and y coordinates (in points) of the upper C right corner of the bounding box or viewport C IW = Width of the viewport in points C LP = LIST index (pointer) C LPL = Pointer to the last neighbor of N0 C N0 = Nodal index and DO-loop index C N1 = Index of a neighbor of N0 C R = Aspect ratio DX/DY C SFX,SFY = Scale factors for mapping world coordinates C (window coordinates in [WX1,WX2] X [WY1,WY2]) C to viewport coordinates in [IPX1,IPX2] X C [IPY1,IPY2] C T = Temporary variable C TX,TY = Translation vector for mapping world coordi- C nates to viewport coordinates C X0,Y0 = X(N0),Y(N0) or label location C C C Test for error 1. C IF (LUN .LT. 0 .OR. LUN .GT. 99 .OR. . PLTSIZ .LT. 1.D0 .OR. PLTSIZ .GT. 7.5D0 .OR. . N .LT. 3) GO TO 11 C C Compute the aspect ratio of the window. C DX = WX2 - WX1 DY = WY2 - WY1 IF (DX .LE. 0. .OR. DY .LE. 0.) GO TO 12 R = DX/DY C C Compute the lower left (IPX1,IPY1) and upper right C (IPX2,IPY2) corner coordinates of the bounding box. C The coordinates, specified in default user space units C (points, at 72 points/inch with origin at the lower C left corner of the page), are chosen to preserve the C aspect ratio R, and to center the plot on the 8.5 by 11 C inch page. The center of the page is (306,396), and C T = PLTSIZ/2 in points. C T = 36.D0*PLTSIZ IF (R .GE. 1.D0) THEN IPX1 = 306 - NINT(T) IPX2 = 306 + NINT(T) IPY1 = 396 - NINT(T/R) IPY2 = 396 + NINT(T/R) ELSE IPX1 = 306 - NINT(T*R) IPX2 = 306 + NINT(T*R) IPY1 = 396 - NINT(T) IPY2 = 396 + NINT(T) ENDIF C C Output header comments. C WRITE (LUN,100,ERR=13) IPX1, IPY1, IPX2, IPY2 100 FORMAT ('%!PS-Adobe-3.0 EPSF-3.0'/ . '%%BoundingBox:',4I4/ . '%%Title: Triangulation'/ . '%%Creator: CSRFPACK'/ . '%%EndComments') C C Set (IPX1,IPY1) and (IPX2,IPY2) to the corner coordinates C of a viewport obtained by shrinking the bounding box by C 12% in each dimension. C IW = NINT(0.88D0*DBLE(IPX2-IPX1)) IH = NINT(0.88D0*DBLE(IPY2-IPY1)) IPX1 = 306 - IW/2 IPX2 = 306 + IW/2 IPY1 = 396 - IH/2 IPY2 = 396 + IH/2 C C Set the line thickness to 2 points, and draw the C viewport boundary. C T = 2.D0 WRITE (LUN,110,ERR=13) T WRITE (LUN,120,ERR=13) IPX1, IPY1 WRITE (LUN,130,ERR=13) IPX1, IPY2 WRITE (LUN,130,ERR=13) IPX2, IPY2 WRITE (LUN,130,ERR=13) IPX2, IPY1 WRITE (LUN,140,ERR=13) WRITE (LUN,150,ERR=13) 110 FORMAT (F12.6,' setlinewidth') 120 FORMAT (2I4,' moveto') 130 FORMAT (2I4,' lineto') 140 FORMAT ('closepath') 150 FORMAT ('stroke') C C Set up a mapping from the window to the viewport. C SFX = DBLE(IW)/DX SFY = DBLE(IH)/DY TX = IPX1 - SFX*WX1 TY = IPY1 - SFY*WY1 WRITE (LUN,160,ERR=13) TX, TY, SFX, SFY 160 FORMAT (2F12.6,' translate'/ . 2F12.6,' scale') C C Set the line thickness to 1 point. (Since the scale C factors are applied to everything, the width must be C specified in world coordinates.) C T = 2.D0/(SFX+SFY) WRITE (LUN,110,ERR=13) T C C Save the current graphics state, and set the clip path to C the boundary of the window. C WRITE (LUN,170,ERR=13) WRITE (LUN,180,ERR=13) WX1, WY1 WRITE (LUN,190,ERR=13) WX2, WY1 WRITE (LUN,190,ERR=13) WX2, WY2 WRITE (LUN,190,ERR=13) WX1, WY2 WRITE (LUN,200,ERR=13) 170 FORMAT ('gsave') 180 FORMAT (2F12.6,' moveto') 190 FORMAT (2F12.6,' lineto') 200 FORMAT ('closepath clip newpath') C C Draw the edges N0->N1, where N1 > N0. LPL points to the C last neighbor of N0. C DO 2 N0 = 1,N X0 = X(N0) Y0 = Y(N0) LPL = LEND(N0) LP = LPL C C Loop on neighbors N1 of N0. C 1 LP = LPTR(LP) N1 = ABS(LIST(LP)) IF (N1 .GT. N0) THEN C C Add the edge to the path. C WRITE (LUN,210,ERR=13) X0, Y0, X(N1), Y(N1) 210 FORMAT (2F12.6,' moveto',2F12.6,' lineto') ENDIF IF (LP .NE. LPL) GO TO 1 2 CONTINUE C C Paint the path and restore the saved graphics state (with C no clip path). C WRITE (LUN,150,ERR=13) WRITE (LUN,230,ERR=13) 230 FORMAT ('grestore') IF (NUMBR) THEN C C Nodes in the window are to be labeled with their indexes. C Convert FSIZN from points to world coordinates, and C output the commands to select a font and scale it. C T = FSIZN*2.D0/(SFX+SFY) WRITE (LUN,240,ERR=13) T 240 FORMAT ('/Helvetica findfont'/ . F12.6,' scalefont setfont') C C Loop on nodes N0 with coordinates (X0,Y0). C DO 3 N0 = 1,N X0 = X(N0) Y0 = Y(N0) IF (X0 .LT. WX1 .OR. X0 .GT. WX2 .OR. . Y0 .LT. WY1 .OR. Y0 .GT. WY2) GO TO 3 C C Move to (X0,Y0), and draw the label N0. The first char- C acter will have its lower left corner about one C character width to the right of the nodal position. C WRITE (LUN,180,ERR=13) X0, Y0 WRITE (LUN,250,ERR=13) N0 250 FORMAT ('(',I3,') show') 3 CONTINUE ENDIF C C Convert FSIZT from points to world coordinates, and output C the commands to select a font and scale it. C T = FSIZT*2.D0/(SFX+SFY) WRITE (LUN,240,ERR=13) T C C Display TITLE centered above the plot: C Y0 = WY2 + 3.D0*T WRITE (LUN,260,ERR=13) TITLE, (WX1+WX2)/2.D0, Y0 260 FORMAT (A80/' stringwidth pop 2 div neg ',F12.6, . ' add ',F12.6,' moveto') WRITE (LUN,270,ERR=13) TITLE 270 FORMAT (A80/' show') IF (ANNOT) THEN C C Display the window extrema below the plot. C X0 = WX1 Y0 = WY1 - 100.D0/(SFX+SFY) WRITE (LUN,180,ERR=13) X0, Y0 WRITE (LUN,280,ERR=13) WX1, WX2 Y0 = Y0 - 2.D0*T WRITE (LUN,290,ERR=13) X0, Y0, WY1, WY2 280 FORMAT ('(Window: WX1 = ',E9.3,', WX2 = ',E9.3, . ') show') 290 FORMAT ('(Window: ) stringwidth pop ',F12.6,' add', . F12.6,' moveto'/ . '( WY1 = ',E9.3,', WY2 = ',E9.3,') show') ENDIF C C Paint the path and output the showpage command and C end-of-file indicator. C WRITE (LUN,300,ERR=13) 300 FORMAT ('stroke'/ . 'showpage'/ . '%%EOF') C C HP's interpreters require a one-byte End-of-PostScript-Job C indicator (to eliminate a timeout error message): C ASCII 4. C WRITE (LUN,310,ERR=13) CHAR(4) 310 FORMAT (A1) C C No error encountered. C IER = 0 RETURN C C Invalid input parameter. C 11 IER = 1 RETURN C C DX or DY is not positive. C 12 IER = 2 RETURN C C Error writing to unit LUN. C 13 IER = 3 RETURN END SUBROUTINE SWAP (IN1,IN2,IO1,IO2, LIST,LPTR, . LEND, LP21) INTEGER IN1, IN2, IO1, IO2, LIST(*), LPTR(*), LEND(*), . LP21 C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 06/22/98 C C Given a triangulation of a set of points on the unit C sphere, this subroutine replaces a diagonal arc in a C strictly convex quadrilateral (defined by a pair of adja- C cent triangles) with the other diagonal. Equivalently, a C pair of adjacent triangles is replaced by another pair C having the same union. C C C On input: C C IN1,IN2,IO1,IO2 = Nodal indexes of the vertices of C the quadrilateral. IO1-IO2 is re- C placed by IN1-IN2. (IO1,IO2,IN1) C and (IO2,IO1,IN2) must be trian- C gles on input. C C The above parameters are not altered by this routine. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMESH. C C On output: C C LIST,LPTR,LEND = Data structure updated with the C swap -- triangles (IO1,IO2,IN1) and C (IO2,IO1,IN2) are replaced by C (IN1,IN2,IO2) and (IN2,IN1,IO1) C unless LP21 = 0. C C LP21 = Index of IN1 as a neighbor of IN2 after the C swap is performed unless IN1 and IN2 are C adjacent on input, in which case LP21 = 0. C C Module required by SWAP: LSTPTR C C Intrinsic function called by SWAP: ABS C C*********************************************************** C INTEGER LSTPTR INTEGER LP, LPH, LPSAV C C Local parameters: C C LP,LPH,LPSAV = LIST pointers C C C Test for IN1 and IN2 adjacent. C LP = LSTPTR(LEND(IN1),IN2,LIST,LPTR) IF (ABS(LIST(LP)) .EQ. IN2) THEN LP21 = 0 RETURN ENDIF C C Delete IO2 as a neighbor of IO1. C LP = LSTPTR(LEND(IO1),IN2,LIST,LPTR) LPH = LPTR(LP) LPTR(LP) = LPTR(LPH) C C If IO2 is the last neighbor of IO1, make IN2 the C last neighbor. C IF (LEND(IO1) .EQ. LPH) LEND(IO1) = LP C C Insert IN2 as a neighbor of IN1 following IO1 C using the hole created above. C LP = LSTPTR(LEND(IN1),IO1,LIST,LPTR) LPSAV = LPTR(LP) LPTR(LP) = LPH LIST(LPH) = IN2 LPTR(LPH) = LPSAV C C Delete IO1 as a neighbor of IO2. C LP = LSTPTR(LEND(IO2),IN1,LIST,LPTR) LPH = LPTR(LP) LPTR(LP) = LPTR(LPH) C C If IO1 is the last neighbor of IO2, make IN1 the C last neighbor. C IF (LEND(IO2) .EQ. LPH) LEND(IO2) = LP C C Insert IN1 as a neighbor of IN2 following IO2. C LP = LSTPTR(LEND(IN2),IO2,LIST,LPTR) LPSAV = LPTR(LP) LPTR(LP) = LPH LIST(LPH) = IN1 LPTR(LPH) = LPSAV LP21 = LPH RETURN END LOGICAL FUNCTION SWPTC (IN1,IN2,IO1,IO2,X,Y,Z, IER) INTEGER IN1, IN2, IO1, IO2, IER DOUBLE PRECISION X(*), Y(*), Z(*) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 09/12/96 C C This function applies a swap test to a pair of adjacent C surface triangles. The diagonal edge (shared triangle C side in the quadrilateral obtained by projecting onto the C x-y plane) should be swapped for the other diagonal if and C only if the the pair of triangles is nonconvex (the fourth C vertex lies below the plane defined by one of the tri- C angles). C C C On input: C C IN1,IN2,IO1,IO2 = Nodal indexes of the vertices of C the quadrilateral. IO1-IO2 is the C triangulation edge (shared trian- C gle side) to be replaced by C IN1-IN2 if the decision is to C swap. The triples (IO1,IO2,IN1) C and (IO2,IO1,IN2) must define tri- C angles (be in counterclockwise C order) on input. C C X,Y,Z = Arrays containing the nodal coordinates and C data values (coordinates of the surface C points). C C Input parameters are not altered by this routine. C C On output: C C SWPTC = TRUE if and only if triangles (IO1,IO2,IN1) C and (IO2,IO1,IN2) should be replaced by C (IN1,IN2,IO2) and (IN2,IN1,IO1). C C IER = Error indicator: C IER = 0 if no error was encountered. C IER = 1 if the pair of triangles is nonconvex C but a swap cannot be applied because C the quadrilateral is not convex. A C convex triangulation does not exists C in this case. C C Modules required by SWPTC: None C C*********************************************************** C DOUBLE PRECISION DX1, DX2, DX3, DY1, DY2, DY3, DZ1, . DZ2, DZ3 C DX1 = X(IO1) - X(IN1) DX2 = X(IN2) - X(IN1) DX3 = X(IO2) - X(IN1) C DY1 = Y(IO1) - Y(IN1) DY2 = Y(IN2) - Y(IN1) DY3 = Y(IO2) - Y(IN1) C DZ1 = Z(IO1) - Z(IN1) DZ2 = Z(IN2) - Z(IN1) DZ3 = Z(IO2) - Z(IN1) C C Test for a convex surface. C IF (DX1*(DY2*DZ3-DY3*DZ2) - DY1*(DX2*DZ3-DX3*DZ2) + . DZ1*(DX2*DY3-DX3*DY2) .LE. 0.) THEN SWPTC = .FALSE. IER = 0 ELSE C C Test for a nonconvex quadrilateral. C IF (DX1*DY2-DX2*DY1 .LT. 0. .OR. . DX2*DY3-DX3*DY2 .LT. 0.) THEN C C Nonconvex surface and nonconvex quadrilateral. C SWPTC = .FALSE. IER = 1 ELSE SWPTC = .TRUE. IER = 0 ENDIF ENDIF RETURN END SUBROUTINE TRFIND (NST,PX,PY,N,X,Y,LIST,LPTR,LEND, I1, . I2,I3) INTEGER NST, N, LIST(*), LPTR(*), LEND(N), I1, I2, I3 DOUBLE PRECISION PX, PY, X(N), Y(N) C C*********************************************************** C C From TRIPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/28/98 C C This subroutine locates a point P relative to a triangu- C lation created by Subroutine TRMESH or TRMSHR. If P is C contained in a triangle, the three vertex indexes are C returned. Otherwise, the indexes of the rightmost and C leftmost visible boundary nodes are returned. C C C On input: C C NST = Index of a node at which TRFIND begins the C search. Search time depends on the proximity C of this node to P. C C PX,PY = X and y coordinates of the point P to be C located. C C N = Number of nodes in the triangulation. N .GE. 3. C C X,Y = Arrays of length N containing the coordinates C of the nodes in the triangulation. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMESH. C C Input parameters are not altered by this routine. C C On output: C C I1,I2,I3 = Nodal indexes, in counterclockwise order, C of the vertices of a triangle containing C P if P is contained in a triangle. If P C is not in the convex hull of the nodes, C I1 indexes the rightmost visible boundary C node, I2 indexes the leftmost visible C boundary node, and I3 = 0. Rightmost and C leftmost are defined from the perspective C of P, and a pair of points are visible C from each other if and only if the line C segment joining them intersects no trian- C gulation arc. If P and all of the nodes C lie on a common line, then I1 = I2 = I3 = C 0 on output. C C Modules required by TRFIND: DSTORE, JRAND, LEFT, LSTPTR C C Intrinsic function called by TRFIND: ABS C C*********************************************************** C DOUBLE PRECISION DSTORE INTEGER JRAND, LSTPTR LOGICAL LEFT DOUBLE PRECISION B1, B2, XA, XB, XC, XP, YA, YB, YC, . YP INTEGER IX, IY, IZ, LP, N0, N1, N1S, N2, N2S, N3, N4, . NB, NF, NL, NP, NPP LOGICAL FRWRD C SAVE IX, IY, IZ DATA IX/1/, IY/2/, IZ/3/ C C Local parameters: C C B1,B2 = Unnormalized barycentric coordinates of P with C respect to (N1,N2,N3) C IX,IY,IZ = Integer seeds for JRAND C LP = LIST pointer C N0,N1,N2 = Nodes in counterclockwise order defining a C cone (with vertex N0) containing P C N1S,N2S = Saved values of N1 and N2 C N3,N4 = Nodes opposite N1->N2 and N2->N1, respectively C NB = Index of a boundary node -- first neighbor of C NF or last neighbor of NL in the boundary C traversal loops C NF,NL = First and last neighbors of N0, or first C (rightmost) and last (leftmost) nodes C visible from P when P is exterior to the C triangulation C NP,NPP = Indexes of boundary nodes used in the boundary C traversal loops C XA,XB,XC = Dummy arguments for FRWRD C YA,YB,YC = Dummy arguments for FRWRD C XP,YP = Local variables containing the components of P C C Statement function: C C FRWRD = TRUE iff C is forward of A->B C iff B,A->C> .GE. 0. C FRWRD(XA,YA,XB,YB,XC,YC) = (XB-XA)*(XC-XA) + . (YB-YA)*(YC-YA) .GE. 0. C C Initialize variables. C XP = PX YP = PY N0 = NST IF (N0 .LT. 1 .OR. N0 .GT. N) . N0 = JRAND(N, IX,IY,IZ ) C C Set NF and NL to the first and last neighbors of N0, and C initialize N1 = NF. C 1 LP = LEND(N0) NL = LIST(LP) LP = LPTR(LP) NF = LIST(LP) N1 = NF C C Find a pair of adjacent neighbors N1,N2 of N0 that define C a wedge containing P: P LEFT N0->N1 and P RIGHT N0->N2. C IF (NL .GT. 0) GO TO 2 C C N0 is a boundary node. Test for P exterior. C NL = -NL IF ( .NOT. LEFT(X(N0),Y(N0),X(NF),Y(NF),XP,YP) ) THEN NL = N0 GO TO 9 ENDIF IF ( .NOT. LEFT(X(NL),Y(NL),X(N0),Y(N0),XP,YP) ) THEN NB = NF NF = N0 NP = NL NPP = N0 GO TO 11 ENDIF GO TO 3 C C N0 is an interior node. Find N1. C 2 IF ( LEFT(X(N0),Y(N0),X(N1),Y(N1),XP,YP) ) GO TO 3 LP = LPTR(LP) N1 = LIST(LP) IF (N1 .EQ. NL) GO TO 6 GO TO 2 C C P is to the left of edge N0->N1. Initialize N2 to the C next neighbor of N0. C 3 LP = LPTR(LP) N2 = ABS(LIST(LP)) IF ( .NOT. LEFT(X(N0),Y(N0),X(N2),Y(N2),XP,YP) ) . GO TO 7 N1 = N2 IF (N1 .NE. NL) GO TO 3 IF ( .NOT. LEFT(X(N0),Y(N0),X(NF),Y(NF),XP,YP) ) . GO TO 6 IF (XP .EQ. X(N0) .AND. YP .EQ. Y(N0)) GO TO 5 C C P is left of or on edges N0->NB for all neighbors NB C of N0. C All points are collinear iff P is left of NB->N0 for C all neighbors NB of N0. Search the neighbors of N0. C NOTE -- N1 = NL and LP points to NL. C 4 IF ( .NOT. LEFT(X(N1),Y(N1),X(N0),Y(N0),XP,YP) ) . GO TO 5 LP = LPTR(LP) N1 = ABS(LIST(LP)) IF (N1 .EQ. NL) GO TO 17 GO TO 4 C C P is to the right of N1->N0, or P=N0. Set N0 to N1 and C start over. C 5 N0 = N1 GO TO 1 C C P is between edges N0->N1 and N0->NF. C 6 N2 = NF C C P is contained in the wedge defined by line segments C N0->N1 and N0->N2, where N1 is adjacent to N2. Set C N3 to the node opposite N1->N2, and save N1 and N2 to C test for cycling. C 7 N3 = N0 N1S = N1 N2S = N2 C C Top of edge hopping loop. Test for termination. C 8 IF ( LEFT(X(N1),Y(N1),X(N2),Y(N2),XP,YP) ) THEN C C P LEFT N1->N2 and hence P is in (N1,N2,N3) unless an C error resulted from floating point inaccuracy and C collinearity. Compute the unnormalized barycentric C coordinates of P with respect to (N1,N2,N3). C B1 = (X(N3)-X(N2))*(YP-Y(N2)) - . (XP-X(N2))*(Y(N3)-Y(N2)) B2 = (X(N1)-X(N3))*(YP-Y(N3)) - . (XP-X(N3))*(Y(N1)-Y(N3)) IF (DSTORE(B1+1.D0) .GE. 1.D0 .AND. . DSTORE(B2+1.D0) .GE. 1.D0) GO TO 16 C C Restart with N0 randomly selected. C N0 = JRAND(N, IX,IY,IZ ) GO TO 1 ENDIF C C Set N4 to the neighbor of N2 which follows N1 (node C opposite N2->N1) unless N1->N2 is a boundary edge. C LP = LSTPTR(LEND(N2),N1,LIST,LPTR) IF (LIST(LP) .LT. 0) THEN NF = N2 NL = N1 GO TO 9 ENDIF LP = LPTR(LP) N4 = ABS(LIST(LP)) C C Select the new edge N1->N2 which intersects the line C segment N0-P, and set N3 to the node opposite N1->N2. C IF ( LEFT(X(N0),Y(N0),X(N4),Y(N4),XP,YP) ) THEN N3 = N1 N1 = N4 N2S = N2 IF (N1 .NE. N1S .AND. N1 .NE. N0) GO TO 8 ELSE N3 = N2 N2 = N4 N1S = N1 IF (N2 .NE. N2S .AND. N2 .NE. N0) GO TO 8 ENDIF C C The starting node N0 or edge N1-N2 was encountered C again, implying a cycle (infinite loop). Restart C with N0 randomly selected. C N0 = JRAND(N, IX,IY,IZ ) GO TO 1 C C Boundary traversal loops. NL->NF is a boundary edge and C P RIGHT NL->NF. Save NL and NF. 9 NP = NL NPP = NF C C Find the first (rightmost) visible boundary node NF. NB C is set to the first neighbor of NF, and NP is the last C neighbor. C 10 LP = LEND(NF) LP = LPTR(LP) NB = LIST(LP) IF ( .NOT. LEFT(X(NF),Y(NF),X(NB),Y(NB),XP,YP) ) . GO TO 12 C C P LEFT NF->NB and thus NB is not visible unless an error C resulted from floating point inaccuracy and collinear- C ity of the 4 points NP, NF, NB, and P. C 11 IF ( FRWRD(X(NF),Y(NF),X(NP),Y(NP),XP,YP) .OR. . FRWRD(X(NF),Y(NF),X(NP),Y(NP),X(NB),Y(NB)) ) THEN I1 = NF GO TO 13 ENDIF C C Bottom of loop. C 12 NP = NF NF = NB GO TO 10 C C Find the last (leftmost) visible boundary node NL. NB C is set to the last neighbor of NL, and NPP is the first C neighbor. C 13 LP = LEND(NL) NB = -LIST(LP) IF ( .NOT. LEFT(X(NB),Y(NB),X(NL),Y(NL),XP,YP) ) . GO TO 14 C C P LEFT NB->NL and thus NB is not visible unless an error C resulted from floating point inaccuracy and collinear- C ity of the 4 points P, NB, NL, and NPP. C IF ( FRWRD(X(NL),Y(NL),X(NPP),Y(NPP),XP,YP) .OR. . FRWRD(X(NL),Y(NL),X(NPP),Y(NPP),X(NB),Y(NB)) ) . GO TO 15 C C Bottom of loop. C 14 NPP = NL NL = NB GO TO 13 C C NL is the leftmost visible boundary node. C 15 I2 = NL I3 = 0 RETURN C C P is in the triangle (N1,N2,N3). C 16 I1 = N1 I2 = N2 I3 = N3 RETURN C C All points are collinear. C 17 I1 = 0 I2 = 0 I3 = 0 RETURN END SUBROUTINE TRMSHC (N,X,Y,Z, LIST,LPTR,LEND,LNEW,NEAR, . NEXT,IER) INTEGER N, LIST(*), LPTR(*), LEND(N), LNEW, NEAR(N), . NEXT(N), IER DOUBLE PRECISION X(N), Y(N), Z(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 06/27/98 C C This subroutine creates a convexity-preserving triangu- C lation, if it exists, of a set of N arbitrarily C distributed points in the plane (referred to as nodes) C with associated data values. The triangulation is defined C as a set of triangles with the following four properties: C C 1) The triangle vertices are nodes. C 2) No triangle contains a node other than its vertices. C 3) The interiors of the triangles are pairwise disjoint. C 4) The union of triangles is the convex hull of the set C of nodes (the smallest convex set which contains C the nodes). C C The triangulation is said to be convex if the correspond- C ing triangulated surface (the triangle-based piecewise C linear interpolant of the data values) is convex. C C Since the algorithm proceeds by adding nodes incremen- C tally, the triangulation may be updated with the addition C or deletion of a node very efficiently. The adjacency C information representing the triangulation is stored as a C linked list requiring approximately 13N storage locations. C C The algorithm has expected time complexity O(N*log(N)). C C C The following is a list of related subprograms which a C user may wish to call directly: C C ADDNDC - Updates the triangulation by adding a new node. C C AREAP - Computes the area bounded by a closed polygonal C curve such as the boundary of the triangula- C tion. C C BNODES - Returns an array containing the indexes of the C boundary nodes in counterclockwise order. C Counts of boundary nodes, triangles, and edges C are also returned. C C CIRCUM - Computes the area, circumcenter, circumradius, C and, optionally, the aspect ratio of a trian- C gle defined by user-specified vertices. C C DELBE - Deletes extraneous boundary edges (associated C with nearly null triangles) from the triangu- C lation. C C DELNDC - Updates the triangulation with the deletion of a C node. C C JRAND - Generates a uniformly distributed pseudo-random C integer. C C LEFT - Locates a point relative to a line. C C TRPRNT - Prints the triangulation data structure and, C optionally, the nodal coordinates and/or C data values. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 3. C C X,Y,Z = Arrays of length N containing the Cartesian C coordinates of the nodes and data values. C (X(K),Y(K)) is referred to as node K, and K C is referred to as a nodal index. The first C three nodes must not be collinear. C C The above parameters are not altered by this routine. C C LIST,LPTR = Arrays of length at least 6N-12. C C LEND = Array of length at least N. C C NEAR,NEXT = Work space arrays of length at least N. C The space is used to efficiently find C a triangle containing a node. C C On output: C C LIST = Set of nodal indexes which, along with LPTR, C LEND, and LNEW, define the triangulation as a C set of N adjacency lists -- counterclockwise- C ordered sequences of neighboring nodes such C that the first and last neighbors of a bound- C ary node are boundary nodes (the first neigh- C bor of an interior node is arbitrary). In C order to distinguish between interior and C boundary nodes, the last neighbor of each C boundary node is represented by the negative C of its index. C C LPTR = Set of pointers (LIST indexes) in one-to-one C correspondence with the elements of LIST. C LIST(LPTR(I)) indexes the node which follows C LIST(I) in cyclical counterclockwise order C (the first neighbor follows the last neigh- C bor). C C LEND = Set of pointers to adjacency lists. LEND(K) C points to the last neighbor of node K for C K = 1,...,N. Thus, LIST(LEND(K)) < 0 if and C only if K is a boundary node. C C LNEW = Pointer to the first empty location in LIST C and LPTR (list length plus one). LIST, LPTR, C LEND, and LNEW are not altered if IER = -1 or C IER = -2, and are incomplete if IER .NE. 0. C C NEAR,NEXT = Garbage. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = -1 if N < 3 on input. C IER = -2 if the first three nodes are C collinear. C IER = -3 if a convex triangulation does not C exist (and Subroutine ADDNDC returned C IER = -3). C IER = -4 if a convex triangulation does not C exist (and Subroutine ADDNDC returned C IER = -4). C IER = L if nodes L and M coincide for some C M > L. The linked list represents C a triangulation of nodes 1 to M-1 C in this case. C C Modules required by TRMSHC: ADDNDC, BDYADD, DSTORE, C INSERT, INTADD, JRAND, C LEFT, LSTPTR, SWAP, SWPTC, C TRFIND C C Intrinsic function called by TRMSHC: ABS C C*********************************************************** C DOUBLE PRECISION D1, D2, D3 INTEGER I, I0, J, JP, JS, K, LP, LPL, LPS, NEXTI, NN LOGICAL LEFT C C Local parameters: C C D1,D2,D3 = Squared distances from node K to nodes 1, 2, C and 3, respectively C I,J = Nodal indexes C JP,JS = Neighbors of node K such that (JP,J,JS) is a C sequence of adjacent neighbors of K C I0 = Index of the node preceding I in a sequence of C unprocessed nodes: I = NEXT(I0) C K = Index of node to be added and DO-loop index: C K > 3 C LP = LIST index (pointer) of a neighbor of K C LPL = Pointer to the last neighbor of K C LPS = Pointer to JS as a neighbor of K C NEXTI = NEXT(I) C NN = Local copy of N C NN = N IF (NN .LT. 3) THEN IER = -1 RETURN ENDIF C C Store the first triangle in the linked list. C IF ( .NOT. LEFT(X(1),Y(1),X(2),Y(2),X(3),Y(3)) ) THEN C C The initial triangle is (1,3,2). C LIST(1) = 3 LPTR(1) = 2 LIST(2) = -2 LPTR(2) = 1 LEND(1) = 2 C LIST(3) = 1 LPTR(3) = 4 LIST(4) = -3 LPTR(4) = 3 LEND(2) = 4 C LIST(5) = 2 LPTR(5) = 6 LIST(6) = -1 LPTR(6) = 5 LEND(3) = 6 C ELSEIF ( .NOT. LEFT(X(2),Y(2),X(1),Y(1),X(3),Y(3)) ) . THEN C C The initial triangle is (1,2,3). C LIST(1) = 2 LPTR(1) = 2 LIST(2) = -3 LPTR(2) = 1 LEND(1) = 2 C LIST(3) = 3 LPTR(3) = 4 LIST(4) = -1 LPTR(4) = 3 LEND(2) = 4 C LIST(5) = 1 LPTR(5) = 6 LIST(6) = -2 LPTR(6) = 5 LEND(3) = 6 C ELSE C C The first three nodes are collinear. C IER = -2 RETURN ENDIF C C Initialize LNEW and test for N = 3. C LNEW = 7 IF (NN .EQ. 3) THEN IER = 0 RETURN ENDIF C C A near-node data structure (NEAR and NEXT) is used to C obtain an expected-time (N*log(N)) incremental algorithm C by enabling constant search time for locating each new C node in the triangulation. C C For each unprocessed node I, NEAR(I) is the index of a C vertex of a triangle, if any, that contains I, or a C boundary node that is visible from I otherwise. C (NEAR(I) is used as the starting point for the search C in Subroutine TRFIND.) Thus, the unprocessed nodes are C partitioned into subsets, each associated with a C triangulation node. C C Since it is necessary to efficiently find the subset of C unprocessed nodes associated with each triangulation C node J (those that have J as their NEAR entries), the C subsets are stored in NEAR and NEXT as follows: for C each node J in the triangulation, I = NEAR(J) is the C first unprocessed node in J's set (with I = 0 if the C set is empty), L = NEXT(I) (if I > 0) is the second, C NEXT(L) (if L > 0) is the third, etc. The nodes in each C set are initially ordered by increasing indexes (which C maximizes efficiency) but that ordering is not main- C tained as the data structure is updated. C C Initialize the data structure for the single triangle. C For each unprocessed node K, NEAR(K) is set to the near- C est vertex. This is not necessarily visible but it's C close enough. C NEAR(1) = 0 NEAR(2) = 0 NEAR(3) = 0 DO 1 K = NN,4,-1 D1 = (X(K)-X(1))**2 + (Y(K)-Y(1))**2 D2 = (X(K)-X(2))**2 + (Y(K)-Y(2))**2 D3 = (X(K)-X(3))**2 + (Y(K)-Y(3))**2 IF (D1 .LE. D2 .AND. D1 .LE. D3) THEN NEAR(K) = 1 NEXT(K) = NEAR(1) NEAR(1) = K ELSEIF (D2 .LE. D1 .AND. D2 .LE. D3) THEN NEAR(K) = 2 NEXT(K) = NEAR(2) NEAR(2) = K ELSE NEAR(K) = 3 NEXT(K) = NEAR(3) NEAR(3) = K ENDIF 1 CONTINUE C C Add the remaining nodes C DO 7 K = 4,NN CALL ADDNDC (NEAR(K),K,X,Y,Z, LIST,LPTR,LEND, . LNEW, IER) IF (IER .NE. 0) RETURN C C Remove K from the set of unprocessed nodes associated C with NEAR(K). C I = NEAR(K) IF (NEAR(I) .EQ. K) THEN NEAR(I) = NEXT(K) ELSE I = NEAR(I) 2 I0 = I I = NEXT(I0) IF (I .NE. K) GO TO 2 NEXT(I0) = NEXT(K) ENDIF NEAR(K) = 0 C C Loop on neighbors J of node K. JP and JS are the C predecessor and successor of J, respectively. C LPL = LEND(K) JP = ABS(LIST(LPL)) LP = LPL 3 LP = LPTR(LP) J = ABS(LIST(LP)) LPS = LPTR(LP) JS = ABS(LIST(LPS)) C C Loop on elements I in the sequence of unprocessed nodes C associated with J: K is a candidate for replacing J C as the value of NEAR(I). The next value of I in the C sequence, NEXT(I), must be saved before I is moved C because it is altered by adding I to K's set. C I = NEAR(J) 4 IF (I .EQ. 0) GO TO 6 NEXTI = NEXT(I) C C Test for J no longer visible from I: J separated from I C by edge K-JP or K-JS. C IF ( LEFT(X(K),Y(K),X(J),Y(J),X(I),Y(I)) ) THEN IF ( LEFT(X(JS),Y(JS),X(K),Y(K),X(I),Y(I)) ) . GO TO 5 IF ( LEFT(X(JS),Y(JS),X(J),Y(J),X(I),Y(I)) ) . GO TO 5 ELSE IF ( LEFT(X(K),Y(K),X(JP),Y(JP),X(I),Y(I)) ) . GO TO 5 IF ( LEFT(X(J),Y(J),X(JP),Y(JP),X(I),Y(I)) ) . GO TO 5 ENDIF C C Replace J by K as the NEAR entry for I: update NEAR(I), C and remove I from J's set of unprocessed nodes and add C it to K's set. C NEAR(I) = K IF (I .EQ. NEAR(J)) THEN NEAR(J) = NEXTI ELSE NEXT(I0) = NEXTI ENDIF NEXT(I) = NEAR(K) NEAR(K) = I I = I0 C C Bottom of loop on I. C 5 I0 = I I = NEXTI GO TO 4 C C Bottom of loop on neighbors J. C 6 IF (LP .NE. LPL) THEN JP = J GO TO 3 ENDIF 7 CONTINUE RETURN END SUBROUTINE TRPRNT (N,X,Y,Z,IFLAG,LIST,LPTR,LEND,LOUT) INTEGER N, IFLAG, LIST(*), LPTR(*), LEND(N), LOUT DOUBLE PRECISION X(N), Y(N), Z(N) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 07/25/98 C C This subroutine prints triangulation adjacency lists C and, optionally, nodal coordinates and data values on log- C ical unit LOUT. The list of neighbors of a boundary node C is followed by index 0. The numbers of boundary nodes, C triangles, and edges are also printed. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 3 C and N .LE. 9999. C C X,Y,Z = Arrays of length N containing the nodal C coordinates and data values if IFLAG = 0, C or (X and Y only) arrays of length N con- C taining the nodal coordinates if IFLAG > 0, C or unused dummy parameters if IFLAG < 0. C C IFLAG = Coordinate option indicator: C IFLAG = 0 if X, Y, and Z are to be printed C (to 6 decimal places). C IFLAG > 0 if only X and Y are to be printed C (to 6 decimal places). C IFLAG < 0 if only the adjacency lists are to C be printed. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. C C LOUT = Logical unit for output. If LOUT is not in C the range 0 to 99, output is written to C logical unit 6. C C Input parameters are not altered by this routine. C C On output: C C The adjacency lists and coordinates (as specified by C IFLAG) are written to unit LOUT. C C Modules required by TRPRNT: None C C*********************************************************** C INTEGER I, INC, K, LP, LPL, LUN, NABOR(100), NB, ND, . NE, NL, NLMAX, NMAX, NODE, NN, NT DATA NMAX/9999/, NLMAX/58/ C C Local parameters: C C I = NABOR index (1 to K) C INC = Increment for NL associated with an adjacency list C K = Counter and number of neighbors of NODE C LP = LIST pointer of a neighbor of NODE C LPL = Pointer to the last neighbor of NODE C LUN = Logical unit for output (copy of LOUT) C NABOR = Array containing the adjacency list associated C with NODE, with zero appended if NODE is a C boundary node C NB = Number of boundary nodes encountered C ND = Index of a neighbor of NODE (or negative index) C NE = Number of edges in the triangulation C NL = Number of lines that have been printed on the C current page C NLMAX = Maximum number of print lines per page (except C for the last page which may have two addi- C tional lines) C NMAX = Upper bound on N (allows 4-digit indexes) C NODE = Index of a node and DO-loop index (1 to N) C NN = Local copy of N C NT = Number of triangles in the triangulation C NN = N LUN = LOUT IF (LUN .LT. 0 .OR. LUN .GT. 99) LUN = 6 C C Print a heading and test the range of N. C WRITE (LUN,100) NN IF (NN .LT. 3 .OR. NN .GT. NMAX) THEN C C N is outside its valid range. C WRITE (LUN,110) RETURN ENDIF C C Initialize NL (the number of lines printed on the current C page) and NB (the number of boundary nodes encountered). C NL = 6 NB = 0 IF (IFLAG .LT. 0) THEN C C Print LIST only. K is the number of neighbors of NODE C that have been stored in NABOR. C WRITE (LUN,101) DO 2 NODE = 1,NN LPL = LEND(NODE) LP = LPL K = 0 C 1 K = K + 1 LP = LPTR(LP) ND = LIST(LP) NABOR(K) = ND IF (LP .NE. LPL) GO TO 1 IF (ND .LE. 0) THEN C C NODE is a boundary node. Correct the sign of the last C neighbor, add 0 to the end of the list, and increment C NB. C NABOR(K) = -ND K = K + 1 NABOR(K) = 0 NB = NB + 1 ENDIF C C Increment NL and print the list of neighbors. C INC = (K-1)/14 + 2 NL = NL + INC IF (NL .GT. NLMAX) THEN WRITE (LUN,108) NL = INC ENDIF WRITE (LUN,104) NODE, (NABOR(I), I = 1,K) IF (K .NE. 14) WRITE (LUN,107) 2 CONTINUE ELSEIF (IFLAG .GT. 0) THEN C C Print X, Y, and LIST. C WRITE (LUN,102) DO 4 NODE = 1,NN LPL = LEND(NODE) LP = LPL K = 0 C 3 K = K + 1 LP = LPTR(LP) ND = LIST(LP) NABOR(K) = ND IF (LP .NE. LPL) GO TO 3 IF (ND .LE. 0) THEN C C NODE is a boundary node. C NABOR(K) = -ND K = K + 1 NABOR(K) = 0 NB = NB + 1 ENDIF C C Increment NL and print X, Y, and NABOR. C INC = (K-1)/8 + 2 NL = NL + INC IF (NL .GT. NLMAX) THEN WRITE (LUN,108) NL = INC ENDIF WRITE (LUN,105) NODE, X(NODE), Y(NODE), . (NABOR(I), I = 1,K) IF (K .NE. 8) WRITE (LUN,107) 4 CONTINUE ELSE C C Print X, Y, Z, and LIST. C WRITE (LUN,103) DO 6 NODE = 1,NN LPL = LEND(NODE) LP = LPL K = 0 C 5 K = K + 1 LP = LPTR(LP) ND = LIST(LP) NABOR(K) = ND IF (LP .NE. LPL) GO TO 5 IF (ND .LE. 0) THEN C C NODE is a boundary node. C NABOR(K) = -ND K = K + 1 NABOR(K) = 0 NB = NB + 1 ENDIF C C Increment NL and print X, Y, Z, and NABOR. C INC = (K-1)/5 + 2 NL = NL + INC IF (NL .GT. NLMAX) THEN WRITE (LUN,108) NL = INC ENDIF WRITE (LUN,106) NODE, X(NODE), Y(NODE), . Z(NODE), (NABOR(I), I = 1,K) IF (K .NE. 5) WRITE (LUN,107) 6 CONTINUE ENDIF C C Print NB, NE, and NT (boundary nodes, edges, and C triangles). C IF (NB .NE. 0) THEN NE = 3*NN - NB - 3 NT = 2*NN - NB - 2 ELSE NE = 3*NN - 6 NT = 2*NN - 4 ENDIF WRITE (LUN,109) NB, NE, NT RETURN C C Print formats: C 100 FORMAT (///15X,'CSRFPACK Triangulation Data ', . 'Structure, N = ',I5//) 101 FORMAT (1X,'Node',31X,'Neighbors of Node'//) 102 FORMAT (1X,'Node',5X,'X(Node)',8X,'Y(Node)', . 18X,'Neighbors of Node'//) 103 FORMAT (1X,'Node',5X,'X(Node)',8X,'Y(Node)',8X, . 'Z(Node)',11X,'Neighbors of Node'//) 104 FORMAT (1X,I4,4X,14I5/(1X,8X,14I5)) 105 FORMAT (1X,I4,2E15.6,4X,8I5/(1X,38X,8I5)) 106 FORMAT (1X,I4,3E15.6,4X,5I5/(1X,53X,5I5)) 107 FORMAT (1X) 108 FORMAT (///) 109 FORMAT (/1X,'NB = ',I4,' Boundary Nodes',5X, . 'NE = ',I5,' Edges',5X,'NT = ',I5, . ' Triangles') 110 FORMAT (1X,10X,'*** N is outside its valid', . ' range ***') END SUBROUTINE VLIST (N,X,Y,Z,LIST,LPTR,LEND, NV,LISTV, . DXL,DYL,IER) INTEGER N, LIST(*), LPTR(*), LEND(N), NV, LISTV(*), . IER DOUBLE PRECISION X(N), Y(N), Z(N), DXL(*), DYL(*) C C*********************************************************** C C From CSRFPACK C Robert J. Renka C Dept. of Computer Science C Univ. of North Texas C renka@cs.unt.edu C 10/21/96 C C Given a convexity-preserving triangulation of a set of C nodes and data values, this subroutine constructs its C dual, a gradient feasibility diagram. The feasible nodal C gradients are those for which there exists a convex Her- C mite interpolant of the data values and gradients. C C The feasibility region associated with node Pi is the C set of gradients G for which <= Zj-Zi for all C j such that Pj is a neighbor of Pi. The feasibility re- C gions are convex and, if the data is strictly convex (no C four data points are coplanar), have nonzero (finite or C infinite) area. Furthermore, the set of regions parti- C tions the plane, and the diagram is dual to the C triangulation: there are one-to-one correspondences be- C tween feasibility regions and nodes, edges of feasibility C regions and triangulation edges (the two being perpendicu- C lar to each other), and vertices of feasibility regions C and triangles. The feasibility region vertices are the C gradients of the linear polynomials that comprise the C triangle-based piecewise linear interpolant of the data C values. C C While the feasibility regions associated with interior C nodes have finite area, those associated with boundary C nodes are unbounded and have infinite-length edges. In C order to define these edges and to facilitate the selec- C tion of nodal gradients as centroids, each feasibility C region edge corresponding to a boundary edge is terminated C at a pseudo-vertex chosen so that its length is the aver- C age of the lengths of the other two edges that share the C same vertex. C C C On input: C C N = Number of nodes in the triangulation. N .GE. 3. C Note that, if N = 3, the three truncated feasi- C bility regions degenerate to the same point (the C gradient of the linear interpolant). C C X,Y,Z = Arrays of length N containing the nodal C coordinates (X,Y) and data values Z. C C LIST,LPTR,LEND = Data structure defining the trian- C gulation. Refer to Subroutine C TRMSHC. C C The above parameters are not altered by this routine. C C LISTV = Integer array of length at least 6*N-2*NB-6, C where NB is the number of boundary nodes. C C DXL,DYL = Arrays of length at least 2*N-2. C C On output: C C NV = Number of feasibility region vertices, includ- C ing pseudo-vertices associated with boundary C edges: NV = NT+NB = 2*N-2, where NT = 2*N-NB-2 C is the number of triangles. C C LISTV = Array containing vertex indexes (indexes to C DXL and DYL) stored in one-to-one corres- C pondence with LIST/LPTR entries. The index C associated with triangle (N1,N2,N3) is C stored in LISTV(I), LISTV(J), and LISTV(K), C where LIST(I), LIST(J), and LIST(K) are the C indexes of N2 as a neighbor of N1, N3 as a C neighbor of N2, and N1 as a neighbor of N3. C Pseudo-vertices have indexes in the range C NT+1 to NV and each of these is stored only C once in the position associated with a boun- C dary edge N1->N2: LISTV(LEND(N2)), where C LIST(LEND(N2)) = -N1. Thus, the feasibility C region associated with a node is defined by C the CCW-ordered sequence of vertices in C one-to-one correspondence with its adjacency C list. The truncated feasibility region C associated with a boundary node has two C pseudo-vertices (including the one stored C with its first neighbor). C C DXL,DYL = Arrays of length NV containing the ver- C tices (components of the gradients C associated with triangles) in the first C NT positions and pseudo-vertices in the C last NB positions. C C IER = Error indicator: C IER = 0 if no errors were encountered. C IER = 1 if N < 3. No other parameters are C altered in this case. C IER = 2 if a nonpositive triangle area was C returned by Subroutine LGRAD implying C an invalid triangulation. Output C parameters are not valid in this case. C C Modules required by VLIST: LGRAD, LSTPTR C C Intrinsic functions called by VLIST: ABS, SQRT C C*********************************************************** C INTEGER LSTPTR DOUBLE PRECISION D, D1, D2, RN, RX, RY, SA, XN1, YN1, . ZN1 INTEGER KV, KV1, KV2, L1, L2, L3, LP, LP1F, LP2, LP2L, . LP3, LPL, N0, N1, N2, N3, NM2, NT C C Local parameters: C C D = Distance between a vertex and a pseudo- C vertex -- average of D1 and D2 C D1,D2 = Distances from vertex KV to KV1 and to KV2, C respectively C KV = Index of a vertex C KV1,KV2 = Indexes of the vertices associated with the C triangles opposite boundary nodes N1 and C N2, respectively C L1,L2,L3 = Pointers (LIST/LISTV indexes) to neighbors C of N2 C LP = Pointer C LP1F = Pointer to the first neighbor of N1 C LP2 = Pointer to N2 as a neighbor of N1 C LP2L = Pointer to the last neighbor of N2 C LP3 = Pointer to N3 as a neighbor of N1 C LPL = Pointer to the last neighbor of N1 C N0 = Index of a boundary node C N1,N2,N3 = Nodal indexes of the vertices of a triangle C (in CCW order) C NM2 = N-2 C NT = Number of triangles in the triangulation (or C number of triangles whose feasible region C vertices have been computed C RN = Length of boundary edge N1->N2 C RX,RY = X and y components of boundary edge N1->N2 C SA = Signed triangle area returned by LGRAD C XN1,YN1,ZN1 = Nodal coordinates and data value for node N1 C IF (N .LT. 3) GO TO 11 NT = 0 C C Loop on triangles (N1,N2,N3) such that N2 and N3 have C larger indexes than N1. C NM2 = N - 2 DO 3 N1 = 1,NM2 XN1 = X(N1) YN1 = Y(N1) ZN1 = Z(N1) C C Loop on neighbors of N1. C LPL = LEND(N1) LP2 = LPL 1 LP2 = LPTR(LP2) N2 = LIST(LP2) LP3 = LPTR(LP2) N3 = ABS(LIST(LP3)) IF (N2 .LT. N1 .OR. N3 .LT. N1) GO TO 2 NT = NT + 1 C C Store the triangle index NT in the appropriate LISTV C locations. C LISTV(LP2) = NT LP = LSTPTR (LEND(N2),N3,LIST,LPTR) LISTV(LP) = NT LP = LSTPTR (LEND(N3),N1,LIST,LPTR) LISTV(LP) = NT C C Compute and store vertex NT. C CALL LGRAD (XN1,YN1,ZN1,X(N2),Y(N2),Z(N2),X(N3), . Y(N3),Z(N3), DXL(NT),DYL(NT),SA) IF (SA .LE. 0.) GO TO 12 C C Bottom of loop on neighbors. C 2 IF (LP2 .NE. LPL) GO TO 1 3 CONTINUE NV = NT C C Add the NB pseudo-vertices. C C Set N0 and N2 to the first boundary node encountered. C N0 = 0 4 N0 = N0 + 1 LP2L = LEND(N0) IF (LIST(LP2L) .GT. 0) GO TO 4 N2 = N0 C C CCW loop on boundary edges N1->N2: LP1F and LP2L point C to the first neighbor of N1 and last neighbor of N2, C respectively. C 5 N1 = N2 LP1F = LPTR(LP2L) N2 = LIST(LP1F) LP2L = LEND(N2) C C Set KV to the index of the vertex (gradient) associated C with the triangle containing N1->N2, set KV1 and KV2 C to the indexes of the vertices associated with the C triangles opposite N1 and N2, respectively (if they C exist), and compute the distances D1 and D2 from ver- C tex KV to vertices KV1 and KV2 (with zero values in C the case of no triangle). Note that D1 = D2 = 0 if C N = 3. C KV = LISTV(LP1F) C C Compute D1. Find the pointer L1 to the third from last C neighbor of N2 if it exists. C L1 = LPTR(LP2L) L2 = LPTR(L1) IF (L2 .EQ. LP2L) THEN C C N2 has only two neighbors: no triangle opposite N1. C D1 = 0. ELSE C C Loop on triples of adjacent neighbors of N2 until L3 C points to the last neighbor. C 6 L3 = LPTR(L2) IF (L3 .EQ. LP2L) GO TO 7 L1 = L2 L2 = L3 GO TO 6 C 7 KV1 = LISTV(L1) D1 = SQRT( (DXL(KV)-DXL(KV1))**2 + . (DYL(KV)-DYL(KV1))**2 ) ENDIF C C Compute D2. Set LP to the pointer to the second C neighbor of N1. C LP = LPTR(LP1F) IF (LP .EQ. LEND(N1)) THEN C C N1 has only two neighbors: no triangle opposite N2. C D2 = 0. ELSE KV2 = LISTV(LP) D2 = SQRT( (DXL(KV)-DXL(KV2))**2 + . (DYL(KV)-DYL(KV2))**2 ) ENDIF C C Compute the average D of D1 and D2. C D = (D1+D2)/2.D0 C C Compute and store the pseudo-vertex V3 associated with C boundary edge N1->N2. V3 = V + D*R, where V is vertex C KV and R is a unit vector orthogonal to the edge. C RX = X(N2)-X(N1) RY = Y(N2)-Y(N1) RN = SQRT(RX*RX + RY*RY) NV = NV + 1 DXL(NV) = DXL(KV) + D*RY/RN DYL(NV) = DYL(KV) - D*RX/RN LISTV(LP2L) = NV C C Bottom of loop on boundary edges. C IF (N2 .NE. N0) GO TO 5 C C No error encountered. C IER = 0 RETURN C C N < 3. C 11 IER = 1 RETURN C C Triangle (N1,N2,N3) has nonpositive area. C 12 IER = 2 RETURN END SHAR_EOF fi # end of overwriting check cd .. cd .. # End of shell archive exit 0