Subroutine : |
|
nx : | integer, intent(in)
|
ny : | integer, intent(in)
|
nz : | integer, intent(in)
|
Q : | real, intent(in), dimension(nx,ny,nz)
|
hnum : | integer, intent(inout), dimension(nx,ny)
|
thres : | real, intent(in), optional
|
undeff : | real, intent(in), optional
|
計算領域内の雲頂温度を計算するルーチン. 厳密には温度を計算するのではなく,
雲頂に相当する鉛直格子番号を 水平面に渡って計算するルーチン
(さもないと引数に 3 次元温度の情報が 必要になるので, スタックの無駄遣い).
計算時には, 鉛直上端から下に下ろし, 閾値を越えたところを雲頂と判断する.
閾値はオプションで変更可能. デフォルトでは 5.e-5 [kg/kg] で設定.
雲として勘定するのは任意であり, サブルーチンを呼ぶ前に足し合わせておく.
[重要] 雲がまったくなかった場合, nz の配列を 1 つ足したものが返されるので,
親ルーチンで, それを undef と認識させる処理をしておく必要あり.
subroutine CTTemp( nx, ny, nz, Q, hnum, thres, undeff )
! 計算領域内の雲頂温度を計算するルーチン.
! 厳密には温度を計算するのではなく, 雲頂に相当する鉛直格子番号を
! 水平面に渡って計算するルーチン (さもないと引数に 3 次元温度の情報が
! 必要になるので, スタックの無駄遣い).
! 計算時には, 鉛直上端から下に下ろし, 閾値を越えたところを雲頂と判断する.
! 閾値はオプションで変更可能. デフォルトでは 5.e-5 [kg/kg] で設定.
! 雲として勘定するのは任意であり, サブルーチンを呼ぶ前に足し合わせておく.
! [重要]
! 雲がまったくなかった場合, nz の配列を 1 つ足したものが返されるので,
! 親ルーチンで, それを undef と認識させる処理をしておく必要あり.
implicit none
integer, intent(in) :: nx ! x 方向の配列数
integer, intent(in) :: ny ! y 方向の配列数
integer, intent(in) :: nz ! z 方向の配列数
real, intent(in), dimension(nx,ny,nz) :: Q ! 凝結物の混合比 [kg/kg]
integer, intent(inout), dimension(nx,ny) :: hnum ! 雲頂に相当する鉛直格子点番号
real, intent(in), optional :: thres ! 雲内と判断するための閾値 [kg/kg]
real, intent(in), optional :: undeff ! 未定義
real :: defun
integer :: i, j, k
real :: threshold
if(present(thres))then
threshold=thres
else
threshold=5.e-6
end if
if(present(undeff))then
defun=undeff
else
defun=999.0
end if
do i=1,nx
do j=1,ny
do k=nz,1,-1
if(Q(i,j,k)>threshold.and.Q(i,j,k)/=undeff)then
hnum(i,j)=k
exit
else
if(k==1)then
hnum(i,j)=nz+1
end if
end if
end do
end do
end do
end subroutine