Changeset 5246 for LMDZ6/trunk/libf/phylmd/Dust
- Timestamp:
- Oct 21, 2024, 2:58:45 PM (11 months ago)
- Location:
- LMDZ6/trunk/libf/phylmd/Dust
- Files:
-
- 31 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/Dust/aeropt_spl.f90
r5245 r5246 1 SUBROUTINE aeropt_spl(zdz, tr_seri, RHcl, 2 . id_prec, id_fine, id_coss, id_codu, id_scdu,3 . ok_chimeredust,4 . ztaue550,ztaue670,ztaue865,5 . taue550_tr2,taue670_tr2,taue865_tr2,6 . taue550_ss,taue670_ss,taue865_ss,7 . taue550_dust,taue670_dust,taue865_dust,8 .taue550_dustsco,taue670_dustsco,taue865_dustsco)9 c 10 11 12 13 c 14 15 16 cINCLUDE "dimphy.h"17 18 c 19 cArguments:20 c 21 c======================== INPUT ================================== 22 REALzdz(klon,klev)23 REAL tr_seri(klon,klev,nbtr) ! masse of tracer24 REALRHcl(klon,klev) ! humidite relativen ciel clair25 INTEGERid_prec, id_fine, id_coss, id_codu, id_scdu26 LOGICALok_chimeredust27 c============================== OUTPUT =================================28 REALztaue550(klon) ! epaisseur optique aerosol 550 nm29 REALztaue670(klon) ! epaisseur optique aerosol 670 nm30 REALztaue865(klon) ! epaisseur optique aerosol 865 nm31 REALtaue550_tr2(klon) ! epaisseur optique aerosol 550 nm, diagnostic32 REALtaue670_tr2(klon) ! epaisseur optique aerosol 670 nm, diagnostic33 REALtaue865_tr2(klon) ! epaisseur optique aerosol 865 nm, diagnostic34 REALtaue550_ss(klon) ! epaisseur optique aerosol 550 nm, diagnostic35 REALtaue670_ss(klon) ! epaisseur optique aerosol 670 nm, diagnostic36 REALtaue865_ss(klon) ! epaisseur optique aerosol 865 nm, diagnostic37 REALtaue550_dust(klon) ! epaisseur optique aerosol 550 nm, diagnostic38 REALtaue670_dust(klon) ! epaisseur optique aerosol 670 nm, diagnostic39 REALtaue865_dust(klon) ! epaisseur optique aerosol 865 nm, diagnostic40 REALtaue550_dustsco(klon) ! epaisseur optique aerosol 550 nm, diagnostic41 REALtaue670_dustsco(klon) ! epaisseur optique aerosol 670 nm, diagnostic42 REALtaue865_dustsco(klon) ! epaisseur optique aerosol 865 nm, diagnostic43 c===================== LOCAL VARIABLES =========================== 44 INTEGERnb_lambda,nbre_RH45 46 INTEGERi, k, RH_num47 REALrh, RH_MAX, DELTA, RH_tab(nbre_RH)48 49 INTEGERrh_int50 51 REALauxreal52 cREAL ss_a(nb_lambda,int,nbtr-1)53 cDATA ss_a/72*1./54 REALss_dust(nb_lambda), ss_acc550(rh_int), alpha_acc55 REALss_dustsco(nb_lambda)56 REALss_acc670(rh_int), ss_acc865(rh_int)57 REALss_ssalt550(rh_int)58 REALss_ssalt670(rh_int), ss_ssalt865(rh_int)59 REALburden_ss(klon)60 DATA ss_acc550 /3.135,3.135,3.135, 3.135, 4.260, 4.807,61 .5.546,6.651,8.641,10.335,13.534,22.979/62 DATA ss_acc670 /2.220,2.220,2.220, 2.220, 3.048, 3.460,63 .4.023,4.873,6.426, 7.761,10.322,18.079/64 DATA ss_acc865 /1.329,1.329,1.329, 1.329, 1.855, 2.124,65 . 2.494,3.060,4.114, 5.033, 6.831,12.457/66 !old4tracers DATA ss_dust/0.564, 0.614, 0.700/ !for bin 0.5-10um67 !DATA ss_dust/0.553117, 0.610185, 0.7053460 / !for bin 0.5-3um radius68 !DATA ss_dustsco/0.1014, 0.102156, 0.1035538 / !for bin 3-15um radius69 !20140902 DATA ss_dust/0.5345737, 0.5878828, 0.6772957/ !for bin 0.5-3um radius70 !20140902 DATA ss_dustsco/0.1009634, 0.1018700, 0.1031178/ !for bin 3-15um radius71 !3days DATA ss_dust/0.4564216, 0.4906738, 0.5476248/ !for bin 0.5-3um radius72 !3days DATA ss_dustsco/0.1015022, 0.1024051, 0.1036622/ !for bin 3-15um radius73 !JE20140911 DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius74 !JE20140911 DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius75 !JE20140915 DATA ss_dust/0.3188754,0.3430106,0.3829019/ !for bin 0.5-5um radius76 !JE20140915 DATA ss_dustsco/8.0582686E-02,8.1255026E-02,8.1861295E-02/ !for bin 5-15um radius77 78 !DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius79 !DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius80 81 82 DATA ss_ssalt550/0.182,0.182,0.182,0.182,0.366,0.430,83 .0.484,0.551,0.648,0.724,0.847,1.218/ !for bin 0.5-20 um, fit_v284 DATA ss_ssalt670/0.193,0.193,0.193,0.193,0.377,0.431,85 .0.496,0.587,0.693,0.784,0.925,1.257/ !for bin 0.5-20 um86 DATA ss_ssalt865/0.188,0.188,0.188,0.188,0.384,0.443,87 .0.502,0.580,0.699,0.799,0.979,1.404/ !for bin 0.5-20 um88 89 90 c 91 IF (ok_chimeredust) THEN92 !JE20150212<< : changes in ustar in dustmod changes emission distribution93 !ss_dust=(/0.5167768,0.5684330,0.6531643/)94 !ss_dustsco=(/0.1003391,0.1012288,0.1024651/)95 ! JE20150618: Change in dustmodule, div3 is now =6: change distributions96 ! div3=3 ss_dust =(/0.4670522 , 0.5077308 , 0.5745184/)97 ! div3=3 ss_dustsco=(/0.099858 , 0.1007395 , 0.1019673/)98 99 100 101 !JE20150212>>102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 c 130 131 132 133 134 c IF (rh.gt.40.) THEN 135 cRH_num=5 ! Added by NHL temporarily136 cprint *,'TEMPORARY CASE'137 cENDIF138 139 140 141 c*******************************************************************142 cAOD at 550 NM143 c*******************************************************************144 alpha_acc=ss_acc550(RH_num) + DELTA*(ss_acc550(RH_num+1)-145 .ss_acc550(RH_num)) !--m2/g146 cnhl_test TOTAL AOD147 148 149 IF(id_coss>0) auxreal=auxreal+ss_ssalt550(RH_num)*150 .tr_seri(i,k,id_coss)151 152 153 154 155 !JE20150128 ztaue550(i)=ztaue550(i)+(alpha_acc*tr_seri(i,k,id_fine)+156 !. ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)+157 !. ss_dust(1)*tr_seri(i,k,id_codu)+158 !. ss_dustsco(1)*tr_seri(i,k,id_scdu) )*zdz(i,k)*1.e6159 160 cnhl_test TOTAL AOD IS NOW AOD COARSE MODE ONLY161 cnhl_test ztaue550(i)=ztaue550(i)+( 162 cnhl_test . ss_ssalt550(RH_num)*tr_seri(i,k,3)+163 cnhl_test . ss_dust(1)*tr_seri(i,k,4))*zdz(i,k)*1.e6164 165 IF(id_fine>0) taue550_tr2(i)=taue550_tr2(i)166 .+ alpha_acc*tr_seri(i,k,id_fine)*zdz(i,k)*1.e6167 IF(id_coss>0) taue550_ss(i)=taue550_ss(i)+168 . ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)*169 .zdz(i,k)*1.e6170 IF(id_codu>0) taue550_dust(i)=taue550_dust(i)+171 . ss_dust(1)*tr_seri(i,k,id_codu)*172 .zdz(i,k)*1.e6173 IF(id_scdu>0) taue550_dustsco(i)=taue550_dustsco(i)+174 . ss_dustsco(1)*tr_seri(i,k,id_scdu)*175 .zdz(i,k)*1.e6176 !print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),177 !. MAXVAL(taue550_ss)178 179 c*******************************************************************180 cAOD at 670 NM181 c*******************************************************************182 alpha_acc=ss_acc670(RH_num) + DELTA*(ss_acc670(RH_num+1)-183 .ss_acc670(RH_num)) !--m2/g184 185 186 IF(id_coss>0) auxreal=auxreal+ss_ssalt670(RH_num)187 .*tr_seri(i,k,id_coss)188 189 190 191 192 !JE20150128 ztaue670(i)=ztaue670(i)+(alpha_acc*tr_seri(i,k,id_fine)+193 !. ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)+194 !. ss_dust(2)*tr_seri(i,k,id_codu)+195 !. ss_dustsco(2)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6196 197 IF(id_fine>0) taue670_tr2(i)=taue670_tr2(i)+198 . alpha_acc*tr_seri(i,k,id_fine)*199 .zdz(i,k)*1.e6200 IF(id_coss>0) taue670_ss(i)=taue670_ss(i)+201 . ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)*202 .zdz(i,k)*1.e6203 IF(id_codu>0) taue670_dust(i)=taue670_dust(i)204 . +ss_dust(2)*tr_seri(i,k,id_codu)*205 .zdz(i,k)*1.e6206 IF(id_scdu>0) taue670_dustsco(i)=taue670_dustsco(i)+207 . ss_dustsco(2)*tr_seri(i,k,id_scdu)*208 .zdz(i,k)*1.e6209 210 c*******************************************************************211 cAOD at 865 NM212 c*******************************************************************213 alpha_acc=ss_acc865(RH_num) + DELTA*(ss_acc865(RH_num+1)-214 .ss_acc865(RH_num)) !--m2/g215 216 217 IF(id_coss>0) auxreal=auxreal218 .+ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)219 220 221 222 !JE20150128 ztaue865(i)=ztaue865(i)+(alpha_acc*tr_seri(i,k,id_fine)+223 !. ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)+224 !. ss_dust(3)*tr_seri(i,k,id_codu)+225 !. ss_dustsco(3)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6226 IF(id_fine>0) taue865_tr2(i)=taue865_tr2(i)227 . +alpha_acc*tr_seri(i,k,id_fine)*228 .zdz(i,k)*1.e6229 IF(id_coss>0) taue865_ss(i)=taue865_ss(i)+230 . ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)*231 .zdz(i,k)*1.e6232 IF(id_codu>0) taue865_dust(i)=taue865_dust(i)233 . +ss_dust(3)*tr_seri(i,k,id_codu)*234 .zdz(i,k)*1.e6235 IF(id_scdu>0) taue865_dustsco(i)=taue865_dustsco(i)+236 . ss_dustsco(3)*tr_seri(i,k,id_scdu)*237 .zdz(i,k)*1.e6238 239 240 c 241 IF(id_coss>0) burden_ss(i)=burden_ss(i)242 .+tr_seri(i,k,id_coss)*1.e6*1.e3*zdz(i,k)243 244 245 !print *,'tr_seri = ',SUM(tr_seri(:,:,3)),MINVAL(tr_seri(:,:,3)),246 !. MAXVAL(tr_seri(:,:,3))247 !print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss),248 !. MAXVAL(taue550_ss)249 c 250 251 END 1 SUBROUTINE aeropt_spl(zdz, tr_seri, RHcl, & 2 id_prec, id_fine, id_coss, id_codu, id_scdu, & 3 ok_chimeredust, & 4 ztaue550,ztaue670,ztaue865, & 5 taue550_tr2,taue670_tr2,taue865_tr2, & 6 taue550_ss,taue670_ss,taue865_ss, & 7 taue550_dust,taue670_dust,taue865_dust, & 8 taue550_dustsco,taue670_dustsco,taue865_dustsco) 9 ! 10 USE dimphy 11 USE infotrac 12 IMPLICIT none 13 ! 14 INCLUDE "chem.h" 15 INCLUDE "dimensions.h" 16 !INCLUDE "dimphy.h" 17 INCLUDE "YOMCST.h" 18 ! 19 ! Arguments: 20 ! 21 !======================== INPUT ================================== 22 REAL :: zdz(klon,klev) 23 REAL :: tr_seri(klon,klev,nbtr) ! masse of tracer 24 REAL :: RHcl(klon,klev) ! humidite relativen ciel clair 25 INTEGER :: id_prec, id_fine, id_coss, id_codu, id_scdu 26 LOGICAL :: ok_chimeredust 27 !============================== OUTPUT ================================= 28 REAL :: ztaue550(klon) ! epaisseur optique aerosol 550 nm 29 REAL :: ztaue670(klon) ! epaisseur optique aerosol 670 nm 30 REAL :: ztaue865(klon) ! epaisseur optique aerosol 865 nm 31 REAL :: taue550_tr2(klon) ! epaisseur optique aerosol 550 nm, diagnostic 32 REAL :: taue670_tr2(klon) ! epaisseur optique aerosol 670 nm, diagnostic 33 REAL :: taue865_tr2(klon) ! epaisseur optique aerosol 865 nm, diagnostic 34 REAL :: taue550_ss(klon) ! epaisseur optique aerosol 550 nm, diagnostic 35 REAL :: taue670_ss(klon) ! epaisseur optique aerosol 670 nm, diagnostic 36 REAL :: taue865_ss(klon) ! epaisseur optique aerosol 865 nm, diagnostic 37 REAL :: taue550_dust(klon) ! epaisseur optique aerosol 550 nm, diagnostic 38 REAL :: taue670_dust(klon) ! epaisseur optique aerosol 670 nm, diagnostic 39 REAL :: taue865_dust(klon) ! epaisseur optique aerosol 865 nm, diagnostic 40 REAL :: taue550_dustsco(klon) ! epaisseur optique aerosol 550 nm, diagnostic 41 REAL :: taue670_dustsco(klon) ! epaisseur optique aerosol 670 nm, diagnostic 42 REAL :: taue865_dustsco(klon) ! epaisseur optique aerosol 865 nm, diagnostic 43 !===================== LOCAL VARIABLES =========================== 44 INTEGER :: nb_lambda,nbre_RH 45 PARAMETER (nb_lambda=3,nbre_RH=12) 46 INTEGER :: i, k, RH_num 47 REAL :: rh, RH_MAX, DELTA, RH_tab(nbre_RH) 48 PARAMETER (RH_MAX=95.) 49 INTEGER :: rh_int 50 PARAMETER (rh_int=12) 51 REAL :: auxreal 52 ! REAL ss_a(nb_lambda,int,nbtr-1) 53 ! DATA ss_a/72*1./ 54 REAL :: ss_dust(nb_lambda), ss_acc550(rh_int), alpha_acc 55 REAL :: ss_dustsco(nb_lambda) 56 REAL :: ss_acc670(rh_int), ss_acc865(rh_int) 57 REAL :: ss_ssalt550(rh_int) 58 REAL :: ss_ssalt670(rh_int), ss_ssalt865(rh_int) 59 REAL :: burden_ss(klon) 60 DATA ss_acc550 /3.135,3.135,3.135, 3.135, 4.260, 4.807, & 61 5.546,6.651,8.641,10.335,13.534,22.979/ 62 DATA ss_acc670 /2.220,2.220,2.220, 2.220, 3.048, 3.460, & 63 4.023,4.873,6.426, 7.761,10.322,18.079/ 64 DATA ss_acc865 /1.329,1.329,1.329, 1.329, 1.855, 2.124, & 65 2.494,3.060,4.114, 5.033, 6.831,12.457/ 66 !old4tracers DATA ss_dust/0.564, 0.614, 0.700/ !for bin 0.5-10um 67 ! DATA ss_dust/0.553117, 0.610185, 0.7053460 / !for bin 0.5-3um radius 68 ! DATA ss_dustsco/0.1014, 0.102156, 0.1035538 / !for bin 3-15um radius 69 !20140902 DATA ss_dust/0.5345737, 0.5878828, 0.6772957/ !for bin 0.5-3um radius 70 !20140902 DATA ss_dustsco/0.1009634, 0.1018700, 0.1031178/ !for bin 3-15um radius 71 !3days DATA ss_dust/0.4564216, 0.4906738, 0.5476248/ !for bin 0.5-3um radius 72 !3days DATA ss_dustsco/0.1015022, 0.1024051, 0.1036622/ !for bin 3-15um radius 73 !JE20140911 DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius 74 !JE20140911 DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius 75 !JE20140915 DATA ss_dust/0.3188754,0.3430106,0.3829019/ !for bin 0.5-5um radius 76 !JE20140915 DATA ss_dustsco/8.0582686E-02,8.1255026E-02,8.1861295E-02/ !for bin 5-15um radius 77 78 ! DATA ss_dust/0.5167768,0.5684330,0.6531643/ !for bin 0.5-3um radius 79 ! DATA ss_dustsco/0.1003391,0.1012288,0.1024651/ !for bin 3-15um radius 80 81 82 DATA ss_ssalt550/0.182,0.182,0.182,0.182,0.366,0.430, & 83 0.484,0.551,0.648,0.724,0.847,1.218/ !for bin 0.5-20 um, fit_v2 84 DATA ss_ssalt670/0.193,0.193,0.193,0.193,0.377,0.431, & 85 0.496,0.587,0.693,0.784,0.925,1.257/ !for bin 0.5-20 um 86 DATA ss_ssalt865/0.188,0.188,0.188,0.188,0.384,0.443, & 87 0.502,0.580,0.699,0.799,0.979,1.404/ !for bin 0.5-20 um 88 89 DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./ 90 ! 91 IF (ok_chimeredust) THEN 92 !JE20150212<< : changes in ustar in dustmod changes emission distribution 93 ! ss_dust=(/0.5167768,0.5684330,0.6531643/) 94 ! ss_dustsco=(/0.1003391,0.1012288,0.1024651/) 95 ! JE20150618: Change in dustmodule, div3 is now =6: change distributions 96 ! div3=3 ss_dust =(/0.4670522 , 0.5077308 , 0.5745184/) 97 ! div3=3 ss_dustsco=(/0.099858 , 0.1007395 , 0.1019673/) 98 ss_dust =(/0.4851232 , 0.5292494 , 0.5935509/) 99 ss_dustsco=(/0.1001981 , 0.1011043 , 0.1023113/) 100 101 !JE20150212>> 102 103 ELSE 104 ss_dust=(/0.564, 0.614, 0.700/) 105 ss_dustsco=(/0.,0.,0./) 106 ENDIF 107 108 DO i=1, klon 109 ztaue550(i)=0.0 110 ztaue670(i)=0.0 111 ztaue865(i)=0.0 112 taue550_tr2(i)=0.0 113 taue670_tr2(i)=0.0 114 taue865_tr2(i)=0.0 115 taue550_ss(i)=0.0 116 taue670_ss(i)=0.0 117 taue865_ss(i)=0.0 118 taue550_dust(i)=0.0 119 taue670_dust(i)=0.0 120 taue865_dust(i)=0.0 121 taue550_dustsco(i)=0.0 122 taue670_dustsco(i)=0.0 123 taue865_dustsco(i)=0.0 124 burden_ss(i)=0.0 125 ENDDO 126 127 DO k=1, klev 128 DO i=1, klon 129 ! 130 rh=MIN(RHcl(i,k)*100.,RH_MAX) 131 RH_num = INT( rh/10. + 1.) 132 IF (rh.gt.85.) RH_num=10 133 IF (rh.gt.90.) RH_num=11 134 ! IF (rh.gt.40.) THEN 135 ! RH_num=5 ! Added by NHL temporarily 136 ! print *,'TEMPORARY CASE' 137 ! ENDIF 138 DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num)) 139 140 141 !******************************************************************* 142 ! AOD at 550 NM 143 !******************************************************************* 144 alpha_acc=ss_acc550(RH_num) + DELTA*(ss_acc550(RH_num+1)- & 145 ss_acc550(RH_num)) !--m2/g 146 !nhl_test TOTAL AOD 147 auxreal=0. 148 IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine) 149 IF(id_coss>0) auxreal=auxreal+ss_ssalt550(RH_num)* & 150 tr_seri(i,k,id_coss) 151 IF(id_codu>0) auxreal=auxreal+ss_dust(1)*tr_seri(i,k,id_codu) 152 IF(id_scdu>0) auxreal=auxreal+ss_dustsco(1)*tr_seri(i,k,id_scdu) 153 ztaue550(i)=ztaue550(i)+auxreal*zdz(i,k)*1.e6 154 155 !JE20150128 ztaue550(i)=ztaue550(i)+(alpha_acc*tr_seri(i,k,id_fine)+ 156 ! . ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)+ 157 ! . ss_dust(1)*tr_seri(i,k,id_codu)+ 158 ! . ss_dustsco(1)*tr_seri(i,k,id_scdu) )*zdz(i,k)*1.e6 159 160 !nhl_test TOTAL AOD IS NOW AOD COARSE MODE ONLY 161 !nhl_test ztaue550(i)=ztaue550(i)+( 162 !nhl_test . ss_ssalt550(RH_num)*tr_seri(i,k,3)+ 163 !nhl_test . ss_dust(1)*tr_seri(i,k,4))*zdz(i,k)*1.e6 164 165 IF(id_fine>0) taue550_tr2(i)=taue550_tr2(i) & 166 + alpha_acc*tr_seri(i,k,id_fine)*zdz(i,k)*1.e6 167 IF(id_coss>0) taue550_ss(i)=taue550_ss(i)+ & 168 ss_ssalt550(RH_num)*tr_seri(i,k,id_coss)* & 169 zdz(i,k)*1.e6 170 IF(id_codu>0) taue550_dust(i)=taue550_dust(i)+ & 171 ss_dust(1)*tr_seri(i,k,id_codu)* & 172 zdz(i,k)*1.e6 173 IF(id_scdu>0) taue550_dustsco(i)=taue550_dustsco(i)+ & 174 ss_dustsco(1)*tr_seri(i,k,id_scdu)* & 175 zdz(i,k)*1.e6 176 ! print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss), 177 ! . MAXVAL(taue550_ss) 178 179 !******************************************************************* 180 ! AOD at 670 NM 181 !******************************************************************* 182 alpha_acc=ss_acc670(RH_num) + DELTA*(ss_acc670(RH_num+1)- & 183 ss_acc670(RH_num)) !--m2/g 184 auxreal=0. 185 IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine) 186 IF(id_coss>0) auxreal=auxreal+ss_ssalt670(RH_num) & 187 *tr_seri(i,k,id_coss) 188 IF(id_codu>0) auxreal=auxreal+ss_dust(2)*tr_seri(i,k,id_codu) 189 IF(id_scdu>0) auxreal=auxreal+ss_dustsco(2)*tr_seri(i,k,id_scdu) 190 ztaue670(i)=ztaue670(i)+auxreal*zdz(i,k)*1.e6 191 192 !JE20150128 ztaue670(i)=ztaue670(i)+(alpha_acc*tr_seri(i,k,id_fine)+ 193 ! . ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)+ 194 ! . ss_dust(2)*tr_seri(i,k,id_codu)+ 195 ! . ss_dustsco(2)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6 196 197 IF(id_fine>0) taue670_tr2(i)=taue670_tr2(i)+ & 198 alpha_acc*tr_seri(i,k,id_fine)* & 199 zdz(i,k)*1.e6 200 IF(id_coss>0) taue670_ss(i)=taue670_ss(i)+ & 201 ss_ssalt670(RH_num)*tr_seri(i,k,id_coss)* & 202 zdz(i,k)*1.e6 203 IF(id_codu>0) taue670_dust(i)=taue670_dust(i) & 204 +ss_dust(2)*tr_seri(i,k,id_codu)* & 205 zdz(i,k)*1.e6 206 IF(id_scdu>0) taue670_dustsco(i)=taue670_dustsco(i)+ & 207 ss_dustsco(2)*tr_seri(i,k,id_scdu)* & 208 zdz(i,k)*1.e6 209 210 !******************************************************************* 211 ! AOD at 865 NM 212 !******************************************************************* 213 alpha_acc=ss_acc865(RH_num) + DELTA*(ss_acc865(RH_num+1)- & 214 ss_acc865(RH_num)) !--m2/g 215 auxreal=0. 216 IF(id_fine>0) auxreal=auxreal+alpha_acc*tr_seri(i,k,id_fine) 217 IF(id_coss>0) auxreal=auxreal & 218 +ss_ssalt865(RH_num)*tr_seri(i,k,id_coss) 219 IF(id_codu>0) auxreal=auxreal+ss_dust(3)*tr_seri(i,k,id_codu) 220 IF(id_scdu>0) auxreal=auxreal+ss_dustsco(3)*tr_seri(i,k,id_scdu) 221 ztaue865(i)=ztaue865(i)+auxreal*zdz(i,k)*1.e6 222 !JE20150128 ztaue865(i)=ztaue865(i)+(alpha_acc*tr_seri(i,k,id_fine)+ 223 ! . ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)+ 224 ! . ss_dust(3)*tr_seri(i,k,id_codu)+ 225 ! . ss_dustsco(3)*tr_seri(i,k,id_scdu))*zdz(i,k)*1.e6 226 IF(id_fine>0) taue865_tr2(i)=taue865_tr2(i) & 227 +alpha_acc*tr_seri(i,k,id_fine)* & 228 zdz(i,k)*1.e6 229 IF(id_coss>0) taue865_ss(i)=taue865_ss(i)+ & 230 ss_ssalt865(RH_num)*tr_seri(i,k,id_coss)* & 231 zdz(i,k)*1.e6 232 IF(id_codu>0) taue865_dust(i)=taue865_dust(i) & 233 +ss_dust(3)*tr_seri(i,k,id_codu)* & 234 zdz(i,k)*1.e6 235 IF(id_scdu>0) taue865_dustsco(i)=taue865_dustsco(i)+ & 236 ss_dustsco(3)*tr_seri(i,k,id_scdu)* & 237 zdz(i,k)*1.e6 238 239 240 ! 241 IF(id_coss>0) burden_ss(i)=burden_ss(i) & 242 +tr_seri(i,k,id_coss)*1.e6*1.e3*zdz(i,k) 243 ENDDO !-loop on klev 244 ENDDO !-loop on klon 245 ! print *,'tr_seri = ',SUM(tr_seri(:,:,3)),MINVAL(tr_seri(:,:,3)), 246 ! . MAXVAL(tr_seri(:,:,3)) 247 ! print *,'taue550_ss = ',SUM(taue550_ss),MINVAL(taue550_ss), 248 ! . MAXVAL(taue550_ss) 249 ! 250 RETURN 251 END SUBROUTINE aeropt_spl -
LMDZ6/trunk/libf/phylmd/Dust/bcscav_spl.f90
r5245 r5246 1 SUBROUTINE bcscav_spl(pdtime,flxr,flxs,alpha_r,alpha_s,x,dx) 1 SUBROUTINE bcscav_spl(pdtime,flxr,flxs,alpha_r,alpha_s,x,dx) 2 2 3 4 IMPLICIT NONE5 c=====================================================================6 cObjet : below-cloud scavenging of tracers7 cDate : september 19998 c Auteur: O. Boucher (LOA) 9 c=====================================================================10 c 11 12 13 14 15 c 16 REAL pdtime, alpha_r, alpha_s, R_r, R_s17 18 19 REALflxr(klon,klev) ! liquid precipitation rate (kg/m2/s)20 REALflxs(klon,klev) ! solid precipitation rate (kg/m2/s)21 REALflxr_aux(klon,klev+1)22 REALflxs_aux(klon,klev+1)23 REAL x(klon,klev) ! q de traceur24 REALdx(klon,klev) ! tendance de traceur25 c 26 c--variables locales 27 INTEGER i, k28 REALpr, ps, ice, water29 c 30 c------------------------------------------31 c 32 ! NHL33 ! Auxiliary variables defined to deal with the fact that precipitation34 ! fluxes are defined on klev levels only.35 ! NHL36 !37 38 39 40 41 !42 43 DO i=1, klon44 45 46 47 48 49 ctmp dx(i,k)=-3./4.*x(i,k)*pdtime* 50 ctmp . (pr*alpha_r/R_r/rho_water+ps*alpha_s/R_s/rho_ice)51 ENDDO52 53 c 54 RETURN55 END 3 USE dimphy 4 IMPLICIT NONE 5 !===================================================================== 6 ! Objet : below-cloud scavenging of tracers 7 ! Date : september 1999 8 ! Auteur: O. Boucher (LOA) 9 !===================================================================== 10 ! 11 INCLUDE "dimensions.h" 12 INCLUDE "chem.h" 13 INCLUDE "YOMCST.h" 14 INCLUDE "YOECUMF.h" 15 ! 16 REAL :: pdtime, alpha_r, alpha_s, R_r, R_s 17 PARAMETER (R_r=0.001) !--mean raindrop radius (m) 18 PARAMETER (R_s=0.001) !--mean snow crystal radius (m) 19 REAL :: flxr(klon,klev) ! liquid precipitation rate (kg/m2/s) 20 REAL :: flxs(klon,klev) ! solid precipitation rate (kg/m2/s) 21 REAL :: flxr_aux(klon,klev+1) 22 REAL :: flxs_aux(klon,klev+1) 23 REAL :: x(klon,klev) ! q de traceur 24 REAL :: dx(klon,klev) ! tendance de traceur 25 ! 26 !--variables locales 27 INTEGER :: i, k 28 REAL :: pr, ps, ice, water 29 ! 30 !------------------------------------------ 31 ! 32 ! NHL 33 ! Auxiliary variables defined to deal with the fact that precipitation 34 ! fluxes are defined on klev levels only. 35 ! NHL 36 ! 37 flxr_aux(:,klev+1)=0.0 38 flxs_aux(:,klev+1)=0.0 39 flxr_aux(:,1:klev)=flxr(:,:) 40 flxs_aux(:,1:klev)=flxs(:,:) 41 ! 42 DO k=1, klev 43 DO i=1, klon 44 pr=0.5*(flxr_aux(i,k)+flxr_aux(i,k+1)) 45 ps=0.5*(flxs_aux(i,k)+flxs_aux(i,k+1)) 46 water=pr*alpha_r/R_r/rho_water 47 ice=ps*alpha_s/R_s/rho_ice 48 dx(i,k)=-3./4.*x(i,k)*pdtime*(water+ice) 49 !tmp dx(i,k)=-3./4.*x(i,k)*pdtime* 50 !tmp . (pr*alpha_r/R_r/rho_water+ps*alpha_s/R_s/rho_ice) 51 ENDDO 52 ENDDO 53 ! 54 RETURN 55 END SUBROUTINE bcscav_spl -
LMDZ6/trunk/libf/phylmd/Dust/bl_for_dms.f90
r5245 r5246 1 SUBROUTINE bl_for_dms(u,v,paprs,pplay,cdragh,cdragm 2 .,t,q,tsol,ustar,obklen)3 4 5 c 6 c===================================================================7 c Auteur : E. Cosme 8 c Calcul de la vitesse de friction (ustar) et de la longueur de 9 cMonin-Obukhov (obklen), necessaires pour calculer les flux de DMS10 cpar la methode de Nightingale.11 cCette subroutine est plus que fortement inspiree de la subroutine12 c'nonlocal' dans clmain.F .13 creference : Holtslag, A.A.M., and B.A. Boville, 1993:14 cLocal versus nonlocal boundary-layer diffusion in a global climate15 cmodel. J. of Climate, vol. 6, 1825-1842. (a confirmer)16 c31 08 0117 c===================================================================18 c 19 20 21 22 23 c 24 cArguments :25 REALu(klon,klev) ! vent zonal26 REALv(klon,klev) ! vent meridien27 REALpaprs(klon,klev+1) ! niveaux de pression aux intercouches (Pa)28 REALpplay(klon,klev) ! niveaux de pression aux milieux... (Pa)29 REALcdragh(klon) ! coefficient de trainee pour la chaleur30 REALcdragm(klon) ! coefficient de trainee pour le vent31 REALt(klon,klev) ! temperature32 REALq(klon,klev) ! humidite kg/kg33 REALtsol(klon) ! temperature du sol34 REALustar(klon) ! vitesse de friction35 REALobklen(klon) ! longueur de Monin-Obukhov36 c 37 cLocales :38 REALvk39 40 REALbeta ! coefficient d'evaporation reelle (/evapotranspiration)41 42 43 INTEGERi,k44 REALzxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy45 REALzcor, zdelta, zcvm546 REALz(klon,klev)47 REALzx_alf1, zx_alf2 ! parametres pour extrapolation48 REALkhfs(klon) ! surface kinematic heat flux [mK/s]49 REALkqfs(klon) ! sfc kinematic constituent flux [m/s]50 REALheatv(klon) ! surface virtual heat flux1 SUBROUTINE bl_for_dms(u,v,paprs,pplay,cdragh,cdragm & 2 ,t,q,tsol,ustar,obklen) 3 USE dimphy 4 IMPLICIT NONE 5 ! 6 !=================================================================== 7 ! Auteur : E. Cosme 8 ! Calcul de la vitesse de friction (ustar) et de la longueur de 9 ! Monin-Obukhov (obklen), necessaires pour calculer les flux de DMS 10 ! par la methode de Nightingale. 11 ! Cette subroutine est plus que fortement inspiree de la subroutine 12 ! 'nonlocal' dans clmain.F . 13 ! reference : Holtslag, A.A.M., and B.A. Boville, 1993: 14 ! Local versus nonlocal boundary-layer diffusion in a global climate 15 ! model. J. of Climate, vol. 6, 1825-1842. (a confirmer) 16 ! 31 08 01 17 !=================================================================== 18 ! 19 INCLUDE "dimensions.h" 20 INCLUDE "YOMCST.h" 21 INCLUDE "YOETHF.h" 22 INCLUDE "FCTTRE.h" 23 ! 24 ! Arguments : 25 REAL :: u(klon,klev) ! vent zonal 26 REAL :: v(klon,klev) ! vent meridien 27 REAL :: paprs(klon,klev+1) ! niveaux de pression aux intercouches (Pa) 28 REAL :: pplay(klon,klev) ! niveaux de pression aux milieux... (Pa) 29 REAL :: cdragh(klon) ! coefficient de trainee pour la chaleur 30 REAL :: cdragm(klon) ! coefficient de trainee pour le vent 31 REAL :: t(klon,klev) ! temperature 32 REAL :: q(klon,klev) ! humidite kg/kg 33 REAL :: tsol(klon) ! temperature du sol 34 REAL :: ustar(klon) ! vitesse de friction 35 REAL :: obklen(klon) ! longueur de Monin-Obukhov 36 ! 37 ! Locales : 38 REAL :: vk 39 PARAMETER (vk=0.35) 40 REAL :: beta ! coefficient d'evaporation reelle (/evapotranspiration) 41 ! ! entre 0 et 1, mais 1 au-dessus de la mer 42 PARAMETER (beta=1.) 43 INTEGER :: i,k 44 REAL :: zxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy 45 REAL :: zcor, zdelta, zcvm5 46 REAL :: z(klon,klev) 47 REAL :: zx_alf1, zx_alf2 ! parametres pour extrapolation 48 REAL :: khfs(klon) ! surface kinematic heat flux [mK/s] 49 REAL :: kqfs(klon) ! sfc kinematic constituent flux [m/s] 50 REAL :: heatv(klon) ! surface virtual heat flux 51 51 52 53 c54 c======================================================================55 c56 c Calculer les hauteurs de chaque couche57 c58 ! JE20150707 r2es=611.14 *18.0153/28.964459 DO i = 1, klon60 z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1)))61 . * (paprs(i,1)-pplay(i,1)) / RG62 ENDDO63 DO k = 2, klev64 DO i = 1, klon65 z(i,k) = z(i,k-1)66 . + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k)67 . * (pplay(i,k-1)-pplay(i,k)) / RG68 ENDDO69 ENDDO70 52 71 DO i = 1, klon 72 c 73 zdelta=MAX(0.,SIGN(1.,RTT-tsol(i))) 74 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta 75 zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1)) 76 zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1) 77 zxqs=MIN(0.5,zxqs) 78 zcor=1./(1.-retv*zxqs) 79 zxqs=zxqs*zcor 80 c 81 zx_alf1 = 1.0 82 zx_alf2 = 1.0 - zx_alf1 83 zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) 84 . *(1.+RETV*q(i,1))*zx_alf1 85 . + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) 86 . *(1.+RETV*q(i,2))*zx_alf2 87 zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2 88 zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2 89 zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2 90 zxmod = 1.0+SQRT(zxu**2+zxv**2) 91 khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i) 92 kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta 93 heatv(i) = khfs(i) + 0.61*zxt*kqfs(i) 94 taux = zxu *zxmod*cdragm(i) 95 tauy = zxv *zxmod*cdragm(i) 96 ustar(i) = SQRT(taux**2+tauy**2) 97 ustar(i) = MAX(SQRT(ustar(i)),0.01) 98 c 99 ENDDO 100 c 101 DO i = 1, klon 102 obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i)) 103 ENDDO 104 c 105 END SUBROUTINE 53 ! 54 !====================================================================== 55 ! 56 ! Calculer les hauteurs de chaque couche 57 ! 58 ! JE20150707 r2es=611.14 *18.0153/28.9644 59 DO i = 1, klon 60 z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) & 61 * (paprs(i,1)-pplay(i,1)) / RG 62 ENDDO 63 DO k = 2, klev 64 DO i = 1, klon 65 z(i,k) = z(i,k-1) & 66 + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) & 67 * (pplay(i,k-1)-pplay(i,k)) / RG 68 ENDDO 69 ENDDO 70 71 DO i = 1, klon 72 ! 73 zdelta=MAX(0.,SIGN(1.,RTT-tsol(i))) 74 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta 75 zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1)) 76 zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1) 77 zxqs=MIN(0.5,zxqs) 78 zcor=1./(1.-retv*zxqs) 79 zxqs=zxqs*zcor 80 ! 81 zx_alf1 = 1.0 82 zx_alf2 = 1.0 - zx_alf1 83 zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) & 84 *(1.+RETV*q(i,1))*zx_alf1 & 85 + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) & 86 *(1.+RETV*q(i,2))*zx_alf2 87 zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2 88 zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2 89 zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2 90 zxmod = 1.0+SQRT(zxu**2+zxv**2) 91 khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i) 92 kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta 93 heatv(i) = khfs(i) + 0.61*zxt*kqfs(i) 94 taux = zxu *zxmod*cdragm(i) 95 tauy = zxv *zxmod*cdragm(i) 96 ustar(i) = SQRT(taux**2+tauy**2) 97 ustar(i) = MAX(SQRT(ustar(i)),0.01) 98 ! 99 ENDDO 100 ! 101 DO i = 1, klon 102 obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i)) 103 ENDDO 104 ! 105 END SUBROUTINE -
LMDZ6/trunk/libf/phylmd/Dust/blcloud_scav.f90
r5245 r5246 1 cSubroutine that calculates the effect of precipitation in scavenging2 cBELOW the cloud, for large scale as well as convective precipitation3 SUBROUTINE blcloud_scav(lminmax,qmin,qmax,pdtphys,prfl,psfl, 4 . pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse,5 .his_dhbclsc,his_dhbccon,tr_seri)1 ! Subroutine that calculates the effect of precipitation in scavenging 2 ! BELOW the cloud, for large scale as well as convective precipitation 3 SUBROUTINE blcloud_scav(lminmax,qmin,qmax,pdtphys,prfl,psfl, & 4 pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse, & 5 his_dhbclsc,his_dhbccon,tr_seri) 6 6 7 8 9 10 7 USE dimphy 8 USE indice_sol_mod 9 USE infotrac 10 IMPLICIT NONE 11 11 12 13 14 15 12 INCLUDE "dimensions.h" 13 INCLUDE "chem.h" 14 INCLUDE "YOMCST.h" 15 INCLUDE "paramet.h" 16 16 17 c============================= INPUT ===================================18 REALqmin,qmax19 REALpdtphys ! pas d'integration pour la physique (seconde)20 !REAL prfl(klon,klev), psfl(klon,klev) !--large-scale21 !REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection22 REALalpha_r(nbtr)!--coefficient d'impaction pour la pluie23 REAL alpha_s(nbtr)!--coefficient d'impaction pour la neige24 REALmasse(nbtr)25 LOGICALlminmax26 REALzdz(klon,klev)27 REALprfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane28 REALpmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane29 c============================= OUTPUT ==================================30 REALtr_seri(klon,klev,nbtr) ! traceur31 REALaux_var1(klon,klev) ! traceur32 REALaux_var2(klon,klev) ! traceur33 REALhis_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)34 c========================= LOCAL VARIABLES ============================= 35 INTEGERit, k, i, j36 REALd_tr(klon,klev,nbtr)17 !============================= INPUT =================================== 18 REAL :: qmin,qmax 19 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 20 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 21 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 22 REAL :: alpha_r(nbtr)!--coefficient d'impaction pour la pluie 23 REAL :: alpha_s(nbtr)!--coefficient d'impaction pour la neige 24 REAL :: masse(nbtr) 25 LOGICAL :: lminmax 26 REAL :: zdz(klon,klev) 27 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 28 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 29 !============================= OUTPUT ================================== 30 REAL :: tr_seri(klon,klev,nbtr) ! traceur 31 REAL :: aux_var1(klon,klev) ! traceur 32 REAL :: aux_var2(klon,klev) ! traceur 33 REAL :: his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr) 34 !========================= LOCAL VARIABLES ============================= 35 INTEGER :: it, k, i, j 36 REAL :: d_tr(klon,klev,nbtr) 37 37 38 39 40 41 c 42 43 44 45 46 47 48 c 49 cnhl CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),50 cnhl . tr_seri(1,1,it),d_tr(1,1,it))51 CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),52 .aux_var1,aux_var2)53 c 54 55 56 57 58 59 60 61 62 63 his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO*64 .masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s65 66 67 68 c 69 70 71 72 73 74 75 c 76 77 78 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')79 80 c 81 c-scheme for convective scavenging82 c 83 cnhl CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),84 cnhl . tr_seri(1,1,it),d_tr(1,1,it))38 EXTERNAL minmaxqfi, bcscav_spl 39 40 DO it=1, nbtr 41 ! 42 DO j=1,klev 43 DO i=1,klon 44 aux_var1(i,j)=tr_seri(i,j,it) 45 aux_var2(i,j)=d_tr(i,j,it) 46 ENDDO 47 ENDDO 48 ! 49 !nhl CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), 50 !nhl . tr_seri(1,1,it),d_tr(1,1,it)) 51 CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), & 52 aux_var1,aux_var2) 53 ! 54 DO j=1,klev 55 DO i=1,klon 56 tr_seri(i,j,it)=aux_var1(i,j) 57 d_tr(i,j,it)=aux_var2(i,j) 58 ENDDO 59 ENDDO 60 DO k = 1, klev 61 DO i = 1, klon 62 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it) 63 his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO* & 64 masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s 65 66 ENDDO 67 ENDDO 68 ! 69 DO i=1,klon 70 DO j=1,klev 71 aux_var1(i,j)=tr_seri(i,j,it) 72 aux_var2(i,j)=d_tr(i,j,it) 73 ENDDO 74 ENDDO 75 ! 76 IF (lminmax) THEN 77 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc') 78 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc') 79 ENDIF 80 ! 81 !-scheme for convective scavenging 82 ! 83 !nhl CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it), 84 !nhl . tr_seri(1,1,it),d_tr(1,1,it)) 85 85 86 86 87 CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),88 .aux_var1,aux_var2)87 CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it), & 88 aux_var1,aux_var2) 89 89 90 90 91 c 92 93 94 95 96 97 98 c 99 100 101 102 his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO*103 .masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s104 105 106 c 107 108 109 110 111 112 113 114 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')115 116 117 118 119 120 121 c 122 c 123 124 c 125 END 91 ! 92 DO i=1,klon 93 DO j=1,klev 94 tr_seri(i,j,it)=aux_var1(i,j) 95 d_tr(i,j,it)=aux_var2(i,j) 96 ENDDO 97 ENDDO 98 ! 99 DO k = 1, klev 100 DO i = 1, klon 101 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it) 102 his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO* & 103 masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s 104 ENDDO 105 ENDDO 106 ! 107 IF (lminmax) THEN 108 DO j=1,klev 109 DO i=1,klon 110 aux_var1(i,j)=tr_seri(i,j,it) 111 ENDDO 112 ENDDO 113 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con') 114 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con') 115 DO j=1,klev 116 DO i=1,klon 117 tr_seri(i,j,it)=aux_var1(i,j) 118 ENDDO 119 ENDDO 120 ENDIF 121 ! 122 ! 123 ENDDO !--boucle sur it 124 ! 125 END SUBROUTINE blcloud_scav -
LMDZ6/trunk/libf/phylmd/Dust/blcloud_scav_lsc.f90
r5245 r5246 1 cSubroutine that calculates the effect of precipitation in scavenging2 cBELOW the cloud, for large scale as well as convective precipitation3 SUBROUTINE blcloud_scav_lsc(lminmax,qmin,qmax,pdtphys,prfl,psfl, 4 . pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse,5 .his_dhbclsc,his_dhbccon,tr_seri)1 ! Subroutine that calculates the effect of precipitation in scavenging 2 ! BELOW the cloud, for large scale as well as convective precipitation 3 SUBROUTINE blcloud_scav_lsc(lminmax,qmin,qmax,pdtphys,prfl,psfl, & 4 pmflxr,pmflxs,zdz,alpha_r,alpha_s,masse, & 5 his_dhbclsc,his_dhbccon,tr_seri) 6 6 7 8 9 10 7 USE dimphy 8 USE indice_sol_mod 9 USE infotrac 10 IMPLICIT NONE 11 11 12 13 14 15 12 INCLUDE "dimensions.h" 13 INCLUDE "chem.h" 14 INCLUDE "YOMCST.h" 15 INCLUDE "paramet.h" 16 16 17 c============================= INPUT ===================================18 REALqmin,qmax19 REALpdtphys ! pas d'integration pour la physique (seconde)20 !REAL prfl(klon,klev), psfl(klon,klev) !--large-scale21 !REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection22 REALalpha_r(nbtr)!--coefficient d'impaction pour la pluie23 REAL alpha_s(nbtr)!--coefficient d'impaction pour la neige24 REALmasse(nbtr)25 LOGICALlminmax26 REALzdz(klon,klev)27 REALprfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane28 REALpmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane29 c============================= OUTPUT ==================================30 REALtr_seri(klon,klev,nbtr) ! traceur31 REALaux_var1(klon,klev) ! traceur32 REALaux_var2(klon,klev) ! traceur33 REALhis_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr)34 c========================= LOCAL VARIABLES ============================= 35 INTEGERit, k, i, j36 REALd_tr(klon,klev,nbtr)17 !============================= INPUT =================================== 18 REAL :: qmin,qmax 19 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 20 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 21 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 22 REAL :: alpha_r(nbtr)!--coefficient d'impaction pour la pluie 23 REAL :: alpha_s(nbtr)!--coefficient d'impaction pour la neige 24 REAL :: masse(nbtr) 25 LOGICAL :: lminmax 26 REAL :: zdz(klon,klev) 27 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 28 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 29 !============================= OUTPUT ================================== 30 REAL :: tr_seri(klon,klev,nbtr) ! traceur 31 REAL :: aux_var1(klon,klev) ! traceur 32 REAL :: aux_var2(klon,klev) ! traceur 33 REAL :: his_dhbclsc(klon,nbtr), his_dhbccon(klon,nbtr) 34 !========================= LOCAL VARIABLES ============================= 35 INTEGER :: it, k, i, j 36 REAL :: d_tr(klon,klev,nbtr) 37 37 38 39 40 41 c 42 43 44 45 46 47 48 c 49 cnhl CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),50 cnhl . tr_seri(1,1,it),d_tr(1,1,it))51 CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it),52 .aux_var1,aux_var2)53 c 54 55 56 57 58 59 60 61 62 63 his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO*64 .masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s65 66 67 68 c 69 70 71 72 73 74 75 c 76 77 78 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc')79 80 c 81 c-scheme for convective scavenging82 c 83 cnhl CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),84 cnhl . tr_seri(1,1,it),d_tr(1,1,it))38 EXTERNAL minmaxqfi, bcscav_spl 39 40 DO it=1, nbtr 41 ! 42 DO j=1,klev 43 DO i=1,klon 44 aux_var1(i,j)=tr_seri(i,j,it) 45 aux_var2(i,j)=d_tr(i,j,it) 46 ENDDO 47 ENDDO 48 ! 49 !nhl CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), 50 !nhl . tr_seri(1,1,it),d_tr(1,1,it)) 51 CALL bcscav_spl(pdtphys,prfl,psfl,alpha_r(it),alpha_s(it), & 52 aux_var1,aux_var2) 53 ! 54 DO j=1,klev 55 DO i=1,klon 56 tr_seri(i,j,it)=aux_var1(i,j) 57 d_tr(i,j,it)=aux_var2(i,j) 58 ENDDO 59 ENDDO 60 DO k = 1, klev 61 DO i = 1, klon 62 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it) 63 his_dhbclsc(i,it)=his_dhbclsc(i,it)-d_tr(i,k,it)/RNAVO* & 64 masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s 65 66 ENDDO 67 ENDDO 68 ! 69 DO i=1,klon 70 DO j=1,klev 71 aux_var1(i,j)=tr_seri(i,j,it) 72 aux_var2(i,j)=d_tr(i,j,it) 73 ENDDO 74 ENDDO 75 ! 76 IF (lminmax) THEN 77 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc lsc') 78 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc lsc') 79 ENDIF 80 ! 81 !-scheme for convective scavenging 82 ! 83 !nhl CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it), 84 !nhl . tr_seri(1,1,it),d_tr(1,1,it)) 85 85 86 86 87 cJE CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it),88 cJE . aux_var1,aux_var2)87 !JE CALL bcscav_spl(pdtphys,pmflxr,pmflxs,alpha_r(it),alpha_s(it), 88 !JE . aux_var1,aux_var2) 89 89 90 90 91 c 92 93 94 95 96 97 98 c 99 100 101 102 his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO*103 .masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s104 105 106 c 107 108 109 110 111 112 113 114 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con')115 116 117 118 119 120 121 c 122 c 123 124 c 125 END 91 ! 92 DO i=1,klon 93 DO j=1,klev 94 tr_seri(i,j,it)=aux_var1(i,j) 95 d_tr(i,j,it)=aux_var2(i,j) 96 ENDDO 97 ENDDO 98 ! 99 DO k = 1, klev 100 DO i = 1, klon 101 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr(i,k,it) 102 his_dhbccon(i,it)=his_dhbccon(i,it)-d_tr(i,k,it)/RNAVO* & 103 masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys !--mgS/m2/s 104 ENDDO 105 ENDDO 106 ! 107 IF (lminmax) THEN 108 DO j=1,klev 109 DO i=1,klon 110 aux_var1(i,j)=tr_seri(i,j,it) 111 ENDDO 112 ENDDO 113 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide bc con') 114 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide bc con') 115 DO j=1,klev 116 DO i=1,klon 117 tr_seri(i,j,it)=aux_var1(i,j) 118 ENDDO 119 ENDDO 120 ENDIF 121 ! 122 ! 123 ENDDO !--boucle sur it 124 ! 125 END SUBROUTINE blcloud_scav_lsc -
LMDZ6/trunk/libf/phylmd/Dust/cltrac_spl.f90
r5245 r5246 1 SUBROUTINE cltrac_spl(dtime,coef,yu1,yv1,t,tr, 2 .flux,paprs,pplay,d_tr)1 SUBROUTINE cltrac_spl(dtime,coef,yu1,yv1,t,tr, & 2 flux,paprs,pplay,d_tr) 3 3 4 5 6 c======================================================================7 cAuteur(s): O. Boucher (LOA/LMD) date: 199611278 cinspire de clvent9 cObjet: diffusion verticale de traceurs avec flux fixe a la surface10 cou/et flux du type c-drag11 c======================================================================12 cArguments:13 cdtime----input-R- intervalle du temps (en second)14 ccoef-----input-R- le coefficient d'echange (m**2/s) l>115 cyu1------input-R- le vent dans le 1iere couche16 cyv1------input-R- le vent dans le 1iere couche17 ct--------input-R- temperature (K)18 ctr-------input-R- la q. de traceurs19 cflux-----input-R- le flux de traceurs a la surface20 cpaprs----input-R- pression a inter-couche (Pa)21 cpplay----input-R- pression au milieu de couche (Pa)22 cdelp-----input-R- epaisseur de couche (Pa)23 ccdrag----input-R- cdrag pour le flux de surface (non active)24 ctr0------input-R- traceurs a la surface ou dans l'ocean (non active)25 cd_tr-----output-R- le changement de tr26 cflux_tr--output-R- flux de tr27 c======================================================================28 29 REALdtime30 REALcoef(klon,klev)31 REALyu1(klon), yv1(klon)32 REALt(klon,klev), tr(klon,klev)33 REALpaprs(klon,klev+1), pplay(klon,klev), delp(klon,klev)34 REALd_tr(klon,klev)35 REALflux(klon), cdrag(klon), tr0(klon)36 cREAL flux_tr(klon,klev)37 c======================================================================38 39 c======================================================================40 INTEGERi, k41 REALzx_ctr(klon,2:klev)42 REALzx_dtr(klon,2:klev)43 REALzx_buf(klon)44 REALzx_coef(klon,klev)45 REALlocal_tr(klon,klev)46 REALzx_alf1(klon), zx_alf2(klon), zx_flux(klon)47 c======================================================================48 cCHECKING VALUES49 !print *,'CHECKING VALUES IN CLTRAC (INI)'50 !print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)51 !print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux)52 !print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)53 c======================================================================54 55 56 57 58 59 60 c======================================================================61 62 63 64 65 c--pour le moment le flux est prescrit66 cdrag(i) = 0.067 ccdrag(i) = coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2))68 c. * pplay(i,1)/(RD*t(i,1))69 70 zx_coef(i,1) = cdrag(i)*dtime*RG71 72 c======================================================================73 74 75 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k))76 .*(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**277 78 79 80 c======================================================================81 82 83 zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+84 .zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i)85 zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) /86 .zx_buf(i)87 88 c 89 90 91 zx_buf(i) = delp(i,k-1) + zx_coef(i,k)92 .+ zx_coef(i,k-1)*(1.-zx_dtr(i,k-1))93 zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1)94 .+zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i)95 96 97 98 99 local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev)100 . +zx_coef(i,klev)*zx_ctr(i,klev) )101 . / ( delp(i,klev) + zx_coef(i,klev)102 .-zx_coef(i,klev)*zx_dtr(i,klev) )103 104 105 106 107 108 109 c======================================================================110 !print *,'CHECKING VALUES IN CLTRAC (FIN)'111 !print *,'local_tr = ',sum(local_tr),MINVAL(local_tr),112 !. MAXVAL(local_tr)113 !print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr)114 !print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr)115 !print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)116 c======================================================================117 c== flux_tr est le flux de traceur (positif vers bas)118 cDO i = 1, klon119 cflux_tr(i,1) = zx_coef(i,1)/(RG*dtime)120 cENDDO121 cDO k = 2, klev122 cDO i = 1, klon123 cflux_tr(i,k) = zx_coef(i,k)/(RG*dtime)124 c. * (local_tr(i,k)-local_tr(i,k-1))125 cENDDO126 cENDDO127 c======================================================================128 129 130 131 132 133 !print *,'CHECKING VALUES IN CLTRAC (END)'134 !print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)135 c 136 137 END 4 USE dimphy 5 IMPLICIT none 6 !====================================================================== 7 ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127 8 ! inspire de clvent 9 ! Objet: diffusion verticale de traceurs avec flux fixe a la surface 10 ! ou/et flux du type c-drag 11 !====================================================================== 12 ! Arguments: 13 ! dtime----input-R- intervalle du temps (en second) 14 ! coef-----input-R- le coefficient d'echange (m**2/s) l>1 15 ! yu1------input-R- le vent dans le 1iere couche 16 ! yv1------input-R- le vent dans le 1iere couche 17 ! t--------input-R- temperature (K) 18 ! tr-------input-R- la q. de traceurs 19 ! flux-----input-R- le flux de traceurs a la surface 20 ! paprs----input-R- pression a inter-couche (Pa) 21 ! pplay----input-R- pression au milieu de couche (Pa) 22 ! delp-----input-R- epaisseur de couche (Pa) 23 ! cdrag----input-R- cdrag pour le flux de surface (non active) 24 ! tr0------input-R- traceurs a la surface ou dans l'ocean (non active) 25 ! d_tr-----output-R- le changement de tr 26 ! flux_tr--output-R- flux de tr 27 !====================================================================== 28 INCLUDE "dimensions.h" 29 REAL :: dtime 30 REAL :: coef(klon,klev) 31 REAL :: yu1(klon), yv1(klon) 32 REAL :: t(klon,klev), tr(klon,klev) 33 REAL :: paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev) 34 REAL :: d_tr(klon,klev) 35 REAL :: flux(klon), cdrag(klon), tr0(klon) 36 ! REAL flux_tr(klon,klev) 37 !====================================================================== 38 INCLUDE "YOMCST.h" 39 !====================================================================== 40 INTEGER :: i, k 41 REAL :: zx_ctr(klon,2:klev) 42 REAL :: zx_dtr(klon,2:klev) 43 REAL :: zx_buf(klon) 44 REAL :: zx_coef(klon,klev) 45 REAL :: local_tr(klon,klev) 46 REAL :: zx_alf1(klon), zx_alf2(klon), zx_flux(klon) 47 !====================================================================== 48 ! CHECKING VALUES 49 ! print *,'CHECKING VALUES IN CLTRAC (INI)' 50 ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr) 51 ! print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux) 52 ! print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr) 53 !====================================================================== 54 DO k = 1, klev 55 DO i = 1, klon 56 local_tr(i,k) = tr(i,k) 57 delp(i,k) = paprs(i,k)-paprs(i,k+1) 58 ENDDO 59 ENDDO 60 !====================================================================== 61 DO i = 1, klon 62 zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) 63 zx_alf2(i) = 1.0 - zx_alf1(i) 64 zx_flux(i) = -flux(i)*dtime*RG 65 !--pour le moment le flux est prescrit 66 cdrag(i) = 0.0 67 ! cdrag(i) = coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2)) 68 ! . * pplay(i,1)/(RD*t(i,1)) 69 tr0(i) = 0.0 70 zx_coef(i,1) = cdrag(i)*dtime*RG 71 ENDDO 72 !====================================================================== 73 DO k = 2, klev 74 DO i = 1, klon 75 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) & 76 *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 77 zx_coef(i,k) = zx_coef(i,k)*dtime*RG 78 ENDDO 79 ENDDO 80 !====================================================================== 81 DO i = 1, klon 82 zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2) 83 zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+ & 84 zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i) 85 zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) / & 86 zx_buf(i) 87 ENDDO 88 ! 89 DO k = 3, klev 90 DO i = 1, klon 91 zx_buf(i) = delp(i,k-1) + zx_coef(i,k) & 92 + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1)) 93 zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1) & 94 +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i) 95 zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i) 96 ENDDO 97 ENDDO 98 DO i = 1, klon 99 local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev) & 100 +zx_coef(i,klev)*zx_ctr(i,klev) ) & 101 / ( delp(i,klev) + zx_coef(i,klev) & 102 -zx_coef(i,klev)*zx_dtr(i,klev) ) 103 ENDDO 104 DO k = klev-1, 1, -1 105 DO i = 1, klon 106 local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1) 107 ENDDO 108 ENDDO 109 !====================================================================== 110 ! print *,'CHECKING VALUES IN CLTRAC (FIN)' 111 ! print *,'local_tr = ',sum(local_tr),MINVAL(local_tr), 112 ! . MAXVAL(local_tr) 113 ! print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr) 114 ! print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr) 115 ! print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr) 116 !====================================================================== 117 !== flux_tr est le flux de traceur (positif vers bas) 118 ! DO i = 1, klon 119 ! flux_tr(i,1) = zx_coef(i,1)/(RG*dtime) 120 ! ENDDO 121 ! DO k = 2, klev 122 ! DO i = 1, klon 123 ! flux_tr(i,k) = zx_coef(i,k)/(RG*dtime) 124 ! . * (local_tr(i,k)-local_tr(i,k-1)) 125 ! ENDDO 126 ! ENDDO 127 !====================================================================== 128 DO k = 1, klev 129 DO i = 1, klon 130 d_tr(i,k) = local_tr(i,k) - tr(i,k) 131 ENDDO 132 ENDDO 133 ! print *,'CHECKING VALUES IN CLTRAC (END)' 134 ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr) 135 ! 136 RETURN 137 END SUBROUTINE cltrac_spl -
LMDZ6/trunk/libf/phylmd/Dust/cm3_to_kg.f90
r5245 r5246 1 1 SUBROUTINE cm3_to_kg(pplay,t_seri,tr_seri) 2 2 3 4 5 3 USE dimphy 4 USE infotrac 5 USE indice_sol_mod 6 6 7 8 c 9 10 11 c 12 REALt_seri(klon,klev), pplay(klon,klev)13 REALtr_seri(klon,klev)14 REALzrho15 INTEGERi, k16 c 17 !JE20150707 RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.964418 19 20 21 22 23 24 c 25 END 7 IMPLICIT NONE 8 ! 9 INCLUDE "dimensions.h" 10 INCLUDE "YOMCST.h" 11 ! 12 REAL :: t_seri(klon,klev), pplay(klon,klev) 13 REAL :: tr_seri(klon,klev) 14 REAL :: zrho 15 INTEGER :: i, k 16 ! 17 !JE20150707 RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.9644 18 DO k = 1, klev 19 DO i = 1, klon 20 zrho=pplay(i,k)/t_seri(i,k)/RD 21 tr_seri(i,k)=tr_seri(i,k)*1.e6/zrho 22 ENDDO 23 ENDDO 24 ! 25 END SUBROUTINE cm3_to_kg -
LMDZ6/trunk/libf/phylmd/Dust/coarsemission.f90
r5245 r5246 1 cThis subroutine calculates the emissions of SEA SALT and DUST, part of2 Cwhich goes to tracer 2 and other part to tracer 3.3 SUBROUTINE coarsemission(pctsrf,pdtphys, 4 . t_seri,pmflxr,pmflxs,prfl,psfl,5 . xlat,xlon,debutphy,6 . zu10m,zv10m,wstar,ale_bl,ale_wake,7 . scale_param_ssacc,scale_param_sscoa,8 . scale_param_dustacc,scale_param_dustcoa,9 . scale_param_dustsco,10 . nbreg_dust,11 . iregion_dust,dust_ec,12 . param_wstarBLperregion,param_wstarWAKEperregion,13 . nbreg_wstardust,14 . iregion_wstardust,15 . lmt_sea_salt,qmin,qmax,16 . flux_sparam_ddfine,flux_sparam_ddcoa,17 . flux_sparam_ddsco,18 . flux_sparam_ssfine,flux_sparam_sscoa,19 . id_prec,id_fine,id_coss,id_codu,id_scdu,20 . ok_chimeredust,21 .source_tr,flux_tr)22 !. wth,cly,zprecipinsoil,lmt_sea_salt,23 24 ! CALL dustemission( debutphy, xlat, xlon, pctsrf, 25 !. zu10m zv10m,wstar,ale_bl,ale_wake)26 !27 28 29 30 31 USE dustemission_mod, ONLY : dustemission32 !USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb33 34 35 36 37 38 39 40 41 c============================== INPUT ==================================42 INTEGERnbjour43 LOGICALok_chimeredust44 REALpdtphys ! pas d'integration pour la physique (seconde)45 REALt_seri(klon,klev) ! temperature46 REALpctsrf(klon,nbsrf)47 REALpmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection48 !REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection49 REALprfl(klon,klev+1), psfl(klon,klev+1) !--large-scale50 !REAL prfl(klon,klev), psfl(klon,klev) !--large-scale51 LOGICALdebutphy, lafinphy52 REAL, intent(in) :: xlat(klon) ! latitudes pour chaque point53 REAL, intent(in) :: xlon(klon) ! longitudes pour chaque point54 55 56 57 58 c 59 c------------------------- Scaling Parameters --------------------------60 c 61 INTEGERiregion_dust(klon) !Defines dust regions62 REALscale_param_ssacc !Scaling parameter for Fine Sea Salt63 REALscale_param_sscoa !Scaling parameter for Coarse Sea Salt64 REALscale_param_dustacc(nbreg_dust) !Scaling parameter for Fine Dust65 REALscale_param_dustcoa(nbreg_dust) !Scaling parameter for Coarse Dust66 REALscale_param_dustsco(nbreg_dust) !Scaling parameter for SCoarse Dust67 !JE20141124<<68 INTEGERiregion_wstardust(klon) !Defines dust regions in terms of wstar69 REALparam_wstarBLperregion(nbreg_wstardust) !70 REALparam_wstarWAKEperregion(nbreg_wstardust) !71 REALparam_wstarBL(klon) !parameter for surface wind correction..72 REALparam_wstarWAKE(klon) !parameter for surface wind correction..73 INTEGERnbreg_wstardust74 !JE20141124>>75 INTEGERnbreg_dust76 77 c============================== OUTPUT =================================78 REALsource_tr(klon,nbtr)79 REALflux_tr(klon,nbtr)80 REALflux_sparam_ddfine(klon), flux_sparam_ddcoa(klon)81 REALflux_sparam_ddsco(klon)82 REALflux_sparam_ssfine(klon), flux_sparam_sscoa(klon)83 c=========================== LOCAL VARIABLES =========================== 84 INTEGERi, j85 REALpct_ocean(klon)86 !REAL zprecipinsoil(klon)87 !REAL cly(klon), wth(klon)88 REALclyfac, avgdryrate, drying89 90 c---------------------------- SEA SALT emissions ------------------------91 REAL lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um92 c 93 c--------vent 10 m CEPMMT94 c 95 REALdust_ec(klon)96 97 realtmp_var2(klon,nbtr) ! auxiliary variable to replace source98 REALqmin, qmax99 !----------------------DUST Sahara ---------------100 101 102 C*********************** DUST EMMISSIONS *******************************103 c 104 105 !avgdryrate=300./365.*pdtphys/86400.106 c 107 !DO i=1, klon108 c 109 !IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN110 !zprecipinsoil(i)=zprecipinsoil(i) +111 ! . (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys112 c 113 !clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil114 !drying=avgdryrate*exp(0.03905491*115 ! . exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]116 !zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm]117 c 118 !ENDIF119 c 120 !ENDDO121 c 122 c==================== CALCULATING DUST EMISSIONS ======================123 c 124 !IF (lminmax) THEN125 126 127 128 129 130 131 !print *,'Source = ',SUM(source_tr),MINVAL(source_tr),132 !. MAXVAL(source_tr)133 !ENDIF134 135 c 136 IF (.NOT. ok_chimeredust) THEN137 138 !! IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR.139 !! . t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN140 !! dust_ec(i)=0.0141 !! ENDIF142 !c Corresponds to dust_emission.EQ.3 143 !!!!!!!****************AQUIIIIIIIIIIIIIIIIIIIIIIIIIIII144 !! Original line (4 tracers)145 !JE<< old 4 tracer(nhl scheme) source_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*146 !. dust_ec(i)*1.e3*0.093 ! g/m2/s147 !source_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*148 !. dust_ec(i)*1.e3*0.905 ! g/m2/s bin 0.5-10um149 !! Original line (4 tracers)150 !flux_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))*151 !. dust_ec(i)*1.e3*0.093*1.e3 !mg/m2/s152 !flux_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))*153 !. dust_ec(i)*1.e3*0.905*1.e3 !mg/m2/s bin 0.5-10um154 !flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *155 !. dust_ec(i)*1.e3*0.093*1.e3156 !flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *157 !. dust_ec(i)*1.e3*0.905*1.e3158 IF(id_fine>0) source_tr(i,id_fine)=159 . scale_param_dustacc(iregion_dust(i))*160 . dust_ec(i)*1.e3*0.093 ! g/m2/s161 IF(id_codu>0) source_tr(i,id_codu)=162 . scale_param_dustcoa(iregion_dust(i))*163 .dust_ec(i)*1.e3*0.905 ! g/m2/s bin 0.5-10um164 165 ! Original line (4 tracers)166 IF(id_fine>0) flux_tr(i,id_fine)=167 . scale_param_dustacc(iregion_dust(i))*168 .dust_ec(i)*1.e3*0.093*1.e3 !mg/m2/s169 IF(id_codu>0) flux_tr(i,id_codu)=170 . scale_param_dustcoa(iregion_dust(i))*171 .dust_ec(i)*1.e3*0.905*1.e3 !mg/m2/s bin 0.5-10um172 173 174 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *175 .dust_ec(i)*1.e3*0.093*1.e3176 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *177 .dust_ec(i)*1.e3*0.905*1.e3178 179 180 181 !*****************NEW CHIMERE DUST EMISSION Sahara*****182 ! je 20140522183 184 185 186 187 188 189 190 191 192 CALL dustemission( debutphy, xlat, xlon, pctsrf,193 . zu10m,zv10m,wstar,ale_bl,ale_wake,194 . param_wstarBL, param_wstarWAKE,195 . dustsourceacc,dustsourcecoa,196 .dustsourcesco,maskd)197 198 DO i=1,klon199 if (maskd(i).gt.0) then200 IF(id_fine>0) source_tr(i,id_fine)=201 . scale_param_dustacc(iregion_dust(i))*202 .dustsourceacc(i)*1.e3 ! g/m2/s bin 0.03-0.5203 IF(id_codu>0) source_tr(i,id_codu)=204 . scale_param_dustcoa(iregion_dust(i))*205 .dustsourcecoa(i)*1.e3 ! g/m2/s bin 0.5-3um206 IF(id_scdu>0) source_tr(i,id_scdu)=207 . scale_param_dustsco(iregion_dust(i))*208 .dustsourcesco(i)*1.e3 ! g/m2/s bin 3-15um209 ! Original line (4 tracers)210 IF(id_fine>0) flux_tr(i,id_fine)=211 . scale_param_dustacc(iregion_dust(i))*212 .dustsourceacc(i)*1.e3*1.e3 !mg/m2/s213 IF(id_codu>0) flux_tr(i,id_codu)=214 . scale_param_dustcoa(iregion_dust(i))*215 .dustsourcecoa(i)*1.e3*1.e3 !mg/m2/s bin 0.5-3um216 IF(id_scdu>0) flux_tr(i,id_scdu)=217 . scale_param_dustsco(iregion_dust(i))*218 .dustsourcesco(i)*1.e3*1.e3 !mg/m2/s bin 3-15um219 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *220 .dustsourceacc(i)*1.e3*1.e3221 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *222 .dustsourcecoa(i)*1.e3*1.e3223 flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) *224 .dustsourcesco(i)*1.e3*1.e3225 226 IF(id_fine>0) source_tr(i,id_fine)=227 . scale_param_dustacc(iregion_dust(i))*228 .dust_ec(i)*1.e3*0.114 ! g/m2/s229 IF(id_codu>0) source_tr(i,id_codu)=230 . scale_param_dustcoa(iregion_dust(i))*231 .dust_ec(i)*1.e3*0.108 ! g/m2/s bin 0.5-3um232 IF(id_scdu>0) source_tr(i,id_scdu)=233 . scale_param_dustsco(iregion_dust(i))*234 .dust_ec(i)*1.e3*0.778 ! g/m2/s bin 3-15um235 ! Original line (4 tracers)236 IF(id_fine>0) flux_tr(i,id_fine)=237 . scale_param_dustacc(iregion_dust(i))*238 .dust_ec(i)*1.e3*0.114*1.e3 !mg/m2/s239 IF(id_codu>0) flux_tr(i,id_codu)=240 . scale_param_dustcoa(iregion_dust(i))*241 .dust_ec(i)*1.e3*0.108*1.e3 !mg/m2/s bin 0.5-3um242 IF(id_scdu>0) flux_tr(i,id_scdu)=243 . scale_param_dustsco(iregion_dust(i))*244 .dust_ec(i)*1.e3*0.778*1.e3 !mg/m2/s bin 0.5-3um245 246 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) *247 .dust_ec(i)*1.e3*0.114*1.e3248 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) *249 .dust_ec(i)*1.e3*0.108*1.e3250 flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) *251 .dust_ec(i)*1.e3*0.778*1.e3252 253 254 255 256 257 258 259 260 261 !***************************************************** 262 C******************* SEA SALT EMMISSIONS *******************************263 264 265 266 c 267 !IF (lminmax) THEN268 269 270 271 272 273 274 275 print *,'Source = ',SUM(source_tr(:,id_coss)),276 .MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))277 278 !279 280 ! Original line (4 tracers)281 IF(id_fine>0) source_tr(i,id_fine)=282 . source_tr(i,id_fine)+scale_param_ssacc*283 .lmt_sea_salt(i,1)*1.e4 !g/m2/s284 285 ! Original line (4 tracers)286 IF(id_fine>0) flux_tr(i,id_fine)=287 . flux_tr(i,id_fine)+scale_param_ssacc288 .*lmt_sea_salt(i,1)*1.e4*1.e3 !mg/m2/s289 !290 IF(id_coss>0) source_tr(i,id_coss)=291 .scale_param_sscoa*lmt_sea_salt(i,2)*1.e4 !g/m2/s292 IF(id_coss>0) flux_tr(i,id_coss)=293 .scale_param_sscoa*lmt_sea_salt(i,2)*1.e4*1.e3 !mg/m2/s294 c 295 flux_sparam_ssfine(i)=scale_param_ssacc *296 .lmt_sea_salt(i,1)*1.e4*1.e3297 flux_sparam_sscoa(i)=scale_param_sscoa *298 .lmt_sea_salt(i,2)*1.e4*1.e3299 300 !IF (lminmax) THEN301 302 303 304 305 306 307 308 print *,'Source = ',SUM(source_tr(:,id_coss)),309 .MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss))310 311 c 312 313 END 1 ! This subroutine calculates the emissions of SEA SALT and DUST, part of 2 ! which goes to tracer 2 and other part to tracer 3. 3 SUBROUTINE coarsemission(pctsrf,pdtphys, & 4 t_seri,pmflxr,pmflxs,prfl,psfl, & 5 xlat,xlon,debutphy, & 6 zu10m,zv10m,wstar,ale_bl,ale_wake, & 7 scale_param_ssacc,scale_param_sscoa, & 8 scale_param_dustacc,scale_param_dustcoa, & 9 scale_param_dustsco, & 10 nbreg_dust, & 11 iregion_dust,dust_ec, & 12 param_wstarBLperregion,param_wstarWAKEperregion, & 13 nbreg_wstardust, & 14 iregion_wstardust, & 15 lmt_sea_salt,qmin,qmax, & 16 flux_sparam_ddfine,flux_sparam_ddcoa, & 17 flux_sparam_ddsco, & 18 flux_sparam_ssfine,flux_sparam_sscoa, & 19 id_prec,id_fine,id_coss,id_codu,id_scdu, & 20 ok_chimeredust, & 21 source_tr,flux_tr) 22 ! . wth,cly,zprecipinsoil,lmt_sea_salt, 23 24 ! CALL dustemission( debutphy, xlat, xlon, pctsrf, 25 ! . zu10m zv10m,wstar,ale_bl,ale_wake) 26 ! 27 28 USE dimphy 29 USE indice_sol_mod 30 USE infotrac 31 USE dustemission_mod, ONLY : dustemission 32 ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb 33 IMPLICIT NONE 34 35 INCLUDE "dimensions.h" 36 INCLUDE "chem.h" 37 INCLUDE "chem_spla.h" 38 INCLUDE "YOMCST.h" 39 INCLUDE "paramet.h" 40 41 !============================== INPUT ================================== 42 INTEGER :: nbjour 43 LOGICAL :: ok_chimeredust 44 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 45 REAL :: t_seri(klon,klev) ! temperature 46 REAL :: pctsrf(klon,nbsrf) 47 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 48 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 49 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 50 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 51 LOGICAL :: debutphy, lafinphy 52 REAL, intent(in) :: xlat(klon) ! latitudes pour chaque point 53 REAL, intent(in) :: xlon(klon) ! longitudes pour chaque point 54 REAL,DIMENSION(klon),INTENT(IN) :: zu10m 55 REAL,DIMENSION(klon),INTENT(IN) :: zv10m 56 REAL,DIMENSION(klon),INTENT(IN) :: wstar,Ale_bl,ale_wake 57 58 ! 59 !------------------------- Scaling Parameters -------------------------- 60 ! 61 INTEGER :: iregion_dust(klon) !Defines dust regions 62 REAL :: scale_param_ssacc !Scaling parameter for Fine Sea Salt 63 REAL :: scale_param_sscoa !Scaling parameter for Coarse Sea Salt 64 REAL :: scale_param_dustacc(nbreg_dust) !Scaling parameter for Fine Dust 65 REAL :: scale_param_dustcoa(nbreg_dust) !Scaling parameter for Coarse Dust 66 REAL :: scale_param_dustsco(nbreg_dust) !Scaling parameter for SCoarse Dust 67 !JE20141124<< 68 INTEGER :: iregion_wstardust(klon) !Defines dust regions in terms of wstar 69 REAL :: param_wstarBLperregion(nbreg_wstardust) ! 70 REAL :: param_wstarWAKEperregion(nbreg_wstardust) ! 71 REAL :: param_wstarBL(klon) !parameter for surface wind correction.. 72 REAL :: param_wstarWAKE(klon) !parameter for surface wind correction.. 73 INTEGER :: nbreg_wstardust 74 !JE20141124>> 75 INTEGER :: nbreg_dust 76 INTEGER, INTENT(IN) :: id_prec,id_fine,id_coss,id_codu,id_scdu 77 !============================== OUTPUT ================================= 78 REAL :: source_tr(klon,nbtr) 79 REAL :: flux_tr(klon,nbtr) 80 REAL :: flux_sparam_ddfine(klon), flux_sparam_ddcoa(klon) 81 REAL :: flux_sparam_ddsco(klon) 82 REAL :: flux_sparam_ssfine(klon), flux_sparam_sscoa(klon) 83 !=========================== LOCAL VARIABLES =========================== 84 INTEGER :: i, j 85 REAL :: pct_ocean(klon) 86 ! REAL zprecipinsoil(klon) 87 ! REAL cly(klon), wth(klon) 88 REAL :: clyfac, avgdryrate, drying 89 90 !---------------------------- SEA SALT emissions ------------------------ 91 REAL :: lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um 92 ! 93 !--------vent 10 m CEPMMT 94 ! 95 REAL :: dust_ec(klon) 96 97 real :: tmp_var2(klon,nbtr) ! auxiliary variable to replace source 98 REAL :: qmin, qmax 99 !----------------------DUST Sahara --------------- 100 REAL, DIMENSION(klon) :: dustsourceacc,dustsourcecoa,dustsourcesco 101 INTEGER, DIMENSION(klon) :: maskd 102 !*********************** DUST EMMISSIONS ******************************* 103 ! 104 105 ! avgdryrate=300./365.*pdtphys/86400. 106 ! 107 ! DO i=1, klon 108 ! 109 ! IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN 110 ! zprecipinsoil(i)=zprecipinsoil(i) + 111 ! . (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys 112 ! 113 ! clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil 114 ! drying=avgdryrate*exp(0.03905491* 115 ! . exp(0.17446*(t_seri(i,1)-273.15))) ! [mm] 116 ! zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm] 117 ! 118 ! ENDIF 119 ! 120 ! ENDDO 121 ! 122 ! ==================== CALCULATING DUST EMISSIONS ====================== 123 ! 124 ! IF (lminmax) THEN 125 DO j=1,nbtr 126 DO i=1,klon 127 tmp_var2(i,j)=source_tr(i,j) 128 ENDDO 129 ENDDO 130 CALL minmaxsource(tmp_var2,qmin,qmax,'src: before DD emiss') 131 ! print *,'Source = ',SUM(source_tr),MINVAL(source_tr), 132 ! . MAXVAL(source_tr) 133 ! ENDIF 134 135 ! 136 IF (.NOT. ok_chimeredust) THEN 137 DO i=1, klon 138 !! IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR. 139 !! . t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN 140 !! dust_ec(i)=0.0 141 !! ENDIF 142 !c Corresponds to dust_emission.EQ.3 143 !!!!!!!****************AQUIIIIIIIIIIIIIIIIIIIIIIIIIIII 144 !! Original line (4 tracers) 145 !JE<< old 4 tracer(nhl scheme) source_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))* 146 ! . dust_ec(i)*1.e3*0.093 ! g/m2/s 147 ! source_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))* 148 ! . dust_ec(i)*1.e3*0.905 ! g/m2/s bin 0.5-10um 149 !! Original line (4 tracers) 150 ! flux_tr(i,id_fine)=scale_param_dustacc(iregion_dust(i))* 151 ! . dust_ec(i)*1.e3*0.093*1.e3 !mg/m2/s 152 ! flux_tr(i,id_codu)=scale_param_dustcoa(iregion_dust(i))* 153 ! . dust_ec(i)*1.e3*0.905*1.e3 !mg/m2/s bin 0.5-10um 154 ! flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * 155 ! . dust_ec(i)*1.e3*0.093*1.e3 156 ! flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * 157 ! . dust_ec(i)*1.e3*0.905*1.e3 158 IF(id_fine>0) source_tr(i,id_fine)= & 159 scale_param_dustacc(iregion_dust(i))* & 160 dust_ec(i)*1.e3*0.093 ! g/m2/s 161 IF(id_codu>0) source_tr(i,id_codu)= & 162 scale_param_dustcoa(iregion_dust(i))* & 163 dust_ec(i)*1.e3*0.905 ! g/m2/s bin 0.5-10um 164 IF(id_scdu>0) source_tr(i,id_scdu)=0. ! no supercoarse 165 ! Original line (4 tracers) 166 IF(id_fine>0) flux_tr(i,id_fine)= & 167 scale_param_dustacc(iregion_dust(i))* & 168 dust_ec(i)*1.e3*0.093*1.e3 !mg/m2/s 169 IF(id_codu>0) flux_tr(i,id_codu)= & 170 scale_param_dustcoa(iregion_dust(i))* & 171 dust_ec(i)*1.e3*0.905*1.e3 !mg/m2/s bin 0.5-10um 172 IF(id_scdu>0) flux_tr(i,id_scdu)=0. 173 174 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * & 175 dust_ec(i)*1.e3*0.093*1.e3 176 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * & 177 dust_ec(i)*1.e3*0.905*1.e3 178 flux_sparam_ddsco(i)=0. 179 ENDDO 180 ENDIF 181 !*****************NEW CHIMERE DUST EMISSION Sahara***** 182 ! je 20140522 183 IF(ok_chimeredust) THEN 184 print *,'MIX- NEW SAHARA DUST SOURCE SCHEME...' 185 186 DO i=1,klon 187 param_wstarBL(i) =param_wstarBLperregion(iregion_wstardust(i)) 188 param_wstarWAKE(i)=param_wstarWAKEperregion(iregion_wstardust(i)) 189 ENDDO 190 191 192 CALL dustemission( debutphy, xlat, xlon, pctsrf, & 193 zu10m,zv10m,wstar,ale_bl,ale_wake, & 194 param_wstarBL, param_wstarWAKE, & 195 dustsourceacc,dustsourcecoa, & 196 dustsourcesco,maskd) 197 198 DO i=1,klon 199 if (maskd(i).gt.0) then 200 IF(id_fine>0) source_tr(i,id_fine)= & 201 scale_param_dustacc(iregion_dust(i))* & 202 dustsourceacc(i)*1.e3 ! g/m2/s bin 0.03-0.5 203 IF(id_codu>0) source_tr(i,id_codu)= & 204 scale_param_dustcoa(iregion_dust(i))* & 205 dustsourcecoa(i)*1.e3 ! g/m2/s bin 0.5-3um 206 IF(id_scdu>0) source_tr(i,id_scdu)= & 207 scale_param_dustsco(iregion_dust(i))* & 208 dustsourcesco(i)*1.e3 ! g/m2/s bin 3-15um 209 ! Original line (4 tracers) 210 IF(id_fine>0) flux_tr(i,id_fine)= & 211 scale_param_dustacc(iregion_dust(i))* & 212 dustsourceacc(i)*1.e3*1.e3 !mg/m2/s 213 IF(id_codu>0) flux_tr(i,id_codu)= & 214 scale_param_dustcoa(iregion_dust(i))* & 215 dustsourcecoa(i)*1.e3*1.e3 !mg/m2/s bin 0.5-3um 216 IF(id_scdu>0) flux_tr(i,id_scdu)= & 217 scale_param_dustsco(iregion_dust(i))* & 218 dustsourcesco(i)*1.e3*1.e3 !mg/m2/s bin 3-15um 219 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * & 220 dustsourceacc(i)*1.e3*1.e3 221 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * & 222 dustsourcecoa(i)*1.e3*1.e3 223 flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) * & 224 dustsourcesco(i)*1.e3*1.e3 225 else 226 IF(id_fine>0) source_tr(i,id_fine)= & 227 scale_param_dustacc(iregion_dust(i))* & 228 dust_ec(i)*1.e3*0.114 ! g/m2/s 229 IF(id_codu>0) source_tr(i,id_codu)= & 230 scale_param_dustcoa(iregion_dust(i))* & 231 dust_ec(i)*1.e3*0.108 ! g/m2/s bin 0.5-3um 232 IF(id_scdu>0) source_tr(i,id_scdu)= & 233 scale_param_dustsco(iregion_dust(i))* & 234 dust_ec(i)*1.e3*0.778 ! g/m2/s bin 3-15um 235 ! Original line (4 tracers) 236 IF(id_fine>0) flux_tr(i,id_fine)= & 237 scale_param_dustacc(iregion_dust(i))* & 238 dust_ec(i)*1.e3*0.114*1.e3 !mg/m2/s 239 IF(id_codu>0) flux_tr(i,id_codu)= & 240 scale_param_dustcoa(iregion_dust(i))* & 241 dust_ec(i)*1.e3*0.108*1.e3 !mg/m2/s bin 0.5-3um 242 IF(id_scdu>0) flux_tr(i,id_scdu)= & 243 scale_param_dustsco(iregion_dust(i))* & 244 dust_ec(i)*1.e3*0.778*1.e3 !mg/m2/s bin 0.5-3um 245 246 flux_sparam_ddfine(i)=scale_param_dustacc(iregion_dust(i)) * & 247 dust_ec(i)*1.e3*0.114*1.e3 248 flux_sparam_ddcoa(i)=scale_param_dustcoa(iregion_dust(i)) * & 249 dust_ec(i)*1.e3*0.108*1.e3 250 flux_sparam_ddsco(i)=scale_param_dustsco(iregion_dust(i)) * & 251 dust_ec(i)*1.e3*0.778*1.e3 252 253 endif 254 ENDDO 255 256 257 258 259 260 ENDIF 261 !***************************************************** 262 !******************* SEA SALT EMMISSIONS ******************************* 263 DO i=1,klon 264 pct_ocean(i)=pctsrf(i,is_oce) 265 ENDDO 266 ! 267 ! IF (lminmax) THEN 268 DO j=1,nbtr 269 DO i=1,klon 270 tmp_var2(i,j)=source_tr(i,j) 271 ENDDO 272 ENDDO 273 CALL minmaxsource(tmp_var2,qmin,qmax,'src: before SS emiss') 274 IF(id_coss>0) then 275 print *,'Source = ',SUM(source_tr(:,id_coss)), & 276 MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss)) 277 ENDIF 278 ! 279 DO i=1,klon 280 ! Original line (4 tracers) 281 IF(id_fine>0) source_tr(i,id_fine)= & 282 source_tr(i,id_fine)+scale_param_ssacc* & 283 lmt_sea_salt(i,1)*1.e4 !g/m2/s 284 285 ! Original line (4 tracers) 286 IF(id_fine>0) flux_tr(i,id_fine)= & 287 flux_tr(i,id_fine)+scale_param_ssacc & 288 *lmt_sea_salt(i,1)*1.e4*1.e3 !mg/m2/s 289 ! 290 IF(id_coss>0) source_tr(i,id_coss)= & 291 scale_param_sscoa*lmt_sea_salt(i,2)*1.e4 !g/m2/s 292 IF(id_coss>0) flux_tr(i,id_coss)= & 293 scale_param_sscoa*lmt_sea_salt(i,2)*1.e4*1.e3 !mg/m2/s 294 ! 295 flux_sparam_ssfine(i)=scale_param_ssacc * & 296 lmt_sea_salt(i,1)*1.e4*1.e3 297 flux_sparam_sscoa(i)=scale_param_sscoa * & 298 lmt_sea_salt(i,2)*1.e4*1.e3 299 ENDDO 300 ! IF (lminmax) THEN 301 DO j=1,nbtr 302 DO i=1,klon 303 tmp_var2(i,j)=source_tr(i,j) 304 ENDDO 305 ENDDO 306 CALL minmaxsource(tmp_var2,qmin,qmax,'src: after SS emiss') 307 IF(id_coss>0) then 308 print *,'Source = ',SUM(source_tr(:,id_coss)), & 309 MINVAL(source_tr(:,id_coss)), MAXVAL(source_tr(:,id_coss)) 310 ENDIF 311 ! 312 313 END SUBROUTINE coarsemission -
LMDZ6/trunk/libf/phylmd/Dust/condsurfc.f90
r5245 r5246 1 SUBROUTINE condsurfc(jour,lmt_bcff,lmt_bcbb, 2 . lmt_bcbbl,lmt_bcbbh,lmt_bc_penner,3 . lmt_omff,lmt_ombb,lmt_ombbl,lmt_ombbh,4 .lmt_omnat)5 6 7 !8 ! Lire les conditions aux limites du modele pour la chimie.9 ! --------------------------------------------------------10 !11 12 13 14 REALlmt_bcff(klon), lmt_bcbb(klon),lmt_bc_penner(klon)15 REALlmt_omff(klon), lmt_ombb(klon)16 REALlmt_bcbbl(klon), lmt_bcbbh(klon)17 REALlmt_ombbl(klon), lmt_ombbh(klon)18 REALlmt_omnat(klon)19 REALlmt_terp(klon)20 !21 INTEGERjour, i22 INTEGERierr23 INTEGERnid1,nvarid24 INTEGERdebut(2),epais(2)25 !26 27 28 29 30 31 32 33 34 35 !36 37 38 39 40 41 42 !43 ! Tranche a lire:44 45 46 47 48 !49 !50 51 !nhl #ifdef NC_DOUBLE52 53 !print *,'IERR = ',ierr54 !print *,'NF_NOERR = ',NF_NOERR55 !print *,'debut = ',debut56 !print *,'epais = ',epais57 !nhl #else58 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcff)59 !nhl #endif60 61 62 63 64 !65 !66 67 !nhl #ifdef NC_DOUBLE68 69 !nhl #else70 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbb)71 !nhl #endif72 73 74 75 76 !77 !78 79 !nhl #ifdef NC_DOUBLE80 81 !nhl #else82 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbl)83 !nhl #endif84 85 86 87 88 !89 !90 91 !nhl #ifdef NC_DOUBLE92 93 !nhl #else94 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbh)95 !nhl #endif96 97 98 99 100 !101 102 !nhl #ifdef NC_DOUBLE103 104 !nhl #else105 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_terp)106 !nhl #endif107 108 109 110 111 !112 !113 114 !nhl #ifdef NC_DOUBLE115 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut,116 .epais, lmt_bc_penner)117 !nhl #else118 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, 119 !nhl . lmt_bc_penner)120 !nhl #endif121 122 123 124 125 !126 !127 128 !nhl #ifdef NC_DOUBLE129 130 !nhl #else131 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_omff)132 !nhl #endif133 134 135 136 137 !138 139 140 141 142 143 144 145 !146 147 148 !149 150 END 1 SUBROUTINE condsurfc(jour,lmt_bcff,lmt_bcbb, & 2 lmt_bcbbl,lmt_bcbbh,lmt_bc_penner, & 3 lmt_omff,lmt_ombb,lmt_ombbl,lmt_ombbh, & 4 lmt_omnat) 5 USE dimphy 6 IMPLICIT none 7 ! 8 ! Lire les conditions aux limites du modele pour la chimie. 9 ! -------------------------------------------------------- 10 ! 11 INCLUDE "dimensions.h" 12 INCLUDE "netcdf.inc" 13 14 REAL :: lmt_bcff(klon), lmt_bcbb(klon),lmt_bc_penner(klon) 15 REAL :: lmt_omff(klon), lmt_ombb(klon) 16 REAL :: lmt_bcbbl(klon), lmt_bcbbh(klon) 17 REAL :: lmt_ombbl(klon), lmt_ombbh(klon) 18 REAL :: lmt_omnat(klon) 19 REAL :: lmt_terp(klon) 20 ! 21 INTEGER :: jour, i 22 INTEGER :: ierr 23 INTEGER :: nid1,nvarid 24 INTEGER :: debut(2),epais(2) 25 ! 26 IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN 27 IF (jour.GT.(360-1).AND.jour.LE.367) THEN 28 jour=360-1 29 print *,'JE: jour changed to jour= ',jour 30 ELSE 31 PRINT*,'Le jour demande n est pas correcte:', jour 32 CALL ABORT 33 ENDIF 34 ENDIF 35 ! 36 ierr = NF_OPEN ("limitcarbon.nc", NF_NOWRITE, nid1) 37 if (ierr.ne.NF_NOERR) then 38 write(6,*)' Pb d''ouverture du fichier limitbc.nc' 39 write(6,*)' ierr = ', ierr 40 call exit(1) 41 endif 42 ! 43 ! Tranche a lire: 44 debut(1) = 1 45 debut(2) = jour+1 46 epais(1) = klon 47 epais(2) = 1 48 ! 49 ! 50 ierr = NF_INQ_VARID (nid1, "BCFF", nvarid) 51 !nhl #ifdef NC_DOUBLE 52 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcff) 53 ! print *,'IERR = ',ierr 54 ! print *,'NF_NOERR = ',NF_NOERR 55 ! print *,'debut = ',debut 56 ! print *,'epais = ',epais 57 !nhl #else 58 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcff) 59 !nhl #endif 60 IF (ierr .NE. NF_NOERR) THEN 61 PRINT*, 'Pb de lecture pour les sources BC' 62 CALL exit(1) 63 ENDIF 64 ! 65 ! 66 ierr = NF_INQ_VARID (nid1, "BCBB", nvarid) 67 !nhl #ifdef NC_DOUBLE 68 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbb) 69 !nhl #else 70 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbb) 71 !nhl #endif 72 IF (ierr .NE. NF_NOERR) THEN 73 PRINT*, 'Pb de lecture pour les sources BC-biomass' 74 CALL exit(1) 75 ENDIF 76 ! 77 ! 78 ierr = NF_INQ_VARID (nid1, "BCBL", nvarid) 79 !nhl #ifdef NC_DOUBLE 80 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbl) 81 !nhl #else 82 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbl) 83 !nhl #endif 84 IF (ierr .NE. NF_NOERR) THEN 85 PRINT*, 'Pb de lecture pour les sources BC low' 86 CALL exit(1) 87 ENDIF 88 ! 89 ! 90 ierr = NF_INQ_VARID (nid1, "BCBH", nvarid) 91 !nhl #ifdef NC_DOUBLE 92 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_bcbbh) 93 !nhl #else 94 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_bcbbh) 95 !nhl #endif 96 IF (ierr .NE. NF_NOERR) THEN 97 PRINT*, 'Pb de lecture pour les sources BC high' 98 CALL exit(1) 99 ENDIF 100 ! 101 ierr = NF_INQ_VARID (nid1, "TERP", nvarid) 102 !nhl #ifdef NC_DOUBLE 103 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_terp) 104 !nhl #else 105 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_terp) 106 !nhl #endif 107 IF (ierr .NE. NF_NOERR) THEN 108 PRINT*, 'Pb de lecture pour les sources Terpene' 109 CALL exit(1) 110 ENDIF 111 ! 112 ! 113 ierr = NF_INQ_VARID (nid1, "BC_penner", nvarid) 114 !nhl #ifdef NC_DOUBLE 115 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, & 116 epais, lmt_bc_penner) 117 !nhl #else 118 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, 119 !nhl . lmt_bc_penner) 120 !nhl #endif 121 IF (ierr .NE. NF_NOERR) THEN 122 PRINT*, 'Pb de lecture pour les sources BC Penner' 123 CALL exit(1) 124 ENDIF 125 ! 126 ! 127 ierr = NF_INQ_VARID (nid1, "OMFF", nvarid) 128 !nhl #ifdef NC_DOUBLE 129 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, lmt_omff) 130 !nhl #else 131 !nhl ierr = NF_GET_VARA_REAL (nid1, nvarid, debut, epais, lmt_omff) 132 !nhl #endif 133 IF (ierr .NE. NF_NOERR) THEN 134 PRINT*, 'Pb de lecture pour les sources om-ifossil' 135 CALL exit(1) 136 ENDIF 137 ! 138 DO i=1,klon 139 lmt_ombb(i) = lmt_bcbb(i)*7.0*1.6 !OC/BC=7.0;OM/OC=1.6 140 lmt_ombbl(i) = lmt_bcbbl(i)*7.0*1.6 141 lmt_ombbh(i) = lmt_bcbbh(i)*7.0*1.6 142 lmt_omff(i) = lmt_omff(i)*1.4 !--OM/OC=1.4 143 lmt_omnat(i) = lmt_terp(i)*0.11*1.4 !-- 11% Terpene is OC 144 ENDDO 145 ! 146 ierr = NF_CLOSE(nid1) 147 PRINT*, 'Carbon sources lues pour jour: ', jour 148 ! 149 RETURN 150 END SUBROUTINE condsurfc -
LMDZ6/trunk/libf/phylmd/Dust/condsurfc_new.f90
r5245 r5246 1 SUBROUTINE condsurfc_new(jour,lmt_bcff, lmt_bcnff, 2 . lmt_bcbbl,lmt_bcbbh, lmt_bcba,3 . lmt_omff,lmt_omnff,lmt_ombbl,lmt_ombbh,4 .lmt_omnat, lmt_omba)5 6 7 8 9 c 10 cLire les conditions aux limites du modele pour la chimie.11 c--------------------------------------------------------12 c 13 14 15 16 REALlmt_bcff(klon), lmt_bcnff(klon), lmt_bcba(klon)17 REALlmt_omff(klon), lmt_omnff(klon), lmt_ombb(klon)18 REALlmt_bcbbl(klon), lmt_bcbbh(klon)19 REALlmt_ombbl(klon), lmt_ombbh(klon)20 REALlmt_omnat(klon), lmt_omba(klon)21 REALlmt_terp(klon)22 c 23 REALlmt_bcff_glo(klon_glo), lmt_bcnff_glo(klon_glo)24 REALlmt_bcba_glo(klon_glo)25 REALlmt_omff_glo(klon_glo), lmt_omnff_glo(klon_glo)26 REALlmt_ombb_glo(klon_glo)27 REALlmt_bcbbl_glo(klon_glo), lmt_bcbbh_glo(klon_glo)28 REALlmt_ombbl_glo(klon_glo), lmt_ombbh_glo(klon_glo)29 REALlmt_omnat_glo(klon_glo), lmt_omba_glo(klon_glo)30 REALlmt_terp_glo(klon_glo)31 !32 INTEGERjour, i33 INTEGERierr34 INTEGERnid1,nvarid35 INTEGERdebut(2),epais(2)36 c 37 !IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN38 39 40 print *,'JE: FORCED TO CONTINUE (emissions have41 .to be longer than 1 year!!!! )'42 !JE CALL ABORT43 1 SUBROUTINE condsurfc_new(jour,lmt_bcff, lmt_bcnff, & 2 lmt_bcbbl,lmt_bcbbh, lmt_bcba, & 3 lmt_omff,lmt_omnff,lmt_ombbl,lmt_ombbh, & 4 lmt_omnat, lmt_omba) 5 USE mod_grid_phy_lmdz 6 USE mod_phys_lmdz_para 7 USE dimphy 8 IMPLICIT none 9 ! 10 ! Lire les conditions aux limites du modele pour la chimie. 11 ! -------------------------------------------------------- 12 ! 13 INCLUDE "dimensions.h" 14 INCLUDE "netcdf.inc" 15 16 REAL :: lmt_bcff(klon), lmt_bcnff(klon), lmt_bcba(klon) 17 REAL :: lmt_omff(klon), lmt_omnff(klon), lmt_ombb(klon) 18 REAL :: lmt_bcbbl(klon), lmt_bcbbh(klon) 19 REAL :: lmt_ombbl(klon), lmt_ombbh(klon) 20 REAL :: lmt_omnat(klon), lmt_omba(klon) 21 REAL :: lmt_terp(klon) 22 ! 23 REAL :: lmt_bcff_glo(klon_glo), lmt_bcnff_glo(klon_glo) 24 REAL :: lmt_bcba_glo(klon_glo) 25 REAL :: lmt_omff_glo(klon_glo), lmt_omnff_glo(klon_glo) 26 REAL :: lmt_ombb_glo(klon_glo) 27 REAL :: lmt_bcbbl_glo(klon_glo), lmt_bcbbh_glo(klon_glo) 28 REAL :: lmt_ombbl_glo(klon_glo), lmt_ombbh_glo(klon_glo) 29 REAL :: lmt_omnat_glo(klon_glo), lmt_omba_glo(klon_glo) 30 REAL :: lmt_terp_glo(klon_glo) 31 ! 32 INTEGER :: jour, i 33 INTEGER :: ierr 34 INTEGER :: nid1,nvarid 35 INTEGER :: debut(2),epais(2) 36 ! 37 ! IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN 38 IF (jour.LT.0 .OR. jour.GT.366) THEN 39 PRINT*,'Le jour demande n est pas correcte:', jour 40 print *,'JE: FORCED TO CONTINUE (emissions have& 41 & to be longer than 1 year!!!! )' 42 !JE CALL ABORT 43 ENDIF 44 44 45 45 !$OMP MASTER 46 47 !48 ! Tranche a lire:49 50 51 52 !epais(1) = klon53 54 !55 !=======================================================================56 !BC EMISSIONS57 !=======================================================================58 !59 60 61 62 63 64 65 !66 ! BC emissions from fossil fuel combustion67 !68 69 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,70 .lmt_bcff_glo)71 72 73 74 75 76 77 !78 ! BC emissions from non fossil fuel combustion79 !80 81 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,82 .lmt_bcnff_glo)83 84 85 86 87 !88 ! Low BC emissions from biomass burning89 !90 91 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,92 .lmt_bcbbl_glo)93 94 95 96 97 !98 ! High BC emissions from biomass burning99 !100 101 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,102 .lmt_bcbbh_glo)103 104 105 106 107 !108 ! BC emissions from ship transport109 !110 111 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,112 .lmt_bcba_glo)113 114 115 116 117 !118 !=======================================================================119 ! OM EMISSIONS 120 !=======================================================================121 !122 123 !124 ! OM emissions from fossil fuel combustion125 !126 127 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,128 .lmt_omff_glo)129 130 131 132 133 !134 ! OM emissions from non fossil fuel combustion135 !136 137 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,138 .lmt_omnff_glo)139 140 141 142 143 !144 ! Low OM emissions from biomass burning - low145 !146 147 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,148 .lmt_ombbl_glo)149 150 151 152 153 !154 ! High OM emissions from biomass burning - high155 !156 157 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,158 .lmt_ombbh_glo)159 160 161 162 163 !164 ! High OM emissions from ship165 !166 167 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,168 .lmt_omba_glo)169 170 171 172 173 !174 ! Natural Terpene emissions => Natural OM emissions175 !176 177 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais,178 .lmt_terp_glo)179 180 181 182 183 !184 185 186 187 188 189 !190 191 !lmt_bcff(klon)=0.0192 !lmt_bcnff(klon)=0.0193 !lmt_omff(klon)=0.0194 !lmt_omnff(klon)=0.0195 !lmt_ombb(klon)=0.0196 !lmt_bcbbl(klon)=0.0197 !lmt_bcbbh(klon)=0.0198 !lmt_ombbl(klon)=0.0199 !lmt_ombbh(klon)=0.0200 !lmt_omnat(klon)=0.0201 !lmt_omba(klon)=0.0202 !lmt_terp(klon)=0.0203 204 205 46 IF (is_mpi_root .AND. is_omp_root) THEN 47 ! 48 ! Tranche a lire: 49 debut(1) = 1 50 debut(2) = jour 51 epais(1) = klon_glo 52 ! epais(1) = klon 53 epais(2) = 1 54 ! 55 !======================================================================= 56 ! BC EMISSIONS 57 !======================================================================= 58 ! 59 ierr = NF_OPEN ("carbon_emissions.nc", NF_NOWRITE, nid1) 60 if (ierr.ne.NF_NOERR) then 61 write(6,*)' Pb d''ouverture du fichier limitbc.nc' 62 write(6,*)' ierr = ', ierr 63 call exit(1) 64 endif 65 ! 66 ! BC emissions from fossil fuel combustion 67 ! 68 ierr = NF_INQ_VARID (nid1, "BCFF", nvarid) 69 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 70 lmt_bcff_glo) 71 IF (ierr .NE. NF_NOERR) THEN 72 PRINT*, 'Pb de lecture pour les sources BC' 73 CALL exit(1) 74 ENDIF 75 ! !print *,'lmt_bcff = ',lmt_bcff 76 ! !stop 77 ! 78 ! BC emissions from non fossil fuel combustion 79 ! 80 ierr = NF_INQ_VARID (nid1, "BCNFF", nvarid) 81 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 82 lmt_bcnff_glo) 83 IF (ierr .NE. NF_NOERR) THEN 84 PRINT*, 'Pb de lecture pour les sources BC' 85 CALL exit(1) 86 ENDIF 87 ! 88 ! Low BC emissions from biomass burning 89 ! 90 ierr = NF_INQ_VARID (nid1, "BCBBL", nvarid) 91 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 92 lmt_bcbbl_glo) 93 IF (ierr .NE. NF_NOERR) THEN 94 PRINT*, 'Pb de lecture pour les sources BC low' 95 CALL exit(1) 96 ENDIF 97 ! 98 ! High BC emissions from biomass burning 99 ! 100 ierr = NF_INQ_VARID (nid1, "BCBBH", nvarid) 101 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 102 lmt_bcbbh_glo) 103 IF (ierr .NE. NF_NOERR) THEN 104 PRINT*, 'Pb de lecture pour les sources BC high' 105 CALL exit(1) 106 ENDIF 107 ! 108 ! BC emissions from ship transport 109 ! 110 ierr = NF_INQ_VARID (nid1, "BCBA", nvarid) 111 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 112 lmt_bcba_glo) 113 IF (ierr .NE. NF_NOERR) THEN 114 PRINT*, 'Pb de lecture pour les sources BC' 115 CALL exit(1) 116 ENDIF 117 ! 118 !======================================================================= 119 ! OM EMISSIONS 120 !======================================================================= 121 ! 122 123 ! 124 ! OM emissions from fossil fuel combustion 125 ! 126 ierr = NF_INQ_VARID (nid1, "OMFF", nvarid) 127 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 128 lmt_omff_glo) 129 IF (ierr .NE. NF_NOERR) THEN 130 PRINT*, 'Pb de lecture pour les sources OM' 131 CALL exit(1) 132 ENDIF 133 ! 134 ! OM emissions from non fossil fuel combustion 135 ! 136 ierr = NF_INQ_VARID (nid1, "OMNFF", nvarid) 137 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 138 lmt_omnff_glo) 139 IF (ierr .NE. NF_NOERR) THEN 140 PRINT*, 'Pb de lecture pour les sources OM' 141 CALL exit(1) 142 ENDIF 143 ! 144 ! Low OM emissions from biomass burning - low 145 ! 146 ierr = NF_INQ_VARID (nid1, "OMBBL", nvarid) 147 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 148 lmt_ombbl_glo) 149 IF (ierr .NE. NF_NOERR) THEN 150 PRINT*, 'Pb de lecture pour les sources OM low' 151 CALL exit(1) 152 ENDIF 153 ! 154 ! High OM emissions from biomass burning - high 155 ! 156 ierr = NF_INQ_VARID (nid1, "OMBBH", nvarid) 157 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 158 lmt_ombbh_glo) 159 IF (ierr .NE. NF_NOERR) THEN 160 PRINT*, 'Pb de lecture pour les sources OM high' 161 CALL exit(1) 162 ENDIF 163 ! 164 ! High OM emissions from ship 165 ! 166 ierr = NF_INQ_VARID (nid1, "OMBA", nvarid) 167 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 168 lmt_omba_glo) 169 IF (ierr .NE. NF_NOERR) THEN 170 PRINT*, 'Pb de lecture pour les sources OM ship' 171 CALL exit(1) 172 ENDIF 173 ! 174 ! Natural Terpene emissions => Natural OM emissions 175 ! 176 ierr = NF_INQ_VARID (nid1, "TERP", nvarid) 177 ierr = NF_GET_VARA_DOUBLE (nid1, nvarid, debut, epais, & 178 lmt_terp_glo) 179 IF (ierr .NE. NF_NOERR) THEN 180 PRINT*, 'Pb de lecture pour les sources Terpene' 181 CALL exit(1) 182 ENDIF 183 ! 184 DO i=1,klon_glo 185 lmt_omnat_glo(i) = lmt_terp_glo(i)*0.11*1.4 !-- 11% Terpene is OC 186 ENDDO 187 188 ierr = NF_CLOSE(nid1) 189 ! 190 PRINT*, 'Carbon sources lues pour jour: ', jour 191 ! lmt_bcff(klon)=0.0 192 ! lmt_bcnff(klon)=0.0 193 ! lmt_omff(klon)=0.0 194 ! lmt_omnff(klon)=0.0 195 ! lmt_ombb(klon)=0.0 196 ! lmt_bcbbl(klon)=0.0 197 ! lmt_bcbbh(klon)=0.0 198 ! lmt_ombbl(klon)=0.0 199 ! lmt_ombbh(klon)=0.0 200 ! lmt_omnat(klon)=0.0 201 ! lmt_omba(klon)=0.0 202 ! lmt_terp(klon)=0.0 203 204 205 ENDIF 206 206 !$OMP END MASTER 207 207 !$OMP BARRIER 208 call scatter( lmt_bcff_glo , lmt_bcff )209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 END 208 call scatter( lmt_bcff_glo , lmt_bcff ) 209 call scatter( lmt_bcnff_glo , lmt_bcnff ) 210 call scatter( lmt_bcbbl_glo , lmt_bcbbl ) 211 call scatter( lmt_bcbbh_glo , lmt_bcbbh ) 212 call scatter( lmt_bcba_glo , lmt_bcba ) 213 call scatter( lmt_omff_glo , lmt_omff ) 214 call scatter( lmt_omnff_glo , lmt_omnff ) 215 call scatter( lmt_ombbl_glo , lmt_ombbl ) 216 call scatter( lmt_ombbh_glo , lmt_ombbh ) 217 call scatter( lmt_omba_glo , lmt_omba ) 218 call scatter( lmt_terp_glo , lmt_terp ) 219 call scatter( lmt_omnat_glo , lmt_omnat ) 220 221 222 223 224 225 RETURN 226 END SUBROUTINE condsurfc_new -
LMDZ6/trunk/libf/phylmd/Dust/condsurfs.f90
r5245 r5246 1 SUBROUTINE condsurfs(jour, edgar, flag_dms, 2 . lmt_so2h, lmt_so2b, lmt_so2bb, lmt_so2ba,3 . lmt_so2volc, lmt_altvolc,4 .lmt_dmsbio, lmt_h2sbio, lmt_dms, lmt_dmsconc)5 6 7 c 8 cLire les conditions aux limites du modele pour la chimie.9 c--------------------------------------------------------10 c 11 12 13 c 14 REALlmt_so2h(klon), lmt_so2b(klon), lmt_so2bb(klon)15 REALlmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)16 REALlmt_so2volc(klon), lmt_altvolc(klon)17 REALlmt_dms(klon), lmt_dmsconc(klon)18 LOGICALedgar19 INTEGERflag_dms20 c 21 INTEGERjour, i22 INTEGERierr23 INTEGERnid,nvarid24 INTEGERdebut(2),epais(2)25 c 26 27 28 29 30 31 32 33 34 35 c 36 37 38 39 40 41 42 c 43 cTranche a lire:44 45 46 47 48 c 49 50 cnhl #ifdef NC_DOUBLE51 52 cnhl #else53 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2volc)54 cnhl #endif55 56 57 58 59 c 60 61 cnhl #ifdef NC_DOUBLE62 63 cnhl #else64 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_altvolc)65 cnhl #endif66 67 68 69 70 c 71 72 c 73 74 cnhl #ifdef NC_DOUBLE75 76 cnhl #else77 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)78 cnhl #endif79 80 81 82 83 c 84 85 cnhl #ifdef NC_DOUBLE86 87 cnhl #else88 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)89 cnhl #endif90 91 92 93 94 c 95 ELSE !--GEIA96 c 97 98 cnhl #ifdef NC_DOUBLE99 100 cnhl #else101 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h)102 cnhl #endif103 104 105 106 107 c 108 109 cnhl #ifdef NC_DOUBLE110 111 cnhl #else112 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b)113 cnhl #endif114 115 116 117 118 c 119 120 c 121 122 cnhl #ifdef NC_DOUBLE123 124 cnhl #else125 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2bb)126 cnhl #endif127 128 129 130 131 c 132 133 cnhl #ifdef NC_DOUBLE134 135 cnhl #else136 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2ba)137 cnhl #endif138 139 140 141 142 c 143 144 cnhl #ifdef NC_DOUBLE145 146 cnhl #else147 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsbio)148 cnhl #endif149 150 151 152 153 c 154 155 cnhl #ifdef NC_DOUBLE156 157 cnhl #else158 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_h2sbio)159 cnhl #endif160 161 162 163 164 c 165 IF (flag_dms.EQ.1) THEN166 c 167 168 cnhl #ifdef NC_DOUBLE169 170 cnhl #else171 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)172 cnhl #endif173 174 175 176 177 c 178 ELSEIF (flag_dms.EQ.2) THEN179 c 180 181 cnhl #ifdef NC_DOUBLE182 183 cnhl #else184 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms)185 cnhl #endif186 187 188 189 190 c 191 ELSEIF (flag_dms.EQ.3) THEN192 c 193 194 cnhl #ifdef NC_DOUBLE195 196 cnhl #else197 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)198 cnhl #endif199 200 201 202 203 c 204 ELSEIF (flag_dms.EQ.4) THEN205 c 206 207 cnhl #ifdef NC_DOUBLE208 209 cnhl #else210 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)211 cnhl #endif212 213 214 215 216 c 217 ELSEIF (flag_dms.EQ.5) THEN218 c 219 220 cnhl #ifdef NC_DOUBLE221 222 cnhl #else223 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)224 cnhl #endif225 226 227 228 229 c 230 ELSEIF (flag_dms.EQ.6) THEN231 c 232 233 cnhl #ifdef NC_DOUBLE234 235 cnhl #else236 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)237 cnhl #endif238 239 240 241 242 c 243 ELSEIF (flag_dms.EQ.7) THEN244 c 245 246 cnhl #ifdef NC_DOUBLE247 248 cnhl #else249 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)250 cnhl #endif251 252 253 254 255 c 256 ELSEIF (flag_dms.EQ.8) THEN257 c 258 259 cnhl #ifdef NC_DOUBLE260 261 cnhl #else262 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)263 cnhl #endif264 265 266 267 268 c 269 ELSEIF (flag_dms.EQ.9) THEN270 c 271 272 cnhl #ifdef NC_DOUBLE273 274 cnhl #else275 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)276 cnhl #endif277 278 279 280 281 c 282 ELSEIF (flag_dms.EQ.10) THEN283 c 284 285 cnhl #ifdef NC_DOUBLE286 287 cnhl #else288 cnhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc)289 cnhl #endif290 291 292 293 294 c 295 ELSE296 c 297 298 299 c 300 301 c 302 303 c 304 IF (flag_dms.LE.2) THEN305 DO i=1, klon306 307 308 ELSE309 DO i=1, klon310 311 312 313 c 314 315 c 316 317 END 1 SUBROUTINE condsurfs(jour, edgar, flag_dms, & 2 lmt_so2h, lmt_so2b, lmt_so2bb, lmt_so2ba, & 3 lmt_so2volc, lmt_altvolc, & 4 lmt_dmsbio, lmt_h2sbio, lmt_dms, lmt_dmsconc) 5 USE dimphy 6 IMPLICIT none 7 ! 8 ! Lire les conditions aux limites du modele pour la chimie. 9 ! -------------------------------------------------------- 10 ! 11 INCLUDE "dimensions.h" 12 INCLUDE "netcdf.inc" 13 ! 14 REAL :: lmt_so2h(klon), lmt_so2b(klon), lmt_so2bb(klon) 15 REAL :: lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon) 16 REAL :: lmt_so2volc(klon), lmt_altvolc(klon) 17 REAL :: lmt_dms(klon), lmt_dmsconc(klon) 18 LOGICAL :: edgar 19 INTEGER :: flag_dms 20 ! 21 INTEGER :: jour, i 22 INTEGER :: ierr 23 INTEGER :: nid,nvarid 24 INTEGER :: debut(2),epais(2) 25 ! 26 IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN 27 IF ((jour.GT.(360-1)) .AND. (jour.LE.367)) THEN 28 jour=360-1 29 print *,'JE: jour changed to jour= ',jour 30 ELSE 31 PRINT*,'Le jour demande n est pas correcte:', jour 32 CALL ABORT 33 ENDIF 34 ENDIF 35 ! 36 ierr = NF_OPEN ("limitsoufre.nc", NF_NOWRITE, nid) 37 if (ierr.ne.NF_NOERR) then 38 write(6,*)' Pb d''ouverture du fichier limitsoufre.nc' 39 write(6,*)' ierr = ', ierr 40 call exit(1) 41 endif 42 ! 43 ! Tranche a lire: 44 debut(1) = 1 45 debut(2) = jour+1 46 epais(1) = klon 47 epais(2) = 1 48 ! 49 ierr = NF_INQ_VARID (nid, "VOLC", nvarid) 50 !nhl #ifdef NC_DOUBLE 51 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2volc) 52 !nhl #else 53 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2volc) 54 !nhl #endif 55 IF (ierr .NE. NF_NOERR) THEN 56 PRINT*, 'Pb de lecture pour les sources so2 volcan' 57 CALL exit(1) 58 ENDIF 59 ! 60 ierr = NF_INQ_VARID (nid, "ALTI", nvarid) 61 !nhl #ifdef NC_DOUBLE 62 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_altvolc) 63 !nhl #else 64 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_altvolc) 65 !nhl #endif 66 IF (ierr .NE. NF_NOERR) THEN 67 PRINT*, 'Pb de lecture pour les altitudes volcan' 68 CALL exit(1) 69 ENDIF 70 ! 71 IF (edgar) THEN !--EDGAR w/o ship and biomass burning 72 ! 73 ierr = NF_INQ_VARID (nid, "SO2ED95L", nvarid) 74 !nhl #ifdef NC_DOUBLE 75 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b) 76 !nhl #else 77 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b) 78 !nhl #endif 79 IF (ierr .NE. NF_NOERR) THEN 80 PRINT*, 'Pb de lecture pour les sources so2 edgar low' 81 CALL exit(1) 82 ENDIF 83 ! 84 ierr = NF_INQ_VARID (nid, "SO2ED95H", nvarid) 85 !nhl #ifdef NC_DOUBLE 86 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h) 87 !nhl #else 88 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h) 89 !nhl #endif 90 IF (ierr .NE. NF_NOERR) THEN 91 PRINT*, 'Pb de lecture pour les sources so2 edgar high' 92 CALL exit(1) 93 ENDIF 94 ! 95 ELSE !--GEIA 96 ! 97 ierr = NF_INQ_VARID (nid, "SO2H", nvarid) 98 !nhl #ifdef NC_DOUBLE 99 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2h) 100 !nhl #else 101 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2h) 102 !nhl #endif 103 IF (ierr .NE. NF_NOERR) THEN 104 PRINT*, 'Pb de lecture pour les sources so2 haut' 105 CALL exit(1) 106 ENDIF 107 ! 108 ierr = NF_INQ_VARID (nid, "SO2B", nvarid) 109 !nhl #ifdef NC_DOUBLE 110 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2b) 111 !nhl #else 112 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2b) 113 !nhl #endif 114 IF (ierr .NE. NF_NOERR) THEN 115 PRINT*, 'Pb de lecture pour les sources so2 bas' 116 CALL exit(1) 117 ENDIF 118 ! 119 ENDIF !--edgar 120 ! 121 ierr = NF_INQ_VARID (nid, "SO2BB", nvarid) 122 !nhl #ifdef NC_DOUBLE 123 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2bb) 124 !nhl #else 125 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2bb) 126 !nhl #endif 127 IF (ierr .NE. NF_NOERR) THEN 128 PRINT*, 'Pb de lecture pour les sources so2 bb' 129 CALL exit(1) 130 ENDIF 131 ! 132 ierr = NF_INQ_VARID (nid, "SO2BA", nvarid) 133 !nhl #ifdef NC_DOUBLE 134 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_so2ba) 135 !nhl #else 136 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_so2ba) 137 !nhl #endif 138 IF (ierr .NE. NF_NOERR) THEN 139 PRINT*, 'Pb de lecture pour les sources so2 bateau' 140 CALL exit(1) 141 ENDIF 142 ! 143 ierr = NF_INQ_VARID (nid, "DMSB", nvarid) 144 !nhl #ifdef NC_DOUBLE 145 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dmsbio) 146 !nhl #else 147 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsbio) 148 !nhl #endif 149 IF (ierr .NE. NF_NOERR) THEN 150 PRINT*, 'Pb de lecture pour les sources dms bio' 151 CALL exit(1) 152 ENDIF 153 ! 154 ierr = NF_INQ_VARID (nid, "H2SB", nvarid) 155 !nhl #ifdef NC_DOUBLE 156 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_h2sbio) 157 !nhl #else 158 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_h2sbio) 159 !nhl #endif 160 IF (ierr .NE. NF_NOERR) THEN 161 PRINT*, 'Pb de lecture pour les sources h2s bio' 162 CALL exit(1) 163 ENDIF 164 ! 165 IF (flag_dms.EQ.1) THEN 166 ! 167 ierr = NF_INQ_VARID (nid, "DMSL", nvarid) 168 !nhl #ifdef NC_DOUBLE 169 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms) 170 !nhl #else 171 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms) 172 !nhl #endif 173 IF (ierr .NE. NF_NOERR) THEN 174 PRINT*, 'Pb de lecture pour les sources dms liss' 175 CALL exit(1) 176 ENDIF 177 ! 178 ELSEIF (flag_dms.EQ.2) THEN 179 ! 180 ierr = NF_INQ_VARID (nid, "DMSW", nvarid) 181 !nhl #ifdef NC_DOUBLE 182 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, lmt_dms) 183 !nhl #else 184 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dms) 185 !nhl #endif 186 IF (ierr .NE. NF_NOERR) THEN 187 PRINT*, 'Pb de lecture pour les sources dms wann' 188 CALL exit(1) 189 ENDIF 190 ! 191 ELSEIF (flag_dms.EQ.3) THEN 192 ! 193 ierr = NF_INQ_VARID (nid, "DMSC1", nvarid) 194 !nhl #ifdef NC_DOUBLE 195 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 196 !nhl #else 197 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 198 !nhl #endif 199 IF (ierr .NE. NF_NOERR) THEN 200 PRINT*, 'Pb de lecture pour les sources dmsconc old' 201 CALL exit(1) 202 ENDIF 203 ! 204 ELSEIF (flag_dms.EQ.4) THEN 205 ! 206 ierr = NF_INQ_VARID (nid, "DMSC2", nvarid) 207 !nhl #ifdef NC_DOUBLE 208 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 209 !nhl #else 210 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 211 !nhl #endif 212 IF (ierr .NE. NF_NOERR) THEN 213 PRINT*, 'Pb de lecture pour les sources dms conc 2' 214 CALL exit(1) 215 ENDIF 216 ! 217 ELSEIF (flag_dms.EQ.5) THEN 218 ! 219 ierr = NF_INQ_VARID (nid, "DMSC3", nvarid) 220 !nhl #ifdef NC_DOUBLE 221 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 222 !nhl #else 223 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 224 !nhl #endif 225 IF (ierr .NE. NF_NOERR) THEN 226 PRINT*, 'Pb de lecture pour les sources dms conc 3' 227 CALL exit(1) 228 ENDIF 229 ! 230 ELSEIF (flag_dms.EQ.6) THEN 231 ! 232 ierr = NF_INQ_VARID (nid, "DMSC4", nvarid) 233 !nhl #ifdef NC_DOUBLE 234 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 235 !nhl #else 236 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 237 !nhl #endif 238 IF (ierr .NE. NF_NOERR) THEN 239 PRINT*, 'Pb de lecture pour les sources dms conc 4' 240 CALL exit(1) 241 ENDIF 242 ! 243 ELSEIF (flag_dms.EQ.7) THEN 244 ! 245 ierr = NF_INQ_VARID (nid, "DMSC5", nvarid) 246 !nhl #ifdef NC_DOUBLE 247 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 248 !nhl #else 249 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 250 !nhl #endif 251 IF (ierr .NE. NF_NOERR) THEN 252 PRINT*, 'Pb de lecture pour les sources dms conc 5' 253 CALL exit(1) 254 ENDIF 255 ! 256 ELSEIF (flag_dms.EQ.8) THEN 257 ! 258 ierr = NF_INQ_VARID (nid, "DMSC6", nvarid) 259 !nhl #ifdef NC_DOUBLE 260 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 261 !nhl #else 262 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 263 !nhl #endif 264 IF (ierr .NE. NF_NOERR) THEN 265 PRINT*, 'Pb de lecture pour les sources dms conc 6' 266 CALL exit(1) 267 ENDIF 268 ! 269 ELSEIF (flag_dms.EQ.9) THEN 270 ! 271 ierr = NF_INQ_VARID (nid, "DMSC7", nvarid) 272 !nhl #ifdef NC_DOUBLE 273 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 274 !nhl #else 275 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 276 !nhl #endif 277 IF (ierr .NE. NF_NOERR) THEN 278 PRINT*, 'Pb de lecture pour les sources dms conc 7' 279 CALL exit(1) 280 ENDIF 281 ! 282 ELSEIF (flag_dms.EQ.10) THEN 283 ! 284 ierr = NF_INQ_VARID (nid, "DMSC8", nvarid) 285 !nhl #ifdef NC_DOUBLE 286 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_dmsconc) 287 !nhl #else 288 !nhl ierr = NF_GET_VARA_REAL (nid, nvarid, debut, epais, lmt_dmsconc) 289 !nhl #endif 290 IF (ierr .NE. NF_NOERR) THEN 291 PRINT*, 'Pb de lecture pour les sources dms conc 8' 292 CALL exit(1) 293 ENDIF 294 ! 295 ELSE 296 ! 297 PRINT *,'choix non possible pour flag_dms' 298 STOP 299 ! 300 ENDIF 301 ! 302 ierr = NF_CLOSE(nid) 303 ! 304 IF (flag_dms.LE.2) THEN 305 DO i=1, klon 306 lmt_dmsconc(i)=0.0 307 ENDDO 308 ELSE 309 DO i=1, klon 310 lmt_dms(i)=0.0 311 ENDDO 312 ENDIF 313 ! 314 PRINT*, 'Sources SOUFRE lues pour jour: ', jour 315 ! 316 RETURN 317 END SUBROUTINE condsurfs -
LMDZ6/trunk/libf/phylmd/Dust/condsurfs_new.f90
r5245 r5246 1 SUBROUTINE condsurfs_new(jour, edgar, flag_dms, 2 . lmt_so2b, lmt_so2h, lmt_so2nff,3 . lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba,4 . lmt_so2volc_cont, lmt_altvolc_cont,5 . lmt_so2volc_expl, lmt_altvolc_expl,6 . lmt_dmsbio, lmt_h2sbio, lmt_dms,7 .lmt_dmsconc)8 9 10 11 12 c 13 cLire les conditions aux limites du modele pour la chimie.14 c--------------------------------------------------------15 c 16 17 18 c 19 REALlmt_so2b(klon), lmt_so2h(klon), lmt_so2nff(klon)20 REALlmt_so2bb_l(klon), lmt_so2bb_h(klon)21 REALlmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon)22 REALlmt_so2volc_cont(klon), lmt_altvolc_cont(klon)23 REALlmt_so2volc_expl(klon), lmt_altvolc_expl(klon)24 REALlmt_dms(klon), lmt_dmsconc(klon)25 26 REALlmt_so2b_glo(klon_glo), lmt_so2h_glo(klon_glo)27 REALlmt_so2nff_glo(klon_glo)28 REALlmt_so2bb_l_glo(klon_glo), lmt_so2bb_h_glo(klon_glo)29 REALlmt_dmsbio_glo(klon_glo), lmt_h2sbio_glo(klon_glo)30 REALlmt_so2ba_glo(klon_glo)31 REALlmt_so2volc_cont_glo(klon_glo),lmt_altvolc_cont_glo(klon_glo)32 REALlmt_so2volc_expl_glo(klon_glo),lmt_altvolc_expl_glo(klon_glo)33 REALlmt_dms_glo(klon_glo), lmt_dmsconc_glo(klon_glo)34 LOGICALedgar35 INTEGERflag_dms36 c 37 INTEGERjour, i38 INTEGERierr39 INTEGERnid,nvarid40 INTEGERdebut(2),epais(2)41 c 42 43 44 print *,'JE: FORCED TO CONTINUE (emissions have45 .to be longer than 1 year!!!! )'46 !CALL ABORT47 48 !1 SUBROUTINE condsurfs_new(jour, edgar, flag_dms, & 2 lmt_so2b, lmt_so2h, lmt_so2nff, & 3 lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba, & 4 lmt_so2volc_cont, lmt_altvolc_cont, & 5 lmt_so2volc_expl, lmt_altvolc_expl, & 6 lmt_dmsbio, lmt_h2sbio, lmt_dms, & 7 lmt_dmsconc) 8 USE mod_grid_phy_lmdz 9 USE mod_phys_lmdz_para 10 USE dimphy 11 IMPLICIT none 12 ! 13 ! Lire les conditions aux limites du modele pour la chimie. 14 ! -------------------------------------------------------- 15 ! 16 INCLUDE "dimensions.h" 17 INCLUDE "netcdf.inc" 18 ! 19 REAL :: lmt_so2b(klon), lmt_so2h(klon), lmt_so2nff(klon) 20 REAL :: lmt_so2bb_l(klon), lmt_so2bb_h(klon) 21 REAL :: lmt_dmsbio(klon), lmt_h2sbio(klon), lmt_so2ba(klon) 22 REAL :: lmt_so2volc_cont(klon), lmt_altvolc_cont(klon) 23 REAL :: lmt_so2volc_expl(klon), lmt_altvolc_expl(klon) 24 REAL :: lmt_dms(klon), lmt_dmsconc(klon) 25 26 REAL :: lmt_so2b_glo(klon_glo), lmt_so2h_glo(klon_glo) 27 REAL :: lmt_so2nff_glo(klon_glo) 28 REAL :: lmt_so2bb_l_glo(klon_glo), lmt_so2bb_h_glo(klon_glo) 29 REAL :: lmt_dmsbio_glo(klon_glo), lmt_h2sbio_glo(klon_glo) 30 REAL :: lmt_so2ba_glo(klon_glo) 31 REAL :: lmt_so2volc_cont_glo(klon_glo),lmt_altvolc_cont_glo(klon_glo) 32 REAL :: lmt_so2volc_expl_glo(klon_glo),lmt_altvolc_expl_glo(klon_glo) 33 REAL :: lmt_dms_glo(klon_glo), lmt_dmsconc_glo(klon_glo) 34 LOGICAL :: edgar 35 INTEGER :: flag_dms 36 ! 37 INTEGER :: jour, i 38 INTEGER :: ierr 39 INTEGER :: nid,nvarid 40 INTEGER :: debut(2),epais(2) 41 ! 42 IF (jour.LT.0 .OR. jour.GT.(366-1)) THEN 43 PRINT*,'Le jour demande n est pas correcte:', jour 44 print *,'JE: FORCED TO CONTINUE (emissions have& 45 & to be longer than 1 year!!!! )' 46 ! CALL ABORT 47 ENDIF 48 ! 49 49 50 50 !$OMP MASTER 51 52 53 cTranche a lire:54 55 56 !epais(1) = klon57 58 59 !=======================================================================60 !READING NEW EMISSIONS FROM RCP61 !=======================================================================62 !63 64 65 66 67 68 69 70 !71 ! SO2 Low level emissions72 !73 74 75 76 77 78 79 80 81 82 !83 ! SO2 High level emissions84 !85 86 87 88 89 90 91 !92 ! SO2 Biomass burning High level emissions93 !94 95 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,96 .epais, lmt_so2bb_h_glo)97 98 99 100 101 !102 ! SO2 biomass burning low level emissions103 !104 105 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,106 .epais, lmt_so2bb_l_glo)107 108 109 110 111 !112 ! SO2 ship emissions113 !114 115 116 117 118 119 120 !121 ! SO2 Non Fossil Fuel Emissions122 !123 124 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,125 .lmt_so2nff_glo)126 127 128 129 130 !131 132 !133 !=======================================================================134 !READING NATURAL EMISSIONS135 !=======================================================================136 137 138 139 140 141 142 c 143 cBiologenic source of DMS144 c 145 146 147 148 149 150 151 c 152 cBiologenic source of H2S153 c 154 155 156 157 158 159 160 c 161 cOcean surface concentration of dms (emissions are computed later)162 c 163 IF (flag_dms.EQ.4) THEN164 c 165 166 167 168 169 170 171 c 172 DO i=1, klon173 !lmt_dms(i)=0.0174 175 176 c 177 ELSE178 c 179 180 181 182 183 c 184 185 c 186 !=======================================================================187 !READING VOLCANIC EMISSIONS188 !=======================================================================189 190 191 192 193 194 195 196 197 c 198 cContinuous Volcanic emissions199 c 200 !ierr = NF_INQ_VARID (nid, "VOLC", nvarid)201 202 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,203 .lmt_so2volc_cont_glo)204 205 206 207 208 print *,'SO2 volc cont (in read) = ',SUM(lmt_so2volc_cont_glo),209 +MINVAL(lmt_so2volc_cont_glo),MAXVAL(lmt_so2volc_cont_glo)210 !lmt_so2volc(:)=0.0211 c 212 cAltitud of continuous volcanic emissions213 c 214 !ierr = NF_INQ_VARID (nid, "ALTI", nvarid)215 216 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,217 .lmt_altvolc_cont_glo)218 219 220 221 222 c 223 cExplosive Volcanic emissions224 c 225 226 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,227 .lmt_so2volc_expl_glo)228 229 230 231 232 !lmt_so2volc_expl(:)=0.0233 print *,'SO2 volc expl (in read) = ',SUM(lmt_so2volc_expl_glo),234 +MINVAL(lmt_so2volc_expl_glo),MAXVAL(lmt_so2volc_expl_glo)235 c 236 cAltitud of explosive volcanic emissions237 c 238 239 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,240 .lmt_altvolc_expl_glo)241 242 243 244 245 !lmt_altvolc_expl(:)=0.0246 247 248 c 249 250 c 251 252 253 51 IF (is_mpi_root .AND. is_omp_root) THEN 52 53 ! Tranche a lire: 54 debut(1) = 1 55 debut(2) = jour 56 ! epais(1) = klon 57 epais(1) = klon_glo 58 epais(2) = 1 59 !======================================================================= 60 ! READING NEW EMISSIONS FROM RCP 61 !======================================================================= 62 ! 63 ierr = NF_OPEN ("sulphur_emissions_antro.nc", NF_NOWRITE, nid) 64 if (ierr.ne.NF_NOERR) then 65 write(6,*)' Pb d''ouverture du fichier sulphur_emissions_antro' 66 write(6,*)' ierr = ', ierr 67 call exit(1) 68 endif 69 70 ! 71 ! SO2 Low level emissions 72 ! 73 ierr = NF_INQ_VARID (nid, "SO2FF_LOW", nvarid) 74 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2b_glo) 75 IF (ierr .NE. NF_NOERR) THEN 76 PRINT*, 'Pb de lecture pour les sources so2 low' 77 print *,'JE klon, jour, debut ,epais ',klon_glo,jour,debut,epais 78 CALL HANDLE_ERR(ierr) 79 print *,'error ierr= ',ierr 80 CALL exit(1) 81 ENDIF 82 ! 83 ! SO2 High level emissions 84 ! 85 ierr = NF_INQ_VARID (nid, "SO2FF_HIGH", nvarid) 86 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais,lmt_so2h_glo) 87 IF (ierr .NE. NF_NOERR) THEN 88 PRINT*, 'Pb de lecture pour les sources so2 high' 89 CALL exit(1) 90 ENDIF 91 ! 92 ! SO2 Biomass burning High level emissions 93 ! 94 ierr = NF_INQ_VARID (nid, "SO2BBH", nvarid) 95 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, & 96 epais, lmt_so2bb_h_glo) 97 IF (ierr .NE. NF_NOERR) THEN 98 PRINT*, 'Pb de lecture pour les sources so2 BB high' 99 CALL exit(1) 100 ENDIF 101 ! 102 ! SO2 biomass burning low level emissions 103 ! 104 ierr = NF_INQ_VARID (nid, "SO2BBL", nvarid) 105 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, & 106 epais, lmt_so2bb_l_glo) 107 IF (ierr .NE. NF_NOERR) THEN 108 PRINT*, 'Pb de lecture pour les sources so2 BB low' 109 CALL exit(1) 110 ENDIF 111 ! 112 ! SO2 ship emissions 113 ! 114 ierr = NF_INQ_VARID (nid, "SO2BA", nvarid) 115 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut,epais,lmt_so2ba_glo) 116 IF (ierr .NE. NF_NOERR) THEN 117 PRINT*, 'Pb de lecture pour les sources so2 ship' 118 CALL exit(1) 119 ENDIF 120 ! 121 ! SO2 Non Fossil Fuel Emissions 122 ! 123 ierr = NF_INQ_VARID (nid, "SO2NFF", nvarid) 124 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, & 125 lmt_so2nff_glo) 126 IF (ierr .NE. NF_NOERR) THEN 127 PRINT*, 'Pb de lecture pour les sources so2 non FF' 128 CALL exit(1) 129 ENDIF 130 ! 131 ierr = NF_CLOSE(nid) 132 ! 133 !======================================================================= 134 ! READING NATURAL EMISSIONS 135 !======================================================================= 136 ierr = NF_OPEN ("sulphur_emissions_nat.nc", NF_NOWRITE, nid) 137 if (ierr.ne.NF_NOERR) then 138 write(6,*)' Pb d''ouverture du fichier sulphur_emissions_nat' 139 write(6,*)' ierr = ', ierr 140 call exit(1) 141 endif 142 ! 143 ! Biologenic source of DMS 144 ! 145 ierr = NF_INQ_VARID (nid, "DMSB", nvarid) 146 ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_dmsbio_glo) 147 IF (ierr .NE. NF_NOERR) THEN 148 PRINT*, 'Pb de lecture pour les sources dms bio' 149 CALL exit(1) 150 ENDIF 151 ! 152 ! Biologenic source of H2S 153 ! 154 ierr = NF_INQ_VARID (nid, "H2SB", nvarid) 155 ierr = NF_GET_VARA_DOUBLE (nid, nvarid,debut,epais,lmt_h2sbio_glo) 156 IF (ierr .NE. NF_NOERR) THEN 157 PRINT*, 'Pb de lecture pour les sources h2s bio' 158 CALL exit(1) 159 ENDIF 160 ! 161 ! Ocean surface concentration of dms (emissions are computed later) 162 ! 163 IF (flag_dms.EQ.4) THEN 164 ! 165 ierr = NF_INQ_VARID (nid, "DMSC2", nvarid) 166 ierr = NF_GET_VARA_DOUBLE (nid,nvarid,debut,epais,lmt_dmsconc_glo) 167 IF (ierr .NE. NF_NOERR) THEN 168 PRINT*, 'Pb de lecture pour les sources dms conc 2' 169 CALL exit(1) 170 ENDIF 171 ! 172 DO i=1, klon 173 ! lmt_dms(i)=0.0 174 lmt_dms_glo(i)=0.0 175 ENDDO 176 ! 177 ELSE 178 ! 179 PRINT *,'choix non possible pour flag_dms' 180 STOP 181 182 ENDIF 183 ! 184 ierr = NF_CLOSE(nid) 185 ! 186 !======================================================================= 187 ! READING VOLCANIC EMISSIONS 188 !======================================================================= 189 print *,' *** READING VOLCANIC EMISSIONS *** ' 190 print *,' Jour = ',jour 191 ierr = NF_OPEN ("sulphur_emissions_volc.nc", NF_NOWRITE, nid) 192 if (ierr.ne.NF_NOERR) then 193 write(6,*)' Pb d''ouverture du fichier sulphur_emissions_volc' 194 write(6,*)' ierr = ', ierr 195 call exit(1) 196 endif 197 ! 198 ! Continuous Volcanic emissions 199 ! 200 ! ierr = NF_INQ_VARID (nid, "VOLC", nvarid) 201 ierr = NF_INQ_VARID (nid, "flx_volc_cont", nvarid) 202 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, & 203 lmt_so2volc_cont_glo) 204 IF (ierr .NE. NF_NOERR) THEN 205 PRINT*, 'Pb de lecture pour les sources so2 volcan (cont)' 206 CALL exit(1) 207 ENDIF 208 print *,'SO2 volc cont (in read) = ',SUM(lmt_so2volc_cont_glo), & 209 MINVAL(lmt_so2volc_cont_glo),MAXVAL(lmt_so2volc_cont_glo) 210 ! lmt_so2volc(:)=0.0 211 ! 212 ! Altitud of continuous volcanic emissions 213 ! 214 ! ierr = NF_INQ_VARID (nid, "ALTI", nvarid) 215 ierr = NF_INQ_VARID (nid, "flx_volc_altcont", nvarid) 216 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, & 217 lmt_altvolc_cont_glo) 218 IF (ierr .NE. NF_NOERR) THEN 219 PRINT*, 'Pb de lecture pour les altitudes volcan (cont)' 220 CALL exit(1) 221 ENDIF 222 ! 223 ! Explosive Volcanic emissions 224 ! 225 ierr = NF_INQ_VARID (nid, "flx_volc_expl", nvarid) 226 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, & 227 lmt_so2volc_expl_glo) 228 IF (ierr .NE. NF_NOERR) THEN 229 PRINT*, 'Pb de lecture pour les sources so2 volcan (expl)' 230 CALL exit(1) 231 ENDIF 232 ! lmt_so2volc_expl(:)=0.0 233 print *,'SO2 volc expl (in read) = ',SUM(lmt_so2volc_expl_glo), & 234 MINVAL(lmt_so2volc_expl_glo),MAXVAL(lmt_so2volc_expl_glo) 235 ! 236 ! Altitud of explosive volcanic emissions 237 ! 238 ierr = NF_INQ_VARID (nid, "flx_volc_altexpl", nvarid) 239 ierr = NF_GET_VARA_DOUBLE (nid, nvarid, debut, epais, & 240 lmt_altvolc_expl_glo) 241 IF (ierr .NE. NF_NOERR) THEN 242 PRINT*, 'Pb de lecture pour les altitudes volcan' 243 CALL exit(1) 244 ENDIF 245 ! lmt_altvolc_expl(:)=0.0 246 247 ierr = NF_CLOSE(nid) 248 ! 249 PRINT*, 'Sources SOUFRE lues pour jour: ', jour 250 ! 251 252 253 ENDIF 254 254 !$OMP END MASTER 255 255 !$OMP BARRIER 256 257 call scatter(lmt_so2h_glo , lmt_so2h )258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 END 256 call scatter( lmt_so2b_glo , lmt_so2b ) 257 call scatter(lmt_so2h_glo , lmt_so2h ) 258 call scatter(lmt_so2bb_h_glo , lmt_so2bb_h ) 259 call scatter(lmt_so2bb_l_glo , lmt_so2bb_l) 260 call scatter(lmt_so2ba_glo , lmt_so2ba) 261 call scatter(lmt_so2nff_glo , lmt_so2nff) 262 call scatter(lmt_dmsbio_glo , lmt_dmsbio) 263 call scatter(lmt_h2sbio_glo , lmt_h2sbio) 264 call scatter(lmt_dmsconc_glo , lmt_dmsconc) 265 call scatter(lmt_dms_glo , lmt_dms) 266 call scatter(lmt_so2volc_cont_glo , lmt_so2volc_cont) 267 call scatter(lmt_altvolc_cont_glo , lmt_altvolc_cont) 268 call scatter(lmt_so2volc_expl_glo , lmt_so2volc_expl) 269 call scatter(lmt_altvolc_expl_glo , lmt_altvolc_expl) 270 271 272 RETURN 273 END SUBROUTINE condsurfs_new -
LMDZ6/trunk/libf/phylmd/Dust/deposition.f90
r5245 r5246 1 cSubroutine that estimates the Deposition velocities and the depostion2 Cfor the different tracers3 subroutine deposition(vdep_oce,vdep_sic,vdep_ter,vdep_lic,pctsrf, 4 . zrho,zdz,pdtphys,RHcl,masse,t_seri,pplay,5 . paprs,lminmax,qmin,qmax,6 .his_ds,source_tr,tr_seri)1 ! Subroutine that estimates the Deposition velocities and the depostion 2 ! for the different tracers 3 subroutine deposition(vdep_oce,vdep_sic,vdep_ter,vdep_lic,pctsrf, & 4 zrho,zdz,pdtphys,RHcl,masse,t_seri,pplay, & 5 paprs,lminmax,qmin,qmax, & 6 his_ds,source_tr,tr_seri) 7 7 8 9 10 8 USE dimphy 9 USE infotrac 10 USE indice_sol_mod 11 11 12 12 IMPLICIT NONE 13 13 14 15 16 17 14 INCLUDE "dimensions.h" 15 INCLUDE "chem.h" 16 INCLUDE "YOMCST.h" 17 INCLUDE "paramet.h" 18 18 19 c----------------------------- INPUT ----------------------------------- 20 LOGICAL lminmax 21 REAL qmin, qmax 22 REAL vdep_oce(nbtr), vdep_sic(nbtr) 23 REAL vdep_ter(nbtr), vdep_lic(nbtr) 24 REAL pctsrf(klon,nbsrf) 25 REAL zrho(klon,klev) !Density of air at mid points of Z (kg/m3) 26 REAL zdz(klon,klev) 27 REAL pdtphys ! pas d'integration pour la physique (seconde) 28 REAL RHcl(klon,klev) ! humidite relativen ciel clair 29 REAL t_seri(klon,klev) ! temperature 30 REAL pplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa) 31 REAL paprs(klon, klev+1) !pressure at interface of layers Z (Pa) 32 REAL masse(nbtr) 33 34 c----------------------------- OUTPUT ---------------------------------- 35 REAL his_ds(klon,nbtr) 36 REAL source_tr(klon,nbtr) 37 REAL tr_seri(klon, klev,nbtr) !conc of tracers 38 c--------------------- INTERNAL VARIABLES ------------------------------ 39 INTEGER i, it 40 REAL vdep !sed. velocity 19 !----------------------------- INPUT ----------------------------------- 20 LOGICAL :: lminmax 21 REAL :: qmin, qmax 22 REAL :: vdep_oce(nbtr), vdep_sic(nbtr) 23 REAL :: vdep_ter(nbtr), vdep_lic(nbtr) 24 REAL :: pctsrf(klon,nbsrf) 25 REAL :: zrho(klon,klev) !Density of air at mid points of Z (kg/m3) 26 REAL :: zdz(klon,klev) 27 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 28 REAL :: RHcl(klon,klev) ! humidite relativen ciel clair 29 REAL :: t_seri(klon,klev) ! temperature 30 REAL :: pplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa) 31 REAL :: paprs(klon, klev+1) !pressure at interface of layers Z (Pa) 32 REAL :: masse(nbtr) 41 33 42 DO it=1, nbtr 43 DO i=1, klon 44 vdep=vdep_oce(it)*pctsrf(i,is_oce)+ 45 . vdep_sic(it)*pctsrf(i,is_sic)+ 46 . vdep_ter(it)*pctsrf(i,is_ter)+ 47 . vdep_lic(it)*pctsrf(i,is_lic) 48 c--Unit: molec/m2/s for it=1 to nbtr-3, mg/m2/s for it=nbtr-2 to nbtr 49 source_tr(i,it)=source_tr(i,it) 50 . -vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2 51 his_ds(i,it)=vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2 52 . /RNAVO*masse(it)*1.e3 ! mg/m2/s 53 ENDDO 54 ENDDO 55 c 56 END 34 !----------------------------- OUTPUT ---------------------------------- 35 REAL :: his_ds(klon,nbtr) 36 REAL :: source_tr(klon,nbtr) 37 REAL :: tr_seri(klon, klev,nbtr) !conc of tracers 38 !--------------------- INTERNAL VARIABLES ------------------------------ 39 INTEGER :: i, it 40 REAL :: vdep !sed. velocity 41 42 DO it=1, nbtr 43 DO i=1, klon 44 vdep=vdep_oce(it)*pctsrf(i,is_oce)+ & 45 vdep_sic(it)*pctsrf(i,is_sic)+ & 46 vdep_ter(it)*pctsrf(i,is_ter)+ & 47 vdep_lic(it)*pctsrf(i,is_lic) 48 !--Unit: molec/m2/s for it=1 to nbtr-3, mg/m2/s for it=nbtr-2 to nbtr 49 source_tr(i,it)=source_tr(i,it) & 50 -vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2 51 his_ds(i,it)=vdep*tr_seri(i,1,it)*zrho(i,1)/1.e2 & 52 /RNAVO*masse(it)*1.e3 ! mg/m2/s 53 ENDDO 54 ENDDO 55 ! 56 END SUBROUTINE deposition -
LMDZ6/trunk/libf/phylmd/Dust/finemission.f90
r5245 r5246 1 CThis subroutine calculates the emissions of BLACK CARBON and ORGANIC2 CMATTER3 SUBROUTINE finemission(zdz,pdtphys,zalt,kminbc,kmaxbc, 4 . scale_param_bb,scale_param_ff,5 . iregion_ind,iregion_bb,6 . nbreg_ind,nbreg_bb,7 . lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h,8 . lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l,9 . lmt_ombb_h,lmt_omnat,lmt_omba,id_fine,10 . flux_sparam_bb,flux_sparam_ff,11 .source_tr,flux_tr,tr_seri)1 ! This subroutine calculates the emissions of BLACK CARBON and ORGANIC 2 ! MATTER 3 SUBROUTINE finemission(zdz,pdtphys,zalt,kminbc,kmaxbc, & 4 scale_param_bb,scale_param_ff, & 5 iregion_ind,iregion_bb, & 6 nbreg_ind,nbreg_bb, & 7 lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h, & 8 lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l, & 9 lmt_ombb_h,lmt_omnat,lmt_omba,id_fine, & 10 flux_sparam_bb,flux_sparam_ff, & 11 source_tr,flux_tr,tr_seri) 12 12 13 14 15 16 !USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb17 13 USE dimphy 14 USE indice_sol_mod 15 USE infotrac 16 ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb 17 IMPLICIT NONE 18 18 19 20 21 22 19 INCLUDE "dimensions.h" 20 INCLUDE "chem.h" 21 INCLUDE "YOMCST.h" 22 INCLUDE "paramet.h" 23 23 24 INTEGER i, k, kminbc, kmaxbc 25 c============================= INPUT =================================== 26 REAL pdtphys ! pas d'integration pour la physique (seconde) 27 REAL zalt(klon,klev) 28 REAL zdz(klon,klev) 29 c 30 c------------------------- Scaling Parameters -------------------------- 31 c 32 INTEGER nbreg_ind,nbreg_bb 33 INTEGER iregion_ind(klon) !Defines regions for SO2, BC & OM 34 INTEGER iregion_bb(klon) !Defines regions for SO2, BC & OM 35 REAL scale_param_bb(nbreg_bb) !Scaling parameter for biomas burning 36 REAL scale_param_ff(nbreg_ind) !Scaling parameter for industrial emissions (fossil fuel) 37 INTEGER id_fine 38 c============================= OUTPUT ================================== 39 REAL source_tr(klon,nbtr) 40 REAL flux_tr(klon,nbtr) 41 REAL tr_seri(klon,klev,nbtr) ! traceur 42 REAL flux_sparam_bb(klon), flux_sparam_ff(klon) 43 c========================= LOCAL VARIABLES ============================= 44 REAL zzdz 45 c------------------------- BLACK CARBON emissions ---------------------- 46 REAL lmt_bcff(klon) ! emissions de BC fossil fuels 47 REAL lmt_bcnff(klon) ! emissions de BC non-fossil fuels 48 REAL lmt_bcbb_l(klon) ! emissions de BC biomass basses 49 REAL lmt_bcbb_h(klon) ! emissions de BC biomass hautes 50 REAL lmt_bcba(klon) ! emissions de BC bateau 51 c------------------------ ORGANIC MATTER emissions --------------------- 52 REAL lmt_omff(klon) ! emissions de OM fossil fuels 53 REAL lmt_omnff(klon) ! emissions de OM non-fossil fuels 54 REAL lmt_ombb_l(klon) ! emissions de OM biomass basses 55 REAL lmt_ombb_h(klon) ! emissions de OM biomass hautes 56 REAL lmt_omnat(klon) ! emissions de OM Natural 57 REAL lmt_omba(klon) ! emissions de OM bateau 58 59 EXTERNAL condsurfc 60 c======================================================================== 61 c LOW LEVEL EMISSIONS 62 c======================================================================== 63 64 c corresponds to bc_source.EQ.3 24 INTEGER :: i, k, kminbc, kmaxbc 25 !============================= INPUT =================================== 26 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 27 REAL :: zalt(klon,klev) 28 REAL :: zdz(klon,klev) 29 ! 30 !------------------------- Scaling Parameters -------------------------- 31 ! 32 INTEGER :: nbreg_ind,nbreg_bb 33 INTEGER :: iregion_ind(klon) !Defines regions for SO2, BC & OM 34 INTEGER :: iregion_bb(klon) !Defines regions for SO2, BC & OM 35 REAL :: scale_param_bb(nbreg_bb) !Scaling parameter for biomas burning 36 REAL :: scale_param_ff(nbreg_ind) !Scaling parameter for industrial emissions (fossil fuel) 37 INTEGER :: id_fine 38 !============================= OUTPUT ================================== 39 REAL :: source_tr(klon,nbtr) 40 REAL :: flux_tr(klon,nbtr) 41 REAL :: tr_seri(klon,klev,nbtr) ! traceur 42 REAL :: flux_sparam_bb(klon), flux_sparam_ff(klon) 43 !========================= LOCAL VARIABLES ============================= 44 REAL :: zzdz 45 !------------------------- BLACK CARBON emissions ---------------------- 46 REAL :: lmt_bcff(klon) ! emissions de BC fossil fuels 47 REAL :: lmt_bcnff(klon) ! emissions de BC non-fossil fuels 48 REAL :: lmt_bcbb_l(klon) ! emissions de BC biomass basses 49 REAL :: lmt_bcbb_h(klon) ! emissions de BC biomass hautes 50 REAL :: lmt_bcba(klon) ! emissions de BC bateau 51 !------------------------ ORGANIC MATTER emissions --------------------- 52 REAL :: lmt_omff(klon) ! emissions de OM fossil fuels 53 REAL :: lmt_omnff(klon) ! emissions de OM non-fossil fuels 54 REAL :: lmt_ombb_l(klon) ! emissions de OM biomass basses 55 REAL :: lmt_ombb_h(klon) ! emissions de OM biomass hautes 56 REAL :: lmt_omnat(klon) ! emissions de OM Natural 57 REAL :: lmt_omba(klon) ! emissions de OM bateau 65 58 66 DO i=1,klon 67 IF (iregion_ind(i).GT.0) THEN 68 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ 69 . (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ !g/m2/s 70 . scale_param_ff(iregion_ind(i))*lmt_omff(i) 71 . ) * 1.e4 !g/m2/s 72 c 73 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ 74 . (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ !mg/m2/s 75 . scale_param_ff(iregion_ind(i))*lmt_omff(i) 76 . ) * 1.e4 *1.e3 !mg/m2/s 77 c 78 flux_sparam_ff(i)= flux_sparam_ff(i) + 79 . scale_param_ff(iregion_ind(i))* 80 . ( lmt_bcff(i)+lmt_omff(i)) 81 . *1.e4*1.e3 82 ENDIF 83 IF (iregion_bb(i).GT.0) THEN 84 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ 85 . (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ !g/m2/s 86 . scale_param_bb(iregion_bb(i))*lmt_ombb_l(i) !g/m2/s 87 . ) * 1.e4 !g/m2/s 88 c 89 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ 90 . (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ !mg/m2/s 91 . scale_param_bb(iregion_bb(i))*lmt_ombb_l(i)+ !mg/m2/s 92 . scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ !mg/m2/s 93 . scale_param_bb(iregion_bb(i))*lmt_ombb_h(i) !mg/m2/s 94 . ) * 1.e4 *1.e3 !mg/m2/s 95 c 96 flux_sparam_bb(i)=flux_sparam_bb(i) + 97 . scale_param_bb(iregion_bb(i))*(lmt_bcbb_l(i) + 98 . lmt_bcbb_h(i) + lmt_ombb_l(i) + lmt_ombb_h(i)) 99 . *1.e4*1.e3 100 ENDIF 101 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ 102 . (lmt_bcnff(i)+lmt_bcba(i)+lmt_omnff(i)+ 103 . lmt_omnat(i)+lmt_omba(i)) * 1.e4 !g/m2/s 104 c 105 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ 106 . (lmt_bcnff(i)+lmt_omnff(i)+lmt_omnat(i)+ 107 . lmt_omba(i)+lmt_bcba(i)) * 1.e4 *1.e3 !mg/m2/s 108 c 109 flux_sparam_ff(i)= flux_sparam_ff(i) + 110 . (lmt_omba(i)+lmt_bcba(i))*1.e4*1.e3 111 ENDDO 59 EXTERNAL condsurfc 60 !======================================================================== 61 ! LOW LEVEL EMISSIONS 62 !======================================================================== 112 63 113 c======================================================================== 114 c HIGH LEVEL EMISSIONS 115 c======================================================================== 116 117 c Sources hautes de BC/OM 64 ! corresponds to bc_source.EQ.3 118 65 119 c 120 c HIGH LEVEL EMISSIONS OF SO2 ARE IN PRECUREMISSION.F 121 c 122 k=2 !introducing emissions in level 2 123 cnhl DO i = 1, klon 124 c 125 cnhl tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+scale_param_ff(iregion_ind(i))* 126 cnhl . (lmt_bcff_h(i)+lmt_omff_h(i))/zdz(i,k)/100.*pdtphys 127 c 128 cnhl ENDDO 66 DO i=1,klon 67 IF (iregion_ind(i).GT.0) THEN 68 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ & 69 (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ & !g/m2/s 70 scale_param_ff(iregion_ind(i))*lmt_omff(i) & 71 ) * 1.e4 !g/m2/s 72 ! 73 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ & 74 (scale_param_ff(iregion_ind(i))*lmt_bcff(i)+ & !mg/m2/s 75 scale_param_ff(iregion_ind(i))*lmt_omff(i) & 76 ) * 1.e4 *1.e3 !mg/m2/s 77 ! 78 flux_sparam_ff(i)= flux_sparam_ff(i) + & 79 scale_param_ff(iregion_ind(i))* & 80 ( lmt_bcff(i)+lmt_omff(i)) & 81 *1.e4*1.e3 82 ENDIF 83 IF (iregion_bb(i).GT.0) THEN 84 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ & 85 (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ & !g/m2/s 86 scale_param_bb(iregion_bb(i))*lmt_ombb_l(i) & !g/m2/s 87 ) * 1.e4 !g/m2/s 88 ! 89 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ & 90 (scale_param_bb(iregion_bb(i))*lmt_bcbb_l(i)+ & !mg/m2/s 91 scale_param_bb(iregion_bb(i))*lmt_ombb_l(i)+ & !mg/m2/s 92 scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ & !mg/m2/s 93 scale_param_bb(iregion_bb(i))*lmt_ombb_h(i) & !mg/m2/s 94 ) * 1.e4 *1.e3 !mg/m2/s 95 ! 96 flux_sparam_bb(i)=flux_sparam_bb(i) + & 97 scale_param_bb(iregion_bb(i))*(lmt_bcbb_l(i) + & 98 lmt_bcbb_h(i) + lmt_ombb_l(i) + lmt_ombb_h(i)) & 99 *1.e4*1.e3 100 ENDIF 101 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)+ & 102 (lmt_bcnff(i)+lmt_bcba(i)+lmt_omnff(i)+ & 103 lmt_omnat(i)+lmt_omba(i)) * 1.e4 !g/m2/s 104 ! 105 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)+ & 106 (lmt_bcnff(i)+lmt_omnff(i)+lmt_omnat(i)+ & 107 lmt_omba(i)+lmt_bcba(i)) * 1.e4 *1.e3 !mg/m2/s 108 ! 109 flux_sparam_ff(i)= flux_sparam_ff(i) + & 110 (lmt_omba(i)+lmt_bcba(i))*1.e4*1.e3 111 ENDDO 129 112 130 DO k=kminbc, kmaxbc 131 DO i = 1, klon 132 zzdz=zalt(i,kmaxbc+1)-zalt(i,kminbc) 133 c 134 IF (iregion_bb(i) .GT.0) THEN 135 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+ 136 . (scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ 137 . scale_param_bb(iregion_bb(i))*lmt_ombb_h(i)) 138 . /zzdz/100.*pdtphys 139 ENDIF 140 c 141 ENDDO 142 ENDDO 143 c 144 END 113 !======================================================================== 114 ! HIGH LEVEL EMISSIONS 115 !======================================================================== 116 117 ! Sources hautes de BC/OM 118 119 ! 120 ! HIGH LEVEL EMISSIONS OF SO2 ARE IN PRECUREMISSION.F 121 ! 122 k=2 !introducing emissions in level 2 123 !nhl DO i = 1, klon 124 ! 125 !nhl tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+scale_param_ff(iregion_ind(i))* 126 !nhl . (lmt_bcff_h(i)+lmt_omff_h(i))/zdz(i,k)/100.*pdtphys 127 ! 128 !nhl ENDDO 129 130 DO k=kminbc, kmaxbc 131 DO i = 1, klon 132 zzdz=zalt(i,kmaxbc+1)-zalt(i,kminbc) 133 ! 134 IF (iregion_bb(i) .GT.0) THEN 135 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)+ & 136 (scale_param_bb(iregion_bb(i))*lmt_bcbb_h(i)+ & 137 scale_param_bb(iregion_bb(i))*lmt_ombb_h(i)) & 138 /zzdz/100.*pdtphys 139 ENDIF 140 ! 141 ENDDO 142 ENDDO 143 ! 144 END SUBROUTINE finemission -
LMDZ6/trunk/libf/phylmd/Dust/gastoparticle.f90
r5245 r5246 1 SUBROUTINE gastoparticle(pdtphys,zdz,zrho,xlat,pplay,t_seri, 2 . id_prec,id_fine,3 .tr_seri,his_g2pgas ,his_g2paer )4 cnhl . fluxso4chem, flux_sparam_sulf,1 SUBROUTINE gastoparticle(pdtphys,zdz,zrho,xlat,pplay,t_seri, & 2 id_prec,id_fine, & 3 tr_seri,his_g2pgas ,his_g2paer ) 4 !nhl . fluxso4chem, flux_sparam_sulf, 5 5 6 7 8 cUSE indice_sol_mod6 USE dimphy 7 USE infotrac 8 ! USE indice_sol_mod 9 9 10 IMPLICIT NONE11 c 12 13 14 15 16 17 c 18 REALpdtphys19 REALzrho(klon,klev)20 REALzdz(klon,klev)21 REALtr_seri(klon,klev,nbtr) ! traceurs22 REALtend ! tendance par espece23 REALxlat(klon) ! latitudes pour chaque point24 REALpi25 cJE: 2014012026 REALhis_g2pgas(klon)27 REALhis_g2paer(klon)28 REALtendincm3(klon,klev)29 REAL tempvar(klon,klev)30 REALpplay(klon,klev)31 REALt_seri(klon,klev)32 REALtend2d(klon,klev)33 INTEGERid_prec,id_fine34 c 35 c------------------------- Scaling Parameter --------------------------36 c 37 cREAL scale_param_so4(klon) !Scaling parameter for sulfate10 IMPLICIT NONE 11 ! 12 INCLUDE "dimensions.h" 13 INCLUDE "chem.h" 14 INCLUDE "chem_spla.h" 15 INCLUDE "YOMCST.h" 16 INCLUDE "YOECUMF.h" 17 ! 18 REAL :: pdtphys 19 REAL :: zrho(klon,klev) 20 REAL :: zdz(klon,klev) 21 REAL :: tr_seri(klon,klev,nbtr) ! traceurs 22 REAL :: tend ! tendance par espece 23 REAL :: xlat(klon) ! latitudes pour chaque point 24 REAL :: pi 25 ! JE: 20140120 26 REAL :: his_g2pgas(klon) 27 REAL :: his_g2paer(klon) 28 REAL :: tendincm3(klon,klev) 29 REAL :: tempvar(klon,klev) 30 REAL :: pplay(klon,klev) 31 REAL :: t_seri(klon,klev) 32 REAL :: tend2d(klon,klev) 33 INTEGER :: id_prec,id_fine 34 ! 35 !------------------------- Scaling Parameter -------------------------- 36 ! 37 ! REAL scale_param_so4(klon) !Scaling parameter for sulfate 38 38 39 INTEGERi, k40 REALtau_chem !---chemical lifetime in s41 c 42 c------------------------- Variables to save --------------------------43 c 44 cnhl REAL fluxso4chem(klon,klev)45 cnhl REAL flux_sparam_sulf(klon,klev)39 INTEGER :: i, k 40 REAL :: tau_chem !---chemical lifetime in s 41 ! 42 !------------------------- Variables to save -------------------------- 43 ! 44 !nhl REAL fluxso4chem(klon,klev) 45 !nhl REAL flux_sparam_sulf(klon,klev) 46 46 47 c====================================================================== 48 pi=atan(1.)*4. 49 c 50 IF (id_prec>0 .AND. id_fine>0) THEN 51 DO k = 1, klev 52 DO i = 1, klon 53 c 54 c tau_chem=scale_param_so4(i)*86400.*(8.-5.*cos(xlat(i)*pi/180.)) !tchemfctn2 55 cnhl tau_chem=86400.*(8.-5.*cos(xlat(i)*pi/180.)) !tchemfctn2 56 tau_chem=86400.*(5.-4.*cos(xlat(i)*pi/180.)) ! 57 tend=tr_seri(i,k,id_prec)*(1.-exp(-pdtphys/tau_chem)) ! Sulfate production 58 cnhl tend=(1.-exp(-pdtphys/tau_chem)) 59 cnhl tend=scale_param_so4(i) !as this it works 60 c 61 tr_seri(i,k,id_prec) =tr_seri(i,k,id_prec) - tend 62 tr_seri(i,k,id_fine) =tr_seri(i,k,id_fine) + 63 . tend/RNAVO*masse_ammsulfate !--gAER/KgAir 64 tend2d(i,k)=tend 65 c 66 cnhl fluxso4chem(i,k) = tend/RNAVO*masse_ammsulfate 67 cnhl flux_sparam_sulf(i,k) = tend/RNAVO*masse_ammsulfate 68 ENDDO 69 ENDDO 70 47 !====================================================================== 48 pi=atan(1.)*4. 49 ! 50 IF (id_prec>0 .AND. id_fine>0) THEN 51 DO k = 1, klev 52 DO i = 1, klon 53 ! 54 ! tau_chem=scale_param_so4(i)*86400.*(8.-5.*cos(xlat(i)*pi/180.)) !tchemfctn2 55 !nhl tau_chem=86400.*(8.-5.*cos(xlat(i)*pi/180.)) !tchemfctn2 56 tau_chem=86400.*(5.-4.*cos(xlat(i)*pi/180.)) ! 57 tend=tr_seri(i,k,id_prec)*(1.-exp(-pdtphys/tau_chem)) ! Sulfate production 58 !nhl tend=(1.-exp(-pdtphys/tau_chem)) 59 !nhl tend=scale_param_so4(i) !as this it works 60 ! 61 tr_seri(i,k,id_prec) =tr_seri(i,k,id_prec) - tend 62 tr_seri(i,k,id_fine) =tr_seri(i,k,id_fine) + & 63 tend/RNAVO*masse_ammsulfate !--gAER/KgAir 64 tend2d(i,k)=tend 65 ! 66 !nhl fluxso4chem(i,k) = tend/RNAVO*masse_ammsulfate 67 !nhl flux_sparam_sulf(i,k) = tend/RNAVO*masse_ammsulfate 68 ENDDO 69 ENDDO 71 70 72 71 73 tempvar=tend2d74 CALL kg_to_cm3(pplay,t_seri,tempvar)75 tendincm3=tempvar76 72 77 DO k = 1, klev 78 DO i = 1, klon 73 tempvar=tend2d 74 CALL kg_to_cm3(pplay,t_seri,tempvar) 75 tendincm3=tempvar 79 76 80 c his_g2pgas(i) = his_g2pgas(i) + tendincm3(i,k)*1e6*zdz(i,k)/pdtphys 81 his_g2paer(i) = his_g2paer(i) + 82 . tendincm3(i,k)/RNAVO*masse_ammsulfate*1.e3* 83 . 1.e6*zdz(i,k)/pdtphys ! mg/m2/s 84 his_g2pgas(i) = his_g2paer(i)*masse_s/masse_ammsulfate ! mg-S/m2/s 77 DO k = 1, klev 78 DO i = 1, klon 85 79 86 ENDDO 87 ENDDO 88 ENDIF 80 ! his_g2pgas(i) = his_g2pgas(i) + tendincm3(i,k)*1e6*zdz(i,k)/pdtphys 81 his_g2paer(i) = his_g2paer(i) + & 82 tendincm3(i,k)/RNAVO*masse_ammsulfate*1.e3* & 83 1.e6*zdz(i,k)/pdtphys ! mg/m2/s 84 his_g2pgas(i) = his_g2paer(i)*masse_s/masse_ammsulfate ! mg-S/m2/s 89 85 90 c 91 RETURN 92 END 86 ENDDO 87 ENDDO 88 ENDIF 89 90 ! 91 RETURN 92 END SUBROUTINE gastoparticle -
LMDZ6/trunk/libf/phylmd/Dust/incloud_scav.f90
r5245 r5246 1 c Subroutine that calculates the effect of precipitation in scavenging 2 cWITHIN the cloud, for large scale as well as convective precipitation3 SUBROUTINE incloud_scav(lminmax,qmin,qmax,masse,henry,kk,prfl, 4 . psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys,5 .his_dhlsc,his_dhcon1,tr_seri)1 ! Subroutine that calculates the effect of precipitation in scavenging 2 ! WITHIN the cloud, for large scale as well as convective precipitation 3 SUBROUTINE incloud_scav(lminmax,qmin,qmax,masse,henry,kk,prfl, & 4 psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys, & 5 his_dhlsc,his_dhcon1,tr_seri) 6 6 7 8 9 7 USE dimphy 8 USE infotrac 9 USE indice_sol_mod 10 10 11 11 IMPLICIT NONE 12 12 13 14 15 16 13 INCLUDE "dimensions.h" 14 INCLUDE "chem.h" 15 INCLUDE "YOMCST.h" 16 INCLUDE "paramet.h" 17 17 18 c============================= INPUT =================================== 19 REAL qmin, qmax 20 REAL masse(nbtr) 21 REAL henry(nbtr) !--cste de Henry mol/l/atm 22 REAL kk(nbtr) !--coefficient de var avec T (K) 23 REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 24 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 25 REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 26 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 27 REAL zrho(klon,klev), zdz(klon,klev) 28 REAL t_seri(klon,klev) 29 LOGICAL lminmax 30 REAL pdtphys 31 ! REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 32 ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 33 c============================= OUTPUT ================================== 34 REAL tr_seri(klon,klev,nbtr) ! traceur 35 REAL aux_var1(klon,klev) ! traceur 36 REAL aux_var2(klon) ! traceur 37 REAL aux_var3(klon) ! traceur 38 REAL his_dhlsc(klon,nbtr) ! in-cloud scavenging lsc 39 REAL his_dhcon1(klon,nbtr) ! in-cloud scavenging con 40 c========================= LOCAL VARIABLES ============================= 41 INTEGER it, i, j 42 43 EXTERNAL minmaxqfi, inscav_spl 44 45 DO it=1, nbtr 46 c 47 DO i=1,klon 48 aux_var2(i)=his_dhlsc(i,it) 49 aux_var3(i)=his_dhcon1(i,it) 50 ENDDO 51 DO j=1,klev 52 DO i=1,klon 53 aux_var1(i,j)=tr_seri(i,j,it) 54 ENDDO 55 ENDDO 56 c 57 IF (lminmax) THEN 58 CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav') 59 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav') 60 ENDIF 61 c 62 cnhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 63 cnhl . prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it), 64 cnhl . his_dhlsc(1,it)) 65 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 66 . prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2) 67 c 68 IF (lminmax) THEN 69 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc') 70 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc') 71 ENDIF 72 c 73 c 74 c-scheme for convective in-cloud scavenging 75 c 76 cnhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 77 cnhl . pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it), 78 cnhl . his_dhcon1(1,it)) 79 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 80 . pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3) 81 c 82 IF (lminmax) THEN 83 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con') 84 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con') 85 ENDIF 86 c 87 DO j=1,klev 88 DO i=1,klon 89 tr_seri(i,j,it)=aux_var1(i,j) 90 ENDDO 91 ENDDO 92 DO i=1,klon 93 his_dhlsc(i,it)=aux_var2(i) 94 his_dhcon1(i,it)=aux_var3(i) 95 ENDDO 18 !============================= INPUT =================================== 19 REAL :: qmin, qmax 20 REAL :: masse(nbtr) 21 REAL :: henry(nbtr) !--cste de Henry mol/l/atm 22 REAL :: kk(nbtr) !--coefficient de var avec T (K) 23 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 24 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 25 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 26 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 27 REAL :: zrho(klon,klev), zdz(klon,klev) 28 REAL :: t_seri(klon,klev) 29 LOGICAL :: lminmax 30 REAL :: pdtphys 31 ! REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 32 ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 33 !============================= OUTPUT ================================== 34 REAL :: tr_seri(klon,klev,nbtr) ! traceur 35 REAL :: aux_var1(klon,klev) ! traceur 36 REAL :: aux_var2(klon) ! traceur 37 REAL :: aux_var3(klon) ! traceur 38 REAL :: his_dhlsc(klon,nbtr) ! in-cloud scavenging lsc 39 REAL :: his_dhcon1(klon,nbtr) ! in-cloud scavenging con 40 !========================= LOCAL VARIABLES ============================= 41 INTEGER :: it, i, j 96 42 97 c 98 ENDDO !--boucle sur it 43 EXTERNAL minmaxqfi, inscav_spl 99 44 100 END 45 DO it=1, nbtr 46 ! 47 DO i=1,klon 48 aux_var2(i)=his_dhlsc(i,it) 49 aux_var3(i)=his_dhcon1(i,it) 50 ENDDO 51 DO j=1,klev 52 DO i=1,klon 53 aux_var1(i,j)=tr_seri(i,j,it) 54 ENDDO 55 ENDDO 56 ! 57 IF (lminmax) THEN 58 CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav') 59 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav') 60 ENDIF 61 ! 62 !nhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 63 !nhl . prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it), 64 !nhl . his_dhlsc(1,it)) 65 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, & 66 prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2) 67 ! 68 IF (lminmax) THEN 69 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc') 70 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc') 71 ENDIF 72 ! 73 ! 74 !-scheme for convective in-cloud scavenging 75 ! 76 !nhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 77 !nhl . pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it), 78 !nhl . his_dhcon1(1,it)) 79 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, & 80 pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3) 81 ! 82 IF (lminmax) THEN 83 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con') 84 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con') 85 ENDIF 86 ! 87 DO j=1,klev 88 DO i=1,klon 89 tr_seri(i,j,it)=aux_var1(i,j) 90 ENDDO 91 ENDDO 92 DO i=1,klon 93 his_dhlsc(i,it)=aux_var2(i) 94 his_dhcon1(i,it)=aux_var3(i) 95 ENDDO 96 97 ! 98 ENDDO !--boucle sur it 99 100 END SUBROUTINE incloud_scav -
LMDZ6/trunk/libf/phylmd/Dust/incloud_scav_lsc.f90
r5245 r5246 1 c Subroutine that calculates the effect of precipitation in scavenging 2 cWITHIN the cloud, for large scale as well as convective precipitation3 SUBROUTINE incloud_scav_lsc(lminmax,qmin,qmax,masse,henry,kk,prfl, 4 . psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys,5 .his_dhlsc,his_dhcon1,tr_seri)1 ! Subroutine that calculates the effect of precipitation in scavenging 2 ! WITHIN the cloud, for large scale as well as convective precipitation 3 SUBROUTINE incloud_scav_lsc(lminmax,qmin,qmax,masse,henry,kk,prfl, & 4 psfl,pmflxr,pmflxs,zrho,zdz,t_seri,pdtphys, & 5 his_dhlsc,his_dhcon1,tr_seri) 6 6 7 8 9 7 USE dimphy 8 USE infotrac 9 USE indice_sol_mod 10 10 11 11 IMPLICIT NONE 12 12 13 14 15 16 13 INCLUDE "dimensions.h" 14 INCLUDE "chem.h" 15 INCLUDE "YOMCST.h" 16 INCLUDE "paramet.h" 17 17 18 c============================= INPUT =================================== 19 REAL qmin, qmax 20 REAL masse(nbtr) 21 REAL henry(nbtr) !--cste de Henry mol/l/atm 22 REAL kk(nbtr) !--coefficient de var avec T (K) 23 REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 24 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 25 REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 26 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 27 REAL zrho(klon,klev), zdz(klon,klev) 28 REAL t_seri(klon,klev) 29 LOGICAL lminmax 30 REAL pdtphys 31 ! REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 32 ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 33 c============================= OUTPUT ================================== 34 REAL tr_seri(klon,klev,nbtr) ! traceur 35 REAL aux_var1(klon,klev) ! traceur 36 REAL aux_var2(klon) ! traceur 37 REAL aux_var3(klon) ! traceur 38 REAL his_dhlsc(klon,nbtr) ! in-cloud scavenging lsc 39 REAL his_dhcon1(klon,nbtr) ! in-cloud scavenging con 40 c========================= LOCAL VARIABLES ============================= 41 INTEGER it, i, j 42 43 EXTERNAL minmaxqfi, inscav_spl 44 DO it=1, nbtr 45 c 46 DO i=1,klon 47 aux_var2(i)=his_dhlsc(i,it) 48 aux_var3(i)=his_dhcon1(i,it) 49 ENDDO 50 DO j=1,klev 51 DO i=1,klon 52 aux_var1(i,j)=tr_seri(i,j,it) 53 ENDDO 54 ENDDO 55 c 56 IF (lminmax) THEN 57 CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav') 58 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav') 59 ENDIF 60 c 61 cnhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 62 cnhl . prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it), 63 cnhl . his_dhlsc(1,it)) 64 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 65 . prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2) 66 c 67 IF (lminmax) THEN 68 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc') 69 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc') 70 ENDIF 71 c 72 c 73 c-scheme for convective in-cloud scavenging 74 c 75 cnhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 76 cnhl . pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it), 77 cnhl . his_dhcon1(1,it)) 18 !============================= INPUT =================================== 19 REAL :: qmin, qmax 20 REAL :: masse(nbtr) 21 REAL :: henry(nbtr) !--cste de Henry mol/l/atm 22 REAL :: kk(nbtr) !--coefficient de var avec T (K) 23 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 24 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 25 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 26 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 27 REAL :: zrho(klon,klev), zdz(klon,klev) 28 REAL :: t_seri(klon,klev) 29 LOGICAL :: lminmax 30 REAL :: pdtphys 31 ! REAL prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale ! Titane 32 ! REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection ! Titane 33 !============================= OUTPUT ================================== 34 REAL :: tr_seri(klon,klev,nbtr) ! traceur 35 REAL :: aux_var1(klon,klev) ! traceur 36 REAL :: aux_var2(klon) ! traceur 37 REAL :: aux_var3(klon) ! traceur 38 REAL :: his_dhlsc(klon,nbtr) ! in-cloud scavenging lsc 39 REAL :: his_dhcon1(klon,nbtr) ! in-cloud scavenging con 40 !========================= LOCAL VARIABLES ============================= 41 INTEGER :: it, i, j 78 42 79 c print *,'JE inscav0' 80 c IF (iflag_con.LT.3) THEN 81 c 82 c print *,'JE inscav1' 83 c print *,'iflag_con',iflag_con 84 c CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 85 c . pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3) 86 c 87 cc 88 c IF (lminmax) THEN 89 c CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con') 90 ccnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con') 91 c 92 c ENDIF 93 c 94 c ENDIF ! iflag_con 43 EXTERNAL minmaxqfi, inscav_spl 44 DO it=1, nbtr 45 ! 46 DO i=1,klon 47 aux_var2(i)=his_dhlsc(i,it) 48 aux_var3(i)=his_dhcon1(i,it) 49 ENDDO 50 DO j=1,klev 51 DO i=1,klon 52 aux_var1(i,j)=tr_seri(i,j,it) 53 ENDDO 54 ENDDO 55 ! 56 IF (lminmax) THEN 57 CALL minmaxqfi(aux_var1,qmin,qmax,'avt inscav') 58 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'avt inscav') 59 ENDIF 60 ! 61 !nhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, 62 !nhl . prfl,psfl,zrho,zdz,t_seri,tr_seri(1,1,it), 63 !nhl . his_dhlsc(1,it)) 64 CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),0.5e-3, & 65 prfl,psfl,zrho,zdz,t_seri,aux_var1,aux_var2) 66 ! 67 IF (lminmax) THEN 68 CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide lsc') 69 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide lsc') 70 ENDIF 71 ! 72 ! 73 !-scheme for convective in-cloud scavenging 74 ! 75 !nhl CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 76 !nhl . pmflxr,pmflxs,zrho,zdz,t_seri,tr_seri(1,1,it), 77 !nhl . his_dhcon1(1,it)) 95 78 96 c 97 c print *,'JE inscav2' 98 DO j=1,klev 99 DO i=1,klon 100 tr_seri(i,j,it)=aux_var1(i,j) 101 ENDDO 102 ENDDO 103 DO i=1,klon 104 his_dhlsc(i,it)=aux_var2(i) 105 his_dhcon1(i,it)=aux_var3(i) 106 ENDDO 79 ! print *,'JE inscav0' 80 ! IF (iflag_con.LT.3) THEN 81 ! 82 ! print *,'JE inscav1' 83 ! print *,'iflag_con',iflag_con 84 ! CALL inscav_spl(pdtphys,it,masse(it),henry(it),kk(it),1.e-3, 85 ! . pmflxr,pmflxs,zrho,zdz,t_seri,aux_var1,aux_var3) 86 ! 87 !c 88 ! IF (lminmax) THEN 89 ! CALL minmaxqfi(aux_var1,qmin,qmax,'depot humide con') 90 !cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'depot humide con') 91 ! 92 ! ENDIF 93 ! 94 ! ENDIF ! iflag_con 107 95 108 c 109 ENDDO !--boucle sur it 96 ! 97 ! print *,'JE inscav2' 98 DO j=1,klev 99 DO i=1,klon 100 tr_seri(i,j,it)=aux_var1(i,j) 101 ENDDO 102 ENDDO 103 DO i=1,klon 104 his_dhlsc(i,it)=aux_var2(i) 105 his_dhcon1(i,it)=aux_var3(i) 106 ENDDO 110 107 111 c print *,'JE inscav3' 112 END 108 ! 109 ENDDO !--boucle sur it 110 111 ! print *,'JE inscav3' 112 END SUBROUTINE incloud_scav_lsc -
LMDZ6/trunk/libf/phylmd/Dust/inscav_spl.f90
r5245 r5246 1 SUBROUTINE inscav_spl(pdtime,it,masse,henry,kk,qliq, 2 . flxr,flxs,zrho,zdz,t,x,3 . his_dh)4 5 IMPLICIT NONE6 c=====================================================================7 cObjet : depot humide de traceurs8 cDate : mars 19989 c Auteur: O. Boucher (LOA) 10 c=====================================================================11 c 12 13 14 15 INCLUDE "YOECUMF.h"16 c 17 INTEGERit18 REALpdtime ! pas de temps (s)19 REALmasse ! molar mass (except for BC/OM/IF/DUST=Nav)20 REALhenry ! constante de Henry en mol/l/atm21 REALkk ! coefficient de dependence en T (K)22 REALqliq ! contenu en eau liquide dans le nuage (kg/kg)23 !REAL flxr(klon,klev+1) ! flux precipitant de pluie24 !REAL flxs(klon,klev+1) ! flux precipitant de neige25 REALflxr(klon,klev) ! flux precipitant de pluie ! Titane26 REALflxs(klon,klev) ! flux precipitant de neige ! Titane27 REALflxr_aux(klon,klev+1)28 REALflxs_aux(klon,klev+1)29 REALzrho(klon,klev)30 REALzdz(klon,klev)31 REALt(klon,klev)32 REAL x(klon,klev) ! q de traceur33 REALhis_dh(klon) ! tendance de traceur integre verticalement34 c 35 c--variables locales 36 INTEGERi, k37 c 38 REALdx ! tendance de traceur39 REALf_a !--rapport de la phase aqueuse a la phase gazeuse40 REALbeta !--taux de conversion de l'eau en pluie41 REALhenry_t !--constante de Henry a T t (mol/l/atm)42 REALscav(klon,klev) !--fraction aqueuse du constituant43 REAL K1, K2, ph, frac44 REAL frac_gas, frac_aer !-cste pour la reevaporation45 46 c---cste de dissolution pour le depot humide47 REALfrac_fine_scav,frac_coar_scav48 c---added by nhl49 REALaux_cte1 SUBROUTINE inscav_spl(pdtime,it,masse,henry,kk,qliq, & 2 flxr,flxs,zrho,zdz,t,x, & 3 his_dh) 4 USE dimphy 5 IMPLICIT NONE 6 !===================================================================== 7 ! Objet : depot humide de traceurs 8 ! Date : mars 1998 9 ! Auteur: O. Boucher (LOA) 10 !===================================================================== 11 ! 12 INCLUDE "dimensions.h" 13 INCLUDE "chem.h" 14 INCLUDE "YOMCST.h" 15 INCLUDE "YOECUMF.h" 16 ! 17 INTEGER :: it 18 REAL :: pdtime ! pas de temps (s) 19 REAL :: masse ! molar mass (except for BC/OM/IF/DUST=Nav) 20 REAL :: henry ! constante de Henry en mol/l/atm 21 REAL :: kk ! coefficient de dependence en T (K) 22 REAL :: qliq ! contenu en eau liquide dans le nuage (kg/kg) 23 ! REAL flxr(klon,klev+1) ! flux precipitant de pluie 24 ! REAL flxs(klon,klev+1) ! flux precipitant de neige 25 REAL :: flxr(klon,klev) ! flux precipitant de pluie ! Titane 26 REAL :: flxs(klon,klev) ! flux precipitant de neige ! Titane 27 REAL :: flxr_aux(klon,klev+1) 28 REAL :: flxs_aux(klon,klev+1) 29 REAL :: zrho(klon,klev) 30 REAL :: zdz(klon,klev) 31 REAL :: t(klon,klev) 32 REAL :: x(klon,klev) ! q de traceur 33 REAL :: his_dh(klon) ! tendance de traceur integre verticalement 34 ! 35 !--variables locales 36 INTEGER :: i, k 37 ! 38 REAL :: dx ! tendance de traceur 39 REAL :: f_a !--rapport de la phase aqueuse a la phase gazeuse 40 REAL :: beta !--taux de conversion de l'eau en pluie 41 REAL :: henry_t !--constante de Henry a T t (mol/l/atm) 42 REAL :: scav(klon,klev) !--fraction aqueuse du constituant 43 REAL :: K1, K2, ph, frac 44 REAL :: frac_gas, frac_aer !-cste pour la reevaporation 45 PARAMETER (ph=5., frac_gas=1.0, frac_aer=0.5) 46 !---cste de dissolution pour le depot humide 47 REAL :: frac_fine_scav,frac_coar_scav 48 !---added by nhl 49 REAL :: aux_cte 50 50 51 52 51 PARAMETER (frac_fine_scav=0.7) 52 PARAMETER (frac_coar_scav=0.7) 53 53 54 c--101.325 m3/l x Pa/atm55 c--R Pa.m3/mol/K56 c 57 c------------------------------------------58 c 59 cnhl IF (it.EQ.2.OR.it.EQ.3) THEN !--aerosol ! AS IT WAS FIRST60 61 62 63 64 65 c 66 IF (it.EQ.1) THEN67 68 DO i=1, klon69 70 71 72 73 74 75 ENDDO76 77 78 79 DO i=1, klon80 81 ENDDO82 83 84 85 DO i=1, klon86 87 ENDDO88 ENDDO89 90 91 DO i=1, klon92 93 ENDDO94 ENDDO95 ELSE96 97 98 99 c 100 ! NHL101 ! Auxiliary variables defined to deal with the fact that precipitation102 ! fluxes are defined on klev levels only.103 ! NHL104 !105 106 107 108 109 DO k=klev, 1, -1110 DO i=1, klon111 c--scavenging112 113 114 115 116 117 his_dh(i)=his_dh(i)-dx/RNAVO*118 .masse*1.e3*1.e6*zdz(i,k)/pdtime !--mgS/m2/s119 c--reevaporation120 121 122 123 124 125 126 127 128 129 ! funny line for TL/AD130 ! AD test works without (x) and for xd = dxd*1.e5 : 2.79051851638 times the 0.131 ! AD test does not work with the line : 754592404.083 times the 0.132 ! problem seems to be linked to the largest dx wrt x133 !x(i, k) = x(i, k) + dx134 !x(i, k) = x(i, k) + dx ! THIS LINE WAS COMMENTED OUT ORIGINALY !nhl135 136 ENDDO137 138 c 139 RETURN140 END 54 !--101.325 m3/l x Pa/atm 55 !--R Pa.m3/mol/K 56 ! 57 !------------------------------------------ 58 ! 59 !nhl IF (it.EQ.2.OR.it.EQ.3) THEN !--aerosol ! AS IT WAS FIRST 60 IF (it.EQ.2.OR.it.EQ.3.OR.it.EQ.4) THEN !--aerosol 61 frac=frac_aer 62 ELSE !--gas 63 frac=frac_gas 64 ENDIF 65 ! 66 IF (it.EQ.1) THEN 67 DO k=1, klev 68 DO i=1, klon 69 henry_t=henry*exp(-kk*(1./298.-1./t(i,k))) !--mol/l/atm 70 K1=1.2e-2*exp(-2010*(1/298.-1/t(i,k))) 71 K2=6.6e-8*exp(-1510*(1/298.-1/t(i,k))) 72 henry_t=henry_t*(1 + K1/10.**(-ph) + K1*K2/(10.**(-ph))**2) 73 f_a=henry_t/101.325*R*t(i,k)*qliq*zrho(i,k)/rho_water 74 scav(i,k)=f_a/(1.+f_a) 75 ENDDO 76 ENDDO 77 ELSEIF (it.EQ.2) THEN 78 DO k=1, klev 79 DO i=1, klon 80 scav(i,k)=frac_fine_scav 81 ENDDO 82 ENDDO 83 ELSEIF (it.EQ.3) THEN 84 DO k=1, klev 85 DO i=1, klon 86 scav(i,k)=frac_coar_scav 87 ENDDO 88 ENDDO 89 ELSEIF (it.EQ.4) THEN 90 DO k=1, klev 91 DO i=1, klon 92 scav(i,k)=frac_coar_scav 93 ENDDO 94 ENDDO 95 ELSE 96 PRINT *,'it non pris en compte' 97 STOP 98 ENDIF 99 ! 100 ! NHL 101 ! Auxiliary variables defined to deal with the fact that precipitation 102 ! fluxes are defined on klev levels only. 103 ! NHL 104 ! 105 flxr_aux(:,klev+1)=0.0 106 flxs_aux(:,klev+1)=0.0 107 flxr_aux(:,1:klev)=flxr(:,:) 108 flxs_aux(:,1:klev)=flxs(:,:) 109 DO k=klev, 1, -1 110 DO i=1, klon 111 !--scavenging 112 beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1) 113 beta=beta/zdz(i,k)/qliq/zrho(i,k) 114 beta=MAX(0.0,beta) 115 dx=x(i,k)*(exp(-scav(i,k)*beta*pdtime)-1.) 116 x(i,k)=x(i,k)+dx 117 his_dh(i)=his_dh(i)-dx/RNAVO* & 118 masse*1.e3*1.e6*zdz(i,k)/pdtime !--mgS/m2/s 119 !--reevaporation 120 beta=flxr_aux(i,k)-flxr_aux(i,k+1)+flxs_aux(i,k)-flxs_aux(i,k+1) 121 IF (beta.LT.0.) beta=beta/(flxr_aux(i,k+1)+flxs_aux(i,k+1)) 122 IF (flxr_aux(i,k)+flxs_aux(i,k).EQ.0) THEN !--reevaporation totale 123 beta=MIN(MAX(0.0,-beta),1.0) 124 ELSE !--reevaporation non totale pour aerosols 125 ! !print *,'FRAC USED IN INSCAV_SPL' 126 beta=MIN(MAX(0.0,-beta)*frac,1.0) 127 ENDIF 128 dx=beta*his_dh(i)*RNAVO/masse/1.e3/1.e6/zdz(i,k)*pdtime !ORIG LINE 129 ! funny line for TL/AD 130 ! AD test works without (x) and for xd = dxd*1.e5 : 2.79051851638 times the 0. 131 ! AD test does not work with the line : 754592404.083 times the 0. 132 ! problem seems to be linked to the largest dx wrt x 133 ! x(i, k) = x(i, k) + dx 134 ! x(i, k) = x(i, k) + dx ! THIS LINE WAS COMMENTED OUT ORIGINALY !nhl 135 his_dh(i)=(1.-beta)*his_dh(i) 136 ENDDO 137 ENDDO 138 ! 139 RETURN 140 END SUBROUTINE inscav_spl -
LMDZ6/trunk/libf/phylmd/Dust/kg_to_cm3.f90
r5245 r5246 1 2 c 3 4 5 6 c 7 8 9 c 10 REALt_seri(klon,klev), pplay(klon,klev)11 REALtr_seri(klon,klev)12 REALzrho13 INTEGERi, k14 c 15 16 17 18 19 20 21 c 22 END 1 SUBROUTINE kg_to_cm3(pplay,t_seri,tr_seri) 2 ! 3 USE dimphy 4 USE infotrac 5 IMPLICIT NONE 6 ! 7 INCLUDE "dimensions.h" 8 INCLUDE "YOMCST.h" 9 ! 10 REAL :: t_seri(klon,klev), pplay(klon,klev) 11 REAL :: tr_seri(klon,klev) 12 REAL :: zrho 13 INTEGER :: i, k 14 ! 15 DO k = 1, klev 16 DO i = 1, klon 17 zrho=pplay(i,k)/t_seri(i,k)/RD 18 tr_seri(i,k)=tr_seri(i,k)/1.e6*zrho 19 ENDDO 20 ENDDO 21 ! 22 END SUBROUTINE kg_to_cm3 -
LMDZ6/trunk/libf/phylmd/Dust/minmaxqfi2.f90
r5245 r5246 1 2 c 3 4 5 1 subroutine minmaxqfi2(zq,qmin,qmax,comment) 2 ! 3 USE dimphy 4 USE infotrac 5 INCLUDE "dimensions.h" 6 6 7 !character*20 comment8 character*(*)comment9 realqmin,qmax10 realzq(klon,klev)7 ! character*20 comment 8 character(len=*) :: comment 9 real :: qmin,qmax 10 real :: zq(klon,klev) 11 11 12 integerijmin, lmin, ijlmin13 integerijmax, lmax, ijlmax12 integer :: ijmin, lmin, ijlmin 13 integer :: ijmax, lmax, ijlmax 14 14 15 integerismin,ismax15 integer :: ismin,ismax 16 16 17 18 19 20 17 ijlmin=ismin(klon*klev,zq,1) 18 lmin=(ijlmin-1)/klon+1 19 ijmin=ijlmin-(lmin-1)*klon 20 zqmin=zq(ijmin,lmin) 21 21 22 ijlmax=ismax(klon*klev,zq,1) 23 lmax=(ijlmax-1)/klon+1 24 ijmax=ijlmax-(lmax-1)*klon 25 zqmax=zq(ijmax,lmax) 26 27 if(zqmin.lt.qmin.or.zqmax.gt.qmax) 28 s write(*,9999) comment, 29 s ijmin,lmin,zqmin,ijmax,lmax,zqmax 22 ijlmax=ismax(klon*klev,zq,1) 23 lmax=(ijlmax-1)/klon+1 24 ijmax=ijlmax-(lmax-1)*klon 25 zqmax=zq(ijmax,lmax) 30 26 31 return 32 9999 format(a20,2(' q(',i4,',',i2,')=',e12.5)) 33 end 27 if(zqmin.lt.qmin.or.zqmax.gt.qmax) & 28 write(*,9999) comment, & 29 ijmin,lmin,zqmin,ijmax,lmax,zqmax 30 31 return 32 9999 format(a20,2(' q(',i4,',',i2,')=',e12.5)) 33 end subroutine minmaxqfi2 -
LMDZ6/trunk/libf/phylmd/Dust/minmaxsource.f90
r5245 r5246 1 1 subroutine minmaxsource(zq,qmin,qmax,comment) 2 2 3 4 3 USE dimphy 4 USE infotrac 5 5 6 6 INCLUDE "dimensions.h" 7 7 8 !character*20 comment9 character*(*)comment10 realqmin,qmax11 realzq(klon,nbtr)8 ! character*20 comment 9 character(len=*) :: comment 10 real :: qmin,qmax 11 real :: zq(klon,nbtr) 12 12 13 integerijmin, lmin, ijlmin14 integerijmax, lmax, ijlmax13 integer :: ijmin, lmin, ijlmin 14 integer :: ijmax, lmax, ijlmax 15 15 16 integerismin,ismax16 integer :: ismin,ismax 17 17 18 19 20 21 18 ijlmin=ismin(klon*nbtr,zq,1) 19 lmin=(ijlmin-1)/klon+1 20 ijmin=ijlmin-(lmin-1)*klon 21 zqmin=zq(ijmin,lmin) 22 22 23 24 25 26 23 ijlmax=ismax(klon*nbtr,zq,1) 24 lmax=(ijlmax-1)/klon+1 25 ijmax=ijlmax-(lmax-1)*klon 26 zqmax=zq(ijmax,lmax) 27 27 28 if(zqmin.lt.qmin.or.zqmax.gt.qmax)29 s write(*,9999) comment,30 sijmin,lmin,zqmin,ijmax,lmax,zqmax28 if(zqmin.lt.qmin.or.zqmax.gt.qmax) & 29 write(*,9999) comment, & 30 ijmin,lmin,zqmin,ijmax,lmax,zqmax 31 31 32 33 9999 format(a20,2(' q(',i4,',',i2,')=',e12.5))34 end 32 return 33 9999 format(a20,2(' q(',i4,',',i2,')=',e12.5)) 34 end subroutine minmaxsource -
LMDZ6/trunk/libf/phylmd/Dust/neutral.f90
r5245 r5246 1 c*********************************************************************** 2 subroutine neutral(u10_mps,ustar_mps,obklen_m, 3 + u10n_mps)4 c-----------------------------------------------------------------------5 csubroutine to compute u10 neutral wind speed6 cinputs7 cu10_mps - wind speed at 10 m (m/s)8 custar_mps - friction velocity (m/s)9 cobklen_m - monin-obukhov length scale (m)10 coutputs11 cu10n_mps - wind speed at 10 m under neutral conditions (m/s)12 cfollowing code assumes reference height Z is 10m, consistent with use13 cof u10 and u10_neutral. If not, code14 cshould be changed so that constants of 50. and 160. in equations15 cbelow are changed to -5 * Z and -16 * Z respectively.16 c Reference: G. L. Geernaert. 'Bulk parameterizations for the 17 cwind stress and heat fluxes,' in Surface Waves and Fluxes, Vol. I,18 cCurrent Theory, Geernaert and W.J. Plant, editors, Kluwer Academic19 cPublishers, Boston, MA, 1990.20 csubroutine written Feb 2001 by eg chapman21 cadapted to LMD-ZT by E. Cosme 31080122 cFollowing Will Shaw (PNL, Seattle) the theory applied for flux23 ccalculation with the scheme of Nightingale et al. (2000) does not24 chold anymore when -1<obklen<20. In this case, u10n is set to 0,25 cso that the transfer velocity computed in nightingale.F will also26 cbe 0. The flux is then set to 0.27 c----------------------------------------------------------------------28 c 29 30 31 c 32 realu10_mps(klon),ustar_mps(klon),obklen_m(klon)33 realu10n_mps(klon)34 realpi,von_karman35 cparameter (pi = 3.141592653589793, von_karman = 0.4)36 cpour etre coherent avec vk de bl_for_dms.F37 parameter (pi = 3.141592653589793, von_karman = 0.35)38 c 39 realphi, phi_inv, phi_inv_sq, f1, f2, f3, dum1, psi40 integeri1 !*********************************************************************** 2 subroutine neutral(u10_mps,ustar_mps,obklen_m, & 3 u10n_mps ) 4 !----------------------------------------------------------------------- 5 ! subroutine to compute u10 neutral wind speed 6 ! inputs 7 ! u10_mps - wind speed at 10 m (m/s) 8 ! ustar_mps - friction velocity (m/s) 9 ! obklen_m - monin-obukhov length scale (m) 10 ! outputs 11 ! u10n_mps - wind speed at 10 m under neutral conditions (m/s) 12 ! following code assumes reference height Z is 10m, consistent with use 13 ! of u10 and u10_neutral. If not, code 14 ! should be changed so that constants of 50. and 160. in equations 15 ! below are changed to -5 * Z and -16 * Z respectively. 16 ! Reference: G. L. Geernaert. 'Bulk parameterizations for the 17 ! wind stress and heat fluxes,' in Surface Waves and Fluxes, Vol. I, 18 ! Current Theory, Geernaert and W.J. Plant, editors, Kluwer Academic 19 ! Publishers, Boston, MA, 1990. 20 ! subroutine written Feb 2001 by eg chapman 21 ! adapted to LMD-ZT by E. Cosme 310801 22 ! Following Will Shaw (PNL, Seattle) the theory applied for flux 23 ! calculation with the scheme of Nightingale et al. (2000) does not 24 ! hold anymore when -1<obklen<20. In this case, u10n is set to 0, 25 ! so that the transfer velocity computed in nightingale.F will also 26 ! be 0. The flux is then set to 0. 27 !---------------------------------------------------------------------- 28 ! 29 USE dimphy 30 INCLUDE "dimensions.h" 31 ! 32 real :: u10_mps(klon),ustar_mps(klon),obklen_m(klon) 33 real :: u10n_mps(klon) 34 real :: pi,von_karman 35 ! parameter (pi = 3.141592653589793, von_karman = 0.4) 36 ! pour etre coherent avec vk de bl_for_dms.F 37 parameter (pi = 3.141592653589793, von_karman = 0.35) 38 ! 39 real :: phi, phi_inv, phi_inv_sq, f1, f2, f3, dum1, psi 40 integer :: i 41 41 42 42 43 44 43 psi = 0. 44 do i=1,klon 45 45 46 if (u10_mps(i) .lt. 0.) u10_mps(i) = 0.0 47 48 if (obklen_m(i) .lt. 0.) then 49 phi = (1. - 160./obklen_m(i))**(-0.25) 50 phi_inv = 1./phi 51 phi_inv_sq = 1./phi * 1./phi 52 f1 = (1. + phi_inv) / 2. 53 f2 = (1. + phi_inv_sq)/2. 54 c following to avoid numerical overruns. recall tan(90deg)=infinity 55 dum1 = min (1.e24, phi_inv) 56 f3 = atan(dum1) 57 psi = 2.*log(f1) + log(f2) - 2.*f3 + pi/2. 58 else if (obklen_m(i) .gt. 0.) then 59 psi = -50. / obklen_m(i) 60 end if 46 if (u10_mps(i) .lt. 0.) u10_mps(i) = 0.0 61 47 62 u10n_mps(i) = u10_mps(i) + (ustar_mps(i) * psi /von_karman ) 63 c u10n set to 0. if -1 < obklen < 20 64 if ((obklen_m(i).gt.-1.).and.(obklen_m(i).lt.20.)) then 65 u10n_mps(i) = 0. 66 endif 67 if (u10n_mps(i) .lt. 0.) u10n_mps(i) = 0.0 48 if (obklen_m(i) .lt. 0.) then 49 phi = (1. - 160./obklen_m(i))**(-0.25) 50 phi_inv = 1./phi 51 phi_inv_sq = 1./phi * 1./phi 52 f1 = (1. + phi_inv) / 2. 53 f2 = (1. + phi_inv_sq)/2. 54 ! following to avoid numerical overruns. recall tan(90deg)=infinity 55 dum1 = min (1.e24, phi_inv) 56 f3 = atan(dum1) 57 psi = 2.*log(f1) + log(f2) - 2.*f3 + pi/2. 58 else if (obklen_m(i) .gt. 0.) then 59 psi = -50. / obklen_m(i) 60 end if 68 61 69 enddo 70 return 71 end 72 c*********************************************************************** 62 u10n_mps(i) = u10_mps(i) + (ustar_mps(i) * psi /von_karman ) 63 ! u10n set to 0. if -1 < obklen < 20 64 if ((obklen_m(i).gt.-1.).and.(obklen_m(i).lt.20.)) then 65 u10n_mps(i) = 0. 66 endif 67 if (u10n_mps(i) .lt. 0.) u10n_mps(i) = 0.0 68 69 enddo 70 return 71 end subroutine neutral 72 !*********************************************************************** -
LMDZ6/trunk/libf/phylmd/Dust/nightingale.f90
r5245 r5246 1 SUBROUTINE nightingale(u, v, u_10m, v_10m, paprs, pplay, 2 . cdragh, cdragm, t, q, ftsol, tsol,3 .pctsrf, lmt_dmsconc, lmt_dms)4 c 5 USE dimphy6 7 IMPLICIT NONE8 c 9 10 11 c 12 REALu(klon,klev), v(klon,klev)13 REALu_10m(klon), v_10m(klon)14 REALftsol(klon,nbsrf)15 REALtsol(klon)16 REALpaprs(klon,klev+1), pplay(klon,klev)17 REALt(klon,klev)18 REALq(klon,klev)19 REALcdragh(klon), cdragm(klon)20 REALpctsrf(klon,nbsrf)21 REALlmt_dmsconc(klon) ! concentration oceanique DMS22 REALlmt_dms(klon) ! flux de DMS23 c 24 REALustar(klon), obklen(klon)25 REALu10(klon), u10n(klon)26 REALtvelocity, schmidt_corr27 REALt1, t2, t3, t4, viscosity_kin, diffusivity, schmidt28 INTEGERi29 c 30 CALL bl_for_dms(u, v, paprs, pplay, cdragh, cdragm,31 .t, q, tsol, ustar, obklen)32 c 33 34 35 36 c 37 38 c 39 40 c 41 ctvelocity - transfer velocity, also known as kw (cm/s)42 cschmidt_corr - Schmidt number correction factor (dimensionless)43 cReference: Nightingale, P.D., G. Malin, C. S. Law, J. J. Watson, P.S. Liss44 c M. I. Liddicoat, J. Boutin, R.C. Upstill-Goddard. 'In situ evaluation 45 c of air-sea gas exchange parameterizations using conservative and 46 cvolatile tracers.' Glob. Biogeochem. Cycles, 14:373-387, 2000.47 c compute transfer velocity using u10neutral 48 c 49 50 c 51 cabove expression gives tvelocity in cm/hr. convert to cm/s. 1hr =3600 sec1 SUBROUTINE nightingale(u, v, u_10m, v_10m, paprs, pplay, & 2 cdragh, cdragm, t, q, ftsol, tsol, & 3 pctsrf, lmt_dmsconc, lmt_dms) 4 ! 5 USE dimphy 6 USE indice_sol_mod 7 IMPLICIT NONE 8 ! 9 INCLUDE "dimensions.h" 10 INCLUDE "YOMCST.h" 11 ! 12 REAL :: u(klon,klev), v(klon,klev) 13 REAL :: u_10m(klon), v_10m(klon) 14 REAL :: ftsol(klon,nbsrf) 15 REAL :: tsol(klon) 16 REAL :: paprs(klon,klev+1), pplay(klon,klev) 17 REAL :: t(klon,klev) 18 REAL :: q(klon,klev) 19 REAL :: cdragh(klon), cdragm(klon) 20 REAL :: pctsrf(klon,nbsrf) 21 REAL :: lmt_dmsconc(klon) ! concentration oceanique DMS 22 REAL :: lmt_dms(klon) ! flux de DMS 23 ! 24 REAL :: ustar(klon), obklen(klon) 25 REAL :: u10(klon), u10n(klon) 26 REAL :: tvelocity, schmidt_corr 27 REAL :: t1, t2, t3, t4, viscosity_kin, diffusivity, schmidt 28 INTEGER :: i 29 ! 30 CALL bl_for_dms(u, v, paprs, pplay, cdragh, cdragm, & 31 t, q, tsol, ustar, obklen) 32 ! 33 DO i=1,klon 34 u10(i)=SQRT(u_10m(i)**2+v_10m(i)**2) 35 ENDDO 36 ! 37 CALL neutral(u10, ustar, obklen, u10n) 38 ! 39 DO i=1,klon 40 ! 41 ! tvelocity - transfer velocity, also known as kw (cm/s) 42 ! schmidt_corr - Schmidt number correction factor (dimensionless) 43 ! Reference: Nightingale, P.D., G. Malin, C. S. Law, J. J. Watson, P.S. Liss 44 ! M. I. Liddicoat, J. Boutin, R.C. Upstill-Goddard. 'In situ evaluation 45 ! of air-sea gas exchange parameterizations using conservative and 46 ! volatile tracers.' Glob. Biogeochem. Cycles, 14:373-387, 2000. 47 ! compute transfer velocity using u10neutral 48 ! 49 tvelocity = 0.222*u10n(i)*u10n(i) + 0.333*u10n(i) 50 ! 51 ! above expression gives tvelocity in cm/hr. convert to cm/s. 1hr =3600 sec 52 52 53 tvelocity = tvelocity / 3600.53 tvelocity = tvelocity / 3600. 54 54 55 c compute the correction factor, which for Nightingale parameterization is 56 c based on how different the schmidt number is from 600. 57 ccorrection factor based on temperature in Kelvin. good58 conly for t<=30 deg C. for temperatures above that, set correction factor59 cequal to value at 30 deg C.55 ! compute the correction factor, which for Nightingale parameterization is 56 ! based on how different the schmidt number is from 600. 57 ! correction factor based on temperature in Kelvin. good 58 ! only for t<=30 deg C. for temperatures above that, set correction factor 59 ! equal to value at 30 deg C. 60 60 61 62 t1 = ftsol(i,is_oce)63 64 65 ENDIF61 IF (ftsol(i,is_oce) .LE. 303.15) THEN 62 t1 = ftsol(i,is_oce) 63 ELSE 64 t1 = 303.15 65 ENDIF 66 66 67 68 69 70 viscosity_kin = 3.0363e-9*t4 - 3.655198e-6*t3 + 1.65333e-3*t271 +- 3.332083e-1*t1 + 25.2681972 73 74 schmidt_corr = (schmidt/600.)**(-.5)75 c 76 lmt_dms(i) = tvelocity * pctsrf(i,is_oce)77 .* lmt_dmsconc(i)/1.0e12 * schmidt_corr * RNAVO78 c 79 80 c 81 82 c 83 END 67 t2 = t1 * t1 68 t3 = t2 * t1 69 t4 = t3 * t1 70 viscosity_kin = 3.0363e-9*t4 - 3.655198e-6*t3 + 1.65333e-3*t2 & 71 - 3.332083e-1*t1 + 25.26819 72 diffusivity = 0.01922 * exp(-2177.1/t1) 73 schmidt = viscosity_kin / diffusivity 74 schmidt_corr = (schmidt/600.)**(-.5) 75 ! 76 lmt_dms(i) = tvelocity * pctsrf(i,is_oce) & 77 * lmt_dmsconc(i)/1.0e12 * schmidt_corr * RNAVO 78 ! 79 IF (lmt_dmsconc(i).LE.1.e-20) lmt_dms(i)=0.0 80 ! 81 ENDDO 82 ! 83 END SUBROUTINE nightingale -
LMDZ6/trunk/libf/phylmd/Dust/precuremission.f90
r5245 r5246 1 CSubroutine that calculates the emission of aerosols precursors2 SUBROUTINE precuremission(ftsol,u10m_ec,v10m_ec, 3 . pctsrf,u_seri,v_seri,paprs,pplay,cdragh,4 . cdragm,t_seri,q_seri,tsol,fracso2emis,5 . frach2sofso2,bateau,zdz,zalt,6 . kminbc,kmaxbc,pdtphys,scale_param_bb,7 . scale_param_ind,iregion_ind,iregion_bb,8 . nbreg_ind, nbreg_bb,9 . lmt_so2ff_l,lmt_so2ff_h,lmt_so2nff,10 . lmt_so2ba,lmt_so2bb_l,lmt_so2bb_h,11 . lmt_so2volc_cont,lmt_altvolc_cont,12 . lmt_so2volc_expl,lmt_altvolc_expl,13 . lmt_dmsbio,lmt_h2sbio, lmt_dmsconc,14 . lmt_dms,id_prec,id_fine,15 . flux_sparam_ind,flux_sparam_bb,16 .source_tr,flux_tr,tr_seri)17 18 19 20 21 !USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb22 23 24 25 26 27 28 29 30 c============================= INPUT ===================================31 INTEGERkminbc, kmaxbc32 REALftsol(klon,nbsrf) ! temperature du sol par type33 REALtsol(klon) ! temperature du sol moyenne34 REALt_seri(klon,klev) ! temperature35 REALu_seri(klon,klev) ! vent36 REALv_seri(klon,klev) ! vent37 REALq_seri(klon,klev) ! vapeur d eau kg/kg38 REALu10m_ec(klon), v10m_ec(klon) ! vent a 10 metres39 REALpctsrf(klon,nbsrf)40 REALpdtphys ! pas d'integration pour la physique (seconde)41 REALpaprs(klon,klev+1) ! pression pour chaque inter-couche (en Pa)42 REALpplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa)43 REAL cdragh(klon), cdragm(klon)44 REALfracso2emis !--fraction so2 emis en so245 REALfrach2sofso2 !--fraction h2s from so246 REALzdz(klon,klev)47 LOGICALedgar, bateau48 INTEGERid_prec,id_fine49 c 50 c------------------------- Scaling Parameters --------------------------51 c 52 INTEGERnbreg_ind, nbreg_bb53 INTEGERiregion_ind(klon) !Defines regions for SO2, BC & OM54 INTEGERiregion_bb(klon) !Defines regions for SO2, BC & OM55 REALscale_param_bb(nbreg_bb) !Scaling parameter for biomas burning56 REALscale_param_ind(nbreg_ind) !Scaling parameter for industrial emissions57 c 58 c============================= OUTPUT ==================================59 c 60 REALsource_tr(klon,nbtr)61 REALflux_tr(klon,nbtr)62 REALtr_seri(klon,klev,nbtr) ! traceur63 REALflux_sparam_ind(klon), flux_sparam_bb(klon)64 c========================= LOCAL VARIABLES =============================65 INTEGERi, k, kkk_cont(klon), kkk_expl(klon)66 REALzalt(klon,klev), zaltmid(klon,klev)67 REALzzdz68 c------------------------- SULFUR emissions ----------------------------69 REALlmt_so2volc_cont(klon) ! emissions so2 volcan (continuous)70 REALlmt_altvolc_cont(klon) ! altitude so2 volcan (continuous)71 REALlmt_so2volc_expl(klon) ! emissions so2 volcan (explosive)72 REALlmt_altvolc_expl(klon) ! altitude so2 volcan (explosive)73 REALlmt_so2ff_l(klon) ! emissions so2 fossil fuel (low)74 REALlmt_so2ff_h(klon) ! emissions so2 fossil fuel (high)75 REALlmt_so2nff(klon) ! emissions so2 non-fossil fuel76 REALlmt_so2bb_l(klon) ! emissions de so2 biomass burning (low)77 REALlmt_so2bb_h(klon) ! emissions de so2 biomass burning (high)78 REALlmt_so2ba(klon) ! emissions de so2 bateau79 REALlmt_dms(klon) ! emissions de dms80 REALlmt_dmsconc(klon) ! concentration de dms oceanique81 REALlmt_dmsbio(klon) ! emissions de dms bio82 REALlmt_h2sbio(klon) ! emissions de h2s bio83 84 85 c=========================================================================86 cModifications introduced by NHL87 c-Variables to save fluxes were introduced88 c-lmt_so2ba was multiplied by fracso2emis in line 11789 c-scale_param_bb was introduced in line 10590 c The last two modifications were errors existing in the original version 91 c=========================================================================92 c=========================================================================93 cLOW LEVEL EMISSIONS94 c=========================================================================95 96 CALL nightingale(u_seri, v_seri, u10m_ec, v10m_ec, paprs,97 . pplay, cdragh, cdragm, t_seri, q_seri, ftsol,98 .tsol, pctsrf, lmt_dmsconc, lmt_dms)99 100 101 DO i=1, klon102 103 104 105 106 107 108 IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec)109 . + fracso2emis110 . *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4111 . +scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4112 .*frach2sofso2 ! molec/m2/s113 c 114 IF(id_fine>0) source_tr(i,id_fine)=115 . source_tr(i,id_fine)+(1-fracso2emis)116 . *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)117 .*1.e4*masse_ammsulfate/RNAVO ! g/m2/s118 c 119 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec) + (120 . scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+121 . lmt_so2ff_h(i))122 . *frach2sofso2123 . +scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+124 . lmt_so2ff_h(i))125 . *fracso2emis126 .)*1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s127 c 128 IF(id_fine>0) flux_tr(i,id_fine)=129 . flux_tr(i,id_fine)+(1-fracso2emis)130 . *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+131 . lmt_so2ff_h(i))132 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s133 c 134 flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis)135 . *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+136 . lmt_so2ff_h(i))137 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s138 139 140 IF(id_prec>0) source_tr(i,id_prec)=141 . source_tr(i,id_prec) + fracso2emis142 . *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)143 .*(1.-pctsrf(i,is_oce))*1.e4144 c 145 IF(id_fine>0) source_tr(i,id_fine)=146 . source_tr(i,id_fine)+(1-fracso2emis)147 . *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)*148 . (1.-pctsrf(i,is_oce))*1.e4*149 .masse_ammsulfate/RNAVO ! g/m2/s150 c 151 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec) +152 . (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)153 . +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))154 . * (1.-pctsrf(i,is_oce))*fracso2emis155 .*1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s156 c 157 IF(id_fine>0) flux_tr(i,id_fine)=158 . flux_tr(i,id_fine)+(1-fracso2emis)159 . *(scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)160 . +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))161 . *(1.-pctsrf(i,is_oce))162 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s163 c 164 flux_sparam_bb(i)=165 . scale_param_bb(iregion_bb(i))*(lmt_so2bb_l(i)+166 . lmt_so2bb_h(i))167 . * (1.-pctsrf(i,is_oce))*fracso2emis168 .*1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s169 flux_sparam_bb(i)= flux_sparam_bb(i) + (1-fracso2emis) *170 . (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)+171 . scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i))172 . *(1.-pctsrf(i,is_oce))173 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s174 175 IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec)176 . + fracso2emis177 . *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4178 . +(lmt_h2sbio(i)179 .+lmt_dms(i)+lmt_dmsbio(i))*1.e4 ! molec/m2/s180 c 181 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine)182 . +(1-fracso2emis)183 . *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4*184 .masse_ammsulfate/RNAVO ! g/m2/s185 c 186 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec)187 . + (lmt_h2sbio(i)188 . +lmt_so2volc_cont(i)+lmt_so2volc_expl(i)189 . +(lmt_so2ba(i)+lmt_so2nff(i))*fracso2emis190 . +lmt_dms(i)+lmt_dmsbio(i) )191 .*1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s192 c 193 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine)194 . +(1-fracso2emis)195 . *(lmt_so2ba(i) + lmt_so2nff(i))196 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s197 c 198 flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis)199 . *lmt_so2nff(i)200 .*1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s201 c 202 203 204 c========================================================================205 cHIGH LEVEL EMISSIONS206 c========================================================================207 cSource de SO2 volcaniques208 209 210 211 212 213 214 215 216 217 218 219 220 221 tr_seri(i,kkk_cont(i),id_prec)=tr_seri(i,kkk_cont(i),id_prec) +222 .lmt_so2volc_cont(i)/zdz(i,kkk_cont(i))/100.*pdtphys223 tr_seri(i,kkk_expl(i),id_prec)=tr_seri(i,kkk_expl(i),id_prec) +224 .lmt_so2volc_expl(i)/zdz(i,kkk_expl(i))/100.*pdtphys225 226 ENDIF227 c Sources hautes de SO2 228 229 c 230 c--only GEIA SO2 emissions has high emissions231 c--unit: molec/cm2/s divided by layer height (in cm) multiplied by timestep232 c 233 234 235 c 236 237 IF(id_prec>0) tr_seri(i,k,id_prec)=238 . tr_seri(i,k,id_prec) + fracso2emis239 . *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)240 ./zdz(i,k)/100.*pdtphys241 c 242 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)243 . + (1.-fracso2emis)244 . *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)245 .*masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys !g/cm3246 247 248 IF(id_prec>0) tr_seri(i,k,id_prec)=249 . tr_seri(i,k,id_prec) + (fracso2emis250 . *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)251 . + frach2sofso2252 . *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i))253 ./zdz(i,k)/100.*pdtphys254 c 255 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine)256 . + (1.-fracso2emis)257 . *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)258 .*masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys !g/cm3259 260 c 261 262 263 END 1 ! Subroutine that calculates the emission of aerosols precursors 2 SUBROUTINE precuremission(ftsol,u10m_ec,v10m_ec, & 3 pctsrf,u_seri,v_seri,paprs,pplay,cdragh, & 4 cdragm,t_seri,q_seri,tsol,fracso2emis, & 5 frach2sofso2,bateau,zdz,zalt, & 6 kminbc,kmaxbc,pdtphys,scale_param_bb, & 7 scale_param_ind,iregion_ind,iregion_bb, & 8 nbreg_ind, nbreg_bb, & 9 lmt_so2ff_l,lmt_so2ff_h,lmt_so2nff, & 10 lmt_so2ba,lmt_so2bb_l,lmt_so2bb_h, & 11 lmt_so2volc_cont,lmt_altvolc_cont, & 12 lmt_so2volc_expl,lmt_altvolc_expl, & 13 lmt_dmsbio,lmt_h2sbio, lmt_dmsconc, & 14 lmt_dms,id_prec,id_fine, & 15 flux_sparam_ind,flux_sparam_bb, & 16 source_tr,flux_tr,tr_seri) 17 18 USE dimphy 19 USE indice_sol_mod 20 USE infotrac 21 ! USE phytracr_spl_mod, ONLY : nbreg_dust, nbreg_ind, nbreg_bb 22 IMPLICIT NONE 23 24 INCLUDE "dimensions.h" 25 INCLUDE "chem.h" 26 INCLUDE "chem_spla.h" 27 INCLUDE "YOMCST.h" 28 INCLUDE "paramet.h" 29 30 !============================= INPUT =================================== 31 INTEGER :: kminbc, kmaxbc 32 REAL :: ftsol(klon,nbsrf) ! temperature du sol par type 33 REAL :: tsol(klon) ! temperature du sol moyenne 34 REAL :: t_seri(klon,klev) ! temperature 35 REAL :: u_seri(klon,klev) ! vent 36 REAL :: v_seri(klon,klev) ! vent 37 REAL :: q_seri(klon,klev) ! vapeur d eau kg/kg 38 REAL :: u10m_ec(klon), v10m_ec(klon) ! vent a 10 metres 39 REAL :: pctsrf(klon,nbsrf) 40 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 41 REAL :: paprs(klon,klev+1) ! pression pour chaque inter-couche (en Pa) 42 REAL :: pplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa) 43 REAL :: cdragh(klon), cdragm(klon) 44 REAL :: fracso2emis !--fraction so2 emis en so2 45 REAL :: frach2sofso2 !--fraction h2s from so2 46 REAL :: zdz(klon,klev) 47 LOGICAL :: edgar, bateau 48 INTEGER :: id_prec,id_fine 49 ! 50 !------------------------- Scaling Parameters -------------------------- 51 ! 52 INTEGER :: nbreg_ind, nbreg_bb 53 INTEGER :: iregion_ind(klon) !Defines regions for SO2, BC & OM 54 INTEGER :: iregion_bb(klon) !Defines regions for SO2, BC & OM 55 REAL :: scale_param_bb(nbreg_bb) !Scaling parameter for biomas burning 56 REAL :: scale_param_ind(nbreg_ind) !Scaling parameter for industrial emissions 57 ! 58 !============================= OUTPUT ================================== 59 ! 60 REAL :: source_tr(klon,nbtr) 61 REAL :: flux_tr(klon,nbtr) 62 REAL :: tr_seri(klon,klev,nbtr) ! traceur 63 REAL :: flux_sparam_ind(klon), flux_sparam_bb(klon) 64 !========================= LOCAL VARIABLES ============================= 65 INTEGER :: i, k, kkk_cont(klon), kkk_expl(klon) 66 REAL :: zalt(klon,klev), zaltmid(klon,klev) 67 REAL :: zzdz 68 !------------------------- SULFUR emissions ---------------------------- 69 REAL :: lmt_so2volc_cont(klon) ! emissions so2 volcan (continuous) 70 REAL :: lmt_altvolc_cont(klon) ! altitude so2 volcan (continuous) 71 REAL :: lmt_so2volc_expl(klon) ! emissions so2 volcan (explosive) 72 REAL :: lmt_altvolc_expl(klon) ! altitude so2 volcan (explosive) 73 REAL :: lmt_so2ff_l(klon) ! emissions so2 fossil fuel (low) 74 REAL :: lmt_so2ff_h(klon) ! emissions so2 fossil fuel (high) 75 REAL :: lmt_so2nff(klon) ! emissions so2 non-fossil fuel 76 REAL :: lmt_so2bb_l(klon) ! emissions de so2 biomass burning (low) 77 REAL :: lmt_so2bb_h(klon) ! emissions de so2 biomass burning (high) 78 REAL :: lmt_so2ba(klon) ! emissions de so2 bateau 79 REAL :: lmt_dms(klon) ! emissions de dms 80 REAL :: lmt_dmsconc(klon) ! concentration de dms oceanique 81 REAL :: lmt_dmsbio(klon) ! emissions de dms bio 82 REAL :: lmt_h2sbio(klon) ! emissions de h2s bio 83 84 EXTERNAL condsurfs, liss, nightingale 85 !========================================================================= 86 ! Modifications introduced by NHL 87 ! -Variables to save fluxes were introduced 88 ! -lmt_so2ba was multiplied by fracso2emis in line 117 89 ! -scale_param_bb was introduced in line 105 90 ! The last two modifications were errors existing in the original version 91 !========================================================================= 92 !========================================================================= 93 ! LOW LEVEL EMISSIONS 94 !========================================================================= 95 96 CALL nightingale(u_seri, v_seri, u10m_ec, v10m_ec, paprs, & 97 pplay, cdragh, cdragm, t_seri, q_seri, ftsol, & 98 tsol, pctsrf, lmt_dmsconc, lmt_dms) 99 100 IF (.not.bateau) THEN 101 DO i=1, klon 102 lmt_so2ba(i)=0.0 103 ENDDO 104 ENDIF 105 106 DO i=1, klon 107 IF (iregion_ind(i).GT.0) THEN 108 IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec) & 109 + fracso2emis & 110 *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4 & 111 +scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i)*1.e4 & 112 *frach2sofso2 ! molec/m2/s 113 ! 114 IF(id_fine>0) source_tr(i,id_fine)= & 115 source_tr(i,id_fine)+(1-fracso2emis) & 116 *scale_param_ind(iregion_ind(i))*lmt_so2ff_l(i) & 117 *1.e4*masse_ammsulfate/RNAVO ! g/m2/s 118 ! 119 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec) + ( & 120 scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ & 121 lmt_so2ff_h(i)) & 122 *frach2sofso2 & 123 +scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ & 124 lmt_so2ff_h(i)) & 125 *fracso2emis & 126 )*1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s 127 ! 128 IF(id_fine>0) flux_tr(i,id_fine)= & 129 flux_tr(i,id_fine)+(1-fracso2emis) & 130 *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ & 131 lmt_so2ff_h(i)) & 132 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 133 ! 134 flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis) & 135 *scale_param_ind(iregion_ind(i))*(lmt_so2ff_l(i)+ & 136 lmt_so2ff_h(i)) & 137 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 138 ENDIF 139 IF (iregion_bb(i).GT.0) THEN 140 IF(id_prec>0) source_tr(i,id_prec)= & 141 source_tr(i,id_prec) + fracso2emis & 142 *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) & 143 *(1.-pctsrf(i,is_oce))*1.e4 144 ! 145 IF(id_fine>0) source_tr(i,id_fine)= & 146 source_tr(i,id_fine)+(1-fracso2emis) & 147 *scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)* & 148 (1.-pctsrf(i,is_oce))*1.e4* & 149 masse_ammsulfate/RNAVO ! g/m2/s 150 ! 151 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec) + & 152 (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) & 153 +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) & 154 * (1.-pctsrf(i,is_oce))*fracso2emis & 155 *1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s 156 ! 157 IF(id_fine>0) flux_tr(i,id_fine)= & 158 flux_tr(i,id_fine)+(1-fracso2emis) & 159 *(scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i) & 160 +scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) & 161 *(1.-pctsrf(i,is_oce)) & 162 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 163 ! 164 flux_sparam_bb(i)= & 165 scale_param_bb(iregion_bb(i))*(lmt_so2bb_l(i)+ & 166 lmt_so2bb_h(i)) & 167 * (1.-pctsrf(i,is_oce))*fracso2emis & 168 *1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s 169 flux_sparam_bb(i)= flux_sparam_bb(i) + (1-fracso2emis) * & 170 (scale_param_bb(iregion_bb(i))*lmt_so2bb_l(i)+ & 171 scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i)) & 172 *(1.-pctsrf(i,is_oce)) & 173 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 174 ENDIF 175 IF(id_prec>0) source_tr(i,id_prec)=source_tr(i,id_prec) & 176 + fracso2emis & 177 *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4 & 178 +(lmt_h2sbio(i) & 179 +lmt_dms(i)+lmt_dmsbio(i))*1.e4 ! molec/m2/s 180 ! 181 IF(id_fine>0) source_tr(i,id_fine)=source_tr(i,id_fine) & 182 +(1-fracso2emis) & 183 *(lmt_so2ba(i)+lmt_so2nff(i))*1.e4* & 184 masse_ammsulfate/RNAVO ! g/m2/s 185 ! 186 IF(id_prec>0) flux_tr(i,id_prec)=flux_tr(i,id_prec) & 187 + (lmt_h2sbio(i) & 188 +lmt_so2volc_cont(i)+lmt_so2volc_expl(i) & 189 +(lmt_so2ba(i)+lmt_so2nff(i))*fracso2emis & 190 +lmt_dms(i)+lmt_dmsbio(i) ) & 191 *1.e4/RNAVO*masse_s*1.e3 ! mgS/m2/s 192 ! 193 IF(id_fine>0) flux_tr(i,id_fine)=flux_tr(i,id_fine) & 194 +(1-fracso2emis) & 195 *(lmt_so2ba(i) + lmt_so2nff(i)) & 196 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 197 ! 198 flux_sparam_ind(i)=flux_sparam_ind(i)+ (1-fracso2emis) & 199 *lmt_so2nff(i) & 200 *1.e4/RNAVO*masse_ammsulfate*1.e3 ! mgS/m2/s 201 ! 202 ENDDO 203 204 !======================================================================== 205 ! HIGH LEVEL EMISSIONS 206 !======================================================================== 207 ! Source de SO2 volcaniques 208 DO i = 1, klon 209 kkk_cont(i)=1 210 kkk_expl(i)=1 211 ENDDO 212 DO k=1, klev-1 213 DO i = 1, klon 214 zaltmid(i,k)=zalt(i,k)+zdz(i,k)/2. 215 IF (zalt(i,k+1).LT.lmt_altvolc_cont(i)) kkk_cont(i)=k+1 216 IF (zalt(i,k+1).LT.lmt_altvolc_expl(i)) kkk_expl(i)=k+1 217 ENDDO 218 ENDDO 219 IF(id_prec>0) THEN 220 DO i = 1, klon 221 tr_seri(i,kkk_cont(i),id_prec)=tr_seri(i,kkk_cont(i),id_prec) + & 222 lmt_so2volc_cont(i)/zdz(i,kkk_cont(i))/100.*pdtphys 223 tr_seri(i,kkk_expl(i),id_prec)=tr_seri(i,kkk_expl(i),id_prec) + & 224 lmt_so2volc_expl(i)/zdz(i,kkk_expl(i))/100.*pdtphys 225 ENDDO 226 ENDIF 227 ! Sources hautes de SO2 228 229 ! 230 !--only GEIA SO2 emissions has high emissions 231 !--unit: molec/cm2/s divided by layer height (in cm) multiplied by timestep 232 ! 233 k=2 !introducing emissions in level 2 234 DO i = 1, klon 235 ! 236 IF (iregion_bb(i).GT.0) THEN 237 IF(id_prec>0) tr_seri(i,k,id_prec)= & 238 tr_seri(i,k,id_prec) + fracso2emis & 239 *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i) & 240 /zdz(i,k)/100.*pdtphys 241 ! 242 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine) & 243 + (1.-fracso2emis) & 244 *scale_param_bb(iregion_bb(i))*lmt_so2bb_h(i) & 245 *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys !g/cm3 246 ENDIF 247 IF (iregion_ind(i).GT.0) THEN 248 IF(id_prec>0) tr_seri(i,k,id_prec)= & 249 tr_seri(i,k,id_prec) + (fracso2emis & 250 *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i) & 251 + frach2sofso2 & 252 *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i)) & 253 /zdz(i,k)/100.*pdtphys 254 ! 255 IF(id_fine>0) tr_seri(i,k,id_fine)=tr_seri(i,k,id_fine) & 256 + (1.-fracso2emis) & 257 *scale_param_ind(iregion_ind(i))*lmt_so2ff_h(i) & 258 *masse_ammsulfate/RNAVO/zdz(i,k)/100.*pdtphys !g/cm3 259 ENDIF 260 ! 261 ENDDO 262 263 END SUBROUTINE precuremission -
LMDZ6/trunk/libf/phylmd/Dust/read_dust.F90
r5245 r5246 1 2 3 4 5 IMPLICIT NONE6 c 7 8 9 10 c 11 INTEGERstep, nbjour12 LOGICALdebutphy13 realdust_ec(klon)14 realdust_ec_glo(klon_glo)15 c 16 cas real dust_nc(iip1,jjp1)17 realdust_nc_glo(nbp_lon+1,nbp_lat)18 realrcode19 integer ncid1, varid1, ncid2, varid21 SUBROUTINE read_dust(debutphy, step, nbjour, dust_ec) 2 USE dimphy 3 USE mod_grid_phy_lmdz 4 USE mod_phys_lmdz_para 5 IMPLICIT NONE 6 ! 7 INCLUDE "dimensions.h" 8 INCLUDE "paramet.h" 9 INCLUDE "netcdf.inc" 10 ! 11 INTEGER :: step, nbjour 12 LOGICAL :: debutphy 13 real :: dust_ec(klon) 14 real :: dust_ec_glo(klon_glo) 15 ! 16 ! as real dust_nc(iip1,jjp1) 17 real :: dust_nc_glo(nbp_lon+1,nbp_lat) 18 real :: rcode 19 integer :: ncid1, varid1, ncid2, varid2 20 20 21 21 save ncid1, varid1, ncid2, varid2 22 22 !$OMP THREADPRIVATE(ncid1, varid1, ncid2, varid2) 23 integerstart(4),count(4), status24 integeri, j, ig25 c 23 integer :: start(4),count(4), status 24 integer :: i, j, ig 25 ! 26 26 !$OMP MASTER 27 28 29 c 30 31 32 c 33 34 c 35 36 37 27 IF (is_mpi_root .AND. is_omp_root) THEN 28 if (debutphy) then 29 ! 30 ncid1=NCOPN('dust.nc',NCNOWRIT,rcode) 31 varid1=NCVID(ncid1,'EMISSION',rcode) 32 ! 33 endif 34 ! 35 start(1)=1 36 start(2)=1 37 start(4)=0 38 38 39 !count(1)=iip140 41 !count(2)=jjp142 43 44 45 c 46 47 c 39 ! count(1)=iip1 40 count(1)=nbp_lon+1 41 ! count(2)=jjp1 42 count(2)=nbp_lat 43 count(3)=1 44 count(4)=0 45 ! 46 start(3)=step 47 ! 48 48 #ifdef NC_DOUBLE 49 !status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc)50 49 ! status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc) 50 status=NF_GET_VARA_DOUBLE(ncid1,varid1,start,count,dust_nc_glo) 51 51 #else 52 !status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc)53 52 ! status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc) 53 status=NF_GET_VARA_REAL(ncid1,varid1,start,count,dust_nc_glo) 54 54 #endif 55 c 56 !call correctbid(iim,jjp1,dust_nc)57 58 c 59 c--upside down + physical grid60 c 61 c--OB=change jjp1 to 1 here ; 62 c----AS: OB's change is needed if lats N to S (90 to -90) in dust.nc63 !dust_ec(1)=MAX(dust_nc(1,jjp1),0.0)64 65 66 !DO j=2,jjm67 68 !DO i = 1, iim69 70 c--OB=change jjp1+1-j to j here71 !dust_ec(ig)=MAX(dust_nc(i,jjp1+1-j),0.0)72 73 ig=ig+174 75 76 c--OB=change second 1 to jjp1 here77 78 !end if master79 55 ! 56 ! call correctbid(iim,jjp1,dust_nc) 57 call correctbid(nbp_lon,nbp_lat,dust_nc_glo) 58 ! 59 !--upside down + physical grid 60 ! 61 !--OB=change jjp1 to 1 here ; 62 !----AS: OB's change is needed if lats N to S (90 to -90) in dust.nc 63 ! dust_ec(1)=MAX(dust_nc(1,jjp1),0.0) 64 dust_ec_glo(1)=MAX(dust_nc_glo(1,nbp_lat),0.0) 65 ig=2 66 ! DO j=2,jjm 67 DO j=2,nbp_lat-1 68 ! DO i = 1, iim 69 DO i = 1, nbp_lon 70 !--OB=change jjp1+1-j to j here 71 ! dust_ec(ig)=MAX(dust_nc(i,jjp1+1-j),0.0) 72 dust_ec_glo(ig)=MAX(dust_nc_glo(i,nbp_lat+1-j),0.0) 73 ig=ig+1 74 ENDDO 75 ENDDO 76 !--OB=change second 1 to jjp1 here 77 dust_ec_glo(ig)=MAX(dust_nc_glo(1,1),0.0) 78 ! end if master 79 ENDIF 80 80 !$OMP END MASTER 81 81 !$OMP BARRIER 82 83 c 84 RETURN85 END 82 CALL scatter(dust_ec_glo,dust_ec) 83 ! 84 RETURN 85 END SUBROUTINE read_dust -
LMDZ6/trunk/libf/phylmd/Dust/read_newemissions.f90
r5245 r5246 1 CRoutine to read the emissions of the different species2 C 3 subroutine read_newemissions(julien, jH_emi ,edgar, flag_dms, 4 I debutphy,5 I pdtphys,lafinphy, nbjour, pctsrf,6 I t_seri, xlat, xlon,7 I pmflxr, pmflxs, prfl, psfl,8 O u10m_ec, v10m_ec, dust_ec,9 O lmt_sea_salt, lmt_so2ff_l,10 O lmt_so2ff_h, lmt_so2nff, lmt_so2ba,11 O lmt_so2bb_l, lmt_so2bb_h,12 O lmt_so2volc_cont, lmt_altvolc_cont,13 O lmt_so2volc_expl, lmt_altvolc_expl,14 O lmt_dmsbio, lmt_h2sbio, lmt_dmsconc,15 O lmt_bcff, lmt_bcnff, lmt_bcbb_l,16 O lmt_bcbb_h, lmt_bcba, lmt_omff,17 O lmt_omnff, lmt_ombb_l, lmt_ombb_h,18 Olmt_omnat, lmt_omba)19 20 21 22 23 24 25 26 27 28 29 c INCLUDE 'dimphy.h' 30 INCLUDE 'paramet.h'31 INCLUDE 'chem.h'32 33 cINCLUDE 'indicesol.h'34 35 logicaldebutphy, lafinphy, edgar36 INTEGERtest_vent, test_day, step_vent, flag_dms, nbjour37 INTEGERjulien, i, iday38 1 ! Routine to read the emissions of the different species 2 ! 3 subroutine read_newemissions(julien, jH_emi ,edgar, flag_dms, & 4 debutphy, & 5 pdtphys,lafinphy, nbjour, pctsrf, & 6 t_seri, xlat, xlon, & 7 pmflxr, pmflxs, prfl, psfl, & 8 u10m_ec, v10m_ec, dust_ec, & 9 lmt_sea_salt, lmt_so2ff_l, & 10 lmt_so2ff_h, lmt_so2nff, lmt_so2ba, & 11 lmt_so2bb_l, lmt_so2bb_h, & 12 lmt_so2volc_cont, lmt_altvolc_cont, & 13 lmt_so2volc_expl, lmt_altvolc_expl, & 14 lmt_dmsbio, lmt_h2sbio, lmt_dmsconc, & 15 lmt_bcff, lmt_bcnff, lmt_bcbb_l, & 16 lmt_bcbb_h, lmt_bcba, lmt_omff, & 17 lmt_omnff, lmt_ombb_l, lmt_ombb_h, & 18 lmt_omnat, lmt_omba) 19 20 USE dimphy 21 USE indice_sol_mod 22 USE mod_grid_phy_lmdz 23 USE mod_phys_lmdz_para 24 25 IMPLICIT NONE 26 27 28 INCLUDE "dimensions.h" 29 ! INCLUDE 'dimphy.h' 30 INCLUDE 'paramet.h' 31 INCLUDE 'chem.h' 32 INCLUDE 'chem_spla.h' 33 ! INCLUDE 'indicesol.h' 34 35 logical :: debutphy, lafinphy, edgar 36 INTEGER :: test_vent, test_day, step_vent, flag_dms, nbjour 37 INTEGER :: julien, i, iday 38 SAVE step_vent, test_vent, test_day, iday 39 39 !$OMP THREADPRIVATE(step_vent, test_vent, test_day, iday) 40 REALpct_ocean(klon), pctsrf(klon,nbsrf)41 REAL pdtphys ! pas d'integration pour la physique (seconde)42 REALt_seri(klon,klev) ! temperature43 44 REAL xlat(klon) ! latitudes pour chaque point45 REAL xlon(klon) ! longitudes pour chaque point46 47 c 48 cEmissions:49 c---------50 c 51 c---------------------------- SEA SALT & DUST emissions ------------------------52 REALlmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um !NOT SAVED OK53 REALclyfac, avgdryrate, drying54 cje REAL u10m_ec1(klon), v10m_ec1(klon), dust_ec1(klon)55 cje REAL u10m_ec2(klon), v10m_ec2(klon), dust_ec2(klon)56 57 58 40 REAL :: pct_ocean(klon), pctsrf(klon,nbsrf) 41 REAL :: pdtphys ! pas d'integration pour la physique (seconde) 42 REAL :: t_seri(klon,klev) ! temperature 43 44 REAL :: xlat(klon) ! latitudes pour chaque point 45 REAL :: xlon(klon) ! longitudes pour chaque point 46 47 ! 48 ! Emissions: 49 ! --------- 50 ! 51 !---------------------------- SEA SALT & DUST emissions ------------------------ 52 REAL :: lmt_sea_salt(klon,ss_bins) !Sea salt 0.03-8.0 um !NOT SAVED OK 53 REAL :: clyfac, avgdryrate, drying 54 ! je REAL u10m_ec1(klon), v10m_ec1(klon), dust_ec1(klon) 55 ! je REAL u10m_ec2(klon), v10m_ec2(klon), dust_ec2(klon) 56 57 REAL, SAVE, ALLOCATABLE :: u10m_ec1(:), v10m_ec1(:), dust_ec1(:) 58 REAL, SAVE, ALLOCATABLE :: u10m_ec2(:), v10m_ec2(:), dust_ec2(:) 59 59 !$OMP THREADPRIVATE(u10m_ec1, v10m_ec1, dust_ec1) 60 60 !$OMP THREADPRIVATE(u10m_ec2, v10m_ec2, dust_ec2) 61 cas REAL u10m_nc(iip1,jjp1), v10m_nc(iip1,jjp1)62 REALu10m_ec(klon), v10m_ec(klon), dust_ec(klon)63 cREAL cly(klon), wth(klon), zprecipinsoil(klon)64 65 66 61 ! as REAL u10m_nc(iip1,jjp1), v10m_nc(iip1,jjp1) 62 REAL :: u10m_ec(klon), v10m_ec(klon), dust_ec(klon) 63 ! REAL cly(klon), wth(klon), zprecipinsoil(klon) 64 REAL, SAVE, ALLOCATABLE :: cly(:), wth(:), zprecipinsoil(:) 65 REAL :: cly_glo(klon_glo), wth_glo(klon_glo) 66 REAL :: zprecipinsoil_glo(klon_glo) 67 67 !$OMP THREADPRIVATE(cly,wth,zprecipinsoil) 68 68 69 69 70 cje SAVE u10m_ec2, v10m_ec2, dust_ec271 cje SAVE u10m_ec1, v10m_ec1, dust_ec1 ! Added on titane72 cje SAVE cly, wth, zprecipinsoil ! Added on titane73 !SAVE cly, wth, zprecipinsoil, u10m_ec2, v10m_ec2, dust_ec274 c------------------------- BLACK CARBON emissions ----------------------75 REALlmt_bcff(klon) ! emissions de BC fossil fuels76 REALlmt_bcnff(klon) ! emissions de BC non-fossil fuels77 REALlmt_bcbb_l(klon) ! emissions de BC biomass basses78 REALlmt_bcbb_h(klon) ! emissions de BC biomass hautes79 REALlmt_bcba(klon) ! emissions de BC bateau80 c------------------------ ORGANIC MATTER emissions ---------------------81 REALlmt_omff(klon) ! emissions de OM fossil fuels82 REALlmt_omnff(klon) ! emissions de OM non-fossil fuels83 REALlmt_ombb_l(klon) ! emissions de OM biomass basses84 REALlmt_ombb_h(klon) ! emissions de OM biomass hautes85 REALlmt_omnat(klon) ! emissions de OM Natural86 REALlmt_omba(klon) ! emissions de OM bateau87 c------------------------- SULFUR emissions ----------------------------88 REALlmt_so2ff_l(klon) ! emissions so2 fossil fuels (low)89 REALlmt_so2ff_h(klon) ! emissions so2 fossil fuels (high)90 REALlmt_so2nff(klon) ! emissions so2 non-fossil fuels91 REALlmt_so2bb_l(klon) ! emissions de so2 biomass burning basse92 REALlmt_so2bb_h(klon) ! emissions de so2 biomass burning hautes93 REALlmt_so2ba(klon) ! emissions de so2 bateau94 REALlmt_so2volc_cont(klon) ! emissions so2 volcan continuous95 REALlmt_altvolc_cont(klon) ! altitude so2 volcan continuous96 REALlmt_so2volc_expl(klon) ! emissions so2 volcan explosive97 REALlmt_altvolc_expl(klon) ! altitude so2 volcan explosive98 REALlmt_dmsconc(klon) ! concentration de dms oceanique99 REALlmt_dmsbio(klon) ! emissions de dms bio100 REALlmt_h2sbio(klon) ! emissions de h2s bio101 102 70 ! je SAVE u10m_ec2, v10m_ec2, dust_ec2 71 ! je SAVE u10m_ec1, v10m_ec1, dust_ec1 ! Added on titane 72 ! je SAVE cly, wth, zprecipinsoil ! Added on titane 73 ! SAVE cly, wth, zprecipinsoil, u10m_ec2, v10m_ec2, dust_ec2 74 !------------------------- BLACK CARBON emissions ---------------------- 75 REAL :: lmt_bcff(klon) ! emissions de BC fossil fuels 76 REAL :: lmt_bcnff(klon) ! emissions de BC non-fossil fuels 77 REAL :: lmt_bcbb_l(klon) ! emissions de BC biomass basses 78 REAL :: lmt_bcbb_h(klon) ! emissions de BC biomass hautes 79 REAL :: lmt_bcba(klon) ! emissions de BC bateau 80 !------------------------ ORGANIC MATTER emissions --------------------- 81 REAL :: lmt_omff(klon) ! emissions de OM fossil fuels 82 REAL :: lmt_omnff(klon) ! emissions de OM non-fossil fuels 83 REAL :: lmt_ombb_l(klon) ! emissions de OM biomass basses 84 REAL :: lmt_ombb_h(klon) ! emissions de OM biomass hautes 85 REAL :: lmt_omnat(klon) ! emissions de OM Natural 86 REAL :: lmt_omba(klon) ! emissions de OM bateau 87 !------------------------- SULFUR emissions ---------------------------- 88 REAL :: lmt_so2ff_l(klon) ! emissions so2 fossil fuels (low) 89 REAL :: lmt_so2ff_h(klon) ! emissions so2 fossil fuels (high) 90 REAL :: lmt_so2nff(klon) ! emissions so2 non-fossil fuels 91 REAL :: lmt_so2bb_l(klon) ! emissions de so2 biomass burning basse 92 REAL :: lmt_so2bb_h(klon) ! emissions de so2 biomass burning hautes 93 REAL :: lmt_so2ba(klon) ! emissions de so2 bateau 94 REAL :: lmt_so2volc_cont(klon) ! emissions so2 volcan continuous 95 REAL :: lmt_altvolc_cont(klon) ! altitude so2 volcan continuous 96 REAL :: lmt_so2volc_expl(klon) ! emissions so2 volcan explosive 97 REAL :: lmt_altvolc_expl(klon) ! altitude so2 volcan explosive 98 REAL :: lmt_dmsconc(klon) ! concentration de dms oceanique 99 REAL :: lmt_dmsbio(klon) ! emissions de dms bio 100 REAL :: lmt_h2sbio(klon) ! emissions de h2s bio 101 102 REAL,SAVE,ALLOCATABLE :: lmt_dms(:) ! emissions de dms 103 103 !$OMP THREADPRIVATE(lmt_dms) 104 c 105 cLessivage106 c---------107 c 108 REALpmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection109 REALprfl(klon,klev+1), psfl(klon,klev+1) !--large-scale110 !REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection111 !REAL prfl(klon,klev), psfl(klon,klev) !--large-scale112 c 113 cVariable interne114 c----------------115 c 116 INTEGERicount117 REAL tau_1, tau_2118 REAL max_flux, min_flux119 120 c 121 cJE: Changes due to new pdtphys in new physics.122 c REAL windintime ! time in hours of the wind input files resolution 123 c REAL dayemintime ! time in hours of the other emissions input files resolution 124 REALjH_init ! shift in the hour (count as days) respecto to125 !! realhour = (pdtphys*i)/3600/24 -days_elapsed126 REALjH_emi,jH_vent,jH_day127 104 ! 105 ! Lessivage 106 ! --------- 107 ! 108 REAL :: pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--convection 109 REAL :: prfl(klon,klev+1), psfl(klon,klev+1) !--large-scale 110 ! REAL pmflxr(klon,klev), pmflxs(klon,klev) !--convection 111 ! REAL prfl(klon,klev), psfl(klon,klev) !--large-scale 112 ! 113 ! Variable interne 114 ! ---------------- 115 ! 116 INTEGER :: icount 117 REAL :: tau_1, tau_2 118 REAL :: max_flux, min_flux 119 INTRINSIC MIN, MAX 120 ! 121 ! JE: Changes due to new pdtphys in new physics. 122 ! REAL windintime ! time in hours of the wind input files resolution 123 ! REAL dayemintime ! time in hours of the other emissions input files resolution 124 REAL :: jH_init ! shift in the hour (count as days) respecto to 125 ! ! realhour = (pdtphys*i)/3600/24 -days_elapsed 126 REAL :: jH_emi,jH_vent,jH_day 127 SAVE jH_init,jH_vent,jH_day 128 128 !$OMP THREADPRIVATE(jH_init,jH_vent,jH_day) 129 130 131 !INTEGER test_day1132 !SAVE test_day1133 !REAL tau_1j,tau_2j134 cje135 callocate if necessary136 c 137 138 139 140 141 142 143 144 145 146 147 148 cend je nov2013149 c 150 C***********************************************************************151 CDUST EMISSIONS152 C***********************************************************************153 c 154 IF (debutphy) THEN155 C---Fields are read only at the beginning of the period156 c--reading wind and dust157 158 159 160 161 162 print *,'Read (debut) dust emissions: step_vent,julien,nbjour',163 .step_vent,julien,nbjour164 165 CThreshold velocity map129 REAL,PARAMETER :: vent_resol = 6. ! resolution of winds in hours 130 REAL,PARAMETER :: day_resol = 24. ! resolution of daily emmis. in hours 131 ! INTEGER test_day1 132 ! SAVE test_day1 133 ! REAL tau_1j,tau_2j 134 ! je 135 ! allocate if necessary 136 ! 137 138 IF (.NOT. ALLOCATED(u10m_ec1)) ALLOCATE(u10m_ec1(klon)) 139 IF (.NOT. ALLOCATED(v10m_ec1)) ALLOCATE(v10m_ec1(klon)) 140 IF (.NOT. ALLOCATED(dust_ec1)) ALLOCATE(dust_ec1(klon)) 141 IF (.NOT. ALLOCATED(u10m_ec2)) ALLOCATE(u10m_ec2(klon)) 142 IF (.NOT. ALLOCATED(v10m_ec2)) ALLOCATE(v10m_ec2(klon)) 143 IF (.NOT. ALLOCATED(dust_ec2)) ALLOCATE(dust_ec2(klon)) 144 IF (.NOT. ALLOCATED(cly)) ALLOCATE(cly(klon)) 145 IF (.NOT. ALLOCATED(wth)) ALLOCATE(wth(klon)) 146 IF (.NOT. ALLOCATED(zprecipinsoil)) ALLOCATE(zprecipinsoil(klon)) 147 IF (.NOT. ALLOCATED(lmt_dms)) ALLOCATE(lmt_dms(klon)) 148 ! end je nov2013 149 ! 150 !*********************************************************************** 151 ! DUST EMISSIONS 152 !*********************************************************************** 153 ! 154 IF (debutphy) THEN 155 !---Fields are read only at the beginning of the period 156 !--reading wind and dust 157 iday=julien 158 step_vent=1 159 test_vent=0 160 test_day=0 161 CALL read_vent(.true.,step_vent,nbjour,u10m_ec2,v10m_ec2) 162 print *,'Read (debut) dust emissions: step_vent,julien,nbjour', & 163 step_vent,julien,nbjour 164 CALL read_dust(.true.,step_vent,nbjour,dust_ec2) 165 ! Threshold velocity map 166 166 !$OMP MASTER 167 168 169 170 171 172 cClay content173 174 175 176 OPEN(53,file='precipinsoil.dat',177 .status='old',form='formatted',err=999)178 179 180 999 181 182 167 IF (is_mpi_root .AND. is_omp_root) THEN 168 zprecipinsoil_glo(:)=0.0 169 OPEN(51,file='wth.dat',status='unknown',form='formatted') 170 READ(51,'(G18.10)') (wth_glo(i),i=1,klon_glo) 171 CLOSE(51) 172 ! Clay content 173 OPEN(52,file='cly.dat',status='unknown',form='formatted') 174 READ(52,'(G18.10)') (cly_glo(i),i=1,klon_glo) 175 CLOSE(52) 176 OPEN(53,file='precipinsoil.dat', & 177 status='old',form='formatted',err=999) 178 READ(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo) 179 PRINT *,'lecture precipinsoil.dat' 180 999 CONTINUE 181 CLOSE(53) 182 ENDIF 183 183 !$OMP END MASTER 184 184 !$OMP BARRIER 185 186 187 188 189 !JE20140908<< GOTO 1000190 !DO i=1, klon191 !zprecipinsoil(i)=0.0192 !ENDDO193 ! 1000 CLOSE(53)194 !JE20140908>>195 196 197 198 !test_day1=0199 !JE end200 c 201 202 203 204 print *,'READ_EMISSION: test_vent & test_day = ',test_vent,205 +test_day206 IF (test_vent.EQ.0) THEN !--on lit toutes les 6 h207 208 209 210 211 212 213 print *,'Reading dust emissions: step_vent, julien, nbjour ',214 .step_vent, julien, nbjour215 216 217 218 219 220 cubicacion original221 ctest_vent=test_vent+1222 cIF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h223 224 !JE tau_2=FLOAT(test_vent)/12.225 !JE tau_1=1.-tau_2226 227 228 !print*,'JEdec jHv,JHi,ventres',jH_vent,jH_init,vent_resol229 !print*,'JEdec tau2,tau1',tau_2,tau_1230 !print*,'JEdec step_vent',step_vent231 232 !PRINT*,'JE tau_2,tau_2j',tau_2,tau_2j233 234 235 236 237 c 238 cJE IF (test_vent.EQ.(6*2)) THEN239 cJE PRINT *,'6 hrs interval reached'240 cJE print *,'day in read_emission, test_vent = ',julien, test_vent241 cJE ENDIF242 cJE243 !JE test_vent=test_vent+1244 !JE IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h245 c JE 246 247 248 249 250 251 252 !PRINT*,'JE test_vent,test_vent1,jH_vent ', test_vent,test_vent1253 !. ,jH_vent254 cendJEi255 c 256 257 c 258 259 c 260 261 zprecipinsoil(i)=zprecipinsoil(i) +262 .(pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys263 c 264 265 drying=avgdryrate*exp(0.03905491*266 .exp(0.17446*(t_seri(i,1)-273.15))) ! [mm]267 268 269 !zprecipinsoil(i)=0.0 ! Temporarely introduced to reproduce obelix result270 271 272 !print *,'cly = ',sum(cly),maxval(cly),minval(cly)273 !print *,'wth = ',sum(wth),maxval(wth),minval(wth)274 !print *,'t_seri = ',sum(t_seri),maxval(t_seri),minval(t_seri)275 !print *,'precipinsoil = ',sum(zprecipinsoil),maxval(zprecipinsoil)276 !. ,minval(zprecipinsoil)277 278 279 IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR.280 .t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN281 282 !print *,'Dust emissions surpressed at grid = ',i283 !icount=icount+1284 285 ENDDO286 c 287 288 print *,'dust_ec = ',SUM(dust_ec),MINVAL(dust_ec),289 .MAXVAL(dust_ec)290 cnhl Transitory scaling of desert dust emissions291 292 cnhl DO i=1, klon293 cnhl dust_ec(i)=dust_ec(i)/2.294 cnhl ENDDO 295 296 C-saving precipitation field to be read in next simulation297 298 299 c 300 185 call scatter(wth_glo,wth) 186 call scatter(cly_glo,cly) 187 call scatter(zprecipinsoil_glo,zprecipinsoil) 188 189 !JE20140908<< GOTO 1000 190 ! DO i=1, klon 191 ! zprecipinsoil(i)=0.0 192 ! ENDDO 193 ! 1000 CLOSE(53) 194 !JE20140908>> 195 jH_init=jH_emi 196 jH_vent=jH_emi 197 jH_day=jH_emi 198 ! test_day1=0 199 !JE end 200 ! 201 202 ENDIF !--- debutphy 203 204 print *,'READ_EMISSION: test_vent & test_day = ',test_vent, & 205 test_day 206 IF (test_vent.EQ.0) THEN !--on lit toutes les 6 h 207 CALL SCOPY(klon, u10m_ec2, 1, u10m_ec1, 1) 208 CALL SCOPY(klon, v10m_ec2, 1, v10m_ec1, 1) 209 CALL SCOPY(klon, dust_ec2, 1, dust_ec1, 1) 210 step_vent=step_vent+1 211 ! !PRINT *,'step_vent=', step_vent 212 CALL read_vent(.false.,step_vent,nbjour,u10m_ec2,v10m_ec2) 213 print *,'Reading dust emissions: step_vent, julien, nbjour ', & 214 step_vent, julien, nbjour 215 ! !print *,'test_vent, julien = ',test_vent, julien 216 CALL read_dust(.false.,step_vent,nbjour,dust_ec2) 217 218 ENDIF !--test_vent 219 220 ! ubicacion original 221 ! test_vent=test_vent+1 222 ! IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h 223 224 !JE tau_2=FLOAT(test_vent)/12. 225 !JE tau_1=1.-tau_2 226 tau_2=(jH_vent-jH_init)*24./(vent_resol) 227 tau_1=1.-tau_2 228 ! print*,'JEdec jHv,JHi,ventres',jH_vent,jH_init,vent_resol 229 ! print*,'JEdec tau2,tau1',tau_2,tau_1 230 ! print*,'JEdec step_vent',step_vent 231 DO i=1, klon 232 ! PRINT*,'JE tau_2,tau_2j',tau_2,tau_2j 233 u10m_ec(i)=tau_1*u10m_ec1(i)+tau_2*u10m_ec2(i) 234 v10m_ec(i)=tau_1*v10m_ec1(i)+tau_2*v10m_ec2(i) 235 dust_ec(i)=tau_1*dust_ec1(i)+tau_2*dust_ec2(i) 236 ENDDO 237 ! 238 !JE IF (test_vent.EQ.(6*2)) THEN 239 !JE PRINT *,'6 hrs interval reached' 240 !JE print *,'day in read_emission, test_vent = ',julien, test_vent 241 !JE ENDIF 242 !JE 243 !JE test_vent=test_vent+1 244 !JE IF (test_vent.EQ.(6*2)) test_vent=0 !on remet a zero ttes les 6 h 245 ! JE 246 jH_vent=jH_vent+pdtphys/(24.*3600.) 247 test_vent=test_vent+1 248 IF (jH_vent.GT.(vent_resol)/24.) THEN 249 test_vent=0 250 jH_vent=jH_init 251 ENDIF 252 ! PRINT*,'JE test_vent,test_vent1,jH_vent ', test_vent,test_vent1 253 ! . ,jH_vent 254 ! endJEi 255 ! 256 avgdryrate=300./365.*pdtphys/86400. 257 ! 258 DO i=1, klon 259 ! 260 IF (cly(i).LT.9990..AND.wth(i).LT.9990.) THEN 261 zprecipinsoil(i)=zprecipinsoil(i) + & 262 (pmflxr(i,1)+pmflxs(i,1)+prfl(i,1)+psfl(i,1))*pdtphys 263 ! 264 clyfac=MIN(16., cly(i)*0.4+8.) ![mm] max amount of water hold in top soil 265 drying=avgdryrate*exp(0.03905491* & 266 exp(0.17446*(t_seri(i,1)-273.15))) ! [mm] 267 zprecipinsoil(i)=min(max(0.,zprecipinsoil(i)-drying),clyfac) ! [mm] 268 ENDIF 269 ! zprecipinsoil(i)=0.0 ! Temporarely introduced to reproduce obelix result 270 ENDDO 271 272 ! print *,'cly = ',sum(cly),maxval(cly),minval(cly) 273 ! print *,'wth = ',sum(wth),maxval(wth),minval(wth) 274 ! print *,'t_seri = ',sum(t_seri),maxval(t_seri),minval(t_seri) 275 ! print *,'precipinsoil = ',sum(zprecipinsoil),maxval(zprecipinsoil) 276 ! . ,minval(zprecipinsoil) 277 icount=0 278 DO i=1, klon 279 IF (cly(i).GE.9990..OR.wth(i).GE.9990..OR. & 280 t_seri(i,1).LE.273.15.OR.zprecipinsoil(i).GT.1.e-8) THEN 281 dust_ec(i)=0.0 ! commented out for test dustemtest 282 ! print *,'Dust emissions surpressed at grid = ',i 283 ! icount=icount+1 284 ENDIF 285 ENDDO 286 ! 287 print *,'Total N of grids with surpressed emission = ',icount 288 print *,'dust_ec = ',SUM(dust_ec),MINVAL(dust_ec), & 289 MAXVAL(dust_ec) 290 !nhl Transitory scaling of desert dust emissions 291 292 !nhl DO i=1, klon 293 !nhl dust_ec(i)=dust_ec(i)/2. 294 !nhl ENDDO 295 296 !-saving precipitation field to be read in next simulation 297 298 IF (lafinphy) THEN 299 ! 300 CALL gather(zprecipinsoil,zprecipinsoil_glo) 301 301 !$OMP MASTER 302 303 304 OPEN(53,file='newprecipinsoil.dat',305 .status='unknown',form='formatted')306 307 308 302 IF (is_mpi_root .AND. is_omp_root) THEN 303 304 OPEN(53,file='newprecipinsoil.dat', & 305 status='unknown',form='formatted') 306 WRITE(53,'(G18.10)') (zprecipinsoil_glo(i),i=1,klon_glo) 307 CLOSE(53) 308 ENDIF 309 309 !$OMP END MASTER 310 310 !$OMP BARRIER 311 c 312 313 c 314 C***********************************************************************315 CSEA SALT EMISSIONS316 C***********************************************************************317 c 318 319 320 321 322 323 324 !print *,'SUM, MAX & MIN Sea Salt = ',SUM(lmt_sea_salt),325 !. MAXVAL(lmt_sea_salt),MINVAL(lmt_sea_salt)326 c 327 C***********************************************************************328 CSULFUR & CARBON EMISSIONS329 C***********************************************************************330 c 331 332 333 print *,'Computing SULFATE emissions for day : ',iday,julien,334 .step_vent335 CALL condsurfs_new(iday, edgar, flag_dms,336 O lmt_so2ff_l, lmt_so2ff_h, lmt_so2nff,337 O lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba,338 O lmt_so2volc_cont, lmt_altvolc_cont,339 O lmt_so2volc_expl, lmt_altvolc_expl,340 Olmt_dmsbio, lmt_h2sbio, lmt_dms,lmt_dmsconc)341 print *,'Computing CARBON emissions for day : ',iday,julien,342 .step_vent343 CALL condsurfc_new(iday,344 O lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h,345 O lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l,346 Olmt_ombb_h, lmt_omnat, lmt_omba)347 348 349 print *,'BCBB_L emissions :',SUM(lmt_bcbb_l), MAXVAL(lmt_bcbb_l)350 .,MINVAL(lmt_bcbb_l)351 print *,'BCBB_H emissions :',SUM(lmt_bcbb_h), MAXVAL(lmt_bcbb_h)352 .,MINVAL(lmt_bcbb_h)353 354 355 !JE test_day=test_day+1356 !JE IF (test_day.EQ.(24*2.)) THEN357 !JE test_day=0 !on remet a zero ttes les 24 h358 !JE print *,'LAST TIME STEP OF DAY ',julien359 !JE ENDIF360 361 362 363 364 365 366 367 368 369 !PRINT*,'test_day,test_day1',test_day,test_day1370 371 END 311 ! 312 ENDIF 313 ! 314 !*********************************************************************** 315 ! SEA SALT EMISSIONS 316 !*********************************************************************** 317 ! 318 DO i=1,klon 319 pct_ocean(i)=pctsrf(i,is_oce) 320 ENDDO 321 322 print *,'IS_OCE = ',is_oce 323 CALL seasalt(v10m_ec, u10m_ec, pct_ocean, lmt_sea_salt) !mgSeaSalt/cm2/s 324 ! print *,'SUM, MAX & MIN Sea Salt = ',SUM(lmt_sea_salt), 325 ! . MAXVAL(lmt_sea_salt),MINVAL(lmt_sea_salt) 326 ! 327 !*********************************************************************** 328 ! SULFUR & CARBON EMISSIONS 329 !*********************************************************************** 330 ! 331 332 IF (test_day.EQ.0) THEN 333 print *,'Computing SULFATE emissions for day : ',iday,julien, & 334 step_vent 335 CALL condsurfs_new(iday, edgar, flag_dms, & 336 lmt_so2ff_l, lmt_so2ff_h, lmt_so2nff, & 337 lmt_so2bb_l, lmt_so2bb_h, lmt_so2ba, & 338 lmt_so2volc_cont, lmt_altvolc_cont, & 339 lmt_so2volc_expl, lmt_altvolc_expl, & 340 lmt_dmsbio, lmt_h2sbio, lmt_dms,lmt_dmsconc) 341 print *,'Computing CARBON emissions for day : ',iday,julien, & 342 step_vent 343 CALL condsurfc_new(iday, & 344 lmt_bcff,lmt_bcnff,lmt_bcbb_l,lmt_bcbb_h, & 345 lmt_bcba,lmt_omff,lmt_omnff,lmt_ombb_l, & 346 lmt_ombb_h, lmt_omnat, lmt_omba) 347 print *,'IDAY = ',iday 348 iday=iday+1 349 print *,'BCBB_L emissions :',SUM(lmt_bcbb_l), MAXVAL(lmt_bcbb_l) & 350 ,MINVAL(lmt_bcbb_l) 351 print *,'BCBB_H emissions :',SUM(lmt_bcbb_h), MAXVAL(lmt_bcbb_h) & 352 ,MINVAL(lmt_bcbb_h) 353 ENDIF 354 355 !JE test_day=test_day+1 356 !JE IF (test_day.EQ.(24*2.)) THEN 357 !JE test_day=0 !on remet a zero ttes les 24 h 358 !JE print *,'LAST TIME STEP OF DAY ',julien 359 !JE ENDIF 360 361 362 jH_day=jH_day+pdtphys/(24.*3600.) 363 test_day=test_day+1 364 IF (jH_day.GT.(day_resol)/24.) THEN 365 print *,'LAST TIME STEP OF DAY ',julien 366 test_day=0 367 jH_day=jH_init 368 ENDIF 369 ! PRINT*,'test_day,test_day1',test_day,test_day1 370 371 END SUBROUTINE read_newemissions -
LMDZ6/trunk/libf/phylmd/Dust/read_vent.F90
r5245 r5246 1 2 3 4 5 !USE write_field_phy6 IMPLICIT NONE7 8 cINCLUDE "dimphy.h"9 10 11 c 12 INTEGERstep, nbjour13 LOGICALdebutphy14 realu10m_ec(klon), v10m_ec(klon)15 realu10m_ec_glo(klon_glo), v10m_ec_glo(klon_glo)16 c 17 !real u10m_nc(iip1,jjp1) !, v10m_nc(iip1,jjm) ! dim 97x7218 !real v10m_nc(iip1,jjp1) ! dim 97x7319 realu10m_nc_glo(nbp_lon+1,nbp_lat) !, v10m_nc(iip1,jjm) ! dim 97x7220 realv10m_nc_glo(nbp_lon+1,nbp_lat) ! dim 97x7321 realrcode22 integerncidu1, varidu1, ncidv1, varidv123 1 SUBROUTINE read_vent(debutphy, step, nbjour, u10m_ec, v10m_ec) 2 USE dimphy 3 USE mod_grid_phy_lmdz 4 USE mod_phys_lmdz_para 5 ! USE write_field_phy 6 IMPLICIT NONE 7 INCLUDE "dimensions.h" 8 ! INCLUDE "dimphy.h" 9 INCLUDE "paramet.h" 10 INCLUDE "netcdf.inc" 11 ! 12 INTEGER :: step, nbjour 13 LOGICAL :: debutphy 14 real :: u10m_ec(klon), v10m_ec(klon) 15 real :: u10m_ec_glo(klon_glo), v10m_ec_glo(klon_glo) 16 ! 17 ! real u10m_nc(iip1,jjp1) !, v10m_nc(iip1,jjm) ! dim 97x72 18 ! real v10m_nc(iip1,jjp1) ! dim 97x73 19 real :: u10m_nc_glo(nbp_lon+1,nbp_lat) !, v10m_nc(iip1,jjm) ! dim 97x72 20 real :: v10m_nc_glo(nbp_lon+1,nbp_lat) ! dim 97x73 21 real :: rcode 22 integer :: ncidu1, varidu1, ncidv1, varidv1 23 save ncidu1, varidu1, ncidv1, varidv1 24 24 !$OMP THREADPRIVATE(ncidu1, varidu1, ncidv1, varidv1) 25 integerstart(4),count(4), status26 integeri, j, ig25 integer :: start(4),count(4), status 26 integer :: i, j, ig 27 27 28 28 29 c 29 ! 30 30 !$OMP MASTER 31 32 33 c 34 35 36 37 38 c 39 40 c 41 42 43 31 IF (is_mpi_root .AND. is_omp_root) THEN 32 if (debutphy) then 33 ! 34 ncidu1=NCOPN('u10m.nc',NCNOWRIT,rcode) 35 varidu1=NCVID(ncidu1,'U10M',rcode) 36 ncidv1=NCOPN('v10m.nc',NCNOWRIT,rcode) 37 varidv1=NCVID(ncidv1,'V10M',rcode) 38 ! 39 endif 40 ! 41 start(1)=1 42 start(2)=1 43 start(4)=0 44 44 45 !count(1)=iip146 47 !count(2)=jjp148 49 50 51 c 52 53 c 45 ! count(1)=iip1 46 count(1)=nbp_lon+1 47 ! count(2)=jjp1 48 count(2)=nbp_lat 49 count(3)=1 50 count(4)=0 51 ! 52 start(3)=step 53 ! 54 54 #ifdef NC_DOUBLE 55 !status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc)56 55 ! status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc) 56 status=NF_GET_VARA_DOUBLE(ncidu1,varidu1,start,count,u10m_nc_glo) 57 57 #else 58 !status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc)59 58 ! status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc) 59 status=NF_GET_VARA_REAL(ncidu1,varidu1,start,count,u10m_nc_glo) 60 60 #endif 61 !print *,status62 c 61 ! print *,status 62 ! 63 63 #ifdef NC_DOUBLE 64 !status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc)65 64 ! status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc) 65 status=NF_GET_VARA_DOUBLE(ncidv1,varidv1,start,count,v10m_nc_glo) 66 66 #else 67 !status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc)68 67 ! status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc) 68 status=NF_GET_VARA_REAL(ncidv1,varidv1,start,count,v10m_nc_glo) 69 69 #endif 70 c 70 ! 71 71 72 !print *,'beforebidcor u10m_nc', u10m_nc(1,jjp1)73 !print *,'beforebidcor v10m_nc', v10m_nc(1,jjp1)72 ! print *,'beforebidcor u10m_nc', u10m_nc(1,jjp1) 73 ! print *,'beforebidcor v10m_nc', v10m_nc(1,jjp1) 74 74 75 !print *,status76 !call correctbid(iim,jjp1,u10m_nc)77 !call correctbid(iim,jjp1,v10m_nc)78 79 75 ! print *,status 76 ! call correctbid(iim,jjp1,u10m_nc) 77 ! call correctbid(iim,jjp1,v10m_nc) 78 call correctbid(nbp_lon,nbp_lat,u10m_nc_glo) 79 call correctbid(nbp_lon,nbp_lat,v10m_nc_glo) 80 80 81 !print *,'afterbidcor u10m_nc', u10m_nc(1,jjp1)82 !print *,'afterbidcor v10m_nc', v10m_nc(1,jjp1)83 c 84 c--upside down + physical grid85 c 86 !u10m_ec(1)=u10m_nc(1,jjp1)87 !v10m_ec(1)=v10m_nc(1,jjp1)88 89 90 91 !DO j=2,jjm92 !DO i = 1, iim93 94 95 !u10m_ec(ig)=u10m_nc(i,jjp1+1-j)96 !v10m_ec(ig)=v10m_nc(i,jjp1+1-j)97 98 99 100 ! print *,u10m_ec(ig) ,v10m_ec(ig) 101 102 103 104 81 ! print *,'afterbidcor u10m_nc', u10m_nc(1,jjp1) 82 ! print *,'afterbidcor v10m_nc', v10m_nc(1,jjp1) 83 ! 84 !--upside down + physical grid 85 ! 86 ! u10m_ec(1)=u10m_nc(1,jjp1) 87 ! v10m_ec(1)=v10m_nc(1,jjp1) 88 u10m_ec_glo(1)=u10m_nc_glo(1,nbp_lat) 89 v10m_ec_glo(1)=v10m_nc_glo(1,nbp_lat) 90 ig=2 91 ! DO j=2,jjm 92 ! DO i = 1, iim 93 DO j=2,nbp_lat-1 94 DO i = 1, nbp_lon 95 ! u10m_ec(ig)=u10m_nc(i,jjp1+1-j) 96 ! v10m_ec(ig)=v10m_nc(i,jjp1+1-j) 97 u10m_ec_glo(ig)=u10m_nc_glo(i,nbp_lat+1-j) 98 v10m_ec_glo(ig)=v10m_nc_glo(i,nbp_lat+1-j) 99 ig=ig+1 100 ! print *,u10m_ec(ig) ,v10m_ec(ig) 101 ENDDO 102 ENDDO 103 u10m_ec_glo(ig)=u10m_nc_glo(1,1) 104 v10m_ec_glo(ig)=v10m_nc_glo(1,1) 105 105 106 106 107 !end if master108 ENDIF107 ! end if master 108 ENDIF 109 109 !$OMP END MASTER 110 110 !$OMP BARRIER 111 112 111 CALL scatter(u10m_ec_glo,u10m_ec) 112 CALL scatter(v10m_ec_glo,v10m_ec) 113 113 114 !print *,'JE tamagno viento ig= ', ig115 !print *,'READ_VENT U = ',SUM(u10m_ec),MINVAL(u10m_ec),116 !. MAXVAL(u10m_ec)117 !print *,'READ_VENT V = ',SUM(v10m_ec),MINVAL(v10m_ec),118 !. MAXVAL(v10m_ec)119 !print *,'u v 1 ', u10m_ec(1),v10m_ec(1)120 !print *,'u v klon ', u10m_ec(klon),v10m_ec(klon)121 RETURN122 END 114 ! print *,'JE tamagno viento ig= ', ig 115 ! print *,'READ_VENT U = ',SUM(u10m_ec),MINVAL(u10m_ec), 116 ! . MAXVAL(u10m_ec) 117 ! print *,'READ_VENT V = ',SUM(v10m_ec),MINVAL(v10m_ec), 118 ! . MAXVAL(v10m_ec) 119 ! print *,'u v 1 ', u10m_ec(1),v10m_ec(1) 120 ! print *,'u v klon ', u10m_ec(klon),v10m_ec(klon) 121 RETURN 122 END SUBROUTINE read_vent 123 123 124 cadded by JE from the nh SPLA, dyn3d/read_reanalyse.F which is not available any more125 126 integeriim,nl127 realx(iim+1,nl)128 integeri,l129 realzz124 ! added by JE from the nh SPLA, dyn3d/read_reanalyse.F which is not available any more 125 subroutine correctbid(iim,nl,x) 126 integer :: iim,nl 127 real :: x(iim+1,nl) 128 integer :: i,l 129 real :: zz 130 130 131 132 133 134 135 cprint*,'correction ',i,l,x(i,l),zz136 137 138 139 131 do l=1,nl 132 do i=2,iim-1 133 if(abs(x(i,l)).gt.1.e10) then 134 zz=0.5*(x(i-1,l)+x(i+1,l)) 135 ! print*,'correction ',i,l,x(i,l),zz 136 x(i,l)=zz 137 endif 138 enddo 139 enddo 140 140 141 142 end141 return 142 end subroutine correctbid 143 143 144 144 -
LMDZ6/trunk/libf/phylmd/Dust/seasalt.f90
r5245 r5246 1 c This subroutine estimateis Sea Salt emission fluxes over 2 c Oceanic surfaces. 3 c 4 SUBROUTINE seasalt(v_10m, u_10m, pct_ocean, lmt_sea_salt) 5 6 USE dimphy 7 IMPLICIT NONE 8 c 9 INCLUDE "dimensions.h" 10 INCLUDE "chem.h" 11 INCLUDE "chem_spla.h" 12 INCLUDE "YOMCST.h" 13 INCLUDE "YOECUMF.h" 14 c 15 INTEGER i, bin !local variables 16 REAL pct_ocean(klon) !hfraction of Ocean in each grid 17 REAL v_10m(klon), u_10m(klon) !V&H components of wind @10 m 18 REAL w_speed_10m(klon) !wind speed at 10m from surface 19 REAL lmt_sea_salt(klon,ss_bins)!sea salt emission flux - mg/m2/s 20 REAL sea_salt_flux(ss_bins) !sea salt emission flux per unit wind speed 1 ! This subroutine estimateis Sea Salt emission fluxes over 2 ! Oceanic surfaces. 3 ! 4 SUBROUTINE seasalt(v_10m, u_10m, pct_ocean, lmt_sea_salt) 21 5 22 REAL wind, ocean 23 c 24 c------Sea salt emission fluxes for each size bin calculated 25 c------based on on parameterisation of Gong et al. (1997). 26 c------Fluxes of sea salt for each size bin are given in mg/m^2/sec 27 c------at wind speed of 1 m/s at 10m height (at 80% RH). 28 c------Fluxes at various wind speeds (@10 m from sea 29 c------surfaces are estimated using relationship: F=flux*U_10^3.14 30 c 31 cnhl for size bin of 0.03-0.5 and 0.5-20 32 DATA sea_salt_flux/4.5E-09,8.7E-7/ 6 USE dimphy 7 IMPLICIT NONE 8 ! 9 INCLUDE "dimensions.h" 10 INCLUDE "chem.h" 11 INCLUDE "chem_spla.h" 12 INCLUDE "YOMCST.h" 13 INCLUDE "YOECUMF.h" 14 ! 15 INTEGER :: i, bin !local variables 16 REAL :: pct_ocean(klon) !hfraction of Ocean in each grid 17 REAL :: v_10m(klon), u_10m(klon) !V&H components of wind @10 m 18 REAL :: w_speed_10m(klon) !wind speed at 10m from surface 19 REAL :: lmt_sea_salt(klon,ss_bins)!sea salt emission flux - mg/m2/s 20 REAL :: sea_salt_flux(ss_bins) !sea salt emission flux per unit wind speed 33 21 34 DO i=1, klon 35 w_speed_10m(i)= (v_10m(i)**2.0+u_10m(i)**2.0)**0.5 36 ENDDO 37 c 38 DO bin=1,ss_bins 39 wind=0.0 40 ocean=0.0 41 DO i=1, klon 42 lmt_sea_salt(i,bin)=sea_salt_flux(bin)*(w_speed_10m(i)**3.41) 43 . *pct_ocean(i)*1.e-4*1.e-3 !g/cm2/s 44 wind=wind+w_speed_10m(i) 45 ocean=ocean+pct_ocean(i) 46 ENDDO 47 ! print *,'Sea Salt flux = ',sea_salt_flux(bin) 48 ENDDO 49 ! print *,'SUM OF WIND = ',wind 50 ! print *,'SUM OF OCEAN SURFACE = ',ocean 51 RETURN 52 END 22 REAL :: wind, ocean 23 ! 24 !------Sea salt emission fluxes for each size bin calculated 25 !------based on on parameterisation of Gong et al. (1997). 26 !------Fluxes of sea salt for each size bin are given in mg/m^2/sec 27 !------at wind speed of 1 m/s at 10m height (at 80% RH). 28 !------Fluxes at various wind speeds (@10 m from sea 29 !------surfaces are estimated using relationship: F=flux*U_10^3.14 30 ! 31 !nhl for size bin of 0.03-0.5 and 0.5-20 32 DATA sea_salt_flux/4.5E-09,8.7E-7/ 33 34 DO i=1, klon 35 w_speed_10m(i)= (v_10m(i)**2.0+u_10m(i)**2.0)**0.5 36 ENDDO 37 ! 38 DO bin=1,ss_bins 39 wind=0.0 40 ocean=0.0 41 DO i=1, klon 42 lmt_sea_salt(i,bin)=sea_salt_flux(bin)*(w_speed_10m(i)**3.41) & 43 *pct_ocean(i)*1.e-4*1.e-3 !g/cm2/s 44 wind=wind+w_speed_10m(i) 45 ocean=ocean+pct_ocean(i) 46 ENDDO 47 ! print *,'Sea Salt flux = ',sea_salt_flux(bin) 48 ENDDO 49 ! print *,'SUM OF WIND = ',wind 50 ! print *,'SUM OF OCEAN SURFACE = ',ocean 51 RETURN 52 END SUBROUTINE seasalt -
LMDZ6/trunk/libf/phylmd/Dust/sediment_mod.f90
r5245 r5246 1 c----- This subroutine calculates the sedimentation flux of Tracers 2 c 3 SUBROUTINE sediment_mod(t_seri,pplay,zrho,paprs,time_step,RHcl, 4 . id_coss,id_codu,id_scdu,5 . ok_chimeredust,6 . sed_ss,sed_dust,sed_dustsco,7 .sed_ss3D,sed_dust3D,sed_dustsco3D,tr_seri)8 cnhl . xlon,xlat,9 c 10 11 12 IMPLICIT NONE13 c 14 15 16 cINCLUDE "dimphy.h"17 18 19 c 20 REALRHcl(klon,klev) ! humidite relative ciel clair21 REALtr_seri(klon, klev,nbtr) !conc of tracers22 REALsed_ss(klon) !sedimentation flux of Sea Salt (g/m2/s)23 REALsed_dust(klon) !sedimentation flux of dust (g/m2/s)24 REALsed_dustsco(klon) !sedimentation flux of scoarse dust (g/m2/s)25 REALsed_ss3D(klon,klev) !sedimentation flux of Sea Salt (g/m2/s)26 REALsed_dust3D(klon,klev) !sedimentation flux of dust (g/m2/s)27 REALsed_dustsco3D(klon,klev) !sedimentation flux of scoarse dust (g/m2/s)28 REALt_seri(klon, klev) !Temperature at mid points of Z (K)29 REALv_dep_ss(klon,klev) ! sed. velocity for SS m/s30 REALv_dep_dust(klon,klev) ! sed. velocity for dust m/s31 REALv_dep_dustsco(klon,klev) ! sed. velocity for dust m/s32 REALpplay(klon, klev) !pressure at mid points of Z (Pa)33 REALzrho(klon, klev) !Density of air at mid points of Z (kg/m3)34 REALpaprs(klon, klev+1) !pressure at interface of layers Z (Pa)35 REALtime_step !time step (sec)36 LOGICALok_chimeredust37 REAL xlat(klon) ! latitudes pour chaque point38 REAL xlon(klon) ! longitudes pour chaque point39 INTEGERid_coss,id_codu,id_scdu40 c 41 c------local variables42 c 43 INTEGERi, k, nbre_RH44 45 c 46 REAL lambda, ss_g47 REAL mmd_ss !mass median diameter of SS (um)48 REAL mmd_dust !mass median diameter of dust (um)49 REAL mmd_dustsco !mass median diameter of scoarse dust (um)50 REALrho_ss(nbre_RH),rho_ss1 !density of sea salt (kg/m3)51 REALrho_dust !density of dust(kg/m3)52 REALv_stokes, CC, v_sed, ss_growth_f(nbre_RH)53 REALsed_flux(klon,klev) ! sedimentation flux g/m2/s54 REALair_visco(klon,klev)55 REALzdz(klon,klev) ! layers height (m)56 REAL temp ! temperature in degree Celius57 c 58 INTEGERRH_num59 REALRH_MAX, DELTA, rh, RH_tab(nbre_RH)60 61 c 62 63 c 64 c 65 DATA rho_ss/2160. ,2160. ,2160., 2160, 1451.6, 1367.9,66 .1302.9,1243.2,1182.7, 1149.5,1111.6, 1063.1/67 c 68 DATA ss_growth_f/0.503, 0.503, 0.503, 0.503, 0.724, 0.782,69 .0.838, 0.905, 1.000, 1.072, 1.188, 1.447/70 c 71 c 72 73 !obsolete mmd_dust=2.8 !micrometer for bin 0.5-20 and 0.5-10 um74 ! 4tracer SPLA: mmd_dust=11.0 !micrometer for bin 0.5-20 and 0.5-10 um75 !3days mmd_dust=3.333464 !micrometer for bin 0.5-20 and 0.5-10 um76 !3days mmd_dustsco=12.91315 !micrometer for bin 0.5-20 and 0.5-10 um77 !JE20140911 mmd_dust=3.002283 !micrometer for bin 0.5-20 and 0.5-10 um78 !JE20140911 mmd_dustsco=13.09771 !micrometer for bin 0.5-20 and 0.5-10 um79 !JE20140911 mmd_dust=5.156346 !micrometer for bin 0.5-20 and 0.5-10 um80 !JE20140911 mmd_dustsco=15.56554 !micrometer for bin 0.5-20 and 0.5-10 um81 IF (ok_chimeredust) THEN82 !JE20150212<< : changes in ustar in dustmod changes emission distribution83 !mmd_dust=3.761212 !micrometer for bin 0.5-3 and 0.5-10 um84 !mmd_dustsco=15.06167 !micrometer for bin 3-20 and 0.5-10 um85 !JE20150212>>86 !JE20150618: Change in div3 of dustmod changes distribution. now is div3=687 !div=3 mmd_dust=3.98376388 !div=3 mmd_dustsco=15.10854 89 90 mmd_dustsco=15.0616791 ELSE92 93 94 95 96 97 98 c 99 c--------- Air viscosity (poise=0.1 kg/m-sec)-----------100 c 101 102 103 c 104 105 c 106 107 c 108 109 air_visco(i,k)=(1.718+0.0049*temp-1.2e-5*temp*temp)*1.e-4110 111 air_visco(i,k)=(1.718+0.0049*temp)*1.e-4112 113 c 114 115 116 c 117 c--------- for Sea Salt -------------------118 c 119 c 120 c 121 122 123 124 c 125 c---cal. correction factor hygroscopic growth of aerosols126 c 127 128 129 130 131 132 c 133 ss_g=ss_growth_f(rh_num) +134 .DELTA*(ss_growth_f(RH_num+1)-ss_growth_f(RH_num))135 136 rho_ss1=rho_ss(rh_num) +137 . DELTA*(rho_ss(RH_num+1)-rho_ss(RH_num))138 c 139 v_stokes=RG*(rho_ss1-zrho(i,k))*!m/sec140 . (mmd_ss*ss_g)*(mmd_ss*ss_g)*141 .1.e-12/(18.0*air_visco(i,k)/10.)142 c 143 144 c 145 CC=1.0+1.257*lambda/(mmd_ss*ss_g)/1.e6 ! C-correction factor146 c 147 148 c 149 c---------check for v_sed*dt<zdz150 c 151 152 v_sed=zdz(i,k)/time_step153 154 c 155 156 157 158 159 c 160 161 162 c 163 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!164 sed_ss3D(:,:)=0.0 ! initialisation165 166 167 168 sed_ss3D(i,k)=sed_ss3D(i,k)-169 .sed_flux(i,k)/zdz(i,k) !!!!!!!!!!!!!!!!!!!!!!170 171 172 c 173 174 175 sed_ss3D(i,k)=sed_ss3D(i,k)+176 .sed_flux(i,k+1)/zdz(i,k) !!!!!!!!177 178 179 180 181 182 183 tr_seri(i,k,id_coss)=tr_seri(i,k,id_coss)+184 ssed_ss3D(i,k)*time_step185 186 187 188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!189 c 190 191 192 193 194 195 196 197 198 c 199 c 200 201 c--------- For dust ------------------202 c 203 c 204 205 206 207 c 208 v_stokes=RG*(rho_dust-zrho(i,k))*!m/sec209 . mmd_dust*mmd_dust*210 .1.e-12/(18.0*air_visco(i,k)/10.)211 c 212 213 214 215 c 216 c---------check for v_sed*dt<zdz217 c 218 219 v_sed=zdz(i,k)/time_step220 221 222 c 223 224 225 226 c 227 228 229 230 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!231 sed_dust3D(:,:)=0.0 ! initialisation232 233 234 235 sed_dust3D(i,k)=sed_dust3D(i,k)-236 .sed_flux(i,k)/zdz(i,k)237 238 239 240 c 241 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!242 243 244 245 sed_dust3D(i,k)=sed_dust3D(i,k) +246 .sed_flux(i,k+1)/zdz(i,k)247 248 249 c 250 251 252 tr_seri(i,k,id_codu)=tr_seri(i,k,id_codu)+253 ssed_dust3D(i,k)*time_step254 255 256 257 258 259 260 261 262 263 264 265 266 c 267 268 269 c--------- For scoarse dust ------------------270 c 271 c 272 273 274 275 c 276 v_stokes=RG*(rho_dust-zrho(i,k))*!m/sec277 . mmd_dustsco*mmd_dustsco*278 .1.e-12/(18.0*air_visco(i,k)/10.)279 c 280 281 282 283 c 284 c---------check for v_sed*dt<zdz285 286 287 288 289 290 291 c 292 293 294 295 c 296 297 298 299 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!300 sed_dustsco3D(:,:)=0.0 ! initialisation301 302 303 304 sed_dustsco3D(i,k)=sed_dustsco3D(i,k)-305 .sed_flux(i,k)/zdz(i,k)306 307 308 c 309 310 311 sed_dustsco3D(i,k)=sed_dustsco3D(i,k) +312 .sed_flux(i,k+1)/zdz(i,k)313 314 315 316 317 318 tr_seri(i,k,id_scdu)=tr_seri(i,k,id_scdu)+319 ssed_dustsco3D(i,k)*time_step320 321 322 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!323 324 325 c 326 327 328 329 330 331 332 333 334 c 335 336 337 338 339 c 340 341 END 1 !----- This subroutine calculates the sedimentation flux of Tracers 2 ! 3 SUBROUTINE sediment_mod(t_seri,pplay,zrho,paprs,time_step,RHcl, & 4 id_coss,id_codu,id_scdu, & 5 ok_chimeredust, & 6 sed_ss,sed_dust,sed_dustsco, & 7 sed_ss3D,sed_dust3D,sed_dustsco3D,tr_seri) 8 !nhl . xlon,xlat, 9 ! 10 USE dimphy 11 USE infotrac 12 IMPLICIT NONE 13 ! 14 INCLUDE "dimensions.h" 15 INCLUDE "chem.h" 16 ! INCLUDE "dimphy.h" 17 INCLUDE "YOMCST.h" 18 INCLUDE "YOECUMF.h" 19 ! 20 REAL :: RHcl(klon,klev) ! humidite relative ciel clair 21 REAL :: tr_seri(klon, klev,nbtr) !conc of tracers 22 REAL :: sed_ss(klon) !sedimentation flux of Sea Salt (g/m2/s) 23 REAL :: sed_dust(klon) !sedimentation flux of dust (g/m2/s) 24 REAL :: sed_dustsco(klon) !sedimentation flux of scoarse dust (g/m2/s) 25 REAL :: sed_ss3D(klon,klev) !sedimentation flux of Sea Salt (g/m2/s) 26 REAL :: sed_dust3D(klon,klev) !sedimentation flux of dust (g/m2/s) 27 REAL :: sed_dustsco3D(klon,klev) !sedimentation flux of scoarse dust (g/m2/s) 28 REAL :: t_seri(klon, klev) !Temperature at mid points of Z (K) 29 REAL :: v_dep_ss(klon,klev) ! sed. velocity for SS m/s 30 REAL :: v_dep_dust(klon,klev) ! sed. velocity for dust m/s 31 REAL :: v_dep_dustsco(klon,klev) ! sed. velocity for dust m/s 32 REAL :: pplay(klon, klev) !pressure at mid points of Z (Pa) 33 REAL :: zrho(klon, klev) !Density of air at mid points of Z (kg/m3) 34 REAL :: paprs(klon, klev+1) !pressure at interface of layers Z (Pa) 35 REAL :: time_step !time step (sec) 36 LOGICAL :: ok_chimeredust 37 REAL :: xlat(klon) ! latitudes pour chaque point 38 REAL :: xlon(klon) ! longitudes pour chaque point 39 INTEGER :: id_coss,id_codu,id_scdu 40 ! 41 !------local variables 42 ! 43 INTEGER :: i, k, nbre_RH 44 PARAMETER(nbre_RH=12) 45 ! 46 REAL :: lambda, ss_g 47 REAL :: mmd_ss !mass median diameter of SS (um) 48 REAL :: mmd_dust !mass median diameter of dust (um) 49 REAL :: mmd_dustsco !mass median diameter of scoarse dust (um) 50 REAL :: rho_ss(nbre_RH),rho_ss1 !density of sea salt (kg/m3) 51 REAL :: rho_dust !density of dust(kg/m3) 52 REAL :: v_stokes, CC, v_sed, ss_growth_f(nbre_RH) 53 REAL :: sed_flux(klon,klev) ! sedimentation flux g/m2/s 54 REAL :: air_visco(klon,klev) 55 REAL :: zdz(klon,klev) ! layers height (m) 56 REAL :: temp ! temperature in degree Celius 57 ! 58 INTEGER :: RH_num 59 REAL :: RH_MAX, DELTA, rh, RH_tab(nbre_RH) 60 PARAMETER (RH_MAX=95.) 61 ! 62 DATA RH_tab/0.,10.,20.,30.,40.,50.,60.,70.,80.,85.,90.,95./ 63 ! 64 ! 65 DATA rho_ss/2160. ,2160. ,2160., 2160, 1451.6, 1367.9, & 66 1302.9,1243.2,1182.7, 1149.5,1111.6, 1063.1/ 67 ! 68 DATA ss_growth_f/0.503, 0.503, 0.503, 0.503, 0.724, 0.782, & 69 0.838, 0.905, 1.000, 1.072, 1.188, 1.447/ 70 ! 71 ! 72 mmd_ss=12.7 !dia -um at 80% for bin 0.5-20 um but 90% of real mmd 73 ! obsolete mmd_dust=2.8 !micrometer for bin 0.5-20 and 0.5-10 um 74 ! 4tracer SPLA: mmd_dust=11.0 !micrometer for bin 0.5-20 and 0.5-10 um 75 !3days mmd_dust=3.333464 !micrometer for bin 0.5-20 and 0.5-10 um 76 !3days mmd_dustsco=12.91315 !micrometer for bin 0.5-20 and 0.5-10 um 77 !JE20140911 mmd_dust=3.002283 !micrometer for bin 0.5-20 and 0.5-10 um 78 !JE20140911 mmd_dustsco=13.09771 !micrometer for bin 0.5-20 and 0.5-10 um 79 !JE20140911 mmd_dust=5.156346 !micrometer for bin 0.5-20 and 0.5-10 um 80 !JE20140911 mmd_dustsco=15.56554 !micrometer for bin 0.5-20 and 0.5-10 um 81 IF (ok_chimeredust) THEN 82 !JE20150212<< : changes in ustar in dustmod changes emission distribution 83 ! mmd_dust=3.761212 !micrometer for bin 0.5-3 and 0.5-10 um 84 ! mmd_dustsco=15.06167 !micrometer for bin 3-20 and 0.5-10 um 85 !JE20150212>> 86 !JE20150618: Change in div3 of dustmod changes distribution. now is div3=6 87 !div=3 mmd_dust=3.983763 88 !div=3 mmd_dustsco=15.10854 89 mmd_dust=3.898047 90 mmd_dustsco=15.06167 91 ELSE 92 mmd_dust=11.0 !micrometer for bin 0.5-20 and 0.5-10 um 93 mmd_dustsco=100. ! absurd value, bin not used in this scheme 94 ENDIF 95 96 97 rho_dust=2600. !kg/m3 98 ! 99 !--------- Air viscosity (poise=0.1 kg/m-sec)----------- 100 ! 101 DO k=1, klev 102 DO i=1, klon 103 ! 104 zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG 105 ! 106 temp=t_seri(i,k)-RTT 107 ! 108 IF (temp.LT.0.) THEN 109 air_visco(i,k)=(1.718+0.0049*temp-1.2e-5*temp*temp)*1.e-4 110 ELSE 111 air_visco(i,k)=(1.718+0.0049*temp)*1.e-4 112 ENDIF 113 ! 114 ENDDO 115 ENDDO 116 ! 117 !--------- for Sea Salt ------------------- 118 ! 119 ! 120 ! 121 IF(id_coss>0) THEN 122 DO k=1, klev 123 DO i=1,klon 124 ! 125 !---cal. correction factor hygroscopic growth of aerosols 126 ! 127 rh=MIN(RHcl(i,k)*100.,RH_MAX) 128 RH_num = INT( rh/10. + 1.) 129 IF (rh.gt.85.) RH_num=10 130 IF (rh.gt.90.) RH_num=11 131 DELTA=(rh-RH_tab(RH_num))/(RH_tab(RH_num+1)-RH_tab(RH_num)) 132 ! 133 ss_g=ss_growth_f(rh_num) + & 134 DELTA*(ss_growth_f(RH_num+1)-ss_growth_f(RH_num)) 135 136 rho_ss1=rho_ss(rh_num) + & 137 DELTA*(rho_ss(RH_num+1)-rho_ss(RH_num)) 138 ! 139 v_stokes=RG*(rho_ss1-zrho(i,k))* & !m/sec 140 (mmd_ss*ss_g)*(mmd_ss*ss_g)* & 141 1.e-12/(18.0*air_visco(i,k)/10.) 142 ! 143 lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15) 144 ! 145 CC=1.0+1.257*lambda/(mmd_ss*ss_g)/1.e6 ! C-correction factor 146 ! 147 v_sed=v_stokes*CC ! m/sec !orig 148 ! 149 !---------check for v_sed*dt<zdz 150 ! 151 IF (v_sed*time_step.GT.zdz(i,k)) THEN 152 v_sed=zdz(i,k)/time_step 153 ENDIF 154 ! 155 v_dep_ss(i,k)= v_sed 156 sed_flux(i,k)= tr_seri(i,k,id_coss)*v_sed !g/cm3*m/sec 157 ! !sed_ss3D(i,k)= -sed_flux(i,k)/zdz(i,k) !g/cm3*sec !!!!!!! 158 ! ! conc_sed_ss3D(i,k)=sed_flux(i,k)*1.e6 !g/m3*sec !!!!!!! 159 ! 160 ENDDO !klon 161 ENDDO !klev 162 ! 163 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 164 sed_ss3D(:,:)=0.0 ! initialisation 165 166 DO k=1, klev 167 DO i=1, klon 168 sed_ss3D(i,k)=sed_ss3D(i,k)- & 169 sed_flux(i,k)/zdz(i,k) !!!!!!!!!!!!!!!!!!!!!! 170 ENDDO !klon 171 ENDDO !klev 172 ! 173 DO k=1, klev-1 174 DO i=1, klon 175 sed_ss3D(i,k)=sed_ss3D(i,k)+ & 176 sed_flux(i,k+1)/zdz(i,k) !!!!!!!! 177 178 ENDDO !klon 179 ENDDO !klev 180 181 DO k = 1, klev 182 DO i = 1, klon 183 tr_seri(i,k,id_coss)=tr_seri(i,k,id_coss)+ & 184 sed_ss3D(i,k)*time_step 185 ENDDO 186 ENDDO 187 188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 189 ! 190 DO i=1, klon 191 sed_ss(i)=sed_flux(i,1)*1.e6*1.e3 !--unit mg/m2/s 192 ENDDO !klon 193 ELSE 194 DO i=1, klon 195 sed_ss(i)=0. 196 ENDDO 197 ENDIF 198 ! 199 ! 200 201 !--------- For dust ------------------ 202 ! 203 ! 204 IF(id_codu>0) THEN 205 DO k=1, klev 206 DO i=1,klon 207 ! 208 v_stokes=RG*(rho_dust-zrho(i,k))* & !m/sec 209 mmd_dust*mmd_dust* & 210 1.e-12/(18.0*air_visco(i,k)/10.) 211 ! 212 lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15) 213 CC=1.0+1.257*lambda/(mmd_dust)/1.e6 !dimensionless 214 v_sed=v_stokes*CC !m/sec 215 ! 216 !---------check for v_sed*dt<zdz 217 ! 218 IF (v_sed*time_step.GT.zdz(i,k)) THEN 219 v_sed=zdz(i,k)/time_step 220 ENDIF 221 222 ! 223 v_dep_dust(i,k)= v_sed 224 sed_flux(i,k) = tr_seri(i,k,id_codu)*v_sed !g/cm3.m/sec 225 ! !sed_dust3D(i,k)= -sed_flux(i,k)/zdz(i,k) !g/cm3*sec !!!!!!! 226 ! 227 ENDDO !klon 228 ENDDO !klev 229 230 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 231 sed_dust3D(:,:)=0.0 ! initialisation 232 233 DO k=1, klev 234 DO i=1, klon 235 sed_dust3D(i,k)=sed_dust3D(i,k)- & 236 sed_flux(i,k)/zdz(i,k) 237 ENDDO !klon 238 ENDDO !klev 239 240 ! 241 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 242 243 DO k=1, klev-1 244 DO i=1, klon 245 sed_dust3D(i,k)=sed_dust3D(i,k) + & 246 sed_flux(i,k+1)/zdz(i,k) 247 ENDDO !klon 248 ENDDO !klev 249 ! 250 DO k = 1, klev 251 DO i = 1, klon 252 tr_seri(i,k,id_codu)=tr_seri(i,k,id_codu)+ & 253 sed_dust3D(i,k)*time_step 254 ENDDO 255 ENDDO 256 257 258 DO i=1, klon 259 sed_dust(i)=sed_flux(i,1)*1.e6*1.e3 !--unit mg/m2/s 260 ENDDO !klon 261 ELSE 262 DO i=1, klon 263 sed_dust(i)=0. 264 ENDDO 265 ENDIF 266 ! 267 268 269 !--------- For scoarse dust ------------------ 270 ! 271 ! 272 IF(id_scdu>0) THEN 273 DO k=1, klev 274 DO i=1,klon 275 ! 276 v_stokes=RG*(rho_dust-zrho(i,k))* & !m/sec 277 mmd_dustsco*mmd_dustsco* & 278 1.e-12/(18.0*air_visco(i,k)/10.) 279 ! 280 lambda=6.6*1.e-8*(103125/pplay(i,k))*(t_seri(i,k)/293.15) 281 CC=1.0+1.257*lambda/(mmd_dustsco)/1.e6 !dimensionless 282 v_sed=v_stokes*CC !m/sec 283 ! 284 !---------check for v_sed*dt<zdz 285 286 287 IF (v_sed*time_step.GT.zdz(i,k)) THEN 288 v_sed=zdz(i,k)/time_step 289 ENDIF 290 291 ! 292 v_dep_dustsco(i,k)= v_sed 293 sed_flux(i,k) = tr_seri(i,k,id_scdu)*v_sed !g/cm3.m/sec 294 ! !sed_dustsco3D(i,k)= -sed_flux(i,k)/zdz(i,k) !g/cm3*sec !!!!!!! 295 ! 296 ENDDO !klon 297 ENDDO !klev 298 299 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 300 sed_dustsco3D(:,:)=0.0 ! initialisation 301 302 DO k=1, klev 303 DO i=1, klon 304 sed_dustsco3D(i,k)=sed_dustsco3D(i,k)- & 305 sed_flux(i,k)/zdz(i,k) 306 ENDDO !klon 307 ENDDO !klev 308 ! 309 DO k=1, klev-1 310 DO i=1, klon 311 sed_dustsco3D(i,k)=sed_dustsco3D(i,k) + & 312 sed_flux(i,k+1)/zdz(i,k) 313 ENDDO !klon 314 ENDDO !klev 315 316 DO k = 1, klev 317 DO i = 1, klon 318 tr_seri(i,k,id_scdu)=tr_seri(i,k,id_scdu)+ & 319 sed_dustsco3D(i,k)*time_step 320 ENDDO 321 ENDDO 322 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 323 324 325 ! 326 DO i=1, klon 327 sed_dustsco(i)=sed_flux(i,1)*1.e6*1.e3 !--unit mg/m2/s 328 ENDDO !klon 329 ELSE 330 DO i=1, klon 331 sed_dustsco(i)=0. 332 ENDDO 333 ENDIF 334 ! 335 336 337 338 339 ! 340 RETURN 341 END SUBROUTINE sediment_mod -
LMDZ6/trunk/libf/phylmd/Dust/tiedqneg.f90
r5245 r5246 1 2 c 3 4 5 c======================================================================6 cAuteur(s): CG (LGGE/CNRS) date: 199502017 cO. Boucher (LOA/CNRS) date 199611258 cObjet: Correction eventuelle des valeurs negatives d'humidite9 c induites par le schema de convection de Tiedke 10 c======================================================================11 cArguments:12 cpres_h--input-R-la valeur de la pression aux interfaces13 cq-------input-R-quantite de traceur14 cd_q-----input-output-R-increment du traceur15 c======================================================================16 c 17 18 cINCLUDE "dimphy.h"19 REALpres_h(klon,klev+1)20 REALq(klon,klev)21 REALd_q(klon,klev)22 INTEGERnb_neg23 INTEGERi, l24 c 25 REALqmin26 27 c 28 29 30 31 IF (q(i,l)+d_q(i,l).LT.qmin) THEN32 33 d_q(i,l-1) = d_q(i,l-1) + (q(i,l)+d_q(i,l)-qmin)34 .*(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l-1)-pres_h(i,l))35 36 37 38 c IF (nb_neg.NE.0) THEN 39 cPRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'40 cENDIF41 42 c 43 44 45 46 47 48 d_q(i,l+1) = d_q(i,l+1) + (q(i,l)+d_q(i,l)-qmin)49 .*(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l+1)-pres_h(i,l+2))50 51 52 53 c IF (nb_neg.NE.0) THEN 54 cPRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives'55 cENDIF56 57 c 58 59 60 IF (q(i,l)+d_q(i,l).LT.qmin) THEN61 62 63 64 c 65 66 END 1 SUBROUTINE tiedqneg (pres_h,q,d_q) 2 ! 3 USE dimphy 4 IMPLICIT none 5 !====================================================================== 6 ! Auteur(s): CG (LGGE/CNRS) date: 19950201 7 ! O. Boucher (LOA/CNRS) date 19961125 8 ! Objet: Correction eventuelle des valeurs negatives d'humidite 9 ! induites par le schema de convection de Tiedke 10 !====================================================================== 11 ! Arguments: 12 ! pres_h--input-R-la valeur de la pression aux interfaces 13 ! q-------input-R-quantite de traceur 14 ! d_q-----input-output-R-increment du traceur 15 !====================================================================== 16 ! 17 INCLUDE "dimensions.h" 18 ! INCLUDE "dimphy.h" 19 REAL :: pres_h(klon,klev+1) 20 REAL :: q(klon,klev) 21 REAL :: d_q(klon,klev) 22 INTEGER :: nb_neg 23 INTEGER :: i, l 24 ! 25 REAL :: qmin 26 PARAMETER (qmin=0.0) 27 ! 28 DO l = klev,2,-1 29 nb_neg = 0 30 DO i = 1,klon 31 IF (q(i,l)+d_q(i,l).LT.qmin) THEN 32 nb_neg = nb_neg + 1 33 d_q(i,l-1) = d_q(i,l-1) + (q(i,l)+d_q(i,l)-qmin) & 34 *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l-1)-pres_h(i,l)) 35 d_q(i,l) = qmin - q(i,l) 36 ENDIF 37 ENDDO 38 ! IF (nb_neg.NE.0) THEN 39 ! PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives' 40 ! ENDIF 41 ENDDO 42 ! 43 DO l = 1, klev-1 44 nb_neg = 0 45 DO i = 1,klon 46 IF (q(i,l)+d_q(i,l).LT.qmin) THEN 47 nb_neg = nb_neg + 1 48 d_q(i,l+1) = d_q(i,l+1) + (q(i,l)+d_q(i,l)-qmin) & 49 *(pres_h(i,l)-pres_h(i,l+1))/(pres_h(i,l+1)-pres_h(i,l+2)) 50 d_q(i,l) = qmin - q(i,l) 51 ENDIF 52 ENDDO 53 ! IF (nb_neg.NE.0) THEN 54 ! PRINT *,'niveau ', l,' ' , nb_neg, ' valeurs negatives' 55 ! ENDIF 56 ENDDO 57 ! 58 l = klev 59 DO i = 1,klon 60 IF (q(i,l)+d_q(i,l).LT.qmin) THEN 61 d_q(i,l) = qmin - q(i,l) 62 ENDIF 63 ENDDO 64 ! 65 RETURN 66 END SUBROUTINE tiedqneg -
LMDZ6/trunk/libf/phylmd/Dust/trconvect.f90
r5245 r5246 1 cSubroutine that computes the convective mixing and transport2 SUBROUTINE trconvect(pplay,t_seri,pdtphys,pmfu,pmfd,pen_u,pde_u, 3 . pen_d,pde_d,paprs,zdz,xconv,qmin,qmax,lminmax,masse,4 .dtrconv,tr_seri)1 ! Subroutine that computes the convective mixing and transport 2 SUBROUTINE trconvect(pplay,t_seri,pdtphys,pmfu,pmfd,pen_u,pde_u, & 3 pen_d,pde_d,paprs,zdz,xconv,qmin,qmax,lminmax,masse, & 4 dtrconv,tr_seri) 5 5 6 7 8 6 USE dimphy 7 USE infotrac 8 USE indice_sol_mod 9 9 10 10 IMPLICIT NONE 11 11 12 13 14 15 12 INCLUDE "dimensions.h" 13 INCLUDE "chem.h" 14 INCLUDE "YOMCST.h" 15 INCLUDE "paramet.h" 16 16 17 c============================= INPUT ===================================18 REALqmin, qmax19 REALxconv(nbtr), masse(nbtr)20 REALpplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa)21 REAL t_seri(klon,klev) ! temperature22 REALzdz(klon,klev) ! zdz23 REALpaprs(klon,klev+1) ! pression pour chaque inter-couche (en Pa)24 REALpmfu(klon,klev) ! flux de masse dans le panache montant25 REALpmfd(klon,klev) ! flux de masse dans le panache descendant26 REALpen_u(klon,klev) ! flux entraine dans le panache montant27 REALpde_u(klon,klev) ! flux detraine dans le panache montant28 REALpen_d(klon,klev) ! flux entraine dans le panache descendant29 REAL pde_d(klon,klev) ! flux detraine dans le panache descendant30 LOGICALlminmax31 REALpdtphys32 c============================= OUTPUT ==================================33 REALaux_var1(klon,klev)34 REALaux_var2(klon,klev)35 REALtr_seri(klon,klev,nbtr) ! traceur36 REALdtrconv(klon,nbtr) ! traceur37 c========================= LOCAL VARIABLES =============================38 INTEGERit, k, i, j39 REALd_tr(klon,klev,nbtr)17 !============================= INPUT =================================== 18 REAL :: qmin, qmax 19 REAL :: xconv(nbtr), masse(nbtr) 20 REAL :: pplay(klon,klev) ! pression pour le mileu de chaque couche (en Pa) 21 REAL :: t_seri(klon,klev) ! temperature 22 REAL :: zdz(klon,klev) ! zdz 23 REAL :: paprs(klon,klev+1) ! pression pour chaque inter-couche (en Pa) 24 REAL :: pmfu(klon,klev) ! flux de masse dans le panache montant 25 REAL :: pmfd(klon,klev) ! flux de masse dans le panache descendant 26 REAL :: pen_u(klon,klev) ! flux entraine dans le panache montant 27 REAL :: pde_u(klon,klev) ! flux detraine dans le panache montant 28 REAL :: pen_d(klon,klev) ! flux entraine dans le panache descendant 29 REAL :: pde_d(klon,klev) ! flux detraine dans le panache descendant 30 LOGICAL :: lminmax 31 REAL :: pdtphys 32 !============================= OUTPUT ================================== 33 REAL :: aux_var1(klon,klev) 34 REAL :: aux_var2(klon,klev) 35 REAL :: tr_seri(klon,klev,nbtr) ! traceur 36 REAL :: dtrconv(klon,nbtr) ! traceur 37 !========================= LOCAL VARIABLES ============================= 38 INTEGER :: it, k, i, j 39 REAL :: d_tr(klon,klev,nbtr) 40 40 41 EXTERNAL nflxtr, tiedqneg, minmaxqfi 42 43 DO it=1, nbtr 44 c 45 DO i=1, klon 46 dtrconv(i,it)=0.0 47 ENDDO 48 DO i=1,klon 49 DO j=1,klev 50 aux_var1(i,j)=tr_seri(i,j,it) 51 aux_var2(i,j)=d_tr(i,j,it) 52 ENDDO 53 ENDDO 54 55 c 56 cnhl CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, 57 cnhl . pplay, paprs, tr_seri(1,1,it), d_tr(1,1,it) ) 58 CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, 59 . pplay, paprs, aux_var1, aux_var2 ) 60 c 61 CALL tiedqneg(paprs,aux_var1, aux_var2) 62 cnhl CALL tiedqneg(paprs,tr_seri(1,1,it), d_tr(1,1,it)) 63 DO i=1,klon 64 DO j=1,klev 65 tr_seri(i,j,it)=aux_var1(i,j) 66 d_tr(i,j,it)=aux_var2(i,j) 67 ENDDO 68 ENDDO 69 c 70 DO k = 1, klev 71 DO i = 1, klon 72 IF (d_tr(i,k,it).LT.0.) THEN 73 tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it) 74 ELSE 75 tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)*xconv(it) 76 ENDIF 77 ENDDO 78 ENDDO 79 c 80 cnhl CALL kg_to_cm3(pplay,t_seri,d_tr(1,1,it)) 81 CALL kg_to_cm3(pplay,t_seri,aux_var2) 82 DO i=1,klon 83 DO j=1,klev 84 d_tr(i,j,it)=aux_var2(i,j) 85 ENDDO 86 ENDDO 41 EXTERNAL nflxtr, tiedqneg, minmaxqfi 87 42 88 DO k = 1, klev 89 DO i = 1, klon 90 IF (d_tr(i,k,it).GE.0.) THEN 91 dtrconv(i,it)=dtrconv(i,it)+(1.-xconv(it))*d_tr(i,k,it) 92 . /RNAVO*masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys 93 ENDIF 94 ENDDO 95 ENDDO 43 DO it=1, nbtr 44 ! 45 DO i=1, klon 46 dtrconv(i,it)=0.0 47 ENDDO 48 DO i=1,klon 49 DO j=1,klev 50 aux_var1(i,j)=tr_seri(i,j,it) 51 aux_var2(i,j)=d_tr(i,j,it) 52 ENDDO 53 ENDDO 96 54 97 IF (lminmax) THEN 98 DO i=1,klon 99 DO j=1,klev 100 aux_var1(i,j)=tr_seri(i,j,it) 101 ENDDO 102 ENDDO 103 CALL minmaxqfi(aux_var1,qmin,qmax,'apr convection') 104 cnhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'apr convection') 105 DO i=1,klon 106 DO j=1,klev 107 tr_seri(i,j,it)=aux_var1(i,j) 108 ENDDO 109 ENDDO 110 ENDIF 111 c 112 ENDDO 55 ! 56 !nhl CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, 57 !nhl . pplay, paprs, tr_seri(1,1,it), d_tr(1,1,it) ) 58 CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, & 59 pplay, paprs, aux_var1, aux_var2 ) 60 ! 61 CALL tiedqneg(paprs,aux_var1, aux_var2) 62 !nhl CALL tiedqneg(paprs,tr_seri(1,1,it), d_tr(1,1,it)) 63 DO i=1,klon 64 DO j=1,klev 65 tr_seri(i,j,it)=aux_var1(i,j) 66 d_tr(i,j,it)=aux_var2(i,j) 67 ENDDO 68 ENDDO 69 ! 70 DO k = 1, klev 71 DO i = 1, klon 72 IF (d_tr(i,k,it).LT.0.) THEN 73 tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it) 74 ELSE 75 tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr(i,k,it)*xconv(it) 76 ENDIF 77 ENDDO 78 ENDDO 79 ! 80 !nhl CALL kg_to_cm3(pplay,t_seri,d_tr(1,1,it)) 81 CALL kg_to_cm3(pplay,t_seri,aux_var2) 82 DO i=1,klon 83 DO j=1,klev 84 d_tr(i,j,it)=aux_var2(i,j) 85 ENDDO 86 ENDDO 113 87 114 END 88 DO k = 1, klev 89 DO i = 1, klon 90 IF (d_tr(i,k,it).GE.0.) THEN 91 dtrconv(i,it)=dtrconv(i,it)+(1.-xconv(it))*d_tr(i,k,it) & 92 /RNAVO*masse(it)*1.e3*1.e6*zdz(i,k)/pdtphys 93 ENDIF 94 ENDDO 95 ENDDO 96 97 IF (lminmax) THEN 98 DO i=1,klon 99 DO j=1,klev 100 aux_var1(i,j)=tr_seri(i,j,it) 101 ENDDO 102 ENDDO 103 CALL minmaxqfi(aux_var1,qmin,qmax,'apr convection') 104 !nhl CALL minmaxqfi(tr_seri(1,1,it),qmin,qmax,'apr convection') 105 DO i=1,klon 106 DO j=1,klev 107 tr_seri(i,j,it)=aux_var1(i,j) 108 ENDDO 109 ENDDO 110 ENDIF 111 ! 112 ENDDO 113 114 END SUBROUTINE trconvect
Note: See TracChangeset
for help on using the changeset viewer.