/[lmdze]/trunk/phylmd/Radlwsw/sw2s.f90
ViewVC logotype

Diff of /trunk/phylmd/Radlwsw/sw2s.f90

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC revision 217 by guez, Thu Mar 30 14:25:18 2017 UTC
# Line 1  Line 1 
1  SUBROUTINE sw2s(knu, paer, flag_aer, tauae, pizae, cgae, paki, palbd, palbp, &  module sw2s_m
2      pcg, pcld, pclear, pcldsw, pdsig, pomega, poz, prmu, psec, ptau, pud, &  
     pwv, pqs, pfdown, pfup)  
   USE dimens_m  
   USE dimphy  
   USE raddim  
   USE radepsi  
3    IMPLICIT NONE    IMPLICIT NONE
4    
5    ! ------------------------------------------------------------------  contains
   ! PURPOSE.  
   ! --------  
   
   ! THIS ROUTINE COMPUTES THE SHORTWAVE RADIATION FLUXES IN THE  
   ! SECOND SPECTRAL INTERVAL FOLLOWING FOUQUART AND BONNEL (1980).  
   
   ! METHOD.  
   ! -------  
   
   ! 1. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING TO  
   ! CONTINUUM SCATTERING  
   ! 2. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING FOR  
   ! A GREY MOLECULAR ABSORPTION  
   ! 3. LAPLACE TRANSFORM ON THE PREVIOUS TO GET EFFECTIVE AMOUNTS  
   ! OF ABSORBERS  
   ! 4. APPLY H2O AND U.M.G. TRANSMISSION FUNCTIONS  
   ! 5. MULTIPLY BY OZONE TRANSMISSION FUNCTION  
   
   ! REFERENCE.  
   ! ----------  
   
   ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT  
   ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)  
   
   ! AUTHOR.  
   ! -------  
   ! JEAN-JACQUES MORCRETTE  *ECMWF*  
   
   ! MODIFICATIONS.  
   ! --------------  
   ! ORIGINAL : 89-07-14  
   ! 94-11-15   J.-J. MORCRETTE    DIRECT/DIFFUSE ALBEDO  
   ! ------------------------------------------------------------------  
   ! * ARGUMENTS:  
   
   INTEGER knu  
   ! -OB  
   DOUBLE PRECISION flag_aer  
   DOUBLE PRECISION tauae(kdlon, kflev, 2)  
   DOUBLE PRECISION pizae(kdlon, kflev, 2)  
   DOUBLE PRECISION cgae(kdlon, kflev, 2)  
   DOUBLE PRECISION paer(kdlon, kflev, 5)  
   DOUBLE PRECISION paki(kdlon, 2)  
   DOUBLE PRECISION palbd(kdlon, 2)  
   DOUBLE PRECISION palbp(kdlon, 2)  
   DOUBLE PRECISION pcg(kdlon, 2, kflev)  
   DOUBLE PRECISION pcld(kdlon, kflev)  
   DOUBLE PRECISION pcldsw(kdlon, kflev)  
   DOUBLE PRECISION pclear(kdlon)  
   DOUBLE PRECISION pdsig(kdlon, kflev)  
   DOUBLE PRECISION pomega(kdlon, 2, kflev)  
   DOUBLE PRECISION poz(kdlon, kflev)  
   DOUBLE PRECISION pqs(kdlon, kflev)  
   DOUBLE PRECISION prmu(kdlon)  
   DOUBLE PRECISION psec(kdlon)  
   DOUBLE PRECISION ptau(kdlon, 2, kflev)  
   DOUBLE PRECISION pud(kdlon, 5, kflev+1)  
   DOUBLE PRECISION pwv(kdlon, kflev)  
   
   DOUBLE PRECISION pfdown(kdlon, kflev+1)  
   DOUBLE PRECISION pfup(kdlon, kflev+1)  
   
   ! * LOCAL VARIABLES:  
   
   INTEGER iind2(2), iind3(3)  
   DOUBLE PRECISION zcgaz(kdlon, kflev)  
   DOUBLE PRECISION zfd(kdlon, kflev+1)  
   DOUBLE PRECISION zfu(kdlon, kflev+1)  
   DOUBLE PRECISION zg(kdlon)  
   DOUBLE PRECISION zgg(kdlon)  
   DOUBLE PRECISION zpizaz(kdlon, kflev)  
   DOUBLE PRECISION zrayl(kdlon)  
   DOUBLE PRECISION zray1(kdlon, kflev+1)  
   DOUBLE PRECISION zray2(kdlon, kflev+1)  
   DOUBLE PRECISION zref(kdlon)  
   DOUBLE PRECISION zrefz(kdlon, 2, kflev+1)  
   DOUBLE PRECISION zre1(kdlon)  
   DOUBLE PRECISION zre2(kdlon)  
   DOUBLE PRECISION zrj(kdlon, 6, kflev+1)  
   DOUBLE PRECISION zrj0(kdlon, 6, kflev+1)  
   DOUBLE PRECISION zrk(kdlon, 6, kflev+1)  
   DOUBLE PRECISION zrk0(kdlon, 6, kflev+1)  
   DOUBLE PRECISION zrl(kdlon, 8)  
   DOUBLE PRECISION zrmue(kdlon, kflev+1)  
   DOUBLE PRECISION zrmu0(kdlon, kflev+1)  
   DOUBLE PRECISION zrmuz(kdlon)  
   DOUBLE PRECISION zrneb(kdlon)  
   DOUBLE PRECISION zruef(kdlon, 8)  
   DOUBLE PRECISION zr1(kdlon)  
   DOUBLE PRECISION zr2(kdlon, 2)  
   DOUBLE PRECISION zr3(kdlon, 3)  
   DOUBLE PRECISION zr4(kdlon)  
   DOUBLE PRECISION zr21(kdlon)  
   DOUBLE PRECISION zr22(kdlon)  
   DOUBLE PRECISION zs(kdlon)  
   DOUBLE PRECISION ztauaz(kdlon, kflev)  
   DOUBLE PRECISION zto1(kdlon)  
   DOUBLE PRECISION ztr(kdlon, 2, kflev+1)  
   DOUBLE PRECISION ztra1(kdlon, kflev+1)  
   DOUBLE PRECISION ztra2(kdlon, kflev+1)  
   DOUBLE PRECISION ztr1(kdlon)  
   DOUBLE PRECISION ztr2(kdlon)  
   DOUBLE PRECISION zw(kdlon)  
   DOUBLE PRECISION zw1(kdlon)  
   DOUBLE PRECISION zw2(kdlon, 2)  
   DOUBLE PRECISION zw3(kdlon, 3)  
   DOUBLE PRECISION zw4(kdlon)  
   DOUBLE PRECISION zw5(kdlon)  
   
   INTEGER jl, jk, k, jaj, ikm1, ikl, jn, jabs, jkm1  
   INTEGER jref, jkl, jklp1, jajp, jkki, jkkp4, jn2j, iabs  
   DOUBLE PRECISION zrmum1, zwh2o, zcneb, zaa, zbb, zrki, zre11  
   
   ! * Prescribed Data:  
   
   DOUBLE PRECISION rsun(2)  
   SAVE rsun  
   DOUBLE PRECISION rray(2, 6)  
   SAVE rray  
   DATA rsun(1)/0.441676/  
   DATA rsun(2)/0.558324/  
   DATA (rray(1,k), k=1, 6)/.428937E-01, .890743E+00, -.288555E+01, &  
     .522744E+01, -.469173E+01, .161645E+01/  
   DATA (rray(2,k), k=1, 6)/.697200E-02, .173297E-01, -.850903E-01, &  
     .248261E+00, -.302031E+00, .129662E+00/  
   
   ! ------------------------------------------------------------------  
   
   ! *         1.     SECOND SPECTRAL INTERVAL (0.68-4.00 MICRON)  
   ! -------------------------------------------  
   
   
   
   ! *         1.1    OPTICAL THICKNESS FOR RAYLEIGH SCATTERING  
   ! -----------------------------------------  
   
   
   DO jl = 1, kdlon  
     zrmum1 = 1. - prmu(jl)  
     zrayl(jl) = rray(knu, 1) + zrmum1*(rray(knu,2)+zrmum1*(rray(knu, &  
       3)+zrmum1*(rray(knu,4)+zrmum1*(rray(knu,5)+zrmum1*rray(knu,6)))))  
   END DO  
   
   
   ! ------------------------------------------------------------------  
   
   ! *         2.    CONTINUUM SCATTERING CALCULATIONS  
   ! ---------------------------------  
   
   
   ! *         2.1   CLEAR-SKY FRACTION OF THE COLUMN  
   ! --------------------------------  
   
   
   CALL swclr(knu, paer, flag_aer, tauae, pizae, cgae, palbp, pdsig, zrayl, &  
     psec, zcgaz, zpizaz, zray1, zray2, zrefz, zrj0, zrk0, zrmu0, ztauaz, &  
     ztra1, ztra2)  
   
   
   ! *         2.2   CLOUDY FRACTION OF THE COLUMN  
   ! -----------------------------  
   
   
   CALL swr(knu, palbd, pcg, pcld, pdsig, pomega, zrayl, psec, ptau, zcgaz, &  
     zpizaz, zray1, zray2, zrefz, zrj, zrk, zrmue, ztauaz, ztra1, ztra2)  
   
   
   ! ------------------------------------------------------------------  
   
   ! *         3.    SCATTERING CALCULATIONS WITH GREY MOLECULAR ABSORPTION  
   ! ------------------------------------------------------  
