! projection of a vector MODULE vector_arithmetic IMPLICIT NONE TYPE vector REAL :: x, y, z END TYPE INTERFACE OPERATOR(-) MODULE PROCEDURE subtraction END INTERFACE INTERFACE OPERATOR(*) MODULE PROCEDURE scalar_multiplication END INTERFACE INTERFACE OPERATOR(*) MODULE PROCEDURE inner_product END INTERFACE CONTAINS FUNCTION subtraction( u, v ) RESULT( w ) IMPLICIT NONE TYPE(vector), INTENT(IN) :: u, v TYPE(vector) :: w w%x = u%x - v%x w%y = u%y - v%y w%z = u%z - v%z END FUNCTION FUNCTION scalar_multiplication( s, v ) RESULT( w ) IMPLICIT NONE TYPE(vector), INTENT(IN) :: v TYPE(vector) :: w REAL, INTENT(IN) :: s w%x = s * v%x w%y = s * v%y w%z = s * v%z END FUNCTION FUNCTION inner_product( u, v ) RESULT( s ) IMPLICIT NONE TYPE(vector), INTENT(IN) :: u, v REAL :: s s = u%x * v%x + u%y * v%y + u%z * v%z END FUNCTION END MODULE vector_arithmetic ! ! main ! PROGRAM main USE vector_arithmetic, ONLY : vector, & operator(-), & operator(*) IMPLICIT NONE TYPE(vector) :: a, n, perp, planar PRINT '(1X, A)', 'Input the normal vector of projection-plane: ' READ *, n PRINT '(1X, A)', 'Input a 3d vector: ' READ *, a perp = ( ( a * n ) / ( n * n ) ) * n planar = a - perp PRINT '(1X, A, 3F7.2, A)', 'perp. component = (', perp, ' )' PRINT '(1X, A, 3F7.2, A)', 'planar component = (', planar, ' )' END PROGRAM main