source: trunk/LMDZ.MARS/libf/phymars/callradite.F @ 370

Last change on this file since 370 was 370, checked in by aslmd, 13 years ago

LMDZ.MARS: corrected an incorrect line in callradite.F introduced in previous commits for scanvenging. included a more up-to-date version of concentrations.F by FL.

File size: 20.3 KB
Line 
1      SUBROUTINE callradite(icount,ngrid,nlayer,nq,zday,ls,pq,albedo,
2     $     emis,mu0,pplev,pplay,pt,tsurf,fract,dist_sol,igout,
3     $     dtlw,dtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw,fluxtop_sw,
4     &     tauref,tau,aerosol,tauscaling,rdust,rice,nuice,co2ice)
5
6       IMPLICIT NONE
7c=======================================================================
8c   subject:
9c   --------
10c   Subroutine designed to call the main canonic
11c   radiative transfer subroutine "lwmain" et "swmain"
12c   to compute radiative heating and cooling rate and
13c   radiative fluxes to the surface.
14c
15c   These calculations are only valid on the part of the atmosphere
16c   where Local Thermal Equilibrium (NLTE) is verified. In practice
17c   The calculations are only performed for the first "nlaylte"
18c   parameters (nlaylte is calculated by subroutine "nlthermeq"
19c   and stored in common "yomlw.h").
20c
21c   The purpose of this subroutine is to:
22c      1) Make some initial calculation at first call
23c      2) Split the calculation in several sub-grid
24c        ("sub-domain") to save memory and
25c        be able run on a workstation at high resolution
26c        The sub-grid size is defined in dimradmars.h
27c      3) Compute the 3D scattering parameters depending on the
28c        size distribution of the different tracers (added by JBM)
29c      4) call "lwmain" and "swmain"
30c
31c
32c   authors:   
33c   ------
34c   Francois Forget / Christophe Hourdin / J.-B. Madeleine (2009)
35c
36c
37c   3D scattering scheme user's guide (J.-B. Madeleine)
38c   ---------------------------------
39c
40c   This routine has been modified to take into account 3D, time
41c   dependent scattering properties of the aerosols.
42c---- The look-up tables that contain the scattering parameters
43c   of a given tracer, for different sizes, are read by SUAER.F90.
44c   The names of the corresponding ASCII files have to be set in
45c   this subroutine (file_id variable), and files must be in the
46c   directory specified in datafile.h. Please make sure that the
47c   ASCII files are correctly written, and that the range
48c   of particle sizes is consistent with what you would expect.
49c---- SUAER.F90 is in charge of reading the ASCII files and averaging
50c   the scattering parameters in each GCM channel, using the three last
51c   equations of Forget et al. 1998 (GRL 25, No.7, p.1105-1108).
52c---- These look-up tables, loaded during the firstcall, are then
53c   constantly used by the subroutine "aeroptproperties.F" to compute,
54c   online, the 3D scattering parameters, based on the size distribution
55c   (reffrad and nueffrad) of the different tracers, in each grid box.
56c   These 3D size distributions are loaded by the "updatereffrad.F"
57c   subroutine. A log-normal distribution is then assumed in
58c   "aeroptproperties.F", along with a Gauss-Legendre integration.
59c---- The optical depth at the visible reference wavelength (set in
60c   SUAER.F90, after the file_id variable) is then computed by
61c   the subroutine "aeropacity.F", by using the size and spatial
62c   distribution of the corresponding tracer. This connection has to
63c   be implemented in "aeropacity.F" when adding a new tracer. To do so,
64c   one can use equation 2 of Forget et al. 1998 (Icarus 131, p.302-316).
65c---- The resulting variables "aerosol", "QVISsQREF3d", "omegaVIS3d" and
66c   "gVIS3d" (same in the infrared) are finally used by lwmain.F and
67c   swmain.F to solve the radiative transfer equation.
68c
69c   changes:
70c   -------
71c
72c   > SRL 7/2000
73c   
74c   This version has been modified to only calculate radiative tendencies
75c   over layers 1..NFLEV (set in dimradmars.h).  Returns zero for higher
76c   layers, if any.
77c   In other routines, nlayermx -> nflev.
78c   Routines affected: lwflux, lwi, lwmain, lwxb, lwxd, lwxn.
79c
80c   > J.-B. Madeleine 10W12
81c   This version uses the variable's splitting, which can be usefull
82c     when performing very high resolution simulation like LES.
83c
84c   ----------
85c   Here, solar band#1 is spectral interval between "long1vis" and "long2vis"
86c   set in dimradmars.h
87c   Here, solar band#2 is spectral interval between "long2vis" and "long3vis"
88c   set in dimradmars.h
89c
90c   input:
91c   -----
92c   icount                counter of call to subroutine physic by gcm
93c   ngrid                 number of gridpoint of horizontal grid
94c   nlayer                Number of layer
95c   nq                    Number of tracer
96c   ls                    Solar longitude (Ls) , radian
97c   zday                  Date (time since Ls=0, in martian days)
98c   pq(ngrid,nlayer,nq)   Advected fields
99c
100c   albedo (ngrid,2)      hemispheric surface albedo
101c                         albedo (i,1) : mean albedo for solar band#1
102c                                        (see below)
103c                         albedo (i,2) : mean albedo for solar band#2
104c                                        (see below)
105c   emis                  Thermal IR surface emissivity (no unit)
106c   mu0(ngridmx)           cos of solar zenith angle
107c                           (=1 when sun at zenith)
108c   pplay(ngrid,nlayer)    pressure (Pa) in the middle of each layer
109c   pplev(ngrid,nlayer+1)  pressure (Pa) at boundaries of each layer
110c   pt(ngrid,nlayer)       atmospheric temperature in each layer (K)
111c   tsurf(ngrid)           surface temperature (K)
112c   fract(ngridmx)         day fraction of the time interval
113c                          =1 during the full day ; =0 during the night
114c   declin                 latitude of subsolar point
115c   dist_sol               sun-Mars distance (AU)
116c   igout                  coordinate of analysed point for debugging
117c   reffrad(ngrid,nlayer,naerkind)  Aerosol effective radius
118c   nueffrad(ngrid,nlayer,naerkind) Aerosol effective variance
119
120c
121c  output:
122c  -------
123c dtlw (ngrid,nlayer)       longwave (IR) heating rate (K/s)
124c dtsw(ngrid,nlayer)        shortwave (Solar) heating rate (K/s)
125c fluxsurf_lw(ngrid)        surface downward flux tota LW (thermal IR) (W.m-2)
126c fluxsurf_sw(ngrid,1)      surface downward flux SW for solar band#1 (W.m-2)
127c fluxsurf_sw(ngrid,2)      surface downward flux SW for solar band#2 (W.m-2)
128c
129c fluxtop_lw(ngrid)         outgoing upward flux tota LW (thermal IR) (W.m-2)
130c fluxtop_sw(ngrid,1)       outgoing upward flux SW for solar band#1 (W.m-2)
131c fluxtop_sw(ngrid,2)       outgoing upward flux SW for solar band#2 (W.m-2)
132
133c   tauref       Prescribed mean column optical depth at 700 Pa
134c   tau          Column total visible dust optical depth at each point
135c   aerosol(ngrid,nlayer,naerkind)    aerosol extinction optical depth
136c                         at reference wavelength "longrefvis" set
137c                         in dimradmars.h , in each layer, for one of
138c                         the "naerkind" kind of aerosol optical
139c                         properties.
140
141c=======================================================================
142c
143c    Declarations :
144c    -------------
145c
146#include "dimensions.h"
147#include "dimphys.h"
148#include "dimradmars.h"
149#include "comcstfi.h"
150#include "callkeys.h"
151#include "yomlw.h"
152#include "aerkind.h"
153
154c-----------------------------------------------------------------------
155c    Input/Output
156c    ------------
157      INTEGER icount       
158      INTEGER ngrid,nlayer,nq
159      INTEGER igout
160
161      REAL pq(ngrid,nlayer,nq)
162      REAL tauscaling(ngridmx) ! Conversion factor for
163                               ! qdust and Ndust
164      REAL albedo(ngrid,2),emis(ngrid)
165      REAL ls,zday
166
167      REAL pplev(ngrid,nlayer+1),pplay(ngrid,nlayer)
168      REAL pt(ngrid,nlayer)
169      REAL tsurf(ngrid)
170      REAL dist_sol,mu0(ngrid),fract(ngrid)
171      REAL dtlw(ngridmx,nlayermx),dtsw(ngridmx,nlayermx)
172      REAL fluxsurf_lw(ngridmx), fluxtop_lw(ngridmx)
173      REAL fluxsurf_sw(ngridmx,2), fluxtop_sw(ngridmx,2)
174
175      REAL tauref(ngrid), tau(ngrid,naerkind)
176      REAL aerosol(ngrid,nlayer,naerkind)
177      REAL rdust(ngridmx,nlayermx)  ! Dust geometric mean radius (m)
178      REAL rice(ngridmx,nlayermx)   ! Ice geometric mean radius (m)
179      REAL nuice(ngridmx,nlayermx)  ! Estimated effective variance
180      REAL co2ice(ngridmx)           ! co2 ice surface layer (kg.m-2)
181
182c
183c    Local variables :
184c    -----------------
185
186      INTEGER j,l,ig,n,ich
187      INTEGER aer_count,iaer
188      INTEGER jd,ig0,nd
189
190      real  cste_mars ! solar constant on Mars (Wm-2)
191      REAL ptlev(ngridmx,nlayermx+1)
192
193      INTEGER ndomain
194      parameter (ndomain = (ngridmx-1) / ndomainsz + 1)
195
196c     Thermal IR net radiative budget (W m-2)
197
198      real znetrad(ndomainsz,nflev)
199
200      real zfluxd_sw(ndomainsz,nflev+1,2)
201      real zfluxu_sw(ndomainsz,nflev+1,2)
202
203      REAL zplev(ndomainsz,nflev+1)
204      REAL zztlev(ndomainsz,nflev+1)
205      REAL zplay(ndomainsz,nflev)
206      REAL zt(ndomainsz,nflev)
207      REAL zaerosol(ndomainsz,nflev,naerkind)
208      REAL zalbedo(ndomainsz,2)
209      REAL zdp(ndomainsz,nflev)
210      REAL zdt0(ndomainsz)
211
212      REAL zzdtlw(ndomainsz,nflev)
213      REAL zzdtsw(ndomainsz,nflev)
214      REAL zzflux(ndomainsz,6)
215      real zrmuz
216
217      REAL :: zQVISsQREF3d(ndomainsz,nflev,nsun,naerkind)
218      REAL :: zomegaVIS3d(ndomainsz,nflev,nsun,naerkind)
219      REAL :: zgVIS3d(ndomainsz,nflev,nsun,naerkind)
220
221      REAL :: zQIRsQREF3d(ndomainsz,nflev,nir,naerkind)
222      REAL :: zomegaIR3d(ndomainsz,nflev,nir,naerkind)
223      REAL :: zgIR3d(ndomainsz,nflev,nir,naerkind)
224
225c     Aerosol size distribution
226      REAL :: reffrad(ngrid,nlayer,naerkind)
227      REAL :: nueffrad(ngrid,nlayer,naerkind)
228c     Aerosol optical properties
229      REAL :: QVISsQREF3d(ngridmx,nlayermx,nsun,naerkind)
230      REAL :: omegaVIS3d(ngridmx,nlayermx,nsun,naerkind)
231      REAL :: gVIS3d(ngridmx,nlayermx,nsun,naerkind)
232
233      REAL :: QIRsQREF3d(ngridmx,nlayermx,nir,naerkind)
234      REAL :: omegaIR3d(ngridmx,nlayermx,nir,naerkind)
235      REAL :: gIR3d(ngridmx,nlayermx,nir,naerkind)
236
237      REAL :: QREFvis3d(ngridmx,nlayermx,naerkind)
238      REAL :: QREFir3d(ngridmx,nlayermx,naerkind)
239
240      REAL :: omegaREFvis3d(ngridmx,nlayermx,naerkind)
241      REAL :: omegaREFir3d(ngridmx,nlayermx,naerkind)
242
243c   local saved variables
244c   ---------------------
245
246      real pview(ngridmx)
247      save pview
248     
249      real zco2   ! volume fraction of CO2 in Mars atmosphere
250      DATA zco2/0.95/
251      SAVE zco2
252
253      LOGICAL firstcall
254      DATA firstcall/.true./
255      SAVE firstcall
256
257c----------------------------------------------------------------------
258
259c     Initialisation
260c     --------------
261
262      IF (firstcall) THEN
263
264c        Please name the different scatterers here ----------------
265c        PLEASE MAKE SURE that you set up the right number of
266c          scatterers in dimradmars.h (naerkind);
267          name_iaer(1) = "dust_conrath"   !! default choice is good old Conrath profile
268          IF (doubleq.AND.active) name_iaer(1) = "dust_doubleq" !! two-moment scheme
269          if (nqmx.gt.1) then
270           ! trick to avoid problems compiling with 1 tracer
271           ! and picky compilers who know name_iaer(2) is out of bounds
272           j=2
273          IF (water.AND.activice) name_iaer(j) = "h2o_ice"      !! radiatively-active clouds
274          IF (submicron.AND.active) name_iaer(j) = "dust_submicron" !! JBM experimental stuff
275          endif ! of if (nqmx.gt.1)
276c        ----------------------------------------------------------
277
278c        Assign a number to the different scatterers
279c        -------------------------------------------
280
281         iaer_dust_conrath=0
282         iaer_dust_doubleq=0
283         iaer_dust_submicron=0
284         iaer_h2o_ice=0
285
286         aer_count=0
287         if (.NOT.active) then
288           do iaer=1,naerkind
289             if (name_iaer(iaer).eq."dust_conrath") then
290               iaer_dust_conrath = iaer
291               aer_count = aer_count + 1
292             endif
293           enddo
294         endif
295         if (doubleq.AND.active) then
296           do iaer=1,naerkind
297             if (name_iaer(iaer).eq."dust_doubleq") then
298               iaer_dust_doubleq = iaer
299               aer_count = aer_count + 1
300             endif
301           enddo
302         endif
303         if (submicron.AND.active) then
304           do iaer=1,naerkind
305             if (name_iaer(iaer).eq."dust_submicron") then
306               iaer_dust_submicron = iaer
307               aer_count = aer_count + 1
308             endif
309           enddo
310         endif
311         if (water.AND.activice) then
312           do iaer=1,naerkind
313             if (name_iaer(iaer).eq."h2o_ice") then
314               iaer_h2o_ice = iaer
315               aer_count = aer_count + 1
316             endif
317           enddo
318         endif
319
320c        Check that we identified all tracers:
321         if (aer_count.ne.naerkind) then
322           write(*,*) "callradite: found only ",aer_count," scatterers"
323           write(*,*) "               expected ",naerkind
324           write(*,*) "please make sure that the number of"
325           write(*,*) "scatterers in dimradmars.h, the names"
326           write(*,*) "in callradite.F, and the flags in"
327           write(*,*) "callphys.def are all consistent!"
328           do iaer=1,naerkind
329             write(*,*)'      ',iaer,' ',trim(name_iaer(iaer))
330           enddo
331           stop
332         else
333           write(*,*) "callradite: found all scatterers, namely:"
334           do iaer=1,naerkind
335             write(*,*)'      ',iaer,' ',trim(name_iaer(iaer))
336           enddo
337         endif
338c        -------------------------------------------
339
340         DO ig=1,ngrid
341            pview(ig)=1.66     ! cosecant of viewing angle
342         ENDDO
343         gcp = g/cpp
344
345c        Logical tests for radiatively active water-ice clouds:
346         IF ( (activice.AND.(.NOT.water)).OR.
347     &        (activice.AND.(naerkind.LT.2)) ) THEN
348           WRITE(*,*) 'If activice is TRUE, water has to be set'
349           WRITE(*,*) 'to TRUE, and "naerkind" must be at least'
350           WRITE(*,*) 'equal to 2 in dimradmars.h.'
351           CALL ABORT
352         ELSE IF ( (.NOT.activice).AND.(naerkind.GT.1) ) THEN
353           WRITE(*,*) 'naerkind is greater than unity, but'
354           WRITE(*,*) 'activice has not been set to .true.'
355           WRITE(*,*) 'in callphys.def; this is not logical!'
356           CALL ABORT
357         ENDIF
358
359c        Loading the optical properties in external look-up tables:
360         CALL SUAER
361         CALL SULW
362
363         write(*,*) 'Splitting radiative calculations: ',
364     $              ' ngridmx,ngrid,ndomainsz,ndomain',
365     $                ngridmx,ngrid,ndomainsz,ndomain
366         if (ngridmx .EQ. 1) then
367           if (ndomainsz .NE. 1) then
368             print*
369             print*,'ATTENTION !!!'
370             print*,'pour tourner en 1D, '
371             print*,'fixer ndomainsz=1 dans phymars/dimradmars.h'
372             print*
373             call exit(1)
374           endif
375         endif
376         firstcall=.false.
377      END IF
378
379c     Computing aerosol optical properties and opacity
380c     ------------------------------------------------
381
382c     Updating aerosol size distributions:
383      CALL updatereffrad(ngrid,nlayer,
384     &                rdust,rice,nuice,
385     &                reffrad,nueffrad,
386     &                pq)
387
388c     Computing 3D scattering parameters:
389      CALL aeroptproperties(ngrid,nlayer,reffrad,nueffrad,
390     &                      QVISsQREF3d,omegaVIS3d,gVIS3d,
391     &                      QIRsQREF3d,omegaIR3d,gIR3d,
392     &                      QREFvis3d,QREFir3d,
393     &                      omegaREFvis3d,omegaREFir3d)
394
395c     Computing aerosol optical depth in each layer:
396      CALL aeropacity(ngrid,nlayer,nq,zday,pplay,pplev,ls,
397     &      pq,tauscaling,tauref,tau,aerosol,reffrad,nueffrad,
398     &      QREFvis3d,QREFir3d,omegaREFvis3d,omegaREFir3d)
399
400c     Starting loop on sub-domain
401c     ----------------------------
402
403      DO jd=1,ndomain
404        ig0=(jd-1)*ndomainsz
405        if (jd.eq.ndomain) then
406         nd=ngridmx-ig0
407        else
408         nd=ndomainsz
409        endif
410
411c       Spliting input variable in sub-domain input variables
412c       ---------------------------------------------------
413
414        do l=1,nlaylte
415         do ig = 1,nd
416           do iaer = 1, naerkind
417             do ich = 1, nsun
418               zQVISsQREF3d(ig,l,ich,iaer) =
419     &                           QVISsQREF3d(ig0+ig,l,ich,iaer)
420               zomegaVIS3d(ig,l,ich,iaer) =
421     &                           omegaVIS3d(ig0+ig,l,ich,iaer)
422               zgVIS3d(ig,l,ich,iaer) =
423     &                           gVIS3d(ig0+ig,l,ich,iaer)
424             enddo
425             do ich = 1, nir
426               zQIRsQREF3d(ig,l,ich,iaer) =
427     &                           QIRsQREF3d(ig0+ig,l,ich,iaer)
428               zomegaIR3d(ig,l,ich,iaer) =
429     &                           omegaIR3d(ig0+ig,l,ich,iaer)
430               zgIR3d(ig,l,ich,iaer) =
431     &                           gIR3d(ig0+ig,l,ich,iaer)
432             enddo
433           enddo
434         enddo
435        enddo
436
437        do l=1,nlaylte+1
438         do ig = 1,nd
439          zplev(ig,l) = pplev(ig0+ig,l)
440         enddo
441        enddo
442
443        do l=1,nlaylte
444         do ig = 1,nd
445          zplay(ig,l) = pplay(ig0+ig,l)
446          zt(ig,l) = pt(ig0+ig,l)
447c         Thickness of each layer (Pa) :
448          zdp(ig,l)= pplev(ig0+ig,l) - pplev(ig0+ig,l+1)
449         enddo
450        enddo
451
452        do n=1,naerkind
453          do l=1,nlaylte
454            do ig=1,nd
455              zaerosol(ig,l,n) = aerosol(ig0+ig,l,n)
456            enddo
457          enddo
458        enddo
459
460        do j=1,2
461          do ig = 1,nd
462           zalbedo(ig,j) = albedo(ig0+ig,j)
463          enddo
464        enddo
465
466c       Intermediate  levels: (computing tlev)
467c       ---------------------------------------
468c       Extrapolation for the air temperature above the surface
469        DO ig=1,nd
470              zztlev(ig,1)=zt(ig,1)+
471     s        (zplev(ig,1)-zplay(ig,1))*
472     s        (zt(ig,1)-zt(ig,2))/(zplay(ig,1)-zplay(ig,2))
473
474              zdt0(ig) = tsurf(ig0+ig) - zztlev(ig,1)
475        ENDDO
476
477        DO l=2,nlaylte
478         DO ig=1, nd
479               zztlev(ig,l)=0.5*(zt(ig,l-1)+zt(ig,l))
480         ENDDO
481        ENDDO
482
483        DO ig=1, nd
484           zztlev(ig,nlaylte+1)=zt(ig,nlaylte)
485        ENDDO
486
487
488c       Longwave ("lw") radiative transfer (= thermal infrared)
489c       -------------------------------------------------------
490        call lwmain (ig0,icount,nd,nflev
491     .        ,zdp,zdt0,emis(ig0+1),zplev,zztlev,zt
492     .        ,zaerosol,zzdtlw
493     .        ,fluxsurf_lw(ig0+1),fluxtop_lw(ig0+1)
494     .        ,znetrad
495     &        ,zQIRsQREF3d,zomegaIR3d,zgIR3d
496     &        ,co2ice(ig0+1))
497
498c       Shortwave ("sw") radiative transfer (= solar radiation)
499c       -------------------------------------------------------
500c          Mars solar constant (W m-2)
501c          1370 W.m-2 is the solar constant at 1 AU.
502           cste_mars=1370./(dist_sol*dist_sol)
503
504           call swmain ( nd, nflev,
505     S     cste_mars, zalbedo,
506     S     mu0(ig0+1), zdp, zplev, zaerosol, fract(ig0+1),
507     S     zzdtsw, zfluxd_sw, zfluxu_sw,
508     &     zQVISsQREF3d,zomegaVIS3d,zgVIS3d)
509
510c       ------------------------------------------------------------
511c       Un-spliting output variable from sub-domain input variables
512c       ------------------------------------------------------------
513
514        do l=1,nlaylte
515         do ig = 1,nd
516          dtlw(ig0+ig,l) = zzdtlw(ig,l)
517          dtsw(ig0+ig,l) = zzdtsw(ig,l)
518         enddo
519        enddo
520
521        do l=1,nlaylte+1
522         do ig = 1,nd
523          ptlev(ig0+ig,l) = zztlev(ig,l)
524         enddo
525        enddo
526
527        do ig = 1,nd
528          fluxsurf_sw(ig0+ig,1) = zfluxd_sw(ig,1,1)
529          fluxsurf_sw(ig0+ig,2) = zfluxd_sw(ig,1,2)
530          fluxtop_sw(ig0+ig,1) = zfluxu_sw(ig,nlaylte+1,1)
531          fluxtop_sw(ig0+ig,2) = zfluxu_sw(ig,nlaylte+1,2)
532        enddo
533
534      ENDDO         !   (boucle jd=1, ndomain)
535
536c     Zero tendencies for any remaining layers between nlaylte and nlayer
537      if (nlayer.gt.nlaylte) then
538         do l = nlaylte+1, nlayer
539            do ig = 1, ngrid
540               dtlw(ig, l) = 0.
541               dtsw(ig, l) = 0.
542            enddo
543         enddo
544      endif
545
546c     Output for debugging if lwrite=T
547c     --------------------------------
548c     Write all nlayer layers, even though only nlaylte layers may have
549c     non-zero tendencies.
550
551         IF(lwrite) THEN
552            PRINT*,'Diagnotique for the radiation'
553            PRINT*,'albedo, emissiv, mu0,fract,fluxsurf_lw,fluxsurf_sw'
554            PRINT*,albedo(igout,1),emis(igout),mu0(igout),
555     s           fract(igout), fluxsurf_lw(igout),
556     $     fluxsurf_sw(igout,1)+fluxsurf_sw(igout,2)
557            PRINT*,'Tlay Tlev Play Plev dT/dt SW dT/dt LW (K/s)'
558            PRINT*,'daysec',daysec
559            DO l=1,nlayer
560               PRINT*,pt(igout,l),ptlev(igout,l),
561     s         pplay(igout,l),pplev(igout,l),
562     s         dtsw(igout,l),dtlw(igout,l)
563            ENDDO
564         ENDIF
565
566
567      return
568      end
Note: See TracBrowser for help on using the repository browser.