Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran bug: rank problem gfortran

  1. Mar 22, 2013 #1
    This is my own code, and it won't compile with gfortran. All I want to do is extract the location of the cell with the minimum value in an array. A seemingly simple task but one that does not work with the intrinsic function minloc, for reasons I do not understand.

    The error message:

    Code (Text):
        iclosept=minloc(dist)
        1
    Error: Incompatible ranks 0 and 1 in assignment at (1)
    The code:

    Code (Text):

      subroutine distance_to_trench(pt,tr,mindist,iclosept)
      ! find (great circle) distance from point to each point on the trench
      ! distance = the minimum distance to the trench
     
        type(point) :: pt
        type(trench) :: tr
        real, parameter :: pi=3.14159265359
        real, parameter :: eradius=6371
        real :: rad,deg
        real :: x1,y1,z1,x2,y2,z2
        real,dimension(:),allocatable :: dist
        real :: mindist
        integer :: ii, length, iclosept, a
       
        rad=pi/180
        deg=180/pi
       
        length=size(tr%poly%points%x)
        allocate(dist(length))
       
      ! method:
      ! convert lat lons to cartesian vectors
      ! use angle between vectors to find the distance
     
        x1=cos(rad*pt%y)*cos(rad*pt%x)
        y1=cos(rad*pt%y)*sin(rad*pt%x)
        z1=sin(rad*pt%y)
     
        do ii=1, length
         
          x2=cos(rad*tr%poly%points(ii)%y)*cos(rad*tr%poly%points(ii)%x)
          y2=cos(rad*tr%poly%points(ii)%y)*sin(rad*tr%poly%points(ii)%x)
          z2=sin(rad*tr%poly%points(ii)%y)
     
          dist(ii)=eradius*acos(x1*x2+y1*y2+z1*z2)
         
          print *,dist(ii)
       
        enddo
       
        mindist=minval(dist)
       
        a=size(dist)
        print *,'size of dist', size(dist), a

        iclosept=minloc(dist)
        print *,'minloc', minloc(dist), iclosept
       
        deallocate(dist)
       
      end subroutine distance_to_trench
     
     
  2. jcsd
  3. Mar 22, 2013 #2
    Fixed it.

    Turns out I was confused about the output of the minloc function. It returns an array of integer(s). I was assuming it returned an integer. Because I was only thinking about a 1-d array. But in the case of a 1-d array, it actually returns an array of size 1, where the element contains the integer I was after.

    To fix my above code I introduced a temporary array and assigned it by minloc. Then I extracted the single element from it into a pure integer.

    Thus:

    Code (Text):

      subroutine distance_to_trench(pt,tr,mindist,iclosept)
      ! find (great circle) distance from point to each point on the trench
      ! distance = the minimum distance to the trench
     
        type(point) :: pt
        type(trench) :: tr
        real, parameter :: pi=3.14159265359
        real, parameter :: eradius=6371
        real :: rad,deg
        real :: x1,y1,z1,x2,y2,z2
        real,dimension(:),allocatable :: dist
        real :: mindist
        integer :: ii, length, iclosept, temp(1)
       
        rad=pi/180
        deg=180/pi
       
        length=size(tr%poly%points%x)
        allocate(dist(length))
       
      ! method:
      ! convert lat lons to cartesian vectors
      ! use angle between vectors to find the distance
     
        x1=cos(rad*pt%y)*cos(rad*pt%x)
        y1=cos(rad*pt%y)*sin(rad*pt%x)
        z1=sin(rad*pt%y)
     
        do ii=1, length
         
          x2=cos(rad*tr%poly%points(ii)%y)*cos(rad*tr%poly%points(ii)%x)
          y2=cos(rad*tr%poly%points(ii)%y)*sin(rad*tr%poly%points(ii)%x)
          z2=sin(rad*tr%poly%points(ii)%y)
     
          dist(ii)=eradius*acos(x1*x2+y1*y2+z1*z2)
         
          print *,dist(ii)
       
        enddo
       
        mindist=minval(dist)
        temp=minloc(dist)
       
        iclosept=temp(1)
       
        deallocate(dist)
       
      end subroutine distance_to_trench
     
     
  4. Mar 22, 2013 #3

    jedishrfu

    Staff: Mentor

  5. Mar 22, 2013 #4
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Fortran bug: rank problem gfortran
Loading...