source: trunk/LMDZ.PLUTO/libf/phypluto/cocloud.F90 @ 3501

Last change on this file since 3501 was 3252, checked in by afalco, 16 months ago

Pluto PCM:
Fixed 1d ch4 and co
AF

File size: 8.6 KB
Line 
1       SUBROUTINE cocloud(ngrid,nlay,naersize, ptimestep,   &
2                     pplev,pplay,pdpsrf,pzlev,pzlay,pt,pdt,   &
3                     pq,pdq,pdqcloud,pdqscloud,pdtcloud,  &
4                     nq,rice_co)
5
6      use comgeomfi_h
7      use comcstfi_mod, only: pi, g, cpp
8      use tracer_h, only: igcm_co_gas, igcm_co_ice, rho_co_ice, lw_co
9      use callkeys_mod, only: Nmix_co
10
11      IMPLICIT NONE
12
13!=======================================================================
14!     Treatment of saturation of CARBON MONOXIDE
15!
16!
17!     Modif de zq si saturation dans l'atmosphere
18!     si zq(ig,l)> zqsat(ig,l) ->    zq(ig,l)=zqsat(ig,l)
19!     Le test est effectue de bas en haut. CO condensee
20!    (si saturation) est remise dans la couche en dessous.
21!     CO condensee dans la couche du bas est deposee a la surface
22!
23!
24!=======================================================================
25
26!-----------------------------------------------------------------------
27!   declarations:
28!   -------------
29
30
31!   Inputs:
32!   ------
33
34      INTEGER ngrid,nlay
35      REAL ptimestep             ! pas de temps physique (s)
36      REAL pplev(ngrid,nlay+1)   ! pression aux inter-couches (Pa)
37      REAL pplay(ngrid,nlay)     ! pression au milieu des couches (Pa)
38      REAL pdpsrf(ngrid)         ! tendance surf pressure
39      REAL pzlev(ngrid,nlay+1)   ! altitude at layer boundaries
40      REAL pzlay(ngrid,nlay)     ! altitude at the middle of the layers
41      REAL pt(ngrid,nlay)        ! temperature at the middle of the layers (K)
42      REAL pdt(ngrid,nlay)       ! tendance temperature des autres param.
43
44      real pq(ngrid,nlay,nq)     ! traceur (kg/kg)
45      real pdq(ngrid,nlay,nq)    ! tendance avant condensation  (kg/kg.s-1)
46      integer naersize   ! nombre de traceurs radiativement actifs (=naerkind)
47      integer nq         ! nombre de traceurs
48
49!   Outputs:
50!   -------
51
52      real pdqcloud(ngrid,nlay,nq) ! tendance de la condensation CO(kg/kg.s-1)
53      real pdqscloud(ngrid,nq)     ! flux en surface (kg.m-2.s-1)
54      REAL pdtcloud(ngrid,nlay)    ! tendance temperature due
55                                   !   a la chaleur latente
56
57      REAL rice_co(ngrid,nlay)    ! Ice mass mean radius (m)
58                               ! (r_c in montmessin_2004)
59
60!   local:
61!   ------
62!      REAL Nmix   ! Cloud condensation nuclei
63!      parameter (Nmix=1.E2)  ! /kg
64!      parameter (Nmix=1)  ! /kg
65      real rnuclei  ! Nuclei geometric mean radius (m)
66      parameter (rnuclei=2.E-7)  ! m
67
68      REAL CBRT
69      EXTERNAL CBRT
70      INTEGER ig,l
71
72
73      REAL zq(ngrid,nlay,nq)  ! local value of tracers
74      REAL zq0(ngrid,nlay,nq) ! local initial value of tracers
75      REAL zqsat(ngrid,nlay)    ! saturation
76      REAL zt(ngrid,nlay)       ! local value of temperature
77
78      REAL vecnull(ngrid*nlay)
79
80      REAL masse (ngrid,nlay)
81      REAL epaisseur (ngrid,nlay)
82!      REAL rfinal        ! Ice crystal radius after condensation(m)
83      REAL*8 dzq           ! masse de glace echangee (kg/kg)
84      REAL lw       !Latent heat of sublimation (J.kg-1)
85
86
87      LOGICAL,SAVE :: firstcall=.true.
88
89! indexes of co gas, co ice and dust tracers:
90      INTEGER,SAVE :: i_co=0  ! co gas
91      INTEGER,SAVE :: i_ice=0  ! co ice
92
93!    ** un petit test de coherence
94!       --------------------------
95
96      IF (firstcall) THEN
97        IF(ngrid.NE.ngrid) THEN
98            PRINT*,'STOP dans cocloud'
99            PRINT*,'probleme de dimensions :'
100            PRINT*,'ngrid  =',ngrid
101            PRINT*,'ngrid  =',ngrid
102            STOP
103        ENDIF
104
105        if (nq.gt.nq) then
106           write(*,*) 'stop in cocloud (nq.gt.nq)!'
107           write(*,*) 'nq=',nq,' nq=',nq
108           stop
109        endif
110
111! MELANIE : change these line
112        i_co=igcm_co_gas
113        i_ice=igcm_co_ice
114
115        write(*,*) "cocloud: i_co=",i_co
116        write(*,*) "         i_ice=",i_ice
117
118        firstcall=.false.
119      ENDIF ! of IF (firstcall)
120
121
122!-----------------------------------------------------------------------
123!    1. initialisation
124!    -----------------
125
126!    On "update" la valeur de q(nq) (co vapor) et temperature.
127!    On effectue qqes calculs preliminaires sur les couches :
128!    masse (kg.m-2), epaisseur(m).
129
130      do l=1,nlay
131        do ig=1,ngrid
132          zq(ig,l,i_co)=pq(ig,l,i_co)+pdq(ig,l,i_co)*ptimestep
133          zq(ig,l,i_co)=max(zq(ig,l,i_co),1.E-30) ! FF 12/2004
134          zq0(ig,l,i_co)=zq(ig,l,i_co)
135          zt(ig,l)=pt(ig,l)+ pdt(ig,l)*ptimestep
136          masse(ig,l)=(pplev(ig,l) - pplev(ig,l+1)) /g
137          epaisseur(ig,l)= pzlev(ig,l+1) - pzlev(ig,l)
138
139          zq(ig,l,i_ice)=pq(ig,l,i_ice)+pdq(ig,l,i_ice)*ptimestep
140          zq(ig,l,i_ice)=max(zq(ig,l,i_ice),0.) ! FF 12/2004
141          zq0(ig,l,i_ice)=zq(ig,l,i_ice)
142
143        enddo
144      enddo
145      pdqscloud(1:ngrid,1:nq)=0
146      pdqcloud(1:ngrid,1:nlay,1:nq)=0
147      pdtcloud(1:ngrid,1:nlay)=0
148      vecnull(:)=0
149
150!    ----------------------------------------------
151!
152!
153!       Rapport de melange a saturation dans la couche l : -------
154!       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
155!         do l=1,nlay
156!          do ig=1,ngrid
157!             call cosat(zt(ig,l),pplay(ig,l),zqsat(ig,l))
158!             write(101,*)'qsat',qsat(ig,l)
159!          enddo
160!         enddo
161
162         call cosat(ngrid*nlay,zt,pplay,zqsat,vecnull,vecnull)
163!        TEMPORAIRE :
164!        test sans condensation atmospherique
165!        do l=1,nlay
166!         do ig=1,ngrid
167!           zqsat(ig,l) = zqsat(ig,l) *1000.
168!         end do
169!        end do
170!         call WRITEDIAGFI(ngrid,"qsat_co","qsat_co","unit",3,zqsat)
171!          do l=1,nlay
172!            do ig=1,ngrid
173!             zqsat(ig,l)=0.117*exp((16*568.7/8.314)*(1/90.7
174!     &         -1/zt(ig,l)))*100000
175!             zqsat(ig,l)=(zqsat(ig,l)/pplay(ig,l))*(16/28)
176!              write(106,*)'zqsat',zqsat(ig,l)
177!            enddo ! of do ig=1,ngrid
178!          enddo ! of do l=1,nlay
179
180!       taux de condensation (kg/kg/s-1) dans les differentes couches
181!       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
182
183        do l=1,nlay
184          do ig=1,ngrid
185!           call cosat(zt(ig,l),pplay(ig,l),zqsat(ig,l))
186           if (zq(ig,l,i_co).ge.zqsat(ig,l))then  !  Condensation
187             dzq=zq(ig,l,i_co)-zqsat(ig,l)
188           elseif(zq(ig,l,i_co).lt.zqsat(ig,l))then  ! Sublimation
189             dzq=-min(zqsat(ig,l)-zq(ig,l,i_co),zq(ig,l,i_ice))
190           endif
191
192!           CO Mass change
193!           ~~~~~~~~~~~~~~~~~
194            zq(ig,l,i_ice)=zq(ig,l,i_ice)+dzq
195            zq(ig,l,i_co)=zq(ig,l,i_co)-dzq
196            rice_co(ig,l)=max( CBRT ( (zq(ig,l,i_ice)/rho_co_ice  &
197            +Nmix_co*(4./3.)*pi*rnuclei**3.) &
198            /(Nmix_co*4./3.*pi) ), rnuclei)  ! CBRT=cube root
199            enddo ! of do ig=1,ngrid
200          enddo ! of do l=1,nlay
201
202!         Saturation couche nlay a 2 :
203!         ~~~~~~~~~~~~~~~~~~~~~~~~~~
204!         do l=nlay,2, -1
205!          do ig=1,ngrid
206!           if (zq(ig,l,i_co).gt.zqsat(ig,l))then
207!             zq(ig,l-1,i_co)= zq(ig,l-1,i_co)+
208!     &                          (zq(ig,l,i_co)-zqsat(ig,l))
209!     &          *(pplev(ig,l)-pplev(ig,l+1))/(pplev(ig,l-1)-pplev(ig,l))
210!             zq(ig,l,i_co)=zqsat(ig,l)
211!           endif
212!          enddo
213!         enddo
214
215!       Saturation couche l=1 si pas iceparty
216!       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
217!         do ig=1,ngrid
218!           if (zq(ig,1,i_co).gt.zqsat(ig,1))then
219!             pdqscloud(ig,i_ice)=(zq(ig,1,i_co)-zqsat(ig,1))
220!     &           *(pplev(ig,1)-pplev(ig,2))/(g*ptimestep)
221!             zq(ig,1,i_co)=zqsat(ig,1)
222!           endif
223!         enddo
224
225!       Tendance finale
226!       ~~~~~~~~~~~~~~~
227        do l=1, nlay
228          do ig=1,ngrid
229            pdqcloud(ig,l,i_co)=(zq(ig,l,i_co)  &
230                                   -zq0(ig,l,i_co))/ptimestep
231            pdqcloud(ig,l,i_ice) =  &
232             (zq(ig,l,i_ice) - zq0(ig,l,i_ice))/ptimestep
233
234            lw=lw_co
235            pdtcloud(ig,l)=-pdqcloud(ig,l,i_co)*lw/cpp
236          end do
237        end do
238
239!       A correction if a lot of subliming co fills the 1st layer FF04/2005
240!       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
241!       Then that should not affect the ice particle radius
242        do ig=1,ngrid
243          if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,2)))then
244            if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,3))) &
245           rice_co(ig,2)=rice_co(ig,3)
246            rice_co(ig,1)=rice_co(ig,2)
247          end if
248        end do
249
250!**************************************************
251!       Output --- removed
252!**************************************************
253! NB: for diagnostics use zq(), the updated value of tracers
254!         Computing ext visible optical depth  in each layer
255
256      RETURN
257      END
258
Note: See TracBrowser for help on using the repository browser.