Subroutine : |
|
pyz_VelX(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in)
|
xqz_VelY(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in)
|
xyr_VelZ(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in)
|
xyz_Exner(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in)
|
xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in)
|
保存量の計算と出力を行う. 計算する量は 質量, 運動エネルギー,
弾性エネルギー, ポテンシャルエネルギー
subroutine EnergyMonit_exec( pyz_VelX, xqz_VelY, xyr_VelZ, xyz_Exner, xyz_PTemp )
!
!保存量の計算と出力を行う. 計算する量は
!質量, 運動エネルギー, 弾性エネルギー, ポテンシャルエネルギー
!
!暗黙の型宣言禁止
implicit none
!変数定義
real(DP),intent(in) :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax) !速度(x成分)
real(DP),intent(in) :: xqz_VelY(imin:imax,jmin:jmax,kmin:kmax) !速度(y成分)
real(DP),intent(in) :: xyr_VelZ(imin:imax,jmin:jmax,kmin:kmax) !速度(z成分)
real(DP),intent(in) :: xyz_Exner(imin:imax,jmin:jmax,kmin:kmax) !圧力関数
real(DP),intent(in) :: xyz_PTemp(imin:imax,jmin:jmax,kmin:kmax) !温位
real(DP) :: xyz_DensDev(imin:imax,jmin:jmax,kmin:kmax)
!密度(偏差)
real(DP) :: xyz_KinEnrgyDens(imin:imax,jmin:jmax,kmin:kmax)
!運動エネルギー密度
real(DP) :: xyz_ElstEnrgyDens(imin:imax,jmin:jmax,kmin:kmax)
!弾性エネルギー密度
real(DP) :: xyz_PotEnrgyDens(imin:imax,jmin:jmax,kmin:kmax)
!ポテンシャルエネルギー密度
real(DP) :: MassTotalBZ !全質量(基本場)
real(DP) :: MassTotalDev !全質量(偏差)
real(DP) :: KinEnrgyTotal !全運動エネルギー
real(DP) :: ElstEnrgyTotal !全弾性エネルギー
real(DP) :: PotEnrgyTotal !全ポテンシャルエネルギー
! 追加すべき量(要検討)
! * 全運動量
! * エンタルピー
! * トレーサーの総量
! * 潜熱
! 各格子点の大気質量密度偏差
!
xyz_DensDev = PressSfc * ( (xyz_ExnerBZ + xyz_Exner)**( CvDry/GasRDry ) - (xyz_ExnerBZ )**( CvDry/GasRDry ) )/xyz_PTempBZ
! 領域全体の大気質量
!
MassTotalBZ = (xyz_PressBz(1,1,1) - xyz_PressBz(1,1,nz))/Grav *(xmax - xmin)*(ymax - ymin)
MassTotalDev = sum(xyz_dx(1:nx,1:ny,1:nz)* xyz_dy(1:nx,1:ny,1:nz)* xyz_dz(1:nx,1:ny,1:nz)* xyz_DensDev(1:nx,1:ny,1:nz))
! 各格子点の運動エネルギー密度
! * 密度は基本場の値で評価
!
xyz_KinEnrgyDens = 0.5d0 * xyz_DensBZ * ( xyz_avr_pyz(pyz_VelX)**2 + xyz_avr_xqz(xqz_VelY)**2 + xyz_avr_xyr(xyr_VelZ)**2 )
!各格子点の弾性エネルギー密度
! * 密度は基本場の値で評価
!
xyz_ElstEnrgyDens = 0.5d0 * xyz_DensBZ * (CpDry * xyz_PTempBZ * xyz_Exner / xyz_VelSoundBZ)**2
! 領域全体の運動/弾性エネルギー
!
KinEnrgyTotal = sum(xyz_dx(1:nx,1:ny,1:nz)* xyz_dy(1:nx,1:ny,1:nz)* xyz_dz(1:nx,1:ny,1:nz)* xyz_KinEnrgyDens(1:nx,1:ny,1:nz))
ElstEnrgyTotal = sum(xyz_dx(1:nx,1:ny,1:nz)* xyz_dy(1:nx,1:ny,1:nz)* xyz_dz(1:nx,1:ny,1:nz)* xyz_ElstEnrgyDens(1:nx,1:ny,1:nz))
!各格子点のポテンシャルエネルギー密度
!
xyz_PotEnrgyDens = - Grav * xyz_DensBZ * xyz_PTemp * xyz_Z / xyz_PTempBZ
! 領域全体のポテンシャルエネルギー
!
PotEnrgyTotal = sum(xyz_dx(1:nx,1:ny,1:nz)* xyz_dy(1:nx,1:ny,1:nz)* xyz_dz(1:nx,1:ny,1:nz)* xyz_PotEnrgyDens(1:nx,1:ny,1:nz))
!ファイルへの出力
!
call HistoryAutoPut(TimeN, 'DensDev', MassTotalDev )
call HistoryAutoPut(TimeN, 'KinEnrgy', KinEnrgyTotal )
call HistoryAutoPut(TimeN, 'ElstEnrgy', ElstEnrgyTotal)
call HistoryAutoPut(TimeN, 'PotEnrgy', PotEnrgyTotal )
end subroutine EnergyMonit_exec