[petsc-dev] fortran literals

Munson, Todd tmunson at mcs.anl.gov
Fri Sep 2 11:40:34 CDT 2016


I am confused by Blaise's statement.  "selected_real_kind(5)" is well defined across
compilers; it returns an integer value that can be used in the kind statements and
selected real numbers with at least 5 digits of precision.

With the exception of -1, -2, and -3 (plus -4 and -5 in Fortran 2008) indicating
no support.  The actual integer values returned are compiler specific.

If we wanted to have a better chance of getting ieee single, double, and quad,
we should probably use something like:

  selected_real_kind(6,37)
  selected_real_kind(15,307)
  selected_real_kind(33,4931)

in PETSc.  You would still need to do some testing during configuration to
really ensure that

  real(kind=selected_real_kind(7,38))
  real(kind=selected_real_kind(15,307))
  real(kind=selected_real_kind(34,4931))

is the same as a C float, double, and __float128 respectively?

=====

Its not until Fortran 2008 that the standard has constants for REAL32, REAL64,
and REAL128 defined in the ISO_FORTRAN_ENV module.  However, if we are using
Fortran 2008 features, go all out and use the ISO_C_BINDING module with
the C_FLOAT and C_DOUBLE constants!  Some compilers, such as the gnu
compilers. extend the constants and include C_FLOAT128.

I have attached a simple program to output the kinds.  Try it on your machine.
On my machine with gfortran from gcc version 4.8.5 (MacPorts gcc48 4.8.5_0), I
get the following:

 C_FLOAT   :            4
 C_DOUBLE  :            8
 C_FLOAT128:           16
 REAL32    :            4
 REAL64    :            8
 REAL128   :           10
 sel(6)    :            4
 sel(15)   :            8
 sel(16)   :           10
 sel(33)   :           16

The integers provide the number of bytes on my machine.  Note REAL128 is
apparently an 80-bit long double and not a 128-bit __float128!!  The
type using selected_real_kind appears correct though.  The same
happens for REAL128 with gfortran from gcc 4.9.3, gcc 5.4.0,
and gcc 6.1.0 on my machine.

Todd.



> On Sep 2, 2016, at 12:51 AM, William Gropp <wgropp at illinois.edu> wrote:
>
> This is true.  The meaning of integer values of kind is up to the implementation, and at least two choices are in use.
>
> Bill
>
> William Gropp
> Acting Director and Chief Scientist, NCSA
> Director, Parallel Computing Institute
> Thomas M. Siebel Chair in Computer Science
> University of Illinois Urbana-Champaign
>
>
>
>
>
> On Sep 1, 2016, at 6:15 PM, Blaise A Bourdin <bourdin at lsu.edu> wrote:
>
>> If I recall correctly, fortran does not mandate that "selected_real_kind(5)" means the same across compilers, so that hardcoding kind values may not be portable.
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20160902/11989f77/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mytest.f
Type: application/octet-stream
Size: 647 bytes
Desc: mytest.f
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20160902/11989f77/attachment.obj>


More information about the petsc-dev mailing list