[MPIWG Fortran] Question about named constants

Bill Long longb at cray.com
Thu Jun 18 12:48:59 CDT 2015

On Jun 18, 2015, at 11:05 AM, Junchao Zhang <jczhang at mcs.anl.gov> wrote:

> Hello, Fortran experts,
>   I am a little puzzled by MPI-3.1 Chapter 2.5.4,

Not surprising.  The (mis)use of terminology is confusing at best. 

> All named constants, with the exceptions noted below for Fortran, can be used in
> initialization expressions or assignments, but not necessarily in array declarations or as
> labels in C switch or Fortran select/case statements.  This implies named constants
> to be link-time but not necessarily compile-time constants.

In Fortran “named constant” is a defined term.  They are declared with the PARAMETER attribute.  And can be used in most places where literal constants can be used, including array declarations.  They cannot be used as statement labels, though I think the reference to “Fortran select/case statements” intends to talk about case-values, and not labels.  Named constants can be used as case-values.

>  Then in F08, should MPI_INTEGER be declared as a parameter variable?

Yes.  That’s what I did in my prototype mpi_f08 modules. 

>  If no, then I get an error when compiling this initialization expression with gfortran
>           type(MPI_Datatype) :: dtype = MPI_INTEGER
>     Error: Parameter 'mpi_integer' at (1) has not been declared or is a variable, which does not reduce to a constant expression
> If yes, then of course I can use MPI_INTEGER in Fortran select/case.


> Another question is what is the meaning of "link-time constants". I could not find in MPI. Does it mean I can use MPI_INTEGER after main before MPI_Init?

I suspect this is a historical artifact where some special head standing was needed to correctly define MPI_INTEGER based on whether the code was compiled with -i4 or -i8 (or equivalent, depending on the compiler).  For the modern case of using the mpi_f08 module, you just compile the mpi_f08 module twice (once with -i4 and once with -i8) and then have the compile command select the right actual module to reference based on how the using program unit is compiled.   Generally, values of objects are not set at link time;  addresses of objects are set at link time.   MPI objects that represent addresses  (MPI_BOTTOM ??) are examples.  If MPI_INTEGER is accessible, you can reference it.  If should not have anything to do with whether MPI_Init has been called.  

Perhaps some of the MPI historians can shed more light on this terminology.  I suspect it would be completely moot if we got rid of mpif.h.


> Thank you!
> --Junchao Zhang
> _______________________________________________
> mpiwg-fortran mailing list
> mpiwg-fortran at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpiwg-fortran

Bill Long                                                                       longb at cray.com
Fortran Technical Support  &                                  voice:  651-605-9024
Bioinformatics Software Development                     fax:  651-605-9142
Cray Inc./ Cray Plaza, Suite 210/ 380 Jackson St./ St. Paul, MN 55101

More information about the mpiwg-fortran mailing list