!WRF:MODEL_RA:RADIATION
!
MODULE module_ra_gfdleta 2
INTEGER, PARAMETER :: NL=81
INTEGER, PARAMETER :: NBLY=15
REAL , SAVE, DIMENSION(37,NL) :: XDUO3N,XDO3N2,XDO3N3,XDO3N4
REAL , SAVE, DIMENSION(NL) :: PRGFDL
REAL , SAVE :: AB15WD,SKO2D,SKC1R,SKO3R
REAL , SAVE :: EM1(28,180),EM1WDE(28,180),TABLE1(28,180), &
TABLE2(28,180),TABLE3(28,180),EM3(28,180), &
SOURCE(28,NBLY), DSRCE(28,NBLY)
REAL ,SAVE, DIMENSION(5040):: T1,T2,T4,EM1V,EM1VW,EM3V
REAL ,SAVE :: R1
! Created by CO2 initialization
REAL, SAVE, ALLOCATABLE, DIMENSION(:,:) :: CO251,CDT51,CDT58,C2D51,&
C2D58,CO258
REAL, SAVE, ALLOCATABLE, DIMENSION(:) :: STEMP,GTEMP,CO231,CO238, &
C2D31,C2D38,CDT31,CDT38, &
CO271,CO278,C2D71,C2D78, &
CDT71,CDT78
REAL, SAVE, ALLOCATABLE, DIMENSION(:) :: CO2M51,CO2M58,CDTM51,CDTM58, &
C2DM51,C2DM58
! Used by CO2 initialization
! COMMON/PRESS/PA(109)
! COMMON/TRAN/ TRANSA(109,109)
! COMMON/COEFS/XA(109),CA(109),ETA(109),SEXPV(109),CORE,UEXP,SEXP
REAL ,SAVE, DIMENSION(109) :: PA, XA, CA, ETA, SEXPV
REAL ,SAVE, DIMENSION(109,109) :: TRANSA
REAL ,SAVE :: CORE,UEXP,SEXP
#ifndef TRIEDNTRUE
! EQUIVALENCE (EM1V(1),EM1(1,1)),(EM1VW(1),EM1WDE(1,1))
! EQUIVALENCE (EM3V(1),EM3(1,1))
! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), &
! (T4(1),TABLE3(1,1))
#endif
CONTAINS
!---------------------------------------------------------------------
SUBROUTINE GFDLETAINIT(SFULL,SHALF,PPTOP,JULYR,JULDAY,GMT, & 2,4
kds, kde, kms, kme, kts, kte)
IMPLICIT NONE
INTEGER, INTENT(IN) :: kds, kde, kms, kme, kts, kte
REAL, DIMENSION(kms:kme), INTENT(IN) :: SFULL, SHALF
INTEGER, INTENT(IN) :: JULDAY,JULYR
REAL, INTENT(IN) :: GMT, PPTOP
#ifndef TRIEDNTRUE
INTEGER IHRST
CALL CO2O3
(sfull,shalf,pptop,kme-kms,kme-kms+1,kme-kms+2)
CALL O3CLIM
CALL TABLE
IHRST = NINT(GMT)
CALL SOLARD
(IHRST,JULDAY,JULYR)
#endif
END SUBROUTINE GFDLETAINIT
!---------------------------------------------------------------------
SUBROUTINE ETARA (DT,THRATEN,THRATENLW,THRATENSW,PI3D & 2,2
,XLAND,p8w,dz8w,RHO_PHY,P_PHY,T &
,QV,QL,TSK2D,GLW,GSW &
,GLAT,GLON,HTOP,HBOT,ALBEDO,CUPPT &
,VEGFRA,SNOW,G,GMT,NSTEPRA,itimestep &
,julyr,julday,gfdl_lw,gfdl_sw &
,IDS,IDE,JDS,JDE,KDS,KDE &
,IMS,IME,JMS,JME,KMS,KME &
,ITS,ITE,JTS,JTE,KTS,KTE )
!---------------------------------------------------------------------
IMPLICIT NONE
!---------------------------------------------------------------------
INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
,IMS,IME,JMS,JME,KMS,KME &
,ITS,ITE,JTS,JTE,KTS,KTE,itimestep,NSTEPRA
INTEGER,INTENT(IN) :: julyr,julday
REAL ,INTENT(IN) :: DT,GMT,G
REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme):: &
THRATEN,THRATENLW,THRATENSW
REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme)::p8w,dz8w, &
rho_phy,p_phy,PI3D
REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme):: XLAND, TSK2D, &
ALBEDO,VEGFRA,SNOW
REAL, INTENT(IN), DIMENSION(its:ite, jts:jte):: GLAT,GLON
REAL, INTENT(INOUT), DIMENSION(ims:ime, jms:jme):: HTOP,HBOT,CUPPT
REAL, DIMENSION(ims:ime, jms:jme):: GLW,GSW
REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme):: QV,QL,T
! REAL, INTENT(IN), DIMENSION(37*kte) :: RAD1,RAD2,RAD3,RAD4
LOGICAL, INTENT(IN) :: gfdl_lw,gfdl_sw
REAL, DIMENSION(its:ite, kms:kme, jts:jte)::TFLIP,QFLIP,QLFLIP,PFLIP
REAL, DIMENSION(its:ite, kms:kme, jts:jte)::P8WFLIP,PHYD
REAL, DIMENSION(its:ite, kts:kte, jts:jte)::TENDS,TENDL
INTEGER :: IDAT(3),Jmonth,Jday
INTEGER :: I,J,K,KFLIP,IHRST
#ifndef TRIEDNTRUE
IF (gfdl_lw .and. gfdl_sw ) goto 100
! NEED HYDROSTATIC PRESSURE HERE (MONOTONIC CHANGE WITH HEIGHT)
DO J = jts,jte
DO I = its,ite
PHYD(I,KTS,J)=P8W(I,KTS,J)
ENDDO
ENDDO
DO K = KTS,KTE
DO J = jts,jte
DO I = its,ite
PHYD(I,K+1,J) = PHYD(I,K,J) - G*RHO_PHY(I,K,J)*DZ8W(I,K,J)
ENDDO
ENDDO
ENDDO
DO K = KMS,KME
KFLIP=KME+1-K
DO J = jts,jte
DO I = its,ite
P8WFLIP(I,K,J) = PHYD(I,KFLIP,J)
ENDDO
ENDDO
ENDDO
DO K = KTS,KTE
KFLIP=KTE+1-K
DO J = jts,jte
DO I = its,ite
TFLIP (I,K,J) = T(I,KFLIP,J)
QFLIP (I,K,J) = MAX(0.,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
QLFLIP(I,K,J) = QL(I,KFLIP,J)
! PFLIP (I,K,J) = P_PHY(I,KFLIP,J)
! USE MONOTONIC HYDROSTATIC PRESSURE INTERPOLATED TO MID-LEVEL
PFLIP (I,K,J) = 0.5*(P8WFLIP(I,K,J)+P8WFLIP(I,K+1,J))
ENDDO
ENDDO
ENDDO
CALL CAL_MON_DAY
(JULDAY,julyr,Jmonth,Jday)
IDAT(1) = Jmonth
IDAT(2) = Jday
IDAT(3) = julyr
IHRST = nint(GMT)
! CALL SOLARD(R1,IHRST,IDAT)
! CALL SOLARD(R1,IHRST,julday)
CALL RADTN
(DT,TFLIP,QFLIP,QLFLIP,PFLIP,P8WFLIP,XLAND,TSK2D, &
GLAT,GLON,HTOP,HBOT,ALBEDO,CUPPT, &
! IHE,IHW,ACFRCV,NCFRCV,ACFRST,NCFRST,VEGFRC, &
VEGFRA,SNOW,GLW,GSW, &
! IDAT,IHRST, &
IDAT,IHRST, &
! R1,NRADS,NRADL,RESTRT,NTSD,NPHS, &
NSTEPRA,NSTEPRA,itimestep,1, &
TENDS,TENDL, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
IF ( gfdl_lw ) then
DO J=JTS,JTE
DO K = KTS,KTE
KFLIP=KTE+1-K
DO I=ITS,ITE
THRATENLW(I,K,J)=TENDL(I,KFLIP,J)/PI3D(I,K,J)
THRATENSW(I,K,J)=TENDS(I,KFLIP,J)/PI3D(I,K,J)
THRATEN(I,K,J) =THRATEN(I,K,J) + THRATENLW(I,K,J)
ENDDO
ENDDO
ENDDO
ENDIF
! This assumed that longwave is called first in the radition_driver.
IF ( gfdl_sw ) then
DO J=JTS,JTE
DO K = KTS,KTE
KFLIP=KTE+1-K
DO I=ITS,ITE
THRATENSW(I,K,J)=TENDS(I,KFLIP,J)/PI3D(I,K,J)
ENDDO
ENDDO
ENDDO
ENDIF
100 IF ( gfdl_sw ) then
DO J=JTS,JTE
DO K = KTS,KTE
KFLIP=KTE+1-K
DO I=ITS,ITE
THRATEN(I,K,J) =THRATEN(I,K,J) + THRATENSW(I,K,J)
ENDDO
ENDDO
ENDDO
ENDIF
#endif
END SUBROUTINE ETARA
#ifndef TRIEDNTRUE
!----------------------------------------------------------------------
SUBROUTINE RADTN(DT,T,Q,CWM,PFLIP,P8WFLIP,XLAND,TSK2D, & 1,10
GLAT,GLON,HTOP,HBOT,ALB,CUPPT, &
! RAD1,RAD2,RAD3,RAD4, &
! TABLE1,TABLE2,TABLE3,EM1,EM1WDE,EM3, &
VEGFRC,SNO,GLW,GSW, &
! IDAT,LTOP,IHRST,PRGFDL, &
IDAT,IHRST, &
NRADS,NRADL,NTSD,NPHS, &
! SKO3R,AB15WD,SKC1R,SKO2D, &
TENDS,TENDL, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------------
! GLAT : geodetic latitude in radians of the mass points on the computational grid.
! CZEN : instantaneous cosine of the solar zenith angle.
! HTOP : (REAL) model layer number that is highest in the atmosphere
! in which convective cloud occurred since the previous call to the
! radiation driver.
! HBOT : (REAL) model layer number that is lowest in the atmosphere
! in which convective cloud occurred since the previous call to the
! radiation driver.
! ALB : is no longer used in the operational radiation. Prior to 24 July,
! ALB was the climatological albedo that was modified within RADTN to
! account for vegetation fraction and snow.
! CUPPT: accumulated convective precipitation (meters) since the
! last call to the radiation.
! THS : potential temperature of the ground surface.
! IHE and IHW are relative location indices needed to locate neighboring
! points on the Eta's Arakawa E grid since arrays are indexed locally on
! each MPI task rather than globally. IHE refers to the adjacent grid
! point (a V point) to the east of the mass point being considered. IHW
! is the adjacent grid point to the west of the given mass point.
! IRAD is a relic from older code that is no longer needed.
! ACFRCV : sum of the convective cloud fractions that were computed
! during each call to the radiation between calls to the subroutines that
! do the forecast output.
! NCFRCV : the total number of times in which the convective cloud
! fraction was computed to be greater than zero in the radiation between
! calls to the output routines. In the post-processor, ACFRCV is divided
! by NCFRCV to yield an average convective cloud fraction.
! ACFRST and NCFRST are the analogs for stratiform cloud cover.
! VEGFRC is the fraction of the gridbox with vegetation.
! LVL holds the number of model layers that lie below the ground surface
! at each point. Clearly for sigma coordinates LVL is zero everywhere.
! CTHK : an assumed maximum thickness of stratiform clouds currently set
! to 20000 Pascals. I think this is relevant for computing "low",
! "middle", and "high" cloud fractions which are post-processed but which
! do not feed back into the integration.
! IDAT : a 3-element integer array holding the month, day, and year,
! respectively, of the date for the start time of the free forecast.
! ABCFF : holds coefficients for various absorption bands. You can see
! where they are set in GFDLRD.F.
! LTOP : a 3-element integer array holding the model layer that is at or
! immediately below the specified pressure levels for the tops
! of "high" (15000 Pa), "middle" (35000 Pa), and "low" (64200 Pa)
! stratiform clouds. These are for the diagnostic cloud layers
! needed in the output but not in the integration.
! R1 : earth-sun distance in astronomical units.
! NRADS : integer number of fundamental timesteps (our smallest
! timestep, i.e., the one for inertial gravity wave adjustment)
! between updates of the shortwave tendencies. Currently we
! update the shortwave every hour.
! NRADL : integer number of fundamental timesteps between updates of
! the longwave tendencies. Currently we update the longwave
! every two hours.
! NTSD : integer counter of the fundamental timesteps that have
! elapsed since the start of the forecast.
!-----------------------------------------------------------------
! INTEGER, PARAMETER :: NL=81
INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
INTEGER, INTENT(IN) :: NRADS,NRADL,NTSD,NPHS
! LOGICAL, INTENT(IN) :: RESTRT
REAL , INTENT(IN) :: DT
! REAL , INTENT(IN), DIMENSION(37,NL) :: XDUO3N,XDO3N2,XDO3N3,XDO3N4
INTEGER, INTENT(IN), DIMENSION(3) :: IDAT
!----------------------------------------------------------------------
REAL, PARAMETER :: CAPA=0.28589641,RTD=57.2957795, WA=.10, &
WG=1.-WA,KSMUD=0
REAL, PARAMETER :: A1=610.78,A2=17.2693882,A3=273.16, &
A4=35.86, PQ0=379.90516,SNOALB=0.55
INTEGER :: LM1,LP1,LM
INTEGER, INTENT(IN) :: IHRST
! REAL, INTENT(IN), DIMENSION(NL) :: PRGFDL
!
REAL, PARAMETER :: SLPM=1.01325E5,EPSQ1=1.E-5,EPSQ=2.E-12, &
EPSO3=1.E-10,HPINC=1.E1, CLDRH0=0.80, &
TRESH=1.00,RNRM=1./(TRESH-CLDRH0), &
CLDRH2=0.90,TRESH2=1.00, &
RNRM2=1./(TRESH2-CLDRH2), CLAPSE=-0.0005, &
CLPSE=-0.0006,DCLPS=-0.0001, CM1=2937.4, &
CM2=4.9283,CM3=23.5518,EPS=0.622, &
PBOT=10000.0, STBOL=5.67E-8, &
PI2=2.*3.14159265,RLAG=14.8125
!
INTEGER, PARAMETER :: NB=12
INTEGER, PARAMETER :: K15=SELECTED_REAL_KIND(15)
REAL (KIND=K15) :: DDX,EEX,PROD
! REAL :: PROD,DDX,EEX
! REAL, INTENT(IN) :: SKO3R,AB15WD,SKC1R,SKO2D
!-----------------------------------------------------------------------
LOGICAL :: SHORT,LONG
LOGICAL :: BCLD(its:ite),BTEMP1(its:ite)
LOGICAL :: BITX,BITY,BITZ,BITW,BIT1,BIT2,BITC,BITS,BITCP1,BITSP1
LOGICAL :: CNCLD
!-----------------------------------------------------------------------
REAL, INTENT(IN), DIMENSION(ims:ime,jms:jme) :: XLAND,TSK2D
REAL, INTENT(IN), DIMENSION(its:ite, kms:kme, jts:jte):: Q,CWM,T
REAL, INTENT(IN), DIMENSION(its:ite, kms:kme, jts:jte):: PFLIP,P8WFLIP
! REAL, INTENT(IN), DIMENSION(28,180) :: TABLE1,TABLE2,TABLE3,EM3,EM1,EM1WDE
REAL, INTENT(OUT), DIMENSION(ims:ime, jms:jme):: GLW,GSW
! REAL, INTENT(IN), DIMENSION(kms:kme) :: ETAD
! REAL, INTENT(IN), DIMENSION(kms:kme) :: AETA
!-----------------------------------------------------------------------
REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: HTOP,HBOT
REAL, INTENT(IN ), DIMENSION(ims:ime,jms:jme) :: ALB,SNO
REAL, INTENT(IN ), DIMENSION(its:ite,jts:jte) :: GLAT,GLON
!-----------------------------------------------------------------------
REAL, DIMENSION(its:ite,jts:jte) :: CZEN
REAL, DIMENSION(its:ite,jts:jte) :: CZMEAN,SIGT4
INTEGER, DIMENSION(its:ite, jts:jte):: LMH
REAL, DIMENSION(its:ite, jts:jte):: U00
!-----------------------------------------------------------------------
REAL, DIMENSION(2*kte) :: UL
!-----------------------------------------------------------------------
REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: CUPPT
REAL, DIMENSION(its:ite,jts:jte) :: CFRACL,CFRACM,CFRACH
! REAL, DIMENSION(37*kte) :: RAD1,RAD2,RAD3,RAD4
!-----------------------------------------------------------------------
! INTEGER,INTENT(IN), DIMENSION(jms:jme) :: IHE,IHW
!-----------------------------------------------------------------------
! REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: ACFRCV,ACFRST
! INTEGER, INTENT(INOUT), DIMENSION(ims:ime,jms:jme) :: NCFRCV,NCFRST
!----------------------------------------------------------------------
REAL, DIMENSION(its:ite,jts:jte) :: RLWIN,RLWOUT,RLWTOA
!----------------------------------------------------------------------
REAL, INTENT(IN), DIMENSION(ims:ime,jms:jme) :: VEGFRC
REAL, INTENT(INOUT),DIMENSION(its:ite,kts:kte,jts:jte) :: TENDS,TENDL
REAL, DIMENSION(its:ite,jts:jte) :: RSWIN,RSWOUT,RSWTOA
REAL, DIMENSION(its:ite,kts:kte,jts:jte):: RSWTT,RLWTT
!-----------------------------------------------------------------------
REAL :: CTHK(3)
DATA CTHK/20000.0,20000.0,20000.0/
! INTEGER,INTENT(IN) :: LTOP(3)
REAL :: PTOPC(4)
REAL, DIMENSION(9) :: CC,PPT
!-----------------------------------------------------------------------
REAL :: ABCFF(NB)
INTEGER,DIMENSION(its:ite,jts:jte) :: LVL
REAL, DIMENSION(its:ite, jts:jte):: PDSL,FNE,FSE,TL
REAL, DIMENSION( 0:kte) :: CLDAMT
REAL, DIMENSION(its:ite,3):: CLDCFR
INTEGER, DIMENSION(its:ite,3):: MBOT,MTOP
REAL, DIMENSION(its:ite) :: PSFC,TSKN,ALBEDO,XLAT,COSZ, &
SLMSK,CV,SV,FLWUP, &
FSWDN,FSWUP,FSWDNS,FSWUPS,FLWDNS, &
FLWUPS
INTEGER, DIMENSION(its:ite) :: ICVB,ICVT
REAL, DIMENSION(its:ite,kts:kte) :: PMID,TMID
REAL, DIMENSION(its:ite,kts:kte) :: QMID,THMID,OZN,POZN
REAL, DIMENSION(its:ite,jts:jte) :: TOT
REAL, DIMENSION(its:ite,kts:kte+1) :: PINT,EMIS,CAMT
INTEGER,DIMENSION(its:ite,kts:kte+1) :: ITYP,KBTM,KTOP
INTEGER,DIMENSION(its:ite) :: NCLDS,KCLD
REAL, DIMENSION(its:ite) :: CSTR,TAUC,TAUDAR
REAL, DIMENSION(its:ite,NB,kts:kte+1) ::RRCL,TTCL
INTEGER, DIMENSION(its:ite,kts:kte):: IW
REAL, DIMENSION(its:ite,kts:kte):: CCR,CSMID,WMID,HMID,CCMID
REAL, DIMENSION(its:ite) :: BMID,UMID
REAL :: PLOMD,PMDHI,PHITP,P400,PLBTM
INTEGER :: NFILE
REAL :: UTIM,CLSTP,TIME,DAYI,HOUR,ADDL,RANG,RSIN1,RCOS1,RCOS2
REAL :: TIMES,EXNER,APES,SNOFAC,US,CCLIMIT,CLIMIT,HH,TKL,QKL
REAL :: CWMKL,TMT15,AI,BI,PP,QW,P1,CC2,CC1,PMOD,CLPFIL,DTHDP,DDP
REAL :: ARG,RQKL,FIW,U00KL,QI,FIQ,TMT0,P2,QINT,QC,CLDMAX
REAL :: CL1,CL2,CR1,DPCL,QSUM,PRS1,PRS2,DELP,TCLD,DD,EE,AA,FF
REAL :: BB,GG,DENOM,FCTRA,FCTRB,PDSLIJ,CFRAVG,SNOMM
INTEGER :: I,J,MYJS,MYJE,MYIS,MYIE,NTSPH,NRADPP,ITIMSW,ITIMLW,JD,II
INTEGER :: L,N,LML,LVLIJ,IR,KNTLYR,LL,NC,L400,NMOD,LTROP,IWKL
INTEGER :: NLVL,MALVL,LLTOP,LLBOT,KBT2,KTH1,KBT1,KTH2,KTOP1
INTEGER :: NBAND,NCLD,LBASE,NKTP,NBTM,KS,MYJS1,MYJS2,MYJE2,MYJE1
! REAL,DIMENSION(5040):: T1,T2,T4,EM1V,EM1VW,EM3V
! EQUIVALENCE (EM1V(1),EM1(1,1)),(EM1VW(1),EM1WDE(1,1))
! EQUIVALENCE (EM3V(1),EM3(1,1))
! EQUIVALENCE (T1(1),TABLE1(1,1)),(T2(1),TABLE2(1,1)), &
! (T4(1),TABLE3(1,1))
DATA PLOMD/64200./,PMDHI/35000./,PHITP/15000./,P400/40000./, &
PLBTM/105000./
DATA NFILE/14/
DATA CC/0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8/
DATA PPT/.14,.31,.70,1.6,3.4,7.7,17.,38.,85./
DATA ABCFF/2*4.0E-5,.002,.035,.377,1.95,9.40,44.6,190.,989.,2706.,39011./
!----------------------------------------------------------------------
MYJS=jts
MYJE=jte
MYIS=its
MYIE=ite
MYJS1=jts !????
MYJE1=jte
MYJS2=jts
MYJE2=jte
LM=kte
LM1=LM-1
LP1=LM+1
UTIM=1.
CNCLD=.TRUE.
do j = jts,jte
do i = its,ite
LMH(i,j) = kme-1
LVL(i,j) = 0
enddo
enddo
do j = jts,jte
do i = its,ite
U00(I,J)=(2.-XLAND(i,j))*0.75+(XLAND(i,j) -1.)*0.80
enddo
enddo
DO L=1,2*LM
IF(L.GE.LM-10.AND.L.LE.LM)THEN
UL(L)=0.1*FLOAT(L-LM+10)
ELSE
UL(L)=0.
ENDIF
ENDDO
!***
!*** ASSIGN THE PRESSURES FOR CLOUD DOMAIN BOUNDARIES
!***
PTOPC(1)=PLBTM
PTOPC(2)=PLOMD
PTOPC(3)=PMDHI
PTOPC(4)=PHITP
!***
!*** FIND THE 'SEA LEVEL PRESSURE'.
!***
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! PDSL(I,J)=PD(I,J)
! ENDDO
! ENDDO
!**********************************************************************
!*** THE FOLLOWING CODE IS EXECUTED EACH TIME THE RADIATION IS CALLED.
!**********************************************************************
!----------------------CONVECTION--------------------------------------
! NRADPP IS THE NUMBER OF TIME STEPS TO ACCUMULATE CONVECTIVE PRECIP
! FOR RADIATION
! NOTE: THIS WILL NOT WORK IF NRADS AND NRADL ARE DIFFERENT UNLESS
! THEY ARE INTEGER MULTIPLES OF EACH OTHER
! CLSTP IS THE NUMBER OF HOURS OF THE ACCUMULATION PERIOD
!
NTSPH=NINT(3600./DT)
NRADPP=MIN(NRADS,NRADL)
CLSTP=1.0*NRADPP/NTSPH
!----------------------CONVECTION--------------------------------------
!***
!*** STATE WHETHER THE SHORT OR LONGWAVE COMPUTATIONS ARE TO BE DONE.
!***
!SH SHORT=.FALSE.
!SH LONG=.FALSE.
!SH IF(MOD(NTSD,NRADS).EQ.1.OR.RESTRT)SHORT=.TRUE.
!SH IF(MOD(NTSD,NRADL).EQ.1.OR.RESTRT)LONG=.TRUE.
!SH IF(NTSD .eq. 1 .or. MOD((NTSD),NRADS).EQ.0.)SHORT=.TRUE.
!SH IF(NTSD .eq. 1 .or. MOD((NTSD),NRADL).EQ.0.)LONG=.TRUE.
SHORT=.TRUE.
LONG=.TRUE.
ITIMSW=0
ITIMLW=0
IF(SHORT)ITIMSW=1
IF(LONG) ITIMLW=1
!***
!*** FIND THE MEAN COSINE OF THE SOLAR ZENITH ANGLE
!*** BETWEEN THE CURRENT TIME AND THE NEXT TIME RADIATION IS
!*** CALLED. ONLY AVERAGE IF THE SUN IS ABOVE THE HORIZON.
!***
TIME=(NTSD-1)*DT
! CALL ZENITH(TIME,DAYI,HOUR)
CALL ZENITH
(TIME,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, &
MYIS,MYIE,MYJS,MYJE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
JD=INT(DAYI+0.50)
ADDL=0.
IF(MOD(IDAT(3),4).EQ.0)ADDL=1.
RANG=PI2*(DAYI-RLAG)/(365.25+ADDL)
RSIN1=SIN(RANG)
RCOS1=COS(RANG)
RCOS2=COS(2.*RANG)
IF(SHORT)THEN
DO J=MYJS,MYJE
DO I=MYIS,MYIE
CZMEAN(I,J)=0.
TOT(I,J)=0.
ENDDO
ENDDO
!
DO II=0,NRADS,NPHS
TIMES=(NTSD-1)*DT+II*DT
! CALL ZENITH(TIMES,DAYI,HOUR)
CALL ZENITH
(TIMES,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, &
MYIS,MYIE,MYJS,MYJE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
DO J=MYJS,MYJE
DO I=MYIS,MYIE
IF(CZEN(I,J).GT.0.)THEN
CZMEAN(I,J)=CZMEAN(I,J)+CZEN(I,J)
TOT(I,J)=TOT(I,J)+1.
ENDIF
ENDDO
ENDDO
ENDDO
DO J=MYJS,MYJE
DO I=MYIS,MYIE
IF(TOT(I,J).GT.0.)CZMEAN(I,J)=CZMEAN(I,J)/TOT(I,J)
ENDDO
ENDDO
ENDIF
!
!********************************************************************
!*** THIS IS THE BEGINNING OF THE PRIMARY LOOP THROUGH THE DOMAIN
!********************************************************************
! *********************
DO 700 J = MYJS, MYJE
! *********************
!
DO 125 L=1,LM
DO I=MYIS,MYIE
! IR=IRAD(I)
TMID(I,L)=T(I,1,J)
QMID(I,L)=EPSQ
CSMID(I,L)=0.
WMID(I,L)=0.
CCMID(I,L)=0.
IW(I,L)=0.
CCR(I,L)=0.
HMID(I,L)=0.
OZN(I,L)=EPSO3
TENDS(I,L,J)=0.
TENDL(I,L,J)=0.
ENDDO
125 CONTINUE
!
DO 140 N=1,3
DO I=MYIS,MYIE
CLDCFR(I,N)=0.
MTOP(I,N)=0
MBOT(I,N)=0
ENDDO
140 CONTINUE
!***
!*** FILL IN WORKING ARRAYS WHERE VALUES AT L=LM ARE THOSE THAT
!*** ARE ACTUALLY AT ETA LEVEL L=LMH.
!***
DO 200 I=MYIS,MYIE
! IR=IRAD(I)
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!tlb BMID(I)=HBM2(IR,J)
! BMID(I)=HBM2(I,J)
UMID(I)=U00(I,J)
!
DO L=1,LML
! PMID(I,L+LVLIJ)=AETA(L)*PDSL(I,J)+PT
PMID(I,L+LVLIJ)=PFLIP(I,L,J)
! PINT(I,L+LVLIJ+1)=ETAD(L+1)*PDSL(I,J)+PT
PINT(I,L+LVLIJ+1)=P8WFLIP(I,L+1,J)
EXNER=(1.E5/PMID(I,L+LVLIJ))**CAPA
TMID(I,L+LVLIJ)=T(I,L,J)
THMID(I,L+LVLIJ)=T(I,L,J)*EXNER
QMID(I,L+LVLIJ)=Q(I,L,J)
WMID(I,L+LVLIJ)=CWM(I,L,J)
HMID(I,L+LVLIJ)=1.
ENDDO
!***
!*** FILL IN ARTIFICIAL VALUES ABOVE THE TOP OF THE DOMAIN.
!*** PRESSURE DEPTHS OF THESE LAYERS IS 1 HPA.
!*** TEMPERATURES ABOVE ARE ALREADY ISOTHERMAL WITH (TRUE) LAYER 1.
!***
IF(LVLIJ.GT.0)THEN
KNTLYR=0
!
DO L=LVLIJ,1,-1
KNTLYR=KNTLYR+1
! PMID(I,L)=PT-REAL(2*KNTLYR-1)*0.5*HPINC
PMID(I,L)=P8WFLIP(I,1,J)-REAL(2*KNTLYR-1)*0.5*HPINC
PINT(I,L+1)=PMID(I,L)+0.5*HPINC
EXNER=(1.E5/PMID(I,L))**CAPA
THMID(I,L)=TMID(I,L)*EXNER
ENDDO
ENDIF
!
IF(LVLIJ.EQ.0) THEN
! PINT(I,1)=PT
PINT(I,1)=P8WFLIP(I,1,J)
ELSE
PINT(I,1)=PMID(I,1)-0.5*HPINC
ENDIF
200 CONTINUE
!***
!*** FILL IN THE SURFACE PRESSURE, SKIN TEMPERATURE, GEODETIC LATITUDE,
!*** ZENITH ANGLE, SEA MASK, AND ALBEDO. THE SKIN TEMPERATURE IS
!*** NEGATIVE OVER WATER.
!***
DO 250 I=MYIS,MYIE
! PSFC(I)=PD(I,J)+PT
PSFC(I)=P8WFLIP(I,kme,J)
APES=(PSFC(I)*1.E-5)**CAPA
! TSKN(I)=THS(I,J)*APES*(1.-2.*SM(I,J))
IF ((XLAND(I,J)-1.5) .gt. 0.) then
TSKN(I)=-TSK2D(I,J)
ELSE
TSKN(I)=TSK2D(I,J)
ENDIF
! TSKN(I)=THS(I,J)*APES*(1.-2.*(XLAND(I,J)-1.))
! SLMSK(I)=SM(I,J)
SLMSK(I)=XLAND(I,J)-1.
!
! SNO(I,J)=AMAX1(SNO(I,J),0.)
SNOMM=AMAX1(SNO(I,J),0.)
SNOFAC=AMIN1(SNOMM/0.02, 1.0)
ALBEDO(I)=ALB(I,J)+(1.0-0.01*VEGFRC(I,J))*SNOFAC*(SNOALB-ALB(I,J))
!
XLAT(I)=GLAT(I,J)*RTD
COSZ(I)=CZMEAN(I,J)
250 CONTINUE
!-----------------------------------------------------------------------
!*******************STRATIFORM CLOUD SECTION***************************
!-----------------------------------------------------------------------
! CALCULATE STRATIFORM CLOUD COVERAGE AT EACH MODEL GRID POINT WHICH
! WILL BE USED IN THE MODEL RADIATION PARAMETERIZATION SCHEME.
!-----------------------------------------------------------------------
US=1.
CCLIMIT=1.0E-3
CLIMIT =1.0E-20
!------------------QW, QI AND QINT--------------------------------------
DO 280 I=MYIS,MYIE
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!
DO 275 L=1,LML
LL=L+LVLIJ
! HH=HMID(I,LL)*BMID(I)
HH=HMID(I,LL)
TKL=TMID(I,LL)
QKL=QMID(I,LL)
CWMKL=WMID(I,LL)
TMT0=(TKL-273.16)*HH
TMT15=AMIN1(TMT0,-15.)*HH
AI=0.008855
BI=1.
!
IF(TMT0.LT.-20.)THEN
AI=0.007225
BI=0.9674
ENDIF
!
PP=PMID(I,LL)
QW=HH*PQ0/PP*EXP(HH*A2*(TKL-A3)/(TKL-A4))
QI=QW*(BI+AI*AMIN1(TMT0,0.))
QINT=QW*(1.-0.00032*TMT15*(TMT15+15.))
IF(TMT0.LE.-40.) QINT=QI
!-------------------ICE-WATER ID NUMBER IW------------------------------
U00KL=UMID(I)+UL(L)*(0.95-UMID(I))*UTIM
IF(TMT0.LT.-15.0)THEN
FIQ=QKL-U00KL*QI
IF(FIQ.GT.0..OR.CWMKL.GT.CLIMIT)THEN
IW(I,LL)=1
ELSE
IW(I,LL)=0
ENDIF
ENDIF
!
IF(TMT0.GE.0.)THEN
IW(I,LL)=0
ENDIF
!
IF(TMT0.LT.0.0.AND.TMT0.GE.-15.0)THEN
IW(I,LL)=0
IF(IW(I,LL-1).EQ.1.AND.CWMKL.GT.CLIMIT) IW(I,LL)=1
ENDIF
!
IWKL=IW(I,LL)
!
!----------------THE SATURATION SPECIFIC HUMIDITY------------------------
!
FIW=FLOAT(IWKL)
QC=(1.-FIW)*QINT+FIW*QI
!
!----------------THE RELATIVE HUMIDITY----------------------------------
!
IF(QC.LE.EPSQ1.OR.QKL.LE.EPSQ1)THEN
RQKL=0.
ELSE
RQKL=QKL/QC
ENDIF
!
!----------------CLOUD COVER RATIO CCR----------------------------------
!
IF(RQKL.GE.0.9999)THEN
CCR(I,LL)=AMIN1(US,RQKL)
ELSE
ARG=-1000.*CWMKL/(US-RQKL)
ARG=AMAX1(ARG,-25.)
CCR(I,LL)= RQKL*(1.-EXP(ARG))
ENDIF
CSMID(I,LL)=AMIN1(US,CCR(I,LL))
!----------------------------------------------------------------------
275 CONTINUE
280 CONTINUE
!----------------------------------------------------------------------
!**********************************************************************
! NOW CHECK THE CLOUDS PRODUCED ABOVE TO MAKE SURE THEY ARE GOOD
! ENOUGH FOR RADIATION CALCULATIONS
!**********************************************************************
!***
!*** NO STRATIFORM CLOUDS FOR THIS TYPE
!***
DO 350 I=MYIS,MYIE
!
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!***
!*** ZERO OUT CLDAMT IF LAND AND BELOW PBOT ABOVE GROUND
!***
! IF(SM(I,J).LT.0.5)THEN
IF((XLAND(I,J)-1.) .LT. 0.5)THEN
DO L=1,LML
LL=LML-L+1+LVLIJ
DDP=PSFC(I)-PMID(I,LL)
IF(DDP.GE.PBOT) GO TO 290
CSMID(I,LL)=0.
ENDDO
290 CONTINUE
ENDIF
!***
!*** CHECK FOR OCEAN STRATUS (LOW CLOUD)
!*** LOOK ONLY OVER OCEAN AND ONLY IF AN INVERSION (DTHDP.LE.-0.05)
!*** IS PRESENT WITH AT LEAST 2 CLOUD FREE LAYERS ABOVE IT
!***
! IF(SM(I,J).GT.0.5)THEN
IF((XLAND(I,J)-1.) .GT. 0.5)THEN
!
!*** FIND BASE OF INVERSION
!
LBASE=LM
DO L=1,LML-1
LL=LML-L+1+LVLIJ
DTHDP=(THMID(I,LL-1)-THMID(I,LL)) &
/(PMID(I,LL-1)-PMID(I,LL))
IF(DTHDP.LE.CLAPSE)THEN
LBASE=LL
GO TO 300
ENDIF
ENDDO
300 CONTINUE
!
!*** CHECK 2 LAYERS ABOVE LBASE FOR DRYNESS
!
IF(CSMID(I,LBASE-1).LE.0..AND.CSMID(I,LBASE-2).LE.0. &
.AND.LBASE.LT.LM)THEN
IF(DTHDP.GT.CLPSE)THEN
CLPFIL=1.-((CLPSE-DTHDP)/DCLPS)
ELSE
CLPFIL=1.
ENDIF
!
DO L=1,LML
LL=LML-L+1+LVLIJ
DDP=PSFC(I)-PMID(I,LL)
IF(DDP.GE.PBOT) GO TO 310
CSMID(I,LL)=CSMID(I,LL)*CLPFIL
ENDDO
310 CONTINUE
!
!*** IF NO INVERSION OR IF CLDS EXIST IN EITHER OF THE 2 LAYERS ABOVE
!*** INVERSION, ZERO OUT CLOUD BELOW PBOT
!
ELSE
DO L=1,LML
LL=LML-L+1+LVLIJ
DDP=PSFC(I)-PMID(I,LL)
IF(DDP.GE.PBOT) GO TO 320
CSMID(I,LL)=0.
ENDDO
320 CONTINUE
!
ENDIF
!------------
ENDIF
!------------
!***
!*** REMOVE HIGH CLOUDS ABOVE THE TROPOPAUSE
!***
L400=LM
DO L=1,LML
LL=LML-L+1+LVLIJ
IF(PMID(I,LL).LE.40000.0)THEN
L400=LL
GO TO 330
ENDIF
ENDDO
330 CONTINUE
!
LTROP=LM
DO LL=L400,2,-1
DTHDP=(THMID(I,LL-1)-THMID(I,LL)) &
/(PMID(I,LL-1)-PMID(I,LL))
!
IF(DTHDP.LT.-0.0025.OR.QMID(I,LL).LE.EPSQ1)THEN
LTROP=LL
GOTO 340
ENDIF
ENDDO
340 IF(LTROP.LT.LM)THEN
DO LL=LTROP,1,-1
CSMID(I,LL)=0.
ENDDO
ENDIF
350 CONTINUE
!
!*********************************************************************
!*****************END OF STRATIFORM CLOUD SECTION*****************
!------------------------CONVECTION--------------------------------
!***
!*** CONVECTIVE CLOUD SECTION
!***
!*** THIS PART WAS MODIFIED TO COMPUTE CONVECTIVE CLOUDS AT EACH
!*** MODEL LAYER BASED ON CONVECTIVE PRECIPITATION RATES. CURRENTLY,
!*** CLOUDS ARE SET TO 0.75*CV(I) BELOW 400MB
!*** AND 0.90*CV(I) ABOVE 400MB TO ACCOUNT FOR CIRRUS CAP
!*** Q.ZHAO 95-3-22
!
!***
!*** NON-PRECIPITATING CLOUD FRACTION OF 20 PERCENT IS ADDED AT
!*** AT POINTS WHERE THE SHALLOW AND DEEP CONVECTIONS ACCUR.
!*** Q. ZHAO 97-5-2
!
! COMPUTE THE CONVECTIVE CLOUD COVER FOR RADIATION
!
!-----------------------------------------------------------------
IF(CNCLD)THEN
!-----------------------------------------------------------------
DO 375 I=MYIS,MYIE
IF(HBOT(I,J)-HTOP(I,J).GT.1.0)THEN
! IF(HTOP(I,J).LT.HBOT(I,J))THEN
SV(I)=0.0
ELSE
SV(I)=0.0
ENDIF
!
PMOD=CUPPT(I,J)*24.0*1000.0/CLSTP
NMOD=0
!
DO NC=1,9
IF(PMOD.GT.PPT(NC)) NMOD=NC
ENDDO
!
!*** CLOUD TOPS AND BOTTOMS COME FROM CUCNVC
!*** ADD LVL TO BE CONSISTENT WITH OTHER WORKING ARRAYS
!
IF(NMOD.EQ.0)THEN
CV(I)=0.
ELSEIF(NMOD.EQ.9)THEN
CV(I)=CC(9)
ELSE
CC1=CC(NMOD)
CC2=CC(NMOD+1)
P1=PPT(NMOD)
P2=PPT(NMOD+1)
CV(I)=CC1+(CC2-CC1)*(PMOD-P1)/(P2-P1)
ENDIF
!
CV(I)=AMAX1(SV(I),CV(I))
CV(I)=AMIN1(1.0,CV(I))
!
IF(CV(I).EQ.0.0)THEN
ICVT(I)=0
ICVB(I)=0
ELSE
ICVT(I)=INT(HTOP(I,J)+0.50)+LVL(I,J)
ICVB(I)=INT(HBOT(I,J)+0.50)+LVL(I,J)
ENDIF
375 CONTINUE
!***
!*** MAKE SURE CLOUDS ARE DEEP ENOUGH
!***
DO I=MYIS,MYIE
BCLD(I)=CV(I).GT.0..AND. (ICVB(I)-ICVT(I)).GE.1
BTEMP1(I)=BCLD(I)
ENDDO
!***
!*** COMPUTE CONVECTIVE CLOUD FRACTION
!***
DO 390 I=MYIS,MYIE
IF(BCLD(I)) THEN
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!
DO L=1,LML
LL=L+LVLIJ
IF(LL.GT.ICVB(I).OR.LL.LT.ICVT(I))THEN
CCMID(I,LL)=0.
ELSE
CCMID(I,LL)=CV(I)
ENDIF
CCMID(I,LL)=AMIN1(1.0,CCMID(I,LL))
ENDDO
ENDIF
390 CONTINUE
!***
!*** REMOVE HIGH CLOUDS ABOVE THE TROPOPAUSE
!***
L400=LM
DO 425 I=MYIS,MYIE
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!
DO L = 1, LML
LL=LML-L+1+LVLIJ
IF(PMID(I,LL).LE.40000.0)THEN
L400=LL
GO TO 400
ENDIF
ENDDO
400 CONTINUE
!
LTROP=LM
DO LL=L400,2,-1
DTHDP=(THMID(I,LL-1)-THMID(I,LL))/(PMID(I,LL-1)-PMID(I,LL))
IF(DTHDP.LT.-0.0025.OR.QMID(I,LL).LE.EPSQ1)THEN
LTROP=LL
GOTO 410
ENDIF
ENDDO
410 IF(LTROP.LT.LM)THEN
DO LL=LTROP,1,-1
CCMID(I,LL)=0.
ENDDO
ENDIF
425 CONTINUE
!***
!-----------------------------------------------------------------
ENDIF
!------------------------CONVECTION--------------------------------
!*****************END OF CONVECTIVE CLOUD SECTION*****************
!*********************************************************************
!***
!*** DETERMINE THE FRACTIONAL CLOUD COVERAGE FOR HIGH, MID
!*** AND LOW OF CLOUDS FROM THE CLOUD COVERAGE AT EACH LEVEL
!***
!*** NOTE: THIS IS FOR DIAGNOSTICS ONLY!!!
!***
!***
! DO 500 I=MYIS,MYIE
!!
! CSTR(I)=0.0
!!
! DO L=0,LM
! CLDAMT(L)=0.
! ENDDO
!!
!!*** NOW GOES LOW, MIDDLE, HIGH
!!
! DO 480 NLVL=1,3
! CLDMAX=0.
! MALVL=LM
! LLTOP=LTOP(NLVL)+LVL(I,J)
!!***
!!*** GO TO THE NEXT CLOUD LAYER IF THE TOP OF THE CLOUD-TYPE IN
!!*** QUESTION IS BELOW GROUND OR IS IN THE LOWEST LAYER ABOVE GROUND.
!!***
! IF(LLTOP.GE.LM)GO TO 480
!!
! IF(NLVL.GT.1)THEN
! LLBOT=LTOP(NLVL-1)-1+LVL(I,J)
! LLBOT=MIN(LLBOT,LM1)
! ELSE
! LLBOT=LM1
! ENDIF
!!
! DO 435 L=LLTOP,LLBOT
! CLDAMT(L)=AMAX1(CSMID(I,L),CCMID(I,L))
! IF(CLDAMT(L).GT.CLDMAX)THEN
! MALVL=L
! CLDMAX=CLDAMT(L)
! ENDIF
! 435 CONTINUE
!!*********************************************************************
!! NOW, CALCULATE THE TOTAL CLOUD FRACTION IN THIS PRESSURE DOMAIN
!! USING THE METHOD DEVELOPED BY Y.H., K.A.C. AND A.K. (NOV., 1992).
!! IN THIS METHOD, IT IS ASSUMED THAT SEPERATED CLOUD LAYERS ARE
!! RADOMLY OVERLAPPED AND ADJACENT CLOUD LAYERS ARE MAXIMUM OVERLAPPED.
!! VERTICAL LOCATION OF EACH TYPE OF CLOUD IS DETERMINED BY THE THICKEST
!! CONTINUING CLOUD LAYERS IN THE DOMAIN.
!!*********************************************************************
! CL1=0.0
! CL2=0.0
! KBT1=LLBOT
! KBT2=LLBOT
! KTH1=0
! KTH2=0
!!
! DO 450 LL=LLTOP,LLBOT
! L=LLBOT-LL+LLTOP
! BIT1=.FALSE.
! CR1=CLDAMT(L)
! BITX=(PINT(I,L).GE.PTOPC(NLVL+1)).AND. &
! (PINT(I,L).LT.PTOPC(NLVL)).AND. &
! (CLDAMT(L).GT.0.0)
! BIT1=BIT1.OR.BITX
! IF(.NOT.BIT1)GO TO 450
!!***
!!*** BITY=T: FIRST CLOUD LAYER; BITZ=T:CONSECUTIVE CLOUD LAYER
!!*** NOTE: WE ASSUME THAT THE THICKNESS OF EACH CLOUD LAYER IN THE
!!*** DOMAIN IS LESS THAN 200 MB TO AVOID TOO MUCH COOLING OR
!!*** HEATING. SO WE SET CTHK(NLVL)=200*E2. BUT THIS LIMIT MAY
!!*** WORK WELL FOR CONVECTIVE CLOUDS. MODIFICATION MAY BE
!!*** NEEDED IN THE FUTURE.
!!***
! BITY=BITX.AND.(KTH2.LE.0)
! BITZ=BITX.AND.(KTH2.GT.0)
!!
! IF(BITY)THEN
! KBT2=L
! KTH2=1
! ENDIF
!!
! IF(BITZ)THEN
! KTOP1=KBT2-KTH2+1
! DPCL=PMID(I,KBT2)-PMID(I,KTOP1)
! IF(DPCL.LT.CTHK(NLVL))THEN
! KTH2=KTH2+1
! ELSE
! KBT2=KBT2-1
! ENDIF
! ENDIF
! IF(BITX)CL2=AMAX1(CL2,CR1)
!!***
!!*** AT THE DOMAIN BOUNDARY OR SEPARATED CLD LAYERS, RANDOM OVERLAP.
!!*** CHOOSE THE THICKEST OR THE LARGEST FRACTION AMT AS THE CLD
!!*** LAYER IN THAT DOMAIN.
!!***
! BIT2=.FALSE.
! BITY=BITX.AND.(CLDAMT(L-1).LE.0.0.OR. &
! PINT(I,L-1).LT.PTOPC(NLVL+1))
! BITZ=BITY.AND.CL1.GT.0.0
! BITW=BITY.AND.CL1.LE.0.0
! BIT2=BIT2.OR.BITY
! IF(.NOT.BIT2)GO TO 450
!!
! IF(BITZ)THEN
! KBT1=INT((CL1*KBT1+CL2*KBT2)/(CL1+CL2))
! KTH1=INT((CL1*KTH1+CL2*KTH2)/(CL1+CL2))+1
! CL1=CL1+CL2-CL1*CL2
! ENDIF
!!
! IF(BITW)THEN
! KBT1=KBT2
! KTH1=KTH2
! CL1=CL2
! ENDIF
!!
! IF(BITY)THEN
! KBT2=LLBOT
! KTH2=0
! CL2=0.0
! ENDIF
! 450 CONTINUE
!!***
! CLDCFR(I,NLVL)=AMIN1(1.0,CL1)
! MTOP(I,NLVL)=MIN(KBT1,KBT1-KTH1+1)
! MBOT(I,NLVL)=KBT1
! 480 CONTINUE
! 500 CONTINUE
!***
!*** SET THE UN-NEEDED TAUDAR TO ONE
!***
DO I=MYIS,MYIE
TAUDAR(I)=1.0
ENDDO
!----------------------------------------------------------------------
! NOW, CALCULATE THE CLOUD RADIATIVE PROPERTIES AFTER DAVIS (1982),
! HARSHVARDHAN ET AL (1987) AND Y.H., K.A.C. AND A.K. (1993).
!
! UPDATE: THE FOLLOWING PARTS ARE MODIFIED, AFTER Y.T.H. (1994), TO
! CALCULATE THE RADIATIVE PROPERTIES OF CLOUDS ON EACH MODEL
! LAYER. BOTH CONVECTIVE AND STRATIFORM CLOUDS ARE USED
! IN THIS CALCULATIONS.
!
! QINGYUN ZHAO 95-3-22
!
!----------------------------------------------------------------------
!
!***
!*** INITIALIZE ARRAYS FOR USES LATER
!***
DO 600 I=MYIS,MYIE
LML=LMH(I,J)
LVLIJ=LVL(I,J)
!
!***
!*** NOTE: LAYER=1 IS THE SURFACE, AND LAYER=2 IS THE FIRST CLOUD
!*** LAYER ABOVE THE SURFACE AND SO ON.
!***
EMIS(I,1)=1.0
KTOP(I,1)=LP1
KBTM(I,1)=LP1
CAMT(I,1)=1.0
ITYP(I,1)=0
KCLD(I)=2
!
DO NBAND=1,NB
RRCL(I,NBAND,1)=0.0
TTCL(I,NBAND,1)=1.0
ENDDO
!
DO 510 L=2,LP1
ITYP(I,L)=0
CAMT(I,L)=0.0
KTOP(I,L)=1
KBTM(I,L)=1
EMIS(I,L)=0.0
!
DO NBAND=1,NB
RRCL(I,NBAND,L)=0.0
TTCL(I,NBAND,L)=1.0
ENDDO
510 CONTINUE
!***
!*** NOW CALCULATE THE AMOUNT, TOP, BOTTOM AND TYPE OF EACH CLOUD LAYER
!*** CLOUD TYPE=1: STRATIFORM CLOUD
!*** TYPE=2: CONVECTIVE CLOUD
!*** WHEN BOTH CONVECTIVE AND STRATIFORM CLOUDS EXIST AT THE SAME POINT,
!*** SELECT CONVECTIVE CLOUD (TYPE=2),IN OTHER WORDS, CONVECTIVE CLOUDS
!*** HAVE THE HIGHER PRIORITY THAN STRATIFORM CLOUDS.
!*** CLOUD LAYERS ARE SEPARATED BY:
!*** 1. NO-CLOUD LAYER
!*** 2. DIFFERENT CLOUD TYPE
!*** NOTE: THERE IS ONLY ONE CONVECTIVE CLOUD LAYER IN ONE COLUMN.
!*** KTOP AND KBTM ARE THE TOP AND BOTTOM OF EACH CLOUD LAYER IN TERMS O
!*** ETA MODEL LEVEL.
!***
DO 540 L=2,LML
LL=LML-L+1+LVLIJ
BITC=CCMID(I,LL).GT.0.1
BITS=CSMID(I,LL).GT.0.1
BITCP1=CCMID(I,LL+1).GT.0.1
BITSP1=CSMID(I,LL+1).GT.0.1
BIT1=BITS.OR.BITC
!-------------------
IF(BIT1)THEN
!-------------------
IF(ITYP(I,KCLD(I)).EQ.0)THEN
CAMT(I,KCLD(I))=CSMID(I,LL)
ITYP(I,KCLD(I))=1
KBTM(I,KCLD(I))=LL
!
IF(BITC)THEN
CAMT(I,KCLD(I))=CCMID(I,LL)
ITYP(I,KCLD(I))=2
ENDIF
ELSE
IF(BITC)THEN
IF(BITCP1)THEN
CAMT(I,KCLD(I))=AMAX1(CAMT(I,KCLD(I)),CCMID(I,LL))
ELSE
KCLD(I)=KCLD(I)+1
CAMT(I,KCLD(I))=CCMID(I,LL)
ITYP(I,KCLD(I))=2
KTOP(I,KCLD(I)-1)=LL+1
KBTM(I,KCLD(I))=LL
ENDIF
ELSE
IF(BITCP1)THEN
KCLD(I)=KCLD(I)+1
CAMT(I,KCLD(I))=CSMID(I,LL)
ITYP(I,KCLD(I))=1
KTOP(I,KCLD(I)-1)=LL+1
KBTM(I,KCLD(I))=LL
ELSE
CAMT(I,KCLD(I))=AMAX1(CAMT(I,KCLD(I)),CSMID(I,LL))
ENDIF
ENDIF
ENDIF
!-------------------
ELSE
!-------------------
IF(BITCP1.OR.BITSP1)THEN
KCLD(I)=KCLD(I)+1
KTOP(I,KCLD(I)-1)=LL+1
ITYP(I,KCLD(I))=0
CAMT(I,KCLD(I))=0.0
ENDIF
!-------------------
ENDIF
!-------------------
540 CONTINUE
!***
!*** THE REAL NUMBER OF CLOUD LAYERS IS (THE FIRST IS THE GROUNG;
!*** THE LAST IS THE SKY):
!***
NCLDS(I)=KCLD(I)-2
NCLD=NCLDS(I)
!***
!*** NOW CALCULATE CLOUD RADIATIVE PROPERTIES
!***
IF(NCLD.GE.1)THEN
!***
!*** NOTE: THE FOLLOWING CALCULATIONS, THE UNIT FOR PRESSURE IS MB!!!
!***
DO 580 NC=2,NCLD+1
!
TAUC(I)=0.0
QSUM=0.0
NKTP=LP1
NBTM=0
BITX=CAMT(I,NC).GT.0.1
NKTP=MIN(NKTP,KTOP(I,NC))
NBTM=MAX(NBTM,KBTM(I,NC))
!
DO 560 LL=NKTP,NBTM
IF(LL.GE.KTOP(I,NC).AND.LL.LE.KBTM(I,NC).AND.BITX)THEN
PRS1=PINT(I,LL)*0.01
PRS2=PINT(I,LL+1)*0.01
DELP=PRS2-PRS1
TCLD=TMID(I,LL)-273.16
QSUM=QSUM+QMID(I,LL)*DELP*(PRS1+PRS2) &
/(120.1612*SQRT(TMID(I,LL)))
!***
!*** FOR CONVECTIVE CLOUD OR STARTIFORM CLOUD WITH TOP ABOVE 500MB
!***
IF(ITYP(I,NC).EQ.2 &
.OR.PINT(I,KTOP(I,NC)).LE.PTOPC(3))THEN
IF(TCLD.LE.-10.0)THEN
TAUC(I)=TAUC(I)+DELP*AMAX1(0.1E-3, &
2.0E-6*(TCLD+82.5)**2)
ELSE
TAUC(I)=TAUC(I)+DELP*AMIN1(0.08,6.949E-3*TCLD+0.1)
ENDIF
ELSE
!***
!*** FOR LOW AND MID STRATIFORM CLOUDS
!***
IF(TCLD.LE.-20.0)THEN
TAUC(I)=TAUC(I)+DELP*AMAX1(0.1E-3,2.56E-5* &
(TCLD+82.5)**2)
ELSE
TAUC(I)=TAUC(I)+DELP*0.1
ENDIF
ENDIF
ENDIF
560 CONTINUE
!
IF(BITX)EMIS(I,NC)=1.0-EXP(-0.75*TAUC(I))
IF(QSUM.GE.EPSQ1)THEN
!
DO 570 NBAND=1,NB
IF(BITX)THEN
PROD=ABCFF(NBAND)*QSUM
DDX=TAUC(I)/(TAUC(I)+PROD)
EEX=1.0-DDX
IF(ABS(EEX).GE.1.E-8)THEN
DD=DDX
EE=EEX
FF=1.0-DD*0.85
AA=MIN(50.0,SQRT(3.0*EE*FF)*TAUC(I))
AA=EXP(-AA)
BB=FF/EE
GG=SQRT(BB)
DD=(GG+1.0)*(GG+1.0)-(GG-1.0)*(GG-1.0)*AA*AA
RRCL(I,NBAND,NC)=MAX(0.1E-5,(BB-1.0)*(1.0-AA*AA)/DD)
TTCL(I,NBAND,NC)=AMAX1(0.1E-5,4.0*GG*AA/DD)
ENDIF
ENDIF
570 CONTINUE
ENDIF
580 CONTINUE
!
ENDIF
!
600 CONTINUE
!*********************************************************************
!****************** COMPUTE OZONE AT MIDLAYERS *********************
!*********************************************************************
!
!*** MODIFY PRESSURES SO THAT THE ENTIRE COLUMN OF OZONE (TO 0 MB)
!*** IS INCLUDED IN THE MODEL COLUMN EVEN WHEN PT > 0 MB
!***
DO L=1,LM
DO I=MYIS,MYIE
DENOM=1./(PINT(I,LP1)-PINT(I,1))
FCTRA=PINT(I,LP1)*DENOM
FCTRB=-PINT(I,1)*PINT(I,LP1)*DENOM
POZN(I,L)=PMID(I,L)*FCTRA+FCTRB
ENDDO
ENDDO
!
! CALL OZON2D(LM,POZN,XLAT,RSIN1,RCOS1,RCOS2,OZN)
CALL OZON2D
(LM,POZN,XLAT,RSIN1,RCOS1,RCOS2,OZN, &
! XDUO3N,XDO3N4,XDO3N2,XDO3N3, &
! PRGFDL,MYIS,MYIE, &
MYIS,MYIE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!
!***
!*** NOW THE VARIABLES REQUIRED BY RADFS HAVE BEEN CALCULATED.
!***
!----------------------------------------------------------------------
!***
!*** CALL THE GFDL RADIATION DRIVER
!***
!***
CALL RADFS
&
(PSFC,PMID,PINT,QMID,TMID,OZN,TSKN,SLMSK,ALBEDO,XLAT &
, CAMT,KTOP,KBTM,NCLDS,EMIS,RRCL,TTCL &
, COSZ,TAUDAR,1 &
, 1,0 &
! , ETAD,AETA,ITIMSW,ITIMLW,JD,R1,HOUR,TENDS,TENDL &
, ITIMSW,ITIMLW,JD,HOUR &
, TENDS(its,kts,j),TENDL(its,kts,j) &
! , T1,T2,T4,EM1V,EM1VW,EM3V &
! , TABLE1,TABLE2,TABLE3,EM1,EM1WDE,EM3 &
, FLWUP,FSWUP,FSWDN,FSWDNS,FSWUPS,FLWDNS,FLWUPS &
! , RAD1,RAD2,RAD3,RAD4 &
! , SKO3R,AB15WD,SKC1R,SKO2D &
, ids,ide, jds,jde, kds,kde &
, ims,ime, jms,jme, kms,kme &
, its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
DO I=MYIS,MYIE
GLW(I,J) = FLWDNS(I)
GSW(I,J) = FSWDNS(I)-FSWUPS(I)
ENDDO
DO 650 I=MYIS,MYIE
! PDSLIJ=PDSL(I,J)
PMOD=CUPPT(I,J)*24.0*1000.0/CLSTP
! CFRACL(I,J)=CLDCFR(I,1)
! CFRACM(I,J)=CLDCFR(I,2)
! CFRACH(I,J)=CLDCFR(I,3)
!
!*** ARRAYS ACFRST AND ACFRCV ACCUMULATE AVERAGE STRATIFORM AND
!*** CONVECTIVE CLOUD FRACTIONS, RESPECTIVELY. THIS INFORMATION
!*** IS PASSED TO THE POST PROCESSOR VIA COMMON BLOCK ACMCLD.
!
!SH CFRAVG=AMAX1(CFRACL(I,J),AMAX1(CFRACM(I,J),CFRACH(I,J)))
IF(CNCLD)THEN
IF(PMOD.LE.PPT(1))THEN
!SH ACFRST(I,J)=ACFRST(I,J)+CFRAVG
!SH NCFRST(I,J)=NCFRST(I,J)+1
ELSE
!SH ACFRCV(I,J)=ACFRCV(I,J)+CFRAVG
!SH NCFRCV(I,J)=NCFRCV(I,J)+1
ENDIF
ELSE
!SH ACFRST(I,J)=ACFRST(I,J)+CFRAVG
!SH NCFRST(I,J)=NCFRST(I,J)+1
ENDIF
650 CONTINUE
!***
!*** COLLECT ATMOSPHERIC TEMPERATURE TENDENCIES DUE TO RADIATION.
!*** ALSO COLLECT THE TOTAL SW AND INCOMING LW RADIATION (W/M**2)
!*** AND CONVERT TO FORM NEEDED FOR PREDICTION OF THS IN SURFCE.
!***
DO 660 I=MYIS,MYIE
DO L=1,LM
LL=LVL(I,J)+L
IF(SHORT)RSWTT(I,L,J)=TENDS(I,LL,J)
IF(LONG) RLWTT(I,L,J)=TENDL(I,LL,J)
IF(LL.EQ.LM)GO TO 660
ENDDO
660 CONTINUE
!***
!*** SUM THE LW INCOMING AND SW RADIATION (W/M**2) FOR RADIN.
!***
DO 675 I=MYIS,MYIE
IF(LONG)THEN
SIGT4(I,J)=STBOL*TMID(I,LM)*TMID(I,LM)* &
TMID(I,LM)*TMID(I,LM)
ENDIF
!
!*** ACCUMULATE VARIOUS LW AND SW RADIATIVE FLUXES FOR POST
!*** PROCESSOR. PASSED VIA COMMON ACMRDL AND ACMRDS.
!
IF(LONG)THEN
RLWIN(I,J) =FLWDNS(I)
RLWOUT(I,J)=FLWUPS(I)
RLWTOA(I,J)=FLWUP(I)
ENDIF
IF(SHORT)THEN
RSWIN(I,J) =FSWDNS(I)
RSWOUT(I,J)=FSWUPS(I)
RSWTOA(I,J)=FSWUP(I)
ENDIF
675 CONTINUE
!***
!*** THIS ROW IS FINISHED. GO TO NEXT
!***
! *********************
700 CONTINUE
! *********************
!----------------------------------------------------------------------
!***
!*** CALLS TO RADIATION THIS TIME STEP ARE COMPLETE.
!***
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***
!*** HORIZONTAL SMOOTHING OF TEMPERATURE TENDENCIES
!***
!----------------------------------------------------------------------
IF(SHORT) THEN
DO 800 L=1,LM
CALL ZERO2
(TL, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CALL ZERO2
(FNE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CALL ZERO2
(FSE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!
! IF(KSMUD.GE.1)THEN
! DO 750 KS=1,KSMUD
!!
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! TL(I,J)=RSWTT(I,L,J)
!! TL(I,J)=RSWTT(I,L,J)*HTM(I,L,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! FNE(I,J)=(TL(I+IHE(J),J+1)-TL(I,J))
!! *HTM(I,L,J)*HTM(I+IHE(J),J+1,L)
! ENDDO
! ENDDO
!!
! DO J=MYJS1,MYJE
! DO I=MYIS,MYIE
! FSE(I,J)=(TL(I+IHE(J),J-1)-TL(I,J))
!! *HTM(I+IHE(J),J-1,L)*HTM(I,L,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS2,MYJE2
! DO I=MYIS,MYIE
! TL(I,J)=(FNE(I,J)-FNE(I+IHW(J),J-1) &
! +FSE(I,J)-FSE(I+IHW(J),J+1)) &
! *0.125+TL(I,J)
!! *HBM2(I,J)*0.125+TL(I,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! RSWTT(I,L,J)=TL(I,J)
! ENDDO
! ENDDO
!!
! 750 CONTINUE
! ENDIF
!
800 CONTINUE
ENDIF
!----------------------------------------------------------------------
!
IF(LONG)THEN
!
DO 900 L=1,LM
CALL ZERO2
(TL, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CALL ZERO2
(FNE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
CALL ZERO2
(FSE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!
! IF(KSMUD.GE.1)THEN
! DO 850 KS=1,KSMUD
!!
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! TL(I,J)=RLWTT(I,L,J)
!! TL(I,J)=RLWTT(I,L,J)*HTM(I,L,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS,MYJE1
! DO I=MYIS,MYIE
! FNE(I,J)=(TL(I+IHE(J),J+1)-TL(I,J))
!! *HTM(I,L,J)*HTM(I+IHE(J),J+1,L)
! ENDDO
! ENDDO
!!
! DO J=MYJS1,MYJE
! DO I=MYIS,MYIE
! FSE(I,J)=(TL(I+IHE(J),J-1)-TL(I,J))
!! *HTM(I+IHE(J),J-1,L)*HTM(I,L,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS2,MYJE2
! DO I=MYIS,MYIE
! TL(I,J)=(FNE(I,J)-FNE(I+IHW(J),J-1) &
! +FSE(I,J)-FSE(I+IHW(J),J+1)) &
! *0.125+TL(I,J)
!! *HBM2(I,J)*0.125+TL(I,J)
! ENDDO
! ENDDO
!!
! DO J=MYJS,MYJE
! DO I=MYIS,MYIE
! RLWTT(I,L,J)=TL(I,J)
! ENDDO
! ENDDO
!!
! 850 CONTINUE
! ENDIF
900 CONTINUE
ENDIF
!-----------------------------------------------------------------------
!***
!*** RESET CUPPT,HTOP,HBOT FROM THIS CALL TO RADTN
!***
IF(MOD(NTSD,NRADPP).EQ.1)THEN
DO J=MYJS,MYJE
DO I=MYIS,MYIE
CUPPT(I,J)=0.
HTOP(I,J)=100.
HBOT(I,J)=0.
ENDDO
ENDDO
ENDIF
!-----------------------------------------------------------------------
END SUBROUTINE RADTN
!-----------------------------------------------------------------------
SUBROUTINE ZENITH(TIMES,DAYI,HOUR,IDAT,IHRST,GLON,GLAT,CZEN, & 2
MYIS,MYIE,MYJS,MYJE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------------
INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
INTEGER, INTENT(IN) :: MYJS,MYJE,MYIS,MYIE
REAL, INTENT(IN) :: TIMES
REAL, INTENT(OUT) :: HOUR,DAYI
INTEGER, INTENT(IN) :: IHRST
INTEGER, INTENT(IN), DIMENSION(3) :: IDAT
REAL, INTENT(IN ), DIMENSION(its:ite,jts:jte) :: GLAT,GLON
REAL, INTENT(OUT), DIMENSION(its:ite,jts:jte) :: CZEN
REAL, PARAMETER :: GSTC1=24110.54841,GSTC2=8640184.812866, &
GSTC3=9.3104E-2,GSTC4=-6.2E-6, &
PI=3.1415926,PI2=2.*PI,PIH=0.5*PI, &
DEG2RD=1.745329E-2,OBLIQ=23.440*DEG2RD, &
ZEROJD=2451545.0
REAL :: DAY,YFCTR,ADDDAY,STARTYR,DATJUL,DIFJD,SLONM, &
ANOM,SLON,DEC,RA,DATJ0,TU,STIM0,SIDTIM,HRANG
REAL :: HRLCL,SINALT
INTEGER :: KMNTH,KNT,IDIFYR,J,I
LOGICAL :: LEAP
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
INTEGER :: MONTH (12)
!-----------------------------------------------------------------------
DATA MONTH/31,28,31,30,31,30,31,31,30,31,30,31/
!***********************************************************************
! SAVE MONTH
DAY=0.
LEAP=.FALSE.
IF(MOD(IDAT(3),4).EQ.0)THEN
MONTH(2)=29
LEAP=.TRUE.
ENDIF
IF(IDAT(1).GT.1)THEN
KMNTH=IDAT(1)-1
DO 10 KNT=1,KMNTH
DAY=DAY+REAL(MONTH(KNT))
10 CONTINUE
ENDIF
!***
!*** CALCULATE EXACT NUMBER OF DAYS FROM BEGINNING OF YEAR TO
!*** FORECAST TIME OF INTEREST
!***
DAY=DAY+REAL(IDAT(2)-1)+(REAL(IHRST)+TIMES/3600.)/24.
DAYI=REAL(INT(DAY)+1)
HOUR=(DAY-DAYI+1.)*24.
YFCTR=2000.-IDAT(3)
!-----------------------------------------------------------------------
!***
!*** FIND CELESTIAL LONGITUDE OF THE SUN THEN THE SOLAR DECLINATION AND
!*** RIGHT ASCENSION.
!***
!-----------------------------------------------------------------------
IDIFYR=IDAT(3)-2000
!***
!*** FIND JULIAN DATE OF START OF THE RELEVANT YEAR
!*** ADDING IN LEAP DAYS AS NEEDED
!***
IF(IDIFYR.LT.0)THEN
ADDDAY=REAL(IDIFYR/4)
ELSE
ADDDAY=REAL((IDIFYR+3)/4)
ENDIF
STARTYR=ZEROJD+IDIFYR*365.+ADDDAY-0.5
!***
!*** THE JULIAN DATE OF THE TIME IN QUESTION
!***
DATJUL=STARTYR+DAY
!
!*** DIFFERENCE OF ACTUAL JULIAN DATE FROM JULIAN DATE
!*** AT 00H 1 January 2000
!
DIFJD=DATJUL-ZEROJD
!
!*** MEAN GEOMETRIC LONGITUDE OF THE SUN
!
SLONM=(280.460+0.9856474*DIFJD)*DEG2RD+YFCTR*PI2
!
!*** THE MEAN ANOMOLY
!
ANOM=(357.528+0.9856003*DIFJD)*DEG2RD
!
!*** APPARENT GEOMETRIC LONGITUDE OF THE SUN
!
SLON=SLONM+(1.915*SIN(ANOM)+0.020*SIN(2.*ANOM))*DEG2RD
IF(SLON.GT.PI2)SLON=SLON-PI2
!
!*** DECLINATION AND RIGHT ASCENSION
!
DEC=ASIN(SIN(SLON)*SIN(OBLIQ))
RA=ACOS(COS(SLON)/COS(DEC))
IF(SLON.GT.PI)RA=PI2-RA
!***
!*** FIND THE GREENWICH SIDEREAL TIME THEN THE LOCAL SOLAR
!*** HOUR ANGLE.
!***
DATJ0=STARTYR+DAYI-1.
TU=(DATJ0-2451545.)/36525.
STIM0=GSTC1+GSTC2*TU+GSTC3*TU**2+GSTC4*TU**3
SIDTIM=STIM0/3600.+YFCTR*24.+1.00273791*HOUR
SIDTIM=SIDTIM*15.*DEG2RD
IF(SIDTIM.LT.0.)SIDTIM=SIDTIM+PI2
IF(SIDTIM.GT.PI2)SIDTIM=SIDTIM-PI2
HRANG=SIDTIM-RA
!
DO 100 J=MYJS,MYJE
DO 100 I=MYIS,MYIE
! HRLCL=HRANG-GLON(I,J)
HRLCL=HRANG+GLON(I,J)+PI2
!***
!*** THE ZENITH ANGLE IS THE COMPLEMENT OF THE ALTITUDE THUS THE
!*** COSINE OF THE ZENITH ANGLE EQUALS THE SINE OF THE ALTITUDE.
!***
SINALT=SIN(DEC)*SIN(GLAT(I,J))+COS(DEC)*COS(HRLCL)* &
COS(GLAT(I,J))
IF(SINALT.LT.0.)SINALT=0.
CZEN(I,J)=SINALT
100 CONTINUE
!***
!*** IF THE FORECAST IS IN A DIFFERENT YEAR THAN THE START TIME,
!*** RESET DAYI TO THE PROPER DAY OF THE NEW YEAR (IT MUST NOT BE
!*** RESET BEFORE THE SOLAR ZENITH ANGLE IS COMPUTED).
!***
IF(DAYI.GT.365.)THEN
IF(.NOT.LEAP)THEN
DAYI=DAYI-365.
ELSEIF(LEAP.AND.DAYI.GT.366.)THEN
DAYI=DAYI-366.
ENDIF
ENDIF
END SUBROUTINE ZENITH
!-----------------------------------------------------------------------
SUBROUTINE OZON2D (LK,POZN,XLAT,RSIN1,RCOS1,RCOS2,QO3, & 1
! XDUO3N,XDO3N4,XDO3N2,XDO3N3, &
! PRGFDL,MYIS,MYIE, &
MYIS,MYIE, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------------
INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
INTEGER, INTENT(IN) :: LK,MYIS,MYIE
REAL, INTENT(IN), DIMENSION(its:ite,kts:kte) :: POZN
REAL, INTENT(IN), DIMENSION(its:ite) :: XLAT
REAL, INTENT(INOUT), DIMENSION(its:ite,kts:kte) :: QO3
REAL, INTENT(IN) :: RSIN1,RCOS1,RCOS2
!----------------------------------------------------------------------
INTEGER, PARAMETER :: NL=81,NLP1=NL+1,LNGTH=37*NL
REAL, PARAMETER :: RTD=57.2957795
! REAL, INTENT(IN), DIMENSION(37,NL) :: XDUO3N,XDO3N4,XDO3N2,XDO3N3
! REAL, INTENT(IN), DIMENSION(NL) :: PRGFDL
!----------------------------------------------------------------------
!----------------------------------------------------------------------
INTEGER,DIMENSION(its:ite) :: JJROW
REAL, DIMENSION(its:ite) :: TTHAN
REAL, DIMENSION(its:ite,NL) :: QO3O3
INTEGER :: I,K,NUMITR,ILOG,IT,NHALF
REAL :: TH2,DO3V,DO3VP,APHI,APLO
!----------------------------------------------------------------------
DO I=MYIS,MYIE
TH2=0.2*XLAT(I)
JJROW(I)=19.001-TH2
TTHAN(I)=(19-JJROW(I))-TH2
ENDDO
!
!*** SEASONAL AND SPATIAL INTERPOLATION DONE BELOW.
!
DO K=1,NL
DO I=MYIS,MYIE
DO3V=XDUO3N(JJROW(I),K)+RSIN1*XDO3N2(JJROW(I),K) &
+RCOS1*XDO3N3(JJROW(I),K) &
+RCOS2*XDO3N4(JJROW(I),K)
DO3VP=XDUO3N(JJROW(I)+1,K)+RSIN1*XDO3N2(JJROW(I)+1,K) &
+RCOS1*XDO3N3(JJROW(I)+1,K) &
+RCOS2*XDO3N4(JJROW(I)+1,K)
!
!*** NOW LATITUDINAL INTERPOLATION
!*** AND CONVERT O3 INTO MASS MIXING RATIO (ORIG DATA MPY BY 1.E4)
!
QO3O3(I,K)=1.E-4*(DO3V+TTHAN(I)*(DO3VP-DO3V))
ENDDO
ENDDO
!***
!*** VERTICAL INTERPOLATION FOR EACH GRIDPOINT (LINEAR IN LN P)
!***
NUMITR=0
ILOG=NL
20 CONTINUE
ILOG=(ILOG+1)/2
IF(ILOG.EQ.1)GO TO 25
NUMITR=NUMITR+1
GO TO 20
25 CONTINUE
!
DO 60 K=1,LK
!
NHALF=(NL+1)/2
DO I=MYIS,MYIE
JJROW(I)=NHALF
ENDDO
!
DO 40 IT=1,NUMITR
NHALF=(NHALF+1)/2
DO I=MYIS,MYIE
IF(POZN(I,K).LT.PRGFDL(JJROW(I)-1))THEN
JJROW(I)=JJROW(I)-NHALF
ELSEIF(POZN(I,K).GE.PRGFDL(JJROW(I)))THEN
JJROW(I)=JJROW(I)+NHALF
ENDIF
JJROW(I)=MIN(JJROW(I),NL)
JJROW(I)=MAX(JJROW(I),2)
ENDDO
40 CONTINUE
!
DO 50 I=MYIS,MYIE
IF(POZN(I,K).LT.PRGFDL(1))THEN
QO3(I,K)=QO3O3(I,1)
ELSE IF(POZN(I,K).GT.PRGFDL(NL))THEN
QO3(I,K)=QO3O3(I,NL)
ELSE
APLO=ALOG(PRGFDL(JJROW(I)-1))
APHI=ALOG(PRGFDL(JJROW(I)))
QO3(I,K)=QO3O3(I,JJROW(I))+(ALOG(POZN(I,K))-APHI)/ &
(APLO-APHI)* &
(QO3O3(I,JJROW(I)-1)-QO3O3(I,JJROW(I)))
ENDIF
50 CONTINUE
!
60 CONTINUE
END SUBROUTINE OZON2D
!-----------------------------------------------------------------------
SUBROUTINE ZERO2(ARRAY, & 6
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------------
INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
REAL, INTENT(INOUT), DIMENSION(its:ite,jts:jte) :: ARRAY
INTEGER :: I,J
!----------------------------------------------------------------------
DO J=jts,jte
DO I=its,ite
ARRAY(I,J)=0.
ENDDO
ENDDO
END SUBROUTINE ZERO2
!----------------------------------------------------------------
SUBROUTINE O3INT(PHALF,DDUO3N,DDO3N2,DDO3N3,DDO3N4, & 1
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
!----------------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------------
INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
!FPP$ NOCONCUR R
!$$$ SUBPROGRAM DOCUMENTATION BLOCK
! . . . .
! SUBPROGRAM: O3INT COMPUTE ZONAL MEAN OZONE FOR ETA LYRS
! PRGMMR: KENNETH CAMPANA ORG: W/NMC23 DATE: 89-07-07
! MICHAEL BALDWIN ORG: W/NMC22 DATE: 92-06-08
!
! ABSTRACT: THIS CODE WRITTEN AT GFDL...
! CALCULATES SEASONAL ZONAL MEAN OZONE,EVERY 5 DEG OF LATITUDE,
! FOR CURRENT MODEL VERTICAL COORDINATE. OUTPUT DATA IN G/G * 1.E4
! CODE IS CALLED ONLY ONCE.
!
! PROGRAM HISTORY LOG:
! 84-01-01 FELS AND SCHWARZKOPF,GFDL.
! 89-07-07 K. CAMPANA - ADAPTED STAND-ALONE CODE FOR IN-LINE USE.
! 92-06-08 M. BALDWIN - UPDATE TO RUN IN ETA MODEL
!
! USAGE: CALL O3INT(O3,SIGL) OLD
! INPUT ARGUMENT LIST:
! PHALF - MID LAYER PRESSURE (K=LM+1 IS MODEL SURFACE)
! OUTPUT ARGUMENT LIST:
! DDUO3N - ZONAL MEAN OZONE DATA IN ALL MODEL LAYERS (G/G*1.E4)
! DDO3N2 DIMENSIONED(L,N),WHERE L(=37) IS LATITUDE BETWEEN
! DDO3N3 N AND S POLES,N=NUM OF VERTICAL LYRS(K=1 IS TOP LYR)
! DDO3N4 AND SEASON-WIN,SPR,SUM,FALL.
! IN COMMON
!
! OUTPUT FILES:
! OUTPUT - PRINT FILE.
!
! ATTRIBUTES:
! LANGUAGE: FORTRAN 200.
!
!$$$
!.... PROGRAM O3INT FROM DAN SCHWARZKOPF-GETS ZONAL MEAN O3
!.. OUTPUT O3 IS WINTER,SPRING,SUMMER,FALL (NORTHERN HEMISPHERE)
!-----------------------------------------------------------------------
! INCLUDE "parmeta"
!-----------------------------------------------------------------------
! *********************************************************
INTEGER :: N,NP,NP2,NM1
! PARAMETER (N=LM,NP=N+1,NP2=N+2,NM1=N-1)
! *********************************************************
!-----------------------------------------------------------------------
!***
!*** SEASONAL CLIMATOLOGIES OF O3 (OBTAINED FROM A PREVIOUSLY RUN
!*** CODE WHICH INTERPOLATES O3 TO USER VERTICAL COORDINATE).
!*** DEFINED AS 5 DEG LAT MEANS N.P.->S.P.
!***
REAL, INTENT(OUT), DIMENSION(37,kte):: DDUO3N,DDO3N2,DDO3N3,DDO3N4
! C O M M O N /SAVMEM/
! ...WINTER.... ...SPRING.... ...SUMMER.... ....FALL.....
! 1 DDUO3N(37,LM), DDO3N2(37,LM), DDO3N3(37,LM), DDO3N4(37,LM)
! ..... K.CAMPANA OCTOBER 1988
!CCC DIMENSION T41(NP2,2),O3O3(37,N,4)
! DIMENSION SIGL(N)
! *********************************************************
REAL :: QI(82)
REAL :: DDUO3(19,kts:kte),RO31(10,41),RO32(10,41),DUO3N(19,41)
REAL :: TEMPN(19)
REAL :: O3HI(10,25),O3LO1(10,16),O3LO2(10,16),O3LO3(10,16), &
O3LO4(10,16)
REAL :: O3HI1(10,16),O3HI2(10,9),PH1(45),PH2(37),P1(48),P2(33)
REAL :: O35DEG(37,kts:kte)
REAL :: RSTD(81),RO3(10,41),RO3M(10,40),RBAR(kts:kte),RDATA(81), &
PHALF(kts:kte+1),P(81),PH(82)
INTEGER :: NKK,NK,NKP,K,L,NCASE,ITAPE,IPLACE,NKMM,NKM,KI,KK,KQ,JJ,KEN
REAL :: O3RD,O3TOT,O3DU
! EQUIVALENCE (O3HI1(1,1),O3HI(1,1)),(O3HI2(1,1),O3HI(1,17))
! EQUIVALENCE (PH1(1),PH(1)),(PH2(1),PH(46))
! EQUIVALENCE (P1(1),P(1)),(P2(1),P(49))
DATA PH1/ 0., &
0.1027246E-04, 0.1239831E-04, 0.1491845E-04, 0.1788053E-04, &
0.2135032E-04, 0.2540162E-04, 0.3011718E-04, 0.3558949E-04, &
0.4192172E-04, 0.4922875E-04, 0.5763817E-04, 0.6729146E-04, &
0.7834518E-04, 0.9097232E-04, 0.1053635E-03, 0.1217288E-03, &
0.1402989E-03, 0.1613270E-03, 0.1850904E-03, 0.2119495E-03, &
0.2423836E-03, 0.2768980E-03, 0.3160017E-03, 0.3602623E-03, &
0.4103126E-03, 0.4668569E-03, 0.5306792E-03, 0.6026516E-03, &
0.6839018E-03, 0.7759249E-03, 0.8803303E-03, 0.9987843E-03, &
0.1133178E-02, 0.1285955E-02, 0.1460360E-02, 0.1660001E-02, &
0.1888764E-02, 0.2151165E-02, 0.2452466E-02, 0.2798806E-02, &
0.3197345E-02, 0.3656456E-02, 0.4185934E-02, 0.4797257E-02/
DATA PH2/ &
0.5503893E-02, 0.6321654E-02, 0.7269144E-02, 0.8368272E-02, &
0.9644873E-02, 0.1112946E-01, 0.1285810E-01, 0.1487354E-01, &
0.1722643E-01, 0.1997696E-01, 0.2319670E-01, 0.2697093E-01, &
0.3140135E-01, 0.3660952E-01, 0.4274090E-01, 0.4996992E-01, &
0.5848471E-01, 0.6847525E-01, 0.8017242E-01, 0.9386772E-01, &
0.1099026E+00, 0.1286765E+00, 0.1506574E+00, 0.1763932E+00, &
0.2065253E+00, 0.2415209E+00, 0.2814823E+00, 0.3266369E+00, &
0.3774861E+00, 0.4345638E+00, 0.4984375E+00, 0.5697097E+00, &
0.6490189E+00, 0.7370409E+00, 0.8344896E+00, 0.9421190E+00, &
0.1000000E+01/
DATA P1/ &
0.9300000E-05, 0.1129521E-04, 0.1360915E-04, 0.1635370E-04, &
0.1954990E-04, 0.2331653E-04, 0.2767314E-04, 0.3277707E-04, &
0.3864321E-04, 0.4547839E-04, 0.5328839E-04, 0.6234301E-04, &
0.7263268E-04, 0.8450696E-04, 0.9793231E-04, 0.1133587E-03, &
0.1307170E-03, 0.1505832E-03, 0.1728373E-03, 0.1982122E-03, &
0.2266389E-03, 0.2592220E-03, 0.2957792E-03, 0.3376068E-03, &
0.3844381E-03, 0.4379281E-03, 0.4976965E-03, 0.5658476E-03, &
0.6418494E-03, 0.7287094E-03, 0.8261995E-03, 0.9380076E-03, &
0.1063498E-02, 0.1207423E-02, 0.1369594E-02, 0.1557141E-02, &
0.1769657E-02, 0.2015887E-02, 0.2295520E-02, 0.2620143E-02, &
0.2989651E-02, 0.3419469E-02, 0.3909867E-02, 0.4481491E-02, &
0.5135272E-02, 0.5898971E-02, 0.6774619E-02, 0.7799763E-02/
DATA P2/ &
0.8978218E-02, 0.1036103E-01, 0.1195488E-01, 0.1382957E-01, &
0.1599631E-01, 0.1855114E-01, 0.2151235E-01, 0.2501293E-01, &
0.2908220E-01, 0.3390544E-01, 0.3952926E-01, 0.4621349E-01, &
0.5403168E-01, 0.6330472E-01, 0.7406807E-01, 0.8677983E-01, &
0.1015345E+00, 0.1189603E+00, 0.1391863E+00, 0.1630739E+00, &
0.1908004E+00, 0.2235461E+00, 0.2609410E+00, 0.3036404E+00, &
0.3513750E+00, 0.4055375E+00, 0.4656677E+00, 0.5335132E+00, &
0.6083618E+00, 0.6923932E+00, 0.7845676E+00, 0.8875882E+00, &
0.1000000E+01/
DATA O3HI1/ &
.55,.50,.45,.45,.40,.35,.35,.30,.30,.30, &
.55,.51,.46,.47,.42,.38,.37,.36,.35,.35, &
.55,.53,.48,.49,.44,.42,.41,.40,.38,.38, &
.60,.55,.52,.52,.50,.47,.46,.44,.42,.41, &
.65,.60,.55,.56,.53,.52,.50,.48,.45,.45, &
.75,.65,.60,.60,.55,.55,.55,.50,.48,.47, &
.80,.75,.75,.75,.70,.70,.65,.63,.60,.60, &
.90,.85,.85,.80,.80,.75,.75,.74,.72,.71, &
1.10,1.05,1.00,.90,.90,.90,.85,.83,.80,.80, &
1.40,1.30,1.25,1.25,1.25,1.20,1.15,1.10,1.05,1.00, &
1.7,1.7,1.6,1.6,1.6,1.6,1.6,1.6,1.5,1.5, &
2.1,2.0,1.9,1.9,1.9,1.8,1.8,1.8,1.7,1.7, &
2.4,2.3,2.2,2.2,2.2,2.1,2.1,2.1,2.0,2.0, &
2.7,2.5,2.5,2.5,2.5,2.5,2.4,2.4,2.3,2.3, &
2.9,2.8,2.7