6    
7      SUBROUTINE sw2s(knu, flag_aer, paki, palbd, palbp, pcg, pcld, pclear, &
8           pdsig, pomega, poz, prmu, psec, ptau, pud, pwv, pqs, pfdown, pfup)
9        
10        USE dimens_m
11        USE dimphy
12        USE raddim
13        USE radepsi
14        use swclr_m, only: swclr
15        use swde_m, only: swde
16        use swr_m, only: swr
17    
18        ! ------------------------------------------------------------------
19        ! PURPOSE.
20        ! --------
21    
22        ! THIS ROUTINE COMPUTES THE SHORTWAVE RADIATION FLUXES IN THE
23        ! SECOND SPECTRAL INTERVAL FOLLOWING FOUQUART AND BONNEL (1980).
24    
25        ! METHOD.
26        ! -------
27    
28        ! 1. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING TO
29        ! CONTINUUM SCATTERING
30        ! 2. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING FOR
31        ! A GREY MOLECULAR ABSORPTION
32        ! 3. LAPLACE TRANSFORM ON THE PREVIOUS TO GET EFFECTIVE AMOUNTS
33        ! OF ABSORBERS
34        ! 4. APPLY H2O AND U.M.G. TRANSMISSION FUNCTIONS
35        ! 5. MULTIPLY BY OZONE TRANSMISSION FUNCTION
36    
37        ! REFERENCE.
38        ! ----------
39    
40        ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
41        ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
42    
43        ! AUTHOR.
44        ! -------
45        ! JEAN-JACQUES MORCRETTE  *ECMWF*
46    
47        ! MODIFICATIONS.
48        ! --------------
49        ! ORIGINAL : 89-07-14
50        ! 94-11-15   J.-J. MORCRETTE    DIRECT/DIFFUSE ALBEDO
51        ! ------------------------------------------------------------------
52        ! * ARGUMENTS:
53    
54        INTEGER knu
55        ! -OB
56        logical, intent(in):: flag_aer
57        DOUBLE PRECISION paki(kdlon, 2)
58        DOUBLE PRECISION palbd(kdlon, 2)
59        DOUBLE PRECISION palbp(kdlon, 2)
60        DOUBLE PRECISION pcg(kdlon, 2, kflev)
61        DOUBLE PRECISION pcld(kdlon, kflev)
62        DOUBLE PRECISION pclear(kdlon)
63        DOUBLE PRECISION pdsig(kdlon, kflev)
64        DOUBLE PRECISION pomega(kdlon, 2, kflev)
65        DOUBLE PRECISION poz(kdlon, kflev)
66        DOUBLE PRECISION pqs(kdlon, kflev)
67        DOUBLE PRECISION prmu(kdlon)
68        DOUBLE PRECISION psec(kdlon)
69        DOUBLE PRECISION ptau(kdlon, 2, kflev)
70        DOUBLE PRECISION pud(kdlon, 5, kflev+1)
71        DOUBLE PRECISION pwv(kdlon, kflev)
72    
73        DOUBLE PRECISION pfdown(kdlon, kflev+1)
74        DOUBLE PRECISION pfup(kdlon, kflev+1)
75    
76        ! * LOCAL VARIABLES:
77    
78        INTEGER iind2(2), iind3(3)
79        DOUBLE PRECISION zcgaz(kdlon, kflev)
80        DOUBLE PRECISION zfd(kdlon, kflev+1)
81        DOUBLE PRECISION zfu(kdlon, kflev+1)
82        DOUBLE PRECISION zg(kdlon)
83        DOUBLE PRECISION zgg(kdlon)
84        DOUBLE PRECISION zpizaz(kdlon, kflev)
85        DOUBLE PRECISION zrayl(kdlon)
86        DOUBLE PRECISION zray1(kdlon, kflev+1)
87        DOUBLE PRECISION zray2(kdlon, kflev+1)
88        DOUBLE PRECISION zref(kdlon)
89        DOUBLE PRECISION zrefz(kdlon, 2, kflev+1)
90        DOUBLE PRECISION zre1(kdlon)
91        DOUBLE PRECISION zre2(kdlon)
92        DOUBLE PRECISION zrj(kdlon, 6, kflev+1)
93        DOUBLE PRECISION zrj0(kdlon, 6, kflev+1)
94        DOUBLE PRECISION zrk(kdlon, 6, kflev+1)
95        DOUBLE PRECISION zrk0(kdlon, 6, kflev+1)
96        DOUBLE PRECISION zrl(kdlon, 8)
97        DOUBLE PRECISION zrmue(kdlon, kflev+1)
98        DOUBLE PRECISION zrmu0(kdlon, kflev+1)
99        DOUBLE PRECISION zrmuz(kdlon)
100        DOUBLE PRECISION zrneb(kdlon)
101        DOUBLE PRECISION zr1(kdlon)
102        DOUBLE PRECISION zr2(kdlon, 2)
103        DOUBLE PRECISION zr3(kdlon, 3)
104        DOUBLE PRECISION zr4(kdlon)
105        DOUBLE PRECISION zr21(kdlon)
106        DOUBLE PRECISION zr22(kdlon)
107        DOUBLE PRECISION zs(kdlon)
108        DOUBLE PRECISION ztauaz(kdlon, kflev)
109        DOUBLE PRECISION zto1(kdlon)
110        DOUBLE PRECISION ztr(kdlon, 2, kflev+1)
111        DOUBLE PRECISION ztra1(kdlon, kflev+1)
112        DOUBLE PRECISION ztra2(kdlon, kflev+1)
113        DOUBLE PRECISION ztr1(kdlon)
114        DOUBLE PRECISION ztr2(kdlon)
115        DOUBLE PRECISION zw(kdlon)
116        DOUBLE PRECISION zw1(kdlon)
117        DOUBLE PRECISION zw2(kdlon, 2)
118        DOUBLE PRECISION zw3(kdlon, 3)
119        DOUBLE PRECISION zw4(kdlon)
120        DOUBLE PRECISION zw5(kdlon)
121    
122        INTEGER jl, jk, k, jaj, ikm1, ikl, jn, jabs, jkm1
123        INTEGER jref, jkl, jklp1, jajp, jkki, jkkp4, jn2j, iabs
124        DOUBLE PRECISION zrmum1, zwh2o, zcneb, zaa, zbb, zrki, zre11
125    
126        ! * Prescribed Data:
127    
128        DOUBLE PRECISION rsun(2)
129        SAVE rsun
130        DOUBLE PRECISION rray(2, 6)
131        SAVE rray
132        DATA rsun(1)/0.441676d0/
133        DATA rsun(2)/0.558324d0/
134        DATA (rray(1,k), k=1, 6)/.428937d-01, .890743d+00, -.288555d+01, &
135             .522744d+01, -.469173d+01, .161645d+01/
136        DATA (rray(2,k), k=1, 6)/.697200d-02, .173297d-01, -.850903d-01, &
137             .248261d+00, -.302031d+00, .129662d+00/
138    
139        ! ------------------------------------------------------------------
140    
141    jn = 2      ! *         1.     SECOND SPECTRAL INTERVAL (0.68-4.00 MICRON)
142        ! -------------------------------------------
143    
   DO jabs = 1, 2  
