vector
, 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" 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 interfaceAdding two vectors is now
type (vector) a,b,c a = b + cLet'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 interfaceTaking the dot product is now
type (vector) a,b real*8 c c = a*b ! or c = a.dot.bThese 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.