source: trunk/LMDZ.PLUTO/libf/phypluto/sfluxi.F @ 3585

Last change on this file since 3585 was 3275, checked in by afalco, 11 months ago

Pluto PCM:
Changed _vap to _gas;
Included surfprop.F90;
callcorrk includes methane
AF

File size: 7.2 KB
RevLine 
[3184]1      module sfluxi_mod
[3275]2
[3184]3      implicit none
[3275]4
[3184]5      contains
[3275]6
[3184]7      SUBROUTINE SFLUXI(PLEV,TLEV,DTAUI,TAUCUMI,UBARI,RSFI,WNOI,DWNI,
8     *                  COSBI,WBARI,NFLUXTOPI,NFLUXTOPI_nu,
[3275]9     *                  FMNETI,fmneti_nu,fluxupi,fluxdni,fluxupi_nu,
[3184]10     *                  FZEROI,TAUGSURF)
[3275]11
[3184]12      use radinc_h, only: NTfac, NTstart, L_LEVELS, L_NSPECTI, L_NGAUSS
13      use radinc_h, only: L_NLAYRAD, L_NLEVRAD
14      use radcommon_h, only: planckir, tlimit,sigma, gweight
15      use comcstfi_mod, only: pi
16      use gfluxi_mod, only: gfluxi
[3275]17
[3184]18      implicit none
[3275]19
[3184]20      integer NLEVRAD, L, NW, NG, NTS, NTT
[3275]21
[3184]22      real*8 TLEV(L_LEVELS), PLEV(L_LEVELS)
23      real*8 TAUCUMI(L_LEVELS,L_NSPECTI,L_NGAUSS)
24      real*8 FMNETI(L_NLAYRAD)
[3275]25      real*8 FMNETI_NU(L_NLAYRAD,L_NSPECTI)
[3184]26      real*8 WNOI(L_NSPECTI), DWNI(L_NSPECTI)
27      real*8 DTAUI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
28      real*8 FMUPI(L_NLEVRAD), FMDI(L_NLEVRAD)
29      real*8 COSBI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
30      real*8 WBARI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
31      real*8 NFLUXTOPI
32      real*8 NFLUXTOPI_nu(L_NSPECTI)
33      real*8 fluxupi_nu(L_NLAYRAD,L_NSPECTI)
34      real*8 FTOPUP
[3275]35
[3184]36      real*8 UBARI, RSFI, TSURF, BSURF, TTOP, BTOP, TAUTOP
37      real*8 PLANCK, PLTOP
38      real*8 fluxupi(L_NLAYRAD), fluxdni(L_NLAYRAD)
39      real*8 FZEROI(L_NSPECTI)
40      real*8 taugsurf(L_NSPECTI,L_NGAUSS-1), fzero
[3275]41
[3184]42      real*8 fup_tmp(L_NSPECTI),fdn_tmp(L_NSPECTI)
43      real*8 PLANCKSUM,PLANCKREF
[3275]44
[3184]45! AB : variables for interpolation
46      REAL*8 C1
47      REAL*8 C2
48      REAL*8 P1
[3275]49
[3184]50!======================================================================C
[3275]51
[3184]52      NLEVRAD = L_NLEVRAD
[3275]53
[3184]54! ZERO THE NET FLUXES
55      NFLUXTOPI = 0.0D0
[3275]56
[3184]57      DO NW=1,L_NSPECTI
58        NFLUXTOPI_nu(NW) = 0.0D0
59        DO L=1,L_NLAYRAD
60           FLUXUPI_nu(L,NW) = 0.0D0
[3275]61           FMNETI_nu(L,NW)  = 0.0
[3184]62           fup_tmp(nw)=0.0D0
63           fdn_tmp(nw)=0.0D0
64        END DO
65      END DO
[3275]66
[3184]67      DO L=1,L_NLAYRAD
68        FMNETI(L)  = 0.0D0
69        FLUXUPI(L) = 0.0D0
70        FLUXDNI(L) = 0.0D0
71      END DO
[3275]72
[3184]73! WE NOW ENTER A MAJOR LOOP OVER SPECTRAL INTERVALS IN THE INFRARED
74! TO CALCULATE THE NET FLUX IN EACH SPECTRAL INTERVAL
[3275]75
[3184]76      TTOP  = TLEV(2)  ! JL12 why not (1) ???
77      TSURF = TLEV(L_LEVELS)
78
79      NTS   = int(TSURF*NTfac)-NTstart+1
80      NTT   = int(TTOP *NTfac)-NTstart+1
81
82!JL12 corrects the surface planck function so that its integral is equal to sigma Tsurf^4
83!JL12 this ensure that no flux is lost due to:
84!JL12          -truncation of the planck function at high/low wavenumber
85!JL12          -numerical error during first spectral integration
86!JL12          -discrepancy between Tsurf and NTS/NTfac
87      PLANCKSUM = 0.d0
88      PLANCKREF = TSURF * TSURF
89      PLANCKREF = sigma * PLANCKREF * PLANCKREF
[3275]90
[3184]91      DO NW=1,L_NSPECTI
92! AB : PLANCKIR(NW,NTS) is replaced by P1, the linear interpolation result for a temperature TSURF
93         C1 = TSURF * NTfac - int(TSURF * NTfac)
94         P1 = (1.0D0 - C1) * PLANCKIR(NW,NTS) + C1 * PLANCKIR(NW,NTS+1)
95         PLANCKSUM = PLANCKSUM + P1 * DWNI(NW)
96      ENDDO
[3275]97
[3184]98      PLANCKSUM = PLANCKREF / (PLANCKSUM * Pi)
99!JL12
[3275]100
[3184]101      DO 501 NW=1,L_NSPECTI
102! SURFACE EMISSIONS - INDEPENDENT OF GAUSS POINTS
103! AB : PLANCKIR(NW,NTS) is replaced by P1, the linear interpolation result for a temperature TSURF
104! AB : idem for PLANCKIR(NW,NTT) and PLTOP
105         C1 = TSURF * NTfac - int(TSURF * NTfac)
106         C2 = TTOP  * NTfac - int(TTOP  * NTfac)
107         P1 = (1.0D0 - C1) * PLANCKIR(NW,NTS) + C1 * PLANCKIR(NW,NTS+1)
108         BSURF = (1. - RSFI) * P1 * PLANCKSUM
109         PLTOP = (1.0D0 - C2) * PLANCKIR(NW,NTT) + C2*PLANCKIR(NW,NTT+1)
[3275]110
[3184]111! If FZEROI(NW) = 1, then the k-coefficients are zero - skip to the
112! special Gauss point at the end.
113         FZERO = FZEROI(NW)
[3275]114
[3184]115         IF(FZERO.ge.0.99) goto 40
[3275]116
[3184]117         DO NG=1,L_NGAUSS-1
[3275]118
[3184]119            if(TAUGSURF(NW,NG).lt. TLIMIT) then
120               fzero = fzero + (1.0D0-FZEROI(NW))*GWEIGHT(NG)
121               goto 30
122            end if
[3275]123
[3184]124! SET UP THE UPPER AND LOWER BOUNDARY CONDITIONS ON THE IR
125! CALCULATE THE DOWNWELLING RADIATION AT THE TOP OF THE MODEL
126! OR THE TOP LAYER WILL COOL TO SPACE UNPHYSICALLY
[3275]127
[3184]128!            TAUTOP = DTAUI(1,NW,NG)*PLEV(2)/(PLEV(4)-PLEV(2))
129            TAUTOP = TAUCUMI(2,NW,NG)
130            BTOP   = (1.0D0-EXP(-TAUTOP/UBARI))*PLTOP
[3275]131
[3184]132! WE CAN NOW SOLVE FOR THE COEFFICIENTS OF THE TWO STREAM
133! CALL A SUBROUTINE THAT SOLVES  FOR THE FLUX TERMS
[3275]134! WITHIN EACH INTERVAL AT THE MIDPOINT WAVENUMBER
135
[3184]136            CALL GFLUXI(NLEVRAD,TLEV,NW,DWNI(NW),DTAUI(1,NW,NG),
137     *                TAUCUMI(1,NW,NG),
138     *                WBARI(1,NW,NG),COSBI(1,NW,NG),UBARI,RSFI,BTOP,
139     *                BSURF,FTOPUP,FMUPI,FMDI)
[3275]140
[3184]141! NOW CALCULATE THE CUMULATIVE IR NET FLUX
142            NFLUXTOPI = NFLUXTOPI+FTOPUP*DWNI(NW)*GWEIGHT(NG)
143     *                * (1.0D0-FZEROI(NW))
[3275]144
[3184]145! and same thing by spectral band... (RDW)
146            NFLUXTOPI_nu(NW) = NFLUXTOPI_nu(NW) + FTOPUP * DWNI(NW)
147     *                       * GWEIGHT(NG) * (1.0D0-FZEROI(NW))
[3275]148
[3184]149            DO L=1,L_NLEVRAD-1
150!           CORRECT FOR THE WAVENUMBER INTERVALS
151               FMNETI(L)  = FMNETI(L) + (FMUPI(L)-FMDI(L)) * DWNI(NW)
152     *                    * GWEIGHT(NG)*(1.0D0-FZEROI(NW))
[3275]153               FMNETI_NU(L,NW)  = FMNETI_NU(L,NW) + (FMUPI(L)-FMDI(L))
154     *                    * DWNI(NW) * GWEIGHT(NG)*(1.0D0-FZEROI(NW))
[3184]155               FLUXUPI(L) = FLUXUPI(L) + FMUPI(L)*DWNI(NW)*GWEIGHT(NG)
156     *                    * (1.0D0-FZEROI(NW))
157               FLUXDNI(L) = FLUXDNI(L) + FMDI(L)*DWNI(NW)*GWEIGHT(NG)
158     *                    * (1.0D0-FZEROI(NW))
159!         and same thing by spectral band... (RW)
160               FLUXUPI_nu(L,NW) = FLUXUPI_nu(L,NW) + FMUPI(L)*DWNI(NW)
161     *                          * GWEIGHT(NG) * (1.0D0 - FZEROI(NW))
162            END DO
[3275]163
[3184]164   30       CONTINUE
[3275]165
[3184]166         END DO       !End NGAUSS LOOP
[3275]167
[3184]168   40    CONTINUE
[3275]169
[3184]170! SPECIAL 17th Gauss point
171         NG     = L_NGAUSS
[3275]172
[3184]173!         TAUTOP = DTAUI(1,NW,NG)*PLEV(2)/(PLEV(4)-PLEV(2))
174         TAUTOP = TAUCUMI(2,NW,NG)
175         BTOP   = (1.0D0-EXP(-TAUTOP/UBARI))*PLTOP
[3275]176
[3184]177! WE CAN NOW SOLVE FOR THE COEFFICIENTS OF THE TWO STREAM
178! CALL A SUBROUTINE THAT SOLVES  FOR THE FLUX TERMS
[3275]179! WITHIN EACH INTERVAL AT THE MIDPOINT WAVENUMBER
180
[3184]181         CALL GFLUXI(NLEVRAD,TLEV,NW,DWNI(NW),DTAUI(1,NW,NG),
182     *                TAUCUMI(1,NW,NG),
183     *                WBARI(1,NW,NG),COSBI(1,NW,NG),UBARI,RSFI,BTOP,
184     *                BSURF,FTOPUP,FMUPI,FMDI)
[3275]185
[3184]186! NOW CALCULATE THE CUMULATIVE IR NET FLUX
187         NFLUXTOPI = NFLUXTOPI+FTOPUP*DWNI(NW)*FZERO
[3275]188
[3184]189!         and same thing by spectral band... (RW)
190         NFLUXTOPI_nu(NW) = NFLUXTOPI_nu(NW)
191     *      +FTOPUP*DWNI(NW)*FZERO
[3275]192
[3184]193         DO L=1,L_NLEVRAD-1
194! CORRECT FOR THE WAVENUMBER INTERVALS
195            FMNETI(L)  = FMNETI(L)+(FMUPI(L)-FMDI(L))*DWNI(NW)*FZERO
[3275]196            FMNETI_nu(L,NW)  = FMNETI_nu(L,NW)+(FMUPI(L)-FMDI(L))
197     *       *DWNI(NW)*FZERO
[3184]198            FLUXUPI(L) = FLUXUPI(L) + FMUPI(L)*DWNI(NW)*FZERO
199            FLUXDNI(L) = FLUXDNI(L) + FMDI(L)*DWNI(NW)*FZERO
200! and same thing by spectral band... (RW)
201            FLUXUPI_nu(L,NW) = FLUXUPI_nu(L,NW)
202     *                       + FMUPI(L) * DWNI(NW) * FZERO
203         END DO
[3275]204
[3184]205  501 CONTINUE      !End Spectral Interval LOOP
206! *** END OF MAJOR SPECTRAL INTERVAL LOOP IN THE INFRARED****
[3275]207
[3184]208      END SUBROUTINE SFLUXI
209
210      end module sfluxi_mod
Note: See TracBrowser for help on using the repository browser.