144    
145    
146      ! *         3.1  SURFACE CONDITIONS      ! *         1.1    OPTICAL THICKNESS FOR RAYLEIGH SCATTERING
147      ! ------------------      ! -----------------------------------------
148    
149    
150      DO jl = 1, kdlon      DO jl = 1, kdlon
151        zrefz(jl, 2, 1) = palbd(jl, knu)         zrmum1 = 1. - prmu(jl)
152        zrefz(jl, 1, 1) = palbd(jl, knu)         zrayl(jl) = rray(knu, 1) + zrmum1*(rray(knu,2)+zrmum1*(rray(knu, &
153                3)+zrmum1*(rray(knu,4)+zrmum1*(rray(knu,5)+zrmum1*rray(knu,6)))))
154      END DO      END DO
155    
156    
157      ! *         3.2  INTRODUCING CLOUD EFFECTS      ! ------------------------------------------------------------------
     ! -------------------------  
158    
159        ! *         2.    CONTINUUM SCATTERING CALCULATIONS
160        ! ---------------------------------
161    
     DO jk = 2, kflev + 1  
       jkm1 = jk - 1  
       ikl = kflev + 1 - jkm1  
       DO jl = 1, kdlon  
         zrneb(jl) = pcld(jl, jkm1)  
         IF (jabs==1 .AND. zrneb(jl)>2.*zeelog) THEN  
           zwh2o = max(pwv(jl,jkm1), zeelog)  
           zcneb = max(zeelog, min(zrneb(jl),1.-zeelog))  
           zbb = pud(jl, jabs, jkm1)*pqs(jl, jkm1)/zwh2o  
           zaa = max((pud(jl,jabs,jkm1)-zcneb*zbb)/(1.-zcneb), zeelog)  
         ELSE  
           zaa = pud(jl, jabs, jkm1)  
           zbb = zaa  
         END IF  
         zrki = paki(jl, jabs)  
         zs(jl) = exp(-zrki*zaa*1.66)  
         zg(jl) = exp(-zrki*zaa/zrmue(jl,jk))  
         ztr1(jl) = 0.  
         zre1(jl) = 0.  
         ztr2(jl) = 0.  
         zre2(jl) = 0.  
