!----- Ex9_7: Projection of a Vector ----- MODULE vector_arithmetic 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) 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) 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) 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 ! PROGRAM main USE vector_arithmetic TYPE(vector) :: a, n, perp, planar PRINT *, "Input the normal vector of projection-plane:" READ *, n PRINT *, "Input a 3D vector:" READ *, a perp = ( (a*n)/(n*n) ) * n planar = a - perp PRINT "(A, 3F7.2, A)", 'Perp. Component = (', perp, ' )' PRINT "(A, 3F7.2, A)", 'Planar Component = (', planar, ' )' END