|
MODULE VectorMathMod |
|
IMPLICIT NONE |
|
REAL*8 :: PI |
|
PI = ACOS(0.0D0)*2.D0 |
|
|
|
TYPE Vector |
|
REAL*8 :: X |
|
REAL*8 :: Y |
|
REAL*8 :: Z |
|
END TYPE Vector |
|
|
|
INTERFACE ABS |
|
MODULE PROCEDURE VLength |
|
END INTERFACE |
|
|
|
INTERFACE OPERATOR (+) |
|
MODULE PROCEDURE Add |
|
END INTERFACE |
|
|
|
INTERFACE OPERATOR (-) |
|
MODULE PROCEDURE Substract |
|
END INTERFACE |
|
|
|
INTERFACE OPERATOR (*) |
|
MODULE PROCEDURE MultScalar |
|
END INTERFACE |
|
|
|
INTERFACE OPERATOR (**) |
|
MODULE PROCEDURE MultVector |
|
END INTERFACE |
|
|
|
CONTAINS |
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
!!!!!!!!!!!!---FUNCTIONS---!!!!!!!!!!!!!! |
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
TYPE(Vector) FUNCTION Add(vector1, vector2) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2 |
|
|
|
Add.X = vector1.X + vector2.X |
|
Add.Y = vector1.Y + vector2.Y |
|
Add.Z = vector1.Z + vector2.Z |
|
END FUNCTION Add |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
TYPE(Vector) FUNCTION Substract(vector1, vector2) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2 |
|
|
|
Substract.X = vector1.X - vector2.X |
|
Substract.Y = vector1.Y - vector2.Y |
|
Substract.Z = vector1.Z - vector2.Z |
|
END FUNCTION Substract |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
TYPE(Vector) FUNCTION Multiply(vector1, coeff) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN):: vector1 |
|
REAL*8, INTENT(IN) :: coeff |
|
|
|
Multiply.X = vector1.X*coeff |
|
Multiply.Y = vector1.Y*coeff |
|
Multiply.Z = vector1.Z*coeff |
|
END FUNCTION Multiply |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
REAL*8 FUNCTION VLength(vect) |
|
IMPLICIT NONE |
|
TYPE(Vector) :: vect |
|
|
|
VLength = SQRT(vect.X**2 + vect.Y**2 + vect.Z**2) |
|
END FUNCTION VLength |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
REAL*8 FUNCTION VAngle(vector1, vector2) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2 |
|
|
|
VAngle = (vector1.X*vector2.X + vector1.Y*vector2.Y + vector1.Z*vector2.Z) & |
|
/ (VLength(vector1)*VLength(vector2)) |
|
|
|
END FUNCTION VAngle |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
REAL*8 FUNCTION MultScalar(vector1, vector2) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2 |
|
|
|
MultScalar = VLength(vector1)*VLength(vector2)*VAngle(vector1, vector2) |
|
|
|
END FUNCTION MultScalar |
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
|
TYPE(Vector) FUNCTION MultVector(vector1, vector2) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2 |
|
MultVector.X = vector1.Y*vector2.Z - vector2.Y*vector1.Z |
|
MultVector.Y = vector1.Z*vector2.X - vector2.Z*vector1.X |
|
MultVector.Z = vector1.X*vector2.Y - vector2.X*vector1.Y |
|
! CHECK FOR: {3, -4, -8} AND {-5, 2, -1} |
|
! RESULT IS {20, 43, -14} |
|
END FUNCTION MultVector |
|
|
|
REAL*8 FUNCTION MultMixed(vector1, vector2, vector3) |
|
IMPLICIT NONE |
|
TYPE(Vector), INTENT(IN) :: vector1, vector2, vector3 |
|
|
|
MultMixed = MultScalar(vector1, MultVector(vector2, vector3)) |
|
|
|
END FUNCTION MultMixed |
|
|
|
END MODULE VectorMathMod |