VMS Help  —  FORTRAN
  Invokes the VSI Fortran for OpenVMS compiler.  This command is
  described in detail in the VSI Fortran for OpenVMS User Manual.

  For more information on VSI Fortran, including the latest
  online documentation, see:

    http://www.hp.com/go/fortran/

  Format of the Fortran command line:

      FORTRAN[/qualifiers] file-spec-list[/qualifiers]

  To invoke the Compaq Fortran 77 compiler, use FORTRAN/OLD_F77
  (Alpha only).

1  –  Parameters

  /qualifiers

  Indicates either special actions to be performed by the compiler or
  special properties of input or output files.

  file-spec-list

  Specifies the source files containing the program units to be
  compiled.  You can specify more than one source file.  If source
  file specifications are separated by commas (,), the programs are
  compiled separately.  If source file specifications are separated
  by plus signs (+), the files are concatenated and compiled as one
  program.

  When compiling source files with the /OPTIMIZE qualifier (the
  default), concatenating source files allows full interprocedural
  optimizations to occur.

  In specifying a list of input files on the Fortran command line,
  you can use abbreviated file specifications for those files that
  share common device names, directory names, or file names.  The
  system applies temporary file specification defaults to those files
  with incomplete specifications.  The defaults applied to an
  incomplete file specification are based on the previous device
  name, directory name, or file name encountered in the list.

  The output produced by the compiler includes the object and listing
  files.  You can control the production of these files by using the
  appropriate qualifiers on the Fortran command line.

  For complete information on these command-line parameters, see the
  HP Fortran for OpenVMS User Manual.

2  –  Qualifiers

  Fortran command qualifiers influence the way in which the compiler
  processes a file.  In many cases, the simple Fortran command is
  sufficient.  However, you can select appropriate optional qualifiers
  if special processing is required.

3    /ALIGNMENT[=p] D=/ALIGN=(COMM=(PACK,NOMULTI),RECO=NATU)

  /[NO]ALIGNMENT

  Controls whether the VSI Fortran compiler naturally aligns
  fields in records or data items in common blocks, or whether the
  compiler packs those fields and data items together on arbitrary
  byte boundaries.

  Although VSI Fortran always aligns local data items on natural
  boundaries, certain data declaration statements and misaligned
  arguments can force misaligned data.

  Use the /ALIGNMENT qualifier to control the alignment of fields
  associated with common blocks, derived-type structures, and record
  structures.

  The compiler issues messages when it detects misaligned data by
  default (/WARNINGS=ALIGNMENT).  For information about the causes of
  misaligned data and detection at run time, see the HP Fortran for
  OpenVMS User Manual.

                                 NOTE

          Misaligned data significantly increases the time it
          takes to execute a program, depending on the number
          of  misaligned  fields   encountered.    Specifying
          /ALIGNMENT=ALL    (same    as   /ALIGNMENT=NATURAL)
          minimizes misaligned data.

  To obtain compiler messages when misaligned data is encountered,
  use the /WARNING=ALIGNMENT qualifier (or within the OpenVMS
  Debugger, use the command SET BREAK/UNALIGNED).

  Parameter "p" is a specifier with one of the following forms:

     [class =] rule
     (class = rule [,...])
     SEQUENCE
     ALL (or NATURAL)
     MULTILANGUAGE
     NONE (or PACKED)
     PAD_ALIGN_SIZE

  class
  Is one of the following keywords:

    COMMONS     (for common blocks)
    RECORDS     (for derived-type and record structures)
    STRUCTURES  (for derived-type and record structures)

  In VSI Fortran, STRUCTURES and RECORDS are the same.

  rule
  Is one of the following keywords:

  NATURAL
    Naturally aligns fields in derived-type and record structures and
    data items in common blocks on up to 8-byte boundaries.

    If you specify NATURAL, the compiler will naturally align all
    data in a common block, including INTEGER(KIND=8), REAL(KIND=8),
    and all COMPLEX data.

  PACKED
    Packs fields in derived-type and record structures or data items
    in common blocks on arbitrary byte boundaries.

  STANDARD
    Naturally aligns data items in common blocks on up to 4-byte
    boundaries (consistent with the Fortran 95/90 and FORTRAN 77
    standards).

    The compiler will not naturally align INTEGER(KIND=8),
    REAL(KIND=8), and COMPLEX data declarations.  Such data
    declarations should be planned so they fall on natural
    boundaries.  Specifying /ALIGNMENT=COMMONS=STANDARD alone means
    that the default for record structures is used.

    Note that this keyword only applies to common blocks; therefore,
    you can specify /ALIGNMENT=COMMONS=STANDARD, but you cannot
    specify /ALIGNMENT=STANDARD.

  [NO]MULTILANGUAGE
    Controls whether the compiler pads the size of common blocks to
    ensure compatibility when the common block program section is
    shared by code created by other compilers running on OpenVMS.

    When a program section generated by a Fortran common block is
    overlaid with a program section consisting of a C structure,
    linker error messages can result.  This is because the sizes of
    the program sections are inconsistent; the C structure is padded
    and the Fortran common block is not.

    Specifying /ALIGNMENT=COMMON=MULTILANGUAGE ensures that HP
    Fortran follows a consistent program section size allocation
    scheme that works with DEC C program sections that are shared
    across multiple images.  Program sections shared in a single
    image do not have a problem.  The corollary DEC C qualifier is
    /PSECT_MODEL=[NO]MULTILANGUAGE.

    The default is /ALIGNMENT=COMMON=NOMULTILANGUAGE, which is also
    the default behavior of HP Fortran 77 (formerly Compaq
    Fortran 77) and is sufficient for most applications.

    This keyword only applies to common blocks; therefore, you can
    specify /ALIGNMENT=COMMONS=[NO]MULTILANGUAGE, but you cannot
    specify /ALIGNMENT=[NO]MULTILANGUAGE.

  [NO]PAD_ALIGN_SIZE
    Controls whether the compiler pads the size of common blocks
    based on the alignment size.

    Specifying /ALIGNMENT=COMMON=PAD_ALIGN_SIZE ensures that the
    padding appended to the common blocks makes the program section
    size allocation as large as the alignment size.

    Using this keyword results in a program section allocation
    incompatible with sharing across multiple images if those
    images are not Fortran images which have also been compiled
    with this keyword.

    This keyword applies only to common blocks; therefore, you can
    specify /ALIGNMENT=COMMON=[NO]PAD_ALIGN_SIZE, but you cannot
    specify /ALIGNMENT=[NO]PAD_ALIGN_SIZE.

  [NO]SEQUENCE
    Specifies whether or not SEQUENCE types follow the alignment rule
    currently in effect.

    If SEQUENCE is in effect, then SEQUENCE types participate in
    alignment the same as derived types without the SEQUENCE
    property.

    If NOSEQUENCE is in effect, SEQUENCE types are always packed,
    regardless of the current alignment rules.

  ALL
    Is equivalent to /ALIGNMENT, /ALIGNMENT=(NATURAL, SEQUENCE) and
    /ALIGNMENT=(COMMONS=(NATURAL, NOMULTILANGUAGE), RECORDS=NATURAL,
    SEQUENCE).

  NONE
    Is equivalent to /NOALIGNMENT, /ALIGNMENT=(PACKED, NOSEQUENCE),
    and /ALIGNMENT=(COMMONS=(PACKED, NOMULTILANGUAGE),
    RECORDS=PACKED, NOSEQUENCE).

  Defaults depend whether the /ALIGNMENT and /FAST qualifiers are
  specified, as follows:

  Command Line               Default
  ------------               -------
  Omit /ALIGNMENT and        /ALIGNMENT=(NOSEQUENCE, COMMONS=(PACKED,
      omit /FAST              NOMULTILANGUAGE), RECORD=NATURAL)

  Omit /ALIGNMENT and        /ALIGNMENT=(SEQUENCE, COMMONS=(NATURAL,
      specify /FAST           NOMULTILANGUAGE), RECORD=NATURAL)

  /ALIGNMENT=COMMONS=rule    Use whatever the /ALIGNMENT qualifier
                             specifies for COMMONS, but use the
                             default of RECORDS=NATURAL

  /ALIGNMENT=RECORD=rule     Use whatever the /ALIGNMENT qualifier
                             specifies for RECORDS, but use the
                             default of COMMONS (depends whether
                             /FAST was specified or omitted)

  If you specify /ALIGNMENT=class=rule, the rule only applies to that
  class, the other class gets aligned according to the default; for
  example:

  1. /ALIGNMENT=COMMONS=STANDARD

     In this case, RECORDS=NATURAL by default.

  2. /ALIGNMENT=RECORDS=NATURAL

     In this case, COMMONS=PACKED by default.

  To request packed, unaligned data in a derived-type or record
  structure, specify /ALIGNMENT=RECORDS=PACKED, or consider placing
  source data declarations for the structure so that the data is
  naturally aligned.

  To request aligned data in common blocks, specify
  /ALIGNMENT=COMMONS=STANDARD (for data items up to 4 bytes in
  length) or /ALIGNMENT=COMMONS=NATURAL (for data items up to 8 bytes
  length), or place source data declarations within the common block
  carefully so that each data field is naturally aligned.

  The /ALIGNMENT and /WARN=ALIGNMENT qualifiers can be used together
  in the same command line.

  You can override the alignment specified on the command line by
  using a CDEC$ OPTIONS directive, as described in the HP Fortran for
  OpenVMS Language Reference Manual.

  You can also specify /ALIGNMENT=REC2BYTE or /ALIGNMENT=REC4BYTE.
  These options specify that fields of records and components of
  derived types are to be aligned on the smaller of:

   o  The 2- or 4-byte boundary specified

   o  The boundary that will naturally align them

  These options do not affect whether common blocks are naturally
  aligned or packed.

4    /ANALYSIS_DATA[=file] D=/NOANALYSIS_DATA

  /[NO]ANALYSIS_DATA

  Produces an analysis data file that contains cross-reference and
  static-analysis information about the source code being compiled.

  Analysis data files are reserved for use by HP products such
  as, but not limited to, the Source Code Analyzer (SCA).

  If you omit the file specification, the analysis file name has the
  name of the primary source file and a file type of ANA
  (filename.ANA).

  The compiler produces one analysis file for each source file that
  it compiles.  If you are compiling multiple files and you specify
  a particular name as the name of the analysis file, each analysis
  file is given that name (with an incremental version number).

  The default is /NOANALYSIS_DATA.

5    /ANNOTATIONS=option D=/NOANNOTATIONS

  Requests that annotations be added to the source listing (/LIST)
  indicating which of a set of optimizations were applied to
  particular parts of the source.

  Annotation options may exist for optimizations not supported on
  this platform.

  Annotations can be helpful in understanding why the compiler was
  unable to optimize a particular code sequence or to see what
  optimizations were performed.

  The default is /ANNOTATIONS=NONE which is equivalent to
  /NOANNOTATIONS.  Options ALL or NONE may be used to specify all or
  no annotations.

  CODE
    Annotates the machine code listing with descriptions of special
    instructions used for prefetching, alignment, and so on.

  DETAIL
    Provides an additional level of annotation detail, if available.

  FEEDBACK
    Annotates the source listing if profile-directed feedback
    optimizations were used.

  INLINING
    Annotates the source listing if code for a called procedure was
    expanded inline.

  LOOP_TRANSFORMS
    Annotates the source listing if advanced loop nest optimizations
    have been applied to improve cache performance.

  LOOP_UNROLLING
    Annotates the source listing if a loop was unrolled.

  PREFETCHING
    Annotates the source listing if special instructions were used to
    reduce memory latency.

  SHRINKWRAPPING
    Annotates the source listing if code establishing routine context
    was removed.

  SOFTWARE_PIPELINING
    Annotates the source listing if instructions have been rearranged
    to make optimal use of the processor's functional units.

  TAIL_CALLS
    Annotates the source listing if the optimization was used that
    indicates where a call from one routine to another can be
    replaced by a jump.

  TAIL_RECURSION
    Annotates the source listing if the optimization was used that
    eliminates unnecessary routine context for a recursive call.

  ALL
    This option is the same as specifying all the above options.

  NONE
    Places no annotations in the source listing (same as
    /NOANNOTATIONS.

6    /ARCHITECTURE=option (Alpha only) D=/ARCHITECTURE=GENERIC

  Determines the target generation of Alpha chip for which code
  will be generated for this program.  The /ARCHITECTURE qualifier
  uses the same options (keywords) as the /OPTIMIZE=TUNE (Alpha
  only) qualifier.

  Whereas the /OPTIMIZE=TUNE qualifier is primarily used by certain
  higher-level optimizations for instruction scheduling purposes, the
  /ARCHITECTURE qualifier determines the type of code instructions
  generated for the program unit being compiled.

  OpenVMS Version 7.1 and subsequent releases will provide an
  operating system kernel that includes an instruction emulator.
  This emulator allows new instructions, not implemented on the host
  processor chip, to execute and produce correct results.
  Applications using emulated instructions will run correctly, but
  may incur significant software emulation overhead at runtime.

  All Alpha processors implement a core set of instructions.  Certain
  Alpha processor versions include additional instruction extensions.

  The following /ARCHITECTURE options are supported:

  GENERIC
    Generates code that is appropriate for all Alpha processor
    generations.  This is the default.

    Programs compiled with the GENERIC option run all implementations
    of the Alpha architecture without any instruction emulation
    overhead.

  HOST
    Generates code for the processor generation in use on the system
    being used for compilation.

    Programs compiled with this option run on other implementations of
    the Alpha architecture might encounter instruction emulation
    overhead.

  EV4
    Generates code for the 21064, 21064A, 21066, and 21068
    implementations of the Alpha architecture.

    Programs compiled with the EV4 option run without instruction
    emulation overhead on all Alpha processors.

  EV5
    Generates code for some 21164 chip implementations of the Alpha
    architecture that use only the base set of Alpha instructions (no
    extensions).

    Programs compiled with the EV5 option run without instruction
    emulation overhead on all Alpha processors.

  EV56
    Generates code for some 21164 chip implementations that use the
    byte and word manipulation instruction extensions of the Alpha
    architecture.

    Programs compiled with the EV56 option may incur emulation
    overhead on EV4 and EV5 processors, but will still run correctly
    on OpenVMS Version 7.1 (or later) systems.

  EV6
    Generates code for the 21264 chip implementation that uses the
    following extensions to the base Alpha instruction set:  BWX
    (Byte/Word manipulation) and MAX (Multimedia) instructions,
    square root and floating-point convert instructions, and count
    instructions.

    Programs compiled with the EV6 option may incur emulation
    overhead on EV4, EV5, EV56, and PCA56 processors, but will still
    run correctly on OpenVMS Version 7.1 (or later) systems.

  EV67
    Generates code for chip implementations that use advanced
    instruction extensions of the Alpha architecture. This option
    permits the compiler to generate any EV67 instruction, including
    the following extensions to the base Alpha instruction set: BWX
    (Byte/Word manipulation), MVI (Multimedia) instructions, square
    root and floating-point convert extensions (FIX), and count
    extensions (CIX).

    Programs compiled with the EV67 option may incur emulation
    overhead on EV4, EV5, EV56, EV6 and PCA56 processors, but will
    still run correctly on OpenVMS Version 7.1 (or later) systems.

  PCA56
    Generates code for the 21164PC chip implementation that uses the
    byte and word manipulation instruction extensions and multimedia
    instruction extensions of the Alpha architecture.

    Programs compiled with the PCA56 option may incur emulation
    overhead on EV4, EV5, and EV56 processors, but still run
    correctly on OpenVMS Version 7.1 (or later) systems.

7    /ASSUME=(opt[,...])

  /[NO]ASSUME

  Specifies various assumptions, including the following:

   o  What the compiler can assume about program behavior without
      affecting correct results when it optimizes code.

   o  Whether the compiler should use certain code transformations
      that affect floating-point operations.  These changes may
      affect the accuracy of the program's results.

   o  Whether a single-precision constant assigned to a
      double-precision variable should be evaluated in single or
      double precision.

   o  Changes the directory where the compiler searches for files
      specified by an INCLUDE statement to the directory where the
      source files reside, not the current default directory.

  The defaults are /ASSUME=(ACCURACY_SENSITIVE, ALTPARAM,
  NOBUFFERED_IO, NOBYTERECL, NODUMMY_ALIASES, NOF77RTL,
  NOFP_CONSTANT, NOINT_CONSTANT, PROTECT_CONSTANTS,
  NOSOURCE_INCLUDE,NO64BIT_STRING_PARAMS).

  [NO]ACCURACY_SENSITIVE
    Specifies whether certain code transformations that affect
    floating-point operations are allowed.  These changes may or may
    affect the accuracy of the program's results.

    The default, /ASSUME=ACCURACY_SENSITIVE, directs the compiler to
    use only naive scalar rules for calculations.  This setting may
    prevent some optimizations.

    Specifying /ASSUME=NOACCURACY_SENSITIVE allows the compiler to
    reorder floating-point operations based on algebraic identities
    (inverses, associativity, and distribution).  For example, this
    allows the compiler to move divide operations outside of loops,
    thereby improving performance.  The numeric results can be
    slightly different from the default (/ASSUME=ACCURACY_SENSITIVE)
    because of the way intermediate results are rounded.

    Numeric results with /ASSUME=NOACCURACY_SENSITIVE are not
    categorically less accurate.  They can produce more accurate
    results for certain floating-point calculations, such as dot
    product summations.

    For example, the following expressions are mathematically
    equivalent but may not compute the same value using finite
    precision arithmetic.

       X = (A + B) - C
       X =  A + (B - C)

  [NO]ALTPARAM
    Allows or disallows the alternate syntax for PARAMETER
    statements.  The alternate form has no parentheses surrounding
    the list, and the form of the constant, rather than inplicit or
    explicit typing, determines the data type of the variable.  The
    default is /ASSUME=ALTPARAM.

  [NO]BUFFERED_IO
    Controls whether buffered I/O is used for all Fortran logical
    units opened for sequential writing.  The default is
    /ASSUME=NOBUFFERED_IO.

  [NO]BYTERECL
    Specifies (for unformatted data files) that the units for the
    OPEN statement RECL specifier (record length) value are in bytes,
    not longwords (four-byte units).  For formatted files, the RECL
    unit is always in bytes.

    INQUIRE returns RECL in bytes if the unit is not open.  INQUIRE
    returns RECL in longwords if the file is open for unformatted
    data and /ASSUME=BYTERECL is not specified; otherwise, it
    returns RECL in bytes.

  [NO]DUMMY_ALIASES
    Specifies whether dummy (formal) arguments are permitted to share
    memory locations with COMMON block variables or other dummy
    arguments.

    If you specify /ASSUME=DUMMY_ALIASES, the compiler assumes that
    dummy (formal) arguments to procedures may share memory locations
    with other dummy arguments or with variables shared through use
    association, host association, or common block use.

    These program semantics do not strictly obey the Fortran 95/90
    standard and slow performance.

    If you specify /ASSUME=NODUMMY_ALIASES, the default, the compiler
    does not need to make these assumptions, which results in better
    run-time performance.  However, omitting /ASSUME=DUMMY_ALIASES
    can cause some programs that depend on such aliases to fail or
    produce wrong answers.

    You only need to compile the called subprogram with
    /ASSUME=DUMMY_ALIASES.

    If you compile a program containing dummy aliasing with
    /ASSUME=NODUMMY_ALIASES in effect, the run-time behavior of the
    program will be unpredictable.  The run-time behavior will depend
    on the exact optimizations that are performed.  In some cases,
    normal results will occur.  However, in other cases, results will
    differ because the values used in computations involving the
    offending aliases will differ.

  [NO]F77RTL
    Specifies whether certain run-time I/O defaults are to match
    those of HP Fortran 77 compilers.

    If you specify /ASSUME=F77RTL, the following behavior changes:

      - In NAMELIST-directed output, the HP Fortran 77
        extension $ delimiters are used instead of the Fortran 90
        standard delimiters
      - PAD='NO' is the default when files are opened

    The default is /ASSUME=NOF77RTL, which specifies that Fortran 95
    semantics are to be followed.

  [NO]FP_CONSTANT
    Specifies whether a single-precision constant assigned to a
    double-precision variable will be evaluated in double precision.

    If you use /ASSUME=NOFP_CONSTANT (the default), a
    single-precision constant assigned to a double-precision variable
    is evaluated in single precision.  The Fortran 95/90 standard
    requires that the constant be evaluated in single precision.

    If you specify /ASSUME=FP_CONSTANT, a single-precision constant
    assigned to a double-precision variable is evaluated in double
    precision.

    Certain programs created for Fortran 77 compilers (including
    HP Fortran 77) may show different results with
    /ASSUME=FP_CONSTANT than when you use /ASSUME=NOFP_CONSTANT,
    because they rely on single-precision constants assigned to a
    double-precision variable to be evaluated in double precision.

    In the following example, if you specify /ASSUME=FP_CONSTANT,
    identical values are assigned to D1 and D2.  If you use
    /ASSUME=NOFP_CONSTANT, VSI Fortran will follow the standard
    and assign a less precise value to D1:

       REAL(KIND=8) D1,D2
       DATA D1 /2.71828182846182/   ! REAL(KIND=4) value expanded to double
       DATA D2 /2.71828182846182D0/ ! REAL(KIND=8) value assigned to double

  [NO]INT_CONSTANT
    Specifies whether Fortran 77 or Fortran 95/90 semantics are used
    to determine the type for integer constants.

    If you specify /ASSUME=INT_CONSTANT, integer constants take their
    type from the value, as interpreted by HP Fortran 77.

    If you specify /ASSUME=NOINT_CONSTANT, integer constants have
    Fortran 95/90 "default integer" type.  This is the default.

  [NO]MINUS0
    Specifies whether the compiler uses F95 or F90/FORTRAN 77
    standard semantics for the treatment of the IEEE floating value
    -0.0 in the SIGN intrinsic.

    If you specify /ASSUME=NOMINUS0, F90 (FORTRAN 77) standard
    semantics are used, where IEEE floating value -0.0 is treated as
    0.0.  This is the default.

    If /ASSUME=MINUS0 is specified, F95 standard semantics are used,
    where IEEE floating value -0.0 is treated as -0.0.  Note that the
    processor must be capable of distinguishing the difference
    between -0.0 and +0.0.

  [NO]PROTECT_CONSTANTS
    Specifies whether a copy of a constant actual argument is passed.

    /ASSUME=NOPROTECT_CONSTANTS causes a copy of a constant actual
    argument to be passed, so it can be modified by the called
    routine, even though the Fortran Standard prohibits such
    modification.  The constant is not modified in the calling
    routine.

    The default, /ASSUME=PROTECT_CONSTANTS, passes the constant
    actual argument.  Any attempt to modify it results in an error.

  [NO]SOURCE_INCLUDE
    Specifies the directory where the compiler searches for source
    files or text libraries specified by an INCLUDE statement.

    The default, /ASSUME=NOSOURCE_INCLUDE, indicates that the
    compiler should search in the current default directory.

    Specifying /ASSUME=SOURCE_INCLUDE causes the compiler to search
    the directory of the source file specified on the F90 command
    line, instead of the current default directory.

    You can specify additional directories for the compiler to search
    for include files or include libraries by using the /INCLUDE
    qualifier.

  [NO]64BIT_STRING_PARAMS
    Specifies whether all string variables uses as parameters
    should use 64-bit descriptors.

    The default, /ASSUME=NO64BIT_STRING_PARAMS, indicates that the
    compiler should generate 32-bit descriptors for string variables
    unless such a variable is individually specified for a 64-bit
    descriptor by using a compiler directive.

    Specifying /ASSUME=64BIT_STRING_PARAMS causes ALL string
    variables used as parameters to be passed/received by 64-bit
    descriptors. Note that an unwanted side effect of changing
    explicit or implicit parameters to system calls or the
    Fortran Runtime Library can occur, causing runtime errors.

    For more information, see the HP Fortran for OpenVMS User Manual.

8    /AUTOMATIC D=/NOAUTOMATIC

  /[NO]AUTOMATIC

  The /AUTOMATIC and /NOAUTOMATIC qualifiers are synonyms of
  /RECURSIVE or /NORECURSIVE (see /RECURSIVE in this Help file).
  This qualifier is provided for compatibility with HP Fortran 77
  (formerly Compaq Fortran 77).

9    /BY_REF_CALL=routine-list

  /BY_REF_CALL

  Causes character constants used as actual arguments in calls to
  routines to be passed by reference (%REF) instead of by descriptor
  (%DESCR).  This helps applications that pass quoted character
  constants to numeric dummy parameters, such as applications ported
  from OpenVMS VAX systems that rely on the OpenVMS VAX Linker, to
  change the argument passing mechanism for character constant actual
  arguments.

  The "routine-list" is a list of one or more routine names (in
  parentheses); it can contain "*" wild-carding.

  The default is to always pass character constant actual arguments
  by descriptor.

10    /CCDEFAULT=option D=/CCDEFAULT=DEFAULT

  Specifies the type of carriage control used for units that are
  connected by default to the terminal (units 5, 6, and *, and the
  units implicitly specified by PRINT and TYPE).

  If output from one of these units is redirected to a file,
  /CCDEFAULT is ignored.

  FORTRAN
    Specifies normal Fortran interpretation of the first character
    (CARRIAGECONTROL=FORTRAN).

  LIST
    Specifies one line feed between records (CARRIAGECONTROL=LIST).

  NONE
    Specifies no carriage control processing (CARRIAGECONTROL=NONE).

  DEFAULT
    Specifies that the compiler is to use the default
    carriage-control setting.

  The default is /CCDEFAULT=DEFAULT.

  The default setting can be affected by the /VMS qualifier:  if
  "/VMS /CCDEFAULT=DEFAULT" is specified, carriage control defaults
  to FORTRAN if the file is formatted, and the unit is connected to a
  terminal; if "/NOVMS /CCDEFAULT=DEFAULT" is specified, carriage
  control defaults to LIST.

11    /CHECK=(option[,...]) D=/CHECK=(NOARG,NOAR,NOBO,FOR,NOFP,NOFP_M,

                                      NOOUT,NOOV,POW,NOUN)
  /[NO]CHECK

  Controls whether the compiler performs certain error checking
  during program execution (run time).  The compiler produces extra
  code that performs the checks.

  [NO]ARG_INFO (I64 only)
    Controls whether run-time checking of the actual argument list
    occurs.  For actual arguments that correspond to declared formal
    parameters, the check compares the run-time argument type
    information for arguments passed in registers with the type that
    is expected. An informational message is issued at run time for
    each miscompare. Extra actual arguments or too few actual
    arguments are not reported.

    With the default, NOARG_INFO, no check is made.

  [NO]ARG_TEMP_CREATED
    Controls whether run-time checking occurs for actual arguments
    being copied into temporary storage before routine calls.

    With the default, /CHECK=NOARG_TEMP_CREATED, no check is
    performed.

    When /CHECK=ARG_TEMP_CREATED is specified, if a copy is made at
    run-time, an informative message is displayed.

  [NO]BOUNDS
    Controls whether run-time checking occurs for each dimension of
    an array reference or substring subscript reference to determine
    whether it is within the range of the dimension specified by the
    array or character variable declaration.

    With the default, NOBOUNDS, array bounds checking and substring
    checking do not occur.

  [NO]FORMAT
    Controls whether the run-time message number 61 (FORVARMIS) is
    displayed and halts program execution when the data type for an
    item being formatted for output does not match the format
    descriptor being used (such as a REAL data item with an I
    format).

    The default, FORMAT, causes FORVARMIS to be a fatal error and
    halts program execution.

    Specifying NOFORMAT ignores the format mismatch, which suppresses
    the FORVARMIS error and allows the program to continue.

    If you omit /NOVMS and omit /CHECK=NOFORMAT, the default is
    /CHECK=FORMAT.

    If you specify /NOVMS, the default is NOFORMAT (unless you also
    specify /CHECK=FORMAT).

  [NO]FP_EXCEPTIONS
    Controls whether run-time checking counts each operation that
    generates exceptional values.

    With the default, NOFP_EXCEPTIONS, no run-time messages are
    reported.

    Specifying FP_EXCEPTIONS requests reporting of the first two
    occurrences of each type of exceptional value and a summary
    run-time message at program completion that displays the number
    of times exceptional values occurred.  Consider using
    FP_EXCEPTIONS when the /IEEE_MODE qualifier allows generation of
    exceptional values.

    To limit reporting to only denormalized numbers (and not other
    exceptional numbers), specify UNDERFLOW instead of FP_EXCEPTIONS.

  [NO]FP_MODE (I64 only)
    Controls whether run-time checking of the current state of the
    processor's floating-point status register (FPSR) occurs.  For
    every call of every function or subroutine, the check will
    compare the current state of the FPSR register against the
    expected state.  That state is based on the /FLOAT, /IEEE_MODE and
    /ROUND qualifier values specified by the FORTRAN command.  An
    informational message is issued at run time for miscompares.

    With the default, NOFP_MODE, no check is made.

  [NO]OUTPUT_CONVERSION
    Controls whether run-time message number 63 (OUTCONERR) is
    displayed when format truncation occurs.

    Specifying /CHECK=NOOUTPUT_CONVERSION disables the run-time
    message (number 63) associated with format truncation.  The data
    item is printed with asterisks.

    When OUTPUT_CONVERSION is in effect and a number can not be
    output in the specified format field length without loss of
    significant digits (format truncation), the OUTCONERR (number 63)
    error occurs.

    If you omit /NOVMS and omit /CHECK=NOOUTPUT_CONVERSION, the
    default is OUTPUT_CONVERSION.

    If you specify /NOVMS, the default is NOOUTPUT_CONVERSION (unless
    you also specify /CHECK=OUTPUT_CONVERSION).

  [NO]OVERFLOW
    Controls whether run-time checking occurs for arithmetic overflow
    of all integer calculations.

    Specify OVERFLOW to request integer overflow checking.

    With the default, NOOVERFLOW, overflow checking does not occur.

    Real and complex calculations are always checked for overflow and
    are not affected by /NOCHECK.  Integer exponentiation is
    performed by a routine in the mathematical library.  The routine
    in the mathematical library always checks for overflow, even if
    /CHECK=NOOVERFLOW is specified.

  [NO]POWER
    Suppresses the run-time errors for 0.0**0.0 and
    <negative-value>**<integer-value-of-type-real>,
    so 0.0**0.0 is 1.0 and (-3.0)**3.0 is -27.0.  The default is
    /CHECK=POWER, which causes fatal run-time errors.

  [NO]UNDERFLOW
    Controls whether run-time messages are displayed for floating
    underflow (denormalized numbers) in floating-point calculations.

    Specify UNDERFLOW to request reporting of the first two
    occurrences of denormalized numbers and a summary run-time
    message at program completion that displays the number of times
    denormalized numbers occurred.

    With the default, NOUNDERFLOW, floating underflow messages are
    not displayed.  To check for all exceptional values (not just
    denormalized numbers), specify /CHECK=FP_EXCEPTIONS.

    For more information about exceptional floating-point values and
    exception handling, see the HP Fortran for OpenVMS User Manual.

  ALL
    Requests that all run-time checks (BOUNDS, FORMAT, FP_EXCEPTIONS,
    OUTPUT_CONVERSION, OVERFLOW, and UNDERFLOW) be performed.
    Specifying /CHECK and /CHECK=ALL are equivalent.

  NONE
    Requests no run-time checking.  Specifying /NOCHECK and
    /CHECK=NONE are equivalent.

12    /CONVERT=option D=/CONVERT=NATIVE

  Specifies the format of numeric unformatted data in a file.

  By default, an unformatted file containing numeric data is assumed
  to be in the same floating-point format used for memory
  representation or /CONVERT=NATIVE.  You set the floating-point
  format used for memory representation using the /FLOAT qualifier.

  There are other ways to specify format for numeric unformatted
  files:  you can specify an OpenVMS logical name, OPEN (CONVERT=),
  or OPTIONS/CONVERT.  The order of precedence is:

  1.  A logical name

      The form is FOR$CONVERTnnn, where "nnn" is the logical unit
      number (including leading zeros if necessary).

  2.  OPEN (CONVERT=)

  3.  OPTIONS/CONVERT

  4.  The qualifier /CONVERT

  The /CONVERT qualifier and OPTIONS/CONVERT affect all unit numbers
  used by the program, while a logical name and OPEN (CONVERT=)
  affect specific unit numbers.

  The /CONVERT qualifier specifies a default data-conversion type for
  all logical units opened in the program unit, either explicitly by
  an OPEN statement or implicitly by a READ, WRITE or other I/O
  statement (with the exception of DEFINE FILE).

  For more information on using unformatted data files, using OpenVMS
  logical names to specify CONVERT options, and information about the
  ranges of the various data types, see the HP Fortran for OpenVMS
  User Manual.

  BIG_ENDIAN
    Specifies that numeric data in unformatted files is in big endian
    integer format (INTEGER declarations of the appropriate size) and
    IEEE floating-point format (REAL and COMPLEX declarations of the
    appropriate size).

    INTEGER(KIND=1) data is the same for little endian and big
    endian.

  CRAY
    Specifies that numeric data in unformatted files is in big endian
    integer format (INTEGER declarations of the appropriate size) and
    CRAY floating-point format (REAL and COMPLEX declarations of the
    appropriate size).

  FDX
    Specifies that numeric data in unformatted files is in little
    endian integer format (INTEGER declarations of the appropriate
    size).  It also specifies VAX floating-point format
    F_floating (for size REAL(KIND=4) and COMPLEX(KIND=4)),
    D_floating (for size REAL(KIND=8) and COMPLEX(KIND=8)), and IEEE
    X_floating (for size REAL(KIND=16)).

  FGX
    Specifies that numeric data in unformatted files is in little
    endian integer format (INTEGER declarations of the appropriate
    size).  It also specifies VAX floating-point format
    F_floating (for size REAL(KIND=4) and COMPLEX(KIND=4)) and
    G_floating (for size REAL(KIND=8) and COMPLEX(KIND=8)), and IEEE
    X_floating (for size REAL(KIND=16)).

  IBM
    Specifies that numeric data in unformatted files is in big endian
    integer format (INTEGER declarations of the appropriate size) and
    IBM System\370 floating-point format (REAL and COMPLEX
    declarations of the appropriate size).

  LITTLE_ENDIAN
    Specifies that numeric data in unformatted files is in little
    endian integer format (INTEGER declarations of the appropriate
    size) and IEEE IBM System\370 floating-point format (REAL and
    COMPLEX declarations of the appropriate size).

    INTEGER(KIND=1) data is the same for little endian and big
    endian.

  NATIVE
    Specifies that numeric data in unformatted files is determined by
    the floating-point format representation in memory, which is
    specified using the /FLOAT qualifier.  If you omit the /FLOAT
    qualifier and specify the obsolete /[NO]G_FLOATING qualifier, the
    format specified by the /[NO]G_FLOATING qualifier is used.

    This is the default.

  VAXD
    Specifies that numeric data in unformatted files is in little
    endian integer format (INTEGER declarations of the appropriate
    size).  It also specifies HP VAX floating-point format
    F_floating (for size REAL(KIND=4) and COMPLEX(KIND=4)) and
    D_floating (for size REAL(KIND=8) and COMPLEX(KIND=8)), and
    H_floating (for size REAL(KIND=16)).

  VAXG
    Specifies that numeric data in unformatted files is in little
    endian integer format (INTEGER declarations of the appropriate
    size).  It also specifies HP VAX floating-point format
    F_floating (for size REAL(KIND=4) and COMPLEX(KIND=4)) and
    G_floating (for size REAL(KIND=8) and COMPLEX(KIND=8)), and
    H_floating (for size REAL(KIND=16)).

13    /D_LINES D=/NOD_LINES

  /[NO]D_LINES

  Specifies that the compiler should treat fixed-format lines that
  contain a D in column 1 as source code rather than comment lines.

  The default is /NOD_LINES, which means that fixed-format lines with
  a D in column 1 are treated as comments.

  This qualifier is ignored for free-format source code.

14    /DEBUG=(option[,...]) D=/DEBUG=(NOSYMBOLS,TRACEBACK)

  /[NO]DEBUG

  Requests that the object module contain information for use by the
  OpenVMS Debugger and the run-time error traceback mechanism.

  [NO]SYMBOLS
    Controls whether the compiler provides the debugger with local
    symbol definitions for user-defined variables, arrays (including
    dimension information), structures, and labels of executable
    statements.

  [NO]TRACEBACK
    Controls whether the compiler provides an address correlation
    table so that the debugger and the run-time error traceback
    mechanism can translate virtual addresses into source program
    routine names and compiler-generated line numbers.

  ALL
    Requests that the compiler provide both local symbol definitions
    and an address correlation table.

  NONE
    Requests that the compiler provide no debugging information.

  If you omit the /DEBUG qualifier, the default is
  /DEBUG=(TRACEBACK,NOSYMBOLS).  If you specify /DEBUG without any
  keywords, it is the same as /DEBUG=ALL or
  /DEBUG=(TRACEBACK,SYMBOLS).  The /NODEBUG, /DEBUG=NONE, and
  /DEBUG=(NOTRACEBACK,NOSYMBOLS) qualifiers are equivalent.

                                 NOTE

          It is strongly recommended that you use /NOOPTIMIZE
          when  using  the  /DEBUG  qualifier.  Optimizations
          performed  by  the  compiler  can   cause   several
          different  kinds  of unexpected behavior when using
          the OpenVMS Debugger.

  For more information on debugging and traceback, see the HP
  Fortran for OpenVMS User Manual.

15    /DIAGNOSTICS[=file-spec] D=/NODIAGNOSTICS

  /[NO]DIAGNOSTICS

  Controls whether the compiler creates a file containing compiler
  messages and diagnostic information.

  The default is /NODIAGNOSTICS.

  If you omit the file specification, the diagnostics file has the
  name of your source file and a file type of DIA.

  The diagnostics file is reserved for use with HP layered
  products such as, but not limited to, the Language Sensitive Editor
  (LSE).

16    /DOUBLE_SIZE[=n] D=/DOUBLE_SIZE=64

  /DOUBLE_SIZE

  The /DOUBLE_SIZE qualifier lets you specify the data size for
  floating-point DOUBLE PRECISION data declarations.  You can specify
  64 or 128 for "n".

  To request that all DOUBLE PRECISION declarations, constants,
  functions, and intrinsic procedures use the REAL(KIND=16)
  extended-precision data, specify /DOUBLE_SIZE=128.  REAL(KIND=16)
  data is stored in memory using X_floating format.

  The default is /DOUBLE_SIZE=64, which specifies that DOUBLE
  PRECISION entities use REAL(KIND=8) (64-bit) double-precision data.
  To select the floating-point format used in memory for 64-bit
  REAL(KIND=8) data, use the /FLOAT qualifier.

17    /ERROR_LIMIT[=n] D=/ERROR_LIMIT=30

  /[NO]ERROR_LIMIT

  Specifies the maximum number of E-level or F-level compiler errors
  allowed for a given file specified on the F90 command line.

  Error counts are accumulated across a sequence of compilation
  units.  If you specify /ERROR_LIMIT=n, the compilation can have up
  to n - 1 errors without terminating the compilation.  When the
  error limit is reached, compilation is terminated.

  The /ERROR_LIMIT=0 option is equivalent to ERROR_LIMIT=1.  If you
  specify /NOERROR_LIMIT, there is no limit on the number of errors
  that are allowed.

  By default, execution of the compiler is terminated when the 30th
  E-level or F-level error (equivalent to /ERROR_LIMIT=30) is issued.

  When the error limit is surpassed, only compilation on the current
  comma-list element is terminated; the compiler will proceed to
  compile any other comma-list element.  For example, consider the
  following:

     $ FORT A,B,C

  If comma-list element A has more than 30 E- or F-level errors, its
  compilation is terminated, but the compiler proceeds to compile
  elements B and C.

18    /EXTEND_SOURCE D=/NOEXTEND_SOURCE

  /[NO]EXTEND_SOURCE

  Controls whether the compiler increases the length of Fortran
  statement fields in fixed-format source programs to column 132,
  instead of column 72 (the default).

  The default is /NOEXTEND_SOURCE.

  You can also specify this qualifier using the OPTIONS statement.

  This qualifier is ignored for free-format source code.

19    /F77 (Alpha only) D=/F77

  /[NO]F77

  Controls whether the compiler uses FORTRAN-77 interpretation rules
  for those statements that have a meaning incompatible with
  FORTRAN-66.  See the HP Fortran for OpenVMS User Manual for a
  discussion of these incompatibilities.

  The default is /F77.  If you specify /NOF77, the compiler selects
  FORTRAN-66 interpretations in cases of incompatibility.

  If you omit /NOF77, DO loops whose lower range exceeds the upper
  range are not executed.

  You can also specify this qualifier using the OPTIONS statement.

20    /FAST

  /FAST
  Sets the following qualifiers that usually improve run-time
  performance:  /ALIGNMENT=(NATURAL, SEQUENCE), /ARCHITECTURE=HOST,
  /ASSUME=NOACCURACY_SENSITIVE, /MATH_LIBRARY=FAST (Alpha only),
  /OPTIMIZE=(TUNE=HOST) (Alpha only).

  The default is /NOFAST.

  If qualifier /STANDARD is specified, /FAST does not set
  /ALIGNMENT=(NATURAL, SEQUENCE).

  Note that programs compiled with HOST architecture and tuning
  optimizations may run slowly on systems with earlier generations of
  Alpha processors than the compiling host system.

21    /FLOAT=option D=/FLOAT=IEEE_FLOAT (I64)

                                  D=/FLOAT=G_FLOAT (Alpha)
  Specifies the floating-point data format to be used in memory for
  REAL or COMPLEX data.

  For performance reasons, consider specifying the same
  floating-point memory format as the floating-point format used by
  unformatted files the program will access if the data falls within
  the acceptable range.

  To specify a floating-point format (such as big endian) for all
  unformatted files opened by the program, use the /CONVERT
  qualifier.  To allow the same program to use different
  floating-point formats, you must use predefined logical names or
  the OPEN (CONVERT=) keyword to specify the format for specific unit
  numbers, as described in the HP Fortran for OpenVMS User Manual.

  You can only specify one qualifier option.

  D_FLOAT
    Specifies that the memory format for REAL(KIND=4) and
    COMPLEX(KIND=4) data is VAX F_floating and that the memory format
    for REAL(KIND=8) and COMPLEX(KIND=8) data is VAX D_floating.
    This option is the same as the obsolete qualifier /NOG_FLOATING.

                                  NOTE

            OpenVMS  VAX  systems  support   D_floating   and
            G_floating    implementations   of   the   DOUBLE
            PRECISION (REAL(KIND=8))  data  type  in  memory.
            OpenVMS  Alpha  systems  can  store  REAL(KIND=8)
            floating-point  data  in  memory  in  D_floating,
            G_floating, or T_floating format.

            Because  the  Alpha  instruction  set  does   not
            support  D_floating computations, D_floating data
            is converted to G_floating format for  arithmetic
            computations   and   then   converted   back   to
            D_floating format.   For  programs  that  perform
            many  REAL(KIND=8) computations, using D_floating
            data  is  slower   than   using   G_floating   or
            T_floating  data and the results will differ from
            VAX D_floating computations and results.

            Unless a program uses unformatted data  files  in
            D_floating  format, do not use the /FLOAT=D_FLOAT
            option.  If range and accuracy constraints do not
            disallow  the  use of the other REAL(KIND=8) data
            types, consider converting  existing  unformatted
            files  that  contain  D_floating  data to another
            format,  such  as  G_floating,   T_floating,   or
            X_floating  to  optimize  performance.  (For more
            information, see the HP Fortran for OpenVMS User
            Manual.)

  G_FLOAT
    Specifies that the memory format for REAL(KIND=4) and
    COMPLEX(KIND=4) data is VAX F_floating and that REAL(KIND=8) and
    the memory format for COMPLEX(KIND=8) data is VAX G_floating.
    This option is the same as the obsolete qualifier /G_FLOATING.

                                  NOTE

                Because the I64 instruction set does not support
 	       F_floating, D_floating, or G_floating computations,
 	       data in those formats is converted to IEEE format
                (S_floating or T_floating) for arithmetic
                computations and then converted back to
                the original format.  For programs that perform
                many REAL (KIND=4 or KIND=8) computations, using
                F_floating, D_floating, or G_floating data will be
                slower than using S_floating or T_floating  data.
                The results may differ from slightly from Alpha
                F_floating, D_floating, or G_floating computations
                and results. In particular, exceptions raised by
                the calculation may be different, and some
                exceptions may no longer occur, while new
                exceptions may appear.

  This the default floating-point format for Alpha systems.

  IEEE_FLOAT
    Specifies that the memory format for REAL(KIND=4) and
    COMPLEX(KIND=4) data is IEEE S_floating and the memory format for
    REAL(KIND=8) and COMPLEX(KIND=8) data is IEEE T_floating.

    This format lets you use the /IEEE_MODE qualifier.

    This is the default floating-point format for I64 systems.

  If your program requires the G_floating form of double precision
  for its correct operation (it uses a range larger than 10**38), you
  should use the /FLOAT qualifier in an OPTIONS statement in your
  source program.

  You should not mix floating data type formats in routines that pass
  single-precision or double-precision quantities amongst themselves.

  For more information on floating-point data types, see the HP
  Fortran for OpenVMS User Manual.

22    /GRANULARITY=option D=/GRANULARITY=QUADWORD

  Controls the size of data that can be safely accessed from
  different threads.  You do not need to specify this option for
  local data access by a single process, unless asynchronous write
  access from outside the user process might occur.  The default is
  /GRANULARITY=QUADWORD.

  Data that can be written from multiple threads must be declared as
  VOLATILE (so it is not held in registers).  To ensure alignment in
  common blocks and derived-type and record structures, use the
  /ALIGNMENT qualifier.

  You can only specify one of the qualifier options.

  BYTE
    Ensures that all data (one byte or greater) can be accessed from
    different threads sharing data in memory.  This option will slow
    run-time performance.

  LONGWORD
    Ensures that naturally aligned data of longword size (4 bytes) or
    greater can be accessed safely from different threads sharing
    data in memory.

    When this option is in effect, attempts to access smaller size
    data or misaligned data can result in data items that are
    inconsistently updated for multiple threads.

  QUADWORD
    Ensures that naturally aligned data of quadword size (8 bytes)
    can be accessed safely from different threads sharing data in
    memory.  This is the default.

    When this option is in effect, attempts to access smaller size
    data or misaligned data can result in data items that are
    inconsistently updated for multiple threads.

23    /IEEE_MODE=option D=/IEEE_MODE=DENORM (I64)

                            D=/IEEE_MODE=FAST (Alpha)

  Specifies the arithmetic exception handling used for floating-point
  calculations, such as for exceptional values.  It also controls the
  precision of exception reporting (like /SYNCHRONOUS_EXCEPTIONS
  (Alpha only)).

  Exceptional values are associated with IEEE arithmetic and include
  Infinity (+ and -) values, Not-A-Number (NaN) values, invalid data
  values, and denormalized numbers. (See the HP Fortran for OpenVMS
  User Manual.)

  Use the /IEEE_MODE qualifier to control:

   o  Whether exceptional values cause program termination or
      continuation

   o  Whether exception reporting is precise

   o  Whether underflowed (denormalized) values are set to zero

  This qualifier only applies to arithmetic calculations when:

   o  You omit the /MATH_LIBRARY=FAST (Alpha only) qualifier (or
      /FAST) qualifier.  Using /MATH_LIBRARY=FAST provides limited
      handling of exceptional values of arguments to and results from
      VSI Fortran intrinsic functions.

   o  You specify the /FLOAT=IEEE_FLOAT qualifier to request IEEE
      S_floating (REAL(KIND=4)) and T_floating (REAL(KIND=8)) data.

  If you specify /FLOAT=G_FLOAT (the default on Alpha) or /FLOAT=D_FLOAT,
  only the default (/IEEE_MODE=FAST) can be used. Because X_floating data
  (REAL(KIND=16)) has no denormalized range, DENORM_RESULTS is
  equivalent to UNDERFLOW_TO_ZERO for X_floating data.

                                NOTE

            You should choose the value for the /IEEE_MODE
            qualifier based on the floating-point semantics
            your application requires, not on possible
            performance benefits.

  FAST
    Specifies that the program should stop if any exceptional values
    are detected.

    When the program encounters or calculates any exceptional values
    (Infinity (+ or -), NaN, or invalid data) in a calculation, the
    program stops and displays a message.  This allows the fastest
    run-time performance.

    Denormalized values calculated in an arithmetic expression are
    set to zero.  Denormalized values encountered as variables in an
    arithmetic expression (including constant values) are treated as
    invalid data (an exceptional value), which stops the program.

    Exceptions are not reported until one or more instructions after
    the instruction that caused the exception.  To have exceptions
    reported at the instruction that caused the exception when using
    /IEEE_MODE=FAST, also specify /SYNCHRONOUS_EXCEPTIONS (Alpha
    only).

    /IEEE_MODE=FAST is the default on Alpha systems.

  UNDERFLOW_TO_ZERO
    Specifies that the program should continue if any exceptional
    values are detected and that calculated denormalized (underflow)
    values should be set to zero.

    When the program encounters an exceptional value (Infinity (+ or
    -), NaN, or invalid data) in an arithmetic expression, the
    program continues.  It also continues when the result of a
    calculation is an exceptional value.

    Calculated denormalized values are set to zero.  This prevents
    the denormalized number from being used in a subsequent
    calculation (propagated).

    Exceptions are reported at the instruction that caused the
    exception (same as /SYNCHRONOUS_EXCEPTIONS).  This allows precise
    run-time reporting of exceptions for those programs that generate
    exceptional values, but slows program run-time performance.

    Using UNDERFLOW_TO_ZERO allows programs to handle exceptional
    values, but does not propagate numbers in the denormalized range.

    To request run-time messages for arithmetic exceptions, specify
    the /CHECK=FP_EXCEPTIONS qualifier.

  DENORM_RESULTS
    Specifies that the program should continue if any exceptional
    values are detected and that calculated denormalized values
    should be left as is (allows underflow).

    When the program encounters an exceptional value (Infinity (+ or
    -), NaN, or invalid data) in an arithmetic expression, the
    program continues.  It also continues when the result of a
    calculation is an exceptional value.

    Calculated denormalized values are left as denormalized values.
    When a denormalized number is used in a subsequent arithmetic
    expression, it requires extra software-assisted handling and
    slows performance.  A program that generates denormalized numbers
    will be slower than the same program compiled using
    /IEEE_MODE=UNDERFLOW_TO_ZERO.

    Exceptions are reported at the instruction that caused the
    exception (same as /SYNCHRONOUS_EXCEPTIONS).  This allows precise
    run-time reporting of exceptions for those programs that generate
    exceptional values, but slows program run-time performance.

    Using DENORM_RESULTS allows programs to handle exceptional
    values, including allowing underflow of denormalized numbers.

    To request run-time messages for arithmetic exceptions, specify
    the /CHECK=FP_EXCEPTIONS qualifier.  To request run-time messages
    for only those arithmetic exceptions related to denormalized
    numbers, specify the /CHECK=UNDERFLOW qualifier.

    /IEEE_MODE=DENORM_RESULTS is the default on I64 systems.

24    /INCLUDE=(dir[,...]) D=NOINCLUDE

  /[NO]INCLUDE

  Specifies an additional directory for the VSI Fortran compiler
  to search for module files or include files:

   o  Module files are specified by a USE statement.  The module
      files have a file type of F90$MOD and are created by the HP
      Fortran compiler.

   o  Include files are specified by an INCLUDE statement.  The
      include files have a file type like other VSI Fortran source
      files (F90, FOR, or F) in the following form:

         INCLUDE 'name'  or   INCLUDE 'name.ext'

      You can also include library modules from a text library, where
      the name of the module appears within parentheses ((name)).  If
      the INCLUDE statement specifies an explicit device and/or
      directory, only that directory is searched.

  Directories are searched in the following order:

  1.  The current directory (if /ASSUME=SOURCE_INCLUDE is omitted) or
      the directory where the source file resides (if
      /ASSUME=SOURCE_INCLUDE is specified).

  2.  One or more directories specified by the /INCLUDE qualifier.

  3.  The standard system location.  To prevent searching in this
      directory, specify /NOINCLUDE.

  To limit the compiler's search to the current directory (or the
  directory where the source file resides), specify /NOINCLUDE.

  To control the searching for only text libraries (not module files
  and included source files), you can use the logical name
  F90$LIBRARY or FORT$LIBRARY.  Like other OpenVMS logical names, the
  name can specify the location for only your process or for multiple
  processes (including system-wide).

  For example, you can specify additional directories
  DISKA:[P_MODULE.F90] and DISKB:[F_COMMON.F90] with the /INCLUDE
  qualifier as follows:

   $ F90 PROJ_M.F90 /INCLUDE=(DISKA:[P_MODULE.F90],DISKB:[F_COMMON.F90])

  If you specify multiple directories, the order of the directories
  (and their devices) in the /INCLUDE qualifier determines the
  directory search order.

25    /INTEGER_SIZE=n D=/INTEGER_SIZE=32

  /INTEGER_SIZE

  Controls how the compiler interprets INTEGER or LOGICAL
  declarations that do not have a specified length.  The default is
  /INTEGER_SIZE=32.

  You can specify the following values:

  /INTEGER=16    INTEGER declarations are interpreted
                 as INTEGER(KIND=2) and LOGICAL declarations
                 as LOGICAL(KIND=2).  This is the same as
                 the obsolete /NOI4 qualifier.

  /INTEGER=32    INTEGER declarations are interpreted
                 as INTEGER(KIND=4) and LOGICAL declarations
                 as LOGICAL(KIND=4).  This is the same as
                 the obsolete /I4 qualifier.

  /INTEGER=64    INTEGER declarations are interpreted
                 as INTEGER(KIND=8) and LOGICAL declarations
                 as LOGICAL(KIND=8).

  You must explicitly declare INTEGER(KIND=1) data.

                                 NOTE

          To improve performance, use /INTEGER_SIZE=32 rather
          than  /INTEGER_SIZE=16  and  declare  variables  as
          INTEGER(KIND=4) (or  INTEGER(KIND=8))  rather  than
          INTEGER(KIND=2)  or  INTEGER(KIND=1).   For logical
          data,  avoid  using  /INTEGER_SIZE=16  and  declare
          logical  variables  as  LOGICAL(KIND=4) rather than
          LOGICAL(KIND=2) or LOGICAL(KIND=1).

26    /LIBRARY

  Specifies that a file is a text library file.

  The /LIBRARY qualifier can be specified on one or more text library
  files in a list of files concatenated by plus signs (+).  At least
  one of the files in the list must be a nonlibrary file.  The
  default file type is TLB.

  The use of text libraries is discussed at length in the HP Fortran
  for OpenVMS User Manual.

27    /LIST[=file-spec] D=/NOLIST

  /[NO]LIST

  Requests a source listing file.  You can request additional listing
  information using the /MACHINE_CODE and /SHOW qualifiers.

  The default is /LIST for a batch process, and /NOLIST for an
  interactive process.

  You can include a file specification for the listing file.  If you
  omit the file specification, the listing file has the name of the
  first source file and a file type of LIS.

  The default depth of a page in a listing file is 66 lines.  To
  modify the default, assign the new number to the logical name
  SYS$LP_LINES using the DCL command DEFINE.  For example, the
  following DCL command sets the page depth at 88 lines:

     $ DEFINE SYS$LP_LINES 88

  The valid number of lines per page ranges from 30 to a maximum of
  255.  The definition can be applied to the entire system by using
  the command DEFINE/SYSTEM.

  In interactive mode, the compiler does not produce a listing file
  unless you include the /LIST qualifier.  In batch mode, the
  compiler produces a listing file by default.  In either case, the
  listing file is not automatically printed; you must use the PRINT
  command to obtain a line printer copy of the listing file.

  If a source line contains a form-feed character, that line is
  printed but the form-feed character is ignored (does not
  generate a new page).

  If a source line of length 1 contains a Ctrl/Z character, the
  source code listing contains a blank line in place of the Ctrl/Z
  character.

  Any other nonprinting ASCII characters encountered in HP
  Fortran source files are replaced by a space character and a
  warning message appears.

  For more information on the format of listing files, see the HP
  Fortran for OpenVMS User Manual.

28    /MACHINE_CODE D=/NOMACHINE_CODE

  /[NO]MACHINE_CODE

  Controls whether the listing file includes a symbolic
  representation of the OpenVMS Alpha object code generated by the
  compiler.  Generated code and data are represented in a form
  similar to a MACRO assembly code listing.  The code produced by the
  /MACHINE_CODE qualifier is for informational purposes only.  It is
  not intended to be assembled and is not supported by the MACRO
  assembler.

  If a listing file is not being generated, the /MACHINE_CODE
  qualifier is ignored.

  The default is /NOMACHINE_CODE.

  See the HP Fortran for OpenVMS User Manual for a description of
  the format of a machine code listing.

29    /MATH_LIBRARY=option (Alpha only) D=/MATH_LIBRARY=ACCURATE

  /MATH_LIBRARY

  Controls selection of math library routines to provide accurate or
  fast results for VSI Fortran intrinsic functions, such as SQRT.

  The default is /MATH_LIBRARY=ACCURATE.

  This qualifier applies only to IEEE data types (when you specify
  /FLOAT=IEEE_FLOAT).

  You can only specify one of the qualifier options.

  ACCURATE
    Causes the compiler to produce the very accurate results and
    error checking expected of quality compiler products.  It uses
    the standard set of math library routines for the applicable
    intrinsics.

    The standard math library routines are designed to obtain very
    accurate "near correctly rounded" results and provide the
    robustness needed to check for IEEE exceptional argument values,
    rather than achieve the fastest possible run-time execution
    speed.  Using /MATH_LIBRARY=ACCURATE allows user control of
    arithmetic exception handling with the /IEEE_MODE qualifier.

  FAST
    Causes the compiler to use versions of certain math library
    routines that perform faster computations than the standard, more
    accurate math library routines, but with slightly less fractional
    accuracy and less reliable arithmetic exception handling.  Using
    /MATH_LIBRARY=FAST allows certain math library functions to get
    significant performance improvements when the applicable
    intrinsic function is used.

    If you specify /MATH_LIBRARY=FAST, the math library routines do
    not necessarily check for IEEE exceptional values and the
    /IEEE_MODE qualifier is ignored.

    When you use MATH_LIBRARY=FAST, you should carefully check the
    calculated output from your program to verify it is not relying
    on the full fractional accuracy of the floating-point data type
    to produce correct results.  You should also verify that the
    calculated output is not producing unexpected exceptional values
    (exception handling is indeterminate).

    Programs that do not produce acceptable results with
    /MATH_LIBRARY=FAST and single-precision data might produce
    acceptable results if they are modified (or compiled) to use
    double-precision data.

    The specific intrinsic routines that have special fast math
    routines depend on the version of the OpenVMS Alpha operating
    system in use.  Allowed error bounds vary with each routine.

30    /MODULE=directory D=/NOMODULE

  /[NO]MODULE

  Controls where module files (.F90$MOD) are placed.  If you omit
  this qualifier or specify /NOMODULE, the .F90$MOD files are placed
  in your current default directory.

  If /MODULE is specified, .F90$MOD files are placed in the location
  indicated.

31    /NAMES=option D=/NAMES=UPPERCASE

  /NAMES

  Specifies how the compiler treats the case of identifiers and how
  it represents external (global) names to the linker.  HP
  recommends using the ATTRIBUTES ALIAS directive rather than /NAMES
  to specify the form of external names.

  UPPERCASE
    Tells the compiler to ignore case differences in identifiers and
    to convert external names to uppercase.  This is the default.

  LOWERCASE
    Tells the compiler to ignore case differences in identifiers and
    to convert external names to lowercase.

  AS_IS
    Tells the compiler to recognize and distinguish case differences
    in identifiers, including the names of NAMELIST groups and
    variables in those groups, and to preserve the case of external
    names.  This option also prevents the compiler from recognizing
    intrinsic functions unless they are specified in uppercase.

32    /OBJECT[=file-spec] D=/OBJECT

  /[NO]OBJECT

  Specifies the name of the object file or prevents object file
  creation.

  The default is /OBJECT.  If you omit the file specification, the
  object file has the name of the first source file and a file type
  of OBJ.

  Use the negative form, /NOOBJECT, to suppress object code (for
  example, when you want to test only for compilation errors in the
  source program).

33    /OLD_F77 (Alpha only)

  Specifies to use the Compaq Fortran 77 compiler.  The default is
  to use the VSI Fortran (95/90 language) compiler.

  If you specify the /OLD_F77 qualifier, certain qualifiers
  associated with Fortran 95 and Fortran 90 features, Fortran 95 and
  90 standards checking, and certain optimization keywords will be
  ignored.

  If specified, the /OLDF77 qualifier must immediately follow the
  FORTRAN verb on the command line.  For help on Fortran 77 options,
  see HELP F77.

  If you wish to change the default compiler invoked by the FORTRAN
  command, use one of the following command definition files:

   o  SYS$LIBRARY:FORT$FORTRAN-F77.CLD

      Specifies that the FORTRAN command invokes the HP Fortran
      77 compiler and that the F90 command invokes the HP Fortran
      compiler.

   o  SYS$LIBRARY:FORT$FORTRAN-F95.CLD

      Specifies that the FORTRAN and F90 commands invoke the HP
      Fortran compiler and that the FORTRAN/OLD_F77 command invokes
      the HP Fortran 77 compiler.  This is the default.

  To change the command definition for your process, use the command:

     $ SET COMMAND SYS$LIBRARY:FORT$FORTRAN-Fxx

  where "xx" is either 77 or 95.

  To change the definition for all users on the system, use the
  command:

     $ SET COMMAND /TABLES=SYS$LIBRARY:DCLTABLES -
                   /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES -
                   SYS$LIBRARY:FORT$FORTRAN-Fxx
     $ INSTALL REPLACE SYS$LIBRARY:DCLTABLES

  The INSTALL REPLACE command must also be executed on any other
  OpenVMS Alpha nodes of the cluster.  Users must log out and in
  again to see the new definitions.

34    /OPTIMIZE[=(opt[,...])] D=/OPTI=(LEV=4,INL=SPE,NOL,NOP,TUN=GEN,UNR=0)

  /[NO]OPTIMIZE

  Controls how the compiler produces optimized code.

  The default is /OPTIMIZE, which is the same as /OPTIMIZE=(LEVEL=4,
  INLINE=SPEED, NOLOOPS, NOPIPELINE, TUNE=GENERIC, UNROLL=0).  For a
  debugging session, use the negative form (/NOOPTIMIZE or
  /OPTIMIZE=LEVEL=0) to ensure that the debugger has sufficient
  information to locate errors in the source program.

  In most cases, using /OPTIMIZE will make the program execute
  faster.  As a side effect of getting the fastest execution speeds,
  using /OPTIMIZE can produce larger object modules and longer
  compile times than /NOOPTIMIZE.

  To allow full interprocedural optimization when compiling multiple
  source modules, consider separating source file specifications with
  plus signs (+), so the files are concatenated and compiled as one
  program.  Full interprocedural optimization can reduce overall
  program execution time.  Consider not concatenating source files
  when the size of the source files is excessively large and the
  amount of memory or disk space is limited.

  INLINE=keyword
    Controls the inlining performed by the compiler.  The keyword can
    be any of the following:

        Keyword   Meaning
        -------   -------
        NONE      Suppresses all inlining of routines.

        MANUAL    This is the same as INLINE=NONE for VSI Fortran.

        SIZE      Inlines calls that the compiler feels will improve
                  run-time performance without significantly increasing
                  the size of the program.

        SPEED     Inlines calls that the compiler feels will improve
                  run-time performance, even where it may significantly
                  increase the size of the program.

        ALL       Inlines every procedure call that can be inlined
                  while still generating correct code.  Recursive
                  routines will not cause an infinite loop at
                  compile time.

    /OPTIMIZE=INLINE is equivalent to /OPTIMIZE=(INLINE=SPEED).
    /OPTIMIZE=NOINLINE is equivalent to /OPTIMIZE=(INLINE=NONE)

    For all optimization levels other than 0, the inlining mode is
    the one specified on the command line.  If no inlining mode is
    explicitly specified, the compiler derives it from the
    optimization level, as follows:

        Level       Inlining Mode
        -----       -------------
        0           NONE
        1           NONE
        2           NONE
        3           NONE
        4           SPEED
        5           SPEED

  LEVEL=n
    Controls the level of optimization performed by the compiler.
    The "n" is an integer in the range 0 through 5.  LEVEL=0 is the
    same as /NOOPTIMIZE; LEVEL=4 is the same as /OPTIMIZE.  The
    following explains the level numbers:

        Level Number  Meaning
        ------------  -------
        LEVEL=0       Disables nearly all optimizations.

        LEVEL=1       Enables local optimizations within the
                      source program unit and recognition of common
                      subexpressions.

        LEVEL=2       Enables global optimizations and optimizations
                      performed with LEVEL=1.

        LEVEL=3       Enables additional global optimizations that
                      improve speed (at the cost of extra code size)
                      and optimizations performed with LEVEL=2.

        LEVEL=4       Enables interprocedural analysis, automatic
                      inlining of small procedures (with heuristics
                      limiting the amount of extra code), and
                      optimizations performed with LEVEL=3. LEVEL=4
                      is the default.

        LEVEL=5       Activates software pipelining, loop transformation
                      optimizations, and optimizations performed with
                      LEVEL=4.  Loop transformation optimizations apply
                      to array references within loops. Software pipe-
                      lining allows instructions within a loop to
                      "wrap around" and execute in a different itera-
                      tion of the loop.  In certain cases, loop trans-
                      formation and software pipelining can improve
                      run-time performance.

    For more information about these LEVEL numbers, see the HP Fortran
    for OpenVMS User Manual.

  [NO]LOOPS
    Specifies a group of loop transformation optimizations that apply
    to array references within loops.  These optimizations can
    improve the performance of the memory system and usually apply to
    multiply nested loops.

    The loops chosen for loop transformation optimizations are always
    "counted" loops (which include DO or IF loops, but not DO WHILE
    loops).

    Conditions that typically prevent the loop transformation
    optimizations from occurring include subprogram references that
    are not inlined (such as an external function call), complicated
    exit conditions, and uncounted loops.

    The types of optimizations associated with this option are:

      Loop blocking
      Loop distribution
      Loop fusion
      Loop interchange
      Loop scalar replacement
      Outer loop unrolling

    This type of optimization can be specified for /OPTIMIZE=LEVEL=2
    or higher; it is performed by default if /OPTIMIZE=LEVEL=5 is in
    effect.

  [NO]PIPELINE
    Applies instruction scheduling to certain innermost loops,
    allowing instructions within a loop to "wrap around" and execute
    in a different iteration of the loop.  This can reduce the impact
    of long-latency operations, resulting in faster loop execution.
    /OPTIMIZE=PIPELINE also enables prefetching of data to reduce the
    impact of cache misses.

    This type of optimization can be specified for /OPTIMIZE=LEVEL=2
    or higher; it is performed by default if /OPTIMIZE=LEVEL=5 is in
    effect.

  TUNE=keyword (Alpha only)
    Specifies the kind of optimized code to be generated.  The
    keyword can be any of the following:

        Keyword   Meaning
        -------   -------
        GENERIC   Generates and schedules code that will execute
                  well for all generations of Alpha processors.
                  This provides generally efficient code for those
                  cases where all processor generations are likely
                  to be used.

        HOST      Generates and schedules code optimized for the
                  processor generation in use on the system being
                  used for compilation.

        EV4       Generates and schedules code optimized for the
                  21064, 21064A, 21066, and 21068 implementations
                  of the Alpha chip.

                  Programs compiled with the EV4 option run without
                  instruction emulation overhead on all Alpha
                  processors.

        EV5       Generates and schedules code optimized for the
                  21164 implementation of the Alpha chip. This
                  processor generation is faster than EV4.

                  Programs compiled with the EV5 option run without
                  instruction emulation overhead on all Alpha
                  processors.

        EV56      Generates code for some 21164 chip implementations
                  that use the byte and word manipulation instruction
                  extensions of the Alpha architecture.

                  Programs compiled with the EV56 option may incur
                  emulation overhead on EV4 and EV5 processors, but
                  will still run correctly on OpenVMS Version 7.1 (or
                  later) systems.

        EV6       Generates and schedules code for the 21264 chip
                  implementation that uses the following extensions
                  to the base Alpha instruction set: BWX (Byte/Word
                  manipulation) and MAX (Multimedia) instructions,
                  square root and floating-point convert instructions,
                  and count instructions.

                  Programs compiled with the EV6 option may incur
                  emulation overhead on EV4, EV5, EV56, and PCA56
                  processors, but will still run correctly on OpenVMS
                  Version 7.1 (or later) systems.

        EV67      Generates and schedules code for the 21264 chip
                  implementation that uses the following extensions
                  to the base Alpha instruction set: BWX (Byte/Word
                  manipulation) and MAX (Multimedia) instructions,
                  square root and floating-point convert instructions,
                  and CIX (Count) instructions.

                  Programs compiled with the EV67 option may incur
                  emulation overhead on EV4, EV5, EV56, EV6 and PCA56
                  processors, but will still run correctly on OpenVMS
                  Version 7.1 (or later) systems.

        PCA56     Generates code for the 21164PC chip implementation
                  that uses the byte and word manipulation instruction
                  extensions and multimedia instruction extensions
                  of the Alpha architecture.

                  Running programs compiled with the PCA56 keyword
                  may incur emulation overhead on EV4, EV5, and
                  EV56 processors, but will still run correctly on
                  OpenVMS Version 7.1 (or later) systems.

    The default is /OPTIMIZE=TUNE=GENERIC.

  UNROLL=n
    Controls loop unrolling done by the optimizer.  UNROLL=n means to
    unroll loop bodies n times, where "n" is an integer in the range
    0 through 16.  UNROLL=0 (the default) means the optimizer will
    use its default unroll amount.  For more information, see the
    HP Fortran for OpenVMS User Manual.

35    /PAD_SOURCE D=/NOPAD_SOURCE

  /[NO]PAD_SOURCE

  Controls how the compiler treats fixed-form source code lines which
  are shorter than the statement field width (72 characters, or 132
  characters if /EXTEND_SOURCE is in effect.) This option has an
  effect on how the compiler treats character and Hollerith constants
  that are continued across two or more source lines.

  Specifying /PAD_SOURCE causes the compiler to treat short source
  lines as if they were padded with blanks out to the statement field
  width.  This may be useful when compiling programs developed for
  non-OpenVMS platforms which may assume that short source lines are
  blank-padded.

  The default, /NOPAD_SOURCE, is compatible with current HP
  Fortran and previous OpenVMS Fortran compilers, which causes the
  compiler to not treat short source lines as padded with blanks so
  that the first character of a continuation line immediately follows
  the last character of the previous line.

  If /NOPAD_SOURCE is in effect, the compiler will issue an
  informational diagnostic message if it detects a continued constant
  which may be affected by blank padding.

36    /REAL_SIZE=n D=/REAL_SIZE=32

  Controls how the compiler interprets floating-point declarations
  that do not have a specified length.

  The default, /REAL_SIZE=32, defines REAL declarations, constants,
  functions, and intrinsics as REAL(KIND=4) (single precision) and
  COMPLEX declarations, constants, functions, and intrinsics as
  COMPLEX(KIND=4) (single COMPLEX).

  Specifying /REAL_SIZE=64 defines REAL declarations, constants,
  functions, and intrinsics as REAL(KIND=8) (DOUBLE PRECISION) and
  COMPLEX declarations, constants, functions, and intrinsics as
  COMPLEX(KIND=8) (DOUBLE COMPLEX).

  This also causes intrinsic functions to produce a double precision
  REAL(KIND=8) or COMPLEX(KIND=8) result instead of a single
  precision REAL(KIND=4) or COMPLEX(KIND=4) result, unless the
  argument is explicitly typed.

  For example, if you specify /REAL_SIZE=64, references to the CMPLX
  intrinsic produce DCMPLX results (COMPLEX(KIND=8)).  However, if
  the argument to CMPLX is explicitly typed as REAL(KIND=4) or
  COMPLEX(KIND=4), the resulting data type is COMPLEX(KIND=4).

  Specifying /REAL_SIZE=128 defines REAL declarations, constants,
  functions, and intrinsics as REAL(KIND=16).  It does not affect
  COMPLEX objects.

37    /RECURSIVE D=/NORECURSIVE

  /[NO]RECURSIVE

  Controls whether VSI Fortran generates code and allocates data
  so that a subroutine or function can be called recursively.

  The default is /NORECURSIVE.

  Specifying /RECURSIVE does the following:

   o  Changes the default allocation class for all local variables
      from STATIC to AUTOMATIC, except for variables that are
      data-initialized, named in a SAVE statement, or declared as
      STATIC.

   o  Permits reference to a routine name from inside the routine.

  Subprograms declared with the RECURSIVE keyword are always
  recursive (whether you specify or omit the /RECURSIVE qualifier).

  Data objects declared as AUTOMATIC always use stack-based storage
  (whether you specify or omit the /RECURSIVE or /AUTOMATIC
  qualifiers).

  Specifying /RECURSIVE sets /AUTOMATIC.

  You can also specify this qualifier using the OPTIONS statement.

38    /REENTRANCY=option D=/REENTRANCY=NONE

  /[NO]REENTRANCY

  Tells the VSI Fortran RTL whether the program will be relying on
  threaded or asynchronous (AST) reentrancy.

  /NOREENTRANCY specifies that the program will not be relying on
  threaded or asynchronous (AST) reentrancy.  So, the RTL will not
  guard against such interrupts inside the RTL.  This is the same as
  specifying /REENTRANCY=NONE (the default).

  ASYNC
    Specifies that the program may contain asynchronous (AST)
    handlers that could call the RTL.  This causes the RTL to guard
    against AST interrupts inside its own critical regions.

    This option is ignored for applications running on versions of
    OpenVMS earlier than Version 7.0.

  NONE
    Specifies that the program will not be relying on threaded or
    asynchronous (AST) reentrancy.  So, the RTL will not guard
    against such interrupts inside the RTL.  This is the default and
    is the same as specifying /NOREENTRANCY.

  THREADED
    Specifies that the program is multithreaded, such as programs
    using the DECthreads library.  This causes the RTL to use thread
    locking to guard its own critical regions.

    This option is ignored for applications running on versions of
    OpenVMS earlier than Version 7.0.

39    /ROUNDING_MODE=option D=/ROUNDING_MODE=NEAREST

  Controls the rounding mode to be used for IEEE floating-point
  calculations.

  You can only specify one of the qualifier options.

  CHOPPED
    Specifies to round toward zero.

  DYNAMIC
    Specifies to get the rounding mode at runtime.  For more
    information, see the HP Fortran for OpenVMS User Manual.

  MINUS_INFINITY
    Specifies to round toward the next smallest representation value.

  NEAREST
    Specifies to round toward the nearest representation value.  This
    is the default.

40    /SEPARATE_COMPILATION D=/NOSEPARATE_COMPILATION

  /[NO]SEPARATE_COMPILATION

  Controls whether an individual compilation unit becomes a separate
  module in an object file.

  The default is /NOSEPARATE_COMPILATION, which groups individual
  compilation units as a single module in an object file.

  When creating modules for use in an object library, consider using
  /SEPARATE_COMPILATION to minimize the size of the routines included
  by the linker as it creates the executable image.  In most cases,
  the default setting (/NOSEPARATE_COMPILATION) allows more
  interprocedural optimizations.

41    /SEVERITY=(WARNINGS=opt) D=/SEVERITY=(WARNINGS=WARNING)

  Changes the severity of warning or error messages.

  The default is that compiler diagnostic warning messages and
  standards checking messages have a severity of warning, or
  /SEVERITY=(WARNINGS=WARNING).

  ERROR
    Specifies that all warning messages are to be issued with ERROR
    severity.

  STDERROR
    Specifies that if /STANDARD is in effect and diagnostics
    indicating non-standard features are issued, the diagnostics are
    issued with ERROR severity (the default is that these are
    informational).  All other warning messages are issued with
    WARNING severity.

  WARNINGS
    Specifies that all warning messages are to be issued with WARNING
    severity.

42    /SHOW=(option[,...]) D=/SHO=(NOIN,MAP)

  /[NO]SHOW

  Controls whether optionally listed source lines and a symbol map
  appear in the source listing.  (Optionally listed source lines are
  text-module source lines and preprocessor-generated source lines.)

  For the /SHOW qualifier to take effect, you must specify the /LIST
  qualifier.

  [NO]INCLUDE
    Controls whether the source lines from any file or text module
    specified by INCLUDE statements are included in the source
    listing.

  [NO]MAP
    Controls whether the symbol map is included in the listing file.

  ALL
    Requests that all optionally listed source lines and a symbol map
    be included in the listing file.  This is the same as specifying
    /SHOW without any arguments.

  NONE
    Requests that no optionally listed source lines or a symbol map
    be included in the listing file.  This is the same as specifying
    /NOSHOW.

  The /SHOW qualifier defaults are NOINCLUDE and MAP.

43    /SOURCE_FORM=option D=Depends on file type

  /SOURCE_FORM

  Specifies whether all VSI Fortran source files on the F90
  command line are in fixed or free source form.

  FIXED
    Specifies that the input source files will be in fixed source
    form, regardless of the file type.  Source files with a file type
    of FOR or F (or any file type other than F90) are assumed to
    contain fixed source form.

  FREE
    Specifies that the input source files will be in free source
    form, regardless of the file type.  Source files with a file type
    of F90 are assumed to contain free source form.

44    /STANDARD[=option] D=/NOSTANDARD

  /[NO]STANDARD

  Controls whether the compiler generates informational diagnostic
  messages for HP extensions to the Fortran language standard in
  effect at compile time.

  F90
    Tells the compiler to compare language features to the Fortran 90
    Standard.

  F95
    Tells the compiler to compare language features to the Fortran 95
    Standard.

  Specifying /STANDARD causes informational diagnostic messages to be
  generated for items such as the following:

   o  Extensions to language syntax

   o  Standard-conforming statements that become nonstandard due to
      the way in which they are used

   o  Tab formatting, when it appears in fixed-format source files

  If /STANDARD is specified without an option, messages are issued
  for extensions to the Fortran 95 Standard.

  The default is /NOSTANDARD (or /STANDARD=NONE).

  If you specify the /NOWARNINGS qualifier, the /STANDARD qualifier
  is ignored.

  For more information on how the compiler detects source statements
  that do not conform to Fortran language standards, see the
  description of /STANDARD in the HP Fortran for OpenVMS User Manual.

45    /SYNCHRONOUS_EXCEPTIONS (Alpha only) D=/NOSYNCHRONOUS_EXCEPTIONS

  /[NO]SYNCHRONOUS_EXCEPTIONS

  Controls whether an exception is associated with the instruction
  that caused it.  Specifying /SYNCHRONOUS_EXCEPTIONS slows program
  execution, so only use it when debugging a specific problem, such
  as locating the source of an exception.

  The default, /NOSYNCHRONOUS_EXCEPTIONS, is used where exceptions
  can be reported imprecisely one or more instructions after the
  instruction that caused the exception.

  Specifying /IEEE_MODE=FAST (the default) provides imprecise
  exception reporting (same as /NOSYNCHRONOUS_EXCEPTIONS).
  Specifying other /IEEE_MODE keywords provides precise exception
  reporting (same as /SYNCHRONOUS_EXCEPTIONS).

46    /SYNTAX_ONLY D=/NOSYNTAX_ONLY

  /[NO]SYNTAX_ONLY

  Controls whether the source file is checked only for correct
  syntax.  If you specify the /SYNTAX_ONLY qualifier, no code is
  generated, no object file is produced, and some error checking done
  by the optimizer is bypassed (for example, checking for
  uninitialized variables).

  This qualifier lets you do a quick syntax check of your source
  file, and is especially useful in conjunction with
  /WARNINGS=ARGUMENT_CHECKING.

47    /TIE D=/NOTIE

  /[NO]TIE

  Controls whether compiled code is used with translated shared
  images, either because the code might call into a translated image
  or might be called from a translated image.  Specifying /NOTIE, the
  default, indicates the compiled code will not be associated with a
  translated image.

  If you specify /TIE, link the object module using the LINK command
  /NONATIVE_ONLY qualifier.  For more information, see the HP Fortran
  for OpenVMS User Manual.

48    /VERSION

  Displays the VSI Fortran version number.  If you specify this
  qualifier, compilation does not occur.

49    /VMS D=/VMS

  /[NO]VMS

  Controls whether the run-time system behaves like VSI Fortran
  for OpenVMS VAX Systems (VAX FORTRAN) in various ways.

  The default, /VMS, specifies the following aspects of the run-time
  environment:

   o  Reinforces the defaults of /IEEE_MODE=FAST and /NORECURSIVE.

   o  Does not recognize the \n control character syntax in character
      literals.

   o  Causes the defaults for keyword BLANK= in OPEN statements to
      become 'ZERO' for an implicit OPEN of an external or internal
      file, and 'NULL' for an explicit OPEN.

   o  Allows use of /LIST or /NOLIST in INCLUDE statement
      specifications (also see /ASSUME=SOURCE_INCLUDE in this Help
      file).

   o  Sets the following as defaults:

       -  /CHECK=FORMAT (with /NOVMS, the default is /CHECK=NOFORMAT)

       -  /CHECK=OUTPUT_CONVERSION (with /NOVMS, the default is
          /CHECK=NOOUTPUT_CONVERSION)

  /VMS does not affect the alignment of fields in records or items in
  COMMON.

  To override the effects of the /VMS qualifier, specify /NOVMS.

  You can also override qualifier settings reinforced by /VMS, by
  specifying the desired qualifier settings on the command line.  For
  example, the following command line permits recursion in the source
  program:

  $ F90/VMS/RECURSIVE filename.for

50    /WARNINGS=(opt[,...]) D=/WAR=(ALI,NOA,NOD,GEN,GRA,NOI,NOT,UNC,UNI,NOU,US)

  /[NO]WARNINGS

  Controls whether the compiler generates informational (I-level) and
  warning (W-level) diagnostic messages in response to informational
  and warning-level errors.  The default is /WARNINGS=(ALIGNMENT,
  NOARGUMENT_CHECKING, NODECLARATIONS, GENERAL, GRANULARITY,
  NOIGNORE_LOC, NOTRUNCATED_SOURCE, UNCALLED, UNINITIALIZED NOUNUSED,
  USAGE).

  [NO]ALIGNMENT
    Controls whether the compiler issues diagnostic messages when
    variables or arrays (created in COMMON or EQUIVALENCE statements)
    are declared in such a way that they cross natural boundaries for
    their data size.  For example, a diagnostic message is issued if
    /WARNINGS=ALIGNMENT is in effect and the virtual address of a
    REAL(KIND=8) variable is not a multiple of 8.

    The default is /WARNINGS=ALIGNMENT.  To suppress diagnostic
    messages about misaligned data, specify /WARNINGS=NOALIGNMENT.

    To control the alignment of fields in derived-type or record
    structures or in common blocks, use the /ALIGNMENT qualifier.
    (See the HP Fortran for OpenVMS User Manual.)

  [NO]ARGUMENT_CHECKING
    Controls whether the compiler issues diagnostic messages for
    argument mismatches between caller and callee (when compiled
    together).  The default is /WARNINGS=NOARGUMENT_CHECKING.

  [NO]DECLARATIONS
    Controls whether the compiler issues diagnostic messages for any
    untyped data item used in the program.  DECLARATIONS acts as an
    external IMPLICIT NONE declaration.  See the description of the
    IMPLICIT statement in the HP Fortran for OpenVMS Language
    Reference Manual for information about the effects of IMPLICIT
    NONE.

    The default is /WARNINGS=NODECLARATIONS.

  [NO]GENERAL
    Controls whether the compiler issues I-level and W-level
    diagnostic messages.  An I-level message indicates that a correct
    VSI Fortran statement may have unexpected results or contains
    nonstandard syntax or source form.  A W-level message indicates
    that the compiler has detected acceptable, but nonstandard,
    syntax or has performed some corrective action; in either case,
    unexpected results may occur.

    To suppress I-level and W-level diagnostic messages, specify the
    negative form of this qualifier (/WARNINGS=NOGENERAL).

    The default is /WARNINGS=GENERAL.

  [NO]GRANULARITY
    Controls whether the compiler issues the NONGRNACC warning
    message:  "Unable to generate code for requested granularity".

    The default is /WARNINGS=GRANULARITY.

  [NO]IGNORE_LOC
    Controls whether the compiler issues warnings when %LOC is
    stripped from an argument.  The default is
    /WARNINGS=NOIGNORE_LOC.

  [NO]TRUNCATED_SOURCE
    Controls whether the compiler issues a warning diagnostic message
    (EXCCHASRC) when it reads a fixed-form source line with a
    statement field that exceeds the maximum column width.  The
    maximum column width is column 72 or 132, depending on the value
    of the /EXTEND_SOURCE qualifier or the OPTIONS statement option
    in effect.

    This option has no effect on truncation; lines that exceed the
    maximum column width are always truncated.

    The default is /WARNINGS=NOTRUNCATED_SOURCE.

  [NO]UNCALLED
    Controls whether the compiler issues SFUNCALLED messages when a
    statement function is never called.  The default is
    /WARNINGS=UNCALLED (the messages are displayed).

  [NO]UNINITIALIZED
    Controls whether the compiler issues UNINIT messages when a
    variable is used before it has a value assigned to it.  The
    default is /WARNINGS=UNINITIALIZED (the messages are displayed).

  [NO]UNUSED
    Controls whether the compiler issues a warning diagnostic message
    when a variable is declared but not used.  The default is
    /WARNINGS=NOUNUSED.

  [NO]USAGE
    Controls whether the compiler generates informational diagnostic
    messages for questionable programming practices which, though
    allowed, often are the result of programming errors.

    For example, the following would cause such a message:  a
    continued character or Hollerith literal whose first part ends
    before the statement field and appears to end with trailing
    spaces.

    The default is /WARNINGS=USAGE.

  ALL
    Causes the compiler to print all I-level and W-level diagnostic
    messages, including warning messages for any misaligned data and
    untyped data items.  Specifying ALL has the effect of specifying
    (ALIGNMENT, ARGUMENT_CHECKING, DECLARATIONS, GENERAL,
    GRANULARITY, IGNORE_LOC, TRUNCATED_SOURCE, UNCALLED,
    UNINITIALIZED, UNUSED, USAGE).  This is the same as specifying
    /WARNINGS.

  NONE
    Suppresses all I-level and W-level messages.  This is the same as
    specifying /NOWARNINGS.

51  –  Examples

  The following examples show a variety of VSI Fortran commands.
  Each command is followed by a description of the output files it
  produces.

  1.  $ FORTRAN/LIST AAA.F90, BBB.F90, CCC.F90

      Source files AAA.F90, BBB.F90, and CCC.F90 are compiled as
      separate files, producing object files named AAA.OBJ, BBB.OBJ,
      and CCC.OBJ; and listing files named AAA.LIS, BBB.LIS, and
      CCC.LIS.

  2.  $ FORTRAN XXX+YYY+ZZZ

      Source files XXX.F90, YYY.F90, and ZZZ.F90 are concatenated and
      compiled as one file, producing an object file named XXX.OBJ,
      but no listing file.  (A listing file named XXX.LIS would be
      produced in batch mode.)

  3.  $ FORTRAN/OBJECT=SQUARE/NOLIST <RET>   _File: CIRCLE

      The source file CIRCLE.F90 is compiled, producing an object
      file named SQUARE.OBJ, but no listing file.

  4.  $ FORTRAN AAA+BBB,CCC/LIST

      Two object files are produced:  AAA.OBJ (comprising AAA.F90 and
      BBB.F90) and CCC.OBJ (comprising CCC.F90).  One listing file is
      produced:  CCC.LIS (comprising CCC.F90).

  5.  $ FORTRAN ABC+CIRC/NOOBJECT+XYZ

      When you include a qualifier in a list of files that are to be
      concatenated, the qualifier affects all files in the list.  The
      Fortran command shown in this example completely suppresses the
      object file.  That is, source files ABC.F90, CIRC.F90, and
      XYZ.F90 are concatenated and compiled, but no object file is
      produced.

52  –  Release Notes

  For VSI Fortran release notes, refer to the following file:

      SYS$HELP:FORTRAN.RELEASE_NOTES.

53  –  Built-in Functions

  Built-in functions perform utility operations that are useful in
  communicating with subprograms written in languages other than
  Fortran.

  See also Intrinsics.

53.1  –  %LOC

  %LOC (arg)
  Returns the internal address of a storage item.  The argument can
  be a variable, an expression, or the name of a procedure.  (It must
  not be the name of an internal procedure or statement function.) It
  can be of any data type.  The result is an INTEGER*8 data type.

  In the case of global symbolic constants, %LOC returns the value of
  the constant rather than an address.

  The %LOC built-in function serves the same purpose as the LOC
  intrinsic.

53.2  –  %REF

  %REF (arg)

  Forces an actual argument in a CALL statement or function reference
  to be passed by reference:  the address of the argument is passed
  to the subprogram.  By default, Fortran passes all numeric values
  by reference.

53.3  –  %VAL

  %VAL (arg)

  Forces an actual argument in a CALL statement or function reference
  to be passed by value.  The argument is passed as a 64-bit immediate
  value.  If "arg" is integer (or logical) and less than 64 bits in
  size, it is sign-extended to a 64-bit value.

  When a complex argument is passed, two 64-bit values (one containing
  the real part, the other containing the imaginary part) are passed
  by immediate value.

53.4  –  %DESCR

  %DESCR (arg)

  Forces an actual argument in a CALL statement or function reference
  to be passed by descriptor:  the address of a descriptor of the
  argument is passed to the subprogram.  By default, Fortran passes
  all character values by descriptor.

54  –  Character Sets

  VSI Fortran supports the following characters:

   o  The Fortran 95/90 character set, consisting of those ASCII
      characters which can appear in Fortran 95/90 language syntax.
      This character set is a superset of the FORTRAN 77 character
      set.

   o  Other printable characters, which can appear in comments,
      character constants, Hollerith constants, character string edit
      descriptors, and input/output records.

54.1  –  ASCII

  The following table represents the ASCII character set (characters
  with decimal values 0 through 127).  Except for SP and HT, the
  characters with names are nonprintable.

  To determine the hexadecimal value of an ASCII character, combine
  the values in the column (0-7) and the row (0-F) that relate to the
  character.  For example, the value of the character representing
  the equal sign is 3D(hex).

    +------------------------------------------+
    |     0     1     2    3   4   5   6   7   |
    +---+--------------------------------------+
    | 0 | NUL   DLE   SP   0   @   P   `   p   |
    | 1 | SOH   DC1   !    1   A   Q   a   q   |
    | 2 | STX   DC2   "    2   B   R   b   r   |
    | 3 | ETX   DC3   #    3   C   S   c   s   |
    | 4 | EOT   DC4   $    4   D   T   d   t   |
    | 5 | ENQ   NAK   %    5   E   U   e   u   |
    | 6 | ACK   SYN   &    6   F   V   f   v   |
    | 7 | BEL   ETB   '    7   G   W   g   w   |
    | 8 | BS    CAN   (    8   H   X   h   x   |
    | 9 | HT    EM    )    9   I   Y   i   y   |
    | A | LF    SUB   *    :   J   Z   j   z   |
    | B | VT    ESC   +    ;   K   [   k   {   |
    | C | FF    FS    ,    <   L   \   l   |   |
    | D | CR    GS    -    =   M   ]   m   }   |
    | E | SO    RS    .    >   N   ^   n   ~   |
    | F | SI    US    /    ?   O   _   o   DEL |
    +---+--------------------------------------+

  The characters with names are defined as follows:

    NUL   Null             DC1   Device Control 1(XON)
    SOH   Start of         DC2   Device Control 2
            Heading
    STX   Start of Text    DC3   Device Control 3(XOFF)
    ETX   End of Text      DC4   Device Control 4
    EOT   End of           NAK   Negative Acknowledge
            Transmission
    ENQ   Enquiry          SYN   Synchronous Idle
    ACK   Acknowledge      ETB   End of Transmission
                                   Block
    BEL   Bell             CAN   Cancel
    BS    Backspace        EM    End of Medium
    HT    Horizontal Tab   SUB   Substitute
    LF    Line Feed        ESC   Escape
    VT    Vertical Tab     FS    File Separator
    FF    Form Feed        GS    Group Separator
    CR    Carriage Return  RS    Record Separator
    SO    Shift Out        US    Unit Separator
    SI    Shift In         SP    Space
    DLE   Data Link        DEL   Delete
            Escape

54.2  –  DEC Multinational

  The ASCII character set comprises the first half of the DEC
  Multinational Character Set.  The following table represents the
  second half of the DEC Multinational Character Set (characters with
  decimal values 128 through 255).  These characters cannot be output
  on some older terminals and printers.  Note that the characters
  with names are nonprintable.

  To determine the hexadecimal value of an ASCII character, combine
  the values in the column (8-F) and the row (0-F) that relate to the
  character.  For example, the value of the character representing
  the pound sterling sign is A3(hex).

     +------------------------------------------+
     |     8     9      A   B   C   D   E   F   |
     +---+--------------------------------------+
     | 0 |       DCS        °   À       à       |
     | 1 |       PU1    ¡   ±   Á   Ñ   á   ñ   |
     | 2 |       PU2    ¢   ²   Â   Ò   â   ò   |
     | 3 |       STS    £   ³   Ã   Ó   ã   ó   |
     | 4 | IND   CCH            Ä   Ô   ä   ô   |
     | 5 | NEL   MW     ¥   µ   Å   Õ   å   õ   |
     | 6 | SSA   SPA        ¶   Æ   Ö   æ   ö   |
     | 7 | ESA   EPA    §   ·   Ç   ×   ç   ÷   |
     | 8 | HTS          ¨       È   Ø   è   ø   |
     | 9 | HTJ          ©   ¹   É   Ù   é   ù   |
     | A | VTS          ª   º   Ê   Ú   ê   ú   |
     | B | PLD   CSI    «   »   Ë   Û   ë   û   |
     | C | PLU   ST         ¼   Ì   Ü   ì   ü   |
     | D | RI    OSC        ½   Í   Ý   í   ý   |
     | E | SS2   PM             Î       î       |
     | F | SS3   APC        ¿   Ï   ß   ï       |
     +---+--------------------------------------+

  The characters with names are defined as follows:

    IND   Index            PU1   Private Use 1
    NEL   Next Line        PU2   Private Use 2
    SSA   Start of         STS   Set Transmit State
            Selected Area
    ESA   End of Selected  CCH   Cancel Character
            Area
    HTS   Horizontal Tab   MW    Message Waiting
            Set
    HTJ   Horizontal       SPA   Start of Protected
            Tab Set with           Area
            Justification
    VTS   Vertical Tab     EPA   End of Protected
            Set                    Area
    PLD   Partial Line     CSI   Control Sequence
            Down                   Introducer
    PLU   Partial Line Up  ST    String Terminator
    RI    Reverse Index    OSC   Operating System
                                   Command
    SS2   Single Shift 2   PM    Privacy Message
    SS3   Single Shift 3   APC   Application
    DCS   Device Control
            String

54.3  –  Fortran Standards

  The character set specified by the Fortran 95 and Fortran 90
  Standards consists of all uppercase and lowercase letters (A-Z and
  a-z), the digits 0-9, the underscore (_), and the following special
  characters:

          (blank or space)       :    (colon)
     +    (plus sign)            "    (quotation mark)
     -    (minus sign)           %    (percent sign)
     *    (asterisk)             &    (ampersand)
     /    (slash)                ;    (semicolon)
     (    (left parenthesis)     <    (less than)
     )    (right parenthesis)    >    (greater than)
     ,    (comma)                ?    (question mark)
     .    (period)               $    (dollar sign)
     '    (apostrophe)

54.4  –  VSI Fortran

  The VSI Fortran character set includes the entire Fortran 95/90
  Standard set plus the special character <Tab> (tab).

  All printable characters (those in the range 20(hex) through
  7E(hex), or A1(hex) through FE(hex)) can appear in comments,
  character constants, and Hollerith constants.

54.5  –  Printable Characters

  Printable characters include the tab character (09 hex), those
  ASCII characters with codes in the range 20(hex) through 7E(hex),
  and those characters in the DEC Multinational Extension to the
  ASCII Character Set with codes in the range A1(hex) through
  FE(hex).

  Printable characters that are not in the Fortran 95/90 character
  set (see CHAR FORTRAN_90 in online Help) can only appear in
  comments, character constants, Hollerith constants, character
  string edit descriptors, and input/output records.

55  –  Compatibility Features

  VSI Fortran provides the following language features to
  facilitate compatibility with other versions of Fortran:

   o  The DEFINE FILE, ENCODE, DECODE, and FIND statements

   o  An alternative syntax for the PARAMETER statement

   o  The VIRTUAL statement

   o  The AND, OR, XOR, IMAG, LSHIFT, and RSHIFT intrinsic functions

   o  An alternative syntax for octal and hexadecimal constants

   o  An alternative syntax for a record specifier

   o  An alternative syntax for the DELETE statement

   o  An alternative form for namelist external records

   o  Record structures

   o  VSI Fortran pointers

  These language features are particularly useful in transporting
  older Fortran programs to systems on Alpha processors.  However,
  you should avoid using them in new programs on these systems, and
  in new programs for which portability to other Fortran 95 or
  Fortran 90 implementations is important.

55.1  –  DEFINE_FILE

  The DEFINE FILE statement establishes the size and structure of
  files with relative organization and associates them with a logical
  unit number.  The DEFINE FILE statement is comparable to the OPEN
  statement (in situations where you can use the OPEN statement, it
  is the preferable mechanism for creating and opening files).
  Statement format:

     DEFINE FILE u(m, n, U, asv) [,u(m, n, U, asv)]...

     u    Is an integer constant or variable that specifies the
          logical unit number.

     m    Is an integer constant or variable that specifies the
          number of records in the file.

     n    Is an integer constant or variable that specifies the
          length of each record in 16-bit words (2 bytes).

     U    Specifies that the file is unformatted (binary); this
          is the only acceptable entry in this position.

     asv  Is an integer variable, called the associated variable
          of the file.  At the end of each direct access I/O
          operation, the record number of the next higher numbered
          record in the file is assigned to "asv"; "asv" must not
          be a dummy argument.

  The DEFINE FILE statement specifies that a file containing "m"
  fixed-length records, each composed of n 16-bit words, exists (or
  is to exist) on the specified logical unit.  The records in the
  file are numbered sequentially from 1 through "m".

  A DEFINE FILE statement must be executed before the first direct
  access I/O statement referring to the specified file, even though
  the DEFINE FILE statement does not itself open the file.  The file
  is actually opened when the first direct access I/O statement for
  the unit is executed.

  If this I/O statement is a WRITE statement, a new relative
  organization file is created.  If it is a READ or FIND statement,
  an existing file is opened, unless the specified file does not
  exist.  If a file does not exist, an error occurs.

55.2  –  DELETE

  In VSI Fortran, you can specify the following form of the DELETE
  statement when deleting records from a relative file:

    DELETE (u'r [,ERR=s] [,IOSTAT=ios])

    u   Is the number of the logical unit containing the
        record to be deleted.

    r   Is the positional number of the record to be deleted.

    s   Is the label of an executable statement that receives
        control if an error condition occurs.

    ios Is a scalar integer variable that is defined
        as a positive integer if an error occurs and zero if
        no error occurs.

  This form deletes the direct access record specified by r.

55.3  –  ENCODE and DECODE

  The ENCODE and DECODE statements transfer data between variables or
  arrays in internal storage.  The ENCODE statement translates data
  from internal (binary) form to character form.  Inversely, the
  DECODE statement translates data from character to internal form.
  These statements are comparable to using internal files in
  formatted sequential WRITE and READ statements, respectively.
  Statement format:

     ENCODE (c,f,b [,IOSTAT=ios] [,ERR=s]) [list]
     DECODE (c,f,b [,IOSTAT=ios] [,ERR=s]) [list]

     c      Is an integer expression.  In the ENCODE statement,
            "c" is the number of characters (in bytes) to be
            translated to character form.  In the DECODE statement,
            "c" is the number of characters to be translated to
            internal form.

     f      Is a format identifier.  An error occurs if more than
            one record is specified.

     b      Is a scalar or array reference. If b is an array
            reference, its elements are processed in the
            order of subscript progression. The data type of "b"
            determines the number of characters that ENCODE or
            DECODE can process.

            In the ENCODE statement, "b" receives the characters
            after translation to external form.  If less than "c"
            characters are received, the remaining character
            positions are filled with blank characters.

            In the DECODE statement, "b" contains the characters
            to be translated to internal form.

     ios    Is a scalar integer variable that is defined
            as a positive integer if an error occurs, and zero
            if no error occurs.

     s      Is the label of an executable statement.

     list   Is an I/O list.

            In the ENCODE statement, the "list" contains the data
            to be translated to character form.  In the DECODE
            statement, the "list" receives the data after
            translation to internal form.

            The interaction between the format specifier and the
            I/O list is the same as for a formatted I/O statement.

55.4  –  FIND

  The FIND statement positions a direct access file at a particular
  record and sets the associated variable of the file to that record
  number.  It is comparable to a direct access READ statement with no
  I/O list, and can open an existing file.  No data transfer takes
  place.  Statement format:

     FIND (u'r [,ERR=s] [,IOSTAT=ios])
     FIND ([UNIT=]u, REC=r [,ERR=s] [,IOSTAT=ios])

     u     Is a logical unit number.  It must refer to a
           relative organization file.

     r     Is the direct access record number.  It cannot
           be less than one or greater than the number of
           records defined for the file.

     s     Is the label of the executable statement that
           receives control if an error occurs.

     ios   Is an integer variable or integer array element
           that is defined as a positive integer if an error
           occurs, and as a zero if no error occurs.

55.5  –  Intrinsic Functions

  VSI Fortran allows certain intrinsic functions for compatibility
  with FORTRAN for RISC.  The following list shows these functions
  and their equivalents:

     Function    Equivalent Function
     --------    -------------------
     AND         IAND
     OR          IOR
     XOR         IEOR
     LSHIFT      ISHFT with a positive second argument
     RSHIFT      ISHFT with a negative second argument

55.6  –  Namelist Record

  You can use the following form for an external record:

    $group-name object = value [object = value]...$[END]

    group-name  Is the name of the group containing the objects
                to be given values. The name must have been
                previously defined in a NAMELIST statement in
                the scoping unit.

    object      Is the name (or subobject designator) of an
                entity defined in the NAMELIST declaration of
                the group name. The object name must not contain
                embedded blanks, but it can be preceded or
                followed by blanks.

    value       Is a null value, a constant (or list of constants),
                a repetition of constants in the form r*c, or a
                repetition of null values in the form r*.

  If more than one object=value or more than one value is specified,
  they must be separated by value separators.

  A value separator is any number of blanks, or a comma or slash,
  preceded or followed by any number of blanks.

  Comments (beginning with !  only) can appear anywhere in namelist
  input.  The comment extends to the end of the source line.

55.7  –  Octal Hex Syntax

  In VSI Fortran, you can use the following alternative syntax for
  octal and hexadecimal constants:

                  Alternative Syntax   Equivalent
                  ------------------   ----------
     Octal        '0..7'O              O'0..7'
     Hexadecimal  '0..F'X              Z'0..F'

  In the above syntax forms, you can use a quotation mark(") in place
  of an apostrophe (').

55.8  –  PARAMETER

  This statement is similar to the one discussed in Help topic:
  Statements PARAMETER; they both assign a symbolic name to a
  constant.  However, this PARAMETER statement differs from the other
  one in the following two ways:  its list is not bounded with
  parentheses; and the form of the constant, rather than implicit or
  explicit typing of the symbolic name, determines the data type of
  the variable.  Statement format:

     PARAMETER p=c [,p=c]...

     p  Is a symbolic name.

     c  Is a constant, the symbolic name of a constant, or a
        compile-time constant expression.

55.9  –  Record Specifier Syntax

  In VSI Fortran, you can specify the following form for a record
  specifier:

     'r

     r  Is a numeric expression with a value that represents
        the position of the record to be accessed using direct
        access I/O.  The value must be greater than or equal to 1,
        and less than or equal to the maximum number of records
        allowed in the file. If necessary, a record number is
        converted to integer data type before being used.

55.10  –  Record Structures

  A record is a named data entity, consisting of one or more fields,
  which you can use when you need to declare and operate on
  multi-field data structures in your programs.

  To create a record, you must have a structure declaration (to
  describe the fields in the record) and a RECORD statement to
  establish the record in memory.

55.10.1  –  Examples

  Structure APPOINTMENT:

     Structure /APPOINTMENT/
       RECORD /DATE/             APP_DATE
       STRUCTURE /TIME/          APP_TIME (2)
           LOGICAL*1             HOUR, MINUTE
       END STRUCTURE
       CHARACTER*20              APP_MEMO (4)
       LOGICAL*1                 APP_FLAG
     END STRUCTURE

  The following statement results in the creation of both a variable
  named NEXT_APP and a 10-element array named APP_list.  Both the
  variable and each element of the array have the form of the
  structure APPOINTMENT.

     RECORD /APPOINTMENT/ NEXT_APP,APP_list(10)

  The following examples illustrate aggregate and scalar field
  references.

  Aggregate:

    NEXT_APP                ! the record NEXT_APP
    NEXT_APP.APP_TIME(1)    ! an array field of the variable
                            ! NEXT_APP
    APP_list(3).APP_DATE    ! a /DATE/ record, part of the record
                            ! APP_list(3) in the array APP_list

  Scalar:

    NEXT_APP.APP_FLAG       ! a LOGICAL field of the record
                            ! NEXT_APP

    NEXT_APP.APP_MEMO(1)(1:1)
                            ! The first character of APP_MEMO(1),
                            ! a character*20 field of the record
                            ! NEXT_APP

55.10.2  –  Field References

  Fields within a record may be accessed collectively or
  individually.  Record references are either qualified or
  unqualified.

  A qualified reference refers to a typed data item and can be used
  wherever an ordinary variable is allowed.  Type conversion rules
  are the same as for variables.  Its form is:

     rname[.cfname...cfname].afname

  Unqualified references refer to a record structure or substructure
  and can be used (in most cases) like arrays, for example:

     rname[.cfname...cfname]

     rname    Is the name used in the RECORD statement to
              identify a record.

     cfname   Is a substructure field name within the record
              identified by record-name.

     afname   Is the name of a typed data item within a structure
              declaration.

55.10.3  –  Aggregate Reference

  An aggregate reference resolves into a reference to a structured
  data item (a record structure or substructure).  For example:

  Data Declarations:

     STRUCTURE /STRA/
         INTEGER  INTFLD, INTFLDARY (10)
     END STRUCTURE
       . . .
     STRUCTURE /STRB/
         CHARACTER*20  CHARFLD
         INTEGER  INTFLD, INTFLDARY (10)
         STRUCTURE STRUCFLD
             COMPLEX  CPXFLD, CPXFLDARY (10)
         END STRUCTURE
         RECORD  /STRA/  RECFLD, RECFLDARY (10)
     END STRUCTURE
       . . .
     RECORD  /STRB/  REC, RECARY (10)

  Reference Examples:

     REC --- A record name
     RECARY(1) --- A record array reference
     REC.RECFLD --- A reference to a substructure
     REC.RECFLDARY(1) --- A reference to a substructure array element
     RECARY(1).RECFLD --- A reference to a substructure in a record
       array element
     RECARY(1).RECFLDARY(1) --- A reference to a substructure array
       element in a record array

55.11  –  VIRTUAL

  The VIRTUAL statement is included for compatibility with PDP-11
  FORTRAN.  It has the same form and effect as the DIMENSION
  statement (see Help Topic:  Statements DIMENSION).

55.12  –  HP Fortran POINTER

  This POINTER statement (formerly the Compaq Fortran POINTER
  statement) is different from the Fortran 95/90 POINTER statement.
  This POINTER statement establishes pairs of variables and pointers,
  in which each pointer contains the address of its paired variable.
  Statement format:

     POINTER ((pointer,pointee) [,(pointer,pointee)]...

     pointer  Is a variable whose value is used as the
              address of the pointee.

     pointee  Is a variable, array, array declarator, record
              structure, record array, or record array
              specification.

  The following are rules and behavior for the "pointer" argument:

   o  Two pointers can have the same value, so pointer aliasing is
      allowed.

   o  When used directly, a pointer is treated like an integer
      variable.  A pointer occupies two numeric storage units, so it
      is a 64-bit quantity (INTEGER*8).

   o  A pointer cannot be a pointee.

   o  A pointer cannot appear in an ASSIGN statement and cannot have
      the following attributes:

         ALLOCATABLE  PARAMETER
         EXTERNAL     POINTER
         INTRINSIC    TARGET

      A pointer can appear in a DATA statement with integer literals
      only.

   o  Integers can be converted to pointers, so you can point to
      absolute memory locations.

   o  A pointer variable cannot be declared to have any other data
      type.

   o  A pointer cannot be a function return value.

   o  You can give values to pointers by doing the following:

       -  Retrieve addresses by using the LOC intrinsic function (or
          %LOC built-in function)

       -  Allocate storage for an object by using the MALLOC
          intrinsic function or LIB$GET_VM

          For example:

             Using %LOC:                   Using MALLOC:

             integer i(10)                 integer i(10)
             integer i1 (10) /10*10/       pointer (p,i)
             pointer (p,i)                 p = malloc (40)
             p = %loc (i1)                 i(2) = i(2) + 1
             i(2) = i(2) + 1

             Using LIB$GET_VM:

             INTEGER I(10)
             INTEGER LIB$GET_VM, STATUS
             POINTER (P,I)
             STATUS = LIB$GET_VM(P,40)
             IF (.NOT. STATUS) CALL EXIT(STATUS)
             I(2) = I(2) + 1

          The value in a pointer is used as the pointee's base
          address.

  The following are rules and behavior for the "pointee" argument:

   o  A pointee is not allocated any storage.  References to a
      pointee look to the current contents of its associated pointer
      to find the pointee's base address.

   o  A pointee can appear in only one POINTER statement.

   o  A pointee array can have fixed, adjustable, or assumed
      dimensions.

   o  A pointee cannot appear in a COMMON, DATA, EQUIVALENCE, or
      NAMELIST statement and cannot have the following attributes:

         ALLOCATABLE    POINTER
         AUTOMATIC      SAVE
         INTENT         STATIC
         OPTIONAL       TARGET
         PARAMETER

   o  A pointee cannot be a dummy argument.

   o  A pointee cannot be a function return value.

   o  A pointee cannot be a record field or an array element.

   o  A pointee cannot be zero-sized.

   o  A pointee cannot be an automatic object.

   o  A pointee cannot be the name of a generic interface block.

   o  If a pointee is of derived type, it must be of sequence type.

56  –  Data

  Each constant, variable, array, expression, or function reference
  in a Fortran statement represents typed data.  The data type of
  these items can be inherent in their constructions, implied by
  convention, or explicitly declared.

  Each data type has a name, a set of associated values, a way to
  denote the values, and operations to manipulate and interpret these
  values.

  There are two categories of data types:  intrinsic and derived.
  The names of the intrinsic data types are predefined and are always
  accessible.  Derived data types are user-defined data types that
  are made up of intrinsic or derived data types.

56.1  –  Arrays

  An array is a set of scalar elements that have the same type and
  kind type parameters.  Any object that is declared with an array
  specification is an array.  Arrays can be declared with a type
  declaration statement, a DIMENSION statement, or a COMMON
  statement.

  An array can be referenced by element (using subscripts), by
  section (using a section subscript list), or as a whole.

  A section subscript list consists of subscripts, subscript
  triplets, or vector subscripts.  At least one subscript in the list
  must be a subscript triplet or vector subscript.

  When an array name without any subscripts appears in an intrinsic
  operation (for example, addition), the operation applies to the
  whole array (all elements in the array).

  An array has the following properties:

   o  Data type

      An array can have any intrinsic or derived type.  The data type
      of an array is either specified in a type declaration
      statement, or implied by the first letter of its name.  All
      elements of the array have the same type and kind type
      parameters.  If a value assigned to an individual array element
      is not the same as the type of the array, it is converted to
      the array's type.

   o  Rank

      The rank of an array is the number of dimensions in the array.
      An array can have up to seven dimensions.  A rank-one array
      represents a column of data (a vector), a rank-two array
      represents a table of data arranged in columns and rows (a
      matrix), a rank-three array represents a table of data on
      multiple pages (or planes), and so forth.

   o  Bounds

      Arrays have a lower and upper bound in each dimension.  These
      bounds determine the range of values that can be used as
      subscripts for the dimension.  The value of either bound can be
      positive, negative, or zero.

      The bounds of a dimension are defined in an array
      specification.

   o  Size

      The size of an array is the total number of elements in the
      array (the product of the array's extents).

      The extent of a dimension is the number of elements in that
      dimension.  It is determined as follows:  upper bound - lower
      bound + 1.  If the value of any of an array's extents is zero,
      the array has a size of zero.

   o  Shape

      The shape of an array is determined by its rank and extents,
      and can be represented as a rank-one array (vector) where each
      element is the extent of the corresponding dimension.

      Two arrays with the same shape are said to be conformable.  A
      scalar is conformable to an array of any shape.

  The name and rank of an array are constant and must be specified
  when the array is declared.  The extent of each dimension can be
  constant, but does not need to be.  The extents can vary during
  program execution if the array is a dummy argument array, an
  automatic array, an array pointer, or an allocatable array.

  A whole array is referenced by the array name.  Individual elements
  in a named array are referenced by a scalar subscript or list of
  scalar subscripts (if there is more than one dimension).  A section
  of a named array is referenced by a section subscript.

  Consider the following array declaration:

    INTEGER L(2:11,3)

  The properties of array L are as follows:

    Data type:   INTEGER
    Rank:        2 (two dimensions)
    Bounds:      First dimension: 2 to 11
                 Second dimension: 1 to 3
    Size:        30 (the product of the extents: 10 x 3)
    Shape:       10 by 3 (a vector of the extents (10,3))

  The following example shows other valid ways to declare this array:

    DIMENSION L(2:11,3)
    INTEGER, DIMENSION(2:11,3) :: L
    COMMON L(2:11,3)

  The following example shows references to array elements, array
  sections, and a whole array:

    REAL B(10)      ! Declares a rank-one array with 10 elements

    INTEGER C(5,8)  ! Declares a rank-two array with 5 elements
                    !   in dimension one and 8 elements in
                    !   dimension two
    ...
    B(3) = 5.0      ! Reference to an array element
    B(2:5) = 1.0    ! Reference to an array section consisting of
                    !   elements: B(2), B(3), B(4), B(5)
    ...
    C(4,8) = I      ! Reference to an array element
    C(1:3,3:4) = J  ! Reference to an array section consisting of
                    !   elements:  C(1,3) C(1,4)
                    !              C(2,3) C(2,4)
                    !              C(3,3) C(3,4)
    B = 99          ! Reference to a whole array consisting of
                    !   elements: B(1), B(2), B(3), B(4), B(5),
                    !   B(6), B(7), B(8), B(9), and B(10)

56.1.1  –  Declarators

  An array specification (or array declarator) declares the shape of
  an array.  It takes the following form:

    (array-spec)

    array-spec   Is one of the following array specifications:

                 Explicit-shape
                 Assumed-shape
                 Assumed-size
                 Deferred-shape

  The array specification is appended to the name of the array when
  the array is declared.

  The following examples show different forms of array
  specifications:

  SUBROUTINE SUB(N, C, D, Z)
    REAL, DIMENSION(N, 15) :: IARRY  ! An explicit-shape array
    REAL C(:), D(0:)                 ! An assumed-shape array
    REAL, POINTER :: B(:,:)          ! A deferred-shape array pointer
    REAL :: Z(N,*)                   ! An assumed-size array

    REAL, ALLOCATABLE, DIMENSION(:) :: K  ! A deferred-shape
                                          !    allocatable array

56.1.1.1  –  Explicit Shape

  An explicit-shape array is declared with explicit values for the
  bounds in each dimension of the array.  An explicit-shape
  specification takes the following form:

     [lower-bound:] upper-bound [,[lower-bound:] upper-bound ]...

  The lower bound (if present) and the upper bound are specification
  expressions that have a positive, negative, or zero value.  If
  necessary, the bound value is converted to integer type.

  If the lower bound is not specified, it is assumed to be 1.

  The bounds can be specified as constant or nonconstant expressions,
  as follows:

   o  If the bounds are constant expressions, the subscript range of
      the array in a dimension is the set of integer values between
      and including the lower and upper bounds.  If the lower bound
      is greater than the upper bound, the range is empty, the extent
      in that dimension is zero, and the array has a size of zero.

   o  If the bounds are nonconstant expressions, the array must be
      declared in a procedure.  The bounds can have different values
      each time the procedure is executed, since they are determined
      when the procedure is entered.

      The bounds are not affected by any redefinition or undefinition
      of the specification variables that occurs while the procedure
      is executing.

      The following explicit-shape arrays can specify nonconstant
      bounds:

         - An automatic array (the array is a local
              variable)
         - An adjustable array (the array is a dummy
              argument to a subprogram)

  The following are examples of explicit-shape specifications:

    INTEGER I(3:8, -2:5) ! Rank-two array; range of dimension one is
    ...                  !  3 to 8, range of dimension two is -2 to 5
    SUBROUTINE SUB(A, B, C)
      INTEGER :: B, C
      REAL, DIMENSION(B:C) :: A  ! Rank-one array; range is B to C

56.1.1.1.1  –  Automatic Arrays

  An automatic array is an explicit-shape array that is a local
  variable.  Automatic arrays are only allowed in function and
  subroutine subprograms, and are declared in the specification part
  of the subprogram.  At least one bound of an automatic array must
  be a nonconstant specification expression.  The bounds are
  determined when the subprogram is called.

  The following example shows automatic arrays:

    SUBROUTINE SUB1 (A, B)
      INTEGER A, B, LOWER
      COMMON /BOUND/ LOWER
      ...
      INTEGER AUTO_ARRAY1(B)
      ...
      INTEGER AUTO_ARRAY2(LOWER:B)
      ...
      INTEGER AUTO_ARRAY3(20, B*A/2)
    END SUBROUTINE

56.1.1.1.2  –  Adjustable Arrays

  An adjustable array is an explicit-shape array that is a dummy
  argument to a subprogram.  At least one bound of an adjustable
  array must be a nonconstant specification expression.  The bounds
  are determined when the subprogram is called.

  The array specification can contain integer variables that are
  either dummy arguments or variables in a common block.

  When the subprogram is entered, each dummy argument specified in
  the bounds must be associated with an actual argument.  If the
  specification includes a variable in a common block, it must have a
  defined value.  The array specification is evaluated using the
  values of the actual arguments, as well as any constants or common
  block variables that appear in the specification.

  The size of the adjustable array must be less than or equal to the
  size of the array that is its corresponding actual argument.

  To avoid possible errors in subscript evaluation, make sure that
  the bounds expressions used to declare multidimensional adjustable
  arrays match the bounds as declared by the caller.

  In the following example, the function computes the sum of the
  elements of a rank-two array.  Notice how the dummy arguments M and
  N control the iteration:

      FUNCTION MY_SUM(A, M, N)
        DIMENSION A(M, N)
        SUMX = 0.0
        DO J = 1, N
          DO I = 1, M
            SUMX = SUMX + A(I, J)
          END DO
        END DO
        MY_SUM = SUMX
      END FUNCTION

  The following are examples of calls on SUM:

    DIMENSION A1(10,35), A2(3,56)
    SUM1 = MY_SUM(A1,10,35)
    SUM2 = MY_SUM(A2,3,56)

56.1.1.2  –  Assumed Shape

  An assumed-shape array is a dummy argument array that assumes the
  shape of its associated actual argument array.  An assumed-shape
  specification takes the following form:

     [lower-bound]: [,[lower-bound]:] ...

  The lower bound is a specification expression.  If the lower bound
  is not specified, it is assumed to be 1.

  The rank of the array is the number of colons (:) specified.

  The value of the upper bound is the extent of the corresponding
  dimension of the associated actual argument array + lower-bound -
  1.

  The following is an example of an assumed-shape specification:

    INTERFACE
      SUBROUTINE SUB(M)
        INTEGER M(:, 1:, 5:)
      END SUBROUTINE
    END INTERFACE
    INTEGER L(20, 5:25, 10)
    CALL SUB(L)

    SUBROUTINE SUB(M)
      INTEGER M(:, 1:, 5:)
    END SUBROUTINE

  Array M has the same extents as array L, but array M has bounds
  (1:20, 1:21, 5:14).

  Note that an explicit interface is required when calling a routine
  that expects an assumed-shape or pointer array.

56.1.1.3  –  Assumed Size

  An assumed-size array is a dummy argument array that assumes the
  size (only) of its associated actual argument array; the rank and
  extents can differ for the actual and dummy arrays.  An
  assumed-size specification takes the following form:

     [exp-shape-spec,] [exp-shape-spec,]... [lower-bound:] *

  The exp-shape-spec is an explicit-shape specification (see DATA
  ARRAY DECL EXPL in online Help).

  The lower bound and upper bound are specification expressions that
  have a positive, negative, or zero value.  If necessary, the bound
  value is converted to integer type.  If a lower bound is not
  specified, it is assumed to be 1.

  The asterisk (*) represents the upper bound of the last dimension.

  The rank of the array is the number of explicit-shape
  specifications plus 1.

  The size of the array is assumed from the actual argument
  associated with the assumed-size dummy array as follows:

   o  If the actual argument is an array of type other than default
      character, the size of the dummy array is the size of the
      actual array.

   o  If the actual argument is an array element of type other than
      default character, the size of the dummy array is a + 1 - s,
      where "s" is the subscript value and "a" is the size of the
      actual array.

   o  If the actual argument is a default character array, array
      element, or array element substring, and it begins at character
      storage unit b of an array with n character storage units, the
      size of the dummy array is as follows:

        MAX(INT((n + 1 - b) / y), 0)

      The "y" is the length of an element of the dummy array.

  An assumed-size array can only be used as a whole array reference
  in the following cases:

   o  When it is an actual argument in a procedure reference that
      does not require the shape

   o  In the intrinsic function LBOUND

  Because the actual size of an assumed-size array is unknown, an
  assumed-size array cannot be used as any of the following in an I/O
  statement:

   o  An array name in the I/O list

   o  A unit identifier for an internal file

   o  A run-time format specifier

  The following is an example of an assumed-size specification:

    SUBROUTINE SUB(A, N)
      REAL A, N
      DIMENSION A(1:N, *)
      ...

56.1.1.4  –  Deferred Shape

  A deferred-shape array is an array pointer or an allocatable array.

  The array specification contains a colon (:) for each dimension of
  the array.  No bounds are specified.  The bounds (and shape) of
  allocatable arrays and array pointers are determined when space is
  allocated for the array during program execution.

  An array pointer is an array declared with the POINTER attribute.
  Its bounds and shape are determined when it is associated with a
  target by pointer assignment, or when the pointer is allocated by
  execution of an ALLOCATE statement.

  In pointer assignment, the lower bound of each dimension of the
  array pointer is the result of the LBOUND intrinsic function
  applied to the corresponding dimension of the target.  The upper
  bound of each dimension is the result of the UBOUND intrinsic
  function applied to the corresponding dimension of the target.

  A pointer dummy argument can be associated only with a pointer
  actual argument.  An actual argument that is a pointer can be
  associated with a nonpointer dummy argument.

  A function result can be declared to have the pointer attribute.

  An allocatable array is declared with the ALLOCATABLE attribute.
  Its bounds and shape are determined when the array is allocated by
  execution of an ALLOCATE statement.

  The following are examples of deferred-shape specifications:

    REAL, ALLOCATABLE :: A(:,:)       ! Allocatable array
    REAL, POINTER :: C(:), D (:,:,:)  ! Array pointers

56.1.2  –  Whole Arrays

  A whole array is referenced by the name of the array (without any
  subscripts).  It can be a named constant or a variable.

  If a whole array appears in a nonexecutable statement, the
  statement applies to the entire array.  For example:

    INTEGER, DIMENSION(2:11,3) :: L   ! Specifies the type and
                                      !    dimensions of array L

  If a whole array appears in an executable statement, the statement
  applies to all of the elements in the array.  For example:

    L = 10             ! The value 10 is assigned to all the
                       !   elements in array L

    WRITE *, L         ! Prints all the elements in array L

56.1.3  –  Subscripts

  Arrays can be referenced by individual elements or by a range of
  elements (array sections).  A subscript list (appended to the array
  name) indicates which array element or array section is being
  referenced.

  In the subscript list for an array section, at least one of the
  subscripts must be a subscript triplet or vector subscript.

  VSI Fortran permits intrinsic noninteger expressions for
  subscripts, but they are converted to integers before use (any
  fractional parts are truncated).

56.1.4  –  Elements

  An array element is one of the scalar data items that make up an
  array.  A subscript list (appended to the array or array component)
  determines which element is being referred to.  A reference to an
  array element takes the following form:

    array [(s-list)]

      array   Is the name of an array.

      s-list  Is a list of one or more subscripts. The
              number of subscripts must equal the rank of
              the array.

              Each subscript must be a scalar numeric
              expression with a value that is within the
              bounds of its dimension.

  Each array element inherits the type, kind type parameter, and
  certain attributes (INTENT, PARAMETER, and TARGET) of the parent
  array.  An array element cannot inherit the POINTER attribute.

  If an array element is of type character, it can be followed by a
  substring range in parentheses; for example:

    ARRAY_D(1,2) (1:3)    ! elements are substrings of length 3

  However, by convention, such an object is considered to be a
  substring rather than an array element.

  The following are some valid array element references for an array
  declared as REAL B(10,20):  B(1,3), B(10,10), and B(5,8).

  For information on arrays as structure components, see DATA DERIVED
  COMP in online Help.

56.1.4.1  –  Order of Elements

  The elements of an array form a sequence known as the array element
  order.  The position of an element in this sequence is its
  subscript order value.

  The elements of an array are stored as a linear sequence of values.
  A one-dimensional array is stored with its first element in the
  first storage location and its last element in the last storage
  location of the sequence.  A multidimensional array is stored so
  that the leftmost subscripts vary most rapidly.  This is called the
  order of subscript progression.

  In an array section, the subscript order of the elements is their
  order within the section itself.  For example, if an array is
  declared as B(20), the section B(4:19:4) consists of elements B(4),
  B(8), B(12), and B(16).  The subscript order value of B(4) in the
  array section is 1; the subscript order value of B(12) in the
  section is 3.

56.1.5  –  Sections

  An array section is a portion of an array that is an array itself.
  It is an array subobject.  A section subscript list (appended to
  the array or array component) determines which portion is being
  referred to.  A reference to an array section takes the following
  form:

     array [(sect-s-list)] [(substring-range)]

     array            Is the name of an array.

     sect-s-list      Is a list of one or more section
                      subscripts (subscripts, subscript
                      triplets, or vector subscripts)
                      indicating a set of elements along
                      a particular dimension.

                      At least one of the items in the section
                      subscript list must be a subscript
                      triplet or vector subscript. Each
                      subscript and subscript triplet must be
                      a scalar numeric expression. Each vector
                      subscript must be a rank-one integer
                      expression.

     substring-range  Is a substring range in the form
                      [expr]:[expr].  Each expression specified
                      must be a scalar numeric expression.

                      The array (or array component) preceding
                      the substring range must be of type character.

  If no section subscript list is specified, the rank and shape of
  the array section is the same as the parent array.

  Otherwise, the rank of the array section is the number of vector
  subscripts and subscript triplets that appear in the list.  Its
  shape is a rank-one array where each element is the number of
  integer values in the sequence indicated by the corresponding
  subscript triplet or vector subscript.

  If any of these sequences is empty, the array section has a size of
  zero.  The subscript order of the elements of an array section is
  that of the array object that the array section represents.

  Each array section inherits the type, kind type parameter, and
  certain attributes (INTENT, PARAMETER, and TARGET) of the parent
  array.  An array section cannot inherit the POINTER attribute.

  The following shows valid references to array sections:

    REAL, DIMENSION(20) :: B
    ...
    PRINT *, B(2:20:5)  ! the section consists of elements
                        !     B(2), B(7), B(12), and B(17)
    K = (/3, 1, 4/)

    B(K) = 0.0  ! section B(K) is a rank-one array with
                ! shape (3) and size 3. (0.0 is assigned to
                ! B(1), B(3), and B(4).)

  Consider the following declaration:

    CHARACTER(LEN=15) C(10,10)

  An array section referenced as C(:,:)(1:3) is an array of shape
  (10,10) whose elements are substrings of length 3 of the
  corresponding elements of C.

56.1.5.1  –  Triplets

  A subscript triplet consists of three parts:  the first two parts
  designate a range of subscript values and the third part designates
  the increment (stride) between each value.  It takes the following
  form:

    [subscript-1] : [subscript-2] [:stride]

    subscript-1   Is a scalar numeric expression representing
                  the first value in the subscript sequence.
                  If omitted, the declared lower bound of the
                  dimension is used.

    subscript-2   Is a scalar numeric expression representing
                  the last value in the subscript sequence.
                  If omitted, the declared upper bound of the
                  dimension is used.

                  When indicating sections of an assumed-size
                  array, this subscript must be specified.

    stride        Is a scalar numeric expression representing
                  the increment between successive subscripts
                  in the sequence.  It must have a nonzero value.
                  If it is omitted, it is assumed to be 1.

  The stride has the following effects:

   o  If the stride is positive, the subscript range starts with the
      first subscript and is incremented by the value of the stride,
      until the largest value less than or equal to the second
      subscript is attained.

      For example, if an array has been declared as B(6,3,2), the
      array section specified as B(2:4,1:2,2) is a rank-two array
      with shape (3,2) and size 6.  It consists of the following six
      elements:

          B(2,1,2)   B(2,2,2)
          B(3,1,2)   B(3,2,2)
          B(4,1,2)   B(4,2,2)

      If the first subscript is greater than the second subscript,
      the range is empty.

   o  If the stride is negative, the subscript range starts with the
      value of the first subscript and is decremented by the absolute
      value of the stride, until the smallest value greater than or
      equal to the second subscript is attained.

      For example, if an array has been declared as A(15), the array
      section specified as A(10:3:-2) is a rank-one array with shape
      (4) and size 4.  It consists of the following four elements:

          A(10)
          A(8)
          A(6)
          A(4)

      If the second subscript is greater than the first subscript,
      the range is empty.

  If a range specified by the stride is empty, the array section has
  a size of zero.

  A subscript in a subscript triplet need not be within the declared
  bounds for that dimension if all values used to select the array
  elements are within the declared bounds.  For example, if an array
  has been declared as A(15), the array section specified as
  A(4:16:10) is valid.  The section is a rank-one array with shape
  (2) and size 2.  It consists of elements A(4) and A(14).

  If the subscript triplet does not specify bounds or stride, but
  only a colon (:), the entire declared range for the dimension is
  used.

56.1.5.2  –  Vector Subscripts

  A vector subscript is a rank-one array of integer values (within
  the declared bounds for the dimension).  It is used to select a
  sequence of elements from a parent array.  The sequence does not
  have to be in order, and it can contain duplicate values.

  For example, A is a rank-two array of shape (4,6).  B and C are
  rank-one arrays of shape (2) and (3), respectively, with the
  following values:

    B = (/1,4/)
    C = (/2,1,1/)         ! Will result in a many-one
                          !   array section

  Array section A(3,B) consists of elements A(3,1) and A(3,4).  Array
  section A(C,1) consists of elements A(2,1), A(1,1), and A(1,1).
  Array section A(B,C) consists of the following elements:

    A(1,2)   A(1,1)   A(1,1)
    A(4,2)   A(4,1)   A(4,1)

  An array section with a vector subscript that has two or more
  elements with the same value is called a many-one array section.  A
  many-one section must not appear on the left of the equals sign in
  an assignment statement, or as an input item in a READ statement.

  The following assignments to C also show examples of vector
  subscripts:

    INTEGER A(2), B(2), C(2)
    ...
    B    = (/1,2/)
    C(B) = A(B)
    C    = A((/1,2/))

  An array section with a vector subscript must not be any of the
  following:

   o  An internal file

   o  An actual argument associated with a dummy array that is
      defined or redefined (if the INTENT attribute is specified, it
      must be INTENT(IN))

   o  The target in a pointer assignment statement

  If the sequence specified by the vector subscript is empty, the
  array section has a size of zero.

56.1.6  –  Constructors

  An array constructor is a sequence of scalar values that is
  interpreted as a rank-one array.  The array element values are
  those specified in the sequence.  An array constructor takes the
  following form:

     (/ac-value-list/)

     ac-value-list  Is a list of one or more expressions
                    or implied-do loops. Each ac-value must
                    have the same type and kind type parameter.

  An implied-do loop in an array constructor takes the following
  form:

    (ac-value-expr, do-variable = expr1, expr2 [,expr3])

    ac-value-expr  Is a scalar expression evaluated for each
                   value of the d-variable to produce an array
                   element value.

    do-variable    Is the name of a scalar integer variable.
                   Its scope is that of the implied-do loop.

    expr           Is a scalar integer expression. The expr1
                   and expr2 specify a range of values for
                   the loop; expr3 specifies the stride.

  The array constructor has the same type as the ac-value-list
  expressions.

  If the sequence of values specified by the array constructor is
  empty (there are no expressions or the implied-do loop produces no
  values), the rank-one array has a size of zero.

  The ac-value specifies the following:

   o  If it is a scalar expression, its value specifies an element of
      the array constructor.

   o  If it is an array expression, the values of the elements of the
      expression, in array element order, specify the corresponding
      sequence of elements of the array constructor.

   o  If it is an implied-do loop, it is expanded to form an array
      constructor value sequence under the control of the DO
      variable, as in the DO construct.

  If every expression in an array constructor is a constant
  expression, the array constructor is a constant expression.

  If an implied-do loop is contained within another implied-do loop
  (nested), they cannot have the same DO variable (do-variable).

  There are three forms for an ac-value, as follows:

    C1 = (/4,8,7,6/)                  ! A scalar expression
    C2 = (/B(I, 1:5), B(I:J, 7:9)/)   ! An array expression
    C3 = (/(I, I=1, 4)/)              ! An implied-do loop

  You can also mix these forms, for example:

    C4 = (/4, A(1:5), (I, I=1, 4), 7/)

  To define arrays of more than one dimension, use the RESHAPE
  intrinsic function.

  The following are alternative forms for array constructors:

   o  Square brackets (instead of parentheses and slashes) to enclose
      array constructors; for example, the following two array
      constructors are equivalent:

        INTEGER C(4)
        C = (/4,8,7,6/)
        C = [4,8,7,6]

   o  A colon-separated triplet (instead of an implied-do loop) to
      specify a range of values and a stride; for example, the
      following two array constructors are equivalent:

        INTEGER D(3)
        D = (/1:5:2/)              ! Triplet form
        D = (/(I, I=1, 5, 2)/)     ! Implied-do loop form

  The following example shows an array constructor using an
  implied-do loop:

    INTEGER ARRAY_C(10)
    ARRAY_C = (/(I, I=30, 48, 2)/)

  The values of ARRAYC are the even numbers 30 through 48.

  The following example shows an array constructor of derived type
  that uses a structure constructor:

    TYPE EMPLOYEE
      INTEGER ID
      CHARACTER(LEN=30) NAME
    END TYPE EMPLOYEE

    TYPE(EMPLOYEE) CC_4T(4)
    CC_4T = (/EMPLOYEE(2732,"JONES"), EMPLOYEE(0217,"LEE"),     &
              EMPLOYEE(1889,"RYAN"), EMPLOYEE(4339,"EMERSON")/)

  The following example shows how the RESHAPE intrinsic function is
  used to create a multidimensional array:

    E = (/2.3, 4.7, 6.6/)
    D = RESHAPE(SOURCE = (/3.5,(/2.0,1.0/),E/), SHAPE = (/2,3/))

  D is a rank-two array with shape (2,3) containing the following
  elements:

    3.5   1.0   4.7
    2.0   2.3   6.6

56.1.7  –  Dynamic Data

  Allocatable arrays and pointer targets can be dynamically allocated
  (created) and deallocated (freed), by using the ALLOCATE and
  DEALLOCATE statements, respectively.

  Pointers are associated with targets by pointer assignment or by
  allocating the target.  They can be dynamically disassociated from
  targets by using the NULLIFY statement.

56.2  –  Constants

  A constant is a fixed value.  The value of a constant can be a
  numeric value, a logical value, or a character string.

  A constant that has a name is a named constant.  A named constant
  can be of any type, including derived type, and it can be
  array-valued.  A named constant has the PARAMETER attribute and is
  specified in a type declaration statement or PARAMETER statement.

  A constant that does not have a name is a literal constant.  A
  literal constant must be of intrinsic type and it cannot be
  array-valued.

  There are nine types of literal constants:  integer, real, complex,
  binary, octal, hexadecimal, logical, character, and Hollerith.
  Binary, octal, hexadecimal, and Hollerith constants have no data
  type; they assume a data type that conforms to the context in which
  they are used.

56.2.1  –  Binary

  You can use this type of constant wherever numeric constants are
  allowed; it assumes a numeric data type according to its context.

  A binary constant has one of these forms:

    B'd[d...]'
    B"d[d...]"

    d   Is a binary (base 2) digit (0 or 1).

  You can specify up to 128 binary digits in a binary constant.

56.2.2  –  Character

  A character constant is a string of printable ASCII characters
  enclosed by delimiters.  It takes one of the following forms:

    [k_]'[c...]' [C]
    [k_]"[c...]" [C]

    k  Is an optional kind type parameter (1 is the default).
       It must be followed by an underscore.

    c  Is an ASCII character.

    C  Is a C string specifier.

  If no kind type parameter is specified, the type is default
  character.

  The length of the character constant is the number of characters
  between the delimiters.  In the apostrophe format, two consecutive
  apostrophes represent a single apostrophe.  In the quotation mark
  format, two consecutive quotation marks represent a single
  quotation mark.

  The length of a character constant must be in the range 0 to 2000.

56.2.2.1  –  C Strings

  String values in the C language are terminated with null characters
  (CHAR(0)) and can contain nonprintable characters (such as a
  backspace).

  Nonprintable characters are specified by escape sequences.  An
  escape sequence is denoted by using the backslash (\) as an escape
  character, followed by a single character indicating the
  nonprintable character desired.

  This type of string is specified by using a standard string
  constant followed by the character C.  The standard string constant
  is then interpreted as a C-language constant.  Backslashes are
  treated as escapes, and a null character is automatically appended
  to the end of the string (even if the string already ends in a null
  character).

  The following C-style escape sequences are allowed in character
  constants:

     Escape Sequence      Represents
     ---------------      ----------
     \a or \A             A bell
     \b or \B             A backspace
     \f or \F             A formfeed
     \n or \N             A new line
     \r or \R             A carriage return
     \t or \T             A horizontal tab
     \v or \V             A vertical tab
     \x"hh" or \X"hh"     A hexadecimal bit pattern
     \"ooo"               An octal bit pattern
     \0                   A null character
     \\                   A backslash

  If a character constant contains any other escape sequence, the
  backslash is ignored.

  A C string must also be a valid Fortran string.  If the string is
  delimited by apostrophes, apostrophes in the string itself must be
  represented by two consecutive apostrophes ('').

  For example, the escape sequence \'string causes a compiler error
  because Fortran interprets the apostrophe as the end of the string.
  The correct form is \''string.

  If the string is delimited by quotation marks, quotation marks in
  the string itself must be represented by two consecutive quotation
  marks ("").

  The sequences \"ooo" and \x"hh" allow any ASCII character to be
  given as a one- to three-digit octal or a one- to two-digit
  hexadecimal character code.  Each octal digit must be in the range
  0 to 7, and each hexadecimal digit must be in the range 0 to F.
  For example, the C strings '\010'C and '\x08'C) both represent a
  backspace character followed by a null character.

  The C string '\\abcd'C) is equivalent to the string '\abcd' with a
  null character appended.  The string ''C represents the ASCII null
  character.

56.2.3  –  Complex

  A complex constant consists of a pair of real or integer constants.
  The two constants are separated by a comma and enclosed in
  parentheses.  The first constant represents the real part of the
  number and the second constant represents the imaginary part.

  VSI Fortran provides three kind type parameters for data of type
  complex:  COMPLEX(KIND=4) (or COMPLEX*8), COMPLEX(KIND=8) (or
  COMPLEX*16), and COMPLEX(KIND=16).  COMPLEX(KIND=8) is DOUBLE
  COMPLEX.  The type specifier for the complex type is COMPLEX; the
  type specifier for the double complex type is DOUBLE COMPLEX.

  If a kind type parameter is specified, the complex constant has the
  kind specified.  If no kind type parameter is specified, the kind
  type of both parts is default real, and the constant is of type
  default complex.

  A COMPLEX (COMPLEX(KIND=4) or COMPLEX*8) constant has
  the form:

   (c,c)

    c   Is an integer or REAL (REAL(KIND=4) or REAL*4)
        constant

  A DOUBLE COMPLEX (COMPLEX(KIND=8) or COMPLEX*16) constant
  has the form:

   (c,c)

    c   Is an integer, REAL (REAL(KIND=4) or REAL*4), or
        DOUBLE PRECISION (REAL(KIND=8) or REAL*8) constant.
        At least one of the pair must be a DOUBLE PRECISION
        constant.

  A COMPLEX(KIND=16) or COMPLEX*32 constant has the form:

   (c,c)

    c   Is an integer, REAL (REAL(KIND=4) or REAL*4),
        DOUBLE PRECISION (REAL(KIND=8) or REAL*8), or
        REAL (KIND=16) (or REAL*16) constant.  At least
        one of the pair must be a a REAL(KIND=16)constant.

  Note that the comma and parentheses are required.

56.2.4  –  Hexadecimal

  You can use this type of constant wherever numeric constants are
  allowed; it assumes a numeric data type according to its context.

  A hexadecimal constant has one of these forms:

    Z'd[d...]'
    Z"d[d...]"

    d   Is a hexadecimal (base 16) digit in the range 0 - 9,
        or a letter in the range A - F, or a - f

  You can specify up to 128 bits in hexadecimal (32 hexadecimal
  digits) constants.  Leading zeros are ignored.

56.2.5  –  Hollerith

  A Hollerith constant is a string of printable characters preceded
  by a character count and the letter H.  It is used only in numeric
  expressions and has the form:

    nHc[c...]

    n     Is an unsigned, nonzero integer constant stating the
          number of characters in the string (including tabs
          and spaces).

    c     Is a printable ASCII character.

  A Hollerith constant can be a string of 1 to 2000 characters and is
  stored as a byte string, one character per byte.

  Hollerith constants have no data type, but assume a numeric data
  type according to the context in which they are used.  They assume
  data types according to the following rules:

   o  When the constant is used with a binary operator, including the
      assignment operator, the data type of the constant is the data
      type of the other operand.

   o  When a specific data type is required, that type is assumed for
      the constant.

   o  When the constant is used as an actual argument, no data type
      is assumed.

  When the length of the constant is less than the length implied by
  the data type, blanks are appended to the constant on the right.

  When the length of the constant is greater than the length implied
  by the data type, the constant is truncated on the right.  If any
  characters other than blank characters are truncated, an error
  occurs.

56.2.6  –  Integer

  An integer constant is a whole number with no decimal point.  It
  can have a leading sign and is interpreted as a decimal number.

  VSI Fortran provides four kind type parameters for data of type
  integer:  INTEGER(KIND=1) (or INTEGER*1), INTEGER(KIND=2) (or
  INTEGER*2), INTEGER(KIND=4) (or INTEGER*4), and INTEGER(KIND=8) (or
  INTEGER*8).

  The type specifier for the integer type is INTEGER.

  If a kind type parameter is specified, the integer has the kind
  specified.  If a kind type parameter is not specified, integer
  constants are interpreted as follows:

   o  If the integer constant is within the default integer kind, the
      kind is default integer.

   o  If the integer constant is outside the default integer kind,
      the kind type of the integer constant is the smallest integer
      kind which holds the constant.

  Integer constants take the following form:

    [s]n[n...][_k]

    s   Is a sign; required if negative (-), optional if
        positive (+).

    n   Is a decimal digit (0 through 9).  Any leading
        zeros are ignored.

    k   Is an optional kind type parameter (1 for
        INTEGER(KIND=1), 2 for INTEGER(KIND=2), 4 for
        INTEGER(KIND=4), and 8 for INTEGER(KIND=8)). It
        must be preceded by an underscore (_).

  An unsigned constant is assumed to be nonnegative.

  Integers are expressed in decimal values (base 10) by default.

  To specify a constant that is not in base 10, use the following
  syntax:

    [s][[base] #]nnn...

    s     Is a sign; required if negative (-), optional if
          positive (+).

    base  Is any constant from 2 through 36.

  If "base" is omitted but # is specified, the integer is interpreted
  in base 16.  If both "base" and # are omitted, the integer is
  interpreted in base 10.

  For bases 11 through 36, the letters A through Z represent numbers
  greater than 9.  For example, for base 36, A represents 10, B
  represents 11, C represents 12, and so on, through Z, which
  represents 35.  The case of the letters is not significant.

  For example, the following integers are all assigned a value equal
  to 3994575 decimal:

  I     = 2#1111001111001111001111
  K     = #3CF3CF
  n     = +17#2DE110
  index = 36#2DM8F

  You can use integer constants to assign values to data.  The
  integer data types have the following ranges:

    BYTE         Same range as INTEGER*1

    INTEGER*1    Signed integers: -128 to 127 (-2**7 to 2**7-1)
    (1 byte)     Unsigned integers: 0 to 255 (2**8-1)

    INTEGER*2    Signed integers: -32768 to 32767
    (2 bytes)                     (-2**15 to 2**15-1)
                 Unsigned integers: 0 to 65535 (2**16-1)

    INTEGER*4    Signed integers: -2147483648 to 2147483647
    (4 bytes)                          (-2**31 to 2**31-1)
                 Unsigned integers: 0 to 4294967295 (2**32-1)

    INTEGER*8    Signed integers: -9223372036854775808 to
    (8 bytes)    9223372036854775807 (-2**63 to 2**63-1)

  NOTE1: The value of an integer constant must be within
         INTEGER(KIND=8) range.

  NOTE2: The "unsigned" ranges above are allowed for assignment
         to variables of these types, but the data type is
         treated as signed in arithmetic operations.

56.2.7  –  Logical

  A logical constant represents only the logical values true or
  false.  It takes one of these forms:

    .TRUE.[_k]
    .FALSE.[_k]

    k   Is an optional kind type parameter (1 for
        LOGICAL(KIND=1), 2 for LOGICAL(KIND=2), 4 for
        LOGICAL(KIND=4), and 8 for LOGICAL(KIND=8)).
        It must be preceded by an underscore (_).

  The type specifier for the logical type is LOGICAL.

  If a kind type parameter is specified, the logical constant has the
  kind specified.  If no kind type parameter is specified, the kind
  type of the constant is default logical.

  Note that logical data type ranges correspond to their comparable
  integer data type ranges.  For example, the LOGICAL*2 range is the
  same as the INTEGER*2 range.

56.2.8  –  Octal

  You can use this type of constant wherever numeric constants are
  allowed; it assumes a numeric data type according to its context.

  An octal constant has one of these forms:

    O'd[...d]'
    O"d[...d]"

    d   Is an octal (base 8) digit in the range 0 - 7.

  You can specify up to 128 bits in octal (43 octal digits)
  constants.  Leading zeros are ignored.

56.2.9  –  Real

  A real constant approximates the value of a mathematical real
  number.  The value of the constant can be positive, zero, or
  negative.

  VSI Fortran provides three kind type parameters for data of type
  real:  REAL(KIND=4) (or REAL*4), REAL(KIND=8) (or REAL*8), and
  REAL(KIND=16) (or REAL*16).  REAL(KIND=8) is DOUBLE PRECISION.  If
  DOUBLE PRECISION is used, a kind type parameter must not be
  specified for the constant.

  The type specifier for the real (single-precision) type is REAL;
  the type specifier for the double precision type is DOUBLE
  PRECISION.

  If a kind type parameter is specified, the real constant has the
  kind specified.  If a kind type parameter is not specified, the
  kind is default real.

  The following is the general form of a real constant with no
  exponent part:

    [s]n[n...][_k]

  A real constant with an exponent part has one of the following
  forms:

    [s]n[n...]E[s]nn...[_k]
    [s]n[n...]D[s]nn...
    [s]n[n...]Q[s]nn...

     s   Is a sign; required if negative (-), optional if
         positive (+).

     n   Is a decimal digit (0 through 9). A decimal point
         must appear if the real constant has no exponent part.

     k   Is an optional kind type parameter (4 for REAL(KIND=4),
         8 for REAL(KIND=8), or 16 for REAL(KIND=16)).  It must
         be preceded by an underscore (_).

  Leading zeros (zeros to the left of the first nonzero digit) are
  ignored in counting significant digits.  For example, in the
  constant 0.00001234567, all of the nonzero digits, and none of the
  zeros, are significant.  (See the following sections for the number
  of significant digits each kind type parameter typically has).

  The exponent represents a power of 10 by which the preceding real
  or integer constant is to be multiplied (for example, 1.0E6
  represents the value 1.0 * 10**6).

  A real constant with no exponent part is (by default) a
  single-precision (REAL(KIND=4)) constant.  You can change this
  default behavior by specifying the compiler option
  /ASSUME=FPCONSTANT.

  If the real constant has no exponent part, a decimal point must
  appear in the string (anywhere before the optional kind type
  parameter).  If there is an exponent part, a decimal point is
  optional in the string preceding the exponent part; the exponent
  part must not contain a decimal point.

  The exponent letter E denotes a single-precision real (REAL(KIND=4)
  or REAL*4) constant, unless the optional kind type parameter
  specifies otherwise.  For example, -9.E2_8 is a double-precision
  constant (which can also be written as -9.D2).

  The exponent letter D denotes a double-precision real (REAL(KIND=8)
  or REAL*8) constant.

  The exponent letter Q denotes a quad-precision real (REAL(KIND=16)
  or REAL*16) constant.  A minus sign must appear before a negative
  real constant; a plus sign is optional before a positive constant.
  Similarly, a minus sign must appear between the exponent letter (E,
  D, or Q) and a negative exponent, whereas a plus sign is optional
  between the exponent letter and a positive exponent.

  If the real constant includes an exponent letter, the exponent
  field cannot be omitted, but it can be zero.

  To specify a real constant using both an exponent letter and a kind
  type parameter, the exponent letter must be E, and the kind type
  parameter must follow the exponent part.

56.2.9.1  –  DOUBLE_PRECISION

  See DATA CONSTANTS REAL REAL_8 in this Help file.

56.2.9.2  –  REAL_4

  REAL(KIND=4) or REAL*4

  A single-precision REAL constant occupies four bytes of memory.
  The number of digits is unlimited, but typically only the leftmost
  seven digits are significant.

  Either VAX F_floating or IEEE S_floating format is used, depending
  on the compiler option specified.

56.2.9.3  –  REAL_8

  DOUBLE PRECISION (REAL(KIND=8) or REAL*8)

  A DOUBLE PRECISION constant has more than twice the accuracy of a
  REAL number, and greater range.

  A DOUBLE PRECISION constant occupies eight bytes of memory.  The
  number of digits that precede the exponent is unlimited, but
  typically only the leftmost 15 digits are significant.

  Either VAX D_floating, G_floating, or IEEE T_floating format is
  used, depending on the compiler option specified.

56.2.9.4  –  REAL_16

  REAL(KIND=16) or REAL*16

  A REAL(KIND=16) constant has more than four times the accuracy of a
  REAL number, and a greater range.

  A REAL(KIND=16) constant occupies 16 bytes of memory.  The number
  of digits that precede the exponent is unlimited, but typically
  only the leftmost 33 digits are significant.

56.2.10  –  Type of BOH Constants

  Binary, octal, and hexadecimal constants are "typeless" numeric
  constants.  They assume data types based on their usage, according
  to the following rules:

   o  When the constant is used with a binary operator, including the
      assignment operator, the data type of the constant is the data
      type of the other operand.

   o  When a specific data type is required, that type is assumed for
      the constant.

   o  When the constant is used as an actual argument, if the bit
      constant is greater than 4 bytes, INTEGER*8 is assumed;
      otherwise, INTEGER*4 is assumed.

   o  When the constant is used in any other context, an INTEGER*4
      data type is assumed (unless a compiler option indicating
      integer size specifies otherwise).

  These constants specify up to 16 bytes of data.  When the length of
  the constant is less than the length implied by the data type, the
  leftmost digits have a value of zero.

  When the length of the constant is greater than the length implied
  by the data type, the constant is truncated on the left.  An error
  results if any nonzero digits are truncated.

56.3  –  Derived Types

  Like intrinsic data types, a Fortran 95/90 derived data type has a
  name, a set of associated values, a way to denote the values, and
  operations to manipulate and interpret these values.

  The names of the intrinsic data types are predefined, while the
  names of derived types are defined in derived-type definitions.

  A derived-type definition specifies the name of the type and the
  types of its components.  A derived type can be resolved into
  "ultimate" components that are either of intrinsic type or are
  pointers.

  The set of values for a specific derived type consists of all
  possible sequences of component values permitted by the definition
  of that derived type.  Structure constructors are used to specify
  values of derived types.

  Nonintrinsic assignment for derived-type entities must be defined
  by a subroutine with an ASSIGNMENT interface.  Any operation on
  derived-type entities must be defined by a function with an
  OPERATOR interface.  Arguments and function values can be of any
  intrinsic or derived type.

56.3.1  –  Type Definitions

  A derived-type definition specifies the name of a user-defined type
  and the types of its components.  It takes the following form:

    TYPE [[, PRIVATE or PUBLIC] :: ] name
      [PRIVATE or SEQUENCE]...
      comp-def
      [comp-def]...
    END TYPE [name]

    name      Is the name of the derived type. It must not be
              the same as the name of any intrinsic type, or
              the same as the name of a derived type that can be
              accessed from a module.

    comp-def  There must be at least one.  It takes the following
              form:

       type [ [, attr-list] ::] comp [(a-spec)] [*char-len] [init_ex]

    type      Is a type specifier.  It can be an intrinsic type
              or a previously defined derived type. (If the POINTER
              attribute follows this specifier, the type can also be
              any accessible derived type, including the type
              being defined.)

    attr-list Is an optional list of component attributes POINTER
              or DIMENSION.  You can specify one or both attributes.
              If DIMENSION is specified, it can be followed by an
              array specification.

    comp      Is the name of the component being defined.

    a-spec    Is an optional array specification, enclosed in
              parentheses.  If POINTER is specified, the array is
              deferred-shape; otherwise, it is explicit-shape.

              In an explicit-shape specification, each bound must
              be a constant scalar integer expression.

    char-len  Is an optional scalar integer literal constant; it
              must be preceded by an asterisk (*).  This parameter
              can only be specified if the component is of type
              CHARACTER.

    init_ex   Is an initialization expression or, for pointer
              objects, =>NULL().

  If a name is specified following the END TYPE statement, it must be
  the same name that follows TYPE in the derived type statement.

  Within a scoping unit, a derived-type name can only be defined
  once.  If the same derived-type name appears in a derived-type
  definition in another scoping unit, it is treated independently.

  A component name has the scope of the derived-type definition only.
  Therefore, the same name can be used in another derived-type
  definition in the same scoping unit.

  Two entities can have the same derived type in the following cases:

   o  If they are both declared to be of the same derived type, and
      the derived-type definition can be accessed from the same
      module, the same scoping unit, or a host scoping unit.

   o  If they are both declared to be of the same derived type, and
      the derived-type definition can be accessed from the same
      scoping unit or a host scoping unit.

   o  If they are both declared in a derived-type definition
      specifying SEQUENCE (they both have sequence type).

      A sequence type can be defined in each scoping unit that needs
      to access the type.  Each derived-type definition must specify
      the same name, the keyword SEQUENCE, and have components that
      agree in order, name, and attributes.  (No private components
      are allowed in a sequence type.)

  The same PRIVATE or SEQUENCE statements can only appear once in a
  given derived-type definition.

  If SEQUENCE is present, all derived types specified in component
  definitions must be sequence types.

  The PUBLIC or PRIVATE keywords can only appear if the derived-type
  definition is in the specification part of a module.

  The POINTER or DIMENSION attribute can only appear once in a given
  comp-def.

  A component is an array if the component definition contains a
  DIMENSION attribute or an array specification.  If the component
  definition contains an array specification, the array bounds should
  be specified there; otherwise, they must be specified following the
  DIMENSION attribute.

  If an initialization expression ("init_ex") appears for a
  nonpointer component, the component (in any object of the type) is
  initially defined with the value determined from the initialization
  expression.  The initialization expression is evaluated in the
  scoping unit of the type definition.

  The initialization expression overrides any default initial value
  specified for the component.  Explicit initialization in a type
  declaration statement overrides default initialization.

  If POINTER appears in the comp-def, the component is a pointer.
  Pointers can have an association status of associated,
  disassociated, or undefined.  If no default initialization status
  is specified, the status of the pointer is undefined.  To specify
  disassociated status for a pointer component, use =>NULL().

56.3.2  –  Components

  A reference to a component of a derived-type structure takes the
  following form:

    parent [%component [(s-list)]]... %component [(s-list)]

    parent    Is the name of a scalar or array of derived type.
              The percent sign (%) is called a component selector.

    component Is the name of a component of the immediately
              preceding parent or component.

    s-list    Is a list of one or more subscripts. If the list
              contains subscript triplets or vector subscripts,
              the reference is to an array section.

              Each subscript must be a scalar numeric expression
              with a value that is within the bounds of its
              dimension.

              The number of subscripts in any s-list must equal
              the rank of the immediately preceding parent or
              component.

  Each parent or component (except the rightmost) must be of derived
  type.

  The parent or one of the components can have nonzero rank (be an
  array).  Any component to the right of a parent or component of
  nonzero rank must not have the POINTER attribute.

  The rank of the structure component is the rank of the part (parent
  or component) with nonzero rank (if any); otherwise, the rank is
  zero.  The type and type parameters (if any) of a structure
  component are those of the rightmost part name.

  The structure component must not be referenced or defined before
  the declaration of the parent object.

  If the parent object has the INTENT, TARGET, or PARAMETER
  attribute, the structure component also has the attribute.

56.3.2.1  –  Examples

  The following example shows a derived-type definition with two
  components:

    TYPE EMPLOYEE
      INTEGER ID
      CHARACTER(LEN=40) NAME
    END TYPE EMPLOYEE

  The following shows how to declare a variable CONTRACT of type
  EMPLOYEE:

    TYPE(EMPLOYEE) :: CONTRACT

  Note that both examples started with the keyword TYPE.  The first
  (initial) statement of a derived-type definition is called a
  derived-type statement, while the statement that declares a
  derived-type object is called a TYPE statement.

  The following example shows how to reference component ID of parent
  structure CONTRACT:

    CONTRACT%ID

  The following example shows a derived type with a component that is
  a previously defined type:

    TYPE DOT
      REAL X, Y
    END TYPE DOT
    ....
    TYPE SCREEN
      TYPE(DOT) C, D
    END TYPE SCREEN

  The following declares a variable of type SCREEN:

    TYPE(SCREEN) M

  Variable M has components M%C and M%D (both of type DOT); M%C has
  components M%C%X and M%C%Y of type REAL.

  The following example shows a derived type with a component that is
  an array:

    TYPE CAR_INFO
      INTEGER YEAR
      CHARACTER(LEN=15), DIMENSION(10) :: MAKER
      CHARACTER(LEN=10) MODEL, BODY_TYPE*8
      REAL PRICE
    END TYPE
    ...
    TYPE(CAR_INFO) MY_CAR

  Note that MODEL has a character length of 10, but BODYTYPE has a
  character length of 8.  You can assign a value to a component of a
  structure; for example:

    MY_CAR%YEAR = 1985

  The following shows an array structure component:

    MY_CAR%MAKER

  In the preceding example, if a subscript list (or substring) was
  appended to MAKER, the reference would not be to an array structure
  component, but to an array element or section.

  Consider the following:

    TYPE CHARGE
      INTEGER PARTS(40)
      REAL LABOR
      REAL MILEAGE
    END TYPE CHARGE

    TYPE(CHARGE) MONTH
    TYPE(CHARGE) YEAR(12)

  Some valid array references for this type follow:

    MONTH%PARTS(I)           ! An array element
    MONTH%PARTS(I:K)         ! An array section
    YEAR(I)%PARTS            ! An array structure component
                             !  (a whole array)

    YEAR(J)%PARTS(I)         ! An array element
    YEAR(J)%PARTS(I:K)       ! An array section
    YEAR(J:K)%PARTS(I)       ! An array section
    YEAR%PARTS(I)            ! An array section

  The following example shows a derived type with a pointer component
  that is of the type being defined:

    TYPE NUMBER
      INTEGER NUM
      TYPE(NUMBER), POINTER :: BEFORE_NUM
      TYPE(NUMBER), POINTER :: AFTER_NUM
    END TYPE

  A type such as this can be used to construct linked lists of
  objects of type NUMBER.

  The following example shows a private type:

    TYPE, PRIVATE :: SYMBOL
      LOGICAL TEST
      CHARACTER(LEN=50) EXPLANATION
    END TYPE SYMBOL

  This type is private to the module.  The module can be used by
  another scoping unit, but type SYMBOL is not available.

  The following example shows a derived-type definition that is
  public with components that are private:

    MODULE MATTER
      TYPE ELEMENTS
        PRIVATE
        INTEGER C, D
      END TYPE
    ...
    END MODULE MATTER

  In this case, components C and D are private to type ELEMENTS, but
  type ELEMENTS is not private to MODULE MATTER.  Any program unit
  that uses the module MATTER can declare variables of type ELEMENTS,
  and pass as arguments values of type ELEMENTS.

  This design allows you to change components of a type without
  affecting other program units that use the module.

  If a derived type is needed in more than one program unit, the
  definition should be placed in a module and accessed by a USE
  statement whenever it is needed, as follows:

    MODULE STUDENTS
      TYPE STUDENT_RECORD
      ...
      END TYPE
    CONTAINS
      SUBROUTINE COURSE_GRADE(...)
      TYPE(STUDENT_RECORD) NAME
      ...
      END SUBROUTINE
    END MODULE STUDENTS
    ...

    PROGRAM SENIOR_CLASS
      USE STUDENTS
      TYPE(STUDENT_RECORD) ID
      ...
    END PROGRAM

  Program SENIOR_CLASS has access to type STUDENT_RECORD, because it
  uses module STUDENTS.  Module procedure COURSE_GRADE also has
  access to type STUDENT_RECORD, because the derived-type definition
  appears in its host.

56.3.3  –  Constructors

  A structure constructor lets you specify scalar values of a derived
  type.  It takes the following form:

    d-name (expr-list)

    d-name    Is the name of the derived type.

    expr-list Is a list of expressions specifying component
              values.  The values must agree in number and
              order with the components of the derived type.

              If necessary, values are converted (according
              to the rules of assignment), to agree with their
              corresponding components in type and kind type
              parameters.

  A structure constructor must not appear before its derived type is
  defined.

  If a component of the derived type is an array, the shape in the
  expression list must conform to the shape of the component array.

  If a component of the derived type is a pointer, the value in the
  expression list must evaluate to an object that would be a valid
  target in a pointer assignment statement.  (A constant is not a
  valid target in a pointer assignment statement.)

  If all the values in a structure constructor are constant
  expressions, the constructor is a derived-type constant expression.

56.3.3.1  –  Examples

  Consider the following derived-type definition:

    TYPE EMPLOYEE
      INTEGER ID
      CHARACTER(LEN=40) NAME
    END TYPE EMPLOYEE

  This can be used to produce the following structure constructor:

    EMPLOYEE(3472, "John Doe")

  The following example shows a type with a component of derived
  type:

    TYPE ITEM
      REAL COST
      CHARACTER(LEN=30) SUPPLIER
      CHARACTER(LEN=20) ITEM_NAME
    END TYPE ITEM

    TYPE PRODUCE
      REAL MARKUP
      TYPE(ITEM) FRUIT
    END TYPE PRODUCE

  In this case, you must use an embedded structure constructor to
  specify the values of that component; for example:

    PRODUCE(.70, ITEM (.25, "Daniels", "apple"))

56.4  –  Expressions

  An expression represents either a data reference or a computation,
  and is formed from operators, operands, and parentheses.  The
  result of an expression is either a scalar value or an array of
  scalar values.

  If the value of an expression is of intrinsic type, it has a kind
  type parameter.  (If the value is of intrinsic type CHARACTER, it
  also has a length parameter.) If the value of an expression is of
  derived type, it has no kind type parameter.

  An operand is a scalar or array.  An operator can be either
  intrinsic or defined.  An intrinsic operator is known to the
  compiler and is always available to any program unit.  A defined
  operator is described explicitly by a user in a function subprogram
  and is available to each program unit that uses the subprogram.

  The simplest form of an expression (a primary) can be any of the
  following:

   o  A constant; for example, 4.2

   o  A subobject of a constant; for example, 'LMNOP'(2:4)

   o  A variable; for example, VAR1

   o  A structure constructor; for example, EMPLOYEE(3472, "JOHN
      DOE")

   o  An array constructor; for example, (/12.0,16.0/)

   o  A function reference; for example, COS(X)

   o  Another expression in parentheses; for example, (I+5)

  Any variable or function reference used as an operand in an
  expression must be defined at the time the reference is executed.
  If the operand is a pointer, it must be associated with a target
  object that is defined.  An integer operand must be defined with an
  integer value rather than a statement label value.  All of the
  characters in a character data object reference must be defined.

  When a reference to an array or an array section is made, all of
  the selected elements must be defined.  When a structure is
  referenced, all of the components must be defined.

  In an expression that has intrinsic operators with an array as an
  operand, the operation is performed on each element of the array.
  In expressions with more than one array operand, the arrays must be
  conformable (they must have the same shape).  The operation is
  applied to corresponding elements of the arrays, and the result is
  an array of the same shape (the same rank and extents) as the
  operands.

  In an expression that has intrinsic operators with a pointer as an
  operand, the operation is performed on the value of the target
  associated with the pointer.

  For defined operators, operations on arrays and pointers are
  determined by the procedure defining the operation.

  A scalar is conformable with any array.  If one operand of an
  expression is an array and another operand is a scalar, it is as if
  the value of the scalar were replicated to form an array of the
  same shape as the array operand.  The result is an array of the
  same shape as the array operand.

  The ranking assigned to each numeric intrinsic data type follows:

    Data Type                    Ranking
    ---------                    -------
    LOGICAL*1 and BYTE            lowest
    LOGICAL*2                       .
    LOGICAL*4                       .
    LOGICAL*8                       .
    INTEGER*1                       .
    INTEGER*2                       .
    INTEGER*4                       .
    INTEGER*8                       .
    REAL (REAL*4)                   .
    REAL*16                         .
    DOUBLE PRECISION (REAL*8)       .
    COMPLEX (COMPLEX*8)             .
    DOUBLE COMPLEX (COMPLEX*16)     .
    COMPLEX*32                   highest

56.4.1  –  Numeric

  Numeric (arithmetic) expressions are formed with numeric operands
  and numeric operators, and yield a single numeric value.

  The term numeric includes logical data, because logical data is
  treated as integer data when used in a numeric context.  (.TRUE.
  is -1; .FALSE.  is 0.)

  The numeric operators are as follows:

       Operator    Description
       -----------------------
          **       exponentiation (evaluated
                            right to left)
          *        multiplication
          /        division
          +        addition
          -        subtraction

  You can use parentheses to force an order of evaluation.

56.4.2  –  Character

  Character expressions consist of character items and character
  operators.  Evaluation of a character expression yields a single
  value of character data type.

  A character expression has the form:

    character operand[//character operand]...

  The concatenation operator (//) is the only character operator.
  Concatenation is from left to right.

56.4.3  –  Defined Operations

  A defined operation is unary or binary.  It is defined by a
  function subprogram containing a generic interface block with the
  specifier OPERATOR.  A defined operation is not an intrinsic
  operation.  However, you can use a defined operation to extend the
  meaning of an intrinsic operator.

  For defined unary operations, the function must contain one
  argument.  For defined binary operations, the function must contain
  two arguments.

  Interpretation of the operation is provided by the function that
  defines the operation.

  A Fortran 95/90 defined operator can contain up to 31 letters, and
  is enclosed in periods (.).  Its name cannot be the same name as
  any of the following:

    o The intrinsic operators  .NOT., .AND., .OR., .XOR.,
      .EQV., .NEQV., .EQ., .NE., .GT., .GE., .LT., and .LE.

    o The logical literal constants .TRUE. or .FALSE..

  No two intrinsic operators can follow one another, but an intrinsic
  or binary operator can be followed by a defined unary operator.

  The result of a defined operation can have any type.  The type of
  the result (and its value) must be specified by the defining
  function.

  The following examples show expressions containing defined
  operators:

    .COMPLEMENT. A

    X .PLUS. Y .PLUS. Z

    M * .MINUS. N

56.4.4  –  Initialization

  An initialization expression must evaluate at compile time to a
  constant.  It is used to specify an initial value for an entity.

  In an initialization expression, each operation is intrinsic and
  each operand is one of the following:

   o  A constant or subobject of a constant

   o  An array constructor where each element, and the bounds and
      strides of each implied-do are expressions whose primaries are
      initialization expressions

   o  A structure constructor whose components are initialization
      expressions

   o  An elemental intrinsic function reference of type integer or
      character, whose arguments are initialization expressions of
      type integer or character

   o  A reference to one of the following inquiry functions:

          BIT_SIZE      MINEXPONENT
          DIGITS        PRECISION
          EPSILON       RADIX
          HUGE          RANGE
          ILEN          SHAPE
          KIND          SIZE
          LBOUND        TINY
          LEN           UBOUND
          MAXEXPONENT

      Each function argument must be one of the following:

          - An initialization expression
          - A variable whose kind type parameter and bounds
              are not assumed or defined by an ALLOCATE statement,
              pointer assignment, or an expression that is not an
              initialization expression

   o  A reference to one of the following transformational functions
      (each argument must be an initialization expression):

          REPEAT
          RESHAPE
          SELECTED_INT_KIND
          SELECTED_REAL_KIND
          TRANSFER
          TRIM

   o  A reference to the transformational function NULL

   o  An implied-do variable within an array constructor where the
      bounds and strides of the corresponding implied-do are
      initialization expressions

   o  Another initialization expression enclosed in parentheses

  Each subscript, section subscript, and substring starting and
  ending point must be an initialization expression.

  In an initialization expression, the exponential operator (**) must
  have a power of type integer.

  If an initialization expression invokes an inquiry function for a
  type parameter or an array bound of an object, the type parameter
  or array bound must be specified in a prior specification statement
  (or to the left of the inquiry function in the same statement).

56.4.5  –  Logical

  Logical expressions can contain one or more logical operators and
  logical, integer, or relational operands.  The following are
  logical operators:

     Operator  Meaning
     ---------------------------
     .AND.     Logical conjunction: the expression A .AND. B
               is true if both A and B are true.

     .OR.      Logical disjunction (inclusive OR):  the ex-
               pression A .OR. B is true if either A, B, or
               both, are true.

     .XOR.     Same as .NEQV.

     .NEQV.    Logical inequivalence (or exclusive OR): the
               expression A .NEQV. B is true if either A or
               B is true, but false if both are true.

     .EQV.     Logical equivalence: the expression A .EQV. B
               is true if both A and B are true, or both are
               false.

     .NOT.     Logical negation: the expression .NOT. A is
               true if A is false and false if A is true.

56.4.6  –  Operator Precedence

  The following shows the precedence of all intrinsic and defined
  operators:

  Category    Operator                     Precedence
  ---------------------------------------------------
  N/A         Defined Unary Operators      Highest
  Numeric     **                              .
  Numeric     * or /                          .
  Numeric     Unary + or -                    .
  Numeric     Binary + or -                   .
  Character   //                              .
  Relational  .EQ.,.NE.,.LT.,.LE.,.GT.,.GE.   .
  Logical     .NOT.                           .
  Logical     .AND.                           .
  Logical     .OR.                            .
  Logical     .XOR., .EQV., .NEQV.            .
  N/A         Defined Binary Operators     Lowest

56.4.7  –  Relational

  Relational expressions consist of two or more expressions whose
  values are compared to determine whether the relationship stated by
  the relational operator is satisfied.  The expression is reduced to
  a logical value (true or false).

  The following are relational operators:

        Operator         Meaning
        ------------------------------------------
         .LT. or <       Less than
         .LE. or <=      Less than or equal to
         .EQ. or ==      Equal to
         .NE. or /=      Not equal to
         .GT. or >       Greater than
         .GE. or >=      Greater than or equal to

  NOTE: Expressions of COMPLEX data type can use only
        .EQ.  and .NE. operators.

56.4.8  –  Specification

  A specification expression is a restricted expression that is of
  type integer and has a scalar value.  This type of expression
  appears only in the declaration of array bounds and character
  lengths.

  In a restricted expression, each operation is intrinsic and each
  operand is one of the following:

   o  A constant or subobject of a constant

   o  A variable that is one of the following:

          - A dummy argument that does not have the OPTIONAL or
              INTENT (OUT) attribute (or the subobject of such
              a variable)
          - In a common block (or the subobject of such a variable)
          - Made accessible by use or host association (or the
              subobject of such a variable)

   o  A structure constructor whose components are restricted
      expressions

   o  An implied-do variable within an array constructor where the
      bounds and strides of the corresponding implied-do are
      initialization expressions

   o  A reference to one of the following inquiry functions:

          BIT_SIZE               NWORKERS
          DIGITS                 PRECISION
          EPSILON                PROCESSORS_SHAPE
          HUGE                   RADIX
          ILEN                   RANGE
          KIND                   SHAPE
          LBOUND                 SIZE
          LEN                    SIZEOF
          MAXEXPONENT            TINY
          MINEXPONENT            UBOUND
          NUMBER_OF_PROCESSORS

      Each function argument must be one of the following:

          - A restricted expression
          - A variable whose properties inquired about are not
            dependent on the upper bound of the last dimension
            of an assumed-size array, are not defined by an
            expression that is a restricted expression, or are
            not definable by an ALLOCATE or pointer assignment
            statement.

   o  A reference to any other intrinsic function where each argument
      is a restricted expression.

   o  A reference to a specification function (see below) where each
      argument is a restricted expression

   o  An array constructor where each element, and bounds and strides
      of each implied-do are expressions whose primaries are
      restricted expressions

   o  Another restricted expression enclosed in parentheses

  Each subscript, section subscript, and substring starting and
  ending point must be a restricted expression.

  Specification functions can be used in specification expressions to
  indicate the attributes of data objects.  A specification function
  is a pure function.  It cannot have a dummy procedure argument or
  be any of the following:

   o  An intrinsic function

   o  An internal function

   o  A statement function

   o  Defined as RECURSIVE

  A variable in a specification expression must have its type and
  type parameters (if any) specified in one of the following ways:

   o  By a previous declaration in the same scoping unit

   o  By the implicit typing rules currently in effect for the
      scoping unit

   o  By host or use association

  If a variable in a specification expression is typed by the
  implicit typing rules, its appearance in any subsequent type
  declaration statement must confirm the implied type and type
  parameters.

  If a specification expression invokes an inquiry function for a
  type parameter or an array bound of an object, the type parameter
  or array bound must be specified in a prior specification statement
  (or to the left of the inquiry function in the same statement).

56.5  –  Intrinsic Types

  VSI Fortran provides the following intrinsic data types:

   o  INTEGER (4 kind type parameters) - a whole number

   o  REAL (3 kind type parameters) - a floating point number (a
      whole number, a decimal fraction, or a combination)

   o  DOUBLE PRECISION - a REAL kind type parameter that has more
      than twice the degree of accuracy in its representation, and
      greater range

   o  COMPLEX (3 kind type parameters) - a pair of REAL values
      representing a complex number (the first part of the number is
      the real part, the second is the imaginary part)

   o  DOUBLE COMPLEX - a COMPLEX kind type parameter with DOUBLE
      PRECISION real and imaginary parts

   o  LOGICAL (4 kind type parameters)- a logical value, .TRUE.  or
      .FALSE.

   o  CHARACTER - a sequence of characters

   o  BYTE - a one-byte value equivalent to INTEGER(KIND=1)

56.5.1  –  CHARACTER

  A character string is a contiguous sequence of bytes in memory.  A
  character string is specified by two attributes:  the address of
  the first byte of the string and the length of the string in bytes.
  The length of the string must be in the range 1 through 65535.

  Hollerith constants are stored internally, one character per byte.

56.5.2  –  COMPLEX

  Real and complex numbers are floating-point representations.

  COMPLEX(KIND=4) (or COMPLEX*8) data is eight contiguous bytes
  aligned on an arbitrary byte boundary.  The low-order four bytes
  contain REAL(KIND=4) (or REAL*4) data that represents the real part
  of the complex number.  The high-order four bytes contain REAL data
  that represents the imaginary part of the complex number.  For
  information on the ranges of REAL data, see REAL (within the DATA
  CONSTANTS section of online Help).

  DOUBLE COMPLEX (COMPLEX(KIND=8) or COMPLEX*16) data is 16
  contiguous bytes aligned on an arbitrary byte boundary.  The
  low-order bytes contain DOUBLE PRECISION data that represents the
  real part of the complex number.  The high-order eight bytes
  contain DOUBLE PRECISION data that represents the imaginary part of
  the complex data.  For information on the ranges of DOUBLE
  PRECISION data, see DOUBLE_PRECISION (within the DATA CONSTANTS
  section of online Help).

  COMPLEX(KIND=16) (or COMPLEX*32) data is 32 contiguous bytes
  aligned on an arbitrary byte boundary.  The low-order bytes contain
  REAL(KIND=16) (or REAL*16) data that represents the real part of
  the complex number.  The high-order bytes contain REAL*16 data that
  represents the imaginary part of the complex number.  For
  information on the ranges of REAL*16 data, see REAL (within the
  DATA CONSTANTS section of online Help).

56.5.3  –  INTEGER

  Integer numbers are whole numbers.  For information on the ranges
  of INTEGER data, see INTEGER (within the DATA CONSTANTS section of
  online Help).

  INTEGER*2, INTEGER*4, and INTEGER*8 values are stored in two's
  complement form.

  Note that logical data type ranges correspond to their comparable
  integer data type ranges.  For example, in LOGICAL*2 L, the range
  for L is the same as the range for INTEGER*2 integers.

56.5.4  –  LOGICAL

  Logical values start on an arbitrary byte boundary and are stored
  in one, two, or four contiguous bytes.  The low-order bit (bit 0)
  determines the value.  If bit 0 is set, the value is .TRUE.; if bit
  0 is clear, the value is .FALSE.  The remaining bits are undefined.

  When a logical value is stored in memory, all of its bits are
  stored.  For example, consider the following:

     LOGICAL*4 L1, L2, L3
     L1 = L2 .AND. L3

  This example does a full 32-bit AND of L2 and L3, and stores all 32
  resulting bits in L1.

56.5.5  –  REAL

  Real and complex numbers are floating-point representations.

  The exponent for REAL(KIND=4) (or REAL*4) (F_floating) and DOUBLE
  PRECISION (REAL(KIND=8) or REAL*8) (D_floating) formats is stored
  in binary excess 128 notation.  Binary exponents from -127 to 127
  are represented by the binary equivalents of 1 through 255.

  The exponent for the DOUBLE PRECISION G_floating format and
  T_floating format is stored in binary excess 1024 notation.  The
  exponent for the REAL*16 format is stored in binary excess 16384
  notation.  In DOUBLE PRECISION (G_floating) format, binary exponents
  from -1023 to 1023 are represented by the binary equivalents of 1
  through 2047.  In REAL*16 format, binary exponents from -16383 to
  16383 are represented by the binary equivalents of 1 through 32767.

  For floating-point format, fractions are represented in
  sign-magnitude notation, with the binary radix point to the left of
  the most significant bit for F_floating, D_floating, and G_floating,
  and to the right of the most significant bit for S_floating and
  T_floating.  Fractions are assumed to be normalized, and therefore
  the most significant bit is not stored.  This bit is assumed to be 1
  unless the exponent is 0.  in which case the value represented is
  either zero or is a reserved operand.

  REAL(KIND=4) (or REAL*4) numbers occupy four contiguous bytes and
  the precision is approximately one part in 2**23, that is,
  typically 7 decimal digits.

  DOUBLE PRECISION (D_floating) numbers occupy eight contiguous bytes
  and the precision is approximately one part in 2**55, that is,
  typically 16 decimal digits.

  DOUBLE PRECISION G_floating numbers occupy eight contiguous bytes
  and the precision is approximately one part in 2**52, that is,
  typically 15 decimal digits.

  REAL*16 (H_floating) numbers occupy sixteen contiguous bytes and
  the precision is approximately 2**112, that is, typically 33
  decimal digits.

  For more information on real data type ranges, see DATA CONSTANTS
  REAL and DATA CONSTANTS DOUBLE_PRECISION in this Help file.

56.6  –  Substrings

  A character substring is a contiguous segment of a character
  variable, character array element, or character field reference.
  It has one of the following forms:

     v([e1]:[e2])
     a(s[,s]...)([e1]:[e2])

     v    Is a character variable name
     a    Is a character array name
     s    Is a subscript expression
     e1   Is a numeric expression specifying the leftmost
          character position of the substring
     e2   Is a numeric expression specifying the rightmost
          character position of the substring

  Both e1 and e2 must be within the range 1,2, ..., len, where len is
  the length of the parent character string.  If e1 exceeds e2, the
  substring has length zero.

56.7  –  Variables

  A variable is a data object whose value can be changed at any point
  in a program.  It can be any of the following:

   o  A scalar name

      A scalar is a single object that has a single value; it can be
      of any intrinsic or user-defined type.

   o  An array name

      An array is a collection of scalar elements of any intrinsic or
      derived type.  All elements must be have the same type and kind
      type parameter.

   o  A subobject designator

      A subobject is part of an object.  The following are
      subobjects:

        An array element
        An array section
        A structure component
        A substring

      For example, B(3) is a subobject (array element) designator for
      array B.  A subobject cannot be a variable if its parent object
      is a constant.

  The name of a variable is associated with a single storage
  location.

  Variables are classified by data type, as constants are.  The data
  type of a variable indicates the type of data it contains,
  including its precision, and implies its storage requirements.
  When data of any type is assigned to a variable, it is converted to
  the data type of the variable (if necessary).

  A variable is usually defined in a type declaration statement or
  DATA statement.  But during program execution, events can occur to
  cause variables to be defined or redefined (such as assignment
  statements and READ statements), or undefined (such as an I/O
  error).

  Scalar variables are assigned data types explicitly in type
  declaration statements or IMPLICIT statements, or they can have
  implicit data types.

56.7.1  –  Implicit Typing

  By default, all variables with names beginning with I, J, K, L, M,
  or N are assumed to be integer variables.  Variables beginning with
  any other letter are assumed to be real variables.

  Names beginning with a dollar sign ($) are implicitly INTEGER.

  You can override the default data type implied in a name by
  specifying data type explicitly in either an IMPLICIT statement or
  a type declaration statement.

  Note:  You cannot change the implicit type of a name beginning with
  a dollar sign in an IMPLICIT statement.

56.7.2  –  Explicit Typing

  Type declaration statements explicitly specify the data type of
  scalar variables.  For example, the following statements associate
  VAR1 with an 8-byte complex storage location, and VAR2 with an
  8-byte double-precision storage location:

    COMPLEX VAR1
    DOUBLE PRECISION VAR2

  You can explicitly specify the data type of a scalar variable only
  once.

  An explicit data type specification takes precedence over the type
  specified by an IMPLICIT statement.  If no explicit data type
  specification appears, any variable with a name that begins with
  the letter in the range specified in the IMPLICIT statement becomes
  the data type of the variable.

  Character type declaration statements specify that given variables
  represent character values with the length specified.  For example,
  the following statements associate the variable names INLINE, NAME,
  and NUMBER with storage locations containing character data of
  lengths 72, 12, and 9, respectively:

    CHARACTER*72 INLINE
    CHARACTER NAME*12, NUMBER*9

  In single subprograms, assumed-length character arguments can be
  used to process character strings with different lengths.  The
  assumed-length character argument has its length specified with an
  asterisk, for example:

    CHARACTER*(*) CHARDUMMY

  The argument CHARDUMMY assumes the length of the actual argument.

57  –  Format Specifiers

  A format appearing in an input or output (I/O) statement specifies
  the form of data being transferred and the data conversion
  (editing) required to achieve that form.  The format specified can
  be explicit or implicit.

  Explicit format is indicated in a format specification that appears
  in a FORMAT statement or a character expression (the expression
  must evaluate to a valid format specification).

  The format specification contains edit descriptors, which can be
  data edit descriptors, control edit descriptors, or string edit
  descriptors.

  Implicit format is determined by the processor and is specified
  using list-directed or namelist formatting.

  List-directed formatting is specified with an asterisk (*);
  namelist formatting is specified with a namelist group name.

  List-directed formatting can be specified for advancing, sequential
  files and internal files.  Namelist formatting can be specified
  only for advancing, sequential files.

57.1  –  Default Data Descriptors

  The defaults for data edit descriptors follow:

  Field
  Descriptor    List Element                       w      d    e
  --------------------------------------------------------------
  I,B,O,Z,G     BYTE,INTEGER*1,LOGICAL*1           7
  I,B,O,Z,G     INTEGER*2,LOGICAL*2                7
  I,B,O,Z,G     INTEGER*4,LOGICAL*4               12
  I,B,O,Z,G     INTEGER*8,LOGICAL*8               23
  O,Z           REAL*4                            12
  O,Z           REAL*8                            23
  O,Z           REAL*16                           44
  O,Z           CHARACTER*n                     MAX(7,3*n)
  L,G           LOGICAL*1,LOGICAL*2,               2
                LOGICAL*4,LOGICAL*8
  F,E,EN,ES,G,D REAL*4,COMPLEX*8                  15      7    2
  F,E,EN,ES,G,D REAL*8,COMPLEX*16                 25     16    2
  F,E,EN,ES,G,D REAL*16,COMPLEX*32                42     33    3
  A,G           LOGICAL*1                          1
  A,G           LOGICAL*2,INTEGER*2                2
  A,G           LOGICAL*4,INTEGER*4                4
  A,G           LOGICAL*8,INTEGER*8                8
  A,G           REAL*4,COMPLEX*8                   4
  A,G           REAL*8,COMPLEX*16                  8
  A,G           REAL*16,COMPLEX*32                16
  A,G           CHARACTER*n                        n

57.2  –  General Form

  The general form of a FORMAT statement follows:

     FORMAT (q1 f1s1 f2s2 ... fnsn qn)

     qn   Is zero or more slash (/) record terminators.

     fn   Is a data edit descriptor, a control edit descriptor, or
          a group of data or control edit descriptors enclosed
          in parentheses.

     sn   Is a field separator (a comma or slash).  A
          comma can be omitted in the following cases:

          o Between a P edit descriptor and an immediately
            following F, E, EN, ES, D, or G edit descriptor.

          o Before a slash (/) record terminator (if there is
            no optional repeat specification)

          o After a slash (/) record terminator.

          o Before or after a colon (:) edit descriptor.

  In data transfer I/O statements, a format specifier ([FMT=]format)
  can be a character expression that is a character array, character
  array element, or character constant.  This type of format is also
  called a run-time format because it can be constructed or altered
  during program execution.

  The expression must evaluate to a character string whose leading
  part is a valid format specification (including the enclosing
  parentheses).  Variable format expressions must not appear in this
  kind of format specification.

57.2.1  –  Data Edit Format

  A data edit descriptor takes one of the following forms:

     [r]c  [r]cw  [r]cw.m  [r]cw.d [r]cw.d[Ee]

     r    Is an optional repeat count.  (If you omit "r",
          the repeat count is assumed to be 1.)

     c    Is a format code (I,B,O,Z,F,E,EN,ES,D,G,L, or A).

     w    Is the total number of digits in the field (the
          field width).

     m    Is the minimum number of digits that must appear
          in the field (including leading zeros).

     d    Is the number of digits to the right of the decimal point.

     E    Identifies an exponent field.

     e    Is the number of digits in the exponent.

  The ranges for "r", "w", "m", "d", and "e" are as follows:

  Term      Range
  ----      __________
   r        1 to 2147483647 (2**31-1)
   w        1 to 2147483647
   m        0 to 32767 (2**15-1)
   d        0 to 32767
   e        1 to 32767

  The terms must all be positive, unsigned, integer constants or
  variable format expressions.

  You cannot use PARAMETER constants for "r", "w", "m", "d", or "e".

57.2.2  –  Control Edit Format

  A control edit descriptor takes one of the following forms:

     c  nc  cn

     c     Is a format code (X, T, TL, TR, SP, SS, S, BN, BZ,
           P, /, '...', "...", Q, \, $, or :).

     n     Is an optional number of character positions.

  The term "n" must be a positive, unsigned, integer constant or a
  variable format expression.

  For all format codes (except P), the value of "n" must be within
  the range 1 through 2147483647 (2**31-1); actual useful ranges may
  be constrained by record sizes (RECL) and the file system.

  The P edit descriptor is an exception to the general control edit
  descriptor syntax.  It is preceded by a scale factor, rather than a
  character position specifier.  The value of "n" for P must be
  within the range -128 to 127.

  Control edit descriptors can be grouped in parentheses and preceded
  by a group repeat specification.

57.2.3  –  Character String Format

  The character string edit descriptors are the character constant
  and H edit descriptor.

  The character constant edit descriptor ('string' or "string")
  causes string to be output to an external record.  (For more
  information on the H edit descriptor, see FORMAT H in online Help.)

  Although no string edit descriptor can be preceded by a repeat
  specification, a parenthesized group of string edit descriptors can
  be preceded by a repeat specification.

57.3  –  Format Descriptors

  A format descriptor can be one of the following:

   o  Data edit descriptor

      Causes the transfer or conversion of data to or from its
      internal representation.  The part of a record that is input or
      output and formatted with data edit descriptors a field.

      The data edit descriptors are:  I, B, O, Z, F, E, EN, ES, D, G,
      L, and A.

   o  Control edit descriptor

      Either directly determines how text is displayed or affects the
      conversions performed by subsequent data edit descriptors.

      The control edit descriptors are:  T, TL, TR, X, S, SP, SS, BN,
      BZ, P, :, /, $, and Q.

   o  String edit descriptor

      Controls the output of character strings.  The string edit
      descriptors are the character constant and H edit descriptor.

  Format descriptors are generally separated by commas, but you can
  also use the slash (/) edit descriptor to separate them.  A slash
  terminates input or output of the current record and initiates a
  new record; for example:

          WRITE (6,40) K,L,M,N,O,P
     40   FORMAT (3I6.6/I6,2F8.4)

  The preceding statements are equivalent to the following:

          WRITE (6,40) K,L,M
     40   FORMAT (3I6.6)
          WRITE (6,50) N,O,P
     50   FORMAT (I6,2F8.4)

  Multiple slashes cause the system to bypass input records or output
  blank records.  If "n" consecutive slashes appear between two field
  or edit descriptors, (n-1) records are skipped on input, or (n-1)
  blank records are output.  The first slash terminates the current
  record.  The second slash terminates the first skipped or blank
  record, and so on.

  However, "n" slashes at the beginning or end of a format
  specification result in "n" skipped or blank records.  This is
  because the opening and closing parentheses of the format
  specification are themselves a record initiator and terminator,
  respectively.

57.4  –  Nested and Group Repeats

  Format specifications can include nested format specifications
  enclosed in parentheses; for example:

    15   FORMAT (E7.2,I8,I2,(A5,I6))

    35   FORMAT (A6,(L8(3I2)),A)

  A group repeat specification can precede a nested group of edit
  descriptors.  For example, the following statements are equivalent,
  and the second statement shows a group repeat specification:

    50   FORMAT (I8,I8,F8.3,E15.7,F8.3,E15.7,F8.3,E15.7,I5,I5)

    50   FORMAT (2I8,3(F8.3,E15.7),2I5)

  If a nested group does not show a repeat count, a default count of
  1 is assumed.

  Normally, the string edit descriptors and control edit descriptors
  cannot be repeated (except for slash), but any of these descriptors
  can be enclosed in parentheses and preceded by a group repeat
  specification.  For example, the following statements are valid:

    76   FORMAT ('MONTHLY',3('TOTAL'))

    100  FORMAT (I8,4(T7),A4)

57.5  –  Reversion

  When the last closing parenthesis of the format specification is
  reached, format control determines whether more I/O list elements
  are to be processed.  If not, format control terminates.  However,
  if additional list elements remain, part or all of the format
  specification is reused in a process called format reversion.

  In format reversion, the current record is terminated, a new one is
  initiated, and format control reverts to the group repeat
  specification whose opening parenthesis matches the next-to-last
  closing parenthesis of the format specification.  If the format
  does not contain a group repeat specification, format control
  returns to the initial opening parenthesis of the format
  specification.  Format control continues from that point.

57.6  –  Variable Format Expressions

  By enclosing an expression in angle brackets, you can use it in a
  FORMAT statement wherever you can use an integer (except as the
  specification of the number of characters in the H field).  For
  example:

     20 FORMAT (I<J+1>)

  When the format is scanned, the preceding statement performs an I
  (integer) data transfer with a field width of J+1.  The expression
  is reevaluated each time it is encountered in the normal format
  scan.

  The following rules apply to variable format expressions:

     - If the expression is not of integer data type, it is
       converted to integer data type before being used.

     - The expression can be any valid Fortran expression,
       including function calls and references to dummy arguments.

     - The value of a variable format expression must obey the
       restrictions on magnitude applying to its use in the
       format, or an error occurs.

     - Variable format expressions are not permitted in run-time
       formats.

  Variable format expressions can also be used in character format
  specifications.

  Variable format expressions are evaluated each time they are
  encountered in the scan of the format.  If the value of the
  variable used in the expression changes during the execution of the
  I/O statement, the new value is used the next time the format item
  containing the expression is processed.

57.7  –  Data Edit

  The specific forms for data edit descriptors follow:

    +-----------------------------------+
    |      Function      |  Format      |
    +--------------------+--------------+
    | Integer            | Iw[.m]       |
    | Binary             | Bw[.m]       |
    | Octal              | Ow[.m]       |
    | Hexadecimal        | Zw[.m]       |
    | Real number        | Fw.d         |
    | Exponential form   | Ew.d[Ee]     |
    | D exponential form | Dw.d         |
    | G exponential form | Gw.d[Ee]     |
    | Scientific form    | ESw.d[Ee]    |
    | Engineering form   | ENw.d[Ee]    |
    | Logical            | Lw           |
    | Character          | A[w]         |
    +--------------------+--------------+

  NOTE:  Transfer complex numbers as two real (F, E, ES,
         EN, D, or G) numbers.

57.8  –  Control Edit

  The specific forms for control edit descriptors follow:

    +--------------------------+--------------+
    |         Function         |    Format    |
    +--------------------------+--------------+
    | Scale factor             | kP           |
    | Blanks are null (input)  | BN           |
    | Blanks are zero (input)  | BZ           |
    | Characters in input      | Q            |
    | Plus sign (always)       | SP           |
    | Plus sign (never)        | SS           |
    | Default plus sign        | S            |
    | Skip spaces (same as TRn)| nX           |
    | Position (Tab)           | Tn           |
    | Relative left tab        | TLn          |
    | Relative right tab       | TRn          |
    | Carriage control         | $ or \       |
    | Terminate list           | :            |
    | Terminate record         | /            |
    +--------------------------+--------------+

57.9  –  String Edit

  The specific forms for string edit descriptors follow:

    +--------------------------+--------------+
    |         Function         |    Format    |
    +--------------------------+--------------+
    | Character constant       |  'string'    |
    |                          |      or      |
    |                          |  "string"    |
    | Hollerith                |  nHstring    |
    +--------------------------+--------------+

57.10  –  Carriage Control

  When the first character of a formatted record is transferred to an
  output file or printer, it can be interpreted as a carriage control
  character (and not printed) if the file is opened with
  CARRIAGECONTROL='FORTRAN' in effect.

  The I/O system recognizes the characters listed below as carriage
  control characters and does not print them.

     Character    Meaning
     ---------    -----------------------------------------
       '+'        Overprinting: Outputs the record (at the
                  current position in the current line) and
                  a carriage return.

       ' '        One line feed: Outputs the record (at the
                  beginning of the following line) and a
                  carriage return.

       '0'        Two line feeds: Outputs the record (after
                  skipping a line) and a carriage return.

       '1'        Next page: Outputs the record (at the
                  beginning of a new page) and a carriage return.

       '$'        Prompting: Outputs the record (at the
                  beginning of the following line), but no
                  carriage return.

     ASCII NULL   Overprinting with no advance: Outputs
                  the record (at the current position in the
                  current line), but no carriage return.
                  (ASCII NULL is specified as CHAR(0).)

  Any other character is interpreted as a blank and is deleted from
  the print line.  If you accidentally omit a carriage control
  character, the first character of the record is not printed.

57.11  –  $_or_\

  In a format specification, the dollar sign ($) and backslash (\)
  characters modify the carriage control specified by the first
  character of the record.  They only affect carriage control for
  formatted files, and have no effect on input.

  If the first character of the record is a blank or a plus sign (+)
  the dollar sign and backslash descriptors suppress carriage return
  (after printing the record).

  For terminal device I/O, when this trailing carriage return is
  suppressed, a response follows output on the same line.

  If the first character of the record is 0, 1, or ASCII NUL, the
  dollar sign and backslash descriptors have no effect.

57.12  –  :

  Terminates format control if no more items are in the I/O list.

  If I/O list items remain, the colon edit descriptor has no effect.

57.13  –  A

  A[w] (Character Editing)

  If the corresponding I/O list element has a character data type,
  character data is transmitted.  If it has any other data type,
  Hollerith data is transmitted.  The value of "w" must be less than
  or equal to 2**31-1.

  The G edit descriptor can be used to edit character data; it
  follows the same rules as Aw.

  On input, the A edit descriptor transfers "w" characters or
  Hollerith values from the external record and assigns them to the
  corresponding list element.  If the input value contains fewer
  characters than "w", it is padded on the right with blanks.  If the
  input value contains excessive characters, it is truncated on the
  left.

  If the variable is numeric, the ASCII value of each character is
  placed in each byte of the variable, starting at the low-order
  byte.

  On output, the A edit descriptor transfers the contents of the
  corresponding I/O list element to an external field "w" characters
  long.  If the output value contains fewer characters than "w", it
  is padded on the left with blanks.  If the output value contains
  excess characters, it is truncated on the right (for numbers, the
  high-order bytes are lost).

  If the output value is numeric or untyped, the ASCII value of each
  byte of the variable, starting at the low-order byte, is
  transferred to the record.

  The "w" can be omitted and defaults to the number of characters in
  the character variable or the number of bytes in the numeric
  variable.

57.14  –  BN

  (Blank Control Editing)

  Causes embedded and trailing blanks to be ignored within a numeric
  input field.  Leading blanks are always ignored, and an all blank
  field is always treated as zero.

  It affects all subsequent I, B, O, Z, F, E, EN, ES, D, and G
  editing (in the same FORMAT statement) until another blank editing
  descriptor occurs.

  The BN and BZ descriptors supersede the default interpretation of
  blanks during execution of a particular input data transfer
  statement.

57.15  –  BZ

  (Blank Control Editing)

  Causes embedded and trailing blanks to be treated as zeros within a
  numeric input field.  (Leading blanks are always ignored.) An
  all-blank field is treated as zero.

  It affects all subsequent I, B, O, Z, F, E, EN, ES, D, and G
  editing (in the same FORMAT statement) until another blank editing
  descriptor occurs.

  The BN and BZ descriptors supersede the default interpretation of
  blanks during execution of a particular input data transfer
  statement.

57.16  –  D

  Dw.d
  (Exponential Editing)

  On input, D performs the same as F format.

  On output, D performs the same as E format, except that the letter
  D replaces the letter E preceding the exponent and the size of the
  exponent is fixed at 2.

57.17  –  E

  Ew.d[Ee] (Exponential Editing)

  On input, E performs the same as F format.

  On output, E transfers the value of the corresponding I/O list
  element, rounded to "d" decimal digits and right-justified to an
  external field "w" characters long.  "d" specifies the size of the
  fraction and "e" specifies the size of the exponent.  If the value
  does not fill the field, leading spaces are inserted; if the value
  is too large for the field, the entire field is filled with
  asterisks.

  The term "w" must be large enough to include all of the following:
  a minus sign (when necessary) or a plus sign (if SP editing is in
  effect), a zero, a decimal point, "d" digits, and an exponent.

  Therefore, to accommodate all possible components of the standard
  form, the term "w" must be greater than or equal to "d"+7; if "e"
  is present, "w" must be greater than or equal to "d"+"e"+5.

  However, "w" can be as small as "d"+5 or "d"+"e"+3 and still allow
  formatting of the value without error, if optional fields are
  omitted.  In this case, the sign is omitted (if the value is
  positive and SP editing is not in effect) and the zero to the left
  of the decimal point is also omitted, if necessary.

57.18  –  EN

  ENw.d[Ee] (Exponential Editing:  Engineering form)

  On input, EN performs the same as F format.

  On output, EN transfers the value of the corresponding I/O list
  element, rounded to "d" decimal digits and right-justified to an
  external field "w" characters long.  The real value is output in
  engineering notation, where the decimal exponent is divisible by 3
  and the absolute value of the significand is greater than or equal
  to 1 and less than 1000 (unless the output value is zero).

  "d" specifies the size of the fraction and "e" specifies the size
  of the exponent.  If the value does not fill the field, leading
  spaces are inserted; if the value is too large for the field, the
  entire field is filled with asterisks.

  The term "w" must be large enough to include all of the following:
  a minus sign (when necessary) or a plus sign (if SP editing is in
  effect), one to three digits, zero, a decimal point, "d" digits,
  and an exponent.

  Therefore, to accommodate all possible components of the standard
  form, the term "w" must be greater than or equal to "d"+9.

  The exponent field width ("e") is optional; if omitted, the default
  is value is 2.  If "e" is specified, the "w" should be greater than
  or equal to "d"+"e"+5.

57.19  –  ES

  ESw.d[Ee] (Exponential Editing:  Scientific form)

  On input, ES performs the same as F format.

  On output, E transfers the value of the corresponding I/O list
  element, rounded to "d" decimal digits and right-justified to an
  external field "w" characters long.  The real value is output in
  scientific notation, where the absolute value of the significand is
  greater than or equal to 1 and less than 10 (unless the output
  value is zero).

  "d" specifies the size of the fraction and "e" specifies the size
  of the exponent.  If the value does not fill the field, leading
  spaces are inserted; if the value is too large for the field, the
  entire field is filled with asterisks.

  The term "w" must be large enough to include all of the following:
  a minus sign (when necessary) or a plus sign (if SP editing is in
  effect), one digit, a decimal point, "d" digits, and an exponent.

  Therefore, to accommodate all possible components of the standard
  form, the term "w" must be greater than or equal to "d"+7; if "e"
  is present, "w" must be greater than or equal to "d"+"e"+5.

  The exponent field width ("e") is optional; if omitted, the default
  is value is 2.  If "e" is specified, the "w" should be greater than
  or equal to "d"+"e"+5.

57.20  –  F

  Fw.d (Fixed Floating Editing)

  On input, F transfers "w" characters from the external field and
  assigns them, as a real value, to the corresponding I/O list
  element (which must be real data type).  If the first nonblank
  character of the external field is a minus sign, the field is
  treated as a negative value.  If the first nonblank character is a
  plus sign or if no sign appears in the field, the field is treated
  as a positive value.

  If the field contains neither a decimal point nor an exponent, it
  is treated as a real number of "w" digits, in which the rightmost
  "d" digits are to the right of the decimal point, with leading
  zeros assumed if necessary.  If the field contains an explicit
  decimal point, the location of the decimal point overrides the
  location specified by the field descriptor.  If the field contains
  an exponent, that exponent is used to establish the magnitude of
  the value before it is assigned to the list element.

  On output, F transfers the value of the corresponding I/O list
  element, rounded to "d" decimal positions and right-justified, to
  an external field that is "w" characters long.  If the value does
  not fill the field, leading spaces are inserted; if the value is
  too large for the field, the entire field is filled with asterisks.

  The term "w" must be large enough to include all of the following:
  a minus sign (when necessary) or a plus sign (if SP editing is in
  effect), at least one digit to the left of the decimal point, a
  decimal point, and "d" digits to the right of the decimal.

  Therefore, "w" must be greater than or equal to "d"+3.

57.21  –  G

  Gw.d[Ee] (General Floating Editing)

  On input, G performs the same as F format.

  On output, G transfers the value of the corresponding I/O list
  element, rounded to "d" decimal positions, and right-justified, to
  an external field that is "w" characters long.  The form in which
  the value is written is a function of the magnitude of the value,
  as given below:

    Data Magnitude                                    Equivalent Conversion
    --------------                                    --------------------
    0 < m < 0.1 - 0.5x10**-d-1                        Ew.d[Ee]
    m = 0                                             F(w-n).(d-1),n('b')
    0.1 - 0.5x10**-d-1 <= m < 1 - 0.5x10**-d          F(w-n).d, n('b')
    1 - 0.5x10**-d <= m < 10 - 0.5x10**-d+1           F(w-n).(d-1), n('b')
    10 - 0.5x10**-d+1 <= n < 100 - 0.5x10**-d+2       F(w-n).(d-2), n('b')
          .                                               .
          .                                               .
          .                                               .
    10**d-2 - 0.5x10**-2 <= m < 10**d-1 - 0.5x10**-1  F(w-n).1, n('b')
    10**d-1 - 0.5x10**-1 <= m < 10**d - 0.5           F(w-n).0, n('b')
    m >= 10**d - 0.5                                  Ew.d[Ee]

  The 'b' is a blank following the numeric data representation.  For
  Gw.d, n('b') is 4 blanks.  For Gw.dEe, n('b') is "e"+2 blanks.

  The term "w" must be greater than or equal to d+7 to allow for the
  following:  a sign (optional if the value is positive and
  descriptor SP is not in effect), one digit to the left of the
  decimal point, a decimal point, "d" digits to the right of the
  decimal point, and either a 4-digit or an "e"+2-digit exponent.

  If "e" is specified, "w" must be greater than or equal to
  "d"+"e"+5.

57.22  –  H

  nHc1c2c2...cn (Hollerith Editing)

  On input, transfers "n" characters from the external record to the
  field descriptor itself.  The first character appears immediately
  after the H.  Any characters in the field descriptor prior to the
  input operation are replaced by the input characters.

  On output, transfers "n" characters following the letter H from the
  field descriptor to the external field.

                                 NOTE

          This feature has been deleted in Fortran 95; it was
          an  obsolescent  feature  in  Fortran  90.   HP
          Fortran fully supports features deleted in  Fortran
          95.

57.23  –  I

  Iw[.m] (Integer Editing)

  On input, I transfers "w" characters from the external field and
  assigns them, as an integer value, to the corresponding I/O list
  element (which must be integer or logical data type).  The external
  data must have the form of an integer constant; it cannot contain a
  decimal point or exponent field.

  If the first nonblank character of the external field is a minus
  sign, the field is treated as a negative value.  If the first
  nonblank character is a plus sign or if no sign appears in the
  field, the field is treated as a positive value.

  On output, I transfers the value of the corresponding I/O list
  element, right-justified, to an external field that is "w"
  characters long.  If the value does not fill the field, leading
  spaces are inserted; if the value is too large for the field, the
  entire field is filled with asterisks.  "w" must be large enough to
  include a possible minus sign.  If "m" is present, the external
  field consists of at least "m" digits and, if necessary, is zero
  filled on the left.

57.24  –  L

  Lw (Logical Editing)

  On input, L transfers "w" characters from the external field and
  assigns a logical value to the corresponding I/O list element
  (which must be integer or logical data type).  If the first
  nonblank characters of the field are T, t, .T, or .t, the value
  .TRUE. is assigned to the corresponding I/O list element; if the
  first nonblank characters are F, f, .F, or .f, the value .FALSE. is
  assigned.  An all blank field is assigned the value .FALSE.  Any
  other value in the external field produces an error.  The logical
  constants .TRUE. and .FALSE. are acceptable input forms.

  On output, L transfers either the letter T (if the value of the
  corresponding I/O list element is .TRUE.) or the letter F (if the
  value is .FALSE.) to an external field that is "w" characters long.
  The letter T or F is in the rightmost position of the field,
  preceded by w-1 spaces.

57.25  –  O

  Ow[.m] (Octal Editing)

  On input, O transfers "w" characters from the external field and
  assigns them, as an octal value, to the corresponding I/O list
  element (which can be any data type).  The external field can
  contain only the numerals 0 though 7; it cannot contain a sign, a
  decimal point, or exponent field.  An all blank field is treated as
  a value of zero.  If the value of the external field exceeds the
  range of the corresponding list element, an error occurs.

  On output, O transfers the octal value of the corresponding I/O
  list element, right-justified, to an external field that is "w"
  characters long.  No signs are transmitted; a negative value is
  transmitted in internal form.  If the value does not fill the
  field, leading spaces are inserted; if the value is too large for
  the field, the entire field is filled with asterisks.  If "m" is
  present, the external field consists of at least "m" digits and, if
  necessary, is zero filled on the left.

  "w" must be large enough to include a possible minus sign.  If "m"
  is present, the external field consists of at least "m" digits and,
  if necessary, is zero filled on the left.

57.26  –  P

  nP (Scale Factor Editing)

  The scale factor lets you alter, during input or output, the
  location of the decimal point both in real values and in the two
  parts of complex values.

  The "n" is a signed or unsigned integer constant, in the range -128
  to 127, that specifies the number of positions to the left or right
  that the decimal point is to move.

  A scale factor can appear anywhere in a format specification, but
  must precede the first F, E, D, EN, ES, or G field descriptor that
  is to be associated with it and affects all subsequent real field
  descriptors in the same FORMAT statement (unless another scale
  factor appears).

  On input the scale factor of any of the F, E, D, EN, ES, and G
  field descriptors multiplies the data by 10**-n and assigns it to
  the corresponding I/O list element.  For example a 2P scale factor
  multiplies an input value by .01; a -2P multiplies an input value
  by 100.  However, if the external field contains an explicit
  exponent, the scale factor has no effect.

  E, D, EN, ES, and G field descriptors alter the form in which data
  is transferred.  On input a positive scale factor moves the decimal
  point to the left and a negative scale factor moves the decimal
  point to the right; on output, the effect is the reverse.

57.26.1  –  F editing

  nPFw.d

  On output, the value of the I/O list element is multiplied by 10**n
  before transfer to the external record.  Thus, a positive scale
  factor moves the decimal point to the right; a negative scale
  factor moves the decimal point to the left.  Thus, the F descriptor
  alters the magnitude of the data.

57.26.2  –  E editing

  nPEw.d

  On output, the basic real constant part of the I/O list element is
  multiplied by 10**n, and "n" is subtracted from the exponent.  For
  a positive scale factor, "n" must be less than d+2 or an output
  conversion error occurs.  Thus, a positive scale factor moves the
  decimal point to the right and decreases the exponent; a negative
  scale factor moves the decimal point to the left and increases the
  exponent.

57.26.3  –  D editing

  nPDw.d

  On output, the basic real constant part of the I/O list element is
  multiplied by 10**n, and "n" is subtracted from the exponent.  For
  a positive scale factor, "n" must be less than d+2 or an output
  conversion error occurs.  Thus, a positive scale factor moves the
  decimal point to the right and decreases the exponent; a negative
  scale factor moves the decimal point to the left and increases the
  exponent.

57.26.4  –  EN editing

  On output, the scale factor has no effect on EN editing.

57.26.5  –  ES editing

  On output, the scale factor has no effect on ES editing.

57.26.6  –  G editing

  nPGw.d

  On output, the effect for the G field descriptor is suspended if
  the magnitude of the data to be output is within the effective
  range of the descriptor (because the G field descriptor supplies
  its own scaling function).  It functions as an E field descriptor
  if the magnitude of the data is outside its range.  In this case,
  the scale factor has the same effect as for the E field descriptor.

57.27  –  Q

  (Query Remaining Character Count)

  On input, Q obtains the number of characters remaining in the input
  record to be transferred during a read operation.  The following
  example uses the Q descriptor to determine the size of the input
  record:

     READ(5,'(Q,A)') LEN, REC(1:LEN)

  On output, the Q descriptor has no effect, except that the
  corresponding I/O item is skipped.

57.28  –  S

  (Normal Signing)

  Restores the option of producing plus characters (+) in numeric
  output fields.  The S descriptor counters the action of either the
  SP or SS descriptor by restoring to the processor the discretion of
  producing plus characters on an optional basis.

  This descriptor affects fields all that follow it, until an SP or
  SS is encountered.  The S descriptor affects all subsequent I, F,
  E, D, and G editing (in the same FORMAT statement) during the
  execution of an output statement.

57.29  –  SP

  (Always + Signs)

  Causes the processor to produce a leading plus character (+) in any
  position where this character would otherwise be optional.

  This descriptor affects all (suppress + signs) fields that follow
  it, until an S or SS is encountered.  The SP descriptor affects all
  subsequent I, F, E, D, and G editing (in the same FORMAT statement)
  during the execution of an output statement.

57.30  –  SS

  (Suppress Sign)

  Causes the processor to suppress a leading plus character from any
  position where this character would otherwise be optional.  It has
  the opposite effect of the SP field descriptor.

  The SS descriptor affects all subsequent I, F, E, D, and G editing
  (in the same FORMAT statement) during the execution of an output
  statement.  This descriptor affects all fields that follow it,
  until an S or SS is encountered.

57.31  –  Slash

  [r]/

  Terminates data transfer for the current record and starts data
  transfer for a new record.  The "r" is an optional repeat
  specification.

  Multiple slashes cause the system to skip input records or to
  output blank records, as follows:

   o  When "n" consecutive slashes appear between two edit
      descriptors, "n"-1 records are skipped on input, or "n"-1 blank
      records are output.  The first slash terminates the current
      record.  The second slash terminates the first skipped or blank
      record, and so on.

   o  When "n" consecutive slashes appear at the beginning or end of
      a format specification, "n" records are skipped or "n" blank
      records are output, because the opening and closing parentheses
      of the format specification are themselves a record initiator
      and terminator, respectively.

57.32  –  T

  Tn (Tab to Position n)

  On input, starts the next read operation at the character position
  (within the record) indicated by position n.  For example, if an
  input statement reads a record containing:

     ABC   XYZ

  and this record is under the control of the FORMAT statement:

     10 FORMAT (T7,A3,T1,A3)

  On execution, the input statement would first read the characters
  XYZ and then read the characters ABC.

  On output, starts the next write operation at the character
  position n in the external record.

  The position specified must be an integer in the range 1 through
  the size of the record.

57.33  –  TL

  TLn (Tab Left n Positions)

  Indicates that the next character to be transferred to or from a
  record is the "n"th character to the left of the current character.

  The value of "n" must be greater than or equal to 1.

  If the value of "n" is greater than or equal to the current
  character position, the first character in the record is specified.

57.34  –  TR

  TRn (Tab Right n Positions)

  Indicates that the next character to be transferred to or from a
  record is the "n"th character to the right of the current
  character.

  The value of "n" must be greater than or equal to 1.

57.35  –  X

  nX (Skip Right n Positions)

  The X field descriptor functions the same as the TR field
  descriptor.

  On input, X starts the next read operation after skipping "n"
  character positions.  If X is the last format item, it will have no
  effect.

  On output, X starts the next write operation after skipping the "n"
  character positions.  Intervening characters are not written over.
  If X is the last format code executed, it will have no effect.

  The position specified must be in integer in the range 1 through
  the size of the record.

57.36  –  Z

  Zw[.m] (Hexadecimal Editing)

  On input, Z transfers "w" characters from the external field and
  assigns them, as a hexadecimal value, to the corresponding I/O list
  element (which can be any data type).  The input value must be in
  the form of a hexadecimal constant.  Each input character
  corresponds to four bits in the variable, high order to low order.
  If the input value contains more characters than specified by "w",
  an error occurs.  If the input value contains fewer characters, it
  is padded with zeros on the left before being converted.

  On output, Z transfers the number of hexadecimal characters
  specified by "w" from a variable or constant to the record.  The
  rightmost characters represent the low-order bits.  If the variable
  or constant contains more characters than "w" specifies, the value
  is set to all asterisks (an error occurs).  If the variable or
  constant contains fewer characters, the value is padded on the left
  with spaces.  "m" specifies the minimum number of characters (with
  zero padding) that the value can contain.  "m" must be an integer
  in the range 1 through 255.  "w" must be large enough to include a
  possible minus sign.  If "m" is present, the external field
  consists of at least "m" digits and, if necessary, is zero filled
  on the left.

58  –  Intrinsic Procedures

58.1  –  ABS

  ABS (number)

  Class:  Elemental function - Generic

  Returns the absolute value of the argument.  The absolute value of
  a complex number, (X,Y), is the real value:

      (X**2 + Y**2)**(1/2).

  +------+----------+----------+------------+-------------+
  | Args | Generic  | Specific |  Argument  | Result Type |
  +------+----------+----------+------------+-------------+
  |  1   |  ABS     |  --      | INTEGER*1  | INTEGER*1   |
  |      |          | IIABS    | INTEGER*2  | INTEGER*2   |
  |      |see note1 | IABS     | INTEGER*4  | INTEGER*4   |
  |      |          | KIABS    | INTEGER*8  | INTEGER*8   |
  |      |          | ABS      | REAL*4     | REAL*4      |
  |      |          | DABS     | REAL*8     | REAL*8      |
  |      |          | QABS     | REAL*16    | REAL*16     |
  |      |see note2 | CABS     | COMPLEX*8  | REAL*4      |
  |      |          | CDABS    | COMPLEX*16 | REAL*8      |
  |      |          | ZABS     | COMPLEX*16 | REAL*8      |
  |      |          | CQABS    | COMPLEX*32 | REAL*16     |
  +------+----------+----------+------------+-------------+

  Note1: Or JIABS.  For compatibility with older versions
         of Fortran, IABS can also be specified as a generic
         function.

  Note2: The setting of compiler options specifying real
         size can affect CABS.

58.2  –  ACHAR

  ACHAR (integer-number)

  Class:  Elemental function - Generic

  Returns the character in a specified position of the ASCII
  character set, even if the processor's default character set is
  different.  It is the inverse of the IACHAR function.  In HP
  Fortran, ACHAR is equivalent to the CHAR function.

  The result is of type character of length 1 with the kind type
  parameter value of KIND ('A').

  If I has a value within the range 0 to 127, the result is the
  character in position I of the ASCII character set.

58.3  –  ACOS

  ACOS (real-number)

  Class:  Elemental function - Generic

  Returns the arc cosine of the argument in radians.  The absolute
  value of the argument must be less than or equal to 1.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   | ACOS    | ACOS     | REAL*4     | REAL*4      |
  |      |         | DACOS    | REAL*8     | REAL*8      |
  |      |         | QACOS    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.4  –  ACOSD

  ACOSD (real-number)

  Class:  Elemental function - Generic

  Returns the arccosine of the argument in degrees.  The value of the
  argument must be between 0 (exclusive) and 1 (inclusive).

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  ACOSD  |  ACOSD   | REAL*4     | REAL*4      |
  |      |         |  DACOSD  | REAL*8     | REAL*8      |
  |      |         |  QACOSD  | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.5  –  ADJUSTL

  ADJUSTL (string)

  Class:  Elemental function - Generic

  Adjusts a character string to the left, removing leading blanks and
  inserting trailing blanks.

  The result is of type character with the same length and kind type
  parameter as "string".

58.6  –  ADJUSTR

  ADJUSTR (string)

  Class:  Elemental function - Generic

  Adjusts a character string to the right, removing trailing blanks
  and inserting leading blanks.

  The result is of type character with the same length and kind type
  parameter as "string".

58.7  –  AIMAG

  AIMAG (complex-number)

  Class:  Elemental function - Generic

  Returns the imaginary part of a complex number.  If Z has the value
  (x, y), the result has the value "y".  This function can also be
  specified as IMAG.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   | AIMAG   | AIMAG    | COMPLEX*8  | REAL*4      |
  |      |         | DIMAG    | COMPLEX*16 | REAL*8      |
  |      |         | QIMAG    | COMPLEX*32 | REAL*16     |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect AIMAG.

58.8  –  AINT

  AINT (real-number[,kind])

  Class:  Elemental function - Generic

  Returns the largest integer whose absolute value does not exceed
  the absolute value of the argument and has the same sign as the
  argument.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  AINT   | AINT     | REAL*4     | REAL*4      |
  |      |         | DINT     | REAL*8     | REAL*8      |
  |      |         | QINT     | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.9  –  ALL

  ALL (mask [,dim])

  Class:  Transformational function - Generic

  Determines if all values are true in an entire array or in a
  specified dimension of an array.

  The "mask" must be a logical array.  The "dim" must be a scalar
  integer with a value in the range 1 to n, where "n" is the rank of
  "mask".

  The result is a logical array with the same kind type parameter as
  "mask".  The result is scalar if "dim" is absent or "mask" has rank
  one.  Otherwise, the result is an array with rank that is one less
  than "mask", and shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn),
  where (d1, d2,..., dn) is the shape of "mask".

  The result of ALL (mask) has the value true if all elements of
  "mask" are true or "mask" has size zero.  The result has the value
  false if any element of "mask" is false.

  If "mask" has rank one, ALL (mask, dim) has the same value as ALL
  (mask).  Otherwise, the value of element (s1, s2,..., s"dim"-1,
  s"dim"+1,..., sn) of ALL (mask, dim) is equal to ALL (mask (s1,
  s2,..., s"dim"-1, :, s"dim"+1, ..., sn).

  Examples:

  ALL ((/.TRUE., .FALSE., .TRUE./)) has the value false.

  ALL ((/.TRUE., .TRUE., .TRUE./)) has the value true.

  Consider the following arrays:

    Array A       Array B

    |1 5 7|       |0 5 7|
    |3 6 8|       |2 6 9|

  ALL (A .NE.  B, DIM=1) has the value (true, false, true).

  ALL (A .NE.  B, DIM=2) has the value (true, true).

58.10  –  ALLOCATED

  ALLOCATED (array)

  Class:  Inquiry function - Generic

  Indicates whether an allocatable array is currently allocated.

  The "array" must be an allocatable array.

  The result has the value true if ARRAY is currently allocated,
  false if ARRAY is not currently allocated, or undefined if its
  allocation status is undefined.

  The setting of integer size compiler options can affect this
  function.

  Example:

  REAL, ALLOCATABLE, DIMENSION (:,:,:) :: E
  PRINT *, ALLOCATED (E)       ! Returns the value false
  ALLOCATE (E (12, 15, 20))
  PRINT *, ALLOCATED (E)       ! Returns the value true

58.11  –  AMAX0

  See the MAX intrinsic function.

58.12  –  AMIN0

  See the MIN intrinsic function.

58.13  –  ANINT

  ANINT (real-number [,kind])

  Class:  Elemental function - Generic

  Returns the value of the integer nearest to the value of the
  argument.

  If real number x is greater than zero, ANINT (x) has the value AINT
  (x + 0.5).  If x is less than or equal to zero, ANINT (x) has the
  value AINT (x - 0.5).

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   | ANINT   | ANINT    | REAL*4     | REAL*4      |
  |      |         | DNINT    | REAL*8     | REAL*8      |
  |      |         | QNINT    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

  See also the NINT intrinsic function.

58.14  –  ANY

  ANY (mask [,dim])

  Class:  Transformational function - Generic

  Determines if any value is true in an entire array or in a
  specified dimension of an array.

  The "mask" must be a logical array.  The "dim" must be a scalar
  integer with a value in the range 1 to n, where "n" is the rank of
  "mask".

  The result is a logical array with the same kind type parameter as
  "mask".  The result is scalar if "dim" is absent or "mask" has rank
  one.  Otherwise, the result is an array with rank that is one less
  than "mask", and shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn),
  where (d1, d2,..., dn) is the shape of "mask".

  The result of ANY (mask) has the value true if any elements of
  "mask" are true.  The result has the value false if no element of
  "mask" is true or "mask" has size zero.

  If "mask" has rank one, ANY (mask, dim) has the same value as ANY
  (mask).  Otherwise, the value of element (s1, s2,..., s"dim"-1,
  s"dim"+1,..., sn) of ANY (mask, dim) is equal to ANY (mask (s1,
  s2,..., s"dim"-1, :, s"dim"+1, ..., sn).

  Examples:

  ANY ((/.FALSE., .FALSE., .TRUE./)) has the value true.

  Consider the following arrays:

    Array A       Array B

    |1 5 7|       |0 5 7|
    |3 6 8|       |2 6 9|

  ANY (A .NE.  B, DIM=1) has the value (true, false, true).

  ANY (A .NE.  B, DIM=2) has the value (true, true).

58.15  –  ASIN

  ASIN (real-number)

  Class:  Elemental function - Generic

  Returns the arcsine of the argument in radians.  The absolute value
  of the argument must be less than or equal to 1.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  ASIN   | ASIN     | REAL*4     | REAL*4      |
  |      |         | DASIN    | REAL*8     | REAL*8      |
  |      |         | QASIN    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.16  –  ASIND

  ASIND (real-number)

  Class:  Elemental function - Generic

  Returns the arc sine of the argument in degrees.  The value of the
  argument must be between 0 (exclusive) and 1 (inclusive).

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  |  ASIND  | ASIND    | REAL*4     | REAL*4      |
  |      |         | DASIND   | REAL*8     | REAL*8      |
  |      |         | QASIND   | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.17  –  ASM (Alpha only)

  ASM (character [, any-type-arg])

  Class:  Nonelemental function - Generic

  Lets you use assembler instructions in an executable program.

  The first argument is a character constant or a concatenation of
  character constants containing the assembler instructions.  The
  optional second argument can be of any type.  It can be a source or
  destination argument for the instruction, for example.

  Arguments are passed by value.  If you want to pass an argument by
  reference (for example, a whole array, a character string, or a
  record structure), you can use the %REF built-in function.

  Labels are allowed, but all references must be from within the same
  ASM function.  This lets you set up looping constructs, for
  example.  Cross-jumping between ASM functions is not permitted.

  In general, an ASM function can appear anywhere that an intrinsic
  function can be used.  Since the supplied assembly code, assembly
  directives, or assembly data is integrated into the code stream,
  the compiler may choose to use different registers, better code
  sequences, and so on, just as if the code were written in Fortran.

  You do not have absolute control over instruction sequences and
  registers, and the compiler may intersperse other code together
  with the ASM code for better performance.  Better code sequences
  may be substituted by the optimizer if it chooses to do so.

  Only register names beginning with a dollar sign ($) or percent
  sign (%) are permitted.  For more information on register name
  conventions, see the OpenVMS operating system documentation set.

    +---------+-------------------+-------------+
    | Generic | Specific          | Result Type |
    +---------+-------------------+-------------+
    |  ASM    | ASM (see Note1)   | INTEGER*8   |
    |         | FASM (see Note2)  | REAL*4      |
    |         | DASM (see Note2)  | REAL*8      |
    +---------+-------------------+-------------+

  Note1: The value must be stored in register $0 by the user code.
  Note2: The value must be stored in register $F0 by the user code.

  Example:

  Consider the following:

   ! Concatenation is recommended for clarity.
   ! Notice that ";" separates instructions.
   !
   nine=9

   type *, asm('addq %0, $17, $0;'//  ! Adds the first two arguments
    1    'ldq $22, %6;'//             !   and puts the answer in
    1    'ldq $23, %7;'//             !   register $0
    1    'ldq $24, %8;'//             !
    1    'mov $0, %fp;'//             ! Comments are not allowed in the
    1    'addq $18, %fp, $0;'//       !   constant, but are allowed here
    1     'addq $19, $0, $0;'//
    1     'addq $20, $0, $0;'//
    1     'addq $21, $0, $0;'//
    1     'addq $22, $0, $0;'//
    1     'addq $23, $0, $0;'//
    1    'addq $24, $0, $0;',
    1 1,2,3,4,5,6,7,8,nine)           ! The actual arguments to the
                                      !   ASM (usually by value)
   end

  This example shows an integer ASM function that adds up 9 values
  and returns the sum as its result.  Note that the user stores the
  function result in register $0.

  All arguments are passed by value.  The arguments not passed in
  registers can be named %6, %7, and %8, which correspond to the
  actual arguments 7, 8, and 9 (since %0 is the first argument).
  Notice that you can reference reserved registers like %fp.

  The compiler creates the appropriate argument list.  So, in this
  example, the first argument value (1) will be available in register
  $16, and the eighth argument value (8) will be available in %7,
  which is actually 8($30).

58.18  –  ASSOCIATED

  ASSOCIATED (pointer [,target])

  Class:  Inquiry function - Generic

  Returns the association status of its pointer argument or indicates
  whether the pointer is associated with the target.  The pointer
  must not have an undefined association status.

  The "target" can be a pointer or target.

  If only POINTER appears, the result is true if it is currently
  associated with a target; otherwise, the result is false.

  If TARGET also appears and is a target, the result is true if
  POINTER is currently associated with TARGET; otherwise, the result
  is false.

  If TARGET is a pointer, the result is true if both POINTER and
  TARGET are currently associated with the same target; otherwise,
  the result is false.  (If either POINTER or TARGET is
  disassociated, the result is false.)

  The setting of integer size compiler options can affect this
  function.

  Examples:

  Consider the following:

     REAL, TARGET, DIMENSION (0:50) :: TAR
     REAL, POINTER, DIMENSION (:) :: PTR
     PTR => TAR
     PRINT *, ASSOCIATED (PTR, TAR)    ! Returns the value true

  The subscript range for PTR is 0:50.  Consider the following
  pointer assignment statements:

     (1) PTR => TAR (:)
     (2) PTR => TAR (0:50)
     (3) PTR => TAR (0:49)

  For statements 1 and 2, ASSOCIATED (PTR, TAR) is true because TAR
  has not changed (the subscript range for PTR in both cases is 1:51,
  following the rules for deferred-shape arrays).  For statement 3,
  ASSOCIATED (PTR, TAR) is false because the upper bound of PTR has
  changed.

  Consider the following:

     REAL, POINTER, DIMENSION (:) :: PTR2, PTR3
     ALLOCATE (PTR2 (0:15))
     PTR3 => PTR2
     PRINT *, ASSOCIATED (PTR2, PTR3)   ! Returns the value true
     ...
     NULLIFY (PTR2)
     NULLIFY (PTR3)
     PRINT *, ASSOCIATED (PTR2, PTR3)   ! Returns the value false

58.19  –  ATAN

  ATAN (real-number)

  Class:  Elemental function - Generic

  Returns the arc tangent of the argument in radians.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |   ATAN  | ATAN     | REAL*4     | REAL*4      |
  |      |         | DATAN    | REAL*8     | REAL*8      |
  |      |         | QATAN    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.20  –  ATAND

  ATAND (real-number)

  Class:  Elemental function - Generic

  Returns the arc tangent of the argument in degrees.  The value of
  the argument must be greater than 0.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  |  ATAND  | ATAND    | REAL*4     | REAL*4      |
  |      |         | DATAND   | REAL*8     | REAL*8      |
  |      |         | QATAND   | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.21  –  ATAN2

  ATAN2 (real-number, real-number)

  Class:  Elemental function - Generic

  Returns the arc tangent of the quotient of the two arguments in
  radians.  If both arguments are zero, the result is undefined.  If
  the first argument is positive, the result is positive.  If the
  first argument is negative, the result is negative.  If the first
  argument is zero, the result is zero.  If the second argument is
  zero, the absolute value of the result is pi/2.

  The range of the result is -pi < result <= pi.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  ATAN2  | ATAN2    | REAL*4     | REAL*4      |
  |      |         | DATAN2   | REAL*8     | REAL*8      |
  |      |         | QATAN2   | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.22  –  ATAN2D

  ATAN2D (real-number, real-number)

  Class:  Elemental function - Generic

  Returns the arc tangent of the quotient of the two arguments in
  degrees.

  If both arguments are zero, the result is undefined.  If the first
  argument is positive, the result is positive.  If the first
  argument is negative, the result is negative.  If the first
  argument is zero, the result is zero.  If the second argument is
  zero, the absolute value of the result is 90 degrees.  The value of
  the argument must be greater than zero.

  The range of the result is -180 degrees < result <= 180 degrees.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   2  | ATAN2D  | ATAN2D   | REAL*4     | REAL*4      |
  |      |         | DATAN2D  | REAL*8     | REAL*8      |
  |      |         | QATAN2D  | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.23  –  BIT_SIZE

  BIT_SIZE (integer)

  Class:  Inquiry function - Generic

  Returns the number of bits in an integer type.

  The result value is the number of bits ("s") defined by the bit
  model for integers with the kind type parameter of the argument.
  For information on the bit model, see the HP Fortran for OpenVMS
  Language Reference Manual.

  Example:

  BIT_SIZE (1_2) has the value 16 because the INTEGER*2 type contains
  16 bits.

58.24  –  BTEST

  BTEST (integer, position)

  Class:  Elemental function - Generic

  Returns a logical value of true if the bit within the integer
  specified by position is set to 1 (bit test).  The low-order bit is
  position 0.

  +------+---------+----------------+------------+-------------+
  | Args | Generic | Specific       |  Argument  | Result Type |
  +------+---------+----------------+------------+-------------+
  |   2  |         |   --           | INTEGER*1  | LOGICAL*4   |
  |      |         | BITEST         | INTEGER*2  | LOGICAL*2   |
  |      |  BTEST  | BTEST(see note)| INTEGER*4  | LOGICAL*4   |
  |      |         | BKTEST         | INTEGER*8  | LOGICAL*8   |
  +------+---------+----------------+------------+-------------+

  NOTE: Or BJTEST

58.25  –  CEILING

  CEILING (real-number [,KIND])

  Class:  Elemental function - Generic

  Returns the smallest integer greater than or equal to its argument.

  The result is of type default integer (unless KIND specifies a
  different integer KIND).  The value of the result is equal to the
  smallest integer greater than or equal to the real-number.  The
  result is undefined if the value cannot be represented in the
  default integer range.

58.26  –  CHAR

  CHAR (integer [,kind])

  Class:  Elemental function - Generic

  Returns the character in the specified position of the processor's
  character set.  It is the inverse of the function ICHAR.

  The input value must be in the range 0 to n - 1, where "n" is the
  number of characters in the processor's character set.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |   --    |  --      | INTEGER*1  | CHARACTER   |
  |      |         |  --      | INTEGER*2  | CHARACTER   |
  |      |         |  CHAR    | INTEGER*4  | CHARACTER   |
  |      |         |  --      | INTEGER*8  | CHARACTER   |
  +------+---------+----------+------------+-------------+

  This function cannot be passed as an actual argument.

58.27  –  CMPLX

  CMPLX (number [,number] [,kind])

  Class:  Elemental function - Generic

  Converts the argument(s) into a complex value.

  If one argument is specified, the argument is converted into the
  real part of the complex value and the imaginary part becomes zero.
  If two arguments are specified, the first argument is converted
  into the real part of the complex value and the second argument is
  converted into the imaginary part of the complex value.  If two
  arguments are specified, they must have the same data type.

  The setting of compiler options specifying real size can affect
  this function.

  +-------+---------+----------+------------+-------------+
  | Args  | Generic | Specific |  Argument  | Result Type |
  +-------+---------+----------+------------+-------------+
  | 1,2   |  CMPLX  | CMPLX    | INTEGER*2  | COMPLEX*8   |
  | 1,2   |         | CMPLX    | INTEGER*4  | COMPLEX*8   |
  | 1,2   |         | CMPLX    | REAL*4     | COMPLEX*8   |
  | 1,2   |         | CMPLX    | REAL*8     | COMPLEX*8   |
  | 1,2   |         | CMPLX    | REAL*16    | COMPLEX*8   |
  |  1    |         | CMPLX    | COMPLEX*8  | COMPLEX*8   |
  |  1    |         | CMPLX    | COMPLEX*16 | COMPLEX*8   |
  +-------+---------+----------+------------+-------------+

  This function cannot be passed as an actual argument.

58.28  –  CONJG

  CONJG (complex-number)

  Class:  Elemental function - Generic

  Returns the complex conjugate of the argument.  If the argument is
  (X,Y), its complex conjugate is (X,-Y).

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  |  CONJG  | CONJG    | COMPLEX*8  | COMPLEX*8   |
  |      |         | DCONJG   | COMPLEX*16 | COMPLEX*16  |
  |      |         | QCONJG   | COMPLEX*32 | COMPLEX*32  |
  +------+---------+----------+------------+-------------+

58.29  –  COS

  COS (number)

  Class:  Elemental function - Generic

  Returns the cosine of the argument.  The argument must be in
  radians; it is treated modulo 2*pi.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  |  COS    | COS      | REAL*4     | REAL*4      |
  |      |         | DCOS     | REAL*8     | REAL*8      |
  |      |         | QCOS     | REAL*16    | REAL*16     |
  |      |see note | CCOS     | COMPLEX*8  | COMPLEX*8   |
  |      |         | CDCOS    | COMPLEX*16 | COMPLEX*16  |
  |      |         | ZCOS     | COMPLEX*16 | COMPLEX*16  |
  |      |         | CQCOS    | COMPLEX*32 | COMPLEX*32  |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect CCOS.

58.30  –  COSD

  COSD (number)

  Class:  Elemental function - Generic

  Returns the cosine of the argument.  The argument must be in
  degrees; it is treated modulo 360.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |   COSD  | COSD     | REAL*4     | REAL*4      |
  |      |         | DCOSD    | REAL*8     | REAL*8      |
  |      |         | QCOSD    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.31  –  COSH

  COSH (real-number)

  Class:  Elemental function - Generic

  Returns the hyperbolic cosine of the argument.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  | COSH    | COSH     | REAL*4     | REAL*4      |
  |      |         | DCOSH    | REAL*8     | REAL*8      |
  |      |         | QCOSH    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.32  –  COTAN

  COTAN (real-number)

  Class:  Elemental function - Generic

  Returns the cotangent of the argument.

  The argument cannot be zero.  It must be in radians and is treated
  as modulo 2*pi.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |   1  | COTAN   | COTAN    | REAL*4     | REAL*4      |
  |      |         | DCOTAN   | REAL*8     | REAL*8      |
  |      |         | QCOTAN   | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.33  –  COTAND

  COTAND (real-number)

  Class:  Elemental function - Generic

  Returns the cotangent of the argument.  The argument must be in
  degrees; it is treated modulo 360.

  +------+----------+----------+------------+-------------+
  | Args | Generic  | Specific |  Argument  | Result Type |
  +------+----------+----------+------------+-------------+
  |  1   |  COTAND  | COTAND   | REAL*4     | REAL*4      |
  |      |          | DCOTAND  | REAL*8     | REAL*8      |
  |      |          | QCOTAND  | REAL*16    | REAL*16     |
  +------+----------+----------+------------+-------------+

58.34  –  COUNT

  COUNT (mask [,dim] [,kind])

  Class:  Transformational function - Generic

  Counts the number of true elements in an entire array or in a
  specified dimension of an array.

  The "mask" must be a logical array.  The "dim" must be a scalar
  integer with a value in the range 1 to n, where "n" is the rank of
  "mask".  The "kind" must be a scalar integer initialization
  expression.

  The result is integer.  If "kind" is present, the kind parameter of
  the result is that specified by "kind"; otherwise, the kind
  parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  The result is a scalar if "dim" is absent or "mask" has rank one.
  Otherwise, the result is an array with rank that is one less than
  "mask", and shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn), where
  (d1, d2,..., dn) is the shape of "mask".

  The result of COUNT (mask) is a value equal to the number of true
  elements of "mask".  If mask has size zero, the result is zero.

  If "mask" has rank one, COUNT (mask, dim) has the same value as
  COUNT (mask).  Otherwise, the value of element (s1, s2,...,
  s"dim"-1, s"dim"+1,..., sn) of COUNT (mask, dim) is equal to COUNT
  (mask (s1, s2,..., s"dim"-1, :, s"dim"+1, ...,sn).

  Examples:

  COUNT ((/.TRUE., .FALSE., .TRUE./)) has the value 2.

  COUNT ((/.TRUE., .TRUE., .TRUE./)) has the value 3.

  Consider the following arrays:

    Array A       Array B

    |1 5 7|       |0 5 7|
    |3 6 8|       |2 6 9|

  COUNT (A .NE.  B, DIM=1) has the value (2, 0, 1).

  COUNT (A .NE.  B, DIM=2) has the value (1, 2).

58.35  –  CPU_TIME

  CPU_TIME (time)

  Class:  Subroutine

  Returns a processor-dependent approximation of the processor time
  (in seconds).

  Argument "time" must be scalar and of real type.  It is an
  INTENT(OUT) argument.

  If a meaningful time cannot be returned, a processor-dependent
  negative value is returned.

  Example:

    REAL time_begin, time_end
    ...
    CALL CPU_TIME(time_begin)
    ...                         !some operation coding
    CALL CPU_TIME(time_end)
    PRINT (*,*) 'Time of operation was ', time_begin - time_end, ' seconds'

58.36  –  CSHIFT

  CSHIFT (array, shift [,dim])

  Class:  Transformational function - Generic

  Performs a circular shift on a rank-one array, or performs circular
  shifts on all the complete rank-one sections along a given
  dimension of an array of rank two or greater.

  Elements shifted off one end are inserted at the other end.
  Different sections can be shifted by different amounts and in
  different directions.

  The "shift" can be a scalar integer or array with rank one less
  than "array".  The "dim" must be a scalar integer with a value in
  the range 1 to n, where "n" is the rank of "array".  If "dim" is
  omitted, it is assumed to be 1.

  The result is an array with the same type, type parameters, and
  shape as "array".

  If "array" has rank one, element i of the result is array (1 +
  MODULO (i + "shift" - 1, SIZE (array))).

  If "array" has rank greater than 1, section (s1, s2, ...s"dim"-1,
  :, s"dim"+1, ..., sn) of the result has a value equal to CSHIFT
  (array(s1, s2, ..., s"dim"-1, :, s"dim"+1, ..., sn), sh, 1), where
  "sh" is "shift" or shift(s1, s2, ..., s"dim"-1, s"dim"+1,..., sn).

  The value of "shift" determines the amount and direction of the
  circular shift.  A positive integer causes a shift to the left (in
  rows) or up (in columns).  A negative integer causes a shift to the
  right (in rows) or down (in columns).

  Examples:

  V is the array (1, 2, 3, 4, 5, 6).

  CSHIFT (V, SHIFT=2) shifts V circularly to the left by 2 positions,
  producing the value (3, 4, 5, 6, 1, 2).

  CSHIFT (V, SHIFT= -2) shifts V circularly to the right by 2
  positions, producing the value (5, 6, 1, 2, 3, 4).

  M is the array Consider the following array:

    Array M

    |1 2 3|
    |4 5 6|
    |7 8 9|

  CSHIFT (M, SHIFT = 1, DIM = 2) produces the result:

    |2 3 1|
    |5 6 4|
    |8 9 7|

  CSHIFT (M, SHIFT = -1, DIM = 1) produces the result

    |7 8 9|
    |1 2 3|
    |4 5 6|

  CSHIFT (M, SHIFT = (/1, -1, 0/), DIM = 2) produces the result

    |2 3 1|
    |6 4 5|
    |7 8 9|

58.37  –  DATE

  DATE (buf)

  Class:  Subroutine

  Returns the current date as set within the system.  The date is
  returned as a 9-byte ASCII character string as follows:

    dd-mmm-yy

  The "buf" is a 9-byte variable, array, array element, or character
  substring.  If "buf" is numeric type and smaller than 9 bytes, data
  corruption can occur.

  If "buf" is character type, its associated length is passed to the
  subroutine.  If "buf" is smaller than 9 bytes, the subroutine
  truncates the date to fit in the specified length.  If a CHARACTER
  array is passed, the subroutine stores the date in the first array
  element, using the element length, not the length of the entire
  array.  For example, consider the following:

  CHARACTER*1 DAY(9)
  ...
  CALL DATE(DAY)

  The length of the first array element in CHARACTER array DAY is
  passed to the DATE subroutine.  The subroutine then truncates the
  date to fit into the one-character element, producing an incorrect
  result.

58.38  –  DATE_AND_TIME

  DATE_AND_TIME ([date] [,time] [,zone] [,values])

  Class:  Subroutine

  Returns character data on the real-time clock and date in a form
  compatible with the representations defined in Standard ISO
  8601:1988.

  Optional arguments (all are INTENT(OUT)):

   o  The "date" must be scalar and of type default character; its
      length must be at least 8 to contain the complete value.  Its
      leftmost 8 characters are set to a value of the form CCYYMMDD,
      where:

        CC is the century
        YY is the year within the century
        MM is the month within the year
        DD is the day within the month

   o  The "time" must be scalar and of type default character; its
      length must be at least 10 to contain the complete value.  Its
      leftmost 10 characters are set to a value of the form
      hhmmss.sss, where:

        hh is the hour of the day
        mm is the minutes of the hour
        ss.sss is the seconds and milliseconds of the minute

   o  The "zone" must be scalar and of type default character; its
      length must be at least 5 to contain the complete value.  Its
      leftmost 5 characters are set to a value of the form + or -
      hhmm, where "hh" and "mm" are the time difference with respect
      to Coordinated Universal Time (UTC) in hours and parts of an
      hour expressed in minutes, respectively.

   o  The "values" must be of type default integer and of rank one.
      Its size must be at least 8.  The values returned in "values"
      are as follows:

        values (1) is the 4-digit year
        values (2) is the month of the year
        values (3) is the day of the month
        values (4) is the time difference with respect to
                   Coordinated Universal Time (UTC) in minutes
        values (5) is the hour of the day (range 0 to 23)
        values (6) is the minutes of the hour (range 0 to 59).
        values (7) is the seconds of the minute (range 0 to 59).
        values (8) is the milliseconds of the second (range 0 to 999).

      VALUES (5) through (8) are in local time.

  Example:

  Consider the following example executed on 2000 March 28 at
  11:04:14.5:

  INTEGER DATE_TIME (8)
  CHARACTER (LEN = 12) REAL_CLOCK (3)
  CALL DATE_AND_TIME (REAL_CLOCK (1), REAL_CLOCK (2), &
                      REAL_CLOCK (3), DATE_TIME)

  This assigns the value "20000328" to REALCLOCK (1), the value
  "110414.500" to REALCLOCK (2), and the value "-0500" to REALCLOCK
  (3).  The following values are assigned to DATETIME:  2000, 3, 28,
  -300, 11, 4, 14, and 500.

58.39  –  DBLE

  DBLE (number)

  Class:  Elemental function - Generic

  Converts a number into a REAL*8 value.

  +------+-----------+----------+------------+-------------+
  | Args | Generic   | Specific |  Argument  | Result Type |
  +------+-----------+----------+------------+-------------+
  |  1   |  DBLE     |   --     | INTEGER*1  | REAL*8      |
  |      |           |   --     | INTEGER*2  | REAL*8      |
  |      |           |   --     | INTEGER*4  | REAL*8      |
  |      |           |   --     | INTEGER*8  | REAL*8      |
  |      |           |  DBLE    | REAL*4     | REAL*8      |
  |      |           |   --     | REAL*8     | REAL*8      |
  |      |           |  DBLEQ   | REAL*16    | REAL*8      |
  |      |           |   --     | COMPLEX*8  | REAL*8      |
  |      |           |   --     | COMPLEX*16 | REAL*8      |
  |      |           |   --     | COMPLEX*32 | REAL*8      |
  +------+-----------+----------+------------+-------------+

  These functions cannot be passed as actual arguments.

58.40  –  DCMPLX

  DCMPLX (number [,number])

  Class:  Elemental function - Generic

  Converts the argument(s) into a double complex value.

  If one argument is specified, the argument is converted into the
  real part of the complex value and the imaginary part becomes zero.
  If two arguments are specified, the first argument is converted
  into the real part of the complex value and the second argument is
  converted into the imaginary part of the complex value.  If two
  arguments are specified, they must have the same data type.

  +-------+----------+----------+------------+-------------+
  | Args  | Generic  | Specific |  Argument  | Result Type |
  +-------+----------+----------+------------+-------------+
  | 1,2   | DCMPLX   |   --     | INTEGER*1  | COMPLEX*16  |
  | 1,2   |          |   --     | INTEGER*2  | COMPLEX*16  |
  | 1,2   |          |   --     | INTEGER*4  | COMPLEX*16  |
  | 1,2   |          |   --     | INTEGER*8  | COMPLEX*16  |
  | 1,2   |          |   --     | REAL*4     | COMPLEX*16  |
  | 1,2   |          |   --     | REAL*8     | COMPLEX*16  |
  | 1,2   |          |   --     | REAL*16    | COMPLEX*16  |
  |  1    |          |   --     | COMPLEX*8  | COMPLEX*16  |
  |  1    |          |   --     | COMPLEX*16 | COMPLEX*16  |
  +-------+----------+----------+------------+-------------+

  This function cannot be passed as an actual argument.

58.41  –  DFLOAT

  DFLOAT (integer)

  Class:  Elemental function - Generic

  Converts an integer into a double precision value.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  DFLOAT |   --     | INTEGER*1  | REAL*8      |
  |      |         | DFLOTI   | INTEGER*2  | REAL*8      |
  |      |         | DFLOTJ   | INTEGER*4  | REAL*8      |
  |      |         | DFLOTK   | INTEGER*8  | REAL*8      |
  +------+---------+----------+------------+-------------+

  These functions cannot be passed as actual arguments.

58.42  –  DIGITS

  DIGITS (number)

  Class:  Inquiry function - Generic

  Returns the number of significant binary digits for numbers of
  the same type and kind type parameter as the argument.  The
  argument can be an integer or real number (scalar or array
  valued).

  The result is type default integer.

  The models for integer and real numbers are described in the
  HP Fortran for OpenVMS Language Reference Manual.

  Example:

  If X is of type REAL*4, DIGITS (X) has the value 24.

58.43  –  DIM

  DIM (number, number)

  Class:  Elemental function - Generic

  Returns the value of the first argument minus the minimum (MIN) of
  the two arguments.

  +------+----------+----------+------------+-------------+
  | Args | Generic  | Specific |  Argument  | Result Type |
  +------+----------+----------+------------+-------------+
  |   2  |          |   --     | INTEGER*1  | INTEGER*1   |
  |      |          | IIDIM    | INTEGER*2  | INTEGER*2   |
  |      |see note  | IDIM     | INTEGER*4  | INTEGER*4   |
  |      |          | KIDIM    | INTEGER*8  | INTEGER*8   |
  |      |          | DIM      | REAL*4     | REAL*4      |
  |      |          | DDIM     | REAL*8     | REAL*8      |
  |      |          | QDIM     | REAL*16    | REAL*16     |
  +------+----------+----------+------------+-------------+

  NOTE: Or JIDIM

58.44  –  DIMAG

  See the AIMAG function.

58.45  –  DOT_PRODUCT

  DOT_PRODUCT (vector-a, vector-b)

  Class:  Transformational function - Generic

  The "vector"s are rank-one arrays of integer, real, complex, or
  logical type.

  The result is a scalar; its type depends on "vector"s.

  If "vector-a" is of type integer or real, the result value is SUM
  (vector-a * vector-b).

  If "vector-a" is of type complex, the result value is SUM (CONJG
  (vector-a) * vector-b).

  If "vector-a" is of type logical, the result has the value ANY
  (vector-a .AND.  vector-b).

  If either rank-one array has size zero, the result is zero if the
  array is of numeric type, and false if the array is of logical
  type.

  Examples:

  DOT_PRODUCT ((/1, 2, 3/), (/3, 4, 5/)) has the value 26 (calculated
  as follows:

    ((1 x 3) + (2 x 4) + (3 x 5)) = 26)

  DOT_PRODUCT ((/ (1.0, 2.0), (2.0, 3.0) /), (/ (1.0, 1.0), ((1.0,
  4.0) /))) has the value (17.0, 4.0).

  DOT_PRODUCT ((/ .TRUE., .FALSE.  /), (/ .FALSE., .TRUE.  /)) has
  the value false.

58.46  –  DPROD

  DPROD (real4-number, real4-number)

  Class:  Elemental function - Specific

  Returns the product of two REAL*4 values as a REAL*8 value.

  This function cannot be passed as an actual argument.

58.47  –  DREAL

  DREAL (dbl-complex-number)

  Class:  Elemental function - Specific

  Converts the real part of a double complex argument to double
  precision type.

58.48  –  EOF

  EOF (integer)

  Class:  Inquiry function - Generic

  Checks whether a file is at or beyond the end-of-file record.

  The argument represents a unit specifier corresponding to an open
  file.  It cannot be zero unless you have reconnected unit zero to a
  unit other than the screen or keyboard.

  The value of the result is .TRUE.  if the file connected to A is at
  or beyond the end-of-file record; otherwise, .FALSE..

  This function cannot be passed as an actual argument.

  Examples:

  Consider the following:

  !  Creates a file of random numbers, reads them back
        REAL x, total
        INTEGER count
        OPEN (1, FILE = 'TEST.DAT')
        DO I = 1, 20
          CALL RANDOM_NUMBER(x)
          WRITE (1, '(F6.3)') x * 100.0
        END DO
        CLOSE(1)
        OPEN (1, FILE = 'TEST.DAT')
        DO WHILE (.NOT. EOF(1))
          count = count + 1
          READ (1, *) value
          total = total + value
        END DO
  100   IF ( count .GT. 0) THEN
          WRITE (*,*) 'Average is: ', total / count
        ELSE
          WRITE (*,*) 'Input file is empty '
        END IF
         STOP
        END

58.49  –  EOSHIFT

  EOSHIFT (array, shift [,boundary] [,dim])

  Class:  Transformational function - Generic

  Performs an end-off shift on a rank-one array, or performs end-off
  shifts on all the complete rank-one sections along a given
  dimension of an array of rank two or greater.

  Elements are shifted off at one end of a section and copies of a
  boundary value are filled in at the other end.  Different sections
  can have different boundary values and can be shifted by different
  amounts and in different directions.

  The "array" can be of any type.

  The "shift" can be a scalar integer or an array with a rank that is
  one less than "array", and shape (d1, d2,..., d"dim"-1,
  d"dim"+1,..., dn), where (d1, d2,..., dn) is the shape of "array".

  The "boundary" must be of the same type and kind type parameter as
  "array".  It can be a scalar or an array with a shape that is one
  less than that of "array" and shape (d1, d2,..., d"dim"-1,
  d"dim"+1,..., dn).  If "boundary is omitted, it is assumed to have
  the following values:

    "array" type       "boundary" value
    ------------       ----------------
     integer            0
     real               0.0
     complex            (0.0, 0.0)
     logical            false
     character (len)    "len" blanks

  The "dim" must be a scalar integer with a value in the range 1 to
  n, where "n" is the rank of "array".  If omitted, it is assumed to
  be 1.

  The result is an array with the same type, kind type parameter, and
  shape as "array"

  The value of "shift" determines the amount and direction of the
  end-off shift.  A positive integer causes a shift to the left (in
  rows) or up (in columns).  If an element is shifted off the
  beginning of a vector, the "boundary" value is placed at the end of
  the vector.

  A negative integer causes a shift to the right (in rows) or down
  (in columns).  If an element is shifted off the end of a vector,
  the "boundary" value is placed at the beginning of the vector.

  Examples:

  Consider that V is the array (1, 2, 3, 4, 5, 6).

  EOSHIFT (V, SHIFT=2) shifts the array to the left by 2 positions,
  producing the value (3, 4, 5, 6, 0, 0).

  EOSHIFT (V, SHIFT= -3, BOUNDARY= 99) shifts the array to the right
  by 3 positions, and uses the boundary value of 99, producing the
  value (99, 99, 99, 1, 2, 3).

  Consider that M is the following array:

   |1 2 3|
   |4 5 6|
   |7 8 9|

  EOSHIFT (M, SHIFT = 1, BOUNDARY = '*', DIM=2) produces the result:

   |2 3 *|
   |5 6 *|
   |8 9 *|

  EOSHIFT (M, SHIFT = -1, DIM = 1) produces the result:

   |0 0 0|
   |1 2 3|
   |4 5 6|

  EOSHIFT (M, SHIFT = (/1, -1, 0/), BOUNDARY = (/ '*', '?', '/' /),
  DIM=2) produces the result:

   |2 3 *|
   |? 4 5|
   |7 8 9|

58.50  –  EPSILON

  EPSILON (real)

  Class:  Inquiry function - Generic

  Returns a positive model number that is almost negligible compared
  to unity in the model representing real numbers.  The argument can
  be scalar or array valued.

  The model for real numbers is described in the HP Fortran for
  OpenVMS Language Reference Manual.

  Example:

  If X is REAL*4 type, EPSILON (X) has the value 2**-23.

58.51  –  ERRSNS

  ERRSNS ([io-err] [,sys-err] [,stat] [,unit] [,cond])

  Class:  Subroutine

  Returns information about the last Fortran error that occurred.
  The arguments are all return values and must be defined as integer
  variables or array elements:

     io-err    Stores the most recent Fortran error number
               that occurred during program execution.
               The value is zero if no error has occurred.

     sys-err   Stores the most recent RMS STS status code.

     stat      Stores the most recent RMS STV status value.
               This status value provides additional status
               information.

     unit      Stores the logical unit number (if the last
               the last error was an I/O error).

     cond      Stores the actual processor value.  This
               value is always zero.

  If you specify INTEGER*2 arguments, only the low-order 16 bits of
  information are returned or adjacent data can be overwritten.
  Because of this, it is best to use INTEGER*4 arguments.

  The saved error information is set to zero after each call to
  ERRSNS.

58.52  –  EXIT

  EXIT ([exit-status])

  Class:  Subroutine

  Terminates the program, closes all files, and returns control to
  the operating system.  The optional argument specifies the
  exit-status value of the program.

58.53  –  EXP

  EXP (exponent)

  Class:  Elemental function - Generic

  Returns e**X, where X is the value of the argument.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  EXP    | EXP      | REAL*4     | REAL*4      |
  |      |         | DEXP     | REAL*8     | REAL*8      |
  |      |         | QEXP     | REAL*16    | REAL*16     |
  |      |see note | CEXP     | COMPLEX*8  | COMPLEX*8   |
  |      |         | CDEXP    | COMPLEX*16 | COMPLEX*16  |
  |      |         | ZEXP     | COMPLEX*16 | COMPLEX*16  |
  |      |         | CQEXP    | COMPLEX*32 | COMPLEX*32  |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect CEXP.

58.54  –  EXPONENT

  EXPONENT (real-number)

  Class:  Elemental function - Generic

  Returns the exponent part of the argument when represented as a
  model number.

  The result is of type default integer.  If the argument is not
  equal to zero, the result value is the exponent part of the
  argument.  The exponent must be within default integer range;
  otherwise, the result is undefined.

  If the argument is zero, the exponent of the argument is zero.
  For more information on the exponent part in the real model, see
  the HP Fortran for OpenVMS Language Reference Manual.

  Examples:

  EXPONENT (2.0) has the value 2.

  If 4.1 is a REAL*4 value, EXPONENT (4.1) has the value 3.

58.55  –  FLOAT

  See the REAL function.

58.56  –  FLOOR

  FLOOR (real-number [,KIND])

  Class:  Elemental function - Generic

  Returns the greatest integer less than or equal to its argument.

  The result is of type default integer (unless KIND specifies a
  different integer KIND).  The result value is equal to the greatest
  integer less than or equal to the argument.  The result is
  undefined if the value cannot be represented in the default integer
  range.

  Examples:

  FLOOR (4.8) has the value 4.

  FLOOR (-5.6) has the value -6.

58.57  –  FP_CLASS

  FP_CLASS (real-number)

  Class:  Elemental function - Generic

  Returns the class of an IEEE real (S_floating, T_floating, or
  X_floating) argument.

  The result is of type default integer.

  The return values are defined in module "FORSYSDEF".  For
  information on the location of this file, see the HP Fortran for
  OpenVMS User Manual.

  Example:

  FP_CLASS (4.0_8) has the value 4 (FOR_K_FP_POS_NORM, a normal
  positive number).

58.58  –  FRACTION

  FRACTION (real-number)

  Class:  Elemental function - Generic

  Returns the fractional part of the model representation of the
  argument value.

  The result type is the same as the argument.  The real model is
  described in the HP Fortran for OpenVMS Language Reference Manual.

  Example:

  If 3.0 is a REAL*4 value, FRACTION (3.0) has the value 0.75.

58.59  –  FREE

  FREE (integer)

  Class:  Intrinsic subroutine

  Frees a block of memory that is currently allocated.

  The argument must be of type INTEGER*8.  This value is the starting
  address of the memory to be freed, previously allocated by the
  MALLOC intrinsic function.

  If the freed address was not previously allocated by MALLOC, or if
  an address is freed more than once, results are unpredictable.

  Examples:

  Consider the following:

  INTEGER(4) ADDR, SIZE
  SIZE = 1024                 ! Size in bytes
  ADDR = MALLOC(SIZE)         ! Allocate the memory
  CALL FREE(ADDR)             ! Free it
  END

58.60  –  HUGE

  HUGE (number)

  Class:  Inquiry function - Generic

  Returns the largest number in the model representing the same type
  and kind type parameter as the argument.

  The argument can be integer or real; it can be scalar or array
  valued.  The result type is scalar of the same type and kind type
  parameter as the argument.  The integer and real models are
  described in the HP Fortran for OpenVMS Language Reference Manual.

  Example:

  If X is REAL*4 type, HUGE (X) has the value (1 - 2**-24) x 2**128.

58.61  –  IABS

  See the ABS function.

58.62  –  IACHAR

  IACHAR (character)

  Class:  Elemental function - Generic

  Returns the position of a character in the ASCII character set,
  even if the processor's default character set is different.  In
  VSI Fortran, IACHAR is equivalent to the ICHAR function.

  The argument must have a length of 1.  The result is of type
  default integer.

58.63  –  IAND

  IAND (integer, integer)

  Class:  Elemental function - Generic

  Performs a logical AND of the arguments on a bit by bit basis
  (bitwise AND).  This function can also be specified as AND.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  IAND   |  --      | INTEGER*1  | INTEGER*1   |
  |      |         | IIAND    | INTEGER*2  | INTEGER*2   |
  |      |         | JIAND    | INTEGER*4  | INTEGER*4   |
  |      |         | KIAND    | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.64  –  IARGCOUNT

  IARGCOUNT ()

  Class:  Inquiry function - Specific

  Returns the count of actual arguments passed to the current
  routine.  The result is of type default integer.  Functions with a
  type of CHARACTER, COMPLEX(KIND=8), REAL(KIND=16), and
  COMPLEX(KIND=16) have an extra argument added that is used to
  return the function value.

  Formal (dummy) arguments that can be omitted must be declared
  VOLATILE.

  Formal arguments of type CHARACTER cannot be omitted.  Formal
  arguments that are adjustable arrays cannot be omitted.

  The standard way to pass and detect omitted arguments is to use the
  Fortran 95 features of OPTIONAL arguments and the PRESENT intrinsic
  function. Note that a declaration must be visible within the
  calling routine.

  The following example shows the IARGCOUNT intrinsic:

     CALL SUB (A,B)
     ...
     SUBROUTINE SUB (X,Y,Z)
     VOLATILE Z
     TYPE *, IARGCOUNT()       ! Displays the value 2

58.65  –  IARGPTR

  IARGPTR ()

  Class:  Inquiry function - Specific

  Returns a pointer to the actual argument list for the current
  routine.  IARGPTR takes no arguments and returns an INTEGER*8
  address of the calling-standard defined "argument block".

  The first element in the array contains the argument count;
  subsequent elements contain the INTEGER(KIND=8) address of the
  actual arguments.

  Formal (dummy) arguments which can be omitted must be declared
  VOLATILE.

  The following example shows the IARGPTR intrinsic:

  C      Test IARGPTR intrinsic function.
         EXTERNAL TEST_ARGPTR
         INTEGER*4 X,Y,Z,FOO
         X = 10
         Y = 20
         Z = 100
         FOO = 4

         PRINT 80, %LOC(X), %LOC(Y), %LOC(Z), %LOC(FOO)
  80     FORMAT (' Argument addresses: ',4(1X, Z16))
         CALL TEST_ARGPTR (4, X, Y, Z, FOO)
         END

         OPTIONS /EXTEND_SOURCE
         SUBROUTINE TEST_ARGPTR (N_ARGS)
         POINTER (II, I_ARGN)
         INTEGER*8 I_ARGN
         POINTER (I_PTR, I_VAL)
         INTEGER I_VAL

         II = IARGPTR()             ! Get address of arg block
         II = II + SIZEOF (II)      ! Get address of address of first arg

         DO I = 1, N_ARGS+1
          I_PTR = I_ARGN            ! Get address of actual from homed
                                    !   arg list
          print 90, I, I_PTR, I_VAL
  90      format ( ' Argument ',I2, ' address = ',Z16, ', contents = ',Z16)
          II = II + SIZEOF (II)  ! Get address of address of next arg
         END DO
         RETURN
         END

58.66  –  IBCHNG

  IBCHNG (integer, position)

  Class:  Elemental function - Generic

  Returns the reverse of the value of a specified bit in an integer.
  The low-order bit is position 0.

  Examples:

  Consider the following:

    INTEGER J, K
    J = IBCHNG(10, 2)         ! returns 14 = 1110
    K = IBCHNG(10, 1)         ! returns  8 = 1000

58.67  –  IBCLR

  IBCLR (integer, position)

  Class:  Elemental function - Generic

  Returns the value of the first argument with the specified bit set
  to 0 (bit clear).  The low-order bit is position 0.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  IBCLR  |   --     | INTEGER*1  | INTEGER*1   |
  |      |         | IIBCLR   | INTEGER*2  | INTEGER*4   |
  |      |         | JIBCLR   | INTEGER*4  | INTEGER*4   |
  |      |         | KIBCLR   | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.68  –  IBITS

  IBITS (integer, start-position, length)

  Class:  Elemental function - Generic

  Returns the value of the bits of the first argument specified by
  start-position and number of bits.  The low-order bit is position
  0.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  3   |  IBITS  |   --     | INTEGER*1  | INTEGER*1   |
  |      |         | IIBITS   | INTEGER*2  | INTEGER*2   |
  |      |         | JIBITS   | INTEGER*4  | INTEGER*4   |
  |      |         | KIBITS   | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.69  –  IBSET

  IBSET (integer, position)

  Class:  Elemental function - Generic

  Returns the value of the first argument with the specified bit set
  to 1 (bit set).  The low-order bit is position 0.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  IBSET  |   --     | INTEGER*1  | INTEGER*1   |
  |      |         | IIBSET   | INTEGER*2  | INTEGER*2   |
  |      |         | JIBSET   | INTEGER*4  | INTEGER*4   |
  |      |         | KIBSET   | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.70  –  ICHAR

  ICHAR (character)

  Class:  Elemental function - Generic

  Returns the position of a character in the processor's character
  set.

  The argument must have a length of 1.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |   --    |  --      | CHARACTER  | INTEGER*2   |
  |      |         | ICHAR    | CHARACTER  | INTEGER*4   |
  |      |         |  --      | CHARACTER  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

  This function cannot be passed as an actual argument.

58.71  –  IDATE

  IDATE (month, day, year)

  Class:  Subroutine

  Returns three integer values representing the current date.  The
  month is represented as the number of the month (1 - 12).  The day
  is represented as the day of the month.  The year is represented as
  the last two digits of the year.

58.72  –  IDIM

  See the DIM function.

58.73  –  IDINT

  See the INT function.

58.74  –  IDNINT

  See the NINT function

58.75  –  IEOR

  IEOR (integer, integer)

  Class:  Elemental function - Generic

  Performs an exclusive OR of the arguments on a bit by bit basis
  (bit exclusive OR).  This function can also be specified as XOR.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   | IEOR    |   --     | INTEGER*1  | INTEGER*1   |
  |      |         | IIEOR    | INTEGER*2  | INTEGER*2   |
  |      |         | JIEOR    | INTEGER*4  | INTEGER*4   |
  |      |         | KIEOR    | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.76  –  IFIX

  See the INT function.

58.77  –  ILEN

  ILEN (integer)

  Class:  Elemental function - Generic

  Returns the length (in bits) of the two's complement representation
  of an integer.

  The result type is the same as the argument.

  Examples:

  ILEN (4) has the value 3.

  ILEN (-4) has the value 2.

58.78  –  IMAG

  See the AIMAG intrinsic function.

58.79  –  INDEX

  INDEX (string, substring [,back] [,kind])

  Class:  Elemental function - Generic

  Returns the starting position of the substring as an INTEGER*4 or
  INTEGER*8 value.

  "string" and "substring" are of type character, "back" is of type
  logical, and "kind" is a scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "back" is absent or false, the leftmost substring is found. If
  "back" is true, the rightmost substring is found.

  Examples:

  INDEX ('FORTRAN', 'O', BACK = .TRUE.) has the value 2.

  INDEX ('XXXX', " ", BACK = .TRUE.) has the value 0.

  INDEX ('XXXX', "", BACK = .TRUE.) has the value 5.

58.80  –  INT

  INT (number [,kind])

  Class:  Elemental function - Generic

  Returns the largest integer whose absolute value does not exceed
  the absolute value of the argument and has the same sign as the
  argument.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that shown in the following table.
  If the processor cannot represent the result value in the kind of
  the result, the result is undefined.
  +------+-----------+----------+------------+-------------+
  | Args | Generic   | Specific |  Argument  | Result Type |
  +------+-----------+----------+------------+-------------+
  |  1   |  INT      |  --      | INTEGER*1  | INTEGER*2   |
  |      |           |  --      | INTEGER*1  | INTEGER*4   |
  |      |           |  --      | INTEGER*1  | INTEGER*8   |
  |      |           |  --      | INTEGER*2  | INTEGER*4   |
  |      |           |  --      | INTEGER*2  | INTEGER*8   |
  |      |           |  --      | INTEGER*4  | INTEGER*4   |
  |      |           |  --      | INTEGER*4  | INTEGER*8   |
  |      |           |  --      | INTEGER*8  | INTEGER*8   |
  |      |see note1  | IIFIX    | REAL*4     | INTEGER*2   |
  |      |           | IINT     | REAL*4     | INTEGER*2   |
  |      |see note2  | IFIX     | REAL*4     | INTEGER*4   |
  |      |           | JFIX     | INTEGER*1  | INTEGER*4   |
  |      |           |          | INTEGER*2  | INTEGER*4   |
  |      |           |          | INTEGER*4  | INTEGER*4   |
  |      |           |          | INTEGER*8  | INTEGER*4   |
  |      |           |          | REAL*4     | INTEGER*4   |
  |      |           |          | REAL*8     | INTEGER*4   |
  |      |           |          | REAL*16    | INTEGER*4   |
  |      |           |          | COMPLEX*8  | INTEGER*4   |
  |      |           |          | COMPLEX*16 | INTEGER*4   |
  |      |           |          | COMPLEX*32 | INTEGER*4   |
  |      |see note3  | INT      | REAL*4     | INTEGER*4   |
  |      |           | KIFIX    | REAL*4     | INTEGER*8   |
  |      |           | KINT     | REAL*4     | INTEGER*8   |
  |      |           | IIDINT   | REAL*8     | INTEGER*2   |
  |      |see note4  | IDINT    | REAL*8     | INTEGER*4   |
  |      |           | KIDINT   | REAL*4     | INTEGER*8   |
  |      |           | IIQINT   | REAL*16    | INTEGER*2   |
  |      |see note5  | IQINT    | REAL*16    | INTEGER*4   |
  |      |           | KIQINT   | REAL*16    | INTEGER*8   |
  |      |           |  --      | COMPLEX*8  | INTEGER*2   |
  |      |           |  --      | COMPLEX*8  | INTEGER*4   |
  |      |           |  --      | COMPLEX*8  | INTEGER*8   |
  |      |           |  --      | COMPLEX*16 | INTEGER*2   |
  |      |           |  --      | COMPLEX*16 | INTEGER*4   |
  |      |           |  --      | COMPLEX*16 | INTEGER*8   |
  |      |           |  --      | COMPLEX*32 | INTEGER*2   |
  |      |           |  --      | COMPLEX*32 | INTEGER*4   |
  |      |           |  --      | COMPLEX*32 | INTEGER*8   |
  |      |           | INT1     | INTEGER*1  | INTEGER*1   |
  |      |           |          | INTEGER*2  | INTEGER*1   |
  |      |           |          | INTEGER*4  | INTEGER*1   |
  |      |           |          | INTEGER*8  | INTEGER*1   |
  |      |           |          | REAL*4     | INTEGER*1   |
  |      |           |          | REAL*8     | INTEGER*1   |
  |      |           |          | REAL*16    | INTEGER*1   |
  |      |           |          | COMPLEX*8  | INTEGER*1   |
  |      |           |          | COMPLEX*16 | INTEGER*1   |
  |      |           |          | COMPLEX*32 | INTEGER*1   |
  |      |           | INT2     | INTEGER*1  | INTEGER*2   |
  |      |           |          | INTEGER*2  | INTEGER*2   |
  |      |           |          | INTEGER*4  | INTEGER*2   |
  |      |           |          | INTEGER*8  | INTEGER*2   |
  |      |           |          | REAL*4     | INTEGER*2   |
  |      |           |          | REAL*8     | INTEGER*2   |
  |      |           |          | REAL*16    | INTEGER*2   |
  |      |           |          | COMPLEX*8  | INTEGER*2   |
  |      |           |          | COMPLEX*16 | INTEGER*2   |
  |      |           |          | COMPLEX*32 | INTEGER*2   |
  |      |           | INT4     | INTEGER*1  | INTEGER*4   |
  |      |           |          | INTEGER*2  | INTEGER*4   |
  |      |           |          | INTEGER*4  | INTEGER*4   |
  |      |           |          | INTEGER*8  | INTEGER*4   |
  |      |           |          | REAL*4     | INTEGER*4   |
  |      |           |          | REAL*8     | INTEGER*4   |
  |      |           |          | REAL*16    | INTEGER*4   |
  |      |           |          | COMPLEX*8  | INTEGER*4   |
  |      |           |          | COMPLEX*16 | INTEGER*4   |
  |      |           |          | COMPLEX*32 | INTEGER*4   |
  |      |           | INT8     | INTEGER*1  | INTEGER*8   |
  |      |           |          | INTEGER*2  | INTEGER*8   |
  |      |           |          | INTEGER*4  | INTEGER*8   |
  |      |           |          | INTEGER*8  | INTEGER*8   |
  |      |           |          | REAL*4     | INTEGER*8   |
  |      |           |          | REAL*8     | INTEGER*8   |
  |      |           |          | REAL*16    | INTEGER*8   |
  |      |           |          | COMPLEX*8  | INTEGER*8   |
  |      |           |          | COMPLEX*16 | INTEGER*8   |
  |      |           |          | COMPLEX*32 | INTEGER*8   |
  +------+-----------+----------+------------+-------------+

  Note1: This function can also be specified as HFIX.
  Note2: For compatibility with older versions of
         Fortran, IFIX can also be specified as a generic
         function.
  Note3: Or JINT.
  Note4: Or JIDINT.  For compatibility with older versions of
         Fortran, IDINT can also be specified as a generic
         function.
  Note5: Or JIQINT.  For compatibility with older versions of
         Fortran, IQINT can also be specified as a generic
         function.

  These functions cannot be passed as actual arguments.

  The setting of compiler options specifying integer size can affect
  INT, IDINT, and IQINT.

  The setting of compiler options specifying integer size and real
  size can affect IFIX.

58.81  –  INT_PTR_KIND

  INT_PTR_KIND()

  Class:  Inquiry function - Specific

  Returns the INTEGER KIND that will hold an address.  This is a
  specific function that has no generic function associated with it.
  It must not be passed as an actual argument.

  The result is of type default integer.  The result is a scalar with
  the value equal to the value of the kind parameter of the integer
  data type that can represent an address on the host platform.

  The value is 8.

  The following example shows the INT_PTR_KIND intrinsic:

     REAL A(100)
     POINTER (P, A)
     INTEGER (KIND=INT_PTR_KIND()) SAVE_P
     P = MALLOC (400)
     SAVE_P = P

58.82  –  IOR

  IOR (integer, integer)

  Class:  Elemental function - Generic

  Performs a logical OR of the arguments on a bit by bit basis
  (bitwise inclusive OR).  This function can also be specified as OR.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  IOR    |  --      | INTEGER*1  | INTEGER*1   |
  |      |         | IIOR     | INTEGER*2  | INTEGER*2   |
  |      |         | JIOR     | INTEGER*4  | INTEGER*4   |
  |      |         | KIOR     | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.83  –  IQINT

  See the INT function.

58.84  –  IQNINT

  See the NINT function.

58.85  –  ISHA

  ISHA (integer, shift)

  Class:  Elemental function - Generic

  Arithmetically shifts an integer left or right by a specified
  number of bits.

  The "shift" is of type integer; it is the direction and distance of
  shift.

  The result type is the same as "integer".

  If "shift" is positive, the shift is to the left; if "shift" is
  negative, the shift is to the right.  If "shift" is zero, no shift
  is performed.

  Bits shifted out from the left or from the right, as appropriate,
  are lost.  If the shift is to the left, zeros are shifted in on the
  right.  If the shift is to the right, copies of the sign bit (0 for
  non-negative "integer"; 1 for negative "integer") are shifted in on
  the left.

  The kind of integer is important in arithmetic shifting because
  sign varies among integer representations (see the following
  example).  If you want to shift a one-byte or two-byte argument,
  you must declare it as INTEGER(1) or INTEGER(2).

  Examples:

  Consider the following:

    INTEGER(1) i, res1
    INTEGER(2) j, res2
    i = -128             ! equal to  10000000
    j = -32768           ! equal to  10000000 00000000
    res1  = ISHA (i, -4) ! returns 11111000 = -8
    res2  = ISHA (j, -4) ! returns 11111000 00000000 = -2048

58.86  –  ISHC

  ISHC (integer, shift)

  Class:  Elemental function - Generic

  Rotates an integer left or right by specified number of bits.  Bits
  shifted out one end are shifted in the other end.  No bits are
  lost.

  The "shift" is of type integer; it is the direction and distance of
  rotation.

  If "shift" is positive, "integer" is rotated left "shift" bits.  If
  "shift" is negative, "integer" is rotated right "shift" bits.  Bits
  shifted out one end are shifted in the other.  No bits are lost.

  The kind of integer is important in circular shifting.  With an
  INTEGER(4) argument, all 32 bits are shifted.  If you want to
  rotate a one-byte or two-byte argument, you must declare it as
  INTEGER(1) or INTEGER(2).

  Examples:

  Consider the following:

    INTEGER(1) i, res1
    INTEGER(2) j, res2
    i = 10                 ! equal to  00001010
    j = 10                 ! equal to  00000000 00001010
    res1  = ISHC (i, -3)   ! returns 01000001 =  65
    res2  = ISHC (j, -3)   ! returns 01000000 00000001 = 16385

58.87  –  ISHFT

  ISHFT (integer, shift)

  Class:  Elemental function - Generic

  Performs a bitwise logical shift - the "shift" is the
  no-of-positions.

  The integer is shifted left (if "shift" is positive) or right (if
  "shift" is negative) by ABS(shift) bits.  If ABS(shift) is greater
  than or equal to the length in bits of the integer argument, the
  result is zero.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  ISHFT  |   --     | INTEGER*1  | INTEGER*1   |
  |      |         | IISHFT   | INTEGER*2  | INTEGER*2   |
  |      |         | JISHFT   | INTEGER*4  | INTEGER*4   |
  |      |         | KISHFT   | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+
  Bits shifted out are lost.  Zeros are shifted in from the opposite
  end.

58.88  –  ISHFTC

  ISHFTC (integer, shift [,size])

  Class:  Elemental function - Generic

  Performs a bitwise circular shift - "shift" is the no-of-positions
  and "size" is the no-of-bits.

  The rightmost "size" bits of the integer argument are circularly
  shifted by "shift" places; bits in the integer argument beyond the
  value specified by "size" are unaffected.

  If "shift is positive, the shift is to the left; if negative, the
  shift is to the right.  If "size" is omitted, it is assumed to have
  the value BIT_SIZE (integer).
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  3   | ISHFTC  | IISHFTC  | INTEGER*2  | INTEGER*4   |
  |      |         | JISHFTC  | INTEGER*4  | INTEGER*4   |
  |      |         | KISHFTC  | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.89  –  ISHL

  ISHL (integer, shift)

  Class:  Elemental function - Generic

  Logically shifts an integer left or right by the specified bits.
  Zeros are shifted in from the opposite end.

  The "shift" is of type integer; it is the direction and distance of
  shift.

  Unlike circular or arithmetic shifts, which can shift ones into the
  number being shifted, logical shifts shift in zeros only,
  regardless of the direction or size of the shift.  The integer
  kind, however, still determines the end that bits are shifted out
  of, which can make a difference in the result (see the following
  example).

  Examples:

  Consider the following:

    INTEGER(1) i, res1
    INTEGER(2) j, res2
    i = 10                ! equal to  00001010
    j = 10                ! equal to  00000000 00001010
    res1  = ISHL (i, 5)   ! returns 01000000 = 64
    res2  = ISHL (j, 5)   ! returns 00000001 01000000 = 320

58.90  –  ISIGN

  See the SIGN function.

58.91  –  ISNAN

  ISNAN (real-number)

  Class:  Elemental function - Generic

  Tests whether IEEE REAL*4 (S_floating) and REAL*8 (T_floating)
  numbers are Not-a-Number (NaN) values.  To use this function,
  compiler option /FLOAT=IEEE_FLOAT must be set.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  ISNAN  |   --     | REAL*4     | LOGICAL*4   |
  |      |         |          | REAL*8     | LOGICAL*4   |
  +------+---------+----------+------------+-------------+

58.92  –  KIND

  KIND (number)

  Class:  Inquiry function - Generic

  Returns the value of the kind type parameter of the argument.  For
  more information on kind type parameters, see the
  reference manual.

  The argument can be of any intrinsic type.  The result is a scalar
  of type default integer.

  Examples:

  KIND (0.0) has the kind type value of default real type.

  KIND (12) has the kind type value of default integer type.

58.93  –  LBOUND

  LBOUND (array, [,dim] [,kind])

  Class:  Inquiry function - Generic

  Returns the lower bounds for all dimensions of an array, or the
  lower bound for a specified dimension.

  The "array" cannot be an allocatable array that is not allocated,
  or a disassociated pointer.  The "dim" is a scalar integer with a
  value in the range 1 to n, where "n" is the rank of "array".  The
  "kind" must be a scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "dim" is present, the result is a scalar.  Otherwise, the result
  is a rank-one array with one element for each dimension of "array".
  Each element in the result corresponds to a dimension of "array".

  If "array" is an array section or an array expression that is not a
  whole array or array structure component, each element of the
  result has the value 1.

  The setting of compiler options that specify integer size can
  affect the result of this function.

  Examples

  Consider the following:

  REAL ARRAY_A (1:3, 5:8)
  REAL ARRAY_B (2:8, -3:20)

  LBOUND (ARRAY_A) is (1, 5).  LBOUND (ARRAY_A, DIM=2) is 5.

  LBOUND (ARRAY_B) is (2, -3).  LBOUND (ARRAY_B (5:8, :)) is (1,1)
  because the arguments are array sections.

58.94  –  LEADZ

  LEADZ (integer)

  Class:  Elemental function - Generic

  Returns the number of leading zeros in the binary representation of
  the integer argument.  The result type is the same as the argument.

  Example:

  Consider the following:

    INTEGER*8 J, TWO
    PARAMETER (TWO=2)
    DO J= -1, 40
      TYPE *, LEADZ(TWO**J)  ! Prints 64 down to 23 (leading zeros)
    ENDDO
    END

58.95  –  LEN

  LEN (string [,kind])

  Class:  Inquiry function - Generic

  Returns the number of characters in the argument.  The argument
  must be a character expression.

  The "kind" must be a scalar integer initialization expression.

  The result is an INTEGER*4 or INTEGER*8 value.  If "kind" is
  present, the kind parameter of the result is that specified by
  "kind"; otherwise, the kind parameter of the result is that of
  default integer.  If the processor cannot represent the result
  value in the kind of the result, the result is undefined.

  The setting of compiler options that specify integer size can
  affect the result of this function.

58.96  –  LEN_TRIM

  LEN_TRIM (string [,kind])

  Class:  Elemental function - Generic

  Returns the length of the character argument without counting
  trailing blank characters.

  The "string" must be of type character.  The "kind" must be a
  scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  Examples:

  LEN_TRIM ('   C  D   ') has the value 7.

  LEN_TRIM ('   ') has the value 0.

58.97  –  LGE

  LGE (string-a, string-b)

  Class:  Elemental function - Generic

  Returns a value of true if the first character string is lexically
  greater than or equal to the second character string, based on the
  ASCII collating sequence - even if the processor's default
  collating sequence is different.  In VSI Fortran, LGE is
  equivalent to the >= operator.

  The ASCII collating sequence determines the relationship between
  the arguments.

  The arguments must be character expressions.  The result is a
  LOGICAL*4 value.

  This function cannot be passed as an actual argument.

58.98  –  LGT

  LGT (string-a, string-b)

  Class:  Elemental function - Generic

  Returns a value of true if the first character string is greater
  than the second character string, based on the ASCII collating
  sequence - even if the processor's default collating sequence is
  different.  In VSI Fortran, LGT is equivalent to the > operator.

  The ASCII collating sequence determines the relationship between
  the arguments.

  The arguments must be character expressions.  The result is a
  LOGICAL*4 value.

  This function cannot be passed as an actual argument.

58.99  –  LLE

  LLE (string-a, string-b)

  Class:  Elemental function - Generic

  Returns a value of true if the first character string is less than
  or equal to the second character string, based on the ASCII
  collating sequence - even if the processor's default collating
  sequence is different.  In VSI Fortran, LLE is equivalent to the
  <= operator.

  The ASCII collating sequence determines the relationship between
  the arguments.

  The arguments must be character expressions.  The result is a
  LOGICAL*4 value.

  This function cannot be passed as an actual argument.

58.100  –  LLT

  LLT (string-a, string-b)

  Class:  Elemental function - Generic

  Returns a value of true if the first character string is less than
  the second character string, based on the ASCII collating sequence
  - even if the processor's default collating sequence is different.
  In VSI Fortran, LLT is equivalent to the < operator.

  The ASCII collating sequence determines the relationship between
  the arguments.

  The arguments must be character expressions.  The result is a
  LOGICAL*4 value.

  This function cannot be passed as an actual argument.

58.101  –  LOC

  LOC (arg)

  Class:  Inquiry function - Generic

  Returns the internal address of a storage item.

  The argument can be a variable, an array or record field reference,
  a procedure, or a constant; it can be of any data type.  It must
  not be the name of an internal procedure or statement function.  If
  it is a pointer, it must be defined and associated with a target.

  The result is of type INTEGER*8.  The value of the result
  represents the address of the data object or, in the case of
  pointers, the address of its associated target.  If the argument is
  not valid, the result is undefined.

  On Open VMS systems, in the case of global symbolic constants, LOC
  returns the value of the constant rather than an address.

  The LOC intrinsic serves the same purpose as the %LOC built-in
  function.

  This function cannot be passed as an actual argument.

58.102  –  LOG

  LOG (number)

  Class:  Elemental function - Generic

  Returns the natural log (base e) of a real or complex argument.

  If the argument is real, its value must be greater than zero.  If
  the argument is complex, its value must not be (0.,0.).
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  LOG    | ALOG     | REAL*4     | REAL*4      |
  |      |         | DLOG     | REAL*8     | REAL*8      |
  |      |         | QLOG     | REAL*16    | REAL*16     |
  |      |         | CLOG     | COMPLEX*8  | COMPLEX*8   |
  |      |         | CDLOG    | COMPLEX*16 | COMPLEX*16  |
  |      |         | ZLOG     | COMPLEX*16 | COMPLEX*16  |
  |      |         | CQLOG    | COMPLEX*32 | COMPLEX*32  |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect ALOG and CLOG.

58.103  –  LOG10

  LOG10 (real-number)

  Class:  Elemental function - Generic

  Returns the common log (base 10) of the argument.  The argument
  must be greater than zero.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  LOG10  | ALOG10   | REAL*4     | REAL*4      |
  |      |         | DLOG10   | REAL*8     | REAL*8      |
  |      |         | QLOG10   | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect ALOG10.

58.104  –  LOGICAL

  LOGICAL (logical-exp, [,kind])

  Class:  Elemental function - Generic

  Converts the logical value of the argument to a logical of
  different kind type parameters.

  The setting of integer size compiler options can affect this
  function.

  Examples:

  LOGICAL (L .OR.  .NOT.  L) has the value true and is of type
  default logical regardless of the kind type parameter of logical
  variable L.

  LOGICAL (.FALSE., 2) has the value false, with the kind type
  parameter of INTEGER(KIND=2).

58.105  –  MALLOC

  MALLOC (integer)

  Class:  Elemental function - Specific

  Allocates a block of memory.

  The argument must be of type integer.  This value is the size in
  bytes of memory to be allocated.  If the argument is INTEGER*8, a
  64-bit (P3) space is allocated.

  The result is of type INTEGER*8.  The result is the starting
  address of the allocated memory.  The memory allocated can be freed
  by using the FREE intrinsic function.

  This function cannot be passed as an actual argument.

  Examples:

  Consider the following:

  INTEGER(4) SIZE
  REAL(4) STORAGE(*)
  POINTER (ADDR, STORAGE)     ! ADDR will point to STORAGE
  SIZE = 1024                 ! Size in bytes
  ADDR = MALLOC(SIZE)         ! Allocate the memory
  CALL FREE(ADDR)             ! Free it
  END

58.106  –  MATMUL

  MATMUL (matrix-a, matrix-b)

  Class:  Transformational function - Generic

  Performs matrix multiplication of numeric or logical matrices.

  The "matrix"s can be arrays of rank one or two.  At least one
  argument must be rank two.  The size of the first (or only)
  dimension of "matrix-b" must equal the last (or only) dimension of
  "matrix-a".

  The type of the resulting array depends on the data types of the
  arguments.  The rank and shape of the result follows:

   o  If "matrix-a" has shape (n,m) and "matrix-b" has shape (m,k),
      the result is a rank-two array with shape (n,k).

   o  If "matrix-a" has shape (m) and "matrix-b" has shape (m,k), the
      result is a rank-one array with shape (k).

   o  If "matrix-a" has shape (n,m) and "matrix-b" has shape (m), the
      result is a rank-one array with shape (n).

  Examples:

  Consider the following:

  A is the matrix |2 3 4|, B is the matrix |2 3|,
                  |3 4 5|                  |3 4|
                                           |4 5|

  X is vector (1, 2), and Y is vector (1, 2, 3).

  The result of MATMUL (A, B) is the matrix-matrix product AB with
  the value

    |29 38|
    |38 50|

  The result of MATMUL (X, A) is the vector-matrix product XA with
  the value (8, 11, 14).

  The result of MATMUL (A, Y) is the matrix-vector product AY with
  the value (20, 26).

58.107  –  MAX

  MAX (number, number [, ...])

  Class:  Elemental function - Generic

  Returns the greatest of the values specified in the argument list.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  n   |  MAX    |   --     | INTEGER*1  | INTEGER*1   |
  |      |         |   --     | INTEGER*1  | REAL*4      |
  |      |         | IMAX0    | INTEGER*2  | INTEGER*2   |
  |      |         | AIMAX0   | INTEGER*2  | REAL*4      |
  |      |see note1| MAX0     | INTEGER*4  | INTEGER*4   |
  |      |see note2| AMAX0    | INTEGER*4  | REAL*4      |
  |      |         | KMAX0    | INTEGER*8  | INTEGER*8   |
  |      |         | AKMAX0   | INTEGER*8  | REAL*4      |
  |      |         | IMAX1    | REAL*4     | INTEGER*2   |
  |      |see note3| MAX1     | REAL*4     | INTEGER*4   |
  |      |         | KMAX1    | REAL*4     | INTEGER*8   |
  |      |         | AMAX1    | REAL*4     | REAL*4      |
  |      |         | DMAX1    | REAL*8     | REAL*8      |
  |      |         | QMAX1    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

  Note1: Or JMAX0.
  Note2: Or AJMAX0.  AMAX0 is the same as REAL(MAX). For
         compatibility with older versions of Fortran, AMAX0
         can also be specified as a generic function.
  Note3: Or JMAX1.  MAX1 is the same as INT(MAX). For
         compatibility with older versions of Fortran, MAX1
         can also be specified as a generic function.

  These functions cannot be passed as actual arguments.

  The setting of compiler options specifying integer size can affect
  MAX1.

  The setting of compiler options specifying real size can affect
  AMAX1.

58.108  –  MAX0

  See the MAX function.

58.109  –  MAX1

  See the MAX function.

58.110  –  MAXEXPONENT

  MAXEXPONENT (real-arg)

  Class:  Inquiry function - Generic

  Returns the maximum exponent in the model representing the same
  type and kind type parameter as the argument.  The argument can be
  scalar or array valued.

  The model for real numbers is described in the HP Fortran for
  OpenVMS Language Reference Manual.

  Example:

  If X is REAL*4 type, MAXEXPONENT (X) has the value 128.

58.111  –  MAXLOC

  MAXLOC (array [,dim] [,mask] [,kind])

  Class:  Transformational function - Generic

  Returns the location of the maximum value of all elements in an
  array, a set of elements in an array, or elements in a specified
  dimension of an array.

  The "array" can be of type integer or real.  The "dim" must be a
  scalar integer with a value in the range 1 to n, where "n" is the
  rank of "array".  The "mask" must be a logical array conformable
  with "array".  The "kind" must be a scalar integer initialization
  expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "dim" is absent, the result is an array with rank that is one
  less than "array", and shape (d1, d2,..., d"dim"-1, d"dim"+1,...,
  dn), where (d1, d2,..., dn) is the shape of "array".

  If "kind" is present, the kind parameter of the result is that
  specified by "kind"; otherwise, the kind parameter of the result is
  that of default integer.  If the processor cannot represent the
  result value in the kind of the result, the result is undefined.

  The result of MAXLOC (array) is a rank-one array whose elements
  form the subscript of the location of the element with the maximum
  value in "array".

  The result of MAXLOC (array, mask=mask) is a rank-one array whose
  elements form the subscript of the location of the element with the
  maximum value corresponding to the condition specified by "mask".

  If more than one element has maximum value, the element whose
  subscripts are returned is the first such element, taken in array
  element order.  If "array" has size zero, or every element of
  "mask" has the value .FALSE., the value of the result is undefined.

  Examples:

  The value of MAXLOC ((/3, 7, 4, 7/)) is 2.

  Consider that A is the array

   | 4  0 -3  2|
   | 3  1 -2  6|
   |-1 -4  5 -5|

  MAXLOC (A, MASK=A .LT.  5) has the value (1, 1).  This is true even
  if A has a declared bound other than 1.

  MAXLOC (A, DIM=1) has the value (1, 2, 3, 2).

  MAXLOC (A, DIM=2) has the value (1, 4, 3).

58.112  –  MAXVAL

  MAXVAL (array [,dim] [,mask]

  Class:  Transformational function - Generic

  Returns the maximum value of all elements in an array, a set of
  elements in an array, or elements in a specified dimension of an
  array.

  The array can be of type integer or real.  The "dim" must be a
  scalar integer with a value in the range 1 to n, where "n" is the
  rank of "array".  The "mask" must be a logical array conformable
  with "array".

  The result is the same data type as "array".  The result is a
  logical array with the same kind type parameter as "array".  The
  result is a scalar if "dim" is absent or "array" has rank one.
  Otherwise, the result is an array with rank that is one less than
  "array", and shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn), where
  (d1, d2,..., dn) is the shape of "array".

  The result of MAXVAL (array) has a value equal to the maximum value
  of all the elements in "array".

  The result of MAXVAL (array, mask=mask) has a value equal to the
  maximum value of the elements in "array" corresponding to the
  condition specified by "mask".

  If "array" has size zero or if there are no true elements in
  "mask," the result has the value of the negative number of the
  largest magnitude supported by the processor for numbers of the
  type and kind type parameter of "array".

  Examples:

  The value of MAXVAL ((/2, 3, 4/)) is 4.

  The value of MAXVAL (B, MASK=B .LT.  0.0) finds the maximum of the
  negative elements of B.

  Consider that C is the array

   |2 3 4|
   |5 6 7|

  MAXVAL (C, DIM=1) has the value (5, 6, 7).

  MAXVAL (C, DIM=2) has the value (4, 7).

58.113  –  MERGE

  MERGE (tsource, fsource, mask)

  Class:  Elemental function - Generic

  Selects between two values or between corresponding elements in two
  arrays, according to the condition specified by a logical mask.

  The "tsource" and "fsource" can be scalars or arrays; they must
  have the same type and type parameters.  The "mask" is a logical
  array.

  The result type is the same as "tsource".  The value of "mask"
  determines whether the result value is taken from "tsource" (if
  "mask" is true) or "fsource" (if "mask" is false).

  Examples:

  For MERGE (1.0, 0.0, R < 0), if R is -3 the merge has the value
  1.0, while if R is 7 the merge has the value 0.0.

  Consider that TSOURCE is the array |1 3 5|, FSOURCE is the
                                     |2 4 6|

  array |8 9 0|, and MASK is the array |F T T|.
        |1 2 3|                        |T T F|

  MERGE (TSOURCE, FSOURCE, MASK) produces the result: |8 3 5|.
                                                      |2 4 3|

58.114  –  MIN

  MIN (number, number [, ...])

  Class:  Elemental function - Generic

  Returns the lowest of the values specified in the argument list.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  n   |  MIN    |   --     | INTEGER*1  | INTEGER*1   |
  |      |         |   --     | INTEGER*1  | REAL*4      |
  |      |         | IMIN0    | INTEGER*2  | INTEGER*2   |
  |      |         | AIMIN0   | INTEGER*2  | REAL*4      |
  |      |see note1| MIN0     | INTEGER*4  | INTEGER*4   |
  |      |see note2| AMIN0    | INTEGER*4  | REAL*4      |
  |      |         | KMIN0    | INTEGER*8  | INTEGER*8   |
  |      |         | AKMIN0   | INTEGER*8  | REAL*4      |
  |      |         | IMIN1    | REAL*4     | INTEGER*2   |
  |      |see note3| MIN1     | REAL*4     | INTEGER*4   |
  |      |         | KMIN1    | REAL*4     | INTEGER*8   |
  |      |         | AMIN1    | REAL*4     | REAL*4      |
  |      |         | DMIN1    | REAL*8     | REAL*8      |
  |      |         | QMIN1    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

  Note1: Or JMIN0.
  Note2: Or AJMIN0.  AMIN0 is the same as REAL(MIN). For
         compatibility with older versions of Fortran, AMIN0
         can also be specified as a generic function.
  Note3: Or JMIN1.  MIN1 is the same as INT(MIN). For
         compatibility with older versions of Fortran, MIN1
         can also be specified as a generic function.

  These functions cannot be passed as actual arguments.

  The setting of compiler options specifying integer size can affect
  MIN1.

  The setting of compiler options specifying real size can affect
  AMIN1.

58.115  –  MIN0

  See the MIN function.

58.116  –  MIN1

  See the MIN function.

58.117  –  MINEXPONENT

  MINEXPONENT (real-arg)

  Class:  Inquiry function - Generic

  Returns the minimum exponent in the model representing the same
  type and kind type parameter as the argument.  The argument can be
  scalar or array valued.

  The model for real numbers is described in the HP Fortran for
  OpenVMS Language Reference Manual.

  Example:

  If X is REAL*4 type, MINEXPONENT (X) has the value -125.

58.118  –  MINLOC

  MINLOC (array [,dim] [,mask] [,kind])

  Class:  Transformational function - Generic

  Returns the location of the minimum value of all elements in an
  array, a set of elements in an array, or elements in a specified
  dimension of an array.

  The "array" can be of type integer or real.  The "dim" must be a
  scalar integer with a value in the range 1 to n, where "n" is the
  rank of "array".  The "mask" must be a logical array conformable
  with "array".  The "kind" must be a scalar integer initialization
  expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "dim" is absent, the result is an array with rank that is one
  less than "array", and shape (d1, d2,..., d"dim"-1, d"dim"+1,...,
  dn), where (d1, d2,..., dn) is the shape of "array".

  If "kind" is present, the kind parameter of the result is that
  specified by "kind"; otherwise, the kind parameter of the result is
  that of default integer.  If the processor cannot represent the
  result value in the kind of the result, the result is undefined.

  The result of MINLOC (array) is a rank-one array whose elements
  form the subscript of the location of the element with the minimum
  value in "array".

  The result of MINLOC (array, mask=mask) is a rank-one array whose
  elements form the subscript of the location of the element with the
  minimum value corresponding to the condition specified by "mask".

  If more than one element has minimum value, the element whose
  subscripts are returned is the first such element, taken in array
  element order.  If "array" has size zero, or every element of
  "mask" has the value .FALSE., the value of the result is undefined.

  Examples:

  The value of MINLOC ((/3, 1, 4, 1/)) is 2.

  Consider that A is the array

   | 4  0 -3  2|
   | 3  1 -2  6|
   |-1 -4  5 -5|

  MINLOC (A, MASK=A .GT.  -5) has the value (3, 2).  This is true
  even if A has a declared bound other than 1.

  MAXLOC (A, DIM=1) has the value (3, 3, 1, 3).

  MAXLOC (A, DIM=2) has the value (3, 3, 4).

58.119  –  MINVAL

  MINVAL (array [,dim] [,mask]

  Class:  Transformational function - Generic

  Returns the minimum value of all elements in an array, a set of
  elements in an array, or elements in a specified dimension of an
  array.

  The array can be of type integer or real.  The "dim" must be a
  scalar integer with a value in the range 1 to n, where "n" is the
  rank of "array".  The "mask" must be a logical array conformable
  with "array".

  The result is the same data type as "array".  The result is a
  logical array with the same kind type parameter as "array".  The
  result is a scalar if "dim" is absent or "array" has rank one.
  Otherwise, the result is an array with rank that is one less than
  "array", and shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn), where
  (d1, d2,..., dn) is the shape of "array".

  The result of MINVAL (array) has a value equal to the minimum value
  of all the elements in "array".

  The result of MINVAL (array, mask=mask) has a value equal to the
  minimum value of the elements in "array" corresponding to the
  condition specified by "mask".

  If "array" has size zero or if there are no true elements in
  "mask," the result has the value of the positive number of the
  largest magnitude supported by the processor for numbers of the
  type and kind type parameter of "array".

  Examples:

  The value of MINVAL ((/2, 3, 4/)) is 2.

  The value of MINVAL (B, MASK=B .GT.  0.0) finds the minimum of the
  positive elements of B.

  Consider that C is the array

   |2 3 4|
   |5 6 7|

  MINVAL (C, DIM=1) has the value (2, 3, 4).

  MINVAL (C, DIM=2) has the value (2, 5).

58.120  –  MOD

  MOD (dividend, divisor)

  Class:  Elemental function - Generic

  Divides the first argument by the second and returns the remainder.
  +------+----------+----------+------------+-------------+
  | Args | Generic  | Specific |  Argument  | Result Type |
  +------+----------+----------+------------+-------------+
  |  2   |  MOD     |  --      | INTEGER*1  | INTEGER*1   |
  |      |          | IMOD     | INTEGER*2  | INTEGER*2   |
  |      |see note1 | MOD      | INTEGER*4  | INTEGER*4   |
  |      |          | KMOD     | INTEGER*8  | INTEGER*8   |
  |      |see note2 | AMOD     | REAL*4     | REAL*4      |
  |      |          | DMOD     | REAL*8     | REAL*8      |
  |      |          | QMOD     | REAL*16    | REAL*16     |
  +------+----------+----------+------------+-------------+

  Note1: Or JMOD.
  Note2: The setting of compiler options specifying real
         size can affect AMOD.

58.121  –  MODULO

  MODULO (number-a, number-b)

  Class:  Elemental function - Generic

  Returns the modulo of the arguments.  The arguments can be integer
  or real type.  They must both be the same type and kind type
  parameter.

  The result is the same type as the arguments.

  If "number-a" is of type integer and "number-b" is not equal to
  zero, the value of the result is "number-a" -
  FLOOR(REAL("number-a")/REAL("number-b")) * "number-b".  If
  "number-a" is of type real and "number-b" is not equal to zero, the
  value of the result is "number-a" - FLOOR("number-a"/"number-b").
  If "number-b" is equal to zero, the result is undefined.

  Examples:

  MODULO (7, 3) has the value 1.

  MODULO (9, -6) has the value -3.

  MODULO (-9, 6) has the value 3.

58.122  –  MULT_HIGH

  MULT_HIGH (integer*8, integer*8)

  Class:  Elemental function - Specific

  A function that multiplies two 64-bit unsigned integers.  The
  result is of type INTEGER*8.  The result value is the upper
  (leftmost) 64 bits of the 128-bit unsigned result.

  This function cannot be passed as an actual argument.

  Consider the following:

          INTEGER(8) I,J,K
          I=2_8**53
          J=2_8**51
          K = MULT_HIGH (I,J)
          PRINT *,I,J,K
          WRITE (6,1000)I,J,K
  1000    FORMAT (' ', 3(Z,1X))
          END

  This example prints the following:

    9007199254740992      2251799813685248         1099511627776
        20000000000000           8000000000000             10000000000

58.123  –  MY_PROCESSOR

  MY_PROCESSOR ()

  Class:  Inquiry function - Specific

  Returns the identifying number of the calling process.  This is a
  specific function that has no generic function associated with it.
  It must not be passed as an actual argument.

  The result is a scalar of type default integer.  The result value
  is the identifying number of the physical processor from which the
  call is made.

  The value is in the range 0 to "n"-1, where "n" is the value
  returned by NUMBER_OF_PROCESSORS.

58.124  –  MVBITS

  MVBITS (from, frompos, len, to, topos)

  Class:  Elemental subroutine

  Copies a sequence of bits (a bit field) from one location to
  another.  The following arguments can be of any integer data type:

     from     Represents the location from which a bit
              field is transferred.

     frompos  Identifies the first bit position in the
              field transferred from "from". It must not
              be negative. "frompos" + "len" must be less
              than or equal to BIT_SIZE (from).

     len      Identifies the length of the field transferred
              from "from".  It must not be negative.

     to       Represents the location to which a bit field
              is transferred. It must have the same kind
              parameter as "from".  "to" is set by copying
              the sequence of bits of length "len", starting
              at position "frompos" of "from" to position
              "topos" of "to".  No other bits of "to"
              are altered.

              On return, the "len" bits of "to" (starting
              at "topos") are equal to the value that "len"
              bits of "from" (starting at "frompos") had
              on entry.

     topos    Identifies the starting position (within "to")
              for the bits being transferred.  It must not
              be negative.  "topos" + "len" must be less than
              or equal to BIT_SIZE (to).)

  You can also specify the following specific subroutines:

    IMVBITS   All arguments must be INTEGER*2.
    JMVBITS   Arguments can be INTEGER*2 or INTEGER*4; at least
              one must be INTEGER*4.
    KMVBITS   Arguments can be INTEGER*2, INTEGER*4, or INTEGER*8;
              at least one must be INTEGER*8.

58.125  –  NEAREST

  NEAREST (real-number-a, real-number-b)

  Class:  Elemental function - Generic

  Returns the nearest different number (representable on the
  processor) in a given direction.

  The result type is the same as "real-number-a"; a positive
  "real-number-b" returns the nearest number in the direction of
  positive infinity. A negative one goes in the direction of
  negative infinity.

  Example:

  If 3.0 and 2.0 are REAL*4 values, NEAREST (3.0, 2.0) has the
  value 3 + 2**-22, which equals approximately 3.0000002, while
  NEAREST (3.0, -2.0) has the value 3-2**-22, which approximately
  equals 2.9999998.  For more information on the REAL*4 model,
  see the HP Fortran for OpenVMS Language Reference Manual.

58.126  –  NINT

  NINT (real-number [,kind])

  Class:  Elemental function - Generic

  Returns the value of the integer nearest to the value of the
  argument.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that shown in the following table.
  If the processor cannot represent the result value in the kind of
  the result, the result is undefined.
  +------+-----------+----------+------------+-------------+
  | Args | Generic   | Specific |  Argument  | Result Type |
  +------+-----------+----------+------------+-------------+
  |   1  |           | ININT    | REAL*4     | INTEGER*2   |
  |      |see note1  | NINT     | REAL*4     | INTEGER*4   |
  |      |           | KNINT    | REAL*4     | INTEGER*8   |
  |      |           | IIDNNT   | REAL*8     | INTEGER*2   |
  |      |see note2  | IDNINT   | REAL*8     | INTEGER*4   |
  |      |           | KIDNNT   | REAL*8     | INTEGER*8   |
  |      |           | IIQNNT   | REAL*16    | INTEGER*2   |
  |      |see note3  | IQNINT   | REAL*16    | INTEGER*4   |
  |      |           | KIQNNT   | REAL*16    | INTEGER*8   |
  +------+-----------+----------+------------+-------------+

  Note1: Or JNINT.
  Note2: Or JIDNNT.  For compatibility with older versions
         of Fortran, IDNINT can also be specified as a generic
         function.
  Note3: Or JIQNNT. For compatibility with older versions
         of Fortran,  IQNINT can also be specified as a generic
         function.

  The setting of compiler options specifying integer size can affect
  NINT, IDNINT, and IQNINT.

58.127  –  NOT

  NOT (integer)

  Class:  Elemental function - Generic

  Complements each bit of the argument (bitwise complement).
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  NOT    |  --      | INTEGER*1  | INTEGER*1   |
  |      |         | INOT     | INTEGER*2  | INTEGER*2   |
  |      |         | JNOT     | INTEGER*4  | INTEGER*4   |
  |      |         | KNOT     | INTEGER*8  | INTEGER*8   |
  +------+---------+----------+------------+-------------+

58.128  –  NULL

  NULL ([mold])

  Class:  Transformational function - Generic

  Initializes a pointer as disassociated when it is declared.

  Argument "mold" is optional and must be a pointer; it can be of any
  type.

  The status of the pointer can be associated, disassociated, or
  undefined.  If the pointer's status is associated, the target does
  not have to be defined with a value.

  The result type is the same as "mold", if present.  Otherwise, the
  type (and rank) is determined by the pointer that becomes
  associated with the result:

  If NULL () Appears...         Type is Determined From...
  ------------------------      -----------------------------------
  Right side of pointer         The pointer on the left side
    assignment

  Initialization for an         The object
    object in a declaration

  Default initialization        The component
    for a component

  In a structure constructor    The corresponding component

  As an actual argument         The corresponding dummy argument

  In a DATA statement           The corresponding pointer object

  It returns a disassociated pointer.

  Example:

    INTEGER, POINTER :: POINT1 => NULL()

  This statement defines the initial association status of POINT1 to
  be disassociated.

58.129  –  NUMBER_OF_PROCESSORS

  NUMBER_OF_PROCESSORS ([dim])

  Class:  Inquiry function - Specific

  Returns the total number of processors (peers) available to the
  program along an optional dimension of the processor array.

  The "dim" has no effect on single-processor workstations.

  The result is of type default integer.  On single-processor
  workstations, the result is always 1.

  This function cannot be passed as an actual argument.

58.130  –  NWORKERS

  NWORKERS ()

  Class:  Elemental function - Specific

  Returns an INTEGER*4 value that represents the total number of
  processes executing an application.  However, since VSI Fortran
  only does serial processing, NWORKERS always returns 1.

  NWORKERS is provided for compatibility with HP Fortran 77 for
  OpenVMS VAX systems.

  This function cannot be passed as an actual argument.

58.131  –  PACK

  PACK (array, mask [,vector])

  Class:  Transformational function - Generic

  Takes elements from an array and packs them into a rank-one array
  under the control of a mask.

  The "mask" must be of logical type and conformable with "array".
  The "vector" must be a rank-one array with the same type and type
  parameters as "array".  Its size must be at least t, where "t" is
  the number of true elements in "mask".  If "mask" is a scalar with
  value true, "vector" must have at least as many elements as there
  are in "array".

  Elements in "vector" are used to fill out the result array if there
  are not enough elements selected by "mask."

  The result is a rank-one array with the same type and type
  parameters as "array".  If "vector" is present, the size of the
  result is that of "vector".  Otherwise, the size of the result is
  the number of true elements in "mask", or the number of elements in
  "array" (if "mask" is a scalar with value true).

  Elements in "array" are processed in array element order to form
  the result array.  Element i of the result is the element of
  "array" that corresponds to the ith true element of "mask".

  If "vector" is present and has more elements than there are true
  values in "mask", any result elements that are empty (because they
  were not true according to "mask") are set to the corresponding
  values in "vector".

  Examples:

  Consider that N is the array |0 8 0|.
                               |0 0 0|
                               |7 0 0|

  PACK (N, MASK=N .NE.  0, VECTOR= (/1, 3, 5, 9, 11, 13/) produces
  the result (7, 8, 5, 9, 11, 13).

  PACK (N, MASK=N .NE.  0) produces the result (7, 8).

58.132  –  POPCNT

  POPCNT (integer)

  Class:  Elemental function - Generic

  A function that returns the number of 1 bits in the binary
  representation of the integer argument.  The result type is the
  same as the argument.

  Example:

  If the value of I is B'0...00011010110', the value of POPCNT(I) is
  5.

58.133  –  POPPAR

  POPPAR (integer*8)

  Class:  Elemental function - Generic

  A function that returns parity of an integer.  The result value is
  one if there are an odd number of 1 bits in the binary
  representation of the integer argument and zero if there are an
  even number.  The result type is the same as the argument.

  Example:

  If the value of I is B'0...00011010110', the value of POPPAR(I) is
  1.

58.134  –  PRECISION

  PRECISION (number)

  Class:  Inquiry function - Generic

  Returns the decimal precision in the model representing real
  numbers with the same kind type parameter as the argument.

  The "number" can be of real or complex type; it can be scalar or
  array valued.

  The result is a scalar of type default integer.  The result has the
  value INT((DIGITS("number") - 1) * LOG10(RADIX("number"))).  If
  RADIX("number") is an integral power of 10, 1 is added to the
  result.

  Example:

  If X is a REAL*4 value, PRECISION (X) has the value 6.  The value 6
  is derived from INT ((24-1) * LOG10 (2.)) = INT (6.92...).  For
  more information on the model for REAL*4, see the HP Fortran for
  OpenVMS Language Reference Manual.

58.135  –  PRESENT

  PRESENT (opt-argument)

  Class:  Inquiry function - Generic

  Returns whether or not an optional dummy argument is present (has
  an associated actual argument).

  Example:

  Consider the following:

  SUBROUTINE CHECK (X, Y)
    REAL X, Z
    REAL, OPTIONAL :: Y
    ...
    IF (PRESENT (Y)) THEN
      Z = Y
    ELSE
       Z = X * 2
    END IF
  END
  ...
  CALL CHECK (15.0, 12.0)      ! Causes B to be set to 12.0
  CALL CHECK (15.0)            ! Causes B to be set to 30.0

58.136  –  PROCESSORS_SHAPE

  PROCESSORS_SHAPE ()

  Class:  Inquiry function - Specific

  Returns the shape of an implementation-dependent hardware processor
  array.

  If used in a program compiled for a HP PSE cluster, the result
  is a rank-one array of type default integer containing the number
  of processors (peers) available to the program.  Otherwise, the
  result is always a rank-one array of size zero.

  This function cannot be passed as an actual argument.

58.137  –  PRODUCT

  PRODUCT (array, [,dim] [,mask])

  Class:  Transformational function - Generic

  Returns the product of all the elements in an entire array or in a
  specified dimension of an array.

  The "array" can be of integer or real type.  The "dim" is optional
  and must be a scalar integer with a value in the range 1 to n,
  where "n" is the rank of "array".  The "mask" is optional and must
  be a logical array that is conformable with "array".

  The result is the same data type as "array".  The result is a
  scalar if "dim" is absent or "array" has rank one.  Otherwise, the
  result is an array with rank that is one less than "array", and
  shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn), where (d1, d2,...,
  dn) is the shape of "array".

  If only "array" appears, the result is the product of all elements
  of "array".  If "array" has size zero, the result is 1.

  If "array" and "mask" both appear, the result is the product of all
  elements of "array" corresponding to true elements of "mask".  If
  "array" has size zero, or every element of "mask" has the value
  .FALSE., the result is 1.

  If "dim" also appears and "array" has rank one, the value is the
  same as PRODUCT (array [,mask=mask]).  Otherwise, the value of
  element (s1, s2,..., s"dim"-1, s"dim"+1,..., sn) of PRODUCT (array,
  dim, [,mask]) is equal to PRODUCT (array (s1, s2,..., s"dim"-1, :,
  s"dim"+1, ..., sn)) [mask=mask (s1, s2, ..., s"dim"-1, :, s "dim"+1
  ..., sn)].

  Examples:

  PRODUCT ((/2, 3, 4/)) and PRODUCT ((/2, 3, 4/), DIM=1) returns the
  value 24.

  PRODUCT (C, MASK=C .LT.  0.0) returns the product of the negative
  elements of C.

  Consider that A is the array |1 4 7|.
                               |2 3 5|

  PRODUCT (A, DIM=1) returns the value (2, 12, 35).

  PRODUCT (A, DIM=2) returns the value (28, 30).

58.138  –  QCMPLX

  QCMPLX (number [,number])

  Class:  Elemental function - Generic

  Converts the argument(s) into a COMPLEX*32 value.

  If one argument is specified, the argument is converted into the
  real part of the complex value and the imaginary part becomes zero.
  If two arguments are specified, the first argument is converted
  into the real part of the complex value and the second argument is
  converted into the imaginary part of the complex value.  If two
  arguments are specified, they must have the same data type.

  +-------+----------+----------+------------+-------------+
  | Args  | Generic  | Specific |  Argument  | Result Type |
  +-------+----------+----------+------------+-------------+
  | 1,2   | QCMPLX   |   --     | INTEGER*1  | COMPLEX*32  |
  | 1,2   |          |   --     | INTEGER*2  | COMPLEX*32  |
  | 1,2   |          |   --     | INTEGER*4  | COMPLEX*32  |
  | 1,2   |          |   --     | INTEGER*8  | COMPLEX*32  |
  | 1,2   |          |   --     | REAL*4     | COMPLEX*32  |
  | 1,2   |          |   --     | REAL*8     | COMPLEX*32  |
  | 1,2   |          |   --     | REAL*16    | COMPLEX*32  |
  |  1    |          |   --     | COMPLEX*8  | COMPLEX*32  |
  |  1    |          |   --     | COMPLEX*16 | COMPLEX*32  |
  |  1    |          |   --     | COMPLEX*32 | COMPLEX*32  |
  +-------+----------+----------+------------+-------------+

  This function cannot be passed as an actual argument.

58.139  –  QEXT

  QEXT (number)

  Class:  Elemental function - Generic

  Converts the argument to a REAL*16 value.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  QEXT   |  --      | INTEGER*2  | REAL*16     |
  |      |         |  --      | INTEGER*4  | REAL*16     |
  |      |         | QEXT     | REAL*4     | REAL*16     |
  |      |         | QEXTD    | REAL*8     | REAL*16     |
  |      |         |  --      | REAL*16    | REAL*16     |
  |      |         |  --      | COMPLEX*8  | REAL*16     |
  |      |         |  --      | COMPLEX*16 | REAL*16     |
  |      |         |  --      | COMPLEX*32 | REAL*16     |
  +------+---------+----------+------------+-------------+

  These functions cannot be passed as actual arguments.

58.140  –  QFLOAT

  QFLOAT (integer)

  Class:  Elemental function - Generic

  Converts an integer value to a REAL*16 value.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   | QFLOAT  |  --      | INTEGER*2  | REAL*16     |
  |      |         |  --      | INTEGER*4  | REAL*16     |
  +------+---------+----------+------------+-------------+

58.141  –  QREAL

  QREAL (dbl-complex-number)

  Class:  Elemental function - Specific

  Converts the real part of a COMPLEX*32 argument to REAL*16 type.

  This function cannot be passed as an actual argument.

58.142  –  RADIX

  RADIX (number)

  Class:  Inquiry function - Generic

  Returns the base of the model representing numbers of the same type
  and kind type parameter as the argument.

  The "number" can be of integer or real type; it can be scalar or
  array valued.

  The result is a scalar of type default integer.  For an integer
  argument, the result has the value "r" as defined in the integer
  model.  For a real argument, the result has the value "b" as
  defined in the real model.

  For information on integer and real models, see the HP Fortran for
  OpenVMS Language Reference Manual.

  Examples:

  If X is a REAL*4 value, RADIX (X) has the value 2.

58.143  –  RAN

  RAN (seed)

  Class:  Nonelemental function - Specific

  Generates a general random number of the multiplicative
  congruential type.  This function returns a different REAL*4 number
  between 0.0 (inclusive) and 1.0 (exclusive) each time it is
  invoked.  The argument must be an INTEGER*4 variable or array
  element.

  For best results, you should initialize the argument to a large,
  odd value before invoking RAN the first time.  To generate
  different sets of random values, initialize the seed to a different
  value on each run.  Do not modify the seed during a run.

  This function cannot be passed as an actual argument.

58.144  –  RANDOM_NUMBER

  RANDOM_NUMBER (real-number)

  Class:  Subroutine

  Returns one pseudorandom number (or an array of such numbers).  The
  argument is set to contain pseudorandom numbers from the uniform
  distribution within the range 0 <= x < 1.

  Examples:

  Consider the following:

  REAL Y, Z (5, 5)
  ! Initialize Y with a pseudorandom number
  CALL RANDOM_NUMBER (HARVEST = Y)
  CALL RANDOM_NUMBER (Z)

  Y and Z contain uniformly distributed random numbers.

58.145  –  RANDOM_SEED

  RANDOM_SEED ([size] [, put] [, get])

  Class:  Subroutine

  Changes or queries the seed (starting point) for the pseudorandom
  number generator used by RANDOM_NUMBER.  No more than one argument
  can be specified.  If an argument is specified, it must be of
  default integer type.

  The "size" must be scalar; it is set to the number of integers (N)
  that the processor uses to hold the value of the seed.

  The "put" must be an array of rank 1 and size >= N; it is used to
  reset the value of the seed.

  The "get" must be an array of rank 1 and size >= N; it is set to
  the current value of the seed.

  If no argument is specified, a random number based on the date and
  time is assigned to the seed.

  Example:

  Consider the following:

  CALL RANDOM_SEED ( )                   ! Processor reinitializes the
                                         !  seed randomly from the date
                                         !  and time
  CALL RANDOM_SEED (SIZE = M)            ! Sets M to N
  CALL RANDOM_SEED (PUT = SEED (1 : M))  ! Sets user seed
  CALL RANDOM_SEED (GET = OLD  (1 : M))  ! Reads current seed

58.146  –  RANDU

  RANDU (integer-1, integer-2, store)

  Class:  Subroutine

  Computes a pseudorandom number as a single-precision value.

  The integer arguments must be INTEGER(KIND=2) variables or array
  elements that contain the seed for computing the random number.
  The new seed for computing the next random number is stored into
  these integer arguments.  The "store" is a REAL(KIND=4) variable or
  array element where the computed random number is returned.

  The result is returned in "store", which must be of type
  REAL(KIND=4).  The result value is a pseudorandom number in the
  range 0.0 to 1.0.  The algorithm for computing the random number
  value is based on the values for "integer-1" and "integer-2".

  Example:

  Consider the following:

  REAL X
  INTEGER(2) I, J
  ...
  CALL RANDU (I, J, X)

  If I and J are values 4 and 6, X stores the value 5.4932479E-04.

58.147  –  RANGE

  RANGE (number)

  Class:  Inquiry function - Generic

  Returns the decimal exponent range in the model representing
  numbers with the same kind type parameter as the argument.

  The argument can be of type integer, real, or complex.  It can be
  scalar or array valued.

  The result is a scalar of type default integer.  For an integer
  argument, the result has the value INT (LOG10 ( HUGE("number") )).
  For a real or complex argument, the result has the value INT(MIN
  (LOG10( HUGE("number") ), -LOG10( TINY("number") ))).

  For information on the integer and real models, see the HP Fortran
  for OpenVMS Language Reference Manual.

  Example:

  If X is a REAL*4 value, RANGE (X) has the value 37.  (HUGE(X) = (1
  - 2**-24) x 2**128 and TINY(X) = 2**-126.)

58.148  –  REAL

  REAL (number [,kind])

  Class:  Elemental function - Generic

  Converts the argument to a real value.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  REAL   |  --      | INTEGER*1  | REAL*4      |
  |      |         | FLOATI   | INTEGER*2  | REAL*4      |
  |      |see note1| FLOAT    | INTEGER*4  | REAL*4      |
  |      |         | REAL     | INTEGER*4  | REAL*4      |
  |      |         | FLOATK   | INTEGER*8  | REAL*4      |
  |      |         |  --      | REAL*4     | REAL*4      |
  |      |see note2| SNGL     | REAL*8     | REAL*4      |
  |      |         | SNGLQ    | REAL*16    | REAL*4      |
  |      |         |  --      | COMPLEX*8  | REAL*4      |
  |      |         |  --      | COMPLEX*16 | REAL*4      |
  +------+---------+----------+------------+-------------+

  Note1: Or FLOATJ. For compatibility with older versions of
         Fortran, FLOAT can also be specified as a generic
         function.
  Note2: For compatibility with older versions of
         Fortran, SNGL can also be specified as a generic
         function. The generic SNGL includes specific
         function REAL, which takes a REAL*4 argument and
         produces a REAL*4 result.

  These functions cannot be passed as actual arguments.

  REAL is also a specific name for a function that returns the real
  part of a complex number.  The argument must be a COMPLEX*8 data
  type.  The result is a REAL*4 data type.

  The setting of compiler options specifying real size can affect
  FLOAT, REAL, and SNGL.

58.149  –  REPEAT

  REPEAT (string, ncopies)

  Class:  Transformational function - Generic

  Concatenates several copies of a string.  The kind type parameter
  is the same as "string".  The value of the result is the
  concatenation of "ncopies" copies of "string".

  Examples:

  REPEAT ('S', 3) has the value SSS.

  REPEAT ('ABC', 0) has the value of a zero-length string.

58.150  –  RESHAPE

  RESHAPE (source, shape [,pad] [,order])

  Class:  Transformational function - Generic

  Constructs an array with a different shape from the argument
  "source" array.

  The size of the "source" array must be >= PRODUCT(shape) if "pad"
  is absent or has size zero.  The "shape" must be an integer array
  of up to 7 elements, with rank one and constant size.  Its size
  must be positive; its elements must not have negative values.  The
  "pad" must be an array of the same type and kind type parameters as
  "source".  It is used to fill in extra values if the result array
  is larger than "source".  The "order" must be an integer array with
  the same shape as "shape".

  The result is an array of shape "shape" with the same type and kind
  type parameters as "source".  The size of the result is the product
  of the values of the elements of "shape".

  In the result array, the array elements of "source" are placed in
  the order of dimensions specified by "order".  If "order" is
  omitted, the array elements are placed in normal array element
  order.

  The array elements of "source" are followed (if necessary) by the
  array elements of "pad" in array element order.  If necessary,
  additional copies of "pad" follow until all the elements of the
  result array have values.

  Examples:

  RESHAPE ((/3, 4, 5, 6, 7, 8/), (/2, 3/)) has the value

   |3 5 7|.
   |4 6 8|.

  RESHAPE ((/3, 4, 5, 6, 7, 8/), (/2, 4/), (/1, 1/), (/2, 1/)) has
  the value

   |3 4 5 6|.
   |7 8 1 1|

58.151  –  RRSPACING

  RRSPACING (real-number)

  Class:  Elemental function - Generic

  Returns the reciprocal of the relative spacing of model numbers
  near the argument value.

  The result type is the same as the argument.  For information on
  the model for real numbers, see the HP Fortran for OpenVMS Language
  Reference Manual.

  Example:

  If -3.0 is a REAL*4 value, RRSPACING (-3.0) has the value 0.75 x
  2**24.

58.152  –  SCALE

  SCALE (real-number, integer)

  Class:  Elemental function - Generic

  Returns the value of the exponent part (of the model for the
  argument) changed by a specified value.

  The result type is the same as the "real-number" argument.  For
  information on the real model, see the HP Fortran for OpenVMS
  Language Reference Manual.

  Examples:

  If 3.0 is a REAL*4 value, SCALE (3.0, 2) has the value 12.0 and
  SCALE (3.0, 3) has the value 24.0.

58.153  –  SCAN

  SCAN (string, set [,back] [,kind])

  Class:  Elemental function - Generic

  Scans a string for any character in a set of characters.  The "set"
  is of type character (the same type as "string").  The "back" is of
  type logical.  The "kind" must be a scalar integer initialization
  expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "back" is absent (or is present with the value false) and
  "string" has at least one character that is in "set", the value of
  the result is the position of the leftmost character of "string"
  that is in "set".

  If "back" is present with the value true and "string" has at least
  one character that is in "set", the value of the result is the
  position of the rightmost character of "string" that is in "set".

  If no character of "string" is in "set" or the length of "string"
  or "set" is zero, the value of the result is zero.

  Examples:

  SCAN ('ASTRING', 'ST') has the value 2.

  SCAN ('ASTRING', 'ST', BACK=.TRUE.) has the value 3.

  SCAN ('ASTRING', 'CD') has the value zero.

58.154  –  SECNDS

  SECNDS (real-number)

  Class:  Elemental function - Specific

  Returns the number of seconds since midnight minus the value of the
  argument.  The argument must be a REAL*4 data type.  The return
  value is a REAL*4 data type.  The time returned is accurate to .01
  seconds.

  This function cannot be passed as an actual argument.

58.155  –  SELECTED_INT_KIND

  SELECTED_INT_KIND (integer)

  Class:  Transformational function - Generic

  Returns the value of the kind type parameter of an integer data
  type.

  The result is a scalar of type default integer.

  Example:

  SELECTED_INT_KIND (6) = 4

58.156  –  SELECTED_REAL_KIND

  SELECTED_REAL_KIND ([integer-p] [,integer-r])

  Class:  Transformational function - Generic

  Returns the value of the kind type parameter of a real data type.

  The "integer-p" specifies decimal precision.  The "integer-r"
  specifies decimal exponent range.  At least one argument must be
  specified.

  The result is a scalar of type default integer.

  Example:

  SELECTED_REAL_KIND (6, 70) = 8

58.157  –  SET_EXPONENT

  SET_EXPONENT (real-number, integer)

  Class:  Elemental function - Generic

  Returns a copy of "real-number" with the value of the exponent
  part (of the model for the argument) set to a specified value.

  The result type is the same as the "real-number" argument.  For
  information on the real model,see the HP Fortran for OpenVMS
  Language Reference Manual.

  Example:

  If 3.0 is a REAL*4 value, SET_EXPONENT (3.0, 1) has the value 1.5.

58.158  –  SHAPE

  SHAPE (source [,kind])

  Class:  Inquiry function - Generic

  Returns the shape of an array or scalar argument.

  The "source" must not be an assumed-size array, a disassociated
  pointer, or an allocatable array that is not allocated.  The "kind"
  must be a scalar integer initialization expression.

  The result is a rank-one integer array whose size is equal to the
  rank of "source".  If "kind" is present, the kind parameter of the
  result is that specified by "kind"; otherwise, the kind parameter
  of the result is that of default integer.  If the processor cannot
  represent the result value in the kind of the result, the result is
  undefined.

  The value of the result is the shape of "source".

  The setting of compiler options that specify integer size can
  affect the result of this function.

  Examples:

  SHAPE (2) has the value of a rank-one array of size zero.

  If B is declared as B(2:4, -3:1), then SHAPE (B) has the value (3,
  5).

58.159  –  SIGN

  SIGN (arg1, sign-arg2)

  Class:  Elemental function - Generic

  Assigns the sign of the second argument to the absolute value of
  the first.

  If the second argument is of type real and zero, the value of the
  result is |arg1|.  However, if the processor can distinguish
  between positive and negative real zero and the compiler option
  /ASSUME=MINUS0 is specified, the following occurs:

   o  If the second argument is positive real zero, the value of the
      result is |arg1|.

   o  If the second argument is negative real zero, the value of the
      result is -|arg1|.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  2   |  SIGN   |  --      | INTEGER*1  | INTEGER*1   |
  |      |         | IISIGN   | INTEGER*2  | INTEGER*2   |
  |      |see note | ISIGN    | INTEGER*4  | INTEGER*4   |
  |      |         | KISIGN   | INTEGER*8  | INTEGER*8   |
  |      |         | SIGN     | REAL*4     | REAL*4      |
  |      |         | DSIGN    | REAL*8     | REAL*8      |
  |      |         | QSIGN    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

  NOTE: Or JISIGN.  For compatibility with older versions
        of Fortran, ISIGN can also be specified as a generic
        function.

58.160  –  SIN

  SIN (number)

  Class:  Elemental function - Generic

  Returns the sine of the argument.  The argument must be in radians;
  it is treated modulo 2*pi.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  SIN    | SIN      | REAL*4     | REAL*4      |
  |      |         | DSIN     | REAL*8     | REAL*8      |
  |      |         | QSIN     | REAL*16    | REAL*16     |
  |      |see note | CSIN     | COMPLEX*8  | COMPLEX*8   |
  |      |         | CDSIN    | COMPLEX*16 | COMPLEX*16  |
  |      |         | ZSIN     | COMPLEX*16 | COMPLEX*16  |
  |      |         | CQSIN    | COMPLEX*32 | COMPLEX*16  |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect CSIN.

58.161  –  SIND

  SIND (number)

  Class:  Elemental function - Generic

  Returns the sine of the argument.  The argument must be in degrees;
  it is treated modulo 360.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  SIND   | SIND     | REAL*4     | REAL*4      |
  |      |         | DSIND    | REAL*8     | REAL*8      |
  |      |         | QSIND    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.162  –  SINH

  SINH (number)

  Class:  Elemental function - Generic

  Returns the hyperbolic sine of the argument.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  SINH   | SINH     | REAL*4     | REAL*4      |
  |      |         | DSINH    | REAL*8     | REAL*8      |
  |      |         | QSINH    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.163  –  SIZE

  SIZE (array [,dim] [,kind])

  Class:  Inquiry function - Generic

  Returns the total number of elements in an array, or the extent of
  an array along a specified dimension.

  The "array" must not be a disassociated pointer or an allocatable
  array that is not allocated.  It can be an assumed-size array if
  "dim" is present with a value less than the rank of "array".  The
  "dim" must be a scalar integer with a value in the range 1 to n,
  where "n" is the rank of "array".  The "kind" must be a scalar
  integer initialization expression.

  The result is a scalar of type integer.  If "kind" is present, the
  kind parameter of the result is that specified by "kind";
  otherwise, the kind parameter of the result is that of default
  integer.  If the processor cannot represent the result value in the
  kind of the result, the result is undefined.

  If "dim" is present, the result is the extent of dimension "dim" in
  "array"; otherwise, the result is the total number of elements in
  "array".

  The setting of compiler options that specify integer size can
  affect the result of this function.

  Example:

  If B is declared as B(2:4, -3:1), then SIZE (B, DIM=2) has the
  value 5 and SIZE (B) has the value 15.

58.164  –  SIZEOF

  SIZEOF (arg)

  Class:  Elemental function - Specific

  Returns the number of bytes of storage used by the argument.
  +------+---------+----------+------------------+-------------+
  | Args | Generic | Specific |    Argument      | Result Type |
  +------+---------+----------+------------------+-------------+
  |   1  |   --    | SIZEOF   | Anything with a  | INTEGER*8   |
  |      |         |   --     | valid data type, |             |
  |      |         |          | except assumed-  |             |
  |      |         |          | size arrays.     |             |
  +------+---------+----------+------------------+-------------+

  This function cannot be passed as an actual argument.

58.165  –  SPACING

  SPACING (real-number)

  Class:  Elemental function - Generic

  Returns the absolute spacing of model numbers near the argument
  value.  The result type is the same as the argument.

  Example:

  If 3.0 is a REAL*4 value, SPACING (3.0) has the value 2**-22.

58.166  –  SPREAD

  SPREAD (source, dim, ncopies)

  Class:  Transformational function - Generic

  Creates a replicated array with an added dimension by making copies
  of existing elements along a specified dimension.

  The "source" can be an array or scalar.  The "dim" is a scalar of
  type integer.  It must have a value in the range 1 to n +
  1(inclusive), where "n" is the rank of "source".  The integer
  scalar "ncopies" becomes the extent of the added dimension in the
  result.

  The result is an array of the same type as "source" and of rank
  that is one greater than "source".

  If "source" is an "array", each array element in dimension "dim" of
  the result is equal to the corresponding array element in "source".

  If "source" is a scalar, the result is a rank-one array with
  "ncopies" elements, each with the value "source".

  Examples:

  SPREAD ("B", 1, 4) is the character array (/"B", "B", "B", "B"/).

  B is the array (3, 4, 5) and NC has the value 4.

  SPREAD (B, DIM=1, NCOPIES=NC) produces the array

   |3 4 5|
   |3 4 5|.
   |3 4 5|
   |3 4 5|

  SPREAD (B, DIM=2, NCOPIES=NC) produces the array

   |3 3 3 3|
   |4 4 4 4|.
   |5 5 5 5|

58.167  –  SNGL

  See the REAL function.

58.168  –  SQRT

  SQRT (number)

  Class:  Elemental function - Generic

  Returns the square root of the argument.

  If the argument is real, its value must be greater than or equal to
  zero.
  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  SQRT   | SQRT     | REAL*4     | REAL*4      |
  |      |         | DSQRT    | REAL*8     | REAL*8      |
  |      |         | QSQRT    | REAL*16    | REAL*16     |
  |      |see note | CSQRT    | COMPLEX*8  | COMPLEX*8   |
  |      |         | CDSQRT   | COMPLEX*16 | COMPLEX*8   |
  |      |         | ZSQRT    | COMPLEX*16 | COMPLEX*8   |
  |      |         | CQSQRT   | COMPLEX*32 | COMPLEX*8   |
  +------+---------+----------+------------+-------------+

  Note: The setting of compiler options specifying real
        size can affect CSQRT.

  The result of CSQRT, CDSQRT, and ZSQRT is the principal value, with
  the real part greater than or equal to zero.  If the real part is
  zero, the result is the principal value, with the imaginary part
  greater than or equal to zero.

58.169  –  SUM

  SUM (array [,dim] [,mask])

  Class:  Transformational function - Generic

  Returns the sum of all the elements in an entire array or in a
  specified dimension of an array.

  The "array" can be of integer or real type.  The "dim" is optional
  and must be a scalar integer with a value in the range 1 to n,
  where "n" is the rank of "array".  The "mask" is optional and must
  be a logical array that is conformable with "array".

  The result is the same data type as "array".  The result is a
  scalar if "dim" is absent or "array" has rank one.  Otherwise, the
  result is an array with rank that is one less than "array", and
  shape (d1, d2,..., d"dim"-1, d"dim"+1,..., dn), where (d1, d2,...,
  dn) is the shape of "array".

  If only "array" appears, the result is the sum of all elements of
  "array".  If "array" has size zero, the result is zero.

  If "array" and "mask" both appear, the result is the sum of all
  elements of "array" corresponding to true elements of "mask".  If
  "array" has size zero, or every element of "mask" has the value
  .FALSE., the result is zero.

  If "dim" also appears and "array" has rank one, the value is the
  same as SUM (array [,mask=mask]).  Otherwise, the value of element
  (s1, s2,..., s"dim"-1, s"dim"+1,..., sn) of SUM (array, dim,
  [,mask]) is equal to SUM (array (s1, s2,..., s"dim"-1, :, s"dim"+1,
  ..., sn)) [mask=mask (s1, s2, ..., s"dim"-1, :, s "dim"+1 ...,
  sn)].

  Examples:

  SUM ((/2, 3, 4/)) and SUM ((/2, 3, 4/), DIM=1) returns the value 9.

  SUM (B, MASK=B .LT.  0.0) returns the arithmetic sum of the
  negative elements of B.

  Consider that C is the array:

   |1 2 3|
   |4 5 6|.

  SUM (C, DIM=1) returns the value (5, 7, 9).

  SUM (C, DIM=2) returns the value (6, 15).

58.170  –  SYSTEM_CLOCK

  SYSTEM_CLOCK ([count] [,count-rate] [,count-max])

  Class:  Subroutine

  Returns integer data from a real-time clock.

  All arguments are scalar of type default integer.  The "clock" is
  set to a value based on the current value of the processor clock.
  The value is increased by one for each clock count until the value
  "countmax" is reached, and is reset to zero at the next count.
  ("count" lies in the range 0 to "countmax".) The "count-rate" is set
  to the number of processor clock counts per second modified by the
  kind of "count-rate." See the HP Fortran for OpenVMS Language
  Reference Manual.

  SYSTEM_CLOCK returns the number of seconds from 00:00 Coordinated
  Universal Time (CUT) 1 JAN 1970.  The number is returned with no
  bias.  To get the elapsed time, you must call SYSTEM_CLOCK twice,
  and subtract the starting time value from the ending time value.

  Examples:

  Consider the following:

    INTEGER(2) :: IC2, CRATE2, CMAX2
    INTEGER(4) :: IC4, CRATE4, CMAX4
    CALL SYSTEM_CLOCK(COUNT=IC2, COUNT_RATE=CRATE2, COUNT_MAX=CMAX2)
    CALL SYSTEM_CLOCK(COUNT=IC4, COUNT_RATE=CRATE4, COUNT_MAX=CMAX4)
    PRINT *, IC2, CRATE2, CMAX2
    PRINT *, IC4, CRATE4, CMAX4
    END

  This program was run on Thursday Dec 11, 1997 at 14:23:55 EST and
  produced the following output:
    13880   1000  32767
    1129498807       10000  2147483647

58.171  –  TAN

  TAN (real-number)

  Class:  Elemental function - Generic

  Returns the tangent of the argument.  The argument must be in
  radians; it is treated modulo 2*pi.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  TAN    | TAN      | REAL*4     | REAL*4      |
  |      |         | DTAN     | REAL*8     | REAL*8      |
  |      |         | QTAN     | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.172  –  TAND

  TAND (real-number)

  Class:  Elemental function - Generic

  Returns the tangent of the argument.  The argument must be in
  degrees; it is treated modulo 360.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  TAND   | TAND     | REAL*4     | REAL*4      |
  |      |         | DTAND    | REAL*8     | REAL*8      |
  |      |         | QTAND    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.173  –  TANH

  TANH (real-number)

  Class:  Elemental function - Generic

  Returns the hyperbolic tangent of the argument.

  +------+---------+----------+------------+-------------+
  | Args | Generic | Specific |  Argument  | Result Type |
  +------+---------+----------+------------+-------------+
  |  1   |  TANH   | TANH     | REAL*4     | REAL*4      |
  |      |         | DTANH    | REAL*8     | REAL*8      |
  |      |         | QTANH    | REAL*16    | REAL*16     |
  +------+---------+----------+------------+-------------+

58.174  –  TIME

  TIME (buf)

  Class:  Elemental function

  Places the current time in 24-hour ASCII format in the argument.
  The time is returned as an 8-byte ASCII character string having the
  following form:

     hh:mm:ss

  A 24-hour clock is used.

  The "buf" is an 8-byte variable, array, array element, or character
  substring.  If "buf" is numeric type and smaller than 8 bytes, data
  corruption can occur.

  If "buf" is character type, its associated length is passed to the
  subroutine.  If "buf" is smaller than 8 bytes, the subroutine
  truncates the date to fit in the specified length.  Note that if a
  CHARACTER array is passed, the subroutine stores the time in the
  first array element, using the element length, not the length of
  the entire array.  For example, consider the following:

  CHARACTER*1 HOUR(8)
  ...
  CALL TIME(HOUR)

  The length of the first array element in CHARACTER array HOUR is
  passed to the TIME subroutine.  The subroutine then truncates the
  time to fit into the one-character element, producing an incorrect
  result.

58.175  –  TINY

  TINY (real-number)

  Class:  Inquiry function - Generic

  Returns the smallest number in the model representing the same type
  and kind type parameter as the argument.

  The argument must be of type real; it can be scalar or array
  valued.  The result type is scalar of the same type and kind type
  parameter as the argument.  The real model is described in the
  HP Fortran for OpenVMS Language Reference Manual.

  Examples:

  If X is of type REAL*4, TINY (X) has the value 2**-126.

58.176  –  TRAILZ

  TRAILZ (integer)

  Class:  Elemental function - Generic

  Returns the number of trailing zeros in the binary representation
  of the integer argument.  The result type is the same as the
  argument.

  Example:

  Consider the following:

    INTEGER*8 J, TWO
    PARAMETER (TWO=2)
    DO J= -1, 40
      TYPE *, TRAILZ(TWO**J)  ! Prints 64, then 0 up to
    ENDDO                     !   40 (trailing zeros)
    END

58.177  –  TRANSFER

  TRANSFER (source, mold [,size])

  Class:  Transformational function - Generic

  Copies the bit pattern of "source" and interprets it according to
  the type and kind type parameters of "mold".

  The "source" and "mold" can be of any type; they can be scalar or
  array valued.  The "mold" provides the type characteristics (not a
  value) for the result.  The "size" must be scalar of type integer;
  it provides the number of elements for the output result.

  If "mold" is a scalar and "size" is absent, the result is a scalar.

  If "mold" is an array and "size" is absent, the result is a
  rank-one array.  Its size is the smallest that is possible to hold
  all of "source".

  If "size" is present, the result is a rank-one array of size
  "size".

  If the physical representation of the result is larger than
  "source", the result contains "source"'s bit pattern in its
  right-most bits; the left-most bits of the result are undefined.

  If the physical representation of the result is smaller than
  "source", the result contains the right-most bits of "source"'s bit
  pattern.

  Examples:

  TRANSFER (1082130432, 0.0) has the value 4.0 (on processors that
  represent the values 4.0 and 1082130432 as the string of binary
  digits 0100 0000 1000 0000 0000 0000 0000 0000).

  TRANSFER ((/2.2, 3.3, 4.4/), ((0.0, 0.0))) results in a scalar
  whose value is (2.2, 3.3).

  TRANSFER ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/)) results in a complex
  rank-one array of length 2.  Its first element is (2.2,3.3) and its
  second element has a real part with the value 4.4 and an undefined
  imaginary part.

  TRANSFER ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/), 1) results in a
  complex rank-one array having one element with the value (2.2,
  3.3).

58.178  –  TRANSPOSE

  TRANSPOSE (matrix)

  Class:  Transformational function - Generic

  Transposes an array of rank two (can be any data type).

  The result is a rank-two array with the same type and kind type
  parameters as "matrix".  Its shape is (n, m), where (m, n) is the
  shape of "matrix".  For example, if the shape of "matrix" is (4,6),
  the shape of the result is (6,4).

  Element (i, j) of the result has the value matrix(j, i), where "i"
  is in the range 1 to n, and "j" is in the range 1 to m.

  Examples:

  Consider that B is the array:

   |2 3 4|
   |5 6 7|.
   |8 9 1|

  TRANSPOSE (B) has the value

   |2 5 8|
   |3 6 9|.
   |4 7 1|

58.179  –  TRIM

  TRIM (string)

  Class:  Transformational function - Generic

  Returns the argument with trailing blanks removed.

  The "string" is a scalar of type character.  The result is of type
  character with the same kind type parameter as "string".  Its
  length is the length of "string" minus the number of trailing
  blanks in "string".

  The value of the result is the same as "string", except any
  trailing blanks are removed.  If "string" contains only blank
  characters, the result has zero length.

  Examples:

  TRIM ('  NAME    ') has the value '  NAME'.

  TRIM ('  C  D     ') has the value '  C  D'.

58.180  –  UBOUND

  UBOUND (array [,dim] [,kind])

  Class:  Inquiry function - Generic

  Returns the upper bounds for all dimensions of an array, or the
  upper bound for a specified dimension.

  The "array" cannot be an allocatable array that is not allocated,
  or a disassociated pointer.  The "dim" is a scalar integer with a
  value in the range 1 to n, where "n" is the rank of "array".  The
  "kind" must be a scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "dim" is present, the result is a scalar.  Otherwise, the result
  is a rank-one array with one element for each dimension of "array".
  Each element in the result corresponds to a dimension of "array".

  If "array" is an array section or an array expression that is not a
  whole array or array structure component, UBOUND (array,dim) has a
  value equal to the number of elements in the given dimension.

  The setting of compiler options that specify integer size can
  affect the result of this function.

  Examples:

  Consider the following:

  REAL ARRAY_A (1:3, 5:8)
  REAL ARRAY_B (2:8, -3:20)

  UBOUND (ARRAY_A) is (3, 8).  UBOUND (ARRAY_A, DIM=2) is 8.

  UBOUND (ARRAY_B) is (8, 20).  UBOUND (ARRAY_B (5:8, :)) is (4,24)
  because the number of elements is significant for array section
  arguments.

58.181  –  UNPACK

  UNPACK (vector, mask, field)

  Class:  Transformational function - Generic

  Takes elements from a rank-one array and unpacks them into another
  (possibly larger) array under the control of a mask.

  The "vector" must be a rank-one array of any type.  Its size must
  be at least t, where "t" is the number of true elements in "mask".
  The "mask" must be of logical type; it determines where elements of
  "vector" are placed when they are unpacked.

  The "field" must be of the same type and type parameters as
  "vector" and conformable with "mask".  Elements in "field" are
  inserted into the result array when the corresponding "mask"
  element has the value false.

  The result is an array with the same shape as "mask", and the same
  type and type parameters as "vector".

  Elements in the result array are filled in array element order.  If
  element i of the result is true, the corresponding element of the
  result is filled by the next element in "vector".

  Examples:

  Consider that N is the array |0 0 1|, P is the array (2, 3, 4, 5),
                               |1 0 1|
                               |1 0 0|

  and Q is the array |T F F|
                     |F T F|.
                     |T T F|

  UNPACK (P, MASK=Q, FIELD=N) produces the result

   |2 0 1|
   |1 4 1|.
   |3 5 0|

  UNPACK (P, MASK=Q, FIELD=1) produces the result

   |2 1 1|
   |1 4 1|.
   |3 5 1|

58.182  –  VERIFY

  VERIFY (string, set [,back] [,kind])

  Class:  Elemental function - Generic

  Verifies that a set of characters contains all the characters in a
  string by identifying the first character in the string that is not
  in the set.

  The "set" must be of type character with the same kind type
  parameter as "string".  The "back" must be of type logical.  The
  "kind" must be a scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.

  If "back" is absent (or is present with the value false) and
  "string" has at least one character that is not in "set", the value
  of the result is the position of the leftmost character of "string"
  that is not in "set".

  If "back" is present with the value true and "string" has at least
  one character that is not in "set", the value of the result is the
  position of the rightmost character of "string" that is not in
  "set".

  If each character of "string" is in "set" or the length of "string"
  is zero, the value of the result is zero.

  Examples:

  VERIFY ('CDDDC', 'C') has the value 2.

  VERIFY ('CDDDC', 'C', BACK=.TRUE.) has the value 4.

  VERIFY ('CDDDC', 'CD') has the value zero.

58.183  –  ZEXT

  ZEXT (integer [,kind])

  Class:  Elemental function - Generic

  Returns the value of the argument, zero extended.

  The "kind" must be a scalar integer initialization expression.

  The result is of type integer.  If "kind" is present, the kind
  parameter of the result is that specified by "kind"; otherwise, the
  kind parameter of the result is that of default integer.  If the
  processor cannot represent the result value in the kind of the
  result, the result is undefined.
  +------+----------+----------+------------+-------------+
  | Args | Generic  | Specific |  Argument  | Result Type |
  +------+----------+----------+------------+-------------+
  |  1   |  ZEXT    | IZEXT    | LOGICAL*1  | INTEGER*2   |
  |      |          |  --      | LOGICAL*2  | INTEGER*2   |
  |      |          |  --      | INTEGER*1  | INTEGER*2   |
  |      |          |  --      | INTEGER*2  | INTEGER*2   |
  |      |          | JZEXT    | LOGICAL*1  | INTEGER*4   |
  |      |          |  --      | LOGICAL*2  | INTEGER*4   |
  |      |          |  --      | LOGICAL*4  | INTEGER*4   |
  |      |          |  --      | INTEGER*1  | INTEGER*4   |
  |      |          |  --      | INTEGER*2  | INTEGER*4   |
  |      |          |  --      | INTEGER*4  | INTEGER*4   |
  |      |          | KZEXT    | LOGICAL*1  | INTEGER*8   |
  |      |          |  --      | LOGICAL*2  | INTEGER*8   |
  |      |          |  --      | LOGICAL*4  | INTEGER*8   |
  |      |          |  --      | LOGICAL*8  | INTEGER*8   |
  |      |          |  --      | INTEGER*1  | INTEGER*8   |
  |      |          |  --      | INTEGER*2  | INTEGER*8   |
  |      |          |  --      | INTEGER*4  | INTEGER*8   |
  |      |          |  --      | INTEGER*8  | INTEGER*8   |
  +------+----------+----------+------------+-------------+

  The setting of compiler options specifying integer size can affect
  ZEXT.

59  –  Names

  Names identify entities within a Fortran program unit (such as
  variables, function results, common blocks, named constants,
  procedures, program units, namelist groups, and dummy arguments).
  In FORTRAN 77, names were called "symbolic names".

  A name can contain letters, digits, underscores (_), and the dollar
  sign ($) special character.  The first character must be a letter
  or a dollar sign.

  In Fortran 95/90, a name can contain up to 31 characters.  HP
  Fortran allows names up to 63 characters.

  The length of a module name (in MODULE and USE statements) may be
  restricted by your file system.

  Note:
    Be careful when defining names that contain dollar signs.

    Naming conventions reserve names containing dollar signs to those
    created by HP.

  In an executable program, the names of program units, external
  procedures, common blocks, and modules are global and must be
  unique in the entire program.

60  –  Run Time Messages

  Errors that occur during execution of your program are reported by
  diagnostic messages from the Run-Time Library.  These messages can
  result from hardware conditions, file system errors, errors
  detected by RMS, errors that occur during transfer of data
  between the program and an internal record, computations that cause
  overflow or underflow, incorrect calls to the Run-Time Library,
  problems in array descriptions, and conditions detected by the
  operating system.

  This section lists the run-time diagnostic messages without the
  prefixes FOR, SS, and MTH.  For each mnemonic, the following
  information is provided:  the message number, an error code (F for
  fatal, E for error, and I for information), the message text, and
  an explanation of the message.

60.1  –  ADJARRDIM

  NUMBER:  93

  ERROR CODE:  F

  MESSAGE TEXT:  adjustable array dimension error

  EXPLANATION:  Upon entry to a subprogram, one of the following
  errors was detected during the evaluation of dimensioning
  information:

   o  An upper-dimension bound was less than a lower-dimension bound.

   o  The dimensions implied an array that was larger than
      addressable memory.

60.2  –  ARRSIZEOVF

  NUMBER:  179

  ERROR CODE:  F

  MESSAGE TEXT:  Cannot allocate array - overflow on array size
  calculation

  EXPLANATION:  An attempt to dynamically allocate storage for an
  array failed because the required storage size exceeds addressable
  memory.

  This error is not returned by IOSTAT.  However, this error can be
  returned by STAT in an ALLOCATE statement.

60.3  –  ASSERTERR

  NUMBER:  145

  ERROR CODE:  F

  MESSAGE TEXT:  assertion error

  EXPLANATION:  The HP Fortran RTL encountered an assertion
  error.  Please report the problem to HP.

  This error is not returned by IOSTAT.

60.4  –  ATTACCNON

  NUMBER:  36

  ERROR CODE:  F

  MESSAGE TEXT:  attempt to access non-existent record

  EXPLANATION:  One of the following conditions occurred:

   o  A direct access READ, FIND, or DELETE statement attempted to
      access a nonexistent record from a relative organization file.

   o  A direct access READ or FIND statement attempted to access
      beyond the end of a sequential organization file.

   o  A keyed access READ statement attempted to access a nonexistent
      record from an indexed organization file.

60.5  –  BACERR

  NUMBER:  23

  ERROR CODE:  F

  MESSAGE TEXT:  BACKSPACE error

  EXPLANATION:  One of the following conditions occurred:

   o  The file was not a sequential organization file.

   o  The file was not opened for sequential access.  (A unit opened
      for append access may not be backspaced until a REWIND
      statement is executed for that unit.)

   o  RMS detected an error condition during execution of a BACKSPACE
      statement.

60.6  –  BUG_CHECK

  NUMBER:  8

  ERROR CODE:  F

  MESSAGE TEXT:  internal consistency check failure

  EXPLANATION:  Internal severe error.  Please check that the program
  is correct.  Recompile if an error existed in the program.

  If this error persists, report the problem to HP.

60.7  –  CLOERR

  NUMBER:  28

  ERROR CODE:  F

  MESSAGE TEXT:  CLOSE error

  EXPLANATION:  An error condition was detected by RMS during
  execution of a CLOSE statement.

60.8  –  DELERR

  NUMBER:  55

  ERROR CODE:  F

  MESSAGE TEXT:  DELETE error

  EXPLANATION:  One of the following conditions occurred:

   o  On a direct access DELETE, the file that did not have relative
      organization.

   o  On a current record DELETE, the file did not have relative or
      indexed organization, or the file was opened for direct access.

   o  RMS detected an error condition during execution of a DELETE
      statement.

60.9  –  DIRIO_KEY

  NUMBER:  258

  ERROR CODE:  F

  MESSAGE TEXT:  direct-access I/O to unit open for keyed access

  EXPLANATION:  The OPEN statement for this unit number specified
  keyed access and the I/O statement specifies direct access.  Check
  the OPEN statement and make sure the I/O statement uses the correct
  unit number and type of access.  (For more information on
  statements, see the HP Fortran for OpenVMS Language Reference
  Manual.)

60.10  –  DIV

  NUMBER:  178

  ERROR CODE:  F

  MESSAGE TEXT:  Divide by zero

  EXPLANATION:  A floating-point or integer divide-by-zero exception
  occurred.

  This error is not returned by IOSTAT.

60.11  –  DUPFILSPE

  NUMBER:  21

  ERROR CODE:  F

  MESSAGE TEXT:  duplicate file specifications

  EXPLANATION:  Multiple attempts were made to specify file
  attributes without an intervening close operation.  A DEFINE FILE
  statement was followed by another DEFINE FILE statement or an OPEN
  statement.

60.12  –  ENDDURREA

  NUMBER:  24

  ERROR CODE:  F

  MESSAGE TEXT:  end-of-file during read

  EXPLANATION:  One of the following conditions occurred:

   o  An RMS end-of-file condition was encountered during execution
      of a READ statement that did not contain an END, ERR, or IOSTAT
      specification.

   o  An end-of-file record written by the ENDFILE statement was
      encountered during execution of a READ statement that did not
      contain an END, ERR, or IOSTAT specification.

   o  An attempt was made to read past the end of an internal file
      character string or array during execution of a READ statement
      that did not contain an END, ERR, or IOSTAT specification.

  This error is not returned by IOSTAT.

60.13  –  ENDFILERR

  NUMBER:  33

  ERROR CODE:  F

  MESSAGE TEXT:  ENDFILE error

  EXPLANATION:  One of the following conditions occurred:

   o  The file was not a sequential organization file with
      variable-length records.

   o  The file was not opened for sequential, append, or direct
      access.

   o  An unformatted file did not contain segmented records.

   o  RMS detected an error during execution of an ENDFILE statement.

60.14  –  ENDRECDUR

  NUMBER:  268

  ERROR CODE:  F

  MESSAGE TEXT:  end of record during read

  EXPLANATION:  An end-of-record condition was encountered during
  execution of a nonadvancing I/O READ statement that did not specify
  the EOR branch specifier.

  This error is not returned by IOSTAT.

60.15  –  ERRDURREA

  NUMBER:  39

  ERROR CODE:  F

  MESSAGE TEXT:  error during read

  EXPLANATION:  RMS detected an error condition during execution of a
  READ statement.

60.16  –  ERRDURWRI

  NUMBER:  38

  ERROR CODE:  F

  MESSAGE TEXT:  error during write

  EXPLANATION:  RMS detected an error condition during execution of a
  WRITE statement.

60.17  –  FILNAMSPE

  NUMBER:  43

  ERROR CODE:  F

  MESSAGE TEXT:  file name specification error

  EXPLANATION:  A file-name specification given to an OPEN or INQUIRE
  statement was not acceptable to RMS.

60.18  –  FILNOTFOU

  NUMBER:  29

  ERROR CODE:  F

  MESSAGE TEXT:  file not found

  EXPLANATION:  A file with the specified name could not be found
  during an open operation.

60.19  –  FINERR

  NUMBER:  57

  ERROR CODE:  F

  MESSAGE TEXT:  FIND error

  EXPLANATION:  RMS detected an error condition during execution of a
  FIND statement.

60.20  –  FLOCONFAI

  NUMBER:  95

  ERROR CODE:  E

  MESSAGE TEXT:  floating point conversion failed

  EXPLANATION:  The attempted unformatted read or write of non-native
  floating-point data failed.  One of the following conditions
  occurred for a non-native floating-point value:

   o  When using VAX data types in memory (/FLOAT=G_FLOAT or
      /FLOAT=D_FLOAT), the value exceeded the allowable maximum value
      for the equivalent native format and was set equal to invalid.

   o  When using VAX data types in memory (/FLOAT=G_FLOAT or
      /FLOAT=D_FLOAT), the value was infinity (plus or minus),
      Not-a-Number (NaN), or otherwise invalid and was set to
      invalid.

   o  When using IEEE data types in memory (/FLOAT=IEEE_FLOAT), the
      value exceeded the allowable maximum value for the equivalent
      native format and was set equal to infinity (plus or minus).

   o  When using IEEE data types in memory (/FLOAT=IEEE_FLOAT), the
      value was infinity (plus or minus) and was set to infinity
      (plus or minus).

   o  When using IEEE data types in memory (/FLOAT=IEEE_FLOAT), the
      value was invalid and was set to Not-a-Number (NaN).

  Make sure the correct file was specified.  Make sure the record
  layout matches the format VSI Fortran is expecting.  Check that
  the correct non-native floating-point data format was specified, as
  described in the HP Fortran for OpenVMS User Manual.

  This error is not returned by IOSTAT.

60.21  –  FLODIV0EXC

  NUMBER:  299

  ERROR CODE:  I

  MESSAGE TEXT:  nn divide-by-zero traps

  EXPLANATION:  The total number of floating-point divide-by-zero
  traps encountered during program execution was nn.  This summary
  message appears at program completion.

  This error is not returned by IOSTAT.

60.22  –  FLOINCEXC

  NUMBER:  297

  ERROR CODE:  I

  MESSAGE TEXT:  nn floating invalid traps

  EXPLANATION:  The total number of floating-point invalid data traps
  encountered during program execution was nn.  This summary message
  appears at program completion.

  This error is not returned by IOSTAT.

60.23  –  FLOINEEXC

  NUMBER:  296

  ERROR CODE:  I

  MESSAGE TEXT:  nn floating inexact traps

  EXPLANATION:  The total number of floating-point inexact data traps
  encountered during program execution was nn.  This summary message
  appears at program completion.

  This error is not returned by IOSTAT.

60.24  –  FLOOVEMAT

  NUMBER:  88

  ERROR CODE:  F

  MESSAGE TEXT:  floating overflow in math library

  EXPLANATION:  A floating overflow condition was detected during
  execution of a math library procedure.

60.25  –  FLOOVREXC

  NUMBER:  298

  ERROR CODE:  I

  MESSAGE TEXT:  nn floating overflow traps

  EXPLANATION:  The total number of floating-point overflow traps
  encountered during program execution was nn.  This summary message
  appears at program completion.

  This error is not returned by IOSTAT.

60.26  –  FLOUNDEXC

  NUMBER:  300

  ERROR CODE:  I

  MESSAGE TEXT:  nn floating underflow traps

  EXPLANATION:  The total number of floating-point underflow traps
  encountered during program execution was nn.  This summary message
  appears at program completion.

  This error is not returned by IOSTAT.

60.27  –  FLOUNDMAT

  NUMBER:  89

  ERROR CODE:  E

  MESSAGE TEXT:  floating underflow in math library

  EXPLANATION:  A floating underflow condition was detected during
  execution of a math library procedure.  The result returned was
  zero.

60.28  –  FLTDIV

  NUMBER:  73

  ERROR CODE:  E

  MESSAGE TEXT:  zero divide

  EXPLANATION:  During a floating-point or decimal arithmetic
  operation, an attempt was made to divide by 0.0.

  This error is not returned by IOSTAT.

60.29  –  FLTINE

  NUMBER:  140

  ERROR CODE:  E

  MESSAGE TEXT:  floating inexact

  EXPLANATION:  A floating-point arithmetic or conversion operation
  gave a result that differs from the mathematically exact result.
  This trap is reported if the rounded result of an IEEE operation is
  not exact.

  This error is not returned by IOSTAT.

60.30  –  FLTINV

  NUMBER:  65

  ERROR CODE:  E

  MESSAGE TEXT:  Floating invalid

  EXPLANATION:  During an arithmetic operation, the floating-point
  values used in a calculation were invalid for the type of operation
  requested, or invalid exceptional values.  For example, this occurs
  when requesting a log of the floating-point values 0.0 or a
  negative number.

  For certain arithmetic expressions, specifying the /CHECK=NOPOWER
  qualifier can suppress this message.  For information on allowing
  exceptional IEEE values, see the HP Fortran for OpenVMS User Manual.

60.31  –  FLTOVF

  NUMBER:  72

  ERROR CODE:  E

  MESSAGE TEXT:  arithmetic trap, floating overflow

  EXPLANATION:  During an arithmetic operation, a floating-point
  value exceeded the largest representable value for that data type.
  The result returned was the reserved operand, -0 for VAX-format
  floating-point and NaN for IEEE-format floating-point.

  This error is not returned by IOSTAT.

60.32  –  FLTUND

  NUMBER:  74

  ERROR CODE:  E

  MESSAGE TEXT:  Floating underflow

  EXPLANATION:  During an arithmetic operation, a floating-point
  value became less than the smallest finite value for that data
  type.  The underflowed result was either set to zero or, depending
  on the value of the /IEEE_MODE qualifier when /FLOAT=IEEE_FLOAT was
  specified, allowed to gradually underflow.

  This error is not returned by IOSTAT.

  For ranges of the various data types, see the Data Representation
  chapter in the HP Fortran for OpenVMS User Manual.

60.33  –  FMTIO_UNF

  NUMBER:  257

  ERROR CODE:  F

  MESSAGE TEXT:  formatted I/O to unit open for unformatted transfers

  EXPLANATION:  Attempted formatted I/O (such as list-directed or
  namelist I/O) to a unit where the OPEN statement indicated the file
  was unformatted (FORM specifier).  Check that the correct unit
  (file) was specified.

  If the FORM specifier was not specified in the OPEN statement and
  the file should contain formatted data, specify FORM='FORMATTED' in
  the OPEN statement.  Otherwise, if appropriate, use unformatted
  I/O.

60.34  –  FMYSYN

  NUMBER:  58

  ERROR CODE:  I

  MESSAGE TEXT:  format syntax error at or near xx

  EXPLANATION:  Check the statement containing xx, a character
  substring from the format string, for a format syntax error.  For
  information about FORMAT statements, see the HP Fortran for
  OpenVMS Language Reference Manual.

  This error is not returned by IOSTAT.

60.35  –  FORVARMIS

  NUMBER:  61

  ERROR CODE:  F or I

  MESSAGE TEXT:  format/variable-type mismatch

  EXPLANATION:  An attempt was made either to read or write a real
  variable with an integer edit descriptor (I, L, B, O, or Z), or to
  read or write an integer or logical variable with a real field
  descriptor (D, E, or F).  If /CHECK=NOFORMAT is in effect, the
  severity is I.  If execution continued, the following actions
  occurred:

   o  If I, L, B, O, or Z, conversion as if INTEGER(KIND=4).

   o  If D, E, or F, conversion as if REAL(KIND=4).

  The ERR transfer is taken after completion of the I/O statement for
  this error number.  The resulting file status and record position
  are the same as if no error had occurred.  However, other I/O
  errors take the ERR transfer as soon as the error is detected, so
  file states and record position are undefined.

60.36  –  INCFILORG

  NUMBER:  51

  ERROR CODE:  F

  MESSAGE TEXT:  inconsistent file organization

  EXPLANATION:  One of the following conditions occurred:

   o  The file organization specified in an OPEN statement did not
      match the organization of the existing file.

   o  The file organization of the existing file was inconsistent
      with the specified access mode; that is, direct access was
      specified with an indexed organization file, or keyed access
      was specified with a sequential or relative organization file.

60.37  –  INCKEYCHG

  NUMBER:  50

  ERROR CODE:  F

  MESSAGE TEXT:  inconsistent key change or duplicate key

  EXPLANATION:  A WRITE or REWRITE statement accessing an indexed
  organization file caused a key field to change or be duplicated.
  This condition was not allowed by the attributes of the file, as
  established when the file was created.

60.38  –  INCOPECLO

  NUMBER:  46

  ERROR CODE:  F

  MESSAGE TEXT:  inconsistent OPEN/CLOSE parameters

  EXPLANATION:  Specifications in an OPEN or CLOSE statement were
  inconsistent.  Some invalid combinations follow:

   o  READONLY or ACTION='READ' with STATUS='NEW' or STATUS='SCRATCH'

   o  ACCESS='APPEND' with READONLY, ACTION='READ', STATUS='NEW', or
      STATUS='SCRATCH'

   o  DISPOSE='SAVE', 'PRINT', or 'SUBMIT' with STATUS='SCRATCH'

   o  DISPOSE='DELETE' with READONLY or ACTION='READ'

   o  ACCESS='APPEND' with STATUS='REPLACE'

   o  ACCESS='DIRECT' or 'KEYED' with POSITION='APPEND' or 'ASIS'

   o  ACCESS='KEYED' with POSITION='REWIND'

60.39  –  INCRECLEN

  NUMBER:  37

  ERROR CODE:  F

  MESSAGE TEXT:  inconsistent record length

  EXPLANATION:  One of the following occurred:

   o  An attempt was made to create a new relative, indexed, or
      direct access file without specifying a record length.

   o  An existing file was opened in which the record length did not
      match the record size given in an OPEN or DEFINE FILE
      statement.

   o  An attempt was made to write to a relative, indexed, or direct
      access file that was not correctly created or opened.

60.40  –  INCRECTYP

  NUMBER:  44

  ERROR CODE:  F

  MESSAGE TEXT:  inconsistent record type

  EXPLANATION:  The RECORDTYPE value in an OPEN statement did not
  match the record type attribute of the existing file that was
  opened.

60.41  –  INFFORLOO

  NUMBER:  60

  ERROR CODE:  F

  MESSAGE TEXT:  infinite format loop

  EXPLANATION:  The format associated with an I/O statement that
  included an I/O list had no field descriptors to use in
  transferring those values.

60.42  –  INPCONERR

  NUMBER:  64

  ERROR CODE:  F

  MESSAGE TEXT:  input conversion error

  EXPLANATION:  During a formatted input operation, an invalid
  character was detected in an input field, or the input value
  overflowed the range representable in the input variable.  The
  value of the variable was set to zero.

  The ERR transfer is taken after completion of the I/O statement for
  this error number.  The resulting file status and record position
  are the same as if no error had occurred.  However, other I/O
  errors take the ERR transfer as soon as the error is detected, so
  file states and record position are undefined.

60.43  –  INPRECTOO

  NUMBER:  22

  ERROR CODE:  F

  MESSAGE TEXT:  input record too long

  EXPLANATION:  A record was read that exceeded the explicit or
  default record length specified when the file was opened.  To read
  the file, use an OPEN statement with a RECL value of the
  appropriate size.

60.44  –  INPSTAREQ

  NUMBER:  67

  ERROR CODE:  F

  MESSAGE TEXT:  input statement requires too much data

  EXPLANATION:  An attempt was made to read more data than exists in
  a record by using an unformatted READ statement or a formatted
  sequential READ statement from a file opened with PAD='NO'.

60.45  –  INSVIRMEM

  NUMBER:  41

  ERROR CODE:  F

  MESSAGE TEXT:  insufficient virtual memory

  EXPLANATION:  The HP Fortran Run-Time Library attempted to
  exceed its virtual page limit while dynamically allocating space.
  Inform your system manager that process quotas and/or system
  parameters need to be increased.

  This error can be returned by STAT in an ALLOCATE or DEALLOCATE
  statement.

60.46  –  INTDIV

  NUMBER:  71

  ERROR CODE:  F

  MESSAGE TEXT:  integer zero divide

  EXPLANATION:  During an integer arithmetic operation, an attempt
  was made to divide by zero.  The result of the operation was set to
  the dividend, which is equivalent to division by one (1).

  This error is not returned by IOSTAT.

60.47  –  INTOVF

  NUMBER:  70

  ERROR CODE:  F

  MESSAGE TEXT:  integer overflow

  EXPLANATION:  During an arithmetic operation, an integer value
  exceeded its range.  The result of the operation was the correct
  low-order part.  Consider specifying a larger integer data size (or
  use the /INTEGER_SIZE qualifier for INTEGER declarations without a
  kind or specifier.) See the HP Fortran for OpenVMS User Manual for
  ranges of the various integer data types.

  This error is not returned by IOSTAT.

60.48  –  INVARGFOR

  NUMBER:  48

  ERROR CODE:  F

  MESSAGE TEXT:  invalid argument to Fortran Run-Time Library

  EXPLANATION:  The VSI Fortran compiler passed an invalid coded
  argument to the Run-Time Library.  This can occur if the compiler
  is newer than the VSI Fortran Run-Time Library in use.

60.49  –  INVARGMAT

  NUMBER:  81

  ERROR CODE:  F

  MESSAGE TEXT:  invalid argument to math library

  EXPLANATION:  One of the mathematical procedures detected an
  invalid argument value.

60.50  –  INVDEALLOC

  NUMBER:  153

  ERROR CODE:  S

  MESSAGE TEXT:  Allocatable array or pointer is not allocated

  EXPLANATION:  A Fortran 90 allocatable array or pointer must
  already be allocated when you attempt to deallocate it.  You must
  allocate the array or pointer before it can again be deallocated.

  This error is not returned by IOSTAT.  However, this error can be
  returned by STAT in a DEALLOCATE statement.

60.51  –  INVDEALLOC2

  NUMBER:  173

  ERROR CODE:  S

  MESSAGE TEXT:  A pointer passed to DEALLOCATE points to an array
  that cannot be deallocated

  EXPLANATION:  A pointer that was passed to DEALLOCATE pointed to an
  explicit array, an array slice, or some other type of memory that
  could not be deallocated in a DEALLOCATE statement.  Only whole
  arrays previous allocated with an ALLOCATE statement can be validly
  passed to DEALLOCATE.

  This error is not returned by IOSTAT.  However, this error can be
  returned by STAT in a DEALLOCATE statement.

60.52  –  INVKEYSPE

  NUMBER:  49

  ERROR CODE:  F

  MESSAGE TEXT:  invalid key specification

  EXPLANATION:  A key specification in an OPEN statement or in a
  keyed-access READ statement was invalid.  For example, the key
  length may have been zero or greater than 255 bytes, or the key
  length may not conform to the key specification of the existing
  file.

60.53  –  INVLOGUNI

  NUMBER:  32

  ERROR CODE:  F

  MESSAGE TEXT:  invalid logical unit number

  EXPLANATION:  A logical unit number less than zero or greater than
  2,147,483,647 was used in an I/O statement.

60.54  –  INVMATKEY

  NUMBER:  94

  ERROR CODE:  F

  MESSAGE TEXT:  invalid key match specifier for key direction

  EXPLANATION:  A keyed READ used an invalid key match specifier for
  the direction of that key.  Use KEYGE and KEYGT only on ascending
  keys.  Use KEYLE and KEYLT only on descending keys.  Use KEYNXT and
  KEYNXTNE to avoid enforcement of key direction and match specifier.

60.55  –  INVREALLOC

  NUMBER:  151

  ERROR CODE:  F

  MESSAGE TEXT:  allocatable array is already allocated

  EXPLANATION:  A Fortran 95/90 allocatable array must not already be
  allocated when you attempt to allocate it.  You must deallocate the
  array before it can again be allocated.

  This error is not returned by IOSTAT.  However, this error can be
  returned by STAT in an ALLOCATE statement.

60.56  –  INVREFVAR

  NUMBER:  19

  ERROR CODE:  F

  MESSAGE TEXT:  invalid reference to variable in NAMELIST input

  EXPLANATION:  The variable in error is shown as "varname" in the
  message text.  One of the following conditions occurred:

   o  The variable was not a member of the namelist group.

   o  An attempt was made to subscript a scalar variable.

   o  A subscript of the array variable was out-of-bounds.

   o  An array variable was specified with too many or too few
      subscripts for the variable.

   o  An attempt was made to specify a substring of a noncharacter
      variable or array name.

   o  A substring specifier of the character variable was
      out-of-bounds.

   o  A subscript or substring specifier of the variable was not an
      integer constant.

   o  An attempt was made to specify a substring using an
      unsubscripted array variable.

60.57  –  KEYIO_DIR

  NUMBER:  260

  ERROR CODE:  F

  MESSAGE TEXT:  keyed-access I/O to unit open for direct access

  EXPLANATION:  The OPEN for this unit number specified direct access
  and the I/O statement specifies keyed access.  Check the OPEN
  statement and make sure the I/O statement uses the correct unit
  number and type of access.  (For more information on statements,
  see the HP Fortran for OpenVMS Language Reference Manual.)

60.58  –  KEYVALERR

  NUMBER:  45

  ERROR CODE:  F

  MESSAGE TEXT:  keyword value error in OPEN statement

  EXPLANATION:  An improper value was specified for an OPEN or CLOSE
  statement keyword requiring a value.

60.59  –  LISIO_SYN

  NUMBER:  59

  ERROR CODE:  F

  MESSAGE TEXT:  list-directed I/O syntax error

  EXPLANATION:  The data in a list-directed input record had an
  invalid format, or the type of the constant was incompatible with
  the corresponding variable.  The value of the variable was
  unchanged.

  The ERR transfer is taken after completion of the I/O statement for
  this error number.  The resulting file status and record position
  are the same as if no error had occurred.  However, other I/O
  errors take the ERR transfer as soon as the error is detected, so
  file states and record position are undefined.

60.60  –  LOGZERNEG

  NUMBER:  83

  ERROR CODE:  F

  MESSAGE TEXT:  logarithm of zero or negative value

  EXPLANATION:  An attempt was made to take the logarithm of zero or
  a negative number.  The result returned was the reserved operand,
  -0 for VAX-format floating-point and NaN for IEEE-format floating-point.

60.61  –  MIXFILACC

  NUMBER:  31

  ERROR CODE:  F

  MESSAGE TEXT:  mixed file access modes

  EXPLANATION:  One of the following conditions occurred:

   o  An attempt was made to use both formatted and unformatted
      operations on the same unit.

   o  An attempt was made to use an invalid combination of access
      modes on a unit, such as direct and sequential.  The only valid
      combination is sequential and keyed access on a unit opened
      with ACCESS='KEYED'.

   o  An attempt was made to execute a Fortran I/O statement on a
      logical unit that was opened by a program coded in a language
      other than Fortran.

60.62  –  NO_CURREC

  NUMBER:  53

  ERROR CODE:  F

  MESSAGE TEXT:  no current record

  EXPLANATION:  A REWRITE or current record DELETE operation was
  attempted when no current record was defined.

60.63  –  NO_SUCDEV

  NUMBER:  42

  ERROR CODE:  F

  MESSAGE TEXT:  no such device

  EXPLANATION:  A file specification included an invalid or unknown
  device name when an OPEN operation was attempted.

60.64  –  NOTFORSPE

  NUMBER:  1

  ERROR CODE:  F

  MESSAGE TEXT:  not a Fortran-specific error

  EXPLANATION:  An error occurred in the user program or in the
  VSI Fortran RTL that was not a Fortran-specific error and was
  not reportable through any other VSI Fortran run-time messages.

  This error is not returned by IOSTAT.

60.65  –  NULPTRERR

  NUMBER:  146

  ERROR CODE:  F

  MESSAGE TEXT:  null pointer error

  EXPLANATION:  An attempt was made to use a pointer that does not
  contain an address.  Modify the source program, recompile, and
  relink.

  This error is not returned by IOSTAT.

60.66  –  OPEDEFREQ

  NUMBER:  26

  ERROR CODE:  F

  MESSAGE TEXT:  OPEN or DEFINE FILE required for keyed or direct
  access

  EXPLANATION:  One of the following conditions occurred:

   o  A direct access READ, WRITE, FIND, or DELETE statement
      specified a file that was not opened with a DEFINE FILE
      statement or with an OPEN statement specifying ACCESS='DIRECT'.

   o  A keyed access READ statement specified a file that was not
      opened with an OPEN statement specifying ACCESS='KEYED'.

60.67  –  OPEFAI

  NUMBER:  30

  ERROR CODE:  F

  MESSAGE TEXT:  open failure

  EXPLANATION:  An error was detected by RMS while attempting to open
  a file in an OPEN, INQUIRE, or other I/O statement.  This message
  is issued when the error condition is not one of the more common
  conditions for which specific error messages are provided.  It can
  occur when an OPEN operation is attempted for one of the following:

   o  A segmented file that was not on a disk or a raw magnetic tape

   o  A standard process I/O file that has been closed

60.68  –  OPEREQSEQ

  NUMBER:  265

  ERROR CODE:  F

  MESSAGE TEXT:  operation requires sequential file organization and
  access

  EXPLANATION:  Attempted BACKSPACE operation for a unit that is not
  connected to a sequential file opened for sequential access.  Make
  sure the BACKSPACE statement specified the right unit number and
  the OPEN statement specified the correct file and access.

60.69  –  OPERREQDIS

  NUMBER:  264

  ERROR CODE:  F

  MESSAGE TEXT:  operation requires file to be on disk or tape

  EXPLANATION:  Attempted BACKSPACE operation for a unit that is not
  connected to a disk or tape device.  Make sure the BACKSPACE
  statement specified the right unit number and the OPEN statement
  specified the correct device.

60.70  –  OUTCONERR

  NUMBER:  63

  ERROR CODE:  E or I

  MESSAGE TEXT:  output conversion error

  EXPLANATION:  During a formatted output operation, the value of a
  particular number could not be output in the specified field length
  without loss of significant digits.  If /CHECK=NOOUTPUT_CONVERSION
  is in effect, the severity is I.  In this case (or if no ERR
  address is defined for the I/O statement encountering this error),
  the program continues and the entire overflowed field is filled
  with asterisks (*) to indicate the error in the output record.

  The ERR transfer is taken after completion of the I/O statement for
  this error number.  The resulting file status and record position
  are the same as if no error had occurred.  However, other I/O
  errors take the ERR transfer as soon as the error is detected, so
  file states and record position are undefined.

60.71  –  OUTSTAOVE

  NUMBER:  66

  ERROR CODE:  F

  MESSAGE TEXT:  output statement overflows record

  EXPLANATION:  An output statement attempted to transfer more data
  than would fit in the maximum record size.

60.72  –  RANGEERR

  NUMBER:  150

  ERROR CODE:  F

  MESSAGE TEXT:  range error

  EXPLANATION:  An integer value appears in a context where the value
  of the integer is outside the permissible range.

  This error is not returned by IOSTAT.

60.73  –  RECIO_OPE

  NUMBER:  40

  ERROR CODE:  F

  MESSAGE TEXT:  recursive I/O operation

  EXPLANATION:  While processing an I/O statement for a logical unit,
  another I/O operation on the same logical unit was attempted.  One
  of the following conditions may have occurred:

   o  A function subprogram that performs I/O to the same logical
      unit was referenced in an expression in an I/O list or variable
      format expression.

   o  An I/O statement was executed at AST level for the same logical
      unit.

   o  An exception handler (or a procedure it called) executed an I/O
      statement in response to a signal from an I/O statement for the
      same logical unit.

60.74  –  RECNUMOUT

  NUMBER:  25

  ERROR CODE:  F

  MESSAGE TEXT:  record number outside range

  EXPLANATION:  A direct access READ, WRITE, or FIND statement
  specified a record number outside the range specified when the file
  was created.

60.75  –  RESACQFAI

  NUMBER:  152

  ERROR CODE:  F

  MESSAGE TEXT:  unresolved contention for VSI Fortran RTL global
  resource

  EXPLANATION:  Failed to acquire a VSI Fortran RTL global
  resource for a reentrant routine.  For a multithreaded program, the
  requested global resource is held by a different thread in your
  program.  For a program using asynchronous handlers, the requested
  global resource is held by the calling part of the program (such as
  the main program) and your asynchronous handler attempted to
  acquire the same global resource.

  This error is not returned by IOSTAT.

60.76  –  REWERR

  NUMBER:  20

  ERROR CODE:  F

  MESSAGE TEXT:  REWIND error

  EXPLANATION:  One of the following conditions occurred:

   o  The file was not a sequential organization file.

   o  The file was not opened for sequential or append access.

   o  RMS detected an error condition during execution of a REWIND
      statement.

60.77  –  REWRITERR

  NUMBER:  54

  ERROR CODE:  F

  MESSAGE TEXT:  REWRITE error

  EXPLANATION:  RMS detected an error condition during execution of a
  REWRITE statement.

60.78  –  ROPRAND

  NUMBER:  144

  ERROR CODE:  F

  MESSAGE TEXT:  reserved operand

  EXPLANATION:  VSI Fortran encountered a reserved operand.
  Please report the problem to HP.

  This error is not returned by IOSTAT.

60.79  –  SEGRECFOR

  NUMBER:  35

  ERROR CODE:  F

  MESSAGE TEXT:  segmented record format error

  EXPLANATION:  An invalid segmented record control data word was
  detected in an unformatted sequential file.  The file was probably
  either created with RECORDTYPE='FIXED' or 'VARIABLE' in effect, or
  was created by a program written in a language other than Fortran.

60.80  –  SEQIO_DIR

  NUMBER:  259

  ERROR CODE:  F

  MESSAGE TEXT:  sequential-access I/O to unit open for direct access

  EXPLANATION:  The OPEN for this unit number specified direct access
  and the I/O statement specifies sequential access.  Check the OPEN
  statement and make sure the I/O statement uses the correct unit
  number and type of access.  (For more information on statements,
  see the HP Fortran for OpenVMS Language Reference Manual.)

60.81  –  SHORTDATEARG

  NUMBER:  175

  ERROR CODE:  F

  MESSAGE TEXT:  DATE argument to DATE_AND_TIME is too short (LEN=n),
  required LEN=8

  EXPLANATION:  The number of characters associated with the DATE
  argument to the DATE_AND_TIME intrinsic was shorter than the
  required length.  You must increase the number of characters passed
  in for this argument to be at least 8 characters in length.  Verify
  that the TIME and ZONE arguments also meet their minimum lengths.

  This error is not returned by IOSTAT.

60.82  –  SHORTTIMEARG

  NUMBER:  176

  ERROR CODE:  F

  MESSAGE TEXT:  TIME argument to DATE_AND_TIME is too short (LEN=n),
  required LEN=10

  EXPLANATION:  The number of characters associated with the TIME
  argument to the DATE_AND_TIME intrinsic was shorter than the
  required length.  You must increase the number of characters passed
  in for this argument to be at least 10 characters in length.
  Verify that the DATE and ZONE arguments also meet their minimum
  lengths.

  This error is not returned by IOSTAT.

60.83  –  SHORTZONEARG

  NUMBER:  177

  ERROR CODE:  F

  MESSAGE TEXT:  ZONE argument to DATE_AND_TIME is too short (LEN=n),
  required LEN=5

  EXPLANATION:  The number of characters associated with the ZONE
  argument to the DATE_AND_TIME intrinsic was shorter than the
  required length.  You must increase the number of characters passed
  in for this argument to be at least 5 characters in length.  Verify
  that the DATE and TIME arguments also meet their minimum lengths.

  This error is not returned by IOSTAT.

60.84  –  SIGLOSMAT

  NUMBER:  87

  ERROR CODE:  F

  MESSAGE TEXT:  significance lost in math library

  EXPLANATION:  The magnitude of an argument or the magnitude of the
  ratio of the arguments to a math library function was so large that
  all significance in the result was lost.  The result returned was
  the reserved operand, -0.

60.85  –  SPERECLOC

  NUMBER:  52

  ERROR CODE:  F

  MESSAGE TEXT:  specified record locked

  EXPLANATION:  A read operation or direct access write, find, or
  delete operation was attempted on a record that was locked by
  another user.

60.86  –  SQUROONEG

  NUMBER:  84

  ERROR CODE:  F

  MESSAGE TEXT:  square root of negative value

  EXPLANATION:  An argument required the evaluation of the square
  root of a negative value.  The result returned was the reserved
  operand, -0 for VAX-format floating-point and NaN for IEEE-format
  floating-point.

60.87  –  STKOVF

  NUMBER:  147

  ERROR CODE:  F

  MESSAGE TEXT:  stack overflow

  EXPLANATION:  The VSI Fortran RTL encountered a stack overflow
  while executing your program.

  This error is not returned by IOSTAT.

60.88  –  STRLENERR

  NUMBER:  148

  ERROR CODE:  F

  MESSAGE TEXT:  string length error

  EXPLANATION:  During a string operation, an integer value appears
  in a context where the value of the integer is outside the
  permissible string length range.  Try recompiling with
  /CHECK=BOUNDS or examine the source code.

  This error is not returned by IOSTAT.

60.89  –  SUBRNG

  NUMBER:  77

  ERROR CODE:  F

  MESSAGE TEXT:  subscript out of range

  EXPLANATION:  An array reference was detected outside the declared
  array bounds.

  This error is not returned by IOSTAT.

60.90  –  SUBSTRERR

  NUMBER:  149

  ERROR CODE:  F

  MESSAGE TEXT:  substring error

  EXPLANATION:  An array subscript is outside the dimensioned
  boundaries of an array.  Try recompiling with /CHECK=BOUNDS or
  examine source code.

  This error is not returned by IOSTAT.

60.91  –  SYNERRFOR

  NUMBER:  62

  ERROR CODE:  F

  MESSAGE TEXT:  syntax error in format

  EXPLANATION:  A syntax error was encountered while the HP
  Fortran RTL was processing a format stored in an array or character
  variable.

60.92  –  SYNERRNAM

  NUMBER:  17

  ERROR CODE:  F

  MESSAGE TEXT:  syntax error in NAMELIST input "text"

  EXPLANATION:  The syntax of input to a namelist READ statement was
  incorrect.  (The part of the record in which the error was detected
  is shown as "text" in the message text.)

60.93  –  TOOMANREC

  NUMBER:  27

  ERROR CODE:  F

  MESSAGE TEXT:  too many records in I/O statement

  EXPLANATION:  One of the following conditions occurred:

   o  An attempt was made to read or write more than one record with
      an ENCODE or DECODE statement.

   o  An attempt was made to write more records than existed.

60.94  –  TOOMANVAL

  NUMBER:  18

  ERROR CODE:  F

  MESSAGE TEXT:  too many values for NAMELIST variable "varname"

  EXPLANATION:  An attempt was made to assign too many values to a
  variable during a namelist READ statement.  (The name of the
  variable is shown as "varname" in the message text.)

60.95  –  UNDEXP

  NUMBER:  82

  ERROR CODE:  F

  MESSAGE TEXT:  undefined exponentiation

  EXPLANATION:  An exponentiation that is mathematically undefined
  was attempted, for example, 0.**0.  The result returned for
  floating-point operations was the reserved operand, -0 for
  VAX-format floating-point and NaN for IEEE-format floating-point.
  For integer operations, zero is returned.

60.96  –  UNFIO_FMT

  NUMBER:  256

  ERROR CODE:  F

  MESSAGE TEXT:  unformatted I/O to unit open for formatted transfers

  EXPLANATION:  Attempted unformatted I/O to a unit where the OPEN
  statement indicated the file was formatted (FORM specifier).  Check
  that the correct unit (file) was specified.

  If FORM was not specified in the OPEN statement and the file should
  contain unformatted data, specify FORM='UNFORMATTED' in the OPEN
  statement.  Otherwise, if appropriate, use formatted I/O (such as
  list-directed or namelist I/O).

60.97  –  UNIALROPE

  NUMBER:  34

  ERROR CODE:  F

  MESSAGE TEXT:  unit already open

  EXPLANATION:  A DEFINE FILE statement specified a logical unit that
  was already opened.

60.98  –  UNLERR

  NUMBER:  56

  ERROR CODE:  F

  MESSAGE TEXT:  UNLOCK error

  EXPLANATION:  RMS detected an error condition during execution of
  an UNLOCK statement.

60.99  –  VFEVALERR

  NUMBER:  68

  ERROR CODE:  F

  MESSAGE TEXT:  variable format expression value error

  EXPLANATION:  The value of a variable format expression was not
  within the range acceptable for its intended use; for example, a
  field width was less than or equal to zero.  A value of one was
  assumed, except for a P edit descriptor, for which a value of zero
  was assumed.

  The ERR transfer is taken after completion of the I/O statement for
  this error number.  The resulting file status and record position
  are the same as if no error had occurred.  However, other I/O
  errors take the ERR transfer as soon as the error is detected, so
  file states and record position are undefined.

60.100  –  WRIREAFIL

  NUMBER:  47

  ERROR CODE:  F

  MESSAGE TEXT:  write to READONLY file

  EXPLANATION:  A write operation was attempted to a file that was
  declared ACTION='READ' or READONLY in the OPEN statement that is
  currently in effect.

60.101  –  WRONUMARG

  NUMBER:  80

  ERROR CODE:  F

  MESSAGE TEXT:  wrong number of arguments

  EXPLANATION:  An improper number of arguments was used to call a
  math library procedure.

61  –  Source Format

  Source code can be in free, fixed, or tab format.  Fixed or tab
  forms must not be mixed with free form in the same source program,
  but different source forms can be used in different source
  programs.

  All source forms allow lowercase characters to be used as an
  alternative to uppercase characters.

  More than one statement (or partial statement) can appear on a
  single source line if a statement separator is placed between the
  statements.

  The statement separator is a semicolon character (;).  Consecutive
  semicolons (with or without intervening blanks) are considered to
  be one semicolon.  If a semicolon is the last character on a line,
  or the last character before a comment, it is ignored.

61.1  –  Free Form

  In free source form, statements are not limited to specific
  positions on a source line, and a line can contain from 0 to 132
  characters.

  Blank characters are significant in free source form.  The
  following are rules for blank characters:

   o  Blank characters must not appear in lexical tokens, except
      within a character context.  For example, there can be no
      blanks between the exponentiation operator **.  Blank
      characters can be used freely between lexical tokens to improve
      legibility.

   o  Blank characters must be used to separate names, constants, or
      labels from adjacent keywords, names, constants, or labels.
      For example, consider the following statements:

        INTEGER NUM
        GO TO 40
        20 DO K=1,8

      The blanks are required after INTEGER, TO, 20, and DO.

   o  Some adjacent keywords must have one or more blank characters
      between them.  Others do not require any; for example, BLOCK
      DATA can also be spelled BLOCKDATA.  The following list shows
      which keywords have optional or required blanks.

      Optional Blanks           Required Blanks
      ----------------          ----------------
      BLOCK DATA                CASE DEFAULT
      DOUBLE COMPLEX            DO WHILE
      DOUBLE PRECISION          IMPLICIT type
      ELSE IF                   IMPLICIT NONE
      END BLOCK DATA            INTERFACE ASSIGNMENT
      END DO                    INTERFACE OPERATOR
      END FILE                  MODULE PROCEDURE
      END FORALL                RECURSIVE FUNCTION
      END FUNCTION              RECURSIVE SUBROUTINE
      END IF                    RECURSIVE type FUNCTION
      END INTERFACE             type FUNCTION
      END MODULE                type RECURSIVE FUNCTION
      END PROGRAM
      END SELECT
      END SUBROUTINE
      END TYPE
      END WHERE
      GO TO
      IN OUT
      SELECT CASE

  The exclamation point character (!) indicates a comment if it is
  within a source line, or a comment line if it is the first
  character in a source line.

  The ampersand character (&) indicates a continuation line (unless
  it appears in a Hollerith or character constant, or within a
  comment).  The continuation line is the first noncomment line
  following the ampersand.  Although Fortran 95/90 permits up to 39
  continuation lines in free-form programs, VSI Fortran allows up
  to 511 continuation lines.

  The following shows a continued statement:

  TCOSH(Y) = EXP(Y) + &        ! The initial statement line
             EXP(-Y)           ! A continuation line

  If the first nonblank character on the next noncomment line is an
  ampersand, the statement continues at the character following the
  ampersand.  For example, the preceding example can be written as
  follows:

  TCOSH(Y) = EXP(Y) + &
            & EXP(-Y)

  If a lexical token must be continued, the first nonblank character
  on the next noncomment line must be an ampersand followed
  immediately by the rest of the token.  For example:

  TCOSH(Y) = EXP(Y) + EX&
            &P(-Y)

  If you continue a character constant, an ampersand must be the
  first non-blank character of the continued line; the statement
  continues with the next character following the ampersand.  For
  example:

  ADVERTISER = "Davis, O'Brien, Chalmers & Peter&
                   &son"
  ARCHITECT  = "O'Connor, Emerson, and Davis&
                   & Associates"

  In VSI Fortran, if the ampersand is omitted on the continued
  line, the statement continues with the first non-blank character in
  the continued line.  So, in the preceding example, the whitespace
  before "Associates" would be ignored.

  The ampersand cannot be the only nonblank character in a line, or
  the only nonblank character before a comment; an ampersand in a
  comment is ignored.

61.2  –  Fixed and Tab Format

  Each Fortran line has the following four fields:

    Statement label field           Columns 1-5
    Continuation indicator field    Column 6
    Statement field                 Columns 7-72 (if you specify
                                      the EXTEND_SOURCE compiler
                                      option or OPTIONS/EXTEND_SOURCE,
                                      statements extend to column 132)
    Sequence number field           Columns 73-80

  Note:  If you use the sequence number field, do not use tabs
  anywhere in the source line, or the compiler may interpret the
  sequence numbers as part of the statement field in your program.

61.2.1  –  Fixed

  A Fortran line is divided into fields for the required information.
  Each column represents a single character.

   COLUMN    FIELD
   ------    -----
       1     Indicator: Comment(C,c,*,!,blank) or Debug(D,d)
     1-5     Label (any decimal integer except zero)
       6     Indicator: Continuation of statement (any character
                   except zero or space)
    7-72     Statement Field (up to column 72)
   73-80     Sequence Number (optionally to column 132 -- ignored)

                                 NOTE

          This source format is obsolescent  in  Fortran  95.
          HP  Fortran  flags  obsolescent  features,  but
          fully supports them.

61.2.2  –  Tab

  A Fortran line is divided into fields for the required information.
  Each column represents a single character.  You cannot specify a
  sequence number field using this method of coding.

   COLUMN   FIELD
   ------   -----
   (before tab)
     1      Indicator: Comment(C,c,*,!,blank) or Debug(D,d)
   1-5      Label (any decimal integer except zero)
   (after first tab)
     6      Indicator: Continuation of statement (any digit 1-9)
   (after second tab)
            Statement Field (up to column 72)

  Tabs are treated as single characters.

61.3  –  Example

  The following example is valid for all source forms:

  Column:

  12345678...                                                            73
  _________________________________________________________________________

  ! Define the user function MY_SIN

        DOUBLE PRECISION FUNCTION MY_SIN(X)
          MY_SIN = X - X**3/FACTOR(3) + X**5/FACTOR(5)                    &
       &          - X**7/FACTOR(7)
        CONTAINS
          INTEGER FUNCTION FACTOR(N)
           FACTOR = 1
           DO 10 I = N, 1, -1
    10     FACTOR = FACTOR * I
          END FUNCTION FACTOR
        END FUNCTION MY_SIN

62  –  Statements

  Statements in a Fortran program unit follow a required order.  In
  the following figure, vertical lines separate statement types that
  can be interspersed.  For example, DATA statements can be
  interspersed with executable statements.  Horizontal lines indicate
  statement types that cannot be interspersed.  For example, type
  declaration statements cannot be interspersed with executable
  statements.

  +-------+--------------------------------------------------------+
  |       |                  OPTIONS Statements                    |
  |       |--------------------------------------------------------|
  |       |       PROGRAM, FUNCTION, SUBROUTINE, MODULE, or        |
  |       |                BLOCK DATA Statements                   |
  |       |--------------------------------------------------------|
  |       |                    USE Statements                      |
  |       |---------+----------------------------------------------|
  |COMMENT|         |       IMPLICIT NONE Statements               |
  | Lines,|         |------------+-------------------+-------------|
  |INCLUDE|NAMELIST,| PARAMETER  |  IMPLICIT Statements            |
  |State- | FORMAT, |------------+---------------------------------|
  | ments,|   &     |            | Derived-Type Definitions,       |
  |  &    | ENTRY   | PARAMETER  | Interface Blocks, Type          |
  |Direc- | State-  | and DATA   | Declaration Statements, State-  |
  | tives |  ments  | Statements | ment Function Statements, and   |
  |       |         |            | Specification Statements        |
  |       |         +------------+---------------------------------|
  |       |         |   DATA     | Executable Statements           |
  |       |         | Statements |                                 |
  |       |---------+----------------------------------------------|
  |       |                CONTAINS Statement                      |
  |       |--------------------------------------------------------|
  |       |    Internal Subprograms or Module Subprograms          |
  |-------+--------------------------------------------------------|
  |                     END Statement                              |
  +----------------------------------------------------------------+

62.1  –  Directives

  You can use directives in a Fortran source program to influence
  certain aspects of the compilation process.

62.1.1  –  General Directives

  HP FORTRAN provides several general-purpose compiler directives
  to perform tasks during compilation.

  General directives begin with the cDEC$ prefix.  These directives
  are enabled in all Fortran compilation units, regardless of the
  options used on the command line.

  The general directives are:

  ALIAS                       MESSAGE
  ATTRIBUTES                  OBJCOMMENT
  DECLARE and NODECLARE       OPTIONS
  DEFINE and UNDEFINE         PACK
  FIXEDFORMLINESIZE           PSECT
  FREEFORM and NOFREEFORM     REAL
  IDENT                       STRICT and NOSTRICT
  IF and IF DEFINED           SUBTITLE and TITLE
  INTEGER                     UNROLL
  IVDEP

  The "c" in the directive prefix (cDEC$) is one of the following:  C
  (or c), !, or *.

  The following are source form rules for directive prefixes:

   o  Prefixes beginning with C (or c) and * are only allowed in
      fixed and tab source forms.

      In these source forms, the prefix must appear in columns 1
      through 5; column 6 must be a blank or tab.  From column 7 on,
      blanks are insignificant, so the directive can be positioned
      anywhere on the line after column 6.

   o  Prefixes beginning with !  are allowed in all source forms.

      The prefix can appear in any valid column, but it cannot be
      preceded by any nonblank characters on the same line.  It can
      only be preceded by whitespace.

  A general directive ends in column 72 (or column 132, if a compiler
  option is specified).

  General directives cannot be continued.

  A comment can follow a directive on the same line.

  Additional Fortran statements (or directives) cannot appear on the
  same line as the general directive.

  General directives cannot appear within a continued Fortran
  statement.

  If a blank common is used in a general compiler directive, it must
  be specified as two slashes (/ /).

62.1.1.1  –  ALIAS

  cDEC$ ALIAS

  Specifies an alternate external name to be used when referring to
  external subprograms.  It takes the following form:

  cDEC$ ALIAS internal-name, external name

    c               Is one of the following: C (or c), !, or *.

    internal-name   Is the name of the subprogram as used
                    in the current program unit.

    external name   Is a name, or a character constant delimited
                    by quotation marks or apostrophes.

  If a name is specified, the name (in uppercase) is used as the
  external name for the specified "internal-name".  If a character
  constant is specified, it is used as is; the string is not changed
  to uppercase nor are blanks removed.

  The ALIAS directive affects only the external name used for
  references to the specified "internal-name".

  Names that are not acceptable to the linker will cause link-time
  errors.

  This directive can be useful when compiling applications written
  for other platforms that have different naming conventions.

62.1.1.2  –  ATTRIBUTES

  cDEC$ ATTRIBUTES

  Lets you specify properties for data objects and procedures.  It
  takes the following form:

  cDEC$ ATTRIBUTES att [,att]... :: object [,object]...

    c        Is one of the following: C (or c), !, or *.

    att      Is one of the following properties:

             ADDRESS64
             ALIAS                        EXTERN
             ALLOW_NULL                   IGNORE_LOC
                                          NO_ARG_CHECK
             C                            NOMIXED_STR_LEN_ARG
             DECORATE                     REFERENCE
             DEFAULT                      REFERENCE32
             DESCRIPTOR                   REFERENCE64
             DESCRIPTOR32                 STDCALL
             DESCRIPTOR64                 VALUE
                                          VARYING

    object   Is the name of a data object or procedure.

  The properties can be used in function and subroutine definitions,
  in type declarations, and with the INTERFACE and ENTRY statements.

  Properties applied to entities available through use or host
  association are in effect during the association.  For example,
  consider the following:

  MODULE MOD1
    INTERFACE
      SUBROUTINE SUB1
      !DEC$ ATTRIBUTES C, ALIAS:'othername' :: NEW_SUB
      END SUBROUTINE
    END INTERFACE
    CONTAINS
      SUBROUTINE SUB2
      CALL NEW_SUB
      END SUBROUTINE
  END MODULE

  In this case, the call to NEW_SUB within SUB2 uses the C and ALIAS
  properties specified in the interface block.

  Options C, STDCALL, REFERENCE, VALUE, and VARYING affect the
  calling conventions of routines:

   o  You can specify C, STDCALL, REFERENCE, and VARYING for an
      entire routine.

   o  You can specify VALUE and REFERENCE for individual arguments.

  For compatibility, !MS$ATTRIBUTES can be used in place of cDEC$
  ATTRIBUTES.

  The properties are described in the following sections.

62.1.1.2.1  –  ADDRESS64

  Specifies that the data object has a 64-bit address.  This property
  can be specified for any variable or dummy argument, including
  ALLOCATABLE and deferred-shape arrays.  However, variables with
  this property cannot be data-initialized.

  It can also be specified for COMMON blocks or for variables in a
  COMMON block.  If specified for a COMMON block variable, the COMMON
  block implicitly has the ADDRESS64 property.

  ADDRESS64 is not compatible with the AUTOMATIC attribute.

62.1.1.2.2  –  ALIAS

  Specifies an alternate external name to be used when referring to
  external subprograms.  Its form is:

  ALIAS:external-name

    external-name  Is a character constant delimited by apostrophes
                   or quotation marks.  The character constant is
                   used as is; the string is not changed to uppercase,
                   nor are blanks removed.

  The ALIAS property overrides the C (and STDCALL) property.  If both
  C and ALIAS are specified for a subprogram, the subprogram is given
  the C calling convention, but not the C naming convention.  It
  instead receives the name given for ALIAS, with no modifications.

  ALIAS cannot be used with internal procedures, and it cannot be
  applied to dummy arguments.

  cDEC$ ATTRIBUTES ALIAS has the same effect as the cDEC$ ALIAS
  directive.

62.1.1.2.3  –  ALLOW_NULL

  Enables a corresponding dummy argument to pass a NULL pointer
  (defined by a zero or the NULL intrinsic function) by value for the
  argument.

  ALLOW_NULL is only valid if the REFERENCE property is also
  specified; otherwise, it has no effect.

62.1.1.2.4  –  C and STDCALL

  Specify how data is to be passed when you use routines written in C
  or assembler with FORTRAN or Fortran 95/90 routines.

  C and STDCALL are interpreted as synonyms.

  When applied to a subprogram, these properties define the
  subprogram as having a specific set of calling conventions.

  The difference between the calling conventions is this: If C or
  STDCALL is specified for a subprogram, arguments (except for
  arrays and characters) are passed by value.  Subprograms using
  standard Fortran 95/90 conventions pass arguments by reference.

  Character arguments are passed as follows:

   o  By default, hidden lengths are put at the end of the argument
      list.

   o  If C or STDCALL (only) is specified:

      On all systems, the first character of the string is passed
      (and padded with zeros out to INTEGER(4) length).

   o  If C or STDCALL is specified, and REFERENCE is specified for
      the argument:

      On all systems, the string is passed with no length.

   o  If C or STDCALL is specified, and REFERENCE is specified for
      the routine (but REFERENCE is not specified for the argument,
      if any):

      On all systems, the string is passed with the length.

62.1.1.2.5  –  DECORATE

  Specifies that the external name used in cDEC$ ALIAS or cDEC$
  ATTRIBUTES ALIAS should have the prefix and postfix decorations
  performed on it that are associated with the calling mechanism that
  is in effect.  These are the same decorations performed on the
  procedure name when ALIAS is not specified.

  The case of the external name is not modified.

  If ALIAS is not specified, this property has no effect.

62.1.1.2.6  –  DEFAULT

  Overrides certain compiler options that can affect external routine
  and COMMON block declarations.

  It specifies that the compiler should ignore compiler options that
  change the default conventions for external symbol naming and
  argument passing for routines and COMMON blocks (/iface, /names,
  and /assume:underscore).

  This option can be combined with other cDEC$ ATTRIBUTES options,
  such as STDCALL, C, REFERENCE, ALIAS, etc.  to specify attributes
  different from the compiler defaults.

  This option is useful when declaring INTERFACE blocks for external
  routines, since it prevents compiler options from changing calling
  or naming conventions.

62.1.1.2.7  –  DESCRIPTOR

  Specifies that the argument is passed by VMS descriptor.  This
  property can be specified only for dummy arguments in an INTERFACE
  block (NOT for a routine itself).

62.1.1.2.8  –  DESCRIPTOR32

  Specifies that the argument is passed as a 32-bit descriptor.

62.1.1.2.9  –  DESCRIPTOR64

  Specifies that the argument is passed as a 64-bit descriptor.

62.1.1.2.10  –  EXTERN

  Specifies that a variable is allocated in another source file.
  EXTERN can be used in global variable declarations, but it must not
  be applied to dummy arguments.

  EXTERN must be used when accessing variables declared in other
  languages.

62.1.1.2.11  –  IGNORE_LOC

  Enables %LOC to be stripped from an argument.

  IGNORE_LOC is only valid if the REFERENCE property is also
  specified; otherwise, it has no effect.

62.1.1.2.12  –  NO_ARG_CHECK

  Specifies that type and shape matching rules related to explicit
  interfaces are to be ignored.  This permits the construction of an
  INTERFACE block for an external procedure or a module procedure
  that accepts an argument of any type or shape; for example, a
  memory copying routine.

  NO_ARG_CHECK can appear only in an INTERFACE block for a
  non-generic procedure or in a module procedure.  It can be applied
  to an individual dummy argument name or to the routine name, in
  which case the property is applied to all dummy arguments in that
  interface.

  NO_ARG_CHECK cannot be used for procedures with the PURE or
  ELEMENTAL prefix.  If an argument has an INTENT or OPTIONAL
  attribute, any NO_ARG_CHECK specification is ignored.

62.1.1.2.13  –  NOMIXED_STR_LEN_ARG

  Specifies that hidden lengths be placed in sequential order at the
  end of the argument list.

62.1.1.2.14  –  REFERENCE and VALUE

  Specify how a dummy argument is to be passed.

  REFERENCE specifies a dummy argument's memory location is to be
  passed instead of the argument's value.

  VALUE specifies a dummy argument's value is to be passed instead of
  the argument's memory location.

  When a dummy argument has the VALUE property, the actual argument
  passed to it can be of a different type.  If necessary, type
  conversion is performed before the subprogram is called.

  When a complex (KIND=4, KIND=8, or KIND=16) argument is passed by
  value, two floating-point arguments (one containing the real part,
  the other containing the imaginary part) are passed by immediate
  value.

  Character values, substrings, assumed-size arrays, and adjustable
  arrays cannot be passed by value.

  If REFERENCE (only) is specified for a character argument, the
  string is passed but the length is not passed.

  If REFERENCE is specified for a character argument, and C (or
  STDCALL) has been specified for the routine, the string is passed
  but the length is not passed.  This is true even if REFERENCE is
  also specified for the routine.

  If REFERENCE and C (or STDCALL) are specified for a routine, but
  REFERENCE has not been specified for the argument, the string is
  passed with the length.

  VALUE is the default if the C or STDCALL property is specified in
  the subprogram definition.

62.1.1.2.15  –  REFERENCE32

  Specifies that the argument is accepted only by 32-bit address.

62.1.1.2.16  –  REFERENCE64

  Specifies that the argument is accepted only by 64-bit address.

62.1.1.2.17  –  VARYING

  Allows a variable number of calling arguments.  If VARYING is
  specified, the C property must also be specified.

  Either the first argument must be a number indicating how many
  arguments to process, or the last argument must be a special marker
  (such as -1) indicating it is the final argument.  The sequence of
  the arguments, and types and kinds must be compatible with the
  called procedure.

62.1.1.3  –  DECLARE and NODECLARE

  cDEC$ DECLARE
  cDEC$ NODECLARE

  The DECLARE directive generates warnings for variables that have
  been used but have not been declared (like the IMPLICIT NONE
  statement).  The NODECLARE directive (the default) disables these
  warnings.

  The "c" in cDEC$ is one of the following:  a C (or c), !, or *.

  The DECLARE directive is primarily a debugging tool that locates
  variables that have not been properly initialized, or that have
  been defined but never used.

  For compatibility, !MS$DECLARE and !MS$NODECLARE can be used in
  place of cDEC$ DECLARE and cDEC$ NODECLARE.

62.1.1.4  –  DEFINE and UNDEFINE

  cDEC$ DEFINE
  cDEC$ UNDEFINE

  The DEFINE directive creates a symbolic variable whose existence or
  value can be tested during conditional compilation.  The UNDEFINE
  directive removes a defined symbol.

  The DEFINE and UNDEFINE directives take the following forms:

  cDEC$ DEFINE   name [=val]
  cDEC$ UNDEFINE name

    c        Is one of the following: C (or c), !, or *.

    name     Is the name of the variable.

    val      Is an INTEGER(4) value assigned to "name".

  DEFINE and UNDEFINE create and remove variables for use with the IF
  (or IF DEFINED) directive.  Symbols defined with the DEFINE
  directive are local to the directive.  They cannot be declared in
  the Fortran program.

  Because Fortran programs cannot access the named variables, the
  names can duplicate Fortran keywords, intrinsic functions, or
  user-defined names without conflict.

  To test whether a symbol has been defined, use the IF DEFINED
  (name) directive.  You can assign an integer value to a defined
  symbol.  To test the assigned value of "name", use the IF
  directive.  IF test expressions can contain most logical and
  arithmetic operators.

  Attempting to undefine a symbol which has not been defined produces
  a compiler warning.

  The DEFINE and UNDEFINE directives can appear anywhere in a
  program, enabling and disabling symbol definitions.

  For compatibility, !MS$DEFINE and !MS$UNDEFINE can be used in place
  of cDEC$ DEFINE and cDEC$ UNDEFINE.

  Examples:

  Consider the following:

  !DEC$ DEFINE  testflag
  !DEC$ IF DEFINED (testflag)
      write (*,*) 'Compiling first line'
  !DEC$ ELSE
       write (*,*) 'Compiling second line'
  !DEC$ ENDIF
  !DEC$ UNDEFINE  testflag

62.1.1.5  –  FIXEDFORMLINESIZE

  cDEC$ FIXEDFORMLINESIZE

  Sets the line length for fixed-form source code.  The directive
  takes the following form:

  cDEC$ FIXEDFORMLINESIZE:{72 | 80 | 132}

    c        Is one of the following: C (or c), !, or *.

  You can set FIXEDFORMLINESIZE to 72 (the default), 80, or 132
  characters.  The FIXEDFORMLINESIZE setting remains in effect until
  the end of the file, or until it is reset.

  The FIXEDFORMLINESIZE directive sets the source-code line length in
  include files, but not in USE modules, which are compiled
  separately.  If an include file resets the line length, the change
  does not affect the host file.

  This directive has no effect on free-form source code.

  For compatibility, !MS$FIXEDFORMLINESIZE can be used in place of
  cDEC$ FIXEDFORMLINESIZE.

  Examples:

  Consider the following:

  CDEC$ NOFREEFORM
  CDEC$ FIXEDFORMLINESIZE:132
  WRITE(*,*) 'Text that goes past the 72nd column without continuation'

62.1.1.6  –  FREEFORM and NOFREEFORM

  cDEC$ FREEFORM
  cDEC$ NOFREEFORM

  The FREEFORM directive specifies that source code is in free-form
  format.  The NOFREEFORM directive specifies that source code is in
  fixed-form format.

  The "c" in cDEC$ is one of the following:  a C (or c), !, or *.

  When the FREEFORM or NOFREEFORM directives are used, they remain in
  effect for the remainder of the file, or until the opposite
  directive is used.  When in effect, they apply to include files,
  but do not affect USE modules, which are compiled separately.

  For compatibility, !MS$FREEFORM and !MS$NOFREEFORM can be used in
  place of cDEC$ FREEFORM and cDEC$ NOFREEFORM.

62.1.1.7  –  IDENT

  cDEC$ IDENT string

  Lets you specify a string that can be used to identify an object
  module.  The compiler places the string in the identification field
  of an object module when it generates the module for each source
  program unit.

  The "string" is a character constant containing up to 31 printable
  characters.

  Only the first IDENT directive is effective -- the compiler ignores
  any additional IDENT directives in a program unit.

  IDENT has no effect when you specify the /NOOBJECT compiler option.

62.1.1.8  –  IF and IFDEFINED

  cDEC$ IF
  cDEC$ IF DEFINED

  The IF and IF DEFINED directives specify a conditional compilation
  construct.  IF tests whether a logical expression is .TRUE.  or
  .FALSE..  IF DEFINED tests whether a symbol has been defined.

  The directive-initiated construct takes the following form:

  cDEC$ IF (expr) [or cDEC$ IF DEFINED (name)]
     block
  [cDEC$ ELSE IF (expr)
     block]...
  [cDEC$ ELSE
     block]
  cDEC$ ENDIF

    c        Is one of the following: C (or c), !, or *.

    exp      A logical expression that evaluates to .TRUE.
             or .FALSE..

    name     Is the name of a symbol to be tested for definition.

    block    Are executable statements that are compiled (or not)
             depending on the value of logical expressions in
             the IF directive construct.

  The IF and IF DEFINED directive constructs end with an ENDIF
  directive and can contain one or more ELSEIF directives and at most
  one ELSE directive.  If the logical condition within a directive
  evaluates to .TRUE.  at compilation, and all preceding conditions
  in the IF construct evaluate to .FALSE., then the statements
  contained in the directive block are compiled.

  A "name" can be defined with a DEFINE directive, and can optionally
  be assigned an integer value.  If the symbol has been defined, with
  or without being assigned a value, IF DEFINED (name) evaluates to
  .TRUE.; otherwise, it evaluates to .FALSE..

  If the logical condition in the IF or IF DEFINED directive is
  .TRUE., statements within the IF or IF DEFINED block are compiled.
  If the condition is .FALSE., control transfers to the next ELSEIF
  or ELSE directive, if any.

  If the logical expression in an ELSEIF directive is .TRUE.,
  statements within the ELSEIF block are compiled.  If the expression
  is .FALSE., control transfers to the next ELSEIF or ELSE directive,
  if any.

  If control reaches an ELSE directive because all previous logical
  conditions in the IF construct evaluated to .FALSE., the statements
  in an ELSE block are compiled unconditionally.

  You can use any Fortran logical or relational operator or symbol in
  the logical expression of the directive.  The logical expression
  can be as complex as you like, but the whole directive must fit on
  one line.

  For compatibility, each directive in the construct can begin with
  the prefix !MS$ instead of cDEC$.

  Examples:

  Consider the following:

  ! When the following code is compiled and run,
  !  the output depends on whether one of the expressions
  !  tests .TRUE.; or all test .FALSE.

  !DEC$ DEFINE flag=3
  !DEC$ IF (flag .LT. 2)
     WRITE (*,*) "This is compiled if flag less than 2."
  !DEC$ ELSEIF (flag >= 8)
     WRITE (*,*) "Or this compiled if flag greater than &
                  or equal to 8."
  !DEC$ ELSE
     WRITE (*,*) "Or this compiled if all preceding &
                  conditions .FALSE."
  !DEC$ ENDIF
  END

62.1.1.9  –  INTEGER

  cDEC$ INTEGER

  Specifies the default integer kind.  It takes the following form:

  cDEC$ INTEGER:{2 | 4 | 8}

    c        Is one of the following: C (or c), !, or *.

  The INTEGER directive specifies a size of 2 (KIND=2), 4 (KIND=4),
  or 8 (KIND=8) bytes for default integer numbers.

  When the INTEGER directive is effect, all default integer variables
  are of the kind specified in the directive.  Only numbers specified
  or implied as INTEGER without KIND are affected.

  The INTEGER directive can only appear at the top of a program unit.
  A program unit is a main program, an external subroutine or
  function, a module or a block data program unit.  The directive
  cannot appear between program units, or at the beginning of
  internal subprograms.  It does not affect modules invoked with the
  USE statement in the program unit that contains it.

  The default logical kind is the same as the default integer kind.
  So, when you change the default integer kind you also change the
  default logical kind.

  For compatibility, !MS$INTEGER can be used in place of cDEC$
  INTEGER.

  Examples:

  Consider the following:

  INTEGER i              ! a 4-byte integer
  WRITE(*,*) KIND(i)
  CALL INTEGER2( )
  WRITE(*,*) KIND(i)     ! still a 4-byte integer
                         !   not affected by setting in subroutine
  END
  SUBROUTINE INTEGER2( )
     !DEC$ INTEGER:2
     INTEGER j           ! a 2-byte integer
     WRITE(*,*) KIND(j)
  END SUBROUTINE

62.1.1.10  –  IVDEP

  cDEC$ IVDEP

  The IVDEP directive assists the compiler's dependence analysis.  It
  can only be applied to iterative DO loops.  This directive can also
  be specified as INIT_DEP_FWD (INITialize DEPendences ForWarD).

  The IVDEP directive takes the following form:

  cDEC$ IVDEP

    c        Is one of the following: C (or c), !, or *.

  The IVDEP directive is an assertion to the compiler's optimizer
  about the order of memory references inside a DO loop.

  The IVDEP directive tells the compiler to begin dependence analysis
  by assuming all dependences occur in the same forward direction as
  their appearance in the normal scalar execution order.  This
  contrasts with normal compiler behavior, which is for the
  dependence analysis to make no initial assumptions about the
  direction of a dependence.

  The IVDEP directive must precede the DO statement for each DO loop
  it affects.  No source code lines, other than the following, can be
  placed between the IVDEP directive statement and the DO statement:

   o  An UNROLL directive

   o  Placeholder lines

   o  Comment lines

   o  Blank lines

  The IVDEP directive is applied to a DO loop in which the user knows
  that dependences are in lexical order.  For example, if two memory
  references in the loop touch the same memory location and one of
  them modifies the memory location, then the first reference to
  touch the location has to be the one that appears earlier lexically
  in the program source code.  This assumes that the right-hand side
  of an assignment statement is "earlier" than the left-hand side.

  The IVDEP directive informs the compiler that the program would
  behave correctly if the statements were executed in certain orders
  other than the sequential execution order, such as executing the
  first statement or block to completion for all iterations, then the
  next statement or block for all iterations, and so forth.  The
  optimizer can use this information, along with whatever else it can
  prove about the dependences, to choose other execution orders.

  Examples:

  In the following example, the IVDEP directive provides more
  information about the dependences within the loop, which may enable
  loop transformations to occur:

  !DEC$ IVDEP
        DO I=1, N
           A(INDARR(I)) = A(INDARR(I)) + B(I)
        END DO

  In this case, the scalar execution order follows:

  1.  Retrieve INDARR(I).

  2.  Use the result from step 1 to retrieve A(INDARR(I)).

  3.  Retrieve B(I).

  4.  Add the results from steps 2 and 3.

  5.  Store the results from step 4 into the location indicated by
      A(INDARR(I)) from step 1.

  IVDEP directs the compiler to initially assume that when steps 1
  and 5 access a common memory location, step 1 always accesses the
  location first because step 1 occurs earlier in the execution
  sequence.  This approach lets the compiler reorder instructions, as
  long as it chooses an instruction schedule that maintains the
  relative order of the array references.

62.1.1.11  –  MESSAGE

  cDEC$ MESSAGE

  Specifies a character string to be sent to the standard output
  device during the first compiler pass; this aids debugging.

  This directive takes the following form:

  cDEC$ MESSAGE:string

    c        Is one of the following: C (or c), !, or *.

    string   Is a character constant specifying a message.

  For compatibility, !MS$MESSAGE can be used in place of cDEC$
  MESSAGE.

  Examples:

  Consider the following:

  !DEC$ MESSAGE:'Compiling Sound Speed Equations'

62.1.1.12  –  OBJCOMMENT

  cDEC$ OBJCOMMENT

  Specifies a library search path in an object file.  This directive
  takes the following form:

  cDEC$ OBJCOMMENT LIB:library

    c        Is one of the following: C (or c), !, or *.

    library  Is a character constant specifying the name
             and, if necessary, the path of the library
             that the linker is to search.

  The linker searches for the library named by the OBJCOMMENT
  directive as if you named it on the command line, that is, before
  default library searches.  You can place multiple library search
  directives in the same source file.  Each search directive appears
  in the object file in the order it is encountered in the source
  file.

  If the OBJCOMMENT directive appears in the scope of a module, any
  program unit that uses the module also contains the directive, just
  as if   the OBJCOMMENT directive appeared in the source file using
  the module.

  If you want to have the OBJCOMMENT directive in a module, but do
  not want it in the program units that use the module, place the
  directive outside the module that is used.

  For compatibility, !MS$OBJCOMMENT can be used in place of cDEC$
  OBJCOMMENT.

  Examples:

  Consider the following:

  ! MOD1.F90
  MODULE a
     !DEC$ OBJCOMMENT LIB: "opengl32.lib"
  END MODULE a

  ! MOD2.F90
  !DEC$ OBJCOMMENT LIB: "graftools.lib"
  MODULE b
     !
  END MODULE b

  ! USER.F90
  PROGRAM go
     USE a      ! library search contained in MODULE a
                !   included here
     USE b      ! library search not included
  END

62.1.1.13  –  OPTIONS

  cDEC$ OPTIONS

  Affects data alignment and warnings about data alignment.  The
  OPTIONS directive takes the following form:

  cDEC$ OPTIONS option [option]
    ...
  cDEC$ END OPTIONS

    c       Is one of the following: C (or c), !, or *.

    option  Is one or both of the following:

    o /WARN=[NO]ALIGNMENT

    Controls whether warnings are issued by the compiler for
    data that is not naturally aligned.  By default, you receive
    compiler messages when misaligned data is encountered
    (/WARN=ALIGNMENT).

    o /[NO]ALIGN[=p]

    Controls whether the VSI Fortran compiler naturally aligns
    fields in derived-type and record structures and data items
    in common blocks for performance reasons, or whether the
    compiler packs those fields and data items together on
    arbitrary byte boundaries.

    p  Is a specifier with one of the following forms:

     [class =] rule
     (class = rule,...)
     ALL
     NONE

     class  Is one of the following keywords:

         COMMONS    (for common blocks)
         RECORDS    (for derived-type and record structures)
         STRUCTURES (a synonym for RECORDS)

     rule   Is one of the following keywords:

            PACKED -   Packs fields in structures or data
                       items in common blocks on arbitrary
                       byte boundaries.

            NATURAL -  Naturally aligns fields in structures
                       and data items in common blocks on
                       up to 64-bit boundaries (inconsistent
                       with the FORTRAN 77 standard).

                       If you specify NATURAL, the compiler will
                       naturally align all data in a common
                       block, including INTEGER*8, REAL*8, and
                       all COMPLEX data.

            STANDARD - Naturally aligns data items in common
                       blocks on up to 32-bit boundaries (con-
                       sistent with the FORTRAN 77 standard).

                       Note that this keyword only applies to
                       common blocks; so, you can specify
                       /ALIGN=COMMONS=STANDARD, but you cannot
                       specify /ALIGN=STANDARD.

     ALL    Is the same as /ALIGN, /ALIGN=NATURAL, and
            /ALIGN=(RECORDS=NATURAL,COMMONS=NATURAL).

     NONE   Is the same as /NOALIGN, /ALIGN=PACKED, and
            /ALIGN=(RECORDS=PACKED,COMMONS=PACKED)

  cDEC$ OPTIONS (and accompanying cDEC$ END OPTIONS) directives must
  come after OPTIONS, SUBROUTINE, FUNCTION, and BLOCK DATA statements
  (if any) in the program unit, and before statement functions or the
  executable part of the program unit.

  For performance reasons, VSI Fortran always aligns local data
  items on natural boundaries.  However, EQUIVALENCE, COMMON, RECORD,
  and STRUCTURE data declaration statements can force misaligned
  data.  If /WARN=NOALIGNMENT is specified, warnings will not be
  issued if misaligned data is encountered.

                                 NOTE

          Misaligned data significantly increases the time it
          takes  to  execute  a  program.   As  the number of
          misaligned fields encountered  increases,  so  does
          the  time  needed  to  complete  program execution.
          Specifying  cDEC$  OPTIONS/ALIGN  (or  the   /ALIGN
          compiler option) minimizes misaligned data.

  To request aligned, data in common blocks, specify
  /ALIGN=COMMONS=STANDARD (for data items up to 32 bits in length) or
  /ALIGN=COMMONS=NATURAL (for data items up to 64 bits in length), or
  place source data declarations within the common block in
  descending size order, so that each data field is naturally
  aligned.

  To request packed, unaligned data in a record structure, specify
  /ALIGN=RECORDS=PACKED, or consider placing source data declarations
  for the record so that the data is naturally aligned.

  The OPTIONS directive supersedes the /ALIGN compiler option.

  OPTIONS directives must be balanced and can be nested up to 100
  levels, for example:

     CDEC$ OPTIONS /ALIGN=PACKED         ! Group A
        declarations
     CDEC$ OPTIONS /ALIGN=RECO=NATU         ! Group B
        more declarations
     CDEC$ END OPTIONS                      ! End of Group B
        still more declarations
     CDEC$ END OPTIONS                   ! End of Group A

  Note that common blocks within Group B will be PACKED.  The CDEC$
  OPTION specification for Group B only applies to RECORDS, so
  COMMONS retains the previous setting (in this case, from the Group
  A specification).

  For more information on alignment and data sizes, see the HP
  Fortran for OpenVMS User Manual.

62.1.1.14  –  PACK

  cDEC$ PACK

  Specifies the memory starting addresses of derived-type items.  It
  takes the following form:

  cDEC$ PACK:[{1 | 2 | 4}]

    c        Is one of the following: C (or c), !, or *.

  Items of derived types and record structures are aligned in memory
  on the smaller of two sizes:  the size of the type of the item, or
  the current alignment setting.  The current alignment setting can
  be 1, 2, 4, or 8 bytes.  The default initial setting is 8 bytes
  (unless a compiler option specifies otherwise).  By reducing the
  alignment setting, you can pack variables closer together in
  memory.

  The PACK directive lets you control the packing of derived-type or
  record structure items inside your program by overriding the
  current memory alignment setting.

  For example, if CDEC$ PACK:1 is specified, all variables begin at
  the next available byte, whether odd or even.  Although this
  slightly increases access time, no memory space is wasted.  If
  CDEC$ PACK:4 is specified, INTEGER(1), LOGICAL(1), and all
  character variables begin at the next available byte, whether odd
  or even.  INTEGER(2) and LOGICAL(2) begin on the next even byte;
  all other variables begin on 4-byte boundaries.

  If the PACK directive is specified without a number, packing
  reverts to the compiler option setting (if any), or the default
  setting of 8.

  The directive can appear anywhere in a program before the
  derived-type definition or record structure definition.  It cannot
  appear inside a derived-type or record structure definition.

  For compatibility, !MS$PACK can be used in place of cDEC$ PACK.

  Examples:

  Consider the following:

  ! Use 4-byte packing for this derived type
  ! Note PACK is used outside of the derived-type definition
  !DEC$ PACK:4
  TYPE pair
    INTEGER a, b
  END TYPE
  ! revert to default or compiler option
  !DEC$ PACK:

62.1.1.15  –  PSECT

  cDEC$ PSECT /common-name/ attr [,attr,...]

  Lets you modify several characteristics of a common block.

  Specify the name of a common block, preceded and followed by a
  slash, and one of the following keywords ("attr"):

   o  ALIGN=val or ALIGN=keyword

      Specifies alignment for the common block.

      "val" must be a constant ranging from 0 through 16.

      The specified number is interpreted as a power of 2.  The value
      of the expression is the alignment in bytes.

      "keyword" is one of the following:

            Keyword        Equivalent to "val"
            BYTE               0
            WORD               1
            LONG               2
            QUAD               3
            OCTA               4
            PAGE [see note]    Alpha: 16
                               Intel: 12

        note: Range for Alpha is 0 to 16; for
              Intel, 0 to 12.

      The default is octaword alignment (4).

   o  GBL

      Specifies global scope.  This is the default scope.

   o  LCL

      Specifies local scope.  This keyword is opposite to GBL and
      cannot appear with it.

   o  [NO]MULTILANGUAGE

      Controls whether the compiler pads the size of overlaid psects
      (program sections) to ensure compatibility when the psect is
      shared by code created by other OpenVMS compilers.

      When a psect generated by a Fortran common block is overlaid
      with a psect consisting of a C structure, linker error messages
      can occur.  This is because the sizes of the psects are
      inconsistent; the C structure is padded, but the Fortran common
      block is not.

      Specifying MULTILANGUAGE ensures that VSI Fortran follows a
      consistent psect size allocation scheme that works with HP
      C psects shared across multiple images.  Psects shared in a
      single image do not have a problem.

      The default is NOMULTILANGUAGE.  This is also the default
      behavior of HP Fortran 77 and is sufficient for most
      applications.

      To specify MULTILANGUAGE for all COMMON blocks in a module, use
      compiler option /ALIGN=COMMON=MULTILANGUAGE.  (For more
      information, see the HP Fortran for OpenVMS User Manual.)

   o  [NO]SHR

      Determines whether the contents of a common block can be shared
      by more than one process.  The default is NOSHR.

   o  [NO]WRT

      Determines whether the contents of a common block can be
      modified during program execution.  The default is WRT.

  Global or local scope is significant for an image that has more
  than one cluster.  Program sections with the same name that are
  from different modules in different clusters are placed in separate
  clusters if local scope is in effect.  They are placed in the same
  cluster if global scope is in effect.

  If one program unit changes one or more characteristics of a common
  block, all other units that reference that common block must also
  change those characteristics in the same way.

  Default characteristics apply if you do not modify them with a
  PSECT directive.

  See the "OpenVMS Linker Utility Manual" for detailed information
  about default attributes of common blocks.

62.1.1.16  –  REAL

  cDEC$ REAL

  Specifies the default real kind.  It takes the following form:

  cDEC$ REAL:{4 | 8 | 16}

    c        Is one of the following: C (or c), !, or *.

  The REAL directive specifies a size of 4 (KIND=4), 8 (KIND=8), or
  16 (KIND=16) bytes for default real numbers.

  When the REAL directive is effect, all default real variables are
  of the kind specified in the directive.  Only numbers specified or
  implied as REAL without KIND are affected.

  The REAL directive can only appear at the top of a program unit.  A
  program unit is a main program, an external subroutine or function,
  a module or a block data program unit.  The directive cannot appear
  between program units, or at the beginning of internal subprograms.
  It does not affect modules invoked with the USE statement in the
  program unit that contains it.

  For compatibility, !MS$REAL can be used in place of cDEC$ REAL.

  Consider the following:

  REAL r               ! a 4-byte REAL
  WRITE(*,*) KIND(r)
  CALL REAL8( )
  WRITE(*,*) KIND(r)   ! still a 4-byte REAL
                       !  not affected by setting in subroutine
  END
  SUBROUTINE REAL8( )
     !DEC$ REAL:8
     REAL s            ! an 8-byte REAL
     WRITE(*,*) KIND(s)
  END SUBROUTINE

62.1.1.17  –  STRICT and NOSTRICT

  cDEC$ STRICT
  cDEC$ NOSTRICT

  The STRICT directive disables language features not found in the
  language standard specified on the command line (Fortran 95 or
  Fortran 90).  The NOSTRICT directive (the default) enables these
  language features.

  The "c" in cDEC$ is one of the following:  a C (or c), !, or *.

  If STRICT is specified and no language standard is specified on the
  command line, the default is to disable features not found in
  Fortran 90.

  The STRICT and NOSTRICT directives can appear only appear at the
  top of a program unit.  A program unit is a main program, an
  external subroutine or function, a module or a block data program
  unit.  The directives cannot appear between program units, or at
  the beginning of internal subprograms.  They do not affect any
  modules invoked with the USE statement in the program unit that
  contains them.

  For compatibility, !MS$STRICT and !MS$NOSTRICT can be used in place
  of cDEC$ STRICT and cDEC$ NOSTRICT.

  Examples:

  Consider the following:

  ! NOSTRICT by default
  TYPE stuff
     INTEGER(4) k
     INTEGER(4) m
     CHARACTER(4) name
  END TYPE stuff
  TYPE (stuff) examp
  DOUBLE COMPLEX cd    ! non-standard data type, no error
  cd =(3.0D0, 4.0D0)
  examp.k = 4          ! non-standard component designation,
                       !   no error
  END

  SUBROUTINE STRICTDEMO( )
     !DEC$ STRICT
      TYPE stuff
        INTEGER(4) k
        INTEGER(4) m
        CHARACTER(4) name
     END TYPE stuff
     TYPE (stuff) samp
     DOUBLE COMPLEX cd      ! ERROR
     cd =(3.0D0, 4.0D0)
     samp.k = 4             ! ERROR
  END SUBROUTINE

62.1.1.18  –  TITLE and SUBTITLE

  cDEC$ TITLE string
  cDEC$ SUBTITLE string

  The TITLE directive lets you specify a string and place it in the
  title field of a listing header.  Similarly, SUBTITLE lets you
  place a specified string in the subtitle field of a listing header.

  The "string" is a character constant containing up to 31 printable
  characters.

  To enable TITLE and SUBTITLE directives, you must specify the /LIST
  compiler option.

  When TITLE or SUBTITLE appears on a page of a listing file, the
  specified string appears in the listing header of the following
  page.

  If two or more of either directive appear on a page, the last
  directive is the one in effect for the following page.

  If either directive does not specify a string, no change occurs in
  the listing file header.

  For compatibility, !MS$TITLE:  and !MS$SUBTITLE:  can be used in
  place of cDEC$ TITLE and cDEC$ SUBTITLE.

62.1.1.19  –  UNROLL

  cDEC$ UNROLL

  The UNROLL directive tells the compiler's optimizer how many times
  to unroll a DO loop.  It can only be applied to iterative DO loops.

  The UNROLL directive takes the following form:

  cDEC$ UNROLL [(n)]

    c    Is one of the following: C (or c), !, or *.
    n    Is an integer constant.  The range of "n" is 0 through 255.

  The UNROLL directive must precede the DO statement for each DO loop
  it affects.  No source code lines, other than the following, can be
  placed between the UNROLL directive statement and the DO statement:

   o  An IVDEP directive

   o  Placeholder lines

   o  Comment lines

   o  Blank lines

  If "n" is specified, the optimizer unrolls the loop "n" times.  If
  "n" is omitted, or if it is outside the allowed range, the
  optimizer picks the number of times to unroll the loop.

  The UNROLL directive overrides any setting of loop unrolling from
  the command line.

62.2  –  ACCEPT

  Transfers input data to internal storage from external records
  accessed under the sequential mode of access.  It takes one of the
  following forms:

      Formatted           ACCEPT f[,iolist]
      List-directed       ACCEPT *[,iolist]
      Namelist            ACCEPT n

      f       Is a format specifier not prefaced by FMT=.

      iolist  Is a simple I/O list element or an implied-DO list.

      *       Specifies list-directed formatting (can be specified
              as FMT=*).

      n       The nonkeyword form of a namelist specifier.

  The control-list parameters are "f," "*" (or FMT=*), and "n".  The
  I/O list parameter is "iolist".

  The formatted ACCEPT statement transfers data from your terminal to
  internal storage.  The access mode is sequential.

  The list-directed ACCEPT statement translates the data from
  character to binary format according to the data types of the
  variables in the I/O list.

  The namelist ACCEPT statement translates the data from character to
  binary format according to the data types of the list entities in
  the corresponding NAMELIST statement.

  Also see the READ Statement.

62.3  –  ALLOCATABLE

  Specifies that an array is an allocatable array with a deferred
  shape.  The shape of an allocatable array is determined when an
  ALLOCATE statement is executed, dynamically allocating space for
  the array.

  The ALLOCATABLE attribute can be specified in a type declaration
  statement or an ALLOCATABLE statement, and takes one of the
  following forms:

  Type Declaration Statement:

   type, [att-ls,] ALLOCATABLE [,att-ls] :: a[(d-spec)] [,a[(d-spec)]]...

  Statement:

   ALLOCATABLE [::] a[(d-spec)] [,a[(d-spec)]]...

     type        Is a data type specifier.

     att-ls      Is an optional list of attribute specifiers.

     a           Is the name of the allocatable array; it must
                 not be a dummy argument or function result.

     d-spec      Is a deferred-shape specification (: [,:]...).
                 Each colon represents a dimension of the array.

  If the array is given the DIMENSION attribute elsewhere in the
  program, it must be declared as a deferred-shape array.

  When the allocatable array is no longer needed, it can be
  deallocated by execution of a DEALLOCATE statement.

  During program execution, the allocation status of an allocatable
  array is one of the following:

   o  Not currently allocated

      The array was never allocated or the last operation performed
      on it was a deallocation.  Deallocation is performed:

       -  Explicitly, by using a DEALLOCATE statement.

       -  By default, when the allocatable array is a local variable
          of a procedure that does not have the SAVE attribute and is
          terminated by an END or RETURN statement.

      An array that is not currently allocated must not be referenced
      or defined.

   o  Currently allocated

      The array was allocated by an ALLOCATE statement.  Such an
      array can be referenced, defined, or deallocated.

  An allocatable array cannot be specified in a COMMON, EQUIVALENCE,
  DATA, or NAMELIST statement.

  Allocatable arrays are not saved by default.  If you want to retain
  the values of an allocatable array across procedure calls, you must
  specify the SAVE attribute for the array.

  The ALLOCATABLE attribute is compatible with the AUTOMATIC,
  DIMENSION (with deferred shape), PRIVATE, PUBLIC, SAVE, STATIC,
  TARGET, and VOLATILE attributes.

  EXAMPLES:

  The following example shows a type declaration statement specifying
  the ALLOCATABLE attribute:

     REAL, ALLOCATABLE :: Z(:, :, :)

  The following is an example of the ALLOCATABLE statement:

     REAL A, B(:)
     ALLOCATABLE :: A(:,:), B

62.4  –  ALLOCATE

  Dynamically creates storage for allocatable arrays and pointer
  targets.  The storage space allocated is uninitialized.

  The ALLOCATE statement takes the following form:

    ALLOCATE (object [(s-spec[,s-spec...])]
              [,object[(s-spec[,s-spec...])]]...[,STAT=sv])

      object  Is the object to be allocated.  It is a variable
              name or structure component, and must be a pointer
              or allocatable array.  The object can be of type
              character with zero length.

      s-spec  Is a shape specification in the form
              [lower-bound:]upper-bound. Each bound must be a
              scalar integer expression. The number of shape
              specifications must be the same as the rank of
              the "object".

      sv      Is a scalar integer variable in which the status
              of the allocation is stored.

  A bound in "s-spec" must not be an expression containing an array
  inquiry function whose argument is any allocatable object in the
  same ALLOCATE statement; for example, the following is not
  permitted:

     INTEGER ERR
     INTEGER, ALLOCATABLE :: A(:), B(:)
     ...
     ALLOCATE(A(10:25), B(SIZE(A)), STAT=ERR)  ! A is invalid as an argu-
                                               !   ment to function SIZE

  If a STAT variable is specified, it must not be allocated in the
  ALLOCATE statement in which it appears.  If the allocation is
  successful, the variable is set to zero.  If the allocation is not
  successful, an error condition occurs, and the variable is set to a
  positive integer value (representing the run-time error).  If no
  STAT variable is specified and an error condition occurs, program
  execution terminates.

  To release the storage for an allocated array, use the DEALLOCATE
  statement.

  To determine whether an allocatable array is currently allocated,
  use the ALLOCATED intrinsic function.

  To determine whether a pointer is currently associated with a
  target, use the ASSOCIATED intrinsic function.

  For information on allocation of allocatable arrays and pointer
  targets, see the HP Fortran for OpenVMS Language Reference
  Manual.

  EXAMPLES:

  The following is an example of the ALLOCATE statement:

     INTEGER J, N, ALLOC_ERR
     REAL, ALLOCATABLE :: A(:), B(:,:)
     ...
     ALLOCATE(A(0:80), B(-3:J+1, N), STAT = ALLOC_ERR)

62.5  –  ASSIGN

  Assigns the value of a statement label to an integer variable.
  This feature has been deleted in Fortran 95; it was an obsolescent
  feature in Fortran 90.  VSI Fortran fully supports features
  deleted in Fortran 95.

  Statement format:

     ASSIGN s TO v

     s  Is the label of an executable statement or a
        FORMAT statement.  You must specify the label
        as an unsigned integer (from 1-5 characters
        long, using digits 0-9).

     v  Is an integer variable.

  When the value of a statement label is assigned to an integer
  variable:  the variable can then be used as a transfer destination
  in a subsequent assigned GOTO statement or as a format specifier in
  a formatted I/O statement.  The ASSIGN statement must be in the
  same program unit as and must be executed before the statement(s)
  in which the assigned variable is used.

62.6  –  Assignment

  Assigns the value of the expression to the variable.
  Arithmetic/Logical/Character assignment takes the form:

     v = e

     v  Is the name of a scalar or array of intrinsic
        or derived type (with no defined assignment).
        The array cannot be an assumed-size array, and
        neither the scalar nor the array can be declared
        with the PARAMETER or INTENT(IN) attribute.

     e  Is an expression of intrinsic type or the same
        derived type as "v". Its shape must conform with
        "v". If necessary, it is converted to the same kind
        type as "v".

  Before a value is assigned to the variable, the expression part of
  the assignment statement and any expressions within the variable
  are evaluated.  No definition of expressions in the variable can
  affect or be affected by the evaluation of the expression part of
  the assignment statement.

  NOTE:  When the run-time system assigns a value to a scalar integer
  or character variable and the variable is shorter than the value
  being assigned, the assigned value may be truncated and significant
  bits (or characters) lost.  This truncation can occur without
  warning, and can cause the run-time system to pass incorrect
  information back to the program.

  If the variable is a pointer, it must be associated with a
  definable target.  The shape of the target and expression must
  conform and their types and kind type parameters must match.

62.6.1  –  Conversion Rules

  The following tables summarize the conversion rules for assignment
  statements.

  Table 1: Conversion Rules for Integer, Logical, or Real Expressions
  +-------------+------------------------------------------------+
  |Scalar       |  Expression (E)                                |
  |Memory       |-------------------------------------------------
  |Reference (V)|  integer, logical, or real                     |
  +-------------+------------------------------------------------+
  | integer or  |  V=INT(E)                                      |
  | logical     |                                                |
  +-------------+------------------------------------------------+
  | REAL        |  V=REAL(E)                                     |
  | (KIND=4)    |                                                |
  +-------------+------------------------------------------------+
  | REAL        |  V=DBLE(E)                                     |
  | (KIND=8)    |                                                |
  +-------------+------------------------------------------------+
  | REAL        |  V=QEXT(E)                                     |
  | (KIND=16)   |                                                |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(REAL(E), 0.0)                         |
  | (KIND=4)    |                                                |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(DBLE(E), 0.0)                         |
  | (KIND=8)    |                                                |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(QEXT(E), 0.0)                         |
  | (KIND=16)   |                                                |
  +-------------+------------------------------------------------+

  Table 2: Conversion Rules for Complex Expressions
  +-------------+------------------------------------------------+
  |Scalar       |  Expression (E)                                |
  |Memory       |-------------------------------------------------
  |Reference (V)|  complex                                       |
  +-------------+------------------------------------------------+
  | integer or  |  V=INT(REAL(E))                                |
  | logical     |  Imaginary part of E is not used.              |
  +-------------+------------------------------------------------+
  | REAL        |  V=REAL(REAL(E))                               |
  | (KIND=4)    |  Imaginary part of E is not used.              |
  +-------------+------------------------------------------------+
  | REAL        |  V=DBLE(REAL(E))                               |
  | (KIND=8)    |  Imaginary part of E is not used.              |
  +-------------+------------------------------------------------+
  | REAL        |  V=QEXT(REAL(E))                               |
  | (KIND=16)   |  Imaginary part of E is not used.              |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(REAL(REAL(E)), REAL(AIMAG(E)))        |
  | (KIND=4)    |                                                |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(DBLE(REAL(E)), DBLE(AIMAG(E)))        |
  | (KIND=8)    |                                                |
  +-------------+------------------------------------------------+
  | COMPLEX     |  V=CMPLX(QEXT(REAL(E)), QEXT(AIMAG(E)))        |
  | (KIND=16)   |                                                |
  +-------------+------------------------------------------------+

62.7  –  AUTOMATIC and STATIC

  Control the storage allocation of variables in subprograms.

  The AUTOMATIC and STATIC attributes can be specified in a type
  declaration statement or an AUTOMATIC or STATIC statement, and take
  one of the following forms:

  Type Declaration Statement:

    type, [att-ls,] AUTOMATIC [,att-ls] ::   v [,v]...
    type, [att-ls,] STATIC    [,att-ls] ::   v [,v]...

  Statement:

     AUTOMATIC  v [,v]...
     STATIC     v [,v]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     v         Is the name of a variable or an array
               specification. It can be of any type.

  AUTOMATIC and STATIC declarations only affect how data is allocated
  in storage, as follows:

   o  A variable declared as AUTOMATIC and allocated in memory
      resides in the stack storage area.

   o  A variable declared as STATIC and allocated in memory resides
      in the static storage area.

  If you want to retain definitions of variables upon reentry to
  subprograms, you must use the SAVE attribute.

  Automatic variables can reduce memory use because only the
  variables currently being used are allocated to memory.

  Automatic variables allow possible recursion.  With recursion, a
  subprogram can call itself (directly or indirectly), and resulting
  values are available upon a subsequent call or return to the
  subprogram.  For recursion to occur, RECURSIVE must be specified in
  one of the following ways:

   o  As a keyword in a FUNCTION or SUBROUTINE statement

   o  As a compiler option

   o  As an option in an OPTIONS statement

  By default, the compiler allocates local variables of non-recursive
  subprograms, except for allocatable arrays, in the static storage
  area.  The compiler may choose to allocate a variable in temporary
  (stack or register) storage if it notices that the variable is
  always defined before use.  Appropriate use of the SAVE attribute
  can prevent compiler warnings if a variable is used before it is
  defined.

  To change the default for variables, specify them as AUTOMATIC or
  specify RECURSIVE (in one of the ways mentioned above).

  To override any compiler option that may affect variables,
  explicitly specify the variables as AUTOMATIC or STATIC.

                                 NOTE

          Variables that are data-initialized, and  variables
          in  COMMON  and  SAVE statements are always static.
          This is regardless of  whether  a  compiler  option
          specifies recursion.

  A variable cannot be specified as AUTOMATIC or STATIC more than
  once in the same scoping unit.

  If the variable is a pointer, AUTOMATIC or STATIC apply only to the
  pointer itself, not to any associated target.

  Some variables cannot be specified as AUTOMATIC or STATIC.  The
  following table shows these restrictions:

  Variable                    AUTOMATIC       STATIC
  --------                    ---------       ------
  Dummy argument                No              No
  Automatic object              No              No
  Common block item             No              Yes
  Use-associated item           No              No
  Function result               No              No
  Component of a derived type   No              No

  A variable can be specified with both the STATIC and SAVE
  attributes.

  If a variable is in a module's outer scope, it can be specified as
  STATIC, but not as AUTOMATIC.

  The AUTOMATIC attribute is compatible with the ALLOCATABLE,
  DIMENSION, POINTER, TARGET, and VOLATILE attributes.

  The STATIC attribute is compatible with the ALLOCATABLE, DIMENSION,
  POINTER, PRIVATE, PUBLIC, SAVE, TARGET, and VOLATILE attributes.

62.8  –  BACKSPACE

  Positions a sequential file at the beginning of the preceding
  record, making it available for subsequent I/O processing.  The
  file must be on disk or tape.  Statement format:

      BACKSPACE ([UNIT=]io-unit [,ERR=label] [,IOSTAT=i-var])
      BACKSPACE io-unit

      io-unit  Is an integer variable or constant specifying the
               logical unit number of the file, optionally prefaced
               by UNIT=.  UNIT= is required if unit is not the
               first I/O specifier.

      label    Is the label of a statement that receives control
               if an error occurs, prefaced by ERR=.

      i-var    Is a scalar integer variable to which the completion
               status of the I/O operation is returned, prefaced
               by IOSTAT= (positive if an error occurs, zero if
               no error occurs).

  A BACKSPACE statement should not be specified for a file that is
  open for direct, append, or keyed access, because record "n" is not
  available to the RMS I/O system.

  If a file is already positioned at the beginning of a file, a
  BACKSPACE statement has no effect.

62.9  –  BLOCK_DATA

  Begins a block data program unit.  Statement format:

     BLOCK DATA [nam]
       [stmts]
     END [BLOCK DATA [nam]]

     nam   Is the symbolic name used to identify the block.

     stmts Is one or more of the following statements:

            COMMON        PARAMETER  Type declaration
            DATA          POINTER    Derived-type definition
            DIMENSION     RECORD     Record structure declaration
            EQUIVALENCE   SAVE
            IMPLICIT      TARGET
            INTRINSIC     USE

     Note: A type declaration cannot contain the ALLOCATABLE,
           EXTERNAL, INTENT, OPTIONAL, PRIVATE, or PUBLIC
           attributes.

  A BLOCK DATA statement and its associated specification statements
  are a special kind of program unit, called a block data subprogram.

  A block data program unit need not be named, but there can only be
  one unnamed block data program unit in an executable program.

  A block data subprogram must not contain any executable statements.

  As with other types of program units, the last statement in a block
  data subprogram must be an END statement.  If a name follows the
  END statement, it must be the same as the name specified in the
  BLOCK DATA statement.

  Within a block data subprogram, if a DATA statement initializes any
  entity in a named common block, the subprogram must have a complete
  set of specification statements that establishes the common block.
  However, all of the entities in the block do not have to be
  assigned initial values in a DATA statement.

  One block data subprogram can establish and define initial values
  for more than one common block.

  The name of a block data subprogram can appear in the EXTERNAL
  statement of a different program unit to force a search of object
  libraries for the BLOCK DATA program unit at link time.

62.10  –  CALL

  Transfers control and passes arguments to a subprogram.  Statement
  format:

     CALL sub[([a][,[a]]...)]

     sub  Is the name of the subroutine subprogram or other
          external procedure, or a dummy argument associated
          with a subroutine subprogram or other external
          procedure.

     a    Is an actual argument optionally preceded by [keyword=],
          where "keyword" is the name of a dummy argument in the
          explicit interface for the subroutine.  The keyword is
          assigned a value when the  procedure is invoked.

  Each actual argument must be a variable, an expression, the name of
  a procedure, or an alternate return specifier.  (It must not be the
  name of an internal procedure, statement function, or the generic
  name of a procedure.)

  An alternate return specifier is an asterisk (*) or ampersand (&)
  followed by the label of an executable branch target statement in
  the same scoping unit as the CALL statement.

                                 NOTE

          An alternate return is an  obsolescent  feature  in
          Fortran  95  and  Fortran 90.  VSI Fortran fully
          supports this feature.

  When the CALL statement is executed, any expressions in the actual
  argument list are evaluated, then control is passed to the first
  executable statement or construct in the subroutine.  When the
  subroutine finishes executing, control returns to the next
  executable statement following the CALL statement, or to a
  statement identified by an alternate return label (if any).

  If an argument list appears, each actual argument is associated
  with the corresponding dummy argument by its position in the
  argument list or by the name of its keyword.  The arguments must
  agree in type and kind type parameters.

  If positional arguments and argument keywords are specified, the
  argument keywords must appear last in the actual argument list.

  If a dummy argument is optional, the actual argument can be
  omitted.

  An actual argument associated with a dummy procedure must be the
  specific name of a procedure, or be another dummy procedure.
  Certain specific intrinsic function names must not be used as
  actual arguments. (See the HP Fortran for OpenVMS Language
  Reference Manual.)

  You can use a CALL statement to invoke a function as long as the
  function is not one of the following types:

   o  REAL(8)

   o  REAL(16)

   o  COMPLEX(8)

   o  COMPLEX(16)

   o  CHARACTER

  EXAMPLES:

  The following example shows a subroutine with argument keywords:

    PROGRAM KEYWORD_EXAMPLE
      INTERFACE
        SUBROUTINE TEST_C(I, L, J, KYWD2, D, F, KYWD1)
        INTEGER I, L(20), J, KYWD1
        REAL, OPTIONAL :: D, F
        COMPLEX KYWD2
        ...
        END SUBROUTINE TEST_C
      END INTERFACE
      INTEGER I, J, K
      INTEGER L(20)
      COMPLEX Z1
      CALL TEST_C(I, L, J, KYWD1 = K, KYWD2 = Z1)
      ...

  The first three actual arguments are associated with their
  corresponding dummy arguments by position.  The argument keywords
  are associated by keyword name, so they can appear in any order.

  Note that the interface to subroutine TEST has two optional
  arguments that have been omitted in the CALL statement.

62.11  –  CASE

  Conditionally executes one block of constructs or statements
  depending on the value of a scalar expression in a SELECT CASE
  statement.  Statement format:

    [name :] SELECT CASE (expr)
    [CASE (case-value [,case-value]...) [name]
      block]...
    [CASE DEFAULT [name]
      block]
    END SELECT [name]

    name   Is the name of the CASE construct.

    expr   Is an expression of type integer, logical, or
           character (enclosed in parentheses). Evaluation
           of this expression results in a value called
           the case index.

    case-value  Is one or more compile-time constant expressions
                of type integer, logical, or character (enclosed
                in parentheses).  Each "case-value" must be of the
                same data type as "expr". If the type is character,
                "case-value" and "expr" can be of different lengths.

                Integer and character expressions can be expressed
                as a range of case values, taking one of the following
                forms:

                low:high
                low:
                :high

                Case values must not overlap.

    block  Is a sequence of zero or more statements or
           constructs.

  If a construct name is specified in a SELECT CASE statement, the
  same name must appear in the corresponding END SELECT statement.
  The same construct name can optionally appear in any CASE statement
  in the construct.

  The case expression ("expr") is evaluated first.  The resulting
  case index is compared to the case values to find a matching value
  (there can only be one).  When a match occurs, the block following
  the matching case value is executed and the construct terminates.

  The following rules determine whether a match occurs:

   o  When the case value is a single value (no colon appears), a
      match occurs as follows:

        Data Type              A Match Occurs If:
        ---------              ---------------------------
        Logical                case-index .EQV. case-value
        Integer or character   case-index ==  case-value

   o  When the case value is a range of values (a colon appears), a
      match depends on the range specified, as follows:

        Range       A Match Occurs If:
        -----       -------------------------
        low:        case-index >= low
        :high       case-index <= high
        low:high    low <= case-index <= high

  The following are all valid case values:

     CASE (1, 4, 7, 11:14, 22)      ! Individual values as specified:
                                    !     1, 4, 7, 11, 12, 13, 14, 22
     CASE (:-1)                     ! All values less than zero
     CASE (0)                       ! Only zero
     CASE (1:)                      ! All values above zero

  If no match occurs but a CASE DEFAULT statement is present, the
  block following that statement is executed and the construct
  terminates.

  If no match occurs and no CASE DEFAULT statement is present, no
  block is executed, the construct terminates, and control passes to
  the next executable statement or construct following the END SELECT
  statement.

  The following are examples of CASE constructs:

    INTEGER FUNCTION STATUS_CODE (I)
      INTEGER I
      CHECK_STATUS: SELECT CASE (I)
      CASE (:-1)
        STATUS_CODE = -1
      CASE (0)
        STATUS_CODE = 0
      CASE (1:)
        STATUS_CODE = 1
      END SELECT CHECK_STATUS
    END FUNCTION STATUS_CODE

    SELECT CASE (J)
    CASE (1, 3:7, 9)    ! Values: 1, 3, 4, 5, 6, 7, 9
      CALL SUB_A
    CASE DEFAULT
      CALL SUB_B
    END SELECT

  The following three examples are equivalent:

    1. SELECT CASE (ITEST .EQ. 1)
       CASE (.TRUE.)
         CALL SUB1 ()
       CASE (.FALSE.)
         CALL SUB2 ()
       END SELECT

    2. SELECT CASE (ITEST)
       CASE DEFAULT
         CALL SUB2 ()
       CASE (1)
         CALL SUB1 ()
       END SELECT

    3. IF (ITEST .EQ. 1) THEN
         CALL SUB1 ()
       ELSE
         CALL SUB2 ()
       END IF

62.12  –  CLOSE

  Closes a file.  Statement format:

     CLOSE ([UNIT=]io-unit[,p][,ERR=label][,IOSTAT=i-var])

     io-unit Is an integer variable or constant specifying the
             logical unit number of the file, optionally prefaced
             by UNIT=.  UNIT= is required if unit is not the
             first I/O specifier.

     p       Is the disposition of the file after closing, prefaced
             by STATUS=, DISPOSE= or DISP=.  Dispositions are as
             follows:

             'KEEP'             Retains the file.
                               *DEFAULT FOR ALL BUT SCRATCH FILES*
             'SAVE'             Retains the file.
             'DELETE'           Deletes the file (unless OPEN(READONLY)
                                is specified).
                               *DEFAULT FOR SCRATCH FILES*
             'PRINT'            Submits the file as a print job.
             'PRINT/DELETE'     Submits the file as a print job,
                                then deletes it.
             'SUBMIT'           Submits the file as a batch job.
             'SUBMIT/DELETE'    Submits the file as a batch job,
                                then deletes it.

      label  Is the label of an executable statement that
             receives control if an error occurs.

      i-var  Is a scalar integer variable. (Returns a
             zero if no error condition exists or a positive
             integer if an error condition exists.)

  The CLOSE statement specifiers can appear in any order.  An I/O
  unit must be specified, but the UNIT specifier is optional if the
  unit specifier is the first item in the I/O control list.

  The status specified in the CLOSE statement supersedes the status
  specified in the OPEN statement, except that a file opened as a
  scratch file cannot be saved, printed, or submitted, and a file
  opened for read-only access cannot be deleted.

  If a CLOSE statement is specified for a unit that is not open, it
  has no effect.

62.13  –  COMMON

  Defines one or more contiguous blocks of storage shared among
  separate subprograms.  You can define the same common block in
  different program units of your program.  The first COMMON
  statement in a program unit to name a common block defines it;
  subsequent COMMON statements that name the block reference it.  You
  can leave one common block (the "blank" common block) unnamed.

  Statement format:

     COMMON [/[cb]/] nlist[[,] /[cb] /nlist]...

     cb     Is a symbolic name that identifies the common block.

     nlist  Is one or more names of variables that identify items in
            the common block. The variable must not be a dummy
            argument, allocatable array, automatic object, function,
            function result, or entry to a procedure.

            It must not have the PARAMETER attribute.  If an object
            of derived type is specified, it must be a sequence type.

  A common block is a global entity, and must not have the same name
  as any other global entity in the program, such as a subroutine or
  function.

  Any common block name, blank or otherwise, can appear more than
  once in one or more COMMON statements in a program unit.  The list
  following each successive appearance of the same common block name
  is treated as a continuation of the list for the block associated
  with that name.

  A variable can appear in only one common block within a scoping
  unit.

  If an array is specified, it can be followed by an explicit-shape
  array specification.  The array must not have the POINTER attribute
  and each bound in the specification must be a constant
  specification expression.

  A pointer can only be associated with pointers of the same type,
  kind type parameters, and rank.

  Nonpointer variables can be associated if they are of different
  numeric type.

  A common block can have the same name as a variable, array, record,
  structure, or field.  However, in a program with one or more
  program units, a common block cannot have the same name as a
  function, subroutine, or entry name in the executable program.

  When common blocks from different program units have the same name,
  they share the same storage area when the units are combined into
  an executable program.

  Entities are assigned storage in common blocks on a one-for-one
  basis.  Thus, the entities assigned by a COMMON statement in one
  program unit should agree with the data type of entities placed in
  a common block by another program unit; for example, consider a
  program unit containing the following statement:

     COMMON CENTS

  Consider another program unit containing the following statements:

     INTEGER*2 MONEY
     COMMON MONEY

  When these program units are combined into an executable program,
  incorrect results can occur if the 2-byte integer variable MONEY is
  made to correspond to the lower-addressed two bytes of the real
  variable CENTS.

  Named common blocks must be declared to have the same size in each
  program unit.  Blank common can have different lengths in different
  program units.

62.14  –  CONTAINS

  Separates the body of a main program, module, or external
  subprogram from any internal or module procedures it may contain.
  It is not executable.  Statement format:

     CONTAINS

62.15  –  CONTINUE

  Transfers control to the next executable statement.  The CONTINUE
  statement is used primarily as the terminal statement of a labeled
  DO loop when that loop would otherwise end improperly with a GOTO,
  arithmetic IF, or other prohibited control statement.  Statement
  format:

     CONTINUE

  The statement by itself does nothing and has no effect on program
  results or execution sequence.

62.16  –  CYCLE

  Terminates the current execution cycle of the innermost (or named)
  DO construct.  Statement format:

     CYCLE [name]

     name   Is the name of the DO construct.

  When a CYCLE statement is executed, the following occurs:

  1.  The current execution cycle of the named (or innermost) DO
      construct is terminated.

      If a DO construct name is specified, the CYCLE statement must
      be within the range of that construct.

  2.  The iteration count (if any) is decremented by 1.

  3.  The DO variable (if any) is incremented by the value of the
      increment parameter (if any).

  4.  A new iteration cycle of the DO construct begins.

  Any executable statements following the CYCLE statement (including
  a labeled terminal statement) are not executed.

  A CYCLE statement can be labeled, but it cannot be used to
  terminate a DO construct.

  The following example shows the CYCLE statement:

  DO I =1, 10
    A(I) = C + D(I)
    IF (D(I) < 0) CYCLE    ! If true, the next statement is omitted
    A(I) = 0               ! from the loop and the loop is tested again.
  END DO

62.17  –  DATA

  Assigns values to variables at compile time.  The values within the
  backslashes are assigned to the preceding variables left to right;
  the number of values must equal the number of variable elements.
  Statement format:

     DATA nlist/clist/[[,] nlist/clist]...

     nlist  Is a list combining any combination of variables
            and implied-DO lists, separated by commas.  RECORD
            structures are not allowed in this list.

            Subscript expressions and expressions in substring
            references must be initialization expressions.

            An implied-DO list in a DATA statement takes the
            following form:

            (dlist, i = n1,n2[,n3])

            dlist     Is a list of one or more array elements,
                      character substrings, scalar structure
                      components or implied-DO lists, separated
                      by commas.

            i         Is the name of a scalar integer variable.

            n1,n2,n3  Are scalar integer expressions.  The
                      expression can contain implied-DO variables
                      of other implied-DO lists that have this
                      implied-DO list within their ranges.

     clist  Is a list of constants separated by commas; "clist"
            constants take one of the following forms:

            c OR n*c

            c  Is a constant or the symbolic name of a constant.

            n  Defines the number of times the same value is to
               be assigned to successive entities in the associated
               "nlist"; "n" is a nonzero, unsigned integer constant
               or the symbolic name of an unsigned integer constant.

  The DATA statement assigns the constant values in each "clist" to
  the entities in the preceding "nlist", from left to right, as they
  appear in the "nlist".  The number of constants must equal the
  number of entities in the "nlist".

  When an unsubscripted array name appears in a DATA statement,
  values are assigned to every element of that array in the order of
  subscript progression.  The associated constant list must contain
  enough values to fill the array.

  The following objects cannot be initialized in a DATA statement:

   o  A dummy argument

   o  A function

   o  A function result

   o  An automatic object

   o  An allocatable array

   o  A variable that is accessible by use or host association

   o  A variable in a named common block (unless the DATA statement
      is in a block data program unit)

   o  A variable in blank common

  For details, see the HP Fortran for OpenVMS Language Reference
  Manual.

62.18  –  DEALLOCATE

  Frees storage allocated for allocatable arrays and pointer targets.
  It takes the following form:

    DEALLOCATE (object [,object]...[,STAT=sv])

      object  Is a structure component or the name of a variable,
              and must be a pointer or allocatable array.

      sv      Is a scalar integer variable in which the status
              of the deallocation is stored.

  If a STAT variable is specified, it must not be deallocated in the
  DEALLOCATE statement in which it appears.  If the deallocation is
  successful, the variable is set to zero.  If the deallocation is
  not successful, an error condition occurs, and the variable is set
  to a positive integer value (representing the run-time error).  If
  no STAT variable is specified and an error condition occurs,
  program execution terminates.

  It is recommended that all explicitly allocated storage be
  explicitly deallocated when it is no longer needed.

  For information on deallocation of allocatable arrays and pointer
  targets, see the HP Fortran for OpenVMS Language Reference Manual.

  EXAMPLES:

  The following is an example of the DEALLOCATE statement:

     INTEGER ALLOC_ERR
     REAL, ALLOCATABLE :: A(:), B(:,:)
     ...
     ALLOCATE (A(10), B(-2:8,1:5))
     ...
     DEALLOCATE(A, B, STAT = ALLOC_ERR)

62.19  –  DECODE

  See COMPATIBILITY_FEATURES in this Help file.

62.20  –  DEFINE_FILE

  See COMPATIBILITY_FEATURES in this Help file.

62.21  –  DELETE

  Deletes a record from an indexed or a relative file.  Statement
  format:

  Format -- Indexed:

     DELETE ([UNIT=]io-unit [,ERR=label] [,IOSTAT=i-var])

     Deletes the current record (last record  read)  from  an  indexed
     file.

  Format -- Relative:

     DELETE ([UNIT=]io-unit [,REC=r] [,ERR=label] [,IOSTAT=i-var])
     DELETE (io-unit'r [,ERR=label] [,IOSTAT=i-var])

     Deletes the specified record from a relative file.

     io-unit   Is the logical unit specifier, optionally prefaced
               by UNIT=.  UNIT= is required if unit is not the first
               I/O specifier.

     r         Is a record position specifier, prefaced by REC=.

     io-unit'r Is a unit and a record position specifier, not
               prefaced by REC=.

     label     Is the label of a statement to which control is
               transferred if an error occurs, prefaced by ERR=.

     i-var     Is an I/O status specifier, prefaced by IOSTAT=.
               (Returns a zero if no error condition exists or
               a positive integer if an error condition exists.)

  The forms of the DELETE statement with relative files are direct
  access deletes.  These forms delete the record specified by the
  number "r".

  The DELETE statement logically removes the appropriate record from
  the specified file by locating the record and marking it as a
  deleted record.  A new record can be written into that position.

  If REC=r is omitted, the current record is deleted.  When the
  direct access record is deleted, any associated variable is set to
  the next record number.

62.22  –  DIMENSION

  Specifies that an object is an array, and defines the shape of the
  array.

  The DIMENSION attribute can be specified in a type declaration
  statement or a DIMENSION statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] DIMENSION (spec) [,att-ls] :: a[(spec)] [,a[(spec)]]...

  Statement:

   DIMENSION [::] a(spec) [,a(spec)]...

     type        Is a data type specifier.

     att-ls      Is an optional list of attribute specifiers.

     spec        Is an array specification.  In a type declaration,
                 any array specification following an array overrides
                 any array specification following DIMENSION.

     a           Is the symbolic name of the array.  If the array
                 is not defined in a type declaration statement, the
                 array takes an implicit data type.

  An array can also be declared in the following statements:
  ALLOCATABLE, POINTER, TARGET, and COMMON.

  The DIMENSION attribute is compatible with the ALLOCATABLE,
  AUTOMATIC, INTENT, OPTIONAL, POINTER, PRIVATE, PUBLIC, SAVE,
  STATIC, TARGET, and VOLATILE attributes.

  See also DATA ARRAYS in this Help file.

62.23  –  DO

  Executes a block of statements repeatedly until the value of a
  control variable equals, exceeds, or is less than the terminal
  value, according to the control variable specified in the DO loop
  (indexed DO).  The block of statements starts immediately following
  the DO statement.

  You can transfer control out of a DO loop, but not out of a
  parallel DO loop.

  Statement format:

      [name:] DO [s][,] v = e1,e2[,e3]
         block
      [s] term-stmt

      name Is the name of the DO construct.

      s    Is an optional label of an executable statement
           which follows the DO statement in the same program unit.
           The label designates the last statement of the DO
           loop. If omitted, an END DO statement is required.

      v    Is the control variable; an integer or real variable
           (it cannot be a record field).  You cannot modify
           the control variable inside the DO loop.

      e1   Is the initial value of the control variable; an
           integer or real value.

      e2   Is the terminal value of the control variable; an
           integer or real value.

      e3   Is the value by which to increment the control
           variable after each execution of the DO loop;
           integer or real value.  It cannot be 0.
           The default of e3 is 1.

      block Is a sequence of zero or more statements or
            constructs.

      term-stmt Is the terminal statement for the construct.

  If the iteration count (the number of executions of the DO range)
  is zero or negative, the body of the loop is not executed.  If the
  /NOF77 compiler option is specified and the iteration count is zero
  or negative, the body of the loop is executed once.

  If a DO statement does not contain a terminal statement label, the
  construct must be terminated by an END DO statement.  If it does
  contain a terminal statement label, the END DO is optional.

  If a construct name is specified in a block DO statement, the same
  name must appear in the terminal END DO statement.  If no construct
  name is specified in the block DO statement, no name can appear in
  the terminal END DO statement.  The construct name must be a unique
  identifier in the program unit.

  The following cannot be terminal statements for DO constructs:
  CYCLE, DO, END (for a program unit), EXIT, GO TO, IF, RETURN, or
  STOP.

62.24  –  DO_WHILE

  Executes a block of statements repeatedly until the value of a
  logical expression is false.  Statement format:

     DO [s][,] WHILE (e)

     s  Is the label of an executable statement which follows
        the DO statement in the same program unit. The label
        designates the last statement of the DO loop. If
        omitted, an END DO statement is required.

     e  Is a logical expression.  You can reference and modify
        the variable elements of the expression within the
        DO loop.

  You can transfer control out of a DO WHILE loop but not into a loop
  from elsewhere in the program.

  The DO WHILE statement tests the logical expression at the
  beginning of each execution of the loop, including the first.  If
  the value of the expression is true, the statements in the body of
  the loop are executed; if the expression is false, control
  transfers to the statement following the loop.

  If no label appears in the DO WHILE statement, the DO WHILE loop
  must be terminated with an END DO statement.

62.25  –  ELSE

  Executes a block of statements if no preceding statement block in a
  block IF construct was executed.  The block of statements starts
  immediately following the ELSE statement.  The block is terminated
  by an END IF statement.  Statement format:

     ELSE

62.26  –  ELSE_IF

  Executes a block of statements if no preceding statement block in a
  block IF construct was executed and if the value of a logical
  expression is true.  The block of statements starts immediately
  following the ELSE IF statement.  The block is terminated by
  another ELSE IF statement, an ELSE statement, or an END IF
  statement.  Statement format:

     ELSE IF (e) THEN

     Where e represents a logical expression.

62.27  –  ELSEWHERE

  An optional statement in a WHERE construct.  Statement format:

     ELSEWHERE (mask-expr2) [name]
     or
     ELSEWHERE [name]

  The "mask-expr2" is a logical array expression (called a mask
  expression).

  The "name" is the name of the WHERE construct.

  Assignment statements following an ELSEWHERE statement are executed
  as if they were WHERE statements with ".NOT.  where-mask-expr".  If
  ELSEWHERE specifies "mask-expr2", it is executed as "(.NOT.
  where-mask-expr) .AND.  mask-expr2".

  See also STATEMENTS WHERE in this Help file.

62.28  –  ENCODE

  See COMPATIBILITY_FEATURES in this Help file.

62.29  –  END

  Marks the end of a program unit.  The END statement must be present
  as the last statement of every program unit.  In a main program,
  execution terminates if control reaches the END statement.  In a
  subprogram, a RETURN statement is implicitly executed.  Statement
  format:

     END

62.30  –  END_DO

  Terminates the block of statements following a DO or DO WHILE
  statement when a label is not used.  Statement format:

     END DO

62.31  –  END_IF

  Terminates a block IF construct.  Statement format:

     END IF

62.32  –  END_MAP

  Marks the end of a map declaration within a union declaration in a
  record structure declaration block.  Terminates a field declaration
  or a series of field declarations that started with the MAP
  statement.  The END MAP statement must be present in a map
  declaration.  Statement format:

     END MAP

62.33  –  END_SELECT

  Marks the end of a CASE construct.  Statement format:

     END SELECT [name]

62.34  –  END_STRUCTURE

  Marks the end of a record structure declaration.  The END STRUCTURE
  statement must be present as the last statement of every record
  structure declaration.  Statement format:

     END STRUCTURE

62.35  –  END_TYPE

  Marks the end of a derived-type definition.  The END statement must
  be present as the last statement of every derived-type definition.
  Statement format:

     END TYPE

  For more information on derived types, see DATA DERIVED_TYPES in
  this Help file.

62.36  –  END_UNION

  Marks the end of a union declaration within a record structure
  declaration block.  The END statement must be present as the last
  statement of every union declaration.  Statement format:

     END UNION

62.37  –  ENDFILE

  For sequential files, writes an end-of-file record to the file and
  positions the file after this record (the terminal point).  For
  direct access files, truncates the file after the current record.

  Statement format:

     ENDFILE ([UNIT=]io-unit[,ERR=label][,IOSTAT=i-var])
     ENDFILE io-unit

     io-unit   Is the logical unit specifier, optionally prefaced
               by UNIT=.  UNIT= is required if unit is not the first
               I/O specifier.

     label     Is the label of an executable statement that
               receives control if an error occurs, prefaced
               by ERR=.

     i-var     Is an I/O status specifier, prefaced by IOSTAT=.
               (Returns a zero if no error condition exists or
               a positive integer if an error condition exists.)

  If the unit specified in the ENDFILE statement is not open, the
  default file is opened for unformatted output.

  An end-of-file record can be written only to sequential
  organization files that are accessed as formatted sequential files
  or unformatted segmented sequential files.  An ENDFILE statement
  performed on a direct access file always truncates the file.

  An ENDFILE statement must not be specified for a file that is open
  for keyed access.  End-of-file records should not be written in
  files that are read by programs written in a language other than
  Fortran.

62.38  –  ENTRY

  Designates an alternate entry point at which execution of a
  subprogram can start.  It is not executable and must precede any
  CONTAINS statement (if any) within the subprogram.  Statement
  format:

     ENTRY nam [([p[,p]...])] [RESULT (r-name)]]

     nam     Is a symbolic name for the entry point.  The name
             must be unique among all global names in the program.
             In a function subprogram, the data type defined for
             or implied by the name and the data type of the
             function must be consistent within the following groups:

             Group 1: Type default integer, default real, double
                      precision real, default complex, double complex,
                      or default logical
             Group 2: REAL(KIND=16) and COMPLEX(KIND=16)
             Group 3: Type default character

             If the data type is character, the length of the string
             must be the same in both the entry and the function.

     p       Is a dummy argument or an alternate return argument
             (designated by a *).  The arguments must agree in order,
             number, and type with the actual arguments of the
             statement invoking the entry point.  The arguments need
             not agree in name, order, number, or type with the dummy
             arguments in the SUBROUTINE or FUNCTION statement for the
             subprogram.  You must use only the dummy arguments
             defined in the ENTRY statement.

     r-name  Is the name of a function result.  This name must not be
             the same as the name of the entry point, or the name of
             any other function or function result.  This parameter
             can only be specified for function subprograms.

  The ENTRY statement is not executable and can appear within a
  function or subroutine program after the FUNCTION or SUBROUTINE
  statement.  Execution of a subprogram referred to by an entry name
  begins with the first executable statement after the ENTRY
  statement.

  An ENTRY statement must not appear in a CASE, DO, IF, FORALL, or
  WHERE construct or a nonblock DO loop.

62.39  –  EQUIVALENCE

  Starts two or more data elements in one program unit at the same
  storage location, thereby overlaying them in memory.  Statement
  format:

     EQUIVALENCE (nlist)[,(nlist)]...

     nlist  Is a list of variables, array elements, arrays,
            or character substring references, separated by
            commas.  You must specify at least two of these
            entities in each list.

  The elements named within each set of parentheses are given the
  same storage location.  The data elements do not have to be of the
  same type or length.  An equivalency begins with the first byte of
  each element.  When an array or substring element is equivalenced,
  the entire array or string is equivalenced in its normal linear
  storage.

  You cannot equivalence array or string elements in a manner that is
  inconsistent with their normal linear order.  You cannot
  equivalence elements of the same array or string.  You cannot
  equivalence two elements that are both in common areas.

  The following objects cannot be specified in EQUIVALENCE
  statements:

   o  A dummy argument

   o  An allocatable array

   o  A pointer

   o  An object of nonsequence derived type

   o  An object of sequence derived type containing a pointer in the
      structure

   o  A function, entry, or result name

   o  A named constant

   o  A structure component

   o  A subobject of any of the above objects

  You can identify a multidimensional array element by a single
  subscript.  The single subscript designates the absolute position
  of the element within the array.

62.40  –  EXIT

  The EXIT statement terminates execution of a DO construct.
  Statement format:

     EXIT [name]

     name  Is the name of the DO construct.

  The EXIT statement causes execution of the named (or innermost) DO
  construct to be terminated.

  If a DO construct name is specified, the EXIT statement must be
  within the range of that construct.

  Any DO variable present retains its last defined value.

  An EXIT statement can be labeled, but it cannot be used to
  terminate a DO construct.

  The following example shows an EXIT statement:

  LOOP_A : DO I = 1, 15
    N = N + 1
    IF (N > I) EXIT LOOP_A
  END DO LOOP_A

62.41  –  EXTERNAL

  Allows an external or dummy procedure to be used as an actual
  argument.  (To specify intrinsic procedures as actual arguments,
  use the INTRINSIC statement.)

  The EXTERNAL attribute can be specified in a type declaration
  statement or an EXTERNAL statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type [att-ls,] EXTERNAL [,att-ls] :: v[,v]...

  Statement:

   EXTERNAL v [,v]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     v         Is the symbolic name of a user-supplied subprogram,
               or the name of a dummy argument associated with the
               name of a subprogram.  If you name an intrinsic
               subprogram, that name becomes disassociated from
               the intrinsic subprogram and is assumed to be the
               name of an external object.

  You must use EXTERNAL statements in the following cases:

   -  To identify subprogram or entry point names passed as actual
      arguments

   -  To identify a block data program unit that will reside in a
      library module not explicitly referenced at link time.

  You do not need to use an EXTERNAL statement to identify a
  subprogram or entry point name used as the object of a CALL
  statement or function reference; these names are recognized as
  external implicitly.

  The EXTERNAL attribute is compatible with the OPTIONAL, PRIVATE,
  and PUBLIC attributes.

62.42  –  FIND

  See COMPATIBILITY_FEATURES in this Help file.

62.43  –  FORALL

  A generalization of the Fortran 95/90 WHERE statement and
  construct.  It allows more general array shapes to be assigned,
  especially in construct form.  Statement format:

    FORALL (triplet-spec [,triplet-spec]...[,mask-expr]) assign-stmt

  Construct format:

    [name: ] FORALL (triplet-spec [,triplet-spec]...[,mask-expr])
    forall-body-stmt
    [forall-body-stmt]...
    END FORALL [name]

    name          Is the name of the FORALL construct.

    triplet-spec  Is a triplet specification with the following form:

      subscript-name = subscript-1 : subscript-2 [:stride]

      The "subscript-name" must be a scalar of type integer.
      It is valid only within the scope of the FORALL; its
      value is undefined on completion of the FORALL.

      The "subscript"s and "stride" cannot contain a reference
      to any "subscript-name" in "triplet-spec".

      The "stride" cannot be zero.  If it is omitted, the default
      value is 1.

      Evaluation of an expression in a triplet specification must
      not affect the result of evaluating any other expression in
      another triplet specification.

    mask-expr  Is a logical array expression (called the mask
               expression). If it is omitted, the value .TRUE.
               is assumed. The mask expression can reference the
               subscript name in "triplet-spec".

    assign-stmt  Is an assignment statement or a pointer assignment
                 statement. The variable being assigned to must be
                 an array element or array section and must reference
                 all subscript names included in all "triplet-spec"s.

    forall-body-stmt  Is one of the following:
                      o An "assign-stmt"
                      o A WHERE statement or construct
                        The WHERE statement or construct uses a mask
                        to make array assignments.
                      o A FORALL statement or construct

  If a construct name is specified in the FORALL statement, the same
  name must appear in the corresponding END FORALL statement.

  A FORALL statement is executed by first evaluating all bounds and
  stride expressions in the triplet specifications, giving a set of
  values for each subscript name.  The FORALL assignment statement is
  executed for all combinations of subscript name values for which
  the mask expression is true.

  The FORALL assignment statement is executed as if all expressions
  (on both sides of the assignment) are completely evaluated before
  any part of the left side is changed.  Valid values are assigned to
  corresponding elements of the array being assigned to.  No element
  of an array can be assigned a value more than once.

  A FORALL construct is executed as if it were multiple FORALL
  statements, with the same triplet specifications and mask
  expressions.  Each statement in the FORALL body is executed
  completely before execution begins on the next FORALL body
  statement.

  Any procedure referenced in the mask expression or FORALL
  assignment statement must be pure.

  Pure functions can be used in the mask expression or called
  directly in a FORALL statement.  Pure subroutines cannot be called
  directly in a FORALL statement, but can be called from other pure
  procedures.

  EXAMPLES:

  Consider the following:

    FORALL(I = 1:N, J = 1:N, A(I, J) .NE. 0.0) B(I, J) = 1.0 / A(I, J)

  This statement takes the reciprocal of each nonzero element of
  array A(1:N, 1:N) and assigns it to the corresponding element of
  array B.  Elements of A that are zero do not have their reciprocal
  taken, and no assignments are made to corresponding elements of B.

  Every array assignment statement and WHERE statement can be written
  as a FORALL statement, but some FORALL statements cannot be written
  using just array syntax.  For example, the preceding FORALL
  statement is equivalent to the following:

    WHERE(A /= 0.0) B = 1.0 / A

  It is also equivalent to:

    FORALL (I = 1:N, J = 1:N)
      WHERE(A(I, J) .NE. 0.0) B(I, J) = 1.0/A(I, J)
    END FORALL

  However, the following FORALL example cannot be written using just
  array syntax:

     FORALL(I = 1:N, J = 1:N) H(I, J) = 1.0/REAL(I + J - 1)

  This statement sets array element H(I, J) to the value 1.0/REAL(I +
  J - 1) for values of I and J between 1 and N.

  Consider the following:

    TYPE MONARCH
      INTEGER, POINTER :: P
    END TYPE MONARCH

    TYPE(MONARCH), DIMENSION(8)   :: PATTERN
    INTEGER, DIMENSION(8), TARGET :: OBJECT
    FORALL(J=1:8)  PATTERN(J)%P => OBJECT(1+IEOR(J-1,2))

  This FORALL statement causes elements 1 through 8 of array PATTERN
  to point to elements 3, 4, 1, 2, 7, 8, 5, and 6, respectively, of
  OBJECT.  IEOR can be referenced here because it is pure.

  The following example shows a FORALL construct:

    FORALL(I = 3:N + 1, J = 3:N + 1)
      C(I, J) = C(I, J + 2) + C(I, J - 2) + C(I + 2, J) + C(I - 2, J)
      D(I, J) = C(I, J)
    END FORALL

  The assignment to array D uses the values of C computed in the
  first statement in the construct, not the values before the
  construct began execution.

  FORALL is a language feature of Fortran 95.

62.44  –  FORMAT

  Defines the conversion of data in formatted data transfer
  operations.  Statement format:

     FORMAT (q1 f1s1 f2s2 ... fnsn qn)

     qn   Is zero or more slash (/) record terminators.

     fn   Is a data edit (field) descriptor, a control edit
          descriptor, a string edit descriptor, or a group of
          such descriptors enclosed in parentheses.

     sn   Is a field separator (a comma or slash).  A
          comma can be omitted in the following cases:

          o Between a P edit descriptor and an immediately
            following F, E, D, or G edit descriptor.

          o Before or after a slash (/) record terminator.

          o Before or after a colon (:) edit descriptor.

  The "data edit descriptor" has one of the following forms:

     [r]c  [r]cw  [r]cw.m  [r]cw.d[Ee]

     r    Is an optional repeat count.  (If you omit r,
          the repeat count is assumed to be 1.)

     c    Is a format code (I,O,Z,F,E,EN,ES,D,G,L, or A).

     w    Is the external field width in characters.  Each
          data item in the external medium is called an
          external field.

     m    Is the minimum number of characters that must appear
          in the field (including leading zeros).

     d    Is the number of characters to the right of the decimal point.

     E    Is an exponent field.

     e    Is the number of characters in the exponent.

  The ranges for "r", "w", "m", "d", and "e" are as follows:

  Term      Range
  ----      __________
   r        1 to 2147483647 (2**31-1)
   w        1 to 2147483647
   m        0 to 32767 (2**15-1)
   d        0 to 32767
   e        1 to 32767

  The terms must all be unsigned integer constants or variable format
  expressions.  A variable format expression is an integer variable
  or expression enclosed in angle brackets that takes the place of an
  integer constant.  The value of the variable or variables can
  change during program execution.

  You cannot use PARAMETER constants for "r", "w", "m", "d", or "e".

  The "control edit descriptor" has one of the following forms:

     c  [n]c  c[n]

     c     Is a format code (X,T,TL,TR,SP,SS,S,BN,BZ,P,
           Q, $, or :).

     n     Is an optional number of characters or character
           positions.

  The term "n" must be an unsigned integer constant (for format code
  P, it can be signed or unsigned) or a variable format expression.
  A variable format expression is an integer variable or expression
  enclosed in angle brackets that takes the place of an integer
  constant.  The value of the variable or variables can change during
  program execution.

  The value of "n" for P must be within the range -128 to 127.  For
  all other format codes, the value of "n" must be within the range 1
  through 2147483647 (2**31-1); actual useful ranges may be
  constrained by record sizes (RECL) and the file system.

  The "string edit descriptor" has one of the following forms:

     "string" 'string'  nHc1...cn

     string  Is a character literal constant.

     n       Is the number of characters to be transferred.

     c1...cn Is a string of printable ASCII characters.

  Although no string edit descriptor can be preceded by a repeat
  specification, a parenthesized group of string edit descriptors can
  be preceded by a repeat specification.

  For more information, see FORMAT_SPECIFIERS in this Help file.

62.45  –  FUNCTION

  Begins a function subprogram.  Identifies the data type of the
  function and names the dummy arguments.  Format:

     [prefx] FUNCTION nam [([p[,p]...])] [RESULT (r-nam)]

     prefx Is either:

           typ [kywd]
           kywd [typ]

     typ   Is a data type.  If you do not specify a data type,
           the data type of the function is implied from its
           name.

           If the data type is CHARACTER, you can specify
           CHARACTER*(*) to indicate an assumed-length function
           type -- the function type assumes the length of its
           definition in the program unit invoking it. Assumed-
           length character functions are obsolescent in
           Fortran 95.  VSI Fortran flags obsolescent features,
           but fully supports them.

     kywd  Is one of the following:

           RECURSIVE    Permits direct recursion to occur.  If
                        a function is directly recursive and
                        array valued, RESULT must also be
                        specified.

           PURE         Restricts the procedure from having
                        side effects.

           ELEMENTAL    Specifies PURE with certain constraints:

                        o A dummy argument:
                          - Must be scalar and cannot have the POINTER
                            attribute
                          - Cannot appear in a specification expression,
                            except as an argument to the BIT_SIZE, KIND,
                            or LEN intrinsic functions or the numeric
                            inquiry intrinsic functions
                          - Must not be *
                          - Must not be a dummy procedure

                        o The function result must be scalar and cannot
                          have the POINTER attribute.

                        An explicit interface must be visible to the
                        caller of an ELEMENTAL procedure.

                        If ELEMENTAL is specified, RECURSIVE must not
                        be specified.

     nam   Is a symbolic name for the function.  The name must be
           unique among all global names in the program.  The name
           is used as a variable within the function.  The value of
           the variable is returned to the caller of the function
           as the value of the function.

           The name can be followed by * and the length of the data
           type. It must be one of the valid length specifiers for
           "typ".  This length overrides the length specified or
           implied by the type.  This length specification is not
           permitted if the length has already been specified
           following CHARACTER.

     p     Is an unsubscripted variable name specifying a dummy
           argument.  The arguments must agree in order, number, and
           type with the actual arguments of the statement invoking
           the function.  A dummy argument must not be defined as an
           array with more elements than the actual argument holds.

     r-nam Is the name of the function result.  This name must not
           be the same as the function name.

  The array declarator for a dummy argument can itself contain
  integer values that are dummy arguments or are references to a
  common block, providing for adjustable size arrays in functions.
  The upper bound of the array declarator for a dummy argument can be
  specified as an asterisk, in which case the upper bound of the
  dummy argument assumes the size of the upper bound of the actual
  argument.  The size in a character string declarator for a dummy
  argument can be specified as an asterisk in parentheses (*) -- in
  which case the size of the actual argument is passed to the dummy
  argument.

  The values of the actual arguments in the invoking program unit
  become the values of the dummy arguments in the function.  If you
  modify a dummy argument, the corresponding actual argument in the
  invoking program unit is also modified; the actual argument must be
  a variable if it is to be modified.

  If the actual argument is a character constant, the dummy argument
  can be either character or numeric in type, unless the name of the
  subprogram being invoked is a dummy argument in the invoking
  program unit.  If the actual argument is a Hollerith constant, the
  dummy argument must be numeric.

  The FUNCTION statement must be the first statement of a function
  subprogram, unless an OPTIONS statement is specified.  A function
  subprogram cannot contain a SUBROUTINE statement, a BLOCK DATA
  statement, a PROGRAM statement, or another FUNCTION statement.
  ENTRY statements can be included to provide multiple entry points
  to the subprogram.

                                 NOTE

          In a function, the function name identifier  refers
          to  the  return  value,  not  the  function itself,
          unless an argument list is present.  Therefore,  it
          is  not  possible to pass a function as an argument
          to another routine from inside the  function.   For
          example, consider the following:

             INTEGER FUNCTION RECURSIVE_FUNCTION
                .
                .
                .
             CALL OTHERSUB (RECURSIVE_FUNCTION)

          The reference to  RECURSIVE_FUNCTION  in  the  CALL
          statement passes the function return value, not the
          function itself.

62.45.1  –  RESULT Keyword

  Specifies a name for the result variable of a function.  Its name
  must be different from the name of the function.

  If RESULT is not specified, the function name is the result
  variable.  All references to the function are references to the
  function result variable.

  If RESULT is specified, the result name is the result variable.
  In this case, all references to the function name are recursive
  calls, and the function name must not appear in specification
  statements.

  The following is an example of a recursive function specifying a
  RESULT variable:

    RECURSIVE FUNCTION FACTORIAL(P) RESULT(L)
      INTEGER, INTENT(IN) :: P
      INTEGER L
      IF (P == 1) THEN
        L = 1
      ELSE
        L = P * FACTORIAL(P - 1)
      END IF
    END FUNCTION

62.45.2  –  Function Reference

  Transfers control and passes arguments to a function.  Format:

     nam (p[,p]...)

     nam  Is the name of the function or the name of an entry
          point to the function.

     p    Is a value to be passed to the function.  The value
          can be a constant, the name of a variable, the name
          of an array element, the name of an array, an expression,
          a substring, field reference, or the name of a subprogram
          or entry point to a subprogram (must be defined as
          external).  You cannot specify more than 255 arguments.

62.46  –  GOTO

  Transfers control within a program unit.  Depending upon the value
  of an expression, control is transferred either to the same
  statement every time GO TO is executed or to one of a set of
  statements.

62.46.1  –  Unconditional

  Transfers control unconditionally to the same statement every time
  the GO TO is executed.  Statement format:

     GO TO s

     s  Is the label of an executable statement that is
        in the same program unit as the GO TO statement.

62.46.2  –  Computed

  Transfers control to a statement based upon the value of an
  expression within the statement.  This is an obsolescent feature in
  Fortrsn 95.  Statement format:

     GO TO (slist)[,]e

     slist  Is a list of one or more labels of executable
            statements separated by commas. The list of labels
            is called the transfer list.

     e      Is an integer arithmetic expression in the range
            1 to n (where "n" is the number of statement labels
            in the transfer list).

  If the value of "e" is less than one or greater than the number of
  labels in the transfer list, control is transferred to the first
  executable statement after the computed GO TO.

                                 NOTE

          This  statement  is  obsolescent  in  Fortran   95.
          HP  Fortran  flags  obsolescent  features,  but
          fully supports them.

62.46.3  –  Assigned

  Transfers control to a statement label that is represented by a
  variable.  An ASSIGN statement must establish a relationship
  between the variable and the specified statement label.  Statement
  format:

     GO TO v[[,](slist)]

     v      Is an integer variable whose value was set by a
            preceding ASSIGN statement in the same program unit.

     slist  Is a list of one or more labels of executable
            statements separated by commas.

  This feature has been deleted in Fortran 95; it was an obsolescent
  feature in Fortran 90.  VSI Fortran fully supports features
  deleted in Fortran 95.

62.47  –  IF

  Conditionally transfers control or executes a statement or block of
  statements.

  For each type of IF statement, the decision to transfer control or
  to execute the statement or block of statements is based on the
  evaluation of an expression within the IF statement.

62.47.1  –  Arithmetic

  Conditionally transfers control to one of three statements, based
  on the current value of an arithmetic expression.  Statement
  format:

     IF (e) s1,s2,s3

     e         Is an arithmetic expression.

     s1,s2,s3  Are labels of executable statements in the same
               program unit.  All three labels are required,
               but they need not refer to different statements.

  Executes the statement at the first label ("s1") if the arithmetic
  expression evaluates to a value less than 0; the statement at the
  second label ("s2") if the arithmetic expression evaluates to 0; or
  the statement at the third label ("s3") if the arithmetic
  expression evaluates to a value greater than 0.

                                 NOTE

          The  arithmetic  IF  statement  is  an  obsolescent
          feature  in  Fortran  95  and  Fortran  90.  HP
          Fortran fully supports this feature.

62.47.2  –  Logical

  Executes the statement if the logical expression is true.  In
  Fortran 95/90, this is called an IF statement (as compared to block
  IFs, which are called IF constructs).  Statement format:

     IF (e) st

     e   Is a logical expression.

     st  Is a complete Fortran statement. The statement can
         be any statement except DO, END DO, END, block IF,
         CASE, FORALL, or WHERE constructs, or another logical
         IF statement.

62.47.3  –  Block

  Executes a block of statements if the logical expression is true.
  The block of statements starts immediately following the IF
  statement.  The block of statements can be followed by optional
  ELSE IF statements (any number) and one optional ELSE statement.
  The entire block IF construct must be terminated by an END IF
  statement.  Format:

     [name:] IF (e) THEN
       block
     [ELSE IF (e1) THEN [name]
       block]...
     [ELSE [name]
       block]
     END IF [name]

     name   Is the name of the IF construct.

     e,e1   Are logical expressions.

     block  Is a series of zero or more Fortran statements
            (called a statement block).

  If a construct name is specified in a block IF statement, the same
  name must appear in the terminal END IF statement.  If no construct
  name is specified in the block IF statement, no name can appear in
  the terminal END IF statement.  The construct name must be a unique
  identifier in the program unit.

                                 NOTE

          No additional statement can be placed after the  IF
          THEN  statement  in  a  block  IF  construct.   For
          example, the following statement is invalid in  the
          block IF construct:

             IF (e) THEN I = J

          This  statement  is  translated  as  the  following
          logical IF statement:

             IF (e) THENI = J

62.48  –  IMPLICIT

  Overrides implied (default) data typing of symbolic names.
  Statement format:

     IMPLICIT typ (a[,a]...)[,typ (a[,a]...)]...

     typ  Is any data type except CHARACTER*(*).  When "typ"
          is equal to CHARACTER*len, "len" specifies the length
          for character data type.  The "len" is an unsigned
          integer constant or an integer constant expression
          enclosed in parentheses.  The largest valid value of len
          on Tru64 UNIX and Linux is 2147483647 (2**31-1); on OpenVMS
          the largest valid value is 65535.  Negative values are
          treated as zero.

     a    Is an alphabetical character.  If you specify a
          range of alphabetic characters (two characters
          joined by a hyphen), the first character must be
          less than the second.

  The IMPLICIT statement assigns the specified data type to all
  symbolic names that have no explicit data type and begins with the
  specified letter or range of letters.  It has no effect on the
  default types of intrinsic procedures.

  Names beginning with a dollar sign ($) are implicitly INTEGER.
  This implicit type cannot be changed in an IMPLICIT statement.

62.49  –  IMPLICIT_NONE

  Disables the implicit declaration of data types in the program
  unit.  When it is used, you must declare the data types of all
  symbols explicitly.  You must not include any other IMPLICIT
  statements in the program unit containing an IMPLICIT NONE
  statement.  Statement format:

     IMPLICIT NONE

                                 NOTE

          To receive diagnostic messages when  variables  are
          used   but   not  declared,  you  can  specify  the
          /WARNINGS=DECLARATIONS compiler option  instead  of
          IMPLICIT NONE.

62.50  –  INCLUDE

  Directs the compiler to stop reading statements from the current
  file and read the statements in the included file or module.  When
  it reaches the end of the included file or module, the compiler
  resumes compilation with the next statement after the INCLUDE
  statement.  Statement format:

     INCLUDE 'full-file-name[/[NO]LIST]'

     INCLUDE '[text-lib] (module-name)[/[NO]LIST]'

     full-file-name  Is a character string that specifies
                     the file to be included.  The form of
                     the "full-file-name" must be acceptable
                     to the operating system, as described
                     in the HP Fortran for OpenVMS User Manual.

     /[NO]LIST       Specifies whether the incorporated code
                     is to appear in the compilation source
                     listing.  In the listing, a number
                     precedes each incorporated statement.  The
                     number indicates the "include" nesting
                     depth of the code. The default is /NOLIST.
                     /LIST and /NOLIST must be spelled completely.

                     On Tru64 UNIX and Linux systems, you can only
                     use /[NO]LIST if you specify the compiler
                     option that sets OpenVMS defaults.

     text-lib        Is a character string that specifies the
                     "full-file-name" of the text library to be
                     searched.  Its form must be acceptable to
                     the operating system, as described in the
                     HP Fortran for OpenVMS User Manual.

     module-name     Is the name of the text module, located in
                     a text library, that is to be included. The
                     name of the module must be enclosed in
                     parentheses.  It can contain any alphanumeric
                     character and the special characters dollar
                     sign ($) and underscore (_).  Its length
                     must be acceptable to the operating system,
                     as described in the HP Fortran for OpenVMS User
                     Manual.

  The file or module must contain valid Fortran statements.  The file
  or module cannot start with a continuation line, but it can contain
  an INCLUDE statement.

  The limit on nesting depth is when system resources are exhausted.

  In the following example, the file COMMON.FOR defines a parameter
  constant M, and defines arrays X and Y as part of the blank common
  block.

     Main Program File              COMMON.FOR File
     -----------------              ---------------
     INCLUDE 'COMMON.FOR'           PARAMETER (M=100)
     DIMENSION Z(M)                 COMMON X(M),Y(M)
     CALL CUBE
     DO 5, I=1,M

  5  Z(I) = X(I)+SQRT(Y(I))
         .
         .
         .
     END

     SUBROUTINE CUBE
     INCLUDE 'COMMON.FOR'
     DO 10, I=1,M
  10 X(I) = Y(I)**3
     RETURN
     END

62.51  –  Input Output

  Transfer I/O statements include READ, WRITE, REWRITE, ACCEPT, TYPE,
  and PRINT.  Auxiliary I/O statements include OPEN, CLOSE, INQUIRE,
  REWIND, BACKSPACE, ENDFILE, DELETE, and UNLOCK.

  Transfer I/O statements may be formatted (F), unformatted (U),
  list-directed (L-D), or namelist (N) as follows:

     ACCEPT     Sequential -- F, L-D, N
     DELETE     Relative -- U
                Indexed -- U
     PRINT      Sequential -- F, L-D, N
     READ       Sequential -- F, U, L-D, N
                Direct Access -- F, U
                Internal -- F, L-D
                Indexed -- F, U
     REWRITE    Relative -- F, U
                Sequential -- F
                Indexed -- F, U
     TYPE       Sequential -- F, L-D, N
     WRITE      Sequential -- F, U, L-D, N
                Direct Access -- F, U
                Internal -- F, L-D
                Indexed -- F, U

62.51.1  –  Formatted

  Formatted I/O statements contain explicit format specifiers that
  are used to control the translation of data from internal (binary)
  form within a program to external (readable character) form in the
  records, or vice versa.

  Formatted I/O statements must have a format (FMT=) specified in the
  control list (clist).  Additional "clist" elements are required
  depending on the type of access.

  Formatted sequential READ:

    READ (UNIT=u,FMT=f[,ADVANCE=exp][,SIZE=var][,IOSTAT=ios]
          [,ERR=err][,END=end]) [iolist]
    READ f [,iolist]

  Formatted direct access READ:

    READ (UNIT=u,REC=rec,FMT=f[,IOSTAT=ios][,ERR=err]) [iolist]

  Formatted indexed READ:

    READ (UNIT=u,FMT=f,KEY=k[,KEYID=n][,IOSTAT=ios]
         [,ERR=err]) [iolist]

  Formatted internal READ:

    READ (UNIT=u,FMT=f[,IOSTAT=ios][,ERR=err][,END=end]) [iolist]

  Formatted sequential WRITE:

    WRITE (UNIT=u,FMT=f[,ADVANCE=exp][,IOSTAT=ios]
          [,ERR=err]) [iolist]

  Formatted direct access WRITE:

    WRITE (UNIT=u,REC=rec,FMT=f[,IOSTAT=ios][,ERR=err]) [iolist]

  Formatted indexed WRITE:

    WRITE (UNIT=u,FMT=f[,IOSTAT=ios][,ERR=err]) [iolist]

  Formatted internal WRITE:

    WRITE (UNIT=u,FMT=f[,IOSTAT=ios][,ERR=err]) [iolist]

62.51.2  –  Unformatted

  Unformatted I/O statements do not contain format specifiers and
  therefore do not translate the data being transferred.

  Unformatted I/O is especially appropriate where the output data
  will subsequently be used as input.  Unformatted I/O saves
  execution time by eliminating the data translation process,
  preserves greater precision in the external data, and usually
  conserves file storage space.

  Unformatted I/O statements do not specify a format (FMT=) in the
  control list (clist).  Other "clist" elements are required
  depending on the type of access.

  Unformatted sequential READ:

    READ (UNIT=u[,IOSTAT=ios][,ERR=err][,END=end]) [iolist]

  Unformatted direct access READ:

    READ (UNIT=u,REC=rec[,IOSTAT=ios][,ERR=err]) [iolist]

  Unformatted indexed READ:

    READ (UNIT=u,KEY=k[,KEYID=n][,IOSTAT=ios][,ERR=err]) [iolist]

  Unformatted sequential WRITE:

    WRITE (UNIT=u,[,IOSTAT=ios][,ERR=err]) [iolist]

  Unformatted direct access WRITE:

    WRITE (UNIT=u,REC=rec[,IOSTAT=ios][,ERR=err]) [iolist]

  Unformatted indexed WRITE:

    WRITE (UNIT=u[,IOSTAT=ios][,ERR=err]) [iolist]

62.51.3  –  List-Directed

  List-directed I/O statements are similar to formatted statements in
  function, but control the translation of data through data types
  instead of explicit format specifiers.

  List-directed I/O statements specify a format (FMT=) in the control
  list (clist).  Other "clist" elements are required depending on the
  type of access.

  List-directed sequential READ:

    READ (UNIT=u,FMT=*[,IOSTAT=ios][,ERR=err][,END=end]) [iolist]
    READ * [,iolist]

  List-directed internal READ

    READ (UNIT=u,FMT=*[,IOSTAT=ios][,ERR=err][,END=end]) [iolist]

  List-directed sequential WRITE

    WRITE (UNIT=u,FMT=*[,IOSTAT=ios][,ERR=err]) [iolist]

  List-directed internal WRITE

    WRITE (UNIT=u,FMT=*[,IOSTAT=ios][,ERR=err]) [iolist]

62.51.4  –  Namelist

  Namelist I/O statements are similar to formatted statements in
  function, but control the translation of data through data types
  instead of explicit format specifiers.

  Namelist I/O statements do not specify a format (FMT=) in the
  control list (clist).

  Namelist sequential READ:

     READ (UNIT=u,NML=nml[,IOSTAT=ios][,ERR=err][,END=end])
     READ n

  Namelist sequential WRITE:

    WRITE (UNIT=u,NML=nml[,IOSTAT=ios][,ERR=err])

  Comments (beginning with !  only) can appear anywhere in namelist
  input.  The comment extends to the end of the source line.

62.52  –  INQUIRE

  Returns information about specified properties of a file or of a
  logical unit on which a file might be opened.  The unit need not
  exist, nor need it be connected to a file.  If the unit is
  connected to a file, the inquiry encompasses both the connection
  and the file.  Statement format:

   Inquiring by File:

     INQUIRE (FILE=fi [,ERR=lbl][,IOSTAT=ivar][,DEFAULTFILE=def], flist)

   Inquiring by Unit:

     INQUIRE ([UNIT=]u [,ERR=lbl][,IOSTAT=ivar], flist)

   Inquiring by Output List:

     INQUIRE (IOLENGTH=len) olist

     fi     Is a scalar default character expression
            specifying the name of the file for inquiry.

     lbl    Is the label of the branch target statement
            that receives control if an error occurs.

     var    Is a scalar integer variable that is defined
            as a positive integer if an error occurs and
            zero if no error occurs.

     def    Is a scalar default character expression specifying
            a default file pathname (or file specification) string.

     flist  Is one or more inquiry specifiers. Each specifier
            can appear only once.  Information about the
            individual specifiers is available under the
            subtopic headings listed at the end of this Help
            topic.

     u      Is an integer variable or constant specifying the
            logical unit number of the file, optionally prefaced
            by UNIT=.  UNIT= is required if unit is not the
            first I/O specifier.  The unit does not have to
            exist, nor does it need to be connected to a file.
            If the unit is connected to a file, the inquiry
            encompasses both the connection and the file.

     len    Is a scalar integer variable indicating
            the number of bytes of data that would result from
            using "olist" in an unformatted output statement.

     olist  Is a list of one or more output items.

  FILE=fi, UNIT=u, ERR=lbl, and IOSTAT=var can appear anywhere within
  the parentheses following INQUIRE.  However, if the UNIT keyword is
  omitted, the unit specifier ("u") must be the first parameter in
  the list.

  An INQUIRE statement may be executed before, during, or after the
  connection of a file to a unit.  The values assigned by the
  statement are those that are current when the INQUIRE statement
  executes.

  To get file characteristics, specify the INQUIRE statement after
  opening the file.  (File characteristics are stored in the file
  header.)

62.52.1  –  ACCESS

  ACCESS = acc

  acc  Is a scalar default character variable that is
       assigned one of the following values:

  'SEQUENTIAL'      If the file is open for sequential access
  'DIRECT'          If the file is open for direct access
  'KEYED'           If the file is open for keyed access
  'UNDEFINED'       If the file is not open

62.52.2  –  ACTION

  ACTION = act

  act  Is a scalar default character variable that is assigned
       one of the following values:

  'READ'       If the file is connected for input only
  'WRITE'      If the file is connected for output only
  'READWRITE'  If the file is connected for both input
               and output
  'UNDEFINED'  If the file is not connected

62.52.3  –  BLANK

  BLANK = blnk

  blnk  Is a character scalar memory reference that is
        assigned one of the following values:

  'NULL'      If null blank control is in effect for the
              file open for formatted I/O.  (Blanks are
              ignored unless the field is all blanks, in
              which case it is treated as zero.)

  'ZERO'      If zero blank control is in effect.  (All
              blanks other than leading blanks are treated
              as zeros.)

  'UNDEFINED' If the file is not open or if the existing
              file is not open for formatted I/O.

62.52.4  –  BLOCKSIZE

  BLOCKSIZE = bks

  bks  Is a scalar integer variable.

  The "bks" is assigned the current size of the I/O buffer.  If the
  unit or file is not connected, the value assigned is zero.

62.52.5  –  BUFFERED

  BUFFERED = bf

  bf   Is a scalar default character variable that is assigned
       one of the following values:

       'NO'         If the file or unit is connected and
                    buffering is not in effect.

       'YES'        If the file or unit is connected and
                    buffering is in effect.

       'UNKNOWN'    If the file or unit is not connected.

62.52.6  –  CARRIAGECONTROL

  CARRIAGECONTROL = cc

  cc  Is a character scalar memory reference that is
      assigned one of the following values:

  'FORTRAN'  If the file is open with the FORTRAN carriage
             control
  'LIST'     If the file is open with implied carriage control
             (single spacing between records)
  'NONE'     If the file is open with no carriage control
             attribute
  'UNKNOWN'  If the file is not open

62.52.7  –  CONVERT

  CONVERT = fm

  fm  Is a character scalar memory reference that is assigned
      one of the following values:

  'LITTLE_ENDIAN':  If the file is open with little endian
                    integer and IEEE floating-point data
                    conversion in effect.

  'BIG_ENDIAN':     If the file is open with big endian
                    integer and IEEE floating-point data
                    conversion in effect.

  'CRAY':           If the file is open with big endian
                    integer and CRAY floating-point data
                    conversion in effect.

  'FDX':            If the file is open with little endian
                    integer and VAX F_floating, D_floating,
                    and IEEE X_floating data conversion in
                    effect.

  'FGX':            If the file is open with little endian
                    integer and VAX F_floating, G_floating,
                    and IEEE X_floating data conversion in
                    effect.

  'IBM':            If the file is open with big endian
                    integer and IBM System\370 floating-
                    point data conversion in effect.

  'VAXD':           If the file is open with little endian
                    integer and VAX F_floating, D_floating,
                    and H_floating data conversion in effect.

  'VAXG':           If the file is open with little endian
                    integer and VAX F_floating, G_floating,
                    and H_floating data conversion in effect.

  'NATIVE':         If the file is open with no data
                    conversion in effect.

  'UNKNOWN':        If the file or unit is not connected
                    for unformatted I/O.

62.52.8  –  DELIM

  DELIM = del

  del  Is a scalar default character variable that is assigned
       one of the following values:

  'APOSTROPHE'  If apostrophes are used to delimit character
                constants in list-directed and namelist output

  'QUOTE'       If quotation marks are used to delimit character
                constants in list-directed and namelist output

  'NONE'        If no delimiters are used

  'UNDEFINED'   If the file is not connected, or is not connected
                for formatted data transfer

62.52.9  –  DIRECT

  DIRECT = dir

  dir  Is a character scalar memory reference that is
       assigned one of the following values:

  'YES'       If the file is open for direct access
  'NO'        If the file is not open for direct access
  'UNKNOWN'   If the file is not open

62.52.10  –  ERR

  ERR = s

  s  Is the label of an executable statement.

  ERR is a control specifier rather than a property specifier.  If an
  error occurs during the execution of the INQUIRE statement, control
  is transferred to the statement whose label is "s".

62.52.11  –  EXIST

  EXIST = lv

  lv  Is a logical scalar memory reference that is
      assigned one of the following values:

  .TRUE.    If the specified file exists and can be opened
            or if the unit exists
  .FALSE.   If the specified file or unit does not exist or
            if the file exists but cannot be opened

  The unit exists if it is a number in the range allowed by the
  processor.

62.52.12  –  FORM

  FORM = fm

  fm  Is a character scalar memory reference that is
      assigned one of the following values:

  'FORMATTED'       If the file is open for formatted I/O
  'UNFORMATTED'     If the file is open for unformatted I/O
  'UNDEFINED'       If the file is not open

62.52.13  –  FORMATTED

  FORMATTED = fmd

  fmd  Is a character character scalar memory reference that is
       assigned one of the following values:

  'YES'       If formatted I/O is allowed
  'NO'        If formatted I/O is not allowed
  'UNKNOWN'   If the processor cannot determine whether formatted
              I/O is allowed

62.52.14  –  IOSTAT

  IOSTAT = ios

  ios  Is a scalar default integer variable.

  IOSTAT is a control specifier rather than a property specifier.
  The "ios" is assigned a processor-dependent positive integer value
  if an error occurs during execution of the INQUIRE statement; it is
  assigned the value zero if there is no error condition.

62.52.15  –  KEYED

  KEYED = kyd

  kyd  Is a character scalar memory reference that is assigned
       one of the following values:

  'YES'       If keyed access is allowed.
  'NO'        If keyed access is not allowed.
  'UNKNOWN'   If the processor cannot determine whether
              keyed access is allowed

62.52.16  –  NAME

  NAME = nme

  nme  Is a character scalar memory reference that is
       assigned the name of the file being inquired about.
       If the file does not have a name, "nme" is undefined.

                                 NOTE

          The FILE and NAME keywords are synonyms  when  used
          with the OPEN statement, but not when used with the
          INQUIRE statement.

62.52.17  –  NAMED

  NAMED = nmd

  nmd  Is a logical scalar memory reference that is
       assigned one of the following values:

  .TRUE.    If the specified file has a name
  .FALSE.   If the file does not have a name

62.52.18  –  NEXTREC

  NEXTREC = nr

  nr  Is a scalar integer variable that is assigned
      a value as follows:

      - If the file is connected for direct access and a
        record (r) was previously read or written, the value
        assigned is r + 1.

      - If no record has been read or written, the value
        assigned is 1.

      - If the file is not connected for direct access, or
        if the file position cannot be determined because
        of an error condition, the value assigned is zero.

      - If the file is connected for direct access and a REWIND
        has been performed on the file, the value assigned is 1.

62.52.19  –  NUMBER

  NUMBER = num

  num  Is a scalar integer variable to which the
       logical unit number of the file is returned.  No value
       is returned if the file is not connected to a unit.

62.52.20  –  OPENED

  OPENED = od

  od  Is a logical scalar memory reference that is
      assigned one of the following values:

  .TRUE.    If the specified file or unit is open
  .FALSE.   If the specified file or unit is not open

62.52.21  –  ORGANIZATION

  ORGANIZATION = org

  org  Is a character scalar memory reference that is
       assigned one of the following values:

  'SEQUENTIAL'         If the file is a sequential file
  'RELATIVE'           If the file is a relative file
  'INDEXED'            If the file is an indexed file
  'UNKNOWN'            If the file organization cannot
                        be determined

62.52.22  –  PAD

  PAD = pd

  pd   Is a scalar default character variable that is assigned
       one of the following values:

  'NO'   If the file or unit was connected with PAD='NO'

  'YES'  If the file or unit was connected with PAD='YES'

62.52.23  –  POSITION

  POSITION = pos

  pos   Is a scalar default character variable that is assigned
        one of the following values:

  'REWIND'    If  the file is connected with its position
              at its initial point

  'APPEND'    If the file is connected with its position
              at its terminal point (or before its end-of-file
              record, if any)

  'ASIS'      If the file is connected without changing
              its position

  'UNDEFINED' If the file is not connected, or is connected
              for direct access data transfer and a REWIND
              statement has not been performed on the unit.

62.52.24  –  READ

  READ = rd

  rd   Is a scalar default character variable that is assigned
       one of the following values:

  'YES'     If the file can be read

  'NO'      If the file cannot be read

  'UNKNOWN' If the processor cannot determine whether
            the file can be read

62.52.25  –  READWRITE

  READWRITE = rdwr

  rdwr   Is a scalar default character variable that is assigned
         one of the following values:

  'YES'     If the file can be both read and written to

  'NO'      If the file cannot be both read and written to

  'UNKNOWN' If the processor cannot determine whether
            the file can be both read and written to

62.52.26  –  RECL

  RECL = rcl

  rcl  Is a scalar integer variable whose value
       depends on the following conditions:

       - If the file or unit is open, "rcl" is the maximum
         record length allowed in the file

       - If the file is not open, "rcl" is the maximum
         record length allowed in the file; or, if the
         maximum record length is 0, "rcl" is the length
         of the longest record in the file

       - If the file is segmented, "rcl" is the longest
         segment length in the file

       - If the file does not exist, "rcl" is 0.

  The assigned value is expressed in longwords (4-byte units) if the
  file is currently (or was previously) connected for unformatted
  data transfer; otherwise, the value is expressed in bytes.

62.52.27  –  RECORDTYPE

  RECORDTYPE = rtype

  rtype  Is a character scalar memory reference that is
         assigned one of the following values:

  'FIXED'       If the file is open for fixed-length records
  'VARIABLE'    If the file is open for variable-length records
  'SEGMENTED'   If the file is open for unformatted sequential
                I/O using segmented records
  'STREAM'      If the file's records are not terminated
  'STREAM_CR'   If the file's records are terminated with a
                carriage-return
  'STREAM_LF'   If the file's records are terminated with a
                line-feed
  'UNKNOWN'     If the processor cannot determine the record type
                or the file is not open

62.52.28  –  SEQUENTIAL

  SEQUENTIAL = seq

  seq  Is a character scalar memory reference that is
       assigned one of the following values:

  'YES'       If sequential access is allowed for the
              specified file
  'NO'        If sequential access is not allowed
  'UNKNOWN'   If the access mode cannot be determined

62.52.29  –  UNFORMATTED

  UNFORMATTED = unf

  unf  Is a character scalar memory reference that is
       assigned one of the following values:

  'YES'       If unformatted I/O is allowed for the
              specified file
  'NO'        If unformatted I/O is not allowed
  'UNKNOWN'   If the form cannot be determined

62.52.30  –  WRITE

  WRITE = wr

  wr   Is a scalar default character variable that is assigned
       one of the following values:

  'YES'     If the file can be written to

  'NO'      If the file cannot be written to

  'UNKNOWN' If the processor cannot determine whether
            the file can be written to

62.53  –  INTENT

  Specifies the intended use of one or more dummy arguments.

  The INTENT attribute can be specified in a type declaration
  statement or an INTENT statement, and takes one of the following
  forms:

  Type Declaration Statement:

    type, [att-ls,] INTENT (spec) [,att-ls] :: d [, d]...

  Statement:

    INTENT (spec) [::] d [, d]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     spec      Is one of the following specifiers:

               IN    Specifies that the dummy argument must
                     not be redefined (or become undefined)
                     during execution of the procedure.

                     Any associated actual argument must be
                     an expression.

               OUT   Specifies that the dummy argument must be
                     defined before it is referenced in the
                     procedure.

                     Any associated actual argument must be
                     definable.  The argument becomes undefined
                     on entry to the procedure, and is intended
                     only to pass information out of the procedure.

               INOUT Specifies that the dummy argument can both
                     receive data from and return data to the
                     calling program unit.

                     Any associated actual argument must be
                     definable.

     d         Is the name of a dummy argument.  It cannot
               be a dummy procedure or dummy pointer.

  If no INTENT attribute is specified for a dummy argument, its use
  is subject to the limitations of the associated actual argument.

  If a function specifies a defined operator, the dummy arguments
  must have intent IN.

  If a subroutine specifies defined assignment, the first argument
  must have intent OUT or INOUT, and the second argument must have
  intent IN.

  If an actual argument is an array section with a vector subscript,
  it cannot be associated with a dummy array that is defined or
  redefined (has intent OUT or INOUT).

  The INTENT attribute is compatible with the DIMENSION, OPTIONAL,
  TARGET, and VOLATILE attributes.

  EXAMPLES:

  The following example shows type declaration statements specifying
  the INTENT attribute:

    SUBROUTINE TEST(I, J)
      INTEGER, INTENT(IN) :: I
      INTEGER, INTENT(OUT), DIMENSION(I) :: J

  The following are examples of the INTENT statement:

    SUBROUTINE TEST(A, B, X)
       INTENT(INOUT) :: A, B
       ...

    SUBROUTINE CHANGE(FROM, TO)
       USE EMPLOYEE_MODULE
       TYPE(EMPLOYEE) FROM, TO
       INTENT(IN) FROM
       INTENT(OUT) TO
       ...

62.54  –  INTERFACE

  The first statement of an interface block.  Interface blocks define
  explicit interfaces for external or dummy procedures.  They can
  also be used to define a generic name for procedures, a new
  operator for functions, and a new form of assignment for
  subroutines.  Format:

     INTERFACE [spec]
       [body]...
       [MODULE PROCEDURE nam]...
     END INTERFACE [spec]

     spec  Is one of the following:

           A generic name

           OPERATOR (op)

           The "op" is the defined unary, defined binary,
           or extended intrinsic operator being defined.

           ASSIGNMENT (=)

           A "spec" can only be included in the END INTERFACE
           statement if one was provided in the INTERFACE
           statement; both "spec"s must be identical.

     body  Is one or more function or subroutine subprograms.
           A function must end with END FUNCTION and a subroutine
           must end with END SUBROUTINE.

           The subprogram must not contain a statement function
           or a DATA, ENTRY or FORMAT statement; an entry name
           can be used as a procedure name.

           The subprogram can contain a USE statement.

     nam   Is the name of one or more module procedures that
           are accessible in the host. The MODULE PROCEDURE
           statement is only allowed if the interface block
           specifies a "spec" and has a host that is a module
           (or accesses a module by use association).

           The characteristics of module procedures are not
           given in interface blocks, but are assumed from
           the module subprogram definitions.

  Interface blocks can appear in the specification part of the
  program unit that invokes the external or dummy procedure.

  The characteristics specified for the external or dummy procedure
  must be consistent with those specified in the procedure's
  definition.

  An interface block must not appear in a block data program unit.

  An interface block comprises its own scoping unit, and does not
  inherit anything from its host through host association.

  A procedure must not have more than one explicit interface in a
  given scoping unit.

  For more information, see the HP Fortran for OpenVMS Language
  Reference Manual.

  EXAMPLES:

  The following example shows a simple procedure interface block with
  no generic specification:

    SUBROUTINE SUB_B (B, FB)
      REAL B
      ...
      INTERFACE
        FUNCTION FB (GN)
          REAL FB, GN
        END FUNCTION
      END INTERFACE

62.54.1  –  Generic Names

  An interface block can be used to specify a generic name to
  reference all of the procedures within the interface block.
  Statement format for initial line in block:

     INTERFACE generic-name

  This kind of interface block can be used to extend or redefine a
  generic intrinsic procedure.

  The procedures that are given the generic name must be the same
  kind of subprogram:  all must be functions, or all must be
  subroutines.

  Any procedure reference involving a generic procedure name must be
  resolvable to one specific procedure; it must be unambiguous.

  EXAMPLES:

    INTERFACE GROUP_SUBS
      SUBROUTINE INTEGER_SUB (A, B)
        INTEGER, INTENT(INOUT) :: A, B
      END SUBROUTINE INTEGER_SUB

      SUBROUTINE REAL_SUB (A, B)
        REAL, INTENT(INOUT) :: A, B
      END SUBROUTINE REAL_SUB

      SUBROUTINE COMPLEX_SUB (A, B)
        COMPLEX, INTENT(INOUT) :: A, B
      END SUBROUTINE COMPLEX_SUB
    END INTERFACE

  The three subroutines can be referenced by their individual
  specific names or by the group name GROUP_SUBS.

  The following example shows a reference to INTEGER_SUB:

  INTEGER V1, V2
  CALL GROUP_SUBS (V1, V2)

62.54.2  –  Generic Operators

  An interface block can be used to define a generic operator.  The
  only procedures allowed in the interface block are functions that
  can be referenced as defined operations.  Statement format for
  initial line in block:

     INTERFACE OPERATOR (op)

     op  Is one of the following:

         A defined unary  operator (one argument)

         A defined binary  operator (two arguments)

         An extended intrinsic operator (number of arguments
               must be consistent with the intrinsic uses of
               that operator)

  The functions within the interface block must have one or two
  nonoptional arguments with intent IN, and the function result must
  not be of type character with assumed length.  A defined operation
  is treated as a reference to the function.

  EXAMPLES:

    INTERFACE OPERATOR(.BAR.)
      FUNCTION BAR(A_1)
        INTEGER, INTENT(IN) :: A_1
        INTEGER :: BAR
      END FUNCTION BAR
    END INTERFACE

  The following example shows a way to reference function BAR by
  using the new operator:

    INTEGER B
    I = 4 + (.BAR. B)

  The following is an example of a procedure interface block with a
  defined operator extending an existing operator:

    INTERFACE OPERATOR(+)
      FUNCTION LGFUNC (A, B)
      LOGICAL, INTENT(IN) :: A(:), B(SIZE(A))
      LOGICAL :: LGFUNC(SIZE(A))
      END FUNCTION LGFUNC
    END INTERFACE

  The following example shows two equivalent ways to reference
  function LGFUNC:

    LOGICAL, DIMENSION(1:10) :: C, D, E
    N = 10
    E = LGFUNC(C(1:N), D(1:N))
    E = C(1:N) + D(1:N)

62.54.3  –  Generic Assignment

  An interface block can be used to define generic assignment.  The
  only procedures allowed in the interface block are subroutines that
  can be referenced as defined assignments.  Statement format for
  initial line in block:

     INTERFACE ASSIGNMENT(=)

  The subroutines within the interface block must have two
  nonoptional arguments, the first with intent OUT or INOUT, and the
  second with intent IN.

  A defined assignment is treated as a reference to a subroutine.
  The left side of the assignment corresponds to the first dummy
  argument of the subroutine; the right side of the assignment
  corresponds to the second argument.

  The ASSIGNMENT keyword extends or redefines an assignment operation
  if both sides of the equal sign are of the same derived type.

  Any procedure reference involving generic assignment must be
  resolvable to one specific procedure; it must be unambiguous.

  EXAMPLES:

    INTERFACE ASSIGNMENT (=)
      SUBROUTINE BIT_TO_NUMERIC (NUM, BIT)
      INTEGER, INTENT(OUT) :: NUM
      LOGICAL, INTENT(IN)  :: BIT(:)
      END SUBROUTINE BIT_TO_NUMERIC

      SUBROUTINE CHAR_TO_STRING (STR, CHAR)
      USE STRING_MODULE                    ! Contains definition
                                           !   of type STRING
      TYPE(STRING), INTENT(OUT) :: STR     ! A variable-length string
      CHARACTER(*), INTENT(IN)  :: CHAR
      END SUBROUTINE  CHAR_TO_STRING
    END  INTERFACE

  The following example shows two equivalent ways to reference
  subroutine BIT_TO_NUMERIC:

    CALL BIT_TO_NUMERIC(X, (NUM(I:J)))
    X = NUM(I:J)

  The following example shows two equivalent ways to reference
  subroutine CHAR_TO_STRING:

    CALL CHAR_TO_STRING(CH, '432C')
    CH = '432C'

62.55  –  INTRINSIC

  Allows the specific name of an intrinsic procedure to be used as an
  actual argument.  (Not all specific names can be used as actual
  arguments.  For more information, see the HP Fortran for OpenVMS
  Language Reference Manual.)

  The INTRINSIC attribute can be specified in a type declaration
  statement or an INTRINSIC statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] INTRINSIC [,att-ls] :: v[,v]...

  Statement:

   INTRINSIC v [,v]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     v         Is the symbolic name of an intrinsic subprogram.

  Subprogram names passed as actual arguments must be identified in
  INTRINSIC statements.  Names of subprograms used as the objects of
  CALL statements or function references do not need to be identified
  by means of INTRINSIC statements; these names are recognized as
  intrinsic implicitly.

  The INTRINSIC attribute is compatible with the PRIVATE and PUBLIC
  attributes.

62.56  –  MAP

  See STATEMENTS STRUCTURE in this Help file.

62.57  –  MODULE

  A program unit containing specifications and definitions that can
  be made accessible to other program units.  Format:

     MODULE nam
        [specs]
     [CONTAINS
        mod-sub
        [mod-sub]...]
     END [MODULE [nam]]

     nam      Is the name of the module.

     specs    Is one or more specification statements,
              except for the following:

              ENTRY
              FORMAT
              AUTOMATIC (or its equivalent attribute)
              INTENT (or its equivalent attribute)
              OPTIONAL (or its equivalent attribute)
              Statement functions

              An automatic object must not appear in a
              specification statement.

     mod-sub  Is a function or subroutine subprogram that
              defines the the module procedure.  A function
              must end with END FUNCTION and a subroutine
              must end with END SUBROUTINE.

              A module subprogram can contain internal
              procedures.

  If a module name appears following the END statement, it must be
  the same name as the name specified in the MODULE statement.

  The module name cannot be the same as any local name in the main
  program or the name of any other program unit, external procedure,
  or common block in the executable program.

  A module is host to any module procedures it contains, and entities
  in the module are accessible to the module procedures through host
  association.

  A module must not reference itself (either directly or indirectly).

  Although ENTRY statements, FORMAT statements, and statement
  functions are not allowed in the specification part of a module,
  they are allowed in the specification part of a module subprogram.

  Any executable statements in a module can only be specified in a
  module subprogram.

  A module can contain one or more procedure interface blocks, which
  let you specify an explicit interface for an external subprogram or
  dummy subprogram.

  Every internal subprogram must be of the same extrinsic kind as its
  host, and any internal subprogram whose extrinsic kind is not given
  is assumed to be of that extrinsic kind.

  EXAMPLES:

  The following example shows a simple module that can be used to
  provide global data:

    MODULE MOD_A
      INTEGER :: B, C
      REAL E(25,5)
    END MODULE MOD_A
    ...
    SUBROUTINE SUB_Z
      USE MOD_A               ! Makes scalar variables B and C,
                              ! and array E available to this
                              ! subroutine
    END SUBROUTINE SUB_Z

  The following example shows a module procedure:

    MODULE RESULTS
    ...
    CONTAINS
      FUNCTION MOD_RESULTS(X,Y)  ! A module procedure
      ...
      END FUNCTION MOD_RESULTS
    END MODULE RESULTS

  The following example shows a module containing a derived type:

    MODULE EMPLOYEE_DATA
      TYPE EMPLOYEE
        INTEGER ID
        CHARACTER(LEN=40) NAME
      END TYPE EMPLOYEE
    END MODULE

  The following example shows a module containing an interface block:

    MODULE ARRAY_CALCULATOR
      INTERFACE
        FUNCTION CALC_AVERAGE(D)
          REAL :: CALC_AVERAGE
          REAL, INTENT(IN) :: D(:)
        END FUNCTION
      END INTERFACE
    END MODULE ARRAY_CALCULATOR

62.58  –  MODULE_PROCEDURE

  See STATEMENTS INTERFACE in this Help file.

62.59  –  NAMELIST

  Defines a list of variables or array names and associates that list
  with a unique group-name, which is used in the namelist I/O
  statement.

     NAMELIST /group/nlist[[,]/group/nlist]...

     group  Is the name of the group.

     nlist  Is the list of (no more than 250) variable
            names, separated by commas, that are to be
            associated with the preceding group.

  Dummy arguments can appear in a namelist.

  The following variables cannot appear in a namelist group:

   o  An array dummy argument with nonconstant bounds

   o  A variable with assumed character length

   o  An allocatable array

   o  An automatic object

   o  A Fortran 95/90 pointer

   o  A variable of a type that has a pointer as an ultimate
      component

   o  A subobject of any of the above objects

  You can use namelist I/O to assign values to elements of arrays or
  substrings of character variables that appear in namelists.

  The namelist entities can have any data type and can be explicitly
  or implicitly typed.

  Only the entities specified in the namelist can be read or written
  in namelist I/O.  It is not necessary for the input records in a
  namelist input statement to define every entity in the associated
  namelist.

  The order of entities in the namelist controls the order in which
  the values are written in the namelist output.  Input of namelist
  values can be in any order.

  A variable can appear in several namelists.

62.60  –  NULLIFY

  Disassociates a pointer from its target.  It takes the following
  form:

     NULLIFY (ptr-obj [,ptr-obj]...)

     ptr-obj  Is a structure component or the name of a
              variable; it must be a pointer (have the
              POINTER attribute).

  The initial association status of a pointer is undefined.  You can
  use NULLIFY to initialize an undefined pointer, giving it
  disassociated status.  Then the pointer can be tested using the
  intrinsic function ASSOCIATED.

  EXAMPLES:

     REAL, TARGET  :: TAR(0:50)
     REAL, POINTER :: PTR_A(:), PTR_B(:)
     PTR_A => TAR
     PTR_B => TAR
     ...
     NULLIFY(PTR_A)

  After these statements are executed, PTR_A will have disassociated
  status, while PTR_B will continue to be associated with variable
  TAR.

62.61  –  OPEN

  Opens an existing file or creates a new file.  If you do not
  explicitly open a file before accessing it, the file is created
  (for write operations) or opened with default attributes.

     OPEN (par[,par]...)

     par  Is a keyword specification in one of the
          following forms:

          keywd
          keywd=value

          keywd  Is a keyword.  (See the subtopic headings
                 listed at the end of this Help topic.)
          value  Is a keyword value. (Some keywords do not
                 have keyword values.)

  If an OPEN statement is executed for a unit that is already open,
  and the file pathname (or specification) is different from that of
  the current open file, the previously opened file is closed and the
  new file is opened.  If the file pathname (or specification) is the
  same for both files, the new value of the BLANK= specifier is in
  effect, but the position of the file is unaffected.

  Keyword specifications can appear in any order.  In most cases,
  they are optional.  Default values apply in their absence.  If the
  logical unit specifier is the first parameter in the list, the UNIT
  keyword is optional.

  You can specify character values at run time by substituting a
  general character expression for a keyword value in the OPEN
  statement.  The character value can contain trailing spaces but not
  leading or embedded spaces; for example:

     CHARACTER*6 FINAL /' '/
     ...
     IF (exp) FINAL = 'DELETE'
     OPEN (UNIT=1, STATUS='NEW', DISP=FINAL)

                                 NOTE

          Keyword values that are numeric expressions can  be
          any  integer  or real expression.  The value of the
          expression is converted to integer data type before
          it is used in the OPEN statement.

62.61.1  –  ACCESS

  Indicates the access method for the connection of the file.  It
  takes the following form:

  ACCESS = acc

  acc  Is a character expression with one of the following
       values:

  'DIRECT'           Access by record number
  'SEQUENTIAL'       Access sequentially (the default)
  'KEYED'            Access by a specified key
  'APPEND'           Access sequentially, after the last record
                      of the file

62.61.2  –  ACTION

  Indicates the allowed I/O operations for the file connection.  It
  takes the following form:

  ACTION = act

  act  Is a character expression with one of the
       following values:

  'READ'      Indicates that only READ statements can refer to
              this connection.
  'WRITE'     Indicates that only WRITE, DELETE, and ENDFILE
              statements can refer to this connection.
  'READWRITE' Indicates that READ, WRITE, DELETE, and ENDFILE
              statements can refer to this connection (*DEFAULT*)

62.61.3  –  ASSOCIATEVARIABLE

  Indicates a variable that is updated after each direct access I/O
  operation, to reflect the record number of the next sequential
  record in the file.  It takes the following form:

  ASSOCIATEVARIABLE = asv

  asv  Is an integer variable.  It cannot be a dummy argument
       to the routine in which the OPEN statement appears.
       Use only in direct access mode.

                                 NOTE

          Direct access  READ,  direct  access  WRITE,  FIND,
          DELETE, and REWRITE statements can affect the value
          of the variable.

62.61.4  –  BLANK

  Indicates how blanks are interpreted in a file.  It takes the
  following form:

  BLANK = blnk

  blnk  Is a character expression with one of the following
        values:

  'NULL'  Ignore all blanks in a numeric field (unless the field
          is all blanks, in which case treat blanks as zero).
  'ZERO'  Treat all blanks other than leading blanks as zeros.

  The default is 'NULL' (for explicitly OPENed files, preconnected
  files, and internal files).

  If the BN or BZ edit descriptors are specified for a formatted
  input statement, they supersede the default interpretation of
  blanks.

62.61.5  –  BLOCKSIZE

  Indicates the physical I/O transfer size for the file.  It takes
  the following form:

  BLOCKSIZE = bks

  bks  Is a numeric expression whose value specifies a
       number of bytes.

  For magnetic tape files, the value of "bks" specifies the physical
  record size in the range 18 to 32767 bytes.  The default value is
  2048 bytes.

  For sequential disk files, "bks" is rounded up to an integral
  number of 512-byte blocks and used to specify multiblock transfers.
  The number of blocks transferred can be 1 to 127; it is determined
  by RMS defaults.

  For indexed and relative files, "bks" is rounded up to an integral
  number of 512-byte blocks and used to specify the RMS bucket size.
  This must fall in the range 1 to 63 blocks.  The default is the
  smallest value capable of holding a single record.

62.61.6  –  BUFFERCOUNT

  Indicates the number of buffers to be associated with the logical
  unit for multibuffered I/O.  It takes the following form:

  BUFFERCOUNT = bc

  bc  Is a numeric expression.

  The range of values for "bc" is 1 to 127.

  If you do not specify BUFFERCOUNT or you specify 0, the process or
  system default is assumed.

62.61.7  –  BUFFERED

  Indicates run-time library behavior following WRITE operations.  It
  takes the following form:

  BUFFERED = bf

  bf   Is a character expression with one of the following
       values:

       'NO'   Requests that the run-time library send output
              data to the file system after each WRITE
              operation.

       'YES'  Requests that the run-time library accumulate
              output data in its internal buffer, possibly
              across several WRITE operations, before the data
              is sent to the file system.

              Buffering may improve run-time performance
              for output-intensive applications.

  The default is 'NO'.

  On OpenVMS, BUFFERED has no effect.  The operating system
  automatically performs buffering, which can be affected by the
  values of the BUFFERCOUNT and BUFFERSIZE keywords when the file is
  opened.

62.61.8  –  CARRIAGECONTROL

  Indicates the type of carriage control used when a file is
  displayed at a terminal.  It takes the following form:

  CARRIAGECONTROL = cc

  cc  Is a character expression with one of the following
      values:

  'FORTRAN'   Process with normal FORTRAN interpretation of
              the first character
  'LIST'      Process with single spacing between records
  'NONE'      Do not use implied carriage control

  The default for unformatted files is 'NONE'.  The default for
  formatted files is 'FORTRAN'.

62.61.9  –  CONVERT

  Indicates a nonnative numeric format for unformatted data.  It
  takes the following form:

  CONVERT = fm

  fm  Is a character expression with one of the following
      options:

     'LITTLE_ENDIAN'- Little endian integer data of the
                      appropriate size (INTEGER*1, INTEGER*2,
                      INTEGER*4, or INTEGER*8) and IEEE
                      floating-point data of the appropriate size
                      and type (REAL*4, REAL*8, REAL*16, COMPLEX*8,
                      COMPLEX*16, or COMPLEX*32).  INTEGER*1 data
                      is the same for little endian and big endian.

     'BIG_ENDIAN' -   Big endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and IEEE floating-point data of
                      the appropriate size and type (REAL*4, REAL*8,
                      REAL*16, COMPLEX*8, COMPLEX*16, or COMPLEX*32).
                      INTEGER*1 data is the same for little endian
                      and big endian.

     'CRAY' -         Big endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and CRAY floating-point data of
                      size REAL*8 or COMPLEX*16.

     'FDX' -          Little endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and HP VAX floating-point data
                      of format F_floating for REAL*4 or COMPLEX*8,
                      D_floating for size REAL*8 or COMPLEX*16, and
                      IEEE X_floating for REAL*16 or COMPLEX*32.

     'FGX' -          Little endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and HP VAX floating-point data
                      of format F_floating for REAL*4 or COMPLEX*8,
                      G_floating for size REAL*8 or COMPLEX*16, and
                      IEEE X_floating for REAL*16 or COMPLEX*32.

     'IBM' -          Big endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and IBM System\370 floating-point
                      data of size REAL*4 or COMPLEX*8 (IBM
                      short 4) and size REAL*8 or COMPLEX*16 (IBM
                      long 8).

     'VAXD' -         Little endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and HP VAX floating-point
                      data of format F_floating for size
                      REAL*4 or COMPLEX*8, D_floating for size
                      REAL*8 or COMPLEX*16, and H_floating for
                      REAL*16 or COMPLEX*32.

     'VAXG' -         Little endian integer data of the appropriate
                      size (INTEGER*1, INTEGER*2, INTEGER*4, or
                      INTEGER*8) and HP VAX floating-point
                      data of format F_floating for size
                      REAL*4 or COMPLEX*8, G_floating for size
                      REAL*8 or COMPLEX*16, and H_floating for
                      REAL*16 or COMPLEX*32.

     'NATIVE' -       No data conversion.  This is the default.

  You can use CONVERT to specify multiple formats in a single
  program, usually one format for each specified unit number.

  When reading a non-native format, the non-native format on disk is
  converted to native format in memory.  If a converted non-native
  value is outside the range of the native data type, a run-time
  message appears.

  There are other ways to specify numeric format for unformatted
  files:  you can specify an OpenVMS logical name or the compiler
  option /CONVERT (or OPTIONS/CONVERT).  The order of precedence is
  OpenVMS logical name, OPEN (CONVERT=), OPTIONS/CONVERT, and then
  compiler option /CONVERT.  The /CONVERT compiler option and
  OPTIONS/CONVERT affect all unit numbers used by the program, while
  logical names and OPEN (CONVERT=) affect specific unit numbers.

  The following source code shows how to code the OPEN statement to
  read unformatted CRAY numeric data from unit 15, which might be
  processed and possibly written in little endian format to unit 20:

     OPEN (CONVERT='CRAY', FILE='graph3.dat', FORM='UNFORMATTED',
    1     UNIT=15)
     ...
     OPEN (FILE='graph3_native.dat', FORM='UNFORMATTED', UNIT=20)

62.61.10  –  DEFAULTFILE

  Indicates a default file specification string.  It takes the
  following form:

  DEFAULTFILE = ce

  ce  Is a character expression.

  This specifier supplies a value to the RMS default file
  specification string for the missing components of a file
  specification.  If you do not specify the DEFAULTFILE keyword,
  Fortran uses the default value 'FORnnn.DAT', where nnn is the unit
  number with leading zeros.

  The default file pathname string is used primarily when accepting
  file specifications interactively.  File specifications known to a
  user program are normally completely specified in the FILE keyword.

  You can specify default values for any one of the following file
  specification components:  node, device, directory, file name, file
  type, and file version number.

  When you specify any of the above components in the FILE keyword,
  they override those values specified in the DEFAULTFILE keyword.

  The following example uses the file name supplied by the user and
  the default file specification supplied by the DEFAULTFILE keyword
  to define the file specification for an existing file:

     TYPE *, 'ENTER NAME OF DOCUMENT'
     ACCEPT *, DOC
     OPEN (UNIT=1, FILE=DOC, DEFAULTFILE='[ARCHIVE].TXT',
    1     STATUS='OLD')

62.61.11  –  DELIM

  Indicates what characters (if any) are used to delimit character
  constants in list-directed and namelist output.  It takes the
  following form:

  DELIM = del

  del  Is a character expression with one of the
       following values:

  'APOSTROPHE'  Indicates that apostrophes delimit character
                constants. All internal apostrophes are doubled.

  'QUOTE'       Indicates that quotation marks delimit character
                constants.  All internal quotation marks are doubled.

  'NONE'        Indicates that character constants have no
                delimiters.  No internal apostrophes or quotation
                marks are doubled. This is the default.

  DELIM is only allowed for files connected for formatted data
  transfer; it is ignored during input.

62.61.12  –  DISPOSE

  Indicates the status of the file after the unit is closed.  It
  takes one of the following forms:

  DISP = dis
  DISPOSE = dis

  dis  Is a character expression with one of the following
       values:

  'KEEP' or 'SAVE'  Retain the file after the unit is closed.
                    (*DEFAULT FOR ALL BUT SCRATCH FILES*)

  'DELETE'          Delete the file after the unit is closed.
                    (*DEFAULT FOR SCRATCH FILES*)

  'PRINT'           Submit the file as a print job and retain it.
                    Use this value only with sequential files.

  'PRINT/DELETE'    Submit the file as a print job and then
                    delete it.  Use this value only with sequential
                    files.

  'SUBMIT'          Submit the file as a batch job and retain it.

  'SUBMIT/DELETE'   Submit the file as a batch job and then
                    delete it.

  The disposition specified in a CLOSE statement supersedes the
  disposition specified in the OPEN statement, except that a file
  opened as a scratch file cannot be saved, printed, or submitted,
  nor can a file opened for read-only access be deleted.

62.61.13  –  ERR

  Identifies a branch target statement that receives control if an
  error occurs.  It takes the following form:

  ERR = s

  s  Is the label of an executable statement

  ERR applies only to the OPEN statement in which it is specified,
  and not in subsequent I/O operations on the unit.  If an error
  occurs, no file is opened or created.  However, you can use IOSTAT
  in subsequent I/O statements to perform a similar function.

62.61.14  –  EXTENDSIZE

  Indicates the number of blocks by which to extend a disk file
  (extent) when additional storage space is needed.  It takes the
  following form:

  EXTENDSIZE = e

     e  Is a numeric expression.

  The space used to extend a file is contiguous if possible.
  Otherwise, noncontiguous space is used.  The default is the system
  default for the device.

62.61.15  –  FILE

  Indicates the name of the file to be connected to the unit.  It
  takes the following form:

  FILE = name

  name   Is a character or numeric expression.

  The "name" can be any pathname (or specification) allowed by the
  operating system.  (See the appropriate manual in the OpenVMS
  operating system documentation set.)

  Any trailing blanks in the name are ignored.

  If the following conditions occur:

   o  FILE is omitted

   o  The unit is not connected to a file

   o  STATUS='SCRATCH' is not specified

  then VSI Fortran generates a file name in the form FORnnn.DAT,
  where "nnn" is the logical unit number (with leading zeros, if
  necessary).

  If the file name is stored in a numeric scalar or array, the name
  must consist of ASCII characters terminated by an ASCII null
  character (zero byte).  However, if it is stored in a character
  scalar or array, it must not contain a zero byte.

62.61.16  –  FORM

  Indicates whether the file is being connected for formatted,
  unformatted, or binary data transfer.  It takes the following form:

  FORM = ft

  ft  Is a character expression with one of the following
      values:

    'FORMATTED'         Formatted *DEFAULT FOR SEQUENTIAL ACCESS*
    'UNFORMATTED'       Unformatted *DEFAULT FOR KEYED
                          AND DIRECT ACCESS*
    'BINARY'            Binary

62.61.17  –  INITIALSIZE

  Indicates the number of blocks in the initial storage allocation
  (extent) for a disk file.  It takes the following form:

  INITIALSIZE = e

     e  Is a numeric expression.

  If you do not specify INITIALSIZE or if you specify zero, no
  initial allocation is made.  The system attempts to allocate
  contiguous space for INITIALSIZE.  If not enough contiguous space
  is available, noncontiguous space is allocated.

62.61.18  –  IOSTAT

  Designates a variable to store a value indicating the status of a
  data transfer operation.  It takes the following form:

  IOSTAT = ios

  ios   Is a scalar default integer variable.

  If no error exists, "ios" is defined as zero.  If an error exists,
  "ios" is defined as a positive integer.

  IOSTAT applies only to the OPEN statement in which it appears and
  not to subsequent I/O operations on the logical unit that is
  opened.  However, you can use the IOSTAT parameter in subsequent
  I/O statements to perform a similar function.

  Secondary operating system messages do not display when IOSTAT is
  specified.  To display these messages, remove IOSTAT or use a
  platform-specific method such as a VMS condition handler.  (For
  more information, see the HP Fortran for OpenVMS User Manual.)

62.61.19  –  KEY

  Defines the access keys for records in an indexed file.  It takes
  the following form:

  KEY = (kspec[,kspec]...)

  kspec   Takes the following form:

          e1:e2[:dt[:dr]]

          e1   Is the position of the first byte of the
               key in the record.
          e2   Is the position of the last byte of the
               key in the record.
          dt   Is the data type of the key: CHARACTER (*DEFAULT*)
               or INTEGER.
          dr   Is the direction of the key: ASCENDING (*DEFAULT*)
               or DESCENDING.

  The length of the key must not exceed 255 bytes.  The first byte
  position of the key must be at least 1 and the last byte position
  must not exceed the length of the record.

  If the key type is INTEGER, the key length must be either 2 or 4.

  Defining Primary and Alternate Keys:

  You must define at least one key in an indexed file.  This is the
  primary key (the default key).  It usually has a unique value for
  each record.

  You can also define alternate keys.  RMS allows up to 254 alternate
  keys.

  If a file requires more keys than the OPEN statement limit, you
  must create it from another language or with the File Definition
  Language (FDL).

  Specifying and Referencing Keys:

  You must specify the KEY parameter when creating an indexed file.
  However, you do not have to respecify it when opening an existing
  file because key attributes are permanent aspects of the file.
  These attributes include key definitions and reference numbers for
  subsequent I/O operations.

  However, if you use the KEY parameter for an existing file, your
  specification must be identical to the established key attributes.

  Subsequent I/O operations use a reference number, called the
  key-of-reference number, to identify a particular key.  You do not
  specify this number; it is determined by the key's position in the
  specification list:  the primary key is key-of-reference number 0;
  the first alternate key is key-of-reference number 1, and so forth.

62.61.20  –  MAXREC

  Indicates the maximum number of records that can be transferred
  from or to a direct access file while the file is connected.  It
  takes the following form:

  MAXREC = mr

  mr  Is an numeric expression.

  The default is the maximum allowed (2**32-1).

62.61.21  –  NAME

  NAME is a nonstandard synonym for FILE.  (See OPEN FILE.)

62.61.22  –  NOSPANBLOCKS

  NOSPANBLOCKS

  Specifies that records are not to cross disk block boundaries.  If
  a record exceeds the size of a physical block, an error occurs.

62.61.23  –  ORGANIZATION

  Indicates the internal organization of the file.  It takes the
  following form:

  ORGANIZATION = org

  org  Is a character expression with one of the following
       values:

  'SEQUENTIAL'          Records are stored in the order that
                        they are written. Access mode must be
                        sequential, append, or direct (fixed-length
                        records only). (*DEFAULT FOR NEW FILES*)

  'RELATIVE'            Records are stored in numbered positions.
                        Access mode must be direct or sequential.

  'INDEXED'             Records are stored according to the values
                        of their keys. Access mode must be indexed
                        or sequential.

  The default for an existing file is its current organization.

62.61.24  –  PAD

  Indicates whether a formatted input record is padded with blanks
  when an input list and format specification requires more data than
  the record contains.  It takes the following form:

  PAD = pd

  pd   Is a character expression with one of the
       following values:

  'YES'  Indicates the record will be padded with blanks
         when necessary (the default).

  'NO'   Indicates the record will not be padded with blanks.
         The input record must contain the data required by
         the input list and format specification.

  This behavior is different from FORTRAN 77, which never pads short
  records with blanks.  For example, consider the following:

    READ (5,'(I5)') J

  If you enter 123 followed by a carriage return, FORTRAN 77 will
  turn the I5 into an I3 and J will be assigned 123.

  However, VSI Fortran pads the 123 with 2 blanks unless you
  explicitly open the unit with PAD='NO'.

  You can override blank padding by explicitly specifying the BN edit
  descriptor.

  The PAD specifier is ignored during output.

62.61.25  –  POSITION

  Indicates the position of a file connected for sequential access.
  It takes the following form:

  POSITION = pos

  pos   Is a character expression with one of the
        following values:

  'ASIS'   Indicates the file position is unchanged if the file
           exists and is already connected.  The position is
           unspecified if the file exists but is not connected.
           This is the default.

  'REWIND' Indicates the file is positioned at its initial point.

  'APPEND' Indicates the file is positioned at its terminal point
           (or before its end-of-file record, if any).)

  A new file (whether specified as new explicitly or by default) is
  always positioned at its initial point.

62.61.26  –  READONLY

  READONLY

  Prohibits WRITE access to the file.  Enables users with READ access
  to access the file.

  READONLY is similar to specifying ACTION='READ', but READONLY
  prevents deletion of the file if it is closed with STATUS='DELETE'
  in effect.

  Default file access privileges are READWRITE, which can cause
  run-time I/O errors if the file protection does not permit write
  access.

  The READONLY specifier has no effect on the protection specified
  for a file.  Its main purpose is to allow a file to be read
  simultaneously by two or more programs.  For example, use READONLY
  if you wish to open a file so you can read it, but you also want
  others to be able to read the same file while you have it open.

62.61.27  –  RECL

  Indicates the length of logical records in a file connected for
  direct or keyed access, or the maximum length of a record in a file
  connected for sequential access.  It takes the following form:

  RECL = rl

  rl  Is an numeric expression.  If necessary, the value is
      converted to integer data type before use.

  If the file is connected for formatted data transfer, the value
  must be expressed in bytes (characters).  Otherwise, the value is
  expressed in 4-byte units (longwords).  If the file is connected
  for unformatted data transfer, the value can be expressed in bytes
  if compiler option /ASSUME=BYTERECL is specified.

  The "rl" value is the length for record data only.  It does not
  include space for control information, such as two segment control
  bytes (if present) or the bytes that RMS requires for maintaining
  record length and deleted record control information.

  The length specified is interpreted depending on the type of
  records in the connected file, as follows:

   o  For segmented records, RECL indicates the maximum length for
      any segment (not including the two segment control bytes).

   o  For fixed-length records, RECL indicates the size of each
      record.

   o  For variable-length or stream records, RECL specifies the size
      of the buffer that will be allocated to hold records read or
      written.  Specifying RECL for stream records (STREAM, STREAMCR
      or STREAMLF) is required if the longest record length in the
      file exceeds the default RECL value.

  Errors occur under the following conditions:

   o  If your program attempts to write to an existing file a record
      that is longer than the logical record length

   o  If you are opening an existing file that contains fixed-length
      records or has relative organization and you specify a value
      for RECL that is different from the actual length of the
      records in the file

  The following table lists the maximum values that can be specified
  for "rl" for disk files that use the fixed-length record format:

    Sequential formatted               32767 bytes
    Sequential unformatted              8191 longwords
    Relative formatted                 32255 bytes
    Relative unformatted                8063 longwords
    Indexed formatted                  32224 bytes
    Indexed unformatted                 8056 longwords
    Tape formatted                      9999 bytes
    Tape unformatted                    2499 longwords

  For other record formats and device types, the record size limit
  may be less, as described in the OpenVMS Record Management
  Services Reference Manual.

  You must specify RECL when opening new files (STATUS='NEW',
  'UNKNOWN, or 'SCRATCH') and when one or more of the following
  conditions exists:

   o  The file is opened for direct access (ACCESS='DIRECT').

   o  The record format is fixed length (RECORDTYPE='FIXED').

   o  The file organization is relative or indexed
      (ORGANIZATION='RELATIVE' or 'INDEXED').

  The default value depends on the setting of the RECORDTYPE
  specifier, as follows:

  RECORDTYPE value    RECL value
  ----------------    -----------------------------------------

  'FIXED'             None; value must be explicitly specified.
  All other types     133 bytes (for formatted records)
                      511 longwords (for unformatted records)

62.61.28  –  RECORDSIZE

  RECORDSIZE is the nonstandard synonym for RECL (see OPEN RECL).

62.61.29  –  RECORDTYPE

  Indicates the type of records in a file.  It takes the following
  form:

  RECORDTYPE = typ

  typ  Is a character expression with one of the following
       values:

  'FIXED'      All records are one size. Short records are padded
               with blanks (formatted files) or zeros (unformatted
               files).
  'VARIABLE'   Records can vary in length.
  'SEGMENTED'  A record consists of one or more variable length
               records which may exist in different physical blocks.
               Valid only for unformatted, sequential files with
               sequential access.
  'STREAM'     Data is not grouped into records and contains no
               control information.
  'STREAM_CR'  Variable-length records whose length is indicated by
               carriage-returns embedded in the data.
  'STREAM_LF'  Variable-length records whose length is indicated by
               line-feeds (new lines) embedded in the data.

  When you open a file, default record types are as follows:

  +-------------------------------------+---------------------+
  | File Type                           | Default Record Type |
  +-------------------------------------+---------------------+
  | Relative or indexed files           | 'FIXED'             |
  | Direct access sequential files      | 'FIXED'             |
  | Formatted sequential access files   | 'VARIABLE'          |
  | Unformatted sequential access files | 'SEGMENTED'         |
  +-------------------------------------+---------------------+

  A segmented record is a logical record consisting of one or more
  variable-length records (segments).  The logical record can span
  several physical records.  Only unformatted sequential-access files
  with sequential organization can have segmented records;
  'SEGMENTED' must not be specified for any other file type.

  Files containing segmented records can be accessed only by
  unformatted sequential data transfer statements.  You cannot use an
  unformatted READ statement to access such a file, unless you
  specify RECORDTYPE='SEGMENTED' in the OPEN statement.

  Normally, if you do not use the RECORDTYPE specifier when you are
  accessing an existing file, the record type of the file is used.
  However, if the file is an unformatted sequential-access file with
  sequential organization and variable-length records, the default
  record type is 'SEGMENTED'.

  If you use the RECORDTYPE specifier when you are accessing an
  existing file, the type that you specify must match the type of the
  existing file.

  If an output statement does not specify a full record for a file
  containing fixed-length records, the following occurs:

   o  In formatted files, the record is filled with blanks

   o  In unformatted files, the record is filled with zeros

62.61.30  –  SHARED

  SHARED

  Specifies that the file can be accessed by more than one user at
  the same time.

  For more information on file sharing, see the HP Fortran for
  OpenVMS User Manual.

62.61.31  –  STATUS

  Indicates the status of a file when it is opened.  It takes the
  following form:

  STATUS = sta

  sta  Is a character expression with one of the following
       values:

  'OLD'       Open an existing file.

  'NEW'       Create a new file; if the file already exists an
              error occurs.

  'SCRATCH'   Create a new file and delete it when the file is
              closed.

  'REPLACE'   Replace the file with another. If the file to be
              replaced exists, it is deleted and a new file is
              created with the same name.  If the file to be replaced
              does not exist, a new file is created and its status
              changes to 'OLD'.

  'UNKNOWN'   Open the file as OLD; if it does not exist, then
              open the file as NEW.

  The default is 'UNKNOWN'.  However, if you implicitly open a file
  using WRITE or you specify compiler option /NOF77 (or OPTIONS
  /NOF77), the default value is 'NEW'.  If you implicitly open a file
  using READ, the default is 'OLD'.

  Scratch files (STATUS='SCRATCH') are created on the user's default
  disk (SYS$DISK) and are not placed in a directory or given a name
  that is externally visible.  To indicate a different device, use
  the FILE specifier.

                                 NOTE

          The  STATUS  parameter  is  also  used   in   CLOSE
          statements  to  specify  the status of a file after
          the file is closed.  However, in  CLOSE  statements
          the  STATUS values are the same as those listed for
          the DISPOSE specifier (see OPEN DISPOSE).

62.61.32  –  TYPE

  TYPE is a nonstandard synonym for STATUS (see OPEN STATUS).

62.61.33  –  UNIT

  Indicates the logical unit to which a file is to be connected.  It
  takes the following form:

  [UNIT=] u

  u  Is a numeric expression

  The unit specification must appear in the parameter list, unless
  the unit specifier is the first element in the list.

  The logical unit may already be connected to a file when an OPEN
  statement is executed.  If this file is not the same as the one to
  be opened, the OPEN statement executes as if a CLOSE statement had
  executed just before it.

  If the file to be opened is already connected to the unit or if the
  file specifier (FILE keyword) is not included in the OPEN
  statement, only the blank specifier (BLANK keyword) can have a
  value different from the one currently in effect.  The position of
  the file is unaffected.

62.61.34  –  USEROPEN

  Indicates a user-written external function that controls the
  opening of the file.  It takes the following form:

  USEROPEN = func

  func  Is the symbolic name of the USEROPEN function.

  The function must be declared in a previous EXTERNAL statement; if
  it is typed, it must be INTEGER*4.

62.62  –  OPTIONAL

  Permits dummy arguments to be omitted in a procedure reference.

  The OPTIONAL attribute can be specified in a type declaration
  statement or an OPTIONAL statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] OPTIONAL [,att-ls] :: d-arg [,d-arg]...

  Statement:

   OPTIONAL [::] d-arg [,d-arg]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     d-arg     Is the name of a dummy argument.

  The OPTIONAL attribute can only appear in the scoping unit of a
  subprogram or an interface body, and can only be specified for
  dummy arguments.

  A dummy argument is "present" if it associated with an actual
  argument.  A dummy argument that is not optional must be present.
  You can use the PRESENT intrinsic function to determine whether an
  optional dummy argument is associated with an actual argument.

  To call a procedure that has an optional argument, you must use an
  explicit interface.

  The OPTIONAL attribute is compatible with the DIMENSION, EXTERNAL,
  INTENT, POINTER, TARGET, and VOLATILE attributes.

  EXAMPLES:

  The following example shows a type declaration statement specifying
  the OPTIONAL attribute:

    SUBROUTINE TEST(A)
    REAL, OPTIONAL, DIMENSION(-10:2) :: A
    END SUBROUTINE

  The following is an example of the OPTIONAL statement:

         SUBROUTINE TEST(A, B, L, X)
         OPTIONAL :: B
         INTEGER A, B, L, X

         IF (PRESENT(B)) THEN        ! Printing of B is conditional
            PRINT *, A, B, L, X      !   on its presence
         ELSE
            PRINT *, A, L, X
         ENDIF
         END SUBROUTINE

         INTERFACE
            SUBROUTINE TEST(ONE, TWO, THREE, FOUR)
             INTEGER ONE, TWO, THREE, FOUR
             OPTIONAL :: TWO
           END SUBROUTINE
         END INTERFACE

         INTEGER I, J, K, L

         I = 1
         J = 2
         K = 3
         L = 4

         CALL TEST(I, J, K, L)            ! Prints:  1  2  3  4
         CALL TEST(I, THREE=K, FOUR=L)    ! Prints:  1  3  4
         END

  Note that in the second call to subroutine TEST, the second
  positional (optional) argument is omitted.  In this case, all
  following arguments must be keyword arguments.

62.63  –  OPTIONS

  Overrides or confirms the compiler options in effect for a program
  unit.  Statement format:

     OPTIONS option [option...]

     option  Is one of the following:

     /ASSUME=[NO]UNDERSCORE

     /CHECK=(ALL, [NO]BOUNDS, [NO]OVERFLOW, [NO]UNDERFLOW, NONE)
     /NOCHECK

     /CONVERT=(BIG_ENDIAN, CRAY, FDX, FGX, IBM, LITTLE_ENDIAN,
              NATIVE, VAXD, VAXG)

     /[NO]EXTEND_SOURCE
     /[NO]F77
     /FLOAT=(D_FLOAT, G_FLOAT, IEEE_FLOAT)
     /[NO]G_FLOATING
     /[NO]I4
     /[NO]RECURSIVE

  You must place the slash (/) before the option.

  The OPTIONS statement must be the first statement in a program
  unit, preceding the PROGRAM, SUBROUTINE, FUNCTION, MODULE, and
  BLOCK DATA statements.

  OPTIONS statement options have the same syntax and abbreviations as
  their similarly-named VMS compiler options.

  OPTIONS statement options override compiler options, but only until
  the end of the program unit for which they are defined.  Thus, an
  OPTIONS statement must appear before each program unit in which you
  wish to override the compiler options.

62.64  –  PARAMETER

  Associates a symbolic name with a constant value.

  The PARAMETER attribute can be specified in a type declaration
  statement or an PARAMETER statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] PARAMETER [,att-ls] :: p=c [,p=c]...

  Statement:

   PARAMETER (p=c [,p=c]...)

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     p  Is the symbolic name of the constant.

     c  Is a constant, a compile-time expression, or the
        symbolic name of a constant.

  If the symbolic name is used as the length specifier in a CHARACTER
  declaration, it must be enclosed in parentheses.

  If the symbolic name is used as a numeric item in a FORMAT edit
  description, it must be enclosed in angle brackets.

  The symbolic name of a constant cannot appear as part of another
  constant, although it can appear as either the real or imaginary
  part of a complex constant.

  A symbolic name can be defined only once within the same program
  unit.

  You can only use a symbolic name defined to be a constant within
  the program unit containing the defining PARAMETER statement.

  The data type of a symbolic name associated with a constant is
  determined as follows:

   -  By an explicit type declaration statement preceding the
      defining PARAMETER statement

   -  By the same rules for implicit declarations that determine the
      data type of any other symbolic name

      For example, the following PARAMETER statement is interpreted
      as MU=1 (MU has an integer data type by implication):

         PARAMETER (MU=1.23)

      If the PARAMETER statement is preceded by an appropriate type
      declaration or IMPLICIT statement, it could be interpreted as
      MU=1.23; for example:

         REAL*8 MU
         PARAMETER (MU=1.23)

  Once a symbolic name is associated with a constant, it can appear
  anywhere in a program that any other constant can appear --- except
  in FORMAT statements (where constants can only be used in variable
  format expressions) and as the character count for Hollerith
  constants.  For compilation purposes, writing the name is the same
  as writing the value.

  The PARAMETER attribute is compatible with the PRIVATE and PUBLIC
  attributes.

  For information on an alternate syntax for PARAMETER, see Help
  topic:  COMPATIBILITY_FEATURES PARAMETER.

62.65  –  PAUSE

  The PAUSE statement displays a message on the terminal and
  temporarily suspends program execution, so that you can take some
  action.  This statement has been deleted in Fortran 95; it was an
  obsolescent feature in Fortran 90.  VSI Fortran fully supports
  features deleted in Fortran 95.

  Statement format:

     PAUSE [disp]

     disp  Is an optional character constant or a string of
           up to six digits.  (Fortran 95/90 and FORTRAN 77 limit
           digits to five.)

  If you do not specify a value for "disp", the system displays the
  following default message:

     FORTRAN PAUSE

  The system then displays the system prompt.

  If you specify a value for "disp", this value is displayed instead
  of the default message.

  EFFECT OF PAUSE IN INTERACTIVE MODE:

  In interactive mode, the program is suspended until you enter one
  of the following commands:

   o  CONTINUE - to resume execution at the next executable
      statement.

   o  DEBUG - to resume execution under control of the VMS Debugger.

   o  EXIT - to terminate execution.

      Note that any command, other than CONTINUE or DEBUG, terminates
      execution.

  EFFECT OF PAUSE IN BATCH PROCESS MODE:

  If a program is a batch process, the program is not suspended.  If
  you specify a value for "disp", this value is written to the system
  output file.

62.66  –  POINTER

  Specifies that an object is a pointer.

  The POINTER attribute can be specified in a type declaration
  statement or an POINTER statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] POINTER [,att-ls] :: ptr [(spec)] [,ptr [(spec)]]...

  Statement:

   POINTER [::] ptr [(spec)] [,ptr [(spec)]]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     ptr       Is the name of the pointer.  The pointer
               cannot be declared with the INTENT or
               PARAMETER attributes.

     spec      Is a deferred-shape specification
               (: [,:]...).

  A pointer must not be referenced or defined unless it becomes
  pointer associated (through pointer assignment or an ALLOCATE
  statement) with a target object that can be referenced or defined.
  An object with the POINTER attribute has no initial storage set
  aside for it.

  If the pointer is an array, and it is given the DIMENSION attribute
  elsewhere in the program, it must be declared as a deferred-shape
  array.

  A pointer cannot be specified in an EQUIVALENCE or NAMELIST
  statement.

  The POINTER attribute is compatible with the AUTOMATIC, DIMENSION
  (with deferred shape), OPTIONAL, PRIVATE, PUBLIC, SAVE, STATIC, and
  VOLATILE attributes.

  EXAMPLES:

  The following example shows type declaration statements specifying
  the POINTER attribute:

     TYPE(SYSTEM), POINTER :: CURRENT, LAST
     REAL, DIMENSION(:,:), POINTER :: I, J, REVERSE

  The following is an example of the POINTER statement:

     TYPE(SYSTEM) :: TODAYS
     POINTER :: TODAYS, A(:,:)

62.67  –  PRINT

  Transfers output data from internal storage to external records
  that are sequentially accessed.

62.67.1  –  Formatted

  Translates data from binary to character format as specified by f.
  Statement format:

     PRINT f[,iolist]

     f       Is a format specifier not prefaced by FMT=.

     iolist  Are the names of the variables from which the
             data is transferred, listed in the order of transfer.

62.67.2  –  List-directed

  Translates data from binary to character format according to the
  data types of the variables in the I/O list.  Statement format:

     PRINT *[,iolist]

     *       Specifies list-directed formatting.

     iolist  Are the names of the variables from which the data
             is transferred, listed in the order of transfer.

62.67.3  –  Namelist

  Translates data from binary to character format according to the
  data types of the list entities in the corresponding NAMELIST
  statement.  Statement format:

     PRINT n

     n  Is a namelist group name not prefaced by NML=.

62.68  –  PRIVATE and PUBLIC

  Specify the accessibility of entities in a module.  (These
  attributes are also called accessibility attributes.)

  The PRIVATE and PUBLIC attributes can be specified in a type
  declaration statement or in a PRIVATE or PUBLIC statement, and take
  one of the following forms:

  Type Declaration Statement:

   type, [att-ls,] PRIVATE [,att-ls] :: ent [,ent]...
   type, [att-ls,] PUBLIC  [,att-ls] :: ent [,ent]...

  Statement:

   PRIVATE [[::] ent [,ent]...]
   PUBLIC  [[::] ent [,ent]...]

    type      Is a data type specifier.

    att-ls    Is an optional list of attribute specifiers.

    ent       Is one of the following:

              A variable name
              A procedure name
              A derived type name
              A named constant
              A namelist group name

              In statement form, an entity can also be
              a generic identifier (a generic name,
              defined operator, or defined assignment).

  The PRIVATE and PUBLIC attributes can only appear in the scoping
  unit of a module.

  Only one PRIVATE or PUBLIC statement without an entity list is
  permitted in the scoping unit of a module; it sets the default
  accessibility of all entities in the module.

  If no PUBLIC or PRIVATE statements are specified in a module, the
  default is PUBLIC accessibility.  Entities with PUBLIC
  accessibility can be accessed from outside the module by means of a
  USE statement.

  If a derived type is declared PRIVATE in a module, its components
  are also PRIVATE.  The derived type and its components are
  accessible to any subprograms within the defining module through
  host association, but they are not accessible from outside the
  module.

  If the derived type is declared PUBLIC in a module, but its
  components are declared PRIVATE, any scoping unit accessing the
  module though use association (or host association) can access the
  derived-type definition, but not its components.

  If a module procedure has a dummy argument or a function result of
  a type that has PRIVATE accessibility, the module procedure must
  have PRIVATE accessibility.  If the module has a generic
  identifier, it must also be declared PRIVATE.

  If a procedure has a generic identifier, the accessibility of the
  procedure's specific name is independent of the accessibility of
  its generic identifier.  One can be declared PRIVATE and the other
  PUBLIC.

  The PRIVATE attribute is compatible with the ALLOCATABLE,
  DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, POINTER, SAVE, STATIC,
  TARGET, and VOLATILE attributes.

  The PUBLIC attribute is compatible with the ALLOCATABLE, DIMENSION,
  EXTERNAL, INTRINSIC, PARAMETER, POINTER, SAVE, STATIC, TARGET, and
  VOLATILE attributes.

  EXAMPLES:

  The following examples show type declaration statements specifying
  the PUBLIC and PRIVATE attributes:

     REAL,  PRIVATE  :: A, B, C
     INTEGER, PUBLIC :: LOCAL_SUMS

  The following is an example of the PUBLIC and PRIVATE statements:

     MODULE SOME_DATA
       REAL ALL_B
       PUBLIC ALL_B
       TYPE RESTRICTED_DATA
         REAL LOCAL_C
         DIMENSION LOCAL_C(50)
       END TYPE RESTRICTED_DATA
       PRIVATE RESTRICTED_DATA
     END MODULE

  The following derived-type declaration statement indicates that the
  type is restricted to the module:

     TYPE, PRIVATE  :: DATA
       ...
     END TYPE DATA

  The following example shows a PUBLIC type with PRIVATE components:

     MODULE MATTER
       TYPE ELEMENTS
         PRIVATE
         INTEGER C, D
       END TYPE
     ...
     END MODULE MATTER

  In this case, components C and D are private to type ELEMENTS, but
  type ELEMENTS is not private to MODULE MATTER.  Any program unit
  that uses the module MATTER, can declare variables of type
  ELEMENTS, and pass as arguments values of type ELEMENTS.

62.69  –  PROGRAM

  Begins a main program.  The PROGRAM statement is optional; when
  used, it can only be preceded by comment lines or an OPTIONS
  statement.  Statement format:

     PROGRAM nam

     nam   Is a symbolic name for the program.  The name must
           be unique among all global names in the program.

  If no PROGRAM statement begins the program, the program name
  defaults to filename$MAIN, where filename is the name of the file
  containing the program.

  The main program cannot contain the following attributes:  INTENT,
  OPTIONAL, PRIVATE, or PUBLIC.

  A main program can contain an internal subprogram (defines an
  internal procedure).  It must be preceded by a CONTAINS statement.

62.70  –  READ

  Transfers data from external or internal units to internal storage.

  The meanings of the symbolic abbreviations used to represent the
  parameters in the READ statement syntax are as follows:

     extu     Is the logical unit or internal file optionally
     or       prefaced by UNIT=.  UNIT= is required if unit is
     intu     not the first element in the clist.

     fmt      Specifies whether formatting is to be used for
              data editing, and if it is, the format specification
              or an asterisk (*) to indicate list-directed formatting.
              The "fmt" is optionally prefaced by FMT=, if "fmt" is
              the second parameter in the clist and the first parameter
              is a logical or internal unit specifier without the
              optional keyword UNIT=.

     nml      Is the namelist group specification for namelist I/O.
              Optionally prefaced by NML=.  NML= is required
              if namelist is not the second I/O specifier.

     rec      Is the cell number of a record to be accessed directly.
              Optionally prefaced by REC= or by an apostrophe (').

     iostat   Is the name of a variable to contain the completion
              status of the I/O operation. Optionally prefaced
              by IOSTAT=.

     err      Is the label of a statement to which control is
              transferred in the event of an error. Optionally
              prefaced by ERR=.

     end      Is the label of a statement to which control is
              transferred in the event of an end-of-file.
              Optionally prefaced by END=.

     eor      Is the label of a statement to which control is
              transferred in the event of an end-of-record.
              Optionally prefaced by EOR=.  This can only
              be specified for nonadvancing READs.

     adv      Specifies advancing (ADVANCE='YES') or nonadvancing
              input (ADVANCE='NO').  The default is 'YES'.

     size     Specifies character count (SIZE=int). It can
              only be indicated for nonadvancing READs.

     keyspec  Specifies the key of field value of a record to
              be accessed.  Optionally prefaced by KEY=, KEYEQ=,
              KEYGE=, KEYGT=, KEYNXT, KEYNXTNE, KEYLT, or KEYLE.

     keyid    Specifies the key field index that is to be searched
              for the specified key field value. Optionally in-
              cluded with keyspec and optionally prefaced by KEYID=.

     iolist   Are the names of the variables, arrays, array
              elements, or character substrings from which or
              to which data will be transferred.  Optionally
              an implied-DO list.

  The control-list parameters are "extu" (or "intu"), "fmt", "nml",
  "rec", "iostat", "err", "end", "adv", "size", "keyspec", and
  "keyid".  The I/O list parameter is "iolist".

62.70.1  –  Sequential

62.70.1.1  –  Formatted

  Translates the data from character to binary format as specified by
  format specifications.  Statement formats:

  1. READ (extu, fmt [,adv][,size][,iostat][,err][,end][,eor]) [iolist]

     Reads from a specified external unit.

  2. READ fmt [,iolist]

     Reads from FOR$READ (normally, the terminal).

62.70.1.2  –  List-directed

  List-directed sequential READ statement formats:

  1. READ(extu,*[,iostat][,err][,end])[iolist]

     Reads from a specified external unit.
     Translates the data from character to binary
     format according to the data types of the
     variables in the I/O list.

  2. READ * [,iolist]

     Reads from FOR$READ (normally, the terminal).
     Translates the data from character to binary
     format according to the data types of the
     variables in the I/O list.

62.70.1.3  –  Namelist

  Namelist sequential READ statement formats:

  1. READ (extu,nml [,iostat][,err][,end])

     Reads from a specified external unit.  Translates
     the data from character to binary format according
     to the data types of the list entities in the
     corresponding NAMELIST statement.

  2. READ nml

     Reads from FOR$READ (normally, the terminal).
     Translates the data from character to binary format
     according to the data types of the entities in the
     corresponding NAMELIST statement.

62.70.1.4  –  Unformatted

  Unformatted sequential READ statement format:

     READ (extu,[,iostat][,err][,end]) [iolist]

  Reads from a specified external unit.  Does not translate the data.

62.70.2  –  Direct

62.70.2.1  –  Formatted

  Formatted direct READ statement format:

     READ (extu,fmt,rec[,iostat][,err]) [iolist]

  Reads from a specified external unit.  Translates the data from
  character to binary format as specified by "fmt".

62.70.2.2  –  Unformatted

  Unformatted direct READ statement format:

     READ (extu,rec[,iostat][,err]) [iolist]

  Reads from a specified external unit.  Does not translate the data.

62.70.3  –  Indexed

62.70.3.1  –  Formatted

  Formatted Indexed READ statement format:

     READ (extu,fmt,keyspec[,keyid][,err][,iostat]) [iolist]

  Reads from a specified external unit.  Translates the data from
  character to binary format as specified by "fmt".

62.70.3.2  –  Unformatted

  Unformatted Indexed READ statement format:

     READ (extu,keyspec[,keyid][,err][,iostat]) [iolist]

  Reads from a specified external unit.  Does not translate the data.

62.70.4  –  Internal

  Internal READ statement format:

     READ (intu,fmt[,err][,iostat][,end]) [iolist]

  Reads from a specified character variable.  Translates the data
  from character to binary format as specified by "fmt".

62.71  –  RECORD

  Creates a record structure consisting of the variables and arrays
  specified in a previous structure declaration.  Statement format:

     RECORD /str/rnlist[,/str/rnlist...]

     str     Is the name of a previously declared structure.

     rnlist  Is a list of one or more variable names, array
             names, or array declarators, separated by commas.
             All of the records named in this list have the
             same structure and are allocated separately in
             memory.

  Record variables can be used in COMMON and DIMENSION statements,
  but not in DATA, EQUIVALENCE, or NAMELIST statements.

  Records initially have undefined values unless you have defined
  their values in structure declarations.

  See also COMPATIBILITY_FEATURES RECORD_STRUCTURE in this Help file.

62.72  –  RETURN

  Transfers control from a subprogram to the calling program.  You
  can only use RETURN in a subprogram unit.  Statement format:

     RETURN [i]

     i  Is an optional integer constant or expression (such
        as 2 or I+J) indicating the position of an alternate
        return from the subprogram in the actual argument list.
        The "i" is converted to an integer value if necessary.

  The argument "i" is valid only for subroutine subprograms.  If no
  alternate return is specified or the specified alternate return
  does not exist in the actual argument list, control returns to the
  statement following the CALL statement.

                                 NOTE

          An alternate return is an  obsolescent  feature  in
          Fortran  95  and  Fortran 90.  VSI Fortran fully
          supports this feature.

  If the subprogram is a function, control returns to the statement
  containing the function reference.  If the subprogram is a
  subroutine, control returns either to the statement following the
  CALL statement, or to the label specified by the alternate return
  argument.

62.73  –  REWIND

  Positions a sequential or direct access file at the beginning of
  the file.  Do not use a REWIND statement for a file that is open
  for indexed access.  Use this statement only for files on disk or
  magnetic tape.  Statement format:

      REWIND ([UNIT=]u[,ERR=s][,IOSTAT=ios])
      REWIND u

      u    Is an integer variable or constant specifying the
           logical unit number of the file, optionally prefaced
           by UNIT=.  UNIT= is required if unit is not the first
           I/O specifier.

      s    Is the label of a statement to which control is
           transferred if an error occurs, prefaced by ERR=.

      ios  Is an integer variable to which the completion status
           of the I/O operation is returned, prefaced by IOSTAT=.

  The unit number must refer to a file on disk or magnetic tape, and
  the file must be open for sequential, direct, or append access.

  If a REWIND is done on a direct access file, the NEXTREC specifier
  is assigned a value of 1.

  A REWIND statement must not be specified for a file that is open
  for keyed access.

  If a file is already positioned at the initial point, a REWIND
  statement has no effect.

  If a REWIND statement is specified for a unit that is not open, it
  has no effect.

  See also STATEMENTS BACKSPACE in this Help file.

62.74  –  REWRITE

  Transfers data from internal storage and writes the data
  (translated if formatted; untranslated if unformatted) to the
  current record in the following types of files:  an indexed,
  sequential (only if the current record and new record are the same
  length), or relative file.

  The current record is the last record accessed by a preceding,
  successful direct access, indexed, or sequential READ statement.

     Formatted REWRITE statement format:

      REWRITE ([UNIT=]u,[FMT=]f[,ERR=s][,IOSTAT=ios])[iolist]

     Translates the data from binary to character format as
     specified by FMT.

     Unformatted REWRITE statement format:

      REWRITE ([UNIT=]u[,ERR=s][,IOSTAT=ios])[iolist]

     Does not translate the binary data.

     Arguments:

     u       Is an integer variable or constant specifying the
             logical unit number of the file, optionally
             prefaced by UNIT=.  UNIT= is required if unit is
             not the first I/O specifier.

     f       Is a format specifier.

     s       Is the label of a statement to which control is
             transferred if an error condition occurs, prefaced
             by ERR=.

     ios     Is an integer variable to which the completion
             status of the I/O operation is returned, prefaced
             by IOSTAT=.

     iolist  Are the names of the variables from which the data
             is transferred, listed in the order of transfer.

  Formatted REWRITE Statement Behavior and Errors:

  The formatted REWRITE statement performs the following operations:

   o  It retrieves binary values from internal storage.

   o  It translates those values to character form as specified by
      FORMAT.

   o  It writes the translated data to a current (existing) record in
      a file OPENed with ORGANIZATION='INDEXED', 'RELATIVE', or
      'SEQUENTIAL' (For SEQUENTIAL organization, the new record must
      be the same length as the existing record.)

      The current record is the last record accessed by a preceding,
      successful indexed, direct access, or sequential READ
      statement.

  Errors occur under the following conditions:

   o  If you attempt to rewrite more than one record in a single
      REWRITE statement operation

   o  If a record is too long (Note that unused space in a rewritten,
      fixed-length record is filled with spaces.)

   o  If the primary key value is changed

  In the following example, the REWRITE statement updates the current
  record contained in the relative organization file connected to
  logical unit 3 with the values represented by NAME, AGE, and BIRTH.

           REWRITE (3,10,ERR=99) NAME, AGE, BIRTH
     10    FORMAT (A16,I2,A8)

  Unformatted REWRITE Statement Behavior and Errors:

  The formatted REWRITE statement performs the following operations:

   o  It retrieves binary values from internal storage.

   o  It writes the untranslated data to a current (existing)
      existing record in a file OPENed with ORGANIZATION='INDEXED',
      'RELATIVE', or 'SEQUENTIAL' (For SEQUENTIAL organization, the
      new record must be the same length as the existing record.)

      The current record is the last record accessed by a preceding,
      successful indexed, direct access, or sequential READ
      statement.

  Errors occur under the following conditions:

   o  If you attempt to rewrite more than one record in a single
      REWRITE statement operation

   o  If a record is too long (Note that unused space in a rewritten,
      fixed-length record is filled with zeros.)

   o  If the primary key value is changed

62.75  –  SAVE

  Causes the values and definition of objects to be saved across
  invocations of a subprogram.

  The SAVE attribute can be specified in a type declaration statement
  or SAVE statement, and takes one of the following forms:

  Type Declaration Statement:

   type, [att-ls,] SAVE [,att-ls] :: [obj [,obj]...]

  Statement:

   SAVE [obj [,obj]...]

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     obj       Is the name of an object, or the name of a
               common block enclosed in slashes (such as
               /CBLOCK/).

  In VSI Fortran, the definitions of COMMON variables, and local
  variables of non-recursive subprograms (other than allocatable
  arrays or variables declared AUTOMATIC), are saved by default.  To
  enhance portability and avoid possible compiler warning messages,
  HP recommends that you use the SAVE statement to name variables
  whose values you want to preserve between subprogram invocations.

  When a SAVE statement does not explicitly contain a list, all
  allowable items in the scoping unit are saved.

  A SAVE statement cannot specify the following (their values cannot
  be saved):

   o  A blank common

   o  An object in a common block

   o  A procedure

   o  A dummy argument

   o  A function result

   o  An automatic object

   o  A PARAMETER (named) constant

  Even though a common block can be included in a SAVE statement,
  individual variables within the common block can become undefined
  (or redefined) in another scoping unit.

  If a common block is saved in any scoping unit of a program (other
  than the main program), it must be saved in every scoping unit in
  which the common block appears.

  A SAVE statement has no effect in a main program.

  The SAVE attribute is compatible with the ALLOCATABLE, DIMENSION,
  POINTER, PRIVATE, PUBLIC, STATIC, TARGET, and VOLATILE attributes.

62.76  –  Statement Function

  Defines a function consisting of a single expression.  The function
  must be invoked from the program unit in which it is defined.
  Format:

     fun([p [,p]...])=e

     fun  Is the symbolic name for the function. You can
          establish its type explicitly or implicitly. The
          value of the expression is returned to the function
          name when the function is invoked.

     p    Is an unsubscripted variable name specifying a
          dummy argument.  The arguments must agree in order,
          number, and type with the actual arguments of the
          statement invoking the function.

     e    Is an arithmetic, logical, or character expression.
          If the expression contains a reference to another
          statement function, the referenced statement
          function must precede the statement function
          containing the reference.

  Declarator information does not apply to a dummy argument except
  for type.  For example, you cannot define a dummy argument as an
  array or as part of a common block.

  If you use the name of a dummy argument outside the function
  statement, the name defines another separate data entity.

                                 NOTE

          This  statement  is  obsolescent  in  Fortran   95.
          HP  Fortran  flags  obsolescent  features,  but
          fully supports them.

62.77  –  SELECT_CASE

  See STATEMENTS CASE in this Help file.

62.78  –  SEQUENCE

  Permitted for derived types.  Allows derived-type components to be
  used in COMMON and EQUIVALENCE statements.

  See DATA DERIVED_TYPES TYPE_DEFINITIONS in this Help file.

62.79  –  STOP

  Terminates program execution.  Statement format:

     STOP [disp]

     disp  Is a character constant or a string of up to
           six digits.  (Fortran 95/90 and FORTRAN 77 limit
           digits to five.)

  If you specify the optional argument "disp", the STOP statement
  displays the contents of "disp" at your terminal, terminates
  program execution, and returns control to the operating system.

  If you do not specify a value for "disp", no message is displayed.

62.80  –  STRUCTURE

  Indicates the beginning of the record structure declaration and
  defines the name of the structure.  Declaration format:

     STRUCTURE [/str/][fnlist]
       fdcl
       [fdcl]
       ...
       [fdcl]
     END STRUCTURE

     str     Identifies a structure name, which is used in
             subsequent RECORD statements to refer to the
             structure. A structure name is enclosed in slashes.

     fnlist  Identifies field names when used in a substructure
             declaration.(Only allowed in nested structure
             declarations.)

     fdcl    (Also called the declaration body.)  Is any
             declaration or combination of declarations of
             substructures, unions, or typed data, or
             PARAMETER statements.

  Subsequent RECORD statements use the structure name to refer to the
  structure.  A structure name must be unique among structure names,
  but structures can share names with variables (scalar or array),
  record fields, PARAMETER constants, and common blocks.

  Structure declarations can be nested (contain one or more other
  structure declarations).  A structure name is required for the
  structured declaration at the outermost level of nesting, and
  optional for the other declarations nested in it.  However, if you
  wish to reference a nested structure in a RECORD statement in your
  program, it must have a name.

  Structure, field, and record names are all local to the defining
  program unit.  When records are passed as arguments, the fields
  must match in type, order, and dimension.

  Unlike type declaration statements, structure declarations do not
  create variables.  Structured variables (records) are created when
  you use a RECORD statement containing the name of a previously
  declared structure.  The RECORD statement can be considered as a
  kind of type declaration statement.  The difference is that
  aggregate items, not single items, are being defined.

  Within a structure declaration, the ordering of both the statements
  and the field names within the statements is important because this
  ordering determines the order of the fields in records.

  In a structure declaration, each field offset is the sum of the
  lengths of the previous fields.  The length of the structure,
  therefore, is the sum of the lengths of its fields.  The structure
  is packed; you must explicitly provide any alignment that is needed
  by including, for example, unnamed fields of the appropriate
  length.

  By default, fields are aligned on natural boundaries; misaligned
  fields are padded as necessary.  To avoid padding of records, you
  should lay out structures so that all fields are naturally aligned.

  To pack fields on arbitrary byte boundaries, you must specify a
  compiler option.  You can also specify alignment for fields by
  using the cDEC$ OPTIONS general directive.

  In the following example, the declaration defines a structure named
  DATE.  This structure contains three scalar fields:  DAY
  (LOGICAL*1), MONTH (LOGICAL*1), and YEAR (INTEGER*2).

     STRUCTURE /DATE/
         LOGICAL*1  DAY, MONTH
         INTEGER*2  YEAR
     END STRUCTURE

  See also COMPATIBILITY_FEATURES RECORD_STRUCTURE in this Help file.

62.80.1  –  Type declarations

  The syntax of a type declaration within a record structure is
  identical to that of a normal Fortran type declaration statement:
  it includes a data type (for example, INTEGER), one or more names
  of variables or arrays; and optionally, one or more data
  initialization values.

  The following rules and behavior apply to type declarations in
  record structures:

   o  %FILL can be specified in place of a field name to leave space
      in a record for purposes such as alignment.  This creates an
      unnamed field.

      %FILL can have an array declarator; for example:

         INTEGER %FILL (2,2)

      Unnamed fields cannot be initialized.  For example, the
      following statement is invalid and generates an error message:

         INTEGER*4 %FILL /1980/

   o  Initial values can be supplied in field declaration statements.
      These initial values are supplied for all records that are
      declared using this structure.  Fields not initialized will
      have undefined values when variables are declared by means of
      RECORD statements.  Unnamed fields cannot be initialized; they
      are always undefined.

   o  Field names must always be given explicit data types.  The
      IMPLICIT statement has no effect on statements within a
      structure declaration.

   o  All Fortran data types are allowed in field declarations.

   o  Any required array dimensions must be specified in the field
      declaration statements.  DIMENSION statements cannot be used to
      define field names.

   o  Adjustable or assumed sized arrays and passed-length CHARACTER
      declarations are not allowed in field declarations.

   o  Field names within the same declaration level must be unique,
      but an inner structure declaration (substructure declaration)
      can include field names used in an outer structure declaration
      without conflict.

62.80.2  –  Substructure declarations

  A field within a structure can itself be a structured item composed
  of other fields, other structures, or both.  You can declare a
  substructure in two ways:

   o  By nesting structure declarations within other structure or
      union declarations (with the limitation that you cannot refer
      to a structure inside itself at any level of nesting).

      One or more field names must be defined in the STRUCTURE
      statement for the substructure because all fields in a
      structure must be named.  In this case, the substructure is
      being used as a field within a structure or union.

      Field names within the same declaration nesting level must be
      unique, but an inner structure declaration can include field
      names used in an outer structure declaration without conflict.

      %FILL can be specified in place of a field name to leave space
      in a record for purposes such as alignment.

   o  By using a RECORD statement that specifies another previously
      defined record structure, thereby including it in the structure
      being declared.

62.80.3  –  Union declarations

  A union declaration is a multistatement declaration defining a data
  area that can be shared intermittently during program execution by
  one or more fields or groups of fields.  A union declaration must
  be within a structure declaration.  A union declaration is
  initiated by a UNION statement and terminated by an END UNION
  statement.  Enclosed within these statements are two or more map
  declarations, initiated and terminated by MAP and END MAP
  statements.  Each unique field or group of fields is defined by a
  separate map declaration.

  A union declaration takes the following form:

     UNION
          mdcl
         [mdcl]
         ...
         [mdcl]
     END UNION

     Where "mdcl" represents:

     MAP
        fdcl
       [fdcl]
       ...
       [fdcl]
     END MAP

     fdcl  Is any declaration or combination of declarations
           of substructures, unions, or type declarations.

  As with normal Fortran type declarations, data can be initialized
  in field declaration statements in union declarations.  However, if
  fields within multiple map declarations in a single union are
  initialized, the data declarations are initialized in the order in
  which the statements appear.  As a result, only the final
  initialization takes effect and all of the preceding
  initializations are overwritten.

  The size of the shared area established for a union declaration is
  the size of the largest map defined for that union.  The size of a
  map is the sum of the sizes of the fields declared within it.

  As the variables or arrays declared in map fields in a union
  declaration are assigned values during program execution, the
  values are established in a record in the field shared with other
  map fields in the union.  The fields of only one of the map
  declarations are defined within a union at any given point in the
  execution of a program.  However, if you overlay one variable with
  another smaller variable, that portion of the initial variable is
  retained that is not overlaid.  Depending on the application, the
  retained portion of an overlaid variable may or may not contain
  meaningful data and can be utilized at a later point in the
  program.

  Manipulating data using union declarations is similar to the effect
  of using EQUIVALENCE statements.  The difference is that data
  entities specified within EQUIVALENCE statements are concurrently
  associated with a common storage location and the data residing
  there; with union declarations you can use one discrete storage
  location to alternately contain a variety of fields (arrays or
  variables).

  With union declarations, only one map declaration within a union
  declaration can be associated at any point in time with the storage
  location that they share.  Whenever a field within another map
  declaration in the same union declaration is referenced in your
  program, the fields in the prior map declaration become undefined
  and are succeeded by the fields in the map declaration containing
  the newly referenced field.

  In the following example, the structure WORDS_LONG is defined.
  This structure contains a union declaration defining two map
  fields.  The first map field consists of three INTEGER*2 variables
  (WORD_0, WORD_1, and WORD_2), and the second, an INTEGER*4
  variable, LONG:

     STRUCTURE /WORDS_LONG/
         UNION
             MAP
              INTEGER*2    WORD_0, WORD_1, WORD_2
             END MAP
             MAP
              INTEGER*4    LONG
             END MAP
         END UNION
     END STRUCTURE

62.80.4  –  PARAMETER Statements

  PARAMETER statements:  PARAMETER statements can appear in a
  structure declaration, but cannot be given a data type within the
  declaration block.  Consider the following:

     STRUCTURE /ABC/
         INTEGER*4 P
         PARAMETER (P=4)
         REAL*4 F
     END STRUCTURE
         REAL*4 A(P)

  In this example, the INTEGER*4 statement does not provide the data
  type for PARAMETER constant P, but instead declares a record field
  P in structure ABC.  The subsequent PARAMETER statement declares a
  new, different symbol which is given the implicit data type for
  identifiers beginning with the letter P.

  Type declarations for PARAMETER symbolic names must precede the
  PARAMETER statement and be outside of a STRUCTURE declaration, as
  follows:

         INTEGER*4 P
     STRUCTURE /ABC/
         PARAMETER (P=4)
         REAL*4 F
     END STRUCTURE
         REAL*4 A(P)

  For more information on PARAMETER statements, see STATEMENTS
  PARAMETER in this Help file.

62.81  –  SUBROUTINE

  Begins a subroutine subprogram and names the dummy arguments.  The
  CALL statement transfers control to a subroutine subprogram; a
  RETURN or END statement returns control to the calling program
  unit.  Statement format:

     [prefx] SUBROUTINE nam [([p[,p]...])]

     prefx Is one of the following keywords:

           RECURSIVE    Permits direct recursion to occur.

           PURE         Restricts the procedure from having
                        side effects.

           ELEMENTAL    Specifies PURE with certain constraints
                        on a dummy argument:

                        o It must be scalar and cannot have the
                          POINTER attribute.
                        o It cannot appear in a specification
                          expression, except as an argument to the
                          BIT_SIZE, KIND, or LEN intrinsic functions
                          or the numeric inquiry intrinsic functions
                        o It must not be *
                        o It must not be a dummy procedure

                        An explicit interface must be visible to the
                        caller of an ELEMENTAL procedure.

                        If ELEMENTAL is specified, RECURSIVE must not
                        be specified.

     nam  Is a symbolic name for the subroutine.  The name must
          be unique among all global names in the program.

     p    Is an unsubscripted variable name specifying a dummy
          argument.  An asterisk (*) as a dummy argument specifies
          that the actual argument is an alternate return argument.

  The arguments must agree in order, number, and type with the actual
  arguments of the statement invoking the subroutine.  A dummy
  argument must not be defined as an array with more elements than
  the actual argument holds.  When control transfers to the
  subroutine, the values of any actual arguments in the CALL
  statement are associated with any corresponding dummy arguments in
  the SUBROUTINE statement.  The statements in the subprogram are
  then executed.

  The SUBROUTINE statement must be the first statement of a
  subroutine, unless an OPTIONS statement is specified.

  A subroutine subprogram cannot contain a FUNCTION statement, a
  BLOCK DATA statement, a PROGRAM statement, or another SUBROUTINE
  statement.

  ENTRY statements are allowed to specify multiple entry points in
  the subroutine.

  The array declarator for a dummy argument can itself contain
  integer values that are dummy arguments or are references to a
  common block, providing for adjustable size arrays in subroutines.
  The upper bound of the array declarator for a dummy argument can be
  specified as an asterisk, in which case the upper bound of the
  dummy argument assumes the size of the upper bound of the actual
  argument.  The size in a character string declarator for a dummy
  argument can be specified as an asterisk in parentheses, in which
  case the size of the actual argument is passed to the dummy
  argument.

  The values of the actual arguments in the invoking program unit
  become the values of the dummy arguments in the function.  If you
  modify a dummy argument, the corresponding actual argument in the
  invoking program unit is also modified; the actual argument must be
  a variable if it is to be modified.

  If the actual argument is a character constant, the dummy argument
  can be either character or numeric in type, unless the name of the
  subprogram being invoked is a dummy argument in the invoking
  program unit.  If the actual argument is a Hollerith constant, the
  dummy argument must be numeric.

62.82  –  TARGET

  Specifies that an object can become the target of a pointer.

  The TARGET attribute can be specified in a type declaration
  statement or TARGET statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] TARGET [,att-ls] :: obj [spec] [,obj [spec]]...

  Statement:

   TARGET [::] obj [spec] [,obj [spec]]...

     type      Is a data type specifier.

     att-ls    Is an optional list of attribute specifiers.

     obj       Is the name of an object.  The object must
               not be declared with the PARAMETER attribute.

     spec      Is an array specification.

  A pointer is associated with a target by pointer assignment or by
  an ALLOCATE statement.

  If an object does not have the TARGET attribute or has not been
  allocated (using an ALLOCATE statement), no part of it can be
  accessed by a pointer.

  The TARGET attribute is compatible with the ALLOCATABLE, AUTOMATIC,
  DIMENSION, INTENT, OPTIONAL, PRIVATE, PUBLIC, SAVE, STATIC, and
  VOLATILE attributes.

  EXAMPLES:

  The following example shows type declaration statements specifying
  the TARGET attribute:

     TYPE(SYSTEM), TARGET :: FIRST
     REAL, DIMENSION(20, 20), TARGET :: C, D

  The following is an example of a TARGET statement:

     TARGET :: C(50, 50), D

62.83  –  TYPE

  Transfers output data from internal storage to external records
  that are sequentially accessed.

62.83.1  –  Formatted

  Translates data from binary to character format as specified by the
  format specifications.  Statement format:

     TYPE f[,iolist]

     f       Is a format specifier not prefaced by FMT=.

     iolist  Are the names of the variables from which the
             data is transferred, listed in the order of transfer.

62.83.2  –  List-directed

  Translates data from binary to character format according to the
  data types of the variables in the I/O list.  Statement format:

     TYPE *[,iolist]

     *       Specifies list-directed formatting.

     iolist  Are the names of the variables from which the data
             is transferred, listed in the order of transfer.

62.83.3  –  Namelist

  Translates data from binary to character format according to the
  data types of the list entities in the corresponding NAMELIST
  statement.  Statement format:

     TYPE n

     n  Is a namelist group name not prefaced by NML=.

62.84  –  Type declaration

  Explicitly specifies the properties of data objects or functions.

  Type declarations must precede all executable statements, can be
  declared only once, and cannot be used to change the type of a
  symbolic name that has already been implicitly assumed to be
  another type.

  Type declaration statements can initialize data in the same way as
  the DATA statement:  by having values, bounded by slashes, listed
  immediately after the symbolic name of the entity.

62.84.1  –  Numeric

  Statement format:

     type[*n] [[,att]...::] v [*n][/clist/][,v [*n][/clist/]]...

     type   Is any of the following data type specifiers:

            BYTE (equivalent to INTEGER*1)  DOUBLE PRECISION
            LOGICAL                         COMPLEX
            INTEGER                         DOUBLE COMPLEX
            REAL

     n      Is an integer that specifies (in bytes) the length
            of "v".  It overrides the length that is implied by
            the data type.

            The value of n must specify an acceptable length
            for the type of "v" (see the HP Fortran for OpenVMS
            Language Reference Manual).  BYTE, DOUBLE PRECISION,
            and DOUBLE COMPLEX data types have one acceptable
            length; thus, for these data types, the "n" specifier
            is invalid.

            If an array declarator is used, the "n" specifier
            must be positioned immediately after the array name.

     att    Is one of the following attribute specifiers:

            ALLOCATABLE       POINTER
            AUTOMATIC         PRIVATE
            DIMENSION         PUBLIC
            EXTERNAL          SAVE
            INTENT            STATIC
            INTRINSIC         TARGET
            OPTIONAL          VOLATILE
            PARAMETER

     v      Is the name of a data object or function.  It can
            optionally be followed by:

            o An array specification, if the object is an array
            o A character length, if the object is of type
              character
            o An initialization expression or, for pointer
              objects, =>NULL()

     clist  Is a list of constants, as in a DATA statement.  If
            "v" is the symbolic name of a constant, the "clist"
            cannot be present.

  A numeric data type declaration statement can define arrays by
  including array specifications in the list.

  A numeric type declaration statement can assign initial values to
  variables or arrays if it specifies a list of constants (the
  "clist").  The specified constants initialize only the variable or
  array that immediately precedes them.  The "clist" cannot have more
  than one item unless it initializes an array.  When the "clist"
  initializes an array, it must contain a value for every element in
  the array.

  If =>NULL() appears for a pointer, the pointer's initial
  association status is disassociated.

  In a function declaration, an array must be a deferred-shape array
  if it has the POINTER attribute; otherwise, it must be an
  explicit-shape array.

  The double colon separator (::) is required only if the declaration
  contains an attribute specifier or an initialization expression;
  otherwise it is optional.

  The same attribute must not appear more than once in a given type
  declaration statement, and an entity cannot be given the same
  attribute more than once in a scoping unit.

  If the PARAMETER attribute is specified, the declaration must
  contain an initialization expression.

  The following objects cannot be initialized in a type declaration
  statement:

   o  A dummy argument

   o  A function result

   o  An object in a named common block (unless the type declaration
      is in a block data program unit)

   o  An object in blank common

   o  An allocatable array

   o  A pointer

   o  An external name

   o  An intrinsic name

   o  An automatic object

   o  An object that has the AUTOMATIC attribute

62.84.2  –  Character

  Format:

     CHARACTER[*len[,] [[,att]...::] v[*len] [/clist/]
                                     [,v[*len] [/clist/]]...

     len    Is an unsigned integer constant, an integer constant
            expression enclosed in parentheses, or an asterisk (*)
            enclosed in parentheses.  The value of "len" specifies
            the length of the character data elements.

     att    Is one of the following attribute specifiers:

            ALLOCATABLE       POINTER
            AUTOMATIC         PRIVATE
            DIMENSION         PUBLIC
            EXTERNAL          SAVE
            INTENT            STATIC
            INTRINSIC         TARGET
            OPTIONAL          VOLATILE
            PARAMETER

     v      Is the symbolic name of a constant, variable, array,
            statement function or function subprogram, or array
            specification. The name can optionally be followed by
            a data type length specifier (*len or *(*)).

     clist  Is a list of constants, as in a DATA statement.  If
            "v" is the symbolic name of a constant, "clist" must
            not be present.

  If you use CHARACTER*len, "len" is the default length specification
  for that list.  If an item in that list does not have a length
  specification, the item's length is "len".  However, if an item
  does have a length specification, it overrides the default length
  specified in CHARACTER*len.

  When an asterisk length specification *(*) is used for a function
  name or dummy argument, it assumes the length of the corresponding
  function reference or actual argument.  Similarly, when an asterisk
  length specification is used for the symbolic name of a constant,
  the name assumes the length of the actual constant it represents.
  For example, STRING assumes a 9-byte length in the following
  statements:

     CHARACTER*(*) STRING
     PARAMETER (STRING = 'VALUE IS:')

  The length specification must range from 1 to 65535.  If no length
  is specified, a length of 1 is assumed.

  Character type declaration statements can define arrays if they
  include array specifications in their list.  The array
  specification goes first if both an array specification and a
  length are specified.

  A character type declaration statement can assign initial values to
  variables or arrays if it specifies a list of constants (the
  clist).  The specified constants initialize only the variable or
  array that immediately precedes them.  The "clist" cannot have more
  than one element unless it initializes an array.  When the "clist"
  initializes an array, it must contain a value for every element in
  the array.

  In a function declaration, an array must be a deferred-shape array
  if it has the POINTER attribute; otherwise, it must be an
  explicit-shape array.

  The double colon separator (::) is required only if the declaration
  contains an attribute specifier or an initialization expression;
  otherwise it is optional.

  The same attribute must not appear more than once in a given type
  declaration statement, and an entity cannot be given the same
  attribute more than once in a scoping unit.

  If the PARAMETER attribute is specified, the declaration must
  contain an initialization expression.

  The following objects cannot be initialized in a type declaration
  statement:

   o  A dummy argument

   o  A function result

   o  An object in a named common block (unless the type declaration
      is in a block data program unit)

   o  An object in blank common

   o  An allocatable array

   o  A pointer

   o  An external name

   o  An intrinsic name

   o  An automatic object

   o  An object that has the AUTOMATIC attribute

                                 NOTE

          The CHARACTER*len form for a CHARACTER  declaration
          is obsolescent in Fortran 95.  VSI Fortran flags
          obsolescent features, but fully supports them.

62.85  –  UNION

  See STATEMENTS STRUCTURE (subheads TYPE_DECLARATIONS and
  UNION_DECLARATIONS) in this Help file.

62.86  –  UNLOCK

  Frees the current record (that is, the last record read) in an
  indexed, relative, or sequential file.  By default, a record is
  locked when it is read.  The lock is normally held until your
  program performs another I/O operation on the unit (for example,
  rewriting the record, reading another record, or closing the file).

  Statement format:

     UNLOCK ([UNIT=]u[,ERR=s][,IOSTAT=ios])
     UNLOCK u

     u    An integer variable or constant specifying the
          logical unit number of the file, optionally
          prefaced by UNIT=.  UNIT= is required if unit is
          not the first I/O specifier.

     s    The label of a statement to which control is
          transferred if an error condition occurs.

     ios  A scalar default integer variable that is
          defined as a positive integer if an error occurs
          and zero if no error occurs.

62.87  –  USE

  Gives a program unit accessibility to public entities in a module.
  It takes one of the following forms:

     USE name [, rename-ls]
     USE name, ONLY : [only-ls]

     name       Is the name of the module.

     rename-ls  Is one or more items having the following
                form:

        local-name => mod-name

        local-name  Is the name of the entity in the program
                    unit using the module.

        mod-name    Is the name of a public entity in the module.

     only-ls   Is the name of a public entity in the module
               or a generic identifier (a generic name, defined
               operator, or defined assignment).

               An entity in the "only-ls" can also take the form:

        [local-name =>] mod-name

  If the USE statement is specified without the ONLY option, the
  program unit has access to all public entities in the named module.

  If the USE statement is specified with the ONLY option, the program
  unit has access to only those entities following the option.

  If more than one USE statement for a given module appears in a
  scoping unit, the following rules apply:

   o  If one USE statement does not have the ONLY option, all public
      entities in the module are accessible, and any "rename-ls"s and
      "only-ls"s are interpreted as a single, concatenated
      "rename-ls".

   o  If all the USE statements have ONLY options, all the "only-ls"s
      are interpreted as a single, concatenated "only-ls".  Only
      those entities named in one or more of the "only-ls"s are
      accessible.

  If two or more generic interfaces that are accessible in a scoping
  unit have the same name, the same operator, or are both
  assignments, they are interpreted as a single generic interface.
  Otherwise, multiple accessible entities can have the same name only
  if no reference to the name is made in the scoping unit.

  The local names of entities made accessible by a USE statement must
  not be respecified with any attribute other than PUBLIC or PRIVATE.
  The local names can appear in namelist group lists, but not in a
  COMMON or EQUIVALENCE statement.

  EXAMPLES:

  The following shows examples of the USE statement:

    MODULE MOD_A
      INTEGER :: B, C
      REAL E(25,5), D(100)
    END MODULE MOD_A
    ...
    SUBROUTINE SUB_Y
      USE MOD_A, DX => D, EX => E   ! Array D has been renamed
                                    ! DX and array E
      ...                           ! has been renamed EX. Scalar
                                    ! variables B
    END SUBROUTINE SUB_Y            ! and C are also available to
    ...                             ! this subroutine (using their
                                    ! module names).
    SUBROUTINE SUB_Z
      USE MOD_A, ONLY: B, C         ! Only scalar variables B and
                                    ! C are
      ...                           ! available to this subroutine
    END SUBROUTINE SUB_Z
    ...

  The following example shows a module containing common blocks:

    MODULE COLORS
      COMMON /BLOCKA/ C, D(15)
      COMMON /BLOCKB/ E, F
      ...
    END MODULE COLORS
    ...
    FUNCTION HUE(A, B)
      USE COLORS
      ...
    END FUNCTION HUE

  The USE statement makes all of the variables in the common blocks
  in module COLORS available to the function HUE.

  To provide data abstraction, a user-defined data type and
  operations to be performed on values of this type can be packaged
  together in a module.  The following example shows such a module:

    MODULE CALCULATION
      TYPE ITEM
        REAL :: X, Y
      END TYPE ITEM

      INTERFACE OPERATOR (+)
        MODULE PROCEDURE ITEM_CALC
      END INTERFACE

    CONTAINS
      FUNCTION ITEM_CALC (A1, A2)
        TYPE(ITEM) A1, A2, ITEM_CALC
        ...
      END FUNCTION ITEM_CALC
      ...
    END MODULE CALCULATION

    PROGRAM TOTALS
    USE CALCULATION
    TYPE(ITEM) X, Y, Z
      ...
      X = Y + Z
      ...
    END

  The USE statement allows program TOTALS access to both the type
  ITEM and the extended intrinsic operator + to perform calculations.

62.88  –  VIRTUAL

  See COMPATIBILITY_FEATURES in this Help file.

62.89  –  VOLATILE

  Prevents specified variables, arrays, and common blocks from being
  optimized during compilation.

  The VOLATILE attribute can be specified in a type declaration
  statement or VOLATILE statement, and takes one of the following
  forms:

  Type Declaration Statement:

   type, [att-ls,] VOLATILE [,attr-ls] :: obj [,obj]...

  Statement:

   VOLATILE obj [,obj]...

     type      Is a data type specifier.

     attr-ls   Is an optional list of attribute specifiers.

     obj       Is the name of an object or a common block
               enclosed in slashes.

  A variable or COMMON block must be declared VOLATILE if it can be
  read or written in a way that is not visible to the compiler.  For
  example:

   o  If an operating system feature is used to place a variable in
      shared memory (so that it can be accessed by other programs),
      the variable must be declared VOLATILE.

   o  If a variable is modified by a routine called by the operating
      system when an asynchronous event occurs, the variable must be
      declared VOLATILE.

  If an array is declared VOLATILE, each element in the array becomes
  volatile.  If a common block is declared VOLATILE, each variable in
  the common block becomes volatile.

  If an object of derived type is declared VOLATILE, its components
  become volatile.

  If a pointer is declared VOLATILE, the pointer itself becomes
  volatile.

  A VOLATILE statement cannot specify the following:

   o  A procedure

   o  A function result

   o  A namelist group

  The VOLATILE attribute is compatible with the ALLOCATABLE,
  AUTOMATIC, DIMENSION, INTENT, OPTIONAL, POINTER, PRIVATE, PUBLIC,
  SAVE, STATIC, and TARGET attributes.

62.90  –  WHERE

  Permits masked array assignment, which lets you perform an array
  operation on selected elements.  This kind of assignment masks the
  evaluation of expressions and assignment of values in array
  assignment statements, according to the value of a logical array
  expression.

  WHERE can be specified as a construct or statement.  Format:

  Statement form:

    WHERE (mask-expr1) assign-stmt

  Construct form:

    [name :] WHERE (mask-expr1)
       [where-body-stmt]...
    [ELSEWHERE (mask-expr2) [name]
       [where-body-stmt]...]
    [ELSEWHERE [name]
       [where-body-stmt]...]
    END WHERE [name]

    name             Is the name of the WHERE construct.

    mask-expr1       Are logical array expressions (called
    mask-expr2       mask expressions).

    assign-stmt      Is an assignment statement of the form:

                     array variable = array expression

    where-body-stmt  Is one of the following:
                     o An "assign-stmt"
                     o A WHERE statement or construct

  If a construct name is specified in a WHERE statement, the same
  name must appear in the corresponding END WHERE statement.  The
  same construct name can optionally appear in any ELSEWHERE
  statement in the construct.  (ELSEWHERE cannot specify a different
  name.)

  In each assignment statement, the mask expression, the variable
  being assigned to, and the expression on the right side, must all
  be conformable.  Also, the assignment statement cannot be a defined
  assignment.

  Each mask expression in the WHERE construct must be conformable.

  Only the WHERE statement (or the first line of the WHERE construct)
  can be labeled as a branch target statement.

  The following is an example of a WHERE statement:

    INTEGER A, B, C
    DIMENSION A(5), B(5), C(5)
    DATA A /0,1,1,1,0/
    DATA B /10,11,12,13,14/
    C = -1

    WHERE(A .NE. 0) C = B / A

  The resulting array C contains:  -1,11,12,13, and -1.

  The assignment statement is only executed for those elements where
  the mask is true.  Think of the mask expression in this example as
  being evaluated first into a logical array which has the value true
  for those elements where A is positive.

  This array of trues and falses is applied to the arrays A, B and C
  in the assignment statement.  The right side is only evaluated for
  elements for which the mask is true; assignment on the left side is
  only performed for those elements for which the mask is true.  The
  elements for which the mask is false do not get assigned a value.

  In a WHERE construct the mask expression is evaluated first and
  only once.  Every assignment statement following the WHERE is
  executed as if it were a WHERE statement with "mask-expr1" and
  every assignment statement following the ELSEWHERE is executed as
  if it were a WHERE statement with ".NOT.  mask-expr1".  If
  ELSEWHERE specifies "mask-expr2", it is executed as "(.NOT.
  mask-expr1) .AND.  mask-expr2".

  You should be careful if the statements have side effects, or
  modify each other or the mask expression.

  The following is an example of the WHERE construct:

    DIMENSION PRESSURE(1000), TEMP(1000), PRECIPITATION(1000)
    WHERE(PRESSURE .GE. 1.0)
      PRESSURE = PRESSURE + 1.0
      TEMP = TEMP - 10.0
    ELSEWHERE
      PRECIPITATION = .TRUE.
    ENDWHERE

  The mask is applied to the arguments of functions on the right side
  of the assignment if they are considered to be elemental functions.
  Only elemental intrinsics are considered elemental functions.
  Transformational intrinsics, inquiry intrinsics, and functions or
  operations defined in the subprogram are considered to be
  nonelemental functions.

  Consider the following example using LOG, an elemental function:

    WHERE(A .GT. 0)  B = LOG(A)

  The mask is applied to A, and LOG is executed only for the positive
  values of A.  The result of the LOG is assigned to those elements
  of B where the mask is true.

  Consider the following example using SUM, a nonelemental function:

    REAL A, B
    DIMENSION A(10,10), B(10)
    WHERE(B .GT. 0.0)  B = SUM(A, DIM=1)

  Since SUM is nonelemental, it is evaluated fully for all of A.
  Then, the assignment only happens for those elements for which the
  mask evaluated to true.

  Consider the following example:

    REAL A, B, C
    DIMENSION A(10,10), B(10), C(10)
    WHERE(C .GT. 0.0)  B = SUM(LOG(A), DIM=1)/C

  Because SUM is nonelemental, all of its arguments are evaluated
  fully regardless of whether they are elemental or not.  In this
  example, LOG(A) is fully evaluated for all elements in A even
  though LOG is elemental.  Notice that the mask is applied to the
  result of the SUM and to C to determine the right side.  One way of
  thinking about this is that everything inside the argument list of
  a nonelemental function does not use the mask, everything outside
  does.

62.91  –  WRITE

  Transfers data from internal storage to user-specified external
  logical units (such as disks, printers, terminals, and pipes) or
  internal files.

  The meanings of the symbolic abbreviations used to represent the
  parameters in the WRITE statement syntax are as follows:

     extu    Is the logical unit or internal file optionally
     or      prefaced by UNIT=.  UNIT= is required if unit is
     intu    not the first element in the clist.

     fmt     Specifies whether formatting is to be used for data
             editing, and if it is, the format specification or an
             asterisk (*) to indicate list-directed formatting.
             The "fmt" is optionally prefaced by FMT=, if "fmt"
             is the second parameter in the clist and the first
             parameter is a logical or internal unit specifier
             without the optional keyword UNIT=.

     nml     Is the namelist group specification for namelist I/O.
             Optionally prefaced by NML=.  NML= is required if
             namelist is not the second I/O specifier.

     rec     Is the cell number of a record to be accessed directly.
             Optionally prefaced by REC= or by an apostrophe (').

     iostat  Is the name of a variable to contain the completion
             status of the I/O operation. Prefaced by IOSTAT=.

     err     Is the label of a statement to which control is
             transferred in the event of an error. Prefaced by
             ERR=.

     end     Is the label of a statement to which control is
             transferred in the event of an end of file. Prefaced
             by END=.

     adv     Specifies advancing (ADVANCE='YES') or nonadvancing
             input (ADVANCE='NO').  The default is 'YES'.

     iolist  Are the names of the variables, arrays, array elements,
             or character substrings from which or to which data
             will be transferred.  Optionally an implied-DO list.

  The control-list parameters are "extu" (or "intu"), "fmt", "nml",
  "rec", "iostat", "err", "end", and "adv".  The I/O list parameter
  is "iolist".

62.91.1  –  Sequential

62.91.1.1  –  Formatted

  Formatted sequential WRITE statement format:

     WRITE (extu,fmt [,adv][,err][,iostat]) [iolist]

  Writes to a specified external unit.  Translates the data from
  binary to character format as specified by "fmt".

62.91.1.2  –  List-directed

  List-directed sequential WRITE statement format:

     WRITE (extu,*[,iostat][,err]) [iolist]

  Writes to a specified external unit.  Translates the data from
  binary to character format according to the data types of the
  variables in the I/O list.

62.91.1.3  –  Namelist

  Namelist sequential WRITE statement format:

     WRITE (extu,nml[,iostat][,err])

  Writes to a specified external unit.  Translates the data from
  binary to character format according to the data types of the list
  entities in the corresponding NAMELIST statement.

62.91.1.4  –  Unformatted

  Unformatted sequential WRITE statement format:

     WRITE (extu[,iostat][,err]) [iolist]

  Writes to a specified external unit.  Does not translate the data.

62.91.2  –  Direct

62.91.2.1  –  Formatted

  Formatted direct WRITE statement format:

     WRITE (extu,rec,fmt[,iostat][,err]) [iolist]

  Writes to a specified external unit.  Translates the data from
  binary to character format as specified by "fmt".

62.91.2.2  –  Unformatted

  Unformatted direct WRITE statement format:

    WRITE (extu,rec[,iostat][,err]) [iolist]

  Writes to a specified external unit.  Does not translate the data.

62.91.3  –  Internal

  Internal WRITE statement format:

     WRITE (intu[,fmt][,err][,iostat]) [iolist]

  Writes to a specified character variable.  Translates the data from
  binary to character format as specified by "fmt".

62.91.4  –  Indexed

62.91.4.1  –  Formatted

  Formatted indexed WRITE statement format:

     WRITE (extu,fmt,[,err][,iostat]) [iolist]

  Writes to a specified external unit.  Translates the data from
  binary to character format as specified by "fmt".

62.91.4.2  –  Unformatted

  Unformatted indexed WRITE statement format:

     WRITE (extu,[,err][,iostat]) [iolist]

  Writes to a specified external unit.  Does not translate the data.
Close Help