162    
163          zw(jl) = pomega(jl, knu, jkm1)      ! *         2.1   CLEAR-SKY FRACTION OF THE COLUMN
164          zto1(jl) = ptau(jl, knu, jkm1)/zw(jl) + ztauaz(jl, jkm1)/zpizaz(jl, &      ! --------------------------------
           jkm1) + zbb*zrki  
165    
         zr21(jl) = ptau(jl, knu, jkm1) + ztauaz(jl, jkm1)  
         zr22(jl) = ptau(jl, knu, jkm1)/zr21(jl)  
         zgg(jl) = zr22(jl)*pcg(jl, knu, jkm1) + (1.-zr22(jl))*zcgaz(jl, jkm1)  
         zw(jl) = zr21(jl)/zto1(jl)  
         zref(jl) = zrefz(jl, 1, jkm1)  
         zrmuz(jl) = zrmue(jl, jk)  
       END DO  
166    
167        CALL swde(zgg, zref, zrmuz, zto1, zw, zre1, zre2, ztr1, ztr2)      CALL swclr(knu, flag_aer, palbp, pdsig, zrayl, psec, zcgaz, zpizaz, &
168             zray1, zray2, zrefz, zrj0, zrk0, zrmu0, ztauaz, ztra1, ztra2)
169    
       DO jl = 1, kdlon  
170    
171          zrefz(jl, 2, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,2,jkm1)* &      ! *         2.2   CLOUDY FRACTION OF THE COLUMN
172            ztra1(jl,jkm1)*ztra2(jl,jkm1))*zg(jl)*zs(jl) + zrneb(jl)*zre1(jl)      ! -----------------------------
173    
         ztr(jl, 2, jkm1) = zrneb(jl)*ztr1(jl) + (ztra1(jl,jkm1))*zg(jl)*(1.- &  
           zrneb(jl))  
174    
175          zrefz(jl, 1, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,1,jkm1)* &      CALL swr(knu, palbd, pcg, pcld, pomega, psec, ptau, zcgaz, &
176            ztra1(jl,jkm1)*ztra2(jl,jkm1)/(1.-zray2(jl,jkm1)*zrefz(jl,1, &           zpizaz, zray1, zray2, zrefz, zrj, zrk, zrmue, ztauaz, ztra1, ztra2)
           jkm1)))*zg(jl)*zs(jl) + zrneb(jl)*zre2(jl)  
177    
         ztr(jl, 1, jkm1) = zrneb(jl)*ztr2(jl) + (ztra1(jl,jkm1)/(1.-zray2(jl, &  
           jkm1)*zrefz(jl,1,jkm1)))*zg(jl)*(1.-zrneb(jl))  
178    
179        END DO      ! ------------------------------------------------------------------
     END DO  
180    
181      ! *         3.3  REFLECT./TRANSMISSIVITY BETWEEN SURFACE AND LEVEL      ! *         3.    SCATTERING CALCULATIONS WITH GREY MOLECULAR ABSORPTION
182      ! -------------------------------------------------      ! ------------------------------------------------------
183    
184    
185      DO jref = 1, 2      jn = 2
186    
187        jn = jn + 1      DO jabs = 1, 2
188    
       DO jl = 1, kdlon  
         zrj(jl, jn, kflev+1) = 1.  
         zrk(jl, jn, kflev+1) = zrefz(jl, jref, kflev+1)  
       END DO  
189    
190        DO jk = 1, kflev         ! *         3.1  SURFACE CONDITIONS
191          jkl = kflev + 1 - jk         ! ------------------
         jklp1 = jkl + 1  
         DO jl = 1, kdlon  
           zre11 = zrj(jl, jn, jklp1)*ztr(jl, jref, jkl)  
           zrj(jl, jn, jkl) = zre11  
           zrk(jl, jn, jkl) = zre11*zrefz(jl, jref, jkl)  
         END DO  
       END DO  
     END DO  
   END DO  
192    
193    
194    ! ------------------------------------------------------------------         DO jl = 1, kdlon
195              zrefz(jl, 2, 1) = palbd(jl, knu)
196              zrefz(jl, 1, 1) = palbd(jl, knu)
197           END DO
198    
   ! *         4.    INVERT GREY AND CONTINUUM FLUXES  
   ! --------------------------------  
199    
200           ! *         3.2  INTRODUCING CLOUD EFFECTS
201           ! -------------------------
202    
203    
204    ! *         4.1   UPWARD (ZRK) AND DOWNWARD (ZRJ) PSEUDO-FLUXES         DO jk = 2, kflev + 1
205    ! ---------------------------------------------            jkm1 = jk - 1
206              ikl = kflev + 1 - jkm1
207              DO jl = 1, kdlon
208                 zrneb(jl) = pcld(jl, jkm1)
209                 IF (jabs==1 .AND. zrneb(jl)>2.*zeelog) THEN
210                    zwh2o = max(pwv(jl,jkm1), zeelog)
211                    zcneb = max(zeelog, min(zrneb(jl),1.-zeelog))
212                    zbb = pud(jl, jabs, jkm1)*pqs(jl, jkm1)/zwh2o
213                    zaa = max((pud(jl,jabs,jkm1)-zcneb*zbb)/(1.-zcneb), zeelog)
214                 ELSE
215                    zaa = pud(jl, jabs, jkm1)
216                    zbb = zaa
217                 END IF
218                 zrki = paki(jl, jabs)
219                 zs(jl) = exp(-zrki*zaa*1.66)
220                 zg(jl) = exp(-zrki*zaa/zrmue(jl,jk))
221                 ztr1(jl) = 0.
222                 zre1(jl) = 0.
223                 ztr2(jl) = 0.
224                 zre2(jl) = 0.
225    
226                 zw(jl) = pomega(jl, knu, jkm1)
227                 zto1(jl) = ptau(jl, knu, jkm1)/zw(jl) + ztauaz(jl, jkm1)/zpizaz(jl, &
228                      jkm1) + zbb*zrki
229    
230    DO jk = 1, kflev + 1               zr21(jl) = ptau(jl, knu, jkm1) + ztauaz(jl, jkm1)
231      DO jaj = 1, 5, 2               zr22(jl) = ptau(jl, knu, jkm1)/zr21(jl)
232        jajp = jaj + 1               zgg(jl) = zr22(jl)*pcg(jl, knu, jkm1) + (1.-zr22(jl))*zcgaz(jl, jkm1)
233        DO jl = 1, kdlon               zw(jl) = zr21(jl)/zto1(jl)
234          zrj(jl, jaj, jk) = zrj(jl, jaj, jk) - zrj(jl, jajp, jk)               zref(jl) = zrefz(jl, 1, jkm1)
235          zrk(jl, jaj, jk) = zrk(jl, jaj, jk) - zrk(jl, jajp, jk)               zrmuz(jl) = zrmue(jl, jk)
236          zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)            END DO
         zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)  
       END DO  
     END DO  
   END DO  
237    
238    DO jk = 1, kflev + 1            CALL swde(zgg, zref, zrmuz, zto1, zw, zre1, zre2, ztr1, ztr2)
239      DO jaj = 2, 6, 2  
240        DO jl = 1, kdlon            DO jl = 1, kdlon
         zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)  
         zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)  
       END DO  
     END DO  
   END DO  
241    
242    ! *         4.2    EFFECTIVE ABSORBER AMOUNTS BY INVERSE LAPLACE               zrefz(jl, 2, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,2,jkm1)* &
243    ! ---------------------------------------------                    ztra1(jl,jkm1)*ztra2(jl,jkm1))*zg(jl)*zs(jl) + zrneb(jl)*zre1(jl)
244    
245                 ztr(jl, 2, jkm1) = zrneb(jl)*ztr1(jl) + (ztra1(jl,jkm1))*zg(jl)*(1.- &
246                      zrneb(jl))
247    
248    DO jk = 1, kflev + 1               zrefz(jl, 1, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,1,jkm1)* &
249      jkki = 1                    ztra1(jl,jkm1)*ztra2(jl,jkm1)/(1.-zray2(jl,jkm1)*zrefz(jl,1, &
250      DO jaj = 1, 2                    jkm1)))*zg(jl)*zs(jl) + zrneb(jl)*zre2(jl)
       iind2(1) = jaj  
       iind2(2) = jaj  
       DO jn = 1, 2  
         jn2j = jn + 2*jaj  
         jkkp4 = jkki + 4  
251    
252          ! *         4.2.1  EFFECTIVE ABSORBER AMOUNTS               ztr(jl, 1, jkm1) = zrneb(jl)*ztr2(jl) + (ztra1(jl,jkm1)/(1.-zray2(jl, &
253          ! --------------------------                    jkm1)*zrefz(jl,1,jkm1)))*zg(jl)*(1.-zrneb(jl))
254    
255              END DO
256           END DO
257    
258          DO jl = 1, kdlon         ! *         3.3  REFLECT./TRANSMISSIVITY BETWEEN SURFACE AND LEVEL
259            zw2(jl, 1) = log(zrj(jl,jn,jk)/zrj(jl,jn2j,jk))/paki(jl, jaj)         ! -------------------------------------------------
           zw2(jl, 2) = log(zrk(jl,jn,jk)/zrk(jl,jn2j,jk))/paki(jl, jaj)  
         END DO  
260    
         ! *         4.2.2  TRANSMISSION FUNCTION  
         ! ---------------------  
261    
262           DO jref = 1, 2
263    
264          CALL swtt1(knu, 2, iind2, zw2, zr2)            jn = jn + 1
265    
266          DO jl = 1, kdlon            DO jl = 1, kdlon
267            zrl(jl, jkki) = zr2(jl, 1)               zrj(jl, jn, kflev+1) = 1.
268            zruef(jl, jkki) = zw2(jl, 1)               zrk(jl, jn, kflev+1) = zrefz(jl, jref, kflev+1)
269            zrl(jl, jkkp4) = zr2(jl, 2)            END DO
           zruef(jl, jkkp4) = zw2(jl, 2)  
         END DO  
270    
271          jkki = jkki + 1            DO jk = 1, kflev
272        END DO               jkl = kflev + 1 - jk
273                 jklp1 = jkl + 1
274                 DO jl = 1, kdlon
275                    zre11 = zrj(jl, jn, jklp1)*ztr(jl, jref, jkl)
276                    zrj(jl, jn, jkl) = zre11
277                    zrk(jl, jn, jkl) = zre11*zrefz(jl, jref, jkl)
278                 END DO
279              END DO
280           END DO
281      END DO      END DO
282    
     ! *         4.3    UPWARD AND DOWNWARD FLUXES WITH H2O AND UMG ABSORPTION  
     ! ------------------------------------------------------  
283    
284        ! ------------------------------------------------------------------
285    
286      DO jl = 1, kdlon      ! *         4.    INVERT GREY AND CONTINUUM FLUXES
287        pfdown(jl, jk) = zrj(jl, 1, jk)*zrl(jl, 1)*zrl(jl, 3) + &      ! --------------------------------
288          zrj(jl, 2, jk)*zrl(jl, 2)*zrl(jl, 4)  
289        pfup(jl, jk) = zrk(jl, 1, jk)*zrl(jl, 5)*zrl(jl, 7) + &  
290          zrk(jl, 2, jk)*zrl(jl, 6)*zrl(jl, 8)  
291        ! *         4.1   UPWARD (ZRK) AND DOWNWARD (ZRJ) PSEUDO-FLUXES
292        ! ---------------------------------------------
293    
294    
295        DO jk = 1, kflev + 1
296           DO jaj = 1, 5, 2
297              jajp = jaj + 1
298              DO jl = 1, kdlon
299                 zrj(jl, jaj, jk) = zrj(jl, jaj, jk) - zrj(jl, jajp, jk)
300                 zrk(jl, jaj, jk) = zrk(jl, jaj, jk) - zrk(jl, jajp, jk)
301                 zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)
302                 zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)
303              END DO
304           END DO
305      END DO      END DO
   END DO  
306    
307        DO jk = 1, kflev + 1
308           DO jaj = 2, 6, 2
309              DO jl = 1, kdlon
310                 zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)
311                 zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)
312              END DO
313           END DO
314        END DO
315    
316    ! ------------------------------------------------------------------      ! *         4.2    EFFECTIVE ABSORBER AMOUNTS BY INVERSE LAPLACE
317        ! ---------------------------------------------
318    
   ! *         5.    MOLECULAR ABSORPTION ON CLEAR-SKY FLUXES  
   ! ----------------------------------------  
319    
320        DO jk = 1, kflev + 1
321           jkki = 1
322           DO jaj = 1, 2
323              iind2(1) = jaj
324              iind2(2) = jaj
325              DO jn = 1, 2
326                 jn2j = jn + 2*jaj
327                 jkkp4 = jkki + 4
328    
329                 ! *         4.2.1  EFFECTIVE ABSORBER AMOUNTS
330                 ! --------------------------
331    
   ! *         5.1   DOWNWARD FLUXES  
   ! ---------------  
332    
333                 DO jl = 1, kdlon
334                    zw2(jl, 1) = log(zrj(jl,jn,jk)/zrj(jl,jn2j,jk))/paki(jl, jaj)
335                    zw2(jl, 2) = log(zrk(jl,jn,jk)/zrk(jl,jn2j,jk))/paki(jl, jaj)
336                 END DO
337    
338    jaj = 2               ! *         4.2.2  TRANSMISSION FUNCTION
339    iind3(1) = 1               ! ---------------------
   iind3(2) = 2  
   iind3(3) = 3  
340    
   DO jl = 1, kdlon  
     zw3(jl, 1) = 0.  
     zw3(jl, 2) = 0.  
     zw3(jl, 3) = 0.  
     zw4(jl) = 0.  
     zw5(jl) = 0.  
     zr4(jl) = 1.  
     zfd(jl, kflev+1) = zrj0(jl, jaj, kflev+1)  
   END DO  
   DO jk = 1, kflev  
     ikl = kflev + 1 - jk  
     DO jl = 1, kdlon  
       zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikl)/zrmu0(jl, ikl)  
       zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikl)/zrmu0(jl, ikl)  
       zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikl)/zrmu0(jl, ikl)  
       zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmu0(jl, ikl)  
       zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmu0(jl, ikl)  
     END DO  
341    
342      CALL swtt1(knu, 3, iind3, zw3, zr3)               CALL swtt1(knu, 2, iind2, zw2, zr2)
343    
344      DO jl = 1, kdlon               DO jl = 1, kdlon
345        ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))                  zrl(jl, jkki) = zr2(jl, 1)
346        zfd(jl, ikl) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &                  zrl(jl, jkkp4) = zr2(jl, 2)
347          zrj0(jl, jaj, ikl)               END DO
348    
349                 jkki = jkki + 1
350              END DO
351           END DO
352    
353           ! *         4.3    UPWARD AND DOWNWARD FLUXES WITH H2O AND UMG ABSORPTION
354           ! ------------------------------------------------------
355    
356    
357           DO jl = 1, kdlon
358              pfdown(jl, jk) = zrj(jl, 1, jk)*zrl(jl, 1)*zrl(jl, 3) + &
359                   zrj(jl, 2, jk)*zrl(jl, 2)*zrl(jl, 4)
360              pfup(jl, jk) = zrk(jl, 1, jk)*zrl(jl, 5)*zrl(jl, 7) + &
361                   zrk(jl, 2, jk)*zrl(jl, 6)*zrl(jl, 8)
362           END DO
363      END DO      END DO
   END DO  
364    
365    
366    ! *         5.2   UPWARD FLUXES      ! ------------------------------------------------------------------
367    ! -------------  
368        ! *         5.    MOLECULAR ABSORPTION ON CLEAR-SKY FLUXES
369        ! ----------------------------------------
370    
371    
   DO jl = 1, kdlon  
     zfu(jl, 1) = zfd(jl, 1)*palbp(jl, knu)  
   END DO  
372    
373    DO jk = 2, kflev + 1      ! *         5.1   DOWNWARD FLUXES
374      ikm1 = jk - 1      ! ---------------
375    
376    
377        jaj = 2
378        iind3(1) = 1
379        iind3(2) = 2
380        iind3(3) = 3
381    
382      DO jl = 1, kdlon      DO jl = 1, kdlon
383        zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikm1)*1.66         zw3(jl, 1) = 0.
384        zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikm1)*1.66         zw3(jl, 2) = 0.
385        zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikm1)*1.66         zw3(jl, 3) = 0.
386        zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66         zw4(jl) = 0.
387        zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66         zw5(jl) = 0.
388           zr4(jl) = 1.
389           zfd(jl, kflev+1) = zrj0(jl, jaj, kflev+1)
390        END DO
391        DO jk = 1, kflev
392           ikl = kflev + 1 - jk
393           DO jl = 1, kdlon
394              zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikl)/zrmu0(jl, ikl)
395              zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikl)/zrmu0(jl, ikl)
396              zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikl)/zrmu0(jl, ikl)
397              zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmu0(jl, ikl)
398              zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmu0(jl, ikl)
399           END DO
400    
401           CALL swtt1(knu, 3, iind3, zw3, zr3)
402    
403           DO jl = 1, kdlon
404              ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
405              zfd(jl, ikl) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &
406                   zrj0(jl, jaj, ikl)
407           END DO
408      END DO      END DO
409    
410      CALL swtt1(knu, 3, iind3, zw3, zr3)  
411        ! *         5.2   UPWARD FLUXES
412        ! -------------
413    
414    
415      DO jl = 1, kdlon      DO jl = 1, kdlon
416        ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))         zfu(jl, 1) = zfd(jl, 1)*palbp(jl, knu)
       zfu(jl, jk) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &  
         zrk0(jl, jaj, jk)  
