source: trunk/LMDZ.TITAN/libf/phytitan/muphys3D.F @ 201

Last change on this file since 201 was 176, checked in by slebonnois, 14 years ago

SLebonnois: petite correction pour pouvoir tourner avec clouds=0
sans etre embetes par ntype

File size: 15.9 KB
Line 
1         subroutine muphys(ngrid,
2     &   plev,play,zlev,zlay,
3     &   tpt,tq,gaz1,gaz2,gaz3,
4     &   nmicro,ptimestep,
5     &   pmu0,pfract,     
6*    Sorties diagnostiques
7     &   flxesp_i,
8     &   tau_drop,tau_aer,
9     &   solesp,prec)
10
11c
12c
13c  CETTE NOUVELLE ROUTINE DE MICROPHYSIQUE GERE
14c  LA MICROPHYSIQUE DES AEROSOLS ET CELLE DES NUAGES
15c  EN UN SEUL APPEL...
16c
17c  TOUS LES TRACEURS AEROSOL+NOYAUX+2*GLACES SONT CONTENUS DANS
18c  LE TABLEAU TQ ET LEUR TENDANCES DANS TDQ. CES TABLEAUX
19c  SONT COMPOSES DE TROIS PARTIES:
20c
21c       TQ(         1,    nmicro/4      pour les aerosols
22c        +   nmicro/4+1,  2*nmicro/4      pour les noyaux 
23c        + 2*nmicro/4+1,  3*nmicro/4      pour la glace 1
24c        + 3*nmicro/4+1,    nmicro   )    pour la glace 2
25c
26c  pour les aerosols, les noyaux, la glace 1 et la glace 2. la separation
27c  puis la concatenation de fait juste avant l'appel aux routines
28c  dans lesquels la separation est necessaire.
29c
30c                                            _______
31c                                            |     |  ____
32c  EX:         -------->    QAER()    ---->  | M   |      \
33c            /                               | I   |       \
34c           /                                | C   |        \
35c      TQ()  ---------->    QGLACE1()  --->  | R   |  ------  TDQ()
36c           \                                | O   |        /
37c            \                               | P   |       /
38c              -------->    QGLACE2() ---->  | H   |  ----/
39c              \                             | Y   |     /
40c               \                            |     |    /
41c                 ----->    QNOYAUX()        |     |  _/
42c                                            |     |
43c                                            -------
44c
45c
46c
47c  DANS LA MICROPHYSIQUE, SE TROUVENT IMBRIQUES LES PROCESSUS SUIVANTS
48c
49c
50c
51c
52c
53c   NUCLEATION/SEDIMENTATION   ---> n_ethane.F / n_methane.F
54c
55c   MICROPHYSIQUE AEROSOLS     ---> brume.F
56c
57c   SEDIMENTATION DES GOUTTES  ---> snuages.F
58c
59c
60c
61c
62c
63c
64c------------------------------------------------------
65         use dimphy
66         IMPLICIT NONE
67#include "dimensions.h"
68#include "microtab.h"
69#include "varmuphy.h"
70#include "clesphys.h"
71#include "itemps.h"
72
73         integer ngrid
74
75         integer iq,nmicro
76
77         common/part/vaer,raer,vrat,draer,dvaer
78         real   vaer(nrad),raer(nrad),vrat,
79     &          draer(nrad),dvaer(nrad)
80
81         real   ptimestep
82 
83         real  pdpsrf(ngrid)
84
85c*************************************
86c declaration des variables internes *
87c*************************************
88 
89c      sources     *
90c------------------*
91
92         REAL plev(ngrid,klev+1)
93         REAL play(ngrid,klev)
94         REAL zlev(ngrid,klev+1)
95         REAL zlay(ngrid,klev)
96         REAL pu(ngrid),pv(ngrid)
97         REAL pmu0(ngrid),pfract(ngrid)
98         REAL tpt(ngrid,klev)
99         REAL tq(ngrid,klev,nmicro),
100     &        gaz1(ngrid,klev),
101     &        gaz2(ngrid,klev),
102     &        gaz3(ngrid,klev)
103
104c       OUTPUT !!!!! c
105c  note : gaz1,...,gazN sont aussi des outputs, ils ont modifié tout au long de muphys.
106c--------------------c
107         REAL pdq(ngrid,klev,nmicro)
108         REAL flxesp_i(ngrid,klev,3)    ! flx esp GLACE
109         REAL solesp(ngrid,klev+1,3)    ! tx prod glace (puit/source)  ! ind klev+1 = surface ?
110         REAL tau_drop(ngrid,klev)
111         REAL tau_aer(ngrid,klev,nrad)
112         REAL prec(ngrid,5)
113
114c       LOCAL
115c--------------------c
116         real  q(ngrid,klev,nmicro)
117         REAL taused(klev,nrad)
118         integer jsup,jinf,h,jalt,ihor,k
119
120c    microphysique    *
121c---------------------*
122         real c(klev,nrad),  cni(klev,nrad)
123         real c1i(klev,nrad),c2i(klev,nrad),c3i(klev,nrad)
124         real gazc1(klev),gazc2(klev),gazc3(klev)
125         real ddt
126 
127         real vcl,nuc,r,xgsn,xmsn
128         real zz,effg,xlog,rapport
129
130         integer IPREM,i,n,j,l
131         integer ibid
132         save IPREM
133         data IPREM/0/
134
135
136         real ttq(ngrid,klev,nmicro,2)
137         real tttq(ngrid,klev,nmicro,2)
138
139
140c                       **************************
141c                       INITIALISATION DE TABLEAUX
142c                       **************************
143c                         A NE FAIRE QU'UNE FOIS
144c                       **************************
145c
146         IF (IPREM.eq.0) THEN
147 
148           IF (microfi.eq.1) THEN
149             IF (ngrid.ne.jjm+1) THEN
150               print*,"aLeRte :"
151               print*,"microfi en 2D mais ngrid.ne.jjm+1"
152               print*,ngrid,jjm+1
153               stop "je m'arrete..."
154             ENDIF
155           ELSEIF (microfi.eq.2) THEN
156             IF (ngrid.ne.klon) THEN
157               print*,"aLeRte :"
158               print*,"microfi en 3D mais ngrid.ne.klon"
159               print*,ngrid,klon
160               stop "je m'arrete..."
161             ENDIF
162           ENDIF
163
164c initialisation des constantes de la microphysique :
165c ----------------------------------------------
166           call inimphycst()
167           
168
169c initialisation des c(z,r), c1i(z,r), c2i(z,r)
170c ----------------------------------------------
171 
172           do i=1,nmicro
173             do n=1,ngrid
174               do j=klev,1,-1
175                 q(n,klev+1-j,i)=tq(n,j,i)                           ! glaces...
176                 if(i.le.2*nrad) q(n,klev+1-j,i)=tq(n,j,i)*tcorrect  ! noyaux+aerosol
177                 pdq(n,j,i)=0.
178               enddo
179             enddo
180           enddo
181c ici, les tableaux definissant la structure des aerosols sont
182c remplis: rf,df(nmicro),r(nmicro),v(nmicro)......
183           call rdf()
184c   ici on recopie la grille dans un common specifique a la microfi...
185           v_e    = vaer
186           r_e    = raer
187           vrat_e = vrat
188           dr_e   = draer
189           dv_e   = dvaer
190c
191         ELSE   
192 
193c les tq() doivent etre en nombre d'aerosols / cases
194
195           do j=1,klev                        ! j de 1 a 119
196             do n=1,ngrid
197               do  i=1,nmicro
198                 q(n,j,i)=tq(n,klev-j+1,i)
199                 pdq(n,j,i)=0.
200               enddo
201             enddo
202           enddo
203
204         ENDIF  ! FIN IPREM
205
206
207c-----------------------------------------------------
208c      !! La premiere fois, on ne passe pas par
209c      !! q--->c et par pg3.F
210c      !! on passe directement au remplissage c-->q
211         IF (IPREM.eq.0) goto 102
212c-----------------------------------------------------
213
214c****************************************
215c                                       *
216c         ADAPTATION GCM > micro        *
217c                                       *
218c****************************************
219
220
221c correpondance des couches / sens GCM > microphysique
222c-----------------------------------------------------
223c
224         do IHOR=1,NGRID ! GRANDE BOUCLE HORIZONTALE / SEPARATION DES COLONNES
225
226 
227c  Ici, on initialise la grille verticale et les
228c  variables communes aux routines de microphysique.
229c*******************************************************
230           call inimuphy(ihor,plev(ihor,:),play(ihor,:),
231     &                   zlev(ihor,:),zlay(ihor,:),
232     &                   tpt(ihor,:))
233
234c  Ici, on scinde les tableaux aerosols et glaces
235c*******************************************************
236
237         if (clouds.eq.0) then
238           if(nrad .ne. nmicro) then
239             print*,"aLeRte : nrad != nmicro"
240             print*,'nmicro= ',nmicro
241             print*,'nrad= ',nrad
242             stop "je m'arrete..."
243           endif
244         else
245           if(nrad .ne. nmicro/ntype) then
246             print*,"aLeRte : nrad != nmicro/ntype"
247             print*,'nmicro= ',nmicro
248             print*,'ntype=',ntype
249             print*,'nmicro/ntype= ',nmicro/ntype
250             print*,'nrad= ',nrad
251             stop "je m'arrete..."
252           endif
253         endif
254
255           do i=1,nrad
256             do j=1,klev
257               c(j,i)  =q(IHOR,j,i       )/dzb(j) ! concentration aerosols/m^3
258               if (clouds.eq.1) then
259                 cni(j,i)=q(IHOR,j,i+  nrad)/dzb(j) ! concentration noyaux /m^3
260                 c1i(j,i)=q(IHOR,j,i+2*nrad)/dzb(j) ! concentration volume glace/m^3
261                 c2i(j,i)=q(IHOR,j,i+3*nrad)/dzb(j) ! concentration volume glace /m^3
262                 c3i(j,i)=q(IHOR,j,i+4*nrad)/dzb(j) ! concentration volume glace /m^3
263               endif
264             enddo
265           enddo
266           if (clouds.eq.1) then
267             do j=1,klev
268               gazc1(j)  =gaz1(IHOR,klev-j+1)   ! fraction molaire CH4
269               gazc2(j)  =gaz2(IHOR,klev-j+1)   ! fraction molaire C2H6
270               gazc3(j)  =gaz3(IHOR,klev-j+1)   ! fraction molaire C2H2
271             enddo
272           endif
273
274c****************************************
275c
276c  FIN DE LA PREPARATION:
277c
278c
279c  ON  APPELLE LES MODELES MICROPHYSIQUES
280c
281c         - brume (coagulation + sedimentation)
282c         - nuages (nucleation + condensation)
283c         - sedimentation nuages
284c
285c
286c****************************************
287
288
289           do j=1,klev
290             solesp(ihor,klev+1-j,:) = 0.
291             do i=1,nrad
292               tau_aer(ihor,klev+1-j,i)=0.
293             enddo
294           enddo
295
296           ddt=ptimestep
297
298* concerne les aerosols (tableau c):
299c           call begintime(tt0)
300           call brume(ngrid,c,ddt,klev,nrad,taused,ihor,
301     &                pmu0(ihor),pfract(ihor),
302     &                prec)
303c           call endtime(tt0,tt1)
304c           tthaze=tthaze+tt1
305
306* concerne aerosols +  gouttes (tableaux c,cn,c1,c2):
307
308           do j=1,klev
309             do i=1,nrad
310               tau_aer(ihor,klev+1-j,i)=tau_aer(ihor,klev+1-j,i)
311     &                                 +taused(j,i)
312             enddo
313           enddo
314
315           IF (clouds.eq.1) THEN
316         
317c             do j=1,klev
318c             do i=1,nrad
319c               ttq(ihor,klev-j+1,i,1) = c(j,i)*dzb(j)
320c               ttq(ihor,klev-j+1,i+nrad,1) = cni(j,i)*dzb(j)
321c               ttq(ihor,klev-j+1,i+2*nrad,1) = c1i(j,i)*dzb(j)
322c               ttq(ihor,klev-j+1,i+3*nrad,1) = c2i(j,i)*dzb(j)
323c               ttq(ihor,klev-j+1,i+4*nrad,1) = c3i(j,i)*dzb(j)
324c             enddo
325c             enddo
326
327c             call begintime(tt0)
328             call cnuages(c,c1i,c2i,c3i,cni,
329     &                      gazc1,gazc2,gazc3,ddt)
330c             call endtime(tt0,tt1)
331c             ttcclds=ttcclds+tt1
332
333c  verification des valeurs de c,cni,c1i,c2i et c3i.
334c  Lorsque l'on vide completement une case, on peut avoir des chiffres negatifs :s
335           do j=1,klev
336             do i=1,nrad
337               c(j,i)= MAX(c(j,i),0.)
338               cni(j,i)= MAX(cni(j,i),0.)
339               c1i(j,i)= MAX(c1i(j,i),0.)
340               c2i(j,i)= MAX(c2i(j,i),0.)
341               c3i(j,i)= MAX(c3i(j,i),0.)
342c               ttq(ihor,klev-j+1,i,2) = c(j,i)*dzb(j)
343c               ttq(ihor,klev-j+1,i+nrad,2) = cni(j,i)*dzb(j)
344c               ttq(ihor,klev-j+1,i+2*nrad,2) = c1i(j,i)*dzb(j)
345c               ttq(ihor,klev-j+1,i+3*nrad,2) = c2i(j,i)*dzb(j)
346c               ttq(ihor,klev-j+1,i+4*nrad,2) = c3i(j,i)*dzb(j)
347             enddo
348           enddo
349     
350
351           do j=1,klev
352             do i=1,nrad
353               solesp(ihor,klev+1-j,1)=solesp(ihor,klev+1-j,1) +
354     &         (c1i(j,i)-q(IHOR,j,i+2*nrad)/dzb(j))
355               solesp(ihor,klev+1-j,2)=solesp(ihor,klev+1-j,2) +
356     &         (c2i(j,i)-q(IHOR,j,i+3*nrad)/dzb(j))
357               solesp(ihor,klev+1-j,3)=solesp(ihor,klev+1-j,3) +
358     &         (c3i(j,i)-q(IHOR,j,i+4*nrad)/dzb(j))
359             enddo
360           enddo
361
362* concerne les gouttes (tableaux cn,c1,c2):
363
364c             do j=1,klev
365c             do i=1,nrad
366c               tttq(ihor,klev-j+1,i,1) = c(j,i)*dzb(j)
367c               tttq(ihor,klev-j+1,i+nrad,1) = cni(j,i)*dzb(j)
368c               tttq(ihor,klev-j+1,i+2*nrad,1) = c1i(j,i)*dzb(j)
369c               tttq(ihor,klev-j+1,i+3*nrad,1) = c2i(j,i)*dzb(j)
370c               tttq(ihor,klev-j+1,i+4*nrad,1) = c3i(j,i)*dzb(j)
371c             enddo
372c             enddo
373
374c             call begintime(tt0)
375             call snuages(ngrid,cni,c1i,c2i,c3i,c,ddt,
376     &                    klev,nrad,ihor,
377     &                    flxesp_i,tau_drop,prec)
378c             call endtime(tt0,tt1)
379c             ttsclds=ttsclds+tt1
380
381c           do j=1,klev
382c             do i=1,nrad
383c               tttq(ihor,klev-j+1,i,2) = c(j,i)*dzb(j)
384c               tttq(ihor,klev-j+1,i+nrad,2) = cni(j,i)*dzb(j)
385c               tttq(ihor,klev-j+1,i+2*nrad,2) = c1i(j,i)*dzb(j)
386c               tttq(ihor,klev-j+1,i+3*nrad,2) = c2i(j,i)*dzb(j)
387c               tttq(ihor,klev-j+1,i+4*nrad,2) = c3i(j,i)*dzb(j)
388c             enddo
389c           enddo
390           ENDIF    ! flag nuages :)
391
392
393* on recompose le tableau de traceurs ici.
394*--------------------------------------------------
395 
396           do i=1,nrad
397             do j=1,klev
398               q(IHOR,j,i)        =   c(j,i)*dzb(j) ! nombre  aerosols /m^2
399               if (clouds.eq.1) then
400                 q(IHOR,j,i+  nrad) = cni(j,i)*dzb(j) ! nombre noyaux /m^2
401                 q(IHOR,j,i+2*nrad) = c1i(j,i)*dzb(j) ! concentration volume glace/m^2
402                 q(IHOR,j,i+3*nrad) = c2i(j,i)*dzb(j) ! concentration volume glace/m^2
403                 q(IHOR,j,i+4*nrad) = c3i(j,i)*dzb(j) ! concentration volume glace/m^2
404               endif
405             enddo
406           enddo
407           if (clouds.eq.1) then
408             do j=1,klev
409               gaz1(IHOR,klev-j+1) = gazc1(j)   ! fraction molaire
410               gaz2(IHOR,klev-j+1) = gazc2(j)   ! fraction molaire
411               gaz3(IHOR,klev-j+1) = gazc3(j)   ! fraction molaire
412             enddo
413           endif
414
415         ENDDO             ! Fin de la boucle IHOR
416
417102      CONTINUE           ! la premiere fois, c'est une boucle vide!
418
419
420c***************************************************************
421c FIN: on renvoie les nouvelles valeurs q(t+dt)=q(t) + dq(t)
422c
423c Pour les aerosols, les noyaux, les glaces et les vapeurs modifiees...
424c
425c***************************************************************
426
427         do n=1,ngrid
428           do i=1,nmicro
429             do j=1,klev                ! j de 1 a 54
430               tq(n,j,i) = q(n,klev+1-j,i)
431             enddo
432           enddo
433         enddo
434
435 
436c      do j=1,15
437cc       CH4 -- cnuages
438c        write(210,'(I4,3(ES24.16,1X))') j,
439c     &  sum(ttq(40,j,2*nrad+1:3*nrad,1)),
440c     &  sum(ttq(40,j,2*nrad+1:3*nrad,2)),
441c     &  sum(ttq(40,j,2*nrad+1:3*nrad,2))-
442c     &  sum(ttq(40,j,2*nrad+1:3*nrad,1))
443cc       C2H6 -- cnuages
444c        write(211,'(I4,3(ES24.16,1X))') j,
445c     &  sum(ttq(40,j,3*nrad+1:4*nrad,1)),
446c     &  sum(ttq(40,j,3*nrad+1:4*nrad,2)),
447c     &  sum(ttq(40,j,3*nrad+1:4*nrad,2))-
448c     &  sum(ttq(40,j,3*nrad+1:4*nrad,1))
449cc       C2H2 -- cnuages
450c        write(212,'(I4,3(ES24.16,1X))') j,
451c     &  sum(ttq(40,j,4*nrad+1:5*nrad,1)),
452c     &  sum(ttq(40,j,4*nrad+1:5*nrad,2)),
453c     &  sum(ttq(40,j,4*nrad+1:5*nrad,2))-
454c     & sum(ttq(40,j,4*nrad+1:5*nrad,1))
455
456cc       CH4 -- snuages
457c        write(310,'(I4,3(ES24.16,1X))') j,
458c     &  sum(tttq(40,j,2*nrad+1:3*nrad,1)),
459c     &  sum(tttq(40,j,2*nrad+1:3*nrad,2)),
460c     &  sum(tttq(40,j,2*nrad+1:3*nrad,2))-
461c     &  sum(tttq(40,j,2*nrad+1:3*nrad,1))
462cc       C2H6 -- snuages
463c        write(311,'(I4,3(ES24.16,1X))') j,
464c     &  sum(tttq(40,j,3*nrad+1:4*nrad,1)),
465c     &  sum(tttq(40,j,3*nrad+1:4*nrad,2)),
466c     &  sum(tttq(40,j,3*nrad+1:4*nrad,2))-
467c     &  sum(tttq(40,j,3*nrad+1:4*nrad,1))
468cc       C2H2 -- snuages
469c        write(312,'(I4,3(ES24.16,1X))') j,
470c     &  sum(tttq(40,j,4*nrad+1:5*nrad,1)),
471c     &  sum(tttq(40,j,4*nrad+1:5*nrad,2)),
472c     &  sum(tttq(40,j,4*nrad+1:5*nrad,2))-
473c     &  sum(tttq(40,j,4*nrad+1:5*nrad,1))
474c      enddo
475c      write(210,*) "NEWLINE"
476c      write(211,*) "NEWLINE"
477c      write(212,*) "NEWLINE"
478c      write(310,*) "NEWLINE"
479c      write(311,*) "NEWLINE"
480c      write(312,*) "NEWLINE"
481
482
483c       do j=1,20
484c         write(410,'(I4,3(ES24.16,1X))') j,
485c     &   flxesp_i(40,j,1),flxesp_i(40,j,2),flxesp_i(40,j,3) 
486c         write(510,'(I4,3(ES24.16,1X))') j,
487c     &   solesp(40,j,1),solesp(40,j,2),solesp(40,j,3) 
488c       enddo
489c       write(410,*) "NEWLINE"
490c       write(510,*) "NEWLINE"
491
492         IPREM=1       ! LA PROCHAINE FOIS NE SERA PLUS LA 1ERE
493
494
495 16      return 
496
497         end
498
499
500c---------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.