IGMBaseLib 1.0
|
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