⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 difcor.f90

📁 CCSM Research Tools: Community Atmosphere Model (CAM)
💻 F90
字号:
#include <misc.h>#include <params.h>subroutine difcor(klev    ,ztodt   ,delps   ,u       ,v       , &                  qsave   ,pdel    ,pint    ,t       ,tdif    , &                  udif    ,vdif    ,nlon    )!----------------------------------------------------------------------- ! ! Purpose: ! Add correction term to t and q horizontal diffusions and! determine the implied heating rate due to momentum diffusion.! ! Method: ! 1. Add correction term to t and q horizontal diffusions. This term! provides a partial correction of horizontal diffusion on hybrid (sigma)! surfaces to horizontal diffusion on pressure surfaces. The appropriate! function of surface pressure (delps, which already contains the diffusion! coefficient and the time step) is computed during the transform! from  spherical harmonic coefficients to grid point values. This term! can only be applied in the portion of the vertical domain in which! biharmonic horizontal diffusion is employed. In addition, the term is! unnecessary on pure pressure levels.!! 2. Determine the implied heating rate due to momentum diffusion in order! to conserve total energy and add it to the temperature.! Reduce complex matrix (ac) to upper Hessenburg matrix (ac)!! Author: D. Williamson! !-----------------------------------------------------------------------!! $Id: difcor.F90,v 1.1 2001/11/06 18:42:47 erik Exp $! $Author: erik $!!-----------------------------------------------------------------------  use precision  use pmgrid  use physconst, only: cpair, cpvir  implicit none#include <comctl.h>#include <comhyb.h>!------------------------------Arguments--------------------------------  integer , intent(in) :: klev                  ! k-index of top hybrid level  integer , intent(in) :: nlon                  ! longitude dimension  real(r8), intent(in) :: ztodt                 ! twice time step unless nstep = 0  real(r8), intent(in) :: delps(plond)          ! srf press function for correction  real(r8), intent(in) :: u(plond,plev)         ! u-wind  real(r8), intent(in) :: v(plond,plev)         ! v-wind  real(r8), intent(in) :: qsave(plond,plev)     ! moisture fm prv fcst  real(r8), intent(in) :: pdel(plond,plev)      ! pdel(k) = pint(k+1) - pint(k)  real(r8), intent(in) :: pint(plond,plevp)     ! pressure at model interfaces  real(r8), intent(inout) :: t(plond,plev)      ! temperature  real(r8), intent(inout) :: tdif(plond,plev)   ! initial/final temperature diffusion  real(r8), intent(inout) :: udif(plond,plev)   ! initial/final u-momentum diffusion  real(r8), intent(inout) :: vdif(plond,plev)   ! initial/final v-momentum diffusion!---------------------------Local workspace-----------------------------  integer i,k                ! longitude, level indices  real(r8) tcor(plond,plev)  ! temperature correction term!-----------------------------------------------------------------------!! Compute the pressure surface correction term for horizontal diffusion of! temperature. !  do k=klev,plev     if (k==1) then        do i=1,nlon           tcor(i,k) = delps(i)*0.5/pdel(i,k)*(hybi(k+1)*(t(i,k+1)-t(i,k)))*pint(i,plevp)        end do     else if (k==plev) then        do i=1,nlon           tcor(i,k) = delps(i)*0.5/pdel(i,k)*(hybi(k)*(t(i,k)-t(i,k-1)))*pint(i,plevp)        end do     else        do i=1,nlon           tcor(i,k) = delps(i)*0.5/pdel(i,k)*(hybi(k+1)*(t(i,k+1)-t(i,k)) + &                       hybi(k  )*(t(i,k)-t(i,k-1)))*pint(i,plevp)        end do     end if  end do!! Add the temperture diffusion correction to the diffusive heating term ! and to the temperature.!  if (.not.adiabatic .and. .not.ideal_phys) then     do k=klev,plev        do i=1,nlon           tdif(i,k) = tdif(i,k) + tcor(i,k)/ztodt           t(i,k) = t(i,k) + tcor(i,k)        end do     end do!! Convert momentum diffusion tendencies to heating rates in order to ! conserve internal energy. Add the heating to the temperature and to ! diffusive heating term.!     do k=1,plev        do i=1,nlon           t(i,k) = t(i,k) - ztodt * (u(i,k)*udif(i,k) + v(i,k)*vdif(i,k)) / &                                     (cpair*(1. + cpvir*qsave(i,k)))           tdif(i,k) = tdif(i,k) - (u(i,k)*udif(i,k) + v(i,k)*vdif(i,k)) / &                                   (cpair*(1. + cpvir*qsave(i,k)))        end do     end do  end if   returnend subroutine difcor

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -