Reputation: 28416
I've always been using the -fdefault-real-8
option of gfortran
to automatically promote every single REAL
declared anywhere in the program to double precision, along with any constant, e.g. 1.23
. If I ever wanted to switch back to single precision, I only had to remove that option and recompile, without changing a single character in the source code.
At a point I started using ISO_FORTRAN_ENV
module, since it allows me to use constants like INPUT|OUTPUT|ERROR_UNIT
, as well as IOSTAT_END
and IOSTAT_EOR
and others (which seemed to be a good and easy move in the direction of portability, am I wrong?). From then on, I've been seeing and ignoring the following warning
Warning: Use of the NUMERIC_STORAGE_SIZE named constant from intrinsic module ISO_FORTRAN_ENV at (1) is incompatible with option -fdefault-real-8
since such incompatibility seems to have no effect so far.
Now I'd like to get rid of this warning if it is possible and worth it.
If I correctly understood, to avoid this warning I should give up on -fdefault-real-8
option and change every REAL
to REAL(real64)
and/or to REAL(dp)
(provided that, in the latter case, the statement USE, INTRINSIC :: ISO_FORTRAN_ENV, dp => real64
is put in that unit), which is not a difficult task for sed
or vim
.
Nevertheless, it seems to me that this change wouldn't be the same as using -fdefault-real-8
option, since all constants would stay single precision as long as I don't add d0
to them.
Assumed the option is removed and -fdefault-real-8
ISO_FORTRAN_ENV
is used anywhere, is there any way to make any constant across the program behave as each had d0
suffix?
Whether or not this is possible, have I correctly extrapolated that I can put the following lines in a single module which is used by all others program units, each of which can then use dp
as kind type parameter?
USE, INTRINSIC :: ISO_FORTRAN_ENV
INTEGER, PARAMETER :: dp = real64
I would prefer this way since I could switch to real32
or real128
or whatever by changing only that line.
Upvotes: 2
Views: 1427
Reputation: 14112
Assumed the
-fdefault-real-8
option is removed andISO_FORTRAN_ENV
is used anywhere, is there any way to make any constant across the program behave as each hadd0
suffix?
No.
By the way, d0
is exactly the same as double precision
, so that doesn't fixate much either, since the meaning of double precision
is allowed to vary as much as real
.
Whether or not this is possible, have I correctly extrapolated that I can put the following lines in a single module which is used by all others program units, each of which can then use dp as kind type parameter?
Yes. That is a common practice.
Upvotes: 0
Reputation: 60008
If you just want to silence the warning and you do not care about the implications -fdefault-real-8
has on storage association and some Fortran standard requirements, just do not import NUMERIC_STORAGE_SIZE
from the module. For example,
USE, INTRINSIC :: ISO_FORTRAN_ENV, only: INPUT_UNIT,OUTPUT_UNIT,ERROR_UNIT
Upvotes: 2