source: LMDZ6/trunk/libf/phylmd/aeropt.f90 @ 5279

Last change on this file since 5279 was 5274, checked in by abarral, 9 months ago

Replace yomcst.h by existing module

  • 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: 5.2 KB
Line 
1
2! $Id: aeropt.f90 5274 2024-10-25 13:41:23Z abarral $
3
4SUBROUTINE aeropt(pplay, paprs, t_seri, msulfate, rhcl, tau_ae, piz_ae, &
5    cg_ae, ai)
6
7  USE dimphy
8  USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
9          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
10          , R_ecc, R_peri, R_incl                                      &
11          , RA, RG, R1SA                                         &
12          , RSIGMA                                                     &
13          , R, RMD, RMV, RD, RV, RCPD                    &
14          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
15          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
16          , RCW, RCS                                                 &
17          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
18          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
19          , RALPD, RBETD, RGAMD
20IMPLICIT NONE
21
22
23
24
25
26  ! Arguments:
27
28  REAL, INTENT (IN) :: paprs(klon, klev+1)
29  REAL, INTENT (IN) :: pplay(klon, klev), t_seri(klon, klev)
30  REAL, INTENT (IN) :: msulfate(klon, klev) ! masse sulfate ug SO4/m3  [ug/m^3]
31  REAL, INTENT (IN) :: rhcl(klon, klev) ! humidite relative ciel clair
32  REAL, INTENT (OUT) :: tau_ae(klon, klev, 2) ! epaisseur optique aerosol
33  REAL, INTENT (OUT) :: piz_ae(klon, klev, 2) ! single scattering albedo aerosol
34  REAL, INTENT (OUT) :: cg_ae(klon, klev, 2) ! asymmetry parameter aerosol
35  REAL, INTENT (OUT) :: ai(klon) ! POLDER aerosol index
36
37  ! Local
38
39  INTEGER i, k, inu
40  INTEGER rh_num, nbre_rh
41  PARAMETER (nbre_rh=12)
42  REAL rh_tab(nbre_rh)
43  REAL rh_max, delta, rh
44  PARAMETER (rh_max=95.)
45  DATA rh_tab/0., 10., 20., 30., 40., 50., 60., 70., 80., 85., 90., 95./
46  REAL zrho, zdz
47  REAL taue670(klon) ! epaisseur optique aerosol absorption 550 nm
48  REAL taue865(klon) ! epaisseur optique aerosol extinction 865 nm
49  REAL alpha_aer_sulfate(nbre_rh, 5) !--unit m2/g SO4
50  REAL alphasulfate
51
52  CHARACTER (LEN=20) :: modname = 'aeropt'
53  CHARACTER (LEN=80) :: abort_message
54
55
56  ! Proprietes optiques
57
58  REAL alpha_aer(nbre_rh, 2) !--unit m2/g SO4
59  REAL cg_aer(nbre_rh, 2)
60  DATA alpha_aer/.500130E+01, .500130E+01, .500130E+01, .500130E+01, &
61    .500130E+01, .616710E+01, .826850E+01, .107687E+02, .136976E+02, &
62    .162972E+02, .211690E+02, .354833E+02, .139460E+01, .139460E+01, &
63    .139460E+01, .139460E+01, .139460E+01, .173910E+01, .244380E+01, &
64    .332320E+01, .440120E+01, .539570E+01, .734580E+01, .136038E+02/
65  DATA cg_aer/.619800E+00, .619800E+00, .619800E+00, .619800E+00, &
66    .619800E+00, .662700E+00, .682100E+00, .698500E+00, .712500E+00, &
67    .721800E+00, .734600E+00, .755800E+00, .545600E+00, .545600E+00, &
68    .545600E+00, .545600E+00, .545600E+00, .583700E+00, .607100E+00, &
69    .627700E+00, .645800E+00, .658400E+00, .676500E+00, .708500E+00/
70  DATA alpha_aer_sulfate/4.910, 4.910, 4.910, 4.910, 6.547, 7.373, 8.373, &
71    9.788, 12.167, 14.256, 17.924, 28.433, 1.453, 1.453, 1.453, 1.453, 2.003, &
72    2.321, 2.711, 3.282, 4.287, 5.210, 6.914, 12.305, 4.308, 4.308, 4.308, &
73    4.308, 5.753, 6.521, 7.449, 8.772, 11.014, 12.999, 16.518, 26.772, 3.265, &
74    3.265, 3.265, 3.265, 4.388, 5.016, 5.775, 6.868, 8.745, 10.429, 13.457, &
75    22.538, 2.116, 2.116, 2.116, 2.116, 2.882, 3.330, 3.876, 4.670, 6.059, &
76    7.327, 9.650, 16.883/
77
78  DO i = 1, klon
79    taue670(i) = 0.0
80    taue865(i) = 0.0
81  END DO
82
83  DO k = 1, klev
84    DO i = 1, klon
85      IF (t_seri(i,k)==0) WRITE (*, *) 'aeropt T ', i, k, t_seri(i, k)
86      IF (pplay(i,k)==0) WRITE (*, *) 'aeropt p ', i, k, pplay(i, k)
87      zrho = pplay(i, k)/t_seri(i, k)/rd ! kg/m3
88      zdz = (paprs(i,k)-paprs(i,k+1))/zrho/rg ! m
89      rh = min(rhcl(i,k)*100., rh_max)
90      rh_num = int(rh/10.+1.)
91      IF (rh<0.) THEN
92        abort_message = 'aeropt: RH < 0 not possible'
93        CALL abort_physic(modname, abort_message, 1)
94      END IF
95      IF (rh>85.) rh_num = 10
96      IF (rh>90.) rh_num = 11
97      delta = (rh-rh_tab(rh_num))/(rh_tab(rh_num+1)-rh_tab(rh_num))
98
99      inu = 1
100      tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta*(alpha_aer(rh_num+1, &
101        inu)-alpha_aer(rh_num,inu))
102      tau_ae(i, k, inu) = tau_ae(i, k, inu)*msulfate(i, k)*zdz*1.E-6
103      piz_ae(i, k, inu) = 1.0
104      cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta*(cg_aer(rh_num+1,inu)- &
105        cg_aer(rh_num,inu))
106
107      inu = 2
108      tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta*(alpha_aer(rh_num+1, &
109        inu)-alpha_aer(rh_num,inu))
110      tau_ae(i, k, inu) = tau_ae(i, k, inu)*msulfate(i, k)*zdz*1.E-6
111      piz_ae(i, k, inu) = 1.0
112      cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta*(cg_aer(rh_num+1,inu)- &
113        cg_aer(rh_num,inu))
114      ! jq
115      ! jq for aerosol index
116
117      alphasulfate = alpha_aer_sulfate(rh_num, 4) + &
118        delta*(alpha_aer_sulfate(rh_num+1,4)-alpha_aer_sulfate(rh_num,4)) !--m2/g
119
120      taue670(i) = taue670(i) + alphasulfate*msulfate(i, k)*zdz*1.E-6
121
122      alphasulfate = alpha_aer_sulfate(rh_num, 5) + &
123        delta*(alpha_aer_sulfate(rh_num+1,5)-alpha_aer_sulfate(rh_num,5)) !--m2/g
124
125      taue865(i) = taue865(i) + alphasulfate*msulfate(i, k)*zdz*1.E-6
126
127    END DO
128  END DO
129
130  DO i = 1, klon
131    ai(i) = (-log(max(taue670(i),0.0001)/max(taue865(i), &
132      0.0001))/log(670./865.))*taue865(i)
133  END DO
134
135  RETURN
136END SUBROUTINE aeropt
Note: See TracBrowser for help on using the repository browser.