source: trunk/LMDZ.TITAN/libf/phytitan/brume3D.F @ 881

Last change on this file since 881 was 474, checked in by slebonnois, 13 years ago

Update of Titan physics for clouds.

File size: 30.5 KB
RevLine 
[175]1         subroutine brume(ngrid,tab1,x1,
2     &                    xnz,xnrad,taused,ihor,
3     &                    pmu0,pfract,
4     &                    precip)
5
6
7*1  c nombre de particules de la grille de rayon r a l'altitude z
8*2  dt, pas de temps, en heure. 
9
10*--------------------------------------------------------------*
11*                                                              *
12*            ENTRE 0 ET 1000 KILOMETRES                        *     
13*                                                              *
14*    la dimension fractale est en tableau, attention au        *
15*    raccordement entre le regime moleculaire et le regime     *
16*    fluide                                                    *
17*                                                              *
18*    Modele microphysique:    Cabane et al.,1992 /             *
19*    Modele version fractale: Cabane et al.,1993 /             *
20*                                                              *
21*--------------------------------------------------------------*
22* VERSION DU 2 JUIN 1993  --- AUT 1994 --- 11/04/96
23*
24* changer: altitude de production z0=/taux de production ctot=
25*        : la charge/micron, ne
26*        : df(h),rf...
27* raccordement aknc
28*
29* declaration des blocs communs
30*------------------------------
31
32         use dimphy
33         IMPLICIT NONE
34#include "dimensions.h"
35#include "microtab.h"
36#include "varmuphy.h"
37
38
39         real pmu0,pfract
40
41         common/ctps/li,lf,dt
42         common/con/c
43         common/coag/k
44         common/effets/xsaison
45
46 
47* declaration des variables communes
48* ----------------------------------
49
50         integer xnz,xnrad,ngrid
51         integer li,lf,ihor
52         real dt
53         real c0(nz,nrad),c(nz,nrad,2)
54         real k(nz,nrad,nrad),knu
55         real xsaison
56         real taused(nz,nrad)
57         real precip(ngrid,5)
58
59       
60
61*  variables internes
62*  ------------------
63
64         integer h,ti,itime,i,j
65         real tab1(nz,nrad)
66         real x1
67         real somme,v1,dice3
68         
69         real vitesse
70
71         save itime
72         data itime/0/
73
74* initialisation
75* --------------
76
77* effet saisonnier
78* ----------------
79
80
81         xsaison=0.
82         xsaison=pmu0*4.*pfract
83                              !=Pi si fract=1/2 (equinoxe) et
84                              !    si mu0(ihor)=1 sous le soleil
85                              !    exactement.
86
87c        xsaison=0.
88c        if (ihor.le.9.or.ihor.ge.41) xsaison=8.  ! rapport des surfaces
89c        xsaison=1.
90
91* controles
92* ---------
93
94         if (nrad.ne.xnrad)  stop 'nrad.ne.xnrad'
95         if (nz.ne.xnz)    stop 'nz.ne.xnz'
96
97         do i=1,nz
98           do j=1,nrad
99             c(i,j,1)=tab1(i,j)
100             c(i,j,2)=0.0
101           enddo
102         enddo
103
104         dt=x1
105
106         if (itime.eq.0) then
107           ITIME=1
108           call init
109           call calcoag
110         endif
111
112         do i=1,nz,1
113           do j=1,nrad
114             v1=vitesse(i,j,0)
[474]115c             ho que c'est moche ! -> taused = RT/(Mn2*g)*1/vaer = H/v
[175]116             taused(i,j)=(8.314*t(i)/28.e-3/1.35)/v1
117           enddo
118         enddo
119
120         call coagul
121
122         call production(ihor)
123 
124         li=3-li
125         lf=3-lf
126
127         call sedif(dice3)
128c        En theorie, dice3 est NEGATIF (en sedimentant on ne fait que perdre des aerosols)
[474]129c        Les precipitations sont comptees positivement. (ET ON NE PREND QUE DES VALEURS POSITIVES)
130         precip(ihor,5)=AMAX1(-dice3/rhol,0.)    ! m3/m2=m
[175]131
132         li=3-li
133         lf=3-lf
134
135         do i=1,nz
136           do j=1,nrad
137             tab1(i,j)=c(i,j,li)     ! li=1
138           enddo
139         enddo
140         
141         return 
142
143         end
144*________________________________________________________________________
145
146         subroutine coagul
147
148*********************************************************
149* ce programme calcule la nouvelle concentration dans   *
150* le a ieme intervalle de rayon, a l'altitude h, a      *
151* l'instant t+dt                                        *
152*********************************************************
153         use dimphy
154         IMPLICIT NONE
155#include "dimensions.h"
156#include "microtab.h"
157#include "varmuphy.h"
158
159
160* declaration des blocs communs
161*------------------------------
162
163         common/ctps/li,lf,dt
164         common/con/c
165
166* declaration des variables
167* --------------------------
168
169         integer li,lf
170         real dt
171         real c(nz,nrad,2)
172
173* declaration des variables propres au ss-programme
174* -------------------------------------------------
175
176         integer h,a
177         real pr,pe
178
179*  traitement
180*  ----------
181
182         do h=nztop,nz
183           do a=1,nrad
184             call pertpro(h,a,pe,pr)
185c            if((1+dt*pe).lt.0.) stop 'denom.eq.0'
186             c(h,a,lf)=(c(h,a,li)+pr*dt)/(1+dt*pe)
187           enddo
188         enddo
189
190         if (nztop.ne.1) then
191           do h=1,nztop-1
192             do a=1,nrad
193               c(h,a,lf)=c(h,a,li)
194             enddo
195           enddo
196         endif
197
198         return
199         end
200     
201     
202*__________________________________________________________________________
203
204         subroutine  calcoag
205
206***************************************************************
207*                                                             *
208*  Ce programme calcule les coefficients de collection  d'une *
209* particule de rayon x avec une particule de rayon b a une    *
210* altitude donnee h                                           *
211***************************************************************
212
213* declaration des blocs communs
214*------------------------------
215         use dimphy
216         IMPLICIT NONE
217#include "dimensions.h"
218#include "microtab.h"
219#include "varmuphy.h"
220
221         common/ctps/li,lf,dt
222         common/con/c
223         common/coag/k
224
225* declaration des variables
226* --------------------------
227
228         integer li,lf,i
229         real dt
230         real c(nz,nrad,2)
231         real knu,nud,k(nz,nrad,nrad)
232
233* declaration des variables propres au ss-programme
234* -------------------------------------------------
235
236         integer h,b,x
237         real nua,lambb,lambx,knb,knx,alphab,alphax,d,e,f,kcg
238         real db,dx,rm,dm,deltab,deltax,del,g,beta,gx,gb
239         real rfx,rfb,rpr
240         real*8 ne,qe,epso
241         real*8 corelec,yy
242
243         real kco,vx,vb,vitesse,sto,ee,a,dd,bb,p0,t0,l0,ccol
244         real st(37),ef(37)
245
246* initialisation
247* --------------
248c        print*,'**** calcoag'
249
250*  -nombres de STOCKES
251
252         data(st(i),i=1,37)/1.35,1.5,1.65,1.85,2.05,2.25,2.5,2.8,3.1,
253     s    3.35,3.6,3.95,4.3,4.7,5.05,5.45,5.9,6.4,7.,7.6,8.3,9.05,9.9,
254     s       10.9,11.1,13.5,15.3,17.25,20.5,24.5,30.4,39.3,48,57,86.,
255     s       187.,600./
256
257*  -coef. d'efficacite de collection
258
259         ef(1)=3.75
260         ef(2)=8.75
261         do i=3,37
262           ef(i)=ef(i-1)+2.5
263         enddo
264
265         do i=1,37
266           ef(i)=ef(i)*1e-2
267         enddo
268
269         qe=1.6e-19
270         ne=-30.e+6         ! "vieille valeur!"
271         ne=-15.e+6          ! pour fitter DISR !
272
273         epso=1e-9/(36*pi)
274
275         d=1.257
276         e=0.4
277         f=-1.1
278
279*  iteration sur z
280 
281         do 1 h=1,nz
282           nua=nud(h,1)     
283
284*  iteration sur les rayons
285
286           do 1 b=1,nrad
287
288             knb=knu(h,b,1)
289             vb=vitesse(h,b,1)
290
291             do 1 x=1,b
292
293               knx=knu(h,x,1)
294               vx=vitesse(h,x,1)
295
296**  COAGULATION  ****************************************************
297** --------------****************************************************
298* calcul du terme correcteur 'slip-flow'
299
300               alphab=d+e*exp(f/knb)
301               alphax=d+e*exp(f/knx)
302
303* calcul du coefficient de diffusion
304
305               rfb=(r_e(b)**(3./df(b)))*((rf(b))**(1.-3./df(b)))
306               rfx=(r_e(x)**(3./df(x)))*((rf(x))**(1.-3./df(x)))
307               db=kbz*t(h)*(1+alphab*knb)/(6*pi*nua*rfb)
308               dx=kbz*t(h)*(1+alphax*knx)/(6*pi*nua*rfx)
309
310* calcul du coefficient de coagulation
311
312               rpr=rfb+rfx
313               kcg=4*pi*rpr*(db+dx)
314
315* calcul de la vitesse thermique
316
317               gx=sqrt(6*kbz*t(h)/(rhol*pi**2*r_e(x)**3))
318               gb=sqrt(6*kbz*t(h)/(rhol*pi**2*r_e(b)**3))
319
320* calcul du libre parcours apparent des aerosols
321
322               lambb=8*db/(pi*gb)
323               lambx=8*dx/(pi*gx)
324
325*calcul du terme correcteur beta
326
327               rm=rpr/2.
328               dm=(dx+db)/2.
329               g=sqrt(gx**2+gb**2)
330               deltab=(((2*rfb+lambb)**3-(4*rfb**2+lambb**2)**1.5)
331     s         /(6*rfb*lambb)-2*rfb)*sqrt(2.)
332               deltax=(((2*rfx+lambx)**3-(4*rfx**2+lambx**2)**1.5)
333     s         /(6*rfx*lambx)-2*rfx)*sqrt(2.)
334               del=sqrt(deltab**2+deltax**2)
335               beta=1/((rm/(rm+del/2))+(4*dm/(g*rm)))
336
337* calcul du coefficient de coagulation corrige
338
339               kcg=kcg*beta
340c       print*,' kcg:', rfb,rfx,knb,knx,db,dx
341c       print*,' beta:', gx,gb,lambb,lambx,rm,dm
342c       print*,' beta:', g,deltab,deltax,del,beta
343c       print*,' '
344
345**  COALESCENCE  **************************************************
346**  -------------**************************************************
347
348               kco=0.
349
350               if (b.eq.x) goto 9
351
352* calcul du nombre de Stockes de la petite particule
353
354               sto=2*rhol*rfx**2*abs(vx-vb)/(9*nua*rfb)
355
356* calcul du coef. de Cunningham-Millikan
357
358               a=1.246
359               bb=0.42
360               dd=0.87
361               l0=0.653e-7
362               p0=101325.
363               t0=288.
364
365               ee=1+(l0*t(h)*p0*
366     &         (a+bb*exp(-dd*rfx*t0*p(h)/(l0*t(h)*p0))))
367     s         /(rfx*t0*p(h))
368
369* calcul du nombre de Stockes corrige
370
371               sto=sto*ee
372
373               if (sto .le. 1.2) goto 9
374
375               if (sto .ge. 600.) then
376                 ccol=1.
377                 goto 8
378               endif
379
380*  recherche du coefficient de collection
381
382               do 3 i=1,37
383                 if (sto .gt. st(i)) then
384                   goto 3
385                 endif
386                 if (sto .eq. st(i)) then
387                   ccol=ef(i+1)
388                 else
389                   ccol=ef(i)
390                 endif
391                 goto 8
3923              continue
393
394*  calcul du coefficient de coalescence
395
3968              kco=pi*(rfb+rfx)**2*ccol*abs(vb-vx)
397
3989              continue
399
400**  CORRECTION ELECTRICITE *******************************
401**  ------------------------******************************
402
403               yy=1.d0*ne**2*r_e(x)*r_e(b)*qe**2
404     &         /(1.d0*kbz*t(h)*(r_e(b)+r_e(x))*4*pi*epso)
405
406
407               corelec=0.
408               if (yy.lt.50.) corelec=yy/(exp(yy)-1.)
409               if (yy.le.1.e-3)  corelec=1.
410
411               k(h,b,x)=(kcg+kco)*corelec
412               k(h,x,b)=k(h,b,x)
413 
414
4151        continue
416         return
417         end
418
419*______________________________________________________________________
420
421         real function lambda(j,indic)
422*
423*------------------------------------------------------------------*
424*  fonction calculant le libre parcours moyen des molecules        *
425*  atmospheriques( rayon =ra) se trouvant dans la couche no j.     *
426*  pour indic=0  ...... la particule se trouve a la frontiere entre*
427*                        les couches j et j-1                      *
428*  pour indic=1  ...... la particule se trouve au milieu de la     *
429*                         la couche j                              *
430*------------------------------------------------------------------*
431*
432* declaration des blocs communs
433*------------------------------
434         IMPLICIT NONE
435#include "dimensions.h"
436#include "microtab.h"
437#include "varmuphy.h"
438
439* declaration des variables communes
440* ----------------------------------
441
442         integer i,j
443
444*  declaration des variables internes
445*  ----------------------------------
446
447         integer indic
448         real pp,ra
449
450         ra=1.75e-10
451
452* traitement
453* ----------
454
455         if (indic.eq.0) then
456           pp=pb(j)
457         else
458           if (indic.ne.1) then
459             print*,'erreur argument fonction lambda'
460             return
461           endif
462           pp=p(j)
463         endif
464
465         lambda=kbz*t(j)/(4*sqrt(2.)*pi*(ra**2)*pp)
466         end
467
468*******************************************************************************
469
470         real function knu(j,k,indic)
471*
472*--------------------------------------------------------------*
473*  fonction calculant le nombre de knudsen d'une particule     *
474*  d'aerosol de rayon r_e(k) se trouvant dans la couche no j   *
475*  indic ......  idem function lambda                          *
476*--------------------------------------------------------------*
477*
478* declaration des blocs communs
479*------------------------------
480         IMPLICIT NONE
481#include "dimensions.h"
482#include "microtab.h"
483#include "varmuphy.h"
484
485*  declaration des variables internes
486*  ----------------------------------
487
488         integer indic,j,k
489         real lambda,rfk
490
491* traitement
492* ----------
493
494         if (indic.ne.0 .and.indic.ne.1) then
495           print*,'erreur argument fonction knu'
496           return
497         endif
498
499         rfk=(r_e(k)**(3./df(k)))*((rf(k))**(1.-3./df(k)))
500         knu=lambda(j,indic)/rfk
501         end
502
503*****************************************************************************
504
505         real function nud(j,indic)
506*
507*--------------------------------------------------------------*
508*  fonction calculant la viscosite dynamique (en USI) de l'air *
509*  d'apres la formule de Sutherlant a l'altitude j             *
510*  indic  ......... idem fonction lambda                       *
511*--------------------------------------------------------------*
512*
513         IMPLICIT NONE
514#include "dimensions.h"
515#include "microtab.h"
516#include "varmuphy.h"
517
518
519         integer indic,j
520         real nud0,c,tt
521*
522         nud0=1.74e-5
523         c=109.
524 
525         if(indic.ne.0.and.indic.ne.1) then
526           print*,'erreur argument fonction nud'
527           return
528         endif
529 
530         if(indic.eq.0) tt=tb(j)
531         if (indic.eq.1) tt=t(j)
532 
533         nud=nud0*sqrt(tt/293)*(1+c/293)/(1+c/tt)
534         end
535
536****************************************************************************
537
538         real function vitesse(j,k,indic)
539*
540*-----------------------------------------------------------------*
541*   fonction calculant la vitesse de chute d'une particule de rayon*
542*   k se trouvant a l'altitude j  suivant la valeur du nombre de   *
543*    Knudsen                                                       *
544*   indic ....... idem function lambda                             *
545*-----------------------------------------------------------------*
546*
547*  declaration des blocs communs
548*------------------------------
549         IMPLICIT NONE
550#include  "dimensions.h"
551#include  "microtab.h"
552#include  "varmuphy.h"
553
554*   declaration des variables internes
555*   ----------------------------------
556
557         integer indic,j,k
558         real w,g,m,a0,zz,nud,knud,tt,rhoh
559         real rbis, rfk,vb,zbx
560         real akncx,knu
561
562*   traitement
563*   ----------
564
565         if (indic.ne.0.and.indic.ne.1) then
566           print*,'erreur argument fonction vitesse'
567           return
568         endif
569
570         if(indic.eq.0) then
571           zz=z(j)+dz(j)/2.
572           tt=tb(j)
573           rhoh=rhob(j)
574         endif
575         if(indic.eq.1) then
576           zz=z(j)
577           tt=t(j)
578           rhoh=rho(j)
579         endif
580
581         g=g0*(rtit/(rtit+zz))**2
582         a0=0.74
583         m=(ach4(j)*mch4+aar(j)*mar+an2(j)*mn2)/nav
584         knud=knu(j,k,indic)
585
586
587         rfk=(r_e(k)**(3./df(k)))*((rf(k))**(1.-3./df(k)))
588c        rfk=r_e(7)
589
590
591          w=2./9.*rfk**(df(k)-1.)*rf(k)**(3.-df(k))*g*rhol/nud(j,indic)
592
593         w=w*(1+1.2517*knud+0.4*knud*exp(-1.1/knud))
594
595
596c        if (p(j).lt.500..and.k.eq.nrad) then
597c           w=0.
598c        endif
599
600         vitesse=w
601
602         end
603***********************************************************************
604
605         real function kd(h)
606*
607*--------------------------------------------------------------------*
608*   cette fonction calcule le coefficient du terme de 'eddy diffusion'*
609*   a l altitude j                                                   *
610*--------------------------------------------------------------------*
611*
612         IMPLICIT NONE
613#include  "dimensions.h"
614#include  "microtab.h"
615#include  "varmuphy.h"
616
617         real zbx
618
619         integer h
620
621         zbx=z(h)+dz(h)/2.
622         if(zbx.le.42000.) then
623           kd=1.64e+12*(pb(h)/(kbz*tb(h)))**(-1./2.)
624           kd=4.
625         else
626           kd=0.0*kd
627           kd=1.64e+12*(pb(h)/(kbz*tb(h)))**(-1./2.)
628         endif
629
630         if(zbx.le.50000.) then
631           kd=1.64e+12*(pb(h)/(kbz*tb(h)))**(-1./2.)
632         endif
633
634         kd=0.0*kd
635
636         return
637         end
638
639
640*____________________________________________________________________________
641
642         subroutine init
643*
644*--------------------------------------------------------------------*
645*   cette routine effectue  :                                         *
646*                1) interpolation a partir des donnees initiales des  *
647*                    valeurs de p,t,rho,ach4,aar,an2  sur la grille   *
648*                2) initialisation des constantes (common/phys/)      *
649*                3) initialisation des variables temporelles (common  *
650*                     /temps/)                                        *
651*                4) definition des grilles en rayon et verticale      *
652*                5)  initialisation de c(z,r,t) avec les donnees du   *
653*                      fichier unit=1                                 *
654*                                                                     *
655*   les donnees sont des valeurs caracterisques de l'atmosphere de    *
656*     TITAN  ( voir Lelouch and co )                                  *
657*--------------------------------------------------------------------*
658
659*  declaration des blocs communs
660*------------------------------
661         use dimphy
662         IMPLICIT NONE
663#include  "dimensions.h"
664#include  "microtab.h"
665#include  "varmuphy.h"
666
667
668         common/ctps/li,lf,dt
669         common/con/c
670
671*  declaration des variables communes
672*  ----------------------------------
673
674         real c(nz,nrad,2)
675         integer li,lf
676         integer i,ii
677         real dt
678
679*  declaration des variables internes
680*  ----------------------------------
681
682         integer nzd
683         parameter (nzd=254)
684         integer limsup,liminf,j1,j2
685         real zd(nzd),ach4d(nzd),rap
686         real m
687
688
689*  initialisation des variables temporelles
690*  ----------------------------------------
691
692         li=1
693         lf=2
694
695
696*  interpolation de xch4,xar et xn2 sur la grille
697*  ----------------------------------------------
698
699*  donnees initiales (Lellouch et al,87)
700*  -------------------------------------
701
702c        print*,'****** init'
703         do 1 i=1,168
704           zd(i)=(1000.-5*(i-1))*1000.
7051        continue
706         do 2 i=1,78
707           zd(168+i)=(160.-2*(i-1))*1000.
7082        continue
709         do 3 i=1,4
710           zd(246+i)=(5.-(i-1))*1000.
7113        continue
712         do 4 i=1,4
713           zd(250+i)=(1.5-(i-1)*0.5)*1000.
7144        continue
715
716         data (ach4d(i),i=1,168)/168*1.5e-2/
717         data (ach4d(i),i=169,254)/63*1.5e-2,1.6e-2,1.8e-2,1.8e-2,
718     &   1.9e-2,2.e-2,2.1e-2,2.3e-2,2.5e-2,2.8e-2,3.1e-2,3.6e-2,
719     &   4.1e-2,4.7e-2,5.7e-2,6.7e-2,7.5e-2,7*8.e-2/
720
721         liminf=0
722         limsup=0
723
724*  interpolation des taux de melange de ch4,ar,n2 
725*-----------------------------------------------   
726
727!        do 20 j1=1,nz
728!           do 21 j2=1,nzd
729!               if( zd(j2).le.z(j1)) goto 22
730!21         continue
731!22         liminf=j2
732
733          do 20 j1=1,nz
734             do 21 j2=1,nzd
735                 if( zd(j2).le.z(j1)) goto 22
736  21         continue
737  22         if (j2.ge.254) j2=254
738             liminf = j2
739
740          if (zd(liminf).eq.z(j1) )then
741            ach4(j1)=ach4d(liminf)
742            goto 20
743          endif
744          if (j2.ne.1) then
745            limsup=j2-1
746          else
747            limsup=j2
748          endif
749
750          if (limsup.eq.liminf) then
751            ach4(j1)=ach4(limsup)
752          else
753            ach4(j1)=ach4d(liminf)-(ach4d(limsup)-ach4d(liminf))/
754     s       (zd(limsup)-zd(liminf))*(zd(liminf)-z(j1))
755          endif
75620      continue
757
758*   rap= aar/an2  cst sur l'altitude
759
760         rap=0.191
761         do 23 i=1,nz
762           an2(i)=(1.-ach4(i))/(1.+rap)
763           aar(i)=rap*an2(i)
76423       continue
765
766         do 24 i=1,nz
767           m=ach4(i)*mch4+an2(i)*mn2+aar(i)*mar
768           rho(i)=p(i)*m/(rgp*t(i))
76924       continue
770
771         do 34 i=1,nz
772           m=ach4(i)*mch4+an2(i)*mn2+aar(i)*mar
773           rhob(i)=pb(i)*m/(rgp*tb(i))
774c          print*,pb(i),m,rgp,tb(i),rhob(i),rho(i)
77534       continue
776
777*  fin d'interpolation des taux de melange
778*---------------------------------------- 
779
780c        print*,'**** fin init'
781540      continue
782         return
783
784500       print*,'erreur lecture initialisation de c...erreur=',ii
785          stop
786
787        end
788
789*____________________________________________________________________________
790
791         subroutine pertpro(h,a,l_,pr_)
792
793*****************************************************************************
794*                                                                           *
795*  ce programme permet le calcul du terme de production (pr) et de perte (l)*
796*  pour le phenomene de coagulation                                         *
797*  dans le a ieme intervalle de rayon a une altitude h                      *
798*****************************************************************************
799
800*  declaration des blocs communs
801*------------------------------
802         use dimphy
803         IMPLICIT NONE
804#include  "dimensions.h"
805#include  "microtab.h"
806#include  "varmuphy.h"
807
808
809         common/ctps/li,lf,dt
810         common/con/c
811         common/coag/k
812
813*  declaration des variables
814*  --------------------------
815
816         integer li,lf
817         real dt
818         real c(nz,nrad,2),k(nz,nrad,nrad)
819
820*  declaration des variables propres au ss-programme
821*  -------------------------------------------------
822
823         integer h,b,a,x,i
824         real*8 pr,ss,s,l
825         real pr_,l_,vol,del
826
827*  traitement
828*  -----------
829
830*   production
831*+++++++++++++
832         s=0.d0
833         ss=0.d0
834         pr=0.
835
836         if (a .eq. 1) goto 2 
837         b=a-1
838
839         if (c(h,b,lf) .eq. 0 .and. c(h,b,li) .eq. 0) goto 2
840 
841         do 1 i=1,b
842
843         if(c(h,i,li) .eq. 0 .and. c(h,i,lf) .eq. 0) goto 1
844     
845         if (i .ne. b)del=1.
846         if (i .eq. b) del=.5
847
848         s=(v_e(i)*1.d0)*del*(k(h,b,i)*1.d0)*(c(h,i,li)*1.d0)+s
849         ss=(v_e(i)*1.d0)*del*(k(h,b,i)*1.d0)*(c(h,i,lf)*1.d0)+ss
850
851c        if (a.eq.2) print*,'SS>',v_e(i),k(h,b,i),c(h,b,lf)
852c        if (a.eq.2) print*,'SS>',del*v_e(i)*k(h,b,i)*c(h,b,lf)
853
854
8551        continue
856
857*   calcul du terme de production
858
859          pr=(c(h,b,lf)*s/(vrat_e-1.)+c(h,b,li)*ss)/v_e(a)
860c         if (a.eq.2) print*,'PR>',s,ss,c(h,b,lf),v_e(a)
861
8622         continue
863
864
865*   perte
866*-  - - - -
867
868          l=0
869
870
871*     condition limite : pas de perte dans le dernier intervalle
872
873         if (a .eq. nrad) goto 9
874
875         do 10 x=1,nrad
876
877         if (c(h,x,li) .eq. 0) goto 10
878
879         if (a .lt. x) vol=1.
880         if (a .eq. x) vol=.5*vrat_e/(vrat_e-1)
881         if (a .gt. x) vol=v_e(x)/(v_e(a)*(vrat_e-1))
882
883         l=l+k(h,a,x)*c(h,x,li)*vol*1.d0
884
885     
88610       continue
8879        continue
888
889#ifdef  CRAY
890         l_=l
891         pr_=pr
892#else
893         l_=sngl(l)
894         pr_=sngl(pr)
895#endif
896c        l_=sngl(l)
897c        pr_=sngl(pr)
898c          if (a.eq.2) print*,'pr_,l_',h,a,pr_,l_
899c          if (a.eq.2) print*,'-----------------------'
900c          if (a.eq.2) STOP
901
902
903
904         return
905
906         end
907
908*_____________________________________________________________________________
909
910         subroutine production(ihor)
911*
912*--------------------------------------------------------------------*
913*   routine calculant le terme de production des molecules organiques *
914*   composant les aerosols . rini= rayon des aerosols initiaux        *
915*--------------------------------------------------------------------*
916*
917         use dimphy
918         IMPLICIT NONE
919#include  "dimensions.h"
920#include  "microtab.h"
921#include  "varmuphy.h"
922#include  "clesphys.h"
923
924c#include  "aerprod.h"
925
926
927         integer ndz,i,ihor,k,k1
928         real c(nz,nrad,2)
929         integer li,lf
930         real dt
931         real zprod,zy,c0,ctot,prod,rini,rfron
932         real xsaison,p0
933         common/ctps/li,lf,dt
934         common /con/c
935         common/effets/xsaison
936
937! Pressure level of aerosol production
938          p0=p_prodaer
939
940          do i=1,nz-1
941           if (pb(i).lt.p0.and.pb(i+1).gt.p0) zprod=(z(i)+z(i+1))/2.
942          enddo
943
944         ctot=3.5e-13*tx ! ATTENTION, ??COHERENT AVEC INITPAR??
945         ctot=ctot*xsaison  !
946
947c        z0=385.e+3
948         zy=20.e+3
949         rini=1.3e-9
950         rini=r_e(1)   
951         ndz=50
952*
953         do 10 i=1,nrad
954           if(rini.lt.r_e(i)) goto 100
95510       continue
956100      continue
957         if (i.eq.1) then
958           rini=r_e(1)
959         else
960           rfron=(r_e(i)+r_e(i-1))/2
961           if (rini .lt.rfron) then
962             rini=r_e(i-1)
963             i=i-1
964           else
965             rini=r_e(i)
966           endif
967         endif
968*
969         c0=ctot/(sqrt(2.*pi)*zy)
970         c0=c0*3./(4.*pi*rhol*rini**3)
971*
972         do 20 k=nztop,nz
973         prod=0.
974         do 201 k1=1,ndz
975           prod=prod+c0*exp(-0.5*(((z(k)+dz(k)/2.-k1*dz(k)/(2.*ndz)
976     s     -zprod)/zy)**2))*dt/ndz
977201      continue
978
979          if (prod .le. 1) prod=0.
980            c(k,i,lf)=c(k,i,lf)+prod
98120       continue
982
983!        do 30 k=nztop,nz
984!        c(k,i,lf)=c(k,i,lf)+prodaer(ihor,nz-k+1,1)
985!     & *3./(4.*pi*rhol*rini**3)
986!30      continue
987
988         return
989         end
990
991*-------------------------------------------------------------------*
992
993
994
995        subroutine sedif(dice3)
996*
997*------------------------------------------------------------------*
998*   cette routine calcule l'evolution de la fonction de distribution*
999*   c(z,r,t) pour les phenomenes de sedimentation et de diffusion   *
1000*------------------------------------------------------------------*
1001*
1002*
1003*  declaration des blocs communs
1004*------------------------------
1005         use dimphy
1006         IMPLICIT NONE
1007#include  "dimensions.h"
1008#include  "microtab.h"
1009#include  "varmuphy.h"
1010
1011         common/ctps/li,lf,dt
1012         common/con/c
1013
1014*  declaration des variables communes
1015*  ----------------------------------
1016
1017         integer li,lf
1018         integer i,j,k,nb
1019         real dt
1020         real c(nz,nrad,2),dice3,bilan4,bilan14
1021
1022*  declaration des variables internes
1023*  ----------------------------------
1024
1025         real w,w1,dzbX,dc
1026         double precision sigma,theta,hc,l,rap,cmp,wp
1027         double precision fs(nz+1),ft(nz+1)
1028         real as(nz),bs(nz),cs(nz),ds(nz)
1029         double precision asi(nztop:nz),bsi(nztop:nz),
1030     &                    csi(nztop:nz)
1031         double precision dsi(nztop:nz),xsol(nztop:nz)
1032         real vitesse,kd
1033
1034         external dtridgl
1035*  resolution
1036*------------
1037
1038           
1039            bilan4=0.
1040            do  k=1,nrad
1041            do  j=nztop,nz
1042              bilan4=bilan4+c(j,k,li)*dzb(j)*
1043     &        4./3.*pi*rf(k)**3.*vrat_e**(k-imono)
1044            enddo
1045            enddo
1046
1047
1048            do 10 k=1,nrad 
1049            do 20 j=nztop,nz
1050
1051            if (j.eq.1) goto 20
1052
1053*  calcul de la vitesse corrigee
1054
1055              dzbX=(dz(j)+dz(j-1))/2.
1056              w=-1*vitesse(j,k,0)
1057              if (kd(j).ne.0.) then
1058                theta=0.5*(w*dzbX/kd(j)+log(rho(j-1)/rho(j)))
1059                if (theta.ne.0) then
1060                  sigma=1./dtanh(theta)-1./theta
1061                else
1062                  sigma=1.
1063                endif
1064              else
1065                sigma=1.
1066              endif
1067              if(c(j,k,li).eq.0.) then
1068                rap=10.
1069              else
1070                rap=c(j-1,k,li)/c(j,k,li)
1071                if( rap.gt.10.) rap=10.
1072                if( rap.lt.0.1) rap=0.1
1073              endif
1074              if (rap.gt.0.9 .and. rap.lt.1.1) then
1075                w1=w
1076              else
1077                if(w.ne.0) then
1078                  hc=dzbX/dlog(rap)
1079                  l=dzbX/(w*dt)*(dexp(-w*dt/hc)-1.)/(1.-rap)
1080                  wp=w*1.d0
1081                  cmp=dlog(-wp)+abs(sigma)*dlog(l)
1082                  if (cmp.gt.38) then
1083                    goto 20
1084                  endif
1085                  w1=-dexp(cmp)
1086
1087                else
1088                  w1=0.
1089                endif
1090              endif
1091
1092c               if(w1.ge.0. .or. w1.le.0.) then
1093c                continue
1094c               else
1095c                print*,j,k,w1,hc,dzbx,rap,dlog(rap),' w1'
1096c               endif
1097
1098*   calcul des flux aux interfaces
1099
1100
1101             if (kd(j).ne.0.) then
1102               if (theta.ne.0.) then
1103                 ft(j)=(w1+log(rho(j-1)/rho(j))*kd(j)/dzbX)/(dexp(2.*
1104     s           theta)-1.)
1105                 fs(j)=ft(j)*dexp(2.*theta)
1106               else
1107                 ft(j)=kd(j)/dzbX
1108                 fs(j)=kd(j)/dzbX
1109               endif
1110            else
1111              if (w1.lt.0.)then
1112                ft(j)=-w1
1113                fs(j)=0.
1114              else
1115                ft(j)=0.
1116                fs(j)=w1
1117              endif
1118            endif
1119
112020          continue
1121
1122*  conditions aux limites pour les flux aux interfaces
1123
1124            fs(1)=0.
1125            ft(1)=0.
1126            fs(nz+1)=0.
1127            ft(nz+1)=-w1
1128
1129*  calcul des coefficients de l'equation discrete
1130
1131            do 21 j=nztop,nz
1132              as(j)=-dz(j)/dt
1133              bs(j)=-ft(j)
1134              cs(j)=ft(j+1)+fs(j)-dz(j)/dt
1135              ds(j)=-fs(j+1)
1136
1137              if ( cs(j).gt.0) goto 100
113821         continue
1139
1140*  cas explicite (mu=0) : calcul de la fonction c(z,r,t+1)
1141
1142           do 22 j=nztop,nz-1
1143
1144           if (j.eq.nztop) then
1145             dc=(cs(nztop)*c(nztop,k,li)+ds(nztop)
1146     &                    *c(nztop+1,k,li))/as(nztop)
1147             c(nztop,k,lf)=dc
1148             goto 22
1149           endif
1150
1151           dc=(bs(j)*c(j-1,k,li)+cs(j)*c(j,k,li)+ds(j)*c(j+1,k,li))
1152     s         /as(j)
1153           c(j,k,lf)=dc
1154
1155
115622          continue
1157
1158            dc=(bs(nz)*c(nz-1,k,li)+cs(nz)*c(nz,k,li))/as(nz)
1159            c(nz,k,lf)=dc
1160
1161           if (nztop.ne.1) then
1162           do 32 j=1,nztop-1
1163             c(j,k,lf)=c(j,k,li)
116432         continue
1165           endif
1166
1167           goto 10
1168
1169100        continue
1170
1171*  cas implicite (mu=1) : calcul de la fonction c(z,r,t+1)
1172
1173          do 101 j=nztop,nz
1174            asi(j)=ft(j)
1175            bsi(j)=-(ft(j+1)+fs(j)+dz(j)/dt)
1176            csi(j)=fs(j+1)
1177            dsi(j)=-dz(j)/dt*c(j,k,li)
1178            xsol(j)=0.
1179101       continue
1180
1181*  inversion de la matrice tridiagonale
1182
1183         nb=nz-nztop+1
1184
1185         call dtridgl(nb,asi,bsi,csi,dsi,xsol)
1186
1187
1188         do 102 j=nztop,nz
1189          c(j,k,lf)=xsol(j)
1190102      continue
1191
1192         if (nztop.ne.1) then
1193           do 110 j=1,nztop-1
1194           c(j,k,lf)=c(j,k,li)
1195110        continue
1196         endif
1197
1198
1199
120010       continue
1201
1202         bilan14=0.
1203         do  k=1,nrad
1204         do  j=nztop,nz
1205           bilan14=bilan14+c(j,k,lf)*dzb(j)*
1206     &     4./3.*pi*rf(k)**3.*vrat_e**(k-imono)
1207         enddo
1208         enddo
1209
1210
1211         dice3=(bilan14-bilan4)*rhol
1212
1213
1214         return
1215
1216          end
1217
Note: See TracBrowser for help on using the repository browser.