IGMBaseLib 1.0

src/core/math/igmcore_linear_algebra.f90

Go to the documentation of this file.
00001 
00012 module igmcore_linear_algebra
00013   
00014   ! モジュール引用 ; Use statements
00015   !
00016 
00017   ! 種類型パラメタ
00018   ! Kind type parameter
00019   !
00020   use dc_types, only: DP  ! 倍精度実数型. Double precision
00021   
00022   ! 宣言文 ; Declaration statements
00023   !
00024   implicit none
00025   private
00026 
00027   ! 公開手続き
00028   ! Public procedure
00029   !
00030   public :: vec_length, vec_normarize
00031   public :: dot, cross
00032   public :: rotateX, rotateY, rotateZ
00033 
00034 contains
00035 
00036   !
00051   function rotateX(     &
00052     & vec, angle        & ! (in) 
00053     & ) result(rel_vec)
00054 
00055     ! 宣言文 ; Declaration statements
00056     !
00057     real(DP), intent(in) :: vec(3)   ! 回転行列を作用させるベクトル(A_x, A_y, A_z)
00058     real(DP), intent(in) :: angle    ! 回転させる角度
00059     real(DP) rel_vec(3)              ! 回転行列を作用させた後のベクトル
00060 
00061     ! 実行文 ; Executable statements
00062     !
00063     
00064     ! 3次元ベクトル vec を X 軸回りに角度 angle だけ回転させ,
00065     ! その結果を rel_vec に格納する.
00066     rel_vec(1) = vec(1)
00067     rel_vec(2) = cos(angle) * vec(2) - sin(angle) * vec(3)
00068     rel_vec(3) = sin(angle) * vec(2) + cos(angle) * vec(3)
00069   end function rotateX
00070 
00071   !
00086   function rotateY(      &
00087     & vec, angle         & ! (in)
00088     & ) result(rel_vec)
00089 
00090     ! 宣言文 ; Declaration statements
00091     !
00092     real(DP), intent(in) :: vec(3)      ! 回転行列を作用させるベクトル\f$(A_x, A_y, A_z)\f$.
00093     real(DP), intent(in) :: angle       ! 回転させる角度
00094     real(DP) rel_vec(3)                 ! 回転行列を作用させた後のベクトル
00095 
00096     ! 実行文 ; Executable statements
00097     !
00098     
00099     ! 3次元ベクトル vec を Y 軸回りに角度 angle だけ回転させ,
00100     ! その結果を rel_vec に格納する.
00101     rel_vec(1) = cos(angle) * vec(1) + sin(angle) * vec(3)
00102     rel_vec(2) = vec(2)
00103     rel_vec(3) = - sin(angle) * vec(1) + cos(angle) * vec(3)
00104 
00105   end function rotateY
00106 
00107   !
00122   function rotateZ( &
00123     & vec, angle    & ! (in) 
00124     & ) result(rel_vec)
00125 
00126     ! 宣言文 ; Declaration statements 
00127     !
00128 
00129     real(DP), intent(in) :: vec(3)      ! 回転行列を作用させるベクトル\f$(A_x, A_y, A_z)\f$
00130     real(DP), intent(in) :: angle       ! 回転させる角度
00131     real(DP) rel_vec(3)                 ! 回転行列を作用させた後のベクトル
00132 
00133     ! 実行文 ; Executable statements 
00134     !
00135 
00136     ! 3次元ベクトル vec をZ 軸回りに角度 angle だけ回転させ,
00137     ! その結果を rel_vec に格納する.
00138     rel_vec(1) = cos(angle) * vec(1) - sin(angle) * vec(2)
00139     rel_vec(2) = sin(angle) * vec(1) + cos(angle) * vec(2)
00140     rel_vec(3) = vec(3)
00141 
00142   end function rotateZ
00143 
00144   !
00157   function vec_length( &
00158     & vec              &   ! (in)
00159     & ) result(length)
00160 
00161     ! 宣言文 ; Declaration statements
00162     !
00163 
00164     real(DP), intent(in) :: vec(3)  ! 長さを取得したいベクトル
00165     real(DP) length                 ! ベクトルの長さ
00166 
00167     ! 実行文 ; Executable statements
00168     !
00169 
00170     length = sqrt(vec(1)**2 + vec(2)**2 + vec(3)**2)
00171 
00172   end function vec_length
00173 
00174   !
00185   subroutine vec_normarize( &
00186     & vec                   &   ! (inout)
00187     & )
00188 
00189     ! 宣言文 ; Declaration statements
00190     !
00191     real(DP), intent(inout) :: vec(3)    ! 規格化したいベクトル
00192 
00193     ! 実行文 ; Executable statements
00194     !
00195 
00196     vec(1:3) = vec(1:3) / vec_length(vec)
00197 
00198   end subroutine
00199 
00200   !
00215   function cross( &
00216     & v1, v2    &     ! (in)
00217     & ) result(v)
00218 
00219     ! 宣言文 ; Declaration statements
00220     !
00221     real(DP), intent(in) :: v1(3)   ! ベクトル\f$\Dvect{v}_1\f$. 
00222     real(DP), intent(in) :: v2(3)   ! ベクトル\f$\Dvect{v}_2\f$. 
00223     real(DP) v(3)                   ! \f$\Dvect{v}_1 \times \Dvect{v}_2\f$の計算結果を格納したベクトル
00224 
00225     ! 実行文 ; Executable statements
00226     !
00227 
00228     v(1) = v1(2)*v2(3) - v1(3)*v2(2)
00229     v(2) = v1(3)*v2(1) - v1(1)*v2(3)
00230     v(3) = v1(1)*v2(2) - v1(2)*v2(1)
00231   end function cross
00232 
00233   !
00248   function dot( &
00249     & v1, v2    &    ! (in)
00250     &) result(val)
00251 
00252 
00253     ! 宣言文 ; Declaration statements
00254     !
00255     real(DP), intent(in) :: v1(3)  ! ベクトル\f$\Dvect{v}_1\f$
00256     real(DP), intent(in) :: v2(3)  ! ベクトル\f$\Dvect{v}_2\f$
00257     real(DP) val                   ! \f$\Dvect{v}_1 \cdot \Dvect{v}_2\f$の計算結果
00258 
00259     ! 実行文 ; Executable statements
00260     !
00261 
00262     val = v1(1)*v2(1) + v1(2)*v2(2) + v1(3)*v2(3)
00263 
00264   end function dot
00265 
00266 end module igmcore_linear_algebra
 All Classes Namespaces Files Functions Variables