source: LMDZ6/branches/Amaury_dev/libf/phylmd/aeropt.F90 @ 5151

Last change on this file since 5151 was 5144, checked in by abarral, 3 months ago

Put YOMCST.h into modules

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1! $Id: aeropt.F90 5144 2024-07-29 21:01:04Z abarral $
2
3SUBROUTINE aeropt(pplay, paprs, t_seri, msulfate, rhcl, tau_ae, piz_ae, &
4        cg_ae, ai)
5
6  USE dimphy
7  USE lmdz_abort_physic, ONLY: abort_physic
8  USE lmdz_yomcst
9
10  IMPLICIT NONE
11
12  ! Arguments:
13
14  REAL, INTENT (IN) :: paprs(klon, klev + 1)
15  REAL, INTENT (IN) :: pplay(klon, klev), t_seri(klon, klev)
16  REAL, INTENT (IN) :: msulfate(klon, klev) ! masse sulfate ug SO4/m3  [ug/m^3]
17  REAL, INTENT (IN) :: rhcl(klon, klev) ! humidite relative ciel clair
18  REAL, INTENT (OUT) :: tau_ae(klon, klev, 2) ! epaisseur optique aerosol
19  REAL, INTENT (OUT) :: piz_ae(klon, klev, 2) ! single scattering albedo aerosol
20  REAL, INTENT (OUT) :: cg_ae(klon, klev, 2) ! asymmetry parameter aerosol
21  REAL, INTENT (OUT) :: ai(klon) ! POLDER aerosol index
22
23  ! Local
24
25  INTEGER i, k, inu
26  INTEGER rh_num, nbre_rh
27  PARAMETER (nbre_rh = 12)
28  REAL rh_tab(nbre_rh)
29  REAL rh_max, delta, rh
30  PARAMETER (rh_max = 95.)
31  DATA rh_tab/0., 10., 20., 30., 40., 50., 60., 70., 80., 85., 90., 95./
32  REAL zrho, zdz
33  REAL taue670(klon) ! epaisseur optique aerosol absorption 550 nm
34  REAL taue865(klon) ! epaisseur optique aerosol extinction 865 nm
35  REAL alpha_aer_sulfate(nbre_rh, 5) !--unit m2/g SO4
36  REAL alphasulfate
37
38  CHARACTER (LEN = 20) :: modname = 'aeropt'
39  CHARACTER (LEN = 80) :: abort_message
40
41
42  ! Proprietes optiques
43
44  REAL alpha_aer(nbre_rh, 2) !--unit m2/g SO4
45  REAL cg_aer(nbre_rh, 2)
46  DATA alpha_aer/.500130E+01, .500130E+01, .500130E+01, .500130E+01, &
47          .500130E+01, .616710E+01, .826850E+01, .107687E+02, .136976E+02, &
48          .162972E+02, .211690E+02, .354833E+02, .139460E+01, .139460E+01, &
49          .139460E+01, .139460E+01, .139460E+01, .173910E+01, .244380E+01, &
50          .332320E+01, .440120E+01, .539570E+01, .734580E+01, .136038E+02/
51  DATA cg_aer/.619800E+00, .619800E+00, .619800E+00, .619800E+00, &
52          .619800E+00, .662700E+00, .682100E+00, .698500E+00, .712500E+00, &
53          .721800E+00, .734600E+00, .755800E+00, .545600E+00, .545600E+00, &
54          .545600E+00, .545600E+00, .545600E+00, .583700E+00, .607100E+00, &
55          .627700E+00, .645800E+00, .658400E+00, .676500E+00, .708500E+00/
56  DATA alpha_aer_sulfate/4.910, 4.910, 4.910, 4.910, 6.547, 7.373, 8.373, &
57          9.788, 12.167, 14.256, 17.924, 28.433, 1.453, 1.453, 1.453, 1.453, 2.003, &
58          2.321, 2.711, 3.282, 4.287, 5.210, 6.914, 12.305, 4.308, 4.308, 4.308, &
59          4.308, 5.753, 6.521, 7.449, 8.772, 11.014, 12.999, 16.518, 26.772, 3.265, &
60          3.265, 3.265, 3.265, 4.388, 5.016, 5.775, 6.868, 8.745, 10.429, 13.457, &
61          22.538, 2.116, 2.116, 2.116, 2.116, 2.882, 3.330, 3.876, 4.670, 6.059, &
62          7.327, 9.650, 16.883/
63
64  DO i = 1, klon
65    taue670(i) = 0.0
66    taue865(i) = 0.0
67  END DO
68
69  DO k = 1, klev
70    DO i = 1, klon
71      IF (t_seri(i, k)==0) WRITE (*, *) 'aeropt T ', i, k, t_seri(i, k)
72      IF (pplay(i, k)==0) WRITE (*, *) 'aeropt p ', i, k, pplay(i, k)
73      zrho = pplay(i, k) / t_seri(i, k) / rd ! kg/m3
74      zdz = (paprs(i, k) - paprs(i, k + 1)) / zrho / rg ! m
75      rh = min(rhcl(i, k) * 100., rh_max)
76      rh_num = int(rh / 10. + 1.)
77      IF (rh<0.) THEN
78        abort_message = 'aeropt: RH < 0 not possible'
79        CALL abort_physic(modname, abort_message, 1)
80      END IF
81      IF (rh>85.) rh_num = 10
82      IF (rh>90.) rh_num = 11
83      delta = (rh - rh_tab(rh_num)) / (rh_tab(rh_num + 1) - rh_tab(rh_num))
84
85      inu = 1
86      tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta * (alpha_aer(rh_num + 1, &
87              inu) - alpha_aer(rh_num, inu))
88      tau_ae(i, k, inu) = tau_ae(i, k, inu) * msulfate(i, k) * zdz * 1.E-6
89      piz_ae(i, k, inu) = 1.0
90      cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta * (cg_aer(rh_num + 1, inu) - &
91              cg_aer(rh_num, inu))
92
93      inu = 2
94      tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta * (alpha_aer(rh_num + 1, &
95              inu) - alpha_aer(rh_num, inu))
96      tau_ae(i, k, inu) = tau_ae(i, k, inu) * msulfate(i, k) * zdz * 1.E-6
97      piz_ae(i, k, inu) = 1.0
98      cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta * (cg_aer(rh_num + 1, inu) - &
99              cg_aer(rh_num, inu))
100      ! jq
101      ! jq for aerosol index
102
103      alphasulfate = alpha_aer_sulfate(rh_num, 4) + &
104              delta * (alpha_aer_sulfate(rh_num + 1, 4) - alpha_aer_sulfate(rh_num, 4)) !--m2/g
105
106      taue670(i) = taue670(i) + alphasulfate * msulfate(i, k) * zdz * 1.E-6
107
108      alphasulfate = alpha_aer_sulfate(rh_num, 5) + &
109              delta * (alpha_aer_sulfate(rh_num + 1, 5) - alpha_aer_sulfate(rh_num, 5)) !--m2/g
110
111      taue865(i) = taue865(i) + alphasulfate * msulfate(i, k) * zdz * 1.E-6
112
113    END DO
114  END DO
115
116  DO i = 1, klon
117    ai(i) = (-log(max(taue670(i), 0.0001) / max(taue865(i), &
118            0.0001)) / log(670. / 865.)) * taue865(i)
119  END DO
120
121END SUBROUTINE aeropt
Note: See TracBrowser for help on using the repository browser.