| Class | Damping |
| In: |
utils/damping.f90
|
減衰率とその計算を行うためのパッケージ型モジュール
* 音波減衰項の係数 * スポンジ層の設定(境界付近で波の反射を抑え吸収するための層)
| Subroutine : | |
| pyz_VarA(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(inout) |
| pyz_VarB(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(in) |
| DelTime : | real(8), intent(in) |
fs 格子点に対するスポンジ層
subroutine DampSponge_pyz(pyz_VarA, pyz_VarB, DelTime)
!
! fs 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(8), intent(inout):: pyz_VarA(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: pyz_VarB(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: DelTime
real(8) :: pyz_Var(imin:imax, jmin:jmax, kmin:kmax)
!スポンジ層によるダンピングを計算
pyz_Var = pyz_VarA - ( pyz_DampRateH + pyz_DampRateV ) * pyz_VarB * DelTime
pyz_VarA = pyz_Var
end subroutine DampSponge_pyz
| Subroutine : | |
| xqz_VarA(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(inout) |
| xqz_VarB(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(in) |
| DelTime : | real(8), intent(in) |
fs 格子点に対するスポンジ層
subroutine DampSponge_xqz(xqz_VarA, xqz_VarB, DelTime)
!
! fs 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(8), intent(inout):: xqz_VarA(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: xqz_VarB(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: DelTime
real(8) :: xqz_Var(imin:imax, jmin:jmax, kmin:kmax)
!スポンジ層によるダンピングを計算
xqz_Var = xqz_VarA - ( xqz_DampRateH + xqz_DampRateV ) * xqz_VarB * DelTime
xqz_VarA = xqz_Var
end subroutine DampSponge_xqz
| Subroutine : | |
| xyr_VarA(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(inout) |
| xyr_VarB(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(in) |
| DelTime : | real(8), intent(in) |
sf 格子点に対するスポンジ層
subroutine DampSponge_xyr(xyr_VarA, xyr_VarB, DelTime)
!
! sf 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(8), intent(inout):: xyr_VarA(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: xyr_VarB(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: DelTime
real(8) :: xyr_Var(imin:imax, jmin:jmax, kmin:kmax)
!スポンジ層によるダンピングを計算
xyr_Var = xyr_VarA - ( xyr_DampRateH + xyr_DampRateV )* xyr_VarB * DelTime
xyr_VarA = xyr_Var
end subroutine DampSponge_xyr
| Subroutine : | |
| xyz_VarA(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(inout) |
| xyz_VarB(imin:imax, jmin:jmax, kmin:kmax) : | real(8), intent(in) |
| DelTime : | real(8), intent(in) |
ss 格子点に対するスポンジ層
subroutine DampSponge_xyz(xyz_VarA, xyz_VarB, DelTime)
!
! ss 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(8), intent(inout):: xyz_VarA(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: xyz_VarB(imin:imax, jmin:jmax, kmin:kmax)
real(8), intent(in) :: DelTime
real(8) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax)
!スポンジ層によるダンピングを計算
xyz_Var = xyz_VarA - ( xyz_DampRateH + xyz_DampRateV ) * xyz_VarB * DelTime
xyz_VarA = xyz_Var
end subroutine DampSponge_xyz
| Subroutine : | |
| cfgfile : | character(*), intent(in) |
音波減衰項とスポンジ層の減衰係数の初期化
This procedure input/output NAMELIST#damping_nml .
subroutine Damping_Init( cfgfile )
!
! 音波減衰項とスポンジ層の減衰係数の初期化
!
!暗黙の型宣言禁止
implicit none
!変数定義
character(*), intent(in) :: cfgfile
real(DP) :: Time !
real(DP) :: DepthH !スポンジ層の厚さ(水平方向)
real(DP) :: DepthV !スポンジ層の厚さ(鉛直方向)
real(DP), parameter :: Pi =3.1415926535897932385d0 !円周率
integer :: unit ! 装置番号
integer :: i, j, k
!NAMELIST から取得
NAMELIST /damping_nml/ Time, DepthH, DepthV
call FileOpen(unit, file=cfgfile, mode='r')
read(unit, NML=damping_nml)
close(unit)
!初期化
allocate( xyz_DampRateH(imin:imax,jmin:jmax,kmin:kmax), xyz_DampRateV(imin:imax,jmin:jmax,kmin:kmax), pyz_DampRateH(imin:imax,jmin:jmax,kmin:kmax), pyz_DampRateV(imin:imax,jmin:jmax,kmin:kmax), xqz_DampRateH(imin:imax,jmin:jmax,kmin:kmax), xqz_DampRateV(imin:imax,jmin:jmax,kmin:kmax), xyr_DampRateH(imin:imax,jmin:jmax,kmin:kmax), xyr_DampRateV(imin:imax,jmin:jmax,kmin:kmax) )
xyz_DampRateH = 0.0d0
xyz_DampRateV = 0.0d0
pyz_DampRateH = 0.0d0
pyz_DampRateV = 0.0d0
xqz_DampRateH = 0.0d0
xqz_DampRateV = 0.0d0
xyr_DampRateH = 0.0d0
xyr_DampRateV = 0.0d0
!値の入力
EFTime = Time
DampDepthH = DepthH
DampDepthV = DepthV
!-----------------------------------------------------------------
! スポンジ層の減衰率
!-----------------------------------------------------------------
!水平方向の東側・西側境界
if ( DampDepthH < x_dx(1) ) then
call MessageNotify( "W", "DampSponge_Init", "DampDepthH is too thin. DelX is %f", d=(/x_dx(1)/))
else if ( DampDepthH < x_dx(nx) ) then
call MessageNotify( "W", "DampSponge_Init", "DampDepthH is too thin. DelX is %f", d=(/x_dx(nx)/))
else
do i = imin, imax
!スカラー格子点の西側境界
if ( x_X(i) < DampDepthH) then
xyz_DampRateH(i,:,:) = ((1.0d0 - x_X(i) / DampDepthH) ** 3.0d0) / EFTime
end if
!フラックス格子点の西側境界
if ( p_X(i) < DampDepthH) then
pyz_DampRateH(i,:,:) = ((1.0d0 - p_X(i) / DampDepthH) ** 3.0d0) / EFTime
end if
!スカラー格子点の東側境界
if ( x_X(i) > ( XMax - DampDepthH ) ) then
xyz_DampRateH(i,:,:) = ((1.0d0 - (XMax - x_X(i)) / DampDepthH) ** 3.0d0) / EFTime
end if
!フラックス格子点の東側境界
if ( p_X(i) > ( XMax - DampDepthH ) ) then
pyz_DampRateH(i,:,:) = ((1.0d0 - (XMax - p_X(i)) / DampDepthH) ** 3.0d0) / EFTime
end if
end do
end if
!sf と ss は X 方向に関しては同じ
xyr_DampRateH = xyz_DampRateH
!水平方向の南側・北側境界
if ( DampDepthH < y_dy(1) ) then
call MessageNotify( "W", "DampSponge_Init", "DampDepthH is too thin. DelY is %f", d=(/x_dx(1)/))
else if ( DampDepthH < y_dy(ny) ) then
call MessageNotify( "W", "DampSponge_Init", "DampDepthH is too thin. DelY is %f", d=(/y_dy(ny)/))
else
do j = jmin, jmax
!スカラー格子点の西側境界
if ( y_Y(j) < DampDepthH) then
xyz_DampRateH(:,j,:) = ((1.0d0 - y_Y(j) / DampDepthH) ** 3.0d0) / EFTime
end if
!フラックス格子点の西側境界
if ( q_Y(j) < DampDepthH) then
pyz_DampRateH(:,j,:) = ((1.0d0 - q_Y(j) / DampDepthH) ** 3.0d0) / EFTime
end if
!スカラー格子点の東側境界
if ( y_Y(j) > ( YMax - DampDepthH ) ) then
xyz_DampRateH(:,j,:) = ((1.0d0 - (YMax - y_Y(j)) / DampDepthH) ** 3.0d0) / EFTime
end if
!フラックス格子点の東側境界
if ( q_Y(j) > ( YMax - DampDepthH ) ) then
pyz_DampRateH(:,j,:) = ((1.0d0 - (YMax - q_Y(j)) / DampDepthH) ** 3.0d0) / EFTime
end if
end do
end if
!sf と ss は X 方向に関しては同じ
xqz_DampRateH = xyz_DampRateH
!鉛直方向の上部境界
if ( DampDepthV < z_dz(nz) ) then
call MessageNotify( "W", "DampSponge_Init", "DampDepthV is too thin. DelZ is %f", d=(/z_dz(nz)/) )
else
do k = kmin, kmax
!スカラー格子点
if ( z_Z(k) >= ( ZMax - DampDepthV ) ) then
xyz_DampRateV(:,:,k) = (1.0d0 - dcos(Pi * (z_Z(k) - ZMax + DampDepthV) / DampDepthV)) / EFTime
end if
!フラックス格子点
if ( r_Z(k) >= ( ZMax - DampDepthV ) ) then
xyr_DampRateV(:,:,k) = (1.0d0 - dcos(Pi * (r_Z(k) - ZMax + DampDepthV)/ DampDepthV)) / EFTime
end if
end do
end if
!fs と ss は Z 方向に関しては同じ
pyz_DampRateV = xyz_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 Damping_Init
| Function : | |
| pyz_DampSponge(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| pyz_VarA(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| pyz_VarB(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| DelTime : | real(DP), intent(in) |
pyz 格子点に対するスポンジ層
function pyz_DampSponge(pyz_VarA, pyz_VarB, DelTime)
!
! pyz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: pyz_VarA(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: pyz_VarB(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: DelTime
real(DP) :: pyz_DampSponge(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
pyz_DampSponge = pyz_VarA - ( pyz_DampRateH + pyz_DampRateV ) * pyz_VarB * DelTime
end function pyz_DampSponge
| Function : | |
| pyz_DampSponge_pyz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
pyz 格子点に対するスポンジ層
function pyz_DampSponge_pyz(pyz_Var)
!
! pyz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: pyz_DampSponge_pyz(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
pyz_DampSponge_pyz = ( pyz_DampRateH + pyz_DampRateV ) * pyz_Var
end function pyz_DampSponge_pyz
| Function : | |
| xqz_DampSponge(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xqz_VarA(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| xqz_VarB(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| DelTime : | real(DP), intent(in) |
xqz 格子点に対するスポンジ層
function xqz_DampSponge(xqz_VarA, xqz_VarB, DelTime)
!
! xqz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xqz_VarA(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: xqz_VarB(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: DelTime
real(DP) :: xqz_DampSponge(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xqz_DampSponge = xqz_VarA - ( xqz_DampRateH + xqz_DampRateV ) * xqz_VarB * DelTime
end function xqz_DampSponge
| Function : | |
| xqz_DampSponge_xqz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
xqz 格子点に対するスポンジ層
function xqz_DampSponge_xqz(xqz_Var)
!
! xqz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xqz_DampSponge_xqz(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xqz_DampSponge_xqz = ( xqz_DampRateH + xqz_DampRateV ) * xqz_Var
end function xqz_DampSponge_xqz
| Function : | |
| xyr_DampSponge(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xyr_VarA(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| xyr_VarB(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| DelTime : | real(DP), intent(in) |
xyr 格子点に対するスポンジ層
function xyr_DampSponge(xyr_VarA, xyr_VarB, DelTime)
!
! xyr 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xyr_VarA(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: xyr_VarB(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: DelTime
real(DP) :: xyr_DampSponge(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xyr_DampSponge = xyr_VarA - ( xyr_DampRateH + xyr_DampRateV )* xyr_VarB * DelTime
end function xyr_DampSponge
| Function : | |
| xyr_DampSponge_xyr(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
xyr 格子点に対するスポンジ層
function xyr_DampSponge_xyr(xyr_Var)
!
! xyr 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyr_DampSponge_xyr(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xyr_DampSponge_xyr = ( xyr_DampRateH + xyr_DampRateV )* xyr_Var
end function xyr_DampSponge_xyr
| Function : | |
| xyz_DampSponge(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xyz_VarA(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| xyz_VarB(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
| DelTime : | real(DP), intent(in) |
xyz 格子点に対するスポンジ層
function xyz_DampSponge(xyz_VarA, xyz_VarB, DelTime)
!
! xyz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xyz_VarA(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: xyz_VarB(imin:imax,jmin:jmax,kmin:kmax)
real(DP), intent(in) :: DelTime
real(DP) :: xyz_DampSponge(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xyz_DampSponge = xyz_VarA - ( xyz_DampRateH + xyz_DampRateV ) * xyz_VarB * DelTime
end function xyz_DampSponge
| Function : | |
| xyz_DampSponge_xyz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) |
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) |
xyz 格子点に対するスポンジ層
function xyz_DampSponge_xyz(xyz_Var)
!
! xyz 格子点に対するスポンジ層
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DP) :: xyz_DampSponge_xyz(imin:imax,jmin:jmax,kmin:kmax)
!スポンジ層によるダンピングを計算
xyz_DampSponge_xyz = ( xyz_DampRateH + xyz_DampRateV ) * xyz_Var
end function xyz_DampSponge_xyz