Running XL Fortran programs

The default file name for the executable program is a.out. You can select a different name with the -o compiler option. You should avoid giving your programs the same names as system or shell commands (such as test or cp), as you could accidentally execute the wrong command. If a name conflict does occur, you can execute the program by specifying a path name, such as ./test.

You can run a program by entering the path name and file name of an executable file along with any run-time arguments on the command line.

Canceling execution

To suspend a running program, press the Ctrl+Z key while the program is in the foreground. Use the fg command to resume running.

To cancel a running program, press the Ctrl+C key while the program is in the foreground.

Compiling and executing on different systems

If you want to move an XL Fortran executable file to a different system for execution, you can link statically and copy the program, and optionally the run-time message catalogs. Alternatively, you can link dynamically and copy the program as well as the XL Fortran libraries if needed and optionally the run-time message catalogs. For non-SMP programs, libxlf90.so, libxlfmath.so, and libxlomp_ser.so are usually the only XL Fortran libraries needed. For SMP programs, you will usually need at least the libxlf90_r.so, libxlfmath.so, and libxlsmp.so libraries. libxlfpmt*.so and libxlfpad.so are only needed if the program is compiled with the -qautodbl option.

For a dynamically linked program to work correctly, the XL Fortran libraries and the operating system on the execution system must be at either the same level or a more recent level than on the compilation system.

For a statically linked program to work properly, the operating-system level may need to be the same on the execution system as it is on the compilation system.

Related information:
See Dynamic and Static Linking.

Run-time libraries for POSIX pthreads support

There are two run-time libraries that are connected with POSIX thread support. The libxlf90_r.so library is a thread-safe version of the Fortran run-time library. The libxlsmp.so library is the SMP run-time library.

Depending on the invocation command, and in some cases, the compiler option, the appropriate set of libraries for thread support is bound in. For example:

Cmd. Libraries Used Include Directory
xlf90_r
xlf95_r
xlf_r
/opt/ibmcmp/lib/libxlf90_r.so
/opt/ibmcmp/lib64/libxlf90_r.so
/opt/ibmcmp/lib/libxlsmp.so
/opt/ibmcmp/lib64/libxlsmp.so
/opt/ibmcmp/xlf/10.1/include

Selecting the language for run-time messages

To select a language for run-time messages that are issued by an XL Fortran program, set the LANG and NLSPATH environment variables before executing the program.

In addition to setting environment variables, your program should call the C library routine setlocale to set the program's locale at run time. For example, the following program specifies the run-time message category to be set according to the LC_ALL, LC_MESSAGES, and LANG environment variables:

  PROGRAM MYPROG
  PARAMETER(LC_MESSAGES = 5)
  EXTERNAL SETLOCALE
  CHARACTER NULL_STRING /Z'00'/
  CALL SETLOCALE (%VAL(LC_MESSAGES), NULL_STRING)
  END
Related information:
See Environment variables for national language support.

Setting run-time options

Internal switches in an XL Fortran program control run-time behavior, similar to the way compiler options control compile-time behavior. You can set the run-time options through either environment variables or a procedure call within the program. You can specify XL Fortran run-time option settings by using the following environment variables: XLFRTEOPTS and XLSMPOPTS.

The XLFRTEOPTS environment variable

The XLFRTEOPTS environment variable allows you to specify options that affect I/O, EOF error-handling, and the specification of random-number generators. You can declare XLFRTEOPTS by using the following bash command format:

Read syntax diagramSkip visual syntax diagram                       .-:------------------------------------------.
                       V                                            |
>>-XLFRTEOPTS=--+---+----runtime_option_name--=----option_setting---+--+---+-><
                '-"-'                                                  '-"-'
 

