subroutine adnlmsas(im,ix,km,jcap,delt,del,sl,slk,rcs,& 2,25 slimsk,inew,xkt2,ncloud,kcheck,ps, & t0,q0,cwm0,u0,v0,dot0, & t1,q1,cwm1,u1,v1,rn1, & cldwrk,kbot,ktop,jmin,kuo,kb, & ad_t0,ad_q0,ad_cwm0,ad_u0,ad_v0,ad_dot0, & ad_t1,ad_q1,ad_cwm1,ad_u1,ad_v1,ad_rn1, & adjoint,mype) !C$$$ SUBPROGRAM DOCUMENTATION BLOCK !C . . . . !C SUBPROGRAM: SASCNV COMPUTES CONVECTIVE HEATING AND MOISNG !C PRGMMR: HUA-LU PAN ORG: W/NMC23 DATE: 92-03-01 !C !C ABSTRACT: COMPUTES CONVECTIVE HEATING AND MOISTENING USING A ONE !C CLOUD TYPE ARAKAWA-SCHUBERT CONVECTION SCHEME ORIGINALLY DEVELOPED !C BY GEORG GRELL. THE SCHEME INCLUDES UPDRAFT AND DOWNDRAFT EFFECTS. !C THE CLOSURE IS THE CLOUD WORK FUNCTION. BOTH UPDRAFT AND DOWNDRAFT !C ARE ASSUMED TO BE SATURATED AND THE HEATING AND MOISTENING ARE !C ACCOMPLISHED BY THE COMPENSATING ENVIRONMENT. THE NAME COMES FROM !C "SIMPLIFIED ARAKAWA-SCHUBERT CONVECTION PARAMETERIZATION". !C !C PROGRAM HISTORY LOG: !C 92-03-01 HUA-LU PAN !C !C USAGE: CALL SASCNV(IM,IX,KM,JCAP,DELT,DEL,SL,SLK,PS,QN,TN, !C & Q1,T0,RN,KBOT,KTOP,KUO,SPD,SLIMSK) !C !C INPUT ARGUMENT LIST: !C IM - INTEGER NUMBER OF POINTS !C IX - LEADING DIMENSION OF QN,TN,Q1,T0,SPD !C KM - INTEGER NUMBER OF LEVELS !C JCAP - INTEGER SPECTRAL TRUNCATION !C DT - REAL TIME STEP IN SECONDS !C DEL - REAL (KM) SIGMA LAYER THICKNESS !C SL - REAL (KM) SIGMA VALUES !C SLK - REAL (KM) SIGMA VALUES TO THE KAPPA !C PS - REAL (IM) SURFACE PRESSURE IN KILOPASCALS (CB) !C QN - REAL (KM,IX) PREVIOUS SPECIFI!C HUMIDITY IN KG/KG !C TN - REAL (KM,IX) PREVIOUS TEMPERATURE IN KELVIN !C Q1 - REAL (KM,IX) CURRENT SPECIFI!C HUMIDITY IN KG/KG !C T0 - REAL (KM,IX) CURRENT TEMPERATURE IN KELVIN !C SPD - REAL (KM,IX) CURRENT WIND SPEED !C SLIMSK - REAL (IM) LAND(1),SEA(0), ICE(2) FLAG !C !C OUTPUT ARGUMENT LIST: !C Q1 - REAL (KM,IX) ADJUSTED SPECIFIC HUMIDITY IN KG/KG !C T0 - REAL (KM,IX) ADJUSTED TEMPERATURE IN KELVIN !C RN - REAL (IM) CONVECTIVE RAIN IN METERS !C KBOT - INTEGER (IM) CLOUD BOTTOM LEVEL !C KTOP - INTEGER (IM) CLOUD TOP LEVEL !C KUO - INTEGER (IM) BIT FLAG INDICATING DEEP CONVECTION !C !C SUBPROGRAMS CALLED: !C FESB - FUNCTION TO COMPUTE SATURATION VAPOR PRESSURE !C !C REMARKS: FUNCTION FESB IS INLINED BY FPP. !C NONSTANDARD AUTOMATIC ARRAYS ARE USED. !C !C ATTRIBUTES: !C LANGUAGE: FORTRAN 77. !C MACHINE: CRAY. !C !C$$$ use type_kinds, only: fp_kind implicit none include 'constant.h' logical adjoint0 real(fp_kind) g,elocp,el2orc,eps,epsm1,terr,c0,delta,fact1,fact2 real(fp_kind) c1,c2,c3,p0,p1,p2,p3 real(fp_kind) tiny,qsmall parameter (g=grav) parameter(elocp=hvap/cp) parameter(el2orc=hvap*hvap/(rv*cp),eps=rd/rv,epsm1=rd/rv-1.) parameter(terr=0.,c0=.002,delta=0.6077338) parameter(fact1=(cvap-cliq)/rv,fact2=hvap/rv-fact1*t0c) parameter (qsmall=1.e-10) parameter (tiny=1.e-15) parameter (adjoint0=.false.) ! Constants for es(T) calculation parameter (c1=0.61078,c2=17.67,c3=243.5) ! Constanst for precipitation efficiency calculation (equation below) parameter (p0=1.591, p1=-0.639, p2=0.0953, p3=-0.00496) ! term = 1.e3*vshear/dz ! e1 = 1.591-.639*term+.0953*(term**2)-.00496*(term**3) ! e1 = p0 + p1 *term+ p2 * term**2 + p3 * term**3 integer,dimension(ix):: kb,kbcon,lmin,jmin,ktcon,kbdtr,kt2,kcheck,& ktcon0,kbot,ktop,kuo real(fp_kind),dimension(km):: del,slk,sl real(fp_kind),dimension(ix):: ps,slimsk,cldwrk,rn1,rcs,ad_rn1 real(fp_kind),dimension(km,ix):: t0,q0,t1,q1,cwm1,u1,v1,dot0,& u0,v0,cwm0,ad_t0,ad_q0,ad_cwm0,ad_u0,ad_v0,ad_dot0,ad_t1,ad_q1,& ad_u1,ad_v1,ad_cwm1 !c !c local variables and arrays logical adjoint,totflg logical,dimension(ix):: cnvflg,dwnflg,dwnflg2,flg logical,dimension(km,ix):: flgk integer km,jcap,im,ix,mype,i,k,indx integer onemf,onemfu,inew,ncloud integer kbmax,kmax,kbm,jmn real(fp_kind) term1,dp,dqsdp,desdt,pprime,qs,a,ad_rfact real(fp_kind) delt,alphas,betal,edtmaxs,mbdt,qevap real(fp_kind) betas,pdpdwn,pdetrn,evfact,evfactl,dtmax,edtmaxl,dt2 real(fp_kind) dtmin,dvq1,dv3v,detau,dvu1,xtemp,xdby,dvv1,dellat real(fp_kind) dv2q,dv3q,dv1q,dv1u,dv1v,dv2v,dv2u,dv3u,xqrch,delqev real(fp_kind) alpha,factor,termq,esl,gamma real(fp_kind) dqsdt,dt,po,dq,ad_term1,ad_term2,ad_evef,ad_dellat real(fp_kind) ad_rain,ad_term3,ad_qcond,ad_qevap,qevap0,ad_term4 real(fp_kind) qevap1,dz,w3l,w2l,w4l,w2s,w1s,w1l,xlambu real(fp_kind) alphal,fjcap,fkm,val,ad_es0,adt,es,term2,dlnsig,es0 real(fp_kind) w4s,w3s,ad_es,ad_qs,ad_desdt,term,ad_dvu1,ad_dvv1 real(fp_kind) ad_pprime,ad_etah,ad_xpw,ad_esl,ad_dqsdt,ad_dqsdp real(fp_kind) ad_dv1u,ad_dv2u,ad_dv3q,ad_dv1q,ad_dv2q,ad_dv3u real(fp_kind) ad_dv1,ad_dvq1,ad_dv3v,ad_dv1v,ad_dv2v,ad_qlk real(fp_kind) ad_term5,ad_dhh,ad_term6,ad_xpwd,ad_gamma,ad_dh,ad_dqs real(fp_kind) ad_ratio,ad_dz,ad_dg,ad_dt,ad_onemf,ad_termq,ad_factor real(fp_kind) ad_xqc,ad_xqrch,ad_xtemp,ad_detad,ad_dz1,ad_xdby real(fp_kind) ad_rfactg,x,funsqr,ftanh,dftanh,pw0 real(fp_kind) ad_qrch,ad_temp,ad_termv,ad_termu real(fp_kind) ad_onemfu,ad_heol2,ad_qc,ad_fuv,ad_shear,rterm real(fp_kind) ad_dv3,dv3,ad_dq,ad_term,ad_e1,ad_dv2,ad_detau,ad_tem1 real(fp_kind) ad_tem2,ad_vol2,ad_uol2 real(fp_kind) rain,rn0,qcond,ad_rn0,ad_delqev,delq2,evef,xpwd,w1,xqc real(fp_kind) xpw,w2,ratio,fixed,w3,w4,qrch,dz1,vol2,temp,etah,rfact real(fp_kind) term3,qlk,qc,tem1,tem2,dif,heol2,uol2,fuv,term4 real(fp_kind) edtmax,dhh,term6,detad,dg,dv1,dv2,aup,adw,termu,termv real(fp_kind) term5,dqs,shear,dh,e1,beta real(fp_kind) r1200,r3600,one,zero real(fp_kind),dimension(15):: pcrit,acritt,acrit real(fp_kind),dimension(ix):: pdot,acrtfct,acrtfct1,acrtfct0,& dtconv0,dtconv,deltv,acrt,psfc,hmax,delq,hkbo,qkbo,pbcdif,& hmin,pwavo,aa1,vshear,edt,edto,pwevo,hcdo,qcdo,ddp,pp2,adet,& aatmp,xaa0,f,xk,xmb,edtx,xqcd,hsbar,xmbmax,xlamb,xlamd,& xlamdet,xlamdet0,xlamdet1,delhbar,delqvar,deltbar,rntot,& xkt2,ad_y1,ad_y2,ad_y3,ad_y4,ad_y5,ad_y6,ad_y7,ad_y8,ad_y9 real(fp_kind),dimension(ix):: ucdo,vcdo,ukbo,vkbo,qlko_ktcon,& dellal,dellal1,ad_dellal1,ad_dellal,ad_ukbo,ad_vkbo,ad_ucdo,& ad_vcdo,ad_qlko_ktcon,ad_xlamdet1,ad_xlamdet0,dpscl,tdpscl,& dpcld,tdpcld,tcwfup,tcwfdn,tdetrn,tdpdwn,aa10,edt0,edto0,& edtx0,xmb0,rn11,edto1,edto10,edtx1,edtx10,ad_hkbo,ad_xlamb,& ad_xlamdet,ad_aa1,ad_pwavo,ad_tcwfup,ad_tcwfdn,ad_vshear,& ad_edt,ad_edto,ad_edtx,ad_xlamd,ad_pwevo,ad_qcdo,ad_hcdo,& ad_xaa0,ad_xpwav,ad_xpwev,ad_xhcd,ad_pdot,ad_acrtfct1,& ad_acrtfct,ad_dtconv,ad_f,ad_xk,ad_xmb,ad_rntot,ad_edto1,& ad_edtx1,xhkb,xqkb,xpwav,xpwev,xhcd real(fp_kind),dimension(km,ix):: to2,qo2,to3,qo3,p,to,qo,uo,vo,& qeso,tvo,dbyo,zo,heo,heso,qrck,dellah,dellaq,hco,qcko,eta,& etad,qrcdo,pwo,pwdo,qrcd,hcko real(fp_kind),dimension(km,ix):: qol,uol,vol,tol,heol,hesol,qesol,qol0,& xqo,xto,xtvo,xzo,xqo0,xheo,xheso,xqeso,xqrcd,xhcko,xqcko,xtol,& xqol,xqesol,xqcko0,xqrch0,eta0,hcko0,hckod,hcko1,qcko0,dqk,qcko00,& xtemp0,qeso2,rn0k,delqevk,ad_to,ad_qo,ad_qeso,ad_tvo,& ad_zo,ad_heo,ad_heso,ad_tol,ad_qol,ad_hesol,ad_heol,& ad_qesol,ad_eta,ad_hcko,ad_qcko,ad_hcko1,& ad_dbyo,ad_hckod,ad_pwo,ad_uo,ad_vo,ad_uol,& ad_vol,ad_etad,ad_qrcdo,ad_pwdo,ad_dellah,ad_dellaq,ad_xto,& ad_xqo,ad_xqeso,ad_xtvo,ad_xzo,ad_xtol,ad_xqol,ad_xqesol,& ad_xheo,ad_xheso,ad_xhcko,ad_xqcko,ad_xqrcd,ad_to2 real(fp_kind),dimension(km,ix):: ad_qo2,ad_qeso2,ad_to3,ad_qo3,ad_x1,& ad_x2,ad_x3,ad_x7,ad_x4,ad_x5,ad_x6,ad_x8,ad_x9,ad_x10,ad_x11,& ad_x12,ad_x13,ad_x14,sumz,sumh,ad_cwmo,ucko,vcko,etau,etau0,& ucko0,vcko0,uckod,vckod,ad_dellalk,dellalk,ad_cwmo2,dellau,& dellav,uo2,vo2,cwmo,cwmo2,qo0,ad_qo0,ad_xqol0,ad_uo2,ad_vo2,& xqol0,ad_xqo0,ad_ucko,ad_vcko,ad_uckod,ad_vckod,ad_dellau,& ad_dellav,ad_etau,ad_sumz,ad_sumh,ad_qol0 save pcrit, acritt data pcrit/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., & 350.,300.,250.,200.,150./ data acritt/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/ !C GDAS DERIVED ACRIT !C DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, !C & .743,.813,.886,.947,1.138,1.377,1.896/ !C----------------------------------------------------------------------- !c !c !c Define smoothing functions funsqr(x,a,k) = 1.0 - 0.5**((x/a)**(2*k)) ftanh(x) = 0.5*(1.0 + tanh(x)) dftanh(x) = 0.5/(cosh(x)**2) !c do i = 1,ix do k = 1,km ad_cwmo(k,i)=0.0 ad_cwmo2(k,i)=0.0 ad_dellalk(k,i)=0.0 ad_t0(k,i) = 0.0 ad_q0(k,i) = 0.0 ad_u0(k,i) = 0.0 ad_v0(k,i) = 0.0 ad_cwm0(k,i)=0.0 ad_dot0(k,i) = 0.0 ad_tvo(k,i) = 0.0 ad_qeso(k,i) = 0.0 ad_qo(k,i) = 0.0 ad_to(k,i) = 0.0 ad_uo(k,i) = 0.0 ad_vo(k,i) = 0.0 ad_zo(k,i) = 0.0 ad_heso(k,i) = 0.0 ad_heo(k,i) = 0.0 ad_tol(k,i) = 0.0 ad_qol(k,i) = 0.0 ad_uol(k,i) = 0.0 ad_vol(k,i) = 0.0 ad_heol(k,i) = 0.0 ad_hesol(k,i) = 0.0 ad_qesol(k,i) = 0.0 ad_eta(k,i) = 0.0 ad_hcko(k,i) = 0.0 ad_qcko(k,i) = 0.0 ad_hcko1(k,i) = 0.0 ad_dbyo(k,i) = 0.0 ad_hckod(k,i) = 0.0 ad_qcko(k,i) = 0.0 ad_pwo(k,i) = 0.0 ad_etad(k,i) = 0.0 ad_qrcdo(k,i) = 0.0 ad_pwdo(k,i) = 0.0 ad_dellah(k,i) = 0.0 ad_dellaq(k,i) = 0.0 ad_xto(k,i) = 0.0 ad_xqo(k,i) = 0.0 ad_xqeso(k,i) = 0.0 ad_xtvo(k,i) = 0.0 ad_xzo(k,i) = 0.0 ad_xtol(k,i) = 0.0 ad_xqol(k,i) = 0.0 ad_xqesol(k,i) = 0.0 ad_xheo(k,i) = 0.0 ad_xheso(k,i) = 0.0 ad_xhcko(k,i) = 0.0 ad_xqcko(k,i) = 0.0 ad_xqrcd(k,i) = 0.0 ad_to2(k,i) = 0.0 ad_qo2(k,i) = 0.0 ad_qeso2(k,i) = 0.0 ad_to3(k,i) = 0.0 ad_qo3(k,i) = 0.0 ad_qo0(k,i)=0.0 ad_xqol0(k,i)=0.0 ad_uo2(k,i)=0.0 ad_vo2(k,i)=0.0 ad_xqo0(k,i)=0.0 ad_ucko(k,i)=0.0 ad_vcko(k,i)=0.0 ad_uckod(k,i)=0.0 ad_vckod(k,i)=0.0 ad_dellau(k,i)=0.0 ad_dellav(k,i)=0.0 ad_etau(k,i)=0.0 ad_sumz(k,i)=0.0 ad_sumh(k,i)=0.0 ad_qol0(k,i)=0.0 !c p(k,i) = 0.0 to(k,i) = 0.0 qo(k,i) = 0.0 to2(k,i) = 0.0 qo2(k,i) = 0.0 qeso(k,i) = 0.0 qeso2(k,i) = 0.0 to3(k,i) = 0.0 qo3(k,i) = 0.0 tvo(k,i) = 0.0 dbyo(k,i) = 0.0 zo(k,i) = 0.0 heo(k,i) = 0.0 heso(k,i) = 0.0 xqo(k,i) = 0.0 xqeso(k,i) = 0.0 xto(k,i) = 0.0 xtvo(k,i) = 0.0 xzo(k,i) = 0.0 xheo(k,i) = 0.0 xheso(k,i) = 0.0 tol(k,i) = 0.0 qol(k,i) = 0.0 qesol(k,i) = 0.0 heol(k,i) = 0.0 hesol(k,i) = 0.0 uol(k,i) = 0.0 vol(k,i) = 0.0 xtol(k,i) = 0.0 xqol(k,i) = 0.0 xqesol(k,i) = 0.0 qrcd(k,i) = 0.0 dellah(k,i) = 0.0 dellaq(k,i) = 0.0 hcko(k,i) = 0.0 qcko(k,i) = 0.0 eta(k,i) = 0.0 hcko0(k,i) = 0.0 qcko0(k,i) = 0.0 qcko00(k,i)= 0.0 dqk(k,i) = 0.0 eta0(k,i) = 0.0 etad(k,i) = 0.0 xhcko(k,i) = 0.0 xqcko(k,i) = 0.0 xqcko0(k,i) = 0.0 xtemp0(k,i) = 0.0 xqrch0(k,i) = 0.0 qrcdo(k,i) = 0.0 pwo(k,i) = 0.0 pwdo(k,i) = 0.0 hcko1(k,i) = 0.0 hckod(k,i) = 0.0 xqrcd(k,i) = 0.0 rn0k(k,i) = 0.0 delqevk(k,i) = 0.0 flgk(k,i) = .true. !!new sumz(k,i) = 0.0 sumh(k,i) = 0.0 ucko(k,i) = 0.0 vcko(k,i) = 0.0 etau(k,i) = 0.0 uckod(k,i)= 0.0 vckod(k,i)=0.0 hckod(k,i)=0.0 end do end do do i = 1,ix ad_xlamdet1(i)=0.0 ad_xlamdet0(i)=0.0 ad_ukbo(i)=0.0 ad_vkbo(i)=0.0 ad_ucdo(i)=0.0 ad_vcdo(i)=0.0 ad_qlko_ktcon(i)=0.0 ad_dellal(i)=0.0 ad_dellal1(i)=0.0 ad_hkbo(i) = 0.0 ad_xlamb(i) = 0.0 ad_xlamdet(i) = 0.0 ad_aa1(i) = 0.0 ad_pwavo(i) = 0.0 ad_tcwfup(i) = 0.0 ad_tcwfdn(i) = 0.0 ad_vshear(i) = 0.0 ad_edt(i) = 0.0 ad_edto(i) = 0.0 ad_edtx(i) = 0.0 ad_edto1(i) = 0.0 ad_edtx1(i) = 0.0 ad_xlamd(i) = 0.0 ad_pwevo(i) = 0.0 ad_qcdo(i) = 0.0 ad_hcdo(i) = 0.0 ad_xaa0(i) = 0.0 ad_xpwav(i) = 0.0 ad_xpwev(i) = 0.0 ad_xhcd(i) = 0.0 ad_pdot(i) = 0.0 ad_acrtfct1(i) = 0.0 ad_acrtfct(i) = 0.0 ad_dtconv(i) = 0.0 ad_f(i) = 0.0 ad_xk(i) = 0.0 ad_xmb(i) = 0.0 ad_rntot(i) = 0.0 dpscl(i) = 0.0 dpcld(i) = 0.0 tdpscl(i) = 0.0 tdpcld(i) = 0.0 tdetrn(i) = 0.0 tcwfup(i) = 0.0 tcwfdn(i) = 0.0 acrtfct(i) = 0.0 acrtfct0(i) = 0.0 acrtfct1(i) = 0.0 acrt(i) = 0.0 psfc(i) = 0.0 hmax(i) = 0.0 kb(i) = 0 hkbo(i) = 0.0 qkbo(i) = 0.0 kbcon(i) = 0 pbcdif(i) = 0.0 hmin(i) = 0.0 lmin(i) = 0 jmin(i) = 0 pwavo(i) = 0.0 aa1(i) = 0.0 vshear(i) = 0.0 edt(i) = 0.0 edt0(i) = 0.0 edto(i) = 0.0 edto1(i) = 0.0 edto10(i) = 0.0 pwevo(i) = 0.0 hcdo(i) = 0.0 qcdo(i) = 0.0 xhkb(i) = 0.0 xqkb(i) = 0.0 xpwav(i) = 0.0 xpwev(i) = 0.0 xhcd(i) = 0.0 xaa0(i) = 0.0 f(i) = 0.0 xk(i) = 0.0 xmb(i) = 0.0 xmb0(i) = 0.0 ktcon(i) = 0 edtx(i) = 0.0 edtx1(i) = 0.0 edtx10(i) = 0.0 xqcd(i) = 0.0 hsbar(i) = 0.0 xmbmax(i) = 0.0 xlamb(i) = 0.0 xlamdet(i) = 0.0 xlamdet0(i)=0.0 xlamdet1(i)=0.0 xlamd(i) = 0.0 kbdtr(i) = 0 pdot(i) = 0.0 cldwrk(i) = 0.0 kbot(i) = km+1 ktop(i) = 0 kuo(i) = 0 rn1(i) = 0.0 aa10(i) = 0.0 rn11(i) = 0.0 qlko_ktcon(i)=0.0 end do ! Initialize variables r1200=1200. r3600=3600. zero=0.0 one=1.0 !c !C INITIALIZE ARRAYS !C DO I = 1,IM CNVFLG(I) = .TRUE. dwnflg(i) = .true. dwnflg2(i) = .true. flg(i) = .true. DTCONV(I) = 3600. dtconv0(i) = dtconv(i) xmbmax(i) = 0.1 ENDDO DO K = 1, 15 ACRIT(K) = ACRITT(K) * (975. - PCRIT(K)) ENDDO DT2 = DELT dtmin = max(dt2,r1200) dtmax = max(dt2,r3600) !C MODEL TUNABLE PARAMETERS ARE ALL HERE MBDT = 10. EDTMAXl = 0.3 EDTMAXs = 0.3 ALPHAl = 0.5 ALPHAs = 0.5 BETAl = 0.15 betas = 0.15 BETAl = 0.05 betas = 0.05 !c EVEF = 0.07 !! evfact = 0.3 !! evfactl = 0.3 evfact = 0.7 evfactl = .7 PDPDWN = 0. PDETRN = 200. xlambu = 1.e-4 fjcap = (float(jcap) / 126.) ** 2 val = 1. fjcap = max(fjcap,val) !c W1l = -2.E-3 * (JCAP / 62.) **2 !c W2l = -1.E-2 * (JCAP / 62.) **2 !c W3l = -1.E-2 * (JCAP / 62.) **2 !c W4l = -1.E-3 * (JCAP / 62.) **2 !c W1s = -1.E-4 * (JCAP / 62.) !c W2s = -1.E-3 * (JCAP / 62.) !c W3s = -1.E-3 * (JCAP / 62.) !c W4s = -1.E-4 * (JCAP / 62.) fkm = (float(km) / 28.) ** 2 fkm = max(fkm,one) W1l = -8.E-3 W2l = -4.E-2 W3l = -5.E-3 W4l = -5.E-4 W1s = -2.E-4 W2s = -2.E-3 W3s = -1.E-3 W4s = -2.E-5 !C !C DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER !C AND THE MAXIMUM THETAE FOR UPDRAFT !C KBMAX = KM KBM = KM KMAX = KM DO K = 1, KM IF (SL(K) .GT. 0.45) KBMAX = K + 1 IF (SL(K) .GT. 0.7) KBM = K + 1 IF (SL(K) .GT. 0.04) KMAX = K + 1 ENDDO !C kbm=10, kbmax=14, kmax=25 (=23 if sl(k).gt.06) !C !C CONVERT SURFACE PRESSURE TO MB FROM CB !C DO I = 1, IM PSFC(I) = PS(I) * 10. ENDDO do i = 1,im do k = 1,km P(k,i) = PSFC(I) * SL(K) to(k,i) = t0(k,i) !! qo(k,i) = q0(k,i) if (q0(k,i)>0.) then qo(k,i) = q0(k,i) else qo(k,i) = qsmall endif uo(k,i) = u0(k,i) vo(k,i) = v0(k,i) cwmo(k,i)= cwm0(k,i) qo0(k,i) = q0(k,i) ENDDO ENDDO !C !C COLUMN VARIABLES !C P IS PRESSURE OF THE LAYER (MB) !C T IS TEMPERATURE AT T-DT (K)..TN !C Q IS MIXING RATIO AT T-DT (KG/KG)..QN !C TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN !C QO IS MIXING RATIO AT T+DT (KG/KG)..Q1 !C do i = 1,im DO K = 1, KMAX call adfpvsx(to(k,i),es0,adt,ad_es0,adjoint0) es = 10*es0 QESO(k,i) = EPS*es / ( !new code bounds qeso to be >= 1.e-8, qo>=1.e-10 TVO(k,i) = TO(k,i) + DELTA * TO(k,i) * QO(k,i) ENDDO ENDDO !C !C HYDROSTATIC HEIGHT ASSUME ZERO TERR !C DLNSIG = LOG(SL(1)) DO I = 1, IM ZO(1,i) = TERR - DLNSIG * RD / G * TVO(1,i) ENDDO !cround !c Reverse order of this loop leads to slightly different !c final results. Change order of loop in sascnv2 to !c restore similar results. do i = 1,im DO K = 2, KMAX DLNSIG = LOG(SL(K) / SL(K-1)) term1 = dlnsig * rd / g term2 = 0.5 * (tvo(k,i) + tvo(k-1,i)) zo(k,i) = zo(k-1,i) - term1*term2 ENDDO ENDDO !c !C COMPUTE MOIST STATIC ENERGY do i = 1,im DO K = 1, KMAX HEO(k,i) = G * ZO(k,i) + CP * TO(k,i) + HVAP * QO(k,i) HESO(k,i) = G * ZO(k,i) + CP * TO(k,i) + HVAP * QESO(k,i) ENDDO ENDDO !C !C DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY !C THIS IS THE LEVEL WHERE UPDRAFT STARTS !C DO I = 1, IM HMAX(I) = HEO(1,i) KB(I) = 1 ENDDO do i = 1,im DO K = 2, KBM IF (HEO(k,i).GT.HMAX(I)) THEN KB(I) = K HMAX(I) = HEO(k,i) ENDIF ENDDO ENDDO !C !C SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM !C !! DO I = 1, IM !! HMIN(I) = HESO(1,i) !! LMIN(I) = KBMAX !! JMIN(I) = KBMAX !! ENDDO !! do i = 1,im !! DO K = 2, KBMAX !! IF (HESO(k,i).LT.HMIN(I)) THEN !! LMIN(I) = K + 1 !! HMIN(I) = HESO(k,i) !! ENDIF !! ENDDO !! ENDDO !c do i = 1,im DO K = 1, KMAX - 1 DZ = 0.5 * (ZO(k+1,i) - ZO(k,i)) DP = 0.5 * ( call adfpvsx(to(k+1,i),es0,adt,ad_es0,adjoint0) es = 10*es0 PPRIME = P(k+1,i) + EPSM1 * ES QS = EPS * ES / PPRIME DQSDP = - QS / PPRIME DESDT = ES * (FACT1 / TO(k+1,i) + FACT2 / (TO(k+1,i)**2)) DQSDT = QS * P(k+1,i) * DESDT / (ES * PPRIME) GAMMA = EL2ORC * QESO(k+1,i) / (TO(k+1,i)**2) DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA)) DQ = DQSDT * DT + DQSDP * DP TOL(k,i) = TO(k+1,i) + DT QOL0(k,i) = QO(k+1,i) + DQ if (qol0(k,i)>0.) then qol(k,i) = qol0(k,i) else qol(k,i) = qsmall endif end do end do !c do i = 1,im do k = 1,kmax-1 PO = 0.5 * ( call adfpvsx(tol(k,i),es0,adt,ad_es0,adjoint0) esl = 10.*es0 QESOL(k,i) = EPS*esl / (PO + EPSM1*esl) HEOL(k,i) = 0.5 * G * (ZO(k,i) + ZO(k+1,i)) + & CP * TOL(k,i) + HVAP * QOL(k,i) HESOL(k,i) = 0.5 * G * (ZO(k,i) + ZO(k+1,i)) + & CP * TOL(k,i) + HVAP * QESOL(k,i) uol(k,i) = 0.5 * (uo(k,i) + uo(k+1,i)) vol(k,i) = 0.5 * (vo(k,i) + vo(k+1,i)) ENDDO ENDDO k = kmax do i = 1, im heol(k,i) = heo(k,i) hesol(k,i) = heso(k,i) enddo !C !C LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION !C DO I = 1, IM INDX = KB(I) HKBO(I) = HEOL(INDX,I) ukbo(i) = uol(indx,i) vkbo(i) = vol(indx,i) KBCON(I) = KMAX flg(i) = .true. ENDDO do i = 1,im DO K = 1, KBMAX IF (FLG(I) .AND. K.GT.KB(I)) THEN HSBAR(I) = HESOL(k,i) IF (HKBO(I).GT.HSBAR(I)) THEN FLG(I) = .FALSE. KBCON(I) = K ENDIF ENDIF ENDDO ENDDO DO I = 1, IM dpscl(I) = -P(KBCON(I),I) + P(KB(I),I) !! if (abs(dpscl(i)).gt.tiny) then !! tdpscl(i) = funsqr(150.,dpscl(i),1) !! else !! tdpscl(i) = 1 !! endif tdpscl(i) = 1.0 PDOT(I) = 10.* DOT0(KBCON(I),I) IF (dpscl(I).GT.150.) tdpscl(i) = 0.0 IF (KBCON(I).EQ.KMAX) tdpscl(i) = 0.0 ENDDO !c !C FOUND LFC, CAN DEFINE REST OF VARIABLES !C !C DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON !C DO I = 1, IM alpha = alphas if (nint(slimsk(i)) .eq. 1) alpha = alphal IF (KB(I).EQ.1) THEN DZ = 0.5 * (ZO(KBCON(I),I) + ZO(KBCON(I)-1,I)) - ZO(1,i) ELSE DZ = 0.5 * (ZO(KBCON(I),I) + ZO(KBCON(I)-1,I)) & - 0.5 * (ZO(KB(I),I) + ZO(KB(I)-1,I)) ENDIF IF (KBCON(I).NE.KB(I)) THEN XLAMB(I) = -LOG(ALPHA) / DZ ELSE XLAMB(I) = 0. ENDIF ENDDO !c !C DETERMINE UPDRAFT MASS FLUX do i = 1,im DO K = 1, KMAX ETA(k,i) = 1. etau(k,i)= 1. ENDDO ENDDO do i = 1,im DO K = KBMAX, 2, -1 if (k.lt.kbcon(i) .and. k.ge.kb(i)) then DZ = 0.5 * (ZO(k+1,i) - ZO(k-1,i)) ETA(k,i) = ETA(k+1,i) * EXP(-XLAMB(I) * DZ) etau(k,i)= eta(k,i) ENDIF ENDDO ENDDO DO I = 1, IM if (kb(i).eq.1 .and. kbcon(i).gt.1) then DZ = 0.5 * (ZO(2,i) - ZO(1,i)) ETA(1,i) = ETA(2,i) * EXP(-XLAMB(I) * DZ) etau(1,i)= eta(1,i) ENDIF ENDDO !C !C WORK UP UPDRAFT CLOUD PROPERTIES !C DO I = 1, IM INDX = KB(I) HCKO(INDX,I) = HKBO(I) ucko(indx,i) = ukbo(i) vcko(indx,i) = vkbo(i) ENDDO !C !C CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES !C do i = 1,im DO K = 2, KMAX - 1 if (k.gt.kb(i) .and. k.le.kbcon(i)) then FACTOR = ETA(k-1,i) / ETA(k,i) ONEMF = 1. - FACTOR HCKO(k,i) = FACTOR * HCKO(k-1,i) + ONEMF * & 0.5 * (HEOL(k,i) + HEOL(k+1,i)) UCKO(k,i) = FACTOR * UCKO(k-1,i) + ONEMF * & 0.5 * (uol(k,i) + uol(k+1,i)) VCKO(k,i) = FACTOR * VCKO(k-1,i) + ONEMF * & 0.5 * (vol(k,i) + vol(k+1,i)) ENDIF if (k.gt.kbcon(i)) then hcko(k,i) = hcko(kbcon(i),i) ucko(k,i) = ucko(kbcon(i),i) vcko(k,i) = vcko(kbcon(i),i) ENDIF ENDDO ENDDO !c !c Load eta into new work array to preserve previous value do i = 1,im do k = 1,km eta0(k,i) = eta(k,i) hcko0(k,i) = hcko(k,i) ucko0(k,i) = ucko(k,i) vcko0(k,i) = vcko(k,i) etau0(k,i) = etau(k,i) end do end do !c !C DETERMINE CLOUD TOP DO I = 1, IM FLG(I) = .true. KTCON(I) = 1 ENDDO do i = 1,im DO K = 2, KMAX dif = hcko(k,i) - hesol(k,i) if (dif.lt.0. .and. flg(i) .and. k.gt.kbcon(i)) then KTCON(I) = K FLG(I) = .FALSE. ENDIF ENDDO ENDDO !C !C Make sure that jmin is within the cloud !C !new !c Search for downdraft origin level above theta-e minimum do i=1,im HMIN(i) = HEOl(kbcon(i),i) LMIN(i) = KBMAX JMIN(i) = KBMAX if(cnvflg(i)) then DO K = kbcon(i), KBMAX IF(HEOl(k,i).LT.HMIN(i)) THEN LMIN(i) = K + 1 HMIN(i) = HEOl(k,i) ENDIF ENDDO endif end do !c Make sure jmin is within the cloud DO I = 1, IM JMIN(I) = MIN(LMIN(I),KTCON(I)-1) JMIN(I) = MAX(JMIN(I),KBCON(I)+1) if (ktcon(i).lt.kbcon(i)) jmin(i) = 1 ENDDO !c DO I = 1, IM dpcld(i) = p(kbcon(i),i) - p(ktcon(i),i) !! tdpcld(i) = funsqr(dpcld(i),150.,1) tdpcld(i) = 1.0 IF (dpcld(i).LT.150.) tdpcld(i) = 0.0 ENDDO !!new ! KTCON is model level of deepest cloud in ensemble. ! Now randomly select cloud from ensemble of clouds ! ranging from one level above the downdraft origin to ! to level of neutral buoyancy (ktcon) do i=1,im do k=2,kmax-1 if (k.gt.jmin(i) .and. k.le.ktcon(i)) then sumz(k,i) = sumz(k-1,i) + .5 * (zo(k+1,i) - zo(k-1,i)) sumh(k,i) = sumh(k-1,i) + .5 * (zo(k+1,i) - zo(k-1,i)) & * heol(k,i) endif end do end do ! Select cloud from ensemble do i=1,im kt2(i) = nint(xkt2(i)*float(ktcon(i)-jmin(i))-.5) + jmin(i) + 1 tem1 = hcko(jmin(i),i) - hesol(kt2(i),i) tem2 = sumz(kt2(i),i) * hesol(kt2(i),i) - sumh(kt2(i),i) if (abs(tem2) .gt. 0.000001) then xlamdet0(i) = tem1 / tem2 else xlamdet0(i) = 0.0 cnvflg = .false. endif if (xlamdet0(i).ge.0.) then xlamdet1(i) = xlamdet0(i) else xlamdet1(i) = 0.0 endif if (sumz(kt2(i),i) .gt. 0.000001) then term = 2.3/sumz(kt2(i),i) if (xlamdet1(i).lt.term) then xlamdet(i) = xlamdet1(i) else xlamdet(i) = term endif else xlamdet(i) = xlamdet1(i) endif end do ! Apply logic to determine if convection is possible do i=1,im if (kt2(i).ge.ktcon(i)) dwnflg(i) = .false. if(xlamdet(i).le.1.e-30 .or. & hcko(jmin(i),i)-hesol(kt2(i),i).le.1.e-30) & dwnflg(i) = .false. do k = jmin(i), kt2(i) if(dwnflg(i) .and. & heol(k,i).gt.hesol(kt2(i),i)) dwnflg(i)=.false. enddo end do !C !C DETRAINING CLOUD !C DO I = 1, IM !! if (abs(dpcld(i)).gt.tiny) then !! tdetrn(i) = funsqr(pdetrn,dpcld(i),1) !! else !! tdetrn(i) = 1.0 !! endif tdetrn(i) = 1.0 IF (dpcld(i).LT.PDPDWN) DWNFLG2(I)=.FALSE. !! if (abs(pdpdwn).gt.tiny) then !! tdpdwn(i) = funsqr(dpcld(i),pdpdwn,1) !! else !! tdpdwn(i) = 1.0 !! endif tdpdwn(i) = 1.0 if (dwnflg2(i) .and. jmin(i).le.kbcon(i)) then dwnflg2(i) = .false. tdetrn(i) = 0.0 tdpdwn(i) = 0.0 endif ENDDO !c !C CLOUD PROPERTY ABOVE CLOUD TOP IS MODIFIED BY THE DETRAINMENT PROCESS do i=1,im if (dwnflg(i)) then do k=2,kmax-1 if (k.gt.jmin(i) .and. k.le.kt2(i)) then DZ = .5 * (ZO(k+1,i) - ZO(k-1,i)) !c to simplify matter, we will take the linear approach here eta(k,i) = eta(k-1,i) * (1. + xlamdet(i) * dz) etau(k,i) = etau(k-1,i) * (1.+(xlamdet(i)+xlambu)* dz) endif end do else do k=2,kmax-1 if (k.gt.jmin(i) .and. k.le.ktcon(i)) then DZ = .5 * (ZO(k+1,i) - ZO(k-1,i)) etau(k,i) = etau(k-1,i) * (1. + xlambu * dz) endif end do endif ENDDO do i=1,im if (dwnflg(i)) then ktcon0(i) = ktcon(i) ktcon(i) = kt2(i) else ktcon0(i) = ktcon(i) endif end do !c !c Load hcko at cloud base into hckod do i = 1,im if (dwnflg(i)) then indx = kbcon(i) hckod(indx,i) = hcko(indx,i) uckod(indx,i) = ucko(indx,i) vckod(indx,i) = vcko(indx,i) endif end do !c !c Adjustment to hckod by detraining cloud do i = 1,im do k = 2,kmax-1 if (k.gt.kbcon(i) .and. k.le.ktcon(i)) then FACTOR = ETA(k-1,i) / ETA(k,i) ONEMF = 1. - FACTOR fuv = etau(k-1,i)/etau(k,i) onemfu = 1. - fuv heol2 = 0.5*(heol(k,i) + heol(k+1,i)) HCKOd(k,i) = FACTOR*HCKOd(k-1,i) + ONEMF*heol2 uol2 = 0.5*(uol(k,i)+uol(k+1,i)) uckod(k,i) = fuv * uckod(k-1,i) + onemfu*uol2 vol2 = 0.5*(vol(k,i)+vol(k+1,i)) vckod(k,i) = fuv * vckod(k-1,i) + onemfu*vol2 ENDIF end do end do !c !c Load hckod and hcko into hcko1 and calculate dbyo do k = 2,kmax-1 do i = 1,im if (k.gt.kb(i).and.k.le.kbcon(i)) then hcko1(k,i) = hcko(k,i) elseif (k.gt.kbcon(i).and.k.le.ktcon(i)) then if (.not.dwnflg(i)) then hcko1(k,i) = hcko(k,i) else hcko1(k,i) = hckod(k,i) endif elseif (k.gt.ktcon(i)) then hcko1(k,i) = hcko(k,i) endif if (k.gt.kb(i)) then dbyo(k,i) = hcko1(k,i) - hesol(k,i) endif end do end do !C !C COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION !C DO I = 1, IM indx = kb(i) qcko(indx,i) = qol(indx,i) ENDDO do k = 1,km do i = 1,im qcko0(k,i) = qcko(k,i) end do end do do i = 1,im DO K = 1, KMAX if (k.gt.kb(i) .and. k.lt.ktcon(i)) then FACTOR = ETA(k-1,i) / ETA(k,i) ONEMF = 1. - FACTOR temp = FACTOR * QCKO(k-1,i) + ONEMF * & 0.5 * (QOL(k,i) + QOL(k+1,i)) qcko0(k,i) = temp GAMMA = EL2ORC * QESOL(k,i) / (TOL(k,i)**2) QRCH = QESOL(k,i) & + GAMMA * DBYO(k,i) / (HVAP * (1. + GAMMA)) dq = eta(k,i) * (temp - qrch) dqk(k,i) = dq !C !C BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT !C IF (DQ.GT.0.) THEN dz = 0.5 * (zo(k+1,i) - zo(k-1,i)) dz1 = (zo(k,i) - zo(k-1,i)) ETAH = 0.5 * (ETA(k,i) + ETA(k-1,i)) QLK = DQ / (ETA(k,i) + ETAH * C0 * DZ) AA1(I) = AA1(I) - DZ1 * G * QLK PWO(k,i) = ETAH * C0 * DZ * QLK PWAVO(I) = PWAVO(I) + PWO(k,i) qc = qlk + qrch QCKO(k,i) = QC else qcko(k,i) = temp ENDIF ENDIF ENDDO ENDDO ! This section is for cloud liquid water if (ncloud.gt.0) then do i=1,im k = ktcon(i) if (cnvflg(i)) then GAMMA = EL2ORC * QESOl(K,i) / (TOl(K,i)**2) QRCH = QESOl(K,i) & + GAMMA * DBYO(K,i) / (HVAP * (1. + GAMMA)) DQ = QCKO(K-1,i) - QRCH qcko00(k-1,i) = qcko(k-1,i) !C !C CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT !C IF(DQ.GT.0.) THEN qlko_ktcon(i) = dq QCKO(K-1,i) = QRCH ENDIF endif end do endif !C !C CALCULATE CLOUD WORK FUNCTION AT T+DT !C do i = 1,im DO K = 1, KMAX if (k.gt.kbcon(i) .and. k.le.ktcon(i)) then DZ1 = ZO(k,i) - ZO(k-1,i) GAMMA = EL2ORC * QESOL(k-1,i) / (TOL(k-1,i)**2) RFACT = 1. + DELTA * CP * GAMMA & * TOL(k-1,i) / HVAP term1 = dz1*g/cp term2 = 1./tol(k-1,i) term3 = dbyo(k-1,i) term4 = 1./(1.+gamma) term5 = rfact aa1(i) = aa1(i) + term1*term2*term3*term4*term5 dqs = qesol(k-1,i) - qol(k-1,i) if (dqs.gt.0.) then AA1(I) = AA1(I)+ DZ1 * G * DELTA * dqs endif ENDIF ENDDO ENDDO !c !c Set cloud mass flux threshold function based on updaft cwf. do i = 1,im term = 1.e3*aa1(i) aa10(i) = aa1(i) if (abs(term) .lt. 100.) then tcwfup(i) = ftanh(term) else if (term .lt. -100.) then tcwfup(i) = 0.0 else tcwfup(i) = 1.0 endif endif end do !C !C------- DOWNDRAFT CALCULATIONS !C !C !C--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR !C do i = 1,im DO K = 1, KMAX if (k.ge.kb(i) .and. k.le.ktcon(i)) then termu = (uol(k+1,i) - uol(k,i))**2 termv = (vol(k+1,i) - vol(k,i))**2 if (termu+termv.gt.tiny) then shear = rcs(i) * sqrt(termu+termv) else shear = 0.0 endif vshear(i)= vshear(i) + shear ENDIF ENDDO ENDDO DO I = 1, IM dz = zo(ktcon(i),i)-zo(kb(i),i) if (abs(dz).gt.tiny) then term = 1.E3 * VSHEAR(I) / dz e1 = p0 + p1*term + p2*term**2 + p3*term**3 edt(i) = 1.-e1 else edt(i) = 0. endif edt0(i) = edt(i) end do !c !c Impose upper and lower bounds on precipitation efficiency do i = 1,im if (edt(i).gt.0.9) then edt(i) = 0.9 elseif (edt(i).lt.0.0) then edt(i) = 0.0 endif EDTO(I) = EDT(I) EDTX(I) = EDT(I) ENDDO !c !C DETERMINE DETRAINMENT RATE BETWEEN 1 AND KBDTR DO I = 1, IM KBDTR(I) = KBCON(I) beta = betas if (nint(slimsk(i)) .eq. 1) beta = betal KBDTR(I) = KBCON(I) KBDTR(I) = MAX(KBDTR(I),1) XLAMD(I) = 0. IF (KBDTR(I).GT.1) THEN DZ = 0.5 * ZO(KBDTR(I),I) + 0.5 * ZO(kbdtr(i)-1,i) & - ZO(1,i) XLAMD(I) = LOG(BETA) / DZ ENDIF ENDDO !C DETERMINE DOWNDRAFT MASS FLUX do i = 1,im DO K = 1, KMAX ETAD(k,i) = 1. ENDDO ENDDO do i = 1,im DO K = KBMAX, 2, -1 if (k.lt.kbdtr(i)) then DZ = 0.5 * (ZO(k+1,i) - ZO(k-1,i)) ETAD(k,i) = ETAD(k+1,i) * EXP(XLAMD(I) * DZ) ENDIF ENDDO ENDDO K = 1 DO I = 1, IM if (kbdtr(i).gt.1) then DZ = 0.5 * (ZO(2,i) - ZO(1,i)) ETAD(k,i) = ETAD(k+1,i) * EXP(XLAMD(I) * DZ) ENDIF ENDDO !C !C--- DOWNDRAFT MOISTURE PROPERTIES !C do i = 1,im do k = 1,km qrcdo(k,i) = 0.0 pwdo(k,i) = 0.0 end do end do DO I = 1, IM pwevo(i) = 0. JMN = JMIN(I) HCDO(I) = HEOL(JMN,I) QRCDO(JMN,I) = QESOL(JMN,I) ucdo(i) = uol(jmn,i) vcdo(i) = vol(jmn,i) ENDDO do i = 1,im DO K = KMAX-1, 1, -1 if (k.lt.jmin(i)) then DQ = QESOL(k,i) DT = TOL(k,i) GAMMA = EL2ORC * DQ / DT**2 DH = HCDO(I) - HESOL(k,i) term5 = (1./hvap) * gamma term6 = 1./(1.+gamma) qrcdo(k,i) = dq + term5*term6*dh DETAD = ETAD(k+1,i) - ETAD(k,i) if (k.lt.jmin(i)-1) then term1 = etad(k+1,i)*qrcdo(k+1,i) term2 = etad(k,i) * qrcdo(k,i) term3 = detad*0.5*(qrcdo(k,i)+qrcdo(k+1,i)) pwdo(k,i) = term1 - term2 - term3 else term1 = etad(k+1,i)*qol(k+1,i) term2 = etad(k,i) * qrcdo(k,i) term3 = detad*0.5*(qrcdo(k,i)+qesol(k+1,i)) pwdo(k,i) = term1 - term2 - term3 endif PWEVO(I) = PWEVO(I) + PWDO(k,i) ENDIF ENDDO ENDDO do i = 1,im qcdo(i) = qrcdo(1,i) end do !C !C--- FINAL DOWNDRAFT STRENGTH DEPENDENT ON PRECIP !C--- EFFICIENCY (EDT), NORMALIZED CONDENSATE (PWAV), AND !C--- EVAPORATE (PWEV) !C DO I = 1, IM edtmax = edtmaxl if (nint(slimsk(i)) .eq. 0) edtmax = edtmaxs IF (DWNFLG2(I)) THEN IF (PWEVO(I).LT.0.) THEN EDTO1(I) = -EDTO(I) * PWAVO(I) / PWEVO(I) edto10(i) = edto1(i) if (edto1(i).gt.edtmax) then edto1(i) = edtmax endif ELSE EDTO1(I) = 0. ENDIF ELSE EDTO1(I) = 0. ENDIF ENDDO !C !C !C--- DOWNDRAFT CLOUDWORK FUNCTIONS !C !C !cround reverse order of loop --> get slightly different result do i = 1,im DO K = KMAX-1, 1, -1 IF (DWNFLG2(I) .AND. K.LT.JMIN(I)) THEN GAMMA = EL2ORC * QESOL(k+1,i) / TOL(k+1,i)**2 DHH = HCDO(I) DT = TOL(k+1,i) DG = GAMMA DH = HESOL(k+1,i) dz = zo(k,i) - zo(k+1,i) term1 = edto1(i) term2 = dz term3 = g/(cp*dt) term4 = dhh-dh term5 = 1./(1.+dg) term6 = 1. + delta*cp*dg*dt/hvap aa1(i) = aa1(i) & + term1*term2*term3*term4*term5*term6 dqs = qesol(k+1,i)-qol(k+1,i) if (dqs.gt.0.) then AA1(I)= AA1(I) + EDTO1(I)*DZ*G*DELTA*dqs endif ENDIF ENDDO ENDDO !c !c Compute threshold function based on final cloud work function do i = 1,im term = 1.e3*aa1(i) if (abs(term) .lt. 100.) then tcwfdn(i) = ftanh(term) else if (term .lt. -100.) then tcwfdn(i) = 0.0 else tcwfdn(i) = 1.0 endif endif end do !C !C !C--- WHAT WOULD THE CHANGE BE, THAT A CLOUD WITH UNIT MASS !C--- WILL DO TO THE ENVIRONMENT? !C do i = 1,im DO K = 1, KMAX DELLAH(k,i) = 0. DELLAQ(k,i) = 0. dellau(k,i) = 0. dellav(k,i) = 0. ENDDO ENDDO DO I = 1, IM if (ktcon(i).ne.1) then DP = 100. * PSFC(I) * DEL(1) DELLAH(1,i) = EDTO1(I) * ETAD(1,i) * (HCDO(I) & - HEOL(1,i)) * G / DP DELLAQ(1,i) = EDTO1(I) * ETAD(1,i) * (QCDO(I) & - QOL(1,i)) * G / DP DELLAU(1,i) = EDTO1(I) * ETAD(1,i) * (UCDO(i) & - UOl(1,i)) * G / DP DELLAV(1,i) = EDTO1(I) * ETAD(1,i) * (VCDO(i) & - VOl(1,i)) * G / DP endif ENDDO !C !C--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT !C !cround reverse order of loop yields different results do i = 1,im DO K = 2, KMAX-1 if ( k.lt.ktcon(i) .and. ktcon(i).ne.1 ) then AUP = 1. IF (K.LE.KB(I)) AUP = 0. ADW = 1. IF (K.GT.JMIN(I)) ADW = 0. DV1 = HEOL(k,i) DV2 = 0.5 * (HEOL(k,i) + HEOL(k+1,i)) DV3 = HEOL(k-1,i) DV1Q = QOL(k,i) DV2Q = 0.5 * (QOL(k,i) + QOL(k+1,i)) DV3Q = QOL(k-1,i) DV1u = uOL(k,i) DV2u = 0.5 * (uOL(k,i) + uOL(k+1,i)) DV3u = uOL(k-1,i) DV1v = vOL(k,i) DV2v = 0.5 * (vOL(k,i) + vOL(k+1,i)) DV3v = vOL(k-1,i) DP = 100. * PSFC(I) * DEL(K) DETAu = ETA(k,i) - ETA(k-1,i) DETAD = ETAD(k,i) - ETAD(k-1,i) term1 = aup*eta(k,i) - adw*edto1(i)*etad(k,i) term2 = aup*detau term3 = aup*eta(k-1,i) - adw*edto1(i)*etad(k-1,i) term4 = adw*edto1(i)*detad termq = 0.5*(qrcdo(k,i)+qrcdo(k-1,i)) dellah(k,i) = dellah(k,i) + (g/dp) * & (term1*dv1 - term3*dv3 - term2*dv2 + term4*hcdo(i)) dellaq(k,i) = dellaq(k,i) + (g/dp) * & ( term1*dv1q - term3*dv3q - term2*dv2q + term4*termq ) dellau(k,i) = dellau(k,i) + (g/dp) * & (term1*dv1u - term3*dv3u - term2*dv2u + term4*ucdo(i)) dellav(k,i) = dellav(k,i) + (g/dp) * & (term1*dv1v - term3*dv3v - term2*dv2v + term4*vcdo(i)) ENDIF ENDDO ENDDO !C !C------- CLOUD TOP !C DO I = 1, IM if (ktcon(i).ne.1) then INDX = KTCON(I) DP = 100. * PSFC(I) * DEL(INDX) DV1 = HEOL(INDX-1,I) DELLAH(INDX,I) = ETA(INDX-1,I) * & (HCKO1(INDX-1,I) - DV1) * G / DP DVQ1 = QOL(INDX-1,I) DELLAQ(INDX,I) = ETA(INDX-1,I) * & (QCKO(INDX-1,I) - DVQ1) * G / DP DVu1 = uOL(INDX-1,I) DELLAu(INDX,I) = ETA(INDX-1,I) * & (uCKO(INDX-1,I) - DVu1) * G / DP DVv1 = vOL(INDX-1,I) DELLAv(INDX,I) = ETA(INDX-1,I) * & (vCKO(INDX-1,I) - DVv1) * G / DP !cloud liquid water dellal(i) = eta(indx-1,i) * qlko_ktcon(i) *g/dp endif ENDDO !C !C------- FINAL CHANGED VARIABLE PER UNIT MASS FLUX !C do i = 1,im DO K = 1, KMAX if ( k.le.ktcon(i) .and. ktcon(i).ne.1 ) then xqo0(k,i) = DELLAQ(k,i) * MBDT + Qo0(k,i) if (xqo0(k,i)>0.) then xqo(k,i) = xqo0(k,i) else xqo(k,i) = qsmall endif DELLAT = (DELLAH(k,i) - HVAP * DELLAQ(k,i)) / CP xto(k,i) = DELLAT * MBDT + To(k,i) else xqo(k,i) = Qo0(k,i) xto(k,i) = To(k,i) ENDIF ENDDO ENDDO !c !C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !C !C--- THE ABOVE CHANGED ENVIRONMENT IS NOW USED TO CALULATE THE !C--- EFFECT THE ARBITRARY CLOUD (WITH UNIT MASS FLUX) !C--- WOULD HAVE ON THE STABILITY, !C--- WHICH THEN IS USED TO CALCULATE THE REAL MASS FLUX, !C--- NECESSARY TO KEEP THIS CHANGE IN BALANCE WITH THE LARGE-SCALE !C--- DESTABILIZATION. !C !C--- ENVIRONMENTAL CONDITIONS AGAIN, FIRST HEIGHTS !C do i = 1,im DO K = 1, KMAX call adfpvsx(xto(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 xqeso(k,i) = EPS*es / ( xtvo(k,i) = xto(k,i) + DELTA * xto(k,i) * xqo(k,i) ENDDO ENDDO !C !C HYDROSTATIC HEIGHT ASSUME ZERO TERR !C DLNSIG = LOG(SL(1)) DO I = 1, IM xzo(1,i) = TERR - DLNSIG * RD / G * xtvo(1,i) ENDDO do i = 1,im DO K = 2, KMAX DLNSIG = LOG(SL(K) / SL(K-1)) term1 = dlnsig * rd / g term2 = 0.5 * (xtvo(k,i) + xtvo(k-1,i)) xzo(k,i) = xzo(k-1,i) - term1*term2 ENDDO ENDDO !C !C--- MOIST STATIC ENERGY !C do i = 1,im DO K = 1, KMAX - 1 DZ = 0.5 * (xzo(k+1,i) - xzo(k,i)) DP = 0.5 * ( call adfpvsx(xto(k+1,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 PPRIME = P(k+1,i) + EPSM1 * ES QS = EPS * ES / PPRIME DQSDP = - QS / PPRIME DESDT = ES * (FACT1 / xto(k+1,i) + FACT2 / (xto(k+1,i)**2)) DQSDT = QS * P(k+1,i) * DESDT / (ES * PPRIME) GAMMA = EL2ORC * xqeso(k+1,i) / (xto(k+1,i)**2) DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA)) DQ = DQSDT * DT + DQSDP * DP xtol(k,i) = xto(k+1,i) + DT xqol0(k,i) = xqo(k+1,i) + DQ if (xqol0(k,i)>0.) then xqol(k,i) = xqol0(k,i) else xqol(k,i) = qsmall endif end do end do do i = 1,im do k = 1,kmax-1 PO = 0.5 * ( call adfpvsx(xtol(k,i),es0,adt,ad_es0,adjoint0) esl = 10.*es0 xqesol(k,i) = EPS*esl / (PO + EPSM1*esl) xheo(k,i) = 0.5 * G * (xzo(k,i) + xzo(k+1,i)) + & CP * xtol(k,i) + HVAP * xqol(k,i) xheso(k,i) = 0.5 * G * (xzo(k,i) + xzo(k+1,i)) + & CP * xtol(k,i) + HVAP * xqesol(k,i) ENDDO ENDDO k = kmax do i = 1, im xheo(k,i) = G*xzo(k,i) + CP*xtol(k,i) + HVAP*xqol(k,i) xheso(k,i) = G*xzo(k,i) + CP*xtol(k,i) + HVAP*xqesol(k,i) enddo DO I = 1, IM INDX = KB(I) xhcko(INDX,I) = xheo(INDX,I) xqcko(INDX,I) = xqol(INDX,I) ENDDO !C !C !C**************************** STATIC CONTROL !C !C !C------- MOISTURE AND CLOUD WORK FUNCTIONS !C do i = 1,im DO K = 2, KMAX - 1 if (k.gt.kb(i) .and. k.le.ktcon(i)) then FACTOR = ETA(k-1,i) / ETA(k,i) ONEMF = 1. - FACTOR xhcko(k,i) = FACTOR * xhcko(k-1,i) + ONEMF * & 0.5 * (xheo(k,i) + xheo(k+1,i)) ENDIF ENDDO ENDDO !c do i = 1,im xaa0(i) = 0.0 xpwav(i) = 0.0 end do do i = 1,im do k = 2,kmax-1 if (k.gt.kb(i) .and. k.lt.ktcon(i)) then !c !c xtemp calculation factor = eta(k-1,i)/eta(k,i) onemf = 1. - factor termq = 0.5*(xqol(k,i) + xqol(k+1,i)) xtemp = factor*xqcko(k-1,i) + onemf*termq xtemp0(k,i) = xtemp !c !c xqrch calculation xdby = xhcko(k,i) - xheso(k,i) if (xdby.gt.0.) then gamma = el2orc*xqesol(k,i)/xtol(k,i)**2 xqrch = xqesol(k,i) + gamma*xdby/(hvap*(1.+gamma)) else xqrch = xqesol(k,i) endif xqrch0(k,i) = xqrch !c !c dq calculation dq = eta(k,i)*(xtemp-xqrch) !c !c Actions dependent upon sign of dq if (dq.gt.0.) then dz = 0.5 * (xzo(k+1,i) - xzo(k-1,i)) dz1 = xzo(k,i) - xzo(k-1,i) etah = 0.5 * (eta(k,i) + eta(k-1,i)) qlk = dq / (eta(k,i) + etah * c0 * dz) xqc = qlk + xqrch xqcko(k,i) = xqc xaa0(i) = xaa0(i) - dz1*g*qlk xpw = etah * c0 * dz * qlk xpwav(i) = xpwav(i) + xpw else xqcko(k,i) = xtemp endif !c endif end do end do !c do i = 1,im do k = 2,kmax-1 if (k.gt.kbcon(i) .and. k.le.ktcon(i)) then DZ1 = xzo(k,i) - xzo(k-1,i) GAMMA = EL2ORC * xqesol(k-1,i) / (xtol(k-1,i)**2) RFACT = 1. + DELTA * CP * GAMMA & * xtol(k-1,i) / HVAP XDBY = xhcko(k-1,i) - xheso(k-1,i) term1 = dz1 * (g/cp) term2 = 1./xtol(k-1,i) term3 = xdby term4 = 1./(1.+gamma) term5 = rfact xaa0(i) = xaa0(i) & + term1*term2*term3*term4*term5 dqs = xqesol(k-1,i) - xqol(k-1,i) if (dqs.gt.0.) then XAA0(I) = XAA0(I)+ DZ1 * G * DELTA * dqs endif ENDIF ENDDO ENDDO !C !C------- DOWNDRAFT CALCULATIONS !C !C !C--- DOWNDRAFT MOISTURE PROPERTIES !C DO I = 1, IM XPWEV(I) = 0. ENDDO DO I = 1, IM IF (DWNFLG2(I)) THEN JMN = JMIN(I) XHCD(I) = xheo(JMN,I) XQRCD(JMN,I) = xqesol(JMN,I) ENDIF ENDDO do i = 1,im DO K = KMAX-1, 1, -1 IF (DWNFLG2(I) .AND. K.LT.JMIN(I)) THEN dq = xqesol(k,i) dt = xtol(k,i) gamma = el2orc*dq/dt**2 dh = xhcd(i) - xheso(k,i) term5 = (1./hvap) * gamma term6 = 1./(1.+gamma) xqrcd(k,i) = dq + term5*term6*dh detad = etad(k+1,i) - etad(k,i) term1 = etad(k+1,i)*xqrcd(k+1,i) term2 = etad(k,i)*xqrcd(k,i) term3 = detad * 0.5 * (xqrcd(k,i) + xqrcd(k+1,i)) xpwd = term1 - term2 - term3 XPWEV(I) = XPWEV(I) + XPWD ENDIF ENDDO ENDDO !c !C DO I = 1, IM edtmax = edtmaxl if (nint(slimsk(i)) .eq. 0) edtmax = edtmaxs IF (DWNFLG2(I)) THEN IF (XPWEV(I).GE.0.) THEN EDTX1(I) = 0. ELSE EDTX1(I) = -EDTX(I) * XPWAV(I) / XPWEV(I) edtx10(i) = edtx1(i) if (edtx1(i).gt.edtmax) then edtx1(i) = edtmax endif ENDIF ELSE EDTX1(I) = 0. ENDIF ENDDO !C !C !C !C--- DOWNDRAFT CLOUDWORK FUNCTIONS !C !C !cround reverse order of loop yields slightly difference results !c difference only in q and rn, not t do i = 1,im DO K = KMAX-1, 1, -1 IF (DWNFLG2(I) .AND. K.LT.JMIN(I)) THEN GAMMA = EL2ORC * xqesol(k+1,i) / xtol(k+1,i)**2 DHH = XHCD(I) DT = xtol(k+1,i) DG = GAMMA DH = xheso(k+1,i) dz = xzo(k,i) - xzo(k+1,i) term1 = edtx1(i) term2 = dz term3 = g/(cp*dt) term4 = dhh-dh term5 = 1./(1.+dg) term6 = 1. + delta*cp*dg*dt/hvap dqs = xqesol(k+1,i)-xqol(k+1,i) xaa0(i) = xaa0(i) & + term1*term2*term3*term4*term5*term6 if (dqs.gt.0.) then XAA0(I) = XAA0(I) + EDTX1(I)*DZ*G*DELTA*dqs endif ENDIF ENDDO ENDDO !C !C CALCULATE CRITICAL CLOUD WORK FUNCTION !C DO I = 1, IM ACRT(I) = 0. IF ( ACRT(I) = ACRIT(15)*(975.-P(KTCON(I),I)) & /(975.-PCRIT(15)) ELSEIF ( ACRT(I) = ACRIT(1) ELSE k = int((850. - p(ktcon(i),i))/50.) + 2 K = MIN(K,15) K = MAX(K,2) ACRT(I) = ACRIT(K)+(ACRIT(K-1)-ACRIT(K))* & ( ENDIF ENDDO DO I = 1, IM ACRTFCT(I) = 1. if (nint(slimsk(i)) .eq. 1) then w1 = w1l w2 = w2l w3 = w3l w4 = w4l else w1 = w1s w2 = w2s w3 = w3s w4 = w4s endif IF (PDOT(I).LE.W4) THEN ACRTFCT(I) = (PDOT(I) - W4) / (W3 - W4) ELSEIF (PDOT(I).GE.-W4) THEN ACRTFCT(I) = -1*(PDOT(I) + W4) / (W4 - W3) ELSE ACRTFCT(I) = 0. ENDIF acrtfct0(i) = acrtfct(i) !c if (acrtfct(i).lt.-1.) then acrtfct(i) = -1. endif if (acrtfct(i).gt.1.) then acrtfct(i) = 1. endif !c ACRTFCT1(I) = 1. - ACRTFCT(I) !c DTCONV(I) = DT2 + (1800. - DT2) * & (PDOT(I) - W2) / (W1 - W2) dtconv0(i) = dtconv(i) if (dtconv(i).lt.dtmin) then dtconv(i) = dtmin endif if (dtconv(i).gt.dtmax) then dtconv(i) = dtmax endif ENDDO !C !C--- LARGE SCALE FORCING !C DO I= 1, IM F(I) = (AA1(I) - ACRT(I) * ACRTFCT1(I)) / DTCONV(I) XK(I) = (XAA0(I) - AA1(I)) / MBDT !C !C--- KERNEL, CLOUD BASE MASS FLUX !C if (abs(xk(i)).gt.tiny) then ratio = -f(i)/xk(i) else ratio = 0.0 endif if ( fixed = tdpscl(i)*tdpcld(i)*tdetrn(i)*tdpdwn(i) xmb(i) = fixed * ratio*tcwfup(i)*tcwfdn(i) else xmb(i) = 0.0 endif xmb0(i) = xmb(i) if (xmb(i).gt.xmbmax(i)) then xmb(i) = xmbmax(i) endif ENDDO !c !C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !C !C--- FEEDBACK: SIMPLY THE CHANGES FROM THE CLOUD WITH UNIT MASS FLUX !C--- MULTIPLIED BY THE MASS FLUX NECESSARY TO KEEP THE !C--- EQUILIBRIUM WITH THE LARGER-SCALE. !C !cround !c reverse order of loop, different q and rn do i = 1,im do k = 1,km dellal1(i) = 0.0 dellalk(k,i) = 0.0 dellalk(k,i) = dellal(i) if (k.le.ktcon(i) .and. ktcon(i).ne.1) then dellat = (dellah(k,i)-hvap*dellaq(k,i))/cp to2(k,i) = to(k,i) + dellat*xmb(i)*dt2 qo2(k,i) = qo0(k,i) + dellaq(k,i)*xmb(i)*dt2 uo2(k,i) = uo(k,i) + dellau(k,i)*xmb(i)*dt2 vo2(k,i) = vo(k,i) + dellav(k,i)*xmb(i)*dt2 call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 qeso2(k,i) = eps*es / ( if (k.eq.ktcon(i) .and. ncloud.gt.0 .and. cnvflg(i)) then dp = 100. * psfc(i) * del(k) cwmo2(k,i) = cwmo(k,i) + dellalk(k,i) * xmb(i) * dt2 dellal1(i) = dellalk(k,i)*xmb(i)*dp/g else cwmo2(k,i) = cwmo(k,i) dellal1(i) = dellalk(k,i) endif else to2(k,i) = to(k,i) qo2(k,i) = qo(k,i) uo2(k,i) = uo(k,i) vo2(k,i) = vo(k,i) cwmo2(k,i)= cwmo(k,i) call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 qeso2(k,i) = eps*es / ( dellal1(i) = dellalk(k,i) ENDIF dellal(i) = dellal1(i) dellal1(i)= 0.0 ENDDO ENDDO !c DO I = 1, IM rntot(i) = 0. ENDDO !cround different results when reverse loop do i = 1,im DO K = KMAX, 1, -1 if (k.le.ktcon(i) .and. ktcon(i).ne.1) then AUP = 1. IF (K.Le.KB(I)) AUP = 0. ADW = 1. IF (K.GT.JMIN(I)) ADW = 0. rain = AUP * PWO(k,i) + ADW * EDTO1(I) * PWDO(k,i) RNtot(I) = RNtot(I) + rain * xmb(i) * .001 * dt2 ENDIF ENDDO ENDDO !c !cround very slight difference in q and r do i = 1,im rn0 = 0.0 delqev = 0.0 flg(i) = .true. !c do k = km,1,-1 qevap = 0. qcond = 0. delq2 = 0. !c !c Accumulate precipitation from cloud level if (k.le.ktcon(i) .and. ktcon(i).ne.1) then aup = 1. if (k.le.kb(i)) aup = 0. adw = 1. if (k.gt.jmin(i)) adw = 0. rain = aup*pwo(k,i) + adw*edto1(i)*pwdo(k,i) rn0 = rn0 + rain*xmb(i)*.001*dt2 endif !c !c Save layer specific quantities for use in adjoint rn0k(k,i) = rn0 flgk(k,i) = flg(i) delqevk(k,i) = delqev !c !c Check if any falling precipitation will evaporate if (flg(i) .and. k.le.ktcon(i)) then !! if (nint(slimsk(i)) .eq. 1) then !! evef = 0.07 !! else !! evef = edt(i)*evfact !! endif evef = edt(i)*evfact term1 = evef term2 = qo2(k,i) - qeso2(k,i) term3 = el2orc*qeso2(k,i)/to2(k,i)**2 term4 = 1. / (1.+term3) qcond = term1*term2*term4 dp = 100. * psfc(i) * del(k) !c !c Compute amount of precipitation subject to evaporation if (rn0 .gt.0. .and. qcond.lt.0.) then qevap = -qcond * (1.-exp(-.32*sqrt(dt2*rn0))) if ( qevap .gt. rn0*1000.*g/dp ) then qevap = rn0*1000.*g/dp endif delq2 = delqev + .001 * qevap * dp / g if (delq2.gt.rntot(i)) then qevap = 1000.* g * (rntot(i)-delqev) / dp flg(i) = .false. endif endif !c !c Adjust t and q profiles plus net rain in response !c to evaporation of falling precipitation. if (rn0 .gt.0. .and. qevap.gt.0.) then qo3(k,i) = qo2(k,i) + qevap to3(k,i) = to2(k,i) - elocp * qevap rn0 = rn0 - .001 * qevap * dp / g delqev = delqev + .001*dp*qevap/g !c !c Otherwise, no adjustment to t and q profiles else to3(k,i) = to2(k,i) qo3(k,i) = qo2(k,i) endif !c !c Above cloud top (or not cloud present). !c Therefore, no changes to t and q. else to3(k,i) = to2(k,i) qo3(k,i) = qo2(k,i) endif !c enddo !c !c Save net surface precipitation. rn1(i) = rn0 enddo !c !c !c Load output arrays. do i = 1,im !c !c If total precipitation is negative, restore initial profiles. rn11(i) = rn1(i) if (rn1(i).lt.0.) then rn1(i) = 0.0 do k = 1,km t1(k,i) = to(k,i) q1(k,i) = qo0(k,i) end do !c !c Otherwise, load modified t,q profile to output arrays else do k = 1,km t1(k,i) = to3(k,i) q1(k,i) = qo3(k,i) end do endif !c !c Load various diagostic output arrays ktop(i) = ktcon(i) kbot(i) = kbcon(i) kuo(i) = 1 cldwrk(i) = aa1(i) end do ! Transfer input u,v,cwm to ouptut arrays do i = 1,im do k=1,km u1(k,i) = uo2(k,i) v1(k,i) = vo2(k,i) cwm1(k,i)= cwmo2(k,i) end do end do if (.not.adjoint) return !c !c !c !c===================================================================== !c !c !c Begin adjoint code here ! Adjoint of u,v,cwm transfer do i = 1,im do k=1,km ad_uo2(k,i) = ad_uo2(k,i) + ad_u1(k,i) ad_vo2(k,i) = ad_vo2(k,i) + ad_v1(k,i) ad_cwmo2(k,i) = ad_cwmo2(k,i) + ad_cwm1(k,i) ad_u1(k,i) = 0.0 ad_v1(k,i) = 0.0 ad_cwm1(k,i) = 0.0 end do end do !c !c Adjoint of loading of output arrays do i = 1,im !c !c zero or negative precip case. if (rn11(i).lt.0.) then ad_rn1(i) = 0.0 do k = km,1,-1 ad_qo0(k,i)= ad_qo0(k,i)+ ad_q1(k,i) ad_to(k,i) = ad_to(k,i) + ad_t1(k,i) ad_q1(k,i) = 0.0 ad_t1(k,i) = 0.0 end do !c !c precipitation greater than zero case else do k = km,1,-1 ad_qo3(k,i) = ad_qo3(k,i) + ad_q1(k,i) ad_to3(k,i) = ad_to3(k,i) + ad_t1(k,i) ad_q1(k,i) = 0.0 ad_t1(k,i) = 0.0 end do endif end do !c !c Adjoint of final precipitation calculation (including !c evaporation of falling precipitation) !c do i = 1,im !c !c Zero local adjoint variables ad_rn0 = 0.0 ad_delqev = 0.0 !c !c Adjoint of rn0 to rn1 transfer ad_rn0 = ad_rn0 + ad_rn1(i) !c do k = 1,km !c !c Restore saved values from nlm rn0 = rn0k(k,i) flg(i) = flgk(k,i) delqev = delqevk(k,i) qevap = 0.0 qcond = 0.0 delq2 = 0.0 !c !c Zero local adjoint variables ad_qevap = 0.0 ad_qcond = 0.0 !c !c Adjoint of code for evaporation of falling precipitation if (flg(i) .and. k.le.ktcon(i)) then !c !c Redo nlm !! if (nint(slimsk(i)) .eq. 1) then !! evef = 0.07 !! else !! evef = edt(i)*evfact !! endif evef = edt(i)*evfact term1 = evef term2 = qo2(k,i) - qeso2(k,i) term3 = el2orc*qeso2(k,i)/to2(k,i)**2 term4 = 1. / (1.+term3) qcond = term1*term2*term4 dp = 100. * psfc(i) * del(k) if (rn0.gt.0 .and. qcond.lt.0.) then qevap = -qcond * (1.-exp(-.32*sqrt(dt2*rn0))) qevap0 = qevap if ( qevap .gt. (rn0*1000.*g/dp) ) then qevap = rn0*1000.*g/dp endif delq2 = delqev + 0.001 * qevap * dp / g qevap1 = qevap if (delq2.gt.rntot(i)) then qevap = 1000.* g * (rntot(i)-delqev) / dp endif endif !c !c Adjoint of t,q,rn0 adjustments due to evaporation if ( rn0.gt.0. .and. qevap.gt.0. ) then ad_qevap = ad_qevap + 0.001*ad_delqev*dp/g ad_qevap = ad_qevap - 0.001*ad_rn0*dp/g ad_qevap = ad_qevap - elocp*ad_to3(k,i) ad_to2(k,i) = ad_to2(k,i) + ad_to3(k,i) ad_qevap = ad_qevap + ad_qo3(k,i) ad_qo2(k,i) = ad_qo2(k,i) + ad_qo3(k,i) !c !c Otherwise adjoint of no adjustment case else ad_qo2(k,i) = ad_qo2(k,i) + ad_qo3(k,i) ad_to2(k,i) = ad_to2(k,i) + ad_to3(k,i) endif !c !c Adjoint of qevap calculation if (rn0.gt.0. .and. qcond.lt.0.) then if (delq2.gt.rntot(i)) then ad_delqev = ad_delqev - 1000.*g*ad_qevap/dp ad_rntot(i) = ad_rntot(i) + 1000.*g*ad_qevap/dp endif if (qevap0 .gt. rn0*1000.*g/dp) then ad_rn0 = ad_rn0 + ad_qevap*1000.*g/dp endif ad_rn0 = ad_rn0 & + qcond * (exp(-0.32*sqrt(dt2*rn0)) * & (-0.32*0.5/sqrt(dt2*rn0)) * dt2*ad_qevap) ad_qcond = ad_qcond & - ad_qevap * (1.-exp(-0.32*sqrt(dt2*rn0))) endif !c !c Adjoint of qcond calculation ad_term4 = 0.0 ad_term3 = 0.0 ad_term2 = 0.0 ad_term1 = 0.0 ad_evef = 0.0 !c ad_term4 = ad_term4 + term1*term2*ad_qcond ad_term2 = ad_term2 + term1*term4*ad_qcond ad_term1 = ad_term1 + term2*term4*ad_qcond ad_term3 = ad_term3 - 1./(1.+term3)**2 * ad_term4 ad_to2(k,i) = ad_to2(k,i) & - 2.*el2orc*qeso2(k,i)/to2(k,i)**3 * ad_term3 ad_qeso2(k,i) = ad_qeso2(k,i) & + el2orc*ad_term3/to2(k,i)**2 ad_qeso2(k,i) = ad_qeso2(k,i) - ad_term2 ad_qo2(k,i) = ad_qo2(k,i) + ad_term2 ad_evef = ad_evef + ad_term1 !! if (nint(slimsk(i)) .eq. 1) then !! ad_evef = 0.0 !! else !! ad_edt(i) = ad_edt(i) + ad_evef*evfact !! endif ad_edt(i) = ad_edt(i) + ad_evef*evfact !c !c !c Adjoint of "2" to "3" transfer. This is the case !c when above cloud top or no cloud present. else ad_to2(k,i) = ad_to2(k,i) + ad_to3(k,i) ad_qo2(k,i) = ad_qo2(k,i) + ad_qo3(k,i) endif !c !c Adjoint of layer rain calculation if (k.le.ktcon(i) .and. ktcon(i).ne.1) then !c !c Redo nlm aup = 1. if (k.le.kb(i)) aup = 0. adw = 1. if (k.gt.jmin(i)) adw = 0. rain = aup*pwo(k,i) + adw*edto1(i)*pwdo(k,i) !c !c Adjoint of tlm code. ad_rain = 0.0 ad_xmb(i) = ad_xmb(i) + rain*ad_rn0*0.001*dt2 ad_rain = ad_rain + ad_rn0*xmb(i)*0.001*dt2 ad_pwdo(k,i) = ad_pwdo(k,i) + adw*edto1(i)*ad_rain ad_edto1(i) = ad_edto1(i) + adw*ad_rain*pwdo(k,i) ad_pwo(k,i) = ad_pwo(k,i) + aup*ad_rain endif !c !c Zero local adjoint variables ad_qevap = 0.0 ad_qcond = 0.0 !c !c End of loop over vertical coordinate end do !c !c Zero local adjoint variables ad_rn0 = 0.0 ad_delqev = 0.0 !c !c End of loop over profiles end do !c !c !c Adjoint of intial total precipitation calculation do i = 1,im do k = 1,kmax if (k.le.ktcon(i) .and. ktcon(i).ne.1) then !c !c Redo nlm aup = 1. if (k.le.kb(i)) aup = 0. adw = 1. if (k.gt.jmin(i)) adw = 0. rain = AUP * PWO(k,i) + ADW * EDTO1(I) * PWDO(k,i) !c !c Adjoint of tlm code ad_rain = 0.0 ad_xmb(i) = ad_xmb(i) + rain*0.001*dt2 * ad_rntot(i) ad_rain = ad_rain + 0.001*xmb(i)*dt2 * ad_rntot(i) ad_pwdo(k,i) = ad_pwdo(k,i) + adw*edto1(i)*ad_rain ad_edto1(i) = ad_edto1(i) + adw*pwdo(k,i)*ad_rain ad_pwo(k,i) = ad_pwo(k,i) + aup*ad_rain endif end do end do !c !c Adjoint of to2 and qo2 calculation (prior to evaportation) do i = 1,im do k = km,1,-1 ad_dellal1(i) = 0.0 ad_dellal1(i) = ad_dellal1(i) + ad_dellal(i) if (k.le.ktcon(i) .and. ktcon(i).ne.1) then ! ! Redo nlm dellat = (dellah(k,i)-hvap*dellaq(k,i))/cp call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 ! ! Adjoint of tlm code ad_dellat = 0.0 ad_es = 0.0 ad_es0 = 0.0 if (k.eq.ktcon(i) .and. ncloud.gt.0 .and. cnvflg(i)) then dp = 100.*psfc(i)*del(k) ad_dellalk(k,i) = ad_dellalk(k,i) + & ad_dellal1(i)*xmb(i)*dp/g ad_xmb(i) = ad_xmb(i) + & dellalk(k,i)*ad_dellal1(i)*dp/g ad_dellalk(k,i) = ad_dellalk(k,i) + & ad_cwmo2(k,i)*xmb(i)*dt2 ad_xmb(i) = ad_xmb(i) + & dellalk(k,i)*ad_cwmo2(k,i)*dt2 ad_cwmo(k,i) = ad_cwmo(k,i) + ad_cwmo2(k,i) ad_cwmo2(k,i) = 0.0 else ad_cwmo(k,i) = ad_cwmo(k,i) + ad_cwmo2(k,i) ad_dellalk(k,i) = ad_dellalk(k,i) + ad_dellal1(i) ad_cwmo2(k,i) = 0.0 endif !c ad_es = ad_es - eps*es/( epsm1*ad_qeso2(k,i) ad_es = ad_es + eps*ad_qeso2(k,i)/( ad_es0 = ad_es0 + 10*ad_es adt=0.0 call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint) ad_to2(k,i) = ad_to2(k,i) + adt ad_vo(k,i) = ad_vo(k,i) + ad_vo2(k,i) ad_xmb(i) = ad_xmb(i) + & ad_vo2(k,i)*dellav(k,i)*dt2 ad_dellav(k,i) = ad_dellav(k,i) + & ad_vo2(k,i)*xmb(i)*dt2 ad_uo(k,i) = ad_uo(k,i) + ad_uo2(k,i) ad_xmb(i) = ad_xmb(i) + & ad_uo2(k,i)*dellau(k,i)*dt2 ad_dellau(k,i) = ad_dellau(k,i) + & ad_uo2(k,i)*xmb(i)*dt2 ad_qo(k,i) = ad_qo(k,i) + ad_qo2(k,i) ad_xmb(i) = ad_xmb(i) + & ad_qo2(k,i)*dellaq(k,i)*dt2 ad_dellaq(k,i) = ad_dellaq(k,i) + & ad_qo2(k,i)*xmb(i)*dt2 ad_to(k,i) = ad_to(k,i) + ad_to2(k,i) ad_xmb(i) = ad_xmb(i) + ad_to2(k,i)*dellat*dt2 ad_dellat = ad_dellat + ad_to2(k,i)*xmb(i)*dt2 ad_dellaq(k,i) = ad_dellaq(k,i) - hvap*ad_dellat/cp ad_dellah(k,i) = ad_dellah(k,i) + ad_dellat/cp else !c !c Redo nlm call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 !c !c Adjoint of tlm code ad_es = 0.0 ad_es0= 0.0 ad_dellalk(k,i) = ad_dellalk(k,i) + ad_dellal1(i) ad_es = ad_es - eps*es/( epsm1*ad_qeso2(k,i) ad_es = ad_es + eps*ad_qeso2(k,i)/( ad_es0 = ad_es0 + 10.*ad_es adt = 0.0 call adfpvsx(to2(k,i),es0,adt,ad_es0,adjoint) ad_to2(k,i) = ad_to2(k,i) + adt ad_cwmo(k,i) = ad_cwmo(k,i) + ad_cwmo2(k,i) ad_vo(k,i) = ad_vo(k,i) + ad_vo2(k,i) ad_uo(k,i) = ad_uo(k,i) + ad_uo2(k,i) ad_qo(k,i) = ad_qo(k,i) + ad_qo2(k,i) ad_to(k,i) = ad_to(k,i) + ad_to2(k,i) endif ad_dellal(i) = ad_dellal(i) + ad_dellalk(k,i) ad_dellalk(k,i) = 0.0 ad_dellal1(i) = 0.0 !c end do end do !c !c Adjoint of kernel (cloud mass flux) calculation do i = 1,im !c !c Redo nlm if (abs(xk(i)).gt.tiny) then ratio = -f(i)/xk(i) else ratio = 0.0 endif fixed = tdpscl(i)*tdpcld(i)*tdetrn(i)*tdpdwn(i) !c !c Adjoint of tlm if (xmb0(i).gt.xmbmax(i)) then !c do nothing since tlm = 0.0 ad_xmb(i) = 0.0 endif ad_ratio = 0.0 if ( ad_tcwfdn(i) = ad_tcwfdn(i) & + fixed*ratio*tcwfup(i)*ad_xmb(i) ad_tcwfup(i) = ad_tcwfup(i) & + fixed*ratio*ad_xmb(i)*tcwfdn(i) ad_ratio = ad_ratio + fixed*ad_xmb(i)*tcwfup(i)*tcwfdn(i) else !c do nothing since tlm = 0.0 ad_xmb(i) = 0.0 endif if (abs(xk(i)).gt.tiny) then ad_xk(i) = ad_xk(i) + f(i)/xk(i)**2 * ad_ratio ad_f(i) = ad_f(i) - ad_ratio/xk(i) else !c do nothing since tlm = 0.0 ad_ratio = 0.0 endif !c !c Adjoint of xk tlm ad_aa1(i) = ad_aa1(i) - ad_xk(i)/mbdt ad_xaa0(i) = ad_xaa0(i) + ad_xk(i)/mbdt !c !c Adjoint of f tlm ad_dtconv(i) = ad_dtconv(i) & - (aa1(i) - acrt(i)*acrtfct1(i))/dtconv(i)**2 & * ad_f(i) ad_acrtfct1(i) = ad_acrtfct1(i) & - acrt(i)*ad_f(i) / dtconv(i) ad_aa1(i) = ad_aa1(i) + ad_f(i) / dtconv(i) !c end do !c !c Adjoint of acrtfct1 and dtconv calculations !c do i = 1,im !c !c Redo nlm if (nint(slimsk(i)) .eq. 1) then w1 = w1l w2 = w2l w3 = w3l w4 = w4l else w1 = w1s w2 = w2s w3 = w3s w4 = w4s endif !c !c Adjoint of dtconv calculation if (dtconv0(i).gt.dtmax) then !c do nothing since tlm = 0.0 ad_dtconv(i) = 0.0 endif if (dtconv0(i).lt.dtmin) then !c do nothing since tlm = 0.0 ad_dtconv(i) = 0.0 endif ad_pdot(i) = ad_pdot(i) + (1800.-dt2) & * ad_dtconv(i)/(w1-w2) !c !c Adjoint of acrtfct calculation ad_acrtfct(i) = ad_acrtfct(i) - ad_acrtfct1(i) if (acrtfct0(i).gt.1.) then !c do nothing since tlm = 0.0 ad_acrtfct(i) = 0.0 endif if (acrtfct0(i).lt.-1.) then !c do nothing since tlm = 0.0 ad_acrtfct(i) = 0.0 endif if (pdot(i).le.w4) then ad_pdot(i) = ad_pdot(i) + ad_acrtfct(i)/(w3-w4) elseif (pdot(i).ge.-w4) then ad_pdot(i) = ad_pdot(i) - ad_acrtfct(i)/(w4-w3) else !c do nothing since tlm = 0.0 ad_acrtfct(i) = 0.0 endif !c end do !c !c Adjoint of xaa0 downdraft cloudwork function calculation do i = 1,im do k = 1,kmax-1 if (dwnflg2(i) .and. k.lt.jmin(i)) then !c !c Redo nlm calculations GAMMA = EL2ORC * XQESOL(k+1,i) / XTOL(k+1,i)**2 DHH = XHCD(I) DT = XTOL(k+1,i) DG = GAMMA DH = XHESO(k+1,i) dz = xzo(k,i) - xzo(k+1,i) !c term1 = edtx1(i) term2 = dz term3 = g/(cp*dt) term4 = (dhh-dh) term5 = 1./(1.+dg) term6 = 1. + delta*cp*dg*dt/hvap dqs = xqesol(k+1,i) - xqol(k+1,i) !c !c Adjoint of tlm code ad_dqs = 0.0 ad_dz = 0.0 ad_dt = 0.0 ad_dg = 0.0 ad_dh = 0.0 ad_dhh = 0.0 if (dqs.gt.0.) then ad_dqs = ad_dqs + edtx1(i)*dz*g*delta * ad_xaa0(i) ad_dz = ad_dz + edtx1(i)*g*delta*dqs * ad_xaa0(i) ad_edtx1(i) = ad_edtx1(i) + dz*g*delta*dqs & * ad_xaa0(i) endif !c ad_term1 = term2*term3*term4*term5*term6*ad_xaa0(i) ad_term2 = term1*term3*term4*term5*term6*ad_xaa0(i) ad_term3 = term1*term2*term4*term5*term6*ad_xaa0(i) ad_term4 = term1*term2*term3*term5*term6*ad_xaa0(i) ad_term5 = term1*term2*term3*term4*term6*ad_xaa0(i) ad_term6 = term1*term2*term3*term4*term5*ad_xaa0(i) ad_xqol(k+1,i) = ad_xqol(k+1,i) - ad_dqs ad_xqesol(k+1,i) = ad_xqesol(k+1,i) + ad_dqs !c ad_dt = (delta*cp/hvap) * dg*ad_term6 ad_dg = (delta*cp/hvap) * ad_term6*dt ad_dg = ad_dg - 1./(1.+dg)**2 * ad_term5 ad_dh = ad_dh - ad_term4 ad_dhh = ad_dhh + ad_term4 ad_dt = ad_dt - g/(cp*dt*dt) * ad_term3 ad_dz = ad_dz + ad_term2 ad_edtx1(i) = ad_edtx1(i) + ad_term1 ad_xzo(k,i) = ad_xzo(k,i) + ad_dz ad_xzo(k+1,i) = ad_xzo(k+1,i) - ad_dz ad_xheso(k+1,i)= ad_xheso(k+1,i) + ad_dh ad_gamma = ad_dg ad_xtol(k+1,i) = ad_xtol(k+1,i) + ad_dt ad_xhcd(i) = ad_xhcd(i) + ad_dhh ad_xtol(k+1,i) = ad_xtol(k+1,i) & - 2.*el2orc*xqesol(k+1,i)/xtol(k+1,i)**3 & * ad_gamma ad_xqesol(k+1,i) = ad_xqesol(k+1,i) + & el2orc*ad_gamma/xtol(k+1,i)**2 endif end do end do !c !c Adjoint of final edtx1 calculation do i = 1,im edtmax = edtmaxl if (nint(slimsk(i)) .eq. 0) edtmax = edtmaxs if (dwnflg2(i)) then if (xpwev(i).ge.0.) then !c do nothing since tlm is 0.0 ad_edtx1(i) = 0.0 else if (edtx10(i).gt.edtmax) then !c do nothing since tlm is 0.0 ad_edtx1(i) = 0.0 else ad_xpwev(i) = ad_xpwev(i) & + edtx(i)*xpwav(i)/xpwev(i)**2 * ad_edtx1(i) ad_xpwav(i) = ad_xpwav(i) & - edtx(i)*ad_edtx1(i)/xpwev(i) ad_edtx(i) = ad_edtx(i) & - ad_edtx1(i)*xpwav(i)/xpwev(i) endif endif else !c do nothing since tlm is 0.0 ad_edtx1(i) = 0.0 endif enddo !c !c Adjoint of downdraft xpwev calculation do i = 1,im do k = 1,kmax-1 if (dwnflg2(i) .and. k.lt.jmin(i)) then !c !c Redo nlm dq = xqesol(k,i) dt = xtol(k,i) gamma = el2orc*dq/dt**2 dh = xhcd(i) - xheso(k,i) term5 = (1./hvap) * gamma term6 = 1./(1.+gamma) detad = etad(k+1,i) - etad(k,i) term1 = etad(k+1,i)*xqrcd(k+1,i) term2 = etad(k,i)*xqrcd(k,i) term3 = detad * 0.5 * (xqrcd(k,i) + xqrcd(k+1,i)) !c !c Adjoint of tlm code ad_xpwd = 0.0 ad_detad = 0.0 ad_dh = 0.0 ad_gamma = 0.0 ad_dt = 0.0 ad_dq = 0.0 ad_term1 = 0.0 ad_term2 = 0.0 ad_term3 = 0.0 ad_term5 = 0.0 ad_term6 = 0.0 ad_xpwd = ad_xpwd + ad_xpwev(i) ad_term1 = ad_term1 + ad_xpwd ad_term2 = ad_term2 - ad_xpwd ad_term3 = ad_term3 - ad_xpwd ad_xqrcd(k+1,i) = ad_xqrcd(k+1,i) + etad(k+1,i)*ad_term1 ad_etad(k+1,i) = ad_etad(k+1,i) + ad_term1*xqrcd(k+1,i) ad_xqrcd(k,i) = ad_xqrcd(k,i) + etad(k,i)*ad_term2 ad_etad(k,i) = ad_etad(k,i) + ad_term2*xqrcd(k,i) ad_detad = ad_detad & + ad_term3*0.5*(xqrcd(k,i)+xqrcd(k+1,i)) ad_xqrcd(k,i) = ad_xqrcd(k,i) + detad*0.5*ad_term3 ad_xqrcd(k+1,i) = ad_xqrcd(k+1,i) + detad*0.5*ad_term3 ad_etad(k,i) = ad_etad(k,i) - ad_detad ad_etad(k+1,i) = ad_etad(k+1,i) + ad_detad ad_dh = ad_dh + term5*term6*ad_xqrcd(k,i) ad_term6 = ad_term6 + term5*dh*ad_xqrcd(k,i) ad_term5 = ad_term5 + term6*dh*ad_xqrcd(k,i) ad_dq = ad_dq + ad_xqrcd(k,i) ad_gamma = ad_gamma -1./(1.+gamma)**2 * ad_term6 ad_gamma = ad_gamma + (1./hvap)*ad_term5 ad_xheso(k,i) = ad_xheso(k,i) - ad_dh ad_xhcd(i) = ad_xhcd(i) + ad_dh ad_dt = ad_dt - 2.*el2orc*dq/dt**3 * ad_gamma ad_dq = ad_dq + el2orc*ad_gamma/dt**2 ad_xtol(k,i) = ad_xtol(k,i) + ad_dt ad_xqesol(k,i) = ad_xqesol(k,i) + ad_dq endif end do end do !c !c Adjoint of xheo,xqesol --> xhcd,xqrcd transfers do i = 1,im if (dwnflg2(i)) then jmn = jmin(i) ad_xqesol(jmn,i) = ad_xqesol(jmn,i) + ad_xqrcd(jmn,i) ad_xheo(jmn,i) = ad_xheo(jmn,i) + ad_xhcd(i) endif end do !c !c Adjoint of xaa0 calculations !c do i = 1,im do k = kmax-1,2,-1 if (k.gt.kbcon(i).and.k.le.ktcon(i)) then !c !c Recalculate nlm dz1 = xzo(k,i) - xzo(k-1,i) gamma = el2orc*xqesol(k-1,i)/xtol(k-1,i)**2 rfact = 1. + delta*cp*gamma*xtol(k-1,i)/hvap xdby = xhcko(k-1,i) - xheso(k-1,i) term1 = dz1 * (g/cp) term2 = 1./xtol(k-1,i) term3 = xdby term4 = 1./(1.+gamma) term5 = rfact dqs = xqesol(k-1,i) - xqol(k-1,i) !c !c Zero local adjoint variables ad_dqs = 0.0 ad_dz1 = 0.0 ad_term1 = 0.0 ad_term2 = 0.0 ad_term3 = 0.0 ad_term4 = 0.0 ad_term5 = 0.0 ad_rfact = 0.0 ad_gamma = 0.0 ad_xdby = 0.0 !c !c Adjoint of forward model tlm if (dqs.gt.0.) then ad_dqs = ad_dqs + g*delta * dz1*ad_xaa0(i) ad_dz1 = ad_dz1 + g*delta * dqs*ad_xaa0(i) endif ad_xqol(k-1,i) = ad_xqol(k-1,i) - ad_dqs ad_xqesol(k-1,i) = ad_xqesol(k-1,i) + ad_dqs ad_term5 = ad_term5 + term1*term2*term3*term4*ad_xaa0(i) ad_term4 = ad_term4 + term1*term2*term3*ad_xaa0(i)*term5 ad_term3 = ad_term3 + term1*term2*ad_xaa0(i)*term4*term5 ad_term2 = ad_term2 + term1*ad_xaa0(i)*term3*term4*term5 ad_term1 = ad_term1 + ad_xaa0(i)*term2*term3*term4*term5 ad_rfact = ad_rfact + ad_term5 ad_gamma = ad_gamma - 1./(1.+gamma)**2 * ad_term4 ad_xdby = ad_xdby + ad_term3 ad_xtol(k-1,i) = ad_xtol(k-1,i) & - 1./(xtol(k-1,i)**2) * ad_term2 ad_dz1 = ad_dz1 + ad_term1 * (g/cp) ad_xheso(k-1,i) = ad_xheso(k-1,i) - ad_xdby ad_xhcko(k-1,i) = ad_xhcko(k-1,i) + ad_xdby ad_xtol(k-1,i) = ad_xtol(k-1,i) & + (delta*cp/hvap)*gamma*ad_rfact ad_gamma = ad_gamma & + (delta*cp/hvap)*ad_rfact*xtol(k-1,i) ad_xtol(k-1,i) = ad_xtol(k-1,i) & - 2.*el2orc*xqesol(k-1,i)/(xtol(k-1,i)**3) & * ad_gamma ad_xqesol(k-1,i) = ad_xqesol(k-1,i) & + el2orc*ad_gamma/xtol(k-1,i)**2 ad_xzo(k-1,i) = ad_xzo(k-1,i) - ad_dz1 ad_xzo(k,i) = ad_xzo(k,i) + ad_dz1 endif end do end do !c !c Adjoint of xpwav calculation and initial xaa0 calculation !c do i = 1,im do k = kmax-1,2,-1 if (k.gt.kb(i) .and. k.lt.ktcon(i)) then !c !c Redo nlm factor = eta(k-1,i)/eta(k,i) onemf = 1. - factor termq = 0.5*(xqol(k,i) + xqol(k+1,i)) gamma = el2orc*xqesol(k,i)/xtol(k,i)**2 xdby = xhcko(k,i) - xheso(k,i) xtemp = xtemp0(k,i) xqrch = xqrch0(k,i) dq = eta(k,i)*(xtemp-xqrch) !c !c Adjoint code ad_xtemp = 0.0 ad_termq = 0.0 ad_onemf = 0.0 ad_factor = 0.0 ad_xqrch = 0.0 ad_gamma = 0.0 ad_xdby = 0.0 ad_xqc = 0.0 ad_qlk = 0.0 ad_xpw = 0.0 ad_dz = 0.0 ad_etah = 0.0 ad_dz1 = 0.0 ad_dq = 0.0 !c !c Adjoint of actions dependent on sign of dq if (dq.gt.0.) then !c !c Redo nlm calculations dz = 0.5 * (xzo(k+1,i) - xzo(k-1,i)) dz1 = xzo(k,i) - xzo(k-1,i) etah = 0.5 * (eta(k,i) + eta(k-1,i)) qlk = dq / (eta(k,i) + etah * c0 * dz) !c !c Adjoint code ad_xpw = ad_xpw + ad_xpwav(i) ad_qlk = ad_qlk + etah*c0*dz*ad_xpw ad_dz = ad_dz + etah*c0*ad_xpw*qlk ad_etah = ad_etah + ad_xpw*c0*dz*qlk ad_qlk = ad_qlk - dz1*g*ad_xaa0(i) ad_dz1 = ad_dz1 - ad_xaa0(i)*g*qlk ad_xqc = ad_xqc + ad_xqcko(k,i) ad_xqrch = ad_xqrch + ad_xqc ad_qlk = ad_qlk + ad_xqc ad_dz = ad_dz & - (dq/(eta(k,i)+etah*c0*dz)**2) & * etah*c0*ad_qlk ad_etah = ad_etah & - (dq/(eta(k,i)+etah*c0*dz)**2) & * ad_qlk*c0*dz ad_eta(k,i) = ad_eta(k,i) & - (dq/(eta(k,i)+etah*c0*dz)**2) & * ad_qlk ad_dq = ad_dq + ad_qlk/(eta(k,i)+etah*c0*dz) ad_eta(k-1,i) = ad_eta(k-1,i) + 0.5*ad_etah ad_eta(k,i) = ad_eta(k,i) + 0.5*ad_etah ad_xzo(k-1,i) = ad_xzo(k-1,i) - ad_dz1 ad_xzo(k,i) = ad_xzo(k,i) + ad_dz1 ad_xzo(k-1,i) = ad_xzo(k-1,i) - 0.5*ad_dz ad_xzo(k+1,i) = ad_xzo(k+1,i) + 0.5*ad_dz else ad_xtemp = ad_xtemp + ad_xqcko(k,i) endif !c !c Adjoint of dq calculation ad_xqrch = ad_xqrch - eta(k,i)*ad_dq ad_xtemp = ad_xtemp + eta(k,i)*ad_dq ad_eta(k,i) = ad_eta(k,i) + ad_dq*(xtemp-xqrch) !c !c Adjoint of xqrch calculation xdby = xhcko(k,i) - xheso(k,i) if (xdby.gt.0.) then ad_xqesol(k,i) = ad_xqesol(k,i) + ad_xqrch ad_gamma = ad_gamma & - gamma*xdby/((hvap*(1.+gamma))**2) & * hvap*ad_xqrch ad_xdby = ad_xdby + gamma*ad_xqrch/(hvap*(1.+gamma)) ad_gamma = ad_gamma + ad_xqrch*xdby/(hvap*(1.+gamma)) ad_xtol(k,i) = ad_xtol(k,i) & - 2.*el2orc*xqesol(k,i)/xtol(k,i)**3 & * ad_gamma ad_xqesol(k,i) = ad_xqesol(k,i) & + el2orc*ad_gamma/xtol(k,i)**2 else ad_xqesol(k,i) = ad_xqesol(k,i) + ad_xqrch endif ad_xheso(k,i) = ad_xheso(k,i) - ad_xdby ad_xhcko(k,i) = ad_xhcko(k,i) + ad_xdby !c !c Adjoint of xtemp calculation ad_termq = ad_termq + onemf*ad_xtemp ad_onemf = ad_onemf + ad_xtemp*termq ad_xqcko(k-1,i) = ad_xqcko(k-1,i) + factor*ad_xtemp ad_factor = ad_factor + ad_xtemp*xqcko(k-1,i) ad_xqol(k+1,i) = ad_xqol(k+1,i) + 0.5*ad_termq ad_xqol(k,i) = ad_xqol(k,i) + 0.5*ad_termq ad_factor = ad_factor - ad_onemf ad_eta(k,i) = ad_eta(k,i) & - eta(k-1,i)/eta(k,i)**2 * ad_factor ad_eta(k-1,i) = ad_eta(k-1,i) + ad_factor/eta(k,i) !c endif end do end do !c !c Adjoint of xhcko calculation do i = 1,im do k = kmax-1,2,-1 if (k.gt.kb(i).and.k.le.ktcon(i)) then !c !c Recalculate nlm factor = eta(k-1,i)/eta(k,i) onemf = 1. - factor !c !c Adjoint of tlm code ad_onemf = 0.0 ad_factor = 0.0 ad_xheo(k+1,i) = ad_xheo(k+1,i) + onemf*0.5*ad_xhcko(k,i) ad_xheo(k,i) = ad_xheo(k,i) + onemf*0.5*ad_xhcko(k,i) ad_onemf = ad_onemf + & ad_xhcko(k,i) * 0.5*(xheo(k,i)+xheo(k+1,i)) ad_xhcko(k-1,i) = ad_xhcko(k-1,i) + factor*ad_xhcko(k,i) ad_factor = ad_factor + ad_xhcko(k,i)*xhcko(k-1,i) ad_factor = ad_factor - ad_onemf ad_eta(k,i) = ad_eta(k,i) - & (eta(k-1,i)/eta(k,i)**2) * ad_factor ad_eta(k-1,i) = ad_eta(k-1,i) + ad_factor/eta(k,i) endif end do end do !c !c Adjoint of xheo,xqol --> xhcko,xqcko transfer do i = 1,im indx = kb(i) ad_xheo(indx,i) = ad_xheo(indx,i) + ad_xhcko(indx,i) ad_xqol(indx,i) = ad_xqol(indx,i) + ad_xqcko(indx,i) end do !c !c Adjoint of xheo and xheso calculation at k=kmax k = kmax do i = 1,im ad_xqesol(k,i) = ad_xqesol(k,i) + hvap*ad_xheso(k,i) ad_xtol(k,i) = ad_xtol(k,i) + cp *ad_xheso(k,i) ad_xzo(k,i) = ad_xzo(k,i) + g *ad_xheso(k,i) ad_xqol(k,i) = ad_xqol(k,i) + hvap*ad_xheo(k,i) ad_xtol(k,i) = ad_xtol(k,i) + cp *ad_xheo(k,i) ad_xzo(k,i) = ad_xzo(k,i) + g *ad_xheo(k,i) enddo !c !c Adjoint of xheo and xheso calculation below k=kmax do i = 1,im do k = kmax-1,1,-1 !c !c Redo nlm calculation po = 0.5 * ( call adfpvsx(xtol(k,i),es0,adt,ad_es0,adjoint0) esl = 10.*es0 !c !c Adjoint of tlm code ad_esl = 0.0 ad_es0 = 0.0 ad_xqesol(k,i) = ad_xqesol(k,i) + hvap *ad_xheso(k,i) ad_xtol(k,i) = ad_xtol(k,i) + cp *ad_xheso(k,i) ad_xzo(k+1,i) = ad_xzo(k+1,i) + 0.5*g*ad_xheso(k,i) ad_xzo(k,i) = ad_xzo(k,i) + 0.5*g*ad_xheso(k,i) ad_xqol(k,i) = ad_xqol(k,i) + hvap *ad_xheo(k,i) ad_xtol(k,i) = ad_xtol(k,i) + cp *ad_xheo(k,i) ad_xzo(k+1,i) = ad_xzo(k+1,i) + 0.5*g*ad_xheo(k,i) ad_xzo(k,i) = ad_xzo(k,i) + 0.5*g*ad_xheo(k,i) ad_esl = ad_esl & - eps*esl/((po+epsm1*esl)**2) & *epsm1*ad_xqesol(k,i) ad_esl = ad_esl & + eps*ad_xqesol(k,i)/(po+epsm1*esl) ad_es0 = ad_es0 + 10*ad_esl adt = 0.0 call adfpvsx(xtol(k,i),es0,adt,ad_es0,adjoint) ad_xtol(k,i) = ad_xtol(k,i) + adt end do end do !c !c Adjoint of xtol and xqol calculations do i = 1,im do k = kmax-1,1,-1 !c !c Redo nlm calculations dz = 0.5 * (xzo(k+1,i) - xzo(k,i)) dp = 0.5 * ( call adfpvsx(xto(k+1,i),es0,adt,ad_es0,adjoint0) es = 10*es0 pprime = p(k+1,i) + epsm1 * es qs = eps * es / pprime dqsdp = - qs / pprime desdt = ES * (FACT1 / xto(k+1,i) + FACT2 / (xto(k+1,i)**2)) dqsdt = qs * p(k+1,i) * desdt / (es * pprime) gamma = el2orc * xqeso(k+1,i) / (xto(k+1,i)**2) dt = (g * dz + hvap*dqsdp*dp) / (cp*(1.+gamma)) dq = dqsdt * dt + dqsdp * dp !c !c Initialize local ajm variables to 0.0 ad_dq = 0.0 ad_dt = 0.0 ad_dqsdp = 0.0 ad_dqsdt = 0.0 ad_gamma = 0.0 ad_dz = 0.0 ad_pprime = 0.0 ad_es = 0.0 ad_desdt = 0.0 ad_qs = 0.0 ad_es0 = 0.0 !c !c Adjoint of tlm code if (xqol0(k,i)>0.) then ad_xqol0(k,i) = ad_xqol0(k,i) + ad_xqol(k,i) else ad_xqol0(k,i) = 0.0 endif ad_xqo(k+1,i) = ad_xqo(k+1,i) + ad_xqol0(k,i) ad_dq = ad_dq + ad_xqol0(k,i) ad_xto(k+1,i) = ad_xto(k+1,i) + ad_xtol(k,i) ad_dt = ad_dt + ad_xtol(k,i) ad_dqsdp = ad_dqsdp + ad_dq*dp ad_dt = ad_dt + dqsdt*ad_dq ad_dqsdt = ad_dqsdt + ad_dq*dt ad_gamma = ad_gamma - & (g*dz+hvap*dqsdp*dp)/((cp*(1.+gamma))**2) * & cp*ad_dt ad_dqsdp = ad_dqsdp + hvap*ad_dt*dp/(cp*(1.+gamma)) ad_dz = ad_dz + g*ad_dt/(cp*(1.+gamma)) ad_xto(k+1,i) = ad_xto(k+1,i) - & 2.*el2orc*xqeso(k+1,i)/(xto(k+1,i)**3) * ad_gamma ad_xqeso(k+1,i) = ad_xqeso(k,i) + & el2orc*ad_gamma/(xto(k+1,i)**2) rterm = 1./(es*pprime) ad_pprime = ad_pprime - (qs*p(k+1,i)*desdt)*rterm**2 * & es*ad_dqsdt ad_es = ad_es - (qs*p(k+1,i)*desdt)*rterm**2 * & ad_dqsdt*pprime ad_desdt = ad_desdt + p(k+1,i)*qs*ad_dqsdt*rterm ad_qs = ad_qs + p(k+1,i)*ad_dqsdt*desdt*rterm ad_es = ad_es + & ad_desdt*(fact1/xto(k+1,i) + fact2/(xto(k+1,i)**2)) ad_xto(k+1,i) = ad_xto(k+1,i) - ad_desdt * & (es/(xto(k+1,i)**2)) * (fact1+2.*fact2/xto(k+1,i)) ad_pprime = ad_pprime + (qs/(pprime**2))*ad_dqsdp ad_qs = ad_qs - ad_dqsdp/pprime ad_pprime = ad_pprime - (eps*es/(pprime**2))*ad_qs ad_es = ad_es + eps*ad_qs/pprime ad_es = ad_es + epsm1*ad_pprime ad_es0 = ad_es0 + 10*ad_es adt = 0.0 call adfpvsx(xto(k+1,i),es0,adt,ad_es0,adjoint) ad_xto(k+1,i) = ad_xto(k+1,i) + adt ad_xzo(k,i) = ad_xzo(k,i) - 0.5*ad_dz ad_xzo(k+1,i) = ad_xzo(k+1,i) + 0.5*ad_dz end do end do !c Adjoint of integration of hydrostatic equation to get xzo do i = 1,im do k = kmax,2,-1 !c !c Redo nlm calculations DLNSIG = LOG(SL(K) / SL(K-1)) term1 = dlnsig * rd / g !c !c Adjoint of tlm code ad_term2 = 0.0 ad_term2 = ad_term2 - term1*ad_xzo(k,i) ad_xzo(k-1,i) = ad_xzo(k-1,i) + ad_xzo(k,i) ad_xtvo(k-1,i) = ad_xtvo(k-1,i) + 0.5*ad_term2 ad_xtvo(k,i) = ad_xtvo(k,i) + 0.5*ad_term2 end do end do dlnsig = log(sl(1)) do i = 1,im ad_xtvo(1,i) = ad_xtvo(1,i) - dlnsig*rd/g * ad_xzo(1,i) end do !c !c Adjoint of xqeso and xtvo calculations do i = 1,im do k = kmax,1,-1 call adfpvsx(xto(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 ad_es = 0.0 ad_es0 = 0.0 ad_xqo(k,i) = ad_xqo(k,i) + delta*xto(k,i)*ad_xtvo(k,i) ad_xto(k,i) = ad_xto(k,i) + delta*xqo(k,i)*ad_xtvo(k,i) ad_xto(k,i) = ad_xto(k,i) + ad_xtvo(k,i) ad_es = ad_es & - eps*es/((p(k,i)+epsm1*es)**2) * & epsm1*ad_xqeso(k,i) ad_es = ad_es & + eps*ad_xqeso(k,i)/( ad_es0 = ad_es0 + 10*ad_es adt = 0.0 call adfpvsx(xto(k,i),es0,adt,ad_es0,adjoint) ad_xto(k,i) = ad_xto(k,i) + adt end do end do !c !c Adjoint of xto,xqo calculation do i = 1,im do k = kmax,1,-1 ad_dellat = 0.0 if ( k.le.ktcon(i) .and. ktcon(i).ne.1 ) then ad_to(k,i) = ad_to(k,i) + ad_xto(k,i) ad_dellat = ad_dellat + ad_xto(k,i)*mbdt ad_dellaq(k,i) = ad_dellaq(k,i) - hvap*ad_dellat/cp ad_dellah(k,i) = ad_dellah(k,i) + ad_dellat/cp if (xqo0(k,i)>0.) then ad_xqo0(k,i) = ad_xqo0(k,i) + ad_xqo(k,i) else ad_xqo0(k,i) = 0.0 endif ad_qo0(k,i) = ad_qo0(k,i) + ad_xqo0(k,i) ad_dellaq(k,i) = ad_dellaq(k,i) + ad_xqo0(k,i)*mbdt else ad_to(k,i) = ad_to(k,i) + ad_xto(k,i) ad_qo0(k,i)= ad_qo0(k,i)+ ad_xqo(k,i) endif end do end do !c !c Adjoint of dellah and dellaq calculations at cloud top do i = 1,im if (ktcon(i).ne.1) then indx = ktcon(i) !c !c Redo nlm calculations dp = 100. * psfc(i)*del(indx) dv1 = heol(indx-1,i) dvq1 = qol(indx-1,i) dvu1 = uol(indx-1,i) dvv1 = vol(indx-1,i) !c !c Adjoint of tlm code ad_dvv1 = 0.0 ad_dvu1 = 0.0 ad_dvq1 = 0.0 ad_dv1 = 0.0 ad_qlko_ktcon(i) = ad_qlko_ktcon(i) + & eta(indx-1,i)*ad_dellal(i)*g/dp ad_eta(indx-1,i) = ad_eta(indx-1,i) + & ad_dellal(i)*qlko_ktcon(i)*g/dp ad_dvv1 = ad_dvv1 & - eta(indx-1,i) * ad_dellav(indx,i) * (g/dp) ad_vcko(indx-1,i) = ad_vcko(indx-1,i) & + eta(indx-1,i) * ad_dellav(indx,i) * (g/dp) ad_eta(indx-1,i) = ad_eta(indx-1,i) & + ad_dellav(indx,i)*(vcko(indx-1,i)-dvv1)*(g/dp) ad_vol(indx-1,i) = ad_vol(indx-1,i) + ad_dvv1 ad_dvu1 = ad_dvu1 & - eta(indx-1,i) * ad_dellau(indx,i) * (g/dp) ad_ucko(indx-1,i) = ad_ucko(indx-1,i) & + eta(indx-1,i) * ad_dellau(indx,i) * (g/dp) ad_eta(indx-1,i) = ad_eta(indx-1,i) & + ad_dellau(indx,i)*(ucko(indx-1,i)-dvu1)*(g/dp) ad_uol(indx-1,i) = ad_uol(indx-1,i) + ad_dvu1 ad_dvq1 = ad_dvq1 & - eta(indx-1,i) * ad_dellaq(indx,i) * (g/dp) ad_qcko(indx-1,i) = ad_qcko(indx-1,i) & + eta(indx-1,i) * ad_dellaq(indx,i) * (g/dp) ad_eta(indx-1,i) = ad_eta(indx-1,i) & + ad_dellaq(indx,i)*(qcko(indx-1,i)-dvq1)*(g/dp) ad_qol(indx-1,i) = ad_qol(indx-1,i) + ad_dvq1 ad_dv1 = ad_dv1 & - eta(indx-1,i) * ad_dellah(indx,i) * (g/dp) ad_hcko1(indx-1,i) = ad_hcko1(indx-1,i) & + eta(indx-1,i) * ad_dellah(indx,i) * (g/dp) ad_eta(indx-1,i) = ad_eta(indx-1,i) & + ad_dellah(indx,i)*(hcko1(indx-1,i)-dv1)*(g/dp) ad_heol(indx-1,i) = ad_heol(indx-1,i) + ad_dv1 endif end do !c !c Adjoint of dellah and dellaq calculations within cloud !c do i = 1,im do k = kmax-1,2,-1 if ( k.lt.ktcon(i) .and. ktcon(i).ne.1 ) then !c !c Redo nlm calculations aup = 1. if (k.le.kb(i)) aup = 0. adw = 1. if (k.gt.jmin(i)) adw = 0. !c dv1 = heol(k,i) dv2 = 0.5 * (heol(k,i) + heol(k+1,i)) dv3 = heol(k-1,i) dv1q = qol(k,i) dv2q = 0.5 * (qol(k,i) + qol(k+1,i)) dv3q = qol(k-1,i) DV1u = uOL(k,i) DV2u = 0.5 * (uOL(k,i) + uOL(k+1,i)) DV3u = uOL(k-1,i) DV1v = vOL(k,i) DV2v = 0.5 * (vOL(k,i) + vOL(k+1,i)) DV3v = vOL(k-1,i) dp = 100. * psfc(i) * del(k) detau = eta(k,i) - eta(k-1,i) detad = etad(k,i) - etad(k-1,i) !c term1 = aup*eta(k,i) - adw*edto1(i)*etad(k,i) term2 = aup*detau term3 = aup*eta(k-1,i) - adw*edto1(i)*etad(k-1,i) term4 = adw*edto1(i)*detad termq = 0.5*(qrcdo(k,i)+qrcdo(k-1,i)) !c !c Initialize loop local adjoint variables to 0.0 ad_termq = 0.0 ad_term4 = 0.0 ad_term3 = 0.0 ad_term2 = 0.0 ad_term1 = 0.0 ad_dv3v = 0.0 ad_dv2v = 0.0 ad_dv1v = 0.0 ad_dv3u = 0.0 ad_dv2u = 0.0 ad_dv1u = 0.0 ad_dv3q = 0.0 ad_dv2q = 0.0 ad_dv1q = 0.0 ad_dv3 = 0.0 ad_dv2 = 0.0 ad_dv1 = 0.0 ad_detad = 0.0 ad_detau = 0.0 !c !c Adjoint of tlm code. ad_vcdo(i) = ad_vcdo(i) + (g/dp)*term4*ad_dellav(k,i) ad_term4 = ad_term4 + (g/dp)*ad_dellav(k,i)*vcdo(i) ad_dv2v = ad_dv2v - (g/dp)*term2*ad_dellav(k,i) ad_term2 = ad_term2 - (g/dp)*ad_dellav(k,i)*dv2v ad_dv3v = ad_dv3v - (g/dp)*term3*ad_dellav(k,i) ad_term3 = ad_term3 - (g/dp)*ad_dellav(k,i)*dv3v ad_dv1v = ad_dv1v + (g/dp)*term1*ad_dellav(k,i) ad_term1 = ad_term1 + (g/dp)*ad_dellav(k,i)*dv1v ad_ucdo(i) = ad_ucdo(i) + (g/dp)*term4*ad_dellau(k,i) ad_term4 = ad_term4 + (g/dp)*ad_dellau(k,i)*ucdo(i) ad_dv2u = ad_dv2u - (g/dp)*term2*ad_dellau(k,i) ad_term2 = ad_term2 - (g/dp)*ad_dellau(k,i)*dv2u ad_dv3u = ad_dv3u - (g/dp)*term3*ad_dellau(k,i) ad_term3 = ad_term3 - (g/dp)*ad_dellau(k,i)*dv3u ad_dv1u = ad_dv1u + (g/dp)*term1*ad_dellau(k,i) ad_term1 = ad_term1 + (g/dp)*ad_dellau(k,i)*dv1u ad_termq = ad_termq + (g/dp)*term4*ad_dellaq(k,i) ad_term4 = ad_term4 + (g/dp)*termq*ad_dellaq(k,i) ad_dv2q = ad_dv2q - (g/dp)*term2*ad_dellaq(k,i) ad_term2 = ad_term2 - (g/dp)*dv2q *ad_dellaq(k,i) ad_dv3q = ad_dv3q - (g/dp)*term3*ad_dellaq(k,i) ad_term3 = ad_term3 - (g/dp)*dv3q *ad_dellaq(k,i) ad_dv1q = ad_dv1q + (g/dp)*term1*ad_dellaq(k,i) ad_term1 = ad_term1 + (g/dp)*dv1q *ad_dellaq(k,i) !c ad_hcdo(i) = ad_hcdo(i)+(g/dp)*term4 *ad_dellah(k,i) ad_term4 = ad_term4 +(g/dp)*hcdo(i)*ad_dellah(k,i) ad_dv2 = ad_dv2 - (g/dp)*term2*ad_dellah(k,i) ad_term2 = ad_term2 - (g/dp)*dv2 *ad_dellah(k,i) ad_dv3 = ad_dv3 - (g/dp)*term3*ad_dellah(k,i) ad_term3 = ad_term3 - (g/dp)*dv3 *ad_dellah(k,i) ad_dv1 = ad_dv1 + (g/dp)*term1*ad_dellah(k,i) ad_term1 = ad_term1 + (g/dp)*dv1 *ad_dellah(k,i) !c ad_qrcdo(k-1,i) = ad_qrcdo(k-1,i) + 0.5*ad_termq ad_qrcdo(k,i) = ad_qrcdo(k,i) + 0.5*ad_termq ad_detad = ad_detad + adw*edto1(i)*ad_term4 ad_edto1(i) = ad_edto1(i) + adw*ad_term4*detad ad_etad(k-1,i) = ad_etad(k-1,i) - adw*edto1(i)*ad_term3 ad_edto1(i) = ad_edto1(i) - adw*ad_term3*etad(k-1,i) ad_eta(k-1,i) = ad_eta(k-1,i) + aup*ad_term3 ad_detau = ad_detau + aup*ad_term2 ad_etad(k,i) = ad_etad(k,i) - adw*edto1(i)*ad_term1 ad_edto1(i) = ad_edto1(i) - adw*ad_term1*etad(k,i) ad_eta(k,i) = ad_eta(k,i) + aup*ad_term1 ad_etad(k-1,i) = ad_etad(k-1,i) - ad_detad ad_etad(k,i) = ad_etad(k,i) + ad_detad ad_eta(k-1,i) = ad_eta(k-1,i) - ad_detau ad_eta(k,i) = ad_eta(k,i) + ad_detau ad_uol(k-1,i) = ad_uol(k-1,i) + ad_dv3u ad_uol(k+1,i) = ad_uol(k+1,i) + 0.5*ad_dv2u ad_uol(k,i) = ad_uol(k,i) + 0.5*ad_dv2u ad_uol(k,i) = ad_uol(k,i) + ad_dv1u ad_vol(k-1,i) = ad_vol(k-1,i) + ad_dv3v ad_vol(k+1,i) = ad_vol(k+1,i) + 0.5*ad_dv2v ad_vol(k,i) = ad_vol(k,i) + 0.5*ad_dv2v ad_vol(k,i) = ad_vol(k,i) + ad_dv1v ad_qol(k-1,i) = ad_qol(k-1,i) + ad_dv3q ad_qol(k+1,i) = ad_qol(k+1,i) + 0.5*ad_dv2q ad_qol(k,i) = ad_qol(k,i) + 0.5*ad_dv2q ad_qol(k,i) = ad_qol(k,i) + ad_dv1q ad_heol(k-1,i) = ad_heol(k-1,i) + ad_dv3 ad_heol(k+1,i) = ad_heol(k+1,i) + 0.5*ad_dv2 ad_heol(k,i) = ad_heol(k,i) + 0.5*ad_dv2 ad_heol(k,i) = ad_heol(k,i) + ad_dv1 !c endif end do end do !c !c Adjoint of dellah and dellaq calculations at k=1 do i = 1,im if (ktcon(i).ne.1) then dp = 100. * psfc(i) * del(1) ad_vol(1,i) = ad_vol(1,i) & - edto1(i)*etad(1,i)*ad_dellav(1,i)*g/dp ad_vcdo(i) = ad_vcdo(i) & + edto1(i)*etad(1,i)*ad_dellav(1,i)*g/dp ad_etad(1,i) = ad_etad(1,i) & + edto1(i)*ad_dellav(1,i)*(vcdo(i)-vol(1,i))*g/dp ad_edto1(i) = ad_edto1(i) & + ad_dellav(1,i)*etad(1,i)*(vcdo(i)-vol(1,i))*g/dp ad_uol(1,i) = ad_uol(1,i) & - edto1(i)*etad(1,i)*ad_dellau(1,i)*g/dp ad_ucdo(i) = ad_ucdo(i) & + edto1(i)*etad(1,i)*ad_dellau(1,i)*g/dp ad_etad(1,i) = ad_etad(1,i) & + edto1(i)*ad_dellau(1,i)*(ucdo(i)-uol(1,i))*g/dp ad_edto1(i) = ad_edto1(i) & + ad_dellau(1,i)*etad(1,i)*(ucdo(i)-uol(1,i))*g/dp ad_qol(1,i) = ad_qol(1,i) & - edto1(i)*etad(1,i)*ad_dellaq(1,i)*g/dp ad_qcdo(i) = ad_qcdo(i) & + edto1(i)*etad(1,i)*ad_dellaq(1,i)*g/dp ad_etad(1,i) = ad_etad(1,i) & + edto1(i)*ad_dellaq(1,i)*(qcdo(i)-qol(1,i))*g/dp ad_edto1(i) = ad_edto1(i) & + ad_dellaq(1,i)*etad(1,i)*(qcdo(i)-qol(1,i))*g/dp ad_heol(1,i) = ad_heol(1,i) & - edto1(i)*etad(1,i)*ad_dellah(1,i)*g/dp ad_hcdo(i) = ad_hcdo(i) & + edto1(i)*etad(1,i)*ad_dellah(1,i)*g/dp ad_etad(1,i) = ad_etad(1,i) & + edto1(i)*ad_dellah(1,i)*(hcdo(i)-heol(1,i))*g/dp ad_edto1(i) = ad_edto1(i) & + ad_dellah(1,i)*etad(1,i)*(hcdo(i)-heol(1,i))*g/dp endif end do !c !c Adjoint of cloud mass flux threshold function based !c on cloud work function after downdraft do i = 1,im ad_term = 0.0 term = 1.e3*aa1(i) if (abs(term).lt.100.) then ad_term = dftanh(term)*ad_tcwfdn(i) else if (term.lt.-100.) then ad_term = 0.0 else ad_term = 0.0 endif endif ad_aa1(i) = ad_aa1(i) + 1.e3*ad_term end do !c !c Adjoint of downdraft cloudwork function calculation do i = 1,im do k = 1,kmax-1 if (dwnflg2(i) .and. k.lt.jmin(i)) then !c !c Redo nlm calculations GAMMA = EL2ORC * QESOL(k+1,i) / TOL(k+1,i)**2 DHH = HCDO(I) DT = TOL(k+1,i) DG = GAMMA DH = HESOL(k+1,i) dz = zo(k,i) - zo(k+1,i) !c term1 = edto1(i) term2 = dz term3 = g/(cp*dt) term4 = (dhh-dh) term5 = 1./(1.+dg) term6 = 1. + delta*cp*dg*dt/hvap !c dqs = qesol(k+1,i) - qol(k+1,i) !c !c Adjoint of tlm code ad_dqs = 0.0 ad_dz = 0.0 ad_dt = 0.0 ad_dg = 0.0 ad_dh = 0.0 ad_dhh = 0.0 if (dqs.gt.0.) then ad_dqs = ad_dqs + edto1(i)*dz*g*delta * ad_aa1(i) ad_dz = ad_dz + edto1(i)*g*delta*dqs * ad_aa1(i) ad_edto1(i) = ad_edto1(i) + dz*g*delta*dqs * ad_aa1(i) endif ad_qol(k+1,i) = ad_qol(k+1,i) - ad_dqs ad_qesol(k+1,i) = ad_qesol(k+1,i) + ad_dqs !c ad_term1 = term2*term3*term4*term5*term6 * ad_aa1(i) ad_term2 = term1*term3*term4*term5*term6 * ad_aa1(i) ad_term3 = term1*term2*term4*term5*term6 * ad_aa1(i) ad_term4 = term1*term2*term3*term5*term6 * ad_aa1(i) ad_term5 = term1*term2*term3*term4*term6 * ad_aa1(i) ad_term6 = term1*term2*term3*term4*term5 * ad_aa1(i) !c ad_dt = (delta*cp/hvap) * dg*ad_term6 ad_dg = (delta*cp/hvap) * ad_term6*dt ad_dg = ad_dg - 1./(1.+dg)**2 * ad_term5 ad_dh = ad_dh - ad_term4 ad_dhh = ad_dhh + ad_term4 ad_dt = ad_dt - 1.*g/(cp*dt*dt) * ad_term3 ad_dz = ad_dz + ad_term2 ad_edto1(i) = ad_edto1(i) + ad_term1 !c ad_zo(k,i) = ad_zo(k,i) + ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) - ad_dz ad_hesol(k+1,i)= ad_hesol(k+1,i) + ad_dh ad_gamma = ad_dg ad_tol(k+1,i) = ad_tol(k+1,i) + ad_dt ad_hcdo(i) = ad_hcdo(i) + ad_dhh ad_tol(k+1,i) = ad_tol(k+1,i) & - 2.*el2orc*qesol(k+1,i)/tol(k+1,i)**3 * ad_gamma ad_qesol(k+1,i)= ad_qesol(k+1,i) + & el2orc*ad_gamma/tol(k+1,i)**2 endif end do end do !c !c Adjoint of final edto1 calculation do i = 1,im edtmax = edtmaxl if (nint(slimsk(i)) .eq. 0) edtmax = edtmaxs if (dwnflg2(i)) then if (pwevo(i).lt.0.) then if (edto10(i).gt.edtmax) then !c do nothing since tlm is 0.0 ad_edto1(i) = 0.0 endif ad_pwevo(i) = ad_pwevo(i) & + edto(i)*pwavo(i)/pwevo(i)**2 * ad_edto1(i) ad_pwavo(i) = ad_pwavo(i) & - edto(i)*ad_edto1(i)/pwevo(i) ad_edto(i) = ad_edto(i) & - ad_edto1(i)*pwavo(i)/pwevo(i) else !c do nothing since tlm is 0.0 ad_edto1(i) = 0.0 endif else !c do nothing since tlm is 0.0 ad_edto1(i) = 0.0 endif enddo !c !c Adjoint of qrcdo --> qcdo transfer do i = 1,im ad_qrcdo(1,i) = ad_qrcdo(1,i) + ad_qcdo(i) end do !c !c Adjoint of pwevo, pwdo, qrcdo calculation do i = 1,im do k = 1,kmax-1 if (k.lt.jmin(i)) then !c !c Recalculate part of foward model dq = qesol(k,i) dt = tol(k,i) gamma = el2orc * dq / dt**2 dh = hcdo(i) - hesol(k,i) term5 = (1./hvap) * gamma term6 = 1./(1.+gamma) detad = etad(k+1,i) - etad(k,i) !c !c Adjoint of forward tlm ad_term1 = 0.0 ad_term2 = 0.0 ad_term3 = 0.0 ad_pwdo(k,i) = ad_pwdo(k,i) + ad_pwevo(i) if (k.lt.jmin(i)-1) then ad_term1 = ad_term1 + ad_pwdo(k,i) ad_term2 = ad_term2 - ad_pwdo(k,i) ad_term3 = ad_term3 - ad_pwdo(k,i) ad_qrcdo(k+1,i) = ad_qrcdo(k+1,i) + detad*0.5*ad_term3 ad_qrcdo(k,i) = ad_qrcdo(k,i) + detad*0.5*ad_term3 ad_detad = +0.5*(qrcdo(k,i)+qrcdo(k+1,i))*ad_term3 ad_qrcdo(k,i) = ad_qrcdo(k,i) + etad(k,i)*ad_term2 ad_etad(k,i) = ad_etad(k,i) + qrcdo(k,i)*ad_term2 ad_qrcdo(k+1,i) =ad_qrcdo(k+1,i) +ad_term1*etad(k+1,i) ad_etad(k+1,i) =ad_etad(k+1,i) +ad_term1*qrcdo(k+1,i) else ad_term1 = ad_term1 + ad_pwdo(k,i) ad_term2 = ad_term2 - ad_pwdo(k,i) ad_term3 = ad_term3 - ad_pwdo(k,i) ad_qesol(k+1,i) = ad_qesol(k+1,i) + detad*0.5*ad_term3 ad_qrcdo(k,i) = ad_qrcdo(k,i) + detad*0.5*ad_term3 ad_detad = ad_term3*0.5*(qrcdo(k,i)+qesol(k+1,i)) ad_qrcdo(k,i) = ad_qrcdo(k,i) + etad(k,i)*ad_term2 ad_etad(k,i) = ad_etad(k,i) + qrcdo(k,i)*ad_term2 ad_qol(k+1,i) = ad_qol(k+1,i) + etad(k+1,i)*ad_term1 ad_etad(k+1,i) = ad_etad(k+1,i) + qol(k+1,i)*ad_term1 endif ad_etad(k,i) = ad_etad(k,i) - ad_detad ad_etad(k+1,i) = ad_etad(k+1,i) + ad_detad ad_dh = term5 * term6 * ad_qrcdo(k,i) ad_term6 = term5 * ad_qrcdo(k,i) * dh ad_term5 = ad_qrcdo(k,i) * term6 * dh ad_dq = ad_qrcdo(k,i) ad_gamma = -1./(1.+gamma)**2 * ad_term6 ad_gamma = ad_gamma + (1./hvap) * ad_term5 ad_term5 = 0.0 ad_term6 = 0.0 ad_hesol(k,i) = ad_hesol(k,i) - ad_dh ad_hcdo(i) = ad_hcdo(i) + ad_dh ad_dh = 0.0 ad_dt = -2.*el2orc*dq/dt**3 * ad_gamma ad_dq = ad_dq + el2orc*ad_gamma/dt**2 ad_gamma = 0.0 ad_tol(k,i) = ad_tol(k,i) + ad_dt ad_qesol(k,i) = ad_qesol(k,i) + ad_dq ad_dt = 0.0 ad_dq = 0.0 endif end do end do !c !c Adjoint of hcdo and qrcdo transfer do i = 1,im jmn = jmin(i) ad_heol(jmn,i) = ad_heol(jmn,i) + ad_hcdo(i) ad_qesol(jmn,i) = ad_qesol(jmn,i) + ad_qrcdo(jmn,i) ad_uol(jmn,i) = ad_uol(jmn,i) + ad_ucdo(i) ad_vol(jmn,i) = ad_vol(jmn,i) + ad_vcdo(i) end do !c !c Adjoint of etad (downdraft entrainment) calculation at k=1 k = 1 do i = 1,im ad_dz = 0.0 if (kbdtr(i).gt.1) then !c !c Redo nlm dz = 0.5 * (zo(2,i)-zo(1,i)) !c !c Adjoint of tlm code. ad_dz = ad_dz + & etad(k+1,i)*exp(xlamd(i)*dz) * xlamd(i)*ad_etad(k,i) ad_xlamd(i) = ad_xlamd(i) + & etad(k+1,i)*exp(xlamd(i)*dz) * dz*ad_etad(k,i) ad_etad(k+1,i) = ad_etad(k+1,i) + & exp(xlamd(i)*dz) * ad_etad(k,i) ad_zo(1,i) = ad_zo(1,i) - 0.5*ad_dz ad_zo(2,i) = ad_zo(2,i) + 0.5*ad_dz endif end do !c !c Adjoint of etad (downdraft entrainment) calculation above k=1 do i = 1,im do k = 2,kbmax ad_dz = 0.0 if (k.lt.kbdtr(i)) then !c !c Redo nlm dz = 0.5 * (zo(k+1,i)-zo(k-1,i)) !c !c Adjoint of tlm code. ad_dz = ad_dz + & etad(k+1,i)*exp(xlamd(i)*dz) * xlamd(i)*ad_etad(k,i) ad_xlamd(i) = ad_xlamd(i) + & etad(k+1,i)*exp(xlamd(i)*dz) * dz*ad_etad(k,i) ad_etad(k+1,i) = ad_etad(k+1,i) + & exp(xlamd(i)*dz) * ad_etad(k,i) ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_dz endif end do end do !c !c Adjoint of xlamd calculation do i = 1,im ad_dz = 0.0 beta = betas if (nint(slimsk(i)) .eq. 1) beta = betal if (kbdtr(i).gt.1) then !c !c Redo nlm calculations dz = 0.5 * (zo(kbdtr(i),i) + zo(kbdtr(i)-1,i)) & - zo(1,i) !c !c Adjoint code ad_dz = ad_dz - log(beta)/(dz*dz)*ad_xlamd(i) ad_zo(1,i) = ad_zo(1,i) - ad_dz ad_zo(kbdtr(i)-1,i) = ad_zo(kbdtr(i)-1,i) + 0.5*ad_dz ad_zo(kbdtr(i),i) = ad_zo(kbdtr(i),i) + 0.5*ad_dz endif end do !c !c Adjoint of upper and lower bounds on precipitation efficiency. do i = 1,im ad_edt(i) = ad_edt(i) + ad_edtx(i) ad_edt(i) = ad_edt(i) + ad_edto(i) if (edt0(i).gt.0.9) then ad_edt(i) = 0.0 elseif (edt0(i).lt.0.0) then ad_edt(i) = 0.0 endif end do !c !c Adjoint for precipitation efficiency (edt) calculation do i = 1,im ad_e1 = 0.0 ad_term = 0.0 ad_dz = 0.0 !c !c Redo nlm calculations dz = zo(ktcon(i),i)-zo(kb(i),i) if (abs(dz).gt.tiny) then term = 1.e3 * vshear(i)/dz !c !c Adjoint code ad_e1 = ad_e1 - ad_edt(i) ad_term = ad_term + p3*3.*term**2 * ad_e1 ad_term = ad_term + p2*2.*term * ad_e1 ad_term = ad_term + p1 * ad_e1 ad_dz = ad_dz - 1.e3*vshear(i)/(dz*dz) * ad_term ad_vshear(i) = ad_vshear(i) + 1.e3*ad_term/dz else ad_term = 0.0 ad_dz = 0.0 endif ad_zo(kb(i),i) = ad_zo(kb(i),i) - ad_dz ad_zo(ktcon(i),i) = ad_zo(ktcon(i),i) + ad_dz end do !c !c Adjoint of windshear calculation do i = 1,im do k = kmax,1,-1 ad_shear = 0.0 ad_termv = 0.0 ad_termu = 0.0 if (k.ge.kb(i) .and. k.le.ktcon(i)) then !c !c Adjoint code for vshear ad_shear = ad_shear + ad_vshear(i) !c !c Redo nlm calculations termu = (uol(k+1,i) - uol(k,i))**2 termv = (vol(k+1,i) - vol(k,i))**2 !c !c Adjoint code for uol and vol if (termu+termv.gt.tiny) then ad_termv = ad_termv + & rcs(i)*(0.5/sqrt(termu+termv)) * ad_shear ad_termu = ad_termu + & rcs(i)*(0.5/sqrt(termu+termv)) * ad_shear else ad_shear = 0.0 ad_termu = 0.0 ad_termv = 0.0 endif ad_vol(k,i) = ad_vol(k,i) & - 2.*(vol(k+1,i)-vol(k,i))*ad_termv ad_vol(k+1,i) = ad_vol(k+1,i) & + 2.*(vol(k+1,i)-vol(k,i))*ad_termv ad_uol(k,i) = ad_uol(k,i) & - 2.*(uol(k+1,i)-uol(k,i))*ad_termu ad_uol(k+1,i) = ad_uol(k+1,i) & + 2.*(uol(k+1,i)-uol(k,i))*ad_termu endif end do end do !c !c Adjoint of cloud mass flux threshold function based !c on updraft cloud work function do i = 1,im ad_term = 0.0 term = 1.e3*aa10(i) if (abs(term).lt.100.) then ad_term = dftanh(term)*ad_tcwfup(i) else if (term.lt.-100.) then ad_term = 0.0 else ad_term = 0.0 endif endif ad_aa1(i) = ad_aa1(i) + 1.e3*ad_term end do !c !c !c Adjoint of updraft cwf calculation do k = kmax,1,-1 do i = 1,im if (k.gt.kbcon(i).and.k.le.ktcon(i)) then !c !c Recalculate part of forward model dz1 = zo(k,i) - zo(k-1,i) gamma = el2orc * qesol(k-1,i) / (tol(k-1,i)**2) rfact = 1. + delta*cp*gamma*tol(k-1,i)/hvap term1 = dz1*g/cp term2 = 1./tol(k-1,i) term3 = dbyo(k-1,i) term4 = 1./(1.+gamma) term5 = rfact dqs = qesol(k-1,i) - qol(k-1,i) !c !c Adjoint of forward model tlm ad_dqs = 0.0 ad_dz1 = 0.0 if (dqs.gt.0.) then ad_dqs = ad_dqs + dz1*g*delta * ad_aa1(i) ad_dz1 = ad_dz1 + ad_aa1(i) * g*delta*dqs endif ad_qol(k-1,i) = ad_qol(k-1,i) - ad_dqs ad_qesol(k-1,i) = ad_qesol(k-1,i) + ad_dqs ad_term5 = term1*term2*term3*term4*ad_aa1(i) ad_term4 = term1*term2*term3*term5*ad_aa1(i) ad_term3 = term1*term2*term4*term5*ad_aa1(i) ad_term2 = term1*term3*term4*term5*ad_aa1(i) ad_term1 = term2*term3*term4*term5*ad_aa1(i) ad_rfact = ad_term5 ad_gamma = -1./((1.+gamma)**2) * ad_term4 ad_dbyo(k-1,i) = ad_dbyo(k-1,i) + ad_term3 ad_tol(k-1,i) = ad_tol(k-1,i) - & (1./(tol(k-1,i)**2)) * ad_term2 ad_dz1 = ad_dz1 + ad_term1*g/cp ad_tol(k-1,i) = ad_tol(k-1,i) + & delta*cp*gamma*ad_rfact/hvap ad_gamma = ad_gamma + & delta*cp*ad_rfact*tol(k-1,i)/hvap ad_tol(k-1,i) = ad_tol(k-1,i) - & 2.*el2orc*qesol(k-1,i)/(tol(k-1,i)**3)* & ad_gamma ad_qesol(k-1,i) = ad_qesol(k-1,i) + & el2orc*ad_gamma/(tol(k-1,i)**2) ad_zo(k,i) = ad_zo(k,i) + ad_dz1 ad_zo(k-1,i) = ad_zo(k-1,i) - ad_dz1 endif end do end do ! Adjoint of section is for cloud liquid water if (ncloud.gt.0) then do i=1,im k = ktcon(i) if (cnvflg(i)) then ! Recompute nlm gamma = EL2ORC * QESOl(K,i) / (TOl(K,i)**2) QRCH = QESOl(K,i) & + GAMMA * DBYO(K,i) / (HVAP * (1. + GAMMA)) DQ = qcko00(K-1,i) - QRCH ! Adjoint of tangent linear model ad_dq = 0.0 ad_qrch = 0.0 ad_gamma= 0.0 if (dq.gt.0) then ad_qrch = ad_qrch + ad_qcko(k-1,i) ad_dq = ad_dq + ad_qlko_ktcon(i) endif ad_qrch = ad_qrch - ad_dq ad_qcko(k-1,i) = ad_qcko(k-1,i) + ad_dq ad_gamma = ad_gamma + & ad_qrch*dbyo(k,i)/(hvap*(1+gamma)*(1+gamma)) ad_dbyo(k,i) = ad_dbyo(k,i) + & gamma*ad_qrch/(hvap*(1.+gamma)) ad_qesol(k,i) = ad_qesol(k,i) + ad_qrch ad_tol(k,i) = ad_tol(k,i) - ad_gamma * & 2.*el2orc*qesol(k,i)/(tol(k,i)**3) ad_qesol(k,i) = ad_qesol(k,i) + & el2orc*ad_gamma/(tol(k,i)**2) endif end do endif !c !c Adjoint of pwavo, pwo, qcko, and aa1 calculation !c do i = 1,im do k = kmax,1,-1 if (k.gt.kb(i).and.k.lt.ktcon(i)) then !c !c Recalculate part of forward model factor = eta(k-1,i)/eta(k,i) onemf = 1.0 - factor temp = qcko0(k,i) gamma = el2orc*qesol(k,i)/(tol(k,i)**2) qrch = qesol(k,i) + & gamma*dbyo(k,i)/(hvap*(1.+gamma)) dq = dqk(k,i) !c if (dq.gt.0.) then !c !c Redo nlm dz = 0.5*(zo(k+1,i)-zo(k-1,i)) dz1 = zo(k,i) - zo(k-1,i) etah = 0.5*(eta(k,i)+eta(k-1,i)) qlk = dq/(eta(k,i) + etah*c0*dz) !c !c Adjoint of tlm ad_temp = 0.0 ad_qc = ad_qcko(k,i) ad_qrch = ad_qc ad_qlk = ad_qc ad_pwo(k,i) = ad_pwo(k,i) + ad_pwavo(i) ad_qlk = ad_qlk + etah*c0*dz*ad_pwo(k,i) ad_dz = etah*c0*ad_pwo(k,i)*qlk ad_etah = ad_pwo(k,i)*c0*dz*qlk ad_qlk = ad_qlk - dz1*g*ad_aa1(i) ad_dz1 = -1.*ad_aa1(i)*g*qlk ad_dz = ad_dz - & (dq/((eta(k,i)+etah*c0*dz)**2))* & etah*c0*ad_qlk ad_etah = ad_etah - & (dq/((eta(k,i)+etah*c0*dz)**2))* & ad_qlk*c0*dz ad_eta(k,i) = ad_eta(k,i) - & (dq/((eta(k,i)+etah*c0*dz)**2))* & ad_qlk ad_dq = ad_qlk/(eta(k,i)+etah*c0*dz) ad_eta(k-1,i) = ad_eta(k-1,i) + 0.5*ad_etah ad_eta(k,i) = ad_eta(k,i) + 0.5*ad_etah ad_zo(k-1,i) = ad_zo(k-1,i) - ad_dz1 ad_zo(k,i) = ad_zo(k,i) + ad_dz1 ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_dz else ad_qc = 0.0 ad_qrch = 0.0 ad_qlk = 0.0 ad_dz = 0.0 ad_etah = 0.0 ad_dz1 = 0.0 ad_dq = 0.0 ad_temp = ad_qcko(k,i) endif ad_qrch = ad_qrch - eta(k,i)*ad_dq ad_temp = ad_temp + eta(k,i)*ad_dq ad_eta(k,i) = ad_eta(k,i) + ad_dq*(temp-qrch) !c ad_gamma = -gamma*dbyo(k,i)/((hvap*(1.+gamma))**2)* & hvap*ad_qrch ad_dbyo(k,i) = ad_dbyo(k,i) + & gamma*ad_qrch/(hvap*(1+gamma)) ad_gamma = ad_gamma + & ad_qrch*dbyo(k,i)/(hvap*(1.+gamma)) ad_qesol(k,i) = ad_qesol(k,i) + ad_qrch ad_tol(k,i) = ad_tol(k,i) - & el2orc*2*qesol(k,i)/(tol(k,i)**3)*ad_gamma ad_qesol(k,i) = ad_qesol(k,i) + & el2orc/(tol(k,i)**2)*ad_gamma ad_qol(k+1,i) = ad_qol(k+1,i) + onemf*0.5*ad_temp ad_qol(k,i) = ad_qol(k,i) + onemf*0.5*ad_temp ad_onemf = ad_temp*0.5*(qol(k,i)+qol(k+1,i)) ad_qcko(k-1,i) = ad_qcko(k-1,i) + factor*ad_temp ad_factor = ad_temp*qcko(k-1,i) ad_factor = ad_factor - ad_onemf ad_eta(k,i) = ad_eta(k,i) - & (eta(k-1,i)/(eta(k,i)**2))*ad_factor ad_eta(k-1,i) = ad_eta(k-1,i) + & (1./eta(k,i))*ad_factor endif end do end do !c !c Adjoint of qol to qcko transfer do i = 1,im indx = kb(i) ad_qol(indx,i) = ad_qol(indx,i) + ad_qcko(indx,i) end do !c !c Adjoint of hcko,hckod transfer to hcko1 and dbyo calculation do i = 1,im do k = kmax-1,2,-1 if (k.gt.kb(i)) then ad_hesol(k,i) = ad_hesol(k,i) - ad_dbyo(k,i) ad_hcko1(k,i) = ad_hcko1(k,i) + ad_dbyo(k,i) endif if (k.gt.kb(i).and.k.le.kbcon(i)) then ad_hcko(k,i) = ad_hcko(k,i) + ad_hcko1(k,i) elseif (k.gt.kbcon(i).and.k.le.ktcon(i)) then if (.not.dwnflg(i)) then ad_hcko(k,i) = ad_hcko(k,i) + ad_hcko1(k,i) else ad_hckod(k,i) = ad_hckod(k,i) + ad_hcko1(k,i) endif elseif (k.gt.ktcon(i)) then ad_hcko(k,i) = ad_hcko(k,i) + ad_hcko1(k,i) endif end do end do !c !c Adjoint of modification of hcko1 by detrainment process do i = 1,im do k = kmax-1,2,-1 if (k.gt.kbcon(i) .and. k.le.ktcon(i)) then !c !c Redo nlm calculations factor = eta(k-1,i)/eta(k,i) onemf = 1. - factor fuv = etau(k-1,i)/etau(k,i) onemfu = 1. - fuv heol2 = 0.5*(heol(k,i) + heol(k+1,i)) uol2 = 0.5*(uol(k,i)+uol(k+1,i)) vol2 = 0.5*(vol(k,i)+vol(k+1,i)) !c !c Adjoint code ad_fuv = 0.0 ad_onemfu = 0.0 ad_onemf = 0.0 ad_factor = 0.0 ad_heol2 = 0.0 ad_vol2 = 0.0 ad_uol2 = 0.0 ad_vol2 = ad_vol2 + onemfu*ad_vckod(k,i) ad_onemfu = ad_onemfu + ad_vckod(k,i)*vol2 ad_vckod(k-1,i) = ad_vckod(k-1,i) + fuv*ad_vckod(k,i) ad_fuv = ad_fuv + ad_vckod(k,i)*vckod(k-1,i) ad_uol2 = ad_uol2 + onemfu*ad_uckod(k,i) ad_onemfu = ad_onemfu + ad_uckod(k,i)*uol2 ad_uckod(k-1,i) = ad_uckod(k-1,i) + fuv*ad_uckod(k,i) ad_fuv = ad_fuv + ad_uckod(k,i)*uckod(k-1,i) ad_heol2 = ad_heol2 + onemf*ad_hckod(k,i) ad_onemf = ad_onemf + heol2*ad_hckod(k,i) ad_hckod(k-1,i) = ad_hckod(k-1,i) + factor*ad_hckod(k,i) ad_factor = ad_factor + hckod(k-1,i)*ad_hckod(k,i) ad_heol(k,i) = ad_heol(k,i) + 0.5*ad_heol2 ad_heol(k+1,i) = ad_heol(k+1,i) + 0.5*ad_heol2 ad_fuv = ad_fuv - ad_onemfu ad_etau(k-1,i) = ad_etau(k-1,i) + ad_fuv/etau(k,i) ad_etau(k,i) = ad_etau(k,i) - ad_fuv * & etau(k-1,i)/(etau(k,i)**2) ad_factor = ad_factor - ad_onemf ad_eta(k,i) = ad_eta(k,i) - & ad_factor*(eta(k-1,i)/(eta(k,i)**2)) ad_eta(k-1,i) = ad_eta(k-1,i) + ad_factor/eta(k,i) endif end do end do !c !c Adjoint of hcko to hckod transfer at kbcon do i = 1,im if (dwnflg(i)) then indx = kbcon(i) ad_hcko(indx,i) = ad_hcko(indx,i) + ad_hckod(indx,i) ad_ucko(indx,i) = ad_ucko(indx,i) + ad_uckod(indx,i) ad_vcko(indx,i) = ad_vcko(indx,i) + ad_vckod(indx,i) endif end do !c !c Adjoint of eta calculation do i = 1,im if (dwnflg(i)) then do k = kmax-1,2,-1 if (k.gt.jmin(i) .and. k.le.kt2(i)) then ! Redo nlm calculation dz = 0.5*(zo(k+1,i)-zo(k-1,i)) ! Adjoint code ad_dz = 0.0 ad_dz = ad_dz + etau(k-1,i) * & (xlamdet(i)+xlambu)*ad_etau(k,i) ad_xlamdet(i) = ad_xlamdet(i) + & etau(k-1,i)*ad_etau(k,i)*dz ad_etau(k-1,i) = ad_etau(k-1,i) + & ad_etau(k,i)*(1.+(xlamdet(i)+xlambu)*dz) ad_dz = ad_dz + eta(k-1,i)*xlamdet(i)*ad_eta(k,i) ad_xlamdet(i) = ad_xlamdet(i) + & eta(k-1,i)*ad_eta(k,i)*dz ad_eta(k-1,i) = ad_eta(k-1,i) + & ad_eta(k,i)*(1.+xlamdet(i)*dz) ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_dz endif end do else do k=kmax-1,2,-1 if (k.gt.jmin(i) .and. k.le.ktcon0(i)) then ! Redo nlm calculation DZ = .5 * (ZO(k+1,i) - ZO(k-1,i)) ! Adjoint code ad_dz = 0.0 ad_dz = ad_dz + etau(k-1,i)*xlambu*ad_etau(k,i) ad_etau(k-1,i) = ad_etau(k-1,i) + & ad_etau(k,i)*(1.+xlambu*dz) endif end do endif end do !c !c !c Adjoint of modification of cloud properties below cloud !c base via the entrainment process do i = 1,im tem1 = hcko(jmin(i),i) - hesol(kt2(i),i) tem2 = sumz(kt2(i),i) * hesol(kt2(i),i) - sumh(kt2(i),i) ad_tem1 = 0.0 ad_tem2 = 0.0 if (sumz(kt2(i),i) .gt. 0.000001) then term = 2.3/sumz(kt2(i),i) if (xlamdet1(i).lt.term) then ad_xlamdet1(i) = ad_xlamdet1(i) + ad_xlamdet(i) else ad_term = 0.0 ad_term = ad_term + ad_xlamdet(i) ad_sumz(kt2(i),i) = ad_sumz(kt2(i),i) - ad_term * & 2.3/(sumz(kt2(i),i)**2) endif else ad_xlamdet1(i) = ad_xlamdet1(i) + ad_xlamdet(i) endif if (xlamdet0(i).ge.0) then ad_xlamdet0(i) = ad_xlamdet0(i) + ad_xlamdet1(i) else ad_xlamdet0(i) = 0.0 endif if (abs(tem2) .gt. 0.000001) then ad_tem1 = 0.0 ad_tem2 = 0.0 ad_tem1 = ad_tem1 + ad_xlamdet0(i)/tem2 ad_tem2 = ad_tem2 - tem1/(tem2**2) * ad_xlamdet0(i) else ad_tem1 = 0.0 ad_tem2 = 0.0 endif ad_sumz(kt2(i),i) =ad_sumz(kt2(i),i) + ad_tem2*hesol(kt2(i),i) ad_hesol(kt2(i),i)=ad_hesol(kt2(i),i)+ ad_tem2*sumz(kt2(i),i) ad_sumh(kt2(i),i) =ad_sumh(kt2(i),i) - ad_tem2 ad_hesol(kt2(i),i) = ad_hesol(kt2(i),i) - ad_tem1 ad_hcko(jmin(i),i) = ad_hcko(jmin(i),i) + ad_tem1 end do do i=1,im do k=kmax-1,2,-1 if (k.gt.jmin(i) .and. k.le.ktcon0(i)) then ad_heol(k,i) = ad_heol(k,i) + & 0.5 * (zo(k+1,i) - zo(k-1,i)) * ad_sumh(k,i) ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_sumh(k,i)*heol(k,i) ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_sumh(k,i)*heol(k,i) ad_sumh(k-1,i) = ad_sumh(k-1,i) + ad_sumh(k,i) ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_sumz(k,i) ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_sumz(k,i) ad_sumz(k-1,i) = ad_sumz(k-1,i) + ad_sumz(k,i) endif end do end do ! Adjoint of cloud property below cloud base is modified by the ! entrainment process do i=1,im do k=kmax-1,2,-1 !c Adjoint of last if-then block in tlm if (k.gt.kbcon(i)) then ad_hcko(kbcon(i),i) = ad_hcko(kbcon(i),i) + ad_hcko(k,i) ad_ucko(kbcon(i),i) = ad_ucko(kbcon(i),i) + ad_ucko(k,i) ad_vcko(kbcon(i),i) = ad_vcko(kbcon(i),i) + ad_vcko(k,i) endif !c !c Adjoint of first if-then block in tlm if (k.gt.kb(i).and.k.le.kbcon(i)) then !c !c Redo nlm calculations factor = eta0(k-1,i)/eta0(k,i) onemf = 1. - factor !c !c Adjoint code ad_factor = 0.0 ad_onemf = 0.0 ad_vol(k+1,i) = ad_vol(k+1,i) + onemf*0.5*ad_vcko(k,i) ad_vol(k,i) = ad_vol(k,i) + onemf*0.5*ad_vcko(k,i) ad_onemf = ad_onemf + ad_vcko(k,i)*0.5* & (vol(k,i)+vol(k+1,i)) ad_vcko(k-1,i) = ad_vcko(k-1,i) + factor*ad_vcko(k,i) ad_factor = ad_factor + ad_vcko(k,i)*vcko0(k-1,i) ad_uol(k+1,i) = ad_uol(k+1,i) + onemf*0.5*ad_ucko(k,i) ad_uol(k,i) = ad_uol(k,i) + onemf*0.5*ad_ucko(k,i) ad_onemf = ad_onemf + ad_ucko(k,i)*0.5* & (uol(k,i)+uol(k+1,i)) ad_ucko(k-1,i) = ad_ucko(k-1,i) + factor*ad_ucko(k,i) ad_factor = ad_factor + ad_ucko(k,i)*ucko0(k-1,i) ad_heol(k+1,i) = ad_heol(k+1,i) + onemf*0.5*ad_hcko(k,i) ad_heol(k,i) = ad_heol(k,i) + onemf*0.5*ad_hcko(k,i) ad_onemf = ad_onemf + ad_hcko(k,i)*0.5* & (heol(k,i)+heol(k+1,i)) ad_hcko(k-1,i) = ad_hcko(k-1,i) + factor*ad_hcko(k,i) ad_factor = ad_factor + ad_hcko(k,i)*hcko0(k-1,i) ad_factor = ad_factor - ad_onemf ad_eta(k,i) = ad_eta(k,i) - ad_factor* & eta0(k-1,i)/(eta0(k,i)*eta0(k,i)) ad_eta(k-1,i) = ad_eta(k-1,i) + ad_factor/eta0(k,i) endif end do end do !c !c Adjoint of hkbo --> hcko transfer do i = 1,im indx = kb(i) ad_hkbo(i) = ad_hkbo(i) + ad_hcko(indx,i) ad_ukbo(i) = ad_ukbo(i) + ad_ucko(indx,i) ad_vkbo(i) = ad_vkbo(i) + ad_vcko(indx,i) end do !c !c Adjoint of updraft mass flux calculation do i = 1,im ad_dz = 0.0 if (kb(i).eq.1 .and. kbcon(i).gt.1) then dz = 0.5*(zo(2,i)-zo(1,i)) ad_eta(1,i) = ad_eta(1,i) + ad_etau(1,i) ad_dz = ad_dz - & eta0(2,i)*exp(-xlamb(i)*dz)*xlamb(i)* & ad_eta(1,i) ad_xlamb(i) = ad_xlamb(i) - & eta0(2,i)*exp(-xlamb(i)*dz)*dz*ad_eta(1,i) ad_eta(2,i) = ad_eta(2,i) + ad_eta(1,i)* & exp(-xlamb(i)*dz) ad_zo(1,i) = ad_zo(1,i) - 0.5*ad_dz ad_zo(2,i) = ad_zo(2,i) + 0.5*ad_dz endif end do do i = 1,im do k = 2,kbmax ad_dz = 0.0 if (k.lt.kbcon(i).and.k.ge.kb(i)) then dz = 0.5 * (zo(k+1,i) - zo(k-1,i)) ad_eta(k,i) = ad_eta(k,i) + ad_etau(k,i) ad_dz = ad_dz - eta0(k+1,i)*exp(-xlamb(i)*dz) * & xlamb(i)*ad_eta(k,i) ad_xlamb(i) = ad_xlamb(i) - & eta0(k+1,i)*exp(-xlamb(i)*dz)*dz*ad_eta(k,i) ad_eta(k+1,i) = ad_eta(k+1,i) + ad_eta(k,i)* & exp(-xlamb(i)*dz) ad_zo(k-1,i) = ad_zo(k-1,i) - 0.5*ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_dz endif end do end do !c !c Adjoint of determination of entrainment rate between kb and kbcon do i = 1,im !c !c Recalculate nlm alpha = alphas if (nint(slimsk(i)) .eq. 1) alpha = alphal if (kb(i).eq.1) then dz = 0.5 * (zo(kbcon(i),i)+zo(kbcon(i)-1,i)) - zo(1,i) else dz = 0.5*(zo(kbcon(i),i)+zo(kbcon(i)-1,i)) - & 0.5*(zo(kb(i),i) +zo(kb(i)-1,i)) endif !c !c Adjoint of tlm code. ad_dz = 0.0 if (kbcon(i).ne.kb(i)) then ad_dz = ad_dz + 2.*log(alpha)/(dz*dz) * ad_xlamb(i) else ad_dz = 0.0 endif if (kb(i).eq.1) then ad_zo(1,i) = ad_zo(1,i) - ad_dz ad_zo(kbcon(i)-1,i) = ad_zo(kbcon(i)-1,i) + 0.5*ad_dz ad_zo(kbcon(i),i) = ad_zo(kbcon(i),i) + 0.5*ad_dz else ad_zo(kb(i)-1,i) = ad_zo(kb(i)-1,i) - 0.5*ad_dz ad_zo(kb(i),i) = ad_zo(kb(i),i) - 0.5*ad_dz ad_zo(kbcon(i),i) = ad_zo(kbcon(i),i) + 0.5*ad_dz ad_zo(kbcon(i)-1,i) = ad_zo(kbcon(i)-1,i) + 0.5*ad_dz endif end do !c !c Adjoint of dot to pdot transfer at kbcon do i = 1,im ad_dot0(kbcon(i),i) = ad_dot0(kbcon(i),i) + 10.*ad_pdot(i) end do !c !c Adjoint of heol --> hkbo transfer do i = 1,im indx = kb(i) ad_heol(indx,i) = ad_heol(indx,i) + ad_hkbo(i) ad_uol(indx,i) = ad_uol(indx,i) + ad_ukbo(i) ad_vol(indx,i) = ad_vol(indx,i) + ad_vkbo(i) end do !c !c Adjoint of heol and hesol calculation at kmax k = kmax do i = 1,im ad_heo(k,i) = ad_heo(k,i) + ad_heol(k,i) ad_heso(k,i) = ad_heso(k,i) + ad_hesol(k,i) end do !c ! Adjoint of heol and hesol calculation below kmax do i = 1,im do k = kmax-1,1,-1 !c !c Make necessary nlm calculations PO = 0.5 * ( call adfpvsx(tol(k,i),es0,adt,ad_es0,adjoint0) esl = 10.*es0 !c !c Zero local adjoint variables ad_es0 = 0.0 ad_esl = 0.0 !c !c Adjoint of tlm code ad_vo(k+1,i) = ad_vo(k+1,i) + 0.5*ad_vol(k,i) ad_vo(k,i) = ad_vo(k,i) + 0.5*ad_vol(k,i) ad_uo(k+1,i) = ad_uo(k+1,i) + 0.5*ad_uol(k,i) ad_uo(k,i) = ad_uo(k,i) + 0.5*ad_uol(k,i) ad_qesol(k,i) = ad_qesol(k,i) + hvap*ad_hesol(k,i) ad_tol(k,i) = ad_tol(k,i) + cp*ad_hesol(k,i) ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*g*ad_hesol(k,i) ad_zo(k,i) = ad_zo(k,i) + 0.5*g*ad_hesol(k,i) ad_qol(k,i) = ad_qol(k,i) + hvap*ad_heol(k,i) ad_tol(k,i) = ad_tol(k,i) + cp*ad_heol(k,i) ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*g*ad_heol(k,i) ad_zo(k,i) = ad_zo(k,i) + 0.5*g*ad_heol(k,i) ad_esl = ad_esl - eps*esl/((po+epsm1*esl)**2) * & epsm1 * ad_qesol(k,i) ad_esl = ad_esl + eps*ad_qesol(k,i)/(po+epsm1*esl) ad_es0 = ad_es0 + 10*ad_esl adt = 0.0 call adfpvsx(tol(k,i),es0,adt,ad_es0,adjoint) ad_tol(k,i) = ad_tol(k,i) + adt end do end do !c !c Adjoint of tol and qol calculation do i = 1,im do k = kmax-1,1,-1 !c !c Make necessary nlm calculations DZ = 0.5 * (ZO(k+1,i) - ZO(k,i)) DP = 0.5 * (!! ES = 10. * FESB(TO(k+1,i)) call adfpvsx(to(k+1,i),es0,adt,ad_es0,adjoint0) es = 10*es0 PPRIME= P(k+1,i) + EPSM1 * ES QS = EPS * ES / PPRIME DQSDP = - QS / PPRIME DESDT = ES * (FACT1 / TO(k+1,i) + FACT2 / (TO(k+1,i)**2)) DQSDT = QS * P(k+1,i) * DESDT / (ES * PPRIME) GAMMA = EL2ORC * QESO(k+1,i) / (TO(k+1,i)**2) DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA)) !c !c Initialize local ajm variables to 0.0 ad_es0 = 0.0 ad_dq = 0.0 ad_dt = 0.0 ad_dqsdp = 0.0 ad_dqsdt = 0.0 ad_gamma = 0.0 ad_dz = 0.0 ad_pprime = 0.0 ad_es = 0.0 ad_desdt = 0.0 ad_qs = 0.0 !c !c Adjoint of tlm code if (qol0(k,i)>0.0) then ad_qol0(k,i) = ad_qol0(k,i) + ad_qol(k,i) else ad_qol0(k,i) = 0.0 endif ad_qo(k+1,i) = ad_qo(k+1,i) + ad_qol0(k,i) ad_dq = ad_dq + ad_qol0(k,i) ad_to(k+1,i) = ad_to(k+1,i) + ad_tol(k,i) ad_dt = ad_dt + ad_tol(k,i) ad_dqsdp = ad_dqsdp + ad_dq*dp ad_dt = ad_dt + dqsdt*ad_dq ad_dqsdt = ad_dqsdt + ad_dq*dt ad_gamma = ad_gamma - & (g*dz+hvap*dqsdp*dp)/((cp*(1.+gamma))**2) * & cp*ad_dt ad_dqsdp = ad_dqsdp + hvap*ad_dt*dp/(cp*(1.+gamma)) ad_dz = ad_dz + g*ad_dt/(cp*(1.+gamma)) ad_to(k+1,i) = ad_to(k+1,i) - & 2.*el2orc*qeso(k+1,i)/(to(k+1,i)**3) * ad_gamma ad_qeso(k+1,i) = ad_qeso(k,i) + & el2orc*ad_gamma/(to(k+1,i)**2) rterm = 1./(es*pprime) ad_pprime = ad_pprime - (qs*p(k+1,i)*desdt)*rterm**2 * & es*ad_dqsdt ad_es = ad_es - (qs*p(k+1,i)*desdt)*rterm**2 * & ad_dqsdt*pprime ad_desdt = ad_desdt + p(k+1,i)*qs*ad_dqsdt*rterm ad_qs = ad_qs + p(k+1,i)*ad_dqsdt*desdt*rterm ad_to(k+1,i) = ad_to(k+1,i) + ad_desdt * es * & (-1.*fact1/(to(k+1,i)**2) - 2.*fact2/(to(k+1,i)**3)) ad_es = ad_es + ad_desdt * & (fact1/to(k+1,i) + fact2/(to(k+1,i)**2)) ad_pprime = ad_pprime + (qs/(pprime**2))*ad_dqsdp ad_qs = ad_qs - ad_dqsdp/pprime ad_pprime = ad_pprime - (eps*es/(pprime**2))*ad_qs ad_es = ad_es + eps*ad_qs/pprime ad_es = ad_es + epsm1*ad_pprime ad_es0 = ad_es0 + 10.*ad_es adt=0.0 call adfpvsx(to(k+1,i),es0,adt,ad_es0,adjoint0) ad_to(k+1,i) = ad_to(k+1,i) + adt ad_zo(k,i) = ad_zo(k,i) - 0.5*ad_dz ad_zo(k+1,i) = ad_zo(k+1,i) + 0.5*ad_dz end do end do !c !c !c Adjoint of moist static energy calculation do i = 1,im do k = 1,kmax ad_qeso(k,i) = ad_qeso(k,i) + hvap*ad_heso(k,i) ad_to(k,i) = ad_to(k,i) + cp*ad_heso(k,i) ad_zo(k,i) = ad_zo(k,i) + g*ad_heso(k,i) ad_qo(k,i) = ad_qo(k,i) + hvap*ad_heo(k,i) ad_to(k,i) = ad_to(k,i) + cp*ad_heo(k,i) ad_zo(k,i) = ad_zo(k,i) + g*ad_heo(k,i) end do end do !c !c !c Adjoint of zo calculation do i = 1,im do k = kmax,2,-1 dlnsig = log(sl(k)/sl(k-1)) term1 = dlnsig * rd / g ad_zo(k-1,i) = ad_zo(k-1,i) + ad_zo(k,i) ad_term2 = -1.*term1*ad_zo(k,i) ad_tvo(k-1,i) = ad_tvo(k-1,i) + 0.5*ad_term2 ad_tvo(k,i) = ad_tvo(k,i) + 0.5*ad_term2 end do end do !c dlnsig = log(sl(1)) do i = 1,im ad_tvo(1,i) = ad_tvo(1,i) - (dlnsig*rd/g)*ad_zo(1,i) end do !c !c !c Adjoint of initial qeso and tvo calculation. do i = 1,im do k = 1,kmax call adfpvsx(to(k,i),es0,adt,ad_es0,adjoint0) es = 10.*es0 ad_qo(k,i) = ad_qo(k,i) + delta*to(k,i)*ad_tvo(k,i) ad_to(k,i) = ad_to(k,i) + delta*qo(k,i)*ad_tvo(k,i) ad_to(k,i) = ad_to(k,i) + ad_tvo(k,i) ad_es = 0.0 ad_es = ad_es + ad_qeso(k,i) * & eps*p(k,i)/( ad_es0 = 0.0 ad_es0 = 10.*ad_es adt=0.0 call adfpvsx(to(k,i),es0,adt,ad_es0,adjoint) ad_to(k,i) = ad_to(k,i) + adt end do end do !c !c Adjoint of initial 0 --> o transfer do i = 1,im do k = 1,km ad_q0(k,i) = ad_q0(k,i) + ad_qo0(k,i) ad_cwm0(k,i) = ad_cwm0(k,i) + ad_cwmo(k,i) ad_v0(k,i) = ad_v0(k,i) + ad_vo(k,i) ad_u0(k,i) = ad_u0(k,i) + ad_uo(k,i) if (q0(k,i)>0.) then ad_q0(k,i) = ad_q0(k,i) + ad_qo(k,i) else ad_q0(k,i) = 0.0 endif ad_t0(k,i) = ad_t0(k,i) + ad_to(k,i) end do end do !c !c End of routine RETURN END