Class | rad_Mars_15m |
In: |
radiation/rad_Mars_15m.f90
|
Subroutine : | |
time : | real(DP) , intent(in ) |
dt : | real(DP) , intent(in ) |
gt(0:imax-1, 1:jmax, 1:kmax) : | real(DP) , intent(in ) |
gph(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(in ) |
gp(0:imax-1, 1:jmax, 1:kmax) : | real(DP) , intent(in ) |
gts(0:imax-1, 1:jmax) : | real(DP) , intent(in ) |
grho(0:imax-1, 1:jmax, 1:kmax) : | real(DP) , intent(in ) |
dod067(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(in ) |
qerat : | real(DP) , intent(in ) |
ssa : | real(DP) , intent(in ) |
emis(0:imax-1, 1:jmax) : | real(DP) , intent(in ) |
gr15mnetflh(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(out) |
gdr15mnetfldtsh(0:imax-1, 1:jmax, 0:kmax, 0:1) : | real(DP) , intent(out) |
subroutine rad15m_main( time, dt, gt, gph, gp, gts, grho, dod067, qerat, ssa, emis, gr15mnetflh, gdr15mnetfldtsh ) real(DP) , intent(in ) :: time real(DP) , intent(in ) :: dt real(DP) , intent(in ) :: gt (0:imax-1, 1:jmax, 1:kmax) real(DP) , intent(in ) :: gph (0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(in ) :: gp (0:imax-1, 1:jmax, 1:kmax) real(DP) , intent(in ) :: gts (0:imax-1, 1:jmax) real(DP) , intent(out) :: gr15mnetflh (0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(out) :: gdr15mnetfldtsh(0:imax-1, 1:jmax, 0:kmax, 0:1) real(DP) , intent(in ) :: grho (0:imax-1, 1:jmax, 1:kmax) real(DP) , intent(in ) :: dod067 (0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(in ) :: qerat real(DP) , intent(in ) :: ssa real(DP) , intent(in ) :: emis (0:imax-1, 1:jmax) ! ! local variables ! real(DP) :: gor (0:imax-1, 1:jmax), goru (0:imax-1, 1:jmax), gord (0:imax-1, 1:jmax), gsr (0:imax-1, 1:jmax), gsru (0:imax-1, 1:jmax), gsrd (0:imax-1, 1:jmax) ! 実行文 ; Executable statement ! ! 初期化 ! Initialization ! if ( .not. rad_Mars_15m_inited ) call rad15m_init call rad15m_lowatm_newscheme2006( time, dt, gt, gph, gp, gts, dod067, qerat, ssa, emis, gr15mnetflh, gdr15mnetfldtsh, gor, goru, gord, gsr, gsru, gsrd ) end subroutine rad15m_main
Variable : | |||
rad_Mars_15m_inited = .false. : | logical, save, public
|
Subroutine : | |
gp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out) |
subroutine calc_lnp( gp, glnp ) real(DP), intent(in ) :: gp (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(out) :: glnp(0:imax-1, 1:jmax, 1:kmax) ! ! local variables ! integer :: i, j, k do k = 1, kmax do j = 1, jmax do i = 0, imax-1 glnp(i,j,k) = log( gp(i,j,k) + 1.0d-20 ) end do end do end do end subroutine calc_lnp
Subroutine : | |
gph(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
glnph(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out) |
subroutine calc_lnph( gph, glnph ) real(DP), intent(in ) :: gph (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(out) :: glnph(0:imax-1, 1:jmax, 0:kmax) ! ! local variables ! integer :: i, j, k do k = 0, kmax do j = 1, jmax do i = 0, imax-1 glnph(i,j,k) = log( gph(i,j,k) + 1.0d-20 ) end do end do end do end subroutine calc_lnph
Subroutine : | |||
dlambda : | real(DP), intent(in ) | ||
emis(0:imax-1, 1:jmax) : | real(DP), intent(in ) | ||
trans_i2i_toa(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in )
| ||
trans_i2i_boa(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in )
| ||
trans_i2i_s(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in )
| ||
trans_i2m_lli(0:imax-1, 1:jmax, 0:kmax, 1:kmax) : | real(DP), intent(in )
| ||
trans_i2m_uli(0:imax-1, 1:jmax, 0:kmax, 1:kmax) : | real(DP), intent(in )
| ||
pfh(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) | ||
pfs(0:imax-1, 1:jmax) : | real(DP), intent(in ) | ||
netflh(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out) |
subroutine calc_rteq_use_meantrans_arr3d( dlambda, emis, trans_i2i_toa, trans_i2i_boa, trans_i2i_s, trans_i2m_lli, trans_i2m_uli, pfh, pfs, netflh ) ! 物理・数学定数設定 ! Physical and mathematical constants settings ! use constants0, only: PI ! $ \pi $ . ! 円周率. Circular constant real(DP), intent(in ) :: dlambda real(DP), intent(in ) :: emis(0:imax-1, 1:jmax) real(DP), intent(in ) :: trans_i2i_toa(0:imax-1, 1:jmax, 0:kmax) ! f_{1/2} T_{k+1/2,1/2} real(DP), intent(in ) :: trans_i2i_boa(0:imax-1, 1:jmax, 0:kmax) ! f_{km+1/2} T_{k+1/2,km+1/2} real(DP), intent(in ) :: trans_i2i_s (0:imax-1, 1:jmax, 0:kmax) ! f_{s} T_{k+1/2,km+1/2} real(DP), intent(in ) :: trans_i2m_lli(0:imax-1, 1:jmax, 0:kmax, 1:kmax) ! upper layer interface real(DP), intent(in ) :: trans_i2m_uli(0:imax-1, 1:jmax, 0:kmax, 1:kmax) ! lower layer interface real(DP), intent(in ) :: pfh (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(in ) :: pfs (0:imax-1, 1:jmax) real(DP), intent(out) :: netflh(0:imax-1, 1:jmax, 0:kmax) ! ! local variables ! integer :: i, j, k, k2 do k = 0, kmax do j = 1, jmax do i = 0, imax-1 netflh(i,j,k) = 0.0d0 end do end do end do do k = 0, kmax do j = 1, jmax do i = 0, imax-1 netflh(i,j,k) = netflh(i,j,k) + PI * emis(i,j) * pfs(i,j) * dlambda * trans_i2i_s (i,j,k) - PI * pfh(i,j,0 ) * dlambda * trans_i2i_boa(i,j,k) + PI * pfh(i,j,kmax) * dlambda * trans_i2i_toa(i,j,k) end do end do do k2 = 1, kmax do j = 1, jmax do i = 0, imax-1 netflh(i,j,k) = netflh(i,j,k) - PI * pfh(i,j,k2 ) * dlambda * trans_i2m_uli(i,j,k,k2) + PI * pfh(i,j,k2-1) * dlambda * trans_i2m_lli(i,j,k,k2) end do end do end do end do end subroutine calc_rteq_use_meantrans_arr3d
Subroutine : | |
nras : | integer , intent(in ) |
nrps : | integer , intent(in ) |
gph(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) |
vmr(0:imax-1, 1:jmax, 1:kmax, 1:nras+nrps) : | real(DP), intent(in ) |
mmmass(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
ac(0:imax-1, 1:jmax, 1:kmax, 1:nras) : | real(DP), intent(in ) |
gdod(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) |
trans(0:imax-1, 1:jmax, 0:kmax, 0:kmax) : | real(DP), intent(out) |
subroutine calc_trans_mp_arr3d( nras, nrps, gph, vmr, mmmass, ac, gdod, trans ) use constants , only : Grav integer , intent(in ) :: nras integer , intent(in ) :: nrps real(DP), intent(in ) :: gph (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(in ) :: vmr (0:imax-1, 1:jmax, 1:kmax, 1:nras+nrps) real(DP), intent(in ) :: mmmass(0:imax-1, 1:jmax, 1:kmax) real(DP), intent(in ) :: ac (0:imax-1, 1:jmax, 1:kmax, 1:nras) real(DP), intent(in ) :: gdod (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(out) :: trans (0:imax-1, 1:jmax, 0:kmax, 0:kmax) ! ! local variables ! real(DP) :: dopdep(0:imax-1, 1:jmax, 1:kmax) real(DP) :: dtrans(0:imax-1, 1:jmax, 1:kmax) real(DP) :: trans1(0:imax-1, 1:jmax ) real(DP), parameter :: diffac = 1.66_DP integer :: i, j, k, k2, n integer :: ks, ke do k2 = 0, kmax do k = 0, kmax do j = 1, jmax do i = 0, imax-1 trans(i,j,k,k2) = 1.0d100 end do end do end do end do do k = 1, kmax do j = 1, jmax do i = 0, imax-1 dopdep(i,j,k) = 0.0_DP end do end do end do do n = 1, nras do k = 1, kmax do j = 1, jmax do i = 0, imax-1 dopdep(i,j,k) = dopdep(i,j,k) + ac(i,j,k,n) * vmr(i,j,k,n) / mmmass(i,j,k) * ( gph(i,j,k-1) - gph(i,j,k) ) / Grav end do end do end do end do ! ! add dust optical depth ! do k = 1, kmax do j = 1, jmax do i = 0, imax-1 dopdep(i,j,k) = dopdep(i,j,k) + gdod(i,j,k-1) - gdod(i,j,k) end do end do end do do k = 1, kmax do j = 1, jmax do i = 0, imax-1 dtrans(i,j,k) = exp( - dopdep(i,j,k) * diffac ) end do end do end do ! ! transmission for "zero thickness" layer ( = 1.0 ) ! do ks = 0, kmax ke = ks do j = 1, jmax do i = 0, imax-1 trans(i,j,ks,ke) = 1.0_DP end do end do end do do ks = 0, kmax do j = 1, jmax do i = 0, imax-1 trans1(i,j) = 1.0_DP end do end do do ke = ks+1, kmax do j = 1, jmax do i = 0, imax-1 trans1(i,j) = trans1(i,j) * dtrans(i,j,ke) end do end do do j = 1, jmax do i = 0, imax-1 trans(i,j,ks,ke) = trans1(i,j) end do end do end do end do do ks = 0, kmax do ke = 0, ks-1 do j = 1, jmax do i = 0, imax-1 trans(i,j,ks,ke) = trans(i,j,ke,ks) end do end do end do end do end subroutine calc_trans_mp_arr3d
Subroutine : | |
ks : | integer , intent(in ) |
ke : | integer , intent(in ) |
gt(0:imax-1, 1:jmax, ks:ke) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, ks:ke) : | real(DP), intent(in ) |
iband : | integer , intent(in ) |
jj(0:imax-1, 1:jmax, ks:ke) : | integer , intent(out) |
kk(0:imax-1, 1:jmax, ks:ke) : | integer , intent(out) |
subroutine findindices( ks, ke, gt, glnp, iband, jj, kk ) use ckd_module, only : ckdp integer , intent(in ) :: ks integer , intent(in ) :: ke real(DP), intent(in ) :: gt(0:imax-1, 1:jmax, ks:ke), glnp(0:imax-1, 1:jmax, ks:ke) integer , intent(in ) :: iband integer , intent(out) :: jj(0:imax-1, 1:jmax, ks:ke), kk (0:imax-1, 1:jmax, ks:ke) ! ! local variables ! integer :: i, j, k, l do k = ks, ke do j = 1, jmax do i = 0, imax-1 kk(i,j,k) = 1 end do end do end do do l = 1+1, ckdp( iband ) % nt - 1 do k = ks, ke do j = 1, jmax do i = 0, imax-1 if( ckdp( iband ) % t( l ) .le. gt(i,j,k) ) kk(i,j,k) = l end do end do end do end do do k = ks, ke do j = 1, jmax do i = 0, imax-1 jj(i,j,k) = 1 end do end do end do do l = 1+1, ckdp( iband ) % nlnp - 1 do k = ks, ke do j = 1, jmax do i = 0, imax-1 if( ckdp( iband ) % lnp( l ) .le. glnp(i,j,k) ) jj(i,j,k) = l end do end do end do end do end subroutine findindices
Subroutine : | |
gt(0:imax-1, 1:jmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax) : | real(DP), intent(in ) |
iband : | integer , intent(in ) |
jj(0:imax-1, 1:jmax) : | integer , intent(out) |
kk(0:imax-1, 1:jmax) : | integer , intent(out) |
subroutine findindices2D( gt, glnp, iband, jj, kk ) real(DP), intent(in ) :: gt(0:imax-1, 1:jmax), glnp(0:imax-1, 1:jmax) integer , intent(in ) :: iband integer , intent(out) :: jj(0:imax-1, 1:jmax), kk (0:imax-1, 1:jmax) ! ! local variables ! real(DP) :: gt3d(0:imax-1, 1:jmax, 1:1), glnp3d(0:imax-1, 1:jmax, 1:1) integer :: jj3d(0:imax-1, 1:jmax, 1:1), kk3d (0:imax-1, 1:jmax, 1:1) gt3d (:,:,1) = gt glnp3d(:,:,1) = glnp call findindices( 1, 1, gt3d, glnp3d, iband, jj3d, kk3d ) jj = jj3d(:,:,1) kk = kk3d(:,:,1) end subroutine findindices2D
Subroutine : | |
gt(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
iband : | integer , intent(in ) |
jj(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(out) |
kk(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(out) |
subroutine findindices3D( gt, glnp, iband, jj, kk ) real(DP), intent(in ) :: gt(0:imax-1, 1:jmax, 1:kmax), glnp(0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: iband integer , intent(out) :: jj(0:imax-1, 1:jmax, 1:kmax), kk (0:imax-1, 1:jmax, 1:kmax) ! ! local variables ! call findindices( 1, kmax, gt, glnp, iband, jj, kk ) end subroutine findindices3D
Subroutine : | |
gt(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
jj(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(in ) |
kk(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(in ) |
ig : | integer , intent(in ) |
iband : | integer , intent(in ) |
ac(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out) |
subroutine getlnac_givenindices( gt, glnp, jj, kk, ig, iband, ac ) use ckd_module, only : ckdp real(DP), intent(in ) :: gt (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(in ) :: glnp(0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: jj (0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: kk (0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: ig integer , intent(in ) :: iband real(DP), intent(out) :: ac (0:imax-1, 1:jmax, 1:kmax) ! ! local variables ! real(DP) :: lnac1, lnac2 integer :: i, j, k do k = 1, kmax do j = 1, jmax do i = 0, imax-1 lnac1 = ( ckdp(iband)%lnac( ig, jj(i,j,k) , kk(i,j,k)+1 ) - ckdp(iband)%lnac( ig, jj(i,j,k) , kk(i,j,k) ) ) / ( ckdp(iband)%t( kk(i,j,k)+1 ) - ckdp(iband)%t( kk(i,j,k) ) ) * ( gt(i,j,k) - ckdp( iband ) % t( kk(i,j,k) ) ) + ckdp(iband)%lnac( ig, jj(i,j,k) , kk(i,j,k) ) lnac2 = ( ckdp(iband)%lnac( ig, jj(i,j,k)+1, kk(i,j,k)+1 ) - ckdp(iband)%lnac( ig, jj(i,j,k)+1, kk(i,j,k) ) ) / ( ckdp(iband)%t( kk(i,j,k)+1 ) - ckdp(iband)%t( kk(i,j,k) ) ) * ( gt(i,j,k) - ckdp( iband ) % t( kk(i,j,k) ) ) + ckdp(iband)%lnac( ig, jj(i,j,k)+1, kk(i,j,k) ) ac(i,j,k) = ( lnac2 - lnac1 ) / ( ckdp( iband ) % lnp( jj(i,j,k)+1 ) - ckdp( iband ) % lnp( jj(i,j,k) ) ) * ( glnp(i,j,k) - ckdp( iband ) % lnp( jj(i,j,k) ) ) + lnac1 end do end do end do end subroutine getlnac_givenindices
Subroutine : | |
gt(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(in ) |
gts(0:imax-1, 1:jmax) : | real(DP), intent(in ) |
iband : | integer , intent(in ) |
pfarr(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out) |
pfsarr(0:imax-1, 1:jmax) : | real(DP), intent(out) |
subroutine getpf_arr3d_norat( gt, gts, iband, pfarr, pfsarr ) use planck_func, only : Integ_PF_GQ_Array3D, Integ_PF_GQ_Array2D use ckd_module, only : ckdp real(DP), intent(in ) :: gt (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(in ) :: gts (0:imax-1, 1:jmax) integer , intent(in ) :: iband real(DP), intent(out) :: pfarr (0:imax-1, 1:jmax, 0:kmax) real(DP), intent(out) :: pfsarr(0:imax-1, 1:jmax) ! ! local variables ! integer :: ncp_pfint integer :: i, j, k ncp_pfint = 5 call Integ_PF_GQ_Array3D( ckdp(iband)%wnbnds(1), ckdp(iband)%wnbnds(2), ncp_pfint, 0, imax-1, 1, jmax, 0, kmax, gt, pfarr ) call Integ_PF_GQ_Array2D( ckdp(iband)%wnbnds(1), ckdp(iband)%wnbnds(2), ncp_pfint, 0, imax-1, 1, jmax, gts, pfsarr ) do k = 0, kmax do j = 1, jmax do i = 0, imax-1 pfarr(i,j,k) = pfarr(i,j,k) / ( ckdp(iband)%wnbnds(2) - ckdp(iband)%wnbnds(1) ) end do end do end do do j = 1, jmax do i = 0, imax-1 pfsarr(i,j) = pfsarr(i,j) / ( ckdp(iband)%wnbnds(2) - ckdp(iband)%wnbnds(1) ) end do end do end subroutine getpf_arr3d_norat
Subroutine : | |
ks : | integer , intent(in ) |
ke : | integer , intent(in ) |
gt(0:imax-1, 1:jmax, ks:ke) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, ks:ke) : | real(DP), intent(in ) |
jj(0:imax-1, 1:jmax, ks:ke) : | integer , intent(in ) |
kk(0:imax-1, 1:jmax, ks:ke) : | integer , intent(in ) |
ig : | integer , intent(in ) |
iband : | integer , intent(in ) |
pfr(0:imax-1, 1:jmax, ks:ke) : | real(DP), intent(out) |
subroutine getpfr_givenindices( ks, ke, gt, glnp, jj, kk, ig, iband, pfr ) use ckd_module, only: ckdp integer , intent(in ) :: ks integer , intent(in ) :: ke real(DP), intent(in ) :: gt (0:imax-1, 1:jmax, ks:ke) real(DP), intent(in ) :: glnp(0:imax-1, 1:jmax, ks:ke) integer , intent(in ) :: jj (0:imax-1, 1:jmax, ks:ke) integer , intent(in ) :: kk (0:imax-1, 1:jmax, ks:ke) integer , intent(in ) :: ig, iband real(DP), intent(out) :: pfr (0:imax-1, 1:jmax, ks:ke) ! ! local variables ! real(DP) :: pfr1, pfr2 integer :: i, j, k, l do k = ks, ke do j = 1, jmax do i = 0, imax-1 pfr1 = ( ckdp(iband)%pfr( ig, jj(i,j,k) , kk(i,j,k)+1 ) - ckdp(iband)%pfr( ig, jj(i,j,k) , kk(i,j,k) ) ) / ( ckdp(iband)%t( kk(i,j,k)+1 ) - ckdp(iband)%t( kk(i,j,k) ) ) * ( gt(i,j,k) - ckdp( iband ) % t( kk(i,j,k) ) ) + ckdp(iband)%pfr( ig, jj(i,j,k) , kk(i,j,k) ) pfr2 = ( ckdp(iband)%pfr( ig, jj(i,j,k)+1, kk(i,j,k)+1 ) - ckdp(iband)%pfr( ig, jj(i,j,k)+1, kk(i,j,k) ) ) / ( ckdp(iband)%t( kk(i,j,k)+1 ) - ckdp(iband)%t( kk(i,j,k) ) ) * ( gt(i,j,k) - ckdp( iband ) % t( kk(i,j,k) ) ) + ckdp(iband)%pfr( ig, jj(i,j,k)+1, kk(i,j,k) ) pfr(i,j,k) = ( pfr2 - pfr1 ) / ( ckdp( iband ) % lnp( jj(i,j,k)+1 ) - ckdp( iband ) % lnp( jj(i,j,k) ) ) * ( glnp(i,j,k) - ckdp( iband ) % lnp( jj(i,j,k) ) ) + pfr1 end do end do end do end subroutine getpfr_givenindices
Subroutine : | |
gt(0:imax-1, 1:jmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax) : | real(DP), intent(in ) |
jj(0:imax-1, 1:jmax) : | integer , intent(in ) |
kk(0:imax-1, 1:jmax) : | integer , intent(in ) |
ig : | integer , intent(in ) |
iband : | integer , intent(in ) |
pfr(0:imax-1, 1:jmax) : | real(DP), intent(out) |
subroutine getpfr_givenindices2D( gt, glnp, jj, kk, ig, iband, pfr ) real(DP), intent(in ) :: gt (0:imax-1, 1:jmax) real(DP), intent(in ) :: glnp(0:imax-1, 1:jmax) integer , intent(in ) :: jj (0:imax-1, 1:jmax) integer , intent(in ) :: kk (0:imax-1, 1:jmax) integer , intent(in ) :: ig, iband real(DP), intent(out) :: pfr (0:imax-1, 1:jmax) ! ! local variables ! real(DP) :: gt3d (0:imax-1, 1:jmax, 1:1) real(DP) :: glnp3d(0:imax-1, 1:jmax, 1:1) integer :: jj3d (0:imax-1, 1:jmax, 1:1) integer :: kk3d (0:imax-1, 1:jmax, 1:1) real(DP) :: pfr3d (0:imax-1, 1:jmax, 1:1) gt3d (:,:,1) = gt glnp3d(:,:,1) = glnp jj3d (:,:,1) = jj kk3d (:,:,1) = kk call getpfr_givenindices( 1, 1, gt3d, glnp3d, jj3d, kk3d, ig, iband, pfr3d ) pfr (:,:) = pfr3d (:,:,1) end subroutine getpfr_givenindices2D
Subroutine : | |
gt(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
glnp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in ) |
jj(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(in ) |
kk(0:imax-1, 1:jmax, 1:kmax) : | integer , intent(in ) |
ig : | integer , intent(in ) |
iband : | integer , intent(in ) |
pfr(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out) |
subroutine getpfr_givenindices3D( gt, glnp, jj, kk, ig, iband, pfr ) use ckd_module, only: ckdp real(DP), intent(in ) :: gt (0:imax-1, 1:jmax, 1:kmax) real(DP), intent(in ) :: glnp(0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: jj (0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: kk (0:imax-1, 1:jmax, 1:kmax) integer , intent(in ) :: ig, iband real(DP), intent(out) :: pfr (0:imax-1, 1:jmax, 1:kmax) ! ! local variables ! call getpfr_givenindices( 1, kmax, gt, glnp, jj, kk, ig, iband, pfr ) end subroutine getpfr_givenindices3D
Subroutine : | |
m : | integer, intent(in ) |
ig : | integer, intent(out) |
iband : | integer, intent(out) |
subroutine m2ckdpindices( m, ig, iband ) use ckd_module, only : ckdp, nband integer, intent(in ) :: m integer, intent(out) :: ig integer, intent(out) :: iband ! ! local variables ! integer :: num ! The comments below will be removed. num = 0 do iband = 1, nband if( num + ckdp( iband ) % ng .ge. m ) exit num = num + ckdp( iband ) % ng end do if( iband .gt. nband ) then write( 6, * ) 'Unexpected m' write( 6, * ) m stop end if ig = m - num if( ig .gt. ckdp( iband ) % ng ) then write( 6, * ) 'Unexpected ig' write( 6, * ) iband, ig stop end if end subroutine m2ckdpindices
Constant : | |||
module_name = ‘rad_Mars_15m‘ : | character(*), parameter
|
Subroutine : |
This procedure input/output NAMELIST#rad_Mars_15m_nml .
subroutine rad15m_init ! モジュール引用 ; USE statements ! ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: namelist_filename, NmlutilMsg, NmlutilAryValid ! ファイル入出力補助 ! File I/O support ! use dc_iounit, only: FileOpen use ckd_module, only : ckd_input, ckdp, nband ! ! local variables ! integer:: unit_nml ! NAMELIST ファイルオープン用装置番号. ! Unit number for NAMELIST file open integer:: iostat_nml ! NAMELIST 読み込み時の IOSTAT. ! IOSTAT of NAMELIST read character(STRING) :: rad15mkg_fn character(STRING) :: rad15mnf_fn integer :: m namelist /rad_Mars_15m_nml/ rad15mkg_fn, rad15mint ! 実行文 ; Executable statement ! if ( rad_Mars_15m_inited ) return ! デフォルト値の設定 ! Default values settings ! rad15mkg_fn = "./kg15m" !!$ rad15mnf_fn = "./nlte15mfactor" rad15mint = 925.0_DP ! NAMELIST の読み込み ! NAMELIST is input ! if ( trim(namelist_filename) /= '' ) then call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in) rewind( unit_nml ) read( unit_nml, nml = rad_Mars_15m_nml, iostat = iostat_nml ) ! (out) close( unit_nml ) call NmlutilMsg( iostat_nml, module_name ) ! (in) end if !!$ allocate( rad_gp ( im, jm, km ) ) !!$ allocate( rad_gph ( im, jm, 0:km ) ) !!$ allocate( rad_gt ( im, jm, km ) ) !!$ allocate( rad_gts ( im, jm, 1 ) ) !!$ allocate( rad_gdod ( im, jm, 0:km ) ) nras = 1 nrps = 0 !!$ allocate( sgmh_f ( km*nvr+1 ), & !!$ & sgm_f ( km*nvr ) ) !!$ allocate( gph_f ( im, jm, km*nvr+1 ), & !!$ & gp_f ( im, jm, km*nvr ), & !!$ & gth_f ( im, jm, km*nvr+1 ) ) !!$ !!$ allocate( gvmr_f ( im, jm, km*nvr , nras + nrps ) ) !!$ allocate( mmmass_f ( im, jm, km*nvr ) ) !!$ allocate( ac_f ( im, jm, km*nvr , nras ) ) !!$ !!$ allocate( gdod_f ( im, jm, km*nvr+1 ) ) !!$ !!$ allocate( trans (0:imax-1, 1:jmax, 0:kmax, 0:kmax) ) !!$ allocate( pfh_f ( im, jm, km*nvr+1 ) ) !!$ !!$ allocate( uwflh_f ( im, jm, km*nvr+1 ), & !!$ & dwflh_f ( im, jm, km*nvr+1 ) ) allocate( trans_i2i_toa(0:imax-1, 1:jmax, 0:kmax), trans_i2i_boa(0:imax-1, 1:jmax, 0:kmax), trans_i2i_s (0:imax-1, 1:jmax, 0:kmax), trans_i2m_lli(0:imax-1, 1:jmax, 0:kmax, 1:kmax), trans_i2m_uli(0:imax-1, 1:jmax, 0:kmax, 1:kmax) ) trans_i2i_toa(:,:,:) = 1.0d100 trans_i2i_boa(:,:,:) = 1.0d100 trans_i2i_s (:,:,:) = 1.0d100 trans_i2m_lli(:,:,:,:) = 1.0d100 trans_i2m_uli(:,:,:,:) = 1.0d100 ! ! check ! if( nras .ne. 1 ) then write( 6, * ) 'nras is not 1.' write( 6, * ) nras stop end if call ckd_input( rad15mkg_fn ) ! check if( nband /= 1 ) then write( 6, * ) ' nband is not 1.' write( 6, * ) nband stop end if nwnl = 0 do m = 1, nband nwnl = nwnl + ckdp( m ) % ng end do !!$ call increase_vreso_boundary( km, nvr, sgmh, sgmh_f, "log" ) !!$ do k = 1, km * nvr !!$ sgm_f( k ) = sqrt( sgmh_f( k ) * sgmh_f( k+1 ) ) !!$ end do !!$ call rad15m_readnlte15mfac( rad15mnf_fn ) ! ! This routine must be called after rad15m_readkgtbl. ! !!$ call rad15m_rv_read( time ) !!$ call rad15m_rv_read_newscheme2006( time ) rad_Mars_15m_inited = .true. end subroutine rad15m_init
Subroutine : | |
time : | real(DP) , intent(in ) |
dt : | real(DP) , intent(in ) |
gt(0:imax-1, 1:jmax, 1:kmax) : | real(DP) , intent(in ) |
gph(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(in ) |
gp(0:imax-1, 1:jmax, 1:kmax) : | real(DP) , intent(in ) |
gts(0:imax-1, 1:jmax) : | real(DP) , intent(in ) |
dod067(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(in ) |
qerat : | real(DP) , intent(in ) |
ssa : | real(DP) , intent(in ) |
emis(0:imax-1, 1:jmax) : | real(DP) , intent(in ) |
gr15mnetflh(0:imax-1, 1:jmax, 0:kmax) : | real(DP) , intent(out) |
gdr15mnetfldtsh(0:imax-1, 1:jmax, 0:kmax, 0:1) : | real(DP) , intent(out) |
gor(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
goru(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
gord(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
gsr(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
gsru(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
gsrd(0:imax-1, 1:jmax) : | real(DP) , intent(out) |
subroutine rad15m_lowatm_newscheme2006( time, dt, gt, gph, gp, gts, dod067, qerat, ssa, emis, gr15mnetflh, gdr15mnetfldtsh, gor, goru, gord, gsr, gsru, gsrd ) use constants , only : Grav, CpDry ! メッセージ出力 ! Message output ! use dc_message, only: MessageNotify use ckd_module, only : ckdp real(DP) , intent(in ) :: time real(DP) , intent(in ) :: dt real(DP) , intent(in ) :: gph (0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(in ) :: gp (0:imax-1, 1:jmax, 1:kmax) real(DP) , intent(in ) :: gt (0:imax-1, 1:jmax, 1:kmax) real(DP) , intent(in ) :: gts (0:imax-1, 1:jmax) real(DP) , intent(in ) :: dod067(0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(in ) :: qerat real(DP) , intent(in ) :: ssa real(DP) , intent(in ) :: emis (0:imax-1, 1:jmax) real(DP) , intent(out) :: gr15mnetflh (0:imax-1, 1:jmax, 0:kmax) real(DP) , intent(out) :: gdr15mnetfldtsh(0:imax-1, 1:jmax, 0:kmax, 0:1) real(DP) , intent(out) :: gor (0:imax-1, 1:jmax), goru (0:imax-1, 1:jmax), gord (0:imax-1, 1:jmax), gsr (0:imax-1, 1:jmax), gsru (0:imax-1, 1:jmax), gsrd (0:imax-1, 1:jmax) ! ! local variables ! real(DP) :: gth(0:imax-1, 1:jmax, 0:kmax) real(DP) :: mmmass (0:imax-1, 1:jmax, 1:kmax) real(DP) :: gvmr (0:imax-1, 1:jmax, 1:kmax, 1:nras+nrps ) real(DP) :: ac (0:imax-1, 1:jmax, 1:kmax, 1:nras ) real(DP) :: pfh (0:imax-1, 1:jmax, 0:kmax) real(DP) :: pfs (0:imax-1, 1:jmax) real(DP) :: pfs_for_gradcalc(0:imax-1, 1:jmax) real(DP) :: weight_integral integer :: ig, iband integer :: i, j, k, l, m, n integer :: k2 ! ! dod : dust optical depth ! real(DP) :: gdod(0:imax-1, 1:jmax, 0:kmax) ! ! local variables for pfint ! integer , parameter :: divnum = 3 real(DP) , parameter :: wn1 = 500.0d2, wn2 = 850.0d2 real(DP) :: minp, maxp integer :: iband_reserve real(DP) :: glnps(0:imax-1, 1:jmax) real(DP) :: glnp (0:imax-1, 1:jmax, 1:kmax ) integer :: jj (0:imax-1, 1:jmax, 1:kmax), kk (0:imax-1, 1:jmax, 1:kmax ), jjs (0:imax-1, 1:jmax) , kks (0:imax-1, 1:jmax) ! Surface temperature for calculation of gradient of radiative flux real(DP) :: gts_for_gradcalc(0:imax-1, 1:jmax) ! Indices for calculation of gradient of radiative flux integer :: jjs_for_gradcalc(0:imax-1, 1:jmax), kks_for_gradcalc(0:imax-1, 1:jmax) real(DP) :: pfrh(0:imax-1, 1:jmax, 0:kmax) real(DP) :: pfr (0:imax-1, 1:jmax, 1:kmax) real(DP) :: pfrs(0:imax-1, 1:jmax) logical, save :: FlagCalcTrans data FlagCalcTrans / .false. / k = 0 do j = 1, jmax do i = 0, imax-1 !!$ gth(i,j,k) = gt(i,j,k+1) gth(i,j,k) = ( gt(i,j,2) - gt(i,j,1) ) / log( gp (i,j,2) / gp(i,j,1) ) * log( gph(i,j,k) / gp(i,j,1) ) + gt(i,j,1) end do end do do k = 1, kmax-1 do j = 1, jmax do i = 0, imax-1 gth(i,j,k) = ( gt(i,j,k+1) - gt(i,j,k) ) / log( gp (i,j,k+1) / gp(i,j,k) ) * log( gph(i,j,k ) / gp(i,j,k) ) + gt(i,j,k) end do end do end do k = kmax do j = 1, jmax do i = 0, imax-1 gth(i,j,k) = gt(i,j,k) end do end do !!$ do k = 1, km*nvr+1 !!$ do ij = ijs, ije !!$ gph_f( ij, 1, k ) = sgmh_f( k ) * gph( ij, 1, km+1 ) !!$ end do !!$ end do !!$ call calc_lnp( im, jm, km*nvr+1, gph_f , glnph_f , ijs, ije ) !!$ !!$ call increase_vreso_boundary_arr3d( im, jm, km, nvr, gth, gth_f, & !!$ & "linear", ijs, ije ) if ( .not. FlagCalcTrans ) then if ( time - dble( int( time / rad15mint ) ) * rad15mint < dt ) then call MessageNotify( 'M', module_name, 'Transmittance is not saved, but criterion for transmittance calculation is met.' ) else call MessageNotify( 'M', module_name, 'Transmittance is not saved, and criterion for transmittance calculation ' // 'is not met. However, transmittance will be calculated.' ) end if end if ! ! Calculation of transmission ! if( ( .not. FlagCalcTrans ) .or. ( time - dble( int( time / rad15mint ) ) * rad15mint ) .lt. dt ) then FlagCalcTrans = .true. !!$ call MessageNotify( 'M', module_name, 'Transmission is calculated.' ) ! ! Calculation of "absorption" dust optical depth ! This formulation is obtained from Forget et al. [1999]. ! do k = 0, kmax do j = 1, jmax do i = 0, imax-1 gdod(i,j,k) = ( 1.0d0 - ssa ) * dod067(i,j,k) * qerat end do end do end do !!$ call increase_vreso_boundary_arr3d( im, jm, km, nvr, gdod, gdod_f, & !!$ & "log", ijs, ije ) ! ! check pressure ! minp = 1.0d100 maxp = 0.0d0 do j = 1, jmax do i = 0, imax-1 minp = min( minp, gp(i,j,kmax) ) maxp = max( maxp, gp(i,j,1 ) ) end do end do if( ckdp(1)%lnp(1) .gt. log(minp) ) then write( 6, * ) 'MARS: pressure is too small.' write( 6, * ) minp, exp(ckdp(1)%lnp(1)) stop end if if( ckdp(1)%lnp(ckdp(1)%nlnp) .lt. log(maxp) ) then write( 6, * ) 'MARS: pressure is too large.' write( 6, * ) maxp, exp(ckdp(1)%lnp(ckdp(1)%nlnp)) stop end if do k = 1, kmax do j = 1, jmax do i = 0, imax-1 mmmass(i,j,k) = 43.5d0 * amu end do end do end do do n = 1, nras + nrps do k = 1, kmax do j = 1, jmax do i = 0, imax-1 gvmr(i,j,k,n) = vmr_co2 end do end do end do end do !!$ do n = 1, nras + nrps !!$ call increase_vreso_b2m_arr3d( im, jm, km, nvr, & !!$ & gvmrh(:,:,:,n), gvmr_f(:,:,:,n), "log", & !!$ & ijs, ije ) !!$ end do !!$ call increase_vreso_b2m_arr3d( im, jm, km, nvr, & !!$ & mmmassh, mmmass_f, "linear", & !!$ & ijs, ije ) !!$ call calc_lnp( im, jm, km+1 , gph , glnph , ijs, ije ) call calc_lnp( gp, glnp ) glnps(:,:) = log( gph(:,:,0) ) ! ! initialization ! do k = 0, kmax do j = 1, jmax do i = 0, imax-1 trans_i2i_toa(i,j,k) = 0.0d0 ! f_{1/2} T_{k+1/2,1/2} trans_i2i_boa(i,j,k) = 0.0d0 ! f_{km+1/2} T_{k+1/2,km+1/2} trans_i2i_s (i,j,k) = 0.0d0 ! f_{s} T_{k+1/2,km+1/2} end do end do end do do k2 = 1, kmax do k = 0, kmax do j = 1, jmax do i = 0, imax-1 trans_i2m_uli(i,j,k,k2) = 0.0d0 trans_i2m_lli(i,j,k,k2) = 0.0d0 end do end do end do end do ! ! loop for wavenumber ! iband_reserve = 0 do m = 1, nwnl call m2ckdpindices( m, ig, iband ) if( iband .ne. iband_reserve ) then call findindices3D( gt, glnp, iband, jj, kk ) call findindices2D( gts, glnps, iband, jjs, kks ) iband_reserve = iband end if ! IMPORTANT! ! This loop for n is confusing. ! We have to reconsider about it. ! Maybe, the component of ckdp structure has to be reconsidered. ! Now, it cannot include multiple radiatively active species. ! (yot, 2010/09/12) ! do n = 1, nras call getlnac_givenindices( gt, glnp, jj, kk, ig, iband, ac(:,:,:,n) ) end do do n = 1, nras do k = 1, kmax do j = 1, jmax do i = 0, imax-1 ac(i,j,k,n) = exp( ac(i,j,k,n) ) end do end do end do end do !!$ do n = 1, nras !!$ call increase_vreso_b2m_arr3d( im, jm, km, nvr, & !!$ & ach(:,:,:,n), ac_f(:,:,:,n), "log", & !!$ & ijs, ije ) !!$ end do call calc_trans_mp_arr3d( nras, nrps, gph, gvmr, mmmass, ac, gdod, trans ) call getpfr_givenindices3D( gt, glnp, jj, kk, ig, iband, pfr ) pfrh(:,:,0) = pfr(:,:,1) do k = 1, kmax-1 pfrh(:,:,k) = ( pfr(:,:,k) + pfr(:,:,k+1) ) * 0.5_DP end do pfrh(:,:,kmax) = pfr(:,:,kmax) call getpfr_givenindices2D( gts, glnps, jjs, kks, ig, iband, pfrs ) do k = 0, kmax do j = 1, jmax do i = 0, imax-1 trans_i2i_toa(i,j,k) = trans_i2i_toa(i,j,k) + trans(i,j,k,kmax) * pfrh(i,j,kmax) * ckdp(iband)%weight(ig) trans_i2i_boa(i,j,k) = trans_i2i_boa(i,j,k) + trans(i,j,k,0) * pfrh(i,j,0) * ckdp(iband)%weight(ig) trans_i2i_s (i,j,k) = trans_i2i_s (i,j,k) + trans(i,j,k,0) * pfrs(i,j) * ckdp(iband)%weight(ig) end do end do end do do k2 = 1, kmax do k = 0, kmax do j = 1, jmax do i = 0, imax-1 trans_i2m_uli(i,j,k,k2) = trans_i2m_uli(i,j,k,k2) + ( trans(i,j,k,k2-1) + trans(i,j,k,k2) ) * 0.5d0 * pfrh(i,j,k2 ) * ckdp(iband)%weight(ig) trans_i2m_lli(i,j,k,k2) = trans_i2m_lli(i,j,k,k2) + ( trans(i,j,k,k2-1) + trans(i,j,k,k2) ) * 0.5d0 * pfrh(i,j,k2-1) * ckdp(iband)%weight(ig) end do end do end do end do end do !!$ call rad15m_rv_put_newscheme2006( time, gt, gph, gp, gts, gdod, ijs, ije ) else if ( trans_i2i_toa(1,1,1) > 1.0d99 ) then write( 6, * ) 'transmission function would not be calculated.' stop end if end if ! Is this OK? iband = 1 call getpf_arr3d_norat( gth, gts, iband, pfh, pfs ) call calc_rteq_use_meantrans_arr3d( ( ckdp(iband)%wnbnds(2) - ckdp(iband)%wnbnds(1) ), emis, trans_i2i_toa, trans_i2i_boa, trans_i2i_s, trans_i2m_lli, trans_i2m_uli, pfh, pfs, gr15mnetflh ) do l = 0, 1 do k = 0, kmax do j = 1, jmax do i = 0, imax-1 gdr15mnetfldtsh(i,j,k,l) = 0.0_DP end do end do end do end do !!$ do k = kmax, 0, -1 !!$ write( 6, * ) gph(0,1,k), gr15mnetflh(0,1,k) !!$ end do !!$ stop !!$ ij = ( ije - ijs + 1 ) / 2 !!$ k = km + 1 !!$! write( 6, * ) 'RAD15M : ', gr15mnetflh(ij,1,k), rad_gdr15mnetfldtsh0(ij,1,k-1) * ( gts(ij,1) - rad_gtsbase(ij,1,1) ), emis(ij,1) * 5.67d-8 * gts(ij,1)**4, gts(ij,1) !!$! write( 61, * ) gr15mnetflh(ij,1,k-1), rad_gdr15mnetfldtsh0(ij,1,k-1) * ( gts(ij,1) - rad_gtsbase(ij,1,1) ), emis(ij,1) * 5.67d-8 * gts(ij,1)**4, gts(ij,1), gt(ij,1,km), gt(ij,1,km-1), gt(ij,1,km-2), gt(ij,1,km-3), gt(ij,1,km-4), gt(ij,1,km-5) !!$ write( 6, * ) 'RAD15M : ', gr15mnetflh(ij,1,k), & !!$ & emis(ij,1) * 5.67d-8 * gts(ij,1)**4, gts(ij,1) !!$ write( 61, * ) gr15mnetflh(ij,1,k-1), & !!$ & emis(ij,1) * 5.67d-8 * gts(ij,1)**4, gts(ij,1), & !!$ & gt(ij,1,km), gt(ij,1,km-1), gt(ij,1,km-2), gt(ij,1,km-3), & !!$ & gt(ij,1,km-4), gt(ij,1,km-5) !!$ call flush( 61 ) ! ! output variables ! !!$ do j = 1, jmax !!$ do i = 0, imax-1 !!$ goru(i,j) = uwflh_sum(i,j,kmax) !!$ gord(i,j) = 0.0d0 !!$ gsru(i,j) = uwflh_sum(i,j,0) !!$ gsrd(i,j) = dwflh_sum(i,j,0) !!$ gor (i,j) = goru(i,j) - gord(i,j) !!$ gsr (i,j) = gsru(i,j) - gsrd(i,j) !!$ end do !!$ end do end subroutine rad15m_lowatm_newscheme2006
Variable : | |||||||
trans(:,:,:,:) : | real(DP) , allocatable, save
|
Variable : | |||
trans_i2m_lli(:,:,:,:) : | real(DP) , allocatable, save
|
Variable : | |||
trans_i2m_uli(:,:,:,:) : | real(DP) , allocatable, save
|
Constant : | |||
version = ’$Name: dcpam5-20120224 $’ // ’$Id: rad_Mars_15m.f90,v 1.3 2012-02-01 12:03:05 yot Exp $’ : | character(*), parameter
|