You can specify option names and settings in uppercase or lowercase. You can add blanks before and after the colons and equal signs to improve readability. However, if the XLFRTEOPTS option string contains imbedded blanks, you must enclose the entire option string in double quotation marks (").

The environment variable is checked when the program first encounters one of the following conditions:

Changing the XLFRTEOPTS environment variable during the execution of a program has no effect on the program.

The SETRTEOPTS procedure (which is defined in the XL Fortran Language Reference) accepts a single-string argument that contains the same name-value pairs as the XLFRTEOPTS environment variable. It overrides the environment variable and can be used to change settings during the execution of a program. The new settings remain in effect for the rest of the program unless changed by another call to SETRTEOPTS. Only the settings that you specified in the procedure call are changed.

You can specify the following run-time options with the XLFRTEOPTS environment variable or the SETRTEOPTS procedure:

buffering={enable | disable_preconn | disable_all}
Determines whether the XL Fortran run-time library performs buffering for I/O operations.

The library reads data from, or writes data to the file system in chunks for READ or WRITE statements, instead of piece by piece. The major benefit of buffering is performance improvement.

If you have applications in which Fortran routines work with routines in other languages or in which a Fortran process works with other processes on the same data file, the data written by Fortran routines may not be seen immediately by other parties (and vice versa), because of the buffering. Also, a Fortran READ statement may read more data than it needs into the I/O buffer and cause the input operation performed by a routine in other languages or another process that is supposed to read the next data item to fail. In these cases, you can use the buffering run-time option to disable the buffering in the XL Fortran run-time library. As a result, a READ statement will read in exactly the data it needs from a file and the data written by a WRITE statement will be flushed out to the file system at the completion of the statement.

Note: I/O buffering is always enabled for files on sequential access devices (such as pipes, terminals, sockets). The setting of the buffering option has no effect on these types of files.

If you disable I/O buffering for a logical unit, you do not need to call the Fortran service routine flush_ to flush the contents of the I/O buffer for that logical unit.

The suboptions for buffering are as follows:

enable
The Fortran run-time library maintains an I/O buffer for each connected logical unit. The current read-write file pointers that the run-time library maintains might not be synchronized with the read-write pointers of the corresponding files in the file system.
disable_preconn
The Fortran run-time library does not maintain an I/O buffer for each preconnected logical unit (0, 5, and 6). However, it does maintain I/O buffers for all other connected logical units. The current read-write file pointers that the run-time library maintains for the preconnected units are the same as the read-write pointers of the corresponding files in the file system.
disable_all
The Fortran run-time library does not maintain I/O buffers for any logical units. You should not specify the buffering=disable_all option with Fortran programs that perform asynchronous I/O.

In the following example, Fortran and C routines read a data file through redirected standard input. First, the main Fortran program reads one integer. Then, the C routine reads one integer. Finally, the main Fortran program reads another integer.

Fortran main program:

integer(4) p1,p2,p3
print *,'Reading p1 in Fortran...'
read(5,*) p1
call c_func(p2)
print *,'Reading p3 in Fortran...'
read(5,*) p3
print *,'p1 p2 p3 Read: ',p1,p2,p3
end

C subroutine (c_func.c):

#include <stdio.h>
void
c_func(int *p2)
{
    int n1 = -1;

    printf("Reading p2 in C...\n");
    setbuf(stdin, NULL);    /* Specifies no buffering for stdin */
    fscanf(stdin,"%d",&n1);
    *p2=n1;
    fflush(stdout);
}

Input data file (infile):

11111
22222
33333
44444

The main program runs by using infile as redirected standard input, as follows:

$ main < infile

If you turn on buffering=disable_preconn, the results are as follows:

Reading p1 in Fortran...
Reading p2 in C...
Reading p3 in Fortran...
p1 p2 p3 Read:  11111 22222 33333

If you turn on buffering=enable, the results are unpredictable.

cnverr={yes | no}
If you set this run-time option to no, the program does not obey the IOSTAT= and ERR= specifiers for I/O statements that encounter conversion errors. Instead, it performs default recovery actions (regardless of the setting of err_recovery) and may issue warning messages (depending on the setting of xrf_messages).
Related information:
For more information about conversion errors, see Data Transfer Statements in the XL Fortran Language Reference. For more information about IOSTAT values, see Conditions and IOSTAT Values in the XL Fortran Language Reference.
cpu_time_type={usertime | systime | alltime | total_usertime | total_systime | total_alltime}
Determines the measure of time returned by a call to CPU_TIME(TIME).

The suboptions for cpu_time_type are as follows:

usertime
Returns the user time of a process.
systime
Returns the system time of a process.
alltime
Returns the sum of the user and system time of a process.
total_usertime
Returns the total user time of a process. The total user time is the sum of the user time of a process and the total user times of its child processes, if any.
total_systime
Returns the total system time of a process. The total system time is the sum of the system time of the current process and the total system times of its child processes, if any.
total_alltime
Returns the total user and system time of a process. The total user and system time is the sum of the user and system time of the current process and the total user and system times of their child processes, if any.
default_recl={64 | 32}
Allows you to determine the default record size for sequential files opened without a RECL= specifier. The suboptions are as follows:
64
Uses a 64-bit value as the default record size.
32
Uses a 32-bit value as the default record size.

The default_recl run-time option applies only in 64-bit mode. In 32-bit mode, default_recl is ignored and the record size is 32-bit.

Use default_recl when porting 32-bit programs to 64-bit mode where a 64-bit record length will not fit into the specified integer variable. Consider the following:

INTEGER(4) I
OPEN (11)
INQUIRE (11, RECL=i)

A run-time error occurs in the above code sample in 64-bit mode when default_recl=64, since the default record length of 2**63-1 does not fit into the 4-byte integer I. Specifying default_recl=32 ensures a default record size of 2**31-1, which fits into I.

For more information on the RECL= specifier, see the OPEN statement in the XL Fortran Language Reference.

erroreof={yes | no}
Determines whether the label specified by the ERR= specifier is to be branched to if no END= specifier is present when an end-of-file condition is encountered.
err_recovery={yes | no}
If you set this run-time option to no, the program stops if there is a recoverable error while executing an I/O statement with no IOSTAT= or ERR= specifiers. By default, the program takes some recovery action and continues when one of these statements encounters a recoverable error. Setting cnverr to yes and err_recovery to no can cause conversion errors to halt the program.
iostat_end={extended | 2003std}
Sets the IOSTAT values based on the XL Fortran definition or the Fortran 2003 Standard when end-of-file and end-of-record conditions occur. The suboptions are as follows:
extended
Sets the IOSTAT variables based on XL Fortran's definition of values and conditions.
2003std
Sets the IOSTAT variables based on Fortran 2003's definition of values and conditions.

For example, setting the iostat_end=2003std run-time option results in a different IOSTAT value from extensions being returned for the end-of-file condition

    export XLFRTEOPTS=iostat_end=2003std
    character(10) ifl
    integer(4) aa(3), ios
    ifl = "12344321  "
    read(ifl, '(3i4)', iostat=ios) aa ! end-of-file condition occurs and
                                      ! ios is set to -1 instead of -2.

For more information on setting and using IOSTAT values, see the READ, WRITE, and Conditions and IOSTAT Values sections in the XL Fortran Language Reference.

intrinthds={num_threads}
Specifies the number of threads for parallel execution of the MATMUL and RANDOM_NUMBER intrinsic procedures. The default value for num_threads when using the MATMUL intrinsic equals the number of processors online. The default value for num_threads when using the RANDOM_NUMBER intrinsic is equal to the number of processors online*2.

Changing the number of threads available to the MATMUL and RANDOM_NUMBER intrinsic procedures can influence performance.

langlvl={extended| 90std | 95std | 2003std}
Determines the level of support for Fortran standards and extensions to the standards. The values of the suboptions are as follows:
90std
Specifies that the compiler should flag any extensions to the Fortran 90 standard I/O statements and formats as errors.
95std
Specifies that the compiler should flag any extensions to the Fortran 95 standard I/O statements and formats as errors.
2003std
Specifies that the compiler should accept all standard I/O statements and formats that the Fortran 95 standard specifies, as well as those Fortran 2003 formats that XL Fortran supports. Anything else is flagged as an error.

For example, setting the langlvl=2003std run-time option results in a run-time error message.

integer(4) aa(100)
call setrteopts("langlvl=2003std")
    ...          ! Write to a unit without explicitly
    ...          ! connecting the unit to a file.
write(10, *) aa  ! The implicit connection to a file does not
    ...          ! comform with Fortran 2003 behavior.
extended
Specifies that the compiler should accept the Fortran 95 language standard, Fortran 2003 features supported by XL Fortran, and extensions, effectively turning off language-level checking.

To obtain support for items that are part of the Fortran 95 standard and are available in XL Fortran (such as namelist comments), you must specify one of the following suboptions:

The following example contains a Fortran 95 extension (the file specifier is missing from the OPEN statement):

program test1

call setrteopts("langlvl=95std")
open(unit=1,access="sequential",form="formatted")

10 format(I3)

write(1,fmt=10) 123

end

Specifying langlvl=95std results in a run-time error message.

The following example contains a Fortran 95 feature (namelist comments) that was not part of Fortran 90:

program test2

INTEGER I
LOGICAL G
NAMELIST /TODAY/G, I

call setrteopts("langlvl=95std:namelist=new")

open(unit=2,file="today.new",form="formatted", &
    & access="sequential", status="old")

read(2,nml=today)
close(2)

end

today.new:

&TODAY  ! This is a comment
I = 123, G=.true. /

If you specify langlvl=95std, no run-time error message is issued. However, if you specify langlvl=90std, a run-time error message is issued.

The err_recovery setting determines whether any resulting errors are treated as recoverable or severe.

multconn={yes | no}
Enables you to access the same file through more than one logical unit simultaneously. With this option, you can read more than one location within a file simultaneously without making a copy of the file.

You can only use multiple connections within the same program for files on random-access devices, such as disk drives. In particular, you cannot use multiple connections within the same program for:

To avoid the possibility of damaging the file, keep the following points in mind:

multconnio={tty | nulldev | combined | no }
Enables you to connect a device to more than one logical unit. You can then write to, or read from, more than one logical unit that is attached to the same device. The suboptions are as follows:
combined
Enables you to connect a combination of null and TTY devices to more than one logical unit.
nulldev
Enables you to connect the null device to more than one logical unit.
tty
Enables you to connect a TTY device to more than one logical unit.
Note:
Using this option can produce unpredictable results.

In your program, you can now specify multiple OPEN statements that contain different values for the UNIT parameters but the same value for the FILE parameters. For example, if you have a symbolic link called mytty that is linked to TTY device /dev/tty, you can run the following program when you specify the multconnio=tty option:

PROGRAM iotest
OPEN(UNIT=3, FILE='mytty', ACTION="WRITE")
OPEN(UNIT=7, FILE='mytty', ACTION="WRITE")
END PROGRAM iotest

Fortran preconnects units 0, 5, and 6 to the same TTY device. Normally, you cannot use the OPEN statement to explicitly connect additional units to the TTY device that is connected to units 0, 5, and 6. However, this is possible if you specify the multconnio=tty option. For example, if units 0, 5, and 6 are preconnected to TTY device /dev/tty, you can run the following program if you specify the multconnio=tty option:

PROGRAM iotest
   ! /dev/pts/2 is your current tty, as reported by the 'tty' command.
   ! (This changes every time you login.)
   CALL SETRTEOPTS ('multconnio=tty')
   OPEN (UNIT=3, FILE='/dev/pts/2')
   WRITE (3, *) 'hello'  ! Display 'hello' on your screen
END PROGRAM
namelist={new | old}
Determines whether the program uses the XL Fortran new or old NAMELIST format for input and output. The Fortran 90 and Fortran 95 standards require the new format.
Note:
You may need the old setting to read existing data files that contain NAMELIST output.However, use the standard-compilant new format in writing any new data files.

With namelist=old, the nonstandard NAMELIST format is not considered an error by the langlvl=95std, langlvl=90std, or langlvl=2003std setting.

Related information:
For more information about NAMELIST I/O, see Namelist Formatting in the XL Fortran Language Reference.
nlwidth=record_width
By default, a NAMELIST write statement produces a single output record long enough to contain all of the written NAMELIST items. To restrict NAMELIST output records to a given width, use the nlwidth run-time option.
Note:
The RECL= specifier for sequential files has largely made this option obsolete, because programs attempt to fit NAMELIST output within the specified record length. You can still use nlwidth in conjunction with RECL= as long as the nlwidth width does not exceed the stated record length for the file.
random={generator1 | generator2}
Specifies the generator to be used by RANDOM_NUMBER if RANDOM_SEED has not yet been called with the GENERATOR argument. The value generator1 (the default) corresponds to GENERATOR=1, and generator2 corresponds to GENERATOR=2. If you call RANDOM_SEED with the GENERATOR argument, it overrides the random option from that point onward in the program. Changing the random option by calling SETRTEOPTS after calling RANDOM_SEED with the GENERATOR option has no effect.
scratch_vars={yes | no}
To give a specific name to a scratch file, set the scratch_vars run-time option to yes, and set the environment variable XLFSCRATCH_unit to the name of the file you want to be associated with the specified unit number. See Naming scratch files for examples.
unit_vars={yes | no}
To give a specific name to an implicitly connected file or to a file opened with no FILE= specifier, you can set the run-time option unit_vars=yes and set one or more environment variables with names of the form XLFUNIT_unit to file names. See Naming files that are connected with no explicit name for examples.
uwidth={32 | 64}
To specify the width of record length fields in unformatted sequential files, specify the value in bits. When the record length of an unformatted sequential file is greater than (2**31 - 1) bytes minus 8 bytes (for the record terminators surrounding the data), you need to set the run-time option uwidth=64 to extend the record length fields to 64 bits. This allows the record length to be up to (2**63 - 1) minus 16 bytes (for the record terminators surrounding the data). The run-time option uwidth is only valid for 64-bit mode applications.
xrf_messages={yes | no}
To prevent programs from displaying run-time messages for error conditions during I/O operations, RANDOM_SEED calls, and ALLOCATE or DEALLOCATE statements, set the xrf_messages run-time option to no. Otherwise, run-time messages for conversion errors and other problems are sent to the standard error stream.

The following examples set the cnverr run-time option to yes and the xrf_messages option to no.

# Basic format
  XLFRTEOPTS=cnverr=yes:xrf_messages=no
  export XLFRTEOPTS

# With imbedded blanks
  XLFRTEOPTS="xrf_messages = NO : cnverr = YES"
  export XLFRTEOPTS

As a call to SETRTEOPTS, this example could be:

  CALL setrteopts('xrf_messages=NO:cnverr=yes')
! Name is in lowercase in case -U (mixed) option is used.

Setting OMP and SMP run time options

The XLSMPOPTS environment variable allows you to specify options that affect SMP execution. The OpenMP environment variables, OMP_DYNAMIC, OMP_NESTED, OMP_NUM_THREADS, and OMP_SCHEDULE, allow you to control the execution of parallel code. For details on using these, see XLSMPOPTS and OpenMP environment variables.

BLAS/ESSL environment variable

By default, the libxlopt library is linked with any application you compile with XL Fortran. However, if you are using a third-party Basic Linear Algebra Subprograms (BLAS) library or want to ship a binary that includes ESSL routines, you must specify these using the XL_BLAS_LIB environment variable. For example, if your own BLAS library is called libblas, set the environment variable as follows:

export XL_BLAS_LIB=/usr/lib/libblas.a
When the compiler generates calls to BLAS routines, the ones defined in the libblas library will be used at runtime instead of those defined in libxlopt.

XL_NOCLONEARCH

Use the XL_NOCLONEARCH to instruct the program to only execute the generic code, where generic code is the code that is not versioned for an architecture. The XL_NOCLONEARCH environment variable is not set by default; you can set it for debugging purposes in your application. (See also the -qipa=clonearch option.)