Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert logical type to double in Fortran

I'm looking for a bulletproof way of converting logical type variables to real type that will work in both ifort and gfortran. The following works in ifort, but not in gfortran:

logical :: a
real :: b
a = .true.
b = dble(a)

The error thrown in gfortran is

b = dble(a)
         1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type

Obviously, .true. should map to 1.d0, and .false. to 0.d0. What's the best way of doing this?

like image 488
Guillochon Avatar asked Feb 24 '13 22:02

Guillochon


2 Answers

In addition to writing a function to handle this, you could also directly use the intrinsic merge function: b = merge(1.d0, 0.d0, a). Or you could write a defined assignment subroutine that does this, so that you can just type b = a.

like image 160
sigma Avatar answered Sep 18 '22 12:09

sigma


I am not sure if there is an intrinsic tool that does this. I do not know why ifort accepts this, and my guess would be that it is a compiler specific functionality.

Edit: As pointed out in https://stackoverflow.com/a/15057846/1624033 below, there is the intrinsic merge function which is exactly what is needed here.

an option to to this, specifically since you want this to be bullet proof, is to create your own function.

I have not tested this, but the following might work:

elemental pure double precision function logic2dbl(a)
  logical, intent(in) :: a

  if (a) then
    logic2dbl = 1.d0
  else
    logic2dbl = 0.d0
  end if
end function logic2dbl

Edit: I added elemental to the function declaration based on advice below. I also added pure to this function as it adds the extra ability to use this in parallel situations and it is good documentation. This however is just my opinion and it is not necessary.

like image 24
physphun Avatar answered Sep 20 '22 12:09

physphun