Ignore:
Timestamp:
Mar 4, 2004, 4:11:16 PM (20 years ago)
Author:
lmdzadmin
Message:

Optimisation de differentes routines, IM, MAF, FH
LF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ.3.3/branches/rel-LF/libf/phylmd/clouds_gno.F

    r418 r495  
    4848      REAL xx(klon), aux(klon), coeff(klon), block(klon)
    4949      REAL  dist(klon), fprime(klon), det(klon)
    50       REAL pi, u(klon), v(klon), erfu(klon), erfv(klon)
     50      REAL pi, u(klon), v(klon), erfcu(klon), erfcv(klon)
    5151      REAL  xx1(klon), xx2(klon)
    5252      real erf,kkk
     53      real sqrtpi,sqrt2,zx1,zx2,exdel
    5354c lconv = true si le calcul a converge (entre autre si qsub < min_q)
    5455       LOGICAL lconv(klon)
     
    5657
    5758      pi = ACOS(-1.)
     59      sqrtpi=sqrt(pi)
     60      sqrt2=sqrt(2.)
    5861
    5962      ptconv=.false.
     
    123126          xx(i) = -0.0001
    124127        else
    125          xx1(i)=-SQRT(2.)*vmax(i)*(1.0-SQRT(1.0+delta(i)/(vmax(i)**2.)))
    126          xx2(i)=-SQRT(2.)*vmax(i)*(1.0+SQRT(1.0+delta(i)/(vmax(i)**2.)))
     128         zx1=-sqrt2*vmax(i)
     129         zx2=SQRT(1.0+delta(i)/(vmax(i)**2.))
     130         xx1(i)=zx1*(1.0-zx2)
     131         xx2(i)=zx1*(1.0+zx2)
    127132         xx(i) = 1.01 * xx1(i)
    128133         if ( xx1(i) .GE. 0.0 ) xx(i) = 0.5*xx2(i)
     
    143148        if (.not.lconv(i)) then
    144149
    145           u(i) = delta(i)/(xx(i)*sqrt(2.)) + xx(i)/(2.*sqrt(2.))
    146           v(i) = delta(i)/(xx(i)*sqrt(2.)) - xx(i)/(2.*sqrt(2.))
     150          u(i) = delta(i)/(xx(i)*sqrt2) + xx(i)/(2.*sqrt2)
     151          v(i) = delta(i)/(xx(i)*sqrt2) - xx(i)/(2.*sqrt2)
    147152
    148153          IF ( v(i) .GT. vmax(i) ) THEN
     
    153158c -- use asymptotic expression of erf for u and v large:
    154159c ( -> analytic solution for xx )
    155 
    156              aux(i) = 2.0*delta(i)*(1.-beta(i)*EXP(delta(i)))
    157      :                       /(1.+beta(i)*EXP(delta(i)))
     160             exdel=beta(i)*EXP(delta(i))
     161             aux(i) = 2.0*delta(i)*(1.-exdel)
     162     :                       /(1.+exdel)
    158163             if (aux(i).lt.0.) then
    159                 print*,'AUX(',i,',',k,')<0',aux(i),delta(i),beta(i)
     164c                print*,'AUX(',i,',',k,')<0',aux(i),delta(i),beta(i)
    160165                aux(i)=0.
    161166             endif
    162167             xx(i) = -SQRT(aux(i))
    163              block(i) = EXP(-v(i)*v(i)) / v(i) / SQRT(pi)
     168             block(i) = EXP(-v(i)*v(i)) / v(i) / sqrtpi
    164169             dist(i) = 0.0
    165170             fprime(i) = 1.0
     
    169174c -- erfv -> 1.0, use an asymptotic expression of erfv for v large:
    170175
    171              erfu(i) = ERF(u(i))
     176             erfcu(i) = 1.0-ERF(u(i))
    172177c  !!! ATTENTION : rajout d'un seuil pour l'exponentiel
    173              aux(i) = SQRT(pi)*(1.0-erfu(i))*EXP(min(v(i)*v(i),100.))
     178             aux(i) = sqrtpi*erfcu(i)*EXP(min(v(i)*v(i),100.))
    174179             coeff(i) = 1.0 - 1./2./(v(i)**2.) + 3./4./(v(i)**4.)
    175              block(i) = coeff(i) * EXP(-v(i)*v(i)) / v(i) / SQRT(pi)
     180             block(i) = coeff(i) * EXP(-v(i)*v(i)) / v(i) / sqrtpi
    176181             dist(i) = v(i) * aux(i) / coeff(i) - beta(i)
    177182             fprime(i) = 2.0 / xx(i) * (v(i)**2.)
     
    185190c -- general case:
    186191
    187            erfu(i) = ERF(u(i))
    188            erfv(i) = ERF(v(i))
    189            block(i) = 1.0-erfv(i)
    190            dist(i) = (1.0 - erfu(i)) / (1.0 - erfv(i)) - beta(i)
     192           erfcu(i) = 1.0-ERF(u(i))
     193           erfcv(i) = 1.0-ERF(v(i))
     194           block(i) = erfcv(i)
     195           dist(i) = erfcu(i) / erfcv(i) - beta(i)
    191196           zu2(i)=u(i)*u(i)
    192197           zv2(i)=v(i)*v(i)
    193198           if(zu2(i).gt.20..or. zv2(i).gt.20.) then
    194               print*,'ATTENTION !!! xx(',i,') =', xx(i)
    195            print*,'ATTENTION !!! klon,ND,R,RS,QSUB,PTCONV,RATQSC,CLDF',
    196      .klon,ND,R(i,k),RS(i,k),QSUB(i,k),PTCONV(i,k),RATQSC(i,k),
    197      .CLDF(i,k)
    198               print*,'ATTENTION !!! zu2 zv2 =',zu2(i),zv2(i)
     199c              print*,'ATTENTION !!! xx(',i,') =', xx(i)
     200c           print*,'ATTENTION !!! klon,ND,R,RS,QSUB,PTCONV,RATQSC,CLDF',
     201c     .klon,ND,R(i,k),RS(i,k),QSUB(i,k),PTCONV(i,k),RATQSC(i,k),
     202c     .CLDF(i,k)
     203c              print*,'ATTENTION !!! zu2 zv2 =',zu2(i),zv2(i)
    199204              zu2(i)=20.
    200205              zv2(i)=20.
    201206             fprime(i) = 0.
    202207           else
    203              fprime(i) = 2. /SQRT(pi) /xx(i) /(1.0-erfv(i))**2.
    204      :           * (   (1.0-erfv(i))*v(i)*EXP(-zu2(i))
    205      :               - (1.0-erfu(i))*u(i)*EXP(-zv2(i)) )
     208             fprime(i) = 2. /sqrtpi /xx(i) /erfcv(i)**2.
     209     :           * (   erfcv(i)*v(i)*EXP(-zu2(i))
     210     :               - erfcu(i)*u(i)*EXP(-zv2(i)) )
    206211           endif
    207212          ENDIF ! x
     
    219224            ratqsc(i,k)=sqrt(exp(ratqsc(i,k))-1.)
    220225            CLDF(i,K) = 0.5 * block(i)
    221 cccccccccccccccccccccccc
    222 c           kkk=-sqrt(log(1.+ratqsc(i,k)**2))
    223 c           u(i)=delta(i)/(kkk*sqrt(2.))-kkk/(2.*sqrt(2.))
    224 c           v(i)=delta(i)/(kkk*sqrt(2.))+kkk/(2.*sqrt(2.))
    225 c           erfu(i)=erf(u(i))
    226 c           erfv(i)=erf(v(i))
    227 c           print*,'SIG ',k,qsub(i,k)
    228 c    s      ,mu(i)*((1.-erfv(i))/(1.-erfu(i))-qsat(i)/mu(i))
    229 c    s      ,0.5*erfu(i)
    230 cccccccccccccccccccccccc
    231226          else
    232227            xx(i) = xx(i) - dist(i)/fprime(i)
Note: See TracChangeset for help on using the changeset viewer.