!--------------------------------------------------------------------- ! Copyright (C) GFD Dennou Club, 2006. All rights reserved. !--------------------------------------------------------------------- ! != 1 次元 (y 方向) 等間隔交互格子 有限差分モデル用 基本モジュール ! !* 履歴 ! * 2007/07/15 (小高正嗣) : 3D deepconv へ移植, dc_types を Use. ! * 2006/12/26 (小高正嗣) : p_Y を復活, y_q, q_y の名前を元に戻す ! * 2006/06/17 (小高正嗣) : IntY_*, AvrY_* を追加 ! * 2006/06/02 (小高正嗣) : x_base_module より作成 ! module y_base_module != 1 次元 (y 方向) 等間隔交互格子 有限差分モデル用 基本モジュール ! !== 概要 ! ! y_base_module は, 1 次元 (y 方向) 等間隔交互格子を用いた有限差分 ! 法に基づく数値モデルのための基本的な Fortran90 副プログラムおよび ! 関数を提供する. このモジュールは y_module の下位モジュールである. ! !== 備考 ! ! * 例外処理がない ! * その場合のメッセージ表示がない ! * 初期化の値はマシンイプシロン値としておくべき use dc_types, only : DBKIND => DP implicit none private public :: jm, ymargin, jmin, jmax, y_Y, q_Y, y_dy, q_dy public :: y_axis_init, y_avr_q, q_avr_y, IntY_q, IntY_y, AvrY_q, AvrY_y integer :: jm = 10 ! 格子点数 integer :: ymargin = 2 ! 糊代格子点数 integer :: jmin ! 配列添字の下限 integer :: jmax ! 配列添字の上限 real(DBKIND),allocatable :: y_Y(:) ! 半整数格子点座標 real(DBKIND),allocatable :: q_Y(:) ! 整数格子点座標 real(DBKIND),allocatable :: y_dy(:) ! 半整数格子点座標 real(DBKIND),allocatable :: q_dy(:) ! 整数格子点座標 save jm, ymargin, jmin, jmax, y_Y, q_Y, y_dy, q_dy contains !-------------------------------------------------------------------- subroutine y_axis_init(j, ymg, ymin, ymax) ! y 方向の座標値と格子点間隔を設定する integer,intent(in) :: j ! y 方向格子点数 integer,intent(in) :: ymg ! y 方向糊代格子点数 real(DBKIND),intent(in) :: ymin ! y 座標最小値 real(DBKIND),intent(in) :: ymax ! y 座標最大値 integer :: jy ! ループ添字 real(DBKIND) :: dy jm = j ymargin = ymg jmin = 1 - ymargin jmax = jm + ymargin allocate(y_Y(jmin:jmax)) allocate(q_Y(jmin:jmax)) allocate(y_dy(jmin:jmax)) allocate(q_dy(jmin:jmax)) dy = (ymax - ymin)/jm do jy = jmin, jmax q_Y(jy) = dy * jy y_Y(jy) = dy * (jy - 0.5) y_dy(jy) = dy q_dy(jy) = dy end do end subroutine y_axis_init !-------------------------------------------------------------------- function y_avr_q(q_Var) ! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す real(DBKIND),intent(in) :: q_Var(jmin:jmax) ! 入力 real(DBKIND) :: y_avr_q(jmin:jmax) ! 出力 integer :: jy ! ループ添字 ! 初期化 ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき ! y_avr_q = 0.0d0 ! 平均操作 ! * 平均がとれない jmin 格子上の値は計算しない. ! do jy = jmin+1, jmax y_avr_q(jy) = (q_Var(jy) + q_Var(jy-1))*0.5d0 end do ! jmin 格子点の値 y_avr_q(jmin) = y_avr_q(jmin+1) end function y_avr_q !-------------------------------------------------------------------- function q_avr_y(y_Var) ! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す real(DBKIND),intent(in) :: y_Var(jmin:jmax) ! 入力 real(DBKIND) :: q_avr_y(jmin:jmax) ! 出力 integer :: jy ! ループ添字 ! 初期化 ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき ! q_avr_y = 0.0d0 ! 平均操作 ! * 平均がとれない jmax 格子上の値は計算しない. ! * 不等間隔格子なので重みをつけて平均する. ! 点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P) ! (a+b=1 を仮定) であることから, ! ! q_Var(jy) = [0.5*y_dy(jy) /q_dy(jy)]*y_Var(jy+1) + ! [0.5*y_dy(jy+1)/q_dy(jy)]*y_Var(jy) ! ! 変形すると ! ! q_Var(jy) = [y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy)] ! *0.5/q_dy(jy) ! do jy = jmin, jmax-1 q_avr_y(jy) = & & (y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy))*0.5d0/q_dy(jy) end do ! jmax 格子点の値 q_avr_y(jmax) = q_avr_y(jmax-1) end function q_avr_y !-------------------------------------------------------------------- function IntY_q(q_Var) ! 整数格子上の配列に対し y 方向に重み付きの積分を行う real(DBKIND), intent(in) :: q_Var(jmin:jmax) ! 入力 real(DBKIND) :: IntY_q ! 出力 ! 初期化 IntY_q = 0.0d0 ! 積分 IntY_q = sum(q_Var(1:jm)*q_dy(1:jm)) end function IntY_q !-------------------------------------------------------------------- function IntY_y(y_Var) ! 半整数格子上の配列に対し y 方向に重み付きの積分を行う real(DBKIND), intent(in) :: y_Var(jmin:jmax) ! 入力 real(DBKIND) :: IntY_y ! 出力 ! 初期化 IntY_y = 0.0d0 ! 積分 IntY_y = sum(y_Var(1:jm)*y_dy(1:jm)) end function IntY_y !-------------------------------------------------------------------- function AvrY_q(q_Var) ! 整数格子上の配列に対し y 方向の平均操作を行う real(DBKIND), intent(in) :: q_Var(jmin:jmax) ! 入力 real(DBKIND) :: AvrY_q ! 出力 AvrY_q = IntY_q(q_Var)/sum(q_dy(1:jm)) end function AvrY_q !-------------------------------------------------------------------- function AvrY_y(y_Var) ! 半整数格子上の配列に対し y 方向の平均操作を行う real(DBKIND), intent(in) :: y_Var(jmin:jmax) ! 入力 real(DBKIND) :: AvrY_y ! 出力 AvrY_y = IntY_y(y_Var)/sum(y_dy(1:jm)) end function AvrY_y !-------------------------------------------------------------------- end module y_base_module