Changeset 1992 for LMDZ5/trunk/libf/phylmd/aeropt.F90
- Timestamp:
- Mar 5, 2014, 2:19:12 PM (10 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/aeropt.F90
r1988 r1992 1 ! 1 2 2 ! $Id$ 3 !4 SUBROUTINE aeropt(pplay, paprs, t_seri, msulfate, RHcl,5 . tau_ae, piz_ae, cg_ae, ai )6 c7 USE dimphy8 IMPLICIT none9 c10 c11 c12 cym#include "dimensions.h"13 cym#include "dimphy.h"14 #include "YOMCST.h"15 c16 c Arguments:17 c18 REAL, INTENT(in) :: paprs(klon,klev+1)19 REAL, INTENT(in) :: pplay(klon,klev), t_seri(klon,klev)20 REAL, INTENT(in) :: msulfate(klon,klev) ! masse sulfate ug SO4/m3 [ug/m^3]21 REAL, INTENT(in) :: RHcl(klon,klev) ! humidite relative ciel clair22 REAL, INTENT(out) :: tau_ae(klon,klev,2) ! epaisseur optique aerosol23 REAL, INTENT(out) :: piz_ae(klon,klev,2) ! single scattering albedo aerosol24 REAL, INTENT(out) :: cg_ae(klon,klev,2) ! asymmetry parameter aerosol25 REAL, INTENT(out) :: ai(klon) ! POLDER aerosol index26 c27 c Local28 c29 INTEGER i, k, inu30 INTEGER RH_num, nbre_RH31 PARAMETER (nbre_RH=12)32 REAL RH_tab(nbre_RH)33 REAL RH_MAX, DELTA, rh34 PARAMETER (RH_MAX=95.)35 DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./36 REAL zrho, zdz37 REAL taue670(klon) ! epaisseur optique aerosol absorption 550 nm38 REAL taue865(klon) ! epaisseur optique aerosol extinction 865 nm39 REAL alpha_aer_sulfate(nbre_RH,5) !--unit m2/g SO440 REAL alphasulfate41 3 42 CHARACTER (LEN=20) :: modname='aeropt' 43 CHARACTER (LEN=80) :: abort_message4 SUBROUTINE aeropt(pplay, paprs, t_seri, msulfate, rhcl, tau_ae, piz_ae, & 5 cg_ae, ai) 44 6 45 c 46 c Proprietes optiques 47 c 48 REAL alpha_aer(nbre_RH,2) !--unit m2/g SO4 49 REAL cg_aer(nbre_RH,2) 50 DATA alpha_aer/.500130E+01, .500130E+01, .500130E+01, 51 . .500130E+01, .500130E+01, .616710E+01, 52 . .826850E+01, .107687E+02, .136976E+02, 53 . .162972E+02, .211690E+02, .354833E+02, 54 . .139460E+01, .139460E+01, .139460E+01, 55 . .139460E+01, .139460E+01, .173910E+01, 56 . .244380E+01, .332320E+01, .440120E+01, 57 . .539570E+01, .734580E+01, .136038E+02 / 58 DATA cg_aer/.619800E+00, .619800E+00, .619800E+00, 59 . .619800E+00, .619800E+00, .662700E+00, 60 . .682100E+00, .698500E+00, .712500E+00, 61 . .721800E+00, .734600E+00, .755800E+00, 62 . .545600E+00, .545600E+00, .545600E+00, 63 . .545600E+00, .545600E+00, .583700E+00, 64 . .607100E+00, .627700E+00, .645800E+00, 65 . .658400E+00, .676500E+00, .708500E+00 / 66 DATA alpha_aer_sulfate/ 67 . 4.910,4.910,4.910,4.910,6.547,7.373, 68 . 8.373,9.788,12.167,14.256,17.924,28.433, 69 . 1.453,1.453,1.453,1.453,2.003,2.321, 70 . 2.711,3.282,4.287,5.210,6.914,12.305, 71 . 4.308,4.308,4.308,4.308,5.753,6.521, 72 . 7.449,8.772,11.014,12.999,16.518,26.772, 73 . 3.265,3.265,3.265,3.265,4.388,5.016, 74 . 5.775,6.868,8.745,10.429,13.457,22.538, 75 . 2.116,2.116,2.116,2.116,2.882,3.330, 76 . 3.876,4.670,6.059,7.327,9.650,16.883/ 77 c 78 DO i=1, klon 79 taue670(i)=0.0 80 taue865(i)=0.0 81 ENDDO 82 c 83 DO k=1, klev 84 DO i=1, klon 85 if (t_seri(i,k).eq.0) write (*,*) 'aeropt T ',i,k,t_seri(i,k) 86 if (pplay(i,k).eq.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.LT.0.) THEN 92 abort_message = 'aeropt: RH < 0 not possible' 93 CALL abort_gcm (modname,abort_message,1) 94 ENDIF 95 IF (rh.gt.85.) RH_num=10 96 IF (rh.gt.90.) RH_num=11 97 DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num)) 98 c 99 inu=1 100 tau_ae(i,k,inu)=alpha_aer(RH_num,inu) + 101 . DELTA*(alpha_aer(RH_num+1,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) + 105 . DELTA*(cg_aer(RH_num+1,inu)-cg_aer(RH_num,inu)) 106 c 107 inu=2 108 tau_ae(i,k,inu)=alpha_aer(RH_num,inu) + 109 . DELTA*(alpha_aer(RH_num+1,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) + 113 . DELTA*(cg_aer(RH_num+1,inu)-cg_aer(RH_num,inu)) 114 cjq 115 cjq for aerosol index 116 c 117 alphasulfate=alpha_aer_sulfate(RH_num,4) + 118 . DELTA*(alpha_aer_sulfate(RH_num+1,4)- 119 . alpha_aer_sulfate(RH_num,4)) !--m2/g 120 c 121 taue670(i)=taue670(i)+ 122 . alphasulfate*msulfate(i,k)*zdz*1.e-6 123 c 124 alphasulfate=alpha_aer_sulfate(RH_num,5) + 125 . DELTA*(alpha_aer_sulfate(RH_num+1,5)- 126 . alpha_aer_sulfate(RH_num,5)) !--m2/g 127 c 128 taue865(i)=taue865(i)+ 129 . alphasulfate*msulfate(i,k)*zdz*1.e-6 130 131 ENDDO 132 ENDDO 133 c 134 DO i=1, klon 135 ai(i)=(-log(MAX(taue670(i),0.0001)/ 136 . MAX(taue865(i),0.0001))/log(670./865.)) * 137 . taue865(i) 138 ENDDO 139 c 140 RETURN 141 END 7 USE dimphy 8 IMPLICIT NONE 9 10 11 12 ! ym#include "dimensions.h" 13 ! ym#include "dimphy.h" 14 include "YOMCST.h" 15 16 ! Arguments: 17 18 REAL, INTENT (IN) :: paprs(klon, klev+1) 19 REAL, INTENT (IN) :: pplay(klon, klev), t_seri(klon, klev) 20 REAL, INTENT (IN) :: msulfate(klon, klev) ! masse sulfate ug SO4/m3 [ug/m^3] 21 REAL, INTENT (IN) :: rhcl(klon, klev) ! humidite relative ciel clair 22 REAL, INTENT (OUT) :: tau_ae(klon, klev, 2) ! epaisseur optique aerosol 23 REAL, INTENT (OUT) :: piz_ae(klon, klev, 2) ! single scattering albedo aerosol 24 REAL, INTENT (OUT) :: cg_ae(klon, klev, 2) ! asymmetry parameter aerosol 25 REAL, INTENT (OUT) :: ai(klon) ! POLDER aerosol index 26 27 ! Local 28 29 INTEGER i, k, inu 30 INTEGER rh_num, nbre_rh 31 PARAMETER (nbre_rh=12) 32 REAL rh_tab(nbre_rh) 33 REAL rh_max, delta, rh 34 PARAMETER (rh_max=95.) 35 DATA rh_tab/0., 10., 20., 30., 40., 50., 60., 70., 80., 85., 90., 95./ 36 REAL zrho, zdz 37 REAL taue670(klon) ! epaisseur optique aerosol absorption 550 nm 38 REAL taue865(klon) ! epaisseur optique aerosol extinction 865 nm 39 REAL alpha_aer_sulfate(nbre_rh, 5) !--unit m2/g SO4 40 REAL alphasulfate 41 42 CHARACTER (LEN=20) :: modname = 'aeropt' 43 CHARACTER (LEN=80) :: abort_message 44 45 46 ! Proprietes optiques 47 48 REAL alpha_aer(nbre_rh, 2) !--unit m2/g SO4 49 REAL cg_aer(nbre_rh, 2) 50 DATA alpha_aer/.500130E+01, .500130E+01, .500130E+01, .500130E+01, & 51 .500130E+01, .616710E+01, .826850E+01, .107687E+02, .136976E+02, & 52 .162972E+02, .211690E+02, .354833E+02, .139460E+01, .139460E+01, & 53 .139460E+01, .139460E+01, .139460E+01, .173910E+01, .244380E+01, & 54 .332320E+01, .440120E+01, .539570E+01, .734580E+01, .136038E+02/ 55 DATA cg_aer/.619800E+00, .619800E+00, .619800E+00, .619800E+00, & 56 .619800E+00, .662700E+00, .682100E+00, .698500E+00, .712500E+00, & 57 .721800E+00, .734600E+00, .755800E+00, .545600E+00, .545600E+00, & 58 .545600E+00, .545600E+00, .545600E+00, .583700E+00, .607100E+00, & 59 .627700E+00, .645800E+00, .658400E+00, .676500E+00, .708500E+00/ 60 DATA alpha_aer_sulfate/4.910, 4.910, 4.910, 4.910, 6.547, 7.373, 8.373, & 61 9.788, 12.167, 14.256, 17.924, 28.433, 1.453, 1.453, 1.453, 1.453, 2.003, & 62 2.321, 2.711, 3.282, 4.287, 5.210, 6.914, 12.305, 4.308, 4.308, 4.308, & 63 4.308, 5.753, 6.521, 7.449, 8.772, 11.014, 12.999, 16.518, 26.772, 3.265, & 64 3.265, 3.265, 3.265, 4.388, 5.016, 5.775, 6.868, 8.745, 10.429, 13.457, & 65 22.538, 2.116, 2.116, 2.116, 2.116, 2.882, 3.330, 3.876, 4.670, 6.059, & 66 7.327, 9.650, 16.883/ 67 68 DO i = 1, klon 69 taue670(i) = 0.0 70 taue865(i) = 0.0 71 END DO 72 73 DO k = 1, klev 74 DO i = 1, klon 75 IF (t_seri(i,k)==0) WRITE (*, *) 'aeropt T ', i, k, t_seri(i, k) 76 IF (pplay(i,k)==0) WRITE (*, *) 'aeropt p ', i, k, pplay(i, k) 77 zrho = pplay(i, k)/t_seri(i, k)/rd ! kg/m3 78 zdz = (paprs(i,k)-paprs(i,k+1))/zrho/rg ! m 79 rh = min(rhcl(i,k)*100., rh_max) 80 rh_num = int(rh/10.+1.) 81 IF (rh<0.) THEN 82 abort_message = 'aeropt: RH < 0 not possible' 83 CALL abort_gcm(modname, abort_message, 1) 84 END IF 85 IF (rh>85.) rh_num = 10 86 IF (rh>90.) rh_num = 11 87 delta = (rh-rh_tab(rh_num))/(rh_tab(rh_num+1)-rh_tab(rh_num)) 88 89 inu = 1 90 tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta*(alpha_aer(rh_num+1, & 91 inu)-alpha_aer(rh_num,inu)) 92 tau_ae(i, k, inu) = tau_ae(i, k, inu)*msulfate(i, k)*zdz*1.E-6 93 piz_ae(i, k, inu) = 1.0 94 cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta*(cg_aer(rh_num+1,inu)- & 95 cg_aer(rh_num,inu)) 96 97 inu = 2 98 tau_ae(i, k, inu) = alpha_aer(rh_num, inu) + delta*(alpha_aer(rh_num+1, & 99 inu)-alpha_aer(rh_num,inu)) 100 tau_ae(i, k, inu) = tau_ae(i, k, inu)*msulfate(i, k)*zdz*1.E-6 101 piz_ae(i, k, inu) = 1.0 102 cg_ae(i, k, inu) = cg_aer(rh_num, inu) + delta*(cg_aer(rh_num+1,inu)- & 103 cg_aer(rh_num,inu)) 104 ! jq 105 ! jq for aerosol index 106 107 alphasulfate = alpha_aer_sulfate(rh_num, 4) + & 108 delta*(alpha_aer_sulfate(rh_num+1,4)-alpha_aer_sulfate(rh_num,4)) !--m2/g 109 110 taue670(i) = taue670(i) + alphasulfate*msulfate(i, k)*zdz*1.E-6 111 112 alphasulfate = alpha_aer_sulfate(rh_num, 5) + & 113 delta*(alpha_aer_sulfate(rh_num+1,5)-alpha_aer_sulfate(rh_num,5)) !--m2/g 114 115 taue865(i) = taue865(i) + alphasulfate*msulfate(i, k)*zdz*1.E-6 116 117 END DO 118 END DO 119 120 DO i = 1, klon 121 ai(i) = (-log(max(taue670(i),0.0001)/max(taue865(i), & 122 0.0001))/log(670./865.))*taue865(i) 123 END DO 124 125 RETURN 126 END SUBROUTINE aeropt
Note: See TracChangeset
for help on using the changeset viewer.