Changeset 4368 for LMDZ6/branches/Ocean_skin/libf/phylmd/radlwsw_m.F90
- Timestamp:
- Dec 6, 2022, 12:01:16 AM (22 months ago)
- Location:
- LMDZ6/branches/Ocean_skin
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Ocean_skin
- Property svn:mergeinfo changed
-
LMDZ6/branches/Ocean_skin/libf/phylmd/radlwsw_m.F90
r4013 r4368 40 40 toplwad_aero, sollwad_aero,& 41 41 toplwai_aero, sollwai_aero, & 42 toplwad0_aero, sollwad0_aero, &42 toplwad0_aero, sollwad0_aero, & 43 43 !-end 44 44 ZLWFT0_i, ZFLDN0, ZFLUP0,& … … 48 48 USE DIMPHY 49 49 USE assert_m, ONLY : assert 50 USE infotrac_phy, ONLY : type _trac50 USE infotrac_phy, ONLY : types_trac 51 51 USE write_field_phy 52 52 … … 224 224 REAL, INTENT(in) :: piz_aero_sw_rrtm(KLON,KLEV,2,NSW) ! aerosol optical properties RRTM 225 225 REAL, INTENT(in) :: cg_aero_sw_rrtm(KLON,KLEV,2,NSW) ! aerosol optical properties RRTM 226 ! AI 226 227 !--OB fin 227 228 … … 309 310 REAL(KIND=8) ZGELAM(klon), & ! longitudes en rad 310 311 ZGEMU(klon) ! sin(latitude) 311 REAL(KIND=8) ZCO2(klon,klev), & ! CO2 mass mixing ratios on full levels 312 ZCH4(klon,klev), & ! CH4 mass mixing ratios on full levels 313 ZN2O(klon,klev), & ! N2O mass mixing ratios on full levels 314 ZNO2(klon,klev), & ! NO2 mass mixing ratios on full levels 315 ZCFC11(klon,klev), & ! CFC11 316 ZCFC12(klon,klev), & ! CFC12 317 ZHCFC22(klon,klev), & ! HCFC22 318 ZCCL4(klon,klev) ! CCL4 319 ! ZO3_DP(klon,klev), ZO3_DP_i(klon,klev) ! Ozone 312 REAL(KIND=8) ZCO2, & ! CO2 mass mixing ratios on full levels 313 ZCH4, & ! CH4 mass mixing ratios on full levels 314 ZN2O, & ! N2O mass mixing ratios on full levels 315 ZNO2, & ! NO2 mass mixing ratios on full levels 316 ZCFC11, & ! CFC11 317 ZCFC12, & ! CFC12 318 ZHCFC22, & ! HCFC22 319 ZCCL4, & ! CCL4 320 ZO2 ! O2 321 320 322 REAL(KIND=8) ZQ_RAIN(klon,klev), & ! Rain cloud mass mixing ratio (kg/kg) ? 321 323 ZQ_SNOW(klon,klev) ! Snow cloud mass mixing ratio (kg/kg) ? … … 334 336 REAL(KIND=8) ZSWDIFFUSEBAND(klon,NSW), & ! SW DN flux in diffuse albedo band 335 337 ZSWDIRECTBAND(klon,NSW) ! SW DN flux in direct albedo band 338 REAL(KIND=8) SOLARIRAD 339 REAL(KIND=8) seuilmach 340 ! AI 10 mars 22 : Pour les tests Offline 341 logical :: lldebug_for_offline = .false. 342 REAL(KIND=8) solaire_off(klon), & 343 ZCO2_off(klon,klev), & 344 ZCH4_off(klon,klev), & ! CH4 mass mixing ratios on full levels 345 ZN2O_off(klon,klev), & ! N2O mass mixing ratios on full levels 346 ZNO2_off(klon,klev), & ! NO2 mass mixing ratios on full levels 347 ZCFC11_off(klon,klev), & ! CFC11 348 ZCFC12_off(klon,klev), & ! CFC12 349 ZHCFC22_off(klon,klev), & ! HCFC22 350 ZCCL4_off(klon,klev), & ! CCL4 351 ZO2_off(klon,klev) ! O2#endif 336 352 #endif 337 353 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! … … 486 502 487 503 ! 504 ! AI 02.2021 505 #ifdef CPP_ECRAD 506 ZEMIS = 1.0 507 ZEMISW = 1.0 508 ZGELAM = longitude 509 ZGEMU = sin(latitude) 510 ZCO2 = RCO2 511 ZCH4 = RCH4 512 ZN2O = RN2O 513 ZNO2 = 0.0 514 ZCFC11 = RCFC11 515 ZCFC12 = RCFC12 516 ZHCFC22 = 0.0 517 ZO2 = 0.0 518 ZCCL4 = 0.0 519 ZQ_RAIN = 0.0 520 ZQ_SNOW = 0.0 521 ZAEROSOL_OLD = 0.0 522 ZAEROSOL = 0.0 523 seuilmach=tiny(seuilmach) 524 #endif 525 488 526 !------------------------------------------- 489 527 nb_gr = KLON / kdlon … … 512 550 PSCT = solaire/zdist/zdist 513 551 514 IF ( type_trac == 'repr') THEN552 IF (ANY(types_trac == 'repr')) THEN 515 553 #ifdef REPROBUS 516 554 IF (iflag_rrtm==0) THEN … … 596 634 ENDDO 597 635 598 IF ( type_trac == 'repr') THEN636 IF (ANY(types_trac == 'repr')) THEN 599 637 #ifdef REPROBUS 600 638 ndimozon = size(wo, 3) … … 627 665 ENDDO 628 666 ENDDO 629 !630 ! AI 02.2021631 #ifdef CPP_ECRAD632 ZEMIS = 1.0633 ZEMISW = 1.0634 ZGELAM = longitude635 ZGEMU = sin(latitude)636 ZCO2 = RCO2637 ZCH4 = RCH4638 ZN2O = RN2O639 ZNO2 = 0.0640 ZCFC11 = RCFC11641 ZCFC12 = RCFC12642 ZHCFC22 = 0.0643 ZCCL4 = 0.0644 ZQ_RAIN = 0.0645 ZQ_SNOW = 0.0646 ZAEROSOL_OLD = 0.0647 ZAEROSOL = 0.0648 #endif649 667 ! 650 668 !===== iflag_rrtm ================================================ … … 1165 1183 ! DO i = 1, kdlon 1166 1184 ! DO k = 1, kflev 1185 ! DO kk= 1, naero_tot 1167 1186 ! DO kk=1, NSW 1168 1187 ! … … 1174 1193 ! PPIZA_NAT(i,kflev+1-k,kk)=piz_aero_sw_rrtm(i,k,1,kk) 1175 1194 ! PCGA_NAT(i,kflev+1-k,kk)=cg_aero_sw_rrtm(i,k,1,kk) 1195 ! ZAEROSOL(i,kflev+1-k,kk)=m_allaer(i,k,kk) 1176 1196 ! 1177 1197 ! ENDDO … … 1224 1244 flwc_i(1:klon,k) =flwc(1:klon,klev+1-k) 1225 1245 fiwc_i(1:klon,k) =fiwc(1:klon,klev+1-k) 1226 ref_liq_i(1:klon,k) =ref_liq(1:klon,klev+1-k) 1227 ref_ice_i(1:klon,k) =ref_ice(1:klon,klev+1-k) 1246 ref_liq_i(1:klon,k) =ref_liq(1:klon,klev+1-k)*1.0e-6 1247 ref_ice_i(1:klon,k) =ref_ice(1:klon,klev+1-k)*1.0e-6 1228 1248 !-OB 1229 1249 ref_liq_pi_i(1:klon,k) =ref_liq_pi(1:klon,klev+1-k) … … 1237 1257 ! ENDDO 1238 1258 ENDDO 1239 ! AI 02.2021 1259 1260 ! AI 11.2021 1240 1261 ! Calcul de ZTH_i (temp aux interfaces 1:klev+1) 1262 ! IFS currently sets the half-level temperature at the surface to be 1263 ! equal to the skin temperature. The radiation scheme takes as input 1264 ! only the half-level temperatures and assumes the Planck function to 1265 ! vary linearly in optical depth between half levels. In the lowest 1266 ! atmospheric layer, where the atmospheric temperature can be much 1267 ! cooler than the skin temperature, this can lead to significant 1268 ! differences between the effective temperature of this lowest layer 1269 ! and the true value in the model. 1270 ! We may approximate the temperature profile in the lowest model level 1271 ! as piecewise linear between the top of the layer T[k-1/2], the 1272 ! centre of the layer T[k] and the base of the layer Tskin. The mean 1273 ! temperature of the layer is then 0.25*T[k-1/2] + 0.5*T[k] + 1274 ! 0.25*Tskin, which can be achieved by setting the atmospheric 1275 ! temperature at the half-level corresponding to the surface as 1276 ! follows: 1277 ! AI ATTENTION fais dans interface radlw 1278 !thermodynamics%temperature_hl(KIDIA:KFDIA,KLEV+1) & 1279 ! & = PTEMPERATURE(KIDIA:KFDIA,KLEV) & 1280 ! & + 0.5_JPRB * (PTEMPERATURE_H(KIDIA:KFDIA,KLEV+1) & 1281 ! & -PTEMPERATURE_H(KIDIA:KFDIA,KLEV)) 1282 1241 1283 DO K=2,KLEV 1242 ZTH_i(:,K)=& 1243 & (t_i(:,K-1)*pplay_i(:,K-1)*(pplay_i(:,K)-paprs_i(:,K))& 1244 & +t_i(:,K)*pplay_i(:,K)*(paprs_i(:,K)-pplay_i(:,K-1)))& 1245 & *(1.0/(paprs_i(:,K)*(pplay_i(:,K)-pplay_i(:,K-1)))) 1284 DO i = 1, kdlon 1285 ZTH_i(i,K)=& 1286 & (t_i(i,K-1)*pplay_i(i,K-1)*(pplay_i(i,K)-paprs_i(i,K))& 1287 & +t_i(i,K)*pplay_i(i,K)*(paprs_i(i,K)-pplay_i(i,K-1)))& 1288 & *(1.0/(paprs_i(i,K)*(pplay_i(i,K)-pplay_i(i,K-1)))) 1289 ENDDO 1246 1290 ENDDO 1247 ZTH_i(:,KLEV+1)=tsol(:) 1248 ZTH_i(:,1)=t_i(:,1)-pplay_i(:,1)*(t_i(:,1)-ZTH_i(:,2))& 1249 & /(pplay_i(:,1)-paprs_i(:,2)) 1291 DO i = 1, kdlon 1292 ! Sommet 1293 ZTH_i(i,1)=t_i(i,1)-pplay_i(i,1)*(t_i(i,1)-ZTH_i(i,2))& 1294 & /(pplay_i(i,1)-paprs_i(i,2)) 1295 ! Vers le sol 1296 ZTH_i(i,KLEV+1)=t_i(i,KLEV) + 0.5 * & 1297 (tsol(i) - ZTH_i(i,KLEV)) 1298 ENDDO 1299 1250 1300 1251 1301 print *,'RADLWSW: avant RADIATION_SCHEME ' 1252 IF (lldebug) THEN 1302 1303 ! AI mars 2022 1304 SOLARIRAD = solaire/zdist/zdist 1305 !! diagnos pour la comparaison a la version offline 1306 !!! - Gas en VMR pour offline et MMR pour online 1307 !!! - on utilise pour solarirrad une valeur constante 1308 if (lldebug_for_offline) then 1309 SOLARIRAD = 1366.0896 1310 ZCH4_off = CH4_ppb*1e-9 1311 ZN2O_off = N2O_ppb*1e-9 1312 ZNO2_off = 0.0 1313 ZCFC11_off = CFC11_ppt*1e-12 1314 ZCFC12_off = CFC12_ppt*1e-12 1315 ZHCFC22_off = 0.0 1316 ZCCL4_off = 0.0 1317 ZO2_off = 0.0 1318 ZCO2_off = co2_ppm*1e-6 1319 1253 1320 CALL writefield_phy('rmu0',rmu0,1) 1254 1321 CALL writefield_phy('tsol',tsol,1) 1255 1322 CALL writefield_phy('emissiv_out',ZEMIS,1) 1256 CALL writefield_phy('emissiv_in',ZEMISW,1)1257 CALL writefield_phy('pctsrf_ter',pctsrf(:,is_ter),1)1258 CALL writefield_phy('pctsrf_oce',pctsrf(:,is_oce),1)1259 CALL writefield_phy('ZGELAM',ZGELAM,1)1260 CALL writefield_phy('ZGEMU',ZGEMU,1)1261 CALL writefield_phy('zmasq',zmasq,1)1262 1323 CALL writefield_phy('paprs_i',paprs_i,klev+1) 1263 CALL writefield_phy('pplay_i',pplay_i,klev)1264 CALL writefield_phy('t_i',t_i,klev)1265 1324 CALL writefield_phy('ZTH_i',ZTH_i,klev+1) 1266 1325 CALL writefield_phy('cldfra_i',cldfra_i,klev) 1267 CALL writefield_phy('paer_i',PAER_i,klev)1268 1326 CALL writefield_phy('q_i',q_i,klev) 1269 1327 CALL writefield_phy('fiwc_i',fiwc_i,klev) … … 1271 1329 CALL writefield_phy('palbd_new',PALBD_NEW,NSW) 1272 1330 CALL writefield_phy('palbp_new',PALBP_NEW,NSW) 1273 ! CALL writefield_phy('ZO3_DP',ZO3_DP,klev) 1274 ENDIF 1331 CALL writefield_phy('POZON',POZON_i(:,:,1),klev) 1332 CALL writefield_phy('ZCO2',ZCO2_off,klev) 1333 CALL writefield_phy('ZCH4',ZCH4_off,klev) 1334 CALL writefield_phy('ZN2O',ZN2O_off,klev) 1335 CALL writefield_phy('ZO2',ZO2_off,klev) 1336 CALL writefield_phy('ZNO2',ZNO2_off,klev) 1337 CALL writefield_phy('ZCFC11',ZCFC11_off,klev) 1338 CALL writefield_phy('ZCFC12',ZCFC12_off,klev) 1339 CALL writefield_phy('ZHCFC22',ZHCFC22_off,klev) 1340 CALL writefield_phy('ZCCL4',ZCCL4_off,klev) 1341 CALL writefield_phy('ref_liq_i',ref_liq_i,klev) 1342 CALL writefield_phy('ref_ice_i',ref_ice_i,klev) 1343 endif 1344 ! lldebug_for_offline 1275 1345 1276 1346 CALL RADIATION_SCHEME & … … 1278 1348 ! ??? naero_tot 1279 1349 & day_cur, current_time, & 1280 ! & solaire, & 1281 & PSCT, & 1282 & rmu0, tsol, PALBD_NEW,PALBP_NEW, & 1283 ! PEMIS_WINDOW (???), & 1350 & SOLARIRAD, & 1351 & rmu0, tsol, & 1352 ! Albedo diffuse et directe 1353 & PALBD_NEW,PALBP_NEW, & 1354 ! Emessivite : PEMIS_WINDOW (???), & 1284 1355 & ZEMIS, ZEMISW, & 1285 1356 ! PCCN_LAND, PCCN_SEA, & ??? … … 1292 1363 & paprs_i, ZTH_i, q_i, qsat_i, & 1293 1364 ! Gas 1294 & ZCO2, ZCH4, ZN2O, ZNO2, ZCFC11, ZCFC12, ZHCFC22, ZCCL4, POZON_i(:,:,1), & 1365 & ZCO2, ZCH4, ZN2O, ZNO2, ZCFC11, ZCFC12, ZHCFC22, & 1366 & ZCCL4, POZON_i(:,:,1), ZO2, & 1295 1367 ! nuages : 1296 1368 & cldfra_i, flwc_i, fiwc_i, ZQ_RAIN, ZQ_SNOW, & … … 1315 1387 print *,'========= RADLWSW: apres RADIATION_SCHEME ==================== ' 1316 1388 1317 IF (lldebug) THEN 1318 CALL writefield_phy('zlwft_i',ZLWFT_i,klev+1) 1319 CALL writefield_phy('zlwft0_ii',ZLWFT0_ii,klev+1) 1320 CALL writefield_phy('zswft_i',ZSWFT_i,klev+1) 1321 CALL writefield_phy('zswft0_i',ZSWFT0_ii,klev+1) 1322 CALL writefield_phy('zfsdwn_i',ZFSDWN_i,klev+1) 1323 CALL writefield_phy('zflux2_i',ZFLUX_i(:,2,:),klev+1) 1324 CALL writefield_phy('zfcdwn_i',ZFCDWN_i,klev+1) 1325 CALL writefield_phy('zfluc2_i',ZFLUC_i(:,2,:),klev+1) 1326 CALL writefield_phy('psfswdir',PSFSWDIR,6) 1327 CALL writefield_phy('psfswdif',PSFSWDIF,6) 1328 CALL writefield_phy('zflux1_i',ZFLUX_i(:,1,:),klev+1) 1329 CALL writefield_phy('zfluc1_i',ZFLUC_i(:,1,:),klev+1) 1330 CALL writefield_phy('zfsup_i',ZFSUP_i,klev+1) 1331 CALL writefield_phy('zfcup_i',ZFCUP_i,klev+1) 1332 ENDIF 1389 if (lldebug_for_offline) then 1390 CALL writefield_phy('FLUX_LW',ZLWFT_i,klev+1) 1391 CALL writefield_phy('FLUX_LW_CLEAR',ZLWFT0_ii,klev+1) 1392 CALL writefield_phy('FLUX_SW',ZSWFT_i,klev+1) 1393 CALL writefield_phy('FLUX_SW_CLEAR',ZSWFT0_ii,klev+1) 1394 CALL writefield_phy('FLUX_DN_SW',ZFSDWN_i,klev+1) 1395 CALL writefield_phy('FLUX_DN_LW',ZFLUX_i(:,2,:),klev+1) 1396 CALL writefield_phy('FLUX_DN_SW_CLEAR',ZFCDWN_i,klev+1) 1397 CALL writefield_phy('FLUX_DN_LW_CLEAR',ZFLUC_i(:,2,:),klev+1) 1398 CALL writefield_phy('PSFSWDIR',PSFSWDIR,6) 1399 CALL writefield_phy('PSFSWDIF',PSFSWDIF,6) 1400 CALL writefield_phy('FLUX_UP_LW',ZFLUX_i(:,1,:),klev+1) 1401 CALL writefield_phy('FLUX_UP_LW_CLEAR',ZFLUC_i(:,1,:),klev+1) 1402 CALL writefield_phy('FLUX_UP_SW',ZFSUP_i,klev+1) 1403 CALL writefield_phy('FLUX_UP_SW_CLEAR',ZFCUP_i,klev+1) 1404 endif 1405 1333 1406 ! --------- 1334 1407 ! On retablit l'ordre des niveaux lmd pour les tableaux de sortie … … 1396 1469 !--fraction of diffuse radiation in surface SW downward radiation 1397 1470 DO i = 1, kdlon 1398 IF (fract(i).GT.0.0) THEN1399 1471 zdir=SUM(PSFSWDIR(i,:)) 1400 1472 zdif=SUM(PSFSWDIF(i,:)) 1473 IF (fract(i).GT.0.0.and.(zdir+zdif).gt.seuilmach) THEN 1401 1474 zsolswfdiff(i) = zdif/(zdir+zdif) 1402 1475 ELSE !--night
Note: See TracChangeset
for help on using the changeset viewer.