Changeset 3700 for trunk/LMDZ.TITAN


Ignore:
Timestamp:
Mar 28, 2025, 4:17:11 PM (3 months ago)
Author:
emoisan
Message:

Titan:

  • Add safeguards not to enter microphisics when there are no clouds
  • Removed a comment

EMo

Location:
trunk/LMDZ.TITAN/libf
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/LMDZ.TITAN/libf/muphytitan/mm_haze.F90

    r3699 r3700  
    792792      call EXIT(11)
    793793#endif
    794 #ifdef MESOSCALE
    795       WRITE(*,*) "Aerosol production level out of model, no production of simple aerosols"
    796 #endif
    797794    ENDIF
    798795
  • TabularUnified trunk/LMDZ.TITAN/libf/phytitan/get_haze_and_cloud_opacity.F90

    r3090 r3700  
    200200  !-------------------------
    201201
    202   rinit = 1.e-9                ! fin = rinit*step**(33-1) = 1.e-5
    203   if(CTYPE.eq.0) rinit = 1.e-7 ! fin = rinit*step**(33-1) = 1.e-3
    204 
    205   ! No alpha(k) !
    206   ! Because it is taken into account in the optical tables ...
    207   rc = (m3/m0)**(1./3.)
    208  
    209   step = 10.**(1./8.)
    210   idx = int(log(rc/rinit) / log(step)) + 1
    211 
    212   ! Spherical (cloud) :
    213   !--------------------
    214   IF(CTYPE.EQ.0) THEN
    215 
    216     if(abs(rc_s(1)-rinit)/rc_s(1).gt.1.e-5 .or. &
    217        abs(rc_s(nrad)-rinit*step**32)/rc_s(nrad).gt.1.e-5) then
    218         write(*,*) 'rinit          = ',rinit
    219         write(*,*) 'rc_s(1)        = ',rc_s(1)
    220         write(*,*) 'rinit*step**32 = ',rinit*step**32
    221         write(*,*) 'rc_s(nrad)     = ',rc_s(nrad)
    222         stop
    223     endif
    224 
    225     if(rc.le.rc_s(1)) then
    226       wbar   = wbar_s(ich,1)
    227       gbar   = gbar_s(ich,1)
    228       tauext = sext_s(ich,1)*(rc/rc_s(1))**3
    229     endif
    230 
    231     if(rc.ge.rc_s(nrad)) then
    232       wbar   = wbar_s(ich,nrad)
    233       gbar   = gbar_s(ich,nrad)
    234       tauext = sext_s(ich,nrad)*(rc/rc_s(nrad))**3.
    235     endif
    236 
    237     if(rc.gt.rc_s(1) .and. rc.lt.rc_s(nrad)) then
    238       xfact  = (log(rc)-log(rc_s(idx))) / (log(rc_s(idx+1))-log(rc_s(idx)))
    239       tauext = log(sext_s(ich,idx))*(1.-xfact) + log(sext_s(ich,idx+1))*xfact
    240       tauext = exp(tauext)
    241       wbar   = wbar_s(ich,idx)*(1.-xfact) + wbar_s(ich,idx+1)*xfact
    242       gbar   = gbar_s(ich,idx)*(1.-xfact) + gbar_s(ich,idx+1)*xfact
    243     endif
    244 
    245   ENDIF ! (CTYPE.EQ.0)
    246 
    247   ! Spherical (haze) :
    248   !-------------------
    249   IF(CTYPE.EQ.5) THEN
    250 
    251     if(abs(rc_as(1)-rinit)/rc_as(1).gt.1.e-5 .or. &
    252        abs(rc_as(nrad)-rinit*step**32)/rc_as(nrad).gt.1.e-5) then
    253         write(*,*) 'rinit          = ',rinit
    254         write(*,*) 'rc_as(1)       = ',rc_as(1)
    255         write(*,*) 'rinit*step**32 = ',rinit*step**32
    256         write(*,*) 'rc_as(nrad)    = ',rc_as(nrad)
    257         stop
    258     endif
    259 
    260     if(rc.le.rc_as(1)) then
    261       wbar   = wbar_as(ich,1)
    262       gbar   = gbar_as(ich,1)
    263       tauext = sext_as(ich,1)*(rc/rc_as(1))**3
    264     endif
    265 
    266     if(rc.ge.rc_as(nrad)) then
    267       wbar   = wbar_as(ich,nrad)
    268       gbar   = gbar_as(ich,nrad)
    269       tauext = sext_as(ich,nrad)*(rc/rc_as(nrad))**3.
    270     endif
    271 
    272     if(rc.gt.rc_as(1) .and. rc.lt.rc_as(nrad)) then
    273       xfact  = (log(rc)-log(rc_as(idx))) / (log(rc_as(idx+1))-log(rc_as(idx)))
    274       tauext = log(sext_as(ich,idx))*(1.-xfact) + log(sext_as(ich,idx+1))*xfact
    275       tauext = exp(tauext)
    276       wbar   = wbar_as(ich,idx)*(1.-xfact) + wbar_as(ich,idx+1)*xfact
    277       gbar   = gbar_as(ich,idx)*(1.-xfact) + gbar_as(ich,idx+1)*xfact
    278     endif
    279  
    280   ENDIF ! (CTYPE.EQ.5)
    281 
    282   ! Fractal (haze) :
    283   !-----------------
    284   IF(CTYPE.NE.0 .AND. CTYPE.NE.5) THEN
    285 
    286     if(abs(rc_f(1)-rinit)/rc_f(1).gt.1.e-5 .or. &
    287        abs(rc_f(nrad)-rinit*step**32)/rc_f(nrad).gt.1.e-5) then
    288         write(*,*) 'rinit          = ',rinit
    289         write(*,*) 'rc_f(1)        = ',rc_f(1)
    290         write(*,*) 'rinit*step**32 = ',rinit*step**32
    291         write(*,*) 'rc_f(nrad)     = ',rc_f(nrad)
    292         stop
    293     endif
    294 
    295     if(rc.le.rc_f(1)) then
    296       wbar   =  wbar_f(ich,1)
    297       gbar   =  gbar_f(ich,1)
    298       tauext = sext_f(ich,1)*(rc/rc_f(1))**3
    299     endif
    300 
    301     if(rc.ge.rc_f(nrad)) then
    302       wbar   = wbar_f(ich,nrad)
    303       gbar   = gbar_f(ich,nrad)
    304       tauext = sext_f(ich,nrad)*(rc/rc_f(nrad))**3.
    305     endif
    306    
    307     if(rc.gt.rc_f(1) .and. rc.lt.rc_f(nrad)) then
    308       xfact  = (log(rc)-log(rc_f(idx))) / (log(rc_f(idx+1))-log(rc_f(idx)))
    309       tauext = log(sext_f(ich,idx))*(1.-xfact) + log(sext_f(ich,idx+1))*xfact
    310       tauext = exp(tauext)
    311       wbar   = wbar_f(ich,idx)*(1.-xfact) + wbar_f(ich,idx+1)*xfact
    312       gbar   = gbar_f(ich,idx)*(1.-xfact) + gbar_f(ich,idx+1)*xfact
    313     endif
    314 
    315   ENDIF ! (CTYPE.NE.0 .AND. CTYPE.NE.5)
    316 
    317   ! Sanity check :
    318   !---------------
    319   IF (CTYPE.LT.0 .AND. CTYPE.GT.5) THEN
    320     write(*,*) 'CTYPE < 0 ET > 5  = ',CTYPE
    321     call abort
    322   ENDIF
    323 
    324   tauext = tauext * m0
     202  IF((m0 .gt. tiny(m0)) .and. (m3 .gt.tiny(m3))) THEN  ! if there are clouds !emoisan tests
     203      rinit = 1.e-9                ! fin = rinit*step**(33-1) = 1.e-5
     204      if(CTYPE.eq.0) rinit = 1.e-7 ! fin = rinit*step**(33-1) = 1.e-3
     205   
     206      ! No alpha(k) !
     207      ! Because it is taken into account in the optical tables ...
     208      rc = (m3/m0)**(1./3.)
     209     
     210      step = 10.**(1./8.)
     211      idx = int(log(rc/rinit) / log(step)) + 1
     212   
     213      ! Spherical (cloud) :
     214      !--------------------
     215      IF(CTYPE.EQ.0) THEN
     216   
     217        if(abs(rc_s(1)-rinit)/rc_s(1).gt.1.e-5 .or. &
     218           abs(rc_s(nrad)-rinit*step**32)/rc_s(nrad).gt.1.e-5) then
     219            write(*,*) 'rinit          = ',rinit
     220            write(*,*) 'rc_s(1)        = ',rc_s(1)
     221            write(*,*) 'rinit*step**32 = ',rinit*step**32
     222            write(*,*) 'rc_s(nrad)     = ',rc_s(nrad)
     223            stop
     224        endif
     225   
     226        if(rc.le.rc_s(1)) then
     227          wbar   = wbar_s(ich,1)
     228          gbar   = gbar_s(ich,1)
     229          tauext = sext_s(ich,1)*(rc/rc_s(1))**3
     230        endif
     231   
     232        if(rc.ge.rc_s(nrad)) then
     233          wbar   = wbar_s(ich,nrad)
     234          gbar   = gbar_s(ich,nrad)
     235          tauext = sext_s(ich,nrad)*(rc/rc_s(nrad))**3.
     236        endif
     237   
     238        if(rc.gt.rc_s(1) .and. rc.lt.rc_s(nrad)) then
     239          xfact  = (log(rc)-log(rc_s(idx))) / (log(rc_s(idx+1))-log(rc_s(idx)))
     240          tauext = log(sext_s(ich,idx))*(1.-xfact) + log(sext_s(ich,idx+1))*xfact
     241          tauext = exp(tauext)
     242          wbar   = wbar_s(ich,idx)*(1.-xfact) + wbar_s(ich,idx+1)*xfact
     243          gbar   = gbar_s(ich,idx)*(1.-xfact) + gbar_s(ich,idx+1)*xfact
     244        endif
     245   
     246      ENDIF ! (CTYPE.EQ.0)
     247   
     248      ! Spherical (haze) :
     249      !-------------------
     250      IF(CTYPE.EQ.5) THEN
     251   
     252        if(abs(rc_as(1)-rinit)/rc_as(1).gt.1.e-5 .or. &
     253           abs(rc_as(nrad)-rinit*step**32)/rc_as(nrad).gt.1.e-5) then
     254            write(*,*) 'rinit          = ',rinit
     255            write(*,*) 'rc_as(1)       = ',rc_as(1)
     256            write(*,*) 'rinit*step**32 = ',rinit*step**32
     257            write(*,*) 'rc_as(nrad)    = ',rc_as(nrad)
     258            stop
     259        endif
     260   
     261        if(rc.le.rc_as(1)) then
     262          wbar   = wbar_as(ich,1)
     263          gbar   = gbar_as(ich,1)
     264          tauext = sext_as(ich,1)*(rc/rc_as(1))**3
     265        endif
     266   
     267        if(rc.ge.rc_as(nrad)) then
     268          wbar   = wbar_as(ich,nrad)
     269          gbar   = gbar_as(ich,nrad)
     270          tauext = sext_as(ich,nrad)*(rc/rc_as(nrad))**3.
     271        endif
     272   
     273        if(rc.gt.rc_as(1) .and. rc.lt.rc_as(nrad)) then
     274          xfact  = (log(rc)-log(rc_as(idx))) / (log(rc_as(idx+1))-log(rc_as(idx)))
     275          tauext = log(sext_as(ich,idx))*(1.-xfact) + log(sext_as(ich,idx+1))*xfact
     276          tauext = exp(tauext)
     277          wbar   = wbar_as(ich,idx)*(1.-xfact) + wbar_as(ich,idx+1)*xfact
     278          gbar   = gbar_as(ich,idx)*(1.-xfact) + gbar_as(ich,idx+1)*xfact
     279        endif
     280     
     281      ENDIF ! (CTYPE.EQ.5)
     282   
     283      ! Fractal (haze) :
     284      !-----------------
     285      IF(CTYPE.NE.0 .AND. CTYPE.NE.5) THEN
     286   
     287        if(abs(rc_f(1)-rinit)/rc_f(1).gt.1.e-5 .or. &
     288           abs(rc_f(nrad)-rinit*step**32)/rc_f(nrad).gt.1.e-5) then
     289            write(*,*) 'rinit          = ',rinit
     290            write(*,*) 'rc_f(1)        = ',rc_f(1)
     291            write(*,*) 'rinit*step**32 = ',rinit*step**32
     292            write(*,*) 'rc_f(nrad)     = ',rc_f(nrad)
     293            stop
     294        endif
     295   
     296        if(rc.le.rc_f(1)) then
     297          wbar   =  wbar_f(ich,1)
     298          gbar   =  gbar_f(ich,1)
     299          tauext = sext_f(ich,1)*(rc/rc_f(1))**3
     300        endif
     301   
     302        if(rc.ge.rc_f(nrad)) then
     303          wbar   = wbar_f(ich,nrad)
     304          gbar   = gbar_f(ich,nrad)
     305          tauext = sext_f(ich,nrad)*(rc/rc_f(nrad))**3.
     306        endif
     307       
     308        if(rc.gt.rc_f(1) .and. rc.lt.rc_f(nrad)) then
     309          xfact  = (log(rc)-log(rc_f(idx))) / (log(rc_f(idx+1))-log(rc_f(idx)))
     310          tauext = log(sext_f(ich,idx))*(1.-xfact) + log(sext_f(ich,idx+1))*xfact
     311          tauext = exp(tauext)
     312          wbar   = wbar_f(ich,idx)*(1.-xfact) + wbar_f(ich,idx+1)*xfact
     313          gbar   = gbar_f(ich,idx)*(1.-xfact) + gbar_f(ich,idx+1)*xfact
     314        endif
     315   
     316      ENDIF ! (CTYPE.NE.0 .AND. CTYPE.NE.5)
     317   
     318      ! Sanity check :
     319      !---------------
     320      IF (CTYPE.LT.0 .AND. CTYPE.GT.5) THEN
     321        write(*,*) 'CTYPE < 0 ET > 5  = ',CTYPE
     322        call abort
     323      ENDIF
     324   
     325      tauext = tauext * m0
     326  ENDIF !if there are clouds !emoisan tests
     327  !else just return the initialize values of tauext, wbar and gbar =0
    325328
    326329  return
  • TabularUnified trunk/LMDZ.TITAN/libf/phytitan/optci.F90

    r3660 r3700  
    313313               
    314314               ! For small dropplets, opacity of nucleus dominates...
    315                dtau_cld = (dtau_cld*m3ccn + dtau_cld*m3cld) / (m3ccn + m3cld)
    316                ssa_cld(nw) = (ssa_ccn(nw)*m3ccn + ssa_cld(nw)*m3cld) / (m3ccn + m3cld)
     315               IF ((m3ccn + m3cld) .le. tiny(m3ccn)) THEN !no cloud !emoisan tests
     316                  dtau_cld = 0.
     317                  ssa_cld(nw) = 0.
     318               ELSE
     319                  dtau_cld = (dtau_cld*m3ccn + dtau_cld*m3cld) / (m3ccn + m3cld)
     320                  ssa_cld(nw) = (ssa_ccn(nw)*m3ccn + ssa_cld(nw)*m3cld) / (m3ccn + m3cld)
     321               ENDIF
    317322               
    318323               ! Tuning of optical properties for clouds :
  • TabularUnified trunk/LMDZ.TITAN/libf/phytitan/optcv.F90

    r3497 r3700  
    337337
    338338               ! For small dropplets, opacity of nucleus dominates
    339                dtau_cld = (dtau_cld*m3ccn + dtau_cld*m3cld) / (m3ccn + m3cld)
    340                ssa_cld(nw) = (ssa_ccn(nw)*m3ccn + ssa_cld(nw)*m3cld) / (m3ccn + m3cld)
     339               IF ((m3ccn + m3cld) .le. tiny(m3ccn)) THEN !no cloud !emoisan tests
     340                  dtau_cld = 0.
     341                  ssa_cld(nw) = 0.
     342               ELSE
     343                  dtau_cld = (dtau_cld*m3ccn + dtau_cld*m3cld) / (m3ccn + m3cld)
     344                  ssa_cld(nw) = (ssa_ccn(nw)*m3ccn + ssa_cld(nw)*m3cld) / (m3ccn + m3cld)
     345               ENDIF
    341346
    342347               ! Tuning of optical properties for clouds :
Note: See TracChangeset for help on using the changeset viewer.