aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/ncarutil/autograph/agaxis.f
diff options
context:
space:
mode:
Diffstat (limited to 'sys/gio/ncarutil/autograph/agaxis.f')
-rw-r--r--sys/gio/ncarutil/autograph/agaxis.f1851
1 files changed, 1851 insertions, 0 deletions
diff --git a/sys/gio/ncarutil/autograph/agaxis.f b/sys/gio/ncarutil/autograph/agaxis.f
new file mode 100644
index 00000000..4c3bec73
--- /dev/null
+++ b/sys/gio/ncarutil/autograph/agaxis.f
@@ -0,0 +1,1851 @@
+C
+C
+C +-----------------------------------------------------------------+
+C | |
+C | Copyright (C) 1986 by UCAR |
+C | University Corporation for Atmospheric Research |
+C | All Rights Reserved |
+C | |
+C | NCARGRAPHICS Version 1.00 |
+C | |
+C +-----------------------------------------------------------------+
+C
+C
+C ---------------------------------------------------------------------
+C A B R I E F D E S C R I P T I O N O F A U T O G R A P H
+C ---------------------------------------------------------------------
+C
+C Following is a brief description of the AUTOGRAPH package. For a
+C complete write-up, see the document "AUTOGRAPH - THE UNABRIDGED
+C WRITE-UP".
+C
+C
+C PACKAGE AUTOGRAPH
+C
+C LATEST REVISION January, 1986
+C
+C PURPOSE To draw graphs, each with a labelled background
+C and each displaying one or more curves.
+C
+C ACCESS (ON THE CRAY) To use AUTOGRAPH routines on the Cray, simply
+C call them; they are in the binary library
+C $NCARLB, which is automatically searched.
+C
+C To get smoother curves, drawn using spline
+C interpolation, compile DASHSMTH, from ULIB,
+C to replace DASHCHAR, from $NCARLB:
+C
+C GETSRC,LIB=ULIB,FILE=DASHSMTH,L=DSMTH.
+C CFT,I=DSMTH,L=0.
+C
+C AUTOGRAPH contains a routine AGPWRT, which it
+C calls to draw labels. This routine just passes
+C its arguments on to the system-plot-package
+C routine PWRIT. To use one of the fancier
+C character-drawers, like PWRITX or PWRITY,
+C just compile a routine AGPWRT to replace the
+C default version; it has the same arguments as
+C PWRIT and may either draw the character string
+C itself, or just pass the arguments on to a
+C desired character-drawer. The AUTOGRAPH
+C specialist has some "standard" versions of
+C AGPWRT and should be consulted for help in
+C avoiding pitfalls. One standard version,
+C which calls PWRITX, may be obtained using the
+C following JCL:
+C
+C GETSRC,LIB=XLIB,FILE=AGUPWRITX,L=UPWRTX.
+C CFT,I=UPWRTX,L=0.
+C
+C USAGE Following this indented preamble are given two
+C lists: one describing the AUTOGRAPH routines
+C and another describing the arguments of those
+C routines.
+C
+C "AUTOGRAPH - THE UNABRIDGED WRITE-UP" gives
+C a complete write-up of AUTOGRAPH, in great
+C detail and with a set of helpful examples.
+C
+C ENTRY POINTS Except for seven routines which are included
+C in the package for historical reasons (EZY,
+C EZXY, EZMY, EZMXY, IDIOT, ANOTAT, and DISPLA),
+C the AUTOGRAPH routines have six-character names
+C beginning with the characters 'AG'. An alpha-
+C betized list follows:
+C
+C AGAXIS AGBACK AGBNCH AGCHAX AGCHCU AGCHIL
+C AGCHNL AGCTCS AGCTKO AGCURV AGDASH AGDFLT
+C AGDLCH AGDSHN AGEXAX AGEXUS AGEZSU AGFPBN
+C AGFTOL AGGETC AGGETF AGGETI AGGETP AGGTCH
+C AGINIT AGKURV AGLBLS AGMAXI AGMINI AGNUMB
+C AGPPID AGPWRT AGQURV AGRPCH AGRSTR AGSAVE
+C AGSCAN AGSETC AGSETF AGSETI AGSETP AGSRCH
+C AGSTCH AGSTUP AGUTOL
+C
+C NOTE: The "routine" AGDFLT is a block-data
+C routine specifying the default values of
+C AUTOGRAPH control parameters.
+C
+C SPECIAL CONDITIONS Under certain conditions, AUTOGRAPH may print
+C an error message (via the routine SETER) and
+C stop. Each error message includes the name of
+C the routine which issued it. A description of
+C the condition which caused the error may be
+C found in the AUTOGRAPH write-up in the NCAR
+C graphics manual; look in the write-up of the
+C routine which issued the error message, under
+C the heading 'SPECIAL CONDITIONS'.
+C
+C For error messages issued by the routine
+C AGNUMB, see the write-up of the routine AGSTUP.
+C
+C If you get an error in the routine ALOG10, it
+C probably means that you are using a logarithmic
+C axis and some of the coordinate data along that
+C axis are zero or negative.
+C
+C COMMON BLOCKS The AUTOGRAPH common blocks are AGCONP, AGORIP,
+C AGOCHP, AGCHR1, and AGCHR2. AGCONP contains
+C the AUTOGRAPH "control parameters", primary and
+C secondary, all of which are real, AGORIP other
+C real and/or integer parameters, AGOCHP other
+C character parameters, AGCHR1 and AGCHR2 the
+C variables implementing the character-storage-
+C and-retrieval scheme of AUTOGRAPH.
+C
+C I/O Lower-level plotting routines are called to
+C produce graphical output and, when errors
+C occur, error messages may be written to the
+C system error file, as defined by I1MACH(4),
+C either directly or by way of a call to SETER.
+C
+C REQUIRED ULIB AUTOGRAPH uses the software dashed-line package
+C ROUTINES DASHCHAR. Of course, either of the packages
+C DASHSMTH or DASHSUPR may be used instead, to
+C get smoother curves.
+C
+C SPECIALIST Dave Kennison, Scientific Computing Division,
+C National Center for Atmospheric Research
+C
+C LANGUAGE FORTRAN
+C
+C HISTORY Dave Robertson wrote the original routine
+C IDIOT, which was intended to provide a simple,
+C quick-and-dirty, x-y graph-drawing capability.
+C In time, as it became obvious that many users
+C were adapting IDIOT to more sophisticated
+C tasks, Dan Anderson wrote the first AUTOGRAPH
+C package, based on IDIOT. It allowed the user
+C to put more than one curve on a graph, to use
+C more sophisticated backgrounds, to specify
+C coordinate data in a variety of ways, and to
+C more easily control the scaling and positioning
+C of graphs. Eventually, this package, too, was
+C found wanting. In 1977, Dave Kennison entirely
+C re-wrote AUTOGRAPH, with the following goals:
+C to maintain the ease of use for simple graphs
+C which had been the principal virtue of the
+C package, to provide the user with as much
+C control as possible, to incorporate desirable
+C new features, and to make the package as
+C portable as possible. In 1984, the package
+C was again worked over by Dave Kennison, to
+C make it compatible with FORTRAN-77 and
+C to remove any dependency on the LOC function,
+C which had proved to cause difficulties on
+C certain machines. The user interface was
+C changed somewhat and some new features were
+C added. A GKS-compatible version was written.
+C
+C SPACE REQUIRED AUTOGRAPH is big; one pays a price for its
+C capabilities. On the Cray, it occupies a
+C little under 30000 (octal) locations. The
+C required plot package routines take about
+C another 7000 (octal), the (modified) PORT
+C support routines about another 1000 (octal),
+C and system routines (math, I/O, miscellany)
+C another 30000 (octal).
+C
+C PORTABILITY AUTOGRAPH may be ported with few modifications
+C to most systems having a FORTRAN-77 compiler.
+C
+C The labelled common blocks may have to be
+C declared in a part of the user program which
+C is always core-resident so that variables
+C in them will maintain their values from one
+C AUTOGRAPH-routine call to the next. Such a
+C problem may arise when AUTOGRAPH is placed in
+C an overlay or when some sort of memory-paging
+C scheme is used.
+C
+C REQUIRED RESIDENT AUTOGRAPH uses the DASHCHAR routines DASHDB,
+C ROUTINES DASHDC, FRSTD, LASTD, LINED, AND VECTD, the
+C system-plot-package routines FRAME, GETSET,
+C GETSI, LINE, PWRIT, and SET, the support
+C routines ISHIFT and IOR, the (modified)
+C PORT utilities SETER and I1MACH, and the
+C FORTRAN-library routines ALOG10, ATAN2, COS,
+C SIN, AND SQRT.
+C
+C ---------------------------------------------------------------------
+C U S E R - C A L L A B L E A U T O G R A P H R O U T I N E S
+C ---------------------------------------------------------------------
+C
+C Following is a list of AUTOGRAPH routines to be called by the user
+C (organized by function). Each routine is described briefly. The
+C arguments of the routines are described in the next section.
+C
+C Each of the following routines draws a complete graph with one call.
+C Each is implemented by a set of calls to the lower-level AUTOGRAPH
+C routines AGSTUP, AGCURV, and AGBACK (which see, below).
+C
+C -- EZY (YDRA,NPTS,GLAB) - draws a graph of the curve defined by the
+C data points ((I,YDRA(I)),I=1,NPTS), with a graph label specified
+C by GLAB.
+C
+C -- EZXY (XDRA,YDRA,NPTS,GLAB) - draws a graph of the curve defined by
+C the data points ((XDRA(I),YDRA(I)),I=1,NPTS), with a graph label
+C specified by GLAB.
+C
+C -- EZMY (YDRA,IDXY,MANY,NPTS,GLAB) - draws a graph of the family of
+C curves defined by data points (((I,YDRA(I,J)),I=1,NPTS),J=1,MANY),
+C with a graph label specified by GLAB. The order of the subscripts
+C of YDRA may be reversed - see the routine DISPLA, argument LROW.
+C
+C -- EZMXY (XDRA,YDRA,IDXY,MANY,NPTS,GLAB) - draws a graph of the
+C family of curves defined by the data points (((XDRA(I),YDRA(I,J)),
+C I=1,NPTS),J=1,MANY), with a graph label specified by GLAB. XDRA
+C may be doubly-subscripted and the order of the subscripts of XDRA
+C and YDRA may be reversed - see the routine DISPLA, argument LROW.
+C
+C -- IDIOT (XDRA,YDRA,NPTS,LTYP,LDSH,LABX,LABY,LABG,LFRA) - implements
+C the routine from which AUTOGRAPH grew - not recommended - provided
+C for antique lovers.
+C
+C The following routines provide user access to the AUTOGRAPH control
+C parameters (in the labelled common block AGCONP).
+C
+C -- ANOTAT (XLAB,YLAB,LBAC,LSET,NDSH,DSHL) - may be used to change the
+C x- and y-axis (non-numeric) labels, the background type, the way
+C in which graphs are positioned and scaled, and the type of dash
+C patterns to be used in drawing curves.
+C
+C -- DISPLA (LFRA,LROW,LTYP) - may be used to specify when, if ever,
+C the EZ... routines do a frame advance, how input arrays for EZMY
+C and EZMXY are dimensioned, and the linear/log nature of graphs.
+C
+C -- AGSETP (TPGN,FURA,LURA) - a general-purpose parameter-setting
+C routine, used to set the group of parameters specified by TPGN,
+C using values obtained from the array (FURA(I),I=1,LURA).
+C
+C -- AGSETF (TPGN,FUSR) - used to set the single parameter specified by
+C TPGN, giving it the floating-point value FUSR.
+C
+C -- AGSETI (TPGN,IUSR) - used to set the single parameter specified by
+C TPGN, giving it the floating-point value FLOAT(IUSR).
+C
+C -- AGSETC (TPGN,CUSR) - the character string CUSR is stashed in an
+C array inside AUTOGRAPH and the floating-point equivalent of an
+C identifier which may be used for later retrieval of the string is
+C stored as the value of the single parameter specified by TPGN. The
+C single parameter must be a label name, a dash pattern, the text of
+C a label line, or the line-terminator character.
+C
+C -- AGGETP (TPGN,FURA,LURA) - a general-purpose parameter-getting
+C routine, used to get the group of parameters specified by TPGN,
+C putting the result in the array (FURA(I),I=1,LURA).
+C
+C -- AGGETF (TPGN,FUSR) - used to get, in FUSR, the floating-point
+C value of the single parameter specified by TPGN.
+C
+C -- AGGETI (TPGN,IUSR) - used to get, in IUSR, the integer equivalent
+C of the value of the single parameter specified by TPGN.
+C
+C -- AGGETC (TPGN,CUSR) - used to get, in CUSR, the character string
+C whose identifier is specified by the integer equivalent of the
+C single parameter specified by TPGN. The single parameter must
+C be a label name, a dash pattern, the text of a label line, or the
+C line-terminator character.
+C
+C The following are lower-level routines, which may be used to draw
+C graphs of many different kinds. The EZ... routines call these. They
+C are intended to be called by user programs, as well.
+C
+C -- AGSTUP (XDRA,NVIX,IIVX,NEVX,IIEX,YDRA,NVIY,IIVY,NEVY,IIEY) - this
+C routine must be called prior to the first call to either of the
+C two routines AGBACK and AGCURV, to force the set-up of secondary
+C parameters controlling the behavior of those routines. After any
+C parameter-setting call, AGSTUP must be called again before calling
+C either AGBACK or AGCURV again. AGSTUP calls the routine "SET", in
+C the plot package, so that user x/y coordinates in subsequent calls
+C will map properly into the plotter space.
+C
+C -- AGBACK - draws the background defined by the current state of the
+C AUTOGRAPH control parameters.
+C
+C -- AGCURV (XVEC,IIEX,YVEC,IIEY,NEXY,KDSH) - draws the curve defined
+C by the arguments, positioning it as specified by the current state
+C of the AUTOGRAPH control parameters.
+C
+C The following utility routines are called by the user.
+C
+C -- AGSAVE (IFNO) - used to save the current state of AUTOGRAPH by
+C writing the appropriate information to a specified file. Most
+C commonly used to save the default state for later restoration.
+C This routine should be used instead of AGGETP when the object
+C is to save the whole state of AUTOGRAPH, since it saves not only
+C the primary control parameters, but all of the character strings
+C pointed to by the primary control parameters. It is the user's
+C responsibility to position the file before calling AGSAVE.
+C
+C -- AGRSTR (IFNO) - used to restore a saved state of AUTOGRAPH by
+C reading the appropriate information from a specified file. Most
+C commonly used to restore AUTOGRAPH to its default state. It is
+C the user's responsibility to position the file before calling
+C AGRSTR.
+C
+C -- AGBNCH (IDSH) - a function, of type CHARACTER*16 (it must be
+C declared as such in a user routine referencing it), whose value,
+C given a 16-bit binary dash pattern, is the equivalent character
+C dash pattern.
+C
+C -- AGDSHN (IDSH) - a function, of type CHARACTER*16 (it must be
+C declared as such in a user routine referencing it), whose value,
+C given an integer "n" (typically between 1 and 26) is the character
+C string 'DASH/ARRAY/nnnn.', which is the name of the nth dash
+C pattern parameter. To set the 13th dash pattern, for example,
+C one might use "CALL AGSETC (AGDSHN(13),'$$$$$$CURVE 13$$$$$$')".
+C
+C The following utility routines are called by AUTOGRAPH. The versions
+C included in AUTOGRAPH itself are dummies; they do nothing but RETURN.
+C The user may replace one or more of these routines with versions to
+C accomplish specific purposes.
+C
+C -- AGUTOL (IAXS,FUNS,IDMA,VINP,VOTP) - called by AUTOGRAPH to perform
+C the mapping from user-system values along an axis to label-system
+C values along the axis and vice-versa. This routine may be replaced
+C by the user to create a desired graph.
+C
+C -- AGCHAX (IFLG,IAXS,IPRT,VILS) - called by AUTOGRAPH just before and
+C just after the various parts of the axes are drawn.
+C
+C -- AGCHCU (IFLG,KDSH) - called by AUTOGRAPH just before and just after
+C each curve is drawn.
+C
+C -- AGCHIL (IFLG,LBNM,LNNO) - called by AUTOGRAPH just before and just
+C after each line of an informational label is drawn.
+C
+C -- AGCHNL (IAXS,VILS,CHRM,MCIM,NCIM,IPXM,CHRE,MCIE,NCIE) - called by
+C AUTOGRAPH just after the character strings defining a numeric label
+C have been generated.
+C
+C ---------------------------------------------------------------------
+C D E S C R I P T I O N S O F A R G U M E N T S
+C ---------------------------------------------------------------------
+C
+C In calls to the routines EZY, EZXY, EZMY, and EZMXY:
+C
+C -- XDRA is an array of x coordinates, dimensioned as implied by the
+C current value of the AUTOGRAPH control parameter 'ROW.' (see the
+C description of the argument LROW, below). The value of the
+C AUTOGRAPH parameter 'NULL/1.' (1.E36, by default) when used as an
+C x coordinate, implies a missing data point; the curve segments
+C on either side of such a point are not drawn.
+C
+C -- YDRA is an array of y coordinates, dimensioned as implied by the
+C current value of the AUTOGRAPH control parameter 'ROW.' (see the
+C description of the argument LROW, below). The value of the
+C AUTOGRAPH parameter 'NULL/1.' (1.E36, by default) when used as a
+C y coordinate, implies a missing data point; the curve segments
+C on either side of such a point are not drawn.
+C
+C -- IDXY is the first dimension of the arrays XDRA (if it has two
+C dimensions) and YDRA.
+C
+C -- MANY is the number of curves to be drawn by the call to EZ... -
+C normally, the second dimension of XDRA (if it has two dimensions)
+C and YDRA.
+C
+C -- NPTS is the number of points defining each curve to be drawn by
+C the routine EZ... - normally, the first (or only) dimension of
+C XDRA and YDRA.
+C
+C -- GLAB is a character constant or a character variable, defining a
+C label to be placed at the top of the graph. The string may not be
+C more than 40 characters long - if it is fewer than 40 characters
+C long, its last character must be a dollar sign. (The dollar sign
+C is not a part of the label - it is stripped off.) The character
+C string "CHAR(0)" may be used to indicate that the previous label,
+C whatever it was, should continue to be used. The initial graph
+C label consists of blanks.
+C
+C In calls to the routine ANOTAT:
+C
+C -- XLAB and YLAB resemble GLAB (see above) and define labels for the
+C x and y axes. The default x-axis label is the single character
+C X, the default y-axis label the single character Y. Note that one
+C may use the string "CHAR(0)" to indicate that the x-axis (y-axis)
+C label is not to be changed from what it was previously.
+C
+C -- LBAC, if non-zero, specifies a new value for the AUTOGRAPH control
+C parameter 'BACKGROUND.', as follows:
+C
+C 1 - a perimeter background
+C
+C 2 - a grid background
+C
+C 3 - an axis background
+C
+C 4 - no background
+C
+C The default value of 'BACKGROUND.' is 1.
+C
+C -- LSET, if non-zero, specifies a new value for the AUTOGRAPH control
+C parameter 'SET.'. This parameter may be negated to suspend the
+C drawing of curves by the EZ... routines, so that a call to one of
+C them will produce only a background. The absolute value of 'SET.'
+C affects the way in which AUTOGRAPH determines the position and
+C shape of the graph and the scaling of the axes, as follows:
+C
+C 1 - Restores the default values of the AUTOGRAPH parameters
+C in question. AUTOGRAPH will set up an appropriate call
+C to the plot-package routine "SET", over-riding any prior
+C call to that routine.
+C
+C 2 - Tells AUTOGRAPH to use arguments 1-4 and 9 of the last
+C "SET" call. Arguments 1-4 specify where the graph should
+C fall on the plotter frame, argument 9 whether the graph
+C is linear/linear, linear/log, etc.
+C
+C 3 - Tells AUTOGRAPH to use arguments 5-8 and 9 of the last
+C "SET" call. Arguments 5-8 specify the scaling of the
+C axes, argument 9 whether the graph is linear/linear,
+C linear/log, etc.
+C
+C 4 - A combination of 2 and 3. Arguments 1-4 of the last "SET"
+C call specify the position, arguments 5-8 the scaling, and
+C argument 9 the linear/log nature, of the graph.
+C
+C (The plot-package routine "SET" is described in the NCAR Graphics
+C Manual; it is not a part of AUTOGRAPH.)
+C
+C If the routine DISPLA is called with its argument LTYP non-zero,
+C the linear/log nature of the graph will be that specified by LTYP,
+C not that specified by the last "SET" call, no matter what the value
+C of the control parameter 'SET.'.
+C
+C The default value of 'SET.' is 1.
+C
+C -- NDSH, if non-zero, specifies a new value of the AUTOGRAPH control
+C parameter 'DASH/SELECTOR.' (and therefore a new set of dashed-line
+C patterns), as described below. Note: The default value of the
+C dashed-line parameters is such that all curves will be drawn using
+C solid lines; if that is what you want, use a zero for NDSH.
+C
+C If the value of 'DASH/SELECTOR.' is negative, curves produced
+C by subsequent calls to EZMY or EZMXY will be drawn using a
+C set of alphabetic dashed-line patterns. The first curve drawn
+C by a given call will be labelled 'A', the second 'B', ..., the
+C twenty-sixth 'Z', the twenty-seventh 'A' again, and so on.
+C Curves drawn by calls to EZY and EZXY will be unaffected.
+C
+C If the value of 'DASH/SELECTOR.' is positive, it must be less
+C than or equal to 26. The next argument, DSHL, is an array
+C containing NDSH dashed-line patterns. All curves produced by
+C subsequent calls to EZY, EZXY, EZMY, and EZMXY will be drawn
+C using the dashed-line patterns in (DSHL(I),I=1,NDSH) - the
+C first curve produced by a given call will have the pattern
+C specified by DSHL(1), the second that specified by DSHL(2),
+C the third that specified by DSHL(3), . . . the NDSH+1st that
+C specified by DSHL(1), . . . etc. Each element of DSHL must
+C be a character string, in which a dollar sign stands for a
+C solid-line segment, a quote stands for a gap, and other
+C characters stand for themselves. See the write-up of the
+C package "DASHCHAR". Binary dashed-line patterns may not be
+C defined by means of a call to ANOTAT, only by means of calls
+C to lower-level routines.
+C
+C -- DSHL (if NDSH is greater than zero) is an array of dashed-line
+C patterns, as described above.
+C
+C In calls to the routine DISPLA:
+C
+C -- LFRA, if non-zero, specifies a new value for the AUTOGRAPH control
+C parameter 'FRAME.'. Possible values are as follows:
+C
+C 1 - The EZ... routines do a frame advance after drawing.
+C
+C 2 - No frame advance is done by the EZ... routines.
+C
+C 3 - The EZ... routines do a frame advance before drawing.
+C
+C The default value of 'FRAME.' is 1.
+C
+C -- LROW, if non-zero, specifies a new value for the AUTOGRAPH control
+C parameter 'ROW.'. This parameter tells AUTOGRAPH how the argument
+C arrays XDRA and YDRA, in calls to the routines EZMY and EZMXY, are
+C subscripted, as follows:
+C
+C If 'ROW.' is positive, this implies that the first subscript
+C of YDRA is a point number and the second subscript is a curve
+C number. If 'ROW.' is negative, the order is reversed.
+C
+C If the absolute value of 'ROW.' is 1, this implies that XDRA
+C is singly-subscripted, by point number only. If the absolute
+C value of 'ROW.' is 2 or greater, this implies that XDRA is
+C doubly-subscripted, just like YDRA.
+C
+C The default value of 'ROW.' is 1, spicifying that XDRA is singly-
+C subscripted and that YDRA is doubly-subscripted by point number
+C and curve number, in that order.
+C
+C -- LTYP, if non-zero, specifies new values for the AUTOGRAPH control
+C parameters 'X/LOGARITHMIC.' and 'Y/LOGARITHMIC.', which determine
+C whether the X and Y axes are linear or logarithmic. Possible
+C values are as follows:
+C
+C 1 - x axis linear, y axis linear
+C
+C 2 - x axis linear, y axis logarithmic
+C
+C 3 - x axis logarithmic, y axis linear
+C
+C 4 - x axis logarithmic, y axis logarithmic
+C
+C The default values of these parameters make both axes linear.
+C
+C If the parameters 'X/LOGARITHMIC.' and 'Y/LOGARITHMIC.' are reset
+C by the routine DISPLA, they are given values which make them
+C immune to being reset when 'SET.' = 2, 3, or 4 (see the discussion
+C of the argument LSET, above).
+C
+C In calls to the routines AGSETP, AGSETF, AGSETI AGSETC, AGGETP,
+C AGGETF, AGGETI, and AGGETC:
+C
+C -- TPGN is a character string identifying a group of AUTOGRAPH
+C control parameters. It is of the form 'K1/K2/K3/ . . . /Kn.'.
+C Each Ki is a keyword. The keyword K1 specifies a group of control
+C parameters, K2 a subgroup of that group, K3 a subgroup of that
+C subgroup, etc. See the AUTOGRAPH write-up in the graphics manual
+C for a more complete description of these parameter-group names and
+C the ways in which they may be abbreviated.
+C
+C -- FURA is an array, from which control-parameter values are to be
+C taken (the routine AGSETP) or into which they are to be stored
+C (the routine AGGETP). Note that the array is real; all of the
+C AUTOGRAPH parameters are stored internally as reals.
+C
+C -- LURA is the length of the user array FURA.
+C
+C -- FUSR is a variable, from which a single control parameter value is
+C to be taken (the routine AGSETF) or in which it is to be returned
+C (the routine AGGETF). Note that the variable is real.
+C
+C -- IUSR is a variable, from which a single-control parameter value is
+C to be taken (the routine AGSETI) or in which it is to be returned
+C (the routine AGGETI). Note that, since the control parameters are
+C stored internally as reals, each of the routines AGSETI and AGGETI
+C does a conversion - from integer to real or vice-versa. Note also
+C that AGSETI and AGGETI should only be used for parameters which
+C have intrinsically integral values.
+C
+C -- CUSR is a character variable from which a character string is to
+C be taken (the routine AGSETC) or into which it is to be retrieved
+C (the routine AGGETC). The control parameter affected by the call
+C contains the floating-point equivalent of an integer identifier
+C returned by the routine which stashes the character string and
+C tendered to the routine which retrieves it (sort of the automated
+C equivalent of a hat check). Note that AGSETC and AGGETC should
+C only be used for parameters which intrinsically represent character
+C strings.
+C
+C In calls to the routine AGSTUP:
+C
+C -- XDRA is an array of x coordinates of user data - usually, but not
+C necessarily, the same data which will later be used in calls to
+C the routine AGCURV.
+C
+C -- NVIX is the number of vectors of data in XDRA - if XDRA is doubly-
+C dimensioned, NVIX would normally have the value of its second
+C dimension, if XDRA is singly-dimensioned, a 1.
+C
+C -- IIVX is the index increment between vectors in XDRA - if XDRA is
+C doubly-dimensioned, IIVX would normally have the value of its
+C first dimension, if XDRA is singly-dimensioned, a dummy value.
+C
+C -- NEVX is the number of elements in each data vector in XDRA - if
+C XDRA is doubly-dimensioned, NEVX would normally have the value of
+C its first dimension, if XDRA is singly-dimensioned, the value of
+C that single dimension.
+C
+C -- IIEX is the index increment between elements of a data vector in
+C XDRA - normally a 1.
+C
+C -- YDRA, NVIY, IIVY, NEVY, and IIEY are analogous to XDRA, NVIX,
+C IIVX, NEVX, and IIEX, but define y-coordinate data.
+C
+C In calls to the routine AGCURV:
+C
+C -- XVEC is a vector of x coordinate data.
+C
+C -- IIEX is the index increment between elements in XVEC. AGCURV will
+C use XVEC(1), XVEC(1+IIEX), XVEC(1+2*IIEX), etc.
+C
+C -- YVEC is a vector of y coordinate data.
+C
+C -- IIEY is the index increment between elements in YVEC. AGCURV will
+C use YVEC(1), YVEC(1+IIEY), YVEC(1+2*IIEY), etc.
+C
+C -- NEXY is the number of points defining the curve to be drawn.
+C
+C -- KDSH is a dashed-line selector. Possible values are as follows:
+C
+C If KDSH is zero, AUTOGRAPH will assume that the user has
+C called the routine DASHD (in the DASHCHAR package, which see)
+C to define the dashed-line pattern to be used.
+C
+C If KDSH is less than zero and has absolute value M, AUTOGRAPH
+C will use the Mth (modulo 26) alphabetic dashed-line pattern.
+C Each of these patterns defines a solid line interrupted every
+C so often by a letter of the alphabet.
+C
+C If KDSH is greater than zero and has the value M, AUTOGRAPH
+C will use the Mth (modulo N) dashed-line pattern in the group
+C of N dashed-line patterns defined by the AUTOGRAPH control
+C parameters in the group named 'DASH/PATTERNS.'. The default
+C values of these parameters specify solid lines.
+C
+C In calls to the routines AGSAVE and AGRSTR:
+C
+C -- IFNO is the unit number associated with a file to which a single
+C unformatted logical record of data is to be written, or from which
+C such a record is to be read, by AUTOGRAPH. The file is not rewound
+C before being written or read; positioning it properly is the user's
+C responsibility.
+C
+C In calls to the function AGBNCH:
+C
+C -- IDSH is a 16-bit binary dash pattern, the character equivalent of
+C which is to be returned as the value of AGBNCH.
+C
+C In calls to the function AGDSHN:
+C
+C -- IDSH is the number of the dash pattern parameter whose name is to
+C be returned as the value of the function AGDSHN.
+C
+C In calls to the routine AGUTOL:
+C
+C -- IAXS is the number of the axis. The values 1, 2, 3, and 4 imply
+C the left, right, bottom, and top axes, respectively.
+C
+C -- FUNS is the value of the parameter 'AXIS/s/FUNCTION.' which may be
+C used to select the desired mapping function for axis IAXS. It is
+C recommended that the default value (zero) be used to specify the
+C identity mapping. A non-zero value may be integral (1., 2., etc.)
+C and serve purely to select the code to be executed or it may be the
+C value of a real parameter in the equations defining the mapping.
+C
+C -- IDMA specifies the direction of the mapping. A value greater than
+C zero indicates that VINP is a value in the user system and that
+C VOTP is to be a value in the label system, a value less than zero
+C the opposite.
+C
+C -- VINP is an input value in one coordinate system along the axis.
+C
+C -- VOTP is an output value in the other coordinate system along the
+C axis.
+C
+C In calls to the routine AGCHAX:
+C
+C -- IFLG is zero if a particular object is about to be drawn, non-zero
+C if it has just been drawn.
+C
+C -- IAXS is the number of the axis being drawn. The values 1, 2, 3,
+C and 4 indicate the left, right, bottom, and top axes, respectively.
+C
+C -- IPRT indicates the part of the axis being drawn. Possible values
+C are as follows:
+C
+C -- 1 implies the line of the axis.
+C
+C -- 2 implies a major tick.
+C
+C -- 3 implies a minor tick.
+C
+C -- 4 implies the mantissa of a numeric label.
+C
+C -- 5 implies the exponent of a numeric label.
+C
+C -- VILS is the value in the label system at the point where the part
+C is being drawn. For IPRT = 1, VILS is zero.
+C
+C In calls to the routine AGCHCU:
+C
+C -- IFLG is zero if a particular object is about to be drawn, non-zero
+C if it has just been drawn.
+C
+C -- KDSH is the value with which AGCURV was called, as follows:
+C
+C AGCURV called by Value of KDSH
+C ---------------- ----------------------------------------
+C EZY 1
+C EZXY 1
+C EZMY "n" or "-n", where n is the curve number
+C EZMXY "n" or "-n", where n is the curve number
+C the user program the user value
+C
+C In calls to the routine AGCHIL:
+C
+C -- IFLG is zero if a particular object is about to be drawn, non-zero
+C if it has just been drawn.
+C
+C -- LBNM is a character variable containing the name of the label being
+C drawn.
+C
+C -- LNNO is the number of the line being drawn.
+C
+C In calls to the routine AGCHNL:
+C
+C -- IAXS is the number of the axis being drawn. The values 1, 2, 3,
+C and 4 imply the left, right, bottom, and top axes, respectively.
+C
+C -- VILS is the value to be represented by the numeric label, in the
+C label system for the axis. The value of VILS must not be altered.
+C
+C -- CHRM, on entry, is a character string containing the mantissa of
+C the numeric label, as it will appear if AGCHNL makes no changes.
+C If the numeric label includes a "times" symbol, it is represented
+C by a blank in CHRM. (See IPXM, below.) CHRM may be modified.
+C
+C -- MCIM is the length of CHRM - the maximum number of characters that
+C it will hold. The value of MCIM must not be altered.
+C
+C -- NCIM, on entry, is the number of meaningful characters in CHRM. If
+C CHRM is changed, NCIM should be changed accordingly.
+C
+C -- IPXM, on entry, is zero if there is no "times" symbol in CHRM; if
+C it is non-zero, it is the index of a character position in CHRM.
+C If AGCHNL changes the position of the "times" symbol in CHRM,
+C removes it, or adds it, the value of IPXM must be changed.
+C
+C -- CHRE, on entry, is a character string containing the exponent of
+C the numeric label, as it will appear if AGCHNL makes no changes.
+C CHRE may be modified.
+C
+C -- MCIE is the length of CHRE - the maximum number of characters that
+C it will hold. The value of MCIE must not be altered.
+C
+C -- NCIE, on entry, is the number of meaningful characters in CHRE. If
+C CHRE is changed, NCIE should be changed accordingly.
+C
+C ---------------------------------------------------------------------
+C T H E A U T O G R A P H C O D E
+C ---------------------------------------------------------------------
+C
+C Following is the AUTOGRAPH code. Routines appear in alphabetic order.
+C
+ SUBROUTINE AGAXIS (IAXS,QTST,QSPA,WCWP,HCWP,XBGA,YBGA,XNDA,YNDA,
+ + QLUA,UBGA,UNDA,FUNS,QBTP,BASE,QJDP,WMJL,WMJR,
+ + QMNT,QNDP,WMNL,WMNR,QLTP,QLEX,QLFL,QLOF,QLOS,
+ + DNLA,WCLM,WCLE,RFNL,QCIM,QCIE,WNLL,WNLR,WNLB,
+ + WNLE)
+C
+C The routine AGAXIS is used to draw, tick-mark, and label an axis or,
+C if ITST is non-zero, to pre-compute the amount of space which will be
+C required for numeric labels when the axis is actually drawn. AGAXIS
+C assumes that the last call to the plot-package routine SET was as
+C follows (or the equivalent thereof):
+C
+C CALL SET (XLCW,XRCW,YBCW,YTCW,0.,1.,0.,1.,1)
+C
+C where XLCW, XRCW, YBCW, and YTCW are the coordinates of the left,
+C right, bottom, and top edges of the curve window, stated as fractions
+C of the appropriate edge of the plotter frame.
+C
+C The arguments of AGAXIS are as follows:
+C
+C -- IAXS is the number of the axis being drawn - 1, 2, 3, or 4, meaning
+C the left, right, bottom, and top axes, respectively.
+C
+C -- ITST is an integer specifying what the caller wishes AGAXIS to do,
+C as follows:
+C
+C -- If ITST .LT. 0, AGAXIS is to draw only the axis, nothing else.
+C
+C -- If ITST .EQ. 0, AGAXIS is to draw, tick, and label the axis.
+C
+C -- If ITST .GT. 0, AGAXIS is to pre-compute the amount of space
+C which will be required for numeric labels. If the labels will
+C not fit in the space provided, AGAXIS is instructed to take
+C action as follows:
+C
+C -- ITST .EQ. 1 - no action.
+C
+C -- ITST .EQ. 2 - shrink the labels.
+C
+C -- ITST .EQ. 3 - re-orient the labels.
+C
+C -- ITST .EQ. 4 - shrink and/or re-orient the labels.
+C
+C -- ISPA is a 0 or a 1, specifying whether or not the axis itself is
+C to be drawn. If ISPA .NE. 0, the axis is suppressed. Tick marks
+C and/or labels may still be drawn.
+C
+C -- WCWP is the width of the curve window, in plotter units.
+C
+C -- HCWP is the height of the curve window, in plotter units.
+C
+C -- XBGA, YBGA, XNDA, and YNDA are the x and y coordinates of the ends
+C of the axis. X coordinates are stated as fractions of the width,
+C y coordinates as fractions of the height, of the curve window. The
+C axis to be drawn must be either horizontal or vertical (at an angle
+C of 0, 90, 180, or 270 degrees). The left side, right side, begin-
+C ning, and end of the axis are defined from the viewpoint of a demon
+C standing at (XBGA,YBGA) and staring balefully toward (XNDA,YNDA).
+C
+C -- LLUA, UBGA, and UNDA define the mapping of the "user" coordinate
+C system (used for data-point coordinates) onto the axis. If LLUA
+C is zero, the mapping is linear; if LLUA is non-zero, the mapping
+C is logarithmic. UBGA is the user-system value at the beginning of
+C the axis, UNDA the value at the end of the axis. The subroutine
+C AGFTOL, which needs these parameters, is actually passed LLUA,
+C UBEG=F(UBGA), and UDIF=F(UNDA)-F(UBGA), where F is the function
+C F(X)=X or the function F(X)=ALOG10(X), depending on LLUA.
+C
+C -- FUNS is a function-selector, to be used in calls to AGUTOL, which
+C defines the mappings from the user system to the label system and
+C vice-versa for each of the four axes. The functions defined must
+C be continuous, monotonic, and bounded within the user-system range
+C (UBGA,UNDA) and a little bit outside that range. The positions
+C of numeric labels and tick marks are chosen in the label system,
+C mapped to the user system, and then onto the axis.
+C
+C -- NBTP and BASE specify how major ticks are to be positioned in the
+C label coordinate system. See the routine AGNUMB (arguments NBTP,
+C SBSE, and EXMU) for a description of these arguments. Note that
+C NBTP .EQ. 0 or BASE .EQ. 0. suppresses both major tick marks and
+C their labels. Note: SBSE .EQ. +BASE or -BASE, as needed.
+C
+C -- QJDP is the major-tick-mark dash pattern (0. .LE. QJDP .LE. 65535.)
+C QJDP .LE. 0 suppresses major ticks.
+C
+C -- WMJL and WMJR are the distances to the left and right ends of the
+C major tick marks, stated as fractions of the shortest side of the
+C curve window. Values .EQ. 0 may be used to suppress one or both
+C portions. Values .GE. 1 may be used to extend a given portion all
+C the way to the edge of the curve window. (See routine AGCTKO.)
+C
+C -- NMNT is the number of minor tick marks to be placed between each
+C pair of consecutive major tick marks. NMNT .EQ. 0 suppresses them.
+C
+C -- QNDP, WMNL, and WMNR are analogous to QJDP, WMJL, and WMJR, but
+C specify minor-tick-mark characteristics.
+C
+C -- NLTP, NLEX, and NLFL specify the graphic form of numeric labels, as
+C described in the routine AGNUMB (which see). Note that NLTP .LE. 0
+C suppresses numeric labels.
+C
+C -- NLOF and NLOS are first and second choices for the numeric label
+C orientation. Both must be multiples of 90, specifying an angle
+C measured in degrees counter-clockwise from a vector running from
+C left to right in the curve window. If ITST .EQ. 0, AGAXIS uses
+C NLOF if it is .GE. 0, NLOS otherwise, for the label orientation.
+C If ITST .NE. 0, AGAXIS initially makes both NLOF and NLOS positive.
+C Then, if ITST .GE. 3, NLOF may or may not be made negative. (To
+C set the sign of NLOF or NLOS, AGAXIS adds or subtracts 360*K.)
+C
+C -- DNLA is the desired distance of numeric labels from the axis,
+C positive to the left, negative to the right, of the axis. The
+C magnitude of DNLA is the size of the gap between the axis and the
+C nearest edge of a label, expressed as a fraction of the smaller
+C dimension of the curve window. See also RFNL, below.
+C
+C -- WCLM and WCLE are the desired widths of characters in the mantissa
+C or the exponent, respectively, of numeric labels, expressed as a
+C fraction of the smaller dimension of the curve window. See also
+C RFNL, below.
+C
+C -- RFNL is a reduction factor, used as a multiplier for DNLA, WCLM,
+C and WCLE. If ITST .NE. 0, RFNL is initially set to 1. - then, if
+C ITST .EQ. 2 or 4, it is reset as necessary to shrink the labels.
+C
+C -- MCIM and MCIE specify the maximum number of characters in the
+C mantissa and exponent, respectively, of a numeric label. These
+C are input parameters if ITST .EQ. 0, output parameters otherwise.
+C
+C -- WNLL, WNLR, WNLB, and WNLE are the widths of numeric-label strips
+C on the left side, on the right side, at the beginning, and at the
+C end, of the axis. These are both input and output parameters of
+C AGAXIS. On input, they specify the amount of space available for
+C numeric labels - on output, they specify the amount of space used
+C (if ITST .EQ. 0) or required (if ITST .NE. 0). Each is stated as
+C a fraction of either the width or the height of the curve window,
+C depending on the orientation of the axis in the curve window.
+C
+C The following common block contains other AUTOGRAPH variables, both
+C real and integer, which are not control parameters. The only ones
+C actually used here are ISLD, MWCM, MWCE, and MDLA. ISLD is a solid-
+C line dash pattern (sixteen one bits). MWCM, MWCE, and MDLA specify
+C the minimum allowed values of the width of a character in a label
+C mantissa, the width of a character in a label exponent, and the
+C distance of a label from the axis. All are in plotter coordinate
+C units.
+C
+ COMMON /AGORIP/ SMRL , ISLD , MWCL,MWCM,MWCE,MDLA,MWCD,MWDQ ,
+ + INIF
+C
+C The AUTOGRAPH function AGFPBN is of type integer.
+C
+ INTEGER AGFPBN
+C
+C Local data required are as follows:
+C
+C BFRM is a buffer in which the routine AGNUMB returns the characters of
+C a label mantissa. CTMP holds a sub-string from an AGPWRT call.
+C
+ CHARACTER*40 BFRM
+ CHARACTER*40 CTMP
+C
+C BFRE is a buffer in which the routine AGNUMB returns the characters of
+C a label exponent.
+C
+ CHARACTER*5 BFRE
+C
+C XMJT, YMJT, XMNT, and YMNT are used to hold x and y offsets to the
+C endpoints of left-of-label and right-of-label portions of major and
+C minor tick marks.
+C
+ DIMENSION XMJT(4),YMJT(4),XMNT(4),YMNT(4)
+C
+C SMJP is the minimum distance allowed between major tick marks, in
+C plotter coordinate units.
+C
+ DATA SMJP / 4. /
+C
+C FBGM, FBGP, FNDM, and FNDP are the coordinates of points a little on
+C either side of the beginning and end of the axis, as fractions of the
+C distance along the axis.
+C
+ DATA FBGM / -0.000001 /
+ DATA FBGP / +0.000001 /
+ DATA FNDM / +0.999999 /
+ DATA FNDP / +1.000001 /
+C
+C HCFW is an arithmetic statement function specifying the height of a
+C character as a function of its width (not counting "white space").
+C The value of the multiplier was determined heuristically, by trying
+C various values and seeing which gave the best results.
+C
+ HCFW(WDTH)=1.25*WDTH
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C This is the initialization section of AGAXIS.
+C
+C Unpack integer values from floating-point arguments.
+C
+ ITST=IFIX(QTST)
+ ISPA=IFIX(QSPA)
+ LLUA=IFIX(QLUA)
+ NBTP=IFIX(QBTP)
+ NMNT=IFIX(QMNT)
+ NLTP=IFIX(QLTP)
+ NLEX=IFIX(QLEX)
+ NLFL=IFIX(QLFL)
+ NLOF=IFIX(QLOF)
+ NLOS=IFIX(QLOS)
+ MCIM=IFIX(QCIM)
+ MCIE=IFIX(QCIE)
+C
+C Initialize the local flags which specify what entities to draw, using
+C values appropriate for the following quick exit.
+C
+ LDAX=1-ISPA
+ LDNL=0
+ LDMN=0
+C
+C If AGAXIS is to draw only the axis, exit immediately.
+C
+ IF (ITST.LT.0) GO TO 800
+C
+C If either NBTP or BASE is zeroed, exit immediately.
+C
+ IF (NBTP.EQ.0.OR.BASE.EQ.0.) GO TO 800
+C
+C Re-initialize the flag controlling the drawing of numeric labels.
+C
+ IF (NLTP.NE.0) LDNL=1
+C
+C If this is not a test run, skip.
+C
+ IF (ITST.EQ.0) GO TO 101
+C
+C This is a test run - exit if there are no numeric labels.
+C
+ IF (LDNL.EQ.0) GO TO 800
+C
+C This is a test run and the axis is to have numeric labels - initialize
+C the numeric-label orientation and sizing parameters. Clobber drawing.
+C
+ NLOF=MOD(NLOF+3600,360)
+ NLOS=MOD(NLOS+3600,360)
+ RFNL=1.
+ MCIM=0
+ MCIE=0
+ LDMJ=0
+ LDMN=0
+C
+C The main body of the initialization follows.
+C
+C Compute the length of the smaller side of the curve window, in the
+C plotter coordinate system.
+C
+ 101 SCWP=AMIN1(WCWP,HCWP)
+C
+C Compute a set of direction numbers for the axis, in the curve-window
+C coordinate system (the change in x and y from the beginning to the
+C end of the axis).
+C
+ XDNA=XNDA-XBGA
+ YDNA=YNDA-YBGA
+C
+C Compute the length of the axis in the plotter coordinate system and
+C its direction cosines.
+C
+ XDNP=XDNA*WCWP
+ YDNP=YDNA*HCWP
+ AXLP=SQRT(XDNP*XDNP+YDNP*YDNP)
+ XDCA=XDNP/AXLP
+ YDCA=YDNP/AXLP
+C
+C Compute the axis orientation angle, in degrees counter-clockwise.
+C
+ IAOR=MOD(IFIX(57.2957795130823*ATAN2(YDCA,XDCA)+3600.5),360)
+C
+C Compute the multiplicative constants required to convert a fraction of
+C the axis length to a fraction of the width or height of the curve
+C window (a distance in x or y).
+C
+ CFAX=AXLP/WCWP
+ CFAY=AXLP/HCWP
+C
+C Compute the multiplicative constants required to convert a fraction of
+C the axis length to a fraction of the along-axis and perpendicular-to-
+C axis sides of the curve window.
+C
+ CFAA=ABS(XDCA*CFAX+YDCA*CFAY)
+ CFAP=ABS(XDCA*CFAY+YDCA*CFAX)
+C
+C Compute the quantities (UBEG) and (UDIF) for AGFTOL.
+C
+ IF (LLUA.NE.0) GO TO 102
+C
+ UBEG=UBGA
+ UDIF=UNDA-UBGA
+ GO TO 103
+C
+ 102 UBEG=ALOG10(UBGA)
+ UDIF=ALOG10(UNDA)-UBEG
+C
+C SMJT and SMNT are fractions of the axis length and specify the minimum
+C space which must be available between two major ticks before the major
+C ticks themselves or the minor ticks between them, respectively, may be
+C drawn.
+C
+ 103 SMJT=SMJP/AXLP
+ SMNT=SMJT*FLOAT(NMNT+1)
+C
+C Initialize the fractional numeric-label character heights.
+C
+ FHCM=0.
+ FHCE=0.
+C
+C If the axis has no numeric labels, skip the following code.
+C
+ IF (LDNL.EQ.0) GO TO 104
+C
+C Zero the numeric-label offset.
+C
+ FNLO=0.
+C
+C The numeric-label parameters are computed by an internal procedure
+C (which see, below).
+C
+ ASSIGN 104 TO JMP3
+ GO TO 500
+C
+C If this is a test run, skip the following code.
+C
+ 104 IF (ITST.NE.0) GO TO 200
+C
+C This is not a test run. First, set up the tick-mark parameters.
+C
+C Compute the multiplicative constant required to convert a fraction of
+C the smaller dimension of the grid to a fraction of the axis length.
+C
+ CSFA=SCWP/AXLP
+C
+C Compute the widths of the left and right portions of the numeric-label
+C space as fractions of the axis length, affixing an appropriate sign.
+C
+ FNLL=-WNLL/CFAP
+ FNLR=+WNLR/CFAP
+C
+C Compute a jump parameter to sort out the axis orientations.
+C
+ JAOR=1+IAOR/90
+C
+C The routine AGCTKO is used to compute the rest of the tick parameters.
+C
+ CALL AGCTKO (XBGA,YBGA,XDCA,YDCA,CFAX,CFAY,CSFA,JAOR, 1,QJDP,
+ + WMJL,WMJR,FNLL,FNLR,MJ12,MJ34,XMJT,YMJT)
+C
+ CALL AGCTKO (XBGA,YBGA,XDCA,YDCA,CFAX,CFAY,CSFA,JAOR,NMNT,QNDP,
+ + WMNL,WMNR,FNLL,FNLR,MN12,MN34,XMNT,YMNT)
+C
+C Set the flags controlling the drawing of tick marks.
+C
+ LDMJ=MJ12+MJ34
+ LDMN=MN12+MN34
+ LDLR=-(LDMJ+LDMN)
+C
+C If no numeric labels are to be drawn, skip the following code.
+C
+ IF (LDNL.EQ.0) GO TO 117
+C
+C Numeric labels are to be drawn. Precompute parameters which will be
+C used to position labels relative to the axis.
+C
+C Compute the widths and heights of the longest possible label mantissa
+C and exponent, as fractions of the length of the axis.
+C
+ FWLM=FLOAT(MCIM)*FWCM
+ FWLE=FLOAT(MCIE)*FWCE
+ FHLM=FHCM
+ FHLE=FHCE
+ IF (MCIE.EQ.0) FHLE=0.
+C
+C Jump on the label-to-axis orientation.
+C
+ GO TO (105,106,107,108) , JLAO
+C
+C Label is at a 0-degree angle to the axis.
+C
+ 105 FBLP=-FHLM
+ GO TO 109
+C
+C Label is at a 90-degree angle to the axis.
+C
+ 106 FBLA=0.
+ FBLQ=-FWLM-FWLE
+ GO TO 110
+C
+C Label is at a 180-degree angle to the axis.
+C
+ 107 FBLP=FHLM+FHLE
+ GO TO 109
+C
+C Label is at a 270-degree angle to the axis.
+C
+ 108 FBLA=0.
+ FBLQ=FWLM+FWLE
+ GO TO 110
+C
+C Label is parallel to the axis.
+C
+ 109 FNLW=FHLM+.5*FHLE
+ FBLQ=0.
+ GO TO 111
+C
+C Label is perpendicular to the axis.
+C
+ 110 FNLW=FWLM+FWLE
+ FBLP=0.
+C
+C If the labels will not fit in the space provided, clobber them.
+C
+ 111 IF (.999999*FNLW.LT.FNLR-FNLL) GO TO 112
+C
+ LDNL=0
+ GO TO 117
+C
+C Jump on the signed value of the numeric-label distance from the axis.
+C
+ 112 IF (DNLA) 113,114,115
+C
+C Labels are to the right of the axis.
+C
+ 113 FNLC=FDLA+.5*FNLW
+ FBLP=FDLA+.5*ABS(FBLP-FHLE)
+ FBLQ=FDLA+.5*ABS(FBLQ+FWLM-FWLE)
+ GO TO 116
+C
+C Labels are centered on the axis.
+C
+ 114 FNLC=0.
+ FBLP=0.
+ FBLQ=0.
+ GO TO 116
+C
+C Labels are to the left of the axis.
+C
+ 115 FNLC=-(FDLA+.5*FNLW)
+ FBLP=-(FDLA+.5*ABS(FBLP))
+ FBLQ=-(FDLA+.5*ABS(FBLQ-FWLM+FWLE))
+C
+ 116 FNLO=.5*(FNLL+FNLR)-FNLC
+C
+C If the axis would pass through the offset labels, clobber it.
+C
+ IF (FNLL*FNLR.LT.0.) LDAX=0
+C
+C Jump to draw numeric labels and/or tick marks.
+C
+ GO TO 200
+C
+C No numeric labels are to be drawn. If no tick marks are to be drawn
+C either, exit.
+C
+ 117 IF (LDLR.EQ.0) GO TO 800
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C The following code directs the process of tick-marking and labelling
+C the axis, using the internal procedures which follow it. If the
+C label-coordinate-system value 0 maps onto the axis, tick-marking and
+C labelling are done in two passes, one starting at 0 and proceeding
+C in a positive direction and the other starting at 0 and proceeding
+C in a negative direction. If the label-coordinate-system value 0 does
+C not map onto the axis, only one pass is required.
+C
+C First, determine the label-coordinate-system values VBGM and VNDP at
+C the points FBGM and FNDP, a little beyond the ends of the axis.
+C
+ 200 CALL AGFTOL (IAXS,1,FBGM,VBGM,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,BASE)
+ CALL AGFTOL (IAXS,1,FNDP,VNDP,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,BASE)
+C
+C If zero falls on the axis, jump to the two-pass section of the code.
+C
+ IF (VBGM*VNDP.LE.0.) GO TO 201
+C
+C We may tick-mark and label the axis in a single pass. Compute an
+C appropriate starting value for the exponent/multiplier EXMU.
+C
+ SBSE=SIGN(BASE,VBGM)
+ CALL AGFTOL (IAXS,2,FBGM,EBGM,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,SBSE)
+ CALL AGFTOL (IAXS,2,FNDP,ENDP,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,SBSE)
+ EXMU=AMIN1(EBGM,ENDP)
+ EXMU=EXMU-AMOD(EXMU,1.)+.5+SIGN(.5,EXMU)
+C
+C Set the numeric-label-space limits for the beginning and end of the
+C axis.
+C
+ FNLB=FBGM-WNLB/CFAA-.5*(FHCM+FHCE)
+ FNLE=FNDP+WNLE/CFAA+.5*(FHCM+FHCE)
+C
+C Jump to an internal procedure to tick-mark and label the axis. Return
+C from there to the termination section of AGAXIS.
+C
+ ASSIGN 800 TO JMP1
+ GO TO 300
+C
+C Tick marks and labels must be done in two passes. First, draw the
+C tick mark and/or label at the zero position in the label system, using
+C an internal procedure below. A number of parameters must be preset.
+C
+ 201 CALL AGFTOL (IAXS,-1,0.,FRAX,VLCS,LLUA,UBEG,UDIF,FUNS,NBTP,BASE)
+C
+C Determine whether label is to be drawn or not.
+C
+ LDLB=0
+ IF (LDNL.EQ.0) GO TO 202
+ LDLB=1
+C
+C The mantissa portion of the label consists of the single character 0.
+C
+ BFRM(1:1)='0'
+ NCIM=1
+ IPXM=0
+C
+C The label has no exponent portion.
+C
+ NCIE=0
+C
+C Allow the user to change the numeric label.
+C
+ CALL AGCHNL (IAXS,VLCS,BFRM,40,NCIM,IPXM,BFRE,5,NCIE)
+C
+C Compute the length of the mantissa, the exponent, and the whole label.
+C
+ FLLM=FLOAT(NCIM)*FWCM
+ FLLE=FLOAT(NCIE)*FWCE
+ FLLB=FLLM+FLLE
+C
+C The numeric-label space begins and ends at impossible values.
+C
+ FNLB=-10.
+ FNLE=+10.
+C
+C Force the labeler to update FNLB, rather than FNLE.
+C
+ FDIR=1.
+C
+C Jump to an internal procedure to draw the label and/or the tick mark.
+C
+ 202 ASSIGN 203 TO JMP2
+ GO TO 400
+C
+C Save the position of the zero-point (FRAX, expressed as a fraction of
+C the axis length) and preset the parameter DZRT, which is the minimum
+C distance from the zero-point at which a major tick mark could occur,
+C and the parameter DZRL, which is the minimum distance from the zero-
+C point at which a label could occur. Set the label-space limit FNLE.
+C Preset the internal-procedure exit parameter JMP1.
+C
+ 203 ASSIGN 205 TO JMP1
+ FZRO=FRAX
+ DZRT=AMAX1(SMJT,1.6*FLOAT(LDNL)*FHCM)
+ IF (LDNL.EQ.0) GO TO 204
+ DZRL=FNLB-FZRO
+ FNLE=FNDP+WNLE/CFAA+.5*(FHCM+FHCE)
+C
+C Do the portion of the axis lying in the direction specified by DZRT.
+C If it is too short, skip it entirely.
+C
+ 204 FRAX=FZRO+DZRT
+ IF (FRAX.LT.FBGM.OR.FRAX.GT.FNDP) GO TO JMP1 , (205,800)
+C
+C Find out whether BASE must be negated for this portion.
+C
+ CALL AGFTOL (IAXS,1,FRAX,VLCS,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,BASE)
+ SBSE=SIGN(BASE,VLCS)
+C
+C Compute a starting value of the exponent/multiplier EXMU.
+C
+ CALL AGFTOL (IAXS,2,FRAX,EXMU,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,SBSE)
+ EXMU=EXMU-AMOD(EXMU,1.)+.5+SIGN(.5,EXMU)
+C
+C Jump to an internal procedure to draw the tick marks and/or labels.
+C
+ GO TO 300
+C
+C Set up to do the second portion of the axis, then go do it.
+C
+ 205 ASSIGN 800 TO JMP1
+ DZRT=-DZRT
+ IF (LDNL.EQ.0) GO TO 204
+ FNLB=FBGM-WNLB/CFAA-.5*(FHCM+FHCE)
+ FNLE=FZRO-DZRL
+ GO TO 204
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C The following is an internal procedure, exited via the assigned-go-to
+C variable JMP1. Its purpose is to tick-mark and label a portion of the
+C axis (perhaps the entire axis) at positions determined by consecutive
+C values of the parameter EXMU. It prevents tick marks from piling up
+C or passing through the label space and prevents overlapping of labels.
+C Tick marks are drawn alternately from left to right or vice-versa.
+C
+C The caller has provided an initial value of EXMU, but we must consider
+C possible minor tick marks in the interval (EXMU-1.,EXMU).
+C
+ 300 EXMU=EXMU-1.
+C
+C Compute FRAX, which is the fractional distance along the axis, and
+C VLCS, which is the value in the label coordinate system corresponding
+C to the current value of EXMU.
+C
+ CALL AGFTOL (IAXS,-2,EXMU,FRAX,VLCS,LLUA,UBEG,UDIF,FUNS,NBTP,SBSE)
+C
+C Move the current values of EXMU, FRAX, and VLCS to ELST, FLST, and
+C VLST, specifying the last values of these parameters. Then increment
+C EXMU by 1. and recompute FRAX and VLCS. (The loop through consecutive
+C values of EXMU begins here.)
+C
+ 301 ELST=EXMU
+ FLST=FRAX
+ VLST=VLCS
+C
+ EXMU=EXMU+1.
+ CALL AGFTOL (IAXS,-2,EXMU,FRAX,VLCS,LLUA,UBEG,UDIF,FUNS,NBTP,SBSE)
+C
+C FDIR indicates the direction, FDST the magnitude, of step along axis.
+C
+ FDIR=FRAX-FLST
+ FDST=ABS(FDIR)
+C
+C Draw minor tick marks, if any, in the interval (FLST,FRAX).
+C
+ IF (LDMN.EQ.0.OR.FDST.LT.SMNT) GO TO 304
+C
+C Use the dashed-line pattern for minor tick marks.
+C
+ CALL DASHDB (AGFPBN(QNDP))
+C
+C Minor tick marks are equally spaced in the label-coordinate system.
+C
+ VINC=(VLCS-VLST)/FLOAT(NMNT+1)
+C
+ DO 303 I=1,NMNT
+ VMNT=VLST+VINC*FLOAT(I)
+ CALL AGFTOL (IAXS,-1,VMNT,FMNT,DUMI,LLUA,UBEG,UDIF,FUNS,NBTP,
+ + SBSE)
+ IF (FMNT.LT.FBGP.OR.FMNT.GT.FNDM) GO TO 303
+ XPAX=XBGA+FMNT*XDNA
+ YPAX=YBGA+FMNT*YDNA
+ LDLR=-LDLR
+ IF (LDLR.LT.0) GO TO 302
+ CALL AGCHAX (0,IAXS,3,VMNT)
+ IF (MN12.NE.0) CALL LINED (XPAX+XMNT(1),YPAX+YMNT(1),
+ + XPAX+XMNT(2),YPAX+YMNT(2))
+ IF (MN34.NE.0) CALL LINED (XPAX+XMNT(3),YPAX+YMNT(3),
+ + XPAX+XMNT(4),YPAX+YMNT(4))
+ CALL AGCHAX (1,IAXS,3,VMNT)
+ GO TO 303
+ 302 CALL AGCHAX (0,IAXS,3,VMNT)
+ IF (MN34.NE.0) CALL LINED (XPAX+XMNT(4),YPAX+YMNT(4),
+ + XPAX+XMNT(3),YPAX+YMNT(3))
+ IF (MN12.NE.0) CALL LINED (XPAX+XMNT(2),YPAX+YMNT(2),
+ + XPAX+XMNT(1),YPAX+YMNT(1))
+ CALL AGCHAX (1,IAXS,3,VMNT)
+ 303 CONTINUE
+C
+C If the end of the axis has been reached, return to caller.
+C
+ 304 IF (FRAX.LT.FBGM.OR.FRAX.GT.FNDP) GO TO JMP1 , (205,800)
+C
+C Draw the major tick mark and/or the numeric label at FRAX.
+C
+ IF (FDST.LT.SMJT) GO TO 301
+ LDLB=0
+ IF (LDNL.EQ.0) GO TO 305
+ CALL AGNUMB (NBTP,SBSE,EXMU,NLTP,NLEX,NLFL,BFRM,40,NCIM,IPXM,BFRE,
+ + 5,NCIE)
+ CALL AGCHNL (IAXS,VLCS,BFRM,40,NCIM,IPXM,BFRE,5,NCIE)
+C
+C If this is not a test run, mantissa and exponent length are checked.
+C
+ IF (ITST.EQ.0.AND.(NCIM.GT.MCIM.OR.NCIE.GT.MCIE)) GO TO 305
+ LDLB=1
+ FLLM=FLOAT(NCIM)*FWCM
+ FLLE=FLOAT(NCIE)*FWCE
+ FLLB=FLLM+FLLE
+C
+C Use the next internal procedure to draw the major tick and/or label.
+C
+ 305 ASSIGN 301 TO JMP2
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C The following is an internal procedure, exited via the assigned-go-to
+C variable JMP2. Its purpose is to draw the major tick mark and/or the
+C numeric label at a specified point on the axis or, if ITST is .NE. 0,
+C to predict the amount of space which will be required for such items.
+C
+C Jump if no label is to be drawn.
+C
+ 400 IF (LDLB.EQ.0.OR.NCIM.LE.0) GO TO 410
+C
+C See if the label will fit without overlapping another label. To do
+C this, first compute its fractional length along the axis (FLAA).
+C
+ GO TO (401,402,401,402) , JLAO
+C
+C Label is parallel to the axis. Allow for inter-label spacing.
+C
+ 401 FLAA=FLLB+FWCM
+ GO TO 403
+C
+C Label is perpendicular to the axis. Ignore exponent portion.
+C
+ 402 FLAA=1.6*FHCM
+C
+C Compute the fractional coordinates of the endpoints of the label
+C (along the axis) and see if it will fit in the available label space.
+C
+ 403 FLBB=FRAX-.5*FLAA
+ FLBE=FRAX+.5*FLAA
+C
+ IF (FLBB.GE.FNLB.AND.FLBE.LE.FNLE) GO TO 407
+C
+C Label will not fit. Omit it or, if this is a test run, see if any
+C remedial action is to be taken.
+C
+ LDLB=0
+ IF (ITST.EQ.0) GO TO 411
+C
+C This is a test run and we have two consecutive labels which overlap.
+C See what can be done about it.
+C
+ GO TO (424,404,406,404) , ITST
+C
+C We are allowed to shrink the labels. See if they are minimum-size
+C already. If so, the only other possibility is to re-orient them.
+C
+ 404 IF (IWCM.LE.MWCM.AND.IWCE.LE.MWCE.AND.IDLA.LE.MDLA) GO TO 405
+C
+C If not, shrink them by an amount based on the extent of the overlap,
+C reset the parameters affected, and start from square one.
+C
+ RFNL=AMIN1(.9,FDST/(FDST+AMAX1(FNLB-FLBB,FLBE-FNLE)))*RFNL
+ MCIM=0
+ MCIE=0
+ ASSIGN 200 TO JMP3
+ GO TO 500
+C
+C If labels have already been shrunk to minimum size, see if we can
+C re-orient them. If not, at least continue with finding the maximum
+C mantissa and exponent lengths.
+C
+ 405 IF (ITST.NE.4) GO TO 424
+C
+C Try re-orienting the labels. If this has already been tried, or it it
+C would be pointless, skip it, but continue with finding the maximum
+C mantissa and exponent lengths.
+C
+ 406 IF (NLOF.LT.0.OR.NLOS.EQ.NLOF.OR.JLAO.EQ.2.OR.JLAO.EQ.4) GO TO 424
+C
+C If re-orienting makes sense, reset the appropriate parameters and
+C start from square one.
+C
+ NLOF=NLOF-360
+ RFNL=1.
+ MCIM=0
+ MCIE=0
+ ASSIGN 200 TO JMP3
+ GO TO 500
+C
+C Label will fit. Update the label space limits for next time.
+C
+ 407 IF (FDIR.GE.0.) GO TO 408
+ FNLE=FLBB
+ GO TO 409
+ 408 FNLB=FLBE
+C
+C If this is not just a test shot, go off and draw the tick mark/label.
+C
+ 409 IF (ITST.EQ.0) GO TO 411
+C
+C If this is a test shot, update the maximum mantissa and exponent
+C lengths being generated and exit from this internal procedure.
+C
+ MCIM=MAX0(MCIM,NCIM)
+ MCIE=MAX0(MCIE,NCIE)
+ GO TO 424
+C
+C No label is to be drawn. If this is a test shot, exit from this
+C internal procedure without drawing the tick mark.
+C
+ 410 IF (ITST.NE.0) GO TO 424
+C
+C Compute x and y coordinates of current axis point.
+C
+ 411 XPAX=XBGA+FRAX*XDNA
+ YPAX=YBGA+FRAX*YDNA
+C
+C Jump if no major tick-mark is to be drawn. Otherwise, set up the
+C dash pattern for major tick-marks.
+C
+ IF (LDMJ.EQ.0) GO TO 414
+ CALL DASHDB (AGFPBN(QJDP))
+C
+C Flip the left-to-right/right-to-left direction flag.
+C
+ LDLR=-LDLR
+C
+C Draw the first portion of the tick mark.
+C
+ IF (LDLR) 413,414,412
+C
+ 412 IF (MJ12.NE.0) THEN
+ CALL AGCHAX (0,IAXS,2,VLCS)
+ CALL LINED (XPAX+XMJT(1),YPAX+YMJT(1),XPAX+XMJT(2),YPAX+YMJT(2))
+ CALL AGCHAX (1,IAXS,2,VLCS)
+ END IF
+ GO TO 414
+C
+ 413 IF (MJ34.NE.0) THEN
+ CALL AGCHAX (0,IAXS,2,VLCS)
+ CALL LINED (XPAX+XMJT(4),YPAX+YMJT(4),XPAX+XMJT(3),YPAX+YMJT(3))
+ CALL AGCHAX (1,IAXS,2,VLCS)
+ END IF
+C
+C Draw the label, if any.
+C
+ 414 IF (LDLB.EQ.0.OR.NCIM.LE.0) GO TO 421
+C
+C Compute the distances from (XPAX,YPAX) to the beginning of the label -
+C along the axis (FBLA) and perpendicular to the axis (FBLP). Each is a
+C directed distance whose magnitude represents a fraction of the length
+C of the axis. The values depend on the label/axis orientation and the
+C distance of the label from the axis. In some cases, these quantities,
+C or portions of them, have already been computed.
+C
+ GO TO (415,416,417,418) , JLAO
+C
+C Label is at a 0-degree angle to the axis.
+C
+ 415 FBLA=-.5*FLLB
+ GO TO 419
+C
+C Label is at a 90-degree angle to the axis.
+C
+ 416 FBLP=FBLQ+FLLM
+ IF (DNLA.EQ.0.) FBLP=.5*FLLB
+ GO TO 419
+C
+C Label is at a 180-degree angle to the axis.
+C
+ 417 FBLA=.5*FLLB
+ GO TO 419
+C
+C Label is at a 270-degree angle to the axis.
+C
+ 418 FBLP=FBLQ-FLLM
+ IF (DNLA.EQ.0.) FBLP=-.5*FLLB
+C
+C Draw the mantissa portion of the label (excluding the "X", if any).
+C
+ 419 DEEX=FBLA*XDCA+(FBLP+FNLO)*YDCA
+ DEEY=FBLA*YDCA-(FBLP+FNLO)*XDCA
+ CALL AGCHAX (0,IAXS,4,VLCS)
+ IF (IPXM.EQ.0) THEN
+ CALL AGPWRT (XPAX+CFAX*DEEX,
+ + YPAX+CFAY*DEEY,BFRM,NCIM,IWCM,NLOR,-1)
+ ELSE
+ CALL AGPWRT (XPAX+CFAX*(DEEX+(FLLM-3.*FWCM)*XDCL),
+ + YPAX+CFAY*(DEEY+(FLLM-3.*FWCM)*YDCL),
+ + BFRM,IPXM-1,IWCM,NLOR,+1)
+ CTMP=BFRM(IPXM+1:NCIM)
+ CALL AGPWRT (XPAX+CFAX*(DEEX+(FLLM-2.*FWCM)*XDCL),
+ + YPAX+CFAY*(DEEY+(FLLM-2.*FWCM)*YDCL),
+ + CTMP,NCIM-IPXM,IWCM,NLOR,-1)
+ END IF
+ DEEX=DEEX+FLLM*XDCL
+ DEEY=DEEY+FLLM*YDCL
+C
+C Draw the "X" portion of the mantissa, if it was left out above.
+C
+ IF (IPXM.EQ.0) GO TO 420
+ DEEX=DEEX-2.5*FWCM*XDCL
+ DEEY=DEEY-2.5*FWCM*YDCL
+ CALL LINE (XPAX+CFAX*(DEEX-.3*FWCM*(XDCL-YDCL)),
+ + YPAX+CFAY*(DEEY-.3*FWCM*(YDCL+XDCL)),
+ + XPAX+CFAX*(DEEX+.3*FWCM*(XDCL-YDCL)),
+ + YPAX+CFAY*(DEEY+.3*FWCM*(YDCL+XDCL)))
+ CALL LINE (XPAX+CFAX*(DEEX-.3*FWCM*(XDCL+YDCL)),
+ + YPAX+CFAY*(DEEY-.3*FWCM*(YDCL-XDCL)),
+ + XPAX+CFAX*(DEEX+.3*FWCM*(XDCL+YDCL)),
+ + YPAX+CFAY*(DEEY+.3*FWCM*(YDCL-XDCL)))
+ DEEX=DEEX+2.5*FWCM*XDCL
+ DEEY=DEEY+2.5*FWCM*YDCL
+ 420 CALL AGCHAX (1,IAXS,4,VLCS)
+C
+C Draw the exponent portion of the label (if it has one).
+C
+ IF (NCIE.EQ.0) GO TO 421
+ DEEX=DEEX-.5*FHCM*YDCL
+ DEEY=DEEY+.5*FHCM*XDCL
+ CALL AGCHAX (0,IAXS,5,VLCS)
+ CALL AGPWRT (XPAX+CFAX*DEEX,YPAX+CFAY*DEEY,BFRE,NCIE,IWCE,NLOR,-1)
+ CALL AGCHAX (1,IAXS,5,VLCS)
+C
+C Draw the second portion of the tick mark, if any.
+C
+ 421 IF (LDLR) 423,424,422
+C
+ 422 IF (MJ34.NE.0) THEN
+ CALL AGCHAX (0,IAXS,2,VLCS)
+ CALL LINED (XPAX+XMJT(3),YPAX+YMJT(3),XPAX+XMJT(4),YPAX+YMJT(4))
+ CALL AGCHAX (1,IAXS,2,VLCS)
+ END IF
+ GO TO 424
+C
+ 423 IF (MJ12.NE.0) THEN
+ CALL AGCHAX (0,IAXS,2,VLCS)
+ CALL LINED (XPAX+XMJT(2),YPAX+YMJT(2),XPAX+XMJT(1),YPAX+YMJT(1))
+ CALL AGCHAX (1,IAXS,2,VLCS)
+ END IF
+C
+C Exit from internal procedure.
+C
+ 424 GO TO JMP2 , (203,301)
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C The following is an internal procedure, exited via the assigned-go-to
+C variable JMP3. Its purpose is to compute all numeric-label parameters
+C required by AGAXIS.
+C
+C Compute the desired label orientation and its direction cosines.
+C
+ 500 NLOR=NLOF
+ IF (NLOR.LT.0) NLOR=NLOS
+C
+ XDCL=COS(.017453292519943*FLOAT(NLOR))
+ YDCL=SIN(.017453292519943*FLOAT(NLOR))
+C
+C Compute JLAO, which is a computed-go-to jump parameter specifying the
+C label-to-axis orientation.
+C
+ JLAO=1+MOD(NLOR-IAOR+3600,360)/90
+C
+C Compute the width of a character in the label mantissa, the width of a
+C character in the label exponent, and the distance of a label from the
+C axis, in the plotter coordinate system.
+C
+ IWCM=MAX0(MWCM,IFIX(RFNL*ABS(WCLM)*SCWP+.5))
+ IWCE=MAX0(MWCE,IFIX(RFNL*ABS(WCLE)*SCWP+.5))
+ IDLA=MAX0(MDLA,IFIX(RFNL*ABS(DNLA)*SCWP+.5))
+C
+C Compute the same quantities as fractions of the axis length.
+C
+ FWCM=FLOAT(IWCM)/AXLP
+ FWCE=FLOAT(IWCE)/AXLP
+ FDLA=FLOAT(IDLA)/AXLP
+C
+C Compute character heights as fractions of the axis length.
+C
+ FHCM=HCFW(FWCM)
+ FHCE=HCFW(FWCE)
+C
+C Return to internal-procedure caller.
+C
+ GO TO JMP3 , (104,200,801)
+C
+C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+C
+C This is the termination section of AGAXIS.
+C
+C Update the parameters WNLL and WNLR to reflect the amount of space
+C used/needed for numeric labels to the left and right of the axis.
+C
+ 800 IF (LDNL.NE.0) GO TO 801
+C
+C No numeric labels occur on the axis. Zero WNLL and WNLR and jump.
+C
+ WNLL=0.
+ WNLR=0.
+ GO TO 815
+C
+C Numeric labels do occur on the axis. Compute the space required.
+C
+ 801 GO TO (802,803,802,803) , JLAO
+C
+C Labels are parallel to the axis.
+C
+ 802 FNLW=FHCM
+ IF (MCIE.NE.0) FNLW=FNLW+.5*FHCE
+ GO TO 804
+C
+C Labels are perpendicular to the axis.
+C
+ 803 FNLW=FLOAT(MCIM)*FWCM+FLOAT(MCIE)*FWCE
+C
+C Jump on the numeric-label-distance-from-axis parameter DNLA.
+C
+ 804 IF (DNLA) 805,806,807
+C
+C Labels are to the right of the axis.
+C
+ 805 FNLL=-FDLA
+ FNLR=+FDLA+FNLW
+ GO TO 808
+C
+C Labels are centered on the axis.
+C
+ 806 FNLL=+.5*FNLW
+ FNLR=+.5*FNLW
+ GO TO 808
+C
+C Labels are to the left of the axis.
+C
+ 807 FNLL=+FDLA+FNLW
+ FNLR=-FDLA
+C
+C Adjust FNLL and FNLR as implied by the numeric-label offset.
+C
+ 808 FNLL=FNLL-FNLO
+ FNLR=FNLR+FNLO
+C
+C If this is not a test run, jump to reset WNLL and WNLR.
+C
+ IF (ITST.EQ.0) GO TO 814
+C
+C If this is a test run, see if the labels will fit. Jump if so.
+C
+ IF (CFAP*FNLL.LE.WNLL.AND.CFAP*FNLR.LE.WNLR) GO TO 814
+C
+C If the labels will not fit, we have a problem. We may or may not be
+C able to do anything about it, depending on ITST.
+C
+ GO TO (814,809,813,809) , ITST
+C
+C We are allowed to shrink the labels. See if they are minimum-size
+C already. If so, the only other possibility is to re-orient them.
+C
+ 809 IF (IWCM.LE.MWCM.AND.IWCE.LE.MWCE.AND.IDLA.LE.MDLA) GO TO 812
+C
+C If not, shrink them by an amount based on the extent of the problem,
+C reset the parameters affected and see if the problem is solved.
+C
+ IF (WNLR+WNLL.GT.0.) GO TO 810
+C
+ RFNL=.000001*RFNL
+ GO TO 811
+C
+ 810 RFNL=AMIN1(.9,(WNLL+WNLR)/(CFAP*(FNLL+FNLR)))*RFNL
+C
+ 811 ASSIGN 801 TO JMP3
+ GO TO 500
+C
+C If labels have already been shrunk to minimum size, see if we can
+C re-orient them. If not, give up.
+C
+ 812 IF (ITST.NE.3) GO TO 814
+C
+C Try re-orienting the labels. If this has already been tried, or if it
+C would be pointless, give up.
+C
+ 813 IF (NLOF.LT.0.OR.NLOS.EQ.NLOF.OR.JLAO.EQ.1.OR.JLAO.EQ.3) GO TO 814
+C
+C If re-orienting makes sense, reset the parameters affected and see if
+C the problem is solved.
+C
+ NLOF=NLOF-360
+ RFNL=1.
+ ASSIGN 801 TO JMP3
+ GO TO 500
+C
+C Reset WNLL and WNLR for caller.
+C
+ 814 WNLL=FNLL*CFAP
+ WNLR=FNLR*CFAP
+C
+C If this is a test run, we are now done.
+C
+ 815 IF (ITST.GT.0) GO TO 816
+C
+C Draw the axis, if it is to be drawn.
+C
+ IF (LDAX.EQ.0) GO TO 816
+C
+ CALL DASHDB (ISLD)
+ CALL AGCHAX (0,IAXS,1,0.)
+ CALL LINED (XBGA,YBGA,XNDA,YNDA)
+ CALL AGCHAX (1,IAXS,1,0.)
+C
+C Pack up integer values which might have been changed into the
+C corresponding floating-point arguments.
+C
+ 816 QLOF=FLOAT(NLOF)
+ QLOS=FLOAT(NLOS)
+ QCIM=FLOAT(MCIM)
+ QCIE=FLOAT(MCIE)
+C
+C Done.
+C
+ RETURN
+C
+ END