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

I am stuck with an f90 module with user-defined operations

  1. Feb 3, 2012 #1
    I am writing some code which involves numerical integration of a function on a 3D grid of points. I am defining the type vector to refer to these points, and I am also trying to extend the intrinsic operator * to include scalar and vector multiplication. However, I cannot compile and I don't know how to fix it.

    I am having trouble with and without the module, but I think it would be better to make it work as a module. I am not sure how to go about getting this to work, though. This one includes just scalar multiplication:

    module modvec

    type vector
    real, dimension(3) :: x
    end type vector

    interface operator(*)
    module procedure distributive
    end interface


    function distributive(a,v) result (w)
    real, intent(in) :: a
    type(vector), intent(in) :: v
    type(vector), intent(out) :: w
    do i=1,3
    w(i) = a*v(i)
    end function distributive

    end module modvec

    This does not compile in the main or as a module. What am I doing wrong?
  2. jcsd
  3. Mar 15, 2012 #2
    You have created an illegal recursive definition of DISTRIBUTIVE
    at the line w(i) = a*v(i).
    For your (apparent) task, you don't need a type "Vector".
    Nor do you need a module procedure to do multiplication.

    Ordinary Fortran facilities permit you to multiply a scalar by a vector,
    without the need to overlay an operator (*).

    If w and v are defined as vectors, then you can write

    w = a*v

    and the operations are performed on w(1) thru w(3) and v(1) thru v(3).
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook