I have only been programming in Fortran for a short time and have not yet
become accustomed to its rules. I require to assign new properties to the
basic operators (+,-,/,*) which will act upon derived type arguments. But I
am having problems with syntax, I cannot seem to get the correct statements
to declare a functions result as my derived type. As a test program I
decided to use integer operators(+,-,/,*) to define complex operations by
using the INTEFACE ASSIGNMENT (+) statement.
Thanks in advance for any advice.
Regards,
Colin.
PROGRAM main
USE Complex_Arithmetic
IMPLICIT NONE
TYPE(CompNum) :: i, j, k
i%a = 1; i%b = 1
j%a = 0; j%b = 2
k = i + j
END PROGRAM main
MODULE Complex_Arithmetic
IMPLICIT NONE
TYPE CompNum
INTEGER :: a, b
END TYPE CompNum
INTERFACE ASSIGNMENT (+)
TYPE(CompNum) FUNCTION Complex_Add(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
END FUNCTION Complex_Add
END INTERFACE
INTERFACE ASSIGNMENT (-)
TYPE(CompNum) FUNCTION Complex_Subtract(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
END FUNCTION Complex_Subtract
END INTERFACE
INTERFACE ASSIGNMENT (*)
TYPE(CompNum) FUNCTION Complex_Mult(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
END FUNCTION Complex_Mult
END INTERFACE
INTERFACE ASSIGNMENT (/)
TYPE(CompNum) FUNCTION Complex_Div(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
END FUNCTION Complex_Div
END INTERFACE
CONTAINS
TYPE(CompNum) FUNCTION Complex_Add(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
Complex_Add%a = Comp1%a+Comp2%a
Complex_Add%b = Comp1%b+Comp2%b
RETURN
END FUNCTION Complex_Add
TYPE(CompNum) FUNCTION Complex_Subtract(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
Complex_Add%a = Comp1%a-Comp2%a
Complex_Add%b = Comp1%b-Comp2%b
RETURN
END FUNCTION Complex_Subtract
TYPE(CompNum) FUNCTION Complex_Mult(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
Complex_Add%a = Comp1%a*Comp2%a-Comp1%b*Comp2%b
Complex_Add%b = Comp1%a*Comp2%b+Comp1%b*Comp2%a
RETURN
END FUNCTION Complex_Mult
TYPE(CompNum) FUNCTION Complex_Div(Comp1,Comp2)
TYPE(CompNum), INTENT(IN) :: Comp1, Comp2
INTEGER :: q
q = Comp2%a*Comp2%a+Comp2%b*Comp2%b
Complex_Add%a = (Comp1%a*Comp2%a+Comp1%b*Comp2%b)/q
Complex_Add%b = (Comp1%b*Comp2%a-Comp1%a*Comp2%b)/q
RETURN
END FUNCTION Complex_Div
END MODULE Complex_Arithmetic
|