Thursday, May 29, 2014

overload operator in f90

Fortran 90: Overloaded Operators

Let's start this section out with an example. Define the data type vector, which is a double precision array of length 3.
type vector
   real*8 :: v(3)
end type vector
Put this definition in matvec.p for reference below. Now we could make a function to add two vectors.
function vadd(v1,v2) result (v3)
   include "matvec.p"         !!!! similar to c/c++
   type (vector), intent(in) :: v1,v2
   type (vector),  :: v3
   v3%v = v1%v + v2%v ! Note the use of array operations
end function vadd
The following code will add two vectors
type (vector) a,b,c
a = vadd(b,c)
Now using operator overloading, we can call the vadd function by using "+".
interface operator (+)
   function vadd(v1,v2) result (v3)
      include "matvec.p"
      type (vector), intent(in) :: v1,v2
      type (vector),  :: v3
   end function vadd
end interface
Adding two vectors is now
type (vector) a,b,c
a = b + c
Let's define a function that takes two vectors and returns the dot product as a scalar.
function vdot(v1,v2) result (dot)
   include "matvec.p"
   type (vector), intent(in) :; v1,v2
   real*8 :: dot
   integer i
   dot = 0.0d0
   do i=1,3
      dot = dot + v1%v(i) * v2%v(i)
   enddo
Taking the dot product is then
type (vector) a,b
real*8 c
c = vdot(a,b)
Once again, operator overloading could be used to call this function with the "*" operator. Or if that may be confusing, we can define a new operator ".dot."
interface operator (*)   !   or (.dot.)
   function vdot(v1,v2) result (dot)
      include "matvec.p"
      type (vector), intent(in) :: v1,v2
      real*8 :: dot
   end function vdot
end function interface
Taking the dot product is now
type (vector) a,b
real*8 c
c = a*b  ! or c = a.dot.b
These examples could all be done more simply using the array intrinsics. But in cases where the array intrinsics are not sufficient, creating our own data types can be a powerfull tool.
Return to Fortran 90 index

No comments:

Post a Comment