Skip to content

Instantly share code, notes, and snippets.

@dracid
Created December 14, 2012 20:27
Show Gist options
  • Save dracid/4288394 to your computer and use it in GitHub Desktop.
Save dracid/4288394 to your computer and use it in GitHub Desktop.
Vector operations example for FORTRAN90.
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment