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

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
1 replies · 2K views
gluons
Messages
15
Reaction score
0
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

contains

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)
enddo
end function distributive

end module modvec



This does not compile in the main or as a module. What am I doing wrong?
 
on Phys.org
gluons said:
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

contains

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)
enddo
end function distributive

end module modvec



This does not compile in the main or as a module. What am I doing wrong?

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).