Class | Damping |
In: |
util/damping.f90
|
Copyright (C) GFD Dennou Club, 2005. All rights reserved.
* Developer: SUGIYAMA Ko-ichiro * Version: $Id: damping.f90,v 1.1.1.1 2006/04/25 03:43:58 deepconv Exp $ * Tag Name: $Name: $ * Change History:
減衰率とその計算を行うためのパッケージ型モジュール
* 音波減衰項の係数 * スポンジ層の設定(境界付近で波の反射を抑え吸収するための層)
* この関数は, 基本場が零な変数(速度, エクスナー関数の擾乱)に 適用することを想定している. * 各格子点に対する関数を定義する必要がある
subroutine DampSound_Init ( damp ) ! ! 音波減衰項の減衰係数の初期化 ! !暗黙の型宣言禁止 implicit none !変数定義 real(8), intent(in) :: damp !------------------------------------------------------------------- ! 音波減衰項の減衰率 DelX ** 2.0 に依存? !------------------------------------------------------------------- DampSound = Damp * ( DelX ** 2.0d0 ) / DelTimeShort !----------------------------------------------------------------- ! 値の確認 !----------------------------------------------------------------- write(*,*) "DampSound_init, DampSound : ", DampSound end subroutine
subroutine DampSponge_Init ( Time, DepthH, DepthV ) ! ! スポンジ層の減衰係数を決める ! !暗黙の型宣言禁止 implicit none !入力変数 real(8), intent(in) :: Time !スポンジ層の e-folding time real(8), intent(in) :: DepthH !スポンジ層の厚さ(水平方向) real(8), intent(in) :: DepthV !スポンジ層の厚さ(鉛直方向) real(8), parameter :: Pi =3.1415926535897932385d0 !円周率 integer :: i, k !初期化 allocate( & & xz_DampRateH(DimXMin:DimXMax, DimZMin:DimZMax), & & xz_DampRateV(DimXMin:DimXMax, DimZMin:DimZMax), & & pz_DampRateH(DimXMin:DimXMax, DimZMin:DimZMax), & & pz_DampRateV(DimXMin:DimXMax, DimZMin:DimZMax), & & xr_DampRateH(DimXMin:DimXMax, DimZMin:DimZMax), & & xr_DampRateV(DimXMin:DimXMax, DimZMin:DimZMax) ) xz_DampRateH = 0.0d0 xz_DampRateV = 0.0d0 pz_DampRateH = 0.0d0 pz_DampRateV = 0.0d0 xr_DampRateH = 0.0d0 xr_DampRateV = 0.0d0 !値の入力 EFTime = Time DampDepthH = DepthH DampDepthV = DepthV !----------------------------------------------------------------- ! スポンジ層の減衰率 !----------------------------------------------------------------- !水平方向の東側・西側境界 if ( DampDepthH < DelX ) then ! write(*,*) "DampDepthH is too thin. DelX is ", DelX !警告のみ出力 else do i = DimXMin, DimXMax !スカラー格子点の西側境界 if ( s_X(i) < DampDepthH) then xz_DampRateH(i,:) = ((1.0d0 - s_X(i) / DampDepthH) ** 3.0d0) / EFTime end if !フラックス格子点の西側境界 if ( f_X(i) < DampDepthH) then pz_DampRateH(i,:) = ((1.0d0 - f_X(i) / DampDepthH) ** 3.0d0) / EFTime end if !スカラー格子点の東側境界 if ( s_X(i) > ( XMax - DampDepthH ) ) then xz_DampRateH(i,:) = & & ((1.0d0 - (XMax - s_X(i)) / DampDepthH) ** 3.0d0) / EFTime end if !フラックス格子点の東側境界 if ( f_X(i) > ( XMax - DampDepthH ) ) then pz_DampRateH(i,:) = & & ((1.0d0 - (XMax - f_X(i)) / DampDepthH) ** 3.0d0) / EFTime end if end do end if !sf と ss は X 方向に関しては同じ xr_DampRateH = xz_DampRateH !鉛直方向の上部境界 if ( DampDepthV < DelZ ) then ! write(*,*) "DampDepthV is too thin. DelZ is ", DelZ !警告のみ表示 else do k = DimZMin, DimZMax !スカラー格子点 if ( s_Z(k) >= ( ZMax - DampDepthV ) ) then xz_DampRateV(:,k) = & & (1.0d0 - dcos(Pi * (s_Z(k) - ZMax + DampDepthV) / DampDepthV)) & & / EFTime end if !フラックス格子点 if ( f_Z(k) >= ( ZMax - DampDepthV ) ) then xr_DampRateV(:,k) = & & (1.0d0 - dcos(Pi * (f_Z(k) - ZMax + DampDepthV)/ DampDepthV)) & & / EFTime end if end do end if !fs と ss は Z 方向に関しては同じ pz_DampRateV = xz_DampRateV !----------------------------------------------------------------- ! 値の確認 !----------------------------------------------------------------- write(*,*) "DampSponge_Init, EFTime : ", EFTime write(*,*) "DampSponge_Init, DampDepthH: ", DampDepthH write(*,*) "DampSponge_Init, DampDepthV: ", DampDepthV end subroutine
subroutine Damping_Init ( cfgfile ) ! ! 音波減衰項とスポンジ層の減衰係数の初期化 ! !暗黙の型宣言禁止 implicit none !変数定義 character(*), intent(in) :: cfgfile real(8) :: Alpha real(8) :: Time real(8) :: DepthH real(8) :: DepthV !NAMELIST から取得 NAMELIST /damping/ Alpha, Time, DepthH, DepthV open (10, FILE=cfgfile) read(10, NML=damping) close(10) !初期化 call DampSound_Init( Alpha ) call DampSponge_Init( Time, DepthH, DepthV ) end subroutine