Changeset 2328
- Timestamp:
- Aug 3, 2017 12:34:22 PM (7 years ago)
- Location:
- palm/trunk/SOURCE
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/land_surface_model_mod.f90
r2307 r2328 25 25 ! ----------------- 26 26 ! $Id$ 27 ! Revised skin layer concept. 28 ! Bugfix for runs with pavement surface and humidity 29 ! Revised some standard values in vegetation_pars 30 ! Added emissivity and default albedo_type as variable to tables 31 ! Changed default surface type to vegetation 32 ! Revised input of soil layer configuration 33 ! 34 ! 2307 2017-07-07 11:32:10Z suehring 27 35 ! Bugfix, variable names corrected 28 36 ! … … 257 265 258 266 USE radiation_model_mod, & 259 ONLY: force_radiation_call, rad_net, rad_sw_in, rad_lw_out,&260 rad_ lw_out_change_0, radiation_scheme,&267 ONLY: albedo, albedo_type, emissivity, force_radiation_call, rad_net, & 268 rad_sw_in, rad_lw_out, rad_lw_out_change_0, radiation_scheme, & 261 269 unscheduled_radiation_calls 262 270 … … 288 296 289 297 290 REAL(wp), DIMENSION(0:7), PARAMETER :: zs_default =& ! default soil layer configuration291 (/ 0.0 05_wp, 0.02_wp, 0.04_wp,&292 0.07_wp, 0.15_wp, 0.2 8_wp, &293 1.00_wp, 2.89_wp/)298 REAL(wp), DIMENSION(0:7), PARAMETER :: dz_soil_default = & ! default soil layer configuration 299 (/ 0.01_wp, 0.02_wp, 0.04_wp, & 300 0.07_wp, 0.15_wp, 0.21_wp, & 301 0.72_wp, 1.89_wp/) 294 302 295 303 296 304 ! 297 305 !-- LSM variables 298 CHARACTER(10) :: surface_type = ' netcdf' !< general classification. Allowed are:299 !< 'vegetation', 'pavement', ('building'),300 !< 'water', and 'netcdf'306 CHARACTER(10) :: surface_type = 'vegetation' !< general classification. Allowed are: 307 !< 'vegetation', 'pavement', ('building'), 308 !< 'water', and 'netcdf' 301 309 302 310 … … 362 370 363 371 364 REAL(wp), DIMENSION(:), ALLOCATABLE :: ddz_soil , & !< 1/dz_soil365 ddz_soil _layer, & !< 1/dz_soil_layer366 dz_soil ,& !< soil grid spacing (center-center)367 dz_soil_layer, & !< soil grid spacing (edge-edge)368 root_extr 372 REAL(wp), DIMENSION(:), ALLOCATABLE :: ddz_soil_center, & !< 1/dz_soil_center 373 ddz_soil, & !< 1/dz_soil 374 dz_soil_center, & !< soil grid spacing (center-center) 375 zs, & !< depth of the temperature/moisute levels 376 root_extr !< root extraction 369 377 370 378 … … 373 381 soil_moisture = 0.0_wp, & !< NAMELIST soil moisture content (m3/m3) 374 382 soil_temperature = 300.0_wp, & !< NAMELIST soil temperature (K) +1 375 zs = 9999999.9_wp, & !< (NAMELIST) soil layer depths (center)383 dz_soil = 9999999.9_wp, & !< (NAMELIST) soil layer depths (spacing) 376 384 zs_layer = 9999999.9_wp !< soil layer depths (edge) 377 385 … … 536 544 ! 537 545 !-- Water classes 538 CHARACTER(12), DIMENSION(0: 4), PARAMETER :: water_type_name = (/ &546 CHARACTER(12), DIMENSION(0:5), PARAMETER :: water_type_name = (/ & 539 547 'user defined', & ! 0 540 548 'lake ', & ! 1 541 549 'river ', & ! 2 542 550 'ocean ', & ! 3 543 'pond ' & ! 4 551 'pond ', & ! 4 552 'fountain ' & ! 5 544 553 /) 545 554 … … 549 558 ! 550 559 !-- Land surface parameters 551 !-- r_canopy_min, lai, c_veg, g_d z0, z0h, lambda_s_s, lambda_s_u, f_sw_in, c_surface 552 REAL(wp), DIMENSION(0: 9,1:18), PARAMETER :: vegetation_pars = RESHAPE( (/ &553 0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, 0.5E-2_wp, 0.5E-4_wp, 0.0_wp, 0.0_wp, 0.00_wp, 0.00_wp, & ! 1554 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, 0.25_wp, 0.25E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 2555 110.0_wp, 2.00_wp, 0.85_wp, 0.00_wp, 0.20_wp, 0.20E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 3556 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, 2.00_wp, 2.00_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp, & ! 4557 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, 2.00_wp, 2.00_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp, & ! 5558 175.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, 2.00_wp, 2.00_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp, & ! 6559 240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp, 2.00_wp, 2.00_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp, & ! 7560 100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp, 0.47_wp, 0.47E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 8561 250.0_wp, 0.05_wp, 0.00_wp, 0.00_wp, 0.013_wp, 0.013E-2_wp, 196.0_wp, 196.0_wp, 0.00_wp, 0.00_wp, & ! 9562 80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp, 0.034_wp, 0.034E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 10563 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, 0.5_wp, 0.50E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 11564 150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp, 0.17_wp, 0.17E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 12565 0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, 1.3E-3_wp, 1.3E-4_wp, 812.0_wp, 812.0_wp, 0.00_wp, 0.00_wp, & ! 13566 240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp, 0.83_wp, 0.83E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 14567 225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp, 0.10_wp, 0.10E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 15568 225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp, 0.25_wp, 0.25E-2_wp, 140.0_wp, 140.0_wp, 0.05_wp, 0.00_wp, & ! 16569 250.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, 2.00_wp, 2.00_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp, & ! 17570 175.0_wp, 2.50_wp, 0.90_wp, 0.03_wp, 1.10_wp, 1.10_wp, 280.0_wp, 196.0_wp, 0.03_wp, 0.00_wp & ! 18571 /), (/ 1 0, 18 /) )560 !-- r_canopy_min, lai, c_veg, g_d z0, z0h, lambda_s_s, lambda_s_u, f_sw_in, c_surface, albedo_type, emissivity 561 REAL(wp), DIMENSION(0:11,1:18), PARAMETER :: vegetation_pars = RESHAPE( (/ & 562 0.0_wp, 0.00_wp, 1.00_wp, 0.00_wp, 0.005_wp, 0.5E-4_wp, 0.0_wp, 0.0_wp, 0.00_wp, 0.00_wp, 0.0_wp, 0.94_wp, & ! 1 563 180.0_wp, 3.00_wp, 1.00_wp, 0.00_wp, 0.10_wp, 0.001_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 2.0_wp, 0.95_wp, & ! 2 564 110.0_wp, 2.00_wp, 1.00_wp, 0.00_wp, 0.03_wp, 0.3E-4_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 2.0_wp, 0.95_wp, & ! 3 565 500.0_wp, 5.00_wp, 1.00_wp, 0.03_wp, 2.00_wp, 2.00_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 5.0_wp, 0.97_wp, & ! 4 566 500.0_wp, 5.00_wp, 1.00_wp, 0.03_wp, 2.00_wp, 2.00_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 6.0_wp, 0.97_wp, & ! 5 567 175.0_wp, 5.00_wp, 1.00_wp, 0.03_wp, 2.00_wp, 2.00_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 8.0_wp, 0.97_wp, & ! 6 568 240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp, 2.00_wp, 2.00_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 9.0_wp, 0.97_wp, & ! 7 569 100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp, 0.47_wp, 0.47E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 8.0_wp, 0.97_wp, & ! 8 570 250.0_wp, 0.05_wp, 0.00_wp, 0.00_wp, 0.013_wp, 0.013E-2_wp, 15.0_wp, 15.0_wp, 0.00_wp, 0.00_wp, 3.0_wp, 0.94_wp, & ! 9 571 80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp, 0.034_wp, 0.034E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 11.0_wp, 0.97_wp, & ! 10 572 180.0_wp, 3.00_wp, 1.00_wp, 0.00_wp, 0.5_wp, 0.50E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 13.0_wp, 0.97_wp, & ! 11 573 150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp, 0.17_wp, 0.17E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 2.0_wp, 0.97_wp, & ! 12 574 0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, 1.3E-3_wp, 1.3E-4_wp, 58.0_wp, 58.0_wp, 0.00_wp, 0.00_wp, 11.0_wp, 0.97_wp, & ! 13 575 240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp, 0.83_wp, 0.83E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 4.0_wp, 0.97_wp, & ! 14 576 225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp, 0.10_wp, 0.10E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 4.0_wp, 0.97_wp, & ! 15 577 225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp, 0.25_wp, 0.25E-2_wp, 10.0_wp, 10.0_wp, 0.05_wp, 0.00_wp, 4.0_wp, 0.97_wp, & ! 16 578 250.0_wp, 5.00_wp, 1.00_wp, 0.03_wp, 2.00_wp, 2.00_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 7.0_wp, 0.97_wp, & ! 17 579 175.0_wp, 2.50_wp, 1.00_wp, 0.03_wp, 1.10_wp, 1.10_wp, 20.0_wp, 15.0_wp, 0.03_wp, 0.00_wp, 8.0_wp, 0.97_wp & ! 18 580 /), (/ 12, 18 /) ) 572 581 573 582 … … 631 640 ! 632 641 !-- TO BE FILLED 633 !-- Pavement parameters depth, z0, z0h, lambda_h, rho_c 634 REAL(wp), DIMENSION(0: 4,1:7), PARAMETER :: pavement_pars = RESHAPE( (/ &635 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 1636 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 2637 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 3638 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 4639 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 5640 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, & ! 6641 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp & ! 7642 /), (/ 5, 7 /) )642 !-- Pavement parameters depth, z0, z0h, lambda_h, rho_c, albedo_type, emissivity 643 REAL(wp), DIMENSION(0:5,1:7), PARAMETER :: pavement_pars = RESHAPE( (/ & 644 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 17.0_wp, 0.97_wp, & ! 1 645 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 18.0_wp, 0.94_wp, & ! 2 646 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 19.0_wp, 0.98_wp, & ! 3 647 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 20.0_wp, 0.93_wp, & ! 4 648 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 21.0_wp, 0.97_wp, & ! 5 649 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 22.0_wp, 0.97_wp, & ! 6 650 0.050_wp, 1.0E-4_wp, 1.0E-5_wp, 1.00_wp, 1.94E6_wp, 23.0_wp, 0.97_wp & ! 7 651 /), (/ 6, 7 /) ) 643 652 644 653 ! 645 654 !-- TO BE FILLED 646 !-- Water parameters temperature, z0, z0h 647 REAL(wp), DIMENSION(0:2,1:4), PARAMETER :: water_pars = RESHAPE( (/ & 648 283.0_wp, 0.01_wp, 0.001_wp, & ! 1 649 283.0_wp, 0.01_wp, 0.001_wp, & ! 2 650 283.0_wp, 0.01_wp, 0.001_wp, & ! 3 651 283.0_wp, 10.01_wp, 0.001_wp & ! 4 652 /), (/ 3, 4 /) ) 655 !-- Water parameters temperature, z0, z0h, albedo_type, emissivity, 656 REAL(wp), DIMENSION(0:4,1:5), PARAMETER :: water_pars = RESHAPE( (/ & 657 283.0_wp, 0.01_wp, 0.001_wp, 1.0_wp, 0.99_wp, & ! 1 658 283.0_wp, 0.01_wp, 0.001_wp, 1.0_wp, 0.99_wp, & ! 2 659 283.0_wp, 0.01_wp, 0.001_wp, 1.0_wp, 0.99_wp, & ! 3 660 283.0_wp, 0.01_wp, 0.001_wp, 1.0_wp, 0.99_wp, & ! 4 661 283.0_wp, 0.01_wp, 0.001_wp, 1.0_wp, 0.99_wp & ! 5 662 /), (/ 5, 5 /) ) 653 663 654 664 SAVE … … 1099 1109 ENDIF 1100 1110 1101 1102 1103 1111 IF ( TRIM( surface_type ) == 'pavement' ) THEN 1104 1112 … … 1144 1152 ENDIF 1145 1153 1154 ! 1155 !-- Temporary message as long as NetCDF input is not available 1156 IF ( TRIM( surface_type ) == 'netcdf' ) THEN 1157 message_string = 'surface_type = netcdf '// & 1158 'is not supported at the moment' 1159 CALL message( 'check_parameters', 'PA0465', 1, 2, 0, 6, 0 ) 1160 ENDIF 1161 1146 1162 IF ( soil_type == 0 ) THEN 1147 1163 … … 1209 1225 nzb_soil = 0 1210 1226 nzt_soil = -1 1211 IF ( ALL( zs== 9999999.9_wp ) ) THEN1227 IF ( ALL( dz_soil == 9999999.9_wp ) ) THEN 1212 1228 nzt_soil = 7 1213 zs(nzb_soil:nzt_soil) = zs_default1229 dz_soil(nzb_soil:nzt_soil) = dz_soil_default 1214 1230 ELSE 1215 1231 DO k = 0, 19 1216 IF ( zs(k) /= 9999999.9_wp ) THEN1232 IF ( dz_soil(k) /= 9999999.9_wp ) THEN 1217 1233 nzt_soil = nzt_soil + 1 1218 1234 IF ( root_fraction(k) == 9999999.9_wp ) THEN 1219 message_string = 'manual setting of zs '//&1235 message_string = 'manual setting of dz_soil '// & 1220 1236 'requires adequate setting of root_fraction'//& 1221 1237 '/= 9999999.9 ' // & … … 1292 1308 f_qsws_liq, & !< factor for qsws_liq 1293 1309 f_shf, & !< factor for shf 1310 lambda_soil, & !< Thermal conductivity of the uppermost soil layer (W/m2/K) 1294 1311 lambda_surface, & !< Current value of lambda_surface (W/m2/K) 1295 1312 m_liq_max, & !< maxmimum value of the liq. water reservoir … … 1370 1387 ! 1371 1388 !-- Define heat conductivity between surface and soil depending on surface 1372 !-- type. For vegetation, a skin layer parameterization is used. For bare 1373 !-- soil and pavements, no skin layer is applied. In these cases, the 1374 !-- temperature is assumed to be constant between the surface and the first 1375 !-- soil layer. The heat conductivity is then derived from the soil/ 1376 !-- pavement properties. For water surfaces, the conductivity is already set 1377 !-- to 1E10. 1389 !-- type. For vegetation, a skin layer parameterization is used. The new 1390 !-- parameterization uses a combination of two conductivities: a constant 1391 !-- conductivity for the skin layer, and a conductivity according to the 1392 !-- uppermost soil layer. For bare soil and pavements, no skin layer is 1393 !-- applied. In these cases, the temperature is assumed to be constant 1394 !-- between the surface and the first soil layer. The heat conductivity is 1395 !-- then derived from the soil/pavement properties. 1396 !-- For water surfaces, the conductivity is already set to 1E10. 1378 1397 !-- Moreover, the heat capacity is set. For bare soil the heat capacity is 1379 !-- the capacity of the uppermost soil layer 1380 IF ( surf%lambda_surface_s(m) == 0.0_wp ) THEN 1381 1398 !-- the capacity of the uppermost soil layer, for pavement it is that of 1399 !-- the material involved. 1400 1401 ! 1402 !-- for vegetation type surfaces, the thermal conductivity of the soil is 1403 !-- needed 1404 IF ( surf%vegetation_surface(m) ) THEN 1405 1382 1406 lambda_h_sat = lambda_h_sm**(1.0_wp - surf%m_sat(nzb_soil,m)) * & 1383 1407 lambda_h_water ** surf_m_soil%var_2d(nzb_soil,m) … … 1386 1410 surf%m_sat(nzb_soil,m) ) ) 1387 1411 1388 lambda_surface = (ke * (lambda_h_sat - lambda_h_dry) + lambda_h_dry )& 1389 * ddz_soil_layer(nzb_soil) * 2.0_wp 1390 1391 c_surface_tmp = (rho_c_soil * ( 1.0_wp - surf%m_sat(nzb_soil,m) ) & 1392 + rho_c_water * surf_m_soil%var_2d(nzb_soil,m) ) & 1393 * dz_soil_layer(nzb_soil) * 0.5_wp 1394 1395 ELSEIF ( surf_t_surface%var_1d(m) >= surf_t_soil%var_2d(nzb_soil,m)) & 1396 THEN 1397 1412 lambda_soil = (ke * (lambda_h_sat - lambda_h_dry) + lambda_h_dry ) & 1413 * ddz_soil(nzb_soil) * 2.0_wp 1414 1415 ! 1416 !-- When bare soil is set without a thermal conductivity (no skin layer), 1417 !-- a heat capacity is that of the soil layer, otherwise it is a 1418 !-- combination of the conductivities from the skin and the soil layer 1419 IF ( surf%lambda_surface_s(m) == 0.0_wp ) THEN 1420 surf%c_surface(m) = (rho_c_soil * (1.0_wp - surf%m_sat(nzb_soil,m))& 1421 + rho_c_water * surf_m_soil%var_2d(nzb_soil,m) ) & 1422 * dz_soil(nzb_soil) * 0.5_wp 1423 lambda_surface = lambda_soil 1424 1425 ELSE IF ( surf_t_surface%var_1d(m) >= surf_t_soil%var_2d(nzb_soil,m))& 1426 THEN 1427 lambda_surface = surf%lambda_surface_s(m) * lambda_soil & 1428 / ( surf%lambda_surface_s(m) + lambda_soil ) 1429 ELSE 1430 1431 lambda_surface = surf%lambda_surface_u(m) * lambda_soil & 1432 / ( surf%lambda_surface_u(m) + lambda_soil ) 1433 ENDIF 1434 ELSE 1398 1435 lambda_surface = surf%lambda_surface_s(m) 1399 c_surface_tmp = surf%c_surface(m) 1400 1401 ELSE 1402 1403 lambda_surface = surf%lambda_surface_u(m) 1404 c_surface_tmp = surf%c_surface(m) 1405 1406 ENDIF 1436 ENDIF 1437 1438 ! 1439 !-- Set heat capacity of the skin/surface. It is ususally zero when a skin 1440 !-- layer is used, and non-zero otherwise. 1441 c_surface_tmp = surf%c_surface(m) 1407 1442 1408 1443 ! … … 1686 1721 * surf_t_surface%var_1d(m) - dq_s_dt * & 1687 1722 surf_t_surface_p%var_1d(m) ) / & 1688 surf%qsws(m)- surf%r_a(m)1723 (surf%qsws(m) + 1.0E-20) - surf%r_a(m) 1689 1724 ENDIF 1690 1725 … … 2069 2104 ENDDO 2070 2105 2106 2107 2071 2108 ! 2072 2109 !-- Calculate grid spacings. Temperature and moisture are defined at 2073 2110 !-- the center of the soil layers, whereas gradients/fluxes are 2074 2111 !-- defined at the edges (_layer) 2112 zs(nzb_soil) = 0.5_wp * dz_soil(nzb_soil) 2113 zs_layer(nzb_soil) = dz_soil(nzb_soil) 2114 2115 DO k = nzb_soil+1, nzt_soil 2116 zs_layer(k) = zs_layer(k-1) + dz_soil(k) 2117 zs(k) = (zs_layer(k) + zs_layer(k-1)) * 0.5_wp 2118 2119 ENDDO 2120 2121 dz_soil(nzt_soil+1) = zs_layer(nzt_soil) + dz_soil(nzt_soil) 2122 zs(nzt_soil+1) = zs_layer(nzt_soil) + 0.5_wp * dz_soil(nzt_soil) 2123 2075 2124 DO k = nzb_soil, nzt_soil-1 2076 dz_soil (k) = zs(k+1) - zs(k)2125 dz_soil_center(k) = zs(k+1) - zs(k) 2077 2126 2078 IF ( dz_soil (k) == 0.0_wp ) THEN2127 IF ( dz_soil_center(k) == 0.0_wp ) THEN 2079 2128 message_string = 'invalid soil layer configuration found ' // & 2080 '(dz_soil (k) = 0.0)'2129 '(dz_soil_center(k) = 0.0)' 2081 2130 CALL message( 'lsm_read_restart_data', 'PA0140', 1, 2, 0, 6, 0 ) 2082 ENDIF 2083 2131 ENDIF 2084 2132 ENDDO 2085 2086 dz_soil_layer(nzb_soil) = 2.0_wp * zs(nzb_soil)2087 zs_layer(nzb_soil) = 2.0_wp * zs(nzb_soil)2088 2133 2089 DO k = nzb_soil+1, nzt_soil 2090 dz_soil_layer(k) = ( zs(k) - zs_layer(k-1) ) * 2.0_wp 2091 zs_layer(k) = zs_layer(k-1) + dz_soil_layer(k) 2092 ENDDO 2093 dz_soil_layer(nzt_soil+1) = 0.5_wp * dz_soil_layer(nzt_soil) 2094 dz_soil(nzt_soil) = zs_layer(k-1) + dz_soil_layer(k) - zs(nzt_soil) 2134 dz_soil_center(nzt_soil) = zs_layer(k-1) + dz_soil(k) - zs(nzt_soil) 2135 2136 IF ( myid == 0 ) THEN 2137 PRINT*, "zs:", zs 2138 PRINT*, "zs_layer:", zs_layer 2139 PRINT*, "dz_soil:", dz_soil 2140 PRINT*, "dz_soil_center:", dz_soil_center 2141 ENDIF 2095 2142 2096 2143 2097 ddz_soil = 1.0_wp / dz_soil 2098 ddz_soil_layer = 1.0_wp / dz_soil_layer 2144 ddz_soil_center = 1.0_wp / dz_soil_center 2145 ddz_soil = 1.0_wp / dz_soil 2146 2147 2148 2149 2150 2151 2152 ! DO k = nzb_soil, nzt_soil-1 2153 ! dz_soil_center(k) = zs(k+1) - zs(k) 2154 ! 2155 ! IF ( dz_soil_center(k) == 0.0_wp ) THEN 2156 ! message_string = 'invalid soil layer configuration found ' // & 2157 ! '(dz_soil_center(k) = 0.0)' 2158 ! CALL message( 'lsm_read_restart_data', 'PA0140', 1, 2, 0, 6, 0 ) 2159 ! ENDIF 2160 ! 2161 ! ENDDO 2162 ! 2163 ! dz_soil(nzb_soil) = 2.0_wp * zs(nzb_soil) 2164 ! zs_layer(nzb_soil) = 2.0_wp * zs(nzb_soil) 2165 ! 2166 ! DO k = nzb_soil+1, nzt_soil 2167 ! dz_soil(k) = ( zs(k) - zs_layer(k-1) ) * 2.0_wp 2168 ! zs_layer(k) = zs_layer(k-1) + dz_soil(k) 2169 ! ENDDO 2170 ! dz_soil(nzt_soil+1) = 0.5_wp * dz_soil(nzt_soil) 2171 ! dz_soil_center(nzt_soil) = zs_layer(k-1) + dz_soil(k) - zs(nzt_soil) 2172 ! 2173 ! 2174 ! ddz_soil_center = 1.0_wp / dz_soil_center 2175 ! ddz_soil = 1.0_wp / dz_soil 2176 2177 2099 2178 2100 2179 … … 2208 2287 ENDIF 2209 2288 2210 !2211 !-- The heat conductivity between canopy and first soil layer must2212 !-- depend on the depth of the soil layer. The value in the lookup2213 !-- table refers to the first soil temperature at zs = -0.005 m. Lambda2214 !-- is thus interpolated to the actual soil layer depth used.2215 2289 IF ( lambda_surface_stable == 9999999.9_wp ) THEN 2216 lambda_surface_stable = vegetation_pars(6,vegetation_type) & 2217 * 0.005_wp * ddz_soil_layer(nzb_soil) & 2218 * 2.0_wp 2290 lambda_surface_stable = vegetation_pars(6,vegetation_type) 2219 2291 ENDIF 2220 2292 2221 2293 IF ( lambda_surface_unstable == 9999999.9_wp ) THEN 2222 lambda_surface_unstable = vegetation_pars(7,vegetation_type) & 2223 * 0.005_wp * ddz_soil_layer(nzb_soil) & 2224 * 2.0_wp 2294 lambda_surface_unstable = vegetation_pars(7,vegetation_type) 2225 2295 ENDIF 2226 2296 … … 2232 2302 c_surface = vegetation_pars(9,vegetation_type) 2233 2303 ENDIF 2234 2304 2305 IF ( albedo_type == 9999999 .AND. albedo == 9999999.9_wp ) THEN 2306 albedo_type = INT(vegetation_pars(10,vegetation_type)) 2307 ENDIF 2308 2309 IF ( emissivity == 9999999.9_wp ) THEN 2310 emissivity = vegetation_pars(11,vegetation_type) 2311 ENDIF 2312 2235 2313 ENDIF 2236 2314 … … 2242 2320 2243 2321 IF ( z0_water == 9999999.9_wp ) THEN 2244 z0_water = water_pars(1,water_type) 2322 z0_water = water_pars(1,water_type) 2245 2323 ENDIF 2246 2324 2247 2325 IF ( z0h_water == 9999999.9_wp ) THEN 2248 z0h_water = water_pars(2,water_type) 2326 z0h_water = water_pars(2,water_type) 2249 2327 ENDIF 2328 2329 IF ( albedo_type == 9999999 .AND. albedo == 9999999.9_wp ) THEN 2330 albedo_type = INT(water_pars(3,water_type)) 2331 ENDIF 2332 2333 IF ( emissivity == 9999999.9_wp ) THEN 2334 emissivity = water_pars(4,water_type) 2335 ENDIF 2250 2336 2251 2337 ENDIF … … 2256 2342 pavement_depth = pavement_pars(0,pavement_type) 2257 2343 ELSE 2258 pavement_depth = MAX( zs(nzb_soil), pavement_depth )2344 pavement_depth = MAX( 0.5_wp * dz_soil(nzb_soil), pavement_depth ) 2259 2345 ENDIF 2260 2346 … … 2275 2361 ENDIF 2276 2362 2363 IF ( albedo_type == 9999999 .AND. albedo == 9999999.9_wp ) THEN 2364 albedo_type = INT(pavement_pars(5,pavement_type)) 2365 ENDIF 2366 2367 IF ( emissivity == 9999999.9_wp ) THEN 2368 emissivity = pavement_pars(6,pavement_type) 2369 ENDIF 2370 2277 2371 ENDIF 2278 2372 ! … … 2340 2434 t_soil_h%var_2d(nzt_soil+1,m) = soil_temperature(nzt_soil+1) 2341 2435 surf_lsm_h%lambda_surface_s(m) = pavement_heat_conduct & 2342 * ddz_soil _layer(nzb_soil) &2436 * ddz_soil(nzb_soil) & 2343 2437 * 2.0_wp 2344 2438 surf_lsm_h%lambda_surface_u(m) = surf_lsm_h%lambda_surface_s(m) 2345 2439 surf_lsm_h%c_surface(m) = pavement_heat_capacity & 2346 * dz_soil _layer(nzb_soil) &2440 * dz_soil(nzb_soil) & 2347 2441 * 0.25_wp 2348 2442 surf_lsm_h%lambda_h_def(m) = pavement_heat_conduct … … 2428 2522 t_soil_v(l)%var_2d(nzt_soil+1,m) = soil_temperature(nzt_soil+1) 2429 2523 surf_lsm_v(l)%lambda_surface_s(m) = pavement_heat_conduct & 2430 * ddz_soil _layer(nzb_soil) &2524 * ddz_soil(nzb_soil) & 2431 2525 * 2.0_wp 2432 2526 surf_lsm_v(l)%lambda_surface_u(m) = surf_lsm_v(l)%lambda_surface_s(m) 2433 2527 surf_lsm_v(l)%c_surface(m) = pavement_heat_capacity & 2434 * dz_soil _layer(nzb_soil) &2528 * dz_soil(nzb_soil) & 2435 2529 * 0.25_wp 2436 2530 surf_lsm_v(l)%lambda_h_def(m) = pavement_heat_conduct … … 2642 2736 ! 2643 2737 !-- Allocate global 1D arrays 2644 ALLOCATE ( ddz_soil(nzb_soil:nzt_soil) ) 2645 ALLOCATE ( ddz_soil_layer(nzb_soil:nzt_soil+1) ) 2646 ALLOCATE ( dz_soil(nzb_soil:nzt_soil) ) 2647 ALLOCATE ( dz_soil_layer(nzb_soil:nzt_soil+1) ) 2738 ALLOCATE ( ddz_soil_center(nzb_soil:nzt_soil) ) 2739 ALLOCATE ( ddz_soil(nzb_soil:nzt_soil+1) ) 2740 ALLOCATE ( dz_soil_center(nzb_soil:nzt_soil) ) 2648 2741 ALLOCATE ( root_extr(nzb_soil:nzt_soil) ) 2649 2742 ALLOCATE ( zs(nzb_soil:nzt_soil+1) ) 2743 2650 2744 root_extr = 0.0_wp 2651 2745 … … 2829 2923 constant_roughness, & 2830 2924 conserve_water_content, & 2925 dz_soil, & 2831 2926 f_shortwave_incoming, field_capacity, & 2832 2927 aero_resist_kray, hydraulic_conductivity, & … … 2843 2938 vegetation_coverage, vegetation_type, & 2844 2939 water_temperature, water_type, & 2845 wilting_point, z s, z0_vegetation,&2940 wilting_point, z0_vegetation, & 2846 2941 z0h_vegetation, z0q_vegetation, z0_water, & 2847 2942 z0h_water, z0q_water, z0_pavement, & … … 2979 3074 .AND. zs(k+1) > pavement_depth ) & 2980 3075 THEN 2981 surf%lambda_h(k,m) = ( pavement_depth - zs(k) ) * ddz_soil (k+1) &3076 surf%lambda_h(k,m) = ( pavement_depth - zs(k) ) * ddz_soil_center(k+1) & 2982 3077 * lambda_temp(k) & 2983 + ( zs(k+1) - pavement_depth ) * ddz_soil (k+1) &3078 + ( zs(k+1) - pavement_depth ) * ddz_soil_center(k+1) & 2984 3079 * lambda_temp(k+1) 2985 3080 ELSE … … 2997 3092 tend(nzb_soil) = ( 1.0_wp / surf%rho_c_total(nzb_soil,m) ) * & 2998 3093 ( surf%lambda_h(nzb_soil,m) * ( surf_t_soil%var_2d(nzb_soil+1,m) & 2999 - surf_t_soil%var_2d(nzb_soil,m) ) * ddz_soil (nzb_soil) &3000 + surf%ghf(m) ) * ddz_soil _layer(nzb_soil)3094 - surf_t_soil%var_2d(nzb_soil,m) ) * ddz_soil_center(nzb_soil) & 3095 + surf%ghf(m) ) * ddz_soil(nzb_soil) 3001 3096 3002 3097 DO k = nzb_soil+1, nzt_soil … … 3004 3099 * ( surf%lambda_h(k,m) & 3005 3100 * ( surf_t_soil%var_2d(k+1,m) - surf_t_soil%var_2d(k,m) ) & 3006 * ddz_soil (k) &3101 * ddz_soil_center(k) & 3007 3102 - surf%lambda_h(k-1,m) & 3008 3103 * ( surf_t_soil%var_2d(k,m) - surf_t_soil%var_2d(k-1,m) ) & 3009 * ddz_soil (k-1) &3010 ) * ddz_soil _layer(k)3104 * ddz_soil_center(k-1) & 3105 ) * ddz_soil(k) 3011 3106 3012 3107 ENDDO … … 3143 3238 tend(nzb_soil) = ( surf%lambda_w(nzb_soil,m) * ( & 3144 3239 surf_m_soil%var_2d(nzb_soil+1,m) - surf_m_soil%var_2d(nzb_soil,m) ) & 3145 * ddz_soil (nzb_soil) - surf%gamma_w(nzb_soil,m) - &3240 * ddz_soil_center(nzb_soil) - surf%gamma_w(nzb_soil,m) - & 3146 3241 ( & 3147 3242 root_extr(nzb_soil) * surf%qsws_veg(m) & 3148 3243 + surf%qsws_soil(m) ) * drho_l_lv ) & 3149 * ddz_soil _layer(nzb_soil)3244 * ddz_soil(nzb_soil) 3150 3245 3151 3246 DO k = nzb_soil+1, nzt_soil-1 3152 3247 tend(k) = ( surf%lambda_w(k,m) * ( surf_m_soil%var_2d(k+1,m) & 3153 - surf_m_soil%var_2d(k,m) ) * ddz_soil (k) &3248 - surf_m_soil%var_2d(k,m) ) * ddz_soil_center(k) & 3154 3249 - surf%gamma_w(k,m) & 3155 3250 - surf%lambda_w(k-1,m) * ( surf_m_soil%var_2d(k,m) - & 3156 surf_m_soil%var_2d(k-1,m)) * ddz_soil (k-1) &3251 surf_m_soil%var_2d(k-1,m)) * ddz_soil_center(k-1) & 3157 3252 + surf%gamma_w(k-1,m) - (root_extr(k) & 3158 3253 * surf%qsws_veg(m) * drho_l_lv) & 3159 ) * ddz_soil _layer(k)3254 ) * ddz_soil(k) 3160 3255 ENDDO 3161 3256 tend(nzt_soil) = ( - surf%gamma_w(nzt_soil,m) & … … 3163 3258 * ( surf_m_soil%var_2d(nzt_soil,m) & 3164 3259 - surf_m_soil%var_2d(nzt_soil-1,m)) & 3165 * ddz_soil (nzt_soil-1) &3260 * ddz_soil_center(nzt_soil-1) & 3166 3261 + surf%gamma_w(nzt_soil-1,m) - ( & 3167 3262 root_extr(nzt_soil) & 3168 3263 * surf%qsws_veg(m) * drho_l_lv ) & 3169 ) * ddz_soil _layer(nzt_soil)3264 ) * ddz_soil(nzt_soil) 3170 3265 3171 3266 surf_m_soil_p%var_2d(nzb_soil:nzt_soil,m) = surf_m_soil%var_2d(nzb_soil:nzt_soil,m) & -
palm/trunk/SOURCE/radiation_model_mod.f90
r2318 r2328 25 25 ! ----------------- 26 26 ! $Id$ 27 ! Emissivity can now be set individually for each pixel. 28 ! Albedo type can be inferred from land surface model. 29 ! Added default albedo type for bare soil 30 ! 31 ! 2318 2017-07-20 17:27:44Z suehring 27 32 ! Get topography top index via Function call 28 33 ! … … 211 216 ! 212 217 !-- Predefined Land surface classes (albedo_type) after Briegleb (1992) 213 CHARACTER(37), DIMENSION(0:1 7), PARAMETER :: albedo_type_name = (/ &218 CHARACTER(37), DIMENSION(0:18), PARAMETER :: albedo_type_name = (/ & 214 219 'user defined ', & ! 0 215 220 'ocean ', & ! 1 … … 229 234 'sea ice ', & ! 15 230 235 'snow ', & ! 16 231 'pavement/roads ' & ! 17 236 'pavement/roads ', & ! 17 237 'bare soil ' & ! 18 232 238 /) 233 239 234 INTEGER(iwp) :: albedo_type = 5, & !< Albedo surface type (default: short grassland)235 day, & !< current day of the year236 day_init = 172, & !< day of the year at model start (21/06)237 dots_rad = 0 !< starting index for timeseries output240 INTEGER(iwp) :: albedo_type = 9999999, & !< Albedo surface type 241 day, & !< current day of the year 242 day_init = 172, & !< day of the year at model start (21/06) 243 dots_rad = 0 !< starting index for timeseries output 238 244 239 245 LOGICAL :: unscheduled_radiation_calls = .TRUE., & !< flag parameter indicating whether additional calls of the radiation code are allowed … … 261 267 decl_3, & !< declination coef. 3 262 268 dt_radiation = 0.0_wp, & !< radiation model timestep 263 emissivity = 0.98_wp,& !< NAMELIST surface emissivity269 emissivity = 9999999.9_wp, & !< NAMELIST surface emissivity 264 270 lambda = 0.0_wp, & !< longitude in degrees 265 271 lon = 0.0_wp, & !< longitude in radians … … 278 284 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: & 279 285 alpha, & !< surface broadband albedo (used for clear-sky scheme) 286 emis, & !< surface broadband emissitivity 280 287 rad_lw_out_change_0, & !< change in LW out due to change in surface temperature 281 288 rad_net, & !< net radiation at the surface … … 285 292 !-- Land surface albedos for solar zenith angle of 60° after Briegleb (1992) 286 293 !-- (shortwave, longwave, broadband): sw, lw, bb, 287 REAL(wp), DIMENSION(0:2,1:1 7), PARAMETER :: albedo_pars = RESHAPE( (/&294 REAL(wp), DIMENSION(0:2,1:18), PARAMETER :: albedo_pars = RESHAPE( (/& 288 295 0.06_wp, 0.06_wp, 0.06_wp, & ! 1 289 296 0.09_wp, 0.28_wp, 0.19_wp, & ! 2 … … 302 309 0.90_wp, 0.65_wp, 0.77_wp, & ! 15 303 310 0.95_wp, 0.70_wp, 0.82_wp, & ! 16 304 0.08_wp, 0.08_wp, 0.08_wp & ! 17 305 /), (/ 3, 17 /) ) 311 0.08_wp, 0.08_wp, 0.08_wp, & ! 17 312 0.17_wp, 0.17_wp, 0.17_wp & ! 18 313 /), (/ 3, 18 /) ) 306 314 307 315 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: & … … 510 518 ! 511 519 !-- Public variables and constants / NEEDS SORTING 512 PUBLIC decl_1, decl_2, decl_3, dots_rad, dt_radiation, force_radiation_call,&520 PUBLIC albedo, albedo_type, decl_1, decl_2, decl_3, dots_rad, dt_radiation, emissivity, force_radiation_call,& 513 521 lat, lon, rad_net, rad_net_av, radiation, radiation_scheme, rad_lw_in, & 514 522 rad_lw_in_av, rad_lw_out, rad_lw_out_av, rad_lw_out_change_0, & … … 888 896 889 897 ! 898 !-- Allocate array for storing emissivity 899 IF ( .NOT. ALLOCATED ( emis ) ) THEN 900 ALLOCATE ( emis(nysg:nyng,nxlg:nxrg) ) 901 emis = emissivity 902 ENDIF 903 904 ! 890 905 !-- Allocate array for storing the surface net radiation 891 906 IF ( .NOT. ALLOCATED ( rad_net ) ) THEN … … 956 971 ! 957 972 !-- Overwrite albedo if manually set in parameter file 958 IF ( albedo_type /= 0 .AND. albedo == 9999999.9_wp ) THEN973 IF ( albedo_type /= 0 .AND. albedo_type /= 9999999 .AND. albedo == 9999999.9_wp ) THEN 959 974 albedo = albedo_pars(2,albedo_type) 960 975 ENDIF 961 976 ! 977 !-- Write albedo to 2d array alpha to allow surface heterogeneities 962 978 alpha = albedo 963 979 … … 1194 1210 rad_sw_in(0,j,i) = solar_constant * sky_trans * zenith(0) 1195 1211 rad_sw_out(0,j,i) = alpha(j,i) * rad_sw_in(0,j,i) 1196 rad_lw_out(0,j,i) = emis sivity* sigma_sb * (pt(k,j,i) * exn)**41212 rad_lw_out(0,j,i) = emis(j,i) * sigma_sb * (pt(k,j,i) * exn)**4 1197 1213 1198 1214 IF ( cloud_physics ) THEN … … 1207 1223 1208 1224 1209 rad_lw_out_change_0(j,i) = 3.0_wp * sigma_sb * emis sivity&1225 rad_lw_out_change_0(j,i) = 3.0_wp * sigma_sb * emis(j,i) & 1210 1226 * (pt(k,j,i) * exn) ** 3 1211 1227 … … 1254 1270 ENDIF 1255 1271 1256 rad_lw_out(0,j,i) = emis sivity* sigma_sb * (pt(k,j,i) * exn)**41272 rad_lw_out(0,j,i) = emis(j,i) * sigma_sb * (pt(k,j,i) * exn)**4 1257 1273 1258 1274 rad_sw_in(0,j,i) = ( rad_net(j,i) - rad_lw_in(0,j,i) & … … 1533 1549 rrtm_tsfc = pt(nzb,j,i) * (surface_pressure / 1000.0_wp )**0.286_wp 1534 1550 1551 ! 1552 !-- Set surface emissivity 1553 rrtm_emis = emis(j,i) 1554 1535 1555 IF ( lw_radiation ) THEN 1536 1556 CALL rrtmg_lw( 1, nzt_rad , rrtm_icld , rrtm_idrv ,& … … 1723 1743 rrtm_aldir(0,:,:) = aldif 1724 1744 rrtm_asdir(0,:,:) = asdif 1745 1746 ! 1747 !-- Bare soil 1748 ELSEIF ( albedo_type == 18 ) THEN 1749 rrtm_aldir(0,:,:) = aldif 1750 rrtm_asdir(0,:,:) = asdif 1751 1725 1752 ! 1726 1753 !-- Land surfaces
Note: See TracChangeset
for help on using the changeset viewer.