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.