Class | Damping |
In: |
util/damping.f90
|
減衰率とその計算を行うためのパッケージ型モジュール
* 音波減衰項の係数 * スポンジ層の設定(境界付近で波の反射を抑え吸収するための層)
Subroutine : | |
damp : | real(8), intent(in) |
音波減衰項の減衰係数の初期化
subroutine DampSound_Init( damp ) ! ! 音波減衰項の減衰係数の初期化 ! !暗黙の型宣言禁止 implicit none !変数定義 real(8), intent(in) :: damp !------------------------------------------------------------------- ! 音波減衰項の減衰率 Min(DelX, DelZ) ** 2.0 に比例 !------------------------------------------------------------------- DampSound = Damp * ( Min(DelX, DelZ) ** 2.0d0 ) / DelTimeShort !----------------------------------------------------------------- ! 値の確認 !----------------------------------------------------------------- call MessageNotify( "M", "DampSound_init", "DampSound = %f", d=(/DampSound/) ) end subroutine DampSound_Init
Subroutine : | |||
Time : | real(8), intent(in)
| ||
DepthH : | real(8), intent(in)
| ||
DepthV : | real(8), intent(in)
|
スポンジ層の減衰係数を決める
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 call MessageNotify( "W", "DampSponge_Init", "DampDepthH is too thin. DelX is %f", d=(/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 call MessageNotify( "W", "DampSponge_Init", "DampDepthV is too thin. DelZ is %f", d=(/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 !----------------------------------------------------------------- ! 値の確認 !----------------------------------------------------------------- call MessageNotify( "M", "DampSponge_Init", "EFTime = %f", d=(/EFTime/) ) call MessageNotify( "M", "DampSponge_Init", "DampDepthH = %f", d=(/DampDepthH/) ) call MessageNotify( "M", "DampSponge_Init", "DampDepthV = %f", d=(/DampDepthV/) ) end subroutine DampSponge_Init
Subroutine : | |
pz_VarA(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(inout) |
pz_VarB(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
DelTime : | real(8), intent(in) |
fs 格子点に対するスポンジ層
subroutine DampSponge_pz(pz_VarA, pz_VarB, DelTime) ! ! fs 格子点に対するスポンジ層 ! !暗黙の型宣言禁止 implicit none !変数定義 real(8), intent(inout):: pz_VarA(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: pz_VarB(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: DelTime real(8) :: pz_Var(DimXMin:DimXMax, DimZMin:DimZMax) !スポンジ層によるダンピングを計算 pz_Var = pz_VarA - ( pz_DampRateH + pz_DampRateV ) * pz_VarB * DelTime pz_VarA = pz_Var end subroutine DampSponge_pz
Subroutine : | |
xr_VarA(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(inout) |
xr_VarB(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
DelTime : | real(8), intent(in) |
sf 格子点に対するスポンジ層
subroutine DampSponge_xr(xr_VarA, xr_VarB, DelTime) ! ! sf 格子点に対するスポンジ層 ! !暗黙の型宣言禁止 implicit none !変数定義 real(8), intent(inout):: xr_VarA(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xr_VarB(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: DelTime real(8) :: xr_Var(DimXMin:DimXMax, DimZMin:DimZMax) !スポンジ層によるダンピングを計算 xr_Var = xr_VarA - ( xr_DampRateH + xr_DampRateV )* xr_VarB * DelTime xr_VarA = xr_Var end subroutine DampSponge_xr
Subroutine : | |
xz_VarA(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(inout) |
xz_VarB(DimXMin:DimXMax, DimZMin:DimZMax) : | real(8), intent(in) |
DelTime : | real(8), intent(in) |
ss 格子点に対するスポンジ層
subroutine DampSponge_xz(xz_VarA, xz_VarB, DelTime) ! ! ss 格子点に対するスポンジ層 ! !暗黙の型宣言禁止 implicit none !変数定義 real(8), intent(inout):: xz_VarA(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: xz_VarB(DimXMin:DimXMax, DimZMin:DimZMax) real(8), intent(in) :: DelTime real(8) :: xz_Var(DimXMin:DimXMax, DimZMin:DimZMax) !スポンジ層によるダンピングを計算 xz_Var = xz_VarA - ( xz_DampRateH + xz_DampRateV ) * xz_VarB * DelTime xz_VarA = xz_Var end subroutine DampSponge_xz
Subroutine : | |
cfgfile : | character(*), intent(in) |
音波減衰項とスポンジ層の減衰係数の初期化
This procedure input/output NAMELIST#damping .
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 Damping_Init