source: trunk/LMDZ.MARS/libf/phymars/aerave.F @ 3807

Last change on this file since 3807 was 3756, checked in by emillour, 6 weeks ago

Mars PCM:
Code tidying: turn aerave.F and suaer.F90 into modules and modernize
"blackl" routine (enforce "implicit none", make true constants "parameters")
and include it in the aerave module since it is only called there.
EM

File size: 7.0 KB
Line 
1      MODULE aerave_mod
2     
3      IMPLICIT NONE
4     
5      CONTAINS
6
7      SUBROUTINE aerave ( ndata,
8     & longdata,epdata,omegdata,gdata,         
9     &            longref,epref,temp,nir,longir
10     &            ,epir,omegir,gir,qref,omegaref        )
11      IMPLICIT NONE
12c.......................................................................
13c
14c R.Fournier 02/1996
15c (modif F.Forget 02/1996)
16c le spectre est decoupe en "nir" bandes et cette routine calcule
17c les donnees radiatives moyenne sur chaque bande : l'optimisation
18c est faite pour une temperature au sol "temp" et une epaisseur
19c optique de l'atmosphere "epref" a la longueur d'onde "longref"
20c
21c dans la version actuelle, les ponderations sont independantes de
22c l'epaisseur optique : c'est a dire que "omegir", "gir"
23c et "epir/epre" sont independants de "epref".
24c en effet les ponderations sont choisies pour une solution exacte
25c en couche mince et milieu isotherme.
26c
27c entree
28c
29c    ndata : taille des champs data
30c    longdata,epdata,omegdata,gdata : proprietes radiative de l'aerosol
31c                  (longdata longueur d'onde en METRES)
32c  * longref : longueur d'onde a laquelle l'epaisseur optique
33c              est connue
34c  * epref : epaisseur optique a longref
35c  * temp : temperature choisie pour la ponderation (Planck)
36c  * nir : nombre d'intervals dans la discretisation spectrale
37c           du GCM
38c  * longir : longueurs d'onde definissant ces intervals
39c
40c sortie
41c
42c  * epir : epaisseur optique moyenne pour chaque interval
43c  * omegir : "scattering albedo" moyen pour chaque interval
44c  * gir : "assymetry factor" moyen pour chaque interval
45c  * qref : extinction coefficient at reference wavelength
46c  * omegaref : single scat. albedo at reference wavelength
47c
48c.......................................................................
49c
50      REAL longref
51      REAL epref
52      REAL temp
53      INTEGER nir
54      REAL longir(nir+1)
55      REAL epir(nir)
56      REAL omegir(nir)
57      REAL gir(nir)
58c
59c.......................................................................
60c
61      INTEGER iir,nirmx
62      PARAMETER (nirmx=100)
63      INTEGER idata,ndata
64c
65c.......................................................................
66c
67      REAL emit
68      REAL totalemit(nirmx)
69      REAL longdata(ndata),epdata(ndata)
70     &    ,omegdata(ndata),gdata(ndata)
71      REAL qextcorrdata(ndata)
72      INTEGER ibande,nbande
73      PARAMETER (nbande=1000)
74      REAL long,deltalong
75      INTEGER ilong
76      INTEGER i1,i2
77      REAL c1,c2
78      REAL factep,qextcorr,omeg,g
79      REAL qref,omegaref
80c
81c.......................................................................
82c
83      DOUBLE PRECISION tmp1
84      REAL tmp2,tmp3
85c
86c
87      long=longref
88c
89c********************************************************
90c interpolation
91      ilong=1
92      DO idata=2,ndata
93        IF (long.gt.longdata(idata)) ilong=idata
94      ENDDO
95      i1=ilong
96      i2=ilong+1
97      IF (i2.gt.ndata) i2=ndata
98      IF (long.lt.longdata(1)) i2=1
99      IF (i1.eq.i2) THEN
100        c1=1.E+0
101        c2=0.E+0
102      ELSE
103        c1=(longdata(i2)-long) / (longdata(i2)-longdata(i1))
104        c2=(longdata(i1)-long) / (longdata(i1)-longdata(i2))
105      ENDIF
106c********************************************************
107c
108      qref=c1*epdata(i1)+c2*epdata(i2)
109      omegaref=c1*omegdata(i1)+c2*omegdata(i2)
110      factep=qref/epref
111      DO idata=1,ndata
112        qextcorrdata(idata)=epdata(idata)/factep
113      ENDDO
114c
115c.......................................................................
116c
117      DO iir=1,nir
118c
119c.......................................................................
120c
121        deltalong=(longir(iir+1)-longir(iir)) / nbande
122        totalemit(iir)=0.E+0
123        epir(iir)=0.E+0
124        omegir(iir)=0.E+0
125        gir(iir)=0.E+0
126c
127c.......................................................................
128c
129        DO ibande=1,nbande
130c
131c.......................................................................
132c
133          long=longir(iir) + (ibande-0.5E+0) * deltalong
134          CALL blackl(DBLE(long),DBLE(temp),tmp1)
135          emit=REAL(tmp1)
136c
137c.......................................................................
138c
139c********************************************************
140c interpolation
141      ilong=1
142      DO idata=2,ndata
143        IF (long.gt.longdata(idata)) ilong=idata
144      ENDDO
145      i1=ilong
146      i2=ilong+1
147      IF (i2.gt.ndata) i2=ndata
148      IF (long.lt.longdata(1)) i2=1
149      IF (i1.eq.i2) THEN
150        c1=1.E+0
151        c2=0.E+0
152      ELSE
153        c1=(longdata(i2)-long) / (longdata(i2)-longdata(i1))
154        c2=(longdata(i1)-long) / (longdata(i1)-longdata(i2))
155      ENDIF
156c********************************************************
157c
158          qextcorr=c1*qextcorrdata(i1)+c2*qextcorrdata(i2)
159          omeg=c1*omegdata(i1)+c2*omegdata(i2)
160          g=c1*gdata(i1)+c2*gdata(i2)
161c
162c.......................................................................
163c
164          totalemit(iir)=totalemit(iir)+deltalong*emit
165          epir(iir)=epir(iir)+deltalong*emit*qextcorr
166          omegir(iir)=omegir(iir)+deltalong*emit*omeg*qextcorr
167          gir(iir)=gir(iir)+deltalong*emit*omeg*qextcorr*g
168c
169c.......................................................................
170c
171        ENDDO
172c
173c.......................................................................
174c
175        gir(iir)=gir(iir)/omegir(iir)
176        omegir(iir)=omegir(iir)/epir(iir)
177        epir(iir)=epir(iir)/totalemit(iir)
178c
179c.......................................................................
180c
181      ENDDO
182c
183c......................................................................
184c
185c     Diagnostic de controle si on moyenne sur tout le spectre vis ou IR :
186c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
187c     tmp2=0.E+0
188c     DO iir=1,nir
189c       tmp2=tmp2+totalemit(iir)
190c     ENDDO
191c     tmp3=5.67E-8 * temp**4
192c     IF (abs((tmp2-tmp3)/tmp3).gt.0.05E+0) THEN
193c       PRINT *,'!!!! <---> il manque du Planck (voir moyenne.F)'
194c       PRINT *,'somme des bandes :',tmp2,'--- Planck:',tmp3
195c     ENDIF
196c
197c......................................................................
198c
199      END SUBROUTINE aerave
200
201c.......................................................................
202
203      subroutine blackl(blalong,blat,blae)
204
205      implicit none
206c.......................................................................
207      double precision,intent(in) :: blalong,blat
208      double precision,intent(out) :: blae
209c.....parameters
210      double precision,parameter :: sigma=5.6693d-08
211      double precision,parameter :: pi=datan(1.d0)*4.d0
212      double precision,parameter :: c0=2.9979d+08
213      double precision,parameter :: h=6.6262d-34
214      double precision,parameter :: cbol=1.3806d-23
215      double precision,parameter :: rind=1.d0
216      double precision,parameter :: c=c0/rind
217      double precision,parameter :: c1=h*(c**2)
218      double precision,parameter :: c2=h*c/cbol
219c.......................................................................
220      blae=2.d0*pi*c1/blalong**5/(exp(c2/blalong/blat)-1.d0)
221c.......................................................................
222
223      end subroutine blackl
224
225      END MODULE aerave_mod
Note: See TracBrowser for help on using the repository browser.