Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determining variable type in Fortran

In Fortran, is there a way to determine the type of a variable?

A possible use case where the type of a variable would be needed is the following. We pass a variable's type as an argument to a function, to be able to call type-specific code with that function, thus eliminating the need to have separate similar functions for each data type.

like image 342
tibbs Avatar asked Apr 01 '10 12:04

tibbs


1 Answers

Well you might be able to do what you want if you mess about with the KIND intrinsic and POINTERs, but if you are only concerned with the signature of functions and subroutines, leave it to Fortran. If you define

function calc8(arg1)
    real(8), intent(in) :: arg1
    ...

and

function calc4(arg1)
    real(4), intent(in) :: arg1
    ...

in a module, and declare an interface like this

interface calc
    module procedure calc8
    module procedure calc4
end interface

(Warning, I haven't checked the syntax in detail, that's your responsibility.)

then Fortran will match the call to the right version of the function. Sure, you have to write both versions of the function, but that's really the Fortran 95 way of doing it. This can be quite tedious, I tend to write a generic version and run a sed script to specialise it. It's a bit of a kludge but it works.

If the code of the function is identical apart from the kind of the arguments I sometimes write the function for real(8) (or whatever) and write a version for real(4) which calls the real(8) version wrapped in type conversions.

In Fortran 2003 there are improved ways of defining polymorphic and generic functions, but I haven't really got my head around them yet.

like image 174
High Performance Mark Avatar answered Sep 23 '22 08:09

High Performance Mark