--- trunk/phylmd/CV3_routines/cv3_unsat.f 2014/04/04 11:30:34 96 +++ trunk/phylmd/CV3_routines/cv3_unsat.f 2014/04/25 14:58:31 97 @@ -1,58 +1,58 @@ +module cv3_unsat_m + implicit none - SUBROUTINE cv3_unsat(nloc,ncum,nd,na,ntra,icb,inb & - ,t,rr,rs,gz,u,v,tra,p,ph & - ,th,tv,lv,cpn,ep,sigp,clw & - ,m,ment,elij,delt,plcl & - ,mp,rp,up,vp,trap,wt,water,evap,b) - use cv3_param_m - use cvthermo - use cvflag - implicit none +contains + SUBROUTINE cv3_unsat(nloc,ncum,nd,na,icb,inb & + ,t,rr,rs,gz,u,v,p,ph & + ,th,tv,lv,cpn,ep,sigp,clw & + ,m,ment,elij,delt,plcl & + ,mp,rp,up,vp,wt,water,evap,b) + use cv3_param_m + use cvthermo + use cvflag + + + ! inputs: + integer, intent(in):: ncum, nd, na, nloc + integer icb(nloc), inb(nloc) + real, intent(in):: delt + real plcl(nloc) + real t(nloc,nd), rr(nloc,nd), rs(nloc,nd) + real u(nloc,nd), v(nloc,nd) + real p(nloc,nd), ph(nloc,nd+1) + real th(nloc,na), gz(nloc,na) + real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na) + real cpn(nloc,na), tv(nloc,na) + real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na) + + ! outputs: + real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na) + real water(nloc,na), evap(nloc,na), wt(nloc,na) + real b(nloc,na) + + ! local variables + integer i,j,k,il,num1 + real tinv, delti + real awat, afac, afac1, afac2, bfac + real pr1, pr2, sigt, b6, c6, revap, tevap, delth + real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf + real ampmax + real lvcp(nloc,na) + real wdtrain(nloc) + logical lwork(nloc) -! inputs: - integer, intent(in):: ncum, nd, na, ntra, nloc - integer icb(nloc), inb(nloc) - real, intent(in):: delt - real plcl(nloc) - real t(nloc,nd), rr(nloc,nd), rs(nloc,nd) - real u(nloc,nd), v(nloc,nd) - real tra(nloc,nd,ntra) - real p(nloc,nd), ph(nloc,nd+1) - real th(nloc,na), gz(nloc,na) - real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na) - real cpn(nloc,na), tv(nloc,na) - real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na) - -! outputs: - real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na) - real water(nloc,na), evap(nloc,na), wt(nloc,na) - real trap(nloc,na,ntra) - real b(nloc,na) - -! local variables - integer i,j,k,il,num1 - real tinv, delti - real awat, afac, afac1, afac2, bfac - real pr1, pr2, sigt, b6, c6, revap, tevap, delth - real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf - real ampmax - real lvcp(nloc,na) - real wdtrain(nloc) - logical lwork(nloc) - - -!------------------------------------------------------ + !------------------------------------------------------ - delti = 1./delt - tinv=1./3. + delti = 1./delt + tinv=1./3. - mp(:,:)=0. + mp(:,:)=0. - do i=1,nl - do il=1,ncum + do i=1,nl + do il=1,ncum mp(il,i)=0.0 rp(il,i)=rr(il,i) up(il,i)=u(il,i) @@ -62,260 +62,260 @@ evap(il,i)=0.0 b(il,i)=0.0 lvcp(il,i)=lv(il,i)/cpn(il,i) - enddo - enddo + enddo + enddo + + ! + ! *** check whether ep(inb)=0, if so, skip precipitating *** + ! *** downdraft calculation *** + ! + + do il=1,ncum + lwork(il)=.TRUE. + if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE. + enddo + + call zilch(wdtrain,ncum) + + DO i=nl+1,1,-1 -! -! *** check whether ep(inb)=0, if so, skip precipitating *** -! *** downdraft calculation *** -! - - do il=1,ncum - lwork(il)=.TRUE. - if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE. - enddo - - call zilch(wdtrain,ncum) - - DO 400 i=nl+1,1,-1 - - num1=0 - do il=1,ncum - if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1 - enddo - if (num1.le.0) goto 400 - -! -! *** integrate liquid water equation to find condensed water *** -! *** and condensed water flux *** -! - -! -! *** begin downdraft loop *** -! - -! -! *** calculate detrained precipitation *** -! + num1=0 do il=1,ncum - if (i.le.inb(il) .and. lwork(il)) then - if (cvflag_grav) then - wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i) - else - wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i) - endif - endif + if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1 enddo + if (num1.le.0) cycle - if(i.gt.1)then - do 320 j=1,i-1 - do il=1,ncum + ! + ! *** integrate liquid water equation to find condensed water *** + ! *** and condensed water flux *** + ! + + ! + ! *** begin downdraft loop *** + ! + + ! + ! *** calculate detrained precipitation *** + ! + do il=1,ncum if (i.le.inb(il) .and. lwork(il)) then - awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i) - awat=amax1(awat,0.0) - if (cvflag_grav) then - wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i) - else - wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i) - endif + if (cvflag_grav) then + wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i) + else + wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i) + endif endif - enddo -320 continue - endif + enddo -! -! *** find rain water and evaporation using provisional *** -! *** estimates of rp(i)and rp(i-1) *** -! - - do 999 il=1,ncum - - if (i.le.inb(il) .and. lwork(il)) then - - wt(il,i)=45.0 - - if(i.lt.inb(il))then - rp(il,i)=rp(il,i+1) & - +(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i) - rp(il,i)=0.5*(rp(il,i)+rr(il,i)) - endif - rp(il,i)=amax1(rp(il,i),0.0) - rp(il,i)=amin1(rp(il,i),rs(il,i)) - rp(il,inb(il))=rr(il,inb(il)) - - if(i.eq.1)then - afac=p(il,1)*(rs(il,1)-rp(il,1))/(1.0e4+2000.0*p(il,1)*rs(il,1)) - else - rp(il,i-1)=rp(il,i) & - +(cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il,i) - rp(il,i-1)=0.5*(rp(il,i-1)+rr(il,i-1)) - rp(il,i-1)=amin1(rp(il,i-1),rs(il,i-1)) - rp(il,i-1)=amax1(rp(il,i-1),0.0) - afac1=p(il,i)*(rs(il,i)-rp(il,i))/(1.0e4+2000.0*p(il,i)*rs(il,i)) - afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1)) & - /(1.0e4+2000.0*p(il,i-1)*rs(il,i-1)) - afac=0.5*(afac1+afac2) - endif - if(i.eq.inb(il))afac=0.0 - afac=amax1(afac,0.0) - bfac=1./(sigd*wt(il,i)) -! -!jyg1 -!cc sigt=1.0 -!cc if(i.ge.icb)sigt=sigp(i) -! prise en compte de la variation progressive de sigt dans -! les couches icb et icb-1: -! pour plclph(i), pr1=1 & pr2=0 -! pour ph(i+1)ph(i), pr1=1 & pr2=0 + ! pour ph(i+1)