Changeset 1685


Ignore:
Timestamp:
Apr 3, 2017, 11:08:39 AM (8 years ago)
Author:
jaudouard
Message:

Further modifications on CO2 clouds scheme. Water ice clouds can now serve as CCN for CO2 clouds

Location:
trunk/LMDZ.MARS
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/README

    r1684 r1685  
    24272427solvarmod==0.
    24282428Guidelines for min/ave/max EUV input:  fixed_euv_value=80/140/320.
     2429
     2430
     2431== 03/04/2017 == JA
     2432further work on the CO2 clouds scheme:
     2433-water ice clouds can now serve as condensation nucleii for CO2 clouds. Memory of CO2 CCN origin is kept, but a study of the water cycle is needed to know ig further work is necessary.
     2434-co2cloud.F, improvedCO2clouds.F, nucleaCO2.F, massflowrateCO2.F and physiq_mod.F have been modified accordingly.
     2435-co2 cloud scheme tuning has been improved for more stability.
     2436-a new contact parameter for CO2 ice on silicate is used (mtetaco2=0.78) in microphys.h. Reference in microphysic.h
     2437-CO2 ice temperature is computed as a function of temperature in CO2cloud.F and improvedCO2cloud.F. Reference is in initracer.F
  • trunk/LMDZ.MARS/libf/phymars/co2cloud.F

    r1655 r1685  
    1        SUBROUTINE co2cloud(ngrid,nlay,ptimestep,
     1      SUBROUTINE co2cloud(ngrid,nlay,ptimestep,
    22     &                pplev,pplay,pdpsrf,pzlay,pt,pdt,
    33     &                pq,pdq,pdqcloudco2,pdtcloudco2,
    44     &                nq,tau,tauscaling,rdust,rice,riceco2,nuice,
    5      &                rsedcloudco2,rhocloudco2,zlev,pdqs_sedco2)
     5     &                rsedcloudco2,rhocloudco2,
     6     &                rsedcloud,rhocloud,zlev,pdqs_sedco2)
    67! to use  'getin'
    78      use dimradmars_mod, only: naerkind
     
    1112      use conc_mod, only: mmean
    1213      use tracer_mod, only: nqmx, igcm_co2, igcm_co2_ice,
    13      &     igcm_dust_mass, igcm_dust_number,
     14     &     igcm_dust_mass, igcm_dust_number,igcm_h2o_ice,
     15     &     igcm_ccn_mass,igcm_ccn_number,
    1416     &     igcm_ccnco2_mass, igcm_ccnco2_number,
    1517     &     rho_dust, nuiceco2_sed, nuiceco2_ref,
    16      &     rho_ice_co2,r3n_q,
     18     &     rho_ice_co2,r3n_q,rho_ice,nuice_sed,
    1719     &     meteo_flux_mass,meteo_flux_number,
    1820     &     meteo_alt
     
    7375      real rice(ngrid,nlay)    ! Water Ice mass mean radius (m)
    7476                                ! used for nucleation of CO2 on ice-coated ccns
    75 
     77      DOUBLE PRECISION rho_ice_co2T(ngrid,nlay)
    7678      REAL tau(ngrid,naerkind) ! Column dust optical depth at each point
    7779      REAL tauscaling(ngrid)   ! Convertion factor for dust amount
     
    9597c   local:
    9698c   ------
    97      
     99      !water
     100      real rsedcloud(ngrid,nlay) ! Cloud sedimentation radius
     101      real rhocloud(ngrid,nlay)  ! Cloud density (kg.m-3)
    98102      ! for ice radius computation
    99103      REAL Mo,No
     
    127131      real epaisseur (ngrid,nlay) ! Layer thickness (m)
    128132      real masse (ngrid,nlay) ! Layer mass (kg.m-2)
    129    
    130133      double precision diff,diff0
    131134      integer meteo_lvl
     
    134137      real sav_trac(ngrid,nlay,nq)
    135138      real pdqsed(ngrid,nlay,nq)
     139
     140      DOUBLE PRECISION,allocatable,save :: memdMMccn(:,:)
     141      DOUBLE PRECISION,allocatable,save :: memdMMh2o(:,:)
     142      DOUBLE PRECISION,allocatable,save :: memdNNccn(:,:)
    136143c     ** un petit test de coherence
    137144c       --------------------------
     
    144151           stop
    145152        endif
    146          
     153        write(*,*) "co2cloud.F: rho_ice_co2 = ",rho_ice_co2
     154
    147155        write(*,*) "co2cloud: igcm_co2=",igcm_co2
    148156        write(*,*) "            igcm_co2_ice=",igcm_co2_ice
     
    161169        write(*,*)"CO2 Microphysics timestep is",microtimestep
    162170     
    163              
     171       
     172        if (meteo_flux_number .ne. 0) then
     173
    164174        write(*,*) "Warning ! Meteoritic flux of dust is turned on"
    165175        write(*,*) "Dust mass = ",meteo_flux_mass
     
    167177        write(*,*) "Are added at the z-level (km)",meteo_alt
    168178        write(*,*) "Every timestep in co2cloud.F"
    169      
     179         endif
     180        if (.not. allocated(memdMMccn)) allocate(memdMMccn(ngrid,nlay))
     181        if (.not. allocated(memdNNccn)) allocate(memdNNccn(ngrid,nlay))
     182        if (.not. allocated(memdMMh2o)) allocate(memdMMh2o(ngrid,nlay))
     183       
     184        memdMMccn(:,:)=0.
     185        memdMMh2o(:,:)=0.
     186        memdNNccn(:,:)=0.
    170187        firstcall=.false.
    171188      ENDIF                     ! of IF (firstcall)
     
    173190c-----Initialization
    174191
     192      beta=0.85
     193      subpdq(1:ngrid,1:nlay,1:nq) = 0
     194      subpdt(1:ngrid,1:nlay)      = 0
     195      subpdqcloudco2(1:ngrid,1:nlay,1:nq) = 0
     196      subpdtcloudco2(1:ngrid,1:nlay)      = 0
     197
    175198c add meteoritic flux of dust
    176199    !convert meteo_alt (in km) to z-level
    177200        !pzlay altitudes of the layers
    178    
     201      if (meteo_flux_number .ne. 0) then
    179202      do ig=1, ngrid
    180203         diff0=1000
     
    188211         enddo
    189212c         write(*,*) "meteo_lvl=",meteo_lvl
    190          pq(ig,meteo_lvl,igcm_dust_mass)=pq(ig,meteo_lvl,igcm_dust_mass)
    191      &        +dble(meteo_flux_mass)
    192          pq(ig,meteo_lvl,igcm_dust_number)=
    193      &        pq(ig,meteo_lvl,igcm_dust_number)
    194      &        +dble(meteo_flux_number)
     213         pdq(ig,meteo_lvl,igcm_dust_mass)=
     214     &        pdq(ig,meteo_lvl,igcm_dust_mass)
     215     &        +dble(meteo_flux_mass)/tauscaling(ig)
     216         pdq(ig,meteo_lvl,igcm_dust_number)=
     217     &        pdq(ig,meteo_lvl,igcm_dust_number)
     218     &        +dble(meteo_flux_number)/tauscaling(ig)
    195219      enddo
    196 
    197        call WRITEDIAGFI(ngrid,"pzlay","altitude","km",3,
    198      &        pzlay)
    199       beta=0.85
    200       subpdq(1:ngrid,1:nlay,1:nq) = 0
    201       subpdt(1:ngrid,1:nlay)      = 0
    202       subpdqcloudco2(1:ngrid,1:nlay,1:nq) = 0
    203       subpdtcloudco2(1:ngrid,1:nlay)      = 0
     220      endif
     221c       call WRITEDIAGFI(ngrid,"pzlay","altitude","km",3,
     222c     &        pzlay)
    204223     
    205224
     
    220239          masse(ig,l)=(pplev(ig,l) - pplev(ig,l+1)) /g
    221240          epaisseur(ig,l)= zlev(ig,l+1) - zlev(ig,l)
    222        
    223241       enddo
    224242      enddo
    225            
    226      
    227    
    228 
    229            
    230243
    231244
     
    274287     &            subpdq(ig,l,igcm_co2_ice)
    275288     &            + pdq(ig,l,igcm_co2_ice)
     289
    276290             subpdq(ig,l,igcm_co2) =
    277291     &            subpdq(ig,l,igcm_co2)
    278292     &            + pdq(ig,l,igcm_co2)
     293             
     294             subpdq(ig,l,igcm_h2o_ice) =
     295     &            subpdq(ig,l,igcm_h2o_ice)
     296     &            + pdq(ig,l,igcm_h2o_ice)
     297
     298             subpdq(ig,l,igcm_ccn_mass) =
     299     &            subpdq(ig,l,igcm_ccn_mass)
     300     &            + pdq(ig,l,igcm_ccn_mass)
     301             
     302             subpdq(ig,l,igcm_ccn_number) =
     303     &            subpdq(ig,l,igcm_ccn_number)
     304     &            + pdq(ig,l,igcm_ccn_number)
    279305
    280306             tempo_traceur_t(ig,l)= pt(ig,l)+subpdt(ig,l)*microtimestep
     
    289315       DO l=1, nlay
    290316          DO ig=1,ngrid
     317             
     318             rho_ice_co2T(ig,l)=1000.*(1.72391-2.53e-4*
     319     &            tempo_traceur_t(ig,l)-2.87e-6*
     320     &            tempo_traceur_t(ig,l)*tempo_traceur_t(ig,l))
     321           
     322              rho_ice_co2=rho_ice_co2T(ig,l)
    291323             Niceco2=max(tempo_traceurs(ig,l,igcm_co2_ice),1.e-30)
    292324             Nccnco2=max(tempo_traceurs(ig,l,igcm_ccnco2_number),
     
    296328             mdustJA= tempo_traceurs(ig,l,igcm_dust_mass)
    297329             ndustJA=tempo_traceurs(ig,l,igcm_dust_number)
    298              if ((ndustJA .lt. tauscaling(ig)) .or. (mdustJA .lt.
     330             if ((Nccnco2 .lt. tauscaling(ig)) .or. (Qccnco2 .lt.
    299331     &            1.e-30 *tauscaling(ig))) then
    300332                rdust(ig,l)=1.e-10
    301333             else
    302                 rdust(ig,l)=(3./4./pi/2500.*mdustJA/ndustJA)**(1./3.)
    303                 rdust(ig,l)=min(rdust(ig,l),5.e-6)
    304                 rdust(ig,l)=max(rdust(ig,l),1.e-9)    
     334                rdust(ig,l)=(3./4./pi/2500.*Qccnco2/Nccnco2)**(1./3.)
     335                rdust(ig,l)=max(rdust(ig,l),1.e-10)
     336              !  rdust(ig,l)=min(rdust(ig,l),5.e-6)   
    305337             end if
    306 c             rhocloudco2t(ig,l) = (Niceco2 *rho_ice_co2
    307 c     &            + Qccnco2*rho_dust)
    308 c     &            / (Niceco2 + Qccnco2)
    309              riceco2(ig,l)= Niceco2*3.0/
    310      &            (4.0*rho_ice_co2*pi*Nccnco2)
    311      &            +rdust(ig,l)*rdust(ig,l)*rdust(ig,l)
    312              riceco2(ig,l)=riceco2(ig,l)**(1.0/3.0)
     338             rhocloudco2t(ig,l) = (Niceco2 *rho_ice_co2
     339     &            + Qccnco2*tauscaling(ig)*rho_dust)
     340     &            / (Niceco2 + Qccnco2*tauscaling(ig))
     341c             riceco2(ig,l)= Niceco2*3.0/
     342c     &            (4.0*rho_ice_co2*pi*Nccnco2)
     343c     &            +rdust(ig,l)*rdust(ig,l)*rdust(ig,l)
     344c             riceco2(ig,l)=riceco2(ig,l)**(1.0/3.0)
    313345c             write(*,*) "in co2clouds, rice = ",riceco2(ig,l)
    314346c             write(*,*) "in co2clouds, rho = ",rhocloudco2t(ig,l)
    315347
    316              call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
    317      &            tauscaling(ig),riceco2(ig,l),rhocloudco2t(ig,l))
     348             riceco2(ig,l)=(Niceco2*3.0/
     349     &            (4.0*rho_ice_co2*pi*Nccnco2
     350     &            *tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
     351     &            *rdust(ig,l))**(1.0/3.0)
     352
     353             riceco2(ig,l)=max(1.e-10,riceco2(ig,l))
     354             !riceco2(ig,l)=min(5.e-5,riceco2(ig,l))
     355
     356c             call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
     357c     &            tauscaling(ig),riceco2(ig,l),rhocloudco2t(ig,l))
    318358c              write(*,*) "in co2clouds, rice update = ",riceco2(ig,l)
    319359c              write(*,*) "in co2clouds, rho update = "
     
    323363     &            (1.+nuiceco2_sed)*(1.+nuiceco2_sed)*(1.+nuiceco2_sed),
    324364     &            rdust(ig,l))
    325              rsedcloudco2(ig,l)=min(rsedcloudco2(ig,l),5.e-4)
     365             rsedcloudco2(ig,l)=min(rsedcloudco2(ig,l),1.e-5)
    326366c             write(*,*) 'Rsedcloud = ',rsedcloudco2(ig,l)
    327367             !write(*,*) 'Rhocloudco2 = ',rhocloudco2t(ig,l)
     
    411451     &             pplay,pt,subpdt,
    412452     &             pq,subpdq,subpdqcloudco2,subpdtcloudco2,
    413      &             nq,tauscaling)
     453     &             nq,tauscaling,memdMMccn,memdMMh2o,memdNNccn)
    414454
    415455        ELSE
    416456
    417457           write(*,*) ' no simpleCO2clouds procedure: STOP' ! listo
    418            STOP
    419 
    420 c           CALL simpleclouds(ngrid,nlay,microtimestep,   ! for water-ice clouds
    421 c     &             pplay,pzlay,pt,subpdt,
    422 c     &             pq,subpdq,subpdqcloud,subpdtcloud,
    423 c     &             nq,tau,riceco2)
     458           write(*,*) ' microphysco2 and co2clouds must be .true.' ! listo
     459                  STOP
     460
    424461        ENDIF
    425462       
     
    458495     &           subpdq(ig,l,igcm_co2)
    459496     &           + subpdqcloudco2(ig,l,igcm_co2)
     497
     498            subpdq(ig,l,igcm_h2o_ice) =
     499     &           subpdq(ig,l,igcm_h2o_ice)
     500     &           + subpdqcloudco2(ig,l,igcm_h2o_ice)
     501
     502               subpdq(ig,l,igcm_ccn_mass) =
     503     &              subpdq(ig,l,igcm_ccn_mass)
     504     &              + subpdqcloudco2(ig,l,igcm_ccn_mass)
     505             
     506               subpdq(ig,l,igcm_ccn_number) =
     507     &              subpdq(ig,l,igcm_ccn_number)
     508     &              + subpdqcloudco2(ig,l,igcm_ccn_number)
    460509         ENDDO
    461510        ENDDO
    462511       
    463        
    464 !ici
    465 !      call WRITEdiagfi(ngrid,"co2cloud000","co2 traceur","kg/kg",1,
    466 !     &      pq(1,:,igcm_co2_ice) + ptimestep*
    467 !     &      ( subpdq(1,:,igcm_co2_ice)))
     512
    468513     
    469514       
     
    492537         DO ig=1,ngrid
    493538             pdtcloudco2(ig,l) =
    494      &         subpdt(ig,l)/imicro-pdt(ig,l)
     539     &         subpdt(ig,l)/real(imicro)-pdt(ig,l)
    495540          ENDDO
    496541       ENDDO
    497        
     542
    498543c------ Tracers tendencies pdqcloud
    499544       DO l=1,nlay
     
    501546         
    502547            pdqcloudco2(ig,l,igcm_co2_ice) =
    503      &        subpdq(ig,l,igcm_co2_ice)/imicro
     548     &        subpdq(ig,l,igcm_co2_ice)/real(imicro)
    504549     &       - pdq(ig,l,igcm_co2_ice)
     550
    505551            pdqcloudco2(ig,l,igcm_co2) =
    506      &        subpdq(ig,l,igcm_co2)/imicro
     552     &        subpdq(ig,l,igcm_co2)/real(imicro)
    507553     &       - pdq(ig,l,igcm_co2)
     554           
     555            pdqcloudco2(ig,l,igcm_h2o_ice) =
     556     &        subpdq(ig,l,igcm_h2o_ice)/real(imicro)
     557     &       - pdq(ig,l,igcm_h2o_ice)
    508558         ENDDO
    509559       ENDDO
     
    515565     
    516566       
    517        IF(microphysco2) THEN
     567c       IF(microphysco2) THEN
    518568        DO l=1,nlay
    519569         DO ig=1,ngrid
    520570            pdqcloudco2(ig,l,igcm_ccnco2_mass) =
    521      &        subpdq(ig,l,igcm_ccnco2_mass)/imicro
     571     &        subpdq(ig,l,igcm_ccnco2_mass)/real(imicro)
    522572     &       - pdq(ig,l,igcm_ccnco2_mass)
    523573            pdqcloudco2(ig,l,igcm_ccnco2_number) =
    524      &        subpdq(ig,l,igcm_ccnco2_number)/imicro
     574     &        subpdq(ig,l,igcm_ccnco2_number)/real(imicro)
    525575     &       - pdq(ig,l,igcm_ccnco2_number)
     576            pdqcloudco2(ig,l,igcm_ccn_mass) =
     577     &        subpdq(ig,l,igcm_ccn_mass)/real(imicro)
     578     &       - pdq(ig,l,igcm_ccn_mass)
     579            pdqcloudco2(ig,l,igcm_ccn_number) =
     580     &        subpdq(ig,l,igcm_ccn_number)/real(imicro)
     581     &       - pdq(ig,l,igcm_ccn_number)
    526582         ENDDO
    527583        ENDDO
    528        ENDIF
     584c       ENDIF
    529585
    530586       
     
    553609     &      ptimestep* (pdq(ig,l,igcm_ccnco2_number) +
    554610     &        pdqcloudco2(ig,l,igcm_ccnco2_number))
    555      &           .lt. 0)
    556      &   .or. (pq(ig,l,igcm_ccnco2_mass) +
     611     &           .lt. 1.e-15)
     612     &           .or. (pq(ig,l,igcm_ccnco2_mass) +
    557613     &      ptimestep* (pdq(ig,l,igcm_ccnco2_mass) +
    558614     &        pdqcloudco2(ig,l,igcm_ccnco2_mass))
    559      &           .lt. 0)) THEN
     615     &           .lt. 1.e-30)) THEN
    560616
    561617         pdqcloudco2(ig,l,igcm_ccnco2_number) =
    562618     &     - pq(ig,l,igcm_ccnco2_number)/ptimestep
    563      &     - pdq(ig,l,igcm_ccnco2_number) +0
     619     &     - pdq(ig,l,igcm_ccnco2_number)+1.e-15
    564620
    565621         pdqcloudco2(ig,l,igcm_dust_number) = 
     
    568624         pdqcloudco2(ig,l,igcm_ccnco2_mass) =
    569625     &     - pq(ig,l,igcm_ccnco2_mass)/ptimestep
    570      &     - pdq(ig,l,igcm_ccnco2_mass)+0
     626     &     - pdq(ig,l,igcm_ccnco2_mass)+1.e-30
    571627
    572628         pdqcloudco2(ig,l,igcm_dust_mass) =
     
    584640                IF ( (pq(ig,l,igcm_dust_number) +
    585641     &               ptimestep* (pdq(ig,l,igcm_dust_number) +
    586      &               pdqcloudco2(ig,l,igcm_dust_number)) .lt. 0.)
     642     &               pdqcloudco2(ig,l,igcm_dust_number)) .le. 1.e-15)
    587643     &               .or. (pq(ig,l,igcm_dust_mass)+
    588644     &               ptimestep* (pdq(ig,l,igcm_dust_mass) +
    589645     &               pdqcloudco2(ig,l,igcm_dust_mass))
    590      &              .lt. 0.)) then
     646     &              .le. 1.e-30)) then
    591647
    592648                   pdqcloudco2(ig,l,igcm_dust_number) =
    593649     &                  - pq(ig,l,igcm_dust_number)/ptimestep
    594      &                  - pdq(ig,l,igcm_dust_number)+0
     650     &                  - pdq(ig,l,igcm_dust_number)+1.e-15
    595651
    596652                   pdqcloudco2(ig,l,igcm_ccnco2_number) = 
     
    599655                   pdqcloudco2(ig,l,igcm_dust_mass) =
    600656     &                  - pq(ig,l,igcm_dust_mass)/ptimestep
    601      &                  - pdq(ig,l,igcm_dust_mass) +0
     657     &                  - pdq(ig,l,igcm_dust_mass) +1.e-30
    602658
    603659                   pdqcloudco2(ig,l,igcm_ccnco2_mass) =
     
    609665
    610666     
    611         DO l=1,nlay
    612          DO ig=1,ngrid
    613           IF (pq(ig,l,igcm_co2_ice) + ptimestep*
    614      &       (pdq(ig,l,igcm_co2_ice) + pdqcloudco2(ig,l,igcm_co2_ice))
    615      &       .lt. 1.e-25) THEN
    616            pdqcloudco2(ig,l,igcm_co2_ice) =
    617      &     - pq(ig,l,igcm_co2_ice)/ptimestep - pdq(ig,l,igcm_co2_ice)
    618      &            +1.e-25
    619            pdqcloudco2(ig,l,igcm_co2) = -pdqcloudco2(ig,l,igcm_co2_ice)
    620           ENDIF
    621          ENDDO
    622         ENDDO
     667c        DO l=1,nlay
     668c         DO ig=1,ngrid
     669c          IF (pq(ig,l,igcm_co2_ice) + ptimestep*
     670c     &       (pdq(ig,l,igcm_co2_ice) + pdqcloudco2(ig,l,igcm_co2_ice))
     671c     &       .lt. 1.e-25) THEN
     672c           pdqcloudco2(ig,l,igcm_co2_ice) =
     673c     &     - pq(ig,l,igcm_co2_ice)/ptimestep - pdq(ig,l,igcm_co2_ice)
     674c           pdqcloudco2(ig,l,igcm_co2) = -pdqcloudco2(ig,l,igcm_co2_ice)
     675c           write(*,*) "WARNING CO2 ICE in co2cloud.F"
     676
     677c          ENDIF   
     678c          IF (pq(ig,l,igcm_co2) + ptimestep*
     679c     &       (pdq(ig,l,igcm_co2) + pdqcloudco2(ig,l,igcm_co2))
     680c     &       .lt. 1.e-10) THEN
     681c           pdqcloudco2(ig,l,igcm_co2) =
     682c     &     - pq(ig,l,igcm_co2)/ptimestep - pdq(ig,l,igcm_co2)
     683c           pdqcloudco2(ig,l,igcm_co2_ice) = -pdqcloudco2(ig,l,igcm_co2)
     684c           write(*,*) "WARNING CO2 in co2cloud.F"
     685c          ENDIF
     686c         ENDDO
     687c        ENDDO
    623688       
    624689
     
    628693c------Only rsedcloudco2 is used for the co2 (cloud) cycle
    629694
    630        IF(scavenging) THEN
    631           DO l=1, nlay
    632              DO ig=1,ngrid
     695c       IF(scavenging) THEN
     696c          DO l=1, nlay
     697c             DO ig=1,ngrid
    633698
    634699c        call updaterdust(
     
    641706c     &    rdust(ig,l))
    642707c         write(*,*) "in co2clouds, rdust(ig,l)= ",rdust(ig,l)
    643                 mdustJA= pq(ig,l,igcm_dust_mass) +             
    644      &               (pdq(ig,l,igcm_dust_mass) +             
    645      &               pdqcloudco2(ig,l,igcm_dust_mass))*ptimestep
    646                 ndustJA=pq(ig,l,igcm_dust_number) +
    647      &               (pdq(ig,l,igcm_dust_number) +
    648      &               pdqcloudco2(ig,l,igcm_dust_number))*ptimestep
    649                if ((ndustJA .lt. tauscaling(ig)) .or. (mdustJA .lt.
    650      &               1.e-30 *tauscaling(ig))) then
    651                    rdust(ig,l)=1.e-10
    652                 else
    653                    rdust(ig,l)=(3./4./pi/2500.*mdustJA/ndustJA)**(1./3.)
    654                    rdust(ig,l)=min(rdust(ig,l),5.e-4)
    655                    rdust(ig,l)=max(rdust(ig,l),1.e-10)
    656                 endif
    657              ENDDO
    658           ENDDO
    659        ENDIF
     708c                mdustJA= pq(ig,l,igcm_dust_mass) +             
     709c     &               (pdq(ig,l,igcm_dust_mass) +             
     710c     &               pdqcloudco2(ig,l,igcm_dust_mass))*ptimestep
     711c                ndustJA=pq(ig,l,igcm_dust_number) +
     712c     &               (pdq(ig,l,igcm_dust_number) +
     713c     &               pdqcloudco2(ig,l,igcm_dust_number))*ptimestep
     714c               if ((ndustJA .lt. tauscaling(ig)) .or. (mdustJA .lt.
     715c     &               1.e-30 *tauscaling(ig))) then
     716c                   rdust(ig,l)=1.e-10
     717c                else
     718c                   rdust(ig,l)=(3./4./pi/2500.*mdustJA/ndustJA)**(1./3.)
     719c                   rdust(ig,l)=min(rdust(ig,l),5.e-6)
     720c                   rdust(ig,l)=max(rdust(ig,l),1.e-10)
     721c                endif
     722c             ENDDO
     723c          ENDDO
     724c       ENDIF
    660725       
    661726       
     
    690755     &       pdqcloudco2(ig,l,igcm_ccnco2_mass))*ptimestep)*
    691756     &       tauscaling(ig),1.e-30)
    692 c        rhocloudco2t(ig,l) = (Niceco2 *rho_ice_co2 + Qccnco2*rho_dust)
    693 c     &       / (Niceco2 + Qccnco2)
    694 c        rhocloudco2(ig,l) = min(max(rhocloudco2t,rho_ice_co2),rho_dust)
    695 
    696 c        write(*,*) "test, nccnco2 =",nccnco22
    697 
    698 
    699         riceco2(ig,l)= Niceco2*3.0/
     757
     758
     759        if ((Nccnco2 .lt. 1) .or. (Qccnco2 .lt.
     760     &       1.e-30)) then
     761           rdust(ig,l)=1.e-10
     762        else
     763       
     764           rdust(ig,l)= Qccnco2
     765     &          *0.75/pi/rho_dust
     766     &          / Nccnco2
     767           rdust(ig,l)= rdust(ig,l)**(1./3.)           
     768           rdust(ig,l)=max(1.e-10,rdust(ig,l))
     769           !rdust(ig,l)=min(5.e-5,rdust(ig,l))
     770        endif
     771     
     772        rho_ice_co2T(ig,l)=1000.*(1.72391-2.53e-4*
     773     &      (pt(ig,l)+(subpdt(ig,l)+pdtcloudco2(ig,l))*ptimestep)
     774     &       -2.87e-6*
     775     &      (pt(ig,l)+(subpdt(ig,l)+pdtcloudco2(ig,l))*ptimestep)*
     776     &      (pt(ig,l)+(subpdt(ig,l)+pdtcloudco2(ig,l))*ptimestep))
     777        rho_ice_co2=rho_ice_co2T(ig,l)
     778
     779        riceco2(ig,l)=(Niceco2*3.0/
    700780     &       (4.0*rho_ice_co2*pi*Nccnco2)
    701      &        +rdust(ig,l)*rdust(ig,l)*rdust(ig,l)
    702 
    703         riceco2(ig,l)=riceco2(ig,l)**(1.0/3.0)
    704 c        write(*,*) "In co2cloud, after loop, riceco2 =",riceco2(ig,l)
    705 c        write(*,*) "In co2cloud, after loop, rhoco2 ="
    706 c     &       ,rhocloudco2t(ig,l)
    707 
    708         call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
    709      &             tauscaling(ig),riceco2(ig,l),rhocloudco2t(ig,l))
    710 
    711 c        write(*,*) "In co2cloud, after loop and update, riceco2 ="
    712 c     &       ,riceco2(ig,l)
    713 c        write(*,*) "In co2cloud, after loop and update, rhoco2 ="
    714 c     &       ,rhocloudco2t(ig,l)
    715 
    716         if ( Niceco2
    717      &       .le. 1.e-23 .or. riceco2(ig,l) .le. 1.e-10 .or.
    718      &       riceco2(ig,l) .ge. 4.999e-4) then ! .or. riceco2(ig,l) .gt. 1.e-4  ) then
     781     &       +rdust(ig,l)*rdust(ig,l)
     782     &       *rdust(ig,l) )**(1.0/3.0)
     783
     784        if ( (Niceco2 .le. 1.e-23) .or.
     785     &       (riceco2(ig,l) .le. rdust(ig,l))
     786     &       .or. (Nccnco2 .le. 0.01))then
     787
     788c        write(*,*) "Riceco2 co2cloud before reset=",riceco2(ig,l)
     789c        write(*,*) "Niceco2 co2cloud before reset=",Niceco2
     790c        write(*,*) "Nccnco2 co2cloud before reset=",Nccnco2
     791c        write(*,*) "Rdust co2cloud before reset=",rdust(ig,l)
     792
     793c$$$           !NO CLOUD : RESET TRACERS AND CONSERVE MASS
     794           if (pq(ig,l,igcm_co2_ice)+(pdq(ig,l,igcm_co2_ice)+
     795     &          pdqcloudco2(ig,l,igcm_co2_ice))*ptimestep .le. 0.) then
     796              pdqcloudco2(ig,l,igcm_co2)=0.
     797              pdqcloudco2(ig,l,igcm_co2_ice)=0.
     798           else
     799              pdqcloudco2(ig,l,igcm_co2)= pq(ig,l,igcm_co2_ice)
     800     &             /ptimestep+pdq(ig,l,igcm_co2_ice)
     801              pdqcloudco2(ig,l,igcm_co2_ice)=-pq(ig,l,igcm_co2_ice)
     802     &             /ptimestep-pdq(ig,l,igcm_co2_ice)
     803           endif
     804!Reverse h2o ccn and ices into h2o tracers
     805           if (memdMMccn(ig,l) .gt. 0) then
     806              pdqcloudco2(ig,l,igcm_ccn_mass)=memdMMccn(ig,l)
     807           else
     808              memdMMccn(ig,l)=0.
     809              pdqcloudco2(ig,l,igcm_ccn_mass)=0.
     810           endif
     811           if (memdNNccn(ig,l) .gt. 0) then
     812              pdqcloudco2(ig,l,igcm_ccn_number)=memdNNccn(ig,l)
     813           else
     814              memdNNccn(ig,l)=0.
     815              pdqcloudco2(ig,l,igcm_ccn_number)=0.
     816           endif
     817           if (memdMMh2o(ig,l) .gt. 0) then
     818              pdqcloudco2(ig,l,igcm_h2o_ice)=memdMMh2o(ig,l)
     819           else
     820              memdMMh2o(ig,l)=0.
     821              pdqcloudco2(ig,l,igcm_h2o_ice)=0.
     822           endif
     823           
     824           if (pq(ig,l,igcm_ccnco2_mass)+(pdq(ig,l,igcm_ccnco2_mass)+
     825     &          pdqcloudco2(ig,l,igcm_ccnco2_mass))*ptimestep
     826     &          .le. 1.e-30) then
     827              pdqcloudco2(ig,l,igcm_ccnco2_mass)=0.
     828              pdqcloudco2(ig,l,igcm_ccnco2_number)=0.
     829              pdqcloudco2(ig,l,igcm_co2)=0.
     830              pdqcloudco2(ig,l,igcm_co2_ice)=0.
     831           else
     832              pdqcloudco2(ig,l,igcm_ccnco2_mass)=
     833     &             -pq(ig,l,igcm_ccnco2_mass)
     834     &             /ptimestep-pdq(ig,l,igcm_ccnco2_mass)
     835           endif
     836           
     837           if (pq(ig,l,igcm_ccnco2_number)+
     838     &          (pdq(ig,l,igcm_ccnco2_number)+
     839     &          pdqcloudco2(ig,l,igcm_ccnco2_number))
     840     &          *ptimestep.le. 1.e-30)
     841     &          then
     842              pdqcloudco2(ig,l,igcm_ccnco2_mass)=0.
     843              pdqcloudco2(ig,l,igcm_ccnco2_number)=0.
     844              pdqcloudco2(ig,l,igcm_co2)=0.
     845              pdqcloudco2(ig,l,igcm_co2_ice)=0.
     846           else
     847              pdqcloudco2(ig,l,igcm_ccnco2_number)=
     848     &             -pq(ig,l,igcm_ccnco2_number)
     849     &             /ptimestep-pdq(ig,l,igcm_ccnco2_number)
     850           endif
     851           
     852           if (pq(ig,l,igcm_dust_number)+
     853     &          (pdq(ig,l,igcm_dust_number)+
     854     &          pdqcloudco2(ig,l,igcm_dust_number))
     855     &          *ptimestep.le. 1.e-30)
     856     &          then
     857              pdqcloudco2(ig,l,igcm_dust_number)=0.
     858              pdqcloudco2(ig,l,igcm_dust_mass)=0.
     859           else
     860              pdqcloudco2(ig,l,igcm_dust_number)=
     861     &             pq(ig,l,igcm_ccnco2_number)
     862     &             /ptimestep+pdq(ig,l,igcm_ccnco2_number)
     863     &             -memdNNccn(ig,l)
     864           endif
     865           
     866           if (pq(ig,l,igcm_dust_mass)+
     867     &          (pdq(ig,l,igcm_dust_mass)+
     868     &          pdqcloudco2(ig,l,igcm_dust_mass))
     869     &          *ptimestep .le. 1.e-30)
     870     &          then
     871              pdqcloudco2(ig,l,igcm_dust_number)=0.
     872              pdqcloudco2(ig,l,igcm_dust_mass)=0.
     873           else
     874              pdqcloudco2(ig,l,igcm_dust_mass)=
     875     &             pq(ig,l,igcm_ccnco2_mass)
     876     &             /ptimestep+pdq(ig,l,igcm_ccnco2_mass)
     877     &             -(memdMMh2o(ig,l)+memdMMccn(ig,l))
     878           endif
     879           memdMMccn(ig,l)=0.
     880           memdMMh2o(ig,l)=0.
     881           memdNNccn(ig,l)=0.
    719882           riceco2(ig,l)=0.
     883           pdtcloudco2(ig,l)=0.
     884        endif
     885
     886     
    720887           
    721            !NO CLOUD : RESET TRACER AND CONSERVE MASS
    722            pdqcloudco2(ig,l,igcm_co2)= pq(ig,l,igcm_co2_ice)
    723      &          /ptimestep+pdq(ig,l,igcm_co2_ice)
    724            
    725            pdqcloudco2(ig,l,igcm_co2_ice)=-pq(ig,l,igcm_co2_ice)
    726      &          /ptimestep-pdq(ig,l,igcm_co2_ice)
    727            
    728            pdqcloudco2(ig,l,igcm_ccnco2_mass)=
    729      &          -pq(ig,l,igcm_ccnco2_mass)
    730      &          /ptimestep-pdq(ig,l,igcm_ccnco2_mass)
    731 
    732            pdqcloudco2(ig,l,igcm_ccnco2_number)=
    733      &          -pq(ig,l,igcm_ccnco2_number)
    734      &          /ptimestep-pdq(ig,l,igcm_ccnco2_number)
    735 
    736            pdqcloudco2(ig,l,igcm_dust_number)=
    737      &          pq(ig,l,igcm_ccnco2_number)
    738      &          /ptimestep+pdq(ig,l,igcm_ccnco2_number)
    739            
    740            pdqcloudco2(ig,l,igcm_dust_mass)=
    741      &          pq(ig,l,igcm_ccnco2_mass)
    742      &          /ptimestep+pdq(ig,l,igcm_ccnco2_mass)
    743 c$$$
    744 
    745 c$$$           
    746        endif
    747      
    748 c       write(*,*) "in co2clouds, riceco2(ig,l)v2= ",riceco2(ig,l)
    749            
    750       ENDDO
    751       ENDDO
    752      
     888      !update rice water
     889        call updaterice_micro(
     890     &    pq(ig,l,igcm_h2o_ice) +                    ! ice mass
     891     &   (pdq(ig,l,igcm_h2o_ice) +                   ! ice mass
     892     &    pdqcloudco2(ig,l,igcm_h2o_ice))*ptimestep,    ! ice mass
     893     &    pq(ig,l,igcm_ccn_mass) +                   ! ccn mass
     894     &   (pdq(ig,l,igcm_ccn_mass) +                  ! ccn mass
     895     &    pdqcloudco2(ig,l,igcm_ccn_mass))*ptimestep,   ! ccn mass
     896     &    pq(ig,l,igcm_ccn_number) +                 ! ccn number
     897     &   (pdq(ig,l,igcm_ccn_number) +                ! ccn number
     898     &    pdqcloudco2(ig,l,igcm_ccn_number))*ptimestep, ! ccn number
     899     &    tauscaling(ig),rice(ig,l),rhocloud(ig,l))
     900         
     901
     902        call updaterdust(
     903     &    pq(ig,l,igcm_dust_mass) +                   ! dust mass
     904     &   (pdq(ig,l,igcm_dust_mass) +                  ! dust mass
     905     &    pdqcloudco2(ig,l,igcm_dust_mass))*ptimestep,   ! dust mass
     906     &    pq(ig,l,igcm_dust_number) +                 ! dust number
     907     &   (pdq(ig,l,igcm_dust_number) +                ! dust number
     908     &    pdqcloudco2(ig,l,igcm_dust_number))*ptimestep, ! dust number
     909     &    rdust(ig,l))
     910
     911         ENDDO
     912       ENDDO
     913       
     914
     915
    753916      ELSE ! no microphys ! not of concern for co2 clouds  - listo
    754917       
     
    758921c     TO CHEK for relevancy - listo
    759922
     923c     A correction if a lot of subliming CO2 fills the 1st layer FF04/2005
     924c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     925c     Then that should not affect the ice particle radius
     926      !do ig=1,ngrid
     927      !  if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,2)))then
     928      !    if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,3)))
     929     &!    riceco2(ig,2)=riceco2(ig,3)
     930      !    riceco2(ig,1)=riceco2(ig,2)
     931      !  end if
     932      !end do
     933       
    760934c     A correction if a lot of subliming CO2 fills the 1st layer FF04/2005
    761935c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
    772946       DO l=1,nlay
    773947         DO ig=1,ngrid
     948           rsedcloud(ig,l)=max(rice(ig,l)*
     949     &                 (1.+nuice_sed)*(1.+nuice_sed)*(1.+nuice_sed),
     950     &                    rdust(ig,l))
     951!          rsedcloud(ig,l)=min(rsedcloud(ig,l),1.e-4)
     952         ENDDO
     953      ENDDO
     954       
     955       DO l=1,nlay
     956         DO ig=1,ngrid
    774957           rsedcloudco2(ig,l)=max(riceco2(ig,l)*
    775958     &           (1.+nuiceco2_sed)*(1.+nuiceco2_sed)*(1.+nuiceco2_sed),
    776959     &                    rdust(ig,l))
    777           rsedcloudco2(ig,l)=min(rsedcloudco2(ig,l),1.e-4)
     960          rsedcloudco2(ig,l)=min(rsedcloudco2(ig,l),1.e-5)
    778961         ENDDO
    779962       ENDDO
     
    782965         do ig=1,ngrid
    783966            do l=1,nlay
    784                satuco2(ig,l) = pq(ig,l,igcm_co2)*
     967               satuco2(ig,l) = (pq(ig,l,igcm_co2)  +
     968     &              (pdq(ig,l,igcm_co2) +
     969     &              pdqcloudco2(ig,l,igcm_co2))*ptimestep)*
    785970     &              (mmean(ig,l)/44.01)*pplay(ig,l)/zqsatco2(ig,l)
    786971                 
  • trunk/LMDZ.MARS/libf/phymars/improvedCO2clouds.F

    r1649 r1685  
    22     &             pplay,pt,pdt,
    33     &             pq,pdq,pdqcloudco2,pdtcloudco2,
    4      &             nq,tauscaling)
     4     &             nq,tauscaling,
     5     &             memdMMccn,memdMMh2o,memdNNccn)
    56! to use  'getin'
    67      USE comcstfi_h
     
    3132c    values which are then used by the sedimentation and advection
    3233c    schemes.
     34c CO2 ice particles can nucleate on both dust and on water ice particles
     35c When CO2 ice is deposited onto a water ice particles, the particle is
     36c removed from the water tracers.
     37cWARNING: no sedimentation of the water ice origin is performed
     38c in the microphysical timestep in co2cloud.F.
    3339
    3440c  Authors of the water ice clouds microphysics
     
    6672      REAL tauscaling(ngrid)     ! Convertion factor for qdust and Ndust
    6773
    68       real rice(ngrid,nlay)    ! Water Ice mass mean radius (m)
     74      REAL rice(ngrid,nlay)    ! Water Ice mass mean radius (m)
    6975                                ! used for nucleation of CO2 on ice-coated ccns
    7076
     
    98104      REAL l0,l1,l2,l3,l4
    99105      REAL cste
    100       REAL dMice           ! mass of condensed ice
     106      DOUBLE PRECISION dMice           ! mass of condensed ice
    101107      DOUBLE PRECISION sumcheck
    102108      DOUBLE PRECISION pco2     ! Co2 vapor partial pressure (Pa)
     
    104110      DOUBLE PRECISION Mo,No
    105111      DOUBLE PRECISION  Rn, Rm, dev2, n_derf, m_derf
    106  
     112      DOUBLE PRECISION  memdMMccn(ngrid,nlay)
     113      DOUBLE PRECISION  memdMMh2o(ngrid,nlay)
     114      DOUBLE PRECISION memdNNccn(ngrid,nlay)
     115
    107116!     Radius used by the microphysical scheme (m)
    108117      DOUBLE PRECISION n_aer(nbinco2_cld) ! number concentration volume-1 of particle/each size bin
     
    116125c      EXTERNAL sigco2
    117126
    118       DOUBLE PRECISION dN,dM, dNh2o, dMh2o, dNN,dMM
     127      DOUBLE PRECISION dN,dM, dNh2o, dMh2o, dNN,dMM,dNNh2o,dMMh2o
    119128      DOUBLE PRECISION rate(nbinco2_cld)  ! nucleation rate
    120129      DOUBLE PRECISION rateh2o(nbinco2_cld)  ! nucleation rate
    121130      REAL seq
    122 
     131      DOUBLE PRECISION rho_ice_co2T(ngrid,nlay)
    123132      DOUBLE PRECISION riceco2(ngrid,nlay)      ! CO2Ice mean radius (m)
    124                                    
     133      REAL rhocloud(ngrid,nlay) ! Cloud density (kg.m-3)
     134                 
    125135      REAL rhocloudco2(ngrid,nlay)  ! Cloud density (kg.m-3)
    126136      REAL rdust(ngrid,nlay) ! Dust geometric mean radius (m)
     
    128138c      REAL res      ! Resistance growth
    129139      DOUBLE PRECISION Ic_rice      ! Mass transfer rate CO2 ice crystal
    130      
    131 
     140      DOUBLE PRECISION ratioh2o_ccn
     141      DOUBLE PRECISION vo2co2
    132142c     Parameters of the size discretization
    133143c       used by the microphysical scheme
    134       DOUBLE PRECISION, PARAMETER :: rmin_cld = 1.e-9 ! Minimum radius (m)
    135       DOUBLE PRECISION, PARAMETER :: rmax_cld = 5.e-5 ! Maximum radius (m)
    136       DOUBLE PRECISION, PARAMETER :: rbmin_cld =0.099e-9
     144      DOUBLE PRECISION, PARAMETER :: rmin_cld = 1.e-10 ! Minimum radius (m)
     145      DOUBLE PRECISION, PARAMETER :: rmax_cld = 5.e-4 ! Maximum radius (m)
     146      DOUBLE PRECISION, PARAMETER :: rbmin_cld =1.e-11
    137147                                           ! Minimum boundary radius (m)
    138       DOUBLE PRECISION, PARAMETER :: rbmax_cld = 1.e-2 ! Maximum boundary radius (m)
     148      DOUBLE PRECISION, PARAMETER :: rbmax_cld = 1.e-3 ! Maximum boundary radius (m)
    139149      DOUBLE PRECISION vrat_cld ! Volume ratio
    140150      DOUBLE PRECISION rb_cldco2(nbinco2_cld+1) ! boundary values of each rad_cldco2 bin (m)
     
    144154      DOUBLE PRECISION vol_cld(nbinco2_cld)  ! particle volume for each bin (m3)
    145155
    146       DOUBLE PRECISION Proba,Masse_atm,drsurdt,reff
     156      DOUBLE PRECISION Proba,Masse_atm,drsurdt,reff,Probah2o
    147157      REAL sigma_iceco2 ! Variance of the ice and CCN distributions
    148158      SAVE sigma_iceco2
     
    223233c        mteta  = 0.952
    224234c        mtetaco2 = 0.952
    225 c        write(*,*) 'co2_param contact parameter:', mtetaco2
     235        write(*,*) 'co2_param contact parameter:', mtetaco2
    226236
    227237c       Volume of a co2 molecule (m3)
     
    235245c        write(*,*) 'nuice for sedimentation:', nuiceco2_sed
    236246c        write(*,*) 'Volume of a co2 molecule:', vo1co2
     247 
     248        write(*,*) 'Variance of ice & CCN CO2 distribs :', sigma_iceco2
     249        write(*,*) 'nuice for co2 ice sedimentation:', nuiceco2_sed
     250        write(*,*) 'Volume of a co2 molecule:', vo1co2
     251
    237252
    238253
     
    249264
    250265      res_out(:,:) = 0
    251       rice(:,:) = 1.e-11
     266      rice(:,:) = 1.e-8
    252267      riceco2(:,:) = 1.e-11
    253268
     
    261276     &      pt(1:ngrid,1:nlay) +
    262277     &      pdt(1:ngrid,1:nlay) * ptimestep
    263 
     278c      call WRITEDIAGFI(ngrid,"Ztclouds",
     279c     &     "Ztclouds",'K',3,zt)
     280c       call WRITEDIAGFI(ngrid,"pdtclouds",
     281c     &     "pdtclouds",'K',3,pdt*ptimestep)
     282     
    264283      zq(1:ngrid,1:nlay,1:nq) =
    265284     &      pq(1:ngrid,1:nlay,1:nq) +
     
    286305   
    287306c     Main loop over the GCM's grid
    288       DO l=1,nlay
    289         DO ig=1,ngrid
     307       DO l=1,nlay
     308         DO ig=1,ngrid
    290309     
    291310         
     
    297316! 3. Nucleation
    298317!=============================================================
    299 
     318           rho_ice_co2T(ig,l)=1000.*(1.72391-2.53e-4*zt(ig,l)
     319     &          -2.87e-6*zt(ig,l)*zt(ig,l))
     320           vo2co2 = m0co2 / dble(rho_ice_co2T(ig,l)) ! m0co2
     321           rho_ice_co2=rho_ice_co2T(ig,l)
    300322c           call updaterccn(zq(ig,l,igcm_dust_mass),
    301323c     &          zq(ig,l,igcm_dust_number),rdust(ig,l),tauscaling(ig))
    302 
     324c              write(*,*) "l, pco2, satu= ",l,pco2,satu
    303325           IF ( satu .ge. 1d0 ) THEN ! if there is condensation
    304326c              write(*,*)
    305 c              write(*,*) "l, pco2, satu= ",l,pco2,satu
     327         
     328              !write(*,*) "Zt, rho=",zt(ig,l),rho_ice_co2
    306329c              Masse_atm=mmean(ig,l)*1.e-3*pplay(ig,l)/rgp/zt(ig,l) !Kg par couche
    307330
    308331
    309               call updaterccn(zq(ig,l,igcm_dust_mass),
    310      &             zq(ig,l,igcm_dust_number),rdust(ig,l),tauscaling(ig))
     332c              call updaterccn(zq(ig,l,igcm_dust_mass),
     333c     &             zq(ig,l,igcm_dust_number),rdust(ig,l),tauscaling(ig))
     334
     335c              call updaterccn(zq(ig,l,igcm_dust_mass),
     336c     &             zq(ig,l,igcm_dust_number),rdust(ig,l),tauscaling(ig))
    311337c              write(*,*) "Improved, l,Rdust = ",l,rdust(ig,l)
    312338
     
    315341     &             / zq(ig,l,igcm_dust_number)
    316342              rdust(ig,l)= rdust(ig,l)**(1./3.)
    317 c              write(*,*) "Improved2, l,Rdust = ",l,rdust(ig,l)
    318             rdust(ig,l)=max(1.e-9,rdust(ig,l))
    319             rdust(ig,l)=min(2e-6,rdust(ig,l))
    320 c              write(*,*) "Improved3, l,Rdust = ",l,rdust(ig,l)
    321 
     343             !write(*,*) "Improved2, l,Rdust = ",l,rdust(ig,l)
     344            rdust(ig,l)=max(1.e-10,rdust(ig,l))
     345            rdust(ig,l)=min(5.e-5,rdust(ig,l))
     346             ! write(*,*) "Improved3,Rdust = ",rdust(ig,l)
     347     
    322348c       Expand the dust moments into a binned distribution
    323               Mo = zq(ig,l,igcm_dust_mass)* tauscaling(ig)
    324               No = zq(ig,l,igcm_dust_number)* tauscaling(ig)
    325 c              write(*,*) "dust number, mass = ",
     349              Mo = zq(ig,l,igcm_dust_mass)* tauscaling(ig)+1.e-30
     350              No = zq(ig,l,igcm_dust_number)* tauscaling(ig)+1.e-30
     351c              write(*,*) "Improved dust number, mass = ",
    326352c     &             zq(ig,l,igcm_dust_number)* tauscaling(ig),
    327353c     &             zq(ig,l,igcm_dust_mass)* tauscaling(ig)
     
    340366                 n_aer(i) = n_aer(i) + 0.5 * No * n_derf
    341367                 m_aer(i) = m_aer(i) + 0.5 * Mo * m_derf
    342 c                 write(*,*) "i, rb_cldco2(i) = ",i, rb_cldco2(i),n_aer(i)
    343              
     368c                 write(*,*) "i, rad_cldco2(i) = ",i, rad_cldco2(i),
     369c     &                n_aer(i)
    344370              enddo
    345371
     
    353379                 print*, "WARNING, No sumcheck PROBLEM"
    354380                 print*, "sumcheck, No",sumcheck, No
     381                 print*, "rdust =",rdust(ig,l)
    355382                 print*, "min radius, Rn, ig, l", rmin_cld, 1./Rn, ig, l
    356383                 print*, "Dust binned distribution", n_aer
     
    372399              endif
    373400
    374 c       Expand the water ice moments into a binned distribution
    375 c       For now the radius grid's bound are same as for dust
    376 c       min=100 nm and max=10microns
    377 c       might need a change if rice (water) is large (but how large?) - listo
    378 
    379               Mo = zq(ig,l,igcm_h2o_ice)* tauscaling(ig)   + 1.e-30
     401              call updaterice_micro(
     402     &             zq(ig,l,igcm_h2o_ice), ! ice mass
     403     &             zq(ig,l,igcm_ccn_mass), ! ccn mass
     404     &             zq(ig,l,igcm_ccn_number), ! ccn number
     405     &             tauscaling(ig),rice(ig,l),rhocloud(ig,l))
     406              ! rice radius of CCN + H20 crystal
     407              !write(*,*) "Improved1 Rice=",rice(ig,l)
     408              rice(ig,l)=max(1.e-10,rice(ig,l))
     409              rice(ig,l)=min(5.e-5,rice(ig,l))
     410              !write(*,*) "Improved2 Rice=",rice(ig,l)
     411              Mo = zq(ig,l,igcm_h2o_ice) +
     412     &             zq(ig,l,igcm_ccn_mass)*tauscaling(ig)
     413     &             + 1.e-30 !Total mass of H20 crystals,CCN included
    380414              No = zq(ig,l,igcm_ccn_number)* tauscaling(ig) + 1.e-30
    381415              Rn = rice(ig,l)
     
    389423                 n_derf = derf( (rb_cldco2(i+1)+Rn) *dev2)
    390424                 m_derf = derf( (rb_cldco2(i+1)+Rm) *dev2)
    391                  n_aer_h2oice(i) = n_aer(i) + 0.5 * No * n_derf ! vector not really needed - temp var - listo
    392                  m_aer_h2oice(i) = m_aer(i) + 0.5 * Mo * m_derf ! vector not really needed - temp var
    393                  rad_h2oice(i) = ((m_aer_h2oice(i)/rho_ice/
    394      &                n_aer_h2oice(i) +   vol_cld(i)))
    395      &                *0.75/pi**(1./3)
    396 c                 write(*,*) "before nuc, i,rad_h2o(i)= ",i,rad_h2oice(i)
    397 c     &                ,m_aer(i),n_aer(i)
     425                 n_aer_h2oice(i) = n_aer_h2oice(i) + 0.5 * No * n_derf ! vector not really needed - temp var - listo
     426                 m_aer_h2oice(i) = m_aer_h2oice(i) + 0.5 * Mo * m_derf ! vector not really needed - temp var
     427                 rad_h2oice(i) = rad_cldco2(i)
     428c                 write(*,*) "before nuc, i,rad_h2o(i)= ",i,rad_cldco2(i)
     429c     &                ,m_aer_h2oice(i),n_aer_h2oice(i)
    398430              enddo
    399 
     431              sumcheck = 0
     432              do i = 1, nbinco2_cld
     433                 sumcheck = sumcheck + n_aer_h2oice(i)
     434              enddo
     435              sumcheck = abs(sumcheck/No - 1)
     436              if ((sumcheck .gt. 1e-5).and. (1./Rn .gt. rmin_cld)) then
     437                 print*, "WARNING, Noh2o sumcheck PROBLEM"
     438                 print*, "sumcheck, No",sumcheck, No
     439                 print*, "rice =",rice(ig,l)
     440                 print*, "min radius, Rn, ig, l", rmin_cld, 1./Rn, ig, l
     441                 print*, "Dust binned distribution", n_aer_h2oice
     442                 STOP
     443              endif
    400444             
    401445           
     
    403447              call nucleaCO2(dble(pco2),zt(ig,l),dble(satu)
    404448     &             ,n_aer,rate,n_aer_h2oice
    405      &             ,rad_h2oice,rateh2o)
     449     &             ,rad_h2oice,rateh2o,vo2co2)
    406450        ! regarder rateh20, et mettre = 0 si non nul pour le moment
    407451              dN = 0.
     
    410454              dMh2o = 0.
    411455              do i = 1, nbinco2_cld
    412           !n_aer(i) = n_aer(i)/( 1. + (rate(i)+rateh2o(i))*ptimestep)
    413           !m_aer(i) = m_aer(i)/( 1. + (rate(i)+rateh2o(i))*ptimestep)
    414456                 Proba=1.0-dexp(-1.*ptimestep*rate(i))
    415 
    416                      
    417 c                 dNh2o    = dNh2o + n_aer_h2oice(i) * rateh2o(i)
    418 c     &                * ptimestep
    419 c                 dMh2o    = dMh2o + m_aer_h2oice(i) * rateh2o(i)
    420 c     &                *ptimestep
     457                 Probah2o=1.0-dexp(-1.*ptimestep*rateh2o(i))
     458                 
     459                 dNh2o    = dNh2o + n_aer_h2oice(i) * Probah2o
     460                 dMh2o    = dMh2o + m_aer_h2oice(i) * Probah2o
    421461
    422462                 dN       = dN + n_aer(i) * Proba
     
    425465              enddo
    426466             
    427 c              do i=1,nbinco2_cld
    428 c                 write(*,*) "i n_aer m_aer = ",i,n_aer(i),m_aer(i)
    429 c              enddo
    430467        ! dM  masse activée (kg) et dN nb particules par  kg d'air
    431468
    432 c       Update Dust particles
    433 c       For CO2 ice : no subtraction from dust (neither for water ice particles)
    434 !        zq(ig,l,igcm_dust_mass)   =
    435 !     &  zq(ig,l,igcm_dust_mass)   - dM/ tauscaling(ig) !max(tauscaling(ig),1.e-10)
    436 !        zq(ig,l,igcm_dust_number) =
    437 !     &  zq(ig,l,igcm_dust_number) - dN/ tauscaling(ig) !max(tauscaling(ig),1.e-10)
    438469c              write(*,*)  " nuclea dM = ",dM/tauscaling(ig),
    439470c     &             " nuclea dN = ", dN/tauscaling(ig)
     
    441472              dNN= dN/tauscaling(ig)
    442473              dMM= dM/tauscaling(ig)
    443 
    444               dNN=min(dNN,abs(zq0(ig,l,igcm_dust_number)))
    445               dMM=min(dMM,zq0(ig,l,igcm_dust_mass))
     474              dNNh2o=dNh2o/tauscaling(ig)
     475              dMMh2o=dMh2o/tauscaling(ig)
     476
     477              dNN=min(dNN,abs(zq(ig,l,igcm_dust_number)))
     478              dMM=min(dMM,abs(zq(ig,l,igcm_dust_mass)))
     479c
     480c              write(*,*) "Nuclea dNN crees=",dNN
     481              dNNh2o=min(dNNh2o,abs(zq(ig,l,igcm_ccn_number)))
     482              dMMh2o=min(dMMh2o,abs(zq(ig,l,igcm_h2o_ice)/tauscaling(ig)
     483     &             +zq(ig,l,igcm_ccn_mass))) !Total mass of H2O crystals available
     484
     485c              write(*,*) "Nuclea dNNh2o crees=",dNNh2o
    446486
    447487c       Update CCNs for CO2 crystals
     
    449489              zq(ig,l,igcm_ccnco2_mass)   =
    450490     &             zq(ig,l,igcm_ccnco2_mass)   + dMM
    451  
    452491              zq(ig,l,igcm_ccnco2_number) =
    453492     &             zq(ig,l,igcm_ccnco2_number) + dNN
    454 
    455493              zq(ig,l,igcm_dust_mass)   =
    456494     &             zq(ig,l,igcm_dust_mass)   - dMM
     
    458496     &             zq(ig,l,igcm_dust_number) - dNN
    459497
    460 
    461 c + enlever les CCN a la distri de dust
    462 
    463 c              write(*,*) "new dust_mass, number =",
    464 c     &             zq(ig,l,igcm_dust_mass)* tauscaling(ig),
    465 c     &             zq(ig,l,igcm_dust_number)*tauscaling(ig)
    466 c              write(*,*) "new ccn mass, number =",
    467 c     &             zq(ig,l,igcm_ccnco2_mass)* tauscaling(ig)
    468 c     &             ,zq(ig,l,igcm_ccnco2_number)*tauscaling(ig)
     498c     Update CCN for CO2 nucleating on H2O CCN :
     499              ! Warning: must keep memory of it
     500              zq(ig,l,igcm_ccnco2_mass)   =
     501     &             zq(ig,l,igcm_ccnco2_mass)   + dMMh2o
     502              zq(ig,l,igcm_ccnco2_number) =
     503     &             zq(ig,l,igcm_ccnco2_number) + dNNh2o
     504
     505     
     506              zq(ig,l,igcm_ccn_number) =
     507     &             zq(ig,l,igcm_ccn_number) - dNNh2o
     508
     509              ratioh2o_ccn=1./(zq(ig,l,igcm_h2o_ice)
     510     &             +zq(ig,l,igcm_ccn_mass)*tauscaling(ig))         
     511   
     512
     513              memdMMh2o(ig,l)= memdMMh2o(ig,l)+zq(ig,l,igcm_h2o_ice)*
     514     &             dMMh2o*ratioh2o_ccn
     515              memdMMccn(ig,l)= memdMMccn(ig,l)+zq(ig,l,igcm_ccn_mass)*
     516     &             tauscaling(ig)*dMMh2o*ratioh2o_ccn
     517              memdNNccn(ig,l)=memdNNccn(ig,l)+dNNh2o
     518c              if (dMMh2o .gt. 0) then
     519c              write(*,*) 'test h2o'
     520c              write(*,*) "dMMh2o=",dMMh2o
     521c              write(*,*) "2 =",zq(ig,l,igcm_ccn_mass)*tauscaling(ig)*
     522c     &             dMMh2o*ratioh2o_ccn+zq(ig,l,igcm_h2o_ice)*
     523c     &             dMMh2o*ratioh2o_ccn
     524c              write(*,*) "3=",zq(ig,l,igcm_ccn_mass)*tauscaling(ig)*
     525c     &             dMMh2o*ratioh2o_ccn
     526c              write(*,*) "4=",zq(ig,l,igcm_h2o_ice)*
     527c     &             dMMh2o*ratioh2o_ccn
     528c              write(*,*) "tauscaling=",tauscaling(ig)
     529c           endif
     530              zq(ig,l,igcm_h2o_ice)   = zq(ig,l,igcm_h2o_ice)*
     531     &             (1.-dMMh2o*ratioh2o_ccn)
     532              zq(ig,l,igcm_ccn_mass)   = zq(ig,l,igcm_ccn_mass)*
     533     &             tauscaling(ig)*(1.-dMMh2o*ratioh2o_ccn)
     534         
    469535           
    470536           ENDIF                ! of is satu >1
     
    478544c           IF ( zq(ig,l,igcm_ccnco2_number)*tauscaling(ig).ge. 1.0) THEN
    479545
    480            IF (zq(ig,l,igcm_ccnco2_number)*tauscaling(ig) .ge. threshJA)
    481      &          THEN            ! we trigger crystal growth
    482 
    483               call updaterccn(zq(ig,l,igcm_dust_mass),
    484      &             zq(ig,l,igcm_dust_number),rdust(ig,l),tauscaling(ig))
     546           IF (zq(ig,l,igcm_ccnco2_number)*tauscaling(ig) .ge. 1.)
     547     &          THEN
     548           ! we trigger crystal growth
     549c
     550
     551c              Niceco2 = zq(ig,l,igcm_co2_ice)
     552c              Qccnco2 = zq(ig,l,igcm_ccnco2_mass)
     553c              Nccnco2 = zq(ig,l,igcm_ccnco2_number)
     554c              call updaterice_microco2(Niceco2,Qccnco2,Nccnco2,
     555c     &             tauscaling(ig),riceco2(ig,l),rhocloudco2(ig,l))
     556c              write(*,*) "updater rice=",riceco2(ig,l)
     557             
    485558              rdust(ig,l)= zq(ig,l,igcm_ccnco2_mass)
    486559     &             *0.75/pi/rho_dust
    487560     &             / zq(ig,l,igcm_ccnco2_number)
    488               rdust(ig,l)= rdust(ig,l)**(1./3.)
    489            
     561              rdust(ig,l)= rdust(ig,l)**(1./3.)           
    490562              rdust(ig,l)=max(1.e-10,rdust(ig,l))
    491               rdust(ig,l)=min(2e-6,rdust(ig,l))
    492              ! rdust(ig,l)=1.e-7
    493 
    494               IF (zq(ig,l,igcm_ccnco2_mass) .lt. 0. .or.
    495      &             zq(ig,l,igcm_ccnco2_number) .lt. 0. .or.
    496      &             zq(ig,l,igcm_dust_mass) .lt. 0. .or.
    497      &             zq(ig,l,igcm_dust_number) .lt. 0. ) THEN
    498                
    499                  write(*,*) "CO2 clouds before growth CCN N,M = "         
    500      &                ,zq(ig,l,igcm_ccnco2_number)*tauscaling(ig)
    501      &                ,zq(ig,l,igcm_ccnco2_mass)*tauscaling(ig)
    502                  
    503                  write(*,*) "before growth dust number mass = ",
    504      &                zq(ig,l,igcm_dust_number)*tauscaling(ig),
    505      &                zq(ig,l,igcm_dust_mass)*tauscaling(ig)           
    506                  STOP
    507               END IF
    508            
    509 c              write(*,*) "reff dN = ",reff,dN
    510 c              reff=reff/dble(dN)
    511 c              if (zq(ig,l,igcm_co2_ice) .le. 1.e-20) then
    512 c                 riceco2(ig,l)=reff
    513 c              endif
    514              
    515 c              write(*,*) "Rdust in improved = ",rdust(ig,l)
    516              
     563           !   rdust(ig,l)=min(5.e-6,rdust(ig,l))
     564   
    517565              riceco2(ig,l)=( zq(ig,l,igcm_co2_ice)*3.0/
    518      &             (4.0*rho_ice_co2*pi*zq(ig,l,igcm_ccnco2_number)
    519      &             *tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
     566     &             (4.0*rho_ice_co2*zq(ig,l,igcm_ccnco2_number)
     567     &             *pi*tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
    520568     &             *rdust(ig,l) )**(1.0/3.0)
    521569
     570c              riceco2(ig,l)=max(1.e-10,riceco2(ig,l))
     571c              riceco2(ig,l)=min(1.e-5,riceco2(ig,l))
    522572          ! WATCH OUT: CO2 nuclei is supposed to be dust
    523573          ! only when deriving rhocloud (otherwise would need to keep info on  water embedded in co2) - listo
     
    526576
    527577              !! Niceco2,Qccnco2,Nccnco2
    528               Niceco2 = zq(ig,l,igcm_co2_ice)
    529               Qccnco2 = zq(ig,l,igcm_ccnco2_mass)
    530               Nccnco2 = zq(ig,l,igcm_ccnco2_number)
    531               call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
    532      &             tauscaling(ig),riceco2(ig,l),rhocloudco2(ig,l))
    533 c              write(*,*) "Riceco2 update before growth = ",riceco2(ig,l)
    534 
    535               No   = zq(ig,l,igcm_ccnco2_number)* tauscaling(ig)
    536      &             + 1.e-30
     578c              Niceco2 = zq(ig,l,igcm_co2_ice)
     579c              Qccnco2 = zq(ig,l,igcm_ccnco2_mass)
     580c              Nccnco2 = zq(ig,l,igcm_ccnco2_number)
     581c              call updaterice_microco2(Niceco2,Qccnco2,Nccnco2,
     582c     &             tauscaling(ig),riceco2(ig,l),rhocloudco2(ig,l))
     583              !write(*,*) "Riceco2 update before growth = ",riceco2(ig,l)
     584c              write(*,*) "rdust before growth = ",rdust(ig,l)
     585c     write(*,*) "co2 before growth=",zq(ig,l,igcm_co2)
     586c              write(*,*) "pplay before growth=",pplay(ig,l)
     587c              write(*,*) "zt before growth =",zt(ig,l)
     588             ! write(*,*) "Satu before growth=",satu
     589c              riceco2(ig,l)=max(riceco2(ig,l),rdust(ig,l))
     590              No   = zq(ig,l,igcm_ccnco2_number)* tauscaling(ig)+1.e-30
    537591! No nb de particules de poussieres mis à l'échelle pour donner une opacité optique
    538592
     
    549603              drsurdt=-1.0/(4.0*pi*riceco2(ig,l)*
    550604     &             riceco2(ig,l)*rho_ice_co2)*Ic_rice
    551               dMice =  No * Ic_rice * ptimestep ! Kg par kg d'air, <0 si croissance !           
     605              dMice =  No * Ic_rice*ptimestep ! Kg par kg d'air, <0 si croissance !           
    552606c              write(*,*) "dMicev0 in improved = " , dMice
    553607
    554              if (dMice .gt. 0) dMice = min(dMice,zq0(ig,l,igcm_co2_ice))
    555              if (dMice .lt. 0) dMice = max(dMice,-1.*zq0(ig,l,igcm_co2))
    556 
    557 
    558 
    559 
    560               riceco2(ig,l)=riceco2(ig,l)+drsurdt*ptimestep
     608             if (dMice .ge. 0d0) then
     609                dMice = min(dMice,abs(zq(ig,l,igcm_co2_ice)))
     610             else
     611                dMice =-1.* min(abs(dMice),abs(zq(ig,l,igcm_co2)))
     612             endif
     613             riceco2(ig,l)=riceco2(ig,l)+drsurdt*ptimestep
    561614c              write(*,*) "riceco2+dr/dt = ", riceco2(ig,l)
    562 
    563 c              write(*,*) "dMice in improved = " , dMice
     615c              write(*,*) "dMice in improved = " , dMice             
    564616             
    565              
    566               zq(ig,l,igcm_co2_ice) = zq(ig,l,igcm_co2_ice)
    567      &             -dMice
    568               zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2)+dMice
    569 c              write(*,*) "zq co2 ice = ", zq(ig,l,igcm_co2_ice)
    570               countcells = countcells + 1
     617             zq(ig,l,igcm_co2_ice) = zq(ig,l,igcm_co2_ice)
     618     &            -dMice
     619             zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2)+dMice
     620c              write(*,*) "Improved zq co2 ice = ", zq(ig,l,igcm_co2_ice)
     621            !  countcells = countcells + 1
    571622       
    572               riceco2(ig,l)=( zq(ig,l,igcm_co2_ice)*3.0/
    573      &             (4.0*rho_ice_co2*pi*zq(ig,l,igcm_ccnco2_number)
    574      &             *tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
    575      &             *rdust(ig,l) )**(1.0/3.0)
    576 c              write(*,*) "new riceco2 = ",riceco2(ig,l)
    577                
    578               !! Niceco2,Qccnco2,Nccnco2
    579               Niceco2 = zq(ig,l,igcm_co2_ice)
    580               Qccnco2 = zq(ig,l,igcm_ccnco2_mass)
    581               Nccnco2 = zq(ig,l,igcm_ccnco2_number)
    582               call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
    583      &             tauscaling(ig),riceco2(ig,l),rhocloudco2(ig,l))
    584 c              write(*,*) "new riceco2 updaterad= ",riceco2(ig,l)
     623c              riceco2(ig,l)=( zq(ig,l,igcm_co2_ice)*3.0/
     624c     &             (4.0*rho_ice_co2*pi*zq(ig,l,igcm_ccnco2_number)
     625c     &             *tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
     626c     &             *rdust(ig,l) )**(1.0/3.0)
     627c              write(*,*) "Improved new riceco2 = ",riceco2(ig,l)
     628         
     629c              write(*,*) "new riceco2 improvedupdaterad= ",riceco2(ig,l)
    585630
    586631! latent heat release       
     
    598643              pdtcloudco2(ig,l)= dMice*lw/cpp/ptimestep ! kg par couche * J par kg /J par K / s = K par seconde
    599644             
    600 c              write(*,*) "pdtcloudco2 = ",pdtcloudco2(ig,l)
     645c              write(*,*) "pdtcloudco2 after growth = ",pdtcloudco2(ig,l)
    601646             
    602 c Peut etre -1*dMice?
    603 
    604647
    605648          !deltaT par condens/subli. qui remplace le dT du CO2 du newcondens pré-constantino
     
    618661
    619662c         interaction ho-co2 ici, dans la mise a jour des traceurs WARNING reflechir
     663              !! Niceco2,Qccnco2,Nccnco2
     664     
     665       
    620666       
    621 
    622            ENDIF                !of if Nccn>1   
    623 c           if (riceco2(ig,l) .lt. 1.e-9) then
    624          
    625             if (zq(ig,l,igcm_co2_ice).le.1.e-20 .or.
    626      &             riceco2(ig,l) .lt. 1.e-9 .or. riceco2(ig,l)
    627      &          .ge. 4.999e-4) then
    628 !     Reverser les ccn libérés dans les h2o ou dust?
    629                
    630 c     c        ICI:   Co2 ice devient vapeur
    631               zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2)
    632      &              + zq(ig,l,igcm_co2_ice)
    633                
    634                zq(ig,l,igcm_dust_mass) =
    635      &              zq(ig,l,igcm_dust_mass)
    636      &              + zq(ig,l,igcm_ccnco2_mass)
    637                zq(ig,l,igcm_dust_number)
    638      &              = zq(ig,l,igcm_dust_number)
    639      &              + zq(ig,l,igcm_ccnco2_number)
    640 c     c           CCNs
    641                zq(ig,l,igcm_ccnco2_mass) = 0.
    642                zq(ig,l,igcm_ccnco2_number) =0.
    643                zq(ig,l,igcm_co2_ice) = 0.
    644                riceco2(ig,l)=0.
    645             endif
    646            
    647 c            write(*,*) "zq co2 end imp= ", zq(i g,l,igcm_co2_ice),satu
    648 
     667              rdust(ig,l)= zq(ig,l,igcm_ccnco2_mass)
     668     &             *0.75/pi/rho_dust
     669     &             / zq(ig,l,igcm_ccnco2_number)
     670              rdust(ig,l)= rdust(ig,l)**(1./3.)           
     671              rdust(ig,l)=max(1.e-10,rdust(ig,l))
     672              !rdust(ig,l)=min(5.e-6,rdust(ig,l))
     673   
     674              riceco2(ig,l)=( zq(ig,l,igcm_co2_ice)*3.0/
     675     &             (4.0*rho_ice_co2*zq(ig,l,igcm_ccnco2_number)
     676     &             *pi*tauscaling(ig)) +rdust(ig,l)*rdust(ig,l)
     677     &             *rdust(ig,l) )**(1.0/3.0)
     678              !Niceco2 = zq(ig,l,igcm_co2_ice)
     679              !Qccnco2 = zq(ig,l,igcm_ccnco2_mass)
     680              !Nccnco2 = zq(ig,l,igcm_ccnco2_number)
     681c             
     682c              call updaterice_microCO2(Niceco2,Qccnco2,Nccnco2,
     683c     &             tauscaling(ig),riceco2(ig,l),rhocloudco2(ig,l))
    649684       
    650 
    651         ENDDO                   ! of ig loop
    652       ENDDO                     ! of nlayer loop
     685              if ((zq(ig,l,igcm_co2_ice).le. 1.e-23)
     686     &             .or.(riceco2(ig,l) .le. rdust(ig,l))) then
     687                 
     688c        write(*,*) "Riceco2 improved before reset=",riceco2(ig,l)
     689c        write(*,*) "Niceco2 improved before reset=",
     690c     &       zq(ig,l,igcm_co2_ice)
     691c        write(*,*) "Rdust improved before reset=",rdust(ig,l)
     692               
     693                 if (memdMMccn(ig,l) .gt. 0) then
     694                    zq(ig,l,igcm_ccn_mass)=zq(ig,l,igcm_ccn_mass)
     695     &                   +memdMMccn(ig,l)
     696                 endif
     697                 if (memdMMh2o(ig,l) .gt. 0) then
     698                    zq(ig,l,igcm_h2o_ice)=zq(ig,l,igcm_h2o_ice)
     699     &                   +memdMMh2o(ig,l)
     700                 endif
     701                 
     702                 if (memdNNccn(ig,l) .gt. 0) then
     703                    zq(ig,l,igcm_ccn_number)=zq(ig,l,igcm_ccn_number)
     704     &                   +memdNNccn(ig,l)
     705                 endif
     706                 
     707                 if (zq(ig,l,igcm_ccnco2_mass) .gt. 1.e-30) then
     708                    zq(ig,l,igcm_dust_mass) =
     709     &                   zq(ig,l,igcm_dust_mass)
     710     &                   + zq(ig,l,igcm_ccnco2_mass)-
     711     &                   (memdMMh2o(ig,l)+memdMMccn(ig,l))
     712                 endif
     713                 if (zq(ig,l,igcm_ccnco2_number) .gt. 1.e-30) then
     714                    zq(ig,l,igcm_dust_number) =
     715     &                   zq(ig,l,igcm_dust_number)
     716     &                   + zq(ig,l,igcm_ccnco2_number)-memdNNccn(ig,l)
     717                 endif
     718                 
     719                 if (zq(ig,l,igcm_co2_ice) .gt. 1.e-30) then
     720                    zq(ig,l,igcm_co2) = zq(ig,l,igcm_co2)
     721     &                   + zq(ig,l,igcm_co2_ice)
     722                 endif
     723                 
     724                 zq(ig,l,igcm_ccnco2_mass)=0.
     725                 zq(ig,l,igcm_co2_ice)=0.
     726                 zq(ig,l,igcm_ccnco2_number)=0.
     727                 memdNNccn(ig,l)=0.
     728                 memdMMh2o(ig,l)=0.
     729                 memdMMccn(ig,l)=0.
     730                 riceco2(ig,l)=0.
     731                 pdtcloudco2(ig,l)=0.
     732              endif
     733       
     734           ENDIF                ! of if NCCN > 1
     735           ENDDO                ! of ig loop
     736        ENDDO                   ! of nlayer loop
    653737   
    654738     
     
    661745     &     (zq(1:ngrid,1:nlay,igcm_co2_ice) -
    662746     &     zq0(1:ngrid,1:nlay,igcm_co2_ice))/ptimestep
    663 c      do l=1,nlay
    664 c         write(*,*) "end imp",pdqcloudco2(1,l,igcm_co2),
    665 c     &        pdqcloudco2(1,l,igcm_co2_ice)
    666 c      enddo
     747
     748      pdqcloudco2(1:ngrid,1:nlay,igcm_h2o_ice) =
     749     &     (zq(1:ngrid,1:nlay,igcm_h2o_ice) -
     750     &     zq0(1:ngrid,1:nlay,igcm_h2o_ice))/ptimestep
     751
     752      pdqcloudco2(1:ngrid,1:nlay,igcm_ccn_mass) =
     753     &     (zq(1:ngrid,1:nlay,igcm_ccn_mass) -
     754     &     zq0(1:ngrid,1:nlay,igcm_ccn_mass))/ptimestep
     755
     756      pdqcloudco2(1:ngrid,1:nlay,igcm_ccn_number) =
     757     &     (zq(1:ngrid,1:nlay,igcm_ccn_number) -
     758     &     zq0(1:ngrid,1:nlay,igcm_ccn_number))/ptimestep
     759
    667760      pdqcloudco2(1:ngrid,1:nlay,igcm_ccnco2_mass) =
    668761     &     (zq(1:ngrid,1:nlay,igcm_ccnco2_mass) -
     
    672765     &     (zq(1:ngrid,1:nlay,igcm_ccnco2_number) -
    673766     &     zq0(1:ngrid,1:nlay,igcm_ccnco2_number))/ptimestep
    674     
     767   
    675768 
    676       if (scavenging) then
     769c      if (scavenging) then
    677770         
    678771         pdqcloudco2(1:ngrid,1:nlay,igcm_dust_mass) =
    679772     &        (zq(1:ngrid,1:nlay,igcm_dust_mass) -
    680773     &        zq0(1:ngrid,1:nlay,igcm_dust_mass))/ptimestep
     774 
    681775         pdqcloudco2(1:ngrid,1:nlay,igcm_dust_number) =
    682776     &        (zq(1:ngrid,1:nlay,igcm_dust_number) -
    683777     &        zq0(1:ngrid,1:nlay,igcm_dust_number))/ptimestep
    684       endif   
    685      
    686 c      call WRITEdiagfi(ngrid,"Improvedb","co2 traceur","kg/kg",1,
    687 c     &    zq0(1,:,igcm_co2_ice) )
    688    
    689 c      call WRITEdiagfi(ngrid,"Improveda","co2 traceur","kg/kg",1,
    690 c     &    zq(1,:,igcm_co2_ice) )
    691      
    692    
    693          
    694          
    695 c     call WRITEdiagfi(ngrid,"satuco2","satu co2 in improved","kg/kg",1,
    696 c     &     satu)
    697 
    698      
    699 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    700 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    701 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    702       IF (test_flag) then
    703      
    704 !       error2d(:) = 0.
    705        DO l=1,nlay
    706        DO ig=1,ngrid
    707 !         error2d(ig) = max(abs(error_out(ig,l)),error2d(ig))
    708           satubf(ig,l) = zq0(ig,l,igcm_co2)/zqsat(ig,l)   ! att. if zqsat=mmr or psat
    709           satuaf(ig,l) = zq(ig,l,igcm_co2)/zqsat(ig,l)
    710        ENDDO
    711        ENDDO
    712 
    713        write(*,*) 'count is ',countcells, ' i.e. ',
    714      &      countcells*100/(nlay*ngrid), '% for microphys computation'
    715 
    716 !      IF (ngrid.ne.1) THEN ! 3D
    717 !         call WRITEDIAGFI(ngrid,"satu","ratio saturation","",3,
    718 !     &                    satu_out)
    719 !         call WRITEDIAGFI(ngrid,"dM","ccn variation","kg/kg",3,
    720 !     &                    dM_out)
    721 !         call WRITEDIAGFI(ngrid,"dN","ccn variation","#",3,
    722 !     &                    dN_out)
    723 !         call WRITEDIAGFI(ngrid,"error","dichotomy max error","%",2,
    724 !     &                    error2d)
    725 !         call WRITEDIAGFI(ngrid,"zqsat","zqsat","kg",3,
    726 !     &                    zqsat)
    727 !      ENDIF
    728 
    729 !      IF (ngrid.eq.1) THEN ! 1D
    730 !         call WRITEDIAGFI(ngrid,"error","incertitude sur glace","%",1,
    731 !     &                    error_out)
    732 !         call WRITEdiagfi(ngrid,"resist","resistance","s/m2",1,
    733 !     &                    res_out)
    734          call WRITEdiagfi(ngrid,"satu_bf","satu before","kg/kg",1,
    735      &                    satubf)
    736          call WRITEdiagfi(ngrid,"satu_af","satu after","kg/kg",1,
    737      &                    satuaf)
    738          call WRITEdiagfi(ngrid,"vapbf","CO2vap before","kg/kg",1,
    739      &                    zq0(1,1,igcm_co2))
    740          call WRITEdiagfi(ngrid,"vapaf","CO2vap after","kg/kg",1,
    741      &                    zq(1,1,igcm_co2))
    742          call WRITEdiagfi(ngrid,"icebf","CO2ice before","kg/kg",1,
    743      &                    zq0(1,1,igcm_co2_ice))
    744          call WRITEdiagfi(ngrid,"iceaf","CO2ice after","kg/kg",1,
    745      &                    zq(1,1,igcm_co2_ice))
    746          call WRITEdiagfi(ngrid,"ccnbf","ccn before","/kg",1,
    747      &                    zq0(1,1,igcm_ccnco2_number))
    748          call WRITEdiagfi(ngrid,"ccnaf","ccn after","/kg",1,
    749      &                    zq(1,1,igcm_ccnco2_number))
    750 c         call WRITEDIAGFI(ngrid,"growthrate","growth rate","m^2/s",1,
    751 c     &                    gr_out)
    752 c         call WRITEDIAGFI(ngrid,"nuclearate","nucleation rate","",1,
    753 c     &                    rate_out)
    754 c         call WRITEDIAGFI(ngrid,"dM","ccn variation","kg",1,
    755 c     &                    dM_out)
    756 c         call WRITEDIAGFI(ngrid,"dN","ccn variation","#",1,
    757 c     &                    dN_out)
    758 c         call WRITEdiagfi(ngrid,"zqsat","p vap sat","kg/kg",1,
    759 c     &                    zqsat)
    760 !         call WRITEDIAGFI(ngrid,"satu","ratio saturation","",1,
    761 !     &                    satu_out)
    762 !         call WRITEDIAGFI(ngrid,"rdust_sca","rdust","m",1,
    763 !     &                    rdust)
    764 !         call WRITEDIAGFI(ngrid,"rsedcloud","rsedcloud","m",1,
    765 !     &                    rsedcloud)
    766 !         call WRITEDIAGFI(ngrid,"rhocloud","rhocloud","kg.m-3",1,
    767 !     &                    rhocloud)
    768 !      ENDIF
    769      
    770       ENDIF ! endif test_flag
    771 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    772 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    773 !!!!!!!!!!!!!! TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS TESTS OUTPUTS
    774    
     778c      endif   
     779     
    775780      return
    776781      end
     
    778783     
    779784     
    780 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc     
    781 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc     
    782 c The so -called "phi" function is such as phi(r) - phi(r0) = t - t0
    783 c It is an analytical solution to the ice radius growth equation,
    784 c with the approximation of a constant 'reduced' cunningham correction factor
    785 c (lambda in growthrate.F) taken at radius req instead of rice   
    786 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc     
    787 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
    788 
    789 c      subroutine phi(rice,req,coeff1,coeff2,time)
    790 c     
    791 c      implicit none
    792 c     
    793 c      ! inputs
    794 c      real rice ! ice radius
    795 c      real req  ! ice radius at equilibirum
    796 c      real coeff1  ! coeff for the log
    797 c      real coeff2  ! coeff for the arctan
    798 c
    799 c      ! output     
    800 c      real time
    801 c     
    802 c      !local
    803 c      real var
    804 c     
    805 c      ! 1.73205 is sqrt(3)
    806 c     
    807 c      var = max(
    808 c     &  abs(rice-req) / sqrt(rice*rice + rice*req  + req*req),1e-30)
    809 c           
    810 c       time =
    811 c     &   coeff1 *
    812 c     &   log( var )
    813 c     & + coeff2 * 1.73205 *
    814 c     &   atan( (2*rice+req) / (1.73205*req) )
    815 c     
    816 c      return
    817 c      end
    818      
    819      
    820      
  • trunk/LMDZ.MARS/libf/phymars/initracer.F

    r1660 r1685  
    375375      rho_dust=2500.  ! Mars dust density (kg.m-3)
    376376      rho_ice=920.    ! Water ice density (kg.m-3)
    377       rho_ice_co2=1500. !dry ice density (kg.m-3), varies with T from 0.98 to 1.5 see Satorre et al., PSS 2008
     377      rho_ice_co2=1650.
     378      !Mangan et al., Icarus 2017 :CO2 density = 1.72391-2.53×10−4T – 2.87×10−6T^2
    378379      nuice_ref=0.1   ! Effective variance nueff of the
    379380                      ! water-ice size distribution
     
    527528        alpha_lift(igcm_co2) =0.
    528529        alpha_devil(igcm_co2)=0.
    529         radius(igcm_co2_ice)=1.e-6
     530        radius(igcm_co2_ice)=1.e-8
    530531        rho_q(igcm_co2_ice)=rho_ice_co2
    531532        alpha_lift(igcm_co2_ice) =0.
  • trunk/LMDZ.MARS/libf/phymars/massflowrateCO2.F

    r1620 r1685  
    5252
    5353         
    54       Tcm = dble(T)    ! initialize pourquoi 0 et pas t(i)
     54      Tcm = 0!dble(T)    ! initialize pourquoi 0 et pas t(i)
    5555
    5656      T_inf = 0d0
    57       T_sup = 200d0
     57      T_sup = 800d0
    5858
    5959      T_dT = 0.1  ! precision - mettre petit et limiter nb iteration?
  • trunk/LMDZ.MARS/libf/phymars/microphys.h

    r1617 r1685  
    2222      DOUBLE PRECISION, PARAMETER :: mn2 = 28.01d-3
    2323!     Effective CO2 gas molecular radius (m)
    24       DOUBLE PRECISION, PARAMETER :: molco2 = 2.2d-10
     24  !    bachnar 2016 value :1.97d-10   ! old value = 2.2d-10
     25      DOUBLE PRECISION, PARAMETER :: molco2 = 1.97d-10
    2526!     Effective H2O gas molecular radius (m)
    2627      DOUBLE PRECISION, PARAMETER :: molh2o = 1.2d-10
     
    5455!CO2 part
    5556!      number of bins for nucleation
    56       INTEGER, PARAMETER :: nbinco2_cld=40
     57      INTEGER, PARAMETER :: nbinco2_cld=100
    5758!     Surface tension of ice/vapor (J.m-2)
    5859      DOUBLE PRECISION, PARAMETER :: sigco2 = 0.08
     
    6061!       water on a dust-like substrate
    6162!       (J/molecule)
    62       DOUBLE PRECISION, PARAMETER :: desorpco2 = 3.25e-20
     63      DOUBLE PRECISION, PARAMETER ::desorpco2=3.07e-20
     64!     bachnar 2016 value 3.07d-20
     65!old value 3.20e-20
    6366!     Jump frequency of a co2 molecule (s-1)
    6467      DOUBLE PRECISION, PARAMETER :: nusco2 =  2.9e+12
     
    7174!     Contact parameter ( m=cos(theta) )
    7275!       (initialized in improvedCO2clouds.F)
    73        REAL, parameter :: mtetaco2 = 0.952
     76!    bachnar 2016 value :0.78
     77!old value 0.952
     78      REAL, parameter :: mtetaco2 = 0.78
    7479!     Volume of a co2 molecule (m3)
    7580       DOUBLE PRECISION :: vo1co2
    7681!     Radius used by the microphysical scheme (m)
    7782      DOUBLE PRECISION :: rad_cldco2(nbinco2_cld)
    78        REAL, parameter :: threshJA = 1.0
     83       REAL, parameter :: threshJA = 1
    7984!     COMMON/microphys/vo1co2,rad_cldco2
    8085
  • trunk/LMDZ.MARS/libf/phymars/nucleaCO2.F

    r1617 r1685  
    22*                                                     *
    33      subroutine nucleaCO2(pco2,temp,sat,n_ccn,nucrate,
    4      &           n_ccn_h2oice,rad_h2oice,nucrate_h2oice)
     4     &           n_ccn_h2oice,rad_h2oice,nucrate_h2oice,
     5     &           vo2co2)
    56      USE comcstfi_h
    67
     
    2425
    2526c     Inputs
    26       DOUBLE PRECISION pco2,sat
     27      DOUBLE PRECISION pco2,sat,vo2co2
    2728      DOUBLE PRECISION n_ccn(nbinco2_cld), n_ccn_h2oice(nbinco2_cld)
    2829      REAL temp
     
    4950c     double precision xratio
    5051     
    51       double precision mtetalocal ! local mteta in double precision
     52      double precision mtetalocal,mtetalocalh ! local mteta in double precision
    5253
    5354      double precision fshapeco2simple,zefshapeco2
     
    6364
    6465      mtetalocal = dble(mtetaco2)  !! use mtetalocal for better performance
     66      mtetalocalh=dble(mteta)
    6567
    6668cccccccccccccccccccccccccccccccccccccccccccccccccc
     
    99101
    100102        nco2   = pco2 / kbz / temp
    101         rstar  = 2. * sigco2 * vo1co2 / (kbz*temp*dlog(sat))
    102         gstar  = 4. * pi * (rstar * rstar * rstar) / (3.*vo1co2)
     103        rstar  = 2. * sigco2 * vo2co2 / (kbz*temp*dlog(sat))
     104        gstar  = 4. * pi * (rstar * rstar * rstar) / (3.*vo2co2)
    103105       
    104106       fshapeco2simple = (2.+mtetalocal)*(1.-mtetalocal)*(1.-mtetalocal)
     
    152154
    153155          if (rad_h2oice(i).gt.3000.*rstar) then
    154             zefshapeco2 = fshapeco2simple
    155           else
    156             zefshapeco2 = fshapeco2(mtetalocal,rad_h2oice(i)/rstar) ! same m for dust/h2o ice
     156            zefshapeco2 = (2.+mtetalocalh)*(1.-mtetalocalh)*
     157     &                (1.-mtetalocalh) / 4.
     158          else
     159            zefshapeco2 = fshapeco2(mtetalocalh,rad_h2oice(i)/rstar) ! same m for dust/h2o ice
    157160          endif
    158161
  • trunk/LMDZ.MARS/libf/phymars/physiq_mod.F

    r1684 r1685  
    11641164     &           pq,pdq,zdqcloudco2,zdtcloudco2,
    11651165     &           nq,tau,tauscaling,rdust,rice,riceco2,nuice,
    1166      &           rsedcloudco2,rhocloudco2,zzlev,zdqssed_co2)
     1166     &           rsedcloudco2,rhocloudco2,
     1167     &           rsedcloud,rhocloud,zzlev,zdqssed_co2)
    11671168               
    11681169
Note: See TracChangeset for help on using the changeset viewer.