- Timestamp:
- Mar 27, 2026, 9:18:02 PM (2 weeks ago)
- Location:
- LMDZ6/trunk/libf
- Files:
-
- 2 edited
-
phylmd/physiq_mod.F90 (modified) (5 diffs)
-
phylmdiso/physiq_mod.F90 (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/physiq_mod.F90
r6142 r6145 3802 3802 3803 3803 3804 3805 3804 DO k = 1, klev 3806 3805 DO i = 1, klon … … 3929 3928 ! profonde. 3930 3929 3931 !IM/FH: 2011/02/233932 ! definition des points sur lesquels ls thermiques sont actifs3933 3930 3934 3931 DO k=1,klev … … 3966 3963 ENDIF 3967 3964 3968 !===============================================================================3969 ! Interactive chemistry through coupling with INCA or REPROBUS chemistry models3970 !3971 3972 IF (ANY(type_trac == ['inca','inco'])) THEN ! ModThL3973 IF (CPPKEY_INCA) THEN3974 CALL VTe(VTphysiq)3975 CALL VTb(VTinca)3976 calday = REAL(days_elapsed + 1) + jH_cur3977 3978 CALL chemtime(itap+itau_phy-1, date0, phys_tstep, itap)3979 CALL AEROSOL_METEO_CALC( &3980 calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, &3981 prfl,psfl,pctsrf,cell_area, &3982 latitude_deg,longitude_deg,u10m,v10m)3983 3984 zxsnow_dummy(:) = 0.03985 ! INCA needs a cloud fraction that is not necessarily that3986 ! for radiation. Here we provide a cloud fraction calculated3987 ! the same manner as that in LMDZ5, LMDZ6 and LMDZ73988 DO k=1,klev3989 DO i=1,klon3990 cldfra_inca(i,k)=min(rneb(i,k)+rnebcon(i,k),1.)3991 ENDDO3992 ENDDO3993 3994 3995 CALL chemhook_begin (calday, &3996 days_elapsed+1, &3997 jH_cur, &3998 pctsrf(1,1), &3999 latitude_deg, &4000 longitude_deg, &4001 cell_area, &4002 paprs, &4003 pplay, &4004 coefh(1:klon,1:klev,is_ave), &4005 pphi, &4006 t_seri, &4007 u, &4008 v, &4009 rot, &4010 wo(:, :, 1), &4011 q_seri, &4012 zxtsol, &4013 zt2m, &4014 zxsnow_dummy, &4015 solsw, &4016 albsol1, &4017 rain_fall, &4018 snow_fall, &4019 itop_con, &4020 ibas_con, &4021 cldfra_inca, &4022 nbp_lon, &4023 nbp_lat-1, &4024 tr_seri(:,:,1+nqCO2:nbtr), &4025 ftsol, &4026 paprs, &4027 cdragh, &4028 cdragm, &4029 pctsrf, &4030 pdtphys, &4031 itap)4032 4033 CALL VTe(VTinca)4034 CALL VTb(VTphysiq)4035 END IF4036 ENDIF !type_trac = inca or inco4037 4038 IF (type_trac == 'repr') THEN4039 IF (CPPKEY_REPROBUS) THEN4040 CALL chemtime_rep(itap+itau_phy-1, date0, phys_tstep, itap)4041 END IF4042 ENDIF4043 4044 4045 !===============================================================================4046 ! Radiative scheme and associated aerosols4047 !4048 ! Note that the following routines are called every radpas time steps4049 4050 IF (MOD(itaprad,radpas).EQ.0) THEN4051 4052 !4053 !jq - introduce the aerosol direct and first indirect radiative forcings4054 !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)4055 IF (flag_aerosol .GT. 0) THEN4056 IF (iflag_rrtm .EQ. 0) THEN !--old radiation4057 IF (.NOT. aerosol_couple) THEN4058 !4059 CALL readaerosol_optic( &4060 debut, flag_aerosol, itap, jD_cur-jD_ref, &4061 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &4062 mass_solu_aero, mass_solu_aero_pi, &4063 tau_aero, piz_aero, cg_aero, &4064 tausum_aero, tau3d_aero)4065 ENDIF4066 ELSE IF (iflag_rrtm .EQ.1) THEN ! RRTM radiation4067 IF (aerosol_couple .AND. config_inca == 'aero' ) THEN4068 abort_message='config_inca=aero et rrtm=1 impossible'4069 CALL abort_physic(modname,abort_message,1)4070 ELSE4071 !4072 #ifdef CPP_RRTM4073 IF (NSW.EQ.6) THEN4074 !--new aerosol properties SW and LW4075 !4076 IF (CPPKEY_DUST) THEN4077 !--SPL aerosol model4078 CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, &4079 tr_seri, mass_solu_aero, mass_solu_aero_pi, &4080 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &4081 tausum_aero, tau3d_aero)4082 ELSE4083 !--climatologies or INCA aerosols4084 CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, ok_volcan, &4085 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &4086 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &4087 tr_seri, mass_solu_aero, mass_solu_aero_pi, &4088 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &4089 tausum_aero, drytausum_aero, tau3d_aero)4090 END IF4091 4092 IF (flag_aerosol .EQ. 7) THEN4093 CALL macv2sp(pphis,pplay,paprs,longitude_deg,latitude_deg, &4094 tau_aero_sw_rrtm,piz_aero_sw_rrtm,cg_aero_sw_rrtm,dNovrN)4095 ENDIF4096 4097 !4098 ELSE IF (NSW.EQ.2) THEN4099 !--for now we use the old aerosol properties4100 !4101 CALL readaerosol_optic( &4102 debut, flag_aerosol, itap, jD_cur-jD_ref, &4103 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &4104 mass_solu_aero, mass_solu_aero_pi, &4105 tau_aero, piz_aero, cg_aero, &4106 tausum_aero, tau3d_aero)4107 !4108 !--natural aerosols4109 tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:)4110 piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:)4111 cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:)4112 !--all aerosols4113 tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:)4114 piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:)4115 cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:)4116 !4117 !--no LW optics4118 tau_aero_lw_rrtm(:,:,:,:) = 1.e-154119 !4120 ELSE4121 abort_message='Only NSW=2 or 6 are possible with ' &4122 // 'aerosols and iflag_rrtm=1'4123 CALL abort_physic(modname,abort_message,1)4124 ENDIF4125 #else4126 abort_message='You should compile with -rrtm if running ' &4127 // 'with iflag_rrtm=1'4128 CALL abort_physic(modname,abort_message,1)4129 #endif4130 !4131 ENDIF4132 ELSE IF (iflag_rrtm .EQ.2) THEN ! ecrad RADIATION4133 #ifdef CPP_ECRAD4134 !--climatologies or INCA aerosols4135 CALL readaerosol_optic_ecrad( debut, aerosol_couple, ok_alw, ok_volcan, &4136 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &4137 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &4138 tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer)4139 #else4140 abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2'4141 CALL abort_physic(modname,abort_message,1)4142 #endif4143 ENDIF4144 4145 ELSE !--flag_aerosol = 04146 tausum_aero(:,:,:) = 0.4147 drytausum_aero(:,:) = 0.4148 mass_solu_aero(:,:) = 0.4149 mass_solu_aero_pi(:,:) = 0.4150 IF (iflag_rrtm .EQ. 0) THEN !--old radiation4151 tau_aero(:,:,:,:) = 1.e-154152 piz_aero(:,:,:,:) = 1.4153 cg_aero(:,:,:,:) = 0.4154 ELSE4155 tau_aero_sw_rrtm(:,:,:,:) = 1.e-154156 tau_aero_lw_rrtm(:,:,:,:) = 1.e-154157 piz_aero_sw_rrtm(:,:,:,:) = 1.04158 cg_aero_sw_rrtm(:,:,:,:) = 0.04159 ENDIF4160 ENDIF4161 !4162 !--WMO criterion to determine tropopause4163 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)4164 !4165 !--STRAT AEROSOL4166 !--updates tausum_aero,tau_aero,piz_aero,cg_aero4167 IF (flag_aerosol_strat.GT.0) THEN4168 IF (prt_level .GE.10) THEN4169 PRINT *,'appel a readaerosolstrat', mth_cur4170 ENDIF4171 IF (iflag_rrtm.EQ.0) THEN4172 IF (flag_aerosol_strat.EQ.1) THEN4173 CALL readaerosolstrato(debut)4174 ELSE4175 abort_message='flag_aerosol_strat must equal 1 for rrtm=0'4176 CALL abort_physic(modname,abort_message,1)4177 ENDIF4178 ELSE4179 #ifdef CPP_RRTM4180 IF (.NOT. CPPKEY_STRATAER) THEN4181 !--prescribed strat aerosols4182 !--only in the case of non-interactive strat aerosols4183 IF (flag_aerosol_strat.EQ.1) THEN4184 CALL readaerosolstrato1_rrtm(debut)4185 ELSEIF (flag_aerosol_strat.EQ.2) THEN4186 CALL readaerosolstrato2_rrtm(debut, ok_volcan)4187 ELSE4188 abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1'4189 CALL abort_physic(modname,abort_message,1)4190 ENDIF4191 END IF4192 #else4193 abort_message='You should compile with -rrtm if running ' &4194 // 'with iflag_rrtm=1'4195 CALL abort_physic(modname,abort_message,1)4196 #endif4197 ENDIF4198 ELSE4199 tausum_aero(:,:,id_STRAT_phy) = 0.4200 ENDIF4201 !4202 #ifdef CPP_RRTM4203 IF (CPPKEY_STRATAER) THEN4204 !--compute stratospheric mask4205 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)4206 !--interactive strat aerosols4207 CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut)4208 END IF4209 #endif4210 !--fin STRAT AEROSOL4211 !4212 3965 4213 3966 ! Calculer les parametres optiques des nuages et quelques … … 4231 3984 CALL call_cloud_optics_prop_post() 4232 3985 4233 !3986 4234 3987 !IM betaCRF 4235 3988 ! … … 4291 4044 ! 4292 4045 ENDIF 4046 4047 4048 4049 !=============================================================================== 4050 ! Interactive chemistry through coupling with INCA or REPROBUS chemistry models 4051 ! 4052 4053 IF (ANY(type_trac == ['inca','inco'])) THEN ! ModThL 4054 IF (CPPKEY_INCA) THEN 4055 CALL VTe(VTphysiq) 4056 CALL VTb(VTinca) 4057 calday = REAL(days_elapsed + 1) + jH_cur 4058 4059 CALL chemtime(itap+itau_phy-1, date0, phys_tstep, itap) 4060 CALL AEROSOL_METEO_CALC( & 4061 calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, & 4062 prfl,psfl,pctsrf,cell_area, & 4063 latitude_deg,longitude_deg,u10m,v10m) 4064 4065 zxsnow_dummy(:) = 0.0 4066 ! INCA needs a cloud fraction that is not necessarily that 4067 ! for radiation. Here we provide a cloud fraction calculated 4068 ! the same manner as that in LMDZ5, LMDZ6 and LMDZ7 4069 DO k=1,klev 4070 DO i=1,klon 4071 cldfra_inca(i,k)=min(rneb(i,k)+rnebcon(i,k),1.) 4072 ENDDO 4073 ENDDO 4074 4075 4076 CALL chemhook_begin (calday, & 4077 days_elapsed+1, & 4078 jH_cur, & 4079 pctsrf(1,1), & 4080 latitude_deg, & 4081 longitude_deg, & 4082 cell_area, & 4083 paprs, & 4084 pplay, & 4085 coefh(1:klon,1:klev,is_ave), & 4086 pphi, & 4087 t_seri, & 4088 u, & 4089 v, & 4090 rot, & 4091 wo(:, :, 1), & 4092 q_seri, & 4093 zxtsol, & 4094 zt2m, & 4095 zxsnow_dummy, & 4096 solsw, & 4097 albsol1, & 4098 rain_fall, & 4099 snow_fall, & 4100 itop_con, & 4101 ibas_con, & 4102 cldfra_inca, & 4103 nbp_lon, & 4104 nbp_lat-1, & 4105 tr_seri(:,:,1+nqCO2:nbtr), & 4106 ftsol, & 4107 paprs, & 4108 cdragh, & 4109 cdragm, & 4110 pctsrf, & 4111 pdtphys, & 4112 itap) 4113 4114 CALL VTe(VTinca) 4115 CALL VTb(VTphysiq) 4116 END IF 4117 ENDIF !type_trac = inca or inco 4118 4119 IF (type_trac == 'repr') THEN 4120 IF (CPPKEY_REPROBUS) THEN 4121 CALL chemtime_rep(itap+itau_phy-1, date0, phys_tstep, itap) 4122 END IF 4123 ENDIF 4124 4125 4126 !=============================================================================== 4127 ! Radiative scheme and associated aerosols 4128 ! 4129 ! Note that the following routines are called every radpas time steps 4130 4131 IF (MOD(itaprad,radpas).EQ.0) THEN 4132 4133 ! 4134 !jq - introduce the aerosol direct and first indirect radiative forcings 4135 !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr) 4136 IF (flag_aerosol .GT. 0) THEN 4137 IF (iflag_rrtm .EQ. 0) THEN !--old radiation 4138 IF (.NOT. aerosol_couple) THEN 4139 ! 4140 CALL readaerosol_optic( & 4141 debut, flag_aerosol, itap, jD_cur-jD_ref, & 4142 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 4143 mass_solu_aero, mass_solu_aero_pi, & 4144 tau_aero, piz_aero, cg_aero, & 4145 tausum_aero, tau3d_aero) 4146 ENDIF 4147 ELSE IF (iflag_rrtm .EQ.1) THEN ! RRTM radiation 4148 IF (aerosol_couple .AND. config_inca == 'aero' ) THEN 4149 abort_message='config_inca=aero et rrtm=1 impossible' 4150 CALL abort_physic(modname,abort_message,1) 4151 ELSE 4152 ! 4153 #ifdef CPP_RRTM 4154 IF (NSW.EQ.6) THEN 4155 !--new aerosol properties SW and LW 4156 ! 4157 IF (CPPKEY_DUST) THEN 4158 !--SPL aerosol model 4159 CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, & 4160 tr_seri, mass_solu_aero, mass_solu_aero_pi, & 4161 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, & 4162 tausum_aero, tau3d_aero) 4163 ELSE 4164 !--climatologies or INCA aerosols 4165 CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, ok_volcan, & 4166 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, & 4167 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 4168 tr_seri, mass_solu_aero, mass_solu_aero_pi, & 4169 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, & 4170 tausum_aero, drytausum_aero, tau3d_aero) 4171 END IF 4172 4173 IF (flag_aerosol .EQ. 7) THEN 4174 CALL macv2sp(pphis,pplay,paprs,longitude_deg,latitude_deg, & 4175 tau_aero_sw_rrtm,piz_aero_sw_rrtm,cg_aero_sw_rrtm,dNovrN) 4176 ENDIF 4177 4178 ! 4179 ELSE IF (NSW.EQ.2) THEN 4180 !--for now we use the old aerosol properties 4181 ! 4182 CALL readaerosol_optic( & 4183 debut, flag_aerosol, itap, jD_cur-jD_ref, & 4184 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 4185 mass_solu_aero, mass_solu_aero_pi, & 4186 tau_aero, piz_aero, cg_aero, & 4187 tausum_aero, tau3d_aero) 4188 ! 4189 !--natural aerosols 4190 tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:) 4191 piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:) 4192 cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:) 4193 !--all aerosols 4194 tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:) 4195 piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:) 4196 cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:) 4197 ! 4198 !--no LW optics 4199 tau_aero_lw_rrtm(:,:,:,:) = 1.e-15 4200 ! 4201 ELSE 4202 abort_message='Only NSW=2 or 6 are possible with ' & 4203 // 'aerosols and iflag_rrtm=1' 4204 CALL abort_physic(modname,abort_message,1) 4205 ENDIF 4206 #else 4207 abort_message='You should compile with -rrtm if running ' & 4208 // 'with iflag_rrtm=1' 4209 CALL abort_physic(modname,abort_message,1) 4210 #endif 4211 ! 4212 ENDIF 4213 ELSE IF (iflag_rrtm .EQ.2) THEN ! ecrad RADIATION 4214 #ifdef CPP_ECRAD 4215 !--climatologies or INCA aerosols 4216 CALL readaerosol_optic_ecrad( debut, aerosol_couple, ok_alw, ok_volcan, & 4217 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, & 4218 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 4219 tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer) 4220 #else 4221 abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2' 4222 CALL abort_physic(modname,abort_message,1) 4223 #endif 4224 ENDIF 4225 4226 ELSE !--flag_aerosol = 0 4227 tausum_aero(:,:,:) = 0. 4228 drytausum_aero(:,:) = 0. 4229 mass_solu_aero(:,:) = 0. 4230 mass_solu_aero_pi(:,:) = 0. 4231 IF (iflag_rrtm .EQ. 0) THEN !--old radiation 4232 tau_aero(:,:,:,:) = 1.e-15 4233 piz_aero(:,:,:,:) = 1. 4234 cg_aero(:,:,:,:) = 0. 4235 ELSE 4236 tau_aero_sw_rrtm(:,:,:,:) = 1.e-15 4237 tau_aero_lw_rrtm(:,:,:,:) = 1.e-15 4238 piz_aero_sw_rrtm(:,:,:,:) = 1.0 4239 cg_aero_sw_rrtm(:,:,:,:) = 0.0 4240 ENDIF 4241 ENDIF 4242 ! 4243 !--WMO criterion to determine tropopause 4244 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg) 4245 ! 4246 !--STRAT AEROSOL 4247 !--updates tausum_aero,tau_aero,piz_aero,cg_aero 4248 IF (flag_aerosol_strat.GT.0) THEN 4249 IF (prt_level .GE.10) THEN 4250 PRINT *,'appel a readaerosolstrat', mth_cur 4251 ENDIF 4252 IF (iflag_rrtm.EQ.0) THEN 4253 IF (flag_aerosol_strat.EQ.1) THEN 4254 CALL readaerosolstrato(debut) 4255 ELSE 4256 abort_message='flag_aerosol_strat must equal 1 for rrtm=0' 4257 CALL abort_physic(modname,abort_message,1) 4258 ENDIF 4259 ELSE 4260 #ifdef CPP_RRTM 4261 IF (.NOT. CPPKEY_STRATAER) THEN 4262 !--prescribed strat aerosols 4263 !--only in the case of non-interactive strat aerosols 4264 IF (flag_aerosol_strat.EQ.1) THEN 4265 CALL readaerosolstrato1_rrtm(debut) 4266 ELSEIF (flag_aerosol_strat.EQ.2) THEN 4267 CALL readaerosolstrato2_rrtm(debut, ok_volcan) 4268 ELSE 4269 abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1' 4270 CALL abort_physic(modname,abort_message,1) 4271 ENDIF 4272 END IF 4273 #else 4274 abort_message='You should compile with -rrtm if running ' & 4275 // 'with iflag_rrtm=1' 4276 CALL abort_physic(modname,abort_message,1) 4277 #endif 4278 ENDIF 4279 ELSE 4280 tausum_aero(:,:,id_STRAT_phy) = 0. 4281 ENDIF 4282 ! 4283 #ifdef CPP_RRTM 4284 IF (CPPKEY_STRATAER) THEN 4285 !--compute stratospheric mask 4286 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg) 4287 !--interactive strat aerosols 4288 CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut) 4289 END IF 4290 #endif 4291 !--fin STRAT AEROSOL 4292 ! 4293 4293 4294 4294 !lecture de la chlorophylle pour le nouvel albedo de Sunghye Baek -
LMDZ6/trunk/libf/phylmdiso/physiq_mod.F90
r6144 r6145 112 112 USE calwake_mod, ONLY : calwake, calwake_first 113 113 USE lmdz_wake_ini, ONLY : wake_ini 114 USE lmdz_cv_ini, ONLY : cv_ini 114 115 USE lmdz_cv_ini, ONLY : epmax, coef_epmax_cape, cvl_comp_threshold, cvl_sig2feed 115 116 USE lmdz_cv_ini, ONLY : iflag_cvl_sigd, iflag_clw, ok_adj_ema … … 5119 5120 5120 5121 !--------------------------------------------------------------------------- 5121 DO k = 1, klev5122 DO i = 1, klon5123 cldfra(i,k) = rneb(i,k)5124 ! keep only liquid droplets in radocond if not liqice_in_radocond5125 IF (.NOT.liqice_in_radocond) radocond(i,k) = ql_seri(i,k)5126 ENDDO5127 ENDDO5128 5129 5130 ! Option to activate the radiative effect of blowing snow (ok_rad_bs)5131 ! makes sense only if the new large scale condensation scheme is active5132 ! with the ok_icefra_lscp flag active as well5133 5134 IF (ok_bs .AND. ok_rad_bs) THEN5135 ! IF (ok_icefra_lscp) THEN5136 DO k=1,klev5137 DO i=1,klon5138 radocond(i,k)=radocond(i,k)+qbs_seri(i,k)5139 picefra(i,k)=(radocond(i,k)*picefra(i,k)+qbs_seri(i,k))/(radocond(i,k))5140 qbsfra=min(qbs_seri(i,k)/qbst_bs,1.0)5141 cldfra(i,k)=max(cldfra(i,k),qbsfra)5142 ENDDO5143 ENDDO5144 !ELSE5145 ! WRITE(lunout,*)"PAY ATTENTION, you try to activate the radiative effect of blowing snow"5146 ! WRITE(lunout,*)"with ok_new_lscp=false and/or ok_icefra_lscp=false"5147 ! abort_message='inconsistency in cloud phase for blowing snow'5148 ! CALL abort_physic(modname,abort_message,1)5149 ! ENDIF5150 5151 ENDIF5152 5122 #ifdef ISO 5153 5123 !#ifdef ISOVERIF … … 5273 5243 5274 5244 ! 5275 !-------------------------------------------------------------------5276 ! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT5277 !-------------------------------------------------------------------5278 5279 ! 1. NUAGES CONVECTIFS5280 !5281 !IM cf FH5282 ! IF (iflag_cld_th.eq.-1) THEN ! seulement pour Tiedtke5283 IF (iflag_cld_th.le.-1) THEN ! seulement pour Tiedtke5284 snow_tiedtke=0.5285 ! print*,'avant calcul de la pseudo precip '5286 ! print*,'iflag_cld_th',iflag_cld_th5287 IF (iflag_cld_th.eq.-1) THEN5288 rain_tiedtke=rain_con5289 ELSE5290 ! print*,'calcul de la pseudo precip '5291 rain_tiedtke=0.5292 ! print*,'calcul de la pseudo precip 0'5293 DO k=1,klev5294 DO i=1,klon5295 IF (d_q_con(i,k).lt.0.) THEN5296 rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys &5297 *(paprs(i,k)-paprs(i,k+1))/rg5298 ENDIF5299 ENDDO5300 ENDDO5301 ENDIF5302 !5303 ! call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ')5304 !5305 5306 ! Nuages diagnostiques pour Tiedtke5307 CALL diagcld1(paprs,pplay, &5308 !IM cf FH. rain_con,snow_con,ibas_con,itop_con,5309 rain_tiedtke,snow_tiedtke,ibas_con,itop_con, &5310 diafra,dialiq)5311 DO k = 1, klev5312 DO i = 1, klon5313 IF (diafra(i,k).GT.cldfra(i,k)) THEN5314 radocond(i,k) = dialiq(i,k)5315 cldfra(i,k) = diafra(i,k)5316 ENDIF5317 ENDDO5318 ENDDO5319 5320 ELSE IF (iflag_cld_th.ge.3) THEN5321 ! On prend pour les nuages convectifs le max du calcul de la5322 ! convection et du calcul du pas de temps precedent diminue d'un facteur5323 ! facttemps5324 facteur = pdtphys *facttemps5325 DO k=1,klev5326 DO i=1,klon5327 rnebcon(i,k)=rnebcon(i,k)*facteur5328 IF (rnebcon0(i,k)*clwcon0(i,k).GT.rnebcon(i,k)*clwcon(i,k)) THEN5329 rnebcon(i,k)=rnebcon0(i,k)5330 clwcon(i,k)=clwcon0(i,k)5331 ENDIF5332 ENDDO5333 ENDDO5334 5335 ! On prend la somme des fractions nuageuses et des contenus en eau5336 5337 IF (iflag_cld_th>=5) THEN5338 5339 DO k=1,klev5340 ptconvth(:,k)=fm_therm(:,k+1)>0.5341 ENDDO5342 5343 IF (iflag_coupl==4) THEN5344 5345 ! Dans le cas iflag_coupl==4, on prend la somme des convertures5346 ! convectives et lsc dans la partie des thermiques5347 ! Le controle par iflag_coupl est peut etre provisoire.5348 DO k=1,klev5349 DO i=1,klon5350 IF (ptconv(i,k).AND.ptconvth(i,k)) THEN5351 radocond(i,k)=radocond(i,k)+rnebcon(i,k)*clwcon(i,k)5352 cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)5353 ELSE IF (ptconv(i,k)) THEN5354 cldfra(i,k)=rnebcon(i,k)5355 radocond(i,k)=rnebcon(i,k)*clwcon(i,k)5356 ENDIF5357 ENDDO5358 ENDDO5359 5360 ELSE IF (iflag_coupl==5) THEN5361 DO k=1,klev5362 DO i=1,klon5363 cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.)5364 radocond(i,k)=radocond(i,k)+rnebcon(i,k)*clwcon(i,k)5365 ENDDO5366 ENDDO5367 5368 ELSE5369 5370 ! Si on est sur un point touche par la convection5371 ! profonde et pas par les thermiques, on prend la5372 ! couverture nuageuse et l'eau nuageuse de la convection5373 ! profonde.5374 5375 !IM/FH: 2011/02/235376 ! definition des points sur lesquels ls thermiques sont actifs5377 5378 DO k=1,klev5379 DO i=1,klon5380 IF (ptconv(i,k).AND. .NOT.ptconvth(i,k)) THEN5381 cldfra(i,k)=rnebcon(i,k)5382 radocond(i,k)=rnebcon(i,k)*clwcon(i,k)5383 ENDIF5384 ENDDO5385 ENDDO5386 5387 ENDIF5388 5389 ELSE5390 5391 ! Ancienne version5392 cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.)5393 radocond(:,:)=radocond(:,:)+rnebcon(:,:)*clwcon(:,:)5394 ENDIF5395 5396 ENDIF5397 5398 ! 2. NUAGES STARTIFORMES5399 !5400 IF (ok_stratus) THEN5401 CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq)5402 DO k = 1, klev5403 DO i = 1, klon5404 IF (diafra(i,k).GT.cldfra(i,k)) THEN5405 radocond(i,k) = dialiq(i,k)5406 cldfra(i,k) = diafra(i,k)5407 ENDIF5408 ENDDO5409 ENDDO5410 ENDIF5411 !5412 5245 ! Precipitation totale 5413 5246 ! … … 5480 5313 endif 5481 5314 #endif 5315 5482 5316 ! 5483 5317 ! Calculer l'humidite relative pour diagnostique … … 5513 5347 ENDDO 5514 5348 5515 IF (ANY(type_trac == ['inca','inco'])) THEN ! ModThL 5516 IF (CPPKEY_INCA) THEN 5517 CALL VTe(VTphysiq) 5518 CALL VTb(VTinca) 5519 calday = REAL(days_elapsed + 1) + jH_cur 5520 5521 CALL chemtime(itap+itau_phy-1, date0, phys_tstep, itap) 5522 CALL AEROSOL_METEO_CALC( & 5523 calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, & 5524 prfl,psfl,pctsrf,cell_area, & 5525 latitude_deg,longitude_deg,u10m,v10m) 5526 5527 zxsnow_dummy(:) = 0.0 5528 ! INCA needs a cloud fraction that is not necessarily that 5529 ! for radiation. Here we provide a cloud fraction calculated 5530 ! the same manner as that in LMDZ5, LMDZ6 and LMDZ7 5349 5350 ! 5351 !------------------------------------------------------------------- 5352 ! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT 5353 !------------------------------------------------------------------- 5354 5355 DO k = 1, klev 5356 DO i = 1, klon 5357 cldfra(i,k) = rneb(i,k) 5358 ! keep only liquid droplets in radocond if not liqice_in_radocond 5359 IF (.NOT.liqice_in_radocond) radocond(i,k) = ql_seri(i,k) 5360 ENDDO 5361 ENDDO 5362 5363 5364 ! Option to activate the radiative effect of blowing snow (ok_rad_bs) 5365 ! makes sense only if the new large scale condensation scheme is active 5366 ! with the ok_icefra_lscp flag active as well 5367 5368 IF (ok_bs .AND. ok_rad_bs) THEN 5369 ! IF (ok_icefra_lscp) THEN 5370 DO k=1,klev 5371 DO i=1,klon 5372 radocond(i,k)=radocond(i,k)+qbs_seri(i,k) 5373 picefra(i,k)=(radocond(i,k)*picefra(i,k)+qbs_seri(i,k))/(radocond(i,k)) 5374 qbsfra=min(qbs_seri(i,k)/qbst_bs,1.0) 5375 cldfra(i,k)=max(cldfra(i,k),qbsfra) 5376 ENDDO 5377 ENDDO 5378 !ELSE 5379 ! WRITE(lunout,*)"PAY ATTENTION, you try to activate the radiative effect of blowing snow" 5380 ! WRITE(lunout,*)"with ok_new_lscp=false and/or ok_icefra_lscp=false" 5381 ! abort_message='inconsistency in cloud phase for blowing snow' 5382 ! CALL abort_physic(modname,abort_message,1) 5383 ! ENDIF 5384 5385 ENDIF 5386 5387 ! 1. NUAGES CONVECTIFS 5388 ! 5389 !IM cf FH 5390 ! IF (iflag_cld_th.eq.-1) THEN ! seulement pour Tiedtke 5391 IF (iflag_cld_th.le.-1) THEN ! seulement pour Tiedtke 5392 snow_tiedtke=0. 5393 ! print*,'avant calcul de la pseudo precip ' 5394 ! print*,'iflag_cld_th',iflag_cld_th 5395 IF (iflag_cld_th.eq.-1) THEN 5396 rain_tiedtke=rain_con 5397 ELSE 5398 ! print*,'calcul de la pseudo precip ' 5399 rain_tiedtke=0. 5400 ! print*,'calcul de la pseudo precip 0' 5531 5401 DO k=1,klev 5402 DO i=1,klon 5403 IF (d_q_con(i,k).lt.0.) THEN 5404 rain_tiedtke(i)=rain_tiedtke(i)-d_q_con(i,k)/pdtphys & 5405 *(paprs(i,k)-paprs(i,k+1))/rg 5406 ENDIF 5407 ENDDO 5408 ENDDO 5409 ENDIF 5410 ! 5411 ! call dump2d(iim,jjm,rain_tiedtke(2:klon-1),'PSEUDO PRECIP ') 5412 ! 5413 5414 ! Nuages diagnostiques pour Tiedtke 5415 CALL diagcld1(paprs,pplay, & 5416 !IM cf FH. rain_con,snow_con,ibas_con,itop_con, 5417 rain_tiedtke,snow_tiedtke,ibas_con,itop_con, & 5418 diafra,dialiq) 5419 DO k = 1, klev 5420 DO i = 1, klon 5421 IF (diafra(i,k).GT.cldfra(i,k)) THEN 5422 radocond(i,k) = dialiq(i,k) 5423 cldfra(i,k) = diafra(i,k) 5424 ENDIF 5425 ENDDO 5426 ENDDO 5427 5428 ELSE IF (iflag_cld_th.ge.3) THEN 5429 ! On prend pour les nuages convectifs le max du calcul de la 5430 ! convection et du calcul du pas de temps precedent diminue d'un facteur 5431 ! facttemps 5432 facteur = pdtphys *facttemps 5433 DO k=1,klev 5434 DO i=1,klon 5435 rnebcon(i,k)=rnebcon(i,k)*facteur 5436 IF (rnebcon0(i,k)*clwcon0(i,k).GT.rnebcon(i,k)*clwcon(i,k)) THEN 5437 rnebcon(i,k)=rnebcon0(i,k) 5438 clwcon(i,k)=clwcon0(i,k) 5439 ENDIF 5440 ENDDO 5441 ENDDO 5442 5443 ! On prend la somme des fractions nuageuses et des contenus en eau 5444 5445 IF (iflag_cld_th>=5) THEN 5446 5447 DO k=1,klev 5448 ptconvth(:,k)=fm_therm(:,k+1)>0. 5449 ENDDO 5450 5451 IF (iflag_coupl==4) THEN 5452 5453 ! Dans le cas iflag_coupl==4, on prend la somme des convertures 5454 ! convectives et lsc dans la partie des thermiques 5455 ! Le controle par iflag_coupl est peut etre provisoire. 5456 DO k=1,klev 5532 5457 DO i=1,klon 5533 cldfra_inca(i,k)=min(rneb(i,k)+rnebcon(i,k),1.) 5458 IF (ptconv(i,k).AND.ptconvth(i,k)) THEN 5459 radocond(i,k)=radocond(i,k)+rnebcon(i,k)*clwcon(i,k) 5460 cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.) 5461 ELSE IF (ptconv(i,k)) THEN 5462 cldfra(i,k)=rnebcon(i,k) 5463 radocond(i,k)=rnebcon(i,k)*clwcon(i,k) 5464 ENDIF 5534 5465 ENDDO 5466 ENDDO 5467 5468 ELSE IF (iflag_coupl==5) THEN 5469 DO k=1,klev 5470 DO i=1,klon 5471 cldfra(i,k)=min(cldfra(i,k)+rnebcon(i,k),1.) 5472 radocond(i,k)=radocond(i,k)+rnebcon(i,k)*clwcon(i,k) 5473 ENDDO 5474 ENDDO 5475 5476 ELSE 5477 5478 ! Si on est sur un point touche par la convection 5479 ! profonde et pas par les thermiques, on prend la 5480 ! couverture nuageuse et l'eau nuageuse de la convection 5481 ! profonde. 5482 5483 !IM/FH: 2011/02/23 5484 ! definition des points sur lesquels ls thermiques sont actifs 5485 5486 DO k=1,klev 5487 DO i=1,klon 5488 IF (ptconv(i,k).AND. .NOT.ptconvth(i,k)) THEN 5489 cldfra(i,k)=rnebcon(i,k) 5490 radocond(i,k)=rnebcon(i,k)*clwcon(i,k) 5491 ENDIF 5492 ENDDO 5493 ENDDO 5494 5495 ENDIF 5496 5497 ELSE 5498 5499 ! Ancienne version 5500 cldfra(:,:)=min(max(cldfra(:,:),rnebcon(:,:)),1.) 5501 radocond(:,:)=radocond(:,:)+rnebcon(:,:)*clwcon(:,:) 5502 ENDIF 5503 5504 ENDIF 5505 5506 ! 2. NUAGES STARTIFORMES 5507 ! 5508 IF (ok_stratus) THEN 5509 CALL diagcld2(paprs,pplay,t_seri,q_seri, diafra,dialiq) 5510 DO k = 1, klev 5511 DO i = 1, klon 5512 IF (diafra(i,k).GT.cldfra(i,k)) THEN 5513 radocond(i,k) = dialiq(i,k) 5514 cldfra(i,k) = diafra(i,k) 5515 ENDIF 5535 5516 ENDDO 5536 5537 5538 CALL chemhook_begin (calday, & 5539 days_elapsed+1, & 5540 jH_cur, & 5541 pctsrf(1,1), & 5542 latitude_deg, & 5543 longitude_deg, & 5544 cell_area, & 5545 paprs, & 5546 pplay, & 5547 coefh(1:klon,1:klev,is_ave), & 5548 pphi, & 5549 t_seri, & 5550 u, & 5551 v, & 5552 rot, & 5553 wo(:, :, 1), & 5554 q_seri, & 5555 zxtsol, & 5556 zt2m, & 5557 zxsnow_dummy, & 5558 solsw, & 5559 albsol1, & 5560 rain_fall, & 5561 snow_fall, & 5562 itop_con, & 5563 ibas_con, & 5564 cldfra, & 5565 nbp_lon, & 5566 nbp_lat-1, & 5567 tr_seri(:,:,1+nqCO2:nbtr), & 5568 ftsol, & 5569 paprs, & 5570 cdragh, & 5571 cdragm, & 5572 pctsrf, & 5573 pdtphys, & 5574 itap) 5575 5576 CALL VTe(VTinca) 5577 CALL VTb(VTphysiq) 5578 END IF 5579 ENDIF !type_trac = inca or inco 5580 IF (type_trac == 'repr') THEN 5581 IF (CPPKEY_REPROBUS) THEN 5582 !CALL chemtime_rep(itap+itau_phy-1, date0, dtime, itap) 5583 CALL chemtime_rep(itap+itau_phy-1, date0, phys_tstep, itap) 5584 END IF 5517 ENDDO 5585 5518 ENDIF 5586 5587 !5588 ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.5589 !5590 IF (MOD(itaprad,radpas).EQ.0) THEN5591 5592 !5593 !jq - introduce the aerosol direct and first indirect radiative forcings5594 !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)5595 IF (flag_aerosol .GT. 0) THEN5596 IF (iflag_rrtm .EQ. 0) THEN !--old radiation5597 IF (.NOT. aerosol_couple) THEN5598 !5599 CALL readaerosol_optic( &5600 debut, flag_aerosol, itap, jD_cur-jD_ref, &5601 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &5602 mass_solu_aero, mass_solu_aero_pi, &5603 tau_aero, piz_aero, cg_aero, &5604 tausum_aero, tau3d_aero)5605 ENDIF5606 ELSE IF (iflag_rrtm .EQ.1) THEN ! RRTM radiation5607 IF (aerosol_couple .AND. config_inca == 'aero' ) THEN5608 abort_message='config_inca=aero et rrtm=1 impossible'5609 CALL abort_physic(modname,abort_message,1)5610 ELSE5611 !5612 #ifdef CPP_RRTM5613 IF (NSW.EQ.6) THEN5614 !--new aerosol properties SW and LW5615 !5616 IF (CPPKEY_DUST) THEN5617 !--SPL aerosol model5618 CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, &5619 tr_seri, mass_solu_aero, mass_solu_aero_pi, &5620 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &5621 tausum_aero, tau3d_aero)5622 ELSE5623 !--climatologies or INCA aerosols5624 CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, ok_volcan, &5625 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &5626 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &5627 tr_seri, mass_solu_aero, mass_solu_aero_pi, &5628 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &5629 tausum_aero, drytausum_aero, tau3d_aero)5630 END IF5631 5632 IF (flag_aerosol .EQ. 7) THEN5633 CALL macv2sp(pphis,pplay,paprs,longitude_deg,latitude_deg, &5634 tau_aero_sw_rrtm,piz_aero_sw_rrtm,cg_aero_sw_rrtm,dNovrN)5635 ENDIF5636 5637 !5638 ELSE IF (NSW.EQ.2) THEN5639 !--for now we use the old aerosol properties5640 !5641 CALL readaerosol_optic( &5642 debut, flag_aerosol, itap, jD_cur-jD_ref, &5643 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &5644 mass_solu_aero, mass_solu_aero_pi, &5645 tau_aero, piz_aero, cg_aero, &5646 tausum_aero, tau3d_aero)5647 !5648 !--natural aerosols5649 tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:)5650 piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:)5651 cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:)5652 !--all aerosols5653 tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:)5654 piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:)5655 cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:)5656 !5657 !--no LW optics5658 tau_aero_lw_rrtm(:,:,:,:) = 1.e-155659 !5660 ELSE5661 abort_message='Only NSW=2 or 6 are possible with ' &5662 // 'aerosols and iflag_rrtm=1'5663 CALL abort_physic(modname,abort_message,1)5664 ENDIF5665 #else5666 abort_message='You should compile with -rrtm if running ' &5667 // 'with iflag_rrtm=1'5668 CALL abort_physic(modname,abort_message,1)5669 #endif5670 !5671 ENDIF5672 ELSE IF (iflag_rrtm .EQ.2) THEN ! ecrad RADIATION5673 #ifdef CPP_ECRAD5674 !--climatologies or INCA aerosols5675 CALL readaerosol_optic_ecrad( debut, aerosol_couple, ok_alw, ok_volcan, &5676 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &5677 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &5678 tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer)5679 #else5680 abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2'5681 CALL abort_physic(modname,abort_message,1)5682 #endif5683 ENDIF5684 ELSE !--flag_aerosol = 05685 tausum_aero(:,:,:) = 0.5686 drytausum_aero(:,:) = 0.5687 mass_solu_aero(:,:) = 0.5688 mass_solu_aero_pi(:,:) = 0.5689 IF (iflag_rrtm .EQ. 0) THEN !--old radiation5690 tau_aero(:,:,:,:) = 1.e-155691 piz_aero(:,:,:,:) = 1.5692 cg_aero(:,:,:,:) = 0.5693 ELSE5694 tau_aero_sw_rrtm(:,:,:,:) = 1.e-155695 tau_aero_lw_rrtm(:,:,:,:) = 1.e-155696 piz_aero_sw_rrtm(:,:,:,:) = 1.05697 cg_aero_sw_rrtm(:,:,:,:) = 0.05698 ENDIF5699 ENDIF5700 !5701 !--WMO criterion to determine tropopause5702 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)5703 !5704 !--STRAT AEROSOL5705 !--updates tausum_aero,tau_aero,piz_aero,cg_aero5706 IF (flag_aerosol_strat.GT.0) THEN5707 IF (prt_level .GE.10) THEN5708 PRINT *,'appel a readaerosolstrat', mth_cur5709 ENDIF5710 IF (iflag_rrtm.EQ.0) THEN5711 IF (flag_aerosol_strat.EQ.1) THEN5712 CALL readaerosolstrato(debut)5713 ELSE5714 abort_message='flag_aerosol_strat must equal 1 for rrtm=0'5715 CALL abort_physic(modname,abort_message,1)5716 ENDIF5717 ELSE5718 #ifdef CPP_RRTM5719 IF (.NOT. CPPKEY_STRATAER) THEN5720 !--prescribed strat aerosols5721 !--only in the case of non-interactive strat aerosols5722 IF (flag_aerosol_strat.EQ.1) THEN5723 CALL readaerosolstrato1_rrtm(debut)5724 ELSEIF (flag_aerosol_strat.EQ.2) THEN5725 CALL readaerosolstrato2_rrtm(debut, ok_volcan)5726 ELSE5727 abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1'5728 CALL abort_physic(modname,abort_message,1)5729 ENDIF5730 END IF5731 #else5732 abort_message='You should compile with -rrtm if running ' &5733 // 'with iflag_rrtm=1'5734 CALL abort_physic(modname,abort_message,1)5735 #endif5736 ENDIF5737 ELSE5738 tausum_aero(:,:,id_STRAT_phy) = 0.5739 ENDIF5740 !5741 #ifdef CPP_RRTM5742 IF (CPPKEY_STRATAER) THEN5743 #ifdef ISO5744 CALL abort_gcm("physiq_mod", "StratAer isn't ISO-compatible for now, 07/24",1)5745 #endif5746 !--compute stratospheric mask5747 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg)5748 !--interactive strat aerosols5749 CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut)5750 END IF5751 #endif5752 !--fin STRAT AEROSOL5753 !5754 5519 5755 5520 ! Calculer les parametres optiques des nuages et quelques … … 5833 5598 ! 5834 5599 ENDIF 5600 5601 5602 IF (ANY(type_trac == ['inca','inco'])) THEN ! ModThL 5603 IF (CPPKEY_INCA) THEN 5604 CALL VTe(VTphysiq) 5605 CALL VTb(VTinca) 5606 calday = REAL(days_elapsed + 1) + jH_cur 5607 5608 CALL chemtime(itap+itau_phy-1, date0, phys_tstep, itap) 5609 CALL AEROSOL_METEO_CALC( & 5610 calday,pdtphys,pplay,paprs,t,pmflxr,pmflxs, & 5611 prfl,psfl,pctsrf,cell_area, & 5612 latitude_deg,longitude_deg,u10m,v10m) 5613 5614 zxsnow_dummy(:) = 0.0 5615 ! INCA needs a cloud fraction that is not necessarily that 5616 ! for radiation. Here we provide a cloud fraction calculated 5617 ! the same manner as that in LMDZ5, LMDZ6 and LMDZ7 5618 DO k=1,klev 5619 DO i=1,klon 5620 cldfra_inca(i,k)=min(rneb(i,k)+rnebcon(i,k),1.) 5621 ENDDO 5622 ENDDO 5623 5624 5625 CALL chemhook_begin (calday, & 5626 days_elapsed+1, & 5627 jH_cur, & 5628 pctsrf(1,1), & 5629 latitude_deg, & 5630 longitude_deg, & 5631 cell_area, & 5632 paprs, & 5633 pplay, & 5634 coefh(1:klon,1:klev,is_ave), & 5635 pphi, & 5636 t_seri, & 5637 u, & 5638 v, & 5639 rot, & 5640 wo(:, :, 1), & 5641 q_seri, & 5642 zxtsol, & 5643 zt2m, & 5644 zxsnow_dummy, & 5645 solsw, & 5646 albsol1, & 5647 rain_fall, & 5648 snow_fall, & 5649 itop_con, & 5650 ibas_con, & 5651 cldfra, & 5652 nbp_lon, & 5653 nbp_lat-1, & 5654 tr_seri(:,:,1+nqCO2:nbtr), & 5655 ftsol, & 5656 paprs, & 5657 cdragh, & 5658 cdragm, & 5659 pctsrf, & 5660 pdtphys, & 5661 itap) 5662 5663 CALL VTe(VTinca) 5664 CALL VTb(VTphysiq) 5665 END IF 5666 ENDIF !type_trac = inca or inco 5667 IF (type_trac == 'repr') THEN 5668 IF (CPPKEY_REPROBUS) THEN 5669 !CALL chemtime_rep(itap+itau_phy-1, date0, dtime, itap) 5670 CALL chemtime_rep(itap+itau_phy-1, date0, phys_tstep, itap) 5671 END IF 5672 ENDIF 5673 5674 ! 5675 ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol. 5676 ! 5677 IF (MOD(itaprad,radpas).EQ.0) THEN 5678 5679 ! 5680 !jq - introduce the aerosol direct and first indirect radiative forcings 5681 !jq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr) 5682 IF (flag_aerosol .GT. 0) THEN 5683 IF (iflag_rrtm .EQ. 0) THEN !--old radiation 5684 IF (.NOT. aerosol_couple) THEN 5685 ! 5686 CALL readaerosol_optic( & 5687 debut, flag_aerosol, itap, jD_cur-jD_ref, & 5688 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 5689 mass_solu_aero, mass_solu_aero_pi, & 5690 tau_aero, piz_aero, cg_aero, & 5691 tausum_aero, tau3d_aero) 5692 ENDIF 5693 ELSE IF (iflag_rrtm .EQ.1) THEN ! RRTM radiation 5694 IF (aerosol_couple .AND. config_inca == 'aero' ) THEN 5695 abort_message='config_inca=aero et rrtm=1 impossible' 5696 CALL abort_physic(modname,abort_message,1) 5697 ELSE 5698 ! 5699 #ifdef CPP_RRTM 5700 IF (NSW.EQ.6) THEN 5701 !--new aerosol properties SW and LW 5702 ! 5703 IF (CPPKEY_DUST) THEN 5704 !--SPL aerosol model 5705 CALL splaerosol_optic_rrtm( ok_alw, pplay, paprs, t_seri, rhcl, & 5706 tr_seri, mass_solu_aero, mass_solu_aero_pi, & 5707 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, & 5708 tausum_aero, tau3d_aero) 5709 ELSE 5710 !--climatologies or INCA aerosols 5711 CALL readaerosol_optic_rrtm( debut, aerosol_couple, ok_alw, ok_volcan, & 5712 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, & 5713 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 5714 tr_seri, mass_solu_aero, mass_solu_aero_pi, & 5715 tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, & 5716 tausum_aero, drytausum_aero, tau3d_aero) 5717 END IF 5718 5719 IF (flag_aerosol .EQ. 7) THEN 5720 CALL macv2sp(pphis,pplay,paprs,longitude_deg,latitude_deg, & 5721 tau_aero_sw_rrtm,piz_aero_sw_rrtm,cg_aero_sw_rrtm,dNovrN) 5722 ENDIF 5723 5724 ! 5725 ELSE IF (NSW.EQ.2) THEN 5726 !--for now we use the old aerosol properties 5727 ! 5728 CALL readaerosol_optic( & 5729 debut, flag_aerosol, itap, jD_cur-jD_ref, & 5730 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 5731 mass_solu_aero, mass_solu_aero_pi, & 5732 tau_aero, piz_aero, cg_aero, & 5733 tausum_aero, tau3d_aero) 5734 ! 5735 !--natural aerosols 5736 tau_aero_sw_rrtm(:,:,1,:)=tau_aero(:,:,3,:) 5737 piz_aero_sw_rrtm(:,:,1,:)=piz_aero(:,:,3,:) 5738 cg_aero_sw_rrtm (:,:,1,:)=cg_aero (:,:,3,:) 5739 !--all aerosols 5740 tau_aero_sw_rrtm(:,:,2,:)=tau_aero(:,:,2,:) 5741 piz_aero_sw_rrtm(:,:,2,:)=piz_aero(:,:,2,:) 5742 cg_aero_sw_rrtm (:,:,2,:)=cg_aero (:,:,2,:) 5743 ! 5744 !--no LW optics 5745 tau_aero_lw_rrtm(:,:,:,:) = 1.e-15 5746 ! 5747 ELSE 5748 abort_message='Only NSW=2 or 6 are possible with ' & 5749 // 'aerosols and iflag_rrtm=1' 5750 CALL abort_physic(modname,abort_message,1) 5751 ENDIF 5752 #else 5753 abort_message='You should compile with -rrtm if running ' & 5754 // 'with iflag_rrtm=1' 5755 CALL abort_physic(modname,abort_message,1) 5756 #endif 5757 ! 5758 ENDIF 5759 ELSE IF (iflag_rrtm .EQ.2) THEN ! ecrad RADIATION 5760 #ifdef CPP_ECRAD 5761 !--climatologies or INCA aerosols 5762 CALL readaerosol_optic_ecrad( debut, aerosol_couple, ok_alw, ok_volcan, & 5763 flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, & 5764 pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & 5765 tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer) 5766 #else 5767 abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2' 5768 CALL abort_physic(modname,abort_message,1) 5769 #endif 5770 ENDIF 5771 ELSE !--flag_aerosol = 0 5772 tausum_aero(:,:,:) = 0. 5773 drytausum_aero(:,:) = 0. 5774 mass_solu_aero(:,:) = 0. 5775 mass_solu_aero_pi(:,:) = 0. 5776 IF (iflag_rrtm .EQ. 0) THEN !--old radiation 5777 tau_aero(:,:,:,:) = 1.e-15 5778 piz_aero(:,:,:,:) = 1. 5779 cg_aero(:,:,:,:) = 0. 5780 ELSE 5781 tau_aero_sw_rrtm(:,:,:,:) = 1.e-15 5782 tau_aero_lw_rrtm(:,:,:,:) = 1.e-15 5783 piz_aero_sw_rrtm(:,:,:,:) = 1.0 5784 cg_aero_sw_rrtm(:,:,:,:) = 0.0 5785 ENDIF 5786 ENDIF 5787 ! 5788 !--WMO criterion to determine tropopause 5789 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg) 5790 ! 5791 !--STRAT AEROSOL 5792 !--updates tausum_aero,tau_aero,piz_aero,cg_aero 5793 IF (flag_aerosol_strat.GT.0) THEN 5794 IF (prt_level .GE.10) THEN 5795 PRINT *,'appel a readaerosolstrat', mth_cur 5796 ENDIF 5797 IF (iflag_rrtm.EQ.0) THEN 5798 IF (flag_aerosol_strat.EQ.1) THEN 5799 CALL readaerosolstrato(debut) 5800 ELSE 5801 abort_message='flag_aerosol_strat must equal 1 for rrtm=0' 5802 CALL abort_physic(modname,abort_message,1) 5803 ENDIF 5804 ELSE 5805 #ifdef CPP_RRTM 5806 IF (.NOT. CPPKEY_STRATAER) THEN 5807 !--prescribed strat aerosols 5808 !--only in the case of non-interactive strat aerosols 5809 IF (flag_aerosol_strat.EQ.1) THEN 5810 CALL readaerosolstrato1_rrtm(debut) 5811 ELSEIF (flag_aerosol_strat.EQ.2) THEN 5812 CALL readaerosolstrato2_rrtm(debut, ok_volcan) 5813 ELSE 5814 abort_message='flag_aerosol_strat must equal 1 or 2 for rrtm=1' 5815 CALL abort_physic(modname,abort_message,1) 5816 ENDIF 5817 END IF 5818 #else 5819 abort_message='You should compile with -rrtm if running ' & 5820 // 'with iflag_rrtm=1' 5821 CALL abort_physic(modname,abort_message,1) 5822 #endif 5823 ENDIF 5824 ELSE 5825 tausum_aero(:,:,id_STRAT_phy) = 0. 5826 ENDIF 5827 ! 5828 #ifdef CPP_RRTM 5829 IF (CPPKEY_STRATAER) THEN 5830 #ifdef ISO 5831 CALL abort_gcm("physiq_mod", "StratAer isn't ISO-compatible for now, 07/24",1) 5832 #endif 5833 !--compute stratospheric mask 5834 CALL stratosphere_mask(missing_val, pphis, t_seri, pplay, latitude_deg) 5835 !--interactive strat aerosols 5836 CALL calcaerosolstrato_rrtm(pplay,t_seri,paprs,debut) 5837 END IF 5838 #endif 5839 !--fin STRAT AEROSOL 5840 ! 5835 5841 5836 5842 !lecture de la chlorophylle pour le nouvel albedo de Sunghye Baek
Note: See TracChangeset
for help on using the changeset viewer.
