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

Compilation problem with gfortran

  1. Jul 28, 2011 #1
    Hello everyone,

    I'm trying since a few days to compile a f90 program with gfortran (on Ubuntu) with a makefile. The fortran program calls 2 routines written in C.

    Here is my makefile:

    Code (Text):
    FC              =       gfortran
    SFC             =       gfortran
    FFLAGS          =       -ffree-form -O -fconvert=big-endian -frecord-marker=4
    F77FLAGS        =       -ffixed-form -O -fconvert=big-endian -frecord-marker=4
    FNGFLAGS        =       $(FFLAGS)
    LDFLAGS         =
    CC              =       gcc
    SCC             =       gcc
    CFLAGS          =
    CPP             =       /usr/bin/cpp -C -P -traditional
    RANLIB          =       ranlib

    all: rd_wr_formatted.exe

        rm -f *.o rd_wr_formatted.exe

    rd_wr_formatted.exe: rd_wr_formatted.o read_geogrid.o write_geogrid.o
        $(FC) $(LDFLAGS) -o rd_wr_formatted.exe rd_wr_formatted.o read_geogrid.o write_geogrid.o

    rd_wr_formatted.o: rd_wr_formatted.f90
        $(FC) -c $(FFLAGS) rd_wr_formatted.f90

    read_geogrid.o: read_geogrid.c
        $(CC) -c $(CFLAGS) read_geogrid.c

    write_geogrid.o: write_geogrid.c
        $(CC) -c $(CFLAGS) write_geogrid.c
    Here is my fortran 90 program code:

    Code (Text):
    program rd_wr_binary

       implicit none

       integer, external :: iargc

       integer :: istatus
       character (len=256) :: fname

       real, allocatable, dimension(:,:) :: rarray
    !   real, allocatable, dimension(:,:) :: rarrayIN
       integer :: nx           ! x-dimension of the array
       integer :: ny           ! y-dimension of the array
       integer :: nz           ! z-dimension of the array
       integer :: isigned      ! 0=unsigned data, 1=signed data
       integer :: endian       ! 0=big endian, 1=little endian
       real :: scalefactor     ! value to divide array elements by before truncation to integers
       integer :: wordsize     ! number of bytes to use for each array element
       integer :: i
       integer :: j

       if (iargc /= 1) then
         write(0,*) ' '
         write(0,*) 'Usage: rd_wr_binary.exe <filename>'
         write(0,*) ' '
       end if

       call getarg(1, fname)

       ! The following must be set before compiling
       nx = 1200
       ny = 1200
       nz = 1
       isigned = 0
       endian = 0
       wordsize = 4
       scalefactor = 1.0

    !   allocate(rarrayIN(nx,ny))

       ! Read data from geogrid binary format using read_geogrid()
    !   call read_geogrid(fname, len_trim(fname), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize, istatus)
    !   if (istatus /= 0) then
    !      write(0,*) 'Error while reading '//trim(fname)//'. Quitting.'
    !   end if

    ! We read formatted data instead of binary input file
        open(10, file=trim(fname), form='formatted', status='old')
        do j=1,ny
           read(10,33) (rarray(i,j),i=1,nx)
           write(*,*) i,j,rarray(nx,j)
        end do
     33    format(f6.1, 12000f7.1)    
    ! 33    format(18500f7.1)


    ! ------------ IF we need FLIP file -----
    !      NO FLIP file!!!!!
    !        do j = 1,ny
    !          do i = 1,nx
    !            rarray(i,j) = rarrayIN(i,j)
    !          enddo
    !            write(*,*) i,j,rarray(nx,j)
    !        enddo  
    !--------------- end of FLIP/no FLIP ----  
       ! Modify the field as necessary

       ! Write data to geogrid binary format using write_geogrid()
       call write_geogrid(trim(fname)//'.bin', len_trim(trim(fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize)

    !   deallocate(rarrayIN)
       write(0,*) 'JOB finished OK!'

    end program rd_wr_binary
    When I try to compile using "make" command, I get this error message that I don't understand:

    Code (Text):
    [greg@Uranus:~/WRF/WPS/data/SRTM_to_geogrid]$ make
    gfortran -c -ffree-form -O -fconvert=big-endian -frecord-marker=4 rd_wr_formatted.f90

       if (iargc /= 1) then
    Error: Function 'iargc' requires an argument list at (1)

       end if
    Error: Expecting END PROGRAM statement at (1)

    fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize
    Error: Syntax error in argument list at (1)

    fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize
    Warning: Line truncated at (1)
    make: *** [rd_wr_formatted.o] Error 1
    Can someone help me? I'm really really blocked...

    Thank you very much!

  2. jcsd
  3. Jul 28, 2011 #2
    With the statement,

    Code (Text):
    if (iargc /= 1) then
    Are you trying to say "if iargc does not equal 1, then..."? If so, I would recommend using,

    Code (Text):
    if (iargc .ne. 1) then
    I'm not sure about the "Error: Expecting END PROGRAM statement", but it could have to do with the "stop" being there. See if ".ne." changes that. The last two errors you are getting are due to Fortran truncating programs at the 72nd column by default. If you type out something like,

    Code (Text):
    Somewhere in your program, you can tell what line to do continuations at. Making those multiple line statements will fix those errors.

    Hope that helped.

    It doesn't look like anything is wrong with your makefile, just the code.
  4. Jul 28, 2011 #3
    Yes indeed.

    I did the modification you proposed but I got the same error...
  5. Jul 28, 2011 #4


    User Avatar
    Homework Helper

    The compiler thinks iargc is an external function and not an integer. After doing a web search, iargc is a function. You'll need to add code like this:

    Code (Text):

          integer argcount
          argcount = iargc()
          if(1 /= argcount)then
    I don't know if this is allowed

    Code (Text):

          if(1 /= iargc() )then
    Last edited: Jul 28, 2011
  6. Jul 28, 2011 #5
    Why is iargc defined as external?
  7. Jul 29, 2011 #6
    I don't know exactly why... To be honest I'm not the author of the program. I try to use it for SRTM data to WRF geogrid binary data conversion. I understand what the program does generally, but unfortunately not all the code lines.

    I'll try to add rcgldr's code.
  8. Aug 1, 2011 #7
    I replaced

    Code (Text):
     if (iargc /= 1) then
         write(0,*) ' '
         write(0,*) 'Usage: rd_wr_binary.exe <filename>'
         write(0,*) ' '
        ! stop
       end if

    Code (Text):
     if (iargc() /= 1) then
         write(0,*) ' '
         write(0,*) 'Usage: rd_wr_binary.exe <filename>'
         write(0,*) ' '
        ! stop
       end if
    It is better by I have the following errors now:

    Code (Text):
    [greg@Uranus:~/WRF/WPS/data/SRTM_conversion]$ make
    gfortran  -o rd_wr_formatted.exe rd_wr_formatted.o read_geogrid.o write_geogrid.o
    rd_wr_formatted.o: In function `MAIN__':
    rd_wr_formatted.f90:(.text+0x39): undefined reference to `iargc_'
    rd_wr_formatted.f90:(.text+0x639): undefined reference to `write_geogrid_'
    collect2: ld returned 1 exit status
    make: *** [rd_wr_formatted.exe] Error 1
    Any idea?
  9. Aug 1, 2011 #8


    User Avatar
    Homework Helper

    You need to include library names in the make file for the link step. Apparently it's not defaulting to include the libraries you need to use iargc().
  10. Aug 1, 2011 #9
    Ok! Can you explain to me how to do that? (I'm quite a newbie sorry ...)
  11. Aug 1, 2011 #10


    User Avatar
    Homework Helper

Share this great discussion with others via Reddit, Google+, Twitter, or Facebook