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

Fortran 90: dinamic matrix valued function as argument

  1. Jul 19, 2012 #1
    hello, i'm trying to write a program with a subroutine that can handle array valued functions of different dimensions, i'm new to fortran 90 so i have some troubles.
    Here's what i tried:

    program passing
    use functions
    use sub_mod
    implicit none
    integer, dimension(2,2):: a2
    integer, dimension(3,3):: a3
    call prova(a2,g2)
    !print*,a2
    call prova(a3,g3)
    !print*,a3
    end program passing

    module functions
    implicit none
    contains
    function g2(x)
    implicit none
    !result
    integer,dimension(2,2) :: g2
    !dummy
    integer x
    g2(1,1)=x+2
    g2(1,2)=x+2
    g2(2,1)=x+2
    g2(2,2)=x+2
    end function g2

    function g3(x)
    implicit none
    !result
    integer,dimension(3,3) :: g3
    !dummy
    integer x
    g3(1,1)=x+3
    g3(1,2)=x+3
    g3(2,1)=x+3
    g3(2,2)=x+3
    end function g3

    end module functions

    module sub_mod
    implicit none
    contains
    subroutine prova(a,f)
    !dummy
    integer,dimension(:,:) :: a
    integer,dimension(size(a,1),size(a,2)) :: f
    external f
    a=f(0)
    end subroutine prova
    end module sub_mod


    i got 1 compiler error "can't open module file sub_mod.mod..."
     
  2. jcsd
  3. Jul 19, 2012 #2

    uart

    User Avatar
    Science Advisor

    Hi Taff. I'm a pretty infrequent Fortran user, but I think that you have three options with modules

    1. Put them ahead of the code that uses them.

    2. Put a "prototype" header before the code that uses them. (I think it's the "interface" keyword, but I cant remember the exact syntax).

    3. Put them is a separate file.

    So the easiest fix for you is to just put them ahead of the main program, Eg

    Code (Text):

    module functions
    implicit none
    contains
    function g2(x)
    implicit none
    !result
    integer,dimension(2,2) :: g2
    !dummy
    integer x
    g2(1,1)=x+2
    g2(1,2)=x+2
    g2(2,1)=x+2
    g2(2,2)=x+2
    end function g2

    function g3(x)
    implicit none
    !result
    integer,dimension(3,3) :: g3
    !dummy
    integer x
    g3(1,1)=x+3
    g3(1,2)=x+3
    g3(2,1)=x+3
    g3(2,2)=x+3
    end function g3

    end module functions

    module sub_mod
    implicit none
    contains
    subroutine prova(a,f)
    !dummy
    integer,dimension(:,:) :: a
    integer,dimension(size(a,1),size(a,2)) :: f
    external f
    a=f(0)
    end subroutine prova
    end module sub_mod

    program passing
    use functions
    use sub_mod
    implicit none
    integer, dimension(2,2):: a2
    integer, dimension(3,3):: a3
    call prova(a2,g2)
    !print*,a2
    call prova(a3,g3)
    !print*,a3
    end program passing
    BTW. Please note that you can use "code" tag to preserve formatting (indentation). I didn't put any indentation into your code because I just cut and pasted it and am too lazy. But next time you post code, using the code tag will greatly increase the chance that someone will bother reading it. :)
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Fortran 90: dinamic matrix valued function as argument
Loading...