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

Fortran subroutine output

  1. Sep 25, 2012 #1
    Hi all,

    So I have a program that calls a module that contains a subroutine so I can make a matrix.
    When I write the matrix in the subroutine (commented out part in module) I get the right output, but when the main program tries to output it is some insanely small or large numbers.
    I am new to Fortran (not coding) so any help/criticism would be greatly appreciated! Definitely a bit of a learning curve but I am excited to learn fortran.

    Code (Text):

    program test

    use test_mod

    implicit none

    integer :: k
    real, allocatable, Dimension(:,:) :: test_mat

    write(*,*) 'Dimension for square test matrix: '
    read (*,*) k

    allocate(test_mat(k,k))
    call test_matrix(k)

    !This gives bad output, but right dimensions
    write(*,*) test_mat
    deallocate(test_mat)

    end program test


     
    Code (Text):

    module test_mod

    implicit none

    contains

        subroutine test_matrix(k)
       
    integer :: k
    real, dimension(:,:), allocatable :: test_mat
    INTEGER :: i,j,m,n


    allocate(test_mat(k,k))

    do i = 1,k
    do j = 1,k

    test_mat(i,j) = 1.d0*((i+j-1))
    end do
    end do

    !This loop gives correct output
    !do m = 1,k
    !write(*,*)(test_mat(m,n), n=1,k)
    !end do

    deallocate(test_mat)

    end subroutine test_matrix
    end module test_mod    
     
     
  2. jcsd
  3. Sep 25, 2012 #2

    Mark44

    Staff: Mentor

    I'm not a Fortran expert, but I think the problem is that you have two arrays named test_mat - one in the main program, and the other in your subroutine. The only one that gets initialized is the one in the subroutine, so when you print out its values, you get what you expect.

    The array in the main program is never initialized, so when you print its values, you get garbage.
     
  4. Sep 25, 2012 #3

    uart

    User Avatar
    Science Advisor

    As Mark says, you've actually defined a new matrix in the subroutine. What you need to do is to pass the existing matrix to the subroutine. Try the following code (based on your code) for example and see if you can work out what it's doing

    BTW. I put some redundant code in there to assign to "j" in the subroutine. This is just to help you understand how the variables defined in the subroutine are different to those in the main program, even if they have the same name (whereas the "passed" variables are effectively the same, even if they are given different names).

    Code (Text):

    program alloctest
    implicit none
      integer :: i,j
      real, allocatable, Dimension(:,:) :: test_mat

      print "(a$)",'Dimension for square test matrix: '
      read (*,*) j
      allocate(test_mat(j,j))
      call test_matrix(test_mat,j)

      do i = 1,j
        print *,test_mat(i,:)
      end do

      deallocate(test_mat)

    contains

    subroutine test_matrix(tm,size)
    implicit none
    integer :: size
    real, dimension(:,:) :: tm

      integer :: i,j
      do i = 1,size
        do j = 1,size
          test_mat(i,j) = 1.d0*((i+j-1))
        end do
      end do
      j = 0          ! Should have no effect in main program.

    end subroutine test_matrix
    end program alloctest  
     
     
    Last edited: Sep 25, 2012
  5. Sep 25, 2012 #4
    Thank you so much. That was very helpful and it worked!
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Fortran subroutine output
  1. FORTRAN 90 subroutine (Replies: 3)

Loading...