Changeset 1976 for palm/trunk/SOURCE/radiation_model_mod.f90
- Timestamp:
- Jul 27, 2016 1:28:04 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/radiation_model_mod.f90
r1857 r1976 19 19 ! Current revisions: 20 20 ! ----------------- 21 ! 21 ! Output of 2D/3D/masked data is now directly done within this module. The 22 ! radiation schemes have been simplified for better usability so that 23 ! rad_lw_in, rad_lw_out, rad_sw_in, and rad_sw_out are available independent of 24 ! the radiation code used. 22 25 ! 23 26 ! Former revisions: … … 130 133 131 134 #if defined ( __rrtmg ) 132 133 135 USE parrrsw, & 134 136 ONLY: naerec, nbndsw … … 276 278 ! 277 279 !-- Flag parameters for RRTMGS (should not be changed) 278 INTEGER(iwp), PARAMETER :: rrtm_inflglw = 2, & !< flag for lw cloud optical properties (0,1,2) 280 INTEGER(iwp), PARAMETER :: rrtm_idrv = 1, & !< flag for longwave upward flux calculation option (0,1) 281 rrtm_inflglw = 2, & !< flag for lw cloud optical properties (0,1,2) 279 282 rrtm_iceflglw = 0, & !< flag for lw ice particle specifications (0,1,2,3) 280 283 rrtm_liqflglw = 1, & !< flag for lw liquid droplet specifications … … 289 292 INTEGER(iwp) :: nzt_rad, & !< upper vertical limit for radiation calculations 290 293 rrtm_icld = 0, & !< cloud flag (0: clear sky column, 1: cloudy column) 291 rrtm_iaer = 0, & !< aerosol option flag (0: no aerosol layers, for lw only: 6 (requires setting of rrtm_sw_ecaer), 10: one or more aerosol layers (not implemented) 292 rrtm_idrv = 1 !< longwave upward flux calculation option (0,1) 294 rrtm_iaer = 0 !< aerosol option flag (0: no aerosol layers, for lw only: 6 (requires setting of rrtm_sw_ecaer), 10: one or more aerosol layers (not implemented) 293 295 294 296 INTEGER(iwp) :: nc_stat !< local variable for storin the result of netCDF calls for error message handling … … 385 387 END INTERFACE radiation_constant 386 388 389 INTERFACE radiation_control 390 MODULE PROCEDURE radiation_control 391 END INTERFACE radiation_control 392 393 INTERFACE radiation_3d_data_averaging 394 MODULE PROCEDURE radiation_3d_data_averaging 395 END INTERFACE radiation_3d_data_averaging 396 397 INTERFACE radiation_data_output_2d 398 MODULE PROCEDURE radiation_data_output_2d 399 END INTERFACE radiation_data_output_2d 400 401 INTERFACE radiation_data_output_3d 402 MODULE PROCEDURE radiation_data_output_3d 403 END INTERFACE radiation_data_output_3d 404 405 INTERFACE radiation_data_output_mask 406 MODULE PROCEDURE radiation_data_output_mask 407 END INTERFACE radiation_data_output_mask 408 409 INTERFACE radiation_define_netcdf_grid 410 MODULE PROCEDURE radiation_define_netcdf_grid 411 END INTERFACE radiation_define_netcdf_grid 412 387 413 INTERFACE radiation_header 388 414 MODULE PROCEDURE radiation_header … … 406 432 END INTERFACE radiation_tendency 407 433 434 INTERFACE radiation_read_restart_data 435 MODULE PROCEDURE radiation_read_restart_data 436 END INTERFACE radiation_read_restart_data 437 438 INTERFACE radiation_last_actions 439 MODULE PROCEDURE radiation_last_actions 440 END INTERFACE radiation_last_actions 441 408 442 SAVE 409 443 … … 411 445 412 446 ! 413 !-- Public functions 447 !-- Public functions / NEEDS SORTING 414 448 PUBLIC radiation_check_data_output, radiation_check_data_output_pr, & 415 radiation_check_parameters, radiation_clearsky, radiation_constant, & 416 radiation_header, radiation_init, radiation_parin, radiation_rrtmg, & 417 radiation_tendency 449 radiation_check_parameters, radiation_control, & 450 radiation_header, radiation_init, radiation_parin, & 451 radiation_3d_data_averaging, radiation_tendency, & 452 radiation_data_output_2d, radiation_data_output_3d, & 453 radiation_define_netcdf_grid, radiation_last_actions, & 454 radiation_read_restart_data, radiation_data_output_mask 418 455 419 456 ! 420 !-- Public variables and constants 457 !-- Public variables and constants / NEEDS SORTING 421 458 PUBLIC dots_rad, dt_radiation, force_radiation_call, & 422 459 rad_net, rad_net_av, radiation, radiation_scheme, rad_lw_in, & … … 424 461 rad_lw_cs_hr, rad_lw_cs_hr_av, rad_lw_hr, rad_lw_hr_av, rad_sw_in, & 425 462 rad_sw_in_av, rad_sw_out, rad_sw_out_av, rad_sw_cs_hr, & 426 rad_sw_cs_hr_av, rad_sw_hr, rad_sw_hr_av, sigma_sb,&463 rad_sw_cs_hr_av, rad_sw_hr, rad_sw_hr_av, & 427 464 skip_time_do_radiation, time_radiation, unscheduled_radiation_calls 428 465 429 466 430 467 #if defined ( __rrtmg ) 431 PUBLIC rrtm_aldif, rrtm_aldir, rrtm_asdif, rrtm_asdir , rrtm_idrv468 PUBLIC rrtm_aldif, rrtm_aldir, rrtm_asdif, rrtm_asdir 432 469 #endif 433 470 434 471 CONTAINS 472 473 474 !------------------------------------------------------------------------------! 475 ! Description: 476 ! ------------ 477 !> This subroutine controls the calls of the radiation schemes 478 !------------------------------------------------------------------------------! 479 SUBROUTINE radiation_control 480 481 482 IMPLICIT NONE 483 484 485 SELECT CASE ( TRIM( radiation_scheme ) ) 486 487 CASE ( 'constant' ) 488 CALL radiation_constant 489 490 CASE ( 'clear-sky' ) 491 CALL radiation_clearsky 492 493 CASE ( 'rrtmg' ) 494 CALL radiation_rrtmg 495 496 CASE DEFAULT 497 498 END SELECT 499 500 501 END SUBROUTINE radiation_control 435 502 436 503 !------------------------------------------------------------------------------! … … 456 523 SELECT CASE ( TRIM( var ) ) 457 524 458 CASE ( 'rad_lw_in', 'rad_lw_out', 'rad_lw_cs_hr', 'rad_lw_hr', & 459 'rad_sw_in', 'rad_sw_out', 'rad_sw_cs_hr', 'rad_sw_hr' ) 525 CASE ( 'rad_lw_cs_hr', 'rad_lw_hr', 'rad_sw_cs_hr', 'rad_sw_hr' ) 460 526 IF ( .NOT. radiation .OR. radiation_scheme /= 'rrtmg' ) THEN 461 527 message_string = '"output of "' // TRIM( var ) // '" requi' // & … … 779 845 ENDIF 780 846 781 782 IF ( radiation_scheme == 'constant' ) THEN 783 784 IF ( .NOT. ALLOCATED ( rad_lw_out ) ) THEN 785 ALLOCATE ( rad_lw_out(0:0,nysg:nyng,nxlg:nxrg) ) 786 ENDIF 787 788 ENDIF 789 790 IF ( radiation_scheme == 'clear-sky' ) THEN 847 IF ( radiation_scheme == 'clear-sky' .OR. & 848 radiation_scheme == 'constant') THEN 791 849 792 850 ALLOCATE ( alpha(nysg:nyng,nxlg:nxrg) ) … … 1075 1133 + rad_lw_in(0,j,i) - rad_lw_out(0,j,i) 1076 1134 1135 1136 rad_lw_out_change_0(j,i) = 3.0_wp * sigma_sb * emissivity & 1137 * (pt(k,j,i) * exn) ** 3 1138 1077 1139 ENDDO 1078 1140 ENDDO … … 1093 1155 INTEGER(iwp) :: i, j, k !< loop indices 1094 1156 REAL(wp) :: exn, & !< Exner functions at surface 1157 exn1, & !< Exner functions at first grid level 1095 1158 pt1 !< potential temperature at first grid level 1096 1159 … … 1099 1162 exn = (surface_pressure / 1000.0_wp )**0.286_wp 1100 1163 ! 1101 !-- Prescribe net radiation and estimate a longwave outgoing radiative 1102 !-- flux (needed in land surface model) 1164 !-- Prescribe net radiation and estimate the remaining radiative fluxes 1103 1165 DO i = nxlg, nxrg 1104 1166 DO j = nysg, nyng … … 1106 1168 1107 1169 rad_net(j,i) = net_radiation 1170 1171 exn1 = (hyp(k+1) / 100000.0_wp )**0.286_wp 1172 1173 IF ( cloud_physics ) THEN 1174 pt1 = pt(k+1,j,i) + l_d_cp / exn1 * ql(k+1,j,i) 1175 rad_lw_in(0,j,i) = 0.8_wp * sigma_sb * (pt1 * exn1)**4 1176 ELSE 1177 rad_lw_in(0,j,i) = 0.8_wp * sigma_sb * (pt(k+1,j,i) * exn1)**4 1178 ENDIF 1179 1108 1180 rad_lw_out(0,j,i) = emissivity * sigma_sb * (pt(k,j,i) * exn)**4 1181 1182 rad_sw_in(0,j,i) = ( rad_net(j,i) - rad_lw_in(0,j,i) & 1183 + rad_lw_out(0,j,i) ) & 1184 / ( 1.0_wp - alpha(j,i) ) 1109 1185 1110 1186 ENDDO … … 2147 2223 !> Cache-optimized version. 2148 2224 !------------------------------------------------------------------------------! 2149 SUBROUTINE radiation_tendency_ij ( i, j, tend ) 2150 2151 USE cloud_parameters, & 2152 ONLY: pt_d_t 2153 2154 IMPLICIT NONE 2155 2156 INTEGER(iwp) :: i, j, k !< loop indices 2157 2158 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term 2159 2160 #if defined ( __rrtmg ) 2225 SUBROUTINE radiation_tendency_ij ( i, j, tend ) 2226 2227 USE cloud_parameters, & 2228 ONLY: pt_d_t 2229 2230 IMPLICIT NONE 2231 2232 INTEGER(iwp) :: i, j, k !< loop indices 2233 2234 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term 2235 2236 IF ( radiation_scheme == 'rrtmg' ) THEN 2237 #if defined ( __rrtmg ) 2161 2238 ! 2162 2239 !-- Calculate tendency based on heating rate 2163 2240 DO k = nzb+1, nzt+1 2164 2241 tend(k,j,i) = tend(k,j,i) + (rad_lw_hr(k,j,i) + rad_sw_hr(k,j,i)) & 2165 * pt_d_t(k) * d_seconds_hour2242 * pt_d_t(k) * d_seconds_hour 2166 2243 ENDDO 2167 2168 2244 #endif 2245 ENDIF 2169 2246 2170 2247 END SUBROUTINE radiation_tendency_ij … … 2177 2254 !> Vector-optimized version 2178 2255 !------------------------------------------------------------------------------! 2179 SUBROUTINE radiation_tendency ( tend ) 2180 2181 USE cloud_parameters, & 2182 ONLY: pt_d_t 2183 2184 USE indices, & 2185 ONLY: nxl, nxr, nyn, nys 2186 2187 IMPLICIT NONE 2188 2189 INTEGER(iwp) :: i, j, k !< loop indices 2190 2191 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term 2192 2193 #if defined ( __rrtmg ) 2256 SUBROUTINE radiation_tendency ( tend ) 2257 2258 USE cloud_parameters, & 2259 ONLY: pt_d_t 2260 2261 USE indices, & 2262 ONLY: nxl, nxr, nyn, nys 2263 2264 IMPLICIT NONE 2265 2266 INTEGER(iwp) :: i, j, k !< loop indices 2267 2268 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term 2269 2270 IF ( radiation_scheme == 'rrtmg' ) THEN 2271 #if defined ( __rrtmg ) 2194 2272 ! 2195 2273 !-- Calculate tendency based on heating rate … … 2198 2276 DO k = nzb+1, nzt+1 2199 2277 tend(k,j,i) = tend(k,j,i) + ( rad_lw_hr(k,j,i) & 2200 + rad_sw_hr(k,j,i) ) * pt_d_t(k)&2201 2202 ENDDO 2203 ENDDO2278 + rad_sw_hr(k,j,i) ) * pt_d_t(k) & 2279 * d_seconds_hour 2280 ENDDO 2281 ENDDO 2204 2282 ENDDO 2205 2283 #endif 2206 2207 END SUBROUTINE radiation_tendency 2284 ENDIF 2285 2286 2287 END SUBROUTINE radiation_tendency 2288 2289 !------------------------------------------------------------------------------! 2290 ! 2291 ! Description: 2292 ! ------------ 2293 !> Subroutine for averaging 3D data 2294 !------------------------------------------------------------------------------! 2295 SUBROUTINE radiation_3d_data_averaging( mode, variable ) 2296 2297 2298 USE control_parameters 2299 2300 USE indices 2301 2302 USE kinds 2303 2304 IMPLICIT NONE 2305 2306 CHARACTER (LEN=*) :: mode !< 2307 CHARACTER (LEN=*) :: variable !< 2308 2309 INTEGER(iwp) :: i !< 2310 INTEGER(iwp) :: j !< 2311 INTEGER(iwp) :: k !< 2312 2313 IF ( mode == 'allocate' ) THEN 2314 2315 SELECT CASE ( TRIM( variable ) ) 2316 2317 CASE ( 'rad_net*' ) 2318 IF ( .NOT. ALLOCATED( rad_net_av ) ) THEN 2319 ALLOCATE( rad_net_av(nysg:nyng,nxlg:nxrg) ) 2320 ENDIF 2321 rad_net_av = 0.0_wp 2322 2323 CASE ( 'rad_lw_in' ) 2324 IF ( .NOT. ALLOCATED( rad_lw_in_av ) ) THEN 2325 ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 2326 ENDIF 2327 rad_lw_in_av = 0.0_wp 2328 2329 CASE ( 'rad_lw_out' ) 2330 IF ( .NOT. ALLOCATED( rad_lw_out_av ) ) THEN 2331 ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 2332 ENDIF 2333 rad_lw_out_av = 0.0_wp 2334 2335 CASE ( 'rad_lw_cs_hr' ) 2336 IF ( .NOT. ALLOCATED( rad_lw_cs_hr_av ) ) THEN 2337 ALLOCATE( rad_lw_cs_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) ) 2338 ENDIF 2339 rad_lw_cs_hr_av = 0.0_wp 2340 2341 CASE ( 'rad_lw_hr' ) 2342 IF ( .NOT. ALLOCATED( rad_lw_hr_av ) ) THEN 2343 ALLOCATE( rad_lw_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) ) 2344 ENDIF 2345 rad_lw_hr_av = 0.0_wp 2346 2347 CASE ( 'rad_sw_in' ) 2348 IF ( .NOT. ALLOCATED( rad_sw_in_av ) ) THEN 2349 ALLOCATE( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 2350 ENDIF 2351 rad_sw_in_av = 0.0_wp 2352 2353 CASE ( 'rad_sw_out' ) 2354 IF ( .NOT. ALLOCATED( rad_sw_out_av ) ) THEN 2355 ALLOCATE( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 2356 ENDIF 2357 rad_sw_out_av = 0.0_wp 2358 2359 CASE ( 'rad_sw_cs_hr' ) 2360 IF ( .NOT. ALLOCATED( rad_sw_cs_hr_av ) ) THEN 2361 ALLOCATE( rad_sw_cs_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) ) 2362 ENDIF 2363 rad_sw_cs_hr_av = 0.0_wp 2364 2365 CASE ( 'rad_sw_hr' ) 2366 IF ( .NOT. ALLOCATED( rad_sw_hr_av ) ) THEN 2367 ALLOCATE( rad_sw_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) ) 2368 ENDIF 2369 rad_sw_hr_av = 0.0_wp 2370 2371 CASE DEFAULT 2372 CONTINUE 2373 2374 END SELECT 2375 2376 ELSEIF ( mode == 'sum' ) THEN 2377 2378 SELECT CASE ( TRIM( variable ) ) 2379 2380 CASE ( 'rad_net*' ) 2381 DO i = nxlg, nxrg 2382 DO j = nysg, nyng 2383 rad_net_av(j,i) = rad_net_av(j,i) + rad_net(j,i) 2384 ENDDO 2385 ENDDO 2386 2387 CASE ( 'rad_lw_in' ) 2388 DO i = nxlg, nxrg 2389 DO j = nysg, nyng 2390 DO k = nzb, nzt+1 2391 rad_lw_in_av(k,j,i) = rad_lw_in_av(k,j,i) + rad_lw_in(k,j,i) 2392 ENDDO 2393 ENDDO 2394 ENDDO 2395 2396 CASE ( 'rad_lw_out' ) 2397 DO i = nxlg, nxrg 2398 DO j = nysg, nyng 2399 DO k = nzb, nzt+1 2400 rad_lw_out_av(k,j,i) = rad_lw_out_av(k,j,i) + rad_lw_out(k,j,i) 2401 ENDDO 2402 ENDDO 2403 ENDDO 2404 2405 CASE ( 'rad_lw_cs_hr' ) 2406 DO i = nxlg, nxrg 2407 DO j = nysg, nyng 2408 DO k = nzb, nzt+1 2409 rad_lw_cs_hr_av(k,j,i) = rad_lw_cs_hr_av(k,j,i) + rad_lw_cs_hr(k,j,i) 2410 ENDDO 2411 ENDDO 2412 ENDDO 2413 2414 CASE ( 'rad_lw_hr' ) 2415 DO i = nxlg, nxrg 2416 DO j = nysg, nyng 2417 DO k = nzb, nzt+1 2418 rad_lw_hr_av(k,j,i) = rad_lw_hr_av(k,j,i) + rad_lw_hr(k,j,i) 2419 ENDDO 2420 ENDDO 2421 ENDDO 2422 2423 CASE ( 'rad_sw_in' ) 2424 DO i = nxlg, nxrg 2425 DO j = nysg, nyng 2426 DO k = nzb, nzt+1 2427 rad_sw_in_av(k,j,i) = rad_sw_in_av(k,j,i) + rad_sw_in(k,j,i) 2428 ENDDO 2429 ENDDO 2430 ENDDO 2431 2432 CASE ( 'rad_sw_out' ) 2433 DO i = nxlg, nxrg 2434 DO j = nysg, nyng 2435 DO k = nzb, nzt+1 2436 rad_sw_out_av(k,j,i) = rad_sw_out_av(k,j,i) + rad_sw_out(k,j,i) 2437 ENDDO 2438 ENDDO 2439 ENDDO 2440 2441 CASE ( 'rad_sw_cs_hr' ) 2442 DO i = nxlg, nxrg 2443 DO j = nysg, nyng 2444 DO k = nzb, nzt+1 2445 rad_sw_cs_hr_av(k,j,i) = rad_sw_cs_hr_av(k,j,i) + rad_sw_cs_hr(k,j,i) 2446 ENDDO 2447 ENDDO 2448 ENDDO 2449 2450 CASE ( 'rad_sw_hr' ) 2451 DO i = nxlg, nxrg 2452 DO j = nysg, nyng 2453 DO k = nzb, nzt+1 2454 rad_sw_hr_av(k,j,i) = rad_sw_hr_av(k,j,i) + rad_sw_hr(k,j,i) 2455 ENDDO 2456 ENDDO 2457 ENDDO 2458 2459 CASE DEFAULT 2460 CONTINUE 2461 2462 END SELECT 2463 2464 ELSEIF ( mode == 'average' ) THEN 2465 2466 SELECT CASE ( TRIM( variable ) ) 2467 2468 CASE ( 'rad_net*' ) 2469 DO i = nxlg, nxrg 2470 DO j = nysg, nyng 2471 rad_net_av(j,i) = rad_net_av(j,i) / REAL( average_count_3d, KIND=wp ) 2472 ENDDO 2473 ENDDO 2474 2475 CASE ( 'rad_lw_in' ) 2476 DO i = nxlg, nxrg 2477 DO j = nysg, nyng 2478 DO k = nzb, nzt+1 2479 rad_lw_in_av(k,j,i) = rad_lw_in_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2480 ENDDO 2481 ENDDO 2482 ENDDO 2483 2484 CASE ( 'rad_lw_out' ) 2485 DO i = nxlg, nxrg 2486 DO j = nysg, nyng 2487 DO k = nzb, nzt+1 2488 rad_lw_out_av(k,j,i) = rad_lw_out_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2489 ENDDO 2490 ENDDO 2491 ENDDO 2492 2493 CASE ( 'rad_lw_cs_hr' ) 2494 DO i = nxlg, nxrg 2495 DO j = nysg, nyng 2496 DO k = nzb, nzt+1 2497 rad_lw_cs_hr_av(k,j,i) = rad_lw_cs_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2498 ENDDO 2499 ENDDO 2500 ENDDO 2501 2502 CASE ( 'rad_lw_hr' ) 2503 DO i = nxlg, nxrg 2504 DO j = nysg, nyng 2505 DO k = nzb, nzt+1 2506 rad_lw_hr_av(k,j,i) = rad_lw_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2507 ENDDO 2508 ENDDO 2509 ENDDO 2510 2511 CASE ( 'rad_sw_in' ) 2512 DO i = nxlg, nxrg 2513 DO j = nysg, nyng 2514 DO k = nzb, nzt+1 2515 rad_sw_in_av(k,j,i) = rad_sw_in_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2516 ENDDO 2517 ENDDO 2518 ENDDO 2519 2520 CASE ( 'rad_sw_out' ) 2521 DO i = nxlg, nxrg 2522 DO j = nysg, nyng 2523 DO k = nzb, nzt+1 2524 rad_sw_out_av(k,j,i) = rad_sw_out_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2525 ENDDO 2526 ENDDO 2527 ENDDO 2528 2529 CASE ( 'rad_sw_cs_hr' ) 2530 DO i = nxlg, nxrg 2531 DO j = nysg, nyng 2532 DO k = nzb, nzt+1 2533 rad_sw_cs_hr_av(k,j,i) = rad_sw_cs_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2534 ENDDO 2535 ENDDO 2536 ENDDO 2537 2538 CASE ( 'rad_sw_hr' ) 2539 DO i = nxlg, nxrg 2540 DO j = nysg, nyng 2541 DO k = nzb, nzt+1 2542 rad_sw_hr_av(k,j,i) = rad_sw_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp ) 2543 ENDDO 2544 ENDDO 2545 ENDDO 2546 2547 END SELECT 2548 2549 ENDIF 2550 2551 END SUBROUTINE radiation_3d_data_averaging 2552 2553 2554 !------------------------------------------------------------------------------! 2555 ! 2556 ! Description: 2557 ! ------------ 2558 !> Subroutine defining appropriate grid for netcdf variables. 2559 !> It is called out from subroutine netcdf. 2560 !------------------------------------------------------------------------------! 2561 SUBROUTINE radiation_define_netcdf_grid( var, found, grid_x, grid_y, grid_z ) 2562 2563 IMPLICIT NONE 2564 2565 CHARACTER (LEN=*), INTENT(IN) :: var !< 2566 LOGICAL, INTENT(OUT) :: found !< 2567 CHARACTER (LEN=*), INTENT(OUT) :: grid_x !< 2568 CHARACTER (LEN=*), INTENT(OUT) :: grid_y !< 2569 CHARACTER (LEN=*), INTENT(OUT) :: grid_z !< 2570 2571 found = .TRUE. 2572 2573 2574 ! 2575 !-- Check for the grid 2576 SELECT CASE ( TRIM( var ) ) 2577 2578 CASE ( 'rad_lw_cs_hr', 'rad_lw_hr', 'rad_sw_cs_hr', 'rad_sw_hr', & 2579 'rad_lw_cs_hr_xy', 'rad_lw_hr_xy', 'rad_sw_cs_hr_xy', & 2580 'rad_sw_hr_xy', 'rad_lw_cs_hr_xz', 'rad_lw_hr_xz', & 2581 'rad_sw_cs_hr_xz', 'rad_sw_hr_xz', 'rad_lw_cs_hr_yz', & 2582 'rad_lw_hr_yz', 'rad_sw_cs_hr_yz', 'rad_sw_hr_yz' ) 2583 grid_x = 'x' 2584 grid_y = 'y' 2585 grid_z = 'zu' 2586 2587 CASE ( 'rad_lw_in', 'rad_lw_out', 'rad_sw_in', 'rad_sw_out', & 2588 'rad_lw_in_xy', 'rad_lw_out_xy', 'rad_sw_in_xy','rad_sw_out_xy', & 2589 'rad_lw_in_xz', 'rad_lw_out_xz', 'rad_sw_in_xz','rad_sw_out_xz', & 2590 'rad_lw_in_yz', 'rad_lw_out_yz', 'rad_sw_in_yz','rad_sw_out_yz' ) 2591 grid_x = 'x' 2592 grid_y = 'y' 2593 grid_z = 'zw' 2594 2595 2596 CASE DEFAULT 2597 found = .FALSE. 2598 grid_x = 'none' 2599 grid_y = 'none' 2600 grid_z = 'none' 2601 2602 END SELECT 2603 2604 END SUBROUTINE radiation_define_netcdf_grid 2605 2606 !------------------------------------------------------------------------------! 2607 ! 2608 ! Description: 2609 ! ------------ 2610 !> Subroutine defining 3D output variables 2611 !------------------------------------------------------------------------------! 2612 SUBROUTINE radiation_data_output_2d( av, variable, found, grid, mode, & 2613 local_pf, two_d ) 2614 2615 USE indices 2616 2617 USE kinds 2618 2619 2620 IMPLICIT NONE 2621 2622 CHARACTER (LEN=*) :: grid !< 2623 CHARACTER (LEN=*) :: mode !< 2624 CHARACTER (LEN=*) :: variable !< 2625 2626 INTEGER(iwp) :: av !< 2627 INTEGER(iwp) :: i !< 2628 INTEGER(iwp) :: j !< 2629 INTEGER(iwp) :: k !< 2630 2631 LOGICAL :: found !< 2632 LOGICAL :: two_d !< flag parameter that indicates 2D variables (horizontal cross sections) 2633 2634 REAL(wp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) :: local_pf !< 2635 2636 found = .TRUE. 2637 2638 SELECT CASE ( TRIM( variable ) ) 2639 2640 CASE ( 'rad_net*_xy' ) ! 2d-array 2641 IF ( av == 0 ) THEN 2642 DO i = nxlg, nxrg 2643 DO j = nysg, nyng 2644 local_pf(i,j,nzb+1) = rad_net(j,i) 2645 ENDDO 2646 ENDDO 2647 ELSE 2648 DO i = nxlg, nxrg 2649 DO j = nysg, nyng 2650 local_pf(i,j,nzb+1) = rad_net_av(j,i) 2651 ENDDO 2652 ENDDO 2653 ENDIF 2654 two_d = .TRUE. 2655 grid = 'zu1' 2656 2657 2658 CASE ( 'rad_lw_in_xy', 'rad_lw_in_xz', 'rad_lw_in_yz' ) 2659 IF ( av == 0 ) THEN 2660 DO i = nxlg, nxrg 2661 DO j = nysg, nyng 2662 DO k = nzb, nzt+1 2663 local_pf(i,j,k) = rad_lw_in(k,j,i) 2664 ENDDO 2665 ENDDO 2666 ENDDO 2667 ELSE 2668 DO i = nxlg, nxrg 2669 DO j = nysg, nyng 2670 DO k = nzb, nzt+1 2671 local_pf(i,j,k) = rad_lw_in_av(k,j,i) 2672 ENDDO 2673 ENDDO 2674 ENDDO 2675 ENDIF 2676 IF ( mode == 'xy' ) grid = 'zu' 2677 2678 CASE ( 'rad_lw_out_xy', 'rad_lw_out_xz', 'rad_lw_out_yz' ) 2679 IF ( av == 0 ) THEN 2680 DO i = nxlg, nxrg 2681 DO j = nysg, nyng 2682 DO k = nzb, nzt+1 2683 local_pf(i,j,k) = rad_lw_out(k,j,i) 2684 ENDDO 2685 ENDDO 2686 ENDDO 2687 ELSE 2688 DO i = nxlg, nxrg 2689 DO j = nysg, nyng 2690 DO k = nzb, nzt+1 2691 local_pf(i,j,k) = rad_lw_out_av(k,j,i) 2692 ENDDO 2693 ENDDO 2694 ENDDO 2695 ENDIF 2696 IF ( mode == 'xy' ) grid = 'zu' 2697 2698 CASE ( 'rad_lw_cs_hr_xy', 'rad_lw_cs_hr_xz', 'rad_lw_cs_hr_yz' ) 2699 IF ( av == 0 ) THEN 2700 DO i = nxlg, nxrg 2701 DO j = nysg, nyng 2702 DO k = nzb, nzt+1 2703 local_pf(i,j,k) = rad_lw_cs_hr(k,j,i) 2704 ENDDO 2705 ENDDO 2706 ENDDO 2707 ELSE 2708 DO i = nxlg, nxrg 2709 DO j = nysg, nyng 2710 DO k = nzb, nzt+1 2711 local_pf(i,j,k) = rad_lw_cs_hr_av(k,j,i) 2712 ENDDO 2713 ENDDO 2714 ENDDO 2715 ENDIF 2716 IF ( mode == 'xy' ) grid = 'zw' 2717 2718 CASE ( 'rad_lw_hr_xy', 'rad_lw_hr_xz', 'rad_lw_hr_yz' ) 2719 IF ( av == 0 ) THEN 2720 DO i = nxlg, nxrg 2721 DO j = nysg, nyng 2722 DO k = nzb, nzt+1 2723 local_pf(i,j,k) = rad_lw_hr(k,j,i) 2724 ENDDO 2725 ENDDO 2726 ENDDO 2727 ELSE 2728 DO i = nxlg, nxrg 2729 DO j = nysg, nyng 2730 DO k = nzb, nzt+1 2731 local_pf(i,j,k) = rad_lw_hr_av(k,j,i) 2732 ENDDO 2733 ENDDO 2734 ENDDO 2735 ENDIF 2736 IF ( mode == 'xy' ) grid = 'zw' 2737 2738 CASE ( 'rad_sw_in_xy', 'rad_sw_in_xz', 'rad_sw_in_yz' ) 2739 IF ( av == 0 ) THEN 2740 DO i = nxlg, nxrg 2741 DO j = nysg, nyng 2742 DO k = nzb, nzt+1 2743 local_pf(i,j,k) = rad_sw_in(k,j,i) 2744 ENDDO 2745 ENDDO 2746 ENDDO 2747 ELSE 2748 DO i = nxlg, nxrg 2749 DO j = nysg, nyng 2750 DO k = nzb, nzt+1 2751 local_pf(i,j,k) = rad_sw_in_av(k,j,i) 2752 ENDDO 2753 ENDDO 2754 ENDDO 2755 ENDIF 2756 IF ( mode == 'xy' ) grid = 'zu' 2757 2758 CASE ( 'rad_sw_out_xy', 'rad_sw_out_xz', 'rad_sw_out_yz' ) 2759 IF ( av == 0 ) THEN 2760 DO i = nxlg, nxrg 2761 DO j = nysg, nyng 2762 DO k = nzb, nzt+1 2763 local_pf(i,j,k) = rad_sw_out(k,j,i) 2764 ENDDO 2765 ENDDO 2766 ENDDO 2767 ELSE 2768 DO i = nxlg, nxrg 2769 DO j = nysg, nyng 2770 DO k = nzb, nzt+1 2771 local_pf(i,j,k) = rad_sw_out_av(k,j,i) 2772 ENDDO 2773 ENDDO 2774 ENDDO 2775 ENDIF 2776 IF ( mode == 'xy' ) grid = 'zu' 2777 2778 CASE ( 'rad_sw_cs_hr_xy', 'rad_sw_cs_hr_xz', 'rad_sw_cs_hr_yz' ) 2779 IF ( av == 0 ) THEN 2780 DO i = nxlg, nxrg 2781 DO j = nysg, nyng 2782 DO k = nzb, nzt+1 2783 local_pf(i,j,k) = rad_sw_cs_hr(k,j,i) 2784 ENDDO 2785 ENDDO 2786 ENDDO 2787 ELSE 2788 DO i = nxlg, nxrg 2789 DO j = nysg, nyng 2790 DO k = nzb, nzt+1 2791 local_pf(i,j,k) = rad_sw_cs_hr_av(k,j,i) 2792 ENDDO 2793 ENDDO 2794 ENDDO 2795 ENDIF 2796 IF ( mode == 'xy' ) grid = 'zw' 2797 2798 CASE ( 'rad_sw_hr_xy', 'rad_sw_hr_xz', 'rad_sw_hr_yz' ) 2799 IF ( av == 0 ) THEN 2800 DO i = nxlg, nxrg 2801 DO j = nysg, nyng 2802 DO k = nzb, nzt+1 2803 local_pf(i,j,k) = rad_sw_hr(k,j,i) 2804 ENDDO 2805 ENDDO 2806 ENDDO 2807 ELSE 2808 DO i = nxlg, nxrg 2809 DO j = nysg, nyng 2810 DO k = nzb, nzt+1 2811 local_pf(i,j,k) = rad_sw_hr_av(k,j,i) 2812 ENDDO 2813 ENDDO 2814 ENDDO 2815 ENDIF 2816 IF ( mode == 'xy' ) grid = 'zw' 2817 2818 CASE DEFAULT 2819 found = .FALSE. 2820 grid = 'none' 2821 2822 END SELECT 2823 2824 END SUBROUTINE radiation_data_output_2d 2825 2826 2827 !------------------------------------------------------------------------------! 2828 ! 2829 ! Description: 2830 ! ------------ 2831 !> Subroutine defining 3D output variables 2832 !------------------------------------------------------------------------------! 2833 SUBROUTINE radiation_data_output_3d( av, variable, found, local_pf ) 2834 2835 2836 USE indices 2837 2838 USE kinds 2839 2840 2841 IMPLICIT NONE 2842 2843 CHARACTER (LEN=*) :: variable !< 2844 2845 INTEGER(iwp) :: av !< 2846 INTEGER(iwp) :: i !< 2847 INTEGER(iwp) :: j !< 2848 INTEGER(iwp) :: k !< 2849 2850 LOGICAL :: found !< 2851 2852 REAL(sp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) :: local_pf !< 2853 2854 2855 found = .TRUE. 2856 2857 2858 SELECT CASE ( TRIM( variable ) ) 2859 2860 CASE ( 'rad_sw_in' ) 2861 IF ( av == 0 ) THEN 2862 DO i = nxlg, nxrg 2863 DO j = nysg, nyng 2864 DO k = nzb, nzt+1 2865 local_pf(i,j,k) = rad_sw_in(k,j,i) 2866 ENDDO 2867 ENDDO 2868 ENDDO 2869 ELSE 2870 DO i = nxlg, nxrg 2871 DO j = nysg, nyng 2872 DO k = nzb, nzt+1 2873 local_pf(i,j,k) = rad_sw_in_av(k,j,i) 2874 ENDDO 2875 ENDDO 2876 ENDDO 2877 ENDIF 2878 2879 CASE ( 'rad_sw_out' ) 2880 IF ( av == 0 ) THEN 2881 DO i = nxlg, nxrg 2882 DO j = nysg, nyng 2883 DO k = nzb, nzt+1 2884 local_pf(i,j,k) = rad_sw_out(k,j,i) 2885 ENDDO 2886 ENDDO 2887 ENDDO 2888 ELSE 2889 DO i = nxlg, nxrg 2890 DO j = nysg, nyng 2891 DO k = nzb, nzt+1 2892 local_pf(i,j,k) = rad_sw_out_av(k,j,i) 2893 ENDDO 2894 ENDDO 2895 ENDDO 2896 ENDIF 2897 2898 CASE ( 'rad_sw_cs_hr' ) 2899 IF ( av == 0 ) THEN 2900 DO i = nxlg, nxrg 2901 DO j = nysg, nyng 2902 DO k = nzb, nzt+1 2903 local_pf(i,j,k) = rad_sw_cs_hr(k,j,i) 2904 ENDDO 2905 ENDDO 2906 ENDDO 2907 ELSE 2908 DO i = nxlg, nxrg 2909 DO j = nysg, nyng 2910 DO k = nzb, nzt+1 2911 local_pf(i,j,k) = rad_sw_cs_hr_av(k,j,i) 2912 ENDDO 2913 ENDDO 2914 ENDDO 2915 ENDIF 2916 2917 CASE ( 'rad_sw_hr' ) 2918 IF ( av == 0 ) THEN 2919 DO i = nxlg, nxrg 2920 DO j = nysg, nyng 2921 DO k = nzb, nzt+1 2922 local_pf(i,j,k) = rad_sw_hr(k,j,i) 2923 ENDDO 2924 ENDDO 2925 ENDDO 2926 ELSE 2927 DO i = nxlg, nxrg 2928 DO j = nysg, nyng 2929 DO k = nzb, nzt+1 2930 local_pf(i,j,k) = rad_sw_hr_av(k,j,i) 2931 ENDDO 2932 ENDDO 2933 ENDDO 2934 ENDIF 2935 2936 CASE ( 'rad_lw_in' ) 2937 IF ( av == 0 ) THEN 2938 DO i = nxlg, nxrg 2939 DO j = nysg, nyng 2940 DO k = nzb, nzt+1 2941 local_pf(i,j,k) = rad_lw_in(k,j,i) 2942 ENDDO 2943 ENDDO 2944 ENDDO 2945 ELSE 2946 DO i = nxlg, nxrg 2947 DO j = nysg, nyng 2948 DO k = nzb, nzt+1 2949 local_pf(i,j,k) = rad_lw_in_av(k,j,i) 2950 ENDDO 2951 ENDDO 2952 ENDDO 2953 ENDIF 2954 2955 CASE ( 'rad_lw_out' ) 2956 IF ( av == 0 ) THEN 2957 DO i = nxlg, nxrg 2958 DO j = nysg, nyng 2959 DO k = nzb, nzt+1 2960 local_pf(i,j,k) = rad_lw_out(k,j,i) 2961 ENDDO 2962 ENDDO 2963 ENDDO 2964 ELSE 2965 DO i = nxlg, nxrg 2966 DO j = nysg, nyng 2967 DO k = nzb, nzt+1 2968 local_pf(i,j,k) = rad_lw_out_av(k,j,i) 2969 ENDDO 2970 ENDDO 2971 ENDDO 2972 ENDIF 2973 2974 CASE ( 'rad_lw_cs_hr' ) 2975 IF ( av == 0 ) THEN 2976 DO i = nxlg, nxrg 2977 DO j = nysg, nyng 2978 DO k = nzb, nzt+1 2979 local_pf(i,j,k) = rad_lw_cs_hr(k,j,i) 2980 ENDDO 2981 ENDDO 2982 ENDDO 2983 ELSE 2984 DO i = nxlg, nxrg 2985 DO j = nysg, nyng 2986 DO k = nzb, nzt+1 2987 local_pf(i,j,k) = rad_lw_cs_hr_av(k,j,i) 2988 ENDDO 2989 ENDDO 2990 ENDDO 2991 ENDIF 2992 2993 CASE ( 'rad_lw_hr' ) 2994 IF ( av == 0 ) THEN 2995 DO i = nxlg, nxrg 2996 DO j = nysg, nyng 2997 DO k = nzb, nzt+1 2998 local_pf(i,j,k) = rad_lw_hr(k,j,i) 2999 ENDDO 3000 ENDDO 3001 ENDDO 3002 ELSE 3003 DO i = nxlg, nxrg 3004 DO j = nysg, nyng 3005 DO k = nzb, nzt+1 3006 local_pf(i,j,k) = rad_lw_hr_av(k,j,i) 3007 ENDDO 3008 ENDDO 3009 ENDDO 3010 ENDIF 3011 3012 CASE DEFAULT 3013 found = .FALSE. 3014 3015 END SELECT 3016 3017 3018 END SUBROUTINE radiation_data_output_3d 3019 3020 !------------------------------------------------------------------------------! 3021 ! 3022 ! Description: 3023 ! ------------ 3024 !> Subroutine defining masked data output 3025 !------------------------------------------------------------------------------! 3026 SUBROUTINE radiation_data_output_mask( av, variable, found, local_pf ) 3027 3028 USE control_parameters 3029 3030 USE indices 3031 3032 USE kinds 3033 3034 3035 IMPLICIT NONE 3036 3037 CHARACTER (LEN=*) :: variable !< 3038 3039 INTEGER(iwp) :: av !< 3040 INTEGER(iwp) :: i !< 3041 INTEGER(iwp) :: j !< 3042 INTEGER(iwp) :: k !< 3043 3044 LOGICAL :: found !< 3045 3046 REAL(wp), & 3047 DIMENSION(mask_size_l(mid,1),mask_size_l(mid,2),mask_size_l(mid,3)) :: & 3048 local_pf !< 3049 3050 3051 found = .TRUE. 3052 3053 SELECT CASE ( TRIM( variable ) ) 3054 3055 3056 CASE ( 'rad_lw_in' ) 3057 IF ( av == 0 ) THEN 3058 DO i = 1, mask_size_l(mid,1) 3059 DO j = 1, mask_size_l(mid,2) 3060 DO k = 1, mask_size_l(mid,3) 3061 local_pf(i,j,k) = rad_lw_in(mask_k(mid,k), & 3062 mask_j(mid,j),mask_i(mid,i)) 3063 ENDDO 3064 ENDDO 3065 ENDDO 3066 ELSE 3067 DO i = 1, mask_size_l(mid,1) 3068 DO j = 1, mask_size_l(mid,2) 3069 DO k = 1, mask_size_l(mid,3) 3070 local_pf(i,j,k) = rad_lw_in_av(mask_k(mid,k), & 3071 mask_j(mid,j),mask_i(mid,i)) 3072 ENDDO 3073 ENDDO 3074 ENDDO 3075 ENDIF 3076 3077 CASE ( 'rad_lw_out' ) 3078 IF ( av == 0 ) THEN 3079 DO i = 1, mask_size_l(mid,1) 3080 DO j = 1, mask_size_l(mid,2) 3081 DO k = 1, mask_size_l(mid,3) 3082 local_pf(i,j,k) = rad_lw_out(mask_k(mid,k), & 3083 mask_j(mid,j),mask_i(mid,i)) 3084 ENDDO 3085 ENDDO 3086 ENDDO 3087 ELSE 3088 DO i = 1, mask_size_l(mid,1) 3089 DO j = 1, mask_size_l(mid,2) 3090 DO k = 1, mask_size_l(mid,3) 3091 local_pf(i,j,k) = rad_lw_out_av(mask_k(mid,k), & 3092 mask_j(mid,j),mask_i(mid,i)) 3093 ENDDO 3094 ENDDO 3095 ENDDO 3096 ENDIF 3097 3098 CASE ( 'rad_lw_cs_hr' ) 3099 IF ( av == 0 ) THEN 3100 DO i = 1, mask_size_l(mid,1) 3101 DO j = 1, mask_size_l(mid,2) 3102 DO k = 1, mask_size_l(mid,3) 3103 local_pf(i,j,k) = rad_lw_cs_hr(mask_k(mid,k), & 3104 mask_j(mid,j),mask_i(mid,i)) 3105 ENDDO 3106 ENDDO 3107 ENDDO 3108 ELSE 3109 DO i = 1, mask_size_l(mid,1) 3110 DO j = 1, mask_size_l(mid,2) 3111 DO k = 1, mask_size_l(mid,3) 3112 local_pf(i,j,k) = rad_lw_cs_hr_av(mask_k(mid,k), & 3113 mask_j(mid,j),mask_i(mid,i)) 3114 ENDDO 3115 ENDDO 3116 ENDDO 3117 ENDIF 3118 3119 CASE ( 'rad_lw_hr' ) 3120 IF ( av == 0 ) THEN 3121 DO i = 1, mask_size_l(mid,1) 3122 DO j = 1, mask_size_l(mid,2) 3123 DO k = 1, mask_size_l(mid,3) 3124 local_pf(i,j,k) = rad_lw_hr(mask_k(mid,k), & 3125 mask_j(mid,j),mask_i(mid,i)) 3126 ENDDO 3127 ENDDO 3128 ENDDO 3129 ELSE 3130 DO i = 1, mask_size_l(mid,1) 3131 DO j = 1, mask_size_l(mid,2) 3132 DO k = 1, mask_size_l(mid,3) 3133 local_pf(i,j,k) = rad_lw_hr_av(mask_k(mid,k), & 3134 mask_j(mid,j),mask_i(mid,i)) 3135 ENDDO 3136 ENDDO 3137 ENDDO 3138 ENDIF 3139 3140 CASE ( 'rad_sw_in' ) 3141 IF ( av == 0 ) THEN 3142 DO i = 1, mask_size_l(mid,1) 3143 DO j = 1, mask_size_l(mid,2) 3144 DO k = 1, mask_size_l(mid,3) 3145 local_pf(i,j,k) = rad_sw_in(mask_k(mid,k), & 3146 mask_j(mid,j),mask_i(mid,i)) 3147 ENDDO 3148 ENDDO 3149 ENDDO 3150 ELSE 3151 DO i = 1, mask_size_l(mid,1) 3152 DO j = 1, mask_size_l(mid,2) 3153 DO k = 1, mask_size_l(mid,3) 3154 local_pf(i,j,k) = rad_sw_in_av(mask_k(mid,k), & 3155 mask_j(mid,j),mask_i(mid,i)) 3156 ENDDO 3157 ENDDO 3158 ENDDO 3159 ENDIF 3160 3161 CASE ( 'rad_sw_out' ) 3162 IF ( av == 0 ) THEN 3163 DO i = 1, mask_size_l(mid,1) 3164 DO j = 1, mask_size_l(mid,2) 3165 DO k = 1, mask_size_l(mid,3) 3166 local_pf(i,j,k) = rad_sw_out(mask_k(mid,k), & 3167 mask_j(mid,j),mask_i(mid,i)) 3168 ENDDO 3169 ENDDO 3170 ENDDO 3171 ELSE 3172 DO i = 1, mask_size_l(mid,1) 3173 DO j = 1, mask_size_l(mid,2) 3174 DO k = 1, mask_size_l(mid,3) 3175 local_pf(i,j,k) = rad_sw_out_av(mask_k(mid,k), & 3176 mask_j(mid,j),mask_i(mid,i)) 3177 ENDDO 3178 ENDDO 3179 ENDDO 3180 ENDIF 3181 3182 CASE ( 'rad_sw_cs_hr' ) 3183 IF ( av == 0 ) THEN 3184 DO i = 1, mask_size_l(mid,1) 3185 DO j = 1, mask_size_l(mid,2) 3186 DO k = 1, mask_size_l(mid,3) 3187 local_pf(i,j,k) = rad_sw_cs_hr(mask_k(mid,k), & 3188 mask_j(mid,j),mask_i(mid,i)) 3189 ENDDO 3190 ENDDO 3191 ENDDO 3192 ELSE 3193 DO i = 1, mask_size_l(mid,1) 3194 DO j = 1, mask_size_l(mid,2) 3195 DO k = 1, mask_size_l(mid,3) 3196 local_pf(i,j,k) = rad_sw_cs_hr_av(mask_k(mid,k), & 3197 mask_j(mid,j),mask_i(mid,i)) 3198 ENDDO 3199 ENDDO 3200 ENDDO 3201 ENDIF 3202 3203 CASE ( 'rad_sw_hr' ) 3204 IF ( av == 0 ) THEN 3205 DO i = 1, mask_size_l(mid,1) 3206 DO j = 1, mask_size_l(mid,2) 3207 DO k = 1, mask_size_l(mid,3) 3208 local_pf(i,j,k) = rad_sw_hr(mask_k(mid,k), & 3209 mask_j(mid,j),mask_i(mid,i)) 3210 ENDDO 3211 ENDDO 3212 ENDDO 3213 ELSE 3214 DO i = 1, mask_size_l(mid,1) 3215 DO j = 1, mask_size_l(mid,2) 3216 DO k = 1, mask_size_l(mid,3) 3217 local_pf(i,j,k) = rad_sw_hr_av(mask_k(mid,k), & 3218 mask_j(mid,j),mask_i(mid,i)) 3219 ENDDO 3220 ENDDO 3221 ENDDO 3222 ENDIF 3223 3224 CASE DEFAULT 3225 found = .FALSE. 3226 3227 END SELECT 3228 3229 3230 END SUBROUTINE radiation_data_output_mask 3231 3232 3233 !------------------------------------------------------------------------------! 3234 ! 3235 ! Description: 3236 ! ------------ 3237 !> Subroutine defines masked output variables 3238 !------------------------------------------------------------------------------! 3239 SUBROUTINE radiation_last_actions 3240 3241 3242 USE control_parameters 3243 3244 USE kinds 3245 3246 IMPLICIT NONE 3247 3248 IF ( write_binary(1:4) == 'true' ) THEN 3249 IF ( ALLOCATED( rad_net ) ) THEN 3250 WRITE ( 14 ) 'rad_net '; WRITE ( 14 ) rad_net 3251 ENDIF 3252 IF ( ALLOCATED( rad_net_av ) ) THEN 3253 WRITE ( 14 ) 'rad_net_av '; WRITE ( 14 ) rad_net_av 3254 ENDIF 3255 IF ( ALLOCATED( rad_lw_in ) ) THEN 3256 WRITE ( 14 ) 'rad_lw_in '; WRITE ( 14 ) rad_lw_in 3257 ENDIF 3258 IF ( ALLOCATED( rad_lw_in_av ) ) THEN 3259 WRITE ( 14 ) 'rad_lw_in_av '; WRITE ( 14 ) rad_lw_in_av 3260 ENDIF 3261 IF ( ALLOCATED( rad_lw_out ) ) THEN 3262 WRITE ( 14 ) 'rad_lw_out '; WRITE ( 14 ) rad_lw_out 3263 ENDIF 3264 IF ( ALLOCATED( rad_lw_out_av ) ) THEN 3265 WRITE ( 14 ) 'rad_lw_out_av '; WRITE ( 14 ) rad_lw_out_av 3266 ENDIF 3267 IF ( ALLOCATED( rad_lw_out_change_0 ) ) THEN 3268 WRITE ( 14 ) 'rad_lw_out_change_0 ' 3269 WRITE ( 14 ) rad_lw_out_change_0 3270 ENDIF 3271 IF ( ALLOCATED( rad_lw_cs_hr ) ) THEN 3272 WRITE ( 14 ) 'rad_lw_cs_hr '; WRITE ( 14 ) rad_lw_cs_hr 3273 ENDIF 3274 IF ( ALLOCATED( rad_lw_cs_hr_av ) ) THEN 3275 WRITE ( 14 ) 'rad_lw_cs_hr_av '; WRITE ( 14 ) rad_lw_cs_hr_av 3276 ENDIF 3277 IF ( ALLOCATED( rad_lw_hr ) ) THEN 3278 WRITE ( 14 ) 'rad_lw_hr '; WRITE ( 14 ) rad_lw_hr 3279 ENDIF 3280 IF ( ALLOCATED( rad_lw_hr_av ) ) THEN 3281 WRITE ( 14 ) 'rad_lw_hr_av '; WRITE ( 14 ) rad_lw_hr_av 3282 ENDIF 3283 IF ( ALLOCATED( rad_sw_in ) ) THEN 3284 WRITE ( 14 ) 'rad_sw_in '; WRITE ( 14 ) rad_sw_in 3285 ENDIF 3286 IF ( ALLOCATED( rad_sw_in_av ) ) THEN 3287 WRITE ( 14 ) 'rad_sw_in_av '; WRITE ( 14 ) rad_sw_in_av 3288 ENDIF 3289 IF ( ALLOCATED( rad_sw_out ) ) THEN 3290 WRITE ( 14 ) 'rad_sw_out '; WRITE ( 14 ) rad_sw_out 3291 ENDIF 3292 IF ( ALLOCATED( rad_sw_out_av ) ) THEN 3293 WRITE ( 14 ) 'rad_sw_out_av '; WRITE ( 14 ) rad_sw_out_av 3294 ENDIF 3295 IF ( ALLOCATED( rad_sw_cs_hr ) ) THEN 3296 WRITE ( 14 ) 'rad_sw_cs_hr '; WRITE ( 14 ) rad_sw_cs_hr 3297 ENDIF 3298 IF ( ALLOCATED( rad_sw_cs_hr_av ) ) THEN 3299 WRITE ( 14 ) 'rad_sw_cs_hr_av '; WRITE ( 14 ) rad_sw_cs_hr_av 3300 ENDIF 3301 IF ( ALLOCATED( rad_sw_hr ) ) THEN 3302 WRITE ( 14 ) 'rad_sw_hr '; WRITE ( 14 ) rad_sw_hr 3303 ENDIF 3304 IF ( ALLOCATED( rad_sw_hr_av ) ) THEN 3305 WRITE ( 14 ) 'rad_sw_hr_av '; WRITE ( 14 ) rad_sw_hr_av 3306 ENDIF 3307 3308 WRITE ( 14 ) '*** end rad *** ' 3309 3310 ENDIF 3311 3312 END SUBROUTINE radiation_last_actions 3313 3314 3315 SUBROUTINE radiation_read_restart_data( i, nxlfa, nxl_on_file, nxrfa, nxr_on_file, & 3316 nynfa, nyn_on_file, nysfa, nys_on_file, & 3317 offset_xa, offset_ya, overlap_count, & 3318 tmp_2d, tmp_3d ) 3319 3320 3321 USE control_parameters 3322 3323 USE indices 3324 3325 USE kinds 3326 3327 USE pegrid 3328 3329 IMPLICIT NONE 3330 3331 CHARACTER (LEN=20) :: field_char !< 3332 3333 INTEGER(iwp) :: i !< 3334 INTEGER(iwp) :: k !< 3335 INTEGER(iwp) :: nxlc !< 3336 INTEGER(iwp) :: nxlf !< 3337 INTEGER(iwp) :: nxl_on_file !< 3338 INTEGER(iwp) :: nxrc !< 3339 INTEGER(iwp) :: nxrf !< 3340 INTEGER(iwp) :: nxr_on_file !< 3341 INTEGER(iwp) :: nync !< 3342 INTEGER(iwp) :: nynf !< 3343 INTEGER(iwp) :: nyn_on_file !< 3344 INTEGER(iwp) :: nysc !< 3345 INTEGER(iwp) :: nysf !< 3346 INTEGER(iwp) :: nys_on_file !< 3347 INTEGER(iwp) :: overlap_count !< 3348 3349 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: nxlfa !< 3350 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: nxrfa !< 3351 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: nynfa !< 3352 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: nysfa !< 3353 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: offset_xa !< 3354 INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) :: offset_ya !< 3355 3356 REAL(wp), & 3357 DIMENSION(nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::& 3358 tmp_2d !< 3359 3360 REAL(wp), & 3361 DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::& 3362 tmp_3d !< 3363 3364 3365 3366 IF ( initializing_actions == 'read_restart_data' ) THEN 3367 READ ( 13 ) field_char 3368 3369 DO WHILE ( TRIM( field_char ) /= '*** end rad ***' ) 3370 3371 DO k = 1, overlap_count 3372 3373 nxlf = nxlfa(i,k) 3374 nxlc = nxlfa(i,k) + offset_xa(i,k) 3375 nxrf = nxrfa(i,k) 3376 nxrc = nxrfa(i,k) + offset_xa(i,k) 3377 nysf = nysfa(i,k) 3378 nysc = nysfa(i,k) + offset_ya(i,k) 3379 nynf = nynfa(i,k) 3380 nync = nynfa(i,k) + offset_ya(i,k) 3381 3382 3383 SELECT CASE ( TRIM( field_char ) ) 3384 3385 CASE ( 'rad_net' ) 3386 IF ( .NOT. ALLOCATED( rad_net ) ) THEN 3387 ALLOCATE( rad_net(nysg:nyng,nxlg:nxrg) ) 3388 ENDIF 3389 IF ( k == 1 ) READ ( 13 ) tmp_2d 3390 rad_net(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3391 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3392 3393 CASE ( 'rad_net_av' ) 3394 IF ( .NOT. ALLOCATED( rad_net_av ) ) THEN 3395 ALLOCATE( rad_net_av(nysg:nyng,nxlg:nxrg) ) 3396 ENDIF 3397 IF ( k == 1 ) READ ( 13 ) tmp_2d 3398 rad_net_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3399 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3400 CASE ( 'rad_lw_in' ) 3401 IF ( .NOT. ALLOCATED( rad_lw_in ) ) THEN 3402 ALLOCATE( rad_lw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3403 ENDIF 3404 IF ( k == 1 ) READ ( 13 ) tmp_3d 3405 rad_lw_in(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3406 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3407 3408 CASE ( 'rad_lw_in_av' ) 3409 IF ( .NOT. ALLOCATED( rad_lw_in_av ) ) THEN 3410 ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3411 ENDIF 3412 IF ( k == 1 ) READ ( 13 ) tmp_3d 3413 rad_lw_in_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3414 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3415 3416 CASE ( 'rad_lw_out' ) 3417 IF ( .NOT. ALLOCATED( rad_lw_out ) ) THEN 3418 ALLOCATE( rad_lw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3419 ENDIF 3420 IF ( k == 1 ) READ ( 13 ) tmp_3d 3421 rad_lw_out(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3422 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3423 3424 CASE ( 'rad_lw_out_av' ) 3425 IF ( .NOT. ALLOCATED( rad_lw_out_av ) ) THEN 3426 ALLOCATE( rad_lw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3427 ENDIF 3428 IF ( k == 1 ) READ ( 13 ) tmp_3d 3429 rad_lw_out_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3430 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3431 3432 CASE ( 'rad_lw_out_change_0' ) 3433 IF ( .NOT. ALLOCATED( rad_lw_out_change_0 ) ) THEN 3434 ALLOCATE( rad_lw_out_change_0(nysg:nyng,nxlg:nxrg) ) 3435 ENDIF 3436 IF ( k == 1 ) READ ( 13 ) tmp_2d 3437 rad_lw_out_change_0(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)& 3438 = tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3439 3440 CASE ( 'rad_lw_cs_hr' ) 3441 IF ( .NOT. ALLOCATED( rad_lw_cs_hr ) ) THEN 3442 ALLOCATE( rad_lw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3443 ENDIF 3444 IF ( k == 1 ) READ ( 13 ) tmp_3d 3445 rad_lw_cs_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3446 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3447 3448 CASE ( 'rad_lw_cs_hr_av' ) 3449 IF ( .NOT. ALLOCATED( rad_lw_cs_hr_av ) ) THEN 3450 ALLOCATE( rad_lw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3451 ENDIF 3452 IF ( k == 1 ) READ ( 13 ) tmp_3d 3453 rad_lw_cs_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3454 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3455 3456 CASE ( 'rad_lw_hr' ) 3457 IF ( .NOT. ALLOCATED( rad_lw_hr ) ) THEN 3458 ALLOCATE( rad_lw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3459 ENDIF 3460 IF ( k == 1 ) READ ( 13 ) tmp_3d 3461 rad_lw_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3462 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3463 3464 CASE ( 'rad_lw_hr_av' ) 3465 IF ( .NOT. ALLOCATED( rad_lw_hr_av ) ) THEN 3466 ALLOCATE( rad_lw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3467 ENDIF 3468 IF ( k == 1 ) READ ( 13 ) tmp_3d 3469 rad_lw_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3470 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3471 3472 CASE ( 'rad_sw_in' ) 3473 IF ( .NOT. ALLOCATED( rad_sw_in ) ) THEN 3474 ALLOCATE( rad_sw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3475 ENDIF 3476 IF ( k == 1 ) READ ( 13 ) tmp_3d 3477 rad_sw_in(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3478 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3479 3480 CASE ( 'rad_sw_in_av' ) 3481 IF ( .NOT. ALLOCATED( rad_sw_in_av ) ) THEN 3482 ALLOCATE( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3483 ENDIF 3484 IF ( k == 1 ) READ ( 13 ) tmp_3d 3485 rad_sw_in_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3486 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3487 3488 CASE ( 'rad_sw_out' ) 3489 IF ( .NOT. ALLOCATED( rad_sw_out ) ) THEN 3490 ALLOCATE( rad_sw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3491 ENDIF 3492 IF ( k == 1 ) READ ( 13 ) tmp_3d 3493 rad_sw_out(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3494 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3495 3496 CASE ( 'rad_sw_out_av' ) 3497 IF ( .NOT. ALLOCATED( rad_sw_out_av ) ) THEN 3498 ALLOCATE( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3499 ENDIF 3500 IF ( k == 1 ) READ ( 13 ) tmp_3d 3501 rad_sw_out_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3502 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3503 3504 CASE ( 'rad_sw_cs_hr' ) 3505 IF ( .NOT. ALLOCATED( rad_sw_cs_hr ) ) THEN 3506 ALLOCATE( rad_sw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3507 ENDIF 3508 IF ( k == 1 ) READ ( 13 ) tmp_3d 3509 rad_sw_cs_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3510 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3511 3512 CASE ( 'rad_sw_cs_hr_av' ) 3513 IF ( .NOT. ALLOCATED( rad_sw_cs_hr_av ) ) THEN 3514 ALLOCATE( rad_sw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3515 ENDIF 3516 IF ( k == 1 ) READ ( 13 ) tmp_3d 3517 rad_sw_cs_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3518 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3519 3520 CASE ( 'rad_sw_hr' ) 3521 IF ( .NOT. ALLOCATED( rad_sw_hr ) ) THEN 3522 ALLOCATE( rad_sw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3523 ENDIF 3524 IF ( k == 1 ) READ ( 13 ) tmp_3d 3525 rad_sw_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3526 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3527 3528 CASE ( 'rad_sw_hr_av' ) 3529 IF ( .NOT. ALLOCATED( rad_sw_hr_av ) ) THEN 3530 ALLOCATE( rad_sw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 3531 ENDIF 3532 IF ( k == 1 ) READ ( 13 ) tmp_3d 3533 rad_lw_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3534 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3535 3536 CASE DEFAULT 3537 WRITE( message_string, * ) 'unknown variable named "', & 3538 TRIM( field_char ), '" found in', & 3539 '&data from prior run on PE ', myid 3540 CALL message( 'radiation_read_restart_data', 'PA0441', 1, 2, 0, 6, & 3541 0 ) 3542 3543 END SELECT 3544 3545 ENDDO 3546 3547 READ ( 13 ) field_char 3548 3549 ENDDO 3550 ENDIF 3551 3552 END SUBROUTINE radiation_read_restart_data 3553 2208 3554 2209 3555 END MODULE radiation_model_mod
Note: See TracChangeset
for help on using the changeset viewer.