dadadj.f90

来自「CCSM Research Tools: Community Atmospher」· F90 代码 · 共 137 行

F90
137
字号
#include <misc.h>#include <params.h>subroutine dadadj (lchnk   ,ncol    , &                   pmid    ,pint    ,pdel    ,t       , &                   q       )!----------------------------------------------------------------------- ! ! Purpose: ! GFDL style dry adiabatic adjustment! ! Method: ! if stratification is unstable, adjustment to the dry adiabatic lapse! rate is forced subject to the condition that enthalpy is conserved.! ! Author: CMS Contact J.Hack! !-----------------------------------------------------------------------   use precision   use ppgrid   use phys_grid,     only: get_lat_p, get_lon_p   use physconst, only: cappa   implicit none   integer niter           ! number of iterations for convergence   parameter (niter = 15)#include <comadj.h>!! Arguments!   integer, intent(in) :: lchnk               ! chunk identifier   integer, intent(in) :: ncol                ! number of atmospheric columns   real(r8), intent(in) :: pmid(pcols,pver)   ! pressure at model levels   real(r8), intent(in) :: pint(pcols,pverp)  ! pressure at model interfaces   real(r8), intent(in) :: pdel(pcols,pver)   ! vertical delta-p!! Input/output arguments!   real(r8), intent(inout) :: t(pcols,pver)      ! temperature (K)   real(r8), intent(inout) :: q(pcols,pver)      ! specific humidity!!---------------------------Local workspace-----------------------------!   integer i,k             ! longitude, level indices   integer jiter           ! iteration index   real(r8) c1dad(pver)        ! intermediate constant   real(r8) c2dad(pver)        ! intermediate constant   real(r8) c3dad(pver)        ! intermediate constant   real(r8) c4dad(pver)        ! intermediate constant   real(r8) gammad             ! dry adiabatic lapse rate (deg/Pa)   real(r8) zeps               ! convergence criterion (deg/Pa)   real(r8) rdenom             ! reciprocal of denominator of expression   real(r8) dtdp               ! delta-t/delta-p   real(r8) zepsdp             ! zeps*delta-p   real(r8) zgamma             ! intermediate constant   real(r8) qave               ! mean q between levels   logical ilconv          ! .TRUE. ==> convergence was attained   logical dodad(pcols)    ! .TRUE. ==> do dry adjustment!!-----------------------------------------------------------------------!   zeps = 2.0e-5           ! set convergence criteria!! Find gridpoints with unstable stratification!   do i=1,ncol      gammad = cappa*0.5*(t(i,2) + t(i,1))/pint(i,2)      dtdp = (t(i,2) - t(i,1))/(pmid(i,2) - pmid(i,1))      dodad(i) = (dtdp + zeps) .gt. gammad   end do   do k=2,nlvdry      do i=1,ncol         gammad = cappa*0.5*(t(i,k+1) + t(i,k))/pint(i,k+1)         dtdp = (t(i,k+1) - t(i,k))/(pmid(i,k+1) - pmid(i,k))         dodad(i) = dodad(i) .or. (dtdp + zeps).gt.gammad      end do   end do!! Make a dry adiabatic adjustment! Note: nlvdry ****MUST**** be < pver!   do 80 i=1,ncol      if (dodad(i)) then         zeps = 2.0e-5         do k=1,nlvdry            c1dad(k) = cappa*0.5*(pmid(i,k+1)-pmid(i,k))/pint(i,k+1)            c2dad(k) = (1. - c1dad(k))/(1. + c1dad(k))            rdenom = 1./(pdel(i,k)*c2dad(k) + pdel(i,k+1))            c3dad(k) = rdenom*pdel(i,k)            c4dad(k) = rdenom*pdel(i,k+1)         end do50       do jiter=1,niter            ilconv = .true.            do k=1,nlvdry               zepsdp = zeps*(pmid(i,k+1) - pmid(i,k))               zgamma = c1dad(k)*(t(i,k) + t(i,k+1))               if ((t(i,k+1)-t(i,k)) >= (zgamma+zepsdp)) then                  ilconv = .false.                  t(i,k+1) = t(i,k)*c3dad(k) + t(i,k+1)*c4dad(k)                  t(i,k) = c2dad(k)*t(i,k+1)                  qave = (pdel(i,k+1)*q(i,k+1) + pdel(i,k)*q(i,k))/(pdel(i,k+1)+ pdel(i,k))                  q(i,k+1) = qave                  q(i,k) = qave               end if            end do            if (ilconv) go to 80 ! convergence => next longitude         end do!! Double convergence criterion if no convergence in niter iterations!         zeps = zeps + zeps         if (zeps > 1.e-4) then            write(6,*)'DADADJ: No convergence in dry adiabatic adjustment'            write(6,800) get_lat_p(lchnk,i),get_lon_p(lchnk,i),zeps            call endrun         else            write(6,810) zeps,get_lat_p(lchnk,i),get_lon_p(lchnk,i)            go to 50         end if      end if80    continue      return!! Formats!800   format(' lat,lon = ',2i5,', zeps= ',e9.4)810   format(//,'DADADJ: Convergence criterion doubled to EPS=',E9.4, &             ' for'/'        DRY CONVECTIVE ADJUSTMENT at Lat,Lon=', &             2i5)end subroutine dadadj

⌨️ 快捷键说明

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