Discussion:
writing a module file in gfortran 14
(too old to reply)
Lynn McGuire
2024-12-03 23:02:59 UTC
Permalink
Is the "implicit none" in the proper place in the following code ? I
misspelled an argument name declaration and gfortran 14 did not complain
when compiling my module file. However, it implicitly declared the
argument variable to be real*4 and then complained when it compiled my
subroutine code that the subroutine was declared differently.


module aaa_modules

implicit none

INTERFACE
SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
INTEGER(KIND=8) :: ISW
INTEGER(KIND=8) :: IRETST
INTEGER(KIND=8) :: IR
INTEGER(KIND=8) :: IC
REAL(KIND=8) :: PAR
INTEGER(KIND=8) :: IPHASE
END SUBROUTINE ABCPAR
END INTERFACE

INTERFACE
SUBROUTINE ABSR(NIN,NOUT,NOCOMP,NEQP,NDSP,SIVPFR,SITEMP, &
&SIPRES,SIENTH,SIENTR,SIMOLE,SICOMP,SIKV,SOVPFR,SOTEMP,SOPRES, &
&SOENTH,SOENTR,SOMOLE,SOCOMP,SOKV,EQPAR,DESPAR)
INTEGER(KIND=8) :: NDSP
INTEGER(KIND=8) :: NEQP
INTEGER(KIND=8) :: NOCOMP
INTEGER(KIND=8) :: NOUT
INTEGER(KIND=8) :: NIN
REAL(KIND=8) :: SIVPFR(NIN)
REAL(KIND=8) :: SITEMP(NIN)
REAL(KIND=8) :: SIPRES(NIN)
REAL(KIND=8) :: SIENTH(NIN)
REAL(KIND=8) :: SIENTR(NIN)
REAL(KIND=8) :: SIMOLE(NIN)
REAL(KIND=8) :: SICOMP(NOCOMP,NIN)
REAL(KIND=8) :: SIKV(NOCOMP,NIN)
REAL(KIND=8) :: SOVPFR(NOUT)
REAL(KIND=8) :: SOTEMP(NOUT)
REAL(KIND=8) :: SOPRES(NOUT)
REAL(KIND=8) :: SOENTH(NOUT)
REAL(KIND=8) :: SOENTR(NOUT)
REAL(KIND=8) :: SOMOLE(NOUT)
REAL(KIND=8) :: SOCOMP(NOCOMP,NOUT)
REAL(KIND=8) :: SOKV(NOCOMP,NOUT)
REAL(KIND=8) :: EQPAR(NEQP)
REAL(KIND=8) :: DESPAR(NDSP)
END SUBROUTINE ABSR
END INTERFACE
...

Thanks,
Lynn
Thomas Koenig
2024-12-04 20:11:34 UTC
Permalink
Post by Lynn McGuire
Is the "implicit none" in the proper place in the following code ?
No.

[snip]

You want
Post by Lynn McGuire
module aaa_modules
implicit none
INTERFACE
SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
IMPLICIT NONE

...

because declarations in the outer module have no meaning on
interfaces.

A rather frequent source of confusion, I'm afraid (I got bitten
by this myself in the past).
Lynn McGuire
2024-12-04 21:20:04 UTC
Permalink
Post by Thomas Koenig
Post by Lynn McGuire
Is the "implicit none" in the proper place in the following code ?
No.
[snip]
You want
Post by Lynn McGuire
module aaa_modules
implicit none
INTERFACE
SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
IMPLICIT NONE
...
because declarations in the outer module have no meaning on
interfaces.
A rather frequent source of confusion, I'm afraid (I got bitten
by this myself in the past).
Woof ! I was afraid of that. The Fortran Module definition seems to be
very fragile.

That is going to be painful to add to my module file.

Lynn
Gary Scott
2024-12-05 00:40:08 UTC
Permalink
Post by Thomas Koenig
Post by Lynn McGuire
Is the "implicit none" in the proper place in the following code ?
No.
[snip]
You want
Post by Lynn McGuire
       module aaa_modules
            implicit none
            INTERFACE
              SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
                  IMPLICIT NONE
...
because declarations in the outer module have no meaning on
interfaces.
A rather frequent source of confusion, I'm afraid (I got bitten
by this myself in the past).
Woof !  I was afraid of that.  The Fortran Module definition seems to be
very fragile.
That is going to be painful to add to my module file.
Lynn
The interface is its own entity. I think the design is correct in
requiring the implicit none to be repeated. While I might have
preferred a "file scope" design more, as long as there is consistency in
the design, I'm ok with it.

Sorry for the direct email :( intended to post here
Lawrence D'Oliveiro
2024-12-05 01:45:28 UTC
Permalink
I think the design is correct in requiring the implicit none to be
repeated.
The sooner that implicit “IMPLICIT NONE” is added to the standard, the
better, I think.

In the meantime, gfortran (which is all anybody seems to be using anyway)
has “-fimplicit-none” ...
Gary Scott
2024-12-05 02:33:00 UTC
Permalink
Post by Lawrence D'Oliveiro
I think the design is correct in requiring the implicit none to be
repeated.
The sooner that implicit “IMPLICIT NONE” is added to the standard, the
better, I think.
In the meantime, gfortran (which is all anybody seems to be using anyway)
has “-fimplicit-none” ...
I've long favored that. The consensus when it was discussed in the 90s
was that it would never happen.
Lynn McGuire
2024-12-05 03:43:24 UTC
Permalink
Post by Lawrence D'Oliveiro
I think the design is correct in requiring the implicit none to be
repeated.
The sooner that implicit “IMPLICIT NONE” is added to the standard, the
better, I think.
In the meantime, gfortran (which is all anybody seems to be using anyway)
has “-fimplicit-none” ...
Yes, "implicit none" should have been made the default in the Fortran 90
version. With all of the changes, it was time.

Lynn
Steven G. Kargl
2024-12-07 05:44:56 UTC
Permalink
Post by Lawrence D'Oliveiro
I think the design is correct in requiring the implicit none to be
repeated.
The sooner that implicit “IMPLICIT NONE” is added to the standard, the
better, I think.
IMPLICIT NONE is a part of the Fortran standard. It's been
a part for a very long time. Perhaps, you meant that IMPLICIT
NONE should be the default behavior. That will never happen.
--
steve
Lawrence D'Oliveiro
2024-12-07 07:48:48 UTC
Permalink
Post by Steven G. Kargl
Post by Lawrence D'Oliveiro
I think the design is correct in requiring the implicit none to be
repeated.
The sooner that implicit “IMPLICIT NONE” is added to the standard, the
better, I think.
IMPLICIT NONE is a part of the Fortran standard.
Note what I said: implicit “IMPLICIT NONE”.
Lynn McGuire
2024-12-07 23:04:58 UTC
Permalink
Post by Thomas Koenig
Post by Lynn McGuire
Is the "implicit none" in the proper place in the following code ?
No.
[snip]
You want
Post by Lynn McGuire
       module aaa_modules
            implicit none
            INTERFACE
              SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
                  IMPLICIT NONE
...
because declarations in the outer module have no meaning on
interfaces.
A rather frequent source of confusion, I'm afraid (I got bitten
by this myself in the past).
Woof !  I was afraid of that.  The Fortran Module definition seems to
be very fragile.
That is going to be painful to add to my module file.
Lynn
The interface is its own entity.  I think the design is correct in
requiring the implicit none to be repeated.  While I might have
preferred a "file scope" design more, as long as there is consistency in
the design, I'm ok with it.
Sorry for the direct email :( intended to post here
No worries ! I only check the gmail email every week or two.

Thanks,
Lynn

Steven G. Kargl
2024-12-07 05:42:20 UTC
Permalink
Post by Thomas Koenig
Post by Lynn McGuire
Is the "implicit none" in the proper place in the following code ?
No.
Technically, the answer is 'yes' to the question asked.
Post by Thomas Koenig
You want
Post by Lynn McGuire
module aaa_modules
implicit none
INTERFACE
SUBROUTINE ABCPAR(ISW,IRETST,IR,IC,PAR,IPHASE)
IMPLICIT NONE
...
because declarations in the outer module have no meaning on
interfaces.
This is the answer to the question you meant to ask. An interface
construct introduces a new namespace and blocks host association.
As such, Fortran's implicit typing rules apply
--
steve
Loading...