Fortran 90: Overloaded Operators
Let's start this section out with an example. Define the data typevector
, which is a double precision
array of length 3.
type vector real*8 :: v(3) end type vectorPut 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 vaddThe 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) enddoTaking 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