Class | initialdata_disturb |
In: |
env/initialdata_disturb.f90
|
擾乱のデフォルト値を与えるためのルーチン.
Constant : | |
ID_FlaginitdataQMix_dryregion = 5 : | integer, parameter, public |
Subroutine : | |
xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_dryregion(xyzf_QMix) implicit none real(DP), intent(out) :: xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) integer :: i, j, k, s ! XposMin:XposMax,ZposMin:ZposMax で囲まれた領域の初期の湿度をゼロにするために ! 基本場と逆符号の水蒸気擾乱を与える do s = 1, ncmax do k = kmin,kmax do j = jmin, jmax do i = imin,imax if (z_Z(k) >= ZposMin .AND. z_Z(k) < ZposMax .AND. y_Y(j) >= YposMin .AND. y_Y(j) < YposMax .AND. x_X(i) >= XposMin .AND. x_X(i) < XposMax) then xyzf_QMix(i,j,k,s) = - xyzf_QMixBZ(i,j,k,s) end if end do end do end do end do end subroutine initialdata_disturb_dryregion
Subroutine : | |
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_gaussXY(xyz_Var) implicit none real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax) integer :: i, j, k do k = kmin, kmax do j = jmin, jmax do i = imin, imax xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (y_Y(j) - Yc) / Yr )**2.0d0 * 5.0d-1 ) end do end do end do ! where ( xyz_Var < DelMax * 1.0d-2) ! xyz_Var = 0.0d0 ! end where end subroutine initialdata_disturb_gaussXY
Subroutine : | |
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_gaussXYZ(xyz_Var) implicit none real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax) integer :: i, j, k do k = kmin, kmax do j = jmin, jmax do i = imin, imax xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (y_Y(j) - Yc) / Yr )**2.0d0 * 5.0d-1 - ( (z_Z(k) - Zc) / Zr )**2.0d0 * 5.0d-1 ) end do end do end do ! where ( xyz_Var < DelMax * 1.0d-2) ! xyz_Var = 0.0d0 ! end where end subroutine initialdata_disturb_gaussXYZ
Subroutine : | |
xyz_Var(imin:imax, jmin:jmax, kmin:kmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_gaussXZ(xyz_Var) implicit none real(DP), intent(out) :: xyz_Var(imin:imax, jmin:jmax, kmin:kmax) integer :: i, j, k do k = kmin, kmax do j = jmin, jmax do i = imin, imax xyz_Var(i,j,k) = DelMax * dexp( - ( (x_X(i) - Xc) / Xr )**2.0d0 * 5.0d-1 - ( (z_Z(k) - Zc) / Zr )**2.0d0 * 5.0d-1 ) end do end do end do ! where ( xyz_Var < DelMax * 1.0d-2) ! xyz_Var = 0.0d0 ! end where end subroutine initialdata_disturb_gaussXZ
Subroutine : | |
xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_moist(xyzf_QMix) implicit none real(DP), intent(out) :: xyzf_QMix(imin:imax, jmin:jmax, kmin:kmax, 1:ncmax) real(DP) :: za_MolFr(kmin:kmax, 1:ncmax) integer :: i, j, k, s ! 湿度ゼロなら何もしない if ( Humidity == 0.0d0 ) return ! 水平一様なので, i=0 だけ計算. i = 1 j = 1 call eccm_molfr( SpcWetMolFr(1:ncmax), Humidity, xyz_TempBZ(i,j,:), xyz_PressBZ(i,j,:), za_MolFr ) !気相のモル比を混合比に変換 do s = 1, ncmax do k = 1, nz do j = 1, ny do i = 1, nx xyzf_QMix(i,j,k,s) = za_MolFr(k,s) * MolWtWet(s) / MolWtDry - xyzf_QMixBZ(i,j,k,s) end do end do end do end do end subroutine initialdata_disturb_moist
Subroutine : | |
cfgfile : | character(STRING), intent(in) |
nml の読み込み
This procedure input/output NAMELIST#initialdata_disturb .
subroutine initialdata_disturb_nml(cfgfile) ! nml の読み込み ! use dc_iounit, only : FileOpen implicit none character(STRING), intent(in) :: cfgfile integer :: unit !装置番号 character(STRING) :: FlaginitdataPTemp = "" character(STRING) :: FlaginitdataExner = "" character(STRING) :: FlaginitdataQMix = "" NAMELIST /initialdata_disturb/ FlaginitdataPTemp, FlaginitdataExner, FlaginitdataQMix, DelMax, XrRate, XcRate, YrRate, YcRate, ZrRate, ZcRate, Zpos, XposMin, YposMin, ZposMin, XposMax, YposMax, ZposMax, Humidity call FileOpen(unit, file=cfgfile, mode='r') read(unit, NML=initialdata_disturb) close(unit) if (FlaginitdataPTemp == "GaussXY") then ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXY elseif (FlaginitdataPTemp == "GaussXZ") then ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXZ elseif (FlaginitdataPTemp == "GaussXYZ") then ID_FlaginitdataPTemp = ID_Flaginitdata_GaussXYZ elseif (FlaginitdataPTemp == "random") then ID_FlaginitdataPTemp = ID_Flaginitdata_random end if if (FlaginitdataExner == "GaussXY") then ID_FlaginitdataExner = ID_Flaginitdata_GaussXY elseif (FlaginitdataExner == "GaussXZ") then ID_FlaginitdataExner = ID_Flaginitdata_GaussXZ elseif (FlaginitdataExner == "GaussXYZ") then ID_FlaginitdataExner = ID_Flaginitdata_GaussXYZ elseif (FlaginitdataExner == "random") then ID_FlaginitdataExner = ID_Flaginitdata_random end if if (FlaginitdataQMix == "GaussXY") then ID_FlaginitdataQMix = ID_Flaginitdata_GaussXY elseif (FlaginitdataQMix == "GaussXZ") then ID_FlaginitdataQMix = ID_Flaginitdata_GaussXZ elseif (FlaginitdataQMix == "GaussXYZ") then ID_FlaginitdataQMix = ID_Flaginitdata_GaussXZ elseif (FlaginitdataQMix == "dryregion") then ID_FlaginitdataQMix = ID_FlaginitdataQMix_dryregion elseif (FlaginitdataQMix == "moist") then ID_FlaginitdataQMix = ID_FlaginitdataQMix_moist end if ! 位置の決定 ! XMax には MPI を含めた全領域が入っている Xc = (XMax - XMin) * XcRate Yc = (YMax - YMin) * YcRate Zc = (ZMax - ZMin) * ZcRate Xr = (XMax - XMin) * XrRate Yr = (YMax - YMin) * YrRate Zr = (ZMax - ZMin) * ZrRate ! Xr = minval( x_X, 1, x_X > (XMax - XMin) * XrRate ) ! Yr = minval( y_Y, 1, y_Y > (YMax - YMin) * YrRate ) ! Zr = minval( z_Z, 1, z_Z > (ZMax - ZMin) * ZrRate ) ! Xc = minval( x_X, 1, x_X > (XMax - XMin) * XcRate ) ! Yc = minval( y_Y, 1, y_Y > (YMax - YMin) * YcRate ) ! Zc = minval( z_Z, 1, z_Z > (ZMax - ZMin) * ZcRate ) ! call MessageNotify( "M", "initialdata_disturb", "Xr = %f", d=(/Xr/) ) ! call MessageNotify( "M", "initialdata_disturb", "Xc = %f", d=(/Xc/) ) ! call MessageNotify( "M", "initialdata_disturb", "Yr = %f", d=(/Yr/) ) ! call MessageNotify( "M", "initialdata_disturb", "Yc = %f", d=(/Yc/) ) ! call MessageNotify( "M", "initialdata_disturb", "Zr = %f", d=(/Zr/) ) ! call MessageNotify( "M", "initialdata_disturb", "Zc = %f", d=(/Zc/) ) end subroutine initialdata_disturb_nml
Subroutine : | |
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(out) |
subroutine initialdata_disturb_random( xyz_Var ) implicit none real(DP), intent(out) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) real(DP) :: Random !ファイルから取得した乱数 real(DP) :: Random1(imin:imax, jmin:jmax) integer :: i, j, k, kpos ! 0.0--1.0 の擬似乱数発生 do j = jmin, jmax do i = imin, imax call random_number(random) Random1(i,j) = random end do end do ! 指定された高度の配列添字を用意 do k = kmin, kmax if ( z_Z(k) >= Zpos ) then kpos = k exit end if end do ! 擾乱が全体としてはゼロとなるように調整. 平均からの差にする. do j = 1, ny do i = 1, nx xyz_Var(i, j, kpos) = DelMax * (Random1(i,j) - sum( Random1(1:nx,1:ny) ) / real((nx * ny),8)) end do end do end subroutine initialdata_disturb_random