! 例題 9-5 ベクトルの分解 [ユーザ定義演算子 ] 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 subtraction ! スカラ倍 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 scalar_multiplication ! スカラ積(内積) 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 inner_product END MODULE vector_arithmetic ! main PROGRAM ex9_5 USE vector_arithmetic, ONLY : vector, & OPERATOR ( - ), & OPERATOR ( * ) IMPLICIT NONE 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 '( 1X, A, 3F7.2, A )', & 'Perp. Component = (', perp, ' )' PRINT '( 1X, A, 3F7.2, A )', & 'Planar Component = (', planar, ' )' END PROGRAM ex9_5