source: trunk/LMDZ.MARS/libf/phymars/flusv.F @ 1047

Last change on this file since 1047 was 1047, checked in by emillour, 11 years ago

Mars GCM:

  • IMPORTANT CHANGE: Removed all reference/use of ngridmx (dimphys.h) in routines (necessary prerequisite to using parallel dynamics); in most cases this just means adding 'ngrid' as routine argument, and making local saved variables allocatable (and allocated at first call). In the process, had to convert many *.h files to equivalent modules: yomaer.h => yomaer_h.F90 , surfdat.h => surfdat_h.F90 , comsaison.h => comsaison_h.F90 , yomlw.h => yomlw_h.F90 , comdiurn.h => comdiurn_h.F90 , dimradmars.h => dimradmars_mod.F90 , comgeomfi.h => comgeomfi_h.F90, comsoil.h => comsoil_h.F90 , slope.h => slope_mod.F90
  • Also updated EOF routines, everything is now in eofdump_mod.F90
  • Removed unused routine lectfux.F (in dyn3d)

EM

File size: 13.9 KB
Line 
1      SUBROUTINE flusv(KDLON,nsf,n,omega,g,tau,emis,bh,bsol,fah,fdh)
2      use dimradmars_mod, only: ndlo2, ndlon
3      IMPLICIT NONE
4c.......................................................................
5c
6c  calcul des flux ascendant et descendant aux interfaces entre n couches
7c  * dans l'infrarouge
8c  * B est une fonction lineaire de $\tau$ a l'interieur de chaque couche
9c  * le B du sol peut etre different de celui qui correspond au profil
10c    de la n-ieme couche
11c  * l'hypothese est une hypothese a deux flux isotropes sur chaque
12c    hemisphere ("hemispheric constant") + "source function technique"
13c    (voir Toon et al. 1988)
14c  * le flux descendant en haut de l'atmosphere est nul
15c  * les couches sont numerotees du haut de l'atmosphere vers le sol
16c
17c  in :   * KDLON      ---> dimension de vectorisation
18c         * nsf        ---> nsf=0 ==> "hemispheric constant"
19c                           nsf>0 ==> "hemispheric constant" + "source function"
20c         * n          ---> nombre de couches
21c         * omega(i)   ---> single scattering albedo pour la i-eme couche
22c         * g(i)       ---> asymmetry parameter pour la i-eme couche
23c         * tau(i)     ---> epaisseur optique de la i-eme couche
24c         * emis       ---> emissivite du sol
25c         * bh(i)      ---> luminance du corps noir en haut de la i-eme
26c                           couche, bh(n+1) pour la valeur au sol qui
27c                           correspond au profil de la n-ieme couche
28c         * bsol       ---> luminance du corps noir au sol
29c
30c  out :  * fah(i)     ---> flux ascendant en haut de la i-eme couche,
31c                           fah(n+1) pour le sol
32c         * fdh(i)     ---> flux descendant en haut de la i-eme couche,
33c                           fdh(n+1) pour le sol
34c
35c.......................................................................
36c  include des dimensions locales
37c
38#include "dimensions.h"
39#include "dimphys.h"
40!#include "dimradmars.h"
41c.......................................................................
42c  declaration des arguments
43c
44      INTEGER KDLON,nsf,n
45      REAL omega(NDLO2,n),g(NDLO2,n),tau(NDLO2,n),emis(NDLO2)
46     &,bh(NDLO2,n+1),bsol(NDLO2),fah(NDLO2,n+1),fdh(NDLO2,n+1)
47c.......................................................................
48c  declaration des variables locales
49c
50      REAL pi
51      PARAMETER (pi=3.141592653589793E+0)
52      INTEGER iv,i,j
53      REAL beta,gama1,gama2,amu1,grgama,b0,b1
54      REAL a(NDLON,4*nlayermx),b(NDLON,4*nlayermx)
55     &    ,d(NDLON,4*nlayermx),e(NDLON,4*nlayermx)
56     &    ,y(NDLON,4*nlayermx)
57     &    ,alambda(NDLON,2*nlayermx)
58     &    ,e1(NDLON,2*nlayermx),e2(NDLON,2*nlayermx)
59     &    ,e3(NDLON,2*nlayermx),e4(NDLON,2*nlayermx)
60     &    ,cah(NDLON,2*nlayermx),cab(NDLON,2*nlayermx)
61     &    ,cdh(NDLON,2*nlayermx),cdb(NDLON,2*nlayermx)
62      REAL grg(NDLON,2*nlayermx),grh(NDLON,2*nlayermx)
63     &    ,grj(NDLON,2*nlayermx),grk(NDLON,2*nlayermx)
64     &    ,alpha1(NDLON,2*nlayermx),alpha2(NDLON,2*nlayermx)
65     &    ,sigma1(NDLON,2*nlayermx),sigma2(NDLON,2*nlayermx)
66      INTEGER nq
67      PARAMETER (nq=8)
68      REAL x(nq),w(nq),gri(NDLON,nq)
69      DATA x/1.9855071751231860E-2 , 0.1016667612931866E+0
70     &     , 0.2372337950418355E+0 , 0.4082826787521751E+0
71     &     , 0.5917173212478250E+0 , 0.7627662049581645E+0
72     &     , 0.8983332387068134E+0 , 0.9801449282487682E+0/
73      DATA w/5.0614268145185310E-2 , 0.1111905172266872E+0
74     &     , 0.1568533229389437E+0 , 0.1813418916891810E+0
75     &     , 0.1813418916891810E+0 , 0.1568533229389437E+0
76     &     , 0.1111905172266872E+0 , 5.0614268145185310E-2/
77c.......................................................................
78c
79c.......................................................................
80      do 10001 i=1,n
81                                                   do 99999 iv=1,KDLON
82      beta=(1.E+0-g(iv,i))/2.E+0
83      gama1=2.E+0*(1.E+0-omega(iv,i)*(1.E+0-beta))
84      gama2=2.E+0*omega(iv,i)*beta
85      amu1=5.E-1
86      alambda(iv,i)=sqrt(gama1**2-gama2**2)
87      grgama=(gama1-alambda(iv,i))/gama2
88c
89c ici une petite bidouille : si l'epaisseur optique d'une couche
90c est trop faible, $dB \over d\tau$ devient tres grand et le schema
91c s'ecroule. dans ces cas, on fait l'hypothese de couche isotherme.
92c
93      if (tau(iv,i).gt.1.E-3) then
94      b0=bh(iv,i)
95      b1=(bh(iv,i+1)-b0)/tau(iv,i)
96      else
97      b0=(bh(iv,i)+bh(iv,i+1))/2.E+0
98      b1=0.E+0
99      endif
100c
101      e1(iv,i)=1.E+0+grgama*exp(-alambda(iv,i)*tau(iv,i))
102      e2(iv,i)=1.E+0-grgama*exp(-alambda(iv,i)*tau(iv,i))
103      e3(iv,i)=grgama+exp(-alambda(iv,i)*tau(iv,i))
104      e4(iv,i)=grgama-exp(-alambda(iv,i)*tau(iv,i))
105      cah(iv,i)=2.E+0*pi*amu1*(b0+b1/(gama1+gama2))
106      cab(iv,i)=2.E+0*pi*amu1*(b0+b1*(tau(iv,i)+1.E+0/(gama1+gama2)))
107      cdh(iv,i)=2.E+0*pi*amu1*(b0-b1/(gama1+gama2))
108      cdb(iv,i)=2.E+0*pi*amu1*(b0+b1*(tau(iv,i)-1.E+0/(gama1+gama2))) 
109c
110      grg(iv,i)=(1.E+0/amu1-alambda(iv,i))
111      grh(iv,i)=grgama*(alambda(iv,i)+1.E+0/amu1)
112      grj(iv,i)=grh(iv,i)
113      grk(iv,i)=grg(iv,i)
114      alpha1(iv,i)=2.E+0*pi*(b0+b1*(1.E+0/(gama1+gama2)-amu1))
115      alpha2(iv,i)=2.E+0*pi*b1
116      sigma1(iv,i)=2.E+0*pi*(b0-b1*(1.E+0/(gama1+gama2)-amu1))
117      sigma2(iv,i)=alpha2(iv,i)
118c
11999999                                              continue
12010001 continue
121c.......................................................................
122                                                   do 99998 iv=1,KDLON
123      a(iv,1)=0.E+0
124      b(iv,1)=e1(iv,1)
125      d(iv,1)=-e2(iv,1)
126      e(iv,1)=-cdh(iv,1)
12799998                                              continue
128c
129      do 10002 i=1,n-1
130      j=2*i+1
131                                                   do 99997 iv=1,KDLON
132      a(iv,j)=e2(iv,i)*e3(iv,i)-e4(iv,i)*e1(iv,i)
133      b(iv,j)=e1(iv,i)*e1(iv,i+1)-e3(iv,i)*e3(iv,i+1)
134      d(iv,j)=e3(iv,i)*e4(iv,i+1)-e1(iv,i)*e2(iv,i+1)
135      e(iv,j)=e3(iv,i)*(cah(iv,i+1)-cab(iv,i))
136     &       +e1(iv,i)*(cdb(iv,i)-cdh(iv,i+1))
13799997                                              continue
13810002 continue
139c
140      do 10003 i=1,n-1
141      j=2*i
142                                                   do 99996 iv=1,KDLON
143      a(iv,j)=e2(iv,i+1)*e1(iv,i)-e3(iv,i)*e4(iv,i+1)
144      b(iv,j)=e2(iv,i)*e2(iv,i+1)-e4(iv,i)*e4(iv,i+1)
145      d(iv,j)=e1(iv,i+1)*e4(iv,i+1)-e2(iv,i+1)*e3(iv,i+1)
146      e(iv,j)=e2(iv,i+1)*(cah(iv,i+1)-cab(iv,i))
147     &       +e4(iv,i+1)*(cdb(iv,i)-cdh(iv,i+1))
14899996                                              continue
14910003 continue
150c     
151      j=2*n
152                                                   do 99995 iv=1,KDLON
153      a(iv,j)=e1(iv,n)-(1.E+0-emis(iv))*e3(iv,n)
154      b(iv,j)=e2(iv,n)-(1.E+0-emis(iv))*e4(iv,n)
155      d(iv,j)=0.E+0
156      e(iv,j)=emis(iv)*pi*bsol(iv)-cab(iv,n)+(1.E+0-emis(iv))*cdb(iv,n)
15799995                                              continue
158c.......................................................................
159      call sys3v(KDLON,2*n,a,b,d,e,y)
160c.......................................................................
161      do 10004 i=1,n
162                                                   do 99994 iv=1,KDLON
163      grg(iv,i)=grg(iv,i)*(y(iv,2*i-1)+y(iv,2*i))
164      grh(iv,i)=grh(iv,i)*(y(iv,2*i-1)-y(iv,2*i))
165      grj(iv,i)=grj(iv,i)*(y(iv,2*i-1)+y(iv,2*i))
166      grk(iv,i)=grk(iv,i)*(y(iv,2*i-1)-y(iv,2*i))
16799994                                              continue
16810004 continue
169c.......................................................................
170c les valeurs de flux "hemispheric constant"
171c
172      IF (nsf.eq.0) THEN
173      do 10005 i=1,n
174                                                   do 99993 iv=1,KDLON
175      fah(iv,i)=e3(iv,i)*y(iv,2*i-1)-e4(iv,i)*y(iv,2*i)+cah(iv,i)
176      fdh(iv,i)=e1(iv,i)*y(iv,2*i-1)-e2(iv,i)*y(iv,2*i)+cdh(iv,i)
17799993                                              continue
17810005 continue
179                                                   do 99992 iv=1,KDLON
180      fah(iv,n+1)=e1(iv,n)*y(iv,2*n-1)+e2(iv,n)*y(iv,2*n)+cab(iv,n)
181      fdh(iv,n+1)=e3(iv,n)*y(iv,2*n-1)+e4(iv,n)*y(iv,2*n)+cdb(iv,n)
18299992                                              continue
183      GOTO 10100
184      ENDIF
185c.......................................................................
186c passage a "source function"
187c
188c on applique une quadrature de dimension nq
189c x est le vecteur des \mu de la quadrature
190c w est le vecteur des poids correspondants
191c nq est fixe en parameter
192c x et w sont fixes en data
193c
194c.......................................................................
195c on part d'en haut et on descent selon les nq angles pour calculer
196c tous les flux descendants
197c
198      do 10006 j=1,nq
199                                                   do 99991 iv=1,KDLON
200      gri(iv,j)=0.E+0
20199991                                              continue
20210006 continue
203                                                   do 99990 iv=1,KDLON
204      fdh(iv,1)=0.E+0
20599990                                              continue
206      do 10007 i=1,n
207      do 10008 j=1,nq
208                                                   do 99989 iv=1,KDLON
209      gri(iv,j)=gri(iv,j)*exp(-tau(iv,i)/x(j))
210     &+grj(iv,i)/(alambda(iv,i)*x(j)+1.E+0)
211     &*(1.E+0-exp(-tau(iv,i)*(alambda(iv,i)+1.E+0/x(j))))
212     &+grk(iv,i)/(alambda(iv,i)*x(j)-1.E+0)
213     &*(exp(-tau(iv,i)/x(j))-exp(-tau(iv,i)*alambda(iv,i)))
214     &+sigma1(iv,i)*(1.E+0-exp(-tau(iv,i)/x(j)))
215     &+sigma2(iv,i)*(x(j)*exp(-tau(iv,i)/x(j))+tau(iv,i)-x(j))
21699989                                              continue
21710008 continue
218                                                   do 99988 iv=1,KDLON
219      fdh(iv,i+1)=0.E+0
22099988                                              continue
221      do 10009 j=1,nq
222                                                   do 99987 iv=1,KDLON
223      fdh(iv,i+1)=fdh(iv,i+1)+w(j)*x(j)*gri(iv,j)
22499987                                              continue
22510009 continue
22610007 continue
227c.......................................................................
228c on applique la condition de reflexion a sol
229c
230                                                   do 99986 iv=1,KDLON
231      fah(iv,n+1)=(1.E+0-emis(iv))*fdh(iv,n+1)+pi*emis(iv)*bsol(iv)
23299986                                              continue
233      do 10010 j=1,nq
234                                                   do 99985 iv=1,KDLON
235      gri(iv,j)=2.E+0*fah(iv,n+1)
23699985                                              continue
23710010 continue
238c.......................................................................
239c on remonte pour calculer tous les flux ascendants
240
241      do 10011 i=n,1,-1
242      do 10012 j=1,nq
243                                                   do 99984 iv=1,KDLON
244      gri(iv,j)=gri(iv,j)*exp(-tau(iv,i)/x(j))
245     &+grg(iv,i)/(alambda(iv,i)*x(j)-1.E+0)
246     &*(exp(-tau(iv,i)/x(j))-exp(-tau(iv,i)*alambda(iv,i)))
247     &+grh(iv,i)/(alambda(iv,i)*x(j)+1.E+0)
248     &*(1.E+0-exp(-tau(iv,i)*(alambda(iv,i)+1.E+0/x(j))))
249     &+alpha1(iv,i)*(1.E+0-exp(-tau(iv,i)/x(j)))
250     &+alpha2(iv,i)*(x(j)-(tau(iv,i)+x(j))*exp(-tau(iv,i)/x(j)))
25199984                                              continue
25210012 continue
253                                                   do 99983 iv=1,KDLON
254      fah(iv,i)=0.E+0
25599983                                              continue
256      do 10013 j=1,nq
257                                                   do 99982 iv=1,KDLON
258      fah(iv,i)=fah(iv,i)+w(j)*x(j)*gri(iv,j)
25999982                                              continue
26010013 continue
26110011 continue
262c.......................................................................
26310100 continue     
264c.......................................................................
265c
266c.......................................................................
267      RETURN
268      END
269
270c ***************************************************************
271
272
273      SUBROUTINE sys3v(KDLON,n,a,b,d,e,y)
274      use dimradmars_mod, only: ndlon, ndlo2
275      IMPLICIT NONE
276c.......................................................................
277c
278c  inversion d'un systeme lineaire tridiagonal
279c
280c  |  b1  d1               |   | y1 |   | e1 |
281c  |  a2  b2  d2           |   | y2 |   | e2 |
282c  |      a3  b3  d3       | * | y3 | = | e3 |
283c  |             ....      |   |    |   |    |
284c  |              an  bn   |   | yn |   | en |
285c
286c  in :   * KDLON        --> dimension de vectorisation
287c         * n            --> dimension du systeme
288c         * a,b,d,e      --> voir dessin
289c
290c  out :  * y            --> voir dessin
291c
292c.......................................................................
293c  include des dimensions locales
294c
295#include "dimensions.h"
296#include "dimphys.h"
297!#include "dimradmars.h"
298c.......................................................................
299c  declaration des arguments
300c
301      INTEGER KDLON,n
302      REAL a(NDLO2,n),b(NDLO2,n),d(NDLO2,n),e(NDLO2,n),y(NDLO2,n)
303c.......................................................................
304c  declaration des variables locales
305c
306      INTEGER iv,i
307      REAL as(NDLON,4*nlayermx),ds(NDLON,4*nlayermx)
308     &    ,x(NDLON,4*nlayermx)
309c.......................................................................
310c
311c.......................................................................
312                                                   do 99999 iv=1,KDLON
313      as(iv,n)=a(iv,n)/b(iv,n)
314      ds(iv,n)=e(iv,n)/b(iv,n)
31599999                                              continue
316      do 10001 i=n-1,1,-1
317                                                   do 99998 iv=1,KDLON
318      x(iv,i)=1.E+0/(b(iv,i)-d(iv,i)*as(iv,i+1))
319      as(iv,i)=a(iv,i)*x(iv,i)
320      ds(iv,i)=(e(iv,i)-d(iv,i)*ds(iv,i+1))*x(iv,i)
32199998                                              continue
32210001 continue
323                                                   do 99997 iv=1,KDLON
324      y(iv,1)=ds(iv,1)
32599997                                              continue
326      do 10002 i=2,n
327                                                   do 99996 iv=1,KDLON
328      y(iv,i)=ds(iv,i)-as(iv,i)*y(iv,i-1)
32999996                                              continue
33010002 continue
331c.......................................................................
332c
333c.......................................................................
334      RETURN
335      END
Note: See TracBrowser for help on using the repository browser.