417      END DO      END DO
   END DO  
418    
419        DO jk = 2, kflev + 1
420           ikm1 = jk - 1
421           DO jl = 1, kdlon
422              zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikm1)*1.66
423              zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikm1)*1.66
424              zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikm1)*1.66
425              zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66
426              zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66
427           END DO
428    
429    ! ------------------------------------------------------------------         CALL swtt1(knu, 3, iind3, zw3, zr3)
430    
431    ! *         6.     INTRODUCTION OF OZONE AND H2O CONTINUUM ABSORPTION         DO jl = 1, kdlon
432    ! --------------------------------------------------            ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
433              zfu(jl, jk) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &
434                   zrk0(jl, jaj, jk)
435           END DO
436        END DO
437    
   iabs = 3  
438    
439    ! *         6.1    DOWNWARD FLUXES      ! ------------------------------------------------------------------
   ! ---------------  
440    
441    DO jl = 1, kdlon      ! *         6.     INTRODUCTION OF OZONE AND H2O CONTINUUM ABSORPTION
442      zw1(jl) = 0.      ! --------------------------------------------------
     zw4(jl) = 0.  
     zw5(jl) = 0.  
     zr1(jl) = 0.  
     pfdown(jl, kflev+1) = ((1.-pclear(jl))*pfdown(jl,kflev+1)+pclear(jl)*zfd( &  
       jl,kflev+1))*rsun(knu)  
   END DO  
443    
444    DO jk = 1, kflev      iabs = 3
     ikl = kflev + 1 - jk  
     DO jl = 1, kdlon  
       zw1(jl) = zw1(jl) + poz(jl, ikl)/zrmue(jl, ikl)  
       zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmue(jl, ikl)  
       zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmue(jl, ikl)  
       ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))  
     END DO  
445    
446      CALL swtt(knu, iabs, zw1, zr1)      ! *         6.1    DOWNWARD FLUXES
447        ! ---------------
448    
449      DO jl = 1, kdlon      DO jl = 1, kdlon
450        pfdown(jl, ikl) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfdown(jl,ikl)+ &         zw1(jl) = 0.
451          pclear(jl)*zfd(jl,ikl))*rsun(knu)         zw4(jl) = 0.
452           zw5(jl) = 0.
453           zr1(jl) = 0.
454           pfdown(jl, kflev+1) = ((1.-pclear(jl))*pfdown(jl,kflev+1)+pclear(jl)*zfd( &
455                jl,kflev+1))*rsun(knu)
456        END DO
457    
458        DO jk = 1, kflev
459           ikl = kflev + 1 - jk
460           DO jl = 1, kdlon
461              zw1(jl) = zw1(jl) + poz(jl, ikl)/zrmue(jl, ikl)
462              zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmue(jl, ikl)
463              zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmue(jl, ikl)
464              ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
465           END DO
466    
467           CALL swtt(knu, iabs, zw1, zr1)
468    
469           DO jl = 1, kdlon
470              pfdown(jl, ikl) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfdown(jl,ikl)+ &
471                   pclear(jl)*zfd(jl,ikl))*rsun(knu)
472           END DO
473      END DO      END DO
   END DO  
474    
475    
476    ! *         6.2    UPWARD FLUXES      ! *         6.2    UPWARD FLUXES
477    ! -------------      ! -------------
478    
   DO jl = 1, kdlon  
     pfup(jl, 1) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,1)+pclear(jl)*zfu( &  
       jl,1))*rsun(knu)  
   END DO  
   
   DO jk = 2, kflev + 1  
     ikm1 = jk - 1  
479      DO jl = 1, kdlon      DO jl = 1, kdlon
480        zw1(jl) = zw1(jl) + poz(jl, ikm1)*1.66         pfup(jl, 1) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,1)+pclear(jl)*zfu( &
481        zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66              jl,1))*rsun(knu)
       zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66  
       ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))  
482      END DO      END DO
483    
484      CALL swtt(knu, iabs, zw1, zr1)      DO jk = 2, kflev + 1
485           ikm1 = jk - 1
486           DO jl = 1, kdlon
487              zw1(jl) = zw1(jl) + poz(jl, ikm1)*1.66
488              zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66
489              zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66
490              ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
491           END DO
492    
493           CALL swtt(knu, iabs, zw1, zr1)
494    
495      DO jl = 1, kdlon         DO jl = 1, kdlon
496        pfup(jl, jk) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,jk)+pclear(jl)* &            pfup(jl, jk) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,jk)+pclear(jl)* &
497          zfu(jl,jk))*rsun(knu)                 zfu(jl,jk))*rsun(knu)
498           END DO
499      END DO      END DO
   END DO  
500    
501    ! ------------------------------------------------------------------    END SUBROUTINE sw2s
502    
503    RETURN  end module sw2s_m
 END SUBROUTINE sw2s  

Legend:
Removed from v.134  
changed lines
  Added in v.217

  ViewVC Help
Powered by ViewVC 1.1.21