source: trunk/LMDZ.MARS/libf/phymars/lwflux.F @ 3726

Last change on this file since 3726 was 3726, checked in by emillour, 8 weeks ago

Mars PCM:
Turn "callkeys.h" into module "callkeys_mod.F90"
EM

File size: 11.3 KB
Line 
1      module lwflux_mod
2     
3      implicit none
4     
5      contains
6     
7      subroutine lwflux (ig0,kdlon,kflev,dp
8     .                   ,bsurf,btop,blev,blay,dbsublay
9     .                   ,tlay, tlev, dt0      ! pour sortie dans g2d uniquement
10     .                   ,emis
11     .                   , tautotal,omegtotal,gtotal
12     .                   ,coolrate,fluxground,fluxtop
13     .                   ,netrad)
14
15c----------------------------------------------------------------------
16c     LWFLUX     computes the fluxes
17c----------------------------------------------------------------------
18
19      use dimradmars_mod, only: ndlo2, nir, ndlon, nuco2, nflev
20      use yomlw_h, only: nlaylte, xi, xi_ground, gcp
21      implicit none
22 
23c----------------------------------------------------------------------
24c         0.1   arguments
25c               ---------
26c                                                            inputs:
27c                                                            -------
28      integer,intent(in) :: ig0
29      integer,intent(in) :: kdlon           ! part of ngrid
30      integer,intent(in) :: kflev           ! part of nlayer
31
32      real,intent(in) :: dp (ndlo2,kflev)   ! layer pressure thickness (Pa)
33
34      real,intent(in) :: bsurf (ndlo2,nir) ! surface spectral planck function
35      real,intent(in) :: blev (ndlo2,nir,kflev+1) ! level   spectral planck function
36      real,intent(in) :: blay (ndlo2,nir,kflev) ! layer   spectral planck function
37      real,intent(in) :: btop (ndlo2,nir) ! top spectral planck function
38      real,intent(in) :: dbsublay (ndlo2,nir,2*kflev)  ! layer gradient spectral planck
39                                                       ! function in sub layers
40
41      real,intent(in) :: dt0 (ndlo2) ! surface temperature discontinuity
42      real,intent(in) :: tlay (ndlo2,kflev) ! layer temperature
43      real,intent(in) :: tlev (ndlo2,kflev+1) ! level temperature
44
45      real,intent(in) :: emis (ndlo2) ! surface emissivity
46
47      real,intent(in) :: tautotal(ndlo2,kflev,nir)  ! \   Total single scattering
48      real,intent(in) :: omegtotal(ndlo2,kflev,nir) !  >  properties (Addition of the
49      real,intent(in) :: gtotal(ndlo2,kflev,nir)    ! /   NAERKIND aerosols prop.)
50
51
52c                                                            outputs:
53c                                                            --------
54      real,intent(out) :: coolrate(ndlo2,kflev) ! radiative cooling rate (K/s)
55      real,intent(out) :: netrad (ndlo2,kflev) ! radiative budget (W/m2)
56      real,intent(out) :: fluxground(ndlo2) ! downward flux on the ground
57                                            ! for surface radiative budget
58      real,intent(out) :: fluxtop(ndlo2) ! upward flux on the top of atm ("OLR")
59
60
61c----------------------------------------------------------------------
62c         0.2   local arrays
63c               ------------
64
65      integer ja,jl,j,i,ig1d,ig,l
66      real  ksidb (ndlon,nuco2+1,0:nflev+1,0:nflev+1) ! net exchange rate (W/m2)
67
68      real dpsgcp (0:nflev+1,0:nflev+1)    !  dp/(g.cp)
69      real temp (0:nflev+1,0:nflev+1)       
70
71      real fluxdiff(ndlon,2,nflev+1)  ! diffusion flux: upward(1) downward(2)
72
73      real*4 reel4
74
75c     To compute IR flux in the atmosphere  (For diagnostic only !!)
76      logical computeflux
77      real coefd(kdlon,nuco2,nflev+1,nflev+1)
78      real coefu(kdlon,nuco2,0:nflev,nflev+1)
79      real flw_up(kdlon,nflev+1), flw_dn(kdlon,nflev+1) ! fluxes (W/m2)
80
81
82      ksidb(:,:,:,:)=0
83
84c----------------------------------------------------------------------
85c         1.1   exchanges (layer i <--> all layers up to i)
86c               -------------------------------------------
87
88      do i = 1,nlaylte
89        do j = i+1,nlaylte
90          do ja = 1,nuco2
91            do jl = 1,kdlon
92
93      ksidb(jl,ja,i,j) = xi(ig0+jl,ja,i,j)
94     .                 * (blay(jl,ja,j)-blay(jl,ja,i))
95c                                                        ksidb reciprocity
96c                                                        -----------------
97      ksidb(jl,ja,j,i) = -ksidb(jl,ja,i,j)
98     
99            enddo
100          enddo
101        enddo
102      enddo
103
104c----------------------------------------------------------------------
105c         1.2   exchanges (ground <--> all layers)
106c               ----------------------------------
107
108      do i = 1,nlaylte
109        do ja = 1,nuco2
110          do jl = 1,kdlon
111
112      ksidb(jl,ja,i,0) = xi(ig0+jl,ja,0,i)
113     .                 * (bsurf(jl,ja)-blay(jl,ja,i))
114c                                                        ksidb reciprocity
115c                                                        -----------------
116      ksidb(jl,ja,0,i) = -ksidb(jl,ja,i,0)
117
118          enddo
119        enddo
120      enddo
121
122c--------------------------------------------------------
123c  Here we add the neighbour contribution
124c           for exchanges between ground and first layer
125c--------------------------------------------------------
126
127        do ja = 1,nuco2
128          do jl = 1,kdlon
129
130      ksidb(jl,ja,1,0) = ksidb(jl,ja,1,0)
131     .                 - xi_ground(ig0+jl,ja)
132     .                 * (blev(jl,ja,1)-blay(jl,ja,1))
133
134cc                                                       ksidb reciprocity
135cc                                                       -----------------
136      ksidb(jl,ja,0,1) = - ksidb(jl,ja,1,0)
137
138          enddo
139        enddo
140
141c----------------------------------------------------------------------
142c         1.3   exchanges (layer i <--> space)
143c               ------------------------------
144
145      do i = 1,nlaylte
146        do ja = 1,nuco2
147          do jl = 1,kdlon
148
149      ksidb(jl,ja,i,nlaylte+1) = xi(ig0+jl,ja,i,nlaylte+1)
150     .                       * (-blay(jl,ja,i))
151c                                                        ksidb reciprocity
152c                                                        -----------------
153      ksidb(jl,ja,nlaylte+1,i) = - ksidb(jl,ja,i,nlaylte+1)
154
155          enddo
156        enddo
157      enddo
158
159c----------------------------------------------------------------------
160c         1.4   exchanges (ground <--> space)
161c               -----------------------------
162
163      do ja = 1,nuco2
164        do jl = 1,kdlon
165
166      ksidb(jl,ja,0,nlaylte+1) = xi(ig0+jl,ja,0,nlaylte+1)
167     .                       * (-bsurf(jl,ja))
168
169c                                                        ksidb reciprocity
170c                                                        -----------------
171      ksidb(jl,ja,nlaylte+1,0) = - ksidb(jl,ja,0,nlaylte+1)
172
173        enddo
174      enddo
175
176c----------------------------------------------------------------------
177c         2.0   sum of band 1 and 2 of co2 contribution
178c               ---------------------------------------
179
180      do i = 0,nlaylte+1
181        do j = 0,nlaylte+1
182          do jl = 1,kdlon
183
184            ksidb(jl,3,i,j)= ksidb(jl,1,i,j) + ksidb(jl,2,i,j)
185
186          enddo
187        enddo
188      enddo
189
190c----------------------------------------------------------------------
191c         3.0   Diffusion
192c               ---------
193
194      i = nlaylte+1
195      do jl = 1,kdlon
196        fluxdiff(jl,1,i)   = 0.
197        fluxdiff(jl,2,i)   = 0.
198      enddo
199
200      call lwdiff (kdlon,kflev
201     .         ,bsurf,btop,dbsublay
202     .         ,tautotal,omegtotal,gtotal
203     .         ,emis,fluxdiff)
204
205c----------------------------------------------------------------------
206c         4.0   Radiative Budget for each layer i
207c               ---------------------------------
208
209      do i = 1,nlaylte
210        do jl = 1,kdlon
211            netrad(jl,i) = 0.
212        enddo
213      enddo
214
215      do i = 1,nlaylte
216        do j = 0,nlaylte+1
217          do jl = 1,kdlon
218
219            netrad(jl,i) = netrad(jl,i) + ksidb(jl,3,i,j)
220
221          enddo
222        enddo
223      enddo
224c                                                 diffusion contribution
225c                                                 ----------------------
226      do i = 1,nlaylte
227        do jl = 1,kdlon
228
229          netrad(jl,i) = netrad(jl,i)
230     .                 - fluxdiff(jl,1,i+1) - fluxdiff(jl,2,i+1)   
231     .                 + fluxdiff(jl,1,i)   + fluxdiff(jl,2,i)
232
233        enddo
234      enddo
235
236c----------------------------------------------------------------------
237c         4.0   cooling rate for each layer i
238c               -----------------------------
239
240      do i = 1,nlaylte
241        do jl = 1,kdlon
242
243          coolrate(jl,i) = gcp * netrad(jl,i) / dp(jl,i)
244
245        enddo
246      enddo
247
248c----------------------------------------------------------------------
249c         5.0   downward flux (all layers --> ground): "fluxground"
250c               ---------------------------------------------------
251
252      do jl = 1,kdlon
253          fluxground(jl) = 0.
254      enddo
255
256      do i = 1,nlaylte
257        do ja = 1,nuco2
258          do jl = 1,kdlon
259
260      fluxground(jl) = fluxground(jl)
261     .               + xi(ig0+jl,ja,0,i) * (blay(jl,ja,i))
262
263          enddo
264        enddo
265      enddo
266   
267      do jl = 1,kdlon
268        fluxground(jl) = fluxground(jl) - fluxdiff(jl,2,1) 
269      enddo
270
271c----------------------------------------------------------------------
272c         6.0   outgoing flux (all layers --> space): "fluxtop"
273c               ---------------------------------------------------
274
275      do jl = 1,kdlon
276          fluxtop(jl) = 0.
277      enddo
278
279      do i = 0,nlaylte
280        do jl = 1,kdlon
281           fluxtop(jl) = fluxtop(jl)- ksidb(jl,3,i,nlaylte+1)
282        enddo
283      enddo
284   
285      do jl = 1,kdlon
286        fluxtop(jl) = fluxtop(jl) + fluxdiff(jl,1,nlaylte+1) 
287      enddo
288
289c----------------------------------------------------------------------
290c         6.5 ONLY FOR DIAGNOSTIC : Compute IR flux in the atmosphere
291c             -------------------
292c     The broadband fluxes (W.m-2) at every level  from surface level (l=1)
293c     up the top of the  upper layer (here: l=nlaylte+1) are:
294c     upward : flw_up(ig1d,l)   ;   downward : flw_dn(ig1d,j)
295c
296      computeflux = .false.
297
298      IF (computeflux) THEN  ! not used by the GCM only for diagnostic !
299c      upward flux
300c      ~~~~~~~~~~~
301       do i = 0,nlaylte
302        do j = 1,nlaylte+1
303         do ja = 1,nuco2
304          do jl = 1,kdlon
305            coefu(jl,ja,i,j) =0.
306            do l=j,nlaylte+1
307              coefu(jl,ja,i,j)=coefu(jl,ja,i,j)+xi(ig0+jl,ja,l,i)
308            end do
309
310          enddo
311         enddo
312        enddo
313       enddo
314       do j = 1,nlaylte+1
315        do jl = 1,kdlon
316           flw_up(jl,j) = 0.
317           do ja = 1,nuco2
318             flw_up(jl,j)=flw_up(jl,j)+bsurf(jl,ja)*coefu(jl,ja,0,j)
319             do i=1,j-1
320              flw_up(jl,j)=flw_up(jl,j)+blay(jl,ja,i)*coefu(jl,ja,i,j)
321             end do
322           end do
323           flw_up(jl,j)=flw_up(jl,j) + fluxdiff(jl,1,j)
324        end do
325       end do
326
327c      downward flux
328c      ~~~~~~~~~~~~~
329       do i = 1,nlaylte+1
330        do j = 1,nlaylte+1
331         do ja = 1,nuco2
332          do jl = 1,kdlon
333            coefd(jl,ja,i,j) =0.
334            do l=0,j-1
335              coefd(jl,ja,i,j)=coefd(jl,ja,i,j)+xi(ig0+jl,ja,l,i)
336            end do
337          enddo
338         enddo
339        enddo
340       enddo
341       do j = 1,nlaylte+1
342        do jl = 1,kdlon
343           flw_dn(jl,j) = 0.
344           do ja = 1,nuco2
345             do i=j,nlaylte
346              flw_dn(jl,j)=flw_dn(jl,j)+blay(jl,ja,i)*coefd(jl,ja,i,j)
347             end do
348           end do
349           flw_dn(jl,j)=flw_dn(jl,j) - fluxdiff(jl,2,j)
350        end do
351       end do
352      END IF ! of IF (computeflux)
353
354      end subroutine lwflux
355     
356      end module lwflux_mod
Note: See TracBrowser for help on using the repository browser.