Changeset 2232
- Timestamp:
- May 30, 2017 5:47:52 PM (8 years ago)
- Location:
- palm/trunk/SOURCE
- Files:
-
- 1 added
- 1 deleted
- 73 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/Makefile
r2176 r2232 20 20 # Current revisions: 21 21 # ------------------ 22 # 22 # +dependencies for surface_mod 23 # -wall_fluxes 23 24 # 24 25 # Former revisions: … … 351 352 read_3d_binary.f90 read_var_list.f90 run_control.f90 \ 352 353 set_slicer_attributes_dvrp.f90 singleton_mod.f90 sor.f90 spectra_mod.f90 \ 353 subsidence_mod.f90 sum_up_3d_data.f90 \354 subsidence_mod.f90 sum_up_3d_data.f90 surface_mod.f90 \ 354 355 surface_coupler.f90 surface_layer_fluxes_mod.f90 swap_timelevel.f90 temperton_fft_mod.f90 \ 355 356 time_integration.f90 time_to_string.f90 timestep.f90 \ … … 369 370 user_lpm_init.f90 user_lpm_set_attributes.f90 user_module.f90 \ 370 371 user_parin.f90 user_read_restart_data.f90 \ 371 user_spectra.f90 user_statistics.f90 virtual_flight_mod.f90 wall_fluxes.f90\372 user_spectra.f90 user_statistics.f90 virtual_flight_mod.f90 \ 372 373 wind_turbine_model_mod.f90 write_3d_binary.f90 write_var_list.f90 373 374 … … 413 414 advec_w_pw.o: modules.o mod_kinds.o 414 415 advec_w_up.o: modules.o mod_kinds.o 415 average_3d_data.o: modules.o cpulog_mod.o mod_kinds.o land_surface_model_mod.o \416 average_3d_data.o: modules.o cpulog_mod.o mod_kinds.o exchange_horiz_2d.o land_surface_model_mod.o \ 416 417 radiation_model_mod.o urban_surface_mod.o 417 boundary_conds.o: modules.o mod_kinds.o pmc_interface_mod.o 418 boundary_conds.o: modules.o mod_kinds.o pmc_interface_mod.o surface_mod.o 418 419 buoyancy.o: modules.o mod_kinds.o 419 420 calc_mean_profile.o: modules.o mod_kinds.o … … 445 446 data_output_2d.o: modules.o cpulog_mod.o mod_kinds.o mod_particle_attributes.o \ 446 447 netcdf_interface_mod.o land_surface_model_mod.o radiation_model_mod.o \ 447 urban_surface_mod.o448 surface_mod.o urban_surface_mod.o 448 449 data_output_3d.o: modules.o cpulog_mod.o mod_kinds.o mod_particle_attributes.o \ 449 450 netcdf_interface_mod.o land_surface_model_mod.o urban_surface_mod.o 450 451 diffusion_e.o: modules.o mod_kinds.o microphysics_mod.o \ 451 mod_particle_attributes.o 452 diffusion_s.o: modules.o mod_kinds.o 453 diffusion_u.o: modules.o mod_kinds.o wall_fluxes.o454 diffusion_v.o: modules.o mod_kinds.o wall_fluxes.o455 diffusion_w.o: modules.o mod_kinds.o wall_fluxes.o456 diffusivities.o: modules.o mod_kinds.o 452 mod_particle_attributes.o surface_mod.o 453 diffusion_s.o: modules.o mod_kinds.o surface_mod.o 454 diffusion_u.o: modules.o mod_kinds.o surface_mod.o 455 diffusion_v.o: modules.o mod_kinds.o surface_mod.o 456 diffusion_w.o: modules.o mod_kinds.o surface_mod.o 457 diffusivities.o: modules.o mod_kinds.o surface_mod.o 457 458 disturb_field.o: modules.o cpulog_mod.o mod_kinds.o random_function_mod.o \ 458 459 random_generator_parallel_mod.o 459 disturb_heatflux.o: modules.o cpulog_mod.o mod_kinds.o 460 eqn_state_seawater.o: modules.o mod_kinds.o 460 disturb_heatflux.o: modules.o cpulog_mod.o mod_kinds.o random_generator_parallel_mod.o surface_mod.o 461 eqn_state_seawater.o: modules.o mod_kinds.o surface_mod.o 461 462 exchange_horiz.o: modules.o cpulog_mod.o mod_kinds.o 462 463 exchange_horiz_2d.o: modules.o cpulog_mod.o mod_kinds.o pmc_interface_mod.o 463 464 fft_xy_mod.o: modules.o mod_kinds.o singleton_mod.o temperton_fft_mod.o 464 465 flow_statistics.o: modules.o cpulog_mod.o mod_kinds.o land_surface_model_mod.o \ 465 netcdf_interface_mod.o radiation_model_mod.o 466 netcdf_interface_mod.o radiation_model_mod.o surface_mod.o 466 467 global_min_max.o: modules.o mod_kinds.o 467 468 header.o: modules.o cpulog_mod.o mod_kinds.o netcdf_interface_mod.o land_surface_model_mod.o\ … … 470 471 inflow_turbulence.o: modules.o cpulog_mod.o mod_kinds.o 471 472 init_1d_model.o: modules.o mod_kinds.o 472 init_3d_model.o: modules.o mod_kinds.o advec_ws.o cpulog_mod.o land_surface_model_mod.o \473 init_3d_model.o: modules.o mod_kinds.o advec_ws.o cpulog_mod.o disturb_heatflux.o land_surface_model_mod.o \ 473 474 lpm_init.o ls_forcing_mod.o netcdf_interface_mod.o plant_canopy_model_mod.o \ 474 475 radiation_model_mod.o random_function_mod.o random_generator_parallel_mod.o \ 475 surface_layer_fluxes_mod.o microphysics_mod.o mod_particle_attributes.o \476 urban_surface_mod.o virtual_flight_mod.o wind_turbine_model_mod.o476 microphysics_mod.o mod_particle_attributes.o surface_layer_fluxes_mod.o \ 477 urban_surface_mod.o virtual_flight_mod.o surface_mod.o wind_turbine_model_mod.o 477 478 init_advec.o: modules.o mod_kinds.o 478 479 init_cloud_physics.o: modules.o mod_kinds.o 479 480 init_coupling.o: modules.o mod_kinds.o 480 481 init_dvrp.o: modules.o mod_kinds.o 481 init_grid.o: modules.o mod_kinds.o advec_ws.o 482 init_grid.o: modules.o mod_kinds.o advec_ws.o netcdf_interface_mod.o surface_mod.o 482 483 init_masks.o: modules.o mod_kinds.o netcdf_interface_mod.o 483 484 init_ocean.o: modules.o eqn_state_seawater.o mod_kinds.o … … 487 488 init_slope.o: modules.o mod_kinds.o 488 489 interaction_droplets_ptq.o: modules.o mod_kinds.o 489 land_surface_model_mod.o: modules.o mod_kinds.o radiation_model_mod.o 490 land_surface_model_mod.o: modules.o mod_kinds.o radiation_model_mod.o surface_mod.o 490 491 local_stop.o: modules.o mod_kinds.o pmc_interface_mod.o 491 492 local_tremain.o: modules.o cpulog_mod.o mod_kinds.o … … 519 520 ls_forcing_mod.o: modules.o cpulog_mod.o mod_kinds.o 520 521 message.o: modules.o mod_kinds.o pmc_interface_mod.o 521 microphysics_mod.o: modules.o cpulog_mod.o mod_kinds.o 522 microphysics_mod.o: modules.o cpulog_mod.o mod_kinds.o surface_mod.o 522 523 modules.o: modules.f90 mod_kinds.o 523 524 mod_kinds.o: mod_kinds.f90 … … 546 547 poismg_noopt.o: modules.o cpulog_mod.o mod_kinds.o 547 548 posix_calls_from_fortran.o: posix_calls_from_fortran.f90 548 pres.o: modules.o cpulog_mod.o mod_kinds.o poisfft_mod.o poismg_mod.o pmc_interface_mod.o 549 pres.o: modules.o cpulog_mod.o mod_kinds.o poisfft_mod.o poismg_mod.o pmc_interface_mod.o \ 550 surface_mod.o 549 551 print_1d.o: modules.o cpulog_mod.o mod_kinds.o 550 production_e.o: modules.o mod_kinds.o wall_fluxes.o552 production_e.o: modules.o mod_kinds.o surface_mod.o 551 553 prognostic_equations.o: modules.o advec_s_pw.o advec_s_up.o advec_s_bc.o advec_u_pw.o \ 552 554 advec_u_up.o advec_v_pw.o advec_v_up.o advec_w_pw.o advec_w_up.o \ … … 555 557 eqn_state_seawater.o mod_kinds.o microphysics_mod.o \ 556 558 nudging_mod.o plant_canopy_model_mod.o production_e.o radiation_model_mod.o \ 557 subsidence_mod.o urban_surface_mod.o user_actions.o wind_turbine_model_mod.o559 subsidence_mod.o surface_mod.o user_actions.o wind_turbine_model_mod.o 558 560 progress_bar_mod.o: modules.o mod_kinds.o 559 561 radiation_model_mod.o : modules.o mod_particle_attributes.o microphysics_mod.o … … 563 565 read_3d_binary.o: modules.o cpulog_mod.o mod_kinds.o \ 564 566 land_surface_model_mod.o radiation_model_mod.o random_function_mod.o random_generator_parallel_mod.o \ 565 spectra_mod.o 567 spectra_mod.o surface_mod.o 566 568 read_var_list.o: modules.o mod_kinds.o netcdf_interface_mod.o plant_canopy_model_mod.o \ 567 569 spectra_mod.o microphysics_mod.o urban_surface_mod.o virtual_flight_mod.o … … 573 575 subsidence_mod.o: modules.o mod_kinds.o 574 576 sum_up_3d_data.o: modules.o cpulog_mod.o mod_kinds.o land_surface_model_mod.o \ 575 radiation_model_mod.o urban_surface_mod.o577 radiation_model_mod.o surface_mod.o urban_surface_mod.o 576 578 surface_coupler.o: modules.o cpulog_mod.o mod_kinds.o 577 surface_layer_fluxes_mod.o: modules.o mod_kinds.o land_surface_model_mod.o \ 578 urban_surface_mod.o 579 surface_layer_fluxes_mod.o: modules.o mod_kinds.o exchange_horiz_2d.o land_surface_model_mod.o \ 580 urban_surface_mod.o surface_mod.o 581 surface_mod.o: modules.o mod_kinds.o init_pegrid.o 579 582 swap_timelevel.o: modules.o cpulog_mod.o mod_kinds.o land_surface_model_mod.o \ 580 583 pmc_interface_mod.o urban_surface_mod.o 581 584 temperton_fft_mod.o: modules.o mod_kinds.o 582 585 time_integration.o: modules.o advec_ws.o buoyancy.o calc_mean_profile.o \ 583 cpulog_mod.o data_output_flight.o interaction_droplets_ptq.o land_surface_model_mod.o \586 cpulog_mod.o data_output_flight.o disturb_heatflux.o interaction_droplets_ptq.o land_surface_model_mod.o \ 584 587 ls_forcing_mod.o mod_kinds.o nudging_mod.o pmc_interface_mod.o production_e.o \ 585 588 prognostic_equations.o progress_bar_mod.o radiation_model_mod.o \ 586 spectra_mod.o user_actions.o surface_layer_fluxes_mod.o microphysics_mod.o \589 spectra_mod.o user_actions.o microphysics_mod.o surface_layer_fluxes_mod.o surface_mod.o \ 587 590 urban_surface_mod.o virtual_flight_mod.o wind_turbine_model_mod.o 588 591 time_to_string.o: mod_kinds.o … … 600 603 netcdf_interface_mod.o 601 604 user_check_parameters.o: modules.o mod_kinds.o user_module.o 602 user_data_output_2d.o: modules.o mod_kinds.o user_module.o605 user_data_output_2d.o: modules.o mod_kinds.o surface_mod.o user_module.o 603 606 user_data_output_3d.o: modules.o mod_kinds.o user_module.o 604 607 user_data_output_mask.o: modules.o mod_kinds.o user_module.o … … 609 612 user_header.o: modules.o mod_kinds.o user_module.o 610 613 user_init.o: modules.o mod_kinds.o netcdf_interface_mod.o user_module.o 611 user_init_3d_model.o: modules.o mod_kinds.o user_module.o614 user_init_3d_model.o: modules.o mod_kinds.o surface_mod.o user_module.o 612 615 user_init_flight.o: modules.o mod_kinds.o netcdf_interface_mod.o user_module.o 613 616 user_init_grid.o: modules.o mod_kinds.o user_module.o 614 user_init_land_surface.o: modules.o mod_kinds.o user_module.o land_surface_model_mod.o netcdf_interface_mod.o617 user_init_land_surface.o: modules.o mod_kinds.o surface_mod.o user_module.o land_surface_model_mod.o netcdf_interface_mod.o 615 618 user_init_plant_canopy.o: modules.o mod_kinds.o user_module.o plant_canopy_model_mod.o 616 619 user_init_radiation.o: modules.o mod_kinds.o user_module.o radiation_model_mod.o 617 user_init_urban_surface.o: modules.o mod_kinds.o user_module.o urban_surface_mod.o620 user_init_urban_surface.o: modules.o mod_kinds.o surface_mod.o user_module.o urban_surface_mod.o 618 621 user_last_actions.o: modules.o mod_kinds.o user_module.o 619 622 user_lpm_advec.o: modules.o mod_kinds.o user_module.o … … 626 629 user_statistics.o: modules.o mod_kinds.o netcdf_interface_mod.o user_module.o 627 630 virtual_flight_mod.o: modules.o cpulog_mod.o mod_kinds.o netcdf_interface_mod.o user_init_flight.o user_flight.o 628 wall_fluxes.o: modules.o mod_kinds.o629 631 wind_turbine_model_mod.o: modules.o cpulog_mod.o mod_kinds.o 630 632 write_3d_binary.o: modules.o cpulog_mod.o mod_kinds.o \ 631 633 radiation_model_mod.o random_function_mod.o random_generator_parallel_mod.o \ 632 spectra_mod.o 634 spectra_mod.o surface_mod.o 633 635 write_var_list.o: modules.o mod_kinds.o netcdf_interface_mod.o plant_canopy_model_mod.o\ 634 636 spectra_mod.o microphysics_mod.o urban_surface_mod.o virtual_flight_mod.o -
palm/trunk/SOURCE/advec_s_pw.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 104 104 105 105 USE indices, & 106 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_s_inner,&107 nzt 106 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, & 107 nzt, wall_flags_0 108 108 109 109 USE kinds … … 125 125 DO i = nxl, nxr 126 126 DO j = nys, nyn 127 DO k = nzb _s_inner(j,i)+1, nzt128 tend(k,j,i) = tend(k,j,i) &129 127 DO k = nzb+1, nzt 128 tend(k,j,i) = tend(k,j,i) + & 129 ( -0.5_wp * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) & 130 130 - ( u(k,j,i) - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) & 131 131 ) * ddx & … … 135 135 - ( w(k,j,i) * ( sk(k+1,j,i) - sk(k,j,i) ) & 136 136 - w(k-1,j,i) * ( sk(k-1,j,i) - sk(k,j,i) ) & 137 ) * dd2zu(k) 137 ) * dd2zu(k) & 138 ) * MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 138 139 ENDDO 139 140 ENDDO … … 160 161 161 162 USE indices, & 162 ONLY: nxlg, nxrg, nyng, nysg, nzb, nz b_s_inner, nzt163 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzt, wall_flags_0 163 164 164 165 USE kinds … … 178 179 179 180 180 DO k = nzb _s_inner(j,i)+1, nzt181 tend(k,j,i) = tend(k,j,i) &182 181 DO k = nzb+1, nzt 182 tend(k,j,i) = tend(k,j,i) + & 183 ( -0.5_wp * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) & 183 184 - ( u(k,j,i) - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) & 184 185 ) * ddx & … … 188 189 - ( w(k,j,i) * ( sk(k+1,j,i) - sk(k,j,i) ) & 189 190 - w(k-1,j,i) * ( sk(k-1,j,i) - sk(k,j,i) ) & 190 ) * dd2zu(k) 191 ) * dd2zu(k) & 192 ) * MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 191 193 ENDDO 192 194 -
palm/trunk/SOURCE/advec_s_up.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 104 104 105 105 USE indices, & 106 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nz b_s_inner,&107 nzt106 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt, & 107 wall_flags_0 108 108 109 109 USE kinds … … 128 128 DO i = nxl, nxr 129 129 DO j = nys, nyn 130 DO k = nzb _s_inner(j,i)+1, nzt130 DO k = nzb+1, nzt 131 131 ! 132 132 !-- x-direction … … 134 134 IF ( ukomp > 0.0_wp ) THEN 135 135 tend(k,j,i) = tend(k,j,i) - ukomp * & 136 ( sk(k,j,i) - sk(k,j,i-1) ) * ddx 136 ( sk(k,j,i) - sk(k,j,i-1) ) * ddx & 137 * MERGE( 1.0_wp, 0.0_wp, & 138 BTEST( wall_flags_0(k,j,i), 0 ) ) 137 139 ELSE 138 140 tend(k,j,i) = tend(k,j,i) - ukomp * & 139 ( sk(k,j,i+1) - sk(k,j,i) ) * ddx 141 ( sk(k,j,i+1) - sk(k,j,i) ) * ddx & 142 * MERGE( 1.0_wp, 0.0_wp, & 143 BTEST( wall_flags_0(k,j,i), 0 ) ) 140 144 ENDIF 141 145 ! … … 144 148 IF ( vkomp > 0.0_wp ) THEN 145 149 tend(k,j,i) = tend(k,j,i) - vkomp * & 146 ( sk(k,j,i) - sk(k,j-1,i) ) * ddy 150 ( sk(k,j,i) - sk(k,j-1,i) ) * ddy & 151 * MERGE( 1.0_wp, 0.0_wp, & 152 BTEST( wall_flags_0(k,j,i), 0 ) ) 147 153 ELSE 148 154 tend(k,j,i) = tend(k,j,i) - vkomp * & 149 ( sk(k,j+1,i) - sk(k,j,i) ) * ddy 155 ( sk(k,j+1,i) - sk(k,j,i) ) * ddy & 156 * MERGE( 1.0_wp, 0.0_wp, & 157 BTEST( wall_flags_0(k,j,i), 0 ) ) 150 158 ENDIF 151 159 ! … … 154 162 IF ( wkomp > 0.0_wp ) THEN 155 163 tend(k,j,i) = tend(k,j,i) - wkomp * & 156 ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k) 164 ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k) & 165 * MERGE( 1.0_wp, 0.0_wp, & 166 BTEST( wall_flags_0(k,j,i), 0 ) ) 157 167 ELSE 158 168 tend(k,j,i) = tend(k,j,i) - wkomp * & 159 ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1) 169 ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1) & 170 * MERGE( 1.0_wp, 0.0_wp, & 171 BTEST( wall_flags_0(k,j,i), 0 ) ) 160 172 ENDIF 161 173 … … 184 196 185 197 USE indices, & 186 ONLY: nxlg, nxrg, nyng, nysg, nzb, nz b_s_inner, nzt198 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzt, wall_flags_0 187 199 188 200 USE kinds … … 206 218 207 219 208 DO k = nzb _s_inner(j,i)+1, nzt220 DO k = nzb+1, nzt 209 221 ! 210 222 !-- x-direction … … 212 224 IF ( ukomp > 0.0_wp ) THEN 213 225 tend(k,j,i) = tend(k,j,i) - ukomp * & 214 ( sk(k,j,i) - sk(k,j,i-1) ) * ddx 226 ( sk(k,j,i) - sk(k,j,i-1) ) * ddx & 227 * MERGE( 1.0_wp, 0.0_wp, & 228 BTEST( wall_flags_0(k,j,i), 0 ) ) 215 229 ELSE 216 230 tend(k,j,i) = tend(k,j,i) - ukomp * & 217 ( sk(k,j,i+1) - sk(k,j,i) ) * ddx 231 ( sk(k,j,i+1) - sk(k,j,i) ) * ddx & 232 * MERGE( 1.0_wp, 0.0_wp, & 233 BTEST( wall_flags_0(k,j,i), 0 ) ) 218 234 ENDIF 219 235 ! … … 222 238 IF ( vkomp > 0.0_wp ) THEN 223 239 tend(k,j,i) = tend(k,j,i) - vkomp * & 224 ( sk(k,j,i) - sk(k,j-1,i) ) * ddy 240 ( sk(k,j,i) - sk(k,j-1,i) ) * ddy & 241 * MERGE( 1.0_wp, 0.0_wp, & 242 BTEST( wall_flags_0(k,j,i), 0 ) ) 225 243 ELSE 226 244 tend(k,j,i) = tend(k,j,i) - vkomp * & 227 ( sk(k,j+1,i) - sk(k,j,i) ) * ddy 245 ( sk(k,j+1,i) - sk(k,j,i) ) * ddy & 246 * MERGE( 1.0_wp, 0.0_wp, & 247 BTEST( wall_flags_0(k,j,i), 0 ) ) 228 248 ENDIF 229 249 ! … … 232 252 IF ( wkomp > 0.0_wp ) THEN 233 253 tend(k,j,i) = tend(k,j,i) - wkomp * & 234 ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k) 254 ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k) & 255 * MERGE( 1.0_wp, 0.0_wp, & 256 BTEST( wall_flags_0(k,j,i), 0 ) ) 235 257 ELSE 236 258 tend(k,j,i) = tend(k,j,i) - wkomp * & 237 ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1) 259 ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1) & 260 * MERGE( 1.0_wp, 0.0_wp, & 261 BTEST( wall_flags_0(k,j,i), 0 ) ) 238 262 ENDIF 239 263 -
palm/trunk/SOURCE/advec_u_pw.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 96 96 97 97 USE indices, & 98 ONLY: nxlu, nxr, nyn, nys, nzb _u_inner, nzt98 ONLY: nxlu, nxr, nyn, nys, nzb, nzt, wall_flags_0 99 99 100 100 USE kinds … … 114 114 DO i = nxlu, nxr 115 115 DO j = nys, nyn 116 DO k = nzb _u_inner(j,i)+1, nzt116 DO k = nzb+1, nzt 117 117 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 118 118 ( u(k,j,i+1) * ( u(k,j,i+1) + u(k,j,i) - gu ) & … … 123 123 - u(k-1,j,i) * ( w(k-1,j,i) + w(k-1,j,i-1) ) ) & 124 124 * ddzw(k) & 125 ) 125 ) & 126 * MERGE( 1.0_wp, 0.0_wp, & 127 BTEST( wall_flags_0(k,j,i), 1 ) ) 126 128 ENDDO 127 129 ENDDO … … 148 150 149 151 USE indices, & 150 ONLY: nzb _u_inner, nzt152 ONLY: nzb, nzt, wall_flags_0 151 153 152 154 USE kinds … … 164 166 gu = 2.0_wp * u_gtrans 165 167 gv = 2.0_wp * v_gtrans 166 DO k = nzb _u_inner(j,i)+1, nzt168 DO k = nzb+1, nzt 167 169 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 168 170 ( u(k,j,i+1) * ( u(k,j,i+1) + u(k,j,i) - gu ) & … … 173 175 - u(k-1,j,i) * ( w(k-1,j,i) + w(k-1,j,i-1) ) ) & 174 176 * ddzw(k) & 175 ) 177 ) & 178 * MERGE( 1.0_wp, 0.0_wp, & 179 BTEST( wall_flags_0(k,j,i), 1 ) ) 176 180 ENDDO 177 181 -
palm/trunk/SOURCE/advec_u_up.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 95 95 96 96 USE indices, & 97 ONLY: nxlu, nxr, nyn, nys, nzb _u_inner, nzt97 ONLY: nxlu, nxr, nyn, nys, nzb, nzt, wall_flags_0 98 98 99 99 USE kinds … … 113 113 DO i = nxlu, nxr 114 114 DO j = nys, nyn 115 DO k = nzb _u_inner(j,i)+1, nzt115 DO k = nzb+1, nzt 116 116 ! 117 117 !-- x-direction … … 119 119 IF ( ukomp > 0.0_wp ) THEN 120 120 tend(k,j,i) = tend(k,j,i) - ukomp * & 121 ( u(k,j,i) - u(k,j,i-1) ) * ddx 121 ( u(k,j,i) - u(k,j,i-1) ) * ddx & 122 * MERGE( 1.0_wp, 0.0_wp, & 123 BTEST( wall_flags_0(k,j,i), 1 ) ) 122 124 ELSE 123 125 tend(k,j,i) = tend(k,j,i) - ukomp * & 124 ( u(k,j,i+1) - u(k,j,i) ) * ddx 126 ( u(k,j,i+1) - u(k,j,i) ) * ddx & 127 * MERGE( 1.0_wp, 0.0_wp, & 128 BTEST( wall_flags_0(k,j,i), 1 ) ) 125 129 ENDIF 126 130 ! … … 130 134 IF ( vkomp > 0.0_wp ) THEN 131 135 tend(k,j,i) = tend(k,j,i) - vkomp * & 132 ( u(k,j,i) - u(k,j-1,i) ) * ddy 136 ( u(k,j,i) - u(k,j-1,i) ) * ddy & 137 * MERGE( 1.0_wp, 0.0_wp, & 138 BTEST( wall_flags_0(k,j,i), 1 ) ) 133 139 ELSE 134 140 tend(k,j,i) = tend(k,j,i) - vkomp * & 135 ( u(k,j+1,i) - u(k,j,i) ) * ddy 141 ( u(k,j+1,i) - u(k,j,i) ) * ddy & 142 * MERGE( 1.0_wp, 0.0_wp, & 143 BTEST( wall_flags_0(k,j,i), 1 ) ) 136 144 ENDIF 137 145 ! … … 141 149 IF ( wkomp > 0.0_wp ) THEN 142 150 tend(k,j,i) = tend(k,j,i) - wkomp * & 143 ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) 151 ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 152 * MERGE( 1.0_wp, 0.0_wp, & 153 BTEST( wall_flags_0(k,j,i), 1 ) ) 144 154 ELSE 145 155 tend(k,j,i) = tend(k,j,i) - wkomp * & 146 ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) 156 ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 157 * MERGE( 1.0_wp, 0.0_wp, & 158 BTEST( wall_flags_0(k,j,i), 1 ) ) 147 159 ENDIF 148 160 … … 171 183 172 184 USE indices, & 173 ONLY: nzb _u_inner, nzt185 ONLY: nzb, nzt, wall_flags_0 174 186 175 187 USE kinds … … 187 199 188 200 189 DO k = nzb _u_inner(j,i)+1, nzt201 DO k = nzb+1, nzt 190 202 ! 191 203 !-- x-direction … … 193 205 IF ( ukomp > 0.0_wp ) THEN 194 206 tend(k,j,i) = tend(k,j,i) - ukomp * & 195 ( u(k,j,i) - u(k,j,i-1) ) * ddx 207 ( u(k,j,i) - u(k,j,i-1) ) * ddx & 208 * MERGE( 1.0_wp, 0.0_wp, & 209 BTEST( wall_flags_0(k,j,i), 1 ) ) 196 210 ELSE 197 211 tend(k,j,i) = tend(k,j,i) - ukomp * & 198 ( u(k,j,i+1) - u(k,j,i) ) * ddx 212 ( u(k,j,i+1) - u(k,j,i) ) * ddx & 213 * MERGE( 1.0_wp, 0.0_wp, & 214 BTEST( wall_flags_0(k,j,i), 1 ) ) 199 215 ENDIF 200 216 ! … … 204 220 IF ( vkomp > 0.0_wp ) THEN 205 221 tend(k,j,i) = tend(k,j,i) - vkomp * & 206 ( u(k,j,i) - u(k,j-1,i) ) * ddy 222 ( u(k,j,i) - u(k,j-1,i) ) * ddy & 223 * MERGE( 1.0_wp, 0.0_wp, & 224 BTEST( wall_flags_0(k,j,i), 1 ) ) 207 225 ELSE 208 226 tend(k,j,i) = tend(k,j,i) - vkomp * & 209 ( u(k,j+1,i) - u(k,j,i) ) * ddy 227 ( u(k,j+1,i) - u(k,j,i) ) * ddy & 228 * MERGE( 1.0_wp, 0.0_wp, & 229 BTEST( wall_flags_0(k,j,i), 1 ) ) 210 230 ENDIF 211 231 ! … … 214 234 IF ( wkomp > 0.0_wp ) THEN 215 235 tend(k,j,i) = tend(k,j,i) - wkomp * & 216 ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) 236 ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 237 * MERGE( 1.0_wp, 0.0_wp, & 238 BTEST( wall_flags_0(k,j,i), 1 ) ) 217 239 ELSE 218 240 tend(k,j,i) = tend(k,j,i) - wkomp * & 219 ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) 241 ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 242 * MERGE( 1.0_wp, 0.0_wp, & 243 BTEST( wall_flags_0(k,j,i), 1 ) ) 220 244 ENDIF 221 245 -
palm/trunk/SOURCE/advec_v_pw.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 96 96 97 97 USE indices, & 98 ONLY: nxl, nxr, nyn, nysv, nzb _v_inner, nzt98 ONLY: nxl, nxr, nyn, nysv, nzb, nzt, wall_flags_0 99 99 100 100 USE kinds … … 115 115 DO i = nxl, nxr 116 116 DO j = nysv, nyn 117 DO k = nzb _v_inner(j,i)+1, nzt117 DO k = nzb+1, nzt 118 118 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 119 119 ( v(k,j,i+1) * ( u(k,j-1,i+1) + u(k,j,i+1) - gu ) & … … 124 124 - v(k-1,j,i) * ( w(k-1,j-1,i) + w(k-1,j,i) ) ) & 125 125 * ddzw(k) & 126 ) 126 ) & 127 * MERGE( 1.0_wp, 0.0_wp, & 128 BTEST( wall_flags_0(k,j,i), 2 ) ) 127 129 ENDDO 128 130 ENDDO … … 149 151 150 152 USE indices, & 151 ONLY: nzb _v_inner, nzt153 ONLY: nzb, nzt, wall_flags_0 152 154 153 155 USE kinds … … 166 168 gu = 2.0_wp * u_gtrans 167 169 gv = 2.0_wp * v_gtrans 168 DO k = nzb _v_inner(j,i)+1, nzt170 DO k = nzb+1, nzt 169 171 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 170 172 ( v(k,j,i+1) * ( u(k,j-1,i+1) + u(k,j,i+1) - gu ) & … … 175 177 - v(k-1,j,i) * ( w(k-1,j-1,i) + w(k-1,j,i) ) ) & 176 178 * ddzw(k) & 177 ) 179 ) & 180 * MERGE( 1.0_wp, 0.0_wp, & 181 BTEST( wall_flags_0(k,j,i), 2 ) ) 178 182 ENDDO 179 183 -
palm/trunk/SOURCE/advec_v_up.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 95 95 96 96 USE indices, & 97 ONLY: nxl, nxr, nyn, nysv, nzb _v_inner, nzt97 ONLY: nxl, nxr, nyn, nysv, nzb, nzt, wall_flags_0 98 98 99 99 USE kinds … … 113 113 DO i = nxl, nxr 114 114 DO j = nysv, nyn 115 DO k = nzb _v_inner(j,i)+1, nzt115 DO k = nzb+1, nzt 116 116 ! 117 117 !-- x-direction … … 120 120 IF ( ukomp > 0.0_wp ) THEN 121 121 tend(k,j,i) = tend(k,j,i) - ukomp * & 122 ( v(k,j,i) - v(k,j,i-1) ) * ddx 122 ( v(k,j,i) - v(k,j,i-1) ) * ddx & 123 * MERGE( 1.0_wp, 0.0_wp, & 124 BTEST( wall_flags_0(k,j,i), 2 ) ) 123 125 ELSE 124 126 tend(k,j,i) = tend(k,j,i) - ukomp * & 125 ( v(k,j,i+1) - v(k,j,i) ) * ddx 127 ( v(k,j,i+1) - v(k,j,i) ) * ddx & 128 * MERGE( 1.0_wp, 0.0_wp, & 129 BTEST( wall_flags_0(k,j,i), 2 ) ) 126 130 ENDIF 127 131 ! … … 130 134 IF ( vkomp > 0.0_wp ) THEN 131 135 tend(k,j,i) = tend(k,j,i) - vkomp * & 132 ( v(k,j,i) - v(k,j-1,i) ) * ddy 136 ( v(k,j,i) - v(k,j-1,i) ) * ddy & 137 * MERGE( 1.0_wp, 0.0_wp, & 138 BTEST( wall_flags_0(k,j,i), 2 ) ) 133 139 ELSE 134 140 tend(k,j,i) = tend(k,j,i) - vkomp * & 135 ( v(k,j+1,i) - v(k,j,i) ) * ddy 141 ( v(k,j+1,i) - v(k,j,i) ) * ddy & 142 * MERGE( 1.0_wp, 0.0_wp, & 143 BTEST( wall_flags_0(k,j,i), 2 ) ) 136 144 ENDIF 137 145 ! … … 141 149 IF ( wkomp > 0.0_wp ) THEN 142 150 tend(k,j,i) = tend(k,j,i) - wkomp * & 143 ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) 151 ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 152 * MERGE( 1.0_wp, 0.0_wp, & 153 BTEST( wall_flags_0(k,j,i), 2 ) ) 144 154 ELSE 145 155 tend(k,j,i) = tend(k,j,i) - wkomp * & 146 ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) 156 ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 157 * MERGE( 1.0_wp, 0.0_wp, & 158 BTEST( wall_flags_0(k,j,i), 2 ) ) 147 159 ENDIF 148 160 … … 171 183 172 184 USE indices, & 173 ONLY: nzb _v_inner, nzt185 ONLY: nzb, nzt, wall_flags_0 174 186 175 187 USE kinds … … 187 199 188 200 189 DO k = nzb _v_inner(j,i)+1, nzt201 DO k = nzb+1, nzt 190 202 ! 191 203 !-- x-direction … … 194 206 IF ( ukomp > 0.0_wp ) THEN 195 207 tend(k,j,i) = tend(k,j,i) - ukomp * & 196 ( v(k,j,i) - v(k,j,i-1) ) * ddx 208 ( v(k,j,i) - v(k,j,i-1) ) * ddx & 209 * MERGE( 1.0_wp, 0.0_wp, & 210 BTEST( wall_flags_0(k,j,i), 2 ) ) 197 211 ELSE 198 212 tend(k,j,i) = tend(k,j,i) - ukomp * & 199 ( v(k,j,i+1) - v(k,j,i) ) * ddx 213 ( v(k,j,i+1) - v(k,j,i) ) * ddx & 214 * MERGE( 1.0_wp, 0.0_wp, & 215 BTEST( wall_flags_0(k,j,i), 2 ) ) 200 216 ENDIF 201 217 ! … … 204 220 IF ( vkomp > 0.0_wp ) THEN 205 221 tend(k,j,i) = tend(k,j,i) - vkomp * & 206 ( v(k,j,i) - v(k,j-1,i) ) * ddy 222 ( v(k,j,i) - v(k,j-1,i) ) * ddy & 223 * MERGE( 1.0_wp, 0.0_wp, & 224 BTEST( wall_flags_0(k,j,i), 2 ) ) 207 225 ELSE 208 226 tend(k,j,i) = tend(k,j,i) - vkomp * & 209 ( v(k,j+1,i) - v(k,j,i) ) * ddy 227 ( v(k,j+1,i) - v(k,j,i) ) * ddy & 228 * MERGE( 1.0_wp, 0.0_wp, & 229 BTEST( wall_flags_0(k,j,i), 2 ) ) 210 230 ENDIF 211 231 ! … … 214 234 IF ( wkomp > 0.0_wp ) THEN 215 235 tend(k,j,i) = tend(k,j,i) - wkomp * & 216 ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) 236 ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 237 * MERGE( 1.0_wp, 0.0_wp, & 238 BTEST( wall_flags_0(k,j,i), 2 ) ) 217 239 ELSE 218 240 tend(k,j,i) = tend(k,j,i) - wkomp * & 219 ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) 241 ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 242 * MERGE( 1.0_wp, 0.0_wp, & 243 BTEST( wall_flags_0(k,j,i), 2 ) ) 220 244 ENDIF 221 245 -
palm/trunk/SOURCE/advec_w_pw.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 96 96 97 97 USE indices, & 98 ONLY: nxl, nxr, nyn, nys, nzb _w_inner, nzt98 ONLY: nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 99 99 100 100 USE kinds … … 115 115 DO i = nxl, nxr 116 116 DO j = nys, nyn 117 DO k = nzb _w_inner(j,i)+1, nzt117 DO k = nzb+1, nzt 118 118 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 119 119 ( w(k,j,i+1) * ( u(k+1,j,i+1) + u(k,j,i+1) - gu ) & … … 124 124 - w(k-1,j,i) * ( w(k,j,i) + w(k-1,j,i) ) ) & 125 125 * ddzu(k+1) & 126 ) 126 ) & 127 * MERGE( 1.0_wp, 0.0_wp, & 128 BTEST( wall_flags_0(k,j,i), 3 ) ) 127 129 ENDDO 128 130 ENDDO … … 149 151 150 152 USE indices, & 151 ONLY: nzb _w_inner, nzt153 ONLY: nzb, nzt, wall_flags_0 152 154 153 155 USE kinds … … 165 167 gu = 2.0_wp * u_gtrans 166 168 gv = 2.0_wp * v_gtrans 167 DO k = nzb _w_inner(j,i)+1, nzt169 DO k = nzb+1, nzt 168 170 tend(k,j,i) = tend(k,j,i) - 0.25_wp * ( & 169 171 ( w(k,j,i+1) * ( u(k+1,j,i+1) + u(k,j,i+1) - gu ) & … … 174 176 - w(k-1,j,i) * ( w(k,j,i) + w(k-1,j,i) ) ) & 175 177 * ddzu(k+1) & 176 ) 178 ) & 179 * MERGE( 1.0_wp, 0.0_wp, & 180 BTEST( wall_flags_0(k,j,i), 3 ) ) 177 181 ENDDO 178 182 END SUBROUTINE advec_w_pw_ij -
palm/trunk/SOURCE/advec_w_up.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! topography representation via flags 23 23 ! 24 24 ! Former revisions: … … 95 95 96 96 USE indices, & 97 ONLY: nxl, nxr, nyn, nys, nzb _w_inner, nzt97 ONLY: nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 98 98 99 99 USE kinds … … 112 112 DO i = nxl, nxr 113 113 DO j = nys, nyn 114 DO k = nzb _w_inner(j,i)+1, nzt-1114 DO k = nzb+1, nzt-1 115 115 ! 116 116 !-- x-direction … … 119 119 IF ( ukomp > 0.0_wp ) THEN 120 120 tend(k,j,i) = tend(k,j,i) - ukomp * & 121 ( w(k,j,i) - w(k,j,i-1) ) * ddx 121 ( w(k,j,i) - w(k,j,i-1) ) * ddx & 122 * MERGE( 1.0_wp, 0.0_wp, & 123 BTEST( wall_flags_0(k,j,i), 3 ) ) 122 124 ELSE 123 125 tend(k,j,i) = tend(k,j,i) - ukomp * & 124 ( w(k,j,i+1) - w(k,j,i) ) * ddx 126 ( w(k,j,i+1) - w(k,j,i) ) * ddx & 127 * MERGE( 1.0_wp, 0.0_wp, & 128 BTEST( wall_flags_0(k,j,i), 3 ) ) 125 129 ENDIF 126 130 ! … … 130 134 IF ( vkomp > 0.0_wp ) THEN 131 135 tend(k,j,i) = tend(k,j,i) - vkomp * & 132 ( w(k,j,i) - w(k,j-1,i) ) * ddy 136 ( w(k,j,i) - w(k,j-1,i) ) * ddy & 137 * MERGE( 1.0_wp, 0.0_wp, & 138 BTEST( wall_flags_0(k,j,i), 3 ) ) 133 139 ELSE 134 140 tend(k,j,i) = tend(k,j,i) - vkomp * & 135 ( w(k,j+1,i) - w(k,j,i) ) * ddy 141 ( w(k,j+1,i) - w(k,j,i) ) * ddy & 142 * MERGE( 1.0_wp, 0.0_wp, & 143 BTEST( wall_flags_0(k,j,i), 3 ) ) 136 144 ENDIF 137 145 ! … … 139 147 IF ( w(k,j,i) > 0.0_wp ) THEN 140 148 tend(k,j,i) = tend(k,j,i) - w(k,j,i) * & 141 ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 149 ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 150 * MERGE( 1.0_wp, 0.0_wp, & 151 BTEST( wall_flags_0(k,j,i), 3 ) ) 142 152 ELSE 143 153 tend(k,j,i) = tend(k,j,i) - w(k,j,i) * & 144 ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) 154 ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 155 * MERGE( 1.0_wp, 0.0_wp, & 156 BTEST( wall_flags_0(k,j,i), 3 ) ) 145 157 ENDIF 146 158 … … 169 181 170 182 USE indices, & 171 ONLY: nzb _w_inner, nzt183 ONLY: nzb, nzt, wall_flags_0 172 184 173 185 USE kinds … … 184 196 185 197 186 DO k = nzb _w_inner(j,i)+1, nzt-1198 DO k = nzb+1, nzt-1 187 199 ! 188 200 !-- x-direction -
palm/trunk/SOURCE/advec_ws.f90
r2201 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Rename wall_flags_0 and wall_flags_00 into advc_flags_1 and advc_flags_2, 23 ! respectively. 24 ! Set advc_flags_1/2 on basis of wall_flags_0/00 instead of nzb_s/u/v/w_inner. 25 ! Setting advc_flags_1/2 also for downward-facing walls 23 26 ! 24 27 ! Former revisions: … … 147 150 ! vector version. 148 151 ! Degradation of the applied order of scheme is now steered by multiplying with 149 ! Integer wall_flags_0. 2nd order scheme, WS3 and WS5 are calculated on each152 ! Integer advc_flags_1. 2nd order scheme, WS3 and WS5 are calculated on each 150 153 ! grid point and mulitplied with the appropriate flag. 151 154 ! 2nd order numerical dissipation term changed. Now the appropriate 2nd order … … 406 409 407 410 USE indices, & 408 ONLY: nbgp, nxl, nxlu, nxr, nyn, nys, nysv, nzb, nzb_s_inner, & 409 nzb_u_inner, nzb_v_inner, nzb_w_inner, nzt, wall_flags_0, & 410 wall_flags_00 411 ONLY: advc_flags_1, advc_flags_2, nbgp, nxl, nxlu, nxr, nyn, nys, & 412 nysv, nzb, nzt, wall_flags_0 411 413 412 414 USE kinds … … 414 416 IMPLICIT NONE 415 417 416 INTEGER(iwp) :: i !< index variable along x 417 INTEGER(iwp) :: j !< index variable along y 418 INTEGER(iwp) :: k !< index variable along z 419 418 INTEGER(iwp) :: i !< index variable along x 419 INTEGER(iwp) :: j !< index variable along y 420 INTEGER(iwp) :: k !< index variable along z 421 INTEGER(iwp) :: k_mm !< dummy index along z 422 INTEGER(iwp) :: k_pp !< dummy index along z 423 INTEGER(iwp) :: k_ppp !< dummy index along z 424 420 425 LOGICAL :: flag_set !< steering variable for advection flags 421 426 … … 425 430 !-- Set flags to steer the degradation of the advection scheme in advec_ws 426 431 !-- near topography, inflow- and outflow boundaries as well as bottom and 427 !-- top of model domain. wall_flags_0remains zero for all non-prognostic432 !-- top of model domain. advc_flags_1 remains zero for all non-prognostic 428 433 !-- grid points. 429 434 DO i = nxl, nxr 430 435 DO j = nys, nyn 431 DO k = nzb _s_inner(j,i)+1, nzt436 DO k = nzb+1, nzt 432 437 ! 433 438 !-- scalar - x-direction 434 439 !-- WS1 (0), WS3 (1), WS5 (2) 435 IF ( ( k <= nzb_s_inner(j,i+1) .OR. k <= nzb_s_inner(j,i+2) & 436 .OR. k <= nzb_s_inner(j,i-1) ) & 437 .OR. ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 438 .AND. i == nxl ) .OR. & 440 IF ( ( .NOT. BTEST(wall_flags_0(k,j,i+1),0) & 441 .OR. .NOT. BTEST(wall_flags_0(k,j,i+2),0) & 442 .OR. .NOT. BTEST(wall_flags_0(k,j,i-1),0) ) & 443 .OR. ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 444 .AND. i == nxl ) & 445 .OR. ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & 446 .AND. i == nxr ) ) & 447 THEN 448 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 0 ) 449 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j,i+3),0) & 450 .AND. BTEST(wall_flags_0(k,j,i+1),0) & 451 .AND. BTEST(wall_flags_0(k,j,i+2),0) & 452 .AND. BTEST(wall_flags_0(k,j,i-1),0) & 453 ) .OR. & 454 ( .NOT. BTEST(wall_flags_0(k,j,i-2),0) & 455 .AND. BTEST(wall_flags_0(k,j,i+1),0) & 456 .AND. BTEST(wall_flags_0(k,j,i+2),0) & 457 .AND. BTEST(wall_flags_0(k,j,i-1),0) & 458 ) & 459 .OR. & 439 460 ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & 440 .AND. i == nxr ) ) & 461 .AND. i == nxr-1 ) .OR. & 462 ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 463 .AND. i == nxlu ) ) & 441 464 THEN 442 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 0 ) 443 ELSEIF ( ( k <= nzb_s_inner(j,i+3) .AND. k > nzb_s_inner(j,i+1)& 444 .AND. k > nzb_s_inner(j,i+2)& 445 .AND. k > nzb_s_inner(j,i-1)& 446 ) .OR. & 447 ( k <= nzb_s_inner(j,i-2) .AND. k > nzb_s_inner(j,i+1)& 448 .AND. k > nzb_s_inner(j,i+2)& 449 .AND. k > nzb_s_inner(j,i-1)& 450 ) & 451 .OR. & 452 ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & 453 .AND. i == nxr-1 ) .OR. & 454 ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 455 .AND. i == nxlu ) ) & 456 THEN 457 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 1 ) 458 ELSEIF ( k > nzb_s_inner(j,i+1) .AND. k > nzb_s_inner(j,i+2)& 459 .AND. k > nzb_s_inner(j,i+3) .AND. k > nzb_s_inner(j,i-1)& 460 .AND. k > nzb_s_inner(j,i-2) ) & 465 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 1 ) 466 ELSEIF ( BTEST(wall_flags_0(k,j,i+1),0) & 467 .AND. BTEST(wall_flags_0(k,j,i+2),0) & 468 .AND. BTEST(wall_flags_0(k,j,i+3),0) & 469 .AND. BTEST(wall_flags_0(k,j,i-1),0) & 470 .AND. BTEST(wall_flags_0(k,j,i-2),0) ) & 461 471 THEN 462 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 2 )472 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 2 ) 463 473 ENDIF 464 474 ! 465 475 !-- scalar - y-direction 466 476 !-- WS1 (3), WS3 (4), WS5 (5) 467 IF ( ( k <= nzb_s_inner(j+1,i) .OR. k <= nzb_s_inner(j+2,i) &468 .OR. k <= nzb_s_inner(j-1,i) ) &469 .OR.&470 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )&471 .AND. j == nys ) .OR.&472 ( ( inflow_n .OR. outflow_n .OR. nest_bound_n )&473 .AND. j == nyn ) )&477 IF ( ( .NOT. BTEST(wall_flags_0(k,j+1,i),0) & 478 .OR. .NOT. BTEST(wall_flags_0(k,j+2,i),0) & 479 .OR. .NOT. BTEST(wall_flags_0(k,j-1,i),0)) & 480 .OR. ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 481 .AND. j == nys ) & 482 .OR. ( ( inflow_n .OR. outflow_n .OR. nest_bound_n ) & 483 .AND. j == nyn ) ) & 474 484 THEN 475 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 3 )485 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 3 ) 476 486 ! 477 487 !-- WS3 478 ELSEIF ( ( k <= nzb_s_inner(j+3,i) .AND. k > nzb_s_inner(j+1,i)& 479 .AND. k > nzb_s_inner(j+2,i)& 480 .AND. k > nzb_s_inner(j-1,i)& 481 ) .OR. & 482 ( k <= nzb_s_inner(j-2,i) .AND. k > nzb_s_inner(j+1,i)& 483 .AND. k > nzb_s_inner(j+2,i)& 484 .AND. k > nzb_s_inner(j-1,i)& 485 ) & 486 .OR. & 487 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 488 .AND. j == nysv ) .OR. & 489 ( ( inflow_n .OR. outflow_n .OR. nest_bound_n ) & 490 .AND. j == nyn-1 ) ) & 488 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j+3,i),0) & 489 .AND. BTEST(wall_flags_0(k,j+1,i),0) & 490 .AND. BTEST(wall_flags_0(k,j+2,i),0) & 491 .AND. BTEST(wall_flags_0(k,j-1,i),0) & 492 ) .OR. & 493 ( .NOT. BTEST(wall_flags_0(k,j-2,i),0) & 494 .AND. BTEST(wall_flags_0(k,j+1,i),0) & 495 .AND. BTEST(wall_flags_0(k,j+2,i),0) & 496 .AND. BTEST(wall_flags_0(k,j-1,i),0) & 497 ) & 498 .OR. & 499 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 500 .AND. j == nysv ) .OR. & 501 ( ( inflow_n .OR. outflow_n .OR. nest_bound_n ) & 502 .AND. j == nyn-1 ) ) & 491 503 THEN 492 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 4 )504 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 4 ) 493 505 ! 494 506 !-- WS5 495 ELSEIF ( k > nzb_s_inner(j+1,i) .AND. k > nzb_s_inner(j+2,i)& 496 .AND. k > nzb_s_inner(j+3,i) .AND. k > nzb_s_inner(j-1,i)& 497 .AND. k > nzb_s_inner(j-2,i) ) & 507 ELSEIF ( BTEST(wall_flags_0(k,j+1,i),0) & 508 .AND. BTEST(wall_flags_0(k,j+2,i),0) & 509 .AND. BTEST(wall_flags_0(k,j+3,i),0) & 510 .AND. BTEST(wall_flags_0(k,j-1,i),0) & 511 .AND. BTEST(wall_flags_0(k,j-2,i),0) ) & 498 512 THEN 499 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 5 )513 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 5 ) 500 514 ENDIF 501 515 ! 502 516 !-- scalar - z-direction 503 517 !-- WS1 (6), WS3 (7), WS5 (8) 518 IF ( k == nzb+1 ) THEN 519 k_mm = nzb 520 ELSE 521 k_mm = k - 2 522 ENDIF 523 IF ( k > nzt-1 ) THEN 524 k_pp = nzt+1 525 ELSE 526 k_pp = k + 2 527 ENDIF 528 IF ( k > nzt-2 ) THEN 529 k_ppp = nzt+1 530 ELSE 531 k_ppp = k + 3 532 ENDIF 533 504 534 flag_set = .FALSE. 505 IF ( k == nzb_s_inner(j,i) + 1 .OR. k == nzt ) THEN 506 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 6 ) 535 IF ( .NOT. BTEST(wall_flags_0(k-1,j,i),0) .AND. & 536 BTEST(wall_flags_0(k,j,i),0) .OR. & 537 .NOT. BTEST(wall_flags_0(k_pp,j,i),0) .AND. & 538 BTEST(wall_flags_0(k,j,i),0) .OR. & 539 k == nzt ) & 540 THEN 541 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 6 ) 507 542 flag_set = .TRUE. 508 ELSEIF ( k == nzb_s_inner(j,i) + 2 .OR. k == nzt - 1 ) THEN 509 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 7 ) 543 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k_mm,j,i),0) .OR. & 544 .NOT. BTEST(wall_flags_0(k_ppp,j,i),0) ) .AND. & 545 BTEST(wall_flags_0(k-1,j,i),0) .AND. & 546 BTEST(wall_flags_0(k,j,i),0) .AND. & 547 BTEST(wall_flags_0(k+1,j,i),0) .AND. & 548 BTEST(wall_flags_0(k_pp,j,i),0) .OR. & 549 k == nzt - 1 ) & 550 THEN 551 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 7 ) 510 552 flag_set = .TRUE. 511 ELSEIF ( k > nzb_s_inner(j,i) .AND. .NOT. flag_set ) THEN 512 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 8 ) 553 ELSEIF ( BTEST(wall_flags_0(k_mm,j,i),0) & 554 .AND. BTEST(wall_flags_0(k-1,j,i),0) & 555 .AND. BTEST(wall_flags_0(k,j,i),0) & 556 .AND. BTEST(wall_flags_0(k+1,j,i),0) & 557 .AND. BTEST(wall_flags_0(k_pp,j,i),0) & 558 .AND. BTEST(wall_flags_0(k_ppp,j,i),0) & 559 .AND. .NOT. flag_set ) & 560 THEN 561 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 8 ) 513 562 ENDIF 514 563 … … 520 569 IF ( momentum_advec == 'ws-scheme' ) THEN 521 570 ! 522 !-- Set wall_flags_0to steer the degradation of the advection scheme in advec_ws571 !-- Set advc_flags_1 to steer the degradation of the advection scheme in advec_ws 523 572 !-- near topography, inflow- and outflow boundaries as well as bottom and 524 !-- top of model domain. wall_flags_0remains zero for all non-prognostic573 !-- top of model domain. advc_flags_1 remains zero for all non-prognostic 525 574 !-- grid points. 526 575 DO i = nxl, nxr … … 532 581 !-- in order to handle the left/south flux. 533 582 !-- near vertical walls. 534 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 9 )535 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 12 )583 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 9 ) 584 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 12 ) 536 585 ! 537 586 !-- u component - x-direction 538 587 !-- WS1 (9), WS3 (10), WS5 (11) 539 IF ( k <= nzb_u_inner(j,i+1) .OR.&588 IF ( .NOT. BTEST(wall_flags_0(k,j,i+1),1) .OR. & 540 589 ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 541 590 .AND. i <= nxlu ) .OR. & … … 543 592 .AND. i == nxr ) ) & 544 593 THEN 545 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 9 )546 ELSEIF ( ( k <= nzb_u_inner(j,i+2) .AND.&547 k > nzb_u_inner(j,i+1) ) .OR.&548 k <= nzb_u_inner(j,i-1)&594 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 9 ) 595 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j,i+2),1) .AND. & 596 BTEST(wall_flags_0(k,j,i+1),1) .OR. & 597 .NOT. BTEST(wall_flags_0(k,j,i-1),1) ) & 549 598 .OR. & 550 599 ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & … … 553 602 .AND. i == nxlu+1) ) & 554 603 THEN 555 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 10 )604 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 10 ) 556 605 ! 557 606 !-- Clear flag for WS1 558 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 9 ) 559 ELSEIF ( k > nzb_u_inner(j,i+1) .AND. k > nzb_u_inner(j,i+2) & 560 .AND. k > nzb_u_inner(j,i-1) ) & 607 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 9 ) 608 ELSEIF ( BTEST(wall_flags_0(k,j,i+1),1) .AND. & 609 BTEST(wall_flags_0(k,j,i+2),1) .AND. & 610 BTEST(wall_flags_0(k,j,i-1),1) ) & 561 611 THEN 562 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 11 )612 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 11 ) 563 613 ! 564 614 !-- Clear flag for WS1 565 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 9 )615 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 9 ) 566 616 ENDIF 567 617 ! 568 618 !-- u component - y-direction 569 619 !-- WS1 (12), WS3 (13), WS5 (14) 570 IF ( k <= nzb_u_inner(j+1,i) .OR.&620 IF ( .NOT. BTEST(wall_flags_0(k,j+1,i),1) .OR. & 571 621 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 572 622 .AND. j == nys ) .OR. & … … 574 624 .AND. j == nyn ) ) & 575 625 THEN 576 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 12 )577 ELSEIF ( ( k <= nzb_u_inner(j+2,i) .AND.&578 k > nzb_u_inner(j+1,i) ) .OR.&579 k <= nzb_u_inner(j-1,i)&626 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 12 ) 627 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j+2,i),1) .AND. & 628 BTEST(wall_flags_0(k,j+1,i),1) .OR. & 629 .NOT. BTEST(wall_flags_0(k,j-1,i),1) ) & 580 630 .OR. & 581 631 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & … … 584 634 .AND. j == nyn-1 ) ) & 585 635 THEN 586 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 13 )636 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 13 ) 587 637 ! 588 638 !-- Clear flag for WS1 589 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 12 ) 590 ELSEIF ( k > nzb_u_inner(j+1,i) .AND. k > nzb_u_inner(j+2,i) & 591 .AND. k > nzb_u_inner(j-1,i) ) & 639 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 12 ) 640 ELSEIF ( BTEST(wall_flags_0(k,j+1,i),1) .AND. & 641 BTEST(wall_flags_0(k,j+2,i),1) .AND. & 642 BTEST(wall_flags_0(k,j-1,i),1) ) & 592 643 THEN 593 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 14 )644 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 14 ) 594 645 ! 595 646 !-- Clear flag for WS1 596 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 12 )647 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 12 ) 597 648 ENDIF 598 649 ! 599 650 !-- u component - z-direction 600 651 !-- WS1 (15), WS3 (16), WS5 (17) 652 IF ( k == nzb+1 ) THEN 653 k_mm = nzb 654 ELSE 655 k_mm = k - 2 656 ENDIF 657 IF ( k > nzt-1 ) THEN 658 k_pp = nzt+1 659 ELSE 660 k_pp = k + 2 661 ENDIF 662 IF ( k > nzt-2 ) THEN 663 k_ppp = nzt+1 664 ELSE 665 k_ppp = k + 3 666 ENDIF 667 601 668 flag_set = .FALSE. 602 IF ( k == nzb_u_inner(j,i) + 1 .OR. k == nzt ) THEN 603 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 15 ) 669 IF ( .NOT. BTEST(wall_flags_0(k-1,j,i),1) .AND. & 670 BTEST(wall_flags_0(k,j,i),1) .OR. & 671 .NOT. BTEST(wall_flags_0(k_pp,j,i),1) .AND. & 672 BTEST(wall_flags_0(k,j,i),1) .OR. & 673 k == nzt ) & 674 THEN 675 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 15 ) 676 flag_set = .TRUE. 677 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k_mm,j,i),1) .OR. & 678 .NOT. BTEST(wall_flags_0(k_ppp,j,i),1) ) .AND. & 679 BTEST(wall_flags_0(k-1,j,i),1) .AND. & 680 BTEST(wall_flags_0(k,j,i),1) .AND. & 681 BTEST(wall_flags_0(k+1,j,i),1) .AND. & 682 BTEST(wall_flags_0(k_pp,j,i),1) .OR. & 683 k == nzt - 1 ) & 684 THEN 685 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 16 ) 604 686 flag_set = .TRUE. 605 ELSEIF ( k == nzb_u_inner(j,i) + 2 .OR. k == nzt - 1 ) THEN 606 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 16 ) 607 flag_set = .TRUE. 608 ELSEIF ( k > nzb_u_inner(j,i) .AND. .NOT. flag_set ) THEN 609 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 17 ) 687 ELSEIF ( BTEST(wall_flags_0(k_mm,j,i),1) .AND. & 688 BTEST(wall_flags_0(k-1,j,i),1) .AND. & 689 BTEST(wall_flags_0(k,j,i),1) .AND. & 690 BTEST(wall_flags_0(k+1,j,i),1) .AND. & 691 BTEST(wall_flags_0(k_pp,j,i),1) .AND. & 692 BTEST(wall_flags_0(k_ppp,j,i),1) .AND. & 693 .NOT. flag_set ) & 694 THEN 695 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 17 ) 610 696 ENDIF 611 697 … … 621 707 !-- Since fluxes are swapped in advec_ws.f90, this is necessary to 622 708 !-- in order to handle the left/south flux. 623 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 18 )624 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 21 )709 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 18 ) 710 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 21 ) 625 711 ! 626 712 !-- v component - x-direction 627 713 !-- WS1 (18), WS3 (19), WS5 (20) 628 IF ( k <= nzb_v_inner(j,i+1) .OR.&714 IF ( .NOT. BTEST(wall_flags_0(k,j,i+1),2) .OR. & 629 715 ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 630 716 .AND. i == nxl ) .OR. & … … 632 718 .AND. i == nxr ) ) & 633 719 THEN 634 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 18 )720 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 18 ) 635 721 ! 636 722 !-- WS3 637 ELSEIF ( ( k <= nzb_v_inner(j,i+2) .AND.&638 k > nzb_v_inner(j,i+1) ) .OR.&639 k <= nzb_v_inner(j,i-1)&723 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j,i+2),2) .AND. & 724 BTEST(wall_flags_0(k,j,i+1),2) ) .OR. & 725 .NOT. BTEST(wall_flags_0(k,j,i-1),2) & 640 726 .OR. & 641 727 ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & … … 644 730 .AND. i == nxlu ) ) & 645 731 THEN 646 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 19 )732 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 19 ) 647 733 ! 648 734 !-- Clear flag for WS1 649 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 18 ) 650 ELSEIF ( k > nzb_v_inner(j,i+1) .AND. k > nzb_v_inner(j,i+2) & 651 .AND. k > nzb_v_inner(j,i-1) ) & 735 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 18 ) 736 ELSEIF ( BTEST(wall_flags_0(k,j,i+1),2) .AND. & 737 BTEST(wall_flags_0(k,j,i+2),2) .AND. & 738 BTEST(wall_flags_0(k,j,i-1),2) ) & 652 739 THEN 653 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 20 )740 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 20 ) 654 741 ! 655 742 !-- Clear flag for WS1 656 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 18 )743 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 18 ) 657 744 ENDIF 658 745 ! 659 746 !-- v component - y-direction 660 747 !-- WS1 (21), WS3 (22), WS5 (23) 661 IF ( k <= nzb_v_inner(j+1,i) .OR.&748 IF ( .NOT. BTEST(wall_flags_0(k,j+1,i),2) .OR. & 662 749 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 663 750 .AND. j <= nysv ) .OR. & … … 665 752 .AND. j == nyn ) ) & 666 753 THEN 667 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 21 )668 ELSEIF ( ( k <= nzb_v_inner(j+2,i) .AND.&669 k > nzb_v_inner(j+1,i) ) .OR.&670 k <= nzb_v_inner(j-1,i)&754 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 21 ) 755 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j+2,i),2) .AND. & 756 BTEST(wall_flags_0(k,j+1,i),2) .OR. & 757 .NOT. BTEST(wall_flags_0(k,j-1,i),2) ) & 671 758 .OR. & 672 759 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & … … 675 762 .AND. j == nyn-1 ) ) & 676 763 THEN 677 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 22 )764 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 22 ) 678 765 ! 679 766 !-- Clear flag for WS1 680 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 21 ) 681 ELSEIF ( k > nzb_v_inner(j+1,i) .AND. k > nzb_v_inner(j+2,i) & 682 .AND. k > nzb_v_inner(j-1,i) ) & 767 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 21 ) 768 ELSEIF ( BTEST(wall_flags_0(k,j+1,i),2) .AND. & 769 BTEST(wall_flags_0(k,j+2,i),2) .AND. & 770 BTEST(wall_flags_0(k,j-1,i),2) ) & 683 771 THEN 684 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 23 )772 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 23 ) 685 773 ! 686 774 !-- Clear flag for WS1 687 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 21 )775 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 21 ) 688 776 ENDIF 689 777 ! 690 778 !-- v component - z-direction 691 779 !-- WS1 (24), WS3 (25), WS5 (26) 780 IF ( k == nzb+1 ) THEN 781 k_mm = nzb 782 ELSE 783 k_mm = k - 2 784 ENDIF 785 IF ( k > nzt-1 ) THEN 786 k_pp = nzt+1 787 ELSE 788 k_pp = k + 2 789 ENDIF 790 IF ( k > nzt-2 ) THEN 791 k_ppp = nzt+1 792 ELSE 793 k_ppp = k + 3 794 ENDIF 795 692 796 flag_set = .FALSE. 693 IF ( k == nzb_v_inner(j,i) + 1 .OR. k == nzt ) THEN 694 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 24 ) 797 IF ( .NOT. BTEST(wall_flags_0(k-1,j,i),2) .AND. & 798 BTEST(wall_flags_0(k,j,i),2) .OR. & 799 .NOT. BTEST(wall_flags_0(k_pp,j,i),2) .AND. & 800 BTEST(wall_flags_0(k,j,i),2) .OR. & 801 k == nzt ) & 802 THEN 803 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 24 ) 695 804 flag_set = .TRUE. 696 ELSEIF ( k == nzb_v_inner(j,i) + 2 .OR. k == nzt - 1 ) THEN 697 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 25 ) 805 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k_mm,j,i),2) .OR. & 806 .NOT. BTEST(wall_flags_0(k_ppp,j,i),2) ) .AND. & 807 BTEST(wall_flags_0(k-1,j,i),2) .AND. & 808 BTEST(wall_flags_0(k,j,i),2) .AND. & 809 BTEST(wall_flags_0(k+1,j,i),2) .AND. & 810 BTEST(wall_flags_0(k_pp,j,i),2) .OR. & 811 k == nzt - 1 ) & 812 THEN 813 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 25 ) 698 814 flag_set = .TRUE. 699 ELSEIF ( k > nzb_v_inner(j,i) .AND. .NOT. flag_set ) THEN 700 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 26 ) 815 ELSEIF ( BTEST(wall_flags_0(k_mm,j,i),2) .AND. & 816 BTEST(wall_flags_0(k-1,j,i),2) .AND. & 817 BTEST(wall_flags_0(k,j,i),2) .AND. & 818 BTEST(wall_flags_0(k+1,j,i),2) .AND. & 819 BTEST(wall_flags_0(k_pp,j,i),2) .AND. & 820 BTEST(wall_flags_0(k_ppp,j,i),2) .AND. & 821 .NOT. flag_set ) & 822 THEN 823 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 26 ) 701 824 ENDIF 702 825 … … 711 834 !-- Since fluxes are swapped in advec_ws.f90, this is necessary to 712 835 !-- in order to handle the left/south flux. 713 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 27 )714 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 30 )836 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 27 ) 837 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 30 ) 715 838 ! 716 839 !-- w component - x-direction 717 840 !-- WS1 (27), WS3 (28), WS5 (29) 718 IF ( k <= nzb_w_inner(j,i+1) .OR.&841 IF ( .NOT. BTEST(wall_flags_0(k,j,i+1),3) .OR. & 719 842 ( ( inflow_l .OR. outflow_l .OR. nest_bound_l ) & 720 843 .AND. i == nxl ) .OR. & … … 722 845 .AND. i == nxr ) ) & 723 846 THEN 724 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 27 )725 ELSEIF ( ( k <= nzb_w_inner(j,i+2) .AND.&726 k > nzb_w_inner(j,i+1) ) .OR.&727 k <= nzb_w_inner(j,i-1)&847 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 27 ) 848 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j,i+2),3) .AND. & 849 BTEST(wall_flags_0(k,j,i+1),3) .OR. & 850 .NOT. BTEST(wall_flags_0(k,j,i-1),3) ) & 728 851 .OR. & 729 852 ( ( inflow_r .OR. outflow_r .OR. nest_bound_r ) & … … 732 855 .AND. i == nxlu ) ) & 733 856 THEN 734 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 28 )857 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 28 ) 735 858 ! 736 859 !-- Clear flag for WS1 737 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 27 ) 738 ELSEIF ( k > nzb_w_inner(j,i+1) .AND. k > nzb_w_inner(j,i+2) & 739 .AND. k > nzb_w_inner(j,i-1) ) & 860 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 27 ) 861 ELSEIF ( BTEST(wall_flags_0(k,j,i+1),3) .AND. & 862 BTEST(wall_flags_0(k,j,i+2),3) .AND. & 863 BTEST(wall_flags_0(k,j,i-1),3) ) & 740 864 THEN 741 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i),29 )865 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i),29 ) 742 866 ! 743 867 !-- Clear flag for WS1 744 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 27 )868 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 27 ) 745 869 ENDIF 746 870 ! 747 871 !-- w component - y-direction 748 872 !-- WS1 (30), WS3 (31), WS5 (32) 749 IF ( k <= nzb_w_inner(j+1,i) .OR.&873 IF ( .NOT. BTEST(wall_flags_0(k,j+1,i),3) .OR. & 750 874 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & 751 875 .AND. j == nys ) .OR. & … … 753 877 .AND. j == nyn ) ) & 754 878 THEN 755 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 30 )756 ELSEIF ( ( k <= nzb_w_inner(j+2,i) .AND.&757 k > nzb_w_inner(j+1,i) ) .OR.&758 k <= nzb_w_inner(j-1,i)&879 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 30 ) 880 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k,j+2,i),3) .AND. & 881 BTEST(wall_flags_0(k,j+1,i),3) .OR. & 882 .NOT. BTEST(wall_flags_0(k,j-1,i),3) ) & 759 883 .OR. & 760 884 ( ( inflow_s .OR. outflow_s .OR. nest_bound_s ) & … … 763 887 .AND. j == nyn-1 ) ) & 764 888 THEN 765 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 31 )889 advc_flags_1(k,j,i) = IBSET( advc_flags_1(k,j,i), 31 ) 766 890 ! 767 891 !-- Clear flag for WS1 768 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 30 ) 769 ELSEIF ( k > nzb_w_inner(j+1,i) .AND. k > nzb_w_inner(j+2,i) & 770 .AND. k > nzb_w_inner(j-1,i) ) & 892 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 30 ) 893 ELSEIF ( BTEST(wall_flags_0(k,j+1,i),3) .AND. & 894 BTEST(wall_flags_0(k,j+2,i),3) .AND. & 895 BTEST(wall_flags_0(k,j-1,i),3) ) & 771 896 THEN 772 wall_flags_00(k,j,i) = IBSET( wall_flags_00(k,j,i), 0 )897 advc_flags_2(k,j,i) = IBSET( advc_flags_2(k,j,i), 0 ) 773 898 ! 774 899 !-- Clear flag for WS1 775 wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 30 )900 advc_flags_1(k,j,i) = IBCLR( advc_flags_1(k,j,i), 30 ) 776 901 ENDIF 777 902 ! … … 779 904 !-- WS1 (33), WS3 (34), WS5 (35) 780 905 flag_set = .FALSE. 781 IF ( k == nzb_w_inner(j,i) .OR. k == nzb_w_inner(j,i) + 1 & 782 .OR. k == nzt ) THEN 906 IF ( k == nzb+1 ) THEN 907 k_mm = nzb 908 ELSE 909 k_mm = k - 2 910 ENDIF 911 IF ( k > nzt-1 ) THEN 912 k_pp = nzt+1 913 ELSE 914 k_pp = k + 2 915 ENDIF 916 IF ( k > nzt-2 ) THEN 917 k_ppp = nzt+1 918 ELSE 919 k_ppp = k + 3 920 ENDIF 921 922 IF ( ( .NOT. BTEST(wall_flags_0(k-1,j,i),3) .AND. & 923 .NOT. BTEST(wall_flags_0(k,j,i),3) .AND. & 924 BTEST(wall_flags_0(k+1,j,i),3) ) .OR. & 925 ( .NOT. BTEST(wall_flags_0(k-1,j,i),3) .AND. & 926 BTEST(wall_flags_0(k,j,i),3) ) .OR. & 927 ( .NOT. BTEST(wall_flags_0(k+1,j,i),3) .AND. & 928 BTEST(wall_flags_0(k,j,i),3) ) .OR. & 929 k == nzt ) & 930 THEN 783 931 ! 784 932 !-- Please note, at k == nzb_w_inner(j,i) a flag is explictely … … 787 935 !-- because flux_t(nzb_w_inner(j,i)) is used for the tendency 788 936 !-- at k == nzb_w_inner(j,i)+1. 789 wall_flags_00(k,j,i) = IBSET( wall_flags_00(k,j,i), 1 )937 advc_flags_2(k,j,i) = IBSET( advc_flags_2(k,j,i), 1 ) 790 938 flag_set = .TRUE. 791 ELSEIF ( k == nzb_w_inner(j,i) + 2 .OR. k == nzt - 1 ) THEN 792 wall_flags_00(k,j,i) = IBSET( wall_flags_00(k,j,i), 2 ) 939 ELSEIF ( ( .NOT. BTEST(wall_flags_0(k_mm,j,i),3) .OR. & 940 .NOT. BTEST(wall_flags_0(k_ppp,j,i),3) ) .AND. & 941 BTEST(wall_flags_0(k-1,j,i),3) .AND. & 942 BTEST(wall_flags_0(k,j,i),3) .AND. & 943 BTEST(wall_flags_0(k+1,j,i),3) .OR. & 944 k == nzt - 1 ) & 945 THEN 946 advc_flags_2(k,j,i) = IBSET( advc_flags_2(k,j,i), 2 ) 793 947 flag_set = .TRUE. 794 ELSEIF ( k > nzb_w_inner(j,i) .AND. .NOT. flag_set ) THEN 795 wall_flags_00(k,j,i) = IBSET( wall_flags_00(k,j,i), 3 ) 948 ELSEIF ( BTEST(wall_flags_0(k_mm,j,i),3) .AND. & 949 BTEST(wall_flags_0(k-1,j,i),3) .AND. & 950 BTEST(wall_flags_0(k,j,i),3) .AND. & 951 BTEST(wall_flags_0(k+1,j,i),3) .AND. & 952 BTEST(wall_flags_0(k_pp,j,i),3) .AND. & 953 BTEST(wall_flags_0(k_ppp,j,i),3) .AND. & 954 .NOT. flag_set ) & 955 THEN 956 advc_flags_2(k,j,i) = IBSET( advc_flags_2(k,j,i), 3 ) 796 957 ENDIF 797 958 … … 809 970 ! 810 971 !-- Exchange ghost points for advection flags 811 CALL exchange_horiz_int( wall_flags_0,nbgp )812 CALL exchange_horiz_int( wall_flags_00, nbgp )972 CALL exchange_horiz_int( advc_flags_1, nbgp ) 973 CALL exchange_horiz_int( advc_flags_2, nbgp ) 813 974 ! 814 975 !-- Set boundary flags at inflow and outflow boundary in case of 815 976 !-- non-cyclic boundary conditions. 816 977 IF ( inflow_l .OR. outflow_l .OR. nest_bound_l ) THEN 817 wall_flags_0(:,:,nxl-1) = wall_flags_0(:,:,nxl)818 wall_flags_00(:,:,nxl-1) = wall_flags_00(:,:,nxl)978 advc_flags_1(:,:,nxl-1) = advc_flags_1(:,:,nxl) 979 advc_flags_2(:,:,nxl-1) = advc_flags_2(:,:,nxl) 819 980 ENDIF 820 981 821 982 IF ( inflow_r .OR. outflow_r .OR. nest_bound_r ) THEN 822 wall_flags_0(:,:,nxr+1) = wall_flags_0(:,:,nxr)823 wall_flags_00(:,:,nxr+1) = wall_flags_00(:,:,nxr)983 advc_flags_1(:,:,nxr+1) = advc_flags_1(:,:,nxr) 984 advc_flags_2(:,:,nxr+1) = advc_flags_2(:,:,nxr) 824 985 ENDIF 825 986 826 987 IF ( inflow_n .OR. outflow_n .OR. nest_bound_n ) THEN 827 wall_flags_0(:,nyn+1,:) = wall_flags_0(:,nyn,:)828 wall_flags_00(:,nyn+1,:) = wall_flags_00(:,nyn,:)988 advc_flags_1(:,nyn+1,:) = advc_flags_1(:,nyn,:) 989 advc_flags_2(:,nyn+1,:) = advc_flags_2(:,nyn,:) 829 990 ENDIF 830 991 831 992 IF ( inflow_s .OR. outflow_s .OR. nest_bound_s ) THEN 832 wall_flags_0(:,nys-1,:) = wall_flags_0(:,nys,:)833 wall_flags_00(:,nys-1,:) = wall_flags_00(:,nys,:)993 advc_flags_1(:,nys-1,:) = advc_flags_1(:,nys,:) 994 advc_flags_2(:,nys-1,:) = advc_flags_2(:,nys,:) 834 995 ENDIF 835 996 … … 910 1071 USE indices, & 911 1072 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_max, & 912 nzt, wall_flags_01073 nzt, advc_flags_1 913 1074 914 1075 USE kinds … … 976 1137 DO k = nzb+1, nzb_max 977 1138 978 ibit5 = IBITS( wall_flags_0(k,j-1,i),5,1)979 ibit4 = IBITS( wall_flags_0(k,j-1,i),4,1)980 ibit3 = IBITS( wall_flags_0(k,j-1,i),3,1)1139 ibit5 = IBITS(advc_flags_1(k,j-1,i),5,1) 1140 ibit4 = IBITS(advc_flags_1(k,j-1,i),4,1) 1141 ibit3 = IBITS(advc_flags_1(k,j-1,i),3,1) 981 1142 982 1143 v_comp = v(k,j,i) - v_gtrans … … 1037 1198 DO k = nzb+1, nzb_max 1038 1199 1039 ibit2 = IBITS( wall_flags_0(k,j,i-1),2,1)1040 ibit1 = IBITS( wall_flags_0(k,j,i-1),1,1)1041 ibit0 = IBITS( wall_flags_0(k,j,i-1),0,1)1200 ibit2 = IBITS(advc_flags_1(k,j,i-1),2,1) 1201 ibit1 = IBITS(advc_flags_1(k,j,i-1),1,1) 1202 ibit0 = IBITS(advc_flags_1(k,j,i-1),0,1) 1042 1203 1043 1204 u_comp = u(k,j,i) - u_gtrans … … 1106 1267 !-- flux at the end. 1107 1268 1108 ibit2 = IBITS( wall_flags_0(k,j,i),2,1)1109 ibit1 = IBITS( wall_flags_0(k,j,i),1,1)1110 ibit0 = IBITS( wall_flags_0(k,j,i),0,1)1269 ibit2 = IBITS(advc_flags_1(k,j,i),2,1) 1270 ibit1 = IBITS(advc_flags_1(k,j,i),1,1) 1271 ibit0 = IBITS(advc_flags_1(k,j,i),0,1) 1111 1272 1112 1273 u_comp = u(k,j,i+1) - u_gtrans … … 1141 1302 ) 1142 1303 1143 ibit5 = IBITS( wall_flags_0(k,j,i),5,1)1144 ibit4 = IBITS( wall_flags_0(k,j,i),4,1)1145 ibit3 = IBITS( wall_flags_0(k,j,i),3,1)1304 ibit5 = IBITS(advc_flags_1(k,j,i),5,1) 1305 ibit4 = IBITS(advc_flags_1(k,j,i),4,1) 1306 ibit3 = IBITS(advc_flags_1(k,j,i),3,1) 1146 1307 1147 1308 v_comp = v(k,j+1,i) - v_gtrans … … 1178 1339 !-- k index has to be modified near bottom and top, else array 1179 1340 !-- subscripts will be exceeded. 1180 ibit8 = IBITS( wall_flags_0(k,j,i),8,1)1181 ibit7 = IBITS( wall_flags_0(k,j,i),7,1)1182 ibit6 = IBITS( wall_flags_0(k,j,i),6,1)1341 ibit8 = IBITS(advc_flags_1(k,j,i),8,1) 1342 ibit7 = IBITS(advc_flags_1(k,j,i),7,1) 1343 ibit6 = IBITS(advc_flags_1(k,j,i),6,1) 1183 1344 1184 1345 k_ppp = k + 3 * ibit8 … … 1220 1381 !-- by a not sufficient reduction of divergences near topography. 1221 1382 div = ( u(k,j,i+1) * ( ibit0 + ibit1 + ibit2 ) & 1222 - u(k,j,i) * ( IBITS( wall_flags_0(k,j,i-1),0,1) &1223 + IBITS( wall_flags_0(k,j,i-1),1,1) &1224 + IBITS( wall_flags_0(k,j,i-1),2,1) &1383 - u(k,j,i) * ( IBITS(advc_flags_1(k,j,i-1),0,1) & 1384 + IBITS(advc_flags_1(k,j,i-1),1,1) & 1385 + IBITS(advc_flags_1(k,j,i-1),2,1) & 1225 1386 ) & 1226 1387 ) * rho_air(k) * ddx & 1227 1388 + ( v(k,j+1,i) * ( ibit3 + ibit4 + ibit5 ) & 1228 - v(k,j,i) * ( IBITS( wall_flags_0(k,j-1,i),3,1) &1229 + IBITS( wall_flags_0(k,j-1,i),4,1) &1230 + IBITS( wall_flags_0(k,j-1,i),5,1) &1389 - v(k,j,i) * ( IBITS(advc_flags_1(k,j-1,i),3,1) & 1390 + IBITS(advc_flags_1(k,j-1,i),4,1) & 1391 + IBITS(advc_flags_1(k,j-1,i),5,1) & 1231 1392 ) & 1232 1393 ) * rho_air(k) * ddy & … … 1234 1395 ( ibit6 + ibit7 + ibit8 ) & 1235 1396 - w(k-1,j,i) * rho_air_zw(k-1) * & 1236 ( IBITS( wall_flags_0(k-1,j,i),6,1) &1237 + IBITS( wall_flags_0(k-1,j,i),7,1) &1238 + IBITS( wall_flags_0(k-1,j,i),8,1) &1397 ( IBITS(advc_flags_1(k-1,j,i),6,1) & 1398 + IBITS(advc_flags_1(k-1,j,i),7,1) & 1399 + IBITS(advc_flags_1(k-1,j,i),8,1) & 1239 1400 ) & 1240 1401 ) * ddzw(k) … … 1287 1448 !-- k index has to be modified near bottom and top, else array 1288 1449 !-- subscripts will be exceeded. 1289 ibit8 = IBITS( wall_flags_0(k,j,i),8,1)1290 ibit7 = IBITS( wall_flags_0(k,j,i),7,1)1291 ibit6 = IBITS( wall_flags_0(k,j,i),6,1)1450 ibit8 = IBITS(advc_flags_1(k,j,i),8,1) 1451 ibit7 = IBITS(advc_flags_1(k,j,i),7,1) 1452 ibit6 = IBITS(advc_flags_1(k,j,i),6,1) 1292 1453 1293 1454 k_ppp = k + 3 * ibit8 … … 1450 1611 1451 1612 USE indices, & 1452 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, wall_flags_01613 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, advc_flags_1 1453 1614 1454 1615 USE kinds … … 1502 1663 DO k = nzb+1, nzb_max 1503 1664 1504 ibit14 = IBITS( wall_flags_0(k,j-1,i),14,1)1505 ibit13 = IBITS( wall_flags_0(k,j-1,i),13,1)1506 ibit12 = IBITS( wall_flags_0(k,j-1,i),12,1)1665 ibit14 = IBITS(advc_flags_1(k,j-1,i),14,1) 1666 ibit13 = IBITS(advc_flags_1(k,j-1,i),13,1) 1667 ibit12 = IBITS(advc_flags_1(k,j-1,i),12,1) 1507 1668 1508 1669 v_comp = v(k,j,i) + v(k,j,i-1) - gv … … 1560 1721 DO k = nzb+1, nzb_max 1561 1722 1562 ibit11 = IBITS( wall_flags_0(k,j,i-1),11,1)1563 ibit10 = IBITS( wall_flags_0(k,j,i-1),10,1)1564 ibit9 = IBITS( wall_flags_0(k,j,i-1),9,1)1723 ibit11 = IBITS(advc_flags_1(k,j,i-1),11,1) 1724 ibit10 = IBITS(advc_flags_1(k,j,i-1),10,1) 1725 ibit9 = IBITS(advc_flags_1(k,j,i-1),9,1) 1565 1726 1566 1727 u_comp_l = u(k,j,i) + u(k,j,i-1) - gu … … 1622 1783 DO k = nzb+1, nzb_max 1623 1784 1624 ibit11 = IBITS( wall_flags_0(k,j,i),11,1)1625 ibit10 = IBITS( wall_flags_0(k,j,i),10,1)1626 ibit9 = IBITS( wall_flags_0(k,j,i),9,1)1785 ibit11 = IBITS(advc_flags_1(k,j,i),11,1) 1786 ibit10 = IBITS(advc_flags_1(k,j,i),10,1) 1787 ibit9 = IBITS(advc_flags_1(k,j,i),9,1) 1627 1788 1628 1789 u_comp(k) = u(k,j,i+1) + u(k,j,i) … … 1657 1818 ) 1658 1819 1659 ibit14 = IBITS( wall_flags_0(k,j,i),14,1)1660 ibit13 = IBITS( wall_flags_0(k,j,i),13,1)1661 ibit12 = IBITS( wall_flags_0(k,j,i),12,1)1820 ibit14 = IBITS(advc_flags_1(k,j,i),14,1) 1821 ibit13 = IBITS(advc_flags_1(k,j,i),13,1) 1822 ibit12 = IBITS(advc_flags_1(k,j,i),12,1) 1662 1823 1663 1824 v_comp = v(k,j+1,i) + v(k,j+1,i-1) - gv … … 1694 1855 !-- k index has to be modified near bottom and top, else array 1695 1856 !-- subscripts will be exceeded. 1696 ibit17 = IBITS( wall_flags_0(k,j,i),17,1)1697 ibit16 = IBITS( wall_flags_0(k,j,i),16,1)1698 ibit15 = IBITS( wall_flags_0(k,j,i),15,1)1857 ibit17 = IBITS(advc_flags_1(k,j,i),17,1) 1858 ibit16 = IBITS(advc_flags_1(k,j,i),16,1) 1859 ibit15 = IBITS(advc_flags_1(k,j,i),15,1) 1699 1860 1700 1861 k_ppp = k + 3 * ibit17 … … 1738 1899 div = ( ( u_comp(k) * ( ibit9 + ibit10 + ibit11 ) & 1739 1900 - ( u(k,j,i) + u(k,j,i-1) ) & 1740 * ( IBITS( wall_flags_0(k,j,i-1),9,1) &1741 + IBITS( wall_flags_0(k,j,i-1),10,1) &1742 + IBITS( wall_flags_0(k,j,i-1),11,1) &1901 * ( IBITS(advc_flags_1(k,j,i-1),9,1) & 1902 + IBITS(advc_flags_1(k,j,i-1),10,1) & 1903 + IBITS(advc_flags_1(k,j,i-1),11,1) & 1743 1904 ) & 1744 1905 ) * rho_air(k) * ddx & 1745 1906 + ( ( v_comp + gv ) * ( ibit12 + ibit13 + ibit14 ) & 1746 1907 - ( v(k,j,i) + v(k,j,i-1 ) ) & 1747 * ( IBITS( wall_flags_0(k,j-1,i),12,1) &1748 + IBITS( wall_flags_0(k,j-1,i),13,1) &1749 + IBITS( wall_flags_0(k,j-1,i),14,1) &1908 * ( IBITS(advc_flags_1(k,j-1,i),12,1) & 1909 + IBITS(advc_flags_1(k,j-1,i),13,1) & 1910 + IBITS(advc_flags_1(k,j-1,i),14,1) & 1750 1911 ) & 1751 1912 ) * rho_air(k) * ddy & 1752 1913 + ( w_comp * rho_air_zw(k) * ( ibit15 + ibit16 + ibit17 ) & 1753 1914 - ( w(k-1,j,i) + w(k-1,j,i-1) ) * rho_air_zw(k-1) & 1754 * ( IBITS( wall_flags_0(k-1,j,i),15,1) &1755 + IBITS( wall_flags_0(k-1,j,i),16,1) &1756 + IBITS( wall_flags_0(k-1,j,i),17,1) &1915 * ( IBITS(advc_flags_1(k-1,j,i),15,1) & 1916 + IBITS(advc_flags_1(k-1,j,i),16,1) & 1917 + IBITS(advc_flags_1(k-1,j,i),17,1) & 1757 1918 ) & 1758 1919 ) * ddzw(k) & … … 1823 1984 !-- k index has to be modified near bottom and top, else array 1824 1985 !-- subscripts will be exceeded. 1825 ibit17 = IBITS( wall_flags_0(k,j,i),17,1)1826 ibit16 = IBITS( wall_flags_0(k,j,i),16,1)1827 ibit15 = IBITS( wall_flags_0(k,j,i),15,1)1986 ibit17 = IBITS(advc_flags_1(k,j,i),17,1) 1987 ibit16 = IBITS(advc_flags_1(k,j,i),16,1) 1988 ibit15 = IBITS(advc_flags_1(k,j,i),15,1) 1828 1989 1829 1990 k_ppp = k + 3 * ibit17 … … 1942 2103 1943 2104 USE indices, & 1944 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzb_max, nzt, wall_flags_02105 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzb_max, nzt, advc_flags_1 1945 2106 1946 2107 USE kinds … … 1995 2156 DO k = nzb+1, nzb_max 1996 2157 1997 ibit20 = IBITS( wall_flags_0(k,j,i-1),20,1)1998 ibit19 = IBITS( wall_flags_0(k,j,i-1),19,1)1999 ibit18 = IBITS( wall_flags_0(k,j,i-1),18,1)2158 ibit20 = IBITS(advc_flags_1(k,j,i-1),20,1) 2159 ibit19 = IBITS(advc_flags_1(k,j,i-1),19,1) 2160 ibit18 = IBITS(advc_flags_1(k,j,i-1),18,1) 2000 2161 2001 2162 u_comp = u(k,j-1,i) + u(k,j,i) - gu … … 2053 2214 DO k = nzb+1, nzb_max 2054 2215 2055 ibit23 = IBITS( wall_flags_0(k,j-1,i),23,1)2056 ibit22 = IBITS( wall_flags_0(k,j-1,i),22,1)2057 ibit21 = IBITS( wall_flags_0(k,j-1,i),21,1)2216 ibit23 = IBITS(advc_flags_1(k,j-1,i),23,1) 2217 ibit22 = IBITS(advc_flags_1(k,j-1,i),22,1) 2218 ibit21 = IBITS(advc_flags_1(k,j-1,i),21,1) 2058 2219 2059 2220 v_comp_l = v(k,j,i) + v(k,j-1,i) - gv … … 2115 2276 DO k = nzb+1, nzb_max 2116 2277 2117 ibit20 = IBITS( wall_flags_0(k,j,i),20,1)2118 ibit19 = IBITS( wall_flags_0(k,j,i),19,1)2119 ibit18 = IBITS( wall_flags_0(k,j,i),18,1)2278 ibit20 = IBITS(advc_flags_1(k,j,i),20,1) 2279 ibit19 = IBITS(advc_flags_1(k,j,i),19,1) 2280 ibit18 = IBITS(advc_flags_1(k,j,i),18,1) 2120 2281 2121 2282 u_comp = u(k,j-1,i+1) + u(k,j,i+1) - gu … … 2150 2311 ) 2151 2312 2152 ibit23 = IBITS( wall_flags_0(k,j,i),23,1)2153 ibit22 = IBITS( wall_flags_0(k,j,i),22,1)2154 ibit21 = IBITS( wall_flags_0(k,j,i),21,1)2313 ibit23 = IBITS(advc_flags_1(k,j,i),23,1) 2314 ibit22 = IBITS(advc_flags_1(k,j,i),22,1) 2315 ibit21 = IBITS(advc_flags_1(k,j,i),21,1) 2155 2316 2156 2317 … … 2188 2349 !-- k index has to be modified near bottom and top, else array 2189 2350 !-- subscripts will be exceeded. 2190 ibit26 = IBITS( wall_flags_0(k,j,i),26,1)2191 ibit25 = IBITS( wall_flags_0(k,j,i),25,1)2192 ibit24 = IBITS( wall_flags_0(k,j,i),24,1)2351 ibit26 = IBITS(advc_flags_1(k,j,i),26,1) 2352 ibit25 = IBITS(advc_flags_1(k,j,i),25,1) 2353 ibit24 = IBITS(advc_flags_1(k,j,i),24,1) 2193 2354 2194 2355 k_ppp = k + 3 * ibit26 … … 2233 2394 * ( ibit18 + ibit19 + ibit20 ) & 2234 2395 - ( u(k,j-1,i) + u(k,j,i) ) & 2235 * ( IBITS( wall_flags_0(k,j,i-1),18,1) &2236 + IBITS( wall_flags_0(k,j,i-1),19,1) &2237 + IBITS( wall_flags_0(k,j,i-1),20,1) &2396 * ( IBITS(advc_flags_1(k,j,i-1),18,1) & 2397 + IBITS(advc_flags_1(k,j,i-1),19,1) & 2398 + IBITS(advc_flags_1(k,j,i-1),20,1) & 2238 2399 ) & 2239 2400 ) * rho_air(k) * ddx & … … 2241 2402 * ( ibit21 + ibit22 + ibit23 ) & 2242 2403 - ( v(k,j,i) + v(k,j-1,i) ) & 2243 * ( IBITS( wall_flags_0(k,j-1,i),21,1) &2244 + IBITS( wall_flags_0(k,j-1,i),22,1) &2245 + IBITS( wall_flags_0(k,j-1,i),23,1) &2404 * ( IBITS(advc_flags_1(k,j-1,i),21,1) & 2405 + IBITS(advc_flags_1(k,j-1,i),22,1) & 2406 + IBITS(advc_flags_1(k,j-1,i),23,1) & 2246 2407 ) & 2247 2408 ) * rho_air(k) * ddy & 2248 2409 + ( w_comp * rho_air_zw(k) * ( ibit24 + ibit25 + ibit26 ) & 2249 2410 - ( w(k-1,j-1,i) + w(k-1,j,i) ) * rho_air_zw(k-1) & 2250 * ( IBITS( wall_flags_0(k-1,j,i),24,1) &2251 + IBITS( wall_flags_0(k-1,j,i),25,1) &2252 + IBITS( wall_flags_0(k-1,j,i),26,1) &2411 * ( IBITS(advc_flags_1(k-1,j,i),24,1) & 2412 + IBITS(advc_flags_1(k-1,j,i),25,1) & 2413 + IBITS(advc_flags_1(k-1,j,i),26,1) & 2253 2414 ) & 2254 2415 ) * ddzw(k) & … … 2324 2485 !-- k index has to be modified near bottom and top, else array 2325 2486 !-- subscripts will be exceeded. 2326 ibit26 = IBITS( wall_flags_0(k,j,i),26,1)2327 ibit25 = IBITS( wall_flags_0(k,j,i),25,1)2328 ibit24 = IBITS( wall_flags_0(k,j,i),24,1)2487 ibit26 = IBITS(advc_flags_1(k,j,i),26,1) 2488 ibit25 = IBITS(advc_flags_1(k,j,i),25,1) 2489 ibit24 = IBITS(advc_flags_1(k,j,i),24,1) 2329 2490 2330 2491 k_ppp = k + 3 * ibit26 … … 2443 2604 2444 2605 USE indices, & 2445 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, wall_flags_0, &2446 wall_flags_002606 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, advc_flags_1, & 2607 advc_flags_2 2447 2608 2448 2609 USE kinds … … 2495 2656 2496 2657 DO k = nzb+1, nzb_max 2497 ibit32 = IBITS( wall_flags_00(k,j-1,i),0,1)2498 ibit31 = IBITS( wall_flags_0(k,j-1,i),31,1)2499 ibit30 = IBITS( wall_flags_0(k,j-1,i),30,1)2658 ibit32 = IBITS(advc_flags_2(k,j-1,i),0,1) 2659 ibit31 = IBITS(advc_flags_1(k,j-1,i),31,1) 2660 ibit30 = IBITS(advc_flags_1(k,j-1,i),30,1) 2500 2661 2501 2662 v_comp = v(k+1,j,i) + v(k,j,i) - gv … … 2553 2714 DO k = nzb+1, nzb_max 2554 2715 2555 ibit29 = IBITS( wall_flags_0(k,j,i-1),29,1)2556 ibit28 = IBITS( wall_flags_0(k,j,i-1),28,1)2557 ibit27 = IBITS( wall_flags_0(k,j,i-1),27,1)2716 ibit29 = IBITS(advc_flags_1(k,j,i-1),29,1) 2717 ibit28 = IBITS(advc_flags_1(k,j,i-1),28,1) 2718 ibit27 = IBITS(advc_flags_1(k,j,i-1),27,1) 2558 2719 2559 2720 u_comp = u(k+1,j,i) + u(k,j,i) - gu … … 2608 2769 !-- The lower flux has to be calculated explicetely for the tendency at 2609 2770 !-- the first w-level. For topography wall this is done implicitely by 2610 !-- wall_flags_0.2771 !-- advc_flags_1. 2611 2772 k = nzb + 1 2612 2773 w_comp = w(k,j,i) + w(k-1,j,i) … … 2620 2781 DO k = nzb+1, nzb_max 2621 2782 2622 ibit29 = IBITS( wall_flags_0(k,j,i),29,1)2623 ibit28 = IBITS( wall_flags_0(k,j,i),28,1)2624 ibit27 = IBITS( wall_flags_0(k,j,i),27,1)2783 ibit29 = IBITS(advc_flags_1(k,j,i),29,1) 2784 ibit28 = IBITS(advc_flags_1(k,j,i),28,1) 2785 ibit27 = IBITS(advc_flags_1(k,j,i),27,1) 2625 2786 2626 2787 u_comp = u(k+1,j,i+1) + u(k,j,i+1) - gu … … 2655 2816 ) 2656 2817 2657 ibit32 = IBITS( wall_flags_00(k,j,i),0,1)2658 ibit31 = IBITS( wall_flags_0(k,j,i),31,1)2659 ibit30 = IBITS( wall_flags_0(k,j,i),30,1)2818 ibit32 = IBITS(advc_flags_2(k,j,i),0,1) 2819 ibit31 = IBITS(advc_flags_1(k,j,i),31,1) 2820 ibit30 = IBITS(advc_flags_1(k,j,i),30,1) 2660 2821 2661 2822 v_comp = v(k+1,j+1,i) + v(k,j+1,i) - gv … … 2692 2853 !-- k index has to be modified near bottom and top, else array 2693 2854 !-- subscripts will be exceeded. 2694 ibit35 = IBITS( wall_flags_00(k,j,i),3,1)2695 ibit34 = IBITS( wall_flags_00(k,j,i),2,1)2696 ibit33 = IBITS( wall_flags_00(k,j,i),1,1)2855 ibit35 = IBITS(advc_flags_2(k,j,i),3,1) 2856 ibit34 = IBITS(advc_flags_2(k,j,i),2,1) 2857 ibit33 = IBITS(advc_flags_2(k,j,i),1,1) 2697 2858 2698 2859 k_ppp = k + 3 * ibit35 … … 2737 2898 div = ( ( ( u_comp + gu ) * ( ibit27 + ibit28 + ibit29 ) & 2738 2899 - ( u(k+1,j,i) + u(k,j,i) ) & 2739 * ( IBITS( wall_flags_0(k,j,i-1),27,1) &2740 + IBITS( wall_flags_0(k,j,i-1),28,1) &2741 + IBITS( wall_flags_0(k,j,i-1),29,1) &2900 * ( IBITS(advc_flags_1(k,j,i-1),27,1) & 2901 + IBITS(advc_flags_1(k,j,i-1),28,1) & 2902 + IBITS(advc_flags_1(k,j,i-1),29,1) & 2742 2903 ) & 2743 2904 ) * rho_air_zw(k) * ddx & 2744 2905 + ( ( v_comp + gv ) * ( ibit30 + ibit31 + ibit32 ) & 2745 2906 - ( v(k+1,j,i) + v(k,j,i) ) & 2746 * ( IBITS( wall_flags_0(k,j-1,i),30,1) &2747 + IBITS( wall_flags_0(k,j-1,i),31,1) &2748 + IBITS( wall_flags_00(k,j-1,i),0,1)&2907 * ( IBITS(advc_flags_1(k,j-1,i),30,1) & 2908 + IBITS(advc_flags_1(k,j-1,i),31,1) & 2909 + IBITS(advc_flags_2(k,j-1,i),0,1) & 2749 2910 ) & 2750 2911 ) * rho_air_zw(k) * ddy & 2751 2912 + ( w_comp * rho_air(k+1) * ( ibit33 + ibit34 + ibit35 ) & 2752 2913 - ( w(k,j,i) + w(k-1,j,i) ) * rho_air(k) & 2753 * ( IBITS( wall_flags_00(k-1,j,i),1,1)&2754 + IBITS( wall_flags_00(k-1,j,i),2,1)&2755 + IBITS( wall_flags_00(k-1,j,i),3,1)&2914 * ( IBITS(advc_flags_2(k-1,j,i),1,1) & 2915 + IBITS(advc_flags_2(k-1,j,i),2,1) & 2916 + IBITS(advc_flags_2(k-1,j,i),3,1) & 2756 2917 ) & 2757 2918 ) * ddzu(k+1) & … … 2814 2975 !-- k index has to be modified near bottom and top, else array 2815 2976 !-- subscripts will be exceeded. 2816 ibit35 = IBITS( wall_flags_00(k,j,i),3,1)2817 ibit34 = IBITS( wall_flags_00(k,j,i),2,1)2818 ibit33 = IBITS( wall_flags_00(k,j,i),1,1)2977 ibit35 = IBITS(advc_flags_2(k,j,i),3,1) 2978 ibit34 = IBITS(advc_flags_2(k,j,i),2,1) 2979 ibit33 = IBITS(advc_flags_2(k,j,i),1,1) 2819 2980 2820 2981 k_ppp = k + 3 * ibit35 … … 2919 3080 USE indices, & 2920 3081 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_max, & 2921 nzt, wall_flags_03082 nzt, advc_flags_1 2922 3083 2923 3084 USE kinds … … 2983 3144 DO k = nzb+1, nzb_max 2984 3145 2985 ibit2 = IBITS( wall_flags_0(k,j,i-1),2,1)2986 ibit1 = IBITS( wall_flags_0(k,j,i-1),1,1)2987 ibit0 = IBITS( wall_flags_0(k,j,i-1),0,1)3146 ibit2 = IBITS(advc_flags_1(k,j,i-1),2,1) 3147 ibit1 = IBITS(advc_flags_1(k,j,i-1),1,1) 3148 ibit0 = IBITS(advc_flags_1(k,j,i-1),0,1) 2988 3149 2989 3150 u_comp = u(k,j,i) - u_gtrans … … 3044 3205 DO k = nzb+1, nzb_max 3045 3206 3046 ibit5 = IBITS( wall_flags_0(k,j-1,i),5,1)3047 ibit4 = IBITS( wall_flags_0(k,j-1,i),4,1)3048 ibit3 = IBITS( wall_flags_0(k,j-1,i),3,1)3207 ibit5 = IBITS(advc_flags_1(k,j-1,i),5,1) 3208 ibit4 = IBITS(advc_flags_1(k,j-1,i),4,1) 3209 ibit3 = IBITS(advc_flags_1(k,j-1,i),3,1) 3049 3210 3050 3211 v_comp = v(k,j,i) - v_gtrans … … 3107 3268 DO k = nzb+1, nzb_max 3108 3269 3109 ibit2 = IBITS( wall_flags_0(k,j,i),2,1)3110 ibit1 = IBITS( wall_flags_0(k,j,i),1,1)3111 ibit0 = IBITS( wall_flags_0(k,j,i),0,1)3270 ibit2 = IBITS(advc_flags_1(k,j,i),2,1) 3271 ibit1 = IBITS(advc_flags_1(k,j,i),1,1) 3272 ibit0 = IBITS(advc_flags_1(k,j,i),0,1) 3112 3273 3113 3274 u_comp = u(k,j,i+1) - u_gtrans … … 3142 3303 ) 3143 3304 3144 ibit5 = IBITS( wall_flags_0(k,j,i),5,1)3145 ibit4 = IBITS( wall_flags_0(k,j,i),4,1)3146 ibit3 = IBITS( wall_flags_0(k,j,i),3,1)3305 ibit5 = IBITS(advc_flags_1(k,j,i),5,1) 3306 ibit4 = IBITS(advc_flags_1(k,j,i),4,1) 3307 ibit3 = IBITS(advc_flags_1(k,j,i),3,1) 3147 3308 3148 3309 v_comp = v(k,j+1,i) - v_gtrans … … 3179 3340 !-- k index has to be modified near bottom and top, else array 3180 3341 !-- subscripts will be exceeded. 3181 ibit8 = IBITS( wall_flags_0(k,j,i),8,1)3182 ibit7 = IBITS( wall_flags_0(k,j,i),7,1)3183 ibit6 = IBITS( wall_flags_0(k,j,i),6,1)3342 ibit8 = IBITS(advc_flags_1(k,j,i),8,1) 3343 ibit7 = IBITS(advc_flags_1(k,j,i),7,1) 3344 ibit6 = IBITS(advc_flags_1(k,j,i),6,1) 3184 3345 3185 3346 k_ppp = k + 3 * ibit8 … … 3221 3382 !-- by a not sufficient reduction of divergences near topography. 3222 3383 div = ( u(k,j,i+1) * ( ibit0 + ibit1 + ibit2 ) & 3223 - u(k,j,i) * ( IBITS( wall_flags_0(k,j,i-1),0,1) &3224 + IBITS( wall_flags_0(k,j,i-1),1,1) &3225 + IBITS( wall_flags_0(k,j,i-1),2,1) &3384 - u(k,j,i) * ( IBITS(advc_flags_1(k,j,i-1),0,1) & 3385 + IBITS(advc_flags_1(k,j,i-1),1,1) & 3386 + IBITS(advc_flags_1(k,j,i-1),2,1) & 3226 3387 ) & 3227 3388 ) * rho_air(k) * ddx & 3228 3389 + ( v(k,j+1,i) * ( ibit3 + ibit4 + ibit5 ) & 3229 - v(k,j,i) * ( IBITS( wall_flags_0(k,j-1,i),3,1) &3230 + IBITS( wall_flags_0(k,j-1,i),4,1) &3231 + IBITS( wall_flags_0(k,j-1,i),5,1) &3390 - v(k,j,i) * ( IBITS(advc_flags_1(k,j-1,i),3,1) & 3391 + IBITS(advc_flags_1(k,j-1,i),4,1) & 3392 + IBITS(advc_flags_1(k,j-1,i),5,1) & 3232 3393 ) & 3233 3394 ) * rho_air(k) * ddy & … … 3235 3396 ( ibit6 + ibit7 + ibit8 ) & 3236 3397 - w(k-1,j,i) * rho_air_zw(k-1) * & 3237 ( IBITS( wall_flags_0(k-1,j,i),6,1) &3238 + IBITS( wall_flags_0(k-1,j,i),7,1) &3239 + IBITS( wall_flags_0(k-1,j,i),8,1) &3398 ( IBITS(advc_flags_1(k-1,j,i),6,1) & 3399 + IBITS(advc_flags_1(k-1,j,i),7,1) & 3400 + IBITS(advc_flags_1(k-1,j,i),8,1) & 3240 3401 ) & 3241 3402 ) * ddzw(k) … … 3285 3446 !-- k index has to be modified near bottom and top, else array 3286 3447 !-- subscripts will be exceeded. 3287 ibit8 = IBITS( wall_flags_0(k,j,i),8,1)3288 ibit7 = IBITS( wall_flags_0(k,j,i),7,1)3289 ibit6 = IBITS( wall_flags_0(k,j,i),6,1)3448 ibit8 = IBITS(advc_flags_1(k,j,i),8,1) 3449 ibit7 = IBITS(advc_flags_1(k,j,i),7,1) 3450 ibit6 = IBITS(advc_flags_1(k,j,i),6,1) 3290 3451 3291 3452 k_ppp = k + 3 * ibit8 … … 3429 3590 3430 3591 3431 3432 3592 !------------------------------------------------------------------------------! 3433 3593 ! Description: … … 3450 3610 3451 3611 USE indices, & 3452 ONLY: nxl, nxlu, nxr, nyn, nys, nzb, nzb_max, nzt, wall_flags_03612 ONLY: nxl, nxlu, nxr, nyn, nys, nzb, nzb_max, nzt, advc_flags_1 3453 3613 3454 3614 USE kinds … … 3507 3667 DO k = nzb+1, nzb_max 3508 3668 3509 ibit11 = IBITS( wall_flags_0(k,j,i-1),11,1)3510 ibit10 = IBITS( wall_flags_0(k,j,i-1),10,1)3511 ibit9 = IBITS( wall_flags_0(k,j,i-1),9,1)3669 ibit11 = IBITS(advc_flags_1(k,j,i-1),11,1) 3670 ibit10 = IBITS(advc_flags_1(k,j,i-1),10,1) 3671 ibit9 = IBITS(advc_flags_1(k,j,i-1),9,1) 3512 3672 3513 3673 u_comp(k) = u(k,j,i) + u(k,j,i-1) - gu … … 3565 3725 DO k = nzb+1, nzb_max 3566 3726 3567 ibit14 = IBITS( wall_flags_0(k,j-1,i),14,1)3568 ibit13 = IBITS( wall_flags_0(k,j-1,i),13,1)3569 ibit12 = IBITS( wall_flags_0(k,j-1,i),12,1)3727 ibit14 = IBITS(advc_flags_1(k,j-1,i),14,1) 3728 ibit13 = IBITS(advc_flags_1(k,j-1,i),13,1) 3729 ibit12 = IBITS(advc_flags_1(k,j-1,i),12,1) 3570 3730 3571 3731 v_comp = v(k,j,i) + v(k,j,i-1) - gv … … 3626 3786 DO k = nzb+1, nzb_max 3627 3787 3628 ibit11 = IBITS( wall_flags_0(k,j,i),11,1)3629 ibit10 = IBITS( wall_flags_0(k,j,i),10,1)3630 ibit9 = IBITS( wall_flags_0(k,j,i),9,1)3788 ibit11 = IBITS(advc_flags_1(k,j,i),11,1) 3789 ibit10 = IBITS(advc_flags_1(k,j,i),10,1) 3790 ibit9 = IBITS(advc_flags_1(k,j,i),9,1) 3631 3791 3632 3792 u_comp(k) = u(k,j,i+1) + u(k,j,i) … … 3661 3821 ) 3662 3822 3663 ibit14 = IBITS( wall_flags_0(k,j,i),14,1)3664 ibit13 = IBITS( wall_flags_0(k,j,i),13,1)3665 ibit12 = IBITS( wall_flags_0(k,j,i),12,1)3823 ibit14 = IBITS(advc_flags_1(k,j,i),14,1) 3824 ibit13 = IBITS(advc_flags_1(k,j,i),13,1) 3825 ibit12 = IBITS(advc_flags_1(k,j,i),12,1) 3666 3826 3667 3827 v_comp = v(k,j+1,i) + v(k,j+1,i-1) - gv … … 3698 3858 !-- k index has to be modified near bottom and top, else array 3699 3859 !-- subscripts will be exceeded. 3700 ibit17 = IBITS( wall_flags_0(k,j,i),17,1)3701 ibit16 = IBITS( wall_flags_0(k,j,i),16,1)3702 ibit15 = IBITS( wall_flags_0(k,j,i),15,1)3860 ibit17 = IBITS(advc_flags_1(k,j,i),17,1) 3861 ibit16 = IBITS(advc_flags_1(k,j,i),16,1) 3862 ibit15 = IBITS(advc_flags_1(k,j,i),15,1) 3703 3863 3704 3864 k_ppp = k + 3 * ibit17 … … 3742 3902 div = ( ( u_comp(k) * ( ibit9 + ibit10 + ibit11 ) & 3743 3903 - ( u(k,j,i) + u(k,j,i-1) ) & 3744 * ( IBITS( wall_flags_0(k,j,i-1),9,1) &3745 + IBITS( wall_flags_0(k,j,i-1),10,1) &3746 + IBITS( wall_flags_0(k,j,i-1),11,1) &3904 * ( IBITS(advc_flags_1(k,j,i-1),9,1) & 3905 + IBITS(advc_flags_1(k,j,i-1),10,1) & 3906 + IBITS(advc_flags_1(k,j,i-1),11,1) & 3747 3907 ) & 3748 3908 ) * rho_air(k) * ddx & 3749 3909 + ( ( v_comp + gv ) * ( ibit12 + ibit13 + ibit14 ) & 3750 3910 - ( v(k,j,i) + v(k,j,i-1 ) ) & 3751 * ( IBITS( wall_flags_0(k,j-1,i),12,1) &3752 + IBITS( wall_flags_0(k,j-1,i),13,1) &3753 + IBITS( wall_flags_0(k,j-1,i),14,1) &3911 * ( IBITS(advc_flags_1(k,j-1,i),12,1) & 3912 + IBITS(advc_flags_1(k,j-1,i),13,1) & 3913 + IBITS(advc_flags_1(k,j-1,i),14,1) & 3754 3914 ) & 3755 3915 ) * rho_air(k) * ddy & 3756 3916 + ( w_comp * rho_air_zw(k) * ( ibit15 + ibit16 + ibit17 ) & 3757 3917 - ( w(k-1,j,i) + w(k-1,j,i-1) ) * rho_air_zw(k-1) & 3758 * ( IBITS( wall_flags_0(k-1,j,i),15,1) &3759 + IBITS( wall_flags_0(k-1,j,i),16,1) &3760 + IBITS( wall_flags_0(k-1,j,i),17,1) &3918 * ( IBITS(advc_flags_1(k-1,j,i),15,1) & 3919 + IBITS(advc_flags_1(k-1,j,i),16,1) & 3920 + IBITS(advc_flags_1(k-1,j,i),17,1) & 3761 3921 ) & 3762 3922 ) * ddzw(k) & … … 3829 3989 !-- k index has to be modified near bottom and top, else array 3830 3990 !-- subscripts will be exceeded. 3831 ibit17 = IBITS( wall_flags_0(k,j,i),17,1)3832 ibit16 = IBITS( wall_flags_0(k,j,i),16,1)3833 ibit15 = IBITS( wall_flags_0(k,j,i),15,1)3991 ibit17 = IBITS(advc_flags_1(k,j,i),17,1) 3992 ibit16 = IBITS(advc_flags_1(k,j,i),16,1) 3993 ibit15 = IBITS(advc_flags_1(k,j,i),15,1) 3834 3994 3835 3995 k_ppp = k + 3 * ibit17 … … 3925 4085 END SUBROUTINE advec_u_ws 3926 4086 3927 4087 3928 4088 !------------------------------------------------------------------------------! 3929 4089 ! Description: … … 3946 4106 3947 4107 USE indices, & 3948 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzb_max, nzt, wall_flags_04108 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzb_max, nzt, advc_flags_1 3949 4109 3950 4110 USE kinds … … 4003 4163 DO k = nzb+1, nzb_max 4004 4164 4005 ibit20 = IBITS( wall_flags_0(k,j,i-1),20,1)4006 ibit19 = IBITS( wall_flags_0(k,j,i-1),19,1)4007 ibit18 = IBITS( wall_flags_0(k,j,i-1),18,1)4165 ibit20 = IBITS(advc_flags_1(k,j,i-1),20,1) 4166 ibit19 = IBITS(advc_flags_1(k,j,i-1),19,1) 4167 ibit18 = IBITS(advc_flags_1(k,j,i-1),18,1) 4008 4168 4009 4169 u_comp = u(k,j-1,i) + u(k,j,i) - gu … … 4061 4221 DO k = nzb+1, nzb_max 4062 4222 4063 ibit23 = IBITS( wall_flags_0(k,j-1,i),23,1)4064 ibit22 = IBITS( wall_flags_0(k,j-1,i),22,1)4065 ibit21 = IBITS( wall_flags_0(k,j-1,i),21,1)4223 ibit23 = IBITS(advc_flags_1(k,j-1,i),23,1) 4224 ibit22 = IBITS(advc_flags_1(k,j-1,i),22,1) 4225 ibit21 = IBITS(advc_flags_1(k,j-1,i),21,1) 4066 4226 4067 4227 v_comp(k) = v(k,j,i) + v(k,j-1,i) - gv … … 4121 4281 DO k = nzb+1, nzb_max 4122 4282 4123 ibit20 = IBITS( wall_flags_0(k,j,i),20,1)4124 ibit19 = IBITS( wall_flags_0(k,j,i),19,1)4125 ibit18 = IBITS( wall_flags_0(k,j,i),18,1)4283 ibit20 = IBITS(advc_flags_1(k,j,i),20,1) 4284 ibit19 = IBITS(advc_flags_1(k,j,i),19,1) 4285 ibit18 = IBITS(advc_flags_1(k,j,i),18,1) 4126 4286 4127 4287 u_comp = u(k,j-1,i+1) + u(k,j,i+1) - gu … … 4156 4316 ) 4157 4317 4158 ibit23 = IBITS( wall_flags_0(k,j,i),23,1)4159 ibit22 = IBITS( wall_flags_0(k,j,i),22,1)4160 ibit21 = IBITS( wall_flags_0(k,j,i),21,1)4318 ibit23 = IBITS(advc_flags_1(k,j,i),23,1) 4319 ibit22 = IBITS(advc_flags_1(k,j,i),22,1) 4320 ibit21 = IBITS(advc_flags_1(k,j,i),21,1) 4161 4321 4162 4322 v_comp(k) = v(k,j+1,i) + v(k,j,i) … … 4193 4353 !-- k index has to be modified near bottom and top, else array 4194 4354 !-- subscripts will be exceeded. 4195 ibit26 = IBITS( wall_flags_0(k,j,i),26,1)4196 ibit25 = IBITS( wall_flags_0(k,j,i),25,1)4197 ibit24 = IBITS( wall_flags_0(k,j,i),24,1)4355 ibit26 = IBITS(advc_flags_1(k,j,i),26,1) 4356 ibit25 = IBITS(advc_flags_1(k,j,i),25,1) 4357 ibit24 = IBITS(advc_flags_1(k,j,i),24,1) 4198 4358 4199 4359 k_ppp = k + 3 * ibit26 … … 4238 4398 * ( ibit18 + ibit19 + ibit20 ) & 4239 4399 - ( u(k,j-1,i) + u(k,j,i) ) & 4240 * ( IBITS( wall_flags_0(k,j,i-1),18,1) &4241 + IBITS( wall_flags_0(k,j,i-1),19,1) &4242 + IBITS( wall_flags_0(k,j,i-1),20,1) &4400 * ( IBITS(advc_flags_1(k,j,i-1),18,1) & 4401 + IBITS(advc_flags_1(k,j,i-1),19,1) & 4402 + IBITS(advc_flags_1(k,j,i-1),20,1) & 4243 4403 ) & 4244 4404 ) * rho_air(k) * ddx & … … 4246 4406 * ( ibit21 + ibit22 + ibit23 ) & 4247 4407 - ( v(k,j,i) + v(k,j-1,i) ) & 4248 * ( IBITS( wall_flags_0(k,j-1,i),21,1) &4249 + IBITS( wall_flags_0(k,j-1,i),22,1) &4250 + IBITS( wall_flags_0(k,j-1,i),23,1) &4408 * ( IBITS(advc_flags_1(k,j-1,i),21,1) & 4409 + IBITS(advc_flags_1(k,j-1,i),22,1) & 4410 + IBITS(advc_flags_1(k,j-1,i),23,1) & 4251 4411 ) & 4252 4412 ) * rho_air(k) * ddy & … … 4254 4414 * ( ibit24 + ibit25 + ibit26 ) & 4255 4415 - ( w(k-1,j-1,i) + w(k-1,j,i) ) * rho_air_zw(k-1) & 4256 * ( IBITS( wall_flags_0(k-1,j,i),24,1) &4257 + IBITS( wall_flags_0(k-1,j,i),25,1) &4258 + IBITS( wall_flags_0(k-1,j,i),26,1) &4416 * ( IBITS(advc_flags_1(k-1,j,i),24,1) & 4417 + IBITS(advc_flags_1(k-1,j,i),25,1) & 4418 + IBITS(advc_flags_1(k-1,j,i),26,1) & 4259 4419 ) & 4260 4420 ) * ddzw(k) & … … 4332 4492 !-- k index has to be modified near bottom and top, else array 4333 4493 !-- subscripts will be exceeded. 4334 ibit26 = IBITS( wall_flags_0(k,j,i),26,1)4335 ibit25 = IBITS( wall_flags_0(k,j,i),25,1)4336 ibit24 = IBITS( wall_flags_0(k,j,i),24,1)4494 ibit26 = IBITS(advc_flags_1(k,j,i),26,1) 4495 ibit25 = IBITS(advc_flags_1(k,j,i),25,1) 4496 ibit24 = IBITS(advc_flags_1(k,j,i),24,1) 4337 4497 4338 4498 k_ppp = k + 3 * ibit26 … … 4433 4593 4434 4594 4435 4436 4437 4595 !------------------------------------------------------------------------------! 4438 4596 ! Description: … … 4455 4613 4456 4614 USE indices, & 4457 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, wall_flags_0, &4458 wall_flags_004615 ONLY: nxl, nxr, nyn, nys, nzb, nzb_max, nzt, advc_flags_1, & 4616 advc_flags_2 4459 4617 4460 4618 USE kinds … … 4512 4670 DO k = nzb+1, nzb_max 4513 4671 4514 ibit29 = IBITS( wall_flags_0(k,j,i-1),29,1)4515 ibit28 = IBITS( wall_flags_0(k,j,i-1),28,1)4516 ibit27 = IBITS( wall_flags_0(k,j,i-1),27,1)4672 ibit29 = IBITS(advc_flags_1(k,j,i-1),29,1) 4673 ibit28 = IBITS(advc_flags_1(k,j,i-1),28,1) 4674 ibit27 = IBITS(advc_flags_1(k,j,i-1),27,1) 4517 4675 4518 4676 u_comp = u(k+1,j,i) + u(k,j,i) - gu … … 4570 4728 DO k = nzb+1, nzb_max 4571 4729 4572 ibit32 = IBITS( wall_flags_00(k,j-1,i),0,1)4573 ibit31 = IBITS( wall_flags_0(k,j-1,i),31,1)4574 ibit30 = IBITS( wall_flags_0(k,j-1,i),30,1)4730 ibit32 = IBITS(advc_flags_2(k,j-1,i),0,1) 4731 ibit31 = IBITS(advc_flags_1(k,j-1,i),31,1) 4732 ibit30 = IBITS(advc_flags_1(k,j-1,i),30,1) 4575 4733 4576 4734 v_comp = v(k+1,j,i) + v(k,j,i) - gv … … 4626 4784 !-- The lower flux has to be calculated explicetely for the tendency 4627 4785 !-- at the first w-level. For topography wall this is done implicitely 4628 !-- by wall_flags_0.4786 !-- by advc_flags_1. 4629 4787 k = nzb + 1 4630 4788 w_comp = w(k,j,i) + w(k-1,j,i) … … 4636 4794 DO k = nzb+1, nzb_max 4637 4795 4638 ibit29 = IBITS( wall_flags_0(k,j,i),29,1)4639 ibit28 = IBITS( wall_flags_0(k,j,i),28,1)4640 ibit27 = IBITS( wall_flags_0(k,j,i),27,1)4796 ibit29 = IBITS(advc_flags_1(k,j,i),29,1) 4797 ibit28 = IBITS(advc_flags_1(k,j,i),28,1) 4798 ibit27 = IBITS(advc_flags_1(k,j,i),27,1) 4641 4799 4642 4800 u_comp = u(k+1,j,i+1) + u(k,j,i+1) - gu … … 4671 4829 ) 4672 4830 4673 ibit32 = IBITS( wall_flags_00(k,j,i),0,1)4674 ibit31 = IBITS( wall_flags_0(k,j,i),31,1)4675 ibit30 = IBITS( wall_flags_0(k,j,i),30,1)4831 ibit32 = IBITS(advc_flags_2(k,j,i),0,1) 4832 ibit31 = IBITS(advc_flags_1(k,j,i),31,1) 4833 ibit30 = IBITS(advc_flags_1(k,j,i),30,1) 4676 4834 4677 4835 v_comp = v(k+1,j+1,i) + v(k,j+1,i) - gv … … 4708 4866 !-- k index has to be modified near bottom and top, else array 4709 4867 !-- subscripts will be exceeded. 4710 ibit35 = IBITS( wall_flags_00(k,j,i),3,1)4711 ibit34 = IBITS( wall_flags_00(k,j,i),2,1)4712 ibit33 = IBITS( wall_flags_00(k,j,i),1,1)4868 ibit35 = IBITS(advc_flags_2(k,j,i),3,1) 4869 ibit34 = IBITS(advc_flags_2(k,j,i),2,1) 4870 ibit33 = IBITS(advc_flags_2(k,j,i),1,1) 4713 4871 4714 4872 k_ppp = k + 3 * ibit35 … … 4752 4910 div = ( ( ( u_comp + gu ) * ( ibit27 + ibit28 + ibit29 ) & 4753 4911 - ( u(k+1,j,i) + u(k,j,i) ) & 4754 * ( IBITS( wall_flags_0(k,j,i-1),27,1) &4755 + IBITS( wall_flags_0(k,j,i-1),28,1) &4756 + IBITS( wall_flags_0(k,j,i-1),29,1) &4912 * ( IBITS(advc_flags_1(k,j,i-1),27,1) & 4913 + IBITS(advc_flags_1(k,j,i-1),28,1) & 4914 + IBITS(advc_flags_1(k,j,i-1),29,1) & 4757 4915 ) & 4758 4916 ) * rho_air_zw(k) * ddx & 4759 4917 + ( ( v_comp + gv ) * ( ibit30 + ibit31 + ibit32 ) & 4760 4918 - ( v(k+1,j,i) + v(k,j,i) ) & 4761 * ( IBITS( wall_flags_0(k,j-1,i),30,1) &4762 + IBITS( wall_flags_0(k,j-1,i),31,1) &4763 + IBITS( wall_flags_00(k,j-1,i),0,1)&4919 * ( IBITS(advc_flags_1(k,j-1,i),30,1) & 4920 + IBITS(advc_flags_1(k,j-1,i),31,1) & 4921 + IBITS(advc_flags_2(k,j-1,i),0,1) & 4764 4922 ) & 4765 4923 ) * rho_air_zw(k) * ddy & 4766 4924 + ( w_comp * rho_air(k+1) * ( ibit33 + ibit34 + ibit35 ) & 4767 4925 - ( w(k,j,i) + w(k-1,j,i) ) * rho_air(k) & 4768 * ( IBITS( wall_flags_00(k-1,j,i),1,1)&4769 + IBITS( wall_flags_00(k-1,j,i),2,1)&4770 + IBITS( wall_flags_00(k-1,j,i),3,1)&4926 * ( IBITS(advc_flags_2(k-1,j,i),1,1) & 4927 + IBITS(advc_flags_2(k-1,j,i),2,1) & 4928 + IBITS(advc_flags_2(k-1,j,i),3,1) & 4771 4929 ) & 4772 4930 ) * ddzu(k+1) & … … 4831 4989 !-- k index has to be modified near bottom and top, else array 4832 4990 !-- subscripts will be exceeded. 4833 ibit35 = IBITS( wall_flags_00(k,j,i),3,1)4834 ibit34 = IBITS( wall_flags_00(k,j,i),2,1)4835 ibit33 = IBITS( wall_flags_00(k,j,i),1,1)4991 ibit35 = IBITS(advc_flags_2(k,j,i),3,1) 4992 ibit34 = IBITS(advc_flags_2(k,j,i),2,1) 4993 ibit33 = IBITS(advc_flags_2(k,j,i),1,1) 4836 4994 4837 4995 k_ppp = k + 3 * ibit35 … … 4916 5074 END SUBROUTINE advec_w_ws 4917 5075 4918 4919 5076 END MODULE advec_ws -
palm/trunk/SOURCE/average_3d_data.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new surface concept - additional ghost point exchange 23 ! of surface variable required 23 24 ! 24 25 ! Former revisions: … … 104 105 105 106 USE control_parameters, & 106 ONLY: average_count_3d, doav, doav_n, urban_surface, varnamelength 107 ONLY: average_count_3d, doav, doav_n, land_surface, urban_surface, & 108 varnamelength 107 109 108 110 USE cpulog, & … … 110 112 111 113 USE indices, & 112 ONLY: n xl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt114 ONLY: nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt 113 115 114 116 USE kinds 115 117 116 118 USE land_surface_model_mod, & 117 ONLY: l and_surface, lsm_3d_data_averaging119 ONLY: lsm_3d_data_averaging 118 120 119 121 USE radiation_model_mod, & … … 171 173 ENDDO 172 174 ENDDO 175 CALL exchange_horiz_2d( qsws_av, nbgp ) 173 176 174 177 CASE ( 'lpt' ) … … 203 206 ENDDO 204 207 ENDDO 208 CALL exchange_horiz_2d( ol_av, nbgp ) 205 209 206 210 CASE ( 'p' ) … … 354 358 ENDDO 355 359 ENDDO 360 CALL exchange_horiz_2d( shf_av, nbgp ) 356 361 357 362 CASE ( 'ssws*' ) … … 361 366 ENDDO 362 367 ENDDO 368 CALL exchange_horiz_2d( ssws_av, nbgp ) 363 369 364 370 CASE ( 't*' ) … … 368 374 ENDDO 369 375 ENDDO 376 CALL exchange_horiz_2d( ts_av, nbgp ) 370 377 371 378 CASE ( 'u' ) … … 384 391 ENDDO 385 392 ENDDO 393 CALL exchange_horiz_2d( us_av, nbgp ) 386 394 387 395 CASE ( 'v' ) … … 418 426 ENDDO 419 427 ENDDO 428 CALL exchange_horiz_2d( z0_av, nbgp ) 420 429 421 430 CASE ( 'z0h*' ) … … 425 434 ENDDO 426 435 ENDDO 436 CALL exchange_horiz_2d( z0h_av, nbgp ) 427 437 ! 428 438 !-- Block of urban surface model outputs -
palm/trunk/SOURCE/boundary_conds.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Set boundary conditions on topography top using flag method. 23 23 ! 24 24 ! Former revisions: … … 168 168 USE indices, & 169 169 ONLY: nx, nxl, nxlg, nxr, nxrg, ny, nyn, nyng, nys, nysg, & 170 nzb, nz b_s_inner, nzb_w_inner, nzt170 nzb, nzt, wall_flags_0 171 171 172 172 USE kinds … … 177 177 ONLY : nesting_mode 178 178 179 USE surface_mod, & 180 ONLY : bc_h 179 181 180 182 IMPLICIT NONE 181 183 182 INTEGER(iwp) :: i !< 183 INTEGER(iwp) :: j !< 184 INTEGER(iwp) :: k !< 184 INTEGER(iwp) :: i !< grid index x direction 185 INTEGER(iwp) :: j !< grid index y direction 186 INTEGER(iwp) :: k !< grid index z direction 187 INTEGER(iwp) :: kb !< variable to set respective boundary value, depends on facing. 188 INTEGER(iwp) :: l !< running index boundary type, for up- and downward-facing walls 189 INTEGER(iwp) :: m !< running index surface elements 185 190 186 191 REAL(wp) :: c_max !< … … 194 199 v_p(nzb,:,:) = v_p(nzb+1,:,:) 195 200 ENDIF 196 197 DO i = nxlg, nxrg 198 DO j = nysg, nyng 199 w_p(nzb_w_inner(j,i),j,i) = 0.0_wp 201 ! 202 !-- Set zero vertical velocity at topography top (l=0), or bottom (l=1) in case 203 !-- of downward-facing surfaces. 204 DO l = 0, 1 205 ! 206 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 207 !-- for downward-facing surfaces at topography bottom (k+1). 208 kb = MERGE( -1, 1, l == 0 ) 209 !$OMP PARALLEL DO PRIVATE( i, j, k ) 210 DO m = 1, bc_h(l)%ns 211 i = bc_h(l)%i(m) 212 j = bc_h(l)%j(m) 213 k = bc_h(l)%k(m) 214 w_p(k+kb,j,i) = 0.0_wp 200 215 ENDDO 201 216 ENDDO … … 216 231 217 232 ! 218 !-- Temperature at bottom boundary.233 !-- Temperature at bottom and top boundary. 219 234 !-- In case of coupled runs (ibc_pt_b = 2) the temperature is given by 220 235 !-- the sea surface temperature of the coupled ocean model. 236 !-- Dirichlet 221 237 IF ( ibc_pt_b == 0 ) THEN 222 DO i = nxlg, nxrg 223 DO j = nysg, nyng 224 pt_p(nzb_s_inner(j,i),j,i) = pt(nzb_s_inner(j,i),j,i) 238 DO l = 0, 1 239 ! 240 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 241 !-- for downward-facing surfaces at topography bottom (k+1). 242 kb = MERGE( -1, 1, l == 0 ) 243 !$OMP PARALLEL DO PRIVATE( i, j, k ) 244 DO m = 1, bc_h(l)%ns 245 i = bc_h(l)%i(m) 246 j = bc_h(l)%j(m) 247 k = bc_h(l)%k(m) 248 pt_p(k+kb,j,i) = pt(k+kb,j,i) 225 249 ENDDO 226 250 ENDDO 251 ! 252 !-- Neumann, zero-gradient 227 253 ELSEIF ( ibc_pt_b == 1 ) THEN 228 DO i = nxlg, nxrg 229 DO j = nysg, nyng 230 pt_p(nzb_s_inner(j,i),j,i) = pt_p(nzb_s_inner(j,i)+1,j,i) 254 DO l = 0, 1 255 ! 256 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 257 !-- for downward-facing surfaces at topography bottom (k+1). 258 kb = MERGE( -1, 1, l == 0 ) 259 !$OMP PARALLEL DO PRIVATE( i, j, k ) 260 DO m = 1, bc_h(l)%ns 261 i = bc_h(l)%i(m) 262 j = bc_h(l)%j(m) 263 k = bc_h(l)%k(m) 264 pt_p(k+kb,j,i) = pt_p(k,j,i) 231 265 ENDDO 232 266 ENDDO … … 253 287 !-- Generally Neumann conditions with de/dz=0 are assumed 254 288 IF ( .NOT. constant_diffusion ) THEN 255 DO i = nxlg, nxrg 256 DO j = nysg, nyng 257 e_p(nzb_s_inner(j,i),j,i) = e_p(nzb_s_inner(j,i)+1,j,i) 289 290 DO l = 0, 1 291 ! 292 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 293 !-- for downward-facing surfaces at topography bottom (k+1). 294 kb = MERGE( -1, 1, l == 0 ) 295 !$OMP PARALLEL DO PRIVATE( i, j, k ) 296 DO m = 1, bc_h(l)%ns 297 i = bc_h(l)%i(m) 298 j = bc_h(l)%j(m) 299 k = bc_h(l)%k(m) 300 e_p(k+kb,j,i) = e_p(k,j,i) 258 301 ENDDO 259 302 ENDDO 303 260 304 IF ( .NOT. nest_domain ) THEN 261 305 e_p(nzt+1,:,:) = e_p(nzt,:,:) … … 268 312 ! 269 313 !-- Bottom boundary: Neumann condition because salinity flux is always 270 !-- given 271 DO i = nxlg, nxrg 272 DO j = nysg, nyng 273 sa_p(nzb_s_inner(j,i),j,i) = sa_p(nzb_s_inner(j,i)+1,j,i) 314 !-- given. 315 DO l = 0, 1 316 ! 317 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 318 !-- for downward-facing surfaces at topography bottom (k+1). 319 kb = MERGE( -1, 1, l == 0 ) 320 !$OMP PARALLEL DO PRIVATE( i, j, k ) 321 DO m = 1, bc_h(l)%ns 322 i = bc_h(l)%i(m) 323 j = bc_h(l)%j(m) 324 k = bc_h(l)%k(m) 325 sa_p(k+kb,j,i) = sa_p(k,j,i) 274 326 ENDDO 275 327 ENDDO 276 277 328 ! 278 329 !-- Top boundary: Dirichlet or Neumann … … 291 342 ! 292 343 !-- Surface conditions for constant_humidity_flux 344 !-- Run loop over all non-natural and natural walls. Note, in wall-datatype 345 !-- the k coordinate belongs to the atmospheric grid point, therefore, set 346 !-- q_p at k-1 293 347 IF ( ibc_q_b == 0 ) THEN 294 DO i = nxlg, nxrg 295 DO j = nysg, nyng 296 q_p(nzb_s_inner(j,i),j,i) = q(nzb_s_inner(j,i),j,i) 348 349 DO l = 0, 1 350 ! 351 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 352 !-- for downward-facing surfaces at topography bottom (k+1). 353 kb = MERGE( -1, 1, l == 0 ) 354 !$OMP PARALLEL DO PRIVATE( i, j, k ) 355 DO m = 1, bc_h(l)%ns 356 i = bc_h(l)%i(m) 357 j = bc_h(l)%j(m) 358 k = bc_h(l)%k(m) 359 q_p(k+kb,j,i) = q(k+kb,j,i) 297 360 ENDDO 298 361 ENDDO 362 299 363 ELSE 300 DO i = nxlg, nxrg 301 DO j = nysg, nyng 302 q_p(nzb_s_inner(j,i),j,i) = q_p(nzb_s_inner(j,i)+1,j,i) 364 !$OMP PARALLEL DO PRIVATE( i, j, k ) 365 DO m = 1, bc_h(0)%ns 366 i = bc_h(0)%i(m) 367 j = bc_h(0)%j(m) 368 k = bc_h(0)%k(m) 369 q_p(k-1,j,i) = q_p(k,j,i) 370 ENDDO 371 372 DO l = 0, 1 373 ! 374 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 375 !-- for downward-facing surfaces at topography bottom (k+1). 376 kb = MERGE( -1, 1, l == 0 ) 377 !$OMP PARALLEL DO PRIVATE( i, j, k ) 378 DO m = 1, bc_h(l)%ns 379 i = bc_h(l)%i(m) 380 j = bc_h(l)%j(m) 381 k = bc_h(l)%k(m) 382 q_p(k+kb,j,i) = q_p(k,j,i) 303 383 ENDDO 304 384 ENDDO … … 315 395 ! 316 396 !-- Surface conditions rain water (Dirichlet) 317 DO i = nxlg, nxrg 318 DO j = nysg, nyng 319 qr_p(nzb_s_inner(j,i),j,i) = 0.0_wp 320 nr_p(nzb_s_inner(j,i),j,i) = 0.0_wp 321 ENDDO 397 !-- Run loop over all non-natural and natural walls. Note, in wall-datatype 398 !-- the k coordinate belongs to the atmospheric grid point, therefore, set 399 !-- qr_p and nr_p at k-1 400 !$OMP PARALLEL DO PRIVATE( i, j, k ) 401 DO m = 1, bc_h(0)%ns 402 i = bc_h(0)%i(m) 403 j = bc_h(0)%j(m) 404 k = bc_h(0)%k(m) 405 qr_p(k-1,j,i) = 0.0_wp 406 nr_p(k-1,j,i) = 0.0_wp 322 407 ENDDO 323 408 ! … … 334 419 ! 335 420 !-- Surface conditions for constant_humidity_flux 421 !-- Run loop over all non-natural and natural walls. Note, in wall-datatype 422 !-- the k coordinate belongs to the atmospheric grid point, therefore, set 423 !-- s_p at k-1 336 424 IF ( ibc_s_b == 0 ) THEN 337 DO i = nxlg, nxrg 338 DO j = nysg, nyng 339 s_p(nzb_s_inner(j,i),j,i) = s(nzb_s_inner(j,i),j,i) 425 426 DO l = 0, 1 427 ! 428 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 429 !-- for downward-facing surfaces at topography bottom (k+1). 430 kb = MERGE( -1, 1, l == 0 ) 431 !$OMP PARALLEL DO PRIVATE( i, j, k ) 432 DO m = 1, bc_h(l)%ns 433 i = bc_h(l)%i(m) 434 j = bc_h(l)%j(m) 435 k = bc_h(l)%k(m) 436 s_p(k+kb,j,i) = s(k+kb,j,i) 340 437 ENDDO 341 438 ENDDO 439 342 440 ELSE 343 DO i = nxlg, nxrg 344 DO j = nysg, nyng 345 s_p(nzb_s_inner(j,i),j,i) = s_p(nzb_s_inner(j,i)+1,j,i) 441 !$OMP PARALLEL DO PRIVATE( i, j, k ) 442 DO m = 1, bc_h(0)%ns 443 i = bc_h(0)%i(m) 444 j = bc_h(0)%j(m) 445 k = bc_h(0)%k(m) 446 s_p(k-1,j,i) = s_p(k,j,i) 447 ENDDO 448 449 DO l = 0, 1 450 ! 451 !-- Set kb, for upward-facing surfaces value at topography top (k-1) is set, 452 !-- for downward-facing surfaces at topography bottom (k+1). 453 kb = MERGE( -1, 1, l == 0 ) 454 !$OMP PARALLEL DO PRIVATE( i, j, k ) 455 DO m = 1, bc_h(l)%ns 456 i = bc_h(l)%i(m) 457 j = bc_h(l)%j(m) 458 k = bc_h(l)%k(m) 459 s_p(k+kb,j,i) = s_p(k,j,i) 346 460 ENDDO 347 461 ENDDO … … 394 508 IF ( outflow_s ) THEN 395 509 pt_p(:,nys-1,:) = pt_p(:,nys,:) 396 IF ( .NOT. constant_diffusion 510 IF ( .NOT. constant_diffusion ) e_p(:,nys-1,:) = e_p(:,nys,:) 397 511 IF ( humidity ) THEN 398 512 q_p(:,nys-1,:) = q_p(:,nys,:) -
palm/trunk/SOURCE/buoyancy.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 131 131 USE indices, & 132 132 ONLY: nxl, nxlg, nxlu, nxr, nxrg, nyn, nyng, nys, nysg, nzb, & 133 nz b_s_inner, nzt133 nzt, wall_flags_0 134 134 135 135 USE kinds … … 157 157 DO i = nxl, nxr 158 158 DO j = nys, nyn 159 DO k = nzb _s_inner(j,i)+1, nzt-1160 tend(k,j,i) = tend(k,j,i) + atmos_ocean_sign * g * 0.5_wp * &161 ( &159 DO k = nzb+1, nzt-1 160 tend(k,j,i) = tend(k,j,i) + atmos_ocean_sign * g * 0.5_wp * & 161 ( & 162 162 ( var(k,j,i) - ref_state(k) ) / ref_state(k) + & 163 163 ( var(k+1,j,i) - ref_state(k+1) ) / ref_state(k+1) & 164 ) 164 ) * MERGE( 1.0_wp, 0.0_wp, & 165 BTEST( wall_flags_0(k,j,i), 0 ) ) 165 166 ENDDO 166 167 ENDDO … … 178 179 DO i = nxlu, nxr 179 180 DO j = nys, nyn 180 DO k = nzb _s_inner(j,i)+1, nzt-1181 tend(k,j,i) = tend(k,j,i) + g * sin_alpha_surface * &181 DO k = nzb+1, nzt-1 182 tend(k,j,i) = tend(k,j,i) + g * sin_alpha_surface * & 182 183 0.5_wp * ( ( pt(k,j,i-1) + pt(k,j,i) ) & 183 184 - ( pt_slope_ref(k,i-1) + pt_slope_ref(k,i) ) & 184 ) / pt_surface 185 ) / pt_surface & 186 * MERGE( 1.0_wp, 0.0_wp, & 187 BTEST( wall_flags_0(k,j,i), 0 ) ) 185 188 ENDDO 186 189 ENDDO … … 191 194 DO i = nxl, nxr 192 195 DO j = nys, nyn 193 DO k = nzb _s_inner(j,i)+1, nzt-1194 tend(k,j,i) = tend(k,j,i) + g * cos_alpha_surface * &196 DO k = nzb+1, nzt-1 197 tend(k,j,i) = tend(k,j,i) + g * cos_alpha_surface * & 195 198 0.5_wp * ( ( pt(k,j,i) + pt(k+1,j,i) ) & 196 199 - ( pt_slope_ref(k,i) + pt_slope_ref(k+1,i) ) & 197 ) / pt_surface 200 ) / pt_surface & 201 * MERGE( 1.0_wp, 0.0_wp, & 202 BTEST( wall_flags_0(k,j,i), 0 ) ) 198 203 ENDDO 199 204 ENDDO … … 231 236 232 237 USE indices, & 233 ONLY: nxlg, nxrg, nyng, nysg, nzb, nz b_s_inner, nzt238 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzt, wall_flags_0 234 239 235 240 USE kinds … … 256 261 ! 257 262 !-- Normal case: horizontal surface 258 DO k = nzb _s_inner(j,i)+1, nzt-1263 DO k = nzb+1, nzt-1 259 264 tend(k,j,i) = tend(k,j,i) + atmos_ocean_sign * g * 0.5_wp * ( & 260 265 ( var(k,j,i) - ref_state(k) ) / ref_state(k) + & 261 266 ( var(k+1,j,i) - ref_state(k+1) ) / ref_state(k+1) & 262 ) 267 ) & 268 * MERGE( 1.0_wp, 0.0_wp, & 269 BTEST( wall_flags_0(k,j,i), 0 ) ) 263 270 ENDDO 264 271 … … 272 279 IF ( wind_component == 1 ) THEN 273 280 274 DO k = nzb _s_inner(j,i)+1, nzt-1275 tend(k,j,i) = tend(k,j,i) + g * sin_alpha_surface * &281 DO k = nzb+1, nzt-1 282 tend(k,j,i) = tend(k,j,i) + g * sin_alpha_surface * & 276 283 0.5_wp * ( ( pt(k,j,i-1) + pt(k,j,i) ) & 277 284 - ( pt_slope_ref(k,i-1) + pt_slope_ref(k,i) ) & 278 ) / pt_surface 285 ) / pt_surface & 286 * MERGE( 1.0_wp, 0.0_wp, & 287 BTEST( wall_flags_0(k,j,i), 0 ) ) 279 288 ENDDO 280 289 281 290 ELSEIF ( wind_component == 3 ) THEN 282 291 283 DO k = nzb _s_inner(j,i)+1, nzt-1284 tend(k,j,i) = tend(k,j,i) + g * cos_alpha_surface * &292 DO k = nzb+1, nzt-1 293 tend(k,j,i) = tend(k,j,i) + g * cos_alpha_surface * & 285 294 0.5_wp * ( ( pt(k,j,i) + pt(k+1,j,i) ) & 286 295 - ( pt_slope_ref(k,i) + pt_slope_ref(k+1,i) ) & 287 ) / pt_surface 296 ) / pt_surface & 297 * MERGE( 1.0_wp, 0.0_wp, & 298 BTEST( wall_flags_0(k,j,i), 0 ) ) 288 299 ENDDO 289 300 -
palm/trunk/SOURCE/calc_liquid_water_content.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 83 83 84 84 USE indices, & 85 ONLY: nxlg, nxrg, nyng, nysg, nzb _s_inner, nzt85 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzt, wall_flags_0 86 86 87 87 USE kinds … … 103 103 DO i = nxlg, nxrg 104 104 DO j = nysg, nyng 105 DO k = nzb _s_inner(j,i)+1, nzt105 DO k = nzb+1, nzt 106 106 107 107 ! … … 131 131 IF ( microphysics_seifert ) THEN 132 132 IF ( ( q(k,j,i) - q_s - qr(k,j,i) ) > 0.0_wp ) THEN 133 qc(k,j,i) = q(k,j,i) - q_s - qr(k,j,i) 134 ql(k,j,i) = qc(k,j,i) + qr(k,j,i) 133 qc(k,j,i) = ( q(k,j,i) - q_s - qr(k,j,i) ) & 134 * MERGE( 1.0_wp, 0.0_wp, & 135 BTEST( wall_flags_0(k,j,i), 0 ) ) 136 ql(k,j,i) = ( qc(k,j,i) + qr(k,j,i) ) & 137 * MERGE( 1.0_wp, 0.0_wp, & 138 BTEST( wall_flags_0(k,j,i), 0 ) ) 135 139 ELSE 136 140 IF ( q(k,j,i) < qr(k,j,i) ) q(k,j,i) = qr(k,j,i) 137 141 qc(k,j,i) = 0.0_wp 138 ql(k,j,i) = qr(k,j,i) 142 ql(k,j,i) = qr(k,j,i) & 143 * MERGE( 1.0_wp, 0.0_wp, & 144 BTEST( wall_flags_0(k,j,i), 0 ) ) 139 145 ENDIF 140 146 ELSE 141 147 IF ( ( q(k,j,i) - q_s ) > 0.0_wp ) THEN 142 qc(k,j,i) = q(k,j,i) - q_s 143 ql(k,j,i) = qc(k,j,i) 148 qc(k,j,i) = ( q(k,j,i) - q_s ) & 149 * MERGE( 1.0_wp, 0.0_wp, & 150 BTEST( wall_flags_0(k,j,i), 0 ) ) 151 ql(k,j,i) = qc(k,j,i) & 152 * MERGE( 1.0_wp, 0.0_wp, & 153 BTEST( wall_flags_0(k,j,i), 0 ) ) 144 154 ELSE 145 155 qc(k,j,i) = 0.0_wp -
palm/trunk/SOURCE/calc_mean_profile.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 75 75 76 76 USE indices, & 77 ONLY: ngp_2dh_s_inner, nxl, nxr, nyn, nys, nzb, nzb_s_inner, nzt 77 ONLY: ngp_2dh_s_inner, nxl, nxr, nyn, nys, nzb, nzb, nzt, & 78 wall_flags_0 78 79 79 80 USE kinds … … 118 119 DO i = nxl, nxr 119 120 DO j = nys, nyn 120 DO k = nzb_s_inner(j,i), nzt+1 121 sums_l(k,pr,tn) = sums_l(k,pr,tn) + var(k,j,i) 121 DO k = nzb, nzt+1 122 sums_l(k,pr,tn) = sums_l(k,pr,tn) + var(k,j,i) & 123 * MERGE( 1.0_wp, 0.0_wp, & 124 BTEST( wall_flags_0(k,j,i), 22 ) ) 122 125 ENDDO 123 126 ENDDO -
palm/trunk/SOURCE/calc_radiation.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 105 105 106 106 USE indices, & 107 ONLY: nxl, nxr, nyn, nys, nzb, nz b_s_inner, nzt107 ONLY: nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 108 108 109 109 USE kinds … … 153 153 blackbody_emission(nzb) = sigma * temperature**4 154 154 155 DO k = nzb _s_inner(j,i)+1, nzt155 DO k = nzb+1, nzt 156 156 157 157 k_help = ( nzt+nzb+1 ) - k … … 163 163 164 164 temperature = pt(k,j,i) * t_d_pt(k) + l_d_cp * ql(k,j,i) 165 blackbody_emission(k) = sigma * temperature**4 165 blackbody_emission(k) = sigma * temperature**4 & 166 * MERGE( 1.0_wp, 0.0_wp, & 167 BTEST( wall_flags_0(k,j,i), 0 ) ) 166 168 167 169 ENDDO … … 179 181 impinging_flux_at_top = blackbody_emission(nzb) - 100.0_wp 180 182 181 DO k = nzb _s_inner(j,i)+1, nzt183 DO k = nzb+1, nzt 182 184 ! 183 185 !-- Save some computational time, but this may cause load … … 222 224 tend(k,j,i) = tend(k,j,i) - & 223 225 ( pt_d_t(k) / ( rho_surface * cp ) * & 224 ( df_p - df_m ) / dzw(k) ) 226 ( df_p - df_m ) / dzw(k) ) & 227 * MERGE( 1.0_wp, 0.0_wp, & 228 BTEST( wall_flags_0(k,j,i), 0 ) ) 225 229 226 230 ENDIF … … 250 254 251 255 USE indices, & 252 ONLY: nzb, nz b_s_inner, nzt256 ONLY: nzb, nzt, wall_flags_0 253 257 254 258 USE kinds … … 295 299 blackbody_emission(nzb) = sigma * temperature**4 296 300 297 DO k = nzb _s_inner(j,i)+1, nzt301 DO k = nzb+1, nzt 298 302 k_help = ( nzt+nzb+1 ) - k 299 303 lwp_ground(k) = lwp_ground(k-1) + rho_surface * ql(k,j,i) * dzw(k) … … 303 307 304 308 temperature = pt(k,j,i) * t_d_pt(k) + l_d_cp * ql(k,j,i) 305 blackbody_emission(k) = sigma * temperature**4 309 blackbody_emission(k) = sigma * temperature**4 & 310 * MERGE( 1.0_wp, 0.0_wp, & 311 BTEST( wall_flags_0(k,j,i), 0 ) ) 306 312 307 313 ENDDO … … 318 324 impinging_flux_at_top = blackbody_emission(nzb) - 100.0_wp 319 325 320 DO k = nzb _s_inner(j,i)+1, nzt326 DO k = nzb+1, nzt 321 327 ! 322 328 !-- Store some computational time, … … 356 362 !-- Compute tendency term 357 363 tend(k,j,i) = tend(k,j,i) - ( pt_d_t(k) / ( rho_surface * cp ) * & 358 ( df_p - df_m ) / dzw(k) ) 364 ( df_p - df_m ) / dzw(k) ) & 365 * MERGE( 1.0_wp, 0.0_wp, & 366 BTEST( wall_flags_0(k,j,i), 0 ) ) 359 367 360 368 ENDIF -
palm/trunk/SOURCE/check_parameters.f90
r2210 r2232 466 466 USE indices 467 467 USE land_surface_model_mod, & 468 ONLY: l and_surface, lsm_check_data_output, lsm_check_data_output_pr,&468 ONLY: lsm_check_data_output, lsm_check_data_output_pr, & 469 469 lsm_check_parameters 470 470 … … 859 859 'momentum_advec = "ws-scheme"' 860 860 CALL message( 'check_parameters', 'PA0447', 1, 2, 0, 6, 0 ) 861 ENDIF 862 IF ( TRIM( approximation ) == 'anelastic' .AND. & 863 TRIM( psolver ) == 'multigrid' ) THEN 864 message_string = 'Anelastic approximation currently only supports: ' // & 865 'psolver = "poisfft", ' // & 866 'psolver = "sor" and ' // & 867 'psolver = "multigrid_noopt"' 868 CALL message( 'check_parameters', 'PA0448', 1, 2, 0, 6, 0 ) 861 869 ENDIF 862 870 IF ( TRIM( approximation ) == 'anelastic' .AND. & -
palm/trunk/SOURCE/coriolis.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 102 102 103 103 USE indices, & 104 ONLY: nxl, nxlu, nxr, nyn, nys, nysv, nzb_u_inner, nzb_v_inner, & 105 nzb_w_inner, nzt 104 ONLY: nxl, nxlu, nxr, nyn, nys, nysv, nzb, nzt, wall_flags_0 106 105 107 106 USE kinds … … 110 109 111 110 INTEGER(iwp) :: component !< 112 INTEGER(iwp) :: i !< 113 INTEGER(iwp) :: j !< 114 INTEGER(iwp) :: k !< 115 116 111 INTEGER(iwp) :: i !< running index x direction 112 INTEGER(iwp) :: j !< running index y direction 113 INTEGER(iwp) :: k !< running index z direction 114 115 REAL(wp) :: flag !< flag to mask topography 117 116 ! 118 117 !-- Compute Coriolis terms for the three velocity components … … 124 123 DO i = nxlu, nxr 125 124 DO j = nys, nyn 126 DO k = nzb_u_inner(j,i)+1, nzt 125 DO k = nzb+1, nzt 126 ! 127 !-- Predetermine flag to mask topography 128 flag = MERGE( 1.0_wp, 0.0_wp, & 129 BTEST( wall_flags_0(k,j,i), 1 ) ) 130 127 131 tend(k,j,i) = tend(k,j,i) + f * ( 0.25_wp * & 128 132 ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) + & 129 v(k,j+1,i) ) - vg(k) )&133 v(k,j+1,i) ) - vg(k) ) * flag & 130 134 - fs * ( 0.25_wp * & 131 135 ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) + & 132 w(k,j,i) ) &133 ) 136 w(k,j,i) ) & 137 ) * flag 134 138 ENDDO 135 139 ENDDO … … 141 145 DO i = nxl, nxr 142 146 DO j = nysv, nyn 143 DO k = nzb _v_inner(j,i)+1, nzt147 DO k = nzb+1, nzt 144 148 tend(k,j,i) = tend(k,j,i) - f * ( 0.25_wp * & 145 149 ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) + & 146 u(k,j,i+1) ) - ug(k) ) 150 u(k,j,i+1) ) - ug(k) ) * & 151 MERGE( 1.0_wp, 0.0_wp, & 152 BTEST( wall_flags_0(k,j,i), 2 ) ) 147 153 ENDDO 148 154 ENDDO … … 154 160 DO i = nxl, nxr 155 161 DO j = nys, nyn 156 DO k = nzb _w_inner(j,i)+1, nzt162 DO k = nzb+1, nzt 157 163 tend(k,j,i) = tend(k,j,i) + fs * 0.25_wp * & 158 164 ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) + & 159 u(k+1,j,i+1) ) 165 u(k+1,j,i+1) ) * & 166 MERGE( 1.0_wp, 0.0_wp, & 167 BTEST( wall_flags_0(k,j,i), 3 ) ) 160 168 ENDDO 161 169 ENDDO … … 186 194 187 195 USE indices, & 188 ONLY: nzb _u_inner, nzb_v_inner, nzb_w_inner, nzt196 ONLY: nzb, nzt, wall_flags_0 189 197 190 198 USE kinds … … 193 201 194 202 INTEGER(iwp) :: component !< 195 INTEGER(iwp) :: i !< 196 INTEGER(iwp) :: j !< 197 INTEGER(iwp) :: k !< 203 INTEGER(iwp) :: i !< running index x direction 204 INTEGER(iwp) :: j !< running index y direction 205 INTEGER(iwp) :: k !< running index z direction 206 207 REAL(wp) :: flag !< flag to mask topography 198 208 199 209 ! … … 204 214 !-- u-component 205 215 CASE ( 1 ) 206 DO k = nzb_u_inner(j,i)+1, nzt 207 tend(k,j,i) = tend(k,j,i) + f * ( 0.25_wp * & 216 DO k = nzb+1, nzt 217 ! 218 !-- Predetermine flag to mask topography 219 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 1 ) ) 220 221 tend(k,j,i) = tend(k,j,i) + f * ( 0.25_wp * & 208 222 ( v(k,j,i-1) + v(k,j,i) + v(k,j+1,i-1) + & 209 v(k,j+1,i) ) - vg(k) ) 223 v(k,j+1,i) ) - vg(k) ) * flag & 210 224 - fs * ( 0.25_wp * & 211 225 ( w(k-1,j,i-1) + w(k-1,j,i) + w(k,j,i-1) + & 212 w(k,j,i) ) )226 w(k,j,i) ) ) * flag 213 227 ENDDO 214 228 … … 216 230 !-- v-component 217 231 CASE ( 2 ) 218 DO k = nzb _v_inner(j,i)+1, nzt219 tend(k,j,i) = tend(k,j,i) - f * ( 0.25_wp *&232 DO k = nzb+1, nzt 233 tend(k,j,i) = tend(k,j,i) - f * ( 0.25_wp * & 220 234 ( u(k,j-1,i) + u(k,j,i) + u(k,j-1,i+1) + & 221 u(k,j,i+1) ) - ug(k) ) 235 u(k,j,i+1) ) - ug(k) ) * & 236 MERGE( 1.0_wp, 0.0_wp, & 237 BTEST( wall_flags_0(k,j,i), 2 ) ) 222 238 ENDDO 223 239 … … 225 241 !-- w-component 226 242 CASE ( 3 ) 227 DO k = nzb _w_inner(j,i)+1, nzt243 DO k = nzb+1, nzt 228 244 tend(k,j,i) = tend(k,j,i) + fs * 0.25_wp * & 229 245 ( u(k,j,i) + u(k+1,j,i) + u(k,j,i+1) + & 230 u(k+1,j,i+1) ) 246 u(k+1,j,i+1) ) * & 247 MERGE( 1.0_wp, 0.0_wp, & 248 BTEST( wall_flags_0(k,j,i), 3 ) ) 231 249 ENDDO 232 250 -
palm/trunk/SOURCE/data_output_2d.f90
r2191 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! Adjustments to new surface concept 22 23 ! 23 24 ! … … 162 163 163 164 USE arrays_3d, & 164 ONLY: dzw, e, nr, ol, p, pt, precipitation_amount, precipitation_rate,&165 prr, q, qc, ql, ql_c, ql_v, ql_vp, qr, qsws, rho_ocean, s, sa, shf,&166 ssws, tend, ts, u, us, v, vpt, w, z0, z0h, z0q, zu, zw165 ONLY: dzw, e, nr, p, pt, precipitation_amount, precipitation_rate, & 166 prr, q, qc, ql, ql_c, ql_v, ql_vp, qr, rho_ocean, s, sa, & 167 tend, u, v, vpt, w, zu, zw 167 168 168 169 USE averaging … … 177 178 do2d_xz_last_time, do2d_xz_n, do2d_xz_time_count, & 178 179 do2d_yz_last_time, do2d_yz_n, do2d_yz_time_count, & 179 ibc_uv_b, io_blocks, io_group, message_string,&180 ibc_uv_b, io_blocks, io_group, land_surface, message_string, & 180 181 ntdim_2d_xy, ntdim_2d_xz, ntdim_2d_yz, & 181 182 psolver, section, simulated_time, simulated_time_chr, & … … 195 196 196 197 USE land_surface_model_mod, & 197 ONLY: l and_surface, lsm_data_output_2d, zs198 ONLY: lsm_data_output_2d, zs 198 199 199 200 #if defined( __netcdf ) … … 214 215 USE radiation_model_mod, & 215 216 ONLY: radiation, radiation_data_output_2d 217 218 USE surface_mod, & 219 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 216 220 217 221 IMPLICIT NONE … … 234 238 INTEGER(iwp) :: l !< 235 239 INTEGER(iwp) :: layer_xy !< 240 INTEGER(iwp) :: m !< 236 241 INTEGER(iwp) :: n !< 237 242 INTEGER(iwp) :: nis !< … … 255 260 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: local_2d !< 256 261 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: local_2d_l !< 262 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tmp_2d !< temporary field used to exchange surface-related quantities 263 257 264 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: local_pf !< 258 265 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: local_2d_sections !< … … 417 424 !-- Allocate a temporary array for resorting (kji -> ijk). 418 425 ALLOCATE( local_pf(nxlg:nxrg,nysg:nyng,nzb:nzt+1) ) 426 local_pf = 0.0 427 ! 428 !-- Allocate temporary array used for exchanging ghoist points of surface-data 429 ALLOCATE( tmp_2d(nysg:nyng,nxlg:nxrg) ) 430 tmp_2d = 0.0 419 431 420 432 ! … … 485 497 CASE ( 'ol*_xy' ) ! 2d-array 486 498 IF ( av == 0 ) THEN 487 DO i = nxlg, nxrg 488 DO j = nysg, nyng 489 local_pf(i,j,nzb+1) = ol(j,i) 490 ENDDO 491 ENDDO 499 DO m = 1, surf_def_h(0)%ns 500 i = surf_def_h(0)%i(m) 501 j = surf_def_h(0)%j(m) 502 tmp_2d(j,i) = surf_def_h(0)%ol(m) 503 ENDDO 504 DO m = 1, surf_lsm_h%ns 505 i = surf_lsm_h%i(m) 506 j = surf_lsm_h%j(m) 507 tmp_2d(j,i) = surf_lsm_h%ol(m) 508 ENDDO 509 DO m = 1, surf_usm_h%ns 510 i = surf_usm_h%i(m) 511 j = surf_usm_h%j(m) 512 tmp_2d(j,i) = surf_usm_h%ol(m) 513 ENDDO 514 515 CALL exchange_horiz_2d( tmp_2d, nbgp ) 516 517 DO i = nxlg, nxrg 518 DO j = nysg, nyng 519 local_pf(i,j,nzb+1) = tmp_2d(j,i) 520 ENDDO 521 ENDDO 522 492 523 ELSE 493 524 DO i = nxlg, nxrg … … 740 771 CASE ( 'qsws*_xy' ) ! 2d-array 741 772 IF ( av == 0 ) THEN 742 DO i = nxlg, nxrg 743 DO j = nysg, nyng 744 local_pf(i,j,nzb+1) = qsws(j,i) 773 DO m = 1, surf_def_h(0)%ns 774 i = surf_def_h(0)%i(m) 775 j = surf_def_h(0)%j(m) 776 tmp_2d(j,i) = surf_def_h(0)%qsws(m) 777 ENDDO 778 DO m = 1, surf_lsm_h%ns 779 i = surf_lsm_h%i(m) 780 j = surf_lsm_h%j(m) 781 tmp_2d(j,i) = surf_lsm_h%qsws(m) 782 ENDDO 783 DO m = 1, surf_usm_h%ns 784 i = surf_usm_h%i(m) 785 j = surf_usm_h%j(m) 786 tmp_2d(j,i) = surf_usm_h%qsws(m) 787 ENDDO 788 789 CALL exchange_horiz_2d( tmp_2d, nbgp ) 790 791 DO i = nxlg, nxrg 792 DO j = nysg, nyng 793 local_pf(i,j,nzb+1) = tmp_2d(j,i) 745 794 ENDDO 746 795 ENDDO … … 796 845 CASE ( 'shf*_xy' ) ! 2d-array 797 846 IF ( av == 0 ) THEN 798 DO i = nxlg, nxrg 799 DO j = nysg, nyng 800 local_pf(i,j,nzb+1) = shf(j,i) 847 DO m = 1, surf_def_h(0)%ns 848 i = surf_def_h(0)%i(m) 849 j = surf_def_h(0)%j(m) 850 tmp_2d(j,i) = surf_def_h(0)%shf(m) 851 ENDDO 852 DO m = 1, surf_lsm_h%ns 853 i = surf_lsm_h%i(m) 854 j = surf_lsm_h%j(m) 855 tmp_2d(j,i) = surf_lsm_h%shf(m) 856 ENDDO 857 DO m = 1, surf_usm_h%ns 858 i = surf_usm_h%i(m) 859 j = surf_usm_h%j(m) 860 tmp_2d(j,i) = surf_usm_h%shf(m) 861 ENDDO 862 863 CALL exchange_horiz_2d( tmp_2d, nbgp ) 864 865 DO i = nxlg, nxrg 866 DO j = nysg, nyng 867 local_pf(i,j,nzb+1) = tmp_2d(j,i) 801 868 ENDDO 802 869 ENDDO … … 814 881 CASE ( 'ssws*_xy' ) ! 2d-array 815 882 IF ( av == 0 ) THEN 816 DO i = nxlg, nxrg 817 DO j = nysg, nyng 818 local_pf(i,j,nzb+1) = ssws(j,i) 883 DO m = 1, surf_def_h(0)%ns 884 i = surf_def_h(0)%i(m) 885 j = surf_def_h(0)%j(m) 886 tmp_2d(j,i) = surf_def_h(0)%ssws(m) 887 ENDDO 888 DO m = 1, surf_lsm_h%ns 889 i = surf_lsm_h%i(m) 890 j = surf_lsm_h%j(m) 891 tmp_2d(j,i) = surf_lsm_h%ssws(m) 892 ENDDO 893 DO m = 1, surf_usm_h%ns 894 i = surf_usm_h%i(m) 895 j = surf_usm_h%j(m) 896 tmp_2d(j,i) = surf_usm_h%ssws(m) 897 ENDDO 898 899 CALL exchange_horiz_2d( tmp_2d, nbgp ) 900 901 DO i = nxlg, nxrg 902 DO j = nysg, nyng 903 local_pf(i,j,nzb+1) = tmp_2d(j,i) 819 904 ENDDO 820 905 ENDDO … … 832 917 CASE ( 't*_xy' ) ! 2d-array 833 918 IF ( av == 0 ) THEN 834 DO i = nxlg, nxrg 835 DO j = nysg, nyng 836 local_pf(i,j,nzb+1) = ts(j,i) 837 ENDDO 838 ENDDO 919 DO m = 1, surf_def_h(0)%ns 920 i = surf_def_h(0)%i(m) 921 j = surf_def_h(0)%j(m) 922 tmp_2d(j,i) = surf_def_h(0)%ts(m) 923 ENDDO 924 DO m = 1, surf_lsm_h%ns 925 i = surf_lsm_h%i(m) 926 j = surf_lsm_h%j(m) 927 tmp_2d(j,i) = surf_lsm_h%ts(m) 928 ENDDO 929 DO m = 1, surf_usm_h%ns 930 i = surf_usm_h%i(m) 931 j = surf_usm_h%j(m) 932 tmp_2d(j,i) = surf_usm_h%ts(m) 933 ENDDO 934 935 CALL exchange_horiz_2d( tmp_2d, nbgp ) 936 937 DO i = nxlg, nxrg 938 DO j = nysg, nyng 939 local_pf(i,j,nzb+1) = tmp_2d(j,i) 940 ENDDO 941 ENDDO 942 839 943 ELSE 840 944 DO i = nxlg, nxrg … … 864 968 CASE ( 'u*_xy' ) ! 2d-array 865 969 IF ( av == 0 ) THEN 866 DO i = nxlg, nxrg 867 DO j = nysg, nyng 868 local_pf(i,j,nzb+1) = us(j,i) 970 DO m = 1, surf_def_h(0)%ns 971 i = surf_def_h(0)%i(m) 972 j = surf_def_h(0)%j(m) 973 tmp_2d(j,i) = surf_def_h(0)%us(m) 974 ENDDO 975 DO m = 1, surf_lsm_h%ns 976 i = surf_lsm_h%i(m) 977 j = surf_lsm_h%j(m) 978 tmp_2d(j,i) = surf_lsm_h%us(m) 979 ENDDO 980 DO m = 1, surf_usm_h%ns 981 i = surf_usm_h%i(m) 982 j = surf_usm_h%j(m) 983 tmp_2d(j,i) = surf_usm_h%us(m) 984 ENDDO 985 986 CALL exchange_horiz_2d( tmp_2d, nbgp ) 987 988 DO i = nxlg, nxrg 989 DO j = nysg, nyng 990 local_pf(i,j,nzb+1) = tmp_2d(j,i) 869 991 ENDDO 870 992 ENDDO … … 912 1034 CASE ( 'z0*_xy' ) ! 2d-array 913 1035 IF ( av == 0 ) THEN 914 DO i = nxlg, nxrg 915 DO j = nysg, nyng 916 local_pf(i,j,nzb+1) = z0(j,i) 917 ENDDO 918 ENDDO 1036 DO m = 1, surf_def_h(0)%ns 1037 i = surf_def_h(0)%i(m) 1038 j = surf_def_h(0)%j(m) 1039 tmp_2d(j,i) = surf_def_h(0)%z0(m) 1040 ENDDO 1041 DO m = 1, surf_lsm_h%ns 1042 i = surf_lsm_h%i(m) 1043 j = surf_lsm_h%j(m) 1044 tmp_2d(j,i) = surf_lsm_h%z0(m) 1045 ENDDO 1046 DO m = 1, surf_usm_h%ns 1047 i = surf_usm_h%i(m) 1048 j = surf_usm_h%j(m) 1049 tmp_2d(j,i) = surf_usm_h%z0(m) 1050 ENDDO 1051 1052 CALL exchange_horiz_2d( tmp_2d, nbgp ) 1053 1054 DO i = nxlg, nxrg 1055 DO j = nysg, nyng 1056 local_pf(i,j,nzb+1) = tmp_2d(j,i) 1057 ENDDO 1058 ENDDO 1059 919 1060 ELSE 920 1061 DO i = nxlg, nxrg … … 930 1071 CASE ( 'z0h*_xy' ) ! 2d-array 931 1072 IF ( av == 0 ) THEN 932 DO i = nxlg, nxrg 933 DO j = nysg, nyng 934 local_pf(i,j,nzb+1) = z0h(j,i) 1073 DO m = 1, surf_def_h(0)%ns 1074 i = surf_def_h(0)%i(m) 1075 j = surf_def_h(0)%j(m) 1076 tmp_2d(j,i) = surf_def_h(0)%z0h(m) 1077 ENDDO 1078 DO m = 1, surf_lsm_h%ns 1079 i = surf_lsm_h%i(m) 1080 j = surf_lsm_h%j(m) 1081 tmp_2d(j,i) = surf_lsm_h%z0h(m) 1082 ENDDO 1083 DO m = 1, surf_usm_h%ns 1084 i = surf_usm_h%i(m) 1085 j = surf_usm_h%j(m) 1086 tmp_2d(j,i) = surf_usm_h%z0h(m) 1087 ENDDO 1088 1089 CALL exchange_horiz_2d( tmp_2d, nbgp ) 1090 1091 DO i = nxlg, nxrg 1092 DO j = nysg, nyng 1093 local_pf(i,j,nzb+1) = tmp_2d(j,i) 935 1094 ENDDO 936 1095 ENDDO … … 948 1107 CASE ( 'z0q*_xy' ) ! 2d-array 949 1108 IF ( av == 0 ) THEN 950 DO i = nxlg, nxrg 951 DO j = nysg, nyng 952 local_pf(i,j,nzb+1) = z0q(j,i) 1109 DO m = 1, surf_def_h(0)%ns 1110 i = surf_def_h(0)%i(m) 1111 j = surf_def_h(0)%j(m) 1112 tmp_2d(j,i) = surf_def_h(0)%z0q(m) 1113 ENDDO 1114 DO m = 1, surf_lsm_h%ns 1115 i = surf_lsm_h%i(m) 1116 j = surf_lsm_h%j(m) 1117 tmp_2d(j,i) = surf_lsm_h%z0q(m) 1118 ENDDO 1119 DO m = 1, surf_usm_h%ns 1120 i = surf_usm_h%i(m) 1121 j = surf_usm_h%j(m) 1122 tmp_2d(j,i) = surf_usm_h%z0q(m) 1123 ENDDO 1124 1125 CALL exchange_horiz_2d( tmp_2d, nbgp ) 1126 1127 DO i = nxlg, nxrg 1128 DO j = nysg, nyng 1129 local_pf(i,j,nzb+1) = tmp_2d(j,i) 953 1130 ENDDO 954 1131 ENDDO -
palm/trunk/SOURCE/data_output_3d.f90
r2210 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 152 152 153 153 USE arrays_3d, & 154 ONLY: e, nr, p, pt, prr, q, qc, ql, ql_c, ql_v, qr, rho_ocean, s, sa, tend,&155 u, v, vpt, w154 ONLY: e, nr, p, pt, prr, q, qc, ql, ql_c, ql_v, qr, rho_ocean, s, sa, & 155 tend, u, v, vpt, w 156 156 157 157 USE averaging … … 162 162 USE control_parameters, & 163 163 ONLY: cloud_physics, do3d, do3d_no, do3d_time_count, io_blocks, & 164 io_group, message_string, ntdim_3d, nz_do3d, psolver,&165 simulated_time, time_since_reference_point, urban_surface,&166 varnamelength164 io_group, land_surface, message_string, ntdim_3d, nz_do3d, & 165 psolver, simulated_time, time_since_reference_point, & 166 urban_surface, varnamelength 167 167 168 168 USE cpulog, & … … 175 175 176 176 USE land_surface_model_mod, & 177 ONLY: l and_surface, lsm_data_output_3d, nzb_soil, nzt_soil177 ONLY: lsm_data_output_3d, nzb_soil, nzt_soil 178 178 179 179 #if defined( __netcdf ) -
palm/trunk/SOURCE/diffusion_e.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 129 129 130 130 USE arrays_3d, & 131 ONLY: dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw,&131 ONLY: dd2zu, ddzu, ddzw, diss, e, km, l_grid, l_wall, tend, zu, zw,& 132 132 drho_air, rho_air_zw 133 133 … … 140 140 141 141 USE indices, & 142 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_ s_inner,&143 nzt 142 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_max, & 143 nzt, wall_flags_0 144 144 145 145 USE kinds … … 151 151 ONLY: use_sgs_for_particles, wang_kernel 152 152 153 USE surface_mod, & 154 ONLY : bc_h 155 153 156 IMPLICIT NONE 154 157 155 INTEGER(iwp) :: i !< 156 INTEGER(iwp) :: j !< 157 INTEGER(iwp) :: k !< 158 INTEGER(iwp) :: i !< running index x direction 159 INTEGER(iwp) :: j !< running index y direction 160 INTEGER(iwp) :: k !< running index z direction 161 INTEGER(iwp) :: m !< running index surface elements 162 158 163 REAL(wp) :: dvar_dz !< 164 REAL(wp) :: flag !< flag to mask topography 159 165 REAL(wp) :: l_stable !< 160 166 REAL(wp) :: var_reference !< … … 177 183 DO i = nxl, nxr 178 184 DO j = nys, nyn 179 DO k = nzb _s_inner(j,i)+1, nzt185 DO k = nzb+1, nzt 180 186 ! 181 187 !-- Calculate the mixing length (for dissipation) … … 191 197 !-- Adjustment of the mixing length 192 198 IF ( wall_adjustment ) THEN 193 l(k,j) = MIN( wall_adjustment_factor * & 194 ( zu(k) - zw(nzb_s_inner(j,i)) ), & 199 l(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i), & 195 200 l_grid(k), l_stable ) 196 ll(k,j) = MIN( wall_adjustment_factor * & 197 ( zu(k) - zw(nzb_s_inner(j,i)) ), & 201 ll(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i), & 198 202 l_grid(k) ) 199 203 ELSE … … 208 212 !-- Calculate the tendency terms 209 213 DO j = nys, nyn 210 DO k = nzb_s_inner(j,i)+1, nzt 211 212 dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * & 214 DO k = nzb+1, nzt 215 ! 216 !-- Predetermine flag to mask topography 217 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 218 219 dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * & 213 220 e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j) 214 221 215 tend(k,j,i) = tend(k,j,i)&222 tend(k,j,i) = tend(k,j,i) & 216 223 + ( & 217 224 ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) ) & 218 225 - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) ) & 219 ) * ddx2 226 ) * ddx2 * flag & 220 227 + ( & 221 228 ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) ) & 222 229 - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) ) & 223 ) * ddy2 230 ) * ddy2 * flag & 224 231 + ( & 225 232 ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) & … … 227 234 - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k) & 228 235 * rho_air_zw(k-1) & 229 ) * ddzw(k) * drho_air(k) 230 - dissipation(k,j) 236 ) * ddzw(k) * drho_air(k) * flag & 237 - dissipation(k,j) * flag 231 238 232 239 ENDDO … … 239 246 collision_turbulence ) THEN 240 247 DO j = nys, nyn 241 DO k = nzb_s_inner(j,i)+1, nzt 242 diss(k,j,i) = dissipation(k,j) 248 DO k = nzb+1, nzt 249 diss(k,j,i) = dissipation(k,j) * & 250 MERGE( 1.0_wp, 0.0_wp, & 251 BTEST( wall_flags_0(k,j,i), 0 ) ) 243 252 ENDDO 244 253 ENDDO … … 251 260 DO i = nxl, nxr 252 261 DO j = nys, nyn 253 DO k = nzb _s_inner(j,i)+1, nzt262 DO k = nzb+1, nzt 254 263 ! 255 264 !-- Calculate the mixing length (for dissipation) … … 265 274 !-- Adjustment of the mixing length 266 275 IF ( wall_adjustment ) THEN 267 l(k,j) = MIN( wall_adjustment_factor * & 268 ( zu(k) - zw(nzb_s_inner(j,i)) ), & 276 l(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i), & 269 277 l_grid(k), l_stable ) 270 ll(k,j) = MIN( wall_adjustment_factor * & 271 ( zu(k) - zw(nzb_s_inner(j,i)) ), & 278 ll(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i), & 272 279 l_grid(k) ) 273 280 ELSE … … 282 289 !-- Calculate the tendency terms 283 290 DO j = nys, nyn 284 DO k = nzb_s_inner(j,i)+1, nzt 285 286 dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * & 291 DO k = nzb+1, nzt 292 ! 293 !-- Predetermine flag to mask topography 294 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 295 296 dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) *& 287 297 e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j) 288 298 289 tend(k,j,i) = tend(k,j,i)&299 tend(k,j,i) = tend(k,j,i) & 290 300 + ( & 291 301 ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) ) & 292 302 - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) ) & 293 ) * ddx2 303 ) * ddx2 * flag & 294 304 + ( & 295 305 ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) ) & 296 306 - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) ) & 297 ) * ddy2 307 ) * ddy2 * flag & 298 308 + ( & 299 309 ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) & … … 301 311 - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k) & 302 312 * rho_air_zw(k-1) & 303 ) * ddzw(k) * drho_air(k) 304 - dissipation(k,j) 313 ) * ddzw(k) * drho_air(k) * flag & 314 - dissipation(k,j) * flag 305 315 306 316 ENDDO … … 313 323 collision_turbulence ) THEN 314 324 DO j = nys, nyn 315 DO k = nzb_s_inner(j,i)+1, nzt 316 diss(k,j,i) = dissipation(k,j) 325 DO k = nzb+1, nzt 326 diss(k,j,i) = dissipation(k,j) * & 327 MERGE( 1.0_wp, 0.0_wp, & 328 BTEST( wall_flags_0(k,j,i), 0 ) ) 317 329 ENDDO 318 330 ENDDO … … 324 336 325 337 ! 326 !-- Boundary condition for dissipation338 !-- Neumann boundary condition for dissipation diss(nzb,:,:) = diss(nzb+1,:,:) 327 339 IF ( use_sgs_for_particles .OR. wang_kernel .OR. & 328 340 collision_turbulence ) THEN 329 DO i = nxl, nxr 330 DO j = nys, nyn 331 diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i) 332 ENDDO 333 ENDDO 341 ! 342 !-- Upward facing surfaces 343 DO m = 1, bc_h(0)%ns 344 i = bc_h(0)%i(m) 345 j = bc_h(0)%j(m) 346 k = bc_h(0)%k(m) 347 diss(k-1,j,i) = diss(k,j,i) 348 ENDDO 349 ! 350 !-- Downward facing surfaces 351 DO m = 1, bc_h(1)%ns 352 i = bc_h(1)%i(m) 353 j = bc_h(1)%j(m) 354 k = bc_h(1)%k(m) 355 diss(k+1,j,i) = diss(k,j,i) 356 ENDDO 357 334 358 ENDIF 335 359 … … 345 369 346 370 USE arrays_3d, & 347 ONLY: dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw,&371 ONLY: dd2zu, ddzu, ddzw, diss, e, km, l_grid, l_wall, tend, zu, zw,& 348 372 drho_air, rho_air_zw 349 373 … … 356 380 357 381 USE indices, & 358 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_ s_inner, nzt382 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 359 383 360 384 USE kinds … … 366 390 ONLY: use_sgs_for_particles, wang_kernel 367 391 392 USE surface_mod, & 393 ONLY : bc_h 394 368 395 IMPLICIT NONE 369 396 370 INTEGER(iwp) :: i !< 371 INTEGER(iwp) :: j !< 372 INTEGER(iwp) :: k !< 397 INTEGER(iwp) :: i !< running index x direction 398 INTEGER(iwp) :: j !< running index y direction 399 INTEGER(iwp) :: k !< running index z direction 400 INTEGER(iwp) :: m !< running index surface elements 401 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 402 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 403 373 404 REAL(wp) :: dvar_dz !< 405 REAL(wp) :: flag !< flag to mask topography 374 406 REAL(wp) :: l_stable !< 375 407 REAL(wp) :: var_reference !< … … 384 416 REAL(wp), DIMENSION(nzb+1:nzt) :: ll !< 385 417 386 387 418 ! 388 419 !-- Calculate the mixing length (for dissipation) 389 DO k = nzb_s_inner(j,i)+1, nzt 420 DO k = nzb+1, nzt 421 ! 422 !-- Predetermine flag to mask topography 423 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 424 390 425 dvar_dz = atmos_ocean_sign * & 391 426 ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k) … … 404 439 !-- Adjustment of the mixing length 405 440 IF ( wall_adjustment ) THEN 406 l(k) = MIN( wall_adjustment_factor * & 407 ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k), & 408 l_stable ) 409 ll(k) = MIN( wall_adjustment_factor * & 410 ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k) ) 441 l(k) = MIN( wall_adjustment_factor * l_wall(k,j,i), & 442 l_grid(k), l_stable ) 443 ll(k) = MIN( wall_adjustment_factor * l_wall(k,j,i), l_grid(k) ) 411 444 ELSE 412 445 l(k) = MIN( l_grid(k), l_stable ) … … 415 448 ! 416 449 !-- Calculate the tendency term 417 dissipation(k) = ( 0.19_wp + 0.74_wp * l(k) / ll(k) ) * e(k,j,i) * &450 dissipation(k) = ( 0.19_wp + 0.74_wp * l(k) / ll(k) ) * e(k,j,i) * & 418 451 SQRT( e(k,j,i) ) / l(k) 419 452 420 tend(k,j,i) = tend(k,j,i) &421 + ( &422 ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) ) &423 - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) ) &424 ) * ddx2 425 + ( &426 ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) ) &427 - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) ) &428 ) * ddy2 429 + ( &430 ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &431 * rho_air_zw(k) &432 - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k) &433 * rho_air_zw(k-1) &434 ) * ddzw(k) * drho_air(k) 435 - dissipation(k) 453 tend(k,j,i) = tend(k,j,i) & 454 + ( & 455 ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) ) & 456 - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) ) & 457 ) * ddx2 * flag & 458 + ( & 459 ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) ) & 460 - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) ) & 461 ) * ddy2 * flag & 462 + ( & 463 ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) & 464 * rho_air_zw(k) & 465 - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k) & 466 * rho_air_zw(k-1) & 467 ) * ddzw(k) * drho_air(k) * flag & 468 - dissipation(k) * flag 436 469 437 470 ENDDO … … 441 474 IF ( use_sgs_for_particles .OR. wang_kernel .OR. & 442 475 collision_turbulence ) THEN 443 DO k = nzb_s_inner(j,i)+1, nzt 444 diss(k,j,i) = dissipation(k) 445 ENDDO 446 ! 447 !-- Boundary condition for dissipation 448 diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i) 476 DO k = nzb+1, nzt 477 diss(k,j,i) = dissipation(k) * & 478 MERGE( 1.0_wp, 0.0_wp, & 479 BTEST( wall_flags_0(k,j,i), 0 ) ) 480 ENDDO 481 ! 482 !-- Neumann boundary condition for dissipation diss(nzb,:,:) = diss(nzb+1,:,:) 483 !-- For each surface type determine start and end index (in case of elevated 484 !-- toopography several up/downward facing surfaces may exist. 485 surf_s = bc_h(0)%start_index(j,i) 486 surf_e = bc_h(0)%end_index(j,i) 487 DO m = surf_s, surf_e 488 k = bc_h(0)%k(m) 489 diss(k-1,j,i) = diss(k,j,i) 490 ENDDO 491 ! 492 !-- Downward facing surfaces 493 surf_s = bc_h(1)%start_index(j,i) 494 surf_e = bc_h(1)%end_index(j,i) 495 DO m = surf_s, surf_e 496 k = bc_h(1)%k(m) 497 diss(k+1,j,i) = diss(k,j,i) 498 ENDDO 449 499 ENDIF 450 500 -
palm/trunk/SOURCE/diffusion_s.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 110 110 !> Call for all grid points 111 111 !------------------------------------------------------------------------------! 112 SUBROUTINE diffusion_s( s, s_flux_b, s_flux_t, wall_s_flux ) 112 SUBROUTINE diffusion_s( s, s_flux_def_h_up, s_flux_def_h_down, & 113 s_flux_t, & 114 s_flux_lsm_h_up, s_flux_usm_h_up, & 115 s_flux_def_v_north, s_flux_def_v_south, & 116 s_flux_def_v_east, s_flux_def_v_west, & 117 s_flux_lsm_v_north, s_flux_lsm_v_south, & 118 s_flux_lsm_v_east, s_flux_lsm_v_west, & 119 s_flux_usm_v_north, s_flux_usm_v_south, & 120 s_flux_usm_v_east, s_flux_usm_v_west ) 113 121 114 122 USE arrays_3d, & … … 119 127 120 128 USE grid_variables, & 121 ONLY: ddx2, ddy2 , fwxm, fwxp, fwym, fwyp, wall_w_x, wall_w_y129 ONLY: ddx2, ddy2 122 130 123 131 USE indices, & 124 132 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, & 125 nz b_diff_s_inner, nzb_s_inner, nzb_s_outer, nzt, nzt_diff133 nzt, wall_flags_0 126 134 127 135 USE kinds 128 136 137 USE surface_mod, & 138 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 139 surf_usm_v 140 129 141 IMPLICIT NONE 130 142 131 INTEGER(iwp) :: i !< 132 INTEGER(iwp) :: j !< 133 INTEGER(iwp) :: k !< 134 REAL(wp) :: wall_s_flux(0:4) !< 135 REAL(wp), DIMENSION(nysg:nyng,nxlg:nxrg) :: s_flux_b, s_flux_t !< 143 INTEGER(iwp) :: i !< running index x direction 144 INTEGER(iwp) :: j !< running index y direction 145 INTEGER(iwp) :: k !< running index z direction 146 INTEGER(iwp) :: m !< running index surface elements 147 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 148 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 149 150 REAL(wp) :: flag !< flag to mask topography grid points 151 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 152 REAL(wp) :: mask_east !< flag to mask vertical surface east of the grid point 153 REAL(wp) :: mask_north !< flag to mask vertical surface north of the grid point 154 REAL(wp) :: mask_south !< flag to mask vertical surface south of the grid point 155 REAL(wp) :: mask_west !< flag to mask vertical surface west of the grid point 156 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 157 158 REAL(wp), DIMENSION(1:surf_def_v(0)%ns) :: s_flux_def_v_north !< flux at north-facing vertical default-type surfaces 159 REAL(wp), DIMENSION(1:surf_def_v(1)%ns) :: s_flux_def_v_south !< flux at south-facing vertical default-type surfaces 160 REAL(wp), DIMENSION(1:surf_def_v(2)%ns) :: s_flux_def_v_east !< flux at east-facing vertical default-type surfaces 161 REAL(wp), DIMENSION(1:surf_def_v(3)%ns) :: s_flux_def_v_west !< flux at west-facing vertical default-type surfaces 162 REAL(wp), DIMENSION(1:surf_def_h(0)%ns) :: s_flux_def_h_up !< flux at horizontal upward-facing default-type surfaces 163 REAL(wp), DIMENSION(1:surf_def_h(1)%ns) :: s_flux_def_h_down !< flux at horizontal donwward-facing default-type surfaces 164 REAL(wp), DIMENSION(1:surf_lsm_h%ns) :: s_flux_lsm_h_up !< flux at horizontal upward-facing natural-type surfaces 165 REAL(wp), DIMENSION(1:surf_lsm_v(0)%ns) :: s_flux_lsm_v_north !< flux at north-facing vertical natural-type surfaces 166 REAL(wp), DIMENSION(1:surf_lsm_v(1)%ns) :: s_flux_lsm_v_south !< flux at south-facing vertical natural-type surfaces 167 REAL(wp), DIMENSION(1:surf_lsm_v(2)%ns) :: s_flux_lsm_v_east !< flux at east-facing vertical natural-type surfaces 168 REAL(wp), DIMENSION(1:surf_lsm_v(3)%ns) :: s_flux_lsm_v_west !< flux at west-facing vertical natural-type surfaces 169 REAL(wp), DIMENSION(1:surf_usm_h%ns) :: s_flux_usm_h_up !< flux at horizontal upward-facing urban-type surfaces 170 REAL(wp), DIMENSION(1:surf_usm_v(0)%ns) :: s_flux_usm_v_north !< flux at north-facing vertical urban-type surfaces 171 REAL(wp), DIMENSION(1:surf_usm_v(1)%ns) :: s_flux_usm_v_south !< flux at south-facing vertical urban-type surfaces 172 REAL(wp), DIMENSION(1:surf_usm_v(2)%ns) :: s_flux_usm_v_east !< flux at east-facing vertical urban-type surfaces 173 REAL(wp), DIMENSION(1:surf_usm_v(3)%ns) :: s_flux_usm_v_west !< flux at west-facing vertical urban-type surfaces 174 REAL(wp), DIMENSION(1:surf_def_h(2)%ns) :: s_flux_t !< flux at model top 136 175 #if defined( __nopointer ) 137 176 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: s !< … … 144 183 ! 145 184 !-- Compute horizontal diffusion 146 DO k = nzb_s_outer(j,i)+1, nzt 185 DO k = nzb+1, nzt 186 ! 187 !-- Predetermine flag to mask topography and wall-bounded grid points 188 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 189 ! 190 !-- Predetermine flag to mask wall-bounded grid points, equivalent to 191 !-- former s_outer array 192 mask_west = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i-1), 0 ) ) 193 mask_east = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i+1), 0 ) ) 194 mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 0 ) ) 195 mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 0 ) ) 147 196 148 197 tend(k,j,i) = tend(k,j,i) & 149 198 + 0.5_wp * ( & 150 ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) & 151 - ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) & 152 ) * ddx2 & 199 mask_east * ( kh(k,j,i) + kh(k,j,i+1) ) & 200 * ( s(k,j,i+1) - s(k,j,i) ) & 201 - mask_west * ( kh(k,j,i) + kh(k,j,i-1) ) & 202 * ( s(k,j,i) - s(k,j,i-1) ) & 203 ) * ddx2 * flag & 153 204 + 0.5_wp * ( & 154 ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) & 155 - ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) & 156 ) * ddy2 157 ENDDO 158 159 ! 160 !-- Apply prescribed horizontal wall heatflux where necessary 161 IF ( ( wall_w_x(j,i) /= 0.0_wp ) .OR. ( wall_w_y(j,i) /= 0.0_wp ) & 162 ) THEN 163 DO k = nzb_s_inner(j,i)+1, nzb_s_outer(j,i) 164 205 mask_north * ( kh(k,j,i) + kh(k,j+1,i) ) & 206 * ( s(k,j+1,i) - s(k,j,i) ) & 207 - mask_south * ( kh(k,j,i) + kh(k,j-1,i) ) & 208 * ( s(k,j,i) - s(k,j-1,i) ) & 209 ) * ddy2 * flag 210 ENDDO 211 212 ! 213 !-- Apply prescribed horizontal wall heatflux where necessary. First, 214 !-- determine start and end index for respective (j,i)-index. Please 215 !-- note, in the flat case following loop will not be entered, as 216 !-- surf_s=1 and surf_e=0. Furtermore, note, no vertical natural surfaces 217 !-- so far. 218 !-- First, for default-type surfaces 219 !-- North-facing vertical default-type surfaces 220 surf_s = surf_def_v(0)%start_index(j,i) 221 surf_e = surf_def_v(0)%end_index(j,i) 222 DO m = surf_s, surf_e 223 k = surf_def_v(0)%k(m) 224 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_north(m) * ddy2 225 ENDDO 226 ! 227 !-- South-facing vertical default-type surfaces 228 surf_s = surf_def_v(1)%start_index(j,i) 229 surf_e = surf_def_v(1)%end_index(j,i) 230 DO m = surf_s, surf_e 231 k = surf_def_v(1)%k(m) 232 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_south(m) * ddy2 233 ENDDO 234 ! 235 !-- East-facing vertical default-type surfaces 236 surf_s = surf_def_v(2)%start_index(j,i) 237 surf_e = surf_def_v(2)%end_index(j,i) 238 DO m = surf_s, surf_e 239 k = surf_def_v(2)%k(m) 240 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_east(m) * ddx2 241 ENDDO 242 ! 243 !-- West-facing vertical default-type surfaces 244 surf_s = surf_def_v(3)%start_index(j,i) 245 surf_e = surf_def_v(3)%end_index(j,i) 246 DO m = surf_s, surf_e 247 k = surf_def_v(3)%k(m) 248 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_west(m) * ddx2 249 ENDDO 250 ! 251 !-- Now, for natural-type surfaces. 252 !-- North-facing 253 surf_s = surf_lsm_v(0)%start_index(j,i) 254 surf_e = surf_lsm_v(0)%end_index(j,i) 255 DO m = surf_s, surf_e 256 k = surf_lsm_v(0)%k(m) 257 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_north(m) * ddy2 258 ENDDO 259 ! 260 !-- South-facing 261 surf_s = surf_lsm_v(1)%start_index(j,i) 262 surf_e = surf_lsm_v(1)%end_index(j,i) 263 DO m = surf_s, surf_e 264 k = surf_lsm_v(1)%k(m) 265 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_south(m) * ddy2 266 ENDDO 267 ! 268 !-- East-facing 269 surf_s = surf_lsm_v(2)%start_index(j,i) 270 surf_e = surf_lsm_v(2)%end_index(j,i) 271 DO m = surf_s, surf_e 272 k = surf_lsm_v(2)%k(m) 273 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_east(m) * ddx2 274 ENDDO 275 ! 276 !-- West-facing 277 surf_s = surf_lsm_v(3)%start_index(j,i) 278 surf_e = surf_lsm_v(3)%end_index(j,i) 279 DO m = surf_s, surf_e 280 k = surf_lsm_v(3)%k(m) 281 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_west(m) * ddx2 282 ENDDO 283 ! 284 !-- Now, for urban-type surfaces. 285 !-- North-facing 286 surf_s = surf_usm_v(0)%start_index(j,i) 287 surf_e = surf_usm_v(0)%end_index(j,i) 288 DO m = surf_s, surf_e 289 k = surf_usm_v(0)%k(m) 290 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_north(m) * ddy2 291 ENDDO 292 ! 293 !-- South-facing 294 surf_s = surf_usm_v(1)%start_index(j,i) 295 surf_e = surf_usm_v(1)%end_index(j,i) 296 DO m = surf_s, surf_e 297 k = surf_usm_v(1)%k(m) 298 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_south(m) * ddy2 299 ENDDO 300 ! 301 !-- East-facing 302 surf_s = surf_usm_v(2)%start_index(j,i) 303 surf_e = surf_usm_v(2)%end_index(j,i) 304 DO m = surf_s, surf_e 305 k = surf_usm_v(2)%k(m) 306 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_east(m) * ddx2 307 ENDDO 308 ! 309 !-- West-facing 310 surf_s = surf_usm_v(3)%start_index(j,i) 311 surf_e = surf_usm_v(3)%end_index(j,i) 312 DO m = surf_s, surf_e 313 k = surf_usm_v(3)%k(m) 314 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_west(m) * ddx2 315 ENDDO 316 317 ! 318 !-- Compute vertical diffusion. In case that surface fluxes have been 319 !-- prescribed or computed at bottom and/or top, index k starts/ends at 320 !-- nzb+2 or nzt-1, respectively. Model top is also mask if top flux 321 !-- is given. 322 DO k = nzb+1, nzt 323 ! 324 !-- Determine flags to mask topography below and above. Flag 0 is 325 !-- used to mask topography in general, and flag 8 implies 326 !-- information about use_surface_fluxes. Flag 9 is used to control 327 !-- flux at model top. 328 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 329 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 330 mask_top = MERGE( 1.0_wp, 0.0_wp, & 331 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 332 MERGE( 1.0_wp, 0.0_wp, & 333 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 334 flag = MERGE( 1.0_wp, 0.0_wp, & 335 BTEST( wall_flags_0(k,j,i), 0 ) ) 336 337 tend(k,j,i) = tend(k,j,i) & 338 + 0.5_wp * ( & 339 ( kh(k,j,i) + kh(k+1,j,i) ) * & 340 ( s(k+1,j,i)-s(k,j,i) ) * ddzu(k+1) & 341 * rho_air_zw(k) & 342 * mask_top & 343 - ( kh(k,j,i) + kh(k-1,j,i) ) * & 344 ( s(k,j,i)-s(k-1,j,i) ) * ddzu(k) & 345 * rho_air_zw(k-1) & 346 * mask_bottom & 347 ) * ddzw(k) * drho_air(k) & 348 * flag 349 ENDDO 350 351 ! 352 !-- Vertical diffusion at horizontal walls. 353 IF ( use_surface_fluxes ) THEN 354 ! 355 !-- Default-type surfaces, upward-facing 356 surf_s = surf_def_h(0)%start_index(j,i) 357 surf_e = surf_def_h(0)%end_index(j,i) 358 DO m = surf_s, surf_e 359 360 k = surf_def_h(0)%k(m) 361 tend(k,j,i) = tend(k,j,i) + s_flux_def_h_up(m) & 362 * ddzw(k) * drho_air(k) 363 364 ENDDO 365 ! 366 !-- Default-type surfaces, downward-facing 367 surf_s = surf_def_h(1)%start_index(j,i) 368 surf_e = surf_def_h(1)%end_index(j,i) 369 DO m = surf_s, surf_e 370 371 k = surf_def_h(1)%k(m) 372 tend(k,j,i) = tend(k,j,i) + s_flux_def_h_down(m) & 373 * ddzw(k) * drho_air(k) 374 375 ENDDO 376 ! 377 !-- Natural-type surfaces, upward-facing 378 surf_s = surf_lsm_h%start_index(j,i) 379 surf_e = surf_lsm_h%end_index(j,i) 380 DO m = surf_s, surf_e 381 382 k = surf_lsm_h%k(m) 383 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_h_up(m) & 384 * ddzw(k) * drho_air(k) 385 386 ENDDO 387 ! 388 !-- Urban-type surfaces, upward-facing 389 surf_s = surf_usm_h%start_index(j,i) 390 surf_e = surf_usm_h%end_index(j,i) 391 DO m = surf_s, surf_e 392 393 k = surf_usm_h%k(m) 394 tend(k,j,i) = tend(k,j,i) + s_flux_usm_h_up(m) & 395 * ddzw(k) * drho_air(k) 396 397 ENDDO 398 399 ENDIF 400 ! 401 !-- Vertical diffusion at the last computational gridpoint along z-direction 402 IF ( use_top_fluxes ) THEN 403 surf_s = surf_def_h(2)%start_index(j,i) 404 surf_e = surf_def_h(2)%end_index(j,i) 405 DO m = surf_s, surf_e 406 407 k = surf_def_h(2)%k(m) 165 408 tend(k,j,i) = tend(k,j,i) & 166 + ( fwxp(j,i) * 0.5_wp * & 167 ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) & 168 + ( 1.0_wp - fwxp(j,i) ) * wall_s_flux(1) & 169 -fwxm(j,i) * 0.5_wp * & 170 ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) & 171 + ( 1.0_wp - fwxm(j,i) ) * wall_s_flux(2) & 172 ) * ddx2 & 173 + ( fwyp(j,i) * 0.5_wp * & 174 ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) & 175 + ( 1.0_wp - fwyp(j,i) ) * wall_s_flux(3) & 176 -fwym(j,i) * 0.5_wp * & 177 ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) & 178 + ( 1.0_wp - fwym(j,i) ) * wall_s_flux(4) & 179 ) * ddy2 409 + ( - s_flux_t(m) ) * ddzw(k) * drho_air(k) 180 410 ENDDO 181 411 ENDIF 182 412 183 !184 !-- Compute vertical diffusion. In case that surface fluxes have been185 !-- prescribed or computed at bottom and/or top, index k starts/ends at186 !-- nzb+2 or nzt-1, respectively.187 DO k = nzb_diff_s_inner(j,i), nzt_diff188 189 tend(k,j,i) = tend(k,j,i) &190 + 0.5_wp * ( &191 ( kh(k,j,i) + kh(k+1,j,i) ) * ( s(k+1,j,i)-s(k,j,i) ) * ddzu(k+1) &192 * rho_air_zw(k) &193 - ( kh(k,j,i) + kh(k-1,j,i) ) * ( s(k,j,i)-s(k-1,j,i) ) * ddzu(k) &194 * rho_air_zw(k-1) &195 ) * ddzw(k) * drho_air(k)196 ENDDO197 198 !199 !-- Vertical diffusion at the first computational gridpoint along200 !-- z-direction201 IF ( use_surface_fluxes ) THEN202 203 k = nzb_s_inner(j,i)+1204 205 tend(k,j,i) = tend(k,j,i) &206 + ( 0.5_wp * ( kh(k,j,i)+kh(k+1,j,i) ) &207 * ( s(k+1,j,i)-s(k,j,i) ) &208 * ddzu(k+1) &209 * rho_air_zw(k) &210 + s_flux_b(j,i) &211 ) * ddzw(k) * drho_air(k)212 213 ENDIF214 215 !216 !-- Vertical diffusion at the last computational gridpoint along217 !-- z-direction218 IF ( use_top_fluxes ) THEN219 220 k = nzt221 222 tend(k,j,i) = tend(k,j,i) &223 + ( - s_flux_t(j,i) &224 - 0.5_wp * ( kh(k-1,j,i)+kh(k,j,i) )&225 * ( s(k,j,i)-s(k-1,j,i) ) &226 * ddzu(k) &227 * rho_air_zw(k-1) &228 ) * ddzw(k) * drho_air(k)229 230 ENDIF231 232 413 ENDDO 233 414 ENDDO 234 415 235 416 END SUBROUTINE diffusion_s 236 237 417 238 418 !------------------------------------------------------------------------------! … … 241 421 !> Call for grid point i,j 242 422 !------------------------------------------------------------------------------! 243 SUBROUTINE diffusion_s_ij( i, j, s, s_flux_b, s_flux_t, wall_s_flux ) 423 SUBROUTINE diffusion_s_ij( i, j, s, & 424 s_flux_def_h_up, s_flux_def_h_down, & 425 s_flux_t, & 426 s_flux_lsm_h_up, s_flux_usm_h_up, & 427 s_flux_def_v_north, s_flux_def_v_south, & 428 s_flux_def_v_east, s_flux_def_v_west, & 429 s_flux_lsm_v_north, s_flux_lsm_v_south, & 430 s_flux_lsm_v_east, s_flux_lsm_v_west, & 431 s_flux_usm_v_north, s_flux_usm_v_south, & 432 s_flux_usm_v_east, s_flux_usm_v_west ) 244 433 245 434 USE arrays_3d, & … … 250 439 251 440 USE grid_variables, & 252 ONLY: ddx2, ddy2 , fwxm, fwxp, fwym, fwyp, wall_w_x, wall_w_y441 ONLY: ddx2, ddy2 253 442 254 443 USE indices, & 255 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_diff_s_inner, nzb_s_inner, & 256 nzb_s_outer, nzt, nzt_diff 444 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzt, wall_flags_0 257 445 258 446 USE kinds 259 447 448 USE surface_mod, & 449 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 450 surf_usm_v 451 260 452 IMPLICIT NONE 261 453 262 INTEGER(iwp) :: i !< 263 INTEGER(iwp) :: j !< 264 INTEGER(iwp) :: k !< 265 REAL(wp) :: wall_s_flux(0:4) !< 266 REAL(wp), DIMENSION(nysg:nyng,nxlg:nxrg) :: s_flux_b !< 267 REAL(wp), DIMENSION(nysg:nyng,nxlg:nxrg) :: s_flux_t !< 454 INTEGER(iwp) :: i !< running index x direction 455 INTEGER(iwp) :: j !< running index y direction 456 INTEGER(iwp) :: k !< running index z direction 457 INTEGER(iwp) :: m !< running index surface elements 458 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 459 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 460 461 REAL(wp) :: flag !< flag to mask topography grid points 462 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 463 REAL(wp) :: mask_east !< flag to mask vertical surface east of the grid point 464 REAL(wp) :: mask_north !< flag to mask vertical surface north of the grid point 465 REAL(wp) :: mask_south !< flag to mask vertical surface south of the grid point 466 REAL(wp) :: mask_west !< flag to mask vertical surface west of the grid point 467 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 468 469 REAL(wp), DIMENSION(1:surf_def_v(0)%ns) :: s_flux_def_v_north !< flux at north-facing vertical default-type surfaces 470 REAL(wp), DIMENSION(1:surf_def_v(1)%ns) :: s_flux_def_v_south !< flux at south-facing vertical default-type surfaces 471 REAL(wp), DIMENSION(1:surf_def_v(2)%ns) :: s_flux_def_v_east !< flux at east-facing vertical default-type surfaces 472 REAL(wp), DIMENSION(1:surf_def_v(3)%ns) :: s_flux_def_v_west !< flux at west-facing vertical default-type surfaces 473 REAL(wp), DIMENSION(1:surf_def_h(0)%ns) :: s_flux_def_h_up !< flux at horizontal upward-facing default-type surfaces 474 REAL(wp), DIMENSION(1:surf_def_h(1)%ns) :: s_flux_def_h_down !< flux at horizontal donwward-facing default-type surfaces 475 REAL(wp), DIMENSION(1:surf_lsm_h%ns) :: s_flux_lsm_h_up !< flux at horizontal upward-facing natural-type surfaces 476 REAL(wp), DIMENSION(1:surf_lsm_v(0)%ns) :: s_flux_lsm_v_north !< flux at north-facing vertical urban-type surfaces 477 REAL(wp), DIMENSION(1:surf_lsm_v(1)%ns) :: s_flux_lsm_v_south !< flux at south-facing vertical urban-type surfaces 478 REAL(wp), DIMENSION(1:surf_lsm_v(2)%ns) :: s_flux_lsm_v_east !< flux at east-facing vertical urban-type surfaces 479 REAL(wp), DIMENSION(1:surf_lsm_v(3)%ns) :: s_flux_lsm_v_west !< flux at west-facing vertical urban-type surfaces 480 REAL(wp), DIMENSION(1:surf_usm_h%ns) :: s_flux_usm_h_up !< flux at horizontal upward-facing urban-type surfaces 481 REAL(wp), DIMENSION(1:surf_usm_v(0)%ns) :: s_flux_usm_v_north !< flux at north-facing vertical urban-type surfaces 482 REAL(wp), DIMENSION(1:surf_usm_v(1)%ns) :: s_flux_usm_v_south !< flux at south-facing vertical urban-type surfaces 483 REAL(wp), DIMENSION(1:surf_usm_v(2)%ns) :: s_flux_usm_v_east !< flux at east-facing vertical urban-type surfaces 484 REAL(wp), DIMENSION(1:surf_usm_v(3)%ns) :: s_flux_usm_v_west !< flux at west-facing vertical urban-type surfaces 485 REAL(wp), DIMENSION(1:surf_def_h(2)%ns) :: s_flux_t !< flux at model top 268 486 #if defined( __nopointer ) 269 487 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: s !< … … 274 492 ! 275 493 !-- Compute horizontal diffusion 276 DO k = nzb_s_outer(j,i)+1, nzt 494 DO k = nzb+1, nzt 495 ! 496 !-- Predetermine flag to mask topography and wall-bounded grid points 497 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 498 ! 499 !-- Predetermine flag to mask wall-bounded grid points, equivalent to 500 !-- former s_outer array 501 mask_west = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i-1), 0 ) ) 502 mask_east = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i+1), 0 ) ) 503 mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 0 ) ) 504 mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 0 ) ) 505 ! 506 !-- Finally, determine flag to mask both topography itself as well 507 !-- as wall-bounded grid points, which will be treated further below 277 508 278 509 tend(k,j,i) = tend(k,j,i) & 279 510 + 0.5_wp * ( & 280 ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) & 281 - ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) & 282 ) * ddx2 & 511 mask_east * ( kh(k,j,i) + kh(k,j,i+1) ) & 512 * ( s(k,j,i+1) - s(k,j,i) ) & 513 - mask_west * ( kh(k,j,i) + kh(k,j,i-1) ) & 514 * ( s(k,j,i) - s(k,j,i-1) ) & 515 ) * ddx2 * flag & 283 516 + 0.5_wp * ( & 284 ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) & 285 - ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) & 286 ) * ddy2 287 ENDDO 288 289 ! 290 !-- Apply prescribed horizontal wall heatflux where necessary 291 IF ( ( wall_w_x(j,i) /= 0.0_wp ) .OR. ( wall_w_y(j,i) /= 0.0_wp ) ) & 292 THEN 293 DO k = nzb_s_inner(j,i)+1, nzb_s_outer(j,i) 294 295 tend(k,j,i) = tend(k,j,i) & 296 + ( fwxp(j,i) * 0.5_wp * & 297 ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) & 298 + ( 1.0_wp - fwxp(j,i) ) * wall_s_flux(1) & 299 -fwxm(j,i) * 0.5_wp * & 300 ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) & 301 + ( 1.0_wp - fwxm(j,i) ) * wall_s_flux(2) & 302 ) * ddx2 & 303 + ( fwyp(j,i) * 0.5_wp * & 304 ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) & 305 + ( 1.0_wp - fwyp(j,i) ) * wall_s_flux(3) & 306 -fwym(j,i) * 0.5_wp * & 307 ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) & 308 + ( 1.0_wp - fwym(j,i) ) * wall_s_flux(4) & 309 ) * ddy2 517 mask_north * ( kh(k,j,i) + kh(k,j+1,i) ) & 518 * ( s(k,j+1,i) - s(k,j,i) ) & 519 - mask_south * ( kh(k,j,i) + kh(k,j-1,i) ) & 520 * ( s(k,j,i) - s(k,j-1,i) ) & 521 ) * ddy2 * flag 522 ENDDO 523 524 ! 525 !-- Apply prescribed horizontal wall heatflux where necessary. First, 526 !-- determine start and end index for respective (j,i)-index. Please 527 !-- note, in the flat case following loops will not be entered, as 528 !-- surf_s=1 and surf_e=0. Furtermore, note, no vertical natural surfaces 529 !-- so far. 530 !-- First, for default-type surfaces 531 !-- North-facing vertical default-type surfaces 532 surf_s = surf_def_v(0)%start_index(j,i) 533 surf_e = surf_def_v(0)%end_index(j,i) 534 DO m = surf_s, surf_e 535 k = surf_def_v(0)%k(m) 536 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_north(m) * ddy2 537 ENDDO 538 ! 539 !-- South-facing vertical default-type surfaces 540 surf_s = surf_def_v(1)%start_index(j,i) 541 surf_e = surf_def_v(1)%end_index(j,i) 542 DO m = surf_s, surf_e 543 k = surf_def_v(1)%k(m) 544 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_south(m) * ddy2 545 ENDDO 546 ! 547 !-- East-facing vertical default-type surfaces 548 surf_s = surf_def_v(2)%start_index(j,i) 549 surf_e = surf_def_v(2)%end_index(j,i) 550 DO m = surf_s, surf_e 551 k = surf_def_v(2)%k(m) 552 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_east(m) * ddx2 553 ENDDO 554 ! 555 !-- West-facing vertical default-type surfaces 556 surf_s = surf_def_v(3)%start_index(j,i) 557 surf_e = surf_def_v(3)%end_index(j,i) 558 DO m = surf_s, surf_e 559 k = surf_def_v(3)%k(m) 560 tend(k,j,i) = tend(k,j,i) + s_flux_def_v_west(m) * ddx2 561 ENDDO 562 ! 563 !-- Now, for natural-type surfaces 564 !-- North-facing 565 surf_s = surf_lsm_v(0)%start_index(j,i) 566 surf_e = surf_lsm_v(0)%end_index(j,i) 567 DO m = surf_s, surf_e 568 k = surf_lsm_v(0)%k(m) 569 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_north(m) * ddy2 570 ENDDO 571 ! 572 !-- South-facing 573 surf_s = surf_lsm_v(1)%start_index(j,i) 574 surf_e = surf_lsm_v(1)%end_index(j,i) 575 DO m = surf_s, surf_e 576 k = surf_lsm_v(1)%k(m) 577 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_south(m) * ddy2 578 ENDDO 579 ! 580 !-- East-facing 581 surf_s = surf_lsm_v(2)%start_index(j,i) 582 surf_e = surf_lsm_v(2)%end_index(j,i) 583 DO m = surf_s, surf_e 584 k = surf_lsm_v(2)%k(m) 585 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_east(m) * ddx2 586 ENDDO 587 ! 588 !-- West-facing 589 surf_s = surf_lsm_v(3)%start_index(j,i) 590 surf_e = surf_lsm_v(3)%end_index(j,i) 591 DO m = surf_s, surf_e 592 k = surf_lsm_v(3)%k(m) 593 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_v_west(m) * ddx2 594 ENDDO 595 ! 596 !-- Now, for urban-type surfaces 597 !-- North-facing 598 surf_s = surf_usm_v(0)%start_index(j,i) 599 surf_e = surf_usm_v(0)%end_index(j,i) 600 DO m = surf_s, surf_e 601 k = surf_usm_v(0)%k(m) 602 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_north(m) * ddy2 603 ENDDO 604 ! 605 !-- South-facing 606 surf_s = surf_usm_v(1)%start_index(j,i) 607 surf_e = surf_usm_v(1)%end_index(j,i) 608 DO m = surf_s, surf_e 609 k = surf_usm_v(1)%k(m) 610 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_south(m) * ddy2 611 ENDDO 612 ! 613 !-- East-facing 614 surf_s = surf_usm_v(2)%start_index(j,i) 615 surf_e = surf_usm_v(2)%end_index(j,i) 616 DO m = surf_s, surf_e 617 k = surf_usm_v(2)%k(m) 618 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_east(m) * ddx2 619 ENDDO 620 ! 621 !-- West-facing 622 surf_s = surf_usm_v(3)%start_index(j,i) 623 surf_e = surf_usm_v(3)%end_index(j,i) 624 DO m = surf_s, surf_e 625 k = surf_usm_v(3)%k(m) 626 tend(k,j,i) = tend(k,j,i) + s_flux_usm_v_west(m) * ddx2 627 ENDDO 628 629 630 ! 631 !-- Compute vertical diffusion. In case that surface fluxes have been 632 !-- prescribed or computed at bottom and/or top, index k starts/ends at 633 !-- nzb+2 or nzt-1, respectively. Model top is also mask if top flux 634 !-- is given. 635 DO k = nzb+1, nzt 636 ! 637 !-- Determine flags to mask topography below and above. Flag 0 is 638 !-- used to mask topography in general, and flag 8 implies 639 !-- information about use_surface_fluxes. Flag 9 is used to control 640 !-- flux at model top. 641 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 642 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 643 mask_top = MERGE( 1.0_wp, 0.0_wp, & 644 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 645 MERGE( 1.0_wp, 0.0_wp, & 646 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 647 flag = MERGE( 1.0_wp, 0.0_wp, & 648 BTEST( wall_flags_0(k,j,i), 0 ) ) 649 650 tend(k,j,i) = tend(k,j,i) & 651 + 0.5_wp * ( & 652 ( kh(k,j,i) + kh(k+1,j,i) ) * & 653 ( s(k+1,j,i)-s(k,j,i) ) * ddzu(k+1) & 654 * rho_air_zw(k) & 655 * mask_top & 656 - ( kh(k,j,i) + kh(k-1,j,i) ) * & 657 ( s(k,j,i)-s(k-1,j,i) ) * ddzu(k) & 658 * rho_air_zw(k-1) & 659 * mask_bottom & 660 ) * ddzw(k) * drho_air(k) & 661 * flag 662 ENDDO 663 664 ! 665 !-- Vertical diffusion at horizontal walls. 666 !-- TO DO: Adjust for downward facing walls and mask already in main loop 667 IF ( use_surface_fluxes ) THEN 668 ! 669 !-- Default-type surfaces, upward-facing 670 surf_s = surf_def_h(0)%start_index(j,i) 671 surf_e = surf_def_h(0)%end_index(j,i) 672 DO m = surf_s, surf_e 673 674 k = surf_def_h(0)%k(m) 675 676 tend(k,j,i) = tend(k,j,i) + s_flux_def_h_up(m) & 677 * ddzw(k) * drho_air(k) 678 ENDDO 679 ! 680 !-- Default-type surfaces, downward-facing 681 surf_s = surf_def_h(1)%start_index(j,i) 682 surf_e = surf_def_h(1)%end_index(j,i) 683 DO m = surf_s, surf_e 684 685 k = surf_def_h(1)%k(m) 686 687 tend(k,j,i) = tend(k,j,i) + s_flux_def_h_down(m) & 688 * ddzw(k) * drho_air(k) 689 ENDDO 690 ! 691 !-- Natural-type surfaces, upward-facing 692 surf_s = surf_lsm_h%start_index(j,i) 693 surf_e = surf_lsm_h%end_index(j,i) 694 DO m = surf_s, surf_e 695 k = surf_lsm_h%k(m) 696 697 tend(k,j,i) = tend(k,j,i) + s_flux_lsm_h_up(m) & 698 * ddzw(k) * drho_air(k) 699 ENDDO 700 ! 701 !-- Urban-type surfaces, upward-facing 702 surf_s = surf_usm_h%start_index(j,i) 703 surf_e = surf_usm_h%end_index(j,i) 704 DO m = surf_s, surf_e 705 k = surf_usm_h%k(m) 706 707 tend(k,j,i) = tend(k,j,i) + s_flux_usm_h_up(m) & 708 * ddzw(k) * drho_air(k) 310 709 ENDDO 311 710 ENDIF 312 313 !314 !-- Compute vertical diffusion. In case that surface fluxes have been315 !-- prescribed or computed at bottom and/or top, index k starts/ends at316 !-- nzb+2 or nzt-1, respectively.317 DO k = nzb_diff_s_inner(j,i), nzt_diff318 319 tend(k,j,i) = tend(k,j,i) &320 + 0.5_wp * ( &321 ( kh(k,j,i) + kh(k+1,j,i) ) * ( s(k+1,j,i)-s(k,j,i) ) * ddzu(k+1) &322 * rho_air_zw(k) &323 - ( kh(k,j,i) + kh(k-1,j,i) ) * ( s(k,j,i)-s(k-1,j,i) ) * ddzu(k) &324 * rho_air_zw(k-1) &325 ) * ddzw(k) * drho_air(k)326 ENDDO327 328 !329 !-- Vertical diffusion at the first computational gridpoint along z-direction330 IF ( use_surface_fluxes ) THEN331 332 k = nzb_s_inner(j,i)+1333 334 tend(k,j,i) = tend(k,j,i) + ( 0.5_wp * ( kh(k,j,i)+kh(k+1,j,i) ) &335 * ( s(k+1,j,i)-s(k,j,i) ) &336 * ddzu(k+1) &337 * rho_air_zw(k) &338 + s_flux_b(j,i) &339 ) * ddzw(k) * drho_air(k)340 341 ENDIF342 343 711 ! 344 712 !-- Vertical diffusion at the last computational gridpoint along z-direction 345 713 IF ( use_top_fluxes ) THEN 346 347 k = nzt 348 349 tend(k,j,i) = tend(k,j,i) + ( - s_flux_t(j,i) & 350 - 0.5_wp * ( kh(k-1,j,i)+kh(k,j,i) ) & 351 * ( s(k,j,i)-s(k-1,j,i) ) & 352 * ddzu(k) & 353 * rho_air_zw(k-1) & 354 ) * ddzw(k) * drho_air(k) 355 714 surf_s = surf_def_h(2)%start_index(j,i) 715 surf_e = surf_def_h(2)%end_index(j,i) 716 DO m = surf_s, surf_e 717 718 k = surf_def_h(2)%k(m) 719 tend(k,j,i) = tend(k,j,i) & 720 + ( - s_flux_t(m) ) * ddzw(k) * drho_air(k) 721 ENDDO 356 722 ENDIF 357 723 -
palm/trunk/SOURCE/diffusion_u.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 95 95 96 96 97 USE wall_fluxes_mod98 99 97 PRIVATE 100 98 PUBLIC diffusion_u … … 116 114 117 115 USE arrays_3d, & 118 ONLY: ddzu, ddzw, km, tend, u, usws, uswst, v, w, & 119 drho_air, rho_air_zw 116 ONLY: ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw 120 117 121 118 USE control_parameters, & 122 ONLY: constant_top_momentumflux, topography, use_surface_fluxes,&119 ONLY: constant_top_momentumflux, use_surface_fluxes, & 123 120 use_top_fluxes 124 121 125 122 USE grid_variables, & 126 ONLY: ddx, ddx2, ddy , fym, fyp, wall_u123 ONLY: ddx, ddx2, ddy 127 124 128 125 USE indices, & 129 ONLY: nxl, nxlu, nxr, nyn, nys, nzb, nzb_diff_u, nzb_u_inner, & 130 nzb_u_outer, nzt, nzt_diff 131 126 ONLY: nxl, nxlu, nxr, nyn, nys, nzb, nzt, wall_flags_0 127 132 128 USE kinds 133 129 130 USE surface_mod, & 131 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 132 surf_usm_v 133 134 134 IMPLICIT NONE 135 135 136 INTEGER(iwp) :: i !< 137 INTEGER(iwp) :: j !< 138 INTEGER(iwp) :: k !< 139 REAL(wp) :: kmym !< 140 REAL(wp) :: kmyp !< 141 REAL(wp) :: kmzm !< 142 REAL(wp) :: kmzp !< 143 144 REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) :: usvs !< 145 146 ! 147 !-- First calculate horizontal momentum flux u'v' at vertical walls, 148 !-- if neccessary 149 IF ( topography /= 'flat' ) THEN 150 CALL wall_fluxes( usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, nzb_u_inner, & 151 nzb_u_outer, wall_u ) 152 ENDIF 136 INTEGER(iwp) :: i !< running index x direction 137 INTEGER(iwp) :: j !< running index y direction 138 INTEGER(iwp) :: k !< running index z direction 139 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 140 INTEGER(iwp) :: m !< running index surface elements 141 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 142 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 143 144 REAL(wp) :: flag !< flag to mask topography grid points 145 REAL(wp) :: kmym !< 146 REAL(wp) :: kmyp !< 147 REAL(wp) :: kmzm !< 148 REAL(wp) :: kmzp !< 149 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 150 REAL(wp) :: mask_north !< flag to mask vertical surface north of the grid point 151 REAL(wp) :: mask_south !< flag to mask vertical surface south of the grid point 152 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 153 154 153 155 154 156 DO i = nxlu, nxr … … 156 158 ! 157 159 !-- Compute horizontal diffusion 158 DO k = nzb_u_outer(j,i)+1, nzt 160 DO k = nzb+1, nzt 161 ! 162 !-- Predetermine flag to mask topography and wall-bounded grid points. 163 !-- It is sufficient to masked only north- and south-facing surfaces, which 164 !-- need special treatment for the u-component. 165 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 1 ) ) 166 mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 1 ) ) 167 mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 1 ) ) 159 168 ! 160 169 !-- Interpolate eddy diffusivities on staggered gridpoints … … 165 174 166 175 tend(k,j,i) = tend(k,j,i) & 167 & + 2.0_wp * ( & 168 & km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 169 & - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 170 & ) * ddx2 & 171 & + ( kmyp * ( u(k,j+1,i) - u(k,j,i) ) * ddy & 172 & + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 173 & - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 174 & - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 175 & ) * ddy 176 + 2.0_wp * ( & 177 km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 178 - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 179 ) * ddx2 * flag & 180 + ( mask_north * ( & 181 kmyp * ( u(k,j+1,i) - u(k,j,i) ) * ddy & 182 + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 183 ) & 184 - mask_south * ( & 185 kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 186 + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 187 ) & 188 ) * ddy * flag 176 189 ENDDO 177 178 ! 179 !-- Wall functions at the north and south walls, respectively 180 IF ( wall_u(j,i) /= 0.0_wp ) THEN 181 182 DO k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i) 183 kmyp = 0.25_wp * & 184 ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) ) 185 kmym = 0.25_wp * & 186 ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) ) 187 188 tend(k,j,i) = tend(k,j,i) & 189 + 2.0_wp * ( & 190 km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 191 - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 192 ) * ddx2 & 193 + ( fyp(j,i) * ( & 194 kmyp * ( u(k,j+1,i) - u(k,j,i) ) * ddy & 195 + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 196 ) & 197 - fym(j,i) * ( & 198 kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 199 + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 200 ) & 201 + wall_u(j,i) * usvs(k,j,i) & 202 ) * ddy 203 ENDDO 204 ENDIF 205 206 ! 207 !-- Compute vertical diffusion. In case of simulating a Prandtl layer, 208 !-- index k starts at nzb_u_inner+2. 209 DO k = nzb_diff_u(j,i), nzt_diff 190 ! 191 !-- Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1) 192 !-- surfaces. Note, in the the flat case, loops won't be entered as 193 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 194 !-- so far. 195 !-- Default-type surfaces 196 DO l = 0, 1 197 surf_s = surf_def_v(l)%start_index(j,i) 198 surf_e = surf_def_v(l)%end_index(j,i) 199 DO m = surf_s, surf_e 200 k = surf_def_v(l)%k(m) 201 tend(k,j,i) = tend(k,j,i) + & 202 surf_def_v(l)%mom_flux_uv(m) * ddy 203 ENDDO 204 ENDDO 205 ! 206 !-- Natural-type surfaces 207 DO l = 0, 1 208 surf_s = surf_lsm_v(l)%start_index(j,i) 209 surf_e = surf_lsm_v(l)%end_index(j,i) 210 DO m = surf_s, surf_e 211 k = surf_lsm_v(l)%k(m) 212 tend(k,j,i) = tend(k,j,i) + & 213 surf_lsm_v(l)%mom_flux_uv(m) * ddy 214 ENDDO 215 ENDDO 216 ! 217 !-- Urban-type surfaces 218 DO l = 0, 1 219 surf_s = surf_usm_v(l)%start_index(j,i) 220 surf_e = surf_usm_v(l)%end_index(j,i) 221 DO m = surf_s, surf_e 222 k = surf_usm_v(l)%k(m) 223 tend(k,j,i) = tend(k,j,i) + & 224 surf_usm_v(l)%mom_flux_uv(m) * ddy 225 ENDDO 226 ENDDO 227 228 ! 229 !-- Compute vertical diffusion. In case of simulating a surface layer, 230 !-- respective grid diffusive fluxes are masked (flag 8) within this 231 !-- loop, and added further below, else, simple gradient approach is 232 !-- applied. Model top is also mask if top-momentum flux is given. 233 DO k = nzb+1, nzt 234 ! 235 !-- Determine flags to mask topography below and above. Flag 1 is 236 !-- used to mask topography in general, and flag 8 implies 237 !-- information about use_surface_fluxes. Flag 9 is used to control 238 !-- momentum flux at model top. 239 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 240 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 241 mask_top = MERGE( 1.0_wp, 0.0_wp, & 242 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 243 MERGE( 1.0_wp, 0.0_wp, & 244 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 245 flag = MERGE( 1.0_wp, 0.0_wp, & 246 BTEST( wall_flags_0(k,j,i), 1 ) ) 210 247 ! 211 248 !-- Interpolate eddy diffusivities on staggered gridpoints … … 216 253 217 254 tend(k,j,i) = tend(k,j,i) & 218 &+ ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) &219 &+ ( w(k,j,i) - w(k,j,i-1) ) * ddx &220 & ) * rho_air_zw(k)&221 &- kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) &222 &+ ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx &223 & ) * rho_air_zw(k-1)&224 & ) * ddzw(k) * drho_air(k)255 + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 256 + ( w(k,j,i) - w(k,j,i-1) ) * ddx & 257 ) * rho_air_zw(k) * mask_top & 258 - kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 259 + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx & 260 ) * rho_air_zw(k-1) * mask_bottom & 261 ) * ddzw(k) * drho_air(k) * flag 225 262 ENDDO 226 263 … … 236 273 !-- because the vertical velocity is assumed to be zero at the surface. 237 274 IF ( use_surface_fluxes ) THEN 238 k = nzb_u_inner(j,i)+1 239 ! 240 !-- Interpolate eddy diffusivities on staggered gridpoints 241 kmzp = 0.25_wp * & 242 ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) ) 243 244 tend(k,j,i) = tend(k,j,i) & 245 & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 246 & + ( w(k,j,i) - w(k,j,i-1) ) * ddx & 247 & ) * rho_air_zw(k) & 248 & - ( -usws(j,i) ) & 249 & ) * ddzw(k) * drho_air(k) 275 ! 276 !-- Default-type surfaces, upward-facing 277 surf_s = surf_def_h(0)%start_index(j,i) 278 surf_e = surf_def_h(0)%end_index(j,i) 279 DO m = surf_s, surf_e 280 281 k = surf_def_h(0)%k(m) 282 283 tend(k,j,i) = tend(k,j,i) & 284 + ( - ( - surf_def_h(0)%usws(m) ) & 285 ) * ddzw(k) * drho_air(k) 286 ENDDO 287 ! 288 !-- Default-type surfaces, dowward-facing 289 surf_s = surf_def_h(1)%start_index(j,i) 290 surf_e = surf_def_h(1)%end_index(j,i) 291 DO m = surf_s, surf_e 292 293 k = surf_def_h(1)%k(m) 294 295 tend(k,j,i) = tend(k,j,i) & 296 + ( - surf_def_h(1)%usws(m) & 297 ) * ddzw(k) * drho_air(k) 298 ENDDO 299 ! 300 !-- Natural-type surfaces, upward-facing 301 surf_s = surf_lsm_h%start_index(j,i) 302 surf_e = surf_lsm_h%end_index(j,i) 303 DO m = surf_s, surf_e 304 305 k = surf_lsm_h%k(m) 306 307 tend(k,j,i) = tend(k,j,i) & 308 + ( - ( - surf_lsm_h%usws(m) ) & 309 ) * ddzw(k) * drho_air(k) 310 ENDDO 311 ! 312 !-- Urban-type surfaces, upward-facing 313 surf_s = surf_usm_h%start_index(j,i) 314 surf_e = surf_usm_h%end_index(j,i) 315 DO m = surf_s, surf_e 316 317 k = surf_usm_h%k(m) 318 319 tend(k,j,i) = tend(k,j,i) & 320 + ( - ( - surf_usm_h%usws(m) ) & 321 ) * ddzw(k) * drho_air(k) 322 ENDDO 323 250 324 ENDIF 251 252 ! 253 !-- Vertical diffusion at the first gridpoint below the top boundary, 254 !-- if the momentum flux at the top is prescribed by the user 255 IF ( use_top_fluxes .AND. constant_top_momentumflux ) THEN 256 k = nzt 257 ! 258 !-- Interpolate eddy diffusivities on staggered gridpoints 259 kmzm = 0.25_wp * & 260 ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) ) 261 262 tend(k,j,i) = tend(k,j,i) & 263 & + ( ( -uswst(j,i) ) & 264 & - kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 265 & + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx & 266 & ) * rho_air_zw(k-1) & 267 & ) * ddzw(k) * drho_air(k) 325 ! 326 !-- Add momentum flux at model top 327 IF ( use_top_fluxes ) THEN 328 surf_s = surf_def_h(2)%start_index(j,i) 329 surf_e = surf_def_h(2)%end_index(j,i) 330 DO m = surf_s, surf_e 331 332 k = surf_def_h(2)%k(m) 333 334 tend(k,j,i) = tend(k,j,i) & 335 + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k) 336 ENDDO 268 337 ENDIF 269 338 … … 282 351 283 352 USE arrays_3d, & 284 ONLY: ddzu, ddzw, km, tend, u, usws, uswst, v, w, & 285 drho_air, rho_air_zw 353 ONLY: ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw 286 354 287 355 USE control_parameters, & 288 ONLY: constant_top_momentumflux, use_surface_fluxes, use_top_fluxes 356 ONLY: constant_top_momentumflux, use_surface_fluxes, & 357 use_top_fluxes 289 358 290 359 USE grid_variables, & 291 ONLY: ddx, ddx2, ddy , fym, fyp, wall_u360 ONLY: ddx, ddx2, ddy 292 361 293 362 USE indices, & 294 ONLY: nzb, nz b_diff_u, nzb_u_inner, nzb_u_outer, nzt, nzt_diff295 363 ONLY: nzb, nzt, wall_flags_0 364 296 365 USE kinds 297 366 367 USE surface_mod, & 368 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 369 surf_usm_v 370 298 371 IMPLICIT NONE 299 372 300 INTEGER(iwp) :: i !< 301 INTEGER(iwp) :: j !< 302 INTEGER(iwp) :: k !< 303 REAL(wp) :: kmym !< 304 REAL(wp) :: kmyp !< 305 REAL(wp) :: kmzm !< 306 REAL(wp) :: kmzp !< 307 308 REAL(wp), DIMENSION(nzb:nzt+1) :: usvs !< 309 310 ! 373 INTEGER(iwp) :: i !< running index x direction 374 INTEGER(iwp) :: j !< running index y direction 375 INTEGER(iwp) :: k !< running index z direction 376 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 377 INTEGER(iwp) :: m !< running index surface elements 378 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 379 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 380 381 REAL(wp) :: flag !< flag to mask topography grid points 382 REAL(wp) :: kmym !< 383 REAL(wp) :: kmyp !< 384 REAL(wp) :: kmzm !< 385 REAL(wp) :: kmzp !< 386 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 387 REAL(wp) :: mask_north !< flag to mask vertical surface north of the grid point 388 REAL(wp) :: mask_south !< flag to mask vertical surface south of the grid point 389 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 390 ! 311 391 !-- Compute horizontal diffusion 312 DO k = nzb_u_outer(j,i)+1, nzt 392 DO k = nzb+1, nzt 393 ! 394 !-- Predetermine flag to mask topography and wall-bounded grid points. 395 !-- It is sufficient to masked only north- and south-facing surfaces, which 396 !-- need special treatment for the u-component. 397 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 1 ) ) 398 mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 1 ) ) 399 mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 1 ) ) 313 400 ! 314 401 !-- Interpolate eddy diffusivities on staggered gridpoints … … 317 404 318 405 tend(k,j,i) = tend(k,j,i) & 319 & + 2.0_wp * ( & 320 & km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 321 & - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 322 & ) * ddx2 & 323 & + ( kmyp * ( u(k,j+1,i) - u(k,j,i) ) * ddy & 324 & + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 325 & - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 326 & - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 327 & ) * ddy 406 + 2.0_wp * ( & 407 km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 408 - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 409 ) * ddx2 * flag & 410 + ( & 411 mask_north * kmyp * ( ( u(k,j+1,i) - u(k,j,i) ) * ddy & 412 + ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 413 ) & 414 - mask_south * kmym * ( ( u(k,j,i) - u(k,j-1,i) ) * ddy & 415 + ( v(k,j,i) - v(k,j,i-1) ) * ddx & 416 ) & 417 ) * ddy * flag 328 418 ENDDO 329 419 330 420 ! 331 !-- Wall functions at the north and south walls, respectively 332 IF ( wall_u(j,i) /= 0.0_wp ) THEN 333 334 ! 335 !-- Calculate the horizontal momentum flux u'v' 336 CALL wall_fluxes( i, j, nzb_u_inner(j,i)+1, nzb_u_outer(j,i), & 337 usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp ) 338 339 DO k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i) 340 kmyp = 0.25_wp * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) ) 341 kmym = 0.25_wp * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) ) 342 343 tend(k,j,i) = tend(k,j,i) & 344 + 2.0_wp * ( & 345 km(k,j,i) * ( u(k,j,i+1) - u(k,j,i) ) & 346 - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) & 347 ) * ddx2 & 348 + ( fyp(j,i) * ( & 349 kmyp * ( u(k,j+1,i) - u(k,j,i) ) * ddy & 350 + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx & 351 ) & 352 - fym(j,i) * ( & 353 kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 354 + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 355 ) & 356 + wall_u(j,i) * usvs(k) & 357 ) * ddy 358 ENDDO 359 ENDIF 360 361 ! 362 !-- Compute vertical diffusion. In case of simulating a Prandtl layer, 363 !-- index k starts at nzb_u_inner+2. 364 DO k = nzb_diff_u(j,i), nzt_diff 421 !-- Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1) 422 !-- surfaces. Note, in the the flat case, loops won't be entered as 423 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 424 !-- so far. 425 !-- Default-type surfaces 426 DO l = 0, 1 427 surf_s = surf_def_v(l)%start_index(j,i) 428 surf_e = surf_def_v(l)%end_index(j,i) 429 DO m = surf_s, surf_e 430 k = surf_def_v(l)%k(m) 431 tend(k,j,i) = tend(k,j,i) + surf_def_v(l)%mom_flux_uv(m) * ddy 432 ENDDO 433 ENDDO 434 ! 435 !-- Natural-type surfaces 436 DO l = 0, 1 437 surf_s = surf_lsm_v(l)%start_index(j,i) 438 surf_e = surf_lsm_v(l)%end_index(j,i) 439 DO m = surf_s, surf_e 440 k = surf_lsm_v(l)%k(m) 441 tend(k,j,i) = tend(k,j,i) + surf_lsm_v(l)%mom_flux_uv(m) * ddy 442 ENDDO 443 ENDDO 444 ! 445 !-- Urban-type surfaces 446 DO l = 0, 1 447 surf_s = surf_usm_v(l)%start_index(j,i) 448 surf_e = surf_usm_v(l)%end_index(j,i) 449 DO m = surf_s, surf_e 450 k = surf_usm_v(l)%k(m) 451 tend(k,j,i) = tend(k,j,i) + surf_usm_v(l)%mom_flux_uv(m) * ddy 452 ENDDO 453 ENDDO 454 ! 455 !-- Compute vertical diffusion. In case of simulating a surface layer, 456 !-- respective grid diffusive fluxes are masked (flag 8) within this 457 !-- loop, and added further below, else, simple gradient approach is 458 !-- applied. Model top is also mask if top-momentum flux is given. 459 DO k = nzb+1, nzt 460 ! 461 !-- Determine flags to mask topography below and above. Flag 1 is 462 !-- used to mask topography in general, and flag 8 implies 463 !-- information about use_surface_fluxes. Flag 9 is used to control 464 !-- momentum flux at model top. 465 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 466 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 467 mask_top = MERGE( 1.0_wp, 0.0_wp, & 468 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 469 MERGE( 1.0_wp, 0.0_wp, & 470 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 471 flag = MERGE( 1.0_wp, 0.0_wp, & 472 BTEST( wall_flags_0(k,j,i), 1 ) ) 365 473 ! 366 474 !-- Interpolate eddy diffusivities on staggered gridpoints … … 369 477 370 478 tend(k,j,i) = tend(k,j,i) & 371 &+ ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) &372 &+ ( w(k,j,i) - w(k,j,i-1) ) * ddx &373 & ) * rho_air_zw(k)&374 &- kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) &375 &+ ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx &376 & ) * rho_air_zw(k-1)&377 & ) * ddzw(k) * drho_air(k)479 + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 480 + ( w(k,j,i) - w(k,j,i-1) ) * ddx & 481 ) * rho_air_zw(k) * mask_top & 482 - kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 483 + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx & 484 ) * rho_air_zw(k-1) * mask_bottom & 485 ) * ddzw(k) * drho_air(k) * flag 378 486 ENDDO 379 487 380 488 ! 381 !-- Vertical diffusion at the first grid point above the surface, if the489 !-- Vertical diffusion at the first surface grid points, if the 382 490 !-- momentum flux at the bottom is given by the Prandtl law or if it is 383 491 !-- prescribed by the user. … … 386 494 !-- other (LES) models showed that the values of the momentum flux becomes 387 495 !-- too large in this case. 388 !-- The term containing w(k-1,..) (see above equation) is removed here389 !-- because the vertical velocity is assumed to be zero at the surface.390 496 IF ( use_surface_fluxes ) THEN 391 k = nzb_u_inner(j,i)+1 392 ! 393 !-- Interpolate eddy diffusivities on staggered gridpoints 394 kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) ) 395 396 tend(k,j,i) = tend(k,j,i) & 397 & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 398 & + ( w(k,j,i) - w(k,j,i-1) ) * ddx & 399 & ) * rho_air_zw(k) & 400 & - ( -usws(j,i) ) & 401 & ) * ddzw(k) * drho_air(k) 497 ! 498 !-- Default-type surfaces, upward-facing 499 surf_s = surf_def_h(0)%start_index(j,i) 500 surf_e = surf_def_h(0)%end_index(j,i) 501 DO m = surf_s, surf_e 502 503 k = surf_def_h(0)%k(m) 504 505 tend(k,j,i) = tend(k,j,i) & 506 + ( - ( - surf_def_h(0)%usws(m) ) & 507 ) * ddzw(k) * drho_air(k) 508 ENDDO 509 ! 510 !-- Default-type surfaces, dowward-facing (except for model-top fluxes) 511 surf_s = surf_def_h(1)%start_index(j,i) 512 surf_e = surf_def_h(1)%end_index(j,i) 513 DO m = surf_s, surf_e 514 515 k = surf_def_h(1)%k(m) 516 517 tend(k,j,i) = tend(k,j,i) & 518 + ( - surf_def_h(1)%usws(m) & 519 ) * ddzw(k) * drho_air(k) 520 ENDDO 521 ! 522 !-- Natural-type surfaces, upward-facing 523 surf_s = surf_lsm_h%start_index(j,i) 524 surf_e = surf_lsm_h%end_index(j,i) 525 DO m = surf_s, surf_e 526 527 k = surf_lsm_h%k(m) 528 529 tend(k,j,i) = tend(k,j,i) & 530 + ( - ( - surf_lsm_h%usws(m) ) & 531 ) * ddzw(k) * drho_air(k) 532 ENDDO 533 ! 534 !-- Urban-type surfaces, upward-facing 535 surf_s = surf_usm_h%start_index(j,i) 536 surf_e = surf_usm_h%end_index(j,i) 537 DO m = surf_s, surf_e 538 539 k = surf_usm_h%k(m) 540 541 tend(k,j,i) = tend(k,j,i) & 542 + ( - ( - surf_usm_h%usws(m) ) & 543 ) * ddzw(k) * drho_air(k) 544 ENDDO 545 402 546 ENDIF 403 404 ! 405 !-- Vertical diffusion at the first gridpoint below the top boundary, 406 !-- if the momentum flux at the top is prescribed by the user 407 IF ( use_top_fluxes .AND. constant_top_momentumflux ) THEN 408 k = nzt 409 ! 410 !-- Interpolate eddy diffusivities on staggered gridpoints 411 kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) ) 412 413 tend(k,j,i) = tend(k,j,i) & 414 & + ( ( -uswst(j,i) ) & 415 & - kmzm * ( ( u(k,j,i) - u(k-1,j,i) ) * ddzu(k) & 416 & + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx & 417 & ) * rho_air_zw(k-1) & 418 & ) * ddzw(k) * drho_air(k) 547 ! 548 !-- Add momentum flux at model top 549 IF ( use_top_fluxes ) THEN 550 surf_s = surf_def_h(2)%start_index(j,i) 551 surf_e = surf_def_h(2)%end_index(j,i) 552 DO m = surf_s, surf_e 553 554 k = surf_def_h(2)%k(m) 555 556 tend(k,j,i) = tend(k,j,i) & 557 + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k) 558 ENDDO 419 559 ENDIF 420 560 561 421 562 END SUBROUTINE diffusion_u_ij 422 563 -
palm/trunk/SOURCE/diffusion_v.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 90 90 91 91 92 USE wall_fluxes_mod93 94 92 PRIVATE 95 93 PUBLIC diffusion_v … … 111 109 112 110 USE arrays_3d, & 113 ONLY: ddzu, ddzw, km, tend, u, v, vsws, vswst, w, & 114 drho_air, rho_air_zw 111 ONLY: ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw 115 112 116 113 USE control_parameters, & 117 ONLY: constant_top_momentumflux, topography, use_surface_fluxes,&114 ONLY: constant_top_momentumflux, use_surface_fluxes, & 118 115 use_top_fluxes 119 116 120 117 USE grid_variables, & 121 ONLY: ddx, ddy, ddy2 , fxm, fxp, wall_v118 ONLY: ddx, ddy, ddy2 122 119 123 120 USE indices, & 124 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzb_diff_v, nzb_v_inner, & 125 nzb_v_outer, nzt, nzt_diff 121 ONLY: nxl, nxr, nyn, nys, nysv, nzb, nzt, wall_flags_0 126 122 127 123 USE kinds 128 124 125 USE surface_mod, & 126 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 127 surf_usm_v 128 129 129 IMPLICIT NONE 130 130 131 INTEGER(iwp) :: i !<132 INTEGER(iwp) :: j !<133 INTEGER(iwp) :: k !<134 REAL(wp) :: kmxm !<135 REAL(wp) :: kmxp !<136 REAL(wp) :: kmzm !<137 REAL(wp) :: kmzp !<138 139 REAL(wp) , DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) :: vsus !<140 141 ! 142 !-- First calculate horizontal momentum flux v'u' at vertical walls, 143 !-- if neccessary 144 IF ( topography /= 'flat' ) THEN145 CALL wall_fluxes( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp, nzb_v_inner, &146 nzb_v_outer, wall_v )147 ENDIF131 INTEGER(iwp) :: i !< running index x direction 132 INTEGER(iwp) :: j !< running index y direction 133 INTEGER(iwp) :: k !< running index z direction 134 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 135 INTEGER(iwp) :: m !< running index surface elements 136 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 137 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 138 139 REAL(wp) :: flag !< flag to mask topography grid points 140 REAL(wp) :: kmxm !< 141 REAL(wp) :: kmxp !< 142 REAL(wp) :: kmzm !< 143 REAL(wp) :: kmzp !< 144 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 145 REAL(wp) :: mask_east !< flag to mask vertical surface south of the grid point 146 REAL(wp) :: mask_west !< flag to mask vertical surface north of the grid point 147 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 148 148 149 149 DO i = nxl, nxr … … 151 151 ! 152 152 !-- Compute horizontal diffusion 153 DO k = nzb_v_outer(j,i)+1, nzt 153 DO k = nzb+1, nzt 154 155 ! 156 !-- Predetermine flag to mask topography and wall-bounded grid points. 157 !-- It is sufficient to masked only east- and west-facing surfaces, which 158 !-- need special treatment for the v-component. 159 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 2 ) ) 160 mask_east = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i+1), 2 ) ) 161 mask_west = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i-1), 2 ) ) 154 162 ! 155 163 !-- Interpolate eddy diffusivities on staggered gridpoints 156 kmxp = 0.25_wp * & 157 ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) ) 158 kmxm = 0.25_wp * & 159 ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) ) 160 161 tend(k,j,i) = tend(k,j,i) & 162 & + ( kmxp * ( v(k,j,i+1) - v(k,j,i) ) * ddx & 163 & + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 164 & - kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 165 & - kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 166 & ) * ddx & 167 & + 2.0_wp * ( & 168 & km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 169 & - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 170 & ) * ddy2 164 kmxp = 0.25_wp * ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) ) 165 kmxm = 0.25_wp * ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) ) 166 167 tend(k,j,i) = tend(k,j,i) + ( & 168 mask_east * kmxp * ( & 169 ( v(k,j,i+1) - v(k,j,i) ) * ddx & 170 + ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 171 ) & 172 - mask_west * kmxm * ( & 173 ( v(k,j,i) - v(k,j,i-1) ) * ddx & 174 + ( u(k,j,i) - u(k,j-1,i) ) * ddy & 175 ) & 176 ) * ddx * flag & 177 + 2.0_wp * ( & 178 km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 179 - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 180 ) * ddy2 * flag 181 171 182 ENDDO 172 183 173 184 ! 174 !-- Wall functions at the left and right walls, respectively 175 IF ( wall_v(j,i) /= 0.0_wp ) THEN 176 177 DO k = nzb_v_inner(j,i)+1, nzb_v_outer(j,i) 178 kmxp = 0.25_wp * & 179 ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) ) 180 kmxm = 0.25_wp * & 181 ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) ) 182 183 tend(k,j,i) = tend(k,j,i) & 184 + 2.0_wp * ( & 185 km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 186 - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 187 ) * ddy2 & 188 + ( fxp(j,i) * ( & 189 kmxp * ( v(k,j,i+1) - v(k,j,i) ) * ddx & 190 + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 191 ) & 192 - fxm(j,i) * ( & 193 kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 194 + kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 195 ) & 196 + wall_v(j,i) * vsus(k,j,i) & 197 ) * ddx 198 ENDDO 199 ENDIF 200 201 ! 202 !-- Compute vertical diffusion. In case of simulating a Prandtl 203 !-- layer, index k starts at nzb_v_inner+2. 204 DO k = nzb_diff_v(j,i), nzt_diff 185 !-- Add horizontal momentum flux v'u' at east- (l=2) and west-facing (l=3) 186 !-- surfaces. Note, in the the flat case, loops won't be entered as 187 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 188 !-- so far. 189 !-- Default-type surfaces 190 DO l = 2, 3 191 surf_s = surf_def_v(l)%start_index(j,i) 192 surf_e = surf_def_v(l)%end_index(j,i) 193 DO m = surf_s, surf_e 194 k = surf_def_v(l)%k(m) 195 tend(k,j,i) = tend(k,j,i) + & 196 surf_def_v(l)%mom_flux_uv(m) * ddx 197 ENDDO 198 ENDDO 199 ! 200 !-- Natural-type surfaces 201 DO l = 2, 3 202 surf_s = surf_lsm_v(l)%start_index(j,i) 203 surf_e = surf_lsm_v(l)%end_index(j,i) 204 DO m = surf_s, surf_e 205 k = surf_lsm_v(l)%k(m) 206 tend(k,j,i) = tend(k,j,i) + & 207 surf_lsm_v(l)%mom_flux_uv(m) * ddx 208 ENDDO 209 ENDDO 210 ! 211 !-- Urban-type surfaces 212 DO l = 2, 3 213 surf_s = surf_usm_v(l)%start_index(j,i) 214 surf_e = surf_usm_v(l)%end_index(j,i) 215 DO m = surf_s, surf_e 216 k = surf_usm_v(l)%k(m) 217 tend(k,j,i) = tend(k,j,i) + & 218 surf_usm_v(l)%mom_flux_uv(m) * ddx 219 ENDDO 220 ENDDO 221 ! 222 !-- Compute vertical diffusion. In case of simulating a surface layer, 223 !-- respective grid diffusive fluxes are masked (flag 10) within this 224 !-- loop, and added further below, else, simple gradient approach is 225 !-- applied. Model top is also mask if top-momentum flux is given. 226 DO k = nzb+1, nzt 227 ! 228 !-- Determine flags to mask topography below and above. Flag 2 is 229 !-- used to mask topography in general, while flag 8 implies also 230 !-- information about use_surface_fluxes. Flag 9 is used to control 231 !-- momentum flux at model top. 232 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 233 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 234 mask_top = MERGE( 1.0_wp, 0.0_wp, & 235 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 236 MERGE( 1.0_wp, 0.0_wp, & 237 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 238 flag = MERGE( 1.0_wp, 0.0_wp, & 239 BTEST( wall_flags_0(k,j,i), 2 ) ) 205 240 ! 206 241 !-- Interpolate eddy diffusivities on staggered gridpoints … … 213 248 & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 214 249 & + ( w(k,j,i) - w(k,j-1,i) ) * ddy & 215 & ) * rho_air_zw(k) 250 & ) * rho_air_zw(k) * mask_top & 216 251 & - kmzm * ( ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 217 252 & + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy & 218 & ) * rho_air_zw(k-1) 219 & ) * ddzw(k) * drho_air(k) 253 & ) * rho_air_zw(k-1) * mask_bottom & 254 & ) * ddzw(k) * drho_air(k) * flag 220 255 ENDDO 221 256 … … 228 263 !-- comparison with other (LES) models showed that the values of 229 264 !-- the momentum flux becomes too large in this case. 230 !-- The term containing w(k-1,..) (see above equation) is removed here231 !-- because the vertical velocity is assumed to be zero at the surface.232 265 IF ( use_surface_fluxes ) THEN 233 k = nzb_v_inner(j,i)+1 234 ! 235 !-- Interpolate eddy diffusivities on staggered gridpoints 236 kmzp = 0.25_wp * & 237 ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) ) 238 239 tend(k,j,i) = tend(k,j,i) & 240 & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 241 & + ( w(k,j,i) - w(k,j-1,i) ) * ddy & 242 & ) * rho_air_zw(k) & 243 & - ( -vsws(j,i) ) & 244 & ) * ddzw(k) * drho_air(k) 266 ! 267 !-- Default-type surfaces, upward-facing 268 surf_s = surf_def_h(0)%start_index(j,i) 269 surf_e = surf_def_h(0)%end_index(j,i) 270 DO m = surf_s, surf_e 271 k = surf_def_h(0)%k(m) 272 273 tend(k,j,i) = tend(k,j,i) & 274 + ( - ( - surf_def_h(0)%vsws(m) ) & 275 ) * ddzw(k) * drho_air(k) 276 ENDDO 277 ! 278 !-- Default-type surfaces, dowward-facing 279 surf_s = surf_def_h(1)%start_index(j,i) 280 surf_e = surf_def_h(1)%end_index(j,i) 281 DO m = surf_s, surf_e 282 k = surf_def_h(1)%k(m) 283 284 tend(k,j,i) = tend(k,j,i) & 285 + ( - surf_def_h(1)%vsws(m) & 286 ) * ddzw(k) * drho_air(k) 287 ENDDO 288 ! 289 !-- Natural-type surfaces, upward-facing 290 surf_s = surf_lsm_h%start_index(j,i) 291 surf_e = surf_lsm_h%end_index(j,i) 292 DO m = surf_s, surf_e 293 k = surf_lsm_h%k(m) 294 295 tend(k,j,i) = tend(k,j,i) & 296 + ( - ( - surf_lsm_h%vsws(m) ) & 297 ) * ddzw(k) * drho_air(k) 298 299 ENDDO 300 ! 301 !-- Urban-type surfaces, upward-facing 302 surf_s = surf_usm_h%start_index(j,i) 303 surf_e = surf_usm_h%end_index(j,i) 304 DO m = surf_s, surf_e 305 k = surf_usm_h%k(m) 306 307 tend(k,j,i) = tend(k,j,i) & 308 + ( - ( - surf_usm_h%vsws(m) ) & 309 ) * ddzw(k) * drho_air(k) 310 311 ENDDO 245 312 ENDIF 246 247 ! 248 !-- Vertical diffusion at the first gridpoint below the top boundary, 249 !-- if the momentum flux at the top is prescribed by the user 250 IF ( use_top_fluxes .AND. constant_top_momentumflux ) THEN 251 k = nzt 252 ! 253 !-- Interpolate eddy diffusivities on staggered gridpoints 254 kmzm = 0.25_wp * & 255 ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) ) 256 257 tend(k,j,i) = tend(k,j,i) & 258 & + ( ( -vswst(j,i) ) & 259 & - kmzm * ( ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 260 & + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy & 261 & ) * rho_air_zw(k-1) & 262 & ) * ddzw(k) * drho_air(k) 313 ! 314 !-- Add momentum flux at model top 315 IF ( use_top_fluxes ) THEN 316 surf_s = surf_def_h(2)%start_index(j,i) 317 surf_e = surf_def_h(2)%end_index(j,i) 318 DO m = surf_s, surf_e 319 320 k = surf_def_h(2)%k(m) 321 322 tend(k,j,i) = tend(k,j,i) & 323 + ( - surf_def_h(2)%vsws(m) ) * ddzw(k) * drho_air(k) 324 ENDDO 263 325 ENDIF 264 326 … … 277 339 278 340 USE arrays_3d, & 279 ONLY: ddzu, ddzw, km, tend, u, v, vsws, vswst, w, & 280 drho_air, rho_air_zw 341 ONLY: ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw 281 342 282 343 USE control_parameters, & 283 ONLY: constant_top_momentumflux, use_surface_fluxes, use_top_fluxes 344 ONLY: constant_top_momentumflux, use_surface_fluxes, & 345 use_top_fluxes 284 346 285 347 USE grid_variables, & 286 ONLY: ddx, ddy, ddy2 , fxm, fxp, wall_v348 ONLY: ddx, ddy, ddy2 287 349 288 350 USE indices, & 289 ONLY: nzb, nz b_diff_v, nzb_v_inner, nzb_v_outer, nzt, nzt_diff351 ONLY: nzb, nzt, wall_flags_0 290 352 291 353 USE kinds 292 354 355 USE surface_mod, & 356 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 357 surf_usm_v 358 293 359 IMPLICIT NONE 294 360 295 INTEGER(iwp) :: i !< 296 INTEGER(iwp) :: j !< 297 INTEGER(iwp) :: k !< 298 REAL(wp) :: kmxm !< 299 REAL(wp) :: kmxp !< 300 REAL(wp) :: kmzm !< 301 REAL(wp) :: kmzp !< 302 303 REAL(wp), DIMENSION(nzb:nzt+1) :: vsus !< 361 362 INTEGER(iwp) :: i !< running index x direction 363 INTEGER(iwp) :: j !< running index y direction 364 INTEGER(iwp) :: k !< running index z direction 365 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 366 INTEGER(iwp) :: m !< running index surface elements 367 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 368 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 369 370 REAL(wp) :: flag !< flag to mask topography grid points 371 REAL(wp) :: kmxm !< 372 REAL(wp) :: kmxp !< 373 REAL(wp) :: kmzm !< 374 REAL(wp) :: kmzp !< 375 REAL(wp) :: mask_bottom !< flag to mask vertical upward-facing surface 376 REAL(wp) :: mask_east !< flag to mask vertical surface south of the grid point 377 REAL(wp) :: mask_west !< flag to mask vertical surface north of the grid point 378 REAL(wp) :: mask_top !< flag to mask vertical downward-facing surface 304 379 305 380 ! 306 381 !-- Compute horizontal diffusion 307 DO k = nzb_v_outer(j,i)+1, nzt 382 DO k = nzb+1, nzt 383 ! 384 !-- Predetermine flag to mask topography and wall-bounded grid points. 385 !-- It is sufficient to masked only east- and west-facing surfaces, which 386 !-- need special treatment for the v-component. 387 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 2 ) ) 388 mask_east = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i+1), 2 ) ) 389 mask_west = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i-1), 2 ) ) 308 390 ! 309 391 !-- Interpolate eddy diffusivities on staggered gridpoints … … 311 393 kmxm = 0.25_wp * ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) ) 312 394 313 tend(k,j,i) = tend(k,j,i) & 314 & + ( kmxp * ( v(k,j,i+1) - v(k,j,i) ) * ddx & 315 & + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 316 & - kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 317 & - kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 318 & ) * ddx & 319 & + 2.0_wp * ( & 320 & km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 321 & - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 322 & ) * ddy2 395 tend(k,j,i) = tend(k,j,i) + ( & 396 mask_east * kmxp * ( & 397 ( v(k,j,i+1) - v(k,j,i) ) * ddx & 398 + ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 399 ) & 400 - mask_west * kmxm * ( & 401 ( v(k,j,i) - v(k,j,i-1) ) * ddx & 402 + ( u(k,j,i) - u(k,j-1,i) ) * ddy & 403 ) & 404 ) * ddx * flag & 405 + 2.0_wp * ( & 406 km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 407 - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 408 ) * ddy2 * flag 323 409 ENDDO 324 410 325 411 ! 326 !-- Wall functions at the left and right walls, respectively 327 IF ( wall_v(j,i) /= 0.0_wp ) THEN 328 329 ! 330 !-- Calculate the horizontal momentum flux v'u' 331 CALL wall_fluxes( i, j, nzb_v_inner(j,i)+1, nzb_v_outer(j,i), & 332 vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp ) 333 334 DO k = nzb_v_inner(j,i)+1, nzb_v_outer(j,i) 335 kmxp = 0.25_wp * & 336 ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) ) 337 kmxm = 0.25_wp * & 338 ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) ) 339 340 tend(k,j,i) = tend(k,j,i) & 341 + 2.0_wp * ( & 342 km(k,j,i) * ( v(k,j+1,i) - v(k,j,i) ) & 343 - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) & 344 ) * ddy2 & 345 + ( fxp(j,i) * ( & 346 kmxp * ( v(k,j,i+1) - v(k,j,i) ) * ddx & 347 + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy & 348 ) & 349 - fxm(j,i) * ( & 350 kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx & 351 + kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy & 352 ) & 353 + wall_v(j,i) * vsus(k) & 354 ) * ddx 355 ENDDO 356 ENDIF 357 358 ! 359 !-- Compute vertical diffusion. In case of simulating a Prandtl layer, 360 !-- index k starts at nzb_v_inner+2. 361 DO k = nzb_diff_v(j,i), nzt_diff 412 !-- Add horizontal momentum flux v'u' at east- (l=2) and west-facing (l=3) 413 !-- surfaces. Note, in the the flat case, loops won't be entered as 414 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 415 !-- so far. 416 !-- Default-type surfaces 417 DO l = 2, 3 418 surf_s = surf_def_v(l)%start_index(j,i) 419 surf_e = surf_def_v(l)%end_index(j,i) 420 DO m = surf_s, surf_e 421 k = surf_def_v(l)%k(m) 422 tend(k,j,i) = tend(k,j,i) + surf_def_v(l)%mom_flux_uv(m) * ddx 423 ENDDO 424 ENDDO 425 ! 426 !-- Natural-type surfaces 427 DO l = 2, 3 428 surf_s = surf_lsm_v(l)%start_index(j,i) 429 surf_e = surf_lsm_v(l)%end_index(j,i) 430 DO m = surf_s, surf_e 431 k = surf_lsm_v(l)%k(m) 432 tend(k,j,i) = tend(k,j,i) + surf_lsm_v(l)%mom_flux_uv(m) * ddx 433 ENDDO 434 ENDDO 435 ! 436 !-- Urban-type surfaces 437 DO l = 2, 3 438 surf_s = surf_usm_v(l)%start_index(j,i) 439 surf_e = surf_usm_v(l)%end_index(j,i) 440 DO m = surf_s, surf_e 441 k = surf_usm_v(l)%k(m) 442 tend(k,j,i) = tend(k,j,i) + surf_usm_v(l)%mom_flux_uv(m) * ddx 443 ENDDO 444 ENDDO 445 ! 446 !-- Compute vertical diffusion. In case of simulating a surface layer, 447 !-- respective grid diffusive fluxes are masked (flag 8) within this 448 !-- loop, and added further below, else, simple gradient approach is 449 !-- applied. Model top is also mask if top-momentum flux is given. 450 DO k = nzb+1, nzt 451 ! 452 !-- Determine flags to mask topography below and above. Flag 2 is 453 !-- used to mask topography in general, while flag 10 implies also 454 !-- information about use_surface_fluxes. Flag 9 is used to control 455 !-- momentum flux at model top. 456 mask_bottom = MERGE( 1.0_wp, 0.0_wp, & 457 BTEST( wall_flags_0(k-1,j,i), 8 ) ) 458 mask_top = MERGE( 1.0_wp, 0.0_wp, & 459 BTEST( wall_flags_0(k+1,j,i), 8 ) ) * & 460 MERGE( 1.0_wp, 0.0_wp, & 461 BTEST( wall_flags_0(k+1,j,i), 9 ) ) 462 flag = MERGE( 1.0_wp, 0.0_wp, & 463 BTEST( wall_flags_0(k,j,i), 2 ) ) 362 464 ! 363 465 !-- Interpolate eddy diffusivities on staggered gridpoints … … 368 470 & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 369 471 & + ( w(k,j,i) - w(k,j-1,i) ) * ddy & 370 & ) * rho_air_zw(k) 472 & ) * rho_air_zw(k) * mask_top & 371 473 & - kmzm * ( ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 372 474 & + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy & 373 & ) * rho_air_zw(k-1) 374 & ) * ddzw(k) * drho_air(k) 475 & ) * rho_air_zw(k-1) * mask_bottom & 476 & ) * ddzw(k) * drho_air(k) * flag 375 477 ENDDO 376 478 … … 383 485 !-- other (LES) models showed that the values of the momentum flux becomes 384 486 !-- too large in this case. 385 !-- The term containing w(k-1,..) (see above equation) is removed here386 !-- because the vertical velocity is assumed to be zero at the surface.387 487 IF ( use_surface_fluxes ) THEN 388 k = nzb_v_inner(j,i)+1 389 ! 390 !-- Interpolate eddy diffusivities on staggered gridpoints 391 kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) ) 392 393 tend(k,j,i) = tend(k,j,i) & 394 & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 395 & + ( w(k,j,i) - w(k,j-1,i) ) * ddy & 396 & ) * rho_air_zw(k) & 397 & - ( -vsws(j,i) ) & 398 & ) * ddzw(k) * drho_air(k) 488 ! 489 !-- Default-type surfaces, upward-facing 490 surf_s = surf_def_h(0)%start_index(j,i) 491 surf_e = surf_def_h(0)%end_index(j,i) 492 DO m = surf_s, surf_e 493 k = surf_def_h(0)%k(m) 494 495 tend(k,j,i) = tend(k,j,i) & 496 + ( - ( - surf_def_h(0)%vsws(m) ) & 497 ) * ddzw(k) * drho_air(k) 498 ENDDO 499 ! 500 !-- Default-type surfaces, dowward-facing 501 surf_s = surf_def_h(1)%start_index(j,i) 502 surf_e = surf_def_h(1)%end_index(j,i) 503 DO m = surf_s, surf_e 504 k = surf_def_h(1)%k(m) 505 506 tend(k,j,i) = tend(k,j,i) & 507 + ( - surf_def_h(1)%vsws(m) & 508 ) * ddzw(k) * drho_air(k) 509 ENDDO 510 ! 511 !-- Natural-type surfaces, upward-facing 512 surf_s = surf_lsm_h%start_index(j,i) 513 surf_e = surf_lsm_h%end_index(j,i) 514 DO m = surf_s, surf_e 515 k = surf_lsm_h%k(m) 516 517 tend(k,j,i) = tend(k,j,i) & 518 + ( - ( - surf_lsm_h%vsws(m) ) & 519 ) * ddzw(k) * drho_air(k) 520 521 ENDDO 522 ! 523 !-- Urban-type surfaces, upward-facing 524 surf_s = surf_usm_h%start_index(j,i) 525 surf_e = surf_usm_h%end_index(j,i) 526 DO m = surf_s, surf_e 527 k = surf_usm_h%k(m) 528 529 tend(k,j,i) = tend(k,j,i) & 530 + ( - ( - surf_usm_h%vsws(m) ) & 531 ) * ddzw(k) * drho_air(k) 532 533 ENDDO 399 534 ENDIF 400 401 ! 402 !-- Vertical diffusion at the first gridpoint below the top boundary, 403 !-- if the momentum flux at the top is prescribed by the user 404 IF ( use_top_fluxes .AND. constant_top_momentumflux ) THEN 405 k = nzt 406 ! 407 !-- Interpolate eddy diffusivities on staggered gridpoints 408 kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) ) 409 410 tend(k,j,i) = tend(k,j,i) & 411 & + ( ( -vswst(j,i) ) & 412 & - kmzm * ( ( v(k,j,i) - v(k-1,j,i) ) * ddzu(k) & 413 & + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy & 414 & ) * rho_air_zw(k-1) & 415 & ) * ddzw(k) * drho_air(k) 535 ! 536 !-- Add momentum flux at model top 537 IF ( use_top_fluxes ) THEN 538 surf_s = surf_def_h(2)%start_index(j,i) 539 surf_e = surf_def_h(2)%end_index(j,i) 540 DO m = surf_s, surf_e 541 542 k = surf_def_h(2)%k(m) 543 544 tend(k,j,i) = tend(k,j,i) & 545 + ( - surf_def_h(2)%vsws(m) ) * ddzw(k) * drho_air(k) 546 ENDDO 416 547 ENDIF 417 548 -
palm/trunk/SOURCE/diffusion_w.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 97 97 98 98 99 USE wall_fluxes_mod, &100 ONLY : wall_fluxes101 102 99 PRIVATE 103 100 PUBLIC diffusion_w … … 125 122 126 123 USE grid_variables, & 127 ONLY : ddx, ddy , fwxm, fwxp, fwym, fwyp, wall_w_x, wall_w_y124 ONLY : ddx, ddy 128 125 129 126 USE indices, & 130 ONLY : nxl, nxr, nyn, nys, nzb, nz b_w_inner, nzb_w_outer, nzt127 ONLY : nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 131 128 132 129 USE kinds 133 130 131 USE surface_mod, & 132 ONLY : surf_def_v, surf_lsm_v, surf_usm_v 133 134 134 IMPLICIT NONE 135 135 136 INTEGER(iwp) :: i !< 137 INTEGER(iwp) :: j !< 138 INTEGER(iwp) :: k !< 136 INTEGER(iwp) :: i !< running index x direction 137 INTEGER(iwp) :: j !< running index y direction 138 INTEGER(iwp) :: k !< running index z direction 139 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 140 INTEGER(iwp) :: m !< running index surface elements 141 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 142 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 139 143 140 REAL(wp) :: kmxm !< 141 REAL(wp) :: kmxp !< 142 REAL(wp) :: kmym !< 143 REAL(wp) :: kmyp !< 144 145 REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) :: wsus !< 146 REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) :: wsvs !< 147 148 149 ! 150 !-- First calculate horizontal momentum flux w'u' and/or w'v' at vertical 151 !-- walls, if neccessary 152 IF ( topography /= 'flat' ) THEN 153 CALL wall_fluxes( wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, nzb_w_inner, & 154 nzb_w_outer, wall_w_x ) 155 CALL wall_fluxes( wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp, nzb_w_inner, & 156 nzb_w_outer, wall_w_y ) 157 ENDIF 144 REAL(wp) :: flag !< flag to mask topography grid points 145 REAL(wp) :: kmxm !< 146 REAL(wp) :: kmxp !< 147 REAL(wp) :: kmym !< 148 REAL(wp) :: kmyp !< 149 REAL(wp) :: mask_west !< flag to mask vertical wall west of the grid point 150 REAL(wp) :: mask_east !< flag to mask vertical wall east of the grid point 151 REAL(wp) :: mask_south !< flag to mask vertical wall south of the grid point 152 REAL(wp) :: mask_north !< flag to mask vertical wall north of the grid point 153 154 158 155 159 156 DO i = nxl, nxr 160 157 DO j = nys, nyn 161 DO k = nzb_w_outer(j,i)+1, nzt-1 158 DO k = nzb+1, nzt-1 159 ! 160 !-- Predetermine flag to mask topography and wall-bounded grid points. 161 flag = MERGE( 1.0_wp, 0.0_wp, & 162 BTEST( wall_flags_0(k,j,i), 3 ) ) 163 mask_east = MERGE( 1.0_wp, 0.0_wp, & 164 BTEST( wall_flags_0(k,j,i+1), 3 ) ) 165 mask_west = MERGE( 1.0_wp, 0.0_wp, & 166 BTEST( wall_flags_0(k,j,i-1), 3 ) ) 167 mask_south = MERGE( 1.0_wp, 0.0_wp, & 168 BTEST( wall_flags_0(k,j-1,i), 3 ) ) 169 mask_north = MERGE( 1.0_wp, 0.0_wp, & 170 BTEST( wall_flags_0(k,j+1,i), 3 ) ) 162 171 ! 163 172 !-- Interpolate eddy diffusivities on staggered gridpoints 164 kmxp = 0.25_wp * 165 ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )166 kmxm = 0.25_wp * 167 ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )168 kmyp = 0.25_wp * 169 ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )170 kmym = 0.25_wp * 171 ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )173 kmxp = 0.25_wp * ( km(k,j,i) + km(k,j,i+1) + & 174 km(k+1,j,i) + km(k+1,j,i+1) ) 175 kmxm = 0.25_wp * ( km(k,j,i) + km(k,j,i-1) + & 176 km(k+1,j,i) + km(k+1,j,i-1) ) 177 kmyp = 0.25_wp * ( km(k,j,i) + km(k+1,j,i) + & 178 km(k,j+1,i) + km(k+1,j+1,i) ) 179 kmym = 0.25_wp * ( km(k,j,i) + km(k+1,j,i) + & 180 km(k,j-1,i) + km(k+1,j-1,i) ) 172 181 173 182 tend(k,j,i) = tend(k,j,i) & 174 & + ( kmxp * ( w(k,j,i+1) - w(k,j,i) ) * ddx & 175 & + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 176 & - kmxm * ( w(k,j,i) - w(k,j,i-1) ) * ddx & 177 & - kmxm * ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 178 & ) * ddx & 179 & + ( kmyp * ( w(k,j+1,i) - w(k,j,i) ) * ddy & 180 & + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 181 & - kmym * ( w(k,j,i) - w(k,j-1,i) ) * ddy & 182 & - kmym * ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 183 & ) * ddy & 184 & + 2.0_wp * ( & 185 & km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 186 & * rho_air(k+1) & 187 & - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 188 & * rho_air(k) & 189 & ) * ddzu(k+1) * drho_air_zw(k) 190 ENDDO 191 192 ! 193 !-- Wall functions at all vertical walls, where necessary 194 IF ( wall_w_x(j,i) /= 0.0_wp .OR. wall_w_y(j,i) /= 0.0_wp ) THEN 195 196 DO k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i) 197 ! 198 !-- Interpolate eddy diffusivities on staggered gridpoints 199 kmxp = 0.25_wp * & 200 ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) ) 201 kmxm = 0.25_wp * & 202 ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) ) 203 kmyp = 0.25_wp * & 204 ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) ) 205 kmym = 0.25_wp * & 206 ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) ) 207 208 tend(k,j,i) = tend(k,j,i) & 209 + ( fwxp(j,i) * ( & 210 kmxp * ( w(k,j,i+1) - w(k,j,i) ) * ddx & 211 + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 212 ) & 213 - fwxm(j,i) * ( & 214 kmxm * ( w(k,j,i) - w(k,j,i-1) ) * ddx & 215 + kmxm * ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 216 ) & 217 + wall_w_x(j,i) * wsus(k,j,i) & 218 ) * ddx & 219 + ( fwyp(j,i) * ( & 220 kmyp * ( w(k,j+1,i) - w(k,j,i) ) * ddy & 221 + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 222 ) & 223 - fwym(j,i) * ( & 224 kmym * ( w(k,j,i) - w(k,j-1,i) ) * ddy & 225 + kmym * ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 226 ) & 227 + wall_w_y(j,i) * wsvs(k,j,i) & 228 ) * ddy & 229 + 2.0_wp * ( & 230 km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 231 * rho_air(k+1) & 232 - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 233 * rho_air(k) & 234 ) * ddzu(k+1) * drho_air_zw(k) 235 ENDDO 236 ENDIF 183 + ( mask_east * kmxp * ( & 184 ( w(k,j,i+1) - w(k,j,i) ) * ddx & 185 + ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 186 ) & 187 - mask_west * kmxm * ( & 188 ( w(k,j,i) - w(k,j,i-1) ) * ddx & 189 + ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 190 ) & 191 ) * ddx * flag & 192 + ( mask_north * kmyp * ( & 193 ( w(k,j+1,i) - w(k,j,i) ) * ddy & 194 + ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 195 ) & 196 - mask_south * kmym * ( & 197 ( w(k,j,i) - w(k,j-1,i) ) * ddy & 198 + ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 199 ) & 200 ) * ddy * flag & 201 + 2.0_wp * ( & 202 km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 203 * rho_air(k+1) & 204 - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 205 * rho_air(k) & 206 ) * ddzu(k+1) * drho_air_zw(k) * flag 207 ENDDO 208 209 ! 210 !-- Add horizontal momentum flux v'w' at north- (l=0) and south-facing (l=1) 211 !-- surfaces. Note, in the the flat case, loops won't be entered as 212 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 213 !-- so far. 214 !-- Default-type surfaces 215 DO l = 0, 1 216 surf_s = surf_def_v(l)%start_index(j,i) 217 surf_e = surf_def_v(l)%end_index(j,i) 218 DO m = surf_s, surf_e 219 k = surf_def_v(l)%k(m) 220 tend(k,j,i) = tend(k,j,i) + & 221 surf_def_v(l)%mom_flux_w(m) * ddy 222 ENDDO 223 ENDDO 224 ! 225 !-- Natural-type surfaces 226 DO l = 0, 1 227 surf_s = surf_lsm_v(l)%start_index(j,i) 228 surf_e = surf_lsm_v(l)%end_index(j,i) 229 DO m = surf_s, surf_e 230 k = surf_lsm_v(l)%k(m) 231 tend(k,j,i) = tend(k,j,i) + & 232 surf_lsm_v(l)%mom_flux_w(m) * ddy 233 ENDDO 234 ENDDO 235 ! 236 !-- Urban-type surfaces 237 DO l = 0, 1 238 surf_s = surf_usm_v(l)%start_index(j,i) 239 surf_e = surf_usm_v(l)%end_index(j,i) 240 DO m = surf_s, surf_e 241 k = surf_usm_v(l)%k(m) 242 tend(k,j,i) = tend(k,j,i) + & 243 surf_usm_v(l)%mom_flux_w(m) * ddy 244 ENDDO 245 ENDDO 246 ! 247 !-- Add horizontal momentum flux u'w' at east- (l=2) and west-facing (l=3) 248 !-- surface. 249 !-- Default-type surfaces 250 DO l = 2, 3 251 surf_s = surf_def_v(l)%start_index(j,i) 252 surf_e = surf_def_v(l)%end_index(j,i) 253 DO m = surf_s, surf_e 254 k = surf_def_v(l)%k(m) 255 tend(k,j,i) = tend(k,j,i) + & 256 surf_def_v(l)%mom_flux_w(m) * ddx 257 ENDDO 258 ENDDO 259 ! 260 !-- Natural-type surfaces 261 DO l = 2, 3 262 surf_s = surf_lsm_v(l)%start_index(j,i) 263 surf_e = surf_lsm_v(l)%end_index(j,i) 264 DO m = surf_s, surf_e 265 k = surf_lsm_v(l)%k(m) 266 tend(k,j,i) = tend(k,j,i) + & 267 surf_lsm_v(l)%mom_flux_w(m) * ddx 268 ENDDO 269 ENDDO 270 ! 271 !-- Urban-type surfaces 272 DO l = 2, 3 273 surf_s = surf_usm_v(l)%start_index(j,i) 274 surf_e = surf_usm_v(l)%end_index(j,i) 275 DO m = surf_s, surf_e 276 k = surf_usm_v(l)%k(m) 277 tend(k,j,i) = tend(k,j,i) + & 278 surf_usm_v(l)%mom_flux_w(m) * ddx 279 ENDDO 280 ENDDO 237 281 238 282 ENDDO … … 256 300 257 301 USE grid_variables, & 258 ONLY : ddx, ddy , fwxm, fwxp, fwym, fwyp, wall_w_x, wall_w_y302 ONLY : ddx, ddy 259 303 260 304 USE indices, & 261 ONLY : nxl, nxr, nyn, nys, nzb, nz b_w_inner, nzb_w_outer, nzt305 ONLY : nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 262 306 263 307 USE kinds 264 308 309 USE surface_mod, & 310 ONLY : surf_def_v, surf_lsm_v, surf_usm_v 311 265 312 IMPLICIT NONE 266 313 267 INTEGER(iwp) :: i !< 268 INTEGER(iwp) :: j !< 269 INTEGER(iwp) :: k !< 314 315 INTEGER(iwp) :: i !< running index x direction 316 INTEGER(iwp) :: j !< running index y direction 317 INTEGER(iwp) :: k !< running index z direction 318 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 319 INTEGER(iwp) :: m !< running index surface elements 320 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 321 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 270 322 271 REAL(wp) :: kmxm !< 272 REAL(wp) :: kmxp !< 273 REAL(wp) :: kmym !< 274 REAL(wp) :: kmyp !< 275 276 REAL(wp), DIMENSION(nzb:nzt+1) :: wsus 277 REAL(wp), DIMENSION(nzb:nzt+1) :: wsvs 278 279 280 DO k = nzb_w_outer(j,i)+1, nzt-1 323 REAL(wp) :: flag !< flag to mask topography grid points 324 REAL(wp) :: kmxm !< 325 REAL(wp) :: kmxp !< 326 REAL(wp) :: kmym !< 327 REAL(wp) :: kmyp !< 328 REAL(wp) :: mask_west !< flag to mask vertical wall west of the grid point 329 REAL(wp) :: mask_east !< flag to mask vertical wall east of the grid point 330 REAL(wp) :: mask_south !< flag to mask vertical wall south of the grid point 331 REAL(wp) :: mask_north !< flag to mask vertical wall north of the grid point 332 333 334 DO k = nzb+1, nzt-1 335 ! 336 !-- Predetermine flag to mask topography and wall-bounded grid points. 337 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 3 ) ) 338 mask_east = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i+1), 3 ) ) 339 mask_west = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i-1), 3 ) ) 340 mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 3 ) ) 341 mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 3 ) ) 281 342 ! 282 343 !-- Interpolate eddy diffusivities on staggered gridpoints … … 287 348 288 349 tend(k,j,i) = tend(k,j,i) & 289 & + ( kmxp * ( w(k,j,i+1) - w(k,j,i) ) * ddx & 290 & + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 291 & - kmxm * ( w(k,j,i) - w(k,j,i-1) ) * ddx & 292 & - kmxm * ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 293 & ) * ddx & 294 & + ( kmyp * ( w(k,j+1,i) - w(k,j,i) ) * ddy & 295 & + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 296 & - kmym * ( w(k,j,i) - w(k,j-1,i) ) * ddy & 297 & - kmym * ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 298 & ) * ddy & 299 & + 2.0_wp * ( & 300 & km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 301 & * rho_air(k+1) & 302 & - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 303 & * rho_air(k) & 304 & ) * ddzu(k+1) * drho_air_zw(k) 305 ENDDO 306 307 ! 308 !-- Wall functions at all vertical walls, where necessary 309 IF ( wall_w_x(j,i) /= 0.0_wp .OR. wall_w_y(j,i) /= 0.0_wp ) THEN 310 311 ! 312 !-- Calculate the horizontal momentum fluxes w'u' and/or w'v' 313 IF ( wall_w_x(j,i) /= 0.0_wp ) THEN 314 CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i), & 315 wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp ) 316 ELSE 317 wsus = 0.0_wp 318 ENDIF 319 320 IF ( wall_w_y(j,i) /= 0.0_wp ) THEN 321 CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i), & 322 wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp ) 323 ELSE 324 wsvs = 0.0_wp 325 ENDIF 326 327 DO k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i) 328 ! 329 !-- Interpolate eddy diffusivities on staggered gridpoints 330 kmxp = 0.25_wp * ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) ) 331 kmxm = 0.25_wp * ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) ) 332 kmyp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) ) 333 kmym = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) ) 334 335 tend(k,j,i) = tend(k,j,i) & 336 + ( fwxp(j,i) * ( & 337 kmxp * ( w(k,j,i+1) - w(k,j,i) ) * ddx & 338 + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 339 ) & 340 - fwxm(j,i) * ( & 341 kmxm * ( w(k,j,i) - w(k,j,i-1) ) * ddx & 342 + kmxm * ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 343 ) & 344 + wall_w_x(j,i) * wsus(k) & 345 ) * ddx & 346 + ( fwyp(j,i) * ( & 347 kmyp * ( w(k,j+1,i) - w(k,j,i) ) * ddy & 348 + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 349 ) & 350 - fwym(j,i) * ( & 351 kmym * ( w(k,j,i) - w(k,j-1,i) ) * ddy & 352 + kmym * ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 353 ) & 354 + wall_w_y(j,i) * wsvs(k) & 355 ) * ddy & 356 + 2.0_wp * ( & 357 km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 358 * rho_air(k+1) & 359 - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 360 * rho_air(k) & 361 ) * ddzu(k+1) * drho_air_zw(k) 362 ENDDO 363 ENDIF 350 + ( mask_east * kmxp * ( & 351 ( w(k,j,i+1) - w(k,j,i) ) * ddx & 352 + ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) & 353 ) & 354 - mask_west * kmxm * ( & 355 ( w(k,j,i) - w(k,j,i-1) ) * ddx & 356 + ( u(k+1,j,i) - u(k,j,i) ) * ddzu(k+1) & 357 ) & 358 ) * ddx * flag & 359 + ( mask_north * kmyp * ( & 360 ( w(k,j+1,i) - w(k,j,i) ) * ddy & 361 + ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) & 362 ) & 363 - mask_south * kmym * ( & 364 ( w(k,j,i) - w(k,j-1,i) ) * ddy & 365 + ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1) & 366 ) & 367 ) * ddy * flag & 368 + 2.0_wp * ( & 369 km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) & 370 * rho_air(k+1) & 371 - km(k,j,i) * ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) & 372 * rho_air(k) & 373 ) * ddzu(k+1) * drho_air_zw(k) * flag 374 ENDDO 375 ! 376 !-- Add horizontal momentum flux v'w' at north- (l=0) and south-facing (l=1) 377 !-- surfaces. Note, in the the flat case, loops won't be entered as 378 !-- start_index > end_index. Furtermore, note, no vertical natural surfaces 379 !-- so far. 380 !-- Default-type surfaces 381 DO l = 0, 1 382 surf_s = surf_def_v(l)%start_index(j,i) 383 surf_e = surf_def_v(l)%end_index(j,i) 384 DO m = surf_s, surf_e 385 k = surf_def_v(l)%k(m) 386 tend(k,j,i) = tend(k,j,i) + & 387 surf_def_v(l)%mom_flux_w(m) * ddy 388 ENDDO 389 ENDDO 390 ! 391 !-- Natural-type surfaces 392 DO l = 0, 1 393 surf_s = surf_lsm_v(l)%start_index(j,i) 394 surf_e = surf_lsm_v(l)%end_index(j,i) 395 DO m = surf_s, surf_e 396 k = surf_lsm_v(l)%k(m) 397 tend(k,j,i) = tend(k,j,i) + & 398 surf_lsm_v(l)%mom_flux_w(m) * ddy 399 ENDDO 400 ENDDO 401 ! 402 !-- Urban-type surfaces 403 DO l = 0, 1 404 surf_s = surf_usm_v(l)%start_index(j,i) 405 surf_e = surf_usm_v(l)%end_index(j,i) 406 DO m = surf_s, surf_e 407 k = surf_usm_v(l)%k(m) 408 tend(k,j,i) = tend(k,j,i) + & 409 surf_usm_v(l)%mom_flux_w(m) * ddy 410 ENDDO 411 ENDDO 412 ! 413 !-- Add horizontal momentum flux u'w' at east- (l=2) and west-facing (l=3) 414 !-- surfaces. 415 !-- Default-type surfaces 416 DO l = 2, 3 417 surf_s = surf_def_v(l)%start_index(j,i) 418 surf_e = surf_def_v(l)%end_index(j,i) 419 DO m = surf_s, surf_e 420 k = surf_def_v(l)%k(m) 421 tend(k,j,i) = tend(k,j,i) + & 422 surf_def_v(l)%mom_flux_w(m) * ddx 423 ENDDO 424 ENDDO 425 ! 426 !-- Natural-type surfaces 427 DO l = 2, 3 428 surf_s = surf_lsm_v(l)%start_index(j,i) 429 surf_e = surf_lsm_v(l)%end_index(j,i) 430 DO m = surf_s, surf_e 431 k = surf_lsm_v(l)%k(m) 432 tend(k,j,i) = tend(k,j,i) + & 433 surf_lsm_v(l)%mom_flux_w(m) * ddx 434 ENDDO 435 ENDDO 436 ! 437 !-- Urban-type surfaces 438 DO l = 2, 3 439 surf_s = surf_usm_v(l)%start_index(j,i) 440 surf_e = surf_usm_v(l)%end_index(j,i) 441 DO m = surf_s, surf_e 442 k = surf_usm_v(l)%k(m) 443 tend(k,j,i) = tend(k,j,i) + & 444 surf_usm_v(l)%mom_flux_w(m) * ddx 445 ENDDO 446 ENDDO 447 364 448 365 449 END SUBROUTINE diffusion_w_ij -
palm/trunk/SOURCE/diffusivities.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 89 89 USE control_parameters, & 90 90 ONLY: atmos_ocean_sign, e_min, g, outflow_l, outflow_n, outflow_r, & 91 outflow_s, use_single_reference_value, wall_adjustment 91 outflow_s, use_single_reference_value, wall_adjustment, & 92 wall_adjustment_factor 92 93 93 94 USE indices, & 94 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb_s_inner, nzb, nzt 95 ONLY: nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt, & 96 wall_flags_0 95 97 USE kinds 96 98 … … 100 102 ONLY : rmask, statistic_regions, sums_l_l 101 103 104 USE surface_mod, & 105 ONLY : bc_h 106 102 107 IMPLICIT NONE 103 108 … … 105 110 INTEGER(iwp) :: j !< 106 111 INTEGER(iwp) :: k !< 112 INTEGER(iwp) :: m !< 107 113 INTEGER(iwp) :: omp_get_thread_num !< 108 114 INTEGER(iwp) :: sr !< … … 110 116 111 117 REAL(wp) :: dvar_dz !< 118 REAL(wp) :: flag !< 112 119 REAL(wp) :: l !< 113 120 REAL(wp) :: ll !< … … 129 136 ! 130 137 !-- Compute the turbulent diffusion coefficient for momentum 131 !$OMP PARALLEL PRIVATE (dvar_dz,i,j,k,l,ll,l_stable,sqrt_e,sr,tn )138 !$OMP PARALLEL PRIVATE (dvar_dz,i,j,k,l,ll,l_stable,sqrt_e,sr,tn,flag) 132 139 !$ tn = omp_get_thread_num() 133 140 … … 138 145 DO i = nxlg, nxrg 139 146 DO j = nysg, nyng 140 DO k = 1, nzt 141 IF ( k > nzb_s_inner(j,i) ) THEN 142 e(k,j,i) = MAX( e(k,j,i), e_min ) 143 ENDIF 147 DO k = nzb+1, nzt 148 e(k,j,i) = MAX( e(k,j,i), e_min ) * & 149 MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 144 150 ENDDO 145 151 ENDDO … … 150 156 DO i = nxlg, nxrg 151 157 DO j = nysg, nyng 152 DO k = 1, nzt 153 154 IF ( k > nzb_s_inner(j,i) ) THEN 155 156 sqrt_e = SQRT( e(k,j,i) ) 157 ! 158 !-- Determine the mixing length 159 dvar_dz = atmos_ocean_sign * & ! inverse effect of pt/rho_ocean gradient 160 ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k) 161 IF ( dvar_dz > 0.0_wp ) THEN 162 IF ( use_single_reference_value ) THEN 163 l_stable = 0.76_wp * sqrt_e / & 164 SQRT( g / var_reference * dvar_dz ) + 1E-5_wp 165 ELSE 166 l_stable = 0.76_wp * sqrt_e / & 167 SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5_wp 168 ENDIF 158 DO k = nzb+1, nzt 159 160 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 161 162 sqrt_e = SQRT( e(k,j,i) ) 163 ! 164 !-- Determine the mixing length 165 dvar_dz = atmos_ocean_sign * & ! inverse effect of pt/rho_ocean gradient 166 ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k) 167 IF ( dvar_dz > 0.0_wp ) THEN 168 IF ( use_single_reference_value ) THEN 169 l_stable = 0.76_wp * sqrt_e / & 170 SQRT( g / var_reference * dvar_dz ) + 1E-5_wp 169 171 ELSE 170 l_stable = l_grid(k) 172 l_stable = 0.76_wp * sqrt_e / & 173 SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5_wp 171 174 ENDIF 172 ! 173 !-- Adjustment of the mixing length 174 IF ( wall_adjustment ) THEN 175 l = MIN( l_wall(k,j,i), l_grid(k), l_stable ) 176 ll = MIN( l_wall(k,j,i), l_grid(k) ) 177 ELSE 178 l = MIN( l_grid(k), l_stable ) 179 ll = l_grid(k) 180 ENDIF 181 182 ! 183 !-- Compute diffusion coefficients for momentum and heat 184 km(k,j,i) = 0.1_wp * l * sqrt_e 185 kh(k,j,i) = ( 1.0_wp + 2.0_wp * l / ll ) * km(k,j,i) 186 187 ! 188 !-- Summation for averaged profile (cf. flow_statistics) 189 DO sr = 0, statistic_regions 190 sums_l_l(k,sr,tn) = sums_l_l(k,sr,tn) + l * rmask(j,i,sr) 191 ENDDO 192 175 ELSE 176 l_stable = l_grid(k) 193 177 ENDIF 178 ! 179 !-- Adjustment of the mixing length 180 IF ( wall_adjustment ) THEN 181 l = MIN( wall_adjustment_factor * l_wall(k,j,i), l_grid(k), & 182 l_stable ) 183 ll = MIN( wall_adjustment_factor * l_wall(k,j,i), l_grid(k) ) 184 ELSE 185 l = MIN( l_grid(k), l_stable ) 186 ll = l_grid(k) 187 ENDIF 188 ! 189 !-- Compute diffusion coefficients for momentum and heat 190 km(k,j,i) = 0.1_wp * l * sqrt_e * flag 191 kh(k,j,i) = ( 1.0_wp + 2.0_wp * l / ll ) * km(k,j,i) * flag 192 193 194 ! 195 !-- Summation for averaged profile (cf. flow_statistics) 196 DO sr = 0, statistic_regions 197 sums_l_l(k,sr,tn) = sums_l_l(k,sr,tn) + l * rmask(j,i,sr) & 198 * flag 199 ENDDO 194 200 195 201 ENDDO … … 202 208 203 209 ! 204 !-- Set vertical boundary values (Neumann conditions both at bottom and top). 210 !-- Set vertical boundary values (Neumann conditions both at upward- and 211 !-- downward facing walls. To set wall-boundary values, the surface data type 212 !-- is applied. 205 213 !-- Horizontal boundary conditions at vertical walls are not set because 206 !-- so far vertical walls require usage of a Prandtl-layer where the boundary 207 !-- values of the diffusivities are not needed 214 !-- so far vertical surfaces require usage of a Prandtl-layer where the boundary 215 !-- values of the diffusivities are not needed. 216 !-- Upward-facing 217 !$OMP PARALLEL DO PRIVATE( i, j, k ) 218 DO m = 1, bc_h(0)%ns 219 i = bc_h(0)%i(m) 220 j = bc_h(0)%j(m) 221 k = bc_h(0)%k(m) 222 km(k-1,j,i) = km(k,j,i) 223 kh(k-1,j,i) = kh(k,j,i) 224 ENDDO 225 ! 226 !-- Downward facing surfaces 227 !$OMP PARALLEL DO PRIVATE( i, j, k ) 228 DO m = 1, bc_h(1)%ns 229 i = bc_h(1)%i(m) 230 j = bc_h(1)%j(m) 231 k = bc_h(1)%k(m) 232 km(k+1,j,i) = km(k,j,i) 233 kh(k+1,j,i) = kh(k,j,i) 234 ENDDO 235 ! 236 !-- Model top 208 237 !$OMP PARALLEL DO 209 238 DO i = nxlg, nxrg 210 239 DO j = nysg, nyng 211 km(nzb_s_inner(j,i),j,i) = km(nzb_s_inner(j,i)+1,j,i) 212 km(nzt+1,j,i) = km(nzt,j,i) 213 kh(nzb_s_inner(j,i),j,i) = kh(nzb_s_inner(j,i)+1,j,i) 214 kh(nzt+1,j,i) = kh(nzt,j,i) 240 km(nzt+1,j,i) = km(nzt,j,i) 241 kh(nzt+1,j,i) = kh(nzt,j,i) 215 242 ENDDO 216 243 ENDDO 244 217 245 218 246 ! -
palm/trunk/SOURCE/disturb_field.f90
r2173 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Modify referenced parameter for disturb_field, instead of nzb_uv_inner, pass 23 ! character to identify the respective grid (u- or v-grid). 24 ! Set perturbations within topography to zero using flags. 23 25 ! 24 26 ! Former revisions: … … 70 72 !> order in every case. The perturbation range is steered by dist_range. 71 73 !------------------------------------------------------------------------------! 72 SUBROUTINE disturb_field( nzb_uv_inner, dist1, field )74 SUBROUTINE disturb_field( var_char, dist1, field ) 73 75 74 76 75 USE control_parameters, &77 USE control_parameters, & 76 78 ONLY: dist_nxl, dist_nxr, dist_nyn, dist_nys, dist_range, & 77 79 disturbance_amplitude, disturbance_created, & … … 83 85 84 86 USE indices, & 85 ONLY: nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt 87 ONLY: nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_max, & 88 nzt, wall_flags_0 86 89 87 90 USE kinds … … 96 99 IMPLICIT NONE 97 100 98 INTEGER(iwp) :: i !< 99 INTEGER(iwp) :: j !< 100 INTEGER(iwp) :: k !< 101 102 INTEGER(iwp) :: nzb_uv_inner(nysg:nyng,nxlg:nxrg) !< 101 CHARACTER (LEN = *) :: var_char !< flag to distinguish betwenn u- and v-component 102 103 INTEGER(iwp) :: flag_nr !< number of respective flag for u- or v-grid 104 INTEGER(iwp) :: i !< index variable 105 INTEGER(iwp) :: j !< index variable 106 INTEGER(iwp) :: k !< index variable 103 107 104 108 REAL(wp) :: randomnumber !< … … 111 115 112 116 CALL cpu_log( log_point(20), 'disturb_field', 'start' ) 113 117 ! 118 !-- Set flag number, 20 for u-grid, 21 for v-grid, required to mask topography 119 flag_nr = MERGE( 20, 21, TRIM(var_char) == 'u' ) 114 120 ! 115 121 !-- Create an additional temporary array and initialize the arrays needed … … 224 230 DO i = nxlg, nxrg 225 231 DO j = nysg, nyng 226 dist1(nzb:nzb_uv_inner(j,i)+1,j,i) = 0.0_wp 232 DO k = nzb, nzb_max 233 dist1(k,j,i) = MERGE( dist1(k,j,i), 0.0_wp, & 234 BTEST( wall_flags_0(k,j,i), flag_nr ) & 235 ) 236 ENDDO 227 237 ENDDO 228 238 ENDDO -
palm/trunk/SOURCE/disturb_heatflux.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustment according new surface data type. 23 ! Implemented parallel random number generator to obtain always the same 24 ! random number distribution regardless of the processor distribution. 23 25 ! 24 26 ! Former revisions: … … 60 62 !> Generate random, normally distributed heatflux values and store them as the 61 63 !> near-surface heatflux. 62 !> On parallel computers, too, this random generator is called at all grid points63 !> of the total array in order to guarantee the same random distribution of the64 !> total array regardless of the number of processors used during the model run.65 64 !------------------------------------------------------------------------------! 66 SUBROUTINE disturb_heatflux 65 SUBROUTINE disturb_heatflux( surf ) 67 66 68 67 69 68 USE arrays_3d, & 70 ONLY: shf,heatflux_input_conversion69 ONLY: heatflux_input_conversion 71 70 72 71 USE control_parameters, & 73 ONLY: iran, surface_heatflux, wall_heatflux72 ONLY: iran, surface_heatflux, random_generator, wall_heatflux 74 73 75 74 USE cpulog, & … … 79 78 80 79 USE indices, & 81 ONLY: nx, nxl, nxr, ny, nyn, nys, nzb, nzb_s_inner 80 ONLY: nzb 81 82 USE random_generator_parallel, & 83 ONLY: random_number_parallel, random_seed_parallel, random_dummy, & 84 id_random_array, seq_random_array 85 86 USE surface_mod, & 87 ONLY: surf_type 82 88 83 89 IMPLICIT NONE 84 90 85 INTEGER(iwp) :: j !< 86 INTEGER(iwp) :: i !< 91 INTEGER(iwp) :: i !< grid index, x direction 92 INTEGER(iwp) :: j !< grid index, y direction 93 INTEGER(iwp) :: k !< grid index, z direction 94 INTEGER(iwp) :: m !< loop variables over surface elements 87 95 88 96 REAL(wp) :: random_gauss !< 89 97 REAL(wp) :: randomnumber !< 98 99 TYPE(surf_type) :: surf !< surface-type variable 90 100 91 101 … … 93 103 94 104 ! 95 !-- Generate random disturbances and store them 96 DO i = 0, nx 97 DO j = 0, ny 98 randomnumber = random_gauss( iran, 5.0_wp )99 IF ( nxl <= i .AND. nxr >= i .AND. nys <= j .AND. nyn >= j ) & 100 THEN101 IF ( nzb_s_inner(j,i) == 0 ) THEN 102 shf(j,i) = randomnumber * surface_heatflux &103 * heatflux_input_conversion(nzb) 104 ELSE105 !-- Generate random disturbances and store them. Note, if 106 !-- random_generator /= 'random-parallel' it is not guaranteed to obtain 107 !-- the same random distribution if the number of processors is changed. 108 IF ( random_generator /= 'random-parallel' ) THEN 109 110 DO m = 1, surf%ns 111 112 k = surf%k(m) 113 114 randomnumber = random_gauss( iran, 5.0_wp ) 105 115 ! 106 !-- Over topography surface_heatflux is replaced by wall_heatflux(0) 107 shf(j,i) = randomnumber * wall_heatflux(0) & 108 * heatflux_input_conversion(nzb_s_inner(j,i)) 109 ENDIF 116 !-- k-1 is topography top index. If this is 0, set surface heatflux. Over 117 !-- topography surface_heatflux is replaced by wall_heatflux(0). 118 IF ( k-1 == 0 ) THEN 119 surf%shf(m) = randomnumber * surface_heatflux & 120 * heatflux_input_conversion(nzb) 121 ELSE 122 surf%shf(m) = randomnumber * wall_heatflux(0) & 123 * heatflux_input_conversion(k-1) 110 124 ENDIF 111 125 ENDDO 112 E NDDO126 ELSE 113 127 128 DO m = 1, surf%ns 129 130 i = surf%i(m) 131 j = surf%j(m) 132 k = surf%k(m) 133 134 CALL random_seed_parallel( put=seq_random_array(:, j, i) ) 135 CALL random_number_parallel( random_dummy ) 114 136 ! 115 !-- Exchange lateral boundary conditions for the heatflux array 116 CALL exchange_horiz_2d( shf ) 137 !-- k-1 is topography top index. If this is 0, set surface heatflux. Over 138 !-- topography surface_heatflux is replaced by wall_heatflux(0). 139 IF ( k-1 == 0 ) THEN 140 surf%shf(m) = ( random_dummy - 0.5_wp ) * surface_heatflux & 141 * heatflux_input_conversion(nzb) 142 ELSE 143 surf%shf(m) = ( random_dummy - 0.5_wp ) * wall_heatflux(0) & 144 * heatflux_input_conversion(k-1) 145 ENDIF 146 147 CALL random_seed_parallel( get=seq_random_array(:, j, i) ) 148 149 ENDDO 150 151 ENDIF 117 152 118 153 CALL cpu_log( log_point(23), 'disturb_heatflux', 'stop' ) -
palm/trunk/SOURCE/eqn_state_seawater.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 120 120 ONLY: hyp, prho, pt_p, rho_ocean, sa_p 121 121 USE indices, & 122 ONLY: nxl, nxr, nyn, nys, nzb_s_inner, nzt 122 ONLY: nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 123 124 USE surface_mod, & 125 ONLY : bc_h 123 126 124 127 IMPLICIT NONE 125 128 126 INTEGER(iwp) :: i !< 127 INTEGER(iwp) :: j !< 128 INTEGER(iwp) :: k !< 129 130 REAL(wp) :: pden !< 131 REAL(wp) :: pnom !< 132 REAL(wp) :: p1 !< 133 REAL(wp) :: p2 !< 134 REAL(wp) :: p3 !< 135 REAL(wp) :: pt1 !< 136 REAL(wp) :: pt2 !< 137 REAL(wp) :: pt3 !< 138 REAL(wp) :: pt4 !< 139 REAL(wp) :: sa1 !< 140 REAL(wp) :: sa15 !< 141 REAL(wp) :: sa2 !< 129 INTEGER(iwp) :: i !< running index x direction 130 INTEGER(iwp) :: j !< running index y direction 131 INTEGER(iwp) :: k !< running index z direction 132 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 133 INTEGER(iwp) :: m !< running index surface elements 134 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 135 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 136 137 REAL(wp) :: flag !< flag to mask topography grid points 138 REAL(wp) :: pden !< 139 REAL(wp) :: pnom !< 140 REAL(wp) :: p1 !< 141 REAL(wp) :: p2 !< 142 REAL(wp) :: p3 !< 143 REAL(wp) :: pt1 !< 144 REAL(wp) :: pt2 !< 145 REAL(wp) :: pt3 !< 146 REAL(wp) :: pt4 !< 147 REAL(wp) :: sa1 !< 148 REAL(wp) :: sa15 !< 149 REAL(wp) :: sa2 !< 142 150 143 151 … … 145 153 DO i = nxl, nxr 146 154 DO j = nys, nyn 147 DO k = nzb _s_inner(j,i)+1, nzt155 DO k = nzb+1, nzt 148 156 ! 149 157 !-- Pressure is needed in dbar … … 171 179 den(7)*sa1*pt1 + den(8)*sa1*pt3 + den(9)*sa15 + & 172 180 den(10)*sa15*pt2 173 181 ! 182 !-- Predetermine flag to mask topography 183 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 174 184 ! 175 185 !-- Potential density (without pressure terms) 176 prho(k,j,i) = pnom / pden 186 prho(k,j,i) = pnom / pden * flag 177 187 178 188 pnom = pnom + nom(8)*p1 + nom(9)*p1*pt2 + & … … 184 194 ! 185 195 !-- In-situ density 186 rho_ocean(k,j,i) = pnom / pden 196 rho_ocean(k,j,i) = pnom / pden * flag 187 197 188 198 ENDDO 189 199 ! 190 !-- Neumann conditions are assumed at bottom and top boundary 191 prho(nzt+1,j,i) = prho(nzt,j,i) 192 prho(nzb_s_inner(j,i),j,i) = prho(nzb_s_inner(j,i)+1,j,i) 193 rho_ocean(nzt+1,j,i) = rho_ocean(nzt,j,i) 194 rho_ocean(nzb_s_inner(j,i),j,i) = rho_ocean(nzb_s_inner(j,i)+1,j,i) 200 !-- Neumann conditions are assumed at top boundary 201 prho(nzt+1,j,i) = prho(nzt,j,i) 202 rho_ocean(nzt+1,j,i) = rho_ocean(nzt,j,i) 195 203 196 204 ENDDO 205 ENDDO 206 ! 207 !-- Neumann conditions at up/downward-facing surfaces 208 !$OMP PARALLEL DO PRIVATE( i, j, k ) 209 DO m = 1, bc_h(0)%ns 210 i = bc_h(0)%i(m) 211 j = bc_h(0)%j(m) 212 k = bc_h(0)%k(m) 213 prho(k-1,j,i) = prho(k,j,i) 214 rho_ocean(k-1,j,i) = rho_ocean(k,j,i) 215 ENDDO 216 ! 217 !-- Downward facing surfaces 218 !$OMP PARALLEL DO PRIVATE( i, j, k ) 219 DO m = 1, bc_h(1)%ns 220 i = bc_h(1)%i(m) 221 j = bc_h(1)%j(m) 222 k = bc_h(1)%k(m) 223 prho(k+1,j,i) = prho(k,j,i) 224 rho_ocean(k+1,j,i) = rho_ocean(k,j,i) 197 225 ENDDO 198 226 … … 211 239 212 240 USE indices, & 213 ONLY: nzb_s_inner, nzt 241 ONLY: nzb, nzt, wall_flags_0 242 243 USE surface_mod, & 244 ONLY : bc_h 214 245 215 246 IMPLICIT NONE 216 247 217 INTEGER(iwp) :: i, j, k 218 219 REAL(wp) :: pden, pnom, p1, p2, p3, pt1, pt2, pt3, pt4, sa1, sa15, & 220 sa2 221 222 DO k = nzb_s_inner(j,i)+1, nzt 248 INTEGER(iwp) :: i !< running index x direction 249 INTEGER(iwp) :: j !< running index y direction 250 INTEGER(iwp) :: k !< running index z direction 251 INTEGER(iwp) :: l !< running index of surface type, south- or north-facing wall 252 INTEGER(iwp) :: m !< running index surface elements 253 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 254 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 255 256 REAL(wp) :: flag !< flag to mask topography grid points 257 REAL(wp) :: pden !< 258 REAL(wp) :: pnom !< 259 REAL(wp) :: p1 !< 260 REAL(wp) :: p2 !< 261 REAL(wp) :: p3 !< 262 REAL(wp) :: pt1 !< 263 REAL(wp) :: pt2 !< 264 REAL(wp) :: pt3 !< 265 REAL(wp) :: pt4 !< 266 REAL(wp) :: sa1 !< 267 REAL(wp) :: sa15 !< 268 REAL(wp) :: sa2 !< 269 270 DO k = nzb+1, nzt 223 271 ! 224 272 !-- Pressure is needed in dbar … … 246 294 den(7)*sa1*pt1 + den(8)*sa1*pt3 + den(9)*sa15 + & 247 295 den(10)*sa15*pt2 248 296 ! 297 !-- Predetermine flag to mask topography 298 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 249 299 ! 250 300 !-- Potential density (without pressure terms) 251 prho(k,j,i) = pnom / pden 301 prho(k,j,i) = pnom / pden * flag 252 302 253 303 pnom = pnom + nom(8)*p1 + nom(9)*p1*pt2 + & … … 258 308 ! 259 309 !-- In-situ density 260 rho_ocean(k,j,i) = pnom / pden 261 262 263 ENDDO 264 265 ! 266 !-- Neumann conditions are assumed at bottom and top boundary 267 prho(nzt+1,j,i) = prho(nzt,j,i) 268 prho(nzb_s_inner(j,i),j,i) = prho(nzb_s_inner(j,i)+1,j,i) 269 rho_ocean(nzt+1,j,i) = rho_ocean(nzt,j,i) 270 rho_ocean(nzb_s_inner(j,i),j,i) = rho_ocean(nzb_s_inner(j,i)+1,j,i) 310 rho_ocean(k,j,i) = pnom / pden * flag 311 312 313 ENDDO 314 ! 315 !-- Neumann conditions at up/downward-facing walls 316 surf_s = bc_h(0)%start_index(j,i) 317 surf_e = bc_h(0)%end_index(j,i) 318 DO m = surf_s, surf_e 319 k = bc_h(0)%k(m) 320 prho(k-1,j,i) = prho(k,j,i) 321 rho_ocean(k-1,j,i) = rho_ocean(k,j,i) 322 ENDDO 323 ! 324 !-- Downward facing surfaces 325 surf_s = bc_h(1)%start_index(j,i) 326 surf_e = bc_h(1)%end_index(j,i) 327 DO m = surf_s, surf_e 328 k = bc_h(1)%k(m) 329 prho(k+1,j,i) = prho(k,j,i) 330 rho_ocean(k+1,j,i) = rho_ocean(k,j,i) 331 ENDDO 332 ! 333 !-- Neumann condition are assumed at top boundary 334 prho(nzt+1,j,i) = prho(nzt,j,i) 335 rho_ocean(nzt+1,j,i) = rho_ocean(nzt,j,i) 271 336 272 337 END SUBROUTINE eqn_state_seawater_ij -
palm/trunk/SOURCE/flow_statistics.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 224 224 USE arrays_3d, & 225 225 ONLY: ddzu, ddzw, e, heatflux_output_conversion, hyp, km, kh, & 226 momentumflux_output_conversion, nr, ol, p, prho, prr, pt, q, & 227 qc, ql, qr, qs, qsws, qswst, rho_air, rho_air_zw, rho_ocean, s, & 228 sa, ss, ssws, sswst, saswsb, saswst, shf, td_lsa_lpt, td_lsa_q, & 229 td_sub_lpt, td_sub_q, time_vert, ts, tswst, u, ug, us, usws, & 230 uswst, vsws, v, vg, vpt, vswst, w, w_subs, & 231 waterflux_output_conversion, zw 226 momentumflux_output_conversion, nr, p, prho, prr, pt, q, & 227 qc, ql, qr, rho_air, rho_air_zw, rho_ocean, s, & 228 sa, td_lsa_lpt, td_lsa_q, td_sub_lpt, td_sub_q, time_vert, u, & 229 ug, v, vg, vpt, w, w_subs, waterflux_output_conversion, zw 232 230 233 231 USE cloud_parameters, & … … 236 234 USE control_parameters, & 237 235 ONLY: average_count_pr, cloud_droplets, cloud_physics, do_sum, & 238 dt_3d, g, humidity, kappa, la rge_scale_forcing,&236 dt_3d, g, humidity, kappa, land_surface, large_scale_forcing, & 239 237 large_scale_subsidence, max_pr_user, message_string, neutral, & 240 238 microphysics_seifert, ocean, passive_scalar, simulated_time, & … … 250 248 USE indices, & 251 249 ONLY: ngp_2dh, ngp_2dh_s_inner, ngp_3d, ngp_3d_inner, ngp_sums, & 252 ngp_sums_ls, nxl, nxr, nyn, nys, nzb, nzb_diff_s_inner, & 253 nzb_s_inner, nzt, nzt_diff 250 ngp_sums_ls, nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 254 251 255 252 USE kinds 256 253 257 254 USE land_surface_model_mod, & 258 ONLY: ghf_eb, land_surface, m_soil, nzb_soil, nzt_soil, & 259 qsws_eb, qsws_liq_eb, qsws_soil_eb, qsws_veg_eb, r_a, r_s, & 260 shf_eb, t_soil 255 ONLY: m_soil_h, nzb_soil, nzt_soil, t_soil_h 261 256 262 257 USE netcdf_interface, & … … 277 272 USE statistics 278 273 274 USE surface_mod, & 275 ONLY : surf_def_h, surf_lsm_h, surf_usm_h 276 279 277 280 278 IMPLICIT NONE … … 283 281 INTEGER(iwp) :: j !< 284 282 INTEGER(iwp) :: k !< 283 INTEGER(iwp) :: ki !< 285 284 INTEGER(iwp) :: k_surface_level !< 285 INTEGER(iwp) :: m !< loop variable over all horizontal wall elements 286 INTEGER(iwp) :: l !< loop variable over surface facing -- up- or downward-facing 286 287 INTEGER(iwp) :: nt !< 287 288 INTEGER(iwp) :: omp_get_thread_num !< 288 289 INTEGER(iwp) :: sr !< 289 290 INTEGER(iwp) :: tn !< 290 291 291 292 LOGICAL :: first !< 292 293 293 294 REAL(wp) :: dptdz_threshold !< 294 295 REAL(wp) :: fac !< 296 REAL(wp) :: flag !< 295 297 REAL(wp) :: height !< 296 298 REAL(wp) :: pts !< … … 400 402 !-- for other horizontal averages. 401 403 tn = 0 402 403 !$OMP PARALLEL PRIVATE( i, j, k, tn ) 404 !$ tn = omp_get_thread_num() 405 404 !$OMP PARALLEL PRIVATE( i, j, k, tn, flag ) 405 !$ tn = omp_get_thread_num() 406 406 !$OMP DO 407 407 DO i = nxl, nxr 408 408 DO j = nys, nyn 409 DO k = nzb_s_inner(j,i), nzt+1 410 sums_l(k,1,tn) = sums_l(k,1,tn) + u(k,j,i) * rmask(j,i,sr) 411 sums_l(k,2,tn) = sums_l(k,2,tn) + v(k,j,i) * rmask(j,i,sr) 412 sums_l(k,4,tn) = sums_l(k,4,tn) + pt(k,j,i) * rmask(j,i,sr) 409 DO k = nzb, nzt+1 410 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 411 sums_l(k,1,tn) = sums_l(k,1,tn) + u(k,j,i) * rmask(j,i,sr) & 412 * flag 413 sums_l(k,2,tn) = sums_l(k,2,tn) + v(k,j,i) * rmask(j,i,sr) & 414 * flag 415 sums_l(k,4,tn) = sums_l(k,4,tn) + pt(k,j,i) * rmask(j,i,sr) & 416 * flag 413 417 ENDDO 414 418 ENDDO … … 421 425 DO i = nxl, nxr 422 426 DO j = nys, nyn 423 DO k = nzb_s_inner(j,i), nzt+1 424 sums_l(k,23,tn) = sums_l(k,23,tn) + & 425 sa(k,j,i) * rmask(j,i,sr) 427 DO k = nzb, nzt+1 428 sums_l(k,23,tn) = sums_l(k,23,tn) + sa(k,j,i) & 429 * rmask(j,i,sr) & 430 * MERGE( 1.0_wp, 0.0_wp, & 431 BTEST( wall_flags_0(k,j,i), 22 ) ) 426 432 ENDDO 427 433 ENDDO … … 437 443 DO i = nxl, nxr 438 444 DO j = nys, nyn 439 DO k = nzb_s_inner(j,i), nzt+1 440 sums_l(k,44,tn) = sums_l(k,44,tn) + & 441 vpt(k,j,i) * rmask(j,i,sr) 442 sums_l(k,41,tn) = sums_l(k,41,tn) + & 443 q(k,j,i) * rmask(j,i,sr) 445 DO k = nzb, nzt+1 446 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 447 sums_l(k,44,tn) = sums_l(k,44,tn) + & 448 vpt(k,j,i) * rmask(j,i,sr) * flag 449 sums_l(k,41,tn) = sums_l(k,41,tn) + & 450 q(k,j,i) * rmask(j,i,sr) * flag 444 451 ENDDO 445 452 ENDDO … … 449 456 DO i = nxl, nxr 450 457 DO j = nys, nyn 451 DO k = nzb_s_inner(j,i), nzt+1 452 sums_l(k,42,tn) = sums_l(k,42,tn) + & 453 ( q(k,j,i) - ql(k,j,i) ) * rmask(j,i,sr) 454 sums_l(k,43,tn) = sums_l(k,43,tn) + ( & 458 DO k = nzb, nzt+1 459 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 460 sums_l(k,42,tn) = sums_l(k,42,tn) + & 461 ( q(k,j,i) - ql(k,j,i) ) * rmask(j,i,sr) & 462 * flag 463 sums_l(k,43,tn) = sums_l(k,43,tn) + ( & 455 464 pt(k,j,i) + l_d_cp*pt_d_t(k) * ql(k,j,i) & 456 ) * rmask(j,i,sr) 465 ) * rmask(j,i,sr) & 466 * flag 457 467 ENDDO 458 468 ENDDO … … 467 477 DO i = nxl, nxr 468 478 DO j = nys, nyn 469 DO k = nzb_s_inner(j,i), nzt+1 470 sums_l(k,117,tn) = sums_l(k,117,tn) + s(k,j,i) * rmask(j,i,sr) 479 DO k = nzb, nzt+1 480 sums_l(k,117,tn) = sums_l(k,117,tn) + s(k,j,i) & 481 * rmask(j,i,sr) & 482 * MERGE( 1.0_wp, 0.0_wp, & 483 BTEST( wall_flags_0(k,j,i), 22 ) ) 471 484 ENDDO 472 485 ENDDO … … 603 616 !$OMP PARALLEL PRIVATE( i, j, k, pts, sums_ll, sums_l_eper, & 604 617 !$OMP sums_l_etot, tn, ust, ust2, u2, vst, vst2, v2, & 605 !$OMP w2 ) 606 !$ tn = omp_get_thread_num() 607 618 !$OMP w2, flag, m, ki, l ) 619 !$ tn = omp_get_thread_num() 608 620 !$OMP DO 609 621 DO i = nxl, nxr 610 622 DO j = nys, nyn 611 623 sums_l_etot = 0.0_wp 612 DO k = nzb_s_inner(j,i), nzt+1 624 DO k = nzb, nzt+1 625 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 613 626 ! 614 627 !-- Prognostic and diagnostic variables 615 sums_l(k,3,tn) = sums_l(k,3,tn) + w(k,j,i) * rmask(j,i,sr) 616 sums_l(k,8,tn) = sums_l(k,8,tn) + e(k,j,i) * rmask(j,i,sr) 617 sums_l(k,9,tn) = sums_l(k,9,tn) + km(k,j,i) * rmask(j,i,sr) 618 sums_l(k,10,tn) = sums_l(k,10,tn) + kh(k,j,i) * rmask(j,i,sr) 619 sums_l(k,40,tn) = sums_l(k,40,tn) + p(k,j,i) 628 sums_l(k,3,tn) = sums_l(k,3,tn) + w(k,j,i) * rmask(j,i,sr) & 629 * flag 630 sums_l(k,8,tn) = sums_l(k,8,tn) + e(k,j,i) * rmask(j,i,sr) & 631 * flag 632 sums_l(k,9,tn) = sums_l(k,9,tn) + km(k,j,i) * rmask(j,i,sr) & 633 * flag 634 sums_l(k,10,tn) = sums_l(k,10,tn) + kh(k,j,i) * rmask(j,i,sr) & 635 * flag 636 sums_l(k,40,tn) = sums_l(k,40,tn) + p(k,j,i) * flag 620 637 621 638 sums_l(k,33,tn) = sums_l(k,33,tn) + & 622 ( pt(k,j,i)-hom(k,1,4,sr) )**2 * rmask(j,i,sr) 639 ( pt(k,j,i)-hom(k,1,4,sr) )**2 * rmask(j,i,sr)& 640 * flag 623 641 624 642 IF ( humidity ) THEN 625 643 sums_l(k,70,tn) = sums_l(k,70,tn) + & 626 ( q(k,j,i)-hom(k,1,41,sr) )**2 * rmask(j,i,sr) 644 ( q(k,j,i)-hom(k,1,41,sr) )**2 * rmask(j,i,sr)& 645 * flag 627 646 ENDIF 628 647 IF ( passive_scalar ) THEN 629 648 sums_l(k,118,tn) = sums_l(k,118,tn) + & 630 ( s(k,j,i)-hom(k,1,117,sr) )**2 * rmask(j,i,sr) 649 ( s(k,j,i)-hom(k,1,117,sr) )**2 * rmask(j,i,sr)& 650 * flag 631 651 ENDIF 632 652 ! 633 653 !-- Higher moments 634 654 !-- (Computation of the skewness of w further below) 635 sums_l(k,38,tn) = sums_l(k,38,tn) + w(k,j,i)**3 * rmask(j,i,sr) 655 sums_l(k,38,tn) = sums_l(k,38,tn) + w(k,j,i)**3 * rmask(j,i,sr) & 656 * flag 636 657 637 658 sums_l_etot = sums_l_etot + & 638 0.5_wp * ( u(k,j,i)**2 + v(k,j,i)**2 + & 639 w(k,j,i)**2 ) * rmask(j,i,sr) 659 0.5_wp * ( u(k,j,i)**2 + v(k,j,i)**2 + & 660 w(k,j,i)**2 ) * rmask(j,i,sr)& 661 * flag 640 662 ENDDO 641 663 ! … … 647 669 ! 648 670 !-- 2D-arrays (being collected in the last column of sums_l) 649 sums_l(nzb,pr_palm,tn) = sums_l(nzb,pr_palm,tn) + & 650 us(j,i) * rmask(j,i,sr) 651 sums_l(nzb+1,pr_palm,tn) = sums_l(nzb+1,pr_palm,tn) + & 652 usws(j,i) * rmask(j,i,sr) 653 sums_l(nzb+2,pr_palm,tn) = sums_l(nzb+2,pr_palm,tn) + & 654 vsws(j,i) * rmask(j,i,sr) 655 sums_l(nzb+3,pr_palm,tn) = sums_l(nzb+3,pr_palm,tn) + & 656 ts(j,i) * rmask(j,i,sr) 657 IF ( humidity ) THEN 658 sums_l(nzb+12,pr_palm,tn) = sums_l(nzb+12,pr_palm,tn) + & 659 qs(j,i) * rmask(j,i,sr) 671 IF ( surf_def_h(0)%ns >= 1 ) THEN 672 m = surf_def_h(0)%start_index(j,i) 673 sums_l(nzb,pr_palm,tn) = sums_l(nzb,pr_palm,tn) + & 674 surf_def_h(0)%us(m) * rmask(j,i,sr) 675 sums_l(nzb+1,pr_palm,tn) = sums_l(nzb+1,pr_palm,tn) + & 676 surf_def_h(0)%usws(m) * rmask(j,i,sr) 677 sums_l(nzb+2,pr_palm,tn) = sums_l(nzb+2,pr_palm,tn) + & 678 surf_def_h(0)%vsws(m) * rmask(j,i,sr) 679 sums_l(nzb+3,pr_palm,tn) = sums_l(nzb+3,pr_palm,tn) + & 680 surf_def_h(0)%ts(m) * rmask(j,i,sr) 681 IF ( humidity ) THEN 682 sums_l(nzb+12,pr_palm,tn) = sums_l(nzb+12,pr_palm,tn) + & 683 surf_def_h(0)%qs(m) * rmask(j,i,sr) 684 ENDIF 685 IF ( passive_scalar ) THEN 686 sums_l(nzb+13,pr_palm,tn) = sums_l(nzb+13,pr_palm,tn) + & 687 surf_def_h(0)%ss(m) * rmask(j,i,sr) 688 ENDIF 660 689 ENDIF 661 IF ( passive_scalar ) THEN 662 sums_l(nzb+13,pr_palm,tn) = sums_l(nzb+13,pr_palm,tn) + & 663 ss(j,i) * rmask(j,i,sr) 690 IF ( surf_lsm_h%ns >= 1 ) THEN 691 m = surf_lsm_h%start_index(j,i) 692 sums_l(nzb,pr_palm,tn) = sums_l(nzb,pr_palm,tn) + & 693 surf_lsm_h%us(m) * rmask(j,i,sr) 694 sums_l(nzb+1,pr_palm,tn) = sums_l(nzb+1,pr_palm,tn) + & 695 surf_lsm_h%usws(m) * rmask(j,i,sr) 696 sums_l(nzb+2,pr_palm,tn) = sums_l(nzb+2,pr_palm,tn) + & 697 surf_lsm_h%vsws(m) * rmask(j,i,sr) 698 sums_l(nzb+3,pr_palm,tn) = sums_l(nzb+3,pr_palm,tn) + & 699 surf_lsm_h%ts(m) * rmask(j,i,sr) 700 IF ( humidity ) THEN 701 sums_l(nzb+12,pr_palm,tn) = sums_l(nzb+12,pr_palm,tn) + & 702 surf_lsm_h%qs(m) * rmask(j,i,sr) 703 ENDIF 704 IF ( passive_scalar ) THEN 705 sums_l(nzb+13,pr_palm,tn) = sums_l(nzb+13,pr_palm,tn) + & 706 surf_lsm_h%ss(m) * rmask(j,i,sr) 707 ENDIF 708 ENDIF 709 IF ( surf_usm_h%ns >= 1 ) THEN 710 m = surf_lsm_h%start_index(j,i) 711 sums_l(nzb,pr_palm,tn) = sums_l(nzb,pr_palm,tn) + & 712 surf_usm_h%us(m) * rmask(j,i,sr) 713 sums_l(nzb+1,pr_palm,tn) = sums_l(nzb+1,pr_palm,tn) + & 714 surf_usm_h%usws(m) * rmask(j,i,sr) 715 sums_l(nzb+2,pr_palm,tn) = sums_l(nzb+2,pr_palm,tn) + & 716 surf_usm_h%vsws(m) * rmask(j,i,sr) 717 sums_l(nzb+3,pr_palm,tn) = sums_l(nzb+3,pr_palm,tn) + & 718 surf_usm_h%ts(m) * rmask(j,i,sr) 719 IF ( humidity ) THEN 720 sums_l(nzb+12,pr_palm,tn) = sums_l(nzb+12,pr_palm,tn) + & 721 surf_usm_h%qs(m) * rmask(j,i,sr) 722 ENDIF 723 IF ( passive_scalar ) THEN 724 sums_l(nzb+13,pr_palm,tn) = sums_l(nzb+13,pr_palm,tn) + & 725 surf_usm_h%ss(m) * rmask(j,i,sr) 726 ENDIF 664 727 ENDIF 665 728 ENDDO … … 674 737 DO i = nxl, nxr 675 738 DO j = nys, nyn 676 DO k = nzb_s_inner(j,i), nzt+1 739 DO k = nzb, nzt+1 740 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 741 677 742 u2 = u(k,j,i)**2 678 743 v2 = v(k,j,i)**2 … … 681 746 vst2 = ( v(k,j,i) - hom(k,1,2,sr) )**2 682 747 683 sums_l(k,30,tn) = sums_l(k,30,tn) + ust2 * rmask(j,i,sr) 684 sums_l(k,31,tn) = sums_l(k,31,tn) + vst2 * rmask(j,i,sr) 685 sums_l(k,32,tn) = sums_l(k,32,tn) + w2 * rmask(j,i,sr) 748 sums_l(k,30,tn) = sums_l(k,30,tn) + ust2 * rmask(j,i,sr) & 749 * flag 750 sums_l(k,31,tn) = sums_l(k,31,tn) + vst2 * rmask(j,i,sr) & 751 * flag 752 sums_l(k,32,tn) = sums_l(k,32,tn) + w2 * rmask(j,i,sr) & 753 * flag 686 754 ! 687 755 !-- Perturbation energy 688 756 689 757 sums_l(k,34,tn) = sums_l(k,34,tn) + 0.5_wp * & 690 ( ust2 + vst2 + w2 ) * rmask(j,i,sr) 758 ( ust2 + vst2 + w2 ) * rmask(j,i,sr) & 759 * flag 691 760 ENDDO 692 761 ENDDO … … 702 771 DO i = nxl, nxr 703 772 DO j = nys, nyn 704 DO k = nzb_s_inner(j,i), nzt+1 773 DO k = nzb, nzt+1 774 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 775 705 776 w2 = w(k,j,i)**2 706 777 ust2 = ( u(k,j,i) - hom(k,1,1,sr) )**2 … … 709 780 710 781 sums_l(nzb+5,pr_palm,tn) = sums_l(nzb+5,pr_palm,tn) & 711 + 0.5_wp * ( ust2 + vst2 + w2 ) * rmask(j,i,sr) 782 + 0.5_wp * ( ust2 + vst2 + w2 ) & 783 * rmask(j,i,sr) & 784 * flag 712 785 ENDDO 713 786 ENDDO … … 728 801 !-- However, this implies no error since staggered velocity 729 802 !-- components are zero at the walls and inside buildings. 730 731 DO k = nzb_diff_s_inner(j,i)-1, nzt_diff 803 !-- Flag 23 is used to mask surface fluxes as well as model-top fluxes, 804 !-- which are added further below. 805 DO k = nzb, nzt 806 flag = MERGE( 1.0_wp, 0.0_wp, & 807 BTEST( wall_flags_0(k,j,i), 23 ) ) * & 808 MERGE( 1.0_wp, 0.0_wp, & 809 BTEST( wall_flags_0(k,j,i), 9 ) ) 732 810 ! 733 811 !-- Momentum flux w"u" … … 739 817 ) * rmask(j,i,sr) & 740 818 * rho_air_zw(k) & 741 * momentumflux_output_conversion(k) 819 * momentumflux_output_conversion(k) & 820 * flag 742 821 ! 743 822 !-- Momentum flux w"v" … … 749 828 ) * rmask(j,i,sr) & 750 829 * rho_air_zw(k) & 751 * momentumflux_output_conversion(k) 830 * momentumflux_output_conversion(k) & 831 * flag 752 832 ! 753 833 !-- Heat flux w"pt" … … 757 837 * rho_air_zw(k) & 758 838 * heatflux_output_conversion(k) & 759 * ddzu(k+1) * rmask(j,i,sr) 839 * ddzu(k+1) * rmask(j,i,sr) & 840 * flag 760 841 761 842 … … 766 847 - 0.5_wp * ( kh(k,j,i) + kh(k+1,j,i) )& 767 848 * ( sa(k+1,j,i) - sa(k,j,i) ) & 768 * ddzu(k+1) * rmask(j,i,sr) 849 * ddzu(k+1) * rmask(j,i,sr) & 850 * flag 769 851 ENDIF 770 852 … … 777 859 * rho_air_zw(k) & 778 860 * heatflux_output_conversion(k) & 779 * ddzu(k+1) * rmask(j,i,sr) 861 * ddzu(k+1) * rmask(j,i,sr) * flag 780 862 sums_l(k,48,tn) = sums_l(k,48,tn) & 781 863 - 0.5_wp * ( kh(k,j,i) + kh(k+1,j,i) )& … … 783 865 * rho_air_zw(k) & 784 866 * waterflux_output_conversion(k)& 785 * ddzu(k+1) * rmask(j,i,sr) 867 * ddzu(k+1) * rmask(j,i,sr) * flag 786 868 787 869 IF ( cloud_physics ) THEN … … 792 874 * rho_air_zw(k) & 793 875 * waterflux_output_conversion(k)& 794 * ddzu(k+1) * rmask(j,i,sr) 876 * ddzu(k+1) * rmask(j,i,sr) * flag 795 877 ENDIF 796 878 ENDIF … … 802 884 - 0.5_wp * ( kh(k,j,i) + kh(k+1,j,i) )& 803 885 * ( s(k+1,j,i) - s(k,j,i) ) & 804 * ddzu(k+1) * rmask(j,i,sr) 886 * ddzu(k+1) * rmask(j,i,sr) & 887 * flag 805 888 ENDIF 806 889 … … 810 893 !-- Subgridscale fluxes in the Prandtl layer 811 894 IF ( use_surface_fluxes ) THEN 812 sums_l(nzb,12,tn) = sums_l(nzb,12,tn) + & 895 DO l = 0, 1 896 ki = MERGE( -1, 0, l == 0 ) 897 IF ( surf_def_h(l)%ns >= 1 ) THEN 898 DO m = surf_def_h(l)%start_index(j,i), surf_def_h(l)%end_index(j,i) 899 k = surf_def_h(l)%k(m) 900 901 sums_l(k+ki,12,tn) = sums_l(k+ki,12,tn) + & 902 momentumflux_output_conversion(k+ki) * & 903 surf_def_h(l)%usws(m) * rmask(j,i,sr) ! w"u" 904 sums_l(k+ki,14,tn) = sums_l(k+ki,14,tn) + & 905 momentumflux_output_conversion(k+ki) * & 906 surf_def_h(l)%vsws(m) * rmask(j,i,sr) ! w"v" 907 sums_l(k+ki,16,tn) = sums_l(k+ki,16,tn) + & 908 heatflux_output_conversion(k+ki) * & 909 surf_def_h(l)%shf(m) * rmask(j,i,sr) ! w"pt" 910 sums_l(k+ki,58,tn) = sums_l(k+ki,58,tn) + & 911 0.0_wp * rmask(j,i,sr) ! u"pt" 912 sums_l(k+ki,61,tn) = sums_l(k+ki,61,tn) + & 913 0.0_wp * rmask(j,i,sr) ! v"pt" 914 IF ( ocean ) THEN 915 sums_l(k+ki,65,tn) = sums_l(k+ki,65,tn) + & 916 surf_def_h(l)%sasws(m) * rmask(j,i,sr) ! w"sa" 917 ENDIF 918 IF ( humidity ) THEN 919 sums_l(k+ki,48,tn) = sums_l(k+ki,48,tn) + & 920 waterflux_output_conversion(k+ki) * & 921 surf_def_h(l)%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 922 sums_l(k+ki,45,tn) = sums_l(k+ki,45,tn) + ( & 923 ( 1.0_wp + 0.61_wp * q(k+ki,j,i) ) * & 924 surf_def_h(l)%shf(m) + 0.61_wp * pt(k+ki,j,i) * & 925 surf_def_h(l)%qsws(m) ) & 926 * heatflux_output_conversion(k+ki) 927 IF ( cloud_droplets ) THEN 928 sums_l(k+ki,45,tn) = sums_l(k+ki,45,tn) + ( & 929 ( 1.0_wp + 0.61_wp * q(k+ki,j,i) - & 930 ql(k+ki,j,i) ) * surf_def_h(l)%shf(m) + & 931 0.61_wp * pt(k+ki,j,i) * surf_def_h(l)%qsws(m) ) & 932 * heatflux_output_conversion(k+ki) 933 ENDIF 934 IF ( cloud_physics ) THEN 935 ! 936 !-- Formula does not work if ql(k+ki) /= 0.0 937 sums_l(k+ki,51,tn) = sums_l(k+ki,51,tn) + & 938 waterflux_output_conversion(k+ki) * & 939 surf_def_h(l)%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 940 ENDIF 941 ENDIF 942 IF ( passive_scalar ) THEN 943 sums_l(k+ki,119,tn) = sums_l(k+ki,119,tn) + & 944 surf_def_h(l)%ssws(m) * rmask(j,i,sr) ! w"s" 945 ENDIF 946 947 ENDDO 948 949 ENDIF 950 ENDDO 951 IF ( surf_lsm_h%ns >= 1 ) THEN 952 m = surf_lsm_h%start_index(j,i) 953 sums_l(nzb,12,tn) = sums_l(nzb,12,tn) + & 813 954 momentumflux_output_conversion(nzb) * & 814 usws(j,i) * rmask(j,i,sr) ! w"u"815 sums_l(nzb,14,tn) = sums_l(nzb,14,tn) + &955 surf_lsm_h%usws(m) * rmask(j,i,sr) ! w"u" 956 sums_l(nzb,14,tn) = sums_l(nzb,14,tn) + & 816 957 momentumflux_output_conversion(nzb) * & 817 vsws(j,i) * rmask(j,i,sr) ! w"v"818 sums_l(nzb,16,tn) = sums_l(nzb,16,tn) + &958 surf_lsm_h%vsws(m) * rmask(j,i,sr) ! w"v" 959 sums_l(nzb,16,tn) = sums_l(nzb,16,tn) + & 819 960 heatflux_output_conversion(nzb) * & 820 s hf(j,i) * rmask(j,i,sr) ! w"pt"821 sums_l(nzb,58,tn) = sums_l(nzb,58,tn) + &961 surf_lsm_h%shf(m) * rmask(j,i,sr) ! w"pt" 962 sums_l(nzb,58,tn) = sums_l(nzb,58,tn) + & 822 963 0.0_wp * rmask(j,i,sr) ! u"pt" 823 sums_l(nzb,61,tn) = sums_l(nzb,61,tn) + &964 sums_l(nzb,61,tn) = sums_l(nzb,61,tn) + & 824 965 0.0_wp * rmask(j,i,sr) ! v"pt" 825 IF ( ocean ) THEN826 sums_l(nzb,65,tn) = sums_l(nzb,65,tn) + &827 s aswsb(j,i) * rmask(j,i,sr) ! w"sa"828 ENDIF829 IF ( humidity ) THEN830 sums_l(nzb,48,tn) = sums_l(nzb,48,tn) + &966 IF ( ocean ) THEN 967 sums_l(nzb,65,tn) = sums_l(nzb,65,tn) + & 968 surf_lsm_h%sasws(m) * rmask(j,i,sr) ! w"sa" 969 ENDIF 970 IF ( humidity ) THEN 971 sums_l(nzb,48,tn) = sums_l(nzb,48,tn) + & 831 972 waterflux_output_conversion(nzb) * & 832 qsws(j,i) * rmask(j,i,sr) ! w"q" (w"qv")833 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( &973 surf_lsm_h%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 974 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( & 834 975 ( 1.0_wp + 0.61_wp * q(nzb,j,i) ) * & 835 s hf(j,i) + 0.61_wp * pt(nzb,j,i) * &836 qsws(j,i) ) &976 surf_lsm_h%shf(m) + 0.61_wp * pt(nzb,j,i) * & 977 surf_lsm_h%qsws(m) ) & 837 978 * heatflux_output_conversion(nzb) 838 IF ( cloud_droplets ) THEN839 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( &979 IF ( cloud_droplets ) THEN 980 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( & 840 981 ( 1.0_wp + 0.61_wp * q(nzb,j,i) - & 841 ql(nzb,j,i) ) * s hf(j,i) + &842 0.61_wp * pt(nzb,j,i) * qsws(j,i) ) &982 ql(nzb,j,i) ) * surf_lsm_h%shf(m) + & 983 0.61_wp * pt(nzb,j,i) * surf_lsm_h%qsws(m) ) & 843 984 * heatflux_output_conversion(nzb) 985 ENDIF 986 IF ( cloud_physics ) THEN 987 ! 988 !-- Formula does not work if ql(nzb) /= 0.0 989 sums_l(nzb,51,tn) = sums_l(nzb,51,tn) + & 990 waterflux_output_conversion(nzb) * & 991 surf_lsm_h%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 992 ENDIF 844 993 ENDIF 845 IF ( cloud_physics ) THEN 846 ! 847 !-- Formula does not work if ql(nzb) /= 0.0 848 sums_l(nzb,51,tn) = sums_l(nzb,51,tn) + & 994 IF ( passive_scalar ) THEN 995 sums_l(nzb,119,tn) = sums_l(nzb,119,tn) + & 996 surf_lsm_h%ssws(m) * rmask(j,i,sr) ! w"s" 997 ENDIF 998 999 1000 ENDIF 1001 IF ( surf_usm_h%ns >= 1 ) THEN 1002 m = surf_usm_h%start_index(j,i) 1003 sums_l(nzb,12,tn) = sums_l(nzb,12,tn) + & 1004 momentumflux_output_conversion(nzb) * & 1005 surf_usm_h%usws(m) * rmask(j,i,sr) ! w"u" 1006 sums_l(nzb,14,tn) = sums_l(nzb,14,tn) + & 1007 momentumflux_output_conversion(nzb) * & 1008 surf_usm_h%vsws(m) * rmask(j,i,sr) ! w"v" 1009 sums_l(nzb,16,tn) = sums_l(nzb,16,tn) + & 1010 heatflux_output_conversion(nzb) * & 1011 surf_usm_h%shf(m) * rmask(j,i,sr) ! w"pt" 1012 sums_l(nzb,58,tn) = sums_l(nzb,58,tn) + & 1013 0.0_wp * rmask(j,i,sr) ! u"pt" 1014 sums_l(nzb,61,tn) = sums_l(nzb,61,tn) + & 1015 0.0_wp * rmask(j,i,sr) ! v"pt" 1016 IF ( ocean ) THEN 1017 sums_l(nzb,65,tn) = sums_l(nzb,65,tn) + & 1018 surf_usm_h%sasws(m) * rmask(j,i,sr) ! w"sa" 1019 ENDIF 1020 IF ( humidity ) THEN 1021 sums_l(nzb,48,tn) = sums_l(nzb,48,tn) + & 1022 waterflux_output_conversion(nzb) * & 1023 surf_usm_h%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 1024 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( & 1025 ( 1.0_wp + 0.61_wp * q(nzb,j,i) ) * & 1026 surf_usm_h%shf(m) + 0.61_wp * pt(nzb,j,i) * & 1027 surf_usm_h%qsws(m) ) & 1028 * heatflux_output_conversion(nzb) 1029 IF ( cloud_droplets ) THEN 1030 sums_l(nzb,45,tn) = sums_l(nzb,45,tn) + ( & 1031 ( 1.0_wp + 0.61_wp * q(nzb,j,i) - & 1032 ql(nzb,j,i) ) * surf_usm_h%shf(m) + & 1033 0.61_wp * pt(nzb,j,i) * surf_usm_h%qsws(m) ) & 1034 * heatflux_output_conversion(nzb) 1035 ENDIF 1036 IF ( cloud_physics ) THEN 1037 ! 1038 !-- Formula does not work if ql(nzb) /= 0.0 1039 sums_l(nzb,51,tn) = sums_l(nzb,51,tn) + & 849 1040 waterflux_output_conversion(nzb) * & 850 qsws(j,i) * rmask(j,i,sr) ! w"q" (w"qv") 1041 surf_usm_h%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 1042 ENDIF 851 1043 ENDIF 852 ENDIF 853 IF ( passive_scalar ) THEN 854 sums_l(nzb,119,tn) = sums_l(nzb,119,tn) + & 855 ssws(j,i) * rmask(j,i,sr) ! w"s" 856 ENDIF 1044 IF ( passive_scalar ) THEN 1045 sums_l(nzb,119,tn) = sums_l(nzb,119,tn) + & 1046 surf_usm_h%ssws(m) * rmask(j,i,sr) ! w"s" 1047 ENDIF 1048 1049 1050 ENDIF 1051 857 1052 ENDIF 858 1053 859 1054 IF ( .NOT. neutral ) THEN 860 sums_l(nzb,114,tn) = sums_l(nzb,114,tn) + & 861 ol(j,i) * rmask(j,i,sr) ! L 862 ENDIF 863 864 865 IF ( land_surface ) THEN 866 sums_l(nzb,93,tn) = sums_l(nzb,93,tn) + ghf_eb(j,i) 867 sums_l(nzb,94,tn) = sums_l(nzb,94,tn) + shf_eb(j,i) 868 sums_l(nzb,95,tn) = sums_l(nzb,95,tn) + qsws_eb(j,i) 869 sums_l(nzb,96,tn) = sums_l(nzb,96,tn) + qsws_liq_eb(j,i) 870 sums_l(nzb,97,tn) = sums_l(nzb,97,tn) + qsws_soil_eb(j,i) 871 sums_l(nzb,98,tn) = sums_l(nzb,98,tn) + qsws_veg_eb(j,i) 872 sums_l(nzb,99,tn) = sums_l(nzb,99,tn) + r_a(j,i) 873 sums_l(nzb,100,tn) = sums_l(nzb,100,tn)+ r_s(j,i) 1055 IF ( surf_def_h(0)%ns >= 1 ) THEN 1056 m = surf_def_h(0)%start_index(j,i) 1057 sums_l(nzb,114,tn) = sums_l(nzb,114,tn) + & 1058 surf_def_h(0)%ol(m) * rmask(j,i,sr) ! L 1059 ENDIF 1060 IF ( surf_lsm_h%ns >= 1 ) THEN 1061 m = surf_lsm_h%start_index(j,i) 1062 sums_l(nzb,114,tn) = sums_l(nzb,114,tn) + & 1063 surf_lsm_h%ol(m) * rmask(j,i,sr) ! L 1064 ENDIF 1065 IF ( surf_usm_h%ns >= 1 ) THEN 1066 m = surf_usm_h%start_index(j,i) 1067 sums_l(nzb,114,tn) = sums_l(nzb,114,tn) + & 1068 surf_usm_h%ol(m) * rmask(j,i,sr) ! L 1069 ENDIF 874 1070 ENDIF 875 1071 … … 893 1089 !-- Subgridscale fluxes at the top surface 894 1090 IF ( use_top_fluxes ) THEN 1091 m = surf_def_h(2)%start_index(j,i) 895 1092 sums_l(nzt:nzt+1,12,tn) = sums_l(nzt:nzt+1,12,tn) + & 896 1093 momentumflux_output_conversion(nzt:nzt+1) * & 897 uswst(j,i) * rmask(j,i,sr) ! w"u"1094 surf_def_h(2)%usws(m) * rmask(j,i,sr) ! w"u" 898 1095 sums_l(nzt:nzt+1,14,tn) = sums_l(nzt:nzt+1,14,tn) + & 899 1096 momentumflux_output_conversion(nzt:nzt+1) * & 900 vswst(j,i) * rmask(j,i,sr) ! w"v"1097 surf_def_h(2)%vsws(m) * rmask(j,i,sr) ! w"v" 901 1098 sums_l(nzt:nzt+1,16,tn) = sums_l(nzt:nzt+1,16,tn) + & 902 1099 heatflux_output_conversion(nzt:nzt+1) * & 903 tswst(j,i) * rmask(j,i,sr) ! w"pt"1100 surf_def_h(2)%shf(m) * rmask(j,i,sr) ! w"pt" 904 1101 sums_l(nzt:nzt+1,58,tn) = sums_l(nzt:nzt+1,58,tn) + & 905 1102 0.0_wp * rmask(j,i,sr) ! u"pt" … … 909 1106 IF ( ocean ) THEN 910 1107 sums_l(nzt,65,tn) = sums_l(nzt,65,tn) + & 911 s aswst(j,i) * rmask(j,i,sr) ! w"sa"1108 surf_def_h(2)%sasws(m) * rmask(j,i,sr) ! w"sa" 912 1109 ENDIF 913 1110 IF ( humidity ) THEN 914 1111 sums_l(nzt,48,tn) = sums_l(nzt,48,tn) + & 915 1112 waterflux_output_conversion(nzt) * & 916 qswst(j,i) * rmask(j,i,sr) ! w"q" (w"qv")1113 surf_def_h(2)%qsws(m) * rmask(j,i,sr) ! w"q" (w"qv") 917 1114 sums_l(nzt,45,tn) = sums_l(nzt,45,tn) + ( & 918 1115 ( 1.0_wp + 0.61_wp * q(nzt,j,i) ) * & 919 tswst(j,i) + 0.61_wp * pt(nzt,j,i) * & 920 qswst(j,i) ) & 1116 surf_def_h(2)%shf(m) + & 1117 0.61_wp * pt(nzt,j,i) * & 1118 surf_def_h(2)%qsws(m) ) & 921 1119 * heatflux_output_conversion(nzt) 922 1120 IF ( cloud_droplets ) THEN 923 1121 sums_l(nzt,45,tn) = sums_l(nzt,45,tn) + ( & 924 1122 ( 1.0_wp + 0.61_wp * q(nzt,j,i) - & 925 ql(nzt,j,i) ) * tswst(j,i) + & 926 0.61_wp * pt(nzt,j,i) * qswst(j,i) )& 1123 ql(nzt,j,i) ) * & 1124 surf_def_h(2)%shf(m) + & 1125 0.61_wp * pt(nzt,j,i) * & 1126 surf_def_h(2)%qsws(m) )& 927 1127 * heatflux_output_conversion(nzt) 928 1128 ENDIF … … 932 1132 sums_l(nzt,51,tn) = sums_l(nzt,51,tn) + & ! w"q" (w"qv") 933 1133 waterflux_output_conversion(nzt) * & 934 qswst(j,i) * rmask(j,i,sr)1134 surf_def_h(2)%qsws(m) * rmask(j,i,sr) 935 1135 ENDIF 936 1136 ENDIF 937 1137 IF ( passive_scalar ) THEN 938 1138 sums_l(nzt,119,tn) = sums_l(nzt,119,tn) + & 939 s swst(j,i) * rmask(j,i,sr) ! w"s"1139 surf_def_h(2)%ssws(m) * rmask(j,i,sr) ! w"s" 940 1140 ENDIF 941 1141 ENDIF … … 946 1146 !-- ---- speaking the following k-loop would have to be split up and 947 1147 !-- rearranged according to the staggered grid. 948 DO k = nzb_s_inner(j,i), nzt 1148 DO k = nzb, nzt 1149 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 22 ) ) 949 1150 ust = 0.5_wp * ( u(k,j,i) - hom(k,1,1,sr) + & 950 1151 u(k+1,j,i) - hom(k+1,1,1,sr) ) … … 956 1157 !-- Higher moments 957 1158 sums_l(k,35,tn) = sums_l(k,35,tn) + pts * w(k,j,i)**2 * & 958 rmask(j,i,sr) 1159 rmask(j,i,sr) * flag 959 1160 sums_l(k,36,tn) = sums_l(k,36,tn) + pts**2 * w(k,j,i) * & 960 rmask(j,i,sr) 1161 rmask(j,i,sr) * flag 961 1162 962 1163 ! … … 968 1169 sa(k+1,j,i) - hom(k+1,1,23,sr) ) 969 1170 sums_l(k,66,tn) = sums_l(k,66,tn) + pts * w(k,j,i) * & 970 rmask(j,i,sr) 1171 rmask(j,i,sr) * flag 971 1172 ENDIF 972 sums_l(k,64,tn) = sums_l(k,64,tn) + rho_ocean(k,j,i) * 973 rmask(j,i,sr) 1173 sums_l(k,64,tn) = sums_l(k,64,tn) + rho_ocean(k,j,i) * & 1174 rmask(j,i,sr) * flag 974 1175 sums_l(k,71,tn) = sums_l(k,71,tn) + prho(k,j,i) * & 975 rmask(j,i,sr) 1176 rmask(j,i,sr) * flag 976 1177 ENDIF 977 1178 … … 985 1186 sums_l(k,46,tn) = sums_l(k,46,tn) + pts * w(k,j,i) * & 986 1187 heatflux_output_conversion(k) * & 987 rmask(j,i,sr) 988 sums_l(k,54,tn) = sums_l(k,54,tn) + ql(k,j,i) * rmask(j,i,sr) 1188 rmask(j,i,sr) * flag 1189 sums_l(k,54,tn) = sums_l(k,54,tn) + ql(k,j,i) * rmask(j,i,sr) & 1190 * flag 989 1191 990 1192 IF ( .NOT. cloud_droplets ) THEN … … 996 1198 sums_l(k,52,tn) = sums_l(k,52,tn) + pts * w(k,j,i) * & 997 1199 waterflux_output_conversion(k) * & 998 rmask(j,i,sr) 1200 rmask(j,i,sr) * & 1201 flag 999 1202 sums_l(k,75,tn) = sums_l(k,75,tn) + qc(k,j,i) * & 1000 rmask(j,i,sr) 1203 rmask(j,i,sr) * & 1204 flag 1001 1205 sums_l(k,76,tn) = sums_l(k,76,tn) + prr(k,j,i) * & 1002 rmask(j,i,sr) 1206 rmask(j,i,sr) * & 1207 flag 1003 1208 IF ( microphysics_seifert ) THEN 1004 1209 sums_l(k,73,tn) = sums_l(k,73,tn) + nr(k,j,i) * & 1005 rmask(j,i,sr) 1210 rmask(j,i,sr) *& 1211 flag 1006 1212 sums_l(k,74,tn) = sums_l(k,74,tn) + qr(k,j,i) * & 1007 rmask(j,i,sr) 1213 rmask(j,i,sr) *& 1214 flag 1008 1215 ENDIF 1009 1216 ENDIF … … 1015 1222 sums_l(k,46,tn) = sums_l(k,46,tn) + pts * w(k,j,i) * & 1016 1223 heatflux_output_conversion(k) * & 1017 rmask(j,i,sr) 1224 rmask(j,i,sr) * & 1225 flag 1018 1226 ELSE IF ( ws_scheme_sca .AND. sr == 0 ) THEN 1019 1227 sums_l(k,46,tn) = ( ( 1.0_wp + 0.61_wp * & … … 1022 1230 0.61_wp * hom(k,1,4,sr) * & 1023 1231 sums_l(k,49,tn) & 1024 ) * heatflux_output_conversion(k) 1232 ) * heatflux_output_conversion(k) * & 1233 flag 1025 1234 END IF 1026 1235 END IF … … 1033 1242 s(k+1,j,i) - hom(k+1,1,117,sr) ) 1034 1243 sums_l(k,116,tn) = sums_l(k,116,tn) + pts * w(k,j,i) * & 1035 rmask(j,i,sr) 1244 rmask(j,i,sr) * flag 1036 1245 ENDIF 1037 1246 … … 1042 1251 ( ust**2 + vst**2 + w(k,j,i)**2 ) & 1043 1252 * momentumflux_output_conversion(k) & 1044 * rmask(j,i,sr)1253 * rmask(j,i,sr) * flag 1045 1254 ENDDO 1046 1255 ENDDO 1047 1256 ENDDO 1257 !$OMP END PARALLEL 1258 ! 1259 !-- Treat land-surface quantities according to new wall model structure. 1260 IF ( land_surface ) THEN 1261 tn = 0 1262 !$OMP PARALLEL PRIVATE( i, j, m, tn ) 1263 !$ tn = omp_get_thread_num() 1264 !$OMP DO 1265 DO m = 1, surf_lsm_h%ns 1266 i = surf_lsm_h%i(m) 1267 j = surf_lsm_h%j(m) 1268 1269 IF ( i >= nxl .AND. i <= nxr .AND. & 1270 j >= nys .AND. j <= nyn ) THEN 1271 sums_l(nzb,93,tn) = sums_l(nzb,93,tn) + surf_lsm_h%ghf_eb(m) 1272 sums_l(nzb,94,tn) = sums_l(nzb,94,tn) + surf_lsm_h%shf_eb(m) 1273 sums_l(nzb,95,tn) = sums_l(nzb,95,tn) + surf_lsm_h%qsws_eb(m) 1274 sums_l(nzb,96,tn) = sums_l(nzb,96,tn) + surf_lsm_h%qsws_liq_eb(m) 1275 sums_l(nzb,97,tn) = sums_l(nzb,97,tn) + surf_lsm_h%qsws_soil_eb(m) 1276 sums_l(nzb,98,tn) = sums_l(nzb,98,tn) + surf_lsm_h%qsws_veg_eb(m) 1277 sums_l(nzb,99,tn) = sums_l(nzb,99,tn) + surf_lsm_h%r_a(m) 1278 sums_l(nzb,100,tn) = sums_l(nzb,100,tn)+ surf_lsm_h%r_s(m) 1279 ENDIF 1280 ENDDO 1281 !$OMP END PARALLEL 1282 1283 tn = 0 1284 !$OMP PARALLEL PRIVATE( i, j, k, m, tn ) 1285 !$ tn = omp_get_thread_num() 1286 !$OMP DO 1287 DO m = 1, surf_lsm_h%ns 1288 1289 i = surf_lsm_h%i(m) 1290 j = surf_lsm_h%j(m) 1291 1292 IF ( i >= nxl .AND. i <= nxr .AND. & 1293 j >= nys .AND. j <= nyn ) THEN 1294 1295 DO k = nzb_soil, nzt_soil 1296 sums_l(k,89,tn) = sums_l(k,89,tn) + t_soil_h%var_2d(k,m) & 1297 * rmask(j,i,sr) 1298 sums_l(k,91,tn) = sums_l(k,91,tn) + m_soil_h%var_2d(k,m) & 1299 * rmask(j,i,sr) 1300 ENDDO 1301 ENDIF 1302 ENDDO 1303 !$OMP END PARALLEL 1304 ENDIF 1048 1305 ! 1049 1306 !-- For speed optimization fluxes which have been computed in part directly 1050 1307 !-- inside the WS advection routines are treated seperatly 1051 1308 !-- Momentum fluxes first: 1309 1310 tn = 0 1311 !$OMP PARALLEL PRIVATE( i, j, k, tn, flag ) 1312 !$ tn = omp_get_thread_num() 1052 1313 IF ( .NOT. ws_scheme_mom .OR. sr /= 0 ) THEN 1053 !$OMP DO 1054 DO i = nxl, nxr 1055 DO j = nys, nyn 1056 DO k = nzb_diff_s_inner(j,i)-1, nzt_diff 1057 ust = 0.5_wp * ( u(k,j,i) - hom(k,1,1,sr) + & 1058 u(k+1,j,i) - hom(k+1,1,1,sr) ) 1059 vst = 0.5_wp * ( v(k,j,i) - hom(k,1,2,sr) + & 1060 v(k+1,j,i) - hom(k+1,1,2,sr) ) 1061 ! 1062 !-- Momentum flux w*u* 1063 sums_l(k,13,tn) = sums_l(k,13,tn) + 0.5_wp * & 1064 ( w(k,j,i-1) + w(k,j,i) ) & 1065 * momentumflux_output_conversion(k) & 1066 * ust * rmask(j,i,sr) 1067 ! 1068 !-- Momentum flux w*v* 1069 sums_l(k,15,tn) = sums_l(k,15,tn) + 0.5_wp * & 1070 ( w(k,j-1,i) + w(k,j,i) ) & 1071 * momentumflux_output_conversion(k) & 1072 * vst * rmask(j,i,sr) 1073 ENDDO 1074 ENDDO 1075 ENDDO 1314 !$OMP DO 1315 DO i = nxl, nxr 1316 DO j = nys, nyn 1317 DO k = nzb, nzt 1318 ! 1319 !-- Flag 23 is used to mask surface fluxes as well as model-top 1320 !-- fluxes, which are added further below. 1321 flag = MERGE( 1.0_wp, 0.0_wp, & 1322 BTEST( wall_flags_0(k,j,i), 23 ) ) * & 1323 MERGE( 1.0_wp, 0.0_wp, & 1324 BTEST( wall_flags_0(k,j,i), 9 ) ) 1325 1326 ust = 0.5_wp * ( u(k,j,i) - hom(k,1,1,sr) + & 1327 u(k+1,j,i) - hom(k+1,1,1,sr) ) 1328 vst = 0.5_wp * ( v(k,j,i) - hom(k,1,2,sr) + & 1329 v(k+1,j,i) - hom(k+1,1,2,sr) ) 1330 ! 1331 !-- Momentum flux w*u* 1332 sums_l(k,13,tn) = sums_l(k,13,tn) + 0.5_wp * & 1333 ( w(k,j,i-1) + w(k,j,i) ) & 1334 * momentumflux_output_conversion(k) & 1335 * ust * rmask(j,i,sr) & 1336 * flag 1337 ! 1338 !-- Momentum flux w*v* 1339 sums_l(k,15,tn) = sums_l(k,15,tn) + 0.5_wp * & 1340 ( w(k,j-1,i) + w(k,j,i) ) & 1341 * momentumflux_output_conversion(k) & 1342 * vst * rmask(j,i,sr) & 1343 * flag 1344 ENDDO 1345 ENDDO 1346 ENDDO 1076 1347 1077 1348 ENDIF 1078 1349 IF ( .NOT. ws_scheme_sca .OR. sr /= 0 ) THEN 1079 !$OMP DO 1080 DO i = nxl, nxr 1081 DO j = nys, nyn 1082 DO k = nzb_diff_s_inner(j,i)-1, nzt_diff 1083 ! 1084 !-- Vertical heat flux 1085 sums_l(k,17,tn) = sums_l(k,17,tn) + 0.5_wp * & 1350 !$OMP DO 1351 DO i = nxl, nxr 1352 DO j = nys, nyn 1353 DO k = nzb, nzt 1354 flag = MERGE( 1.0_wp, 0.0_wp, & 1355 BTEST( wall_flags_0(k,j,i), 23 ) ) * & 1356 MERGE( 1.0_wp, 0.0_wp, & 1357 BTEST( wall_flags_0(k,j,i), 9 ) ) 1358 ! 1359 !-- Vertical heat flux 1360 sums_l(k,17,tn) = sums_l(k,17,tn) + 0.5_wp * & 1086 1361 ( pt(k,j,i) - hom(k,1,4,sr) + & 1087 1362 pt(k+1,j,i) - hom(k+1,1,4,sr) ) & 1088 1363 * heatflux_output_conversion(k) & 1089 * w(k,j,i) * rmask(j,i,sr) 1090 IF ( humidity ) THEN1091 pts = 0.5_wp * ( q(k,j,i) - hom(k,1,41,sr) +&1364 * w(k,j,i) * rmask(j,i,sr) * flag 1365 IF ( humidity ) THEN 1366 pts = 0.5_wp * ( q(k,j,i) - hom(k,1,41,sr) + & 1092 1367 q(k+1,j,i) - hom(k+1,1,41,sr) ) 1093 sums_l(k,49,tn) = sums_l(k,49,tn) + pts * w(k,j,i) *&1368 sums_l(k,49,tn) = sums_l(k,49,tn) + pts * w(k,j,i) * & 1094 1369 waterflux_output_conversion(k) * & 1095 rmask(j,i,sr) 1096 ENDIF1097 IF ( passive_scalar ) THEN1098 pts = 0.5_wp * ( s(k,j,i) - hom(k,1,117,sr) +&1370 rmask(j,i,sr) * flag 1371 ENDIF 1372 IF ( passive_scalar ) THEN 1373 pts = 0.5_wp * ( s(k,j,i) - hom(k,1,117,sr) + & 1099 1374 s(k+1,j,i) - hom(k+1,1,117,sr) ) 1100 sums_l(k,116,tn) = sums_l(k,116,tn) + pts * w(k,j,i) *&1101 rmask(j,i,sr) 1102 ENDIF1103 ENDDO1104 ENDDO1105 ENDDO1375 sums_l(k,116,tn) = sums_l(k,116,tn) + pts * w(k,j,i) * & 1376 rmask(j,i,sr) * flag 1377 ENDIF 1378 ENDDO 1379 ENDDO 1380 ENDDO 1106 1381 1107 1382 ENDIF … … 1126 1401 DO i = nxl, nxr 1127 1402 DO j = nys, nyn 1128 DO k = nzb_s_inner(j,i)+1, nzt 1403 DO k = nzb+1, nzt 1404 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1129 1405 1130 1406 sums_ll(k,1) = sums_ll(k,1) + 0.5_wp * w(k,j,i) * ( & … … 1133 1409 + ( 0.25_wp * ( v(k,j,i)+v(k+1,j,i)+v(k,j+1,i)+v(k+1,j+1,i) ) & 1134 1410 - 0.5_wp * ( hom(k,1,2,sr) + hom(k+1,1,2,sr) ) )**2& 1135 + w(k,j,i)**2 ) 1411 + w(k,j,i)**2 ) * flag 1136 1412 1137 1413 sums_ll(k,2) = sums_ll(k,2) + 0.5_wp * w(k,j,i) & 1138 * ( p(k,j,i) + p(k+1,j,i) ) 1414 * ( p(k,j,i) + p(k+1,j,i) ) * flag 1139 1415 1140 1416 ENDDO … … 1164 1440 DO i = nxl, nxr 1165 1441 DO j = nys, nyn 1166 DO k = nzb_s_inner(j,i)+1, nzt 1442 DO k = nzb+1, nzt 1443 1444 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1167 1445 1168 1446 sums_l(k,57,tn) = sums_l(k,57,tn) - 0.5_wp * ( & 1169 1447 (km(k,j,i)+km(k+1,j,i)) * (e(k+1,j,i)-e(k,j,i)) * ddzu(k+1) & 1170 1448 - (km(k-1,j,i)+km(k,j,i)) * (e(k,j,i)-e(k-1,j,i)) * ddzu(k) & 1171 ) * ddzw(k) 1449 ) * ddzw(k) & 1450 * flag 1172 1451 1173 1452 sums_l(k,69,tn) = sums_l(k,69,tn) - 0.5_wp * ( & 1174 1453 (km(k,j,i)+km(k+1,j,i)) * (e(k+1,j,i)-e(k,j,i)) * ddzu(k+1) & 1175 ) 1454 ) * flag 1176 1455 1177 1456 ENDDO … … 1191 1470 DO i = nxl, nxr 1192 1471 DO j = nys, nyn 1193 DO k = nzb_s_inner(j,i)+1, nzt 1472 DO k = nzb+1, nzt 1473 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1194 1474 ! 1195 1475 !-- Subgrid horizontal heat fluxes u"pt", v"pt" … … 1199 1479 * rho_air_zw(k) & 1200 1480 * heatflux_output_conversion(k) & 1201 * ddx * rmask(j,i,sr) 1481 * ddx * rmask(j,i,sr) * flag 1202 1482 sums_l(k,61,tn) = sums_l(k,61,tn) - 0.5_wp * & 1203 1483 ( kh(k,j,i) + kh(k,j-1,i) ) & … … 1205 1485 * rho_air_zw(k) & 1206 1486 * heatflux_output_conversion(k) & 1207 * ddy * rmask(j,i,sr) 1487 * ddy * rmask(j,i,sr) * flag 1208 1488 ! 1209 1489 !-- Resolved horizontal heat fluxes u*pt*, v*pt* … … 1212 1492 * 0.5_wp * ( pt(k,j,i-1) - hom(k,1,4,sr) + & 1213 1493 pt(k,j,i) - hom(k,1,4,sr) ) & 1214 * heatflux_output_conversion(k) 1494 * heatflux_output_conversion(k) & 1495 * flag 1215 1496 pts = 0.5_wp * ( pt(k,j-1,i) - hom(k,1,4,sr) + & 1216 1497 pt(k,j,i) - hom(k,1,4,sr) ) … … 1219 1500 * 0.5_wp * ( pt(k,j-1,i) - hom(k,1,4,sr) + & 1220 1501 pt(k,j,i) - hom(k,1,4,sr) ) & 1221 * heatflux_output_conversion(k) 1502 * heatflux_output_conversion(k) & 1503 * flag 1222 1504 ENDDO 1223 1505 ENDDO … … 1279 1561 ENDIF 1280 1562 1563 tn = 0 1281 1564 !$OMP PARALLEL PRIVATE( i, j, k, tn ) 1282 !$ tn = omp_get_thread_num() 1283 IF ( land_surface ) THEN 1284 !$OMP DO 1285 DO i = nxl, nxr 1286 DO j = nys, nyn 1287 DO k = nzb_soil, nzt_soil 1288 sums_l(k,89,tn) = sums_l(k,89,tn) + t_soil(k,j,i) & 1289 * rmask(j,i,sr) 1290 sums_l(k,91,tn) = sums_l(k,91,tn) + m_soil(k,j,i) & 1291 * rmask(j,i,sr) 1292 ENDDO 1293 ENDDO 1294 ENDDO 1295 ENDIF 1296 1565 !$ tn = omp_get_thread_num() 1297 1566 IF ( radiation .AND. radiation_scheme == 'rrtmg' ) THEN 1298 1567 !$OMP DO 1299 1568 DO i = nxl, nxr 1300 1569 DO j = nys, nyn 1301 DO k = nzb_s_inner(j,i)+1, nzt+1 1570 DO k = nzb+1, nzt+1 1571 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1572 1302 1573 sums_l(k,102,tn) = sums_l(k,102,tn) + rad_lw_in(k,j,i) & 1303 * rmask(j,i,sr) 1574 * rmask(j,i,sr) * flag 1304 1575 sums_l(k,103,tn) = sums_l(k,103,tn) + rad_lw_out(k,j,i) & 1305 * rmask(j,i,sr) 1576 * rmask(j,i,sr) * flag 1306 1577 sums_l(k,104,tn) = sums_l(k,104,tn) + rad_sw_in(k,j,i) & 1307 * rmask(j,i,sr) 1578 * rmask(j,i,sr) * flag 1308 1579 sums_l(k,105,tn) = sums_l(k,105,tn) + rad_sw_out(k,j,i) & 1309 * rmask(j,i,sr) 1580 * rmask(j,i,sr) * flag 1310 1581 sums_l(k,106,tn) = sums_l(k,106,tn) + rad_lw_cs_hr(k,j,i) & 1311 * rmask(j,i,sr) 1582 * rmask(j,i,sr) * flag 1312 1583 sums_l(k,107,tn) = sums_l(k,107,tn) + rad_lw_hr(k,j,i) & 1313 * rmask(j,i,sr) 1584 * rmask(j,i,sr) * flag 1314 1585 sums_l(k,108,tn) = sums_l(k,108,tn) + rad_sw_cs_hr(k,j,i) & 1315 * rmask(j,i,sr) 1586 * rmask(j,i,sr) * flag 1316 1587 sums_l(k,109,tn) = sums_l(k,109,tn) + rad_sw_hr(k,j,i) & 1317 * rmask(j,i,sr) 1588 * rmask(j,i,sr) * flag 1318 1589 ENDDO 1319 1590 ENDDO -
palm/trunk/SOURCE/header.f90
r2201 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 ! Generic tunnel setup added 23 24 ! 24 25 ! Former revisions: … … 293 294 294 295 USE arrays_3d, & 295 ONLY: pt_init, qsws, q_init, s_init, sa_init, shf, ug, vg, w_subs, zu,& 296 zw 296 ONLY: pt_init, q_init, s_init, sa_init, ug, vg, w_subs, zu, zw 297 297 298 298 USE control_parameters … … 320 320 321 321 USE land_surface_model_mod, & 322 ONLY: l and_surface, lsm_header322 ONLY: lsm_header 323 323 324 324 USE microphysics_mod, & … … 362 362 USE spectra_mod, & 363 363 ONLY: calculate_spectra, spectra_header 364 365 USE surface_mod, & 366 ONLY: surf_def_h 364 367 365 368 IMPLICIT NONE … … 933 936 ENDIF 934 937 938 CASE ( 'tunnel' ) 939 IF ( tunnel_width_x /= 9999999.9_wp ) THEN 940 ! 941 !-- Tunnel axis in y direction 942 IF ( tunnel_length == 9999999.9_wp .OR. & 943 tunnel_length >= ( nx + 1 ) * dx ) THEN 944 WRITE ( io, 273 ) 'y', tunnel_height, tunnel_wall_depth, & 945 tunnel_width_x 946 ELSE 947 WRITE ( io, 274 ) 'y', tunnel_height, tunnel_wall_depth, & 948 tunnel_width_x, tunnel_length 949 ENDIF 950 951 ELSEIF ( tunnel_width_y /= 9999999.9_wp ) THEN 952 ! 953 !-- Tunnel axis in x direction 954 IF ( tunnel_length == 9999999.9_wp .OR. & 955 tunnel_length >= ( ny + 1 ) * dy ) THEN 956 WRITE ( io, 273 ) 'x', tunnel_height, tunnel_wall_depth, & 957 tunnel_width_y 958 ELSE 959 WRITE ( io, 274 ) 'x', tunnel_height, tunnel_wall_depth, & 960 tunnel_width_y, tunnel_length 961 ENDIF 962 ENDIF 963 935 964 END SELECT 936 965 … … 1065 1094 IF ( constant_heatflux ) THEN 1066 1095 IF ( large_scale_forcing .AND. lsf_surf ) THEN 1067 WRITE ( io, 306 ) shf(0,0)1096 IF ( surf_def_h(0)%ns >= 1 ) WRITE ( io, 306 ) surf_def_h(0)%shf(1) 1068 1097 ELSE 1069 1098 WRITE ( io, 306 ) surface_heatflux … … 1073 1102 IF ( humidity .AND. constant_waterflux ) THEN 1074 1103 IF ( large_scale_forcing .AND. lsf_surf ) THEN 1075 WRITE ( io, 311 ) qsws(0,0)1104 WRITE ( io, 311 ) surf_def_h(0)%qsws(1) 1076 1105 ELSE 1077 1106 WRITE ( io, 311 ) surface_waterflux … … 2024 2053 ' Canyon height: ', F6.2, 'm, ch = ', I4, '.' / & 2025 2054 ' Canyon position (',A,'-walls): cxl = ', I4,', cxr = ', I4, '.') 2055 273 FORMAT ( ' Tunnel of infinite length in ',A, & 2056 ' direction' / & 2057 ' Tunnel height: ', F6.2, / & 2058 ' Tunnel-wall depth: ', F6.2 / & 2059 ' Tunnel width: ', F6.2 ) 2060 274 FORMAT ( ' Tunnel in ', A, ' direction.' / & 2061 ' Tunnel height: ', F6.2, / & 2062 ' Tunnel-wall depth: ', F6.2 / & 2063 ' Tunnel width: ', F6.2, / & 2064 ' Tunnel length: ', F6.2 ) 2026 2065 278 FORMAT (' Topography grid definition convention:'/ & 2027 2066 ' cell edge (staggered grid points'/ & -
palm/trunk/SOURCE/init_3d_model.f90
r2173 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography and surface concept: 23 ! - Modify passed parameters for disturb_field 24 ! - Topography representation via flags 25 ! - Remove unused arrays. 26 ! - Move initialization of surface-related quantities to surface_mod 23 27 ! 24 28 ! Former revisions: … … 346 350 347 351 USE land_surface_model_mod, & 348 ONLY: lsm_init, lsm_init_arrays , land_surface352 ONLY: lsm_init, lsm_init_arrays 349 353 350 354 USE ls_forcing_mod … … 383 387 USE surface_layer_fluxes_mod, & 384 388 ONLY: init_surface_layer_fluxes 389 390 USE surface_mod, & 391 ONLY : init_surface_arrays, init_surfaces, surf_def_h, surf_lsm_h, & 392 surf_usm_h 385 393 386 394 USE transpose_indices … … 398 406 INTEGER(iwp) :: j !< 399 407 INTEGER(iwp) :: k !< 400 INTEGER(iwp) :: sr !< 408 INTEGER(iwp) :: k_surf !< surface level index 409 INTEGER(iwp) :: m !< index of surface element in surface data type 410 INTEGER(iwp) :: sr !< index of statistic region 401 411 402 412 INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_2dh_l !< … … 447 457 ts_value(dots_max,0:statistic_regions) ) 448 458 ALLOCATE( ptdf_x(nxlg:nxrg), ptdf_y(nysg:nyng) ) 449 450 ALLOCATE( ol(nysg:nyng,nxlg:nxrg), shf(nysg:nyng,nxlg:nxrg), &451 ts(nysg:nyng,nxlg:nxrg), tswst(nysg:nyng,nxlg:nxrg), &452 us(nysg:nyng,nxlg:nxrg), usws(nysg:nyng,nxlg:nxrg), &453 uswst(nysg:nyng,nxlg:nxrg), vsws(nysg:nyng,nxlg:nxrg), &454 vswst(nysg:nyng,nxlg:nxrg), z0(nysg:nyng,nxlg:nxrg), &455 z0h(nysg:nyng,nxlg:nxrg), z0q(nysg:nyng,nxlg:nxrg) )456 459 457 460 ALLOCATE( d(nzb+1:nzt,nys:nyn,nxl:nxr), & … … 519 522 IF ( humidity ) THEN 520 523 ! 521 !-- 2D-humidity522 ALLOCATE ( qs(nysg:nyng,nxlg:nxrg), &523 qsws(nysg:nyng,nxlg:nxrg), &524 qswst(nysg:nyng,nxlg:nxrg) )525 526 !527 524 !-- 3D-humidity 528 525 #if defined( __nopointer ) … … 571 568 572 569 IF ( microphysics_seifert ) THEN 573 !574 !-- 2D-rain water content and rain drop concentration arrays575 ALLOCATE ( qrs(nysg:nyng,nxlg:nxrg), &576 qrsws(nysg:nyng,nxlg:nxrg), &577 qrswst(nysg:nyng,nxlg:nxrg), &578 nrs(nysg:nyng,nxlg:nxrg), &579 nrsws(nysg:nyng,nxlg:nxrg), &580 nrswst(nysg:nyng,nxlg:nxrg) )581 570 ! 582 571 !-- 3D-rain water content, rain drop concentration arrays … … 622 611 623 612 IF ( passive_scalar ) THEN 624 !625 !-- 2D-scalar arrays626 ALLOCATE ( ss(nysg:nyng,nxlg:nxrg), &627 ssws(nysg:nyng,nxlg:nxrg), &628 sswst(nysg:nyng,nxlg:nxrg) )629 613 630 614 ! … … 642 626 643 627 IF ( ocean ) THEN 644 ALLOCATE( saswsb(nysg:nyng,nxlg:nxrg), &645 saswst(nysg:nyng,nxlg:nxrg) )646 628 #if defined( __nopointer ) 647 629 ALLOCATE( prho(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & … … 660 642 ! density to be apointer 661 643 #endif 662 IF ( humidity_remote ) THEN663 ALLOCATE( qswst_remote(nysg:nyng,nxlg:nxrg))664 qswst_remote = 0.0_wp665 ENDIF666 644 ENDIF 667 645 … … 818 796 819 797 ! 820 !-- 4D-array for storing the Rif-values at vertical walls821 IF ( topography /= 'flat' ) THEN822 ALLOCATE( rif_wall(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:4) )823 rif_wall = 0.0_wp824 ENDIF825 826 !827 798 !-- Arrays to store velocity data from t-dt and the phase speeds which 828 799 !-- are needed for radiation boundary conditions … … 901 872 ENDIF 902 873 #endif 903 874 ! 875 !-- Initialize wall arrays 876 CALL init_surface_arrays 904 877 ! 905 878 !-- Allocate land surface model arrays … … 944 917 sums_up_fraction_l = 0.0_wp 945 918 sums_wsts_bc_l = 0.0_wp 946 947 919 948 920 ! … … 1007 979 hom(:,1,25,:) = SPREAD( l1d, 2, statistic_regions+1 ) 1008 980 1009 IF ( constant_flux_layer ) THEN1010 ol = ( zu(nzb+1) - zw(nzb) ) / ( rif1d(nzb+1) + 1.0E-20_wp )1011 ts = 0.0_wp ! could actually be computed more accurately in the1012 ! 1D model. Update when opportunity arises.1013 us = us1d1014 usws = usws1d1015 vsws = vsws1d1016 ELSE1017 ts = 0.0_wp ! must be set, because used in1018 ol = ( zu(nzb+1) - zw(nzb) ) / zeta_min ! flowste1019 us = 0.0_wp1020 usws = 0.0_wp1021 vsws = 0.0_wp1022 ENDIF1023 1024 981 ELSE 1025 982 e = 0.0_wp ! must be set, because used in 1026 ol = ( zu(nzb+1) - zw(nzb) ) / zeta_min ! flowste 1027 ts = 0.0_wp 1028 us = 0.0_wp 1029 usws = 0.0_wp 1030 vsws = 0.0_wp 1031 ENDIF 1032 uswst = top_momentumflux_u * momentumflux_input_conversion(nzt+1) 1033 vswst = top_momentumflux_v * momentumflux_input_conversion(nzt+1) 1034 1035 ! 1036 !-- In every case qs = 0.0 (see also pt) 1037 !-- This could actually be computed more accurately in the 1D model. 1038 !-- Update when opportunity arises! 1039 IF ( humidity ) THEN 1040 qs = 0.0_wp 1041 IF ( cloud_physics .AND. microphysics_seifert ) THEN 1042 qrs = 0.0_wp 1043 nrs = 0.0_wp 1044 ENDIF 1045 ENDIF 1046 ! 1047 !-- Initialize scaling parameter for passive scalar 1048 IF ( passive_scalar ) ss = 0.0_wp 1049 983 ENDIF 1050 984 ! 1051 985 !-- Inside buildings set velocities back to zero … … 1053 987 DO i = nxlg, nxrg 1054 988 DO j = nysg, nyng 1055 u(nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 1056 v(nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 989 DO k = nzb, nzt 990 u(k,j,i) = MERGE( u(k,j,i), 0.0_wp, & 991 BTEST( wall_flags_0(k,j,i), 1 ) ) 992 v(k,j,i) = MERGE( v(k,j,i), 0.0_wp, & 993 BTEST( wall_flags_0(k,j,i), 2 ) ) 994 ENDDO 1057 995 ENDDO 1058 996 ENDDO … … 1070 1008 DO i = nxl-1, nxr+1 1071 1009 DO j = nys-1, nyn+1 1072 IF ( nzb_u_inner(j,i) == 0 ) u(0,j,i) = u(1,j,i)1073 IF ( nzb_v_inner(j,i) == 0 ) v(0,j,i) = v(1,j,i)1010 u(nzb,j,i) = u(nzb+1,j,i) 1011 v(nzb,j,i) = v(nzb+1,j,i) 1074 1012 ENDDO 1075 1013 ENDDO … … 1119 1057 DO i = nxlg, nxrg 1120 1058 DO j = nysg, nyng 1121 u(nzb:nzb_u_inner(j,i)+1,j,i) = 0.0_wp 1122 v(nzb:nzb_v_inner(j,i)+1,j,i) = 0.0_wp 1059 DO k = nzb, nzt 1060 u(k,j,i) = MERGE( u(k,j,i), 0.0_wp, & 1061 BTEST( wall_flags_0(k,j,i), 20 ) ) 1062 v(k,j,i) = MERGE( v(k,j,i), 0.0_wp, & 1063 BTEST( wall_flags_0(k,j,i), 21 ) ) 1064 ENDDO 1123 1065 ENDDO 1124 1066 ENDDO … … 1183 1125 e = 0.0_wp 1184 1126 ENDIF 1185 ol = ( zu(nzb+1) - zw(nzb) ) / zeta_min1186 ts = 0.0_wp1187 !1188 !-- Very small number is required for calculation of Obukhov length1189 !-- at first timestep1190 us = 1E-30_wp1191 usws = 0.0_wp1192 uswst = top_momentumflux_u * momentumflux_input_conversion(nzt+1)1193 vsws = 0.0_wp1194 vswst = top_momentumflux_v * momentumflux_input_conversion(nzt+1)1195 IF ( humidity ) qs = 0.0_wp1196 IF ( passive_scalar ) ss = 0.0_wp1197 1198 1127 ! 1199 1128 !-- Compute initial temperature field and other constants used in case … … 1282 1211 CALL init_parallel_random_generator(nx, ny, nys, nyn, nxl, nxr) 1283 1212 ENDIF 1284 1285 !1286 !-- Initialize fluxes at bottom surface1287 IF ( use_surface_fluxes ) THEN1288 1289 IF ( constant_heatflux ) THEN1290 !1291 !-- Heat flux is prescribed1292 IF ( random_heatflux ) THEN1293 CALL disturb_heatflux1294 ELSE1295 shf = surface_heatflux * heatflux_input_conversion(nzb)1296 !1297 !-- Initialize shf with data from external file LSF_DATA1298 IF ( large_scale_forcing .AND. lsf_surf ) THEN1299 CALL ls_forcing_surf ( simulated_time )1300 ENDIF1301 1302 !1303 !-- Over topography surface_heatflux is replaced by wall_heatflux(0)1304 IF ( TRIM( topography ) /= 'flat' ) THEN1305 DO i = nxlg, nxrg1306 DO j = nysg, nyng1307 IF ( nzb_s_inner(j,i) /= 0 ) THEN1308 shf(j,i) = wall_heatflux(0) &1309 * heatflux_input_conversion(nzb_s_inner(j,i))1310 ENDIF1311 ENDDO1312 ENDDO1313 ENDIF1314 ENDIF1315 ENDIF1316 1317 !1318 !-- Determine the near-surface water flux1319 IF ( humidity ) THEN1320 IF ( cloud_physics .AND. microphysics_seifert ) THEN1321 qrsws = 0.0_wp1322 nrsws = 0.0_wp1323 ENDIF1324 IF ( constant_waterflux ) THEN1325 qsws = surface_waterflux * waterflux_input_conversion(nzb)1326 !1327 !-- Over topography surface_waterflux is replaced by1328 !-- wall_humidityflux(0)1329 IF ( TRIM( topography ) /= 'flat' ) THEN1330 wall_qflux = wall_humidityflux1331 DO i = nxlg, nxrg1332 DO j = nysg, nyng1333 IF ( nzb_s_inner(j,i) /= 0 ) THEN1334 qsws(j,i) = wall_qflux(0) &1335 * waterflux_input_conversion(nzb_s_inner(j,i))1336 ENDIF1337 ENDDO1338 ENDDO1339 ENDIF1340 ENDIF1341 ENDIF1342 !1343 !-- Initialize the near-surface scalar flux1344 IF ( passive_scalar ) THEN1345 IF ( constant_scalarflux ) THEN1346 ssws = surface_scalarflux1347 !1348 !-- Over topography surface_scalarflux is replaced by1349 !-- wall_scalarflux(0)1350 IF ( TRIM( topography ) /= 'flat' ) THEN1351 wall_sflux = wall_scalarflux1352 DO i = nxlg, nxrg1353 DO j = nysg, nyng1354 IF ( nzb_s_inner(j,i) /= 0 ) ssws(j,i) = wall_sflux(0)1355 ENDDO1356 ENDDO1357 ENDIF1358 ENDIF1359 ENDIF1360 !1361 !-- Initialize near-surface salinity flux1362 IF ( ocean ) saswsb = bottom_salinityflux1363 1364 ENDIF1365 1366 !1367 !-- Initialize fluxes at top surface1368 !-- Currently, only the heatflux and salinity flux can be prescribed.1369 !-- The latent flux is zero in this case!1370 IF ( use_top_fluxes ) THEN1371 !1372 !-- Prescribe to heat flux1373 IF ( constant_top_heatflux ) tswst = top_heatflux &1374 * heatflux_input_conversion(nzt+1)1375 !1376 !-- Prescribe zero latent flux at the top1377 IF ( humidity ) THEN1378 qswst = 0.0_wp1379 IF ( cloud_physics .AND. microphysics_seifert ) THEN1380 nrswst = 0.0_wp1381 qrswst = 0.0_wp1382 ENDIF1383 ENDIF1384 !1385 !-- Prescribe top scalar flux1386 IF ( passive_scalar .AND. constant_top_scalarflux ) &1387 sswst = top_scalarflux1388 !1389 !-- Prescribe top salinity flux1390 IF ( ocean .AND. constant_top_salinityflux) &1391 saswst = top_salinityflux1392 !1393 !-- Initialization in case of a coupled model run1394 IF ( coupling_mode == 'ocean_to_atmosphere' ) THEN1395 tswst = 0.0_wp1396 ENDIF1397 1398 ENDIF1399 1400 !1401 !-- Initialize Prandtl layer quantities1402 IF ( constant_flux_layer ) THEN1403 1404 z0 = roughness_length1405 z0h = z0h_factor * z01406 z0q = z0h_factor * z01407 1408 IF ( .NOT. constant_heatflux ) THEN1409 !1410 !-- Surface temperature is prescribed. Here the heat flux cannot be1411 !-- simply estimated, because therefore ol, u* and theta* would have1412 !-- to be computed by iteration. This is why the heat flux is assumed1413 !-- to be zero before the first time step. It approaches its correct1414 !-- value in the course of the first few time steps.1415 shf = 0.0_wp1416 ENDIF1417 1418 IF ( humidity ) THEN1419 IF ( .NOT. constant_waterflux ) qsws = 0.0_wp1420 IF ( cloud_physics .AND. microphysics_seifert ) THEN1421 qrsws = 0.0_wp1422 nrsws = 0.0_wp1423 ENDIF1424 ENDIF1425 IF ( passive_scalar .AND. .NOT. constant_scalarflux ) ssws = 0.0_wp1426 1427 ENDIF1428 1429 1213 ! 1430 1214 !-- Set the reference state to be used in the buoyancy terms (for ocean runs … … 1522 1306 1523 1307 ELSEIF ( TRIM( initializing_actions ) == 'read_restart_data' .OR. & 1524 TRIM( initializing_actions ) == 'cyclic_fill' )&1308 TRIM( initializing_actions ) == 'cyclic_fill' ) & 1525 1309 THEN 1526 1310 1527 1311 CALL location_message( 'initializing in case of restart / cyclic_fill', & 1528 1312 .FALSE. ) 1313 ! 1314 !-- Initialize surface elements and its attributes, e.g. heat- and 1315 !-- momentumfluxes, roughness, scaling parameters. As number of surface 1316 !-- elements might be different between runs, e.g. in case of cyclic fill, 1317 !-- and not all surface elements are read, surface elements need to be 1318 !-- initialized before. 1319 CALL init_surfaces 1529 1320 ! 1530 1321 !-- When reading data for cyclic fill of 3D prerun data files, read … … 1671 1462 DO i = nxlg, nxrg 1672 1463 DO j = nysg, nyng 1673 u (nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 1674 v (nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 1675 w (nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 1676 e (nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 1677 tu_m(nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 1678 tv_m(nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 1679 tw_m(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 1680 te_m(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 1681 tpt_m(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 1464 DO k = nzb, nzt 1465 u(k,j,i) = MERGE( u(k,j,i), 0.0_wp, & 1466 BTEST( wall_flags_0(k,j,i), 1 ) ) 1467 v(k,j,i) = MERGE( v(k,j,i), 0.0_wp, & 1468 BTEST( wall_flags_0(k,j,i), 2 ) ) 1469 w(k,j,i) = MERGE( w(k,j,i), 0.0_wp, & 1470 BTEST( wall_flags_0(k,j,i), 3 ) ) 1471 e(k,j,i) = MERGE( e(k,j,i), 0.0_wp, & 1472 BTEST( wall_flags_0(k,j,i), 0 ) ) 1473 tu_m(k,j,i) = MERGE( tu_m(k,j,i), 0.0_wp, & 1474 BTEST( wall_flags_0(k,j,i), 1 ) ) 1475 tv_m(k,j,i) = MERGE( tv_m(k,j,i), 0.0_wp, & 1476 BTEST( wall_flags_0(k,j,i), 2 ) ) 1477 tw_m(k,j,i) = MERGE( tw_m(k,j,i), 0.0_wp, & 1478 BTEST( wall_flags_0(k,j,i), 3 ) ) 1479 te_m(k,j,i) = MERGE( te_m(k,j,i), 0.0_wp, & 1480 BTEST( wall_flags_0(k,j,i), 0 ) ) 1481 tpt_m(k,j,i) = MERGE( tpt_m(k,j,i), 0.0_wp, & 1482 BTEST( wall_flags_0(k,j,i), 0 ) ) 1483 ENDDO 1682 1484 ENDDO 1683 1485 ENDDO … … 1766 1568 IF ( nxr == nx ) THEN 1767 1569 DO j = nys, nyn 1768 DO k = nzb _u_inner(j,nx)+1, nzt1570 DO k = nzb+1, nzt 1769 1571 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1770 u_init(k) * dzw(k) 1771 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) 1572 u_init(k) * dzw(k) & 1573 * MERGE( 1.0_wp, 0.0_wp, & 1574 BTEST( wall_flags_0(k,j,nxr), 1 )& 1575 ) 1576 1577 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) & 1578 * MERGE( 1.0_wp, 0.0_wp, & 1579 BTEST( wall_flags_0(k,j,nxr), 1 )& 1580 ) 1772 1581 ENDDO 1773 1582 ENDDO … … 1776 1585 IF ( nyn == ny ) THEN 1777 1586 DO i = nxl, nxr 1778 DO k = nzb_v_inner(ny,i)+1, nzt 1779 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1780 v_init(k) * dzw(k) 1781 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) 1587 DO k = nzb+1, nzt 1588 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1589 v_init(k) * dzw(k) & 1590 * MERGE( 1.0_wp, 0.0_wp, & 1591 BTEST( wall_flags_0(k,nyn,i), 2 )& 1592 ) 1593 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) & 1594 * MERGE( 1.0_wp, 0.0_wp, & 1595 BTEST( wall_flags_0(k,nyn,i), 2 )& 1596 ) 1782 1597 ENDDO 1783 1598 ENDDO … … 1802 1617 IF ( nxr == nx ) THEN 1803 1618 DO j = nys, nyn 1804 DO k = nzb _u_inner(j,nx)+1, nzt1619 DO k = nzb+1, nzt 1805 1620 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1806 hom_sum(k,1,0) * dzw(k) 1807 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) 1621 hom_sum(k,1,0) * dzw(k) & 1622 * MERGE( 1.0_wp, 0.0_wp, & 1623 BTEST( wall_flags_0(k,j,nx), 1 ) & 1624 ) 1625 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) & 1626 * MERGE( 1.0_wp, 0.0_wp, & 1627 BTEST( wall_flags_0(k,j,nx), 1 ) & 1628 ) 1808 1629 ENDDO 1809 1630 ENDDO … … 1812 1633 IF ( nyn == ny ) THEN 1813 1634 DO i = nxl, nxr 1814 DO k = nzb _v_inner(ny,i)+1, nzt1635 DO k = nzb+1, nzt 1815 1636 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1816 hom_sum(k,2,0) * dzw(k) 1817 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) 1637 hom_sum(k,2,0) * dzw(k) & 1638 * MERGE( 1.0_wp, 0.0_wp, & 1639 BTEST( wall_flags_0(k,ny,i), 2 ) & 1640 ) 1641 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) & 1642 * MERGE( 1.0_wp, 0.0_wp, & 1643 BTEST( wall_flags_0(k,ny,i), 2 ) & 1644 ) 1818 1645 ENDDO 1819 1646 ENDDO … … 1838 1665 IF ( nxr == nx ) THEN 1839 1666 DO j = nys, nyn 1840 DO k = nzb_u_inner(j,nx)+1, nzt 1841 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1842 u(k,j,nx) * dzw(k) 1843 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) 1667 DO k = nzb+1, nzt 1668 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1669 u(k,j,nx) * dzw(k) & 1670 * MERGE( 1.0_wp, 0.0_wp, & 1671 BTEST( wall_flags_0(k,j,nx), 1 ) & 1672 ) 1673 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) & 1674 * MERGE( 1.0_wp, 0.0_wp, & 1675 BTEST( wall_flags_0(k,j,nx), 1 ) & 1676 ) 1844 1677 ENDDO 1845 1678 ENDDO … … 1848 1681 IF ( nyn == ny ) THEN 1849 1682 DO i = nxl, nxr 1850 DO k = nzb _v_inner(ny,i)+1, nzt1683 DO k = nzb+1, nzt 1851 1684 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1852 v(k,ny,i) * dzw(k) 1853 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) 1685 v(k,ny,i) * dzw(k) & 1686 * MERGE( 1.0_wp, 0.0_wp, & 1687 BTEST( wall_flags_0(k,ny,i), 2 ) & 1688 ) 1689 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) & 1690 * MERGE( 1.0_wp, 0.0_wp, & 1691 BTEST( wall_flags_0(k,ny,i), 2 ) & 1692 ) 1854 1693 ENDDO 1855 1694 ENDDO … … 1878 1717 1879 1718 ENDIF 1880 1719 ! 1720 !-- Initialize surface elements and its attributes, e.g. heat- and 1721 !-- momentumfluxes, roughness, scaling parameters. 1722 !-- This is already done in case of restart data. 1723 IF ( TRIM( initializing_actions ) /= 'read_restart_data' .AND. & 1724 TRIM( initializing_actions ) /= 'cyclic_fill' ) THEN 1725 CALL init_surfaces 1726 ! 1727 !-- Finally, if random_heatflux is set, disturb shf at horizontal 1728 !-- surfaces. Actually, this should be done in surface_mod, where all other 1729 !-- initializations of surface quantities are done. However, this 1730 !-- would create a ring dependency, hence, it is done here. Maybe delete 1731 !-- disturb_heatflux and tranfer the respective code directly into the 1732 !-- initialization in surface_mod. 1733 IF ( use_surface_fluxes .AND. constant_heatflux .AND. & 1734 random_heatflux ) THEN 1735 IF ( surf_def_h(0)%ns >= 1 ) CALL disturb_heatflux( surf_def_h(0) ) 1736 IF ( surf_lsm_h%ns >= 1 ) CALL disturb_heatflux( surf_lsm_h ) 1737 IF ( surf_usm_h%ns >= 1 ) CALL disturb_heatflux( surf_usm_h ) 1738 ENDIF 1739 ENDIF 1740 1741 ! 1742 !-- Initialize surface forcing corresponding to large-scale forcing. Therein, 1743 !-- initialize heat-fluxes, etc. via datatype. Revise it later! 1744 IF ( large_scale_forcing .AND. lsf_surf ) THEN 1745 IF ( use_surface_fluxes .AND. constant_heatflux ) THEN 1746 CALL ls_forcing_surf ( simulated_time ) 1747 ENDIF 1748 ENDIF 1881 1749 ! 1882 1750 !-- Initialize quantities for special advections schemes … … 1891 1759 1892 1760 CALL location_message( 'creating initial disturbances', .FALSE. ) 1893 CALL disturb_field( nzb_u_inner, tend, u )1894 CALL disturb_field( nzb_v_inner, tend, v )1761 CALL disturb_field( 'u', tend, u ) 1762 CALL disturb_field( 'v', tend, v ) 1895 1763 CALL location_message( 'finished', .TRUE. ) 1896 1764 … … 2148 2016 mean_surface_level_height_l = 0.0_wp 2149 2017 2018 ! 2019 !-- To do: New concept for these non-topography grid points! 2150 2020 DO sr = 0, statistic_regions 2151 2021 DO i = nxl, nxr … … 2155 2025 !-- All xy-grid points 2156 2026 ngp_2dh_l(sr) = ngp_2dh_l(sr) + 1 2157 mean_surface_level_height_l(sr) = mean_surface_level_height_l(sr) & 2158 + zw(nzb_s_inner(j,i)) 2159 ! 2160 !-- xy-grid points above topography 2161 DO k = nzb_s_outer(j,i), nz + 1 2162 ngp_2dh_outer_l(k,sr) = ngp_2dh_outer_l(k,sr) + 1 2027 ! 2028 !-- Determine mean surface-level height. In case of downward- 2029 !-- facing walls are present, more than one surface level exist. 2030 !-- In this case, use the lowest surface-level height. 2031 IF ( surf_def_h(0)%start_index(j,i) <= & 2032 surf_def_h(0)%end_index(j,i) ) THEN 2033 m = surf_def_h(0)%start_index(j,i) 2034 k = surf_def_h(0)%k(m) 2035 mean_surface_level_height_l(sr) = & 2036 mean_surface_level_height_l(sr) + zw(k-1) 2037 ENDIF 2038 IF ( surf_lsm_h%start_index(j,i) <= & 2039 surf_lsm_h%end_index(j,i) ) THEN 2040 m = surf_lsm_h%start_index(j,i) 2041 k = surf_lsm_h%k(m) 2042 mean_surface_level_height_l(sr) = & 2043 mean_surface_level_height_l(sr) + zw(k-1) 2044 ENDIF 2045 IF ( surf_usm_h%start_index(j,i) <= & 2046 surf_usm_h%end_index(j,i) ) THEN 2047 m = surf_usm_h%start_index(j,i) 2048 k = surf_usm_h%k(m) 2049 mean_surface_level_height_l(sr) = & 2050 mean_surface_level_height_l(sr) + zw(k-1) 2051 ENDIF 2052 2053 k_surf = k - 1 2054 2055 DO k = nzb, nzt+1 2056 ! 2057 !-- xy-grid points above topography 2058 ngp_2dh_outer_l(k,sr) = ngp_2dh_outer_l(k,sr) + & 2059 MERGE( 1, 0, BTEST( wall_flags_0(k,j,i), 24 ) ) 2060 2061 ngp_2dh_s_inner_l(k,sr) = ngp_2dh_s_inner_l(k,sr) + & 2062 MERGE( 1, 0, BTEST( wall_flags_0(k,j,i), 22 ) ) 2063 2163 2064 ENDDO 2164 DO k = nzb_s_inner(j,i), nz + 12165 ngp_2dh_s_inner_l(k,sr) = ngp_2dh_s_inner_l(k,sr) + 12166 ENDDO2167 2065 ! 2168 2066 !-- All grid points of the total domain above topography 2169 ngp_3d_inner_l(sr) = ngp_3d_inner_l(sr) & 2170 + ( nz - nzb_s_inner(j,i) + 2 ) 2067 ngp_3d_inner_l(sr) = ngp_3d_inner_l(sr) + ( nz - k_surf + 2 ) 2068 2069 2070 2171 2071 ENDIF 2172 2072 ENDDO -
palm/trunk/SOURCE/init_grid.f90
r2201 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! - Adjustments according to new topography representation 23 ! - Bugfix: Move determination of nzb_max behind topography modification in 24 ! cell-edge case 25 ! - Get rid off global arrays required for topography output 26 ! - Enable topography input via netcdf 27 ! - Generic tunnel set-up added 23 28 ! 24 29 ! Former revisions: … … 212 217 ! ------------ 213 218 !> Creating grid depending constants 219 !> To Do: Setting topo flags only based on topo_3d array - flags for former 220 !> nzb_outer arrays are still not set properly. 221 !> To Do: Rearrange topo flag list 214 222 !------------------------------------------------------------------------------! 215 223 SUBROUTINE init_grid … … 230 238 dz_stretch_level, dz_stretch_level_index, grid_level, ibc_uv_b, & 231 239 io_blocks, io_group, inflow_l, inflow_n, inflow_r, inflow_s, & 232 masking_method, maximum_grid_level, message_string,&240 lod, masking_method, maximum_grid_level, message_string, & 233 241 momentum_advec, nest_domain, nest_bound_l, nest_bound_n, & 234 242 nest_bound_r, nest_bound_s, ocean, outflow_l, outflow_n, & 235 243 outflow_r, outflow_s, psolver, scalar_advec, topography, & 236 topography_grid_convention, use_surface_fluxes, use_top_fluxes, & 237 wall_adjustment_factor 244 topography_grid_convention, tunnel_height, tunnel_length, & 245 tunnel_width_x, tunnel_width_y, tunnel_wall_depth, & 246 use_surface_fluxes, use_top_fluxes, wall_adjustment_factor 238 247 239 248 USE grid_variables, & 240 ONLY: ddx, ddx2, ddy, ddy2, dx, dx2, dy, dy2, fwxm, & 241 fwxp, fwym, fwyp, fxm, fxp, fym, fyp, wall_e_x, wall_e_y, & 242 wall_u, wall_v, wall_w_x, wall_w_y, zu_s_inner, zw_w_inner 249 ONLY: ddx, ddx2, ddy, ddy2, dx, dx2, dy, dy2, zu_s_inner, zw_w_inner 243 250 244 251 USE indices, & 245 ONLY: flags, nbgp, nx, nxl, nxlg, nxl_mg, nxr, nxrg, nxr_mg,&246 n y, nyn, nyng, nyn_mg, nys, nys_mg, nysg, nz, nzb,&247 nzb _diff, nzb_diff_s_inner, nzb_diff_s_outer, nzb_diff_u,&248 nzb_ diff_v, nzb_max, nzb_s_inner, nzb_s_outer, nzb_u_inner,&252 ONLY: advc_flags_1, advc_flags_2, flags, nbgp, nx, nxl, nxlg, nxl_mg, & 253 nxr, nxrg, nxr_mg, ny, nyn, nyng, nyn_mg, nys, nys_mg, nysg, nz,& 254 nzb, nzb_diff, nzb_diff_s_inner, nzb_diff_s_outer, & 255 nzb_max, nzb_s_inner, nzb_s_outer, nzb_u_inner, & 249 256 nzb_u_outer, nzb_v_inner, nzb_v_outer, nzb_w_inner, & 250 nzb_w_outer, nzt, nzt_diff, nzt_mg, rflags_invers, & 251 rflags_s_inner, wall_flags_0, wall_flags_00, wall_flags_1, & 257 nzb_w_outer, nzt, nzt_mg, wall_flags_0, wall_flags_1, & 252 258 wall_flags_10, wall_flags_2, wall_flags_3, wall_flags_4, & 253 259 wall_flags_5, wall_flags_6, wall_flags_7, wall_flags_8, & … … 255 261 256 262 USE kinds 257 263 #if defined ( __netcdf ) 264 USE netcdf_interface, & 265 ONLY: netcdf_close_file, netcdf_open_read_file, netcdf_get_attribute, & 266 netcdf_get_variable 267 #endif 258 268 USE pegrid 269 270 USE surface_mod, & 271 ONLY: init_bc 259 272 260 273 IMPLICIT NONE … … 275 288 INTEGER(iwp) :: cys !< index for south canyon wall 276 289 INTEGER(iwp) :: i !< index variable along x 290 INTEGER(iwp) :: id_topo !< NetCDF id of topograhy input file 277 291 INTEGER(iwp) :: ii !< loop variable for reading topography file 278 292 INTEGER(iwp) :: inc !< incremental parameter for coarsening grid level 279 293 INTEGER(iwp) :: j !< index variable along y 280 294 INTEGER(iwp) :: k !< index variable along z 295 INTEGER(iwp) :: k_top !< topography top index on local PE 281 296 INTEGER(iwp) :: l !< loop variable 282 297 INTEGER(iwp) :: nxl_l !< index of left PE boundary for multigrid level … … 286 301 INTEGER(iwp) :: nzb_local_max !< vertical grid index of maximum topography height 287 302 INTEGER(iwp) :: nzb_local_min !< vertical grid index of minimum topography height 288 INTEGER(iwp) :: nzb_si !< dummy index for local nzb_s_inner289 303 INTEGER(iwp) :: nzt_l !< index of top PE boundary for multigrid level 290 304 INTEGER(iwp) :: num_hole !< number of holes (in topography) resolved by only one grid point … … 292 306 INTEGER(iwp) :: num_wall !< number of surrounding vertical walls for a single grid point 293 307 INTEGER(iwp) :: skip_n_rows !< counting variable to skip rows while reading topography file 294 INTEGER(iwp) :: vi !< dummy for vertical influence 295 296 INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: & 297 vertical_influence !< number of vertical grid points above obstacle where adjustment of near-wall mixing length is required 298 299 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: corner_nl !< index of north-left corner location to limit near-wall mixing length 300 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: corner_nr !< north-right 301 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: corner_sl !< south-left 302 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: corner_sr !< south-right 308 INTEGER(iwp) :: hv_in !< heavyside function to model inner tunnel surface 309 INTEGER(iwp) :: hv_out !< heavyside function to model outer tunnel surface 310 INTEGER(iwp) :: txe_out !< end position of outer tunnel wall in x 311 INTEGER(iwp) :: txs_out !< start position of outer tunnel wall in x 312 INTEGER(iwp) :: tye_out !< end position of outer tunnel wall in y 313 INTEGER(iwp) :: tys_out !< start position of outer tunnel wall in y 314 INTEGER(iwp) :: txe_in !< end position of inner tunnel wall in x 315 INTEGER(iwp) :: txs_in !< start position of inner tunnel wall in x 316 INTEGER(iwp) :: tye_in !< end position of inner tunnel wall in y 317 INTEGER(iwp) :: tys_in !< start position of inner tunnel wall in y 318 INTEGER(iwp) :: td !< tunnel wall depth 319 INTEGER(iwp) :: th !< height of outer tunnel wall 320 303 321 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_local !< index for topography top at cell-center 304 322 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_tmp !< dummy to calculate topography indices on u- and v-grid 305 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: wall_l !< distance to adjacent left-facing wall 306 INTEGER(iwp), DIMENSION(:,: ), ALLOCATABLE :: wall_n !< north-facing307 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: wall_r !< right-facing 308 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: wall_s !< right-facing323 324 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: topo_3d !< input array for 3D topography and dummy array for setting "outer"-flags 325 326 LOGICAL :: netcdf_extend = .FALSE. !< Flag indicating wether netcdf topography input file or not 309 327 310 328 REAL(wp) :: dum !< dummy variable to skip columns while reading topography file 311 329 REAL(wp) :: dz_stretched !< stretched vertical grid spacing 312 330 331 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: oro_height !< input variable for terrain height 313 332 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: topo_height !< input variable for topography height 314 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zu_s_inner_l !< dummy array on global scale to write topography output array 315 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zw_w_inner_l !< dummy array on global scale to write topography output array 316 317 333 318 334 ! 319 335 !-- Calculation of horizontal array bounds including ghost layers … … 464 480 ! 465 481 !-- Allocate outer and inner index arrays for topography and set 466 !-- defaults. 467 468 ALLOCATE( corner_nl(nys:nyn,nxl:nxr), corner_nr(nys:nyn,nxl:nxr), & 469 corner_sl(nys:nyn,nxl:nxr), corner_sr(nys:nyn,nxl:nxr), & 470 wall_l(nys:nyn,nxl:nxr), wall_n(nys:nyn,nxl:nxr), & 471 wall_r(nys:nyn,nxl:nxr), wall_s(nys:nyn,nxl:nxr) ) 472 473 ALLOCATE( fwxm(nysg:nyng,nxlg:nxrg), fwxp(nysg:nyng,nxlg:nxrg), & 474 fwym(nysg:nyng,nxlg:nxrg), fwyp(nysg:nyng,nxlg:nxrg), & 475 fxm(nysg:nyng,nxlg:nxrg), fxp(nysg:nyng,nxlg:nxrg), & 476 fym(nysg:nyng,nxlg:nxrg), fyp(nysg:nyng,nxlg:nxrg), & 477 nzb_s_inner(nysg:nyng,nxlg:nxrg), & 482 !-- defaults. 483 ALLOCATE( nzb_s_inner(nysg:nyng,nxlg:nxrg), & 478 484 nzb_s_outer(nysg:nyng,nxlg:nxrg), & 479 485 nzb_u_inner(nysg:nyng,nxlg:nxrg), & … … 485 491 nzb_diff_s_inner(nysg:nyng,nxlg:nxrg), & 486 492 nzb_diff_s_outer(nysg:nyng,nxlg:nxrg), & 487 nzb_diff_u(nysg:nyng,nxlg:nxrg), &488 nzb_diff_v(nysg:nyng,nxlg:nxrg), &489 493 nzb_local(nysg:nyng,nxlg:nxrg), & 490 494 nzb_tmp(nysg:nyng,nxlg:nxrg), & 491 rflags_s_inner(nzb:nzt+2,nysg:nyng,nxlg:nxrg), & 492 rflags_invers(nysg:nyng,nxlg:nxrg,nzb:nzt+2), & 493 wall_e_x(nysg:nyng,nxlg:nxrg), & 494 wall_e_y(nysg:nyng,nxlg:nxrg), & 495 wall_u(nysg:nyng,nxlg:nxrg), & 496 wall_v(nysg:nyng,nxlg:nxrg), & 497 wall_w_x(nysg:nyng,nxlg:nxrg), & 498 wall_w_y(nysg:nyng,nxlg:nxrg) ) 499 500 495 wall_flags_0(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 496 497 ALLOCATE( topo_3d(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 498 topo_3d = 0 501 499 502 500 ALLOCATE( l_wall(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 503 504 501 505 502 nzb_s_inner = nzb; nzb_s_outer = nzb … … 507 504 nzb_v_inner = nzb; nzb_v_outer = nzb 508 505 nzb_w_inner = nzb; nzb_w_outer = nzb 509 510 rflags_s_inner = 1.0_wp511 rflags_invers = 1.0_wp512 506 513 507 ! … … 519 513 nzb_diff = nzb + 1 520 514 ENDIF 521 IF ( use_top_fluxes ) THEN522 nzt_diff = nzt - 1523 ELSE524 nzt_diff = nzt525 ENDIF526 515 527 516 nzb_diff_s_inner = nzb_diff; nzb_diff_s_outer = nzb_diff 528 nzb_diff_u = nzb_diff; nzb_diff_v = nzb_diff529 530 wall_e_x = 0.0_wp; wall_e_y = 0.0_wp; wall_u = 0.0_wp; wall_v = 0.0_wp531 wall_w_x = 0.0_wp; wall_w_y = 0.0_wp532 fwxp = 1.0_wp; fwxm = 1.0_wp; fwyp = 1.0_wp; fwym = 1.0_wp533 fxp = 1.0_wp; fxm = 1.0_wp; fyp = 1.0_wp; fym = 1.0_wp534 517 535 518 ! … … 542 525 ENDDO 543 526 l_wall(nzt+1,:,:) = l_grid(nzt) 544 545 ALLOCATE ( vertical_influence(nzb:nzt) )546 DO k = 1, nzt547 vertical_influence(k) = MIN ( INT( l_grid(k) / &548 ( wall_adjustment_factor * dzw(k) ) + 0.5_wp ), nzt - k )549 ENDDO550 527 551 528 DO k = 1, nzt … … 561 538 ENDIF 562 539 ENDDO 563 vertical_influence(0) = vertical_influence(1)564 565 DO k = nzb + 1, nzb + vertical_influence(nzb)566 l_wall(k,:,:) = zu(k) - zw(nzb)567 ENDDO568 569 540 ! 570 541 !-- Set outer and inner index arrays for non-flat topography. … … 580 551 !-- nzb_local is required for the multigrid solver 581 552 nzb_local = 0 553 ! 554 !-- Initialilize 3D topography array, used later for initializing flags 555 topo_3d(nzb+1:nzt+1,:,:) = IBSET( topo_3d(nzb+1:nzt+1,:,:), 0 ) 556 ! 557 !-- level of detail is required for output routines 558 lod = 1 582 559 583 560 CASE ( 'single_building' ) … … 587 564 blx = NINT( building_length_x / dx ) 588 565 bly = NINT( building_length_y / dy ) 589 IF ( .NOT. ocean ) THEN 590 bh = MINLOC( ABS( zw - building_height ), 1 ) - 1 591 ELSE 592 bh = MINLOC( ABS( zw - zw(0) - building_height ), 1 ) - 1 593 ENDIF 594 595 IF ( ABS( zw(bh ) - building_height ) == & 566 bh = MINLOC( ABS( zw - building_height ), 1 ) - 1 567 IF ( ABS( zw(bh) - building_height ) == & 596 568 ABS( zw(bh+1) - building_height ) ) bh = bh + 1 597 569 … … 626 598 627 599 CALL exchange_horiz_2d_int( nzb_local, nys, nyn, nxl, nxr, nbgp ) 600 ! 601 !-- Set bit array to mask topography 602 DO i = nxlg, nxrg 603 DO j = nysg, nyng 604 605 topo_3d(nzb_local(j,i)+1:nzt+1,j,i) = & 606 IBSET( topo_3d(nzb_local(j,i)+1:nzt+1,j,i), 0 ) 607 ENDDO 608 ENDDO 609 ! 610 !-- level of detail is required for output routines. Here, 2D topography. 611 lod = 1 612 613 CALL exchange_horiz_int( topo_3d, nbgp ) 628 614 629 615 CASE ( 'single_street_canyon' ) … … 658 644 ENDIF 659 645 660 IF ( .NOT. ocean ) THEN 661 ch = MINLOC( ABS( zw - canyon_height ), 1 ) - 1 662 ELSE 663 ch = MINLOC( ABS( zw - zw(0) - canyon_height ), 1 ) - 1 664 ENDIF 665 666 IF ( ABS( zw(ch ) - canyon_height ) == & 646 ch = MINLOC( ABS( zw - canyon_height ), 1 ) - 1 647 IF ( ABS( zw(ch) - canyon_height ) == & 667 648 ABS( zw(ch+1) - canyon_height ) ) ch = ch + 1 668 649 … … 707 688 708 689 CALL exchange_horiz_2d_int( nzb_local, nys, nyn, nxl, nxr, nbgp ) 690 ! 691 !-- Set bit array to mask topography 692 DO i = nxlg, nxrg 693 DO j = nysg, nyng 694 topo_3d(nzb_local(j,i)+1:nzt+1,j,i) = & 695 IBSET( topo_3d(nzb_local(j,i)+1:nzt+1,j,i), 0 ) 696 ENDDO 697 ENDDO 698 ! 699 !-- level of detail is required for output routines. Here, 2D topography. 700 lod = 1 701 702 CALL exchange_horiz_int( topo_3d, nbgp ) 703 704 CASE ( 'tunnel' ) 705 706 ! 707 !-- Tunnel height 708 IF ( tunnel_height == 9999999.9_wp ) THEN 709 th = zw( INT( 0.2 * nz) ) 710 ELSE 711 th = tunnel_height 712 ENDIF 713 ! 714 !-- Tunnel-wall depth 715 IF ( tunnel_wall_depth == 9999999.9_wp ) THEN 716 td = MAX ( dx, dy, dz ) 717 ELSE 718 td = tunnel_wall_depth 719 ENDIF 720 ! 721 !-- Check for tunnel width 722 IF ( tunnel_width_x == 9999999.9_wp .AND. & 723 tunnel_width_y == 9999999.9_wp ) THEN 724 message_string = 'No tunnel width is given. ' 725 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 726 ENDIF 727 IF ( tunnel_width_x /= 9999999.9_wp .AND. & 728 tunnel_width_y /= 9999999.9_wp ) THEN 729 message_string = 'Inconsistent tunnel parameters:' // & 730 'tunnel can only be oriented' // & 731 'either in x- or in y-direction.' 732 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 733 ENDIF 734 ! 735 !-- Tunnel axis along y 736 IF ( tunnel_width_x /= 9999999.9_wp ) THEN 737 IF ( tunnel_width_x > ( nx + 1 ) * dx ) THEN 738 message_string = 'Tunnel width too large' 739 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 740 ENDIF 741 742 txs_out = INT( ( nx + 1 ) * 0.5_wp * dx - tunnel_width_x * 0.5_wp ) 743 txe_out = INT( ( nx + 1 ) * 0.5_wp * dx + tunnel_width_x * 0.5_wp ) 744 txs_in = INT( ( nx + 1 ) * 0.5_wp * dx - & 745 ( tunnel_width_x * 0.5_wp - td ) ) 746 txe_in = INT( ( nx + 1 ) * 0.5_wp * dx + & 747 ( tunnel_width_x * 0.5_wp - td ) ) 748 749 tys_out = INT( ( ny + 1 ) * 0.5_wp * dy - tunnel_length * 0.5_wp ) 750 tye_out = INT( ( ny + 1 ) * 0.5_wp * dy + tunnel_length * 0.5_wp ) 751 tys_in = tys_out 752 tye_in = tye_out 753 ENDIF 754 IF ( tunnel_width_x /= 9999999.9_wp .AND. & 755 tunnel_width_x - 2.0_wp * tunnel_wall_depth <= 2.0_wp * dx ) THEN 756 message_string = 'Tunnel width too small' 757 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 758 ENDIF 759 IF ( tunnel_width_y /= 9999999.9_wp .AND. & 760 tunnel_width_y - 2.0_wp * tunnel_wall_depth <= 2.0_wp * dy ) THEN 761 message_string = 'Tunnel width too small' 762 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 763 ENDIF 764 ! 765 !-- Tunnel axis along x 766 IF ( tunnel_width_y /= 9999999.9_wp ) THEN 767 IF ( tunnel_width_y > ( ny + 1 ) * dy ) THEN 768 message_string = 'Tunnel width too large' 769 CALL message( 'init_grid', 'PA0207', 1, 2, 0, 6, 0 ) 770 ENDIF 771 772 txs_out = INT( ( nx + 1 ) * 0.5_wp * dx - tunnel_length * 0.5_wp ) 773 txe_out = INT( ( nx + 1 ) * 0.5_wp * dx + tunnel_length * 0.5_wp ) 774 txs_in = txs_out 775 txe_in = txe_out 776 777 tys_out = INT( ( ny + 1 ) * 0.5_wp * dy - tunnel_width_y * 0.5_wp ) 778 tye_out = INT( ( ny + 1 ) * 0.5_wp * dy + tunnel_width_y * 0.5_wp ) 779 tys_in = INT( ( ny + 1 ) * 0.5_wp * dy - & 780 ( tunnel_width_y * 0.5_wp - td ) ) 781 tye_in = INT( ( ny + 1 ) * 0.5_wp * dy + & 782 ( tunnel_width_y * 0.5_wp - td ) ) 783 ENDIF 784 785 topo_3d = 0 786 DO i = nxl, nxr 787 DO j = nys, nyn 788 ! 789 !-- Use heaviside function to model outer tunnel surface 790 hv_out = th * 0.5_wp * & 791 ( ( SIGN( 1.0_wp, i * dx - txs_out ) + 1.0_wp ) & 792 - ( SIGN( 1.0_wp, i * dx - txe_out ) + 1.0_wp ) ) 793 794 hv_out = hv_out * 0.5_wp * & 795 ( ( SIGN( 1.0_wp, j * dy - tys_out ) + 1.0_wp ) & 796 - ( SIGN( 1.0_wp, j * dy - tye_out ) + 1.0_wp ) ) 797 ! 798 !-- Use heaviside function to model inner tunnel surface 799 hv_in = ( th - td ) * 0.5_wp * & 800 ( ( SIGN( 1.0_wp, i * dx - txs_in ) + 1.0_wp ) & 801 - ( SIGN( 1.0_wp, i * dx - txe_in ) + 1.0_wp ) ) 802 803 hv_in = hv_in * 0.5_wp * & 804 ( ( SIGN( 1.0_wp, j * dy - tys_in ) + 1.0_wp ) & 805 - ( SIGN( 1.0_wp, j * dy - tye_in ) + 1.0_wp ) ) 806 ! 807 !-- Set flags at x-y-positions without any tunnel surface 808 IF ( hv_out - hv_in == 0.0_wp ) THEN 809 topo_3d(nzb+1:nzt+1,j,i) = IBSET( topo_3d(nzb+1:nzt+1,j,i), 0 ) 810 ! 811 !-- Set flags at x-y-positions with tunnel surfaces 812 ELSE 813 DO k = nzb + 1, nzt + 1 814 ! 815 !-- Inner tunnel 816 IF ( hv_out - hv_in == th ) THEN 817 IF ( zw(k) <= hv_out ) THEN 818 topo_3d(k,j,i) = IBCLR( topo_3d(k,j,i), 0 ) 819 ELSE 820 topo_3d(k,j,i) = IBSET( topo_3d(k,j,i), 0 ) 821 ENDIF 822 ENDIF 823 ! 824 !-- Lateral tunnel walls 825 IF ( hv_out - hv_in == td ) THEN 826 IF ( zw(k) <= hv_in ) THEN 827 topo_3d(k,j,i) = IBSET( topo_3d(k,j,i), 0 ) 828 ELSEIF ( zw(k) > hv_in .AND. zw(k) <= hv_out ) THEN 829 topo_3d(k,j,i) = IBCLR( topo_3d(k,j,i), 0 ) 830 ELSEIF ( zw(k) > hv_out ) THEN 831 topo_3d(k,j,i) = IBSET( topo_3d(k,j,i), 0 ) 832 ENDIF 833 ENDIF 834 ENDDO 835 ENDIF 836 ENDDO 837 ENDDO 838 839 nzb_local = 0 840 ! 841 !-- level of detail is required for output routines. Here, 3D topography. 842 lod = 2 843 844 CALL exchange_horiz_int( topo_3d, nbgp ) 709 845 710 846 CASE ( 'read_from_file' ) 711 847 848 ALLOCATE ( oro_height(nys:nyn,nxl:nxr) ) 712 849 ALLOCATE ( topo_height(nys:nyn,nxl:nxr) ) 850 oro_height = 0.0_wp 851 topo_height = 0.0_wp 713 852 714 853 DO ii = 0, io_blocks-1 … … 717 856 ! 718 857 !-- Arbitrary irregular topography data in PALM format (exactly 719 !-- matching the grid size and total domain size) 720 OPEN( 90, FILE='TOPOGRAPHY_DATA'//TRIM( coupling_char ), & 721 STATUS='OLD', FORM='FORMATTED', ERR=10 ) 722 ! 723 !-- Read topography PE-wise. Rows are read from nyn to nys, columns 724 !-- are read from nxl to nxr. At first, ny-nyn rows need to be skipped. 725 skip_n_rows = 0 726 DO WHILE ( skip_n_rows < ny - nyn ) 727 READ( 90, * ) 728 skip_n_rows = skip_n_rows + 1 729 ENDDO 730 ! 731 !-- Read data from nyn to nys and nxl to nxr. Therefore, skip 732 !-- column until nxl-1 is reached 733 DO j = nyn, nys, -1 734 READ( 90, *, ERR=11, END=11 ) & 858 !-- matching the grid size and total domain size). 859 !-- First, check if NetCDF file for topography exist or not. 860 !-- This case, read topography from NetCDF, else read it from 861 !-- ASCII file. 862 #if defined ( __netcdf ) 863 INQUIRE( FILE='TOPOGRAPHY_DATA_NC'//TRIM( coupling_char ), & 864 EXIST=netcdf_extend ) 865 ! 866 !-- NetCDF branch 867 IF ( netcdf_extend ) THEN 868 ! 869 !-- Open file in read-only mode 870 CALL netcdf_open_read_file( 'TOPOGRAPHY_DATA_NC', & 871 id_topo, 20 ) !Error number still need to be set properly 872 873 ! 874 !-- Read terrain height. Reading is done PE-wise, i.e. each 875 !-- processor reads its own domain. Reading is realized 876 !-- via looping over x-dimension, i.e. calling 877 !-- netcdf_get_variable reads topography along y for given x. 878 !-- Orography is 2D. 879 DO i = nxl, nxr 880 CALL netcdf_get_variable( id_topo, 'orography_0', & 881 i, oro_height(:,i), 20 ) !Error number still need to be set properly 882 ENDDO 883 ! 884 !-- Read attribute lod (level of detail), required for variable 885 !-- buildings_0 886 CALL netcdf_get_attribute( id_topo, "lod", lod, .FALSE., & 887 20, 'buildings_0' ) !Error number still need to be set properly 888 ! 889 !-- Read building height 890 !-- 2D for lod = 1, 3D for lod = 2 891 IF ( lod == 1 ) THEN 892 DO i = nxl, nxr 893 CALL netcdf_get_variable( id_topo, 'buildings_0', & 894 i, topo_height(:,i), 20 ) !Error number still need to be set properly 895 ENDDO 896 897 ELSEIF ( lod == 2 ) THEN 898 ! 899 !-- Read data PE-wise. Read yz-slices. 900 DO i = nxl, nxr 901 DO j = nys, nyn 902 CALL netcdf_get_variable( id_topo, 'buildings_0', & 903 i, j, topo_3d(:,j,i), 20 ) !Error number still need to be set properly 904 ENDDO 905 ENDDO 906 ELSE 907 message_string = 'NetCDF attribute lod ' // & 908 '(level of detail) is not set properly.' 909 CALL message( 'init_grid', 'PA0208', 1, 2, 0, 6, 0 ) !Error number still need to be set properly 910 ENDIF 911 ! 912 !-- Close topography input file 913 CALL netcdf_close_file( id_topo, 20 ) 914 #endif 915 916 ! 917 !-- ASCII branch. Please note, reading of 3D topography is not 918 !-- supported in ASCII format. Further, no distinction is made 919 !-- between orography and buildings 920 ELSE 921 922 OPEN( 90, FILE='TOPOGRAPHY_DATA'//TRIM( coupling_char ), & 923 STATUS='OLD', FORM='FORMATTED', ERR=10 ) 924 ! 925 !-- Read topography PE-wise. Rows are read from nyn to nys, columns 926 !-- are read from nxl to nxr. At first, ny-nyn rows need to be skipped. 927 skip_n_rows = 0 928 DO WHILE ( skip_n_rows < ny - nyn ) 929 READ( 90, * ) 930 skip_n_rows = skip_n_rows + 1 931 ENDDO 932 ! 933 !-- Read data from nyn to nys and nxl to nxr. Therefore, skip 934 !-- column until nxl-1 is reached 935 DO j = nyn, nys, -1 936 READ( 90, *, ERR=11, END=11 ) & 735 937 ( dum, i = 0, nxl-1 ), & 736 938 ( topo_height(j,i), i = nxl, nxr ) 737 ENDDO738 739 GOTO 12939 ENDDO 940 941 GOTO 12 740 942 741 10 message_string = 'file TOPOGRAPHY'//TRIM( coupling_char )// & 742 ' does not exist' 743 CALL message( 'init_grid', 'PA0208', 1, 2, 0, 6, 0 ) 744 745 11 message_string = 'errors in file TOPOGRAPHY_DATA'// & 746 TRIM( coupling_char ) 747 CALL message( 'init_grid', 'PA0209', 1, 2, 0, 6, 0 ) 748 749 12 CLOSE( 90 ) 943 10 message_string = 'file TOPOGRAPHY'//TRIM( coupling_char )// & 944 ' does not exist' 945 CALL message( 'init_grid', 'PA0208', 1, 2, 0, 6, 0 ) 946 947 11 message_string = 'errors in file TOPOGRAPHY_DATA'// & 948 TRIM( coupling_char ) 949 CALL message( 'init_grid', 'PA0209', 1, 2, 0, 6, 0 ) 950 951 12 CLOSE( 90 ) 952 953 ENDIF 750 954 751 955 ENDIF … … 761 965 DO j = nys, nyn 762 966 IF ( .NOT. ocean ) THEN 763 nzb_local(j,i) = MINLOC( ABS( zw - topo_height(j,i) ), 1 ) - 1 764 IF ( ABS( zw(nzb_local(j,i) ) - topo_height(j,i) ) == & 765 ABS( zw(nzb_local(j,i)+1) - topo_height(j,i) ) ) & 967 nzb_local(j,i) = MINLOC( ABS( zw - topo_height(j,i) & 968 - oro_height(j,i) ), 1 ) - 1 969 IF ( ABS( zw(nzb_local(j,i) ) - topo_height(j,i) & 970 - oro_height(j,i) ) == & 971 ABS( zw(nzb_local(j,i)+1) - topo_height(j,i) & 972 - oro_height(j,i) ) ) & 766 973 nzb_local(j,i) = nzb_local(j,i) + 1 767 974 ELSE 768 975 nzb_local(j,i) = MINLOC( ABS( zw - zw(0) & 769 - topo_height(j,i) ), 1 ) - 1 976 - topo_height(j,i) & 977 - oro_height(j,i) ), 1 ) - 1 770 978 IF ( ABS( zw(nzb_local(j,i) ) - zw(0) & 771 - topo_height(j,i) ) == & 979 - topo_height(j,i) & 980 - oro_height(j,i) ) == & 772 981 ABS( zw(nzb_local(j,i)+1) - zw(0) & 773 - topo_height(j,i) ) ) & 982 - topo_height(j,i) & 983 - oro_height(j,i) ) ) & 774 984 nzb_local(j,i) = nzb_local(j,i) + 1 775 985 ENDIF … … 778 988 ENDDO 779 989 990 DEALLOCATE ( oro_height ) 780 991 DEALLOCATE ( topo_height ) 781 992 ! … … 836 1047 CALL message( 'init_grid', 'PA0430', 0, 0, 0, 6, 0 ) 837 1048 ENDIF 1049 1050 ! 1051 !-- Set bit array to mask topography. Only required for lod = 1 1052 IF ( lod == 1 ) THEN 1053 DO i = nxlg, nxrg 1054 DO j = nysg, nyng 1055 topo_3d(nzb_local(j,i)+1:nzt+1,j,i) = & 1056 IBSET( topo_3d(nzb_local(j,i)+1:nzt+1,j,i), 0 ) 1057 ENDDO 1058 ENDDO 1059 ENDIF 838 1060 ! 839 1061 !-- Exchange ghost-points, as well as add cyclic or Neumann boundary 840 1062 !-- conditions. 1063 CALL exchange_horiz_int( topo_3d, nbgp ) 841 1064 CALL exchange_horiz_2d_int( nzb_local, nys, nyn, nxl, nxr, nbgp ) 842 1065 843 1066 IF ( .NOT. bc_ns_cyc ) THEN 1067 IF ( nys == 0 ) topo_3d(:,-1,:) = topo_3d(:,0,:) 1068 IF ( nyn == ny ) topo_3d(:,ny+1,:) = topo_3d(:,ny,:) 1069 844 1070 IF ( nys == 0 ) nzb_local(-1,:) = nzb_local(0,:) 845 1071 IF ( nyn == ny ) nzb_local(ny+1,:) = nzb_local(ny,:) … … 847 1073 848 1074 IF ( .NOT. bc_lr_cyc ) THEN 1075 IF ( nxl == 0 ) topo_3d(:,:,-1) = topo_3d(:,:,0) 1076 IF ( nxr == nx ) topo_3d(:,:,nx+1) = topo_3d(:,:,nx) 1077 849 1078 IF ( nxl == 0 ) nzb_local(:,-1) = nzb_local(:,0) 850 1079 IF ( nxr == nx ) nzb_local(:,nx+1) = nzb_local(:,nx) 851 1080 ENDIF 1081 852 1082 853 1083 CASE DEFAULT … … 857 1087 !-- case in the user interface. There, the subroutine user_init_grid 858 1088 !-- checks which of these two conditions applies. 859 CALL user_init_grid( nzb_local)1089 CALL user_init_grid( topo_3d ) 860 1090 861 1091 END SELECT 862 !863 !-- Determine the maximum level of topography. Furthermore it is used for864 !-- steering the degradation of order of the applied advection scheme.865 !-- In case of non-cyclic lateral boundaries, the order of the advection866 !-- scheme has to be reduced up to nzt (required at the lateral boundaries).867 #if defined( __parallel )868 CALL MPI_ALLREDUCE( MAXVAL( nzb_local ) + 1, nzb_max, 1, MPI_INTEGER, &869 MPI_MAX, comm2d, ierr )870 #else871 nzb_max = MAXVAL( nzb_local ) + 1872 #endif873 IF ( inflow_l .OR. outflow_l .OR. inflow_r .OR. outflow_r .OR. &874 inflow_n .OR. outflow_n .OR. inflow_s .OR. outflow_s .OR. &875 nest_domain ) &876 THEN877 nzb_max = nzt878 ENDIF879 880 1092 ! 881 1093 !-- Consistency checks and index array initialization are only required for … … 901 1113 '&MAXVAL( nzb_local ) = ', nzb_local_max 902 1114 CALL message( 'init_grid', 'PA0210', 1, 2, 0, 6, 0 ) 1115 ENDIF 1116 ! 1117 !-- In case of non-flat topography, check whether the convention how to 1118 !-- define the topography grid has been set correctly, or whether the default 1119 !-- is applicable. If this is not possible, abort. 1120 IF ( TRIM( topography_grid_convention ) == ' ' ) THEN 1121 IF ( TRIM( topography ) /= 'single_building' .AND. & 1122 TRIM( topography ) /= 'single_street_canyon' .AND. & 1123 TRIM( topography ) /= 'tunnel' .AND. & 1124 TRIM( topography ) /= 'read_from_file') THEN 1125 !-- The default value is not applicable here, because it is only valid 1126 !-- for the two standard cases 'single_building' and 'read_from_file' 1127 !-- defined in init_grid. 1128 WRITE( message_string, * ) & 1129 'The value for "topography_grid_convention" ', & 1130 'is not set. Its default value is & only valid for ', & 1131 '"topography" = ''single_building'', ', & 1132 '''single_street_canyon'' & or ''read_from_file''.', & 1133 ' & Choose ''cell_edge'' or ''cell_center''.' 1134 CALL message( 'init_grid', 'PA0239', 1, 2, 0, 6, 0 ) 1135 ELSE 1136 !-- The default value is applicable here. 1137 !-- Set convention according to topography. 1138 IF ( TRIM( topography ) == 'single_building' .OR. & 1139 TRIM( topography ) == 'single_street_canyon' ) THEN 1140 topography_grid_convention = 'cell_edge' 1141 ELSEIF ( TRIM( topography ) == 'read_from_file' .OR. & 1142 TRIM( topography ) == 'tunnel') THEN 1143 topography_grid_convention = 'cell_center' 1144 ENDIF 1145 ENDIF 1146 ELSEIF ( TRIM( topography_grid_convention ) /= 'cell_edge' .AND. & 1147 TRIM( topography_grid_convention ) /= 'cell_center' ) THEN 1148 WRITE( message_string, * ) & 1149 'The value for "topography_grid_convention" is ', & 1150 'not recognized. & Choose ''cell_edge'' or ''cell_center''.' 1151 CALL message( 'init_grid', 'PA0240', 1, 2, 0, 6, 0 ) 903 1152 ENDIF 904 1153 … … 964 1213 nzb_local(j,i) = MIN( nzb_local(j,i), nzb_local(j+1,i) ) 965 1214 ENDDO 966 ENDDO 1215 ENDDO 967 1216 ! 968 1217 !-- Exchange ghost points 969 1218 CALL exchange_horiz_2d_int( nzb_local, nys, nyn, nxl, nxr, nbgp ) 1219 ! 1220 !-- Apply cell-edge convention also for 3D topo array. The former setting 1221 !-- of nzb_local will be removed later. 1222 DO j = nys+1, nyn+1 1223 DO i = nxl-1, nxr 1224 DO k = nzb, nzt+1 1225 IF ( BTEST( topo_3d(k,j,i), 0 ) .OR. & 1226 BTEST( topo_3d(k,j,i+1), 0 ) ) & 1227 topo_3d(k,j,i) = IBSET( topo_3d(k,j,i), 0 ) 1228 ENDDO 1229 ENDDO 1230 ENDDO 1231 CALL exchange_horiz_int( topo_3d, nbgp ) 1232 1233 DO i = nxl, nxr+1 1234 DO j = nys-1, nyn 1235 DO k = nzb, nzt+1 1236 IF ( BTEST( topo_3d(k,j,i), 0 ) .OR. & 1237 BTEST( topo_3d(k,j+1,i), 0 ) ) & 1238 topo_3d(k,j,i) = IBSET( topo_3d(k,j,i), 0 ) 1239 ENDDO 1240 ENDDO 1241 ENDDO 1242 CALL exchange_horiz_int( topo_3d, nbgp ) 1243 970 1244 ENDIF 1245 971 1246 ! 972 1247 !-- Initialize index arrays nzb_s_inner and nzb_w_inner 1248 973 1249 nzb_s_inner = nzb_local 974 1250 nzb_w_inner = nzb_local … … 1103 1379 CALL exchange_horiz_2d_int( nzb_s_outer, nys, nyn, nxl, nxr, nbgp ) 1104 1380 1105 !1106 !-- Allocate and set the arrays containing the topography height1107 ALLOCATE( zu_s_inner(0:nx+1,0:ny+1), zw_w_inner(0:nx+1,0:ny+1), &1108 zu_s_inner_l(0:nx+1,0:ny+1), zw_w_inner_l(0:nx+1,0:ny+1) )1109 1110 zu_s_inner = 0.0_wp1111 zw_w_inner = 0.0_wp1112 zu_s_inner_l = 0.0_wp1113 zw_w_inner_l = 0.0_wp1114 1115 DO i = nxl, nxr1116 DO j = nys, nyn1117 zu_s_inner_l(i,j) = zu(nzb_local(j,i))1118 zw_w_inner_l(i,j) = zw(nzb_local(j,i))1119 ENDDO1120 ENDDO1121 1122 #if defined( __parallel )1123 CALL MPI_REDUCE( zu_s_inner_l, zu_s_inner, (nx+2)*(ny+2), &1124 MPI_REAL, MPI_SUM, 0, comm2d, ierr )1125 CALL MPI_REDUCE( zw_w_inner_l, zw_w_inner, (nx+2)*(ny+2), &1126 MPI_REAL, MPI_SUM, 0, comm2d, ierr )1127 #else1128 zu_s_inner = zu_s_inner_l1129 zw_w_inner = zw_w_inner_l1130 #endif1131 1132 DEALLOCATE( zu_s_inner_l, zw_w_inner_l )1133 IF ( myid /= 0 ) DEALLOCATE( zu_s_inner, zw_w_inner )1134 !1135 !-- Set south and left ghost points, required for netcdf output1136 IF ( myid == 0 ) THEN1137 IF( bc_lr_cyc ) THEN1138 zu_s_inner(nx+1,:) = zu_s_inner(0,:)1139 zw_w_inner(nx+1,:) = zw_w_inner(0,:)1140 ELSE1141 zu_s_inner(nx+1,:) = zu_s_inner(nx,:)1142 zw_w_inner(nx+1,:) = zw_w_inner(nx,:)1143 ENDIF1144 IF( bc_ns_cyc ) THEN1145 zu_s_inner(:,ny+1) = zu_s_inner(:,0)1146 zw_w_inner(:,ny+1) = zw_w_inner(:,0)1147 ELSE1148 zu_s_inner(:,ny+1) = zu_s_inner(:,ny)1149 zw_w_inner(:,ny+1) = zw_w_inner(:,ny)1150 ENDIF1151 ENDIF1152 !1153 !-- Set flag arrays to be used for masking of grid points1154 DO i = nxlg, nxrg1155 DO j = nysg, nyng1156 DO k = nzb, nzt+11157 IF ( k <= nzb_s_inner(j,i) ) rflags_s_inner(k,j,i) = 0.0_wp1158 IF ( k <= nzb_s_inner(j,i) ) rflags_invers(j,i,k) = 0.0_wp1159 ENDDO1160 ENDDO1161 ENDDO1162 1163 1381 ENDIF 1164 1382 ! … … 1166 1384 !-- grid-levels further below. 1167 1385 DEALLOCATE( nzb_tmp ) 1386 1387 ! 1388 !-- Determine the maximum level of topography. It is used for 1389 !-- steering the degradation of order of the applied advection scheme. 1390 !-- In case of non-cyclic lateral boundaries, the order of the advection 1391 !-- scheme has to be reduced up to nzt (required at the lateral boundaries). 1392 k_top = 0 1393 DO i = nxl, nxr 1394 DO j = nys, nyn 1395 DO k = nzb, nzt + 1 1396 k_top = MAX( k_top, MERGE( k, 0, & 1397 .NOT. BTEST( topo_3d(k,j,i), 0 ) ) ) 1398 ENDDO 1399 ENDDO 1400 ENDDO 1401 #if defined( __parallel ) 1402 CALL MPI_ALLREDUCE( k_top + 1, nzb_max, 1, MPI_INTEGER, & !is +1 really necessary here? 1403 MPI_MAX, comm2d, ierr ) 1404 #else 1405 nzb_max = k_top + 1 1406 #endif 1407 IF ( inflow_l .OR. outflow_l .OR. inflow_r .OR. outflow_r .OR. & 1408 inflow_n .OR. outflow_n .OR. inflow_s .OR. outflow_s .OR. & 1409 nest_domain ) & 1410 THEN 1411 nzb_max = nzt 1412 ENDIF 1413 ! 1414 !-- Finally, if topography extents up to the model top, limit nzb_max to nzt. 1415 nzb_max = MIN( nzb_max, nzt ) 1168 1416 1169 1417 ! … … 1172 1420 !-- applied 1173 1421 IF ( constant_flux_layer .OR. use_surface_fluxes ) THEN 1174 nzb_diff_u = nzb_u_inner + 21175 nzb_diff_v = nzb_v_inner + 21176 1422 nzb_diff_s_inner = nzb_s_inner + 2 1177 1423 nzb_diff_s_outer = nzb_s_outer + 2 1178 1424 ELSE 1179 nzb_diff_u = nzb_u_inner + 11180 nzb_diff_v = nzb_v_inner + 11181 1425 nzb_diff_s_inner = nzb_s_inner + 1 1182 1426 nzb_diff_s_outer = nzb_s_outer + 1 … … 1184 1428 1185 1429 ! 1186 !-- Calculation of wall switches and factors required by diffusion_u/v.f90 and 1187 !-- for limitation of near-wall mixing length l_wall further below 1188 corner_nl = 0 1189 corner_nr = 0 1190 corner_sl = 0 1191 corner_sr = 0 1192 wall_l = 0 1193 wall_n = 0 1194 wall_r = 0 1195 wall_s = 0 1196 1197 DO i = nxl, nxr 1198 DO j = nys, nyn 1199 ! 1200 !-- u-component 1201 IF ( nzb_u_outer(j,i) > nzb_u_outer(j+1,i) ) THEN 1202 wall_u(j,i) = 1.0_wp ! north wall (location of adjacent fluid) 1203 fym(j,i) = 0.0_wp 1204 fyp(j,i) = 1.0_wp 1205 ELSEIF ( nzb_u_outer(j,i) > nzb_u_outer(j-1,i) ) THEN 1206 wall_u(j,i) = 1.0_wp ! south wall (location of adjacent fluid) 1207 fym(j,i) = 1.0_wp 1208 fyp(j,i) = 0.0_wp 1209 ENDIF 1210 ! 1211 !-- v-component 1212 IF ( nzb_v_outer(j,i) > nzb_v_outer(j,i+1) ) THEN 1213 wall_v(j,i) = 1.0_wp ! rigth wall (location of adjacent fluid) 1214 fxm(j,i) = 0.0_wp 1215 fxp(j,i) = 1.0_wp 1216 ELSEIF ( nzb_v_outer(j,i) > nzb_v_outer(j,i-1) ) THEN 1217 wall_v(j,i) = 1.0_wp ! left wall (location of adjacent fluid) 1218 fxm(j,i) = 1.0_wp 1219 fxp(j,i) = 0.0_wp 1220 ENDIF 1221 ! 1222 !-- w-component, also used for scalars, separate arrays for shear 1223 !-- production of tke 1224 IF ( nzb_w_outer(j,i) > nzb_w_outer(j+1,i) ) THEN 1225 wall_e_y(j,i) = 1.0_wp ! north wall (location of adjacent fluid) 1226 wall_w_y(j,i) = 1.0_wp 1227 fwym(j,i) = 0.0_wp 1228 fwyp(j,i) = 1.0_wp 1229 ELSEIF ( nzb_w_outer(j,i) > nzb_w_outer(j-1,i) ) THEN 1230 wall_e_y(j,i) = -1.0_wp ! south wall (location of adjacent fluid) 1231 wall_w_y(j,i) = 1.0_wp 1232 fwym(j,i) = 1.0_wp 1233 fwyp(j,i) = 0.0_wp 1234 ENDIF 1235 IF ( nzb_w_outer(j,i) > nzb_w_outer(j,i+1) ) THEN 1236 wall_e_x(j,i) = 1.0_wp ! right wall (location of adjacent fluid) 1237 wall_w_x(j,i) = 1.0_wp 1238 fwxm(j,i) = 0.0_wp 1239 fwxp(j,i) = 1.0_wp 1240 ELSEIF ( nzb_w_outer(j,i) > nzb_w_outer(j,i-1) ) THEN 1241 wall_e_x(j,i) = -1.0_wp ! left wall (location of adjacent fluid) 1242 wall_w_x(j,i) = 1.0_wp 1243 fwxm(j,i) = 1.0_wp 1244 fwxp(j,i) = 0.0_wp 1245 ENDIF 1246 ! 1247 !-- Wall and corner locations inside buildings for limitation of 1248 !-- near-wall mixing length l_wall 1249 IF ( nzb_s_inner(j,i) > nzb_s_inner(j+1,i) ) THEN 1250 1251 wall_n(j,i) = nzb_s_inner(j+1,i) + 1 ! North wall 1252 1253 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i-1) ) THEN 1254 corner_nl(j,i) = MAX( nzb_s_inner(j+1,i), & ! Northleft corner 1255 nzb_s_inner(j,i-1) ) + 1 1256 ENDIF 1257 1258 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i+1) ) THEN 1259 corner_nr(j,i) = MAX( nzb_s_inner(j+1,i), & ! Northright corner 1260 nzb_s_inner(j,i+1) ) + 1 1261 ENDIF 1262 1263 ENDIF 1264 1265 IF ( nzb_s_inner(j,i) > nzb_s_inner(j-1,i) ) THEN 1266 1267 wall_s(j,i) = nzb_s_inner(j-1,i) + 1 ! South wall 1268 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i-1) ) THEN 1269 corner_sl(j,i) = MAX( nzb_s_inner(j-1,i), & ! Southleft corner 1270 nzb_s_inner(j,i-1) ) + 1 1271 ENDIF 1272 1273 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i+1) ) THEN 1274 corner_sr(j,i) = MAX( nzb_s_inner(j-1,i), & ! Southright corner 1275 nzb_s_inner(j,i+1) ) + 1 1276 ENDIF 1277 1278 ENDIF 1279 1280 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i-1) ) THEN 1281 wall_l(j,i) = nzb_s_inner(j,i-1) + 1 ! Left wall 1282 ENDIF 1283 1284 IF ( nzb_s_inner(j,i) > nzb_s_inner(j,i+1) ) THEN 1285 wall_r(j,i) = nzb_s_inner(j,i+1) + 1 ! Right wall 1286 ENDIF 1430 !-- Set-up topography flags. First, set flags only for s, u, v and w-grid. 1431 !-- Further special flags will be set in following loops. 1432 wall_flags_0 = 0 1433 DO j = nys, nyn 1434 DO i = nxl, nxr 1435 DO k = nzb, nzt+1 1436 ! 1437 !-- scalar grid 1438 IF ( BTEST( topo_3d(k,j,i), 0 ) ) & 1439 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 0 ) 1440 ! 1441 !-- v grid 1442 IF ( BTEST( topo_3d(k,j,i), 0 ) .AND. & 1443 BTEST( topo_3d(k,j-1,i), 0 ) ) & 1444 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 2 ) 1445 ! 1446 !-- To do: set outer arrays on basis of topo_3d array, adjust for downward-facing walls 1447 !-- s grid outer array 1448 IF ( k >= nzb_s_outer(j,i) ) & 1449 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 24 ) 1450 ! 1451 !-- s grid outer array 1452 IF ( k >= nzb_u_outer(j,i) ) & 1453 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 26 ) 1454 ! 1455 !-- s grid outer array 1456 IF ( k >= nzb_v_outer(j,i) ) & 1457 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 27 ) 1458 ! 1459 !-- w grid outer array 1460 IF ( k >= nzb_w_outer(j,i) ) & 1461 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 28 ) 1462 ENDDO 1463 1464 DO k = nzb, nzt 1465 ! 1466 !-- w grid 1467 IF ( BTEST( topo_3d(k,j,i), 0 ) .AND. & 1468 BTEST( topo_3d(k+1,j,i), 0 ) ) & 1469 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 3 ) 1470 ENDDO 1471 wall_flags_0(nzt+1,j,i) = IBSET( wall_flags_0(nzt+1,j,i), 3 ) 1287 1472 1288 1473 ENDDO 1289 1474 ENDDO 1475 ! 1476 !-- u grid. Note, reverse 1477 !-- memory access is required for setting flag on u-grid 1478 DO j = nys, nyn 1479 DO i = nxl, nxr 1480 DO k = nzb, nzt+1 1481 IF ( BTEST( topo_3d(k,j,i), 0 ) .AND. & 1482 BTEST( topo_3d(k,j,i-1), 0 ) ) & 1483 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 1 ) 1484 ENDDO 1485 ENDDO 1486 ENDDO 1487 ! 1488 !-- Set further special flags 1489 DO i = nxl, nxr 1490 DO j = nys, nyn 1491 DO k = nzb, nzt+1 1492 ! 1493 !-- scalar grid, former nzb_diff_s_inner. 1494 !-- Note, use this flag also to mask topography in diffusion_u and 1495 !-- diffusion_v along the vertical direction. In case of 1496 !-- use_surface_fluxes, fluxes are calculated via MOST, else, simple 1497 !-- gradient approach is applied. Please note, in case of u- and v- 1498 !-- diffuison, a small error is made at edges (on the east side for u, 1499 !-- at the north side for v), since topography on scalar grid point 1500 !-- is used instead of topography on u/v-grid. As number of topography grid 1501 !-- points on uv-grid is different than s-grid, different number of 1502 !-- surface elements would be required. In order to avoid this, 1503 !-- treat edges (u(k,j,i+1)) simply by a gradient approach, i.e. these 1504 !-- points are not masked within diffusion_u. Tests had shown that the 1505 !-- effect on the flow is negligible. 1506 IF ( constant_flux_layer .OR. use_surface_fluxes ) THEN 1507 IF ( BTEST( wall_flags_0(k,j,i), 0 ) ) & 1508 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 8 ) 1509 ELSE 1510 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 8 ) 1511 ENDIF 1512 1513 ENDDO 1514 ! 1515 !-- Special flag to control vertical diffusion at model top - former 1516 !-- nzt_diff 1517 wall_flags_0(:,j,i) = IBSET( wall_flags_0(:,j,i), 9 ) 1518 IF ( use_top_fluxes ) & 1519 wall_flags_0(nzt:nzt+1,j,i) = IBCLR( wall_flags_0(nzt:nzt+1,j,i), 9 ) 1520 1521 DO k = nzb+1, nzt 1522 ! 1523 !-- Special flag on u grid, former nzb_u_inner + 1, required 1524 !-- for disturb_field and initialization. Do not disturb directly at 1525 !-- topography, as well as initialize u with zero one grid point outside 1526 !-- of topography. 1527 IF ( BTEST( wall_flags_0(k-1,j,i), 1 ) .AND. & 1528 BTEST( wall_flags_0(k,j,i), 1 ) .AND. & 1529 BTEST( wall_flags_0(k+1,j,i), 1 ) ) & 1530 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 20 ) 1531 ! 1532 !-- Special flag on v grid, former nzb_v_inner + 1, required 1533 !-- for disturb_field and initialization. Do not disturb directly at 1534 !-- topography, as well as initialize v with zero one grid point outside 1535 !-- of topography. 1536 IF ( BTEST( wall_flags_0(k-1,j,i), 2 ) .AND. & 1537 BTEST( wall_flags_0(k,j,i), 2 ) .AND. & 1538 BTEST( wall_flags_0(k+1,j,i), 2 ) ) & 1539 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 21 ) 1540 ! 1541 !-- Special flag on scalar grid, former nzb_s_inner+1. Used for 1542 !-- lpm_sgs_tke 1543 IF ( BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 1544 BTEST( wall_flags_0(k-1,j,i), 0 ) .AND. & 1545 BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1546 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 25 ) 1547 ! 1548 !-- Special flag on scalar grid, nzb_diff_s_outer - 1, required in 1549 !-- in production_e 1550 IF ( constant_flux_layer .OR. use_surface_fluxes ) THEN 1551 IF ( BTEST( wall_flags_0(k,j,i), 24 ) .AND. & 1552 BTEST( wall_flags_0(k-1,j,i), 24 ) .AND. & 1553 BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1554 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 29 ) 1555 ELSE 1556 IF ( BTEST( wall_flags_0(k,j,i), 0 ) ) & 1557 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 29 ) 1558 ENDIF 1559 ! 1560 !-- Special flag on scalar grid, nzb_diff_s_outer - 1, required in 1561 !-- in production_e 1562 IF ( constant_flux_layer .OR. use_surface_fluxes ) THEN 1563 IF ( BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 1564 BTEST( wall_flags_0(k-1,j,i), 0 ) .AND. & 1565 BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1566 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 30 ) 1567 ELSE 1568 IF ( BTEST( wall_flags_0(k,j,i), 0 ) ) & 1569 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 30 ) 1570 ENDIF 1571 ENDDO 1572 ! 1573 !-- Flags indicating downward facing walls 1574 DO k = nzb+1, nzt 1575 ! 1576 !-- Scalar grid 1577 IF ( BTEST( wall_flags_0(k-1,j,i), 0 ) .AND. & 1578 .NOT. BTEST( wall_flags_0(k,j,i), 0 ) ) & 1579 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 13 ) 1580 ! 1581 !-- Downward facing wall on u grid 1582 IF ( BTEST( wall_flags_0(k-1,j,i), 1 ) .AND. & 1583 .NOT. BTEST( wall_flags_0(k,j,i), 1 ) ) & 1584 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 15 ) 1585 ! 1586 !-- Downward facing wall on v grid 1587 IF ( BTEST( wall_flags_0(k-1,j,i), 2 ) .AND. & 1588 .NOT. BTEST( wall_flags_0(k,j,i), 2 ) ) & 1589 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 17 ) 1590 ! 1591 !-- Downward facing wall on w grid 1592 IF ( BTEST( wall_flags_0(k-1,j,i), 3 ) .AND. & 1593 .NOT. BTEST( wall_flags_0(k,j,i), 3 ) ) & 1594 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 19 ) 1595 ENDDO 1596 ! 1597 !-- Flags indicating upward facing walls 1598 DO k = nzb, nzt 1599 ! 1600 !-- Upward facing wall on scalar grid 1601 IF ( .NOT. BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 1602 BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1603 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 12 ) 1604 ! 1605 !-- Upward facing wall on u grid 1606 IF ( .NOT. BTEST( wall_flags_0(k,j,i), 1 ) .AND. & 1607 BTEST( wall_flags_0(k+1,j,i), 1 ) ) & 1608 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 14 ) 1609 1610 ! 1611 !-- Upward facing wall on v grid 1612 IF ( .NOT. BTEST( wall_flags_0(k,j,i), 2 ) .AND. & 1613 BTEST( wall_flags_0(k+1,j,i), 2 ) ) & 1614 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 16 ) 1615 1616 ! 1617 !-- Upward facing wall on w grid 1618 IF ( .NOT. BTEST( wall_flags_0(k,j,i), 3 ) .AND. & 1619 BTEST( wall_flags_0(k+1,j,i), 3 ) ) & 1620 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 18 ) 1621 ! 1622 !-- Special flag on scalar grid, former nzb_s_inner 1623 IF ( BTEST( wall_flags_0(k,j,i), 0 ) .OR. & 1624 BTEST( wall_flags_0(k,j,i), 12 ) .OR. & 1625 BTEST( wall_flags_0(k,j,i), 13 ) ) & 1626 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 22 ) 1627 ! 1628 !-- Special flag on scalar grid, nzb_diff_s_inner - 1, required for 1629 !-- flow_statistics 1630 IF ( constant_flux_layer .OR. use_surface_fluxes ) THEN 1631 IF ( BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 1632 BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1633 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 23 ) 1634 ELSE 1635 IF ( BTEST( wall_flags_0(k,j,i), 22 ) ) & 1636 wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 23 ) 1637 ENDIF 1638 1639 1640 ENDDO 1641 wall_flags_0(nzt+1,j,i) = IBSET( wall_flags_0(nzt+1,j,i), 22 ) 1642 wall_flags_0(nzt+1,j,i) = IBSET( wall_flags_0(nzt+1,j,i), 23 ) 1643 ENDDO 1644 ENDDO 1645 ! 1646 !-- Exchange ghost points for wall flags 1647 CALL exchange_horiz_int( wall_flags_0, nbgp ) 1648 ! 1649 !-- Set boundary conditions also for flags. Can be interpreted as Neumann 1650 !-- boundary conditions for topography. 1651 IF ( .NOT. bc_ns_cyc ) THEN 1652 IF ( nys == 0 ) wall_flags_0(:,-1,:) = wall_flags_0(:,0,:) 1653 IF ( nyn == ny ) wall_flags_0(:,ny+1,:) = wall_flags_0(:,ny,:) 1654 ENDIF 1655 IF ( .NOT. bc_lr_cyc ) THEN 1656 IF ( nxl == 0 ) wall_flags_0(:,:,-1) = wall_flags_0(:,:,0) 1657 IF ( nxr == nx ) wall_flags_0(:,:,nx+1) = wall_flags_0(:,:,nx) 1658 ENDIF 1659 1660 ! 1661 !-- Initialize boundary conditions via surface type 1662 CALL init_bc 1663 ! 1664 !-- Allocate and set topography height arrays required for data output 1665 IF ( TRIM( topography ) /= 'flat' ) THEN 1666 ! 1667 !-- Allocate and set the arrays containing the topography height 1668 1669 IF ( nxr == nx .AND. nyn /= ny ) THEN 1670 ALLOCATE( zu_s_inner(nxl:nxr+1,nys:nyn), & 1671 zw_w_inner(nxl:nxr+1,nys:nyn) ) 1672 ELSEIF ( nxr /= nx .AND. nyn == ny ) THEN 1673 ALLOCATE( zu_s_inner(nxl:nxr,nys:nyn+1), & 1674 zw_w_inner(nxl:nxr,nys:nyn+1) ) 1675 ELSEIF ( nxr == nx .AND. nyn == ny ) THEN 1676 ALLOCATE( zu_s_inner(nxl:nxr+1,nys:nyn+1), & 1677 zw_w_inner(nxl:nxr+1,nys:nyn+1) ) 1678 ELSE 1679 ALLOCATE( zu_s_inner(nxl:nxr,nys:nyn), & 1680 zw_w_inner(nxl:nxr,nys:nyn) ) 1681 ENDIF 1682 1683 zu_s_inner = 0.0_wp 1684 zw_w_inner = 0.0_wp 1685 ! 1686 !-- Determine local topography height on scalar and w-grid. Note, setting 1687 !-- lateral boundary values is not necessary, realized via wall_flags_0 1688 !-- array. Further, please note that loop bounds are different from 1689 !-- nxl to nxr and nys to nyn on south and right model boundary, hence, 1690 !-- use intrinsic lbound and ubound functions to infer array bounds. 1691 DO i = lbound(zu_s_inner, 1), ubound(zu_s_inner, 1) 1692 DO j = lbound(zu_s_inner, 2), ubound(zu_s_inner, 2) 1693 ! 1694 !-- Topography height on scalar grid. Therefore, determine index of 1695 !-- upward-facing surface element on scalar grid (bit 12). 1696 zu_s_inner(i,j) = zu( MAXLOC( MERGE( & 1697 1, 0, BTEST( wall_flags_0(:,j,i), 12 )& 1698 ), DIM = 1 & 1699 ) - 1 & 1700 ) 1701 ! 1702 !-- Topography height on w grid. Therefore, determine index of 1703 !-- upward-facing surface element on w grid (bit 18). 1704 zw_w_inner(i,j) = zw( MAXLOC( MERGE( & 1705 1, 0, BTEST( wall_flags_0(:,j,i), 18 )& 1706 ), DIM = 1 & 1707 ) - 1 & 1708 ) 1709 ENDDO 1710 ENDDO 1711 1712 1713 ENDIF 1714 1290 1715 ! 1291 1716 !-- Calculate wall flag arrays for the multigrid method. … … 1450 1875 !-- required in the ws-scheme, the arrays need to be allocated here as they are 1451 1876 !-- used in OpenACC directives. 1452 ALLOCATE( wall_flags_0(nzb:nzt+1,nysg:nyng,nxlg:nxrg), &1453 wall_flags_00(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )1454 wall_flags_0= 01455 wall_flags_00= 01877 ALLOCATE( advc_flags_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 1878 advc_flags_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 1879 advc_flags_1 = 0 1880 advc_flags_2 = 0 1456 1881 ! 1457 1882 !-- Init flags for ws-scheme to degrade order of the numerics near walls, i.e. … … 1466 1891 !-- Go through all points of the subdomain one by one and look for the closest 1467 1892 !-- surface 1468 IF ( TRIM(topography) /= 'flat' ) THEN 1469 DO i = nxl, nxr 1470 DO j = nys, nyn 1471 1472 nzb_si = nzb_s_inner(j,i) 1473 vi = vertical_influence(nzb_si) 1474 1475 IF ( wall_n(j,i) > 0 ) THEN 1476 ! 1477 !-- North wall (y distance) 1478 DO k = wall_n(j,i), nzb_si 1479 l_wall(k,j+1,i) = MIN( l_wall(k,j+1,i), 0.5_wp * dy ) 1480 ENDDO 1481 ! 1482 !-- Above North wall (yz distance) 1483 DO k = nzb_si + 1, nzb_si + vi 1484 l_wall(k,j+1,i) = MIN( l_wall(k,j+1,i), & 1485 SQRT( 0.25_wp * dy**2 + & 1486 ( zu(k) - zw(nzb_si) )**2 ) ) 1487 ENDDO 1488 ! 1489 !-- Northleft corner (xy distance) 1490 IF ( corner_nl(j,i) > 0 ) THEN 1491 DO k = corner_nl(j,i), nzb_si 1492 l_wall(k,j+1,i-1) = MIN( l_wall(k,j+1,i-1), & 1493 0.5_wp * SQRT( dx**2 + dy**2 ) ) 1494 ENDDO 1495 ! 1496 !-- Above Northleft corner (xyz distance) 1497 DO k = nzb_si + 1, nzb_si + vi 1498 l_wall(k,j+1,i-1) = MIN( l_wall(k,j+1,i-1), & 1499 SQRT( 0.25_wp * (dx**2 + dy**2) + & 1500 ( zu(k) - zw(nzb_si) )**2 ) ) 1501 ENDDO 1502 ENDIF 1503 ! 1504 !-- Northright corner (xy distance) 1505 IF ( corner_nr(j,i) > 0 ) THEN 1506 DO k = corner_nr(j,i), nzb_si 1507 l_wall(k,j+1,i+1) = MIN( l_wall(k,j+1,i+1), & 1508 0.5_wp * SQRT( dx**2 + dy**2 ) ) 1509 ENDDO 1510 ! 1511 !-- Above northright corner (xyz distance) 1512 DO k = nzb_si + 1, nzb_si + vi 1513 l_wall(k,j+1,i+1) = MIN( l_wall(k,j+1,i+1), & 1514 SQRT( 0.25_wp * (dx**2 + dy**2) + & 1515 ( zu(k) - zw(nzb_si) )**2 ) ) 1516 ENDDO 1517 ENDIF 1893 DO i = nxl, nxr 1894 DO j = nys, nyn 1895 DO k = nzb+1, nzt 1896 ! 1897 !-- Check if current gridpoint belongs to the atmosphere 1898 IF ( BTEST( wall_flags_0(k,j,i), 0 ) ) THEN 1899 ! 1900 !-- Check for neighbouring grid-points. 1901 !-- Vertical distance, down 1902 IF ( .NOT. BTEST( wall_flags_0(k-1,j,i), 0 ) ) & 1903 l_wall(k,j,i) = MIN( l_grid(k), zu(k) - zw(k-1) ) 1904 ! 1905 !-- Vertical distance, up 1906 IF ( .NOT. BTEST( wall_flags_0(k+1,j,i), 0 ) ) & 1907 l_wall(k,j,i) = MIN( l_grid(k), zw(k) - zu(k) ) 1908 ! 1909 !-- y-distance 1910 IF ( .NOT. BTEST( wall_flags_0(k,j-1,i), 0 ) .OR. & 1911 .NOT. BTEST( wall_flags_0(k,j+1,i), 0 ) ) & 1912 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), 0.5_wp * dy ) 1913 ! 1914 !-- x-distance 1915 IF ( .NOT. BTEST( wall_flags_0(k,j,i-1), 0 ) .OR. & 1916 .NOT. BTEST( wall_flags_0(k,j,i+1), 0 ) ) & 1917 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), 0.5_wp * dx ) 1918 ! 1919 !-- yz-distance (vertical edges, down) 1920 IF ( .NOT. BTEST( wall_flags_0(k-1,j-1,i), 0 ) .OR. & 1921 .NOT. BTEST( wall_flags_0(k-1,j+1,i), 0 ) ) & 1922 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1923 SQRT( 0.25_wp * dy**2 + & 1924 ( zu(k) - zw(k-1) )**2 ) ) 1925 ! 1926 !-- yz-distance (vertical edges, up) 1927 IF ( .NOT. BTEST( wall_flags_0(k+1,j-1,i), 0 ) .OR. & 1928 .NOT. BTEST( wall_flags_0(k+1,j+1,i), 0 ) ) & 1929 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1930 SQRT( 0.25_wp * dy**2 + & 1931 ( zw(k) - zu(k) )**2 ) ) 1932 ! 1933 !-- xz-distance (vertical edges, down) 1934 IF ( .NOT. BTEST( wall_flags_0(k-1,j,i-1), 0 ) .OR. & 1935 .NOT. BTEST( wall_flags_0(k-1,j,i+1), 0 ) ) & 1936 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1937 SQRT( 0.25_wp * dx**2 + & 1938 ( zu(k) - zw(k-1) )**2 ) ) 1939 ! 1940 !-- xz-distance (vertical edges, up) 1941 IF ( .NOT. BTEST( wall_flags_0(k+1,j,i-1), 0 ) .OR. & 1942 .NOT. BTEST( wall_flags_0(k+1,j,i+1), 0 ) ) & 1943 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1944 SQRT( 0.25_wp * dx**2 + & 1945 ( zw(k) - zu(k) )**2 ) ) 1946 ! 1947 !-- xy-distance (horizontal edges) 1948 IF ( .NOT. BTEST( wall_flags_0(k,j-1,i-1), 0 ) .OR. & 1949 .NOT. BTEST( wall_flags_0(k,j+1,i-1), 0 ) .OR. & 1950 .NOT. BTEST( wall_flags_0(k,j-1,i+1), 0 ) .OR. & 1951 .NOT. BTEST( wall_flags_0(k,j+1,i+1), 0 ) ) & 1952 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1953 SQRT( 0.25_wp * ( dx**2 + dy**2 ) ) ) 1954 ! 1955 !-- xyz distance (vertical and horizontal edges, down) 1956 IF ( .NOT. BTEST( wall_flags_0(k-1,j-1,i-1), 0 ) .OR. & 1957 .NOT. BTEST( wall_flags_0(k-1,j+1,i-1), 0 ) .OR. & 1958 .NOT. BTEST( wall_flags_0(k-1,j-1,i+1), 0 ) .OR. & 1959 .NOT. BTEST( wall_flags_0(k-1,j+1,i+1), 0 ) ) & 1960 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1961 SQRT( 0.25_wp * ( dx**2 + dy**2 ) & 1962 + ( zu(k) - zw(k-1) )**2 ) ) 1963 ! 1964 !-- xyz distance (vertical and horizontal edges, up) 1965 IF ( .NOT. BTEST( wall_flags_0(k+1,j-1,i-1), 0 ) .OR. & 1966 .NOT. BTEST( wall_flags_0(k+1,j+1,i-1), 0 ) .OR. & 1967 .NOT. BTEST( wall_flags_0(k+1,j-1,i+1), 0 ) .OR. & 1968 .NOT. BTEST( wall_flags_0(k+1,j+1,i+1), 0 ) ) & 1969 l_wall(k,j,i) = MIN( l_wall(k,j,i), l_grid(k), & 1970 SQRT( 0.25_wp * ( dx**2 + dy**2 ) & 1971 + ( zw(k) - zu(k) )**2 ) ) 1972 1518 1973 ENDIF 1519 1520 IF ( wall_s(j,i) > 0 ) THEN1521 !1522 !-- South wall (y distance)1523 DO k = wall_s(j,i), nzb_si1524 l_wall(k,j-1,i) = MIN( l_wall(k,j-1,i), 0.5_wp * dy )1525 ENDDO1526 !1527 !-- Above south wall (yz distance)1528 DO k = nzb_si + 1, nzb_si + vi1529 l_wall(k,j-1,i) = MIN( l_wall(k,j-1,i), &1530 SQRT( 0.25_wp * dy**2 + &1531 ( zu(k) - zw(nzb_si) )**2 ) )1532 ENDDO1533 !1534 !-- Southleft corner (xy distance)1535 IF ( corner_sl(j,i) > 0 ) THEN1536 DO k = corner_sl(j,i), nzb_si1537 l_wall(k,j-1,i-1) = MIN( l_wall(k,j-1,i-1), &1538 0.5_wp * SQRT( dx**2 + dy**2 ) )1539 ENDDO1540 !1541 !-- Above southleft corner (xyz distance)1542 DO k = nzb_si + 1, nzb_si + vi1543 l_wall(k,j-1,i-1) = MIN( l_wall(k,j-1,i-1), &1544 SQRT( 0.25_wp * (dx**2 + dy**2) + &1545 ( zu(k) - zw(nzb_si) )**2 ) )1546 ENDDO1547 ENDIF1548 !1549 !-- Southright corner (xy distance)1550 IF ( corner_sr(j,i) > 0 ) THEN1551 DO k = corner_sr(j,i), nzb_si1552 l_wall(k,j-1,i+1) = MIN( l_wall(k,j-1,i+1), &1553 0.5_wp * SQRT( dx**2 + dy**2 ) )1554 ENDDO1555 !1556 !-- Above southright corner (xyz distance)1557 DO k = nzb_si + 1, nzb_si + vi1558 l_wall(k,j-1,i+1) = MIN( l_wall(k,j-1,i+1), &1559 SQRT( 0.25_wp * (dx**2 + dy**2) + &1560 ( zu(k) - zw(nzb_si) )**2 ) )1561 ENDDO1562 ENDIF1563 1564 ENDIF1565 1566 IF ( wall_l(j,i) > 0 ) THEN1567 !1568 !-- Left wall (x distance)1569 DO k = wall_l(j,i), nzb_si1570 l_wall(k,j,i-1) = MIN( l_wall(k,j,i-1), 0.5_wp * dx )1571 ENDDO1572 !1573 !-- Above left wall (xz distance)1574 DO k = nzb_si + 1, nzb_si + vi1575 l_wall(k,j,i-1) = MIN( l_wall(k,j,i-1), &1576 SQRT( 0.25_wp * dx**2 + &1577 ( zu(k) - zw(nzb_si) )**2 ) )1578 ENDDO1579 ENDIF1580 1581 IF ( wall_r(j,i) > 0 ) THEN1582 !1583 !-- Right wall (x distance)1584 DO k = wall_r(j,i), nzb_si1585 l_wall(k,j,i+1) = MIN( l_wall(k,j,i+1), 0.5_wp * dx )1586 ENDDO1587 !1588 !-- Above right wall (xz distance)1589 DO k = nzb_si + 1, nzb_si + vi1590 l_wall(k,j,i+1) = MIN( l_wall(k,j,i+1), &1591 SQRT( 0.25_wp * dx**2 + &1592 ( zu(k) - zw(nzb_si) )**2 ) )1593 ENDDO1594 1595 ENDIF1596 1597 1974 ENDDO 1598 1975 ENDDO 1599 1600 ENDIF 1601 1602 ! 1603 !-- Multiplication with wall_adjustment_factor 1604 l_wall = wall_adjustment_factor * l_wall 1605 1976 ENDDO 1606 1977 ! 1607 1978 !-- Set lateral boundary conditions for l_wall 1608 CALL exchange_horiz( l_wall, nbgp ) 1609 1610 DEALLOCATE( corner_nl, corner_nr, corner_sl, corner_sr, nzb_local, & 1611 vertical_influence, wall_l, wall_n, wall_r, wall_s ) 1979 CALL exchange_horiz( l_wall, nbgp ) 1612 1980 1613 1981 -
palm/trunk/SOURCE/interaction_droplets_ptq.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 106 106 107 107 USE indices, & 108 ONLY: nxl, nxr, nyn, nys, nzb _s_inner, nzt108 ONLY: nxl, nxr, nyn, nys, nzb, nzt, wall_flags_0 109 109 110 110 USE kinds … … 114 114 IMPLICIT NONE 115 115 116 INTEGER(iwp) :: i !<117 INTEGER(iwp) :: j !<118 INTEGER(iwp) :: k !<116 INTEGER(iwp) :: i !< running index x direction 117 INTEGER(iwp) :: j !< running index y direction 118 INTEGER(iwp) :: k !< running index z direction 119 119 120 REAL(wp) :: flag !< flag to mask topography grid points 120 121 121 122 DO i = nxl, nxr 122 123 DO j = nys, nyn 123 DO k = nzb_s_inner(j,i)+1, nzt 124 q_p(k,j,i) = q_p(k,j,i) - ql_c(k,j,i) 125 pt_p(k,j,i) = pt_p(k,j,i) + l_d_cp * ql_c(k,j,i) * pt_d_t(k) 124 DO k = nzb+1, nzt 125 ! 126 !-- Predetermine flag to mask topography 127 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 128 129 q_p(k,j,i) = q_p(k,j,i) - ql_c(k,j,i) * flag 130 pt_p(k,j,i) = pt_p(k,j,i) + l_d_cp * ql_c(k,j,i) * pt_d_t(k) & 131 * flag 126 132 ENDDO 127 133 ENDDO … … 145 151 146 152 USE indices, & 147 ONLY: nzb _s_inner, nzt153 ONLY: nzb, nzt, wall_flags_0 148 154 149 155 USE kinds, & … … 154 160 IMPLICIT NONE 155 161 156 INTEGER(iwp) :: i !< 157 INTEGER(iwp) :: j !< 158 INTEGER(iwp) :: k !< 162 INTEGER(iwp) :: i !< running index x direction 163 INTEGER(iwp) :: j !< running index y direction 164 INTEGER(iwp) :: k !< running index z direction 165 166 REAL(wp) :: flag !< flag to mask topography grid points 159 167 160 168 161 DO k = nzb_s_inner(j,i)+1, nzt 162 q_p(k,j,i) = q_p(k,j,i) - ql_c(k,j,i) 163 pt_p(k,j,i) = pt_p(k,j,i) + l_d_cp * ql_c(k,j,i) * pt_d_t(k) 169 DO k = nzb+1, nzt 170 ! 171 !-- Predetermine flag to mask topography 172 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 173 174 q_p(k,j,i) = q_p(k,j,i) - ql_c(k,j,i) * flag 175 pt_p(k,j,i) = pt_p(k,j,i) + l_d_cp * ql_c(k,j,i) * pt_d_t(k) * flag 164 176 ENDDO 165 177 -
palm/trunk/SOURCE/land_surface_model_mod.f90
r2150 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 ! - now, also vertical walls are possible 24 ! - for vertical walls, parametrization of r_a (aerodynamic resisistance) is 25 ! implemented. 26 ! 27 ! Add check for soil moisture, it must not exceed its saturation value. 23 28 ! 24 29 ! Former revisions: … … 159 164 !> DALES and UCLA-LES models. 160 165 !> 166 !> @todo Extensive verification energy-balance solver for vertical surfaces, 167 !> e.g. parametrization of r_a 168 !> @todo Revise single land-surface processes for vertical surfaces, e.g. 169 !> treatment of humidity, etc. 161 170 !> @todo Consider partial absorption of the net shortwave radiation by the 162 171 !> skin layer. … … 174 183 175 184 USE arrays_3d, & 176 ONLY: hyp, ol, pt, pt_p, prr, q, q_p, ql, qsws, shf, ts, us, vpt, z0, & 177 z0h, z0q 185 ONLY: hyp, pt, pt_p, prr, q, q_p, ql, vpt, u, v, w 178 186 179 187 USE cloud_parameters, & … … 183 191 ONLY: cloud_physics, dt_3d, humidity, intermediate_timestep_count, & 184 192 initializing_actions, intermediate_timestep_count_max, & 185 max_masks, precipitation, pt_surface,&193 land_surface, max_masks, precipitation, pt_surface, & 186 194 rho_surface, roughness_length, surface_pressure, & 187 195 timestep_scheme, tsc, z0h_factor, time_since_reference_point 188 196 189 197 USE indices, & 190 ONLY: nbgp, nxl g, nxrg, nyng, nysg, nzb, nzb_s_inner198 ONLY: nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb 191 199 192 200 USE kinds … … 196 204 USE radiation_model_mod, & 197 205 ONLY: force_radiation_call, rad_net, rad_sw_in, rad_lw_out, & 198 rad_lw_out_change_0, unscheduled_radiation_calls206 rad_lw_out_change_0, radiation_scheme, unscheduled_radiation_calls 199 207 200 208 USE statistics, & 201 209 ONLY: hom, statistic_regions 202 210 211 USE surface_mod, & 212 ONLY : surf_lsm_h, surf_lsm_v, surf_type 213 203 214 IMPLICIT NONE 204 215 216 TYPE surf_type_lsm 217 REAL(wp), DIMENSION(:), ALLOCATABLE :: var_1D !< 1D prognostic variable 218 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: var_2D !< 2D prognostic variable 219 END TYPE surf_type_lsm 205 220 ! 206 221 !-- LSM model constants … … 225 240 soil_type = 3 !< NAMELIST soil_type_2d 226 241 227 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: soil_type_2d, & !< soil type, 0: user-defined, 1-7: generic (see list)228 veg_type_2d !< vegetation type, 0: user-defined, 1-19: generic (see list)229 230 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: water_surface, & !< flag parameter for water surfaces (classes 14+15)231 pave_surface, & !< flag parameter for pavements (asphalt etc.) (class 20)232 building_surface !< flag parameter indicating that the surface element is covered by buildings (no LSM actions, not implemented yet)233 234 242 LOGICAL :: conserve_water_content = .TRUE., & !< open or closed bottom surface for the soil model 235 force_radiation_call_l = .FALSE., & !< flag parameter for unscheduled radiation model calls236 land_surface = .FALSE. !< flag parameter indicating wheather the lsm is used243 force_radiation_call_l = .FALSE., & !< flag to force calling of radiation routine 244 aero_resist_kray = .TRUE. !< flag to control parametrization of aerodynamic resistance at vertical surface elements 237 245 238 246 ! value 9999999.9_wp -> generic available or user-defined value must be set … … 288 296 dz_soil !< soil grid spacing (edge-edge) 289 297 298 290 299 #if defined( __nopointer ) 291 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_surface, & !< surface temperature (K) 292 t_surface_p, & !< progn. surface temperature (K) 293 m_liq_eb, & !< liquid water reservoir (m) 294 m_liq_eb_av, & !< liquid water reservoir (m) 295 m_liq_eb_p !< progn. liquid water reservoir (m) 300 TYPE(surf_type_lsm), TARGET :: t_soil_h, & !< Soil temperature (K), horizontal surface elements 301 t_soil_h_p, & !< Prog. soil temperature (K), horizontal surface elements 302 m_soil_h, & !< Soil moisture (m3/m3), horizontal surface elements 303 m_soil_h_p !< Prog. soil moisture (m3/m3), horizontal surface elements 304 305 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: & 306 t_soil_v, & !< Soil temperature (K), vertical surface elements 307 t_soil_v_p, & !< Prog. soil temperature (K), vertical surface elements 308 m_soil_v, & !< Soil moisture (m3/m3), vertical surface elements 309 m_soil_v_p !< Prog. soil moisture (m3/m3), vertical surface elements 296 310 #else 297 REAL(wp), DIMENSION(:,:), POINTER :: t_surface, & 298 t_surface_p, & 299 m_liq_eb, & 300 m_liq_eb_p 301 302 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_surface_1, t_surface_2, & 303 m_liq_eb_av, & 304 m_liq_eb_1, m_liq_eb_2 311 TYPE(surf_type_lsm), POINTER :: t_soil_h, & !< Soil temperature (K), horizontal surface elements 312 t_soil_h_p, & !< Prog. soil temperature (K), horizontal surface elements 313 m_soil_h, & !< Soil moisture (m3/m3), horizontal surface elements 314 m_soil_h_p !< Prog. soil moisture (m3/m3), horizontal surface elements 315 316 TYPE(surf_type_lsm), TARGET :: t_soil_h_1, & !< 317 t_soil_h_2, & !< 318 m_soil_h_1, & !< 319 m_soil_h_2 !< 320 321 TYPE(surf_type_lsm), DIMENSION(:), POINTER :: & 322 t_soil_v, & !< Soil temperature (K), vertical surface elements 323 t_soil_v_p, & !< Prog. soil temperature (K), vertical surface elements 324 m_soil_v, & !< Soil moisture (m3/m3), vertical surface elements 325 m_soil_v_p !< Prog. soil moisture (m3/m3), vertical surface elements 326 327 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::& 328 t_soil_v_1, & !< 329 t_soil_v_2, & !< 330 m_soil_v_1, & !< 331 m_soil_v_2 !< 332 #endif 333 334 #if defined( __nopointer ) 335 TYPE(surf_type_lsm), TARGET :: t_surface_h, & !< surface temperature (K), horizontal surface elements 336 t_surface_h_p, & !< progn. surface temperature (K), horizontal surface elements 337 m_liq_eb_h, & !< liquid water reservoir (m), horizontal surface elements 338 m_liq_eb_h_p !< progn. liquid water reservoir (m), horizontal surface elements 339 340 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: & 341 t_surface_v, & !< surface temperature (K), vertical surface elements 342 t_surface_v_p, & !< progn. surface temperature (K), vertical surface elements 343 m_liq_eb_v, & !< liquid water reservoir (m), vertical surface elements 344 m_liq_eb_v_p !< progn. liquid water reservoir (m), vertical surface elements 345 #else 346 TYPE(surf_type_lsm), POINTER :: t_surface_h, & !< surface temperature (K), horizontal surface elements 347 t_surface_h_p, & !< progn. surface temperature (K), horizontal surface elements 348 m_liq_eb_h, & !< liquid water reservoir (m), horizontal surface elements 349 m_liq_eb_h_p !< progn. liquid water reservoir (m), horizontal surface elements 350 351 TYPE(surf_type_lsm), TARGET :: t_surface_h_1, & !< 352 t_surface_h_2, & !< 353 m_liq_eb_h_1, & !< 354 m_liq_eb_h_2 !< 355 356 TYPE(surf_type_lsm), DIMENSION(:), POINTER :: & 357 t_surface_v, & !< surface temperature (K), vertical surface elements 358 t_surface_v_p, & !< progn. surface temperature (K), vertical surface elements 359 m_liq_eb_v, & !< liquid water reservoir (m), vertical surface elements 360 m_liq_eb_v_p !< progn. liquid water reservoir (m), vertical surface elements 361 362 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: & 363 t_surface_v_1, & !< 364 t_surface_v_2, & !< 365 m_liq_eb_v_1, & !< 366 m_liq_eb_v_2 !< 305 367 #endif 306 368 307 ! 308 !-- Temporal tendencies for time stepping 309 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tt_surface_m, & !< surface temperature tendency (K) 310 tm_liq_eb_m !< liquid water reservoir tendency (m) 369 #if defined( __nopointer ) 370 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: m_liq_eb_av 371 #else 372 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: m_liq_eb_av 373 #endif 374 375 #if defined( __nopointer ) 376 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: t_soil_av, & !< Average of t_soil 377 m_soil_av !< Average of m_soil 378 #else 379 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: t_soil_av, & !< Average of t_soil 380 m_soil_av !< Average of m_soil 381 #endif 382 383 TYPE(surf_type_lsm), TARGET :: tm_liq_eb_h_m !< liquid water reservoir tendency (m), horizontal surface elements 384 TYPE(surf_type_lsm), TARGET :: tt_surface_h_m !< surface temperature tendency (K), horizontal surface elements 385 TYPE(surf_type_lsm), TARGET :: tt_soil_h_m !< t_soil storage array, horizontal surface elements 386 TYPE(surf_type_lsm), TARGET :: tm_soil_h_m !< m_soil storage array, horizontal surface elements 387 388 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: tm_liq_eb_v_m !< liquid water reservoir tendency (m), vertical surface elements 389 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: tt_surface_v_m !< surface temperature tendency (K), vertical surface elements 390 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: tt_soil_v_m !< t_soil storage array, vertical surface elements 391 TYPE(surf_type_lsm), DIMENSION(0:3), TARGET :: tm_soil_v_m !< m_soil storage array, vertical surface elements 311 392 312 393 ! 313 394 !-- Energy balance variables 314 395 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: & 315 alpha_vg, & !< coef. of Van Genuchten316 c_liq, & !< liquid water coverage (of vegetated area)317 396 c_liq_av, & !< average of c_liq 318 397 c_soil_av, & !< average of c_soil 319 c_veg, & !< vegetation coverage320 398 c_veg_av, & !< average of c_veg 321 f_sw_in, & !< fraction of absorbed shortwave radiation by the surface layer (not implemented yet)322 ghf_eb, & !< ground heat flux323 399 ghf_eb_av, & !< average of ghf_eb 324 gamma_w_sat, & !< hydraulic conductivity at saturation325 g_d, & !< coefficient for dependence of r_canopy on water vapour pressure deficit326 lai, & !< leaf area index327 400 lai_av, & !< average of lai 328 lambda_surface_s, & !< coupling between surface and soil (depends on vegetation type)329 lambda_surface_u, & !< coupling between surface and soil (depends on vegetation type)330 l_vg, & !< coef. of Van Genuchten331 m_fc, & !< soil moisture at field capacity (m3/m3)332 m_res, & !< residual soil moisture333 m_sat, & !< saturation soil moisture (m3/m3)334 m_wilt, & !< soil moisture at permanent wilting point (m3/m3)335 n_vg, & !< coef. Van Genuchten336 qsws_eb, & !< surface flux of latent heat (total)337 401 qsws_eb_av, & !< average of qsws_eb 338 qsws_liq_eb, & !< surface flux of latent heat (liquid water portion)339 402 qsws_liq_eb_av, & !< average of qsws_liq_eb 340 qsws_soil_eb, & !< surface flux of latent heat (soil portion)341 403 qsws_soil_eb_av, & !< average of qsws_soil_eb 342 qsws_veg_eb, & !< surface flux of latent heat (vegetation portion)343 404 qsws_veg_eb_av, & !< average of qsws_veg_eb 344 rad_net_l, & !< local copy of rad_net (net radiation at surface)345 r_a, & !< aerodynamic resistance346 405 r_a_av, & !< average of r_a 347 r_canopy, & !< canopy resistance348 r_soil, & !< soil resistance349 r_soil_min, & !< minimum soil resistance350 r_s, & !< total surface resistance (combination of r_soil and r_canopy)351 406 r_s_av, & !< average of r_s 352 r_canopy_min, & !< minimum canopy (stomatal) resistance353 shf_eb, & !< surface flux of sensible heat354 407 shf_eb_av !< average of shf_eb 355 356 357 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: &358 lambda_h, & !< heat conductivity of soil (W/m/K)359 lambda_w, & !< hydraulic diffusivity of soil (?)360 gamma_w, & !< hydraulic conductivity of soil (W/m/K)361 rho_c_total !< volumetric heat capacity of the actual soil matrix (?)362 363 #if defined( __nopointer )364 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: &365 t_soil, & !< Soil temperature (K)366 t_soil_av, & !< Average of t_soil367 t_soil_p, & !< Prog. soil temperature (K)368 m_soil, & !< Soil moisture (m3/m3)369 m_soil_av, & !< Average of m_soil370 m_soil_p !< Prog. soil moisture (m3/m3)371 #else372 REAL(wp), DIMENSION(:,:,:), POINTER :: &373 t_soil, t_soil_p, &374 m_soil, m_soil_p375 376 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: &377 t_soil_av, t_soil_1, t_soil_2, &378 m_soil_av, m_soil_1, m_soil_2379 #endif380 381 382 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: &383 tt_soil_m, & !< t_soil storage array384 tm_soil_m, & !< m_soil storage array385 root_fr !< root fraction (sum=1)386 408 387 409 … … 571 593 ! 572 594 !-- Public parameters, constants and initial values 573 PUBLIC land_surface, skip_time_do_lsm595 PUBLIC aero_resist_kray, skip_time_do_lsm 574 596 575 597 ! … … 578 600 579 601 ! 580 !-- Public 2D output variables581 PUBLIC ghf_eb, qsws_eb, qsws_liq_eb, qsws_soil_eb,qsws_veg_eb, r_a, r_s, &582 shf_eb583 584 !585 602 !-- Public prognostic variables 586 PUBLIC m_soil , t_soil603 PUBLIC m_soil_h, t_soil_h 587 604 588 605 … … 871 888 USE control_parameters, & 872 889 ONLY: bc_pt_b, bc_q_b, constant_flux_layer, message_string, & 873 most_method , topography890 most_method 874 891 875 892 USE radiation_model_mod, & … … 879 896 IMPLICIT NONE 880 897 881 898 INTEGER(iwp) :: k !< running index, z-dimension 882 899 ! 883 900 !-- Dirichlet boundary conditions are required as the surface fluxes are … … 897 914 ENDIF 898 915 899 IF ( topography /= 'flat' ) THEN900 message_string = 'lsm cannot be used ' // &901 'in combination with topography /= "flat"'902 CALL message( 'check_parameters', 'PA0415', 1, 2, 0, 6, 0 )903 ENDIF904 905 916 IF ( ( veg_type == 14 .OR. veg_type == 15 ) .AND. & 906 917 most_method == 'lookup' ) THEN … … 1044 1055 1045 1056 ENDIF 1057 ! 1058 !-- Check for proper setting of soil moisture, must not be larger than its 1059 !-- saturation value. 1060 DO k = nzb_soil, nzt_soil 1061 IF ( soil_moisture(k) > m_soil_pars(0,soil_type) ) THEN 1062 message_string = 'soil_moisture must not exceed its saturation' // & 1063 ' value' 1064 CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 ) 1065 ENDIF 1066 ENDDO 1046 1067 1047 1068 IF ( .NOT. radiation ) THEN … … 1059 1080 !> Solver for the energy balance at the surface. 1060 1081 !------------------------------------------------------------------------------! 1061 SUBROUTINE lsm_energy_balance 1082 SUBROUTINE lsm_energy_balance( horizontal, l ) 1062 1083 1063 1084 … … 1065 1086 1066 1087 INTEGER(iwp) :: i !< running index 1088 INTEGER(iwp) :: i_off !< offset to determine index of surface element, seen from atmospheric grid point, for x 1067 1089 INTEGER(iwp) :: j !< running index 1068 INTEGER(iwp) :: k, ks !< running index 1090 INTEGER(iwp) :: j_off !< offset to determine index of surface element, seen from atmospheric grid point, for y 1091 INTEGER(iwp) :: k !< running index 1092 INTEGER(iwp) :: k_off !< offset to determine index of surface element, seen from atmospheric grid point, for z 1093 INTEGER(iwp) :: k_rad !< index to access radiation array 1094 INTEGER(iwp) :: ks !< running index 1095 INTEGER(iwp) :: l !< surface-facing index 1096 INTEGER(iwp) :: m !< running index concerning wall elements 1097 1098 LOGICAL :: horizontal !< Flag indicating horizontal or vertical surfaces 1069 1099 1070 1100 REAL(wp) :: c_surface_tmp,& !< temporary variable for storing the volumetric heat capacity of the surface … … 1090 1120 qv1 !< specific humidity at first grid level 1091 1121 1122 TYPE(surf_type_lsm), POINTER :: surf_t_surface 1123 TYPE(surf_type_lsm), POINTER :: surf_t_surface_p 1124 TYPE(surf_type_lsm), POINTER :: surf_tt_surface_m 1125 TYPE(surf_type_lsm), POINTER :: surf_m_liq_eb 1126 TYPE(surf_type_lsm), POINTER :: surf_m_liq_eb_p 1127 TYPE(surf_type_lsm), POINTER :: surf_tm_liq_eb_m 1128 1129 TYPE(surf_type_lsm), POINTER :: surf_m_soil 1130 TYPE(surf_type_lsm), POINTER :: surf_t_soil 1131 1132 TYPE(surf_type), POINTER :: surf !< surface-date type variable 1133 1134 IF ( horizontal ) THEN 1135 surf => surf_lsm_h 1136 1137 surf_t_surface => t_surface_h 1138 surf_t_surface_p => t_surface_h_p 1139 surf_tt_surface_m => tt_surface_h_m 1140 surf_m_liq_eb => m_liq_eb_h 1141 surf_m_liq_eb_p => m_liq_eb_h_p 1142 surf_tm_liq_eb_m => tm_liq_eb_h_m 1143 surf_m_soil => m_soil_h 1144 surf_t_soil => t_soil_h 1145 1146 k_off = -1 1147 j_off = 0 1148 i_off = 0 1149 ELSE 1150 surf => surf_lsm_v(l) 1151 1152 surf_t_surface => t_surface_v(l) 1153 surf_t_surface_p => t_surface_v_p(l) 1154 surf_tt_surface_m => tt_surface_v_m(l) 1155 surf_m_liq_eb => m_liq_eb_v(l) 1156 surf_m_liq_eb_p => m_liq_eb_v_p(l) 1157 surf_tm_liq_eb_m => tm_liq_eb_v_m(l) 1158 surf_m_soil => m_soil_v(l) 1159 surf_t_soil => t_soil_v(l) 1160 1161 k_off = 0 1162 IF ( l == 0 ) THEN 1163 j_off = -1 1164 i_off = 0 1165 ELSEIF ( l == 1 ) THEN 1166 j_off = 1 1167 i_off = 0 1168 ELSEIF ( l == 2 ) THEN 1169 j_off = 0 1170 i_off = -1 1171 ELSEIF ( l == 3 ) THEN 1172 j_off = 0 1173 i_off = 1 1174 ENDIF 1175 ENDIF 1176 1092 1177 ! 1093 1178 !-- Calculate the exner function for the current time step 1094 1179 exn = ( surface_pressure / 1000.0_wp )**0.286_wp 1095 1180 1096 DO i = nxlg, nxrg 1097 DO j = nysg, nyng 1098 k = nzb_s_inner(j,i) 1099 1100 ! 1101 !-- Set lambda_surface according to stratification between skin layer and soil 1102 IF ( .NOT. pave_surface(j,i) ) THEN 1103 1104 c_surface_tmp = c_surface 1105 1106 IF ( t_surface(j,i) >= t_soil(nzb_soil,j,i)) THEN 1107 lambda_surface = lambda_surface_s(j,i) 1108 ELSE 1109 lambda_surface = lambda_surface_u(j,i) 1110 ENDIF 1181 DO m = 1, surf%ns 1182 1183 i = surf%i(m) 1184 j = surf%j(m) 1185 k = surf%k(m) 1186 ! 1187 !-- Determine height index for radiation. Note, in clear-sky case radiation 1188 !-- arrays have rank 0 in first dimensions, so index must be zero. In case 1189 !-- of RRTMG radiation arrays have non-zero rank in first dimension, so that 1190 !-- radiation can be obtained at respective height level 1191 k_rad = MERGE( 0, k + k_off, radiation_scheme /= 'rrtmg' ) 1192 ! 1193 !-- Set lambda_surface according to stratification between skin layer and soil 1194 IF ( .NOT. surf%pave_surface(m) ) THEN 1195 1196 c_surface_tmp = c_surface 1197 1198 IF ( surf_t_surface%var_1d(m) >= surf_t_soil%var_2d(nzb_soil,m)) THEN 1199 lambda_surface = surf%lambda_surface_s(m) 1111 1200 ELSE 1112 1113 c_surface_tmp = pave_heat_capacity * dz_soil(nzb_soil) * 0.5_wp 1114 lambda_surface = pave_heat_conductivity * ddz_soil(nzb_soil) 1115 1116 ENDIF 1117 1118 ! 1119 !-- First step: calculate aerodyamic resistance. As pt, us, ts 1120 !-- are not available for the prognostic time step, data from the last 1121 !-- time step is used here. Note that this formulation is the 1122 !-- equivalent to the ECMWF formulation using drag coefficients 1123 IF ( cloud_physics ) THEN 1124 pt1 = pt(k+1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i) 1125 qv1 = q(k+1,j,i) - ql(k+1,j,i) 1126 ELSE 1127 pt1 = pt(k+1,j,i) 1128 qv1 = q(k+1,j,i) 1129 ENDIF 1130 1131 r_a(j,i) = (pt1 - pt(k,j,i)) / (ts(j,i) * us(j,i) + 1.0E-20_wp) 1132 1133 ! 1134 !-- Make sure that the resistance does not drop to zero for neutral 1135 !-- stratification 1136 IF ( ABS(r_a(j,i)) < 1.0_wp ) r_a(j,i) = 1.0_wp 1137 1138 ! 1139 !-- Second step: calculate canopy resistance r_canopy 1140 !-- f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation 1201 lambda_surface = surf%lambda_surface_u(m) 1202 ENDIF 1203 ELSE 1204 1205 c_surface_tmp = pave_heat_capacity * dz_soil(nzb_soil) * 0.5_wp 1206 lambda_surface = pave_heat_conductivity * ddz_soil(nzb_soil) 1207 1208 ENDIF 1209 1210 ! 1211 !-- First step: calculate aerodyamic resistance. As pt, us, ts 1212 !-- are not available for the prognostic time step, data from the last 1213 !-- time step is used here. Note that this formulation is the 1214 !-- equivalent to the ECMWF formulation using drag coefficients 1215 IF ( cloud_physics ) THEN 1216 pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i) 1217 qv1 = q(k,j,i) - ql(k,j,i) 1218 ELSE 1219 pt1 = pt(k,j,i) 1220 qv1 = q(k,j,i) 1221 ENDIF 1222 ! 1223 !-- Calculate aerodynamical resistance. For horizontal and vertical 1224 !-- surfaces MOST is applied. Moreover, for vertical surfaces, resistance 1225 !-- can be obtain via parameterization of Mason (2000) / 1226 !-- Krayenhoff and Voogt (2006). 1227 !-- To do: detailed investigation which approach is better! 1228 IF ( horizontal .OR. .NOT. aero_resist_kray ) THEN 1229 surf%r_a(m) = ( pt1 - surf_lsm_h%pt_surface(m) ) / & 1230 ( surf%ts(m) * surf%us(m) + 1.0E-20_wp ) 1231 ELSE 1232 surf%r_a(m) = 1.0_wp / ( 11.8_wp + 4.2_wp * & 1233 SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 + & 1234 ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 + & 1235 ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 ) & 1236 ) 1237 ENDIF 1238 ! 1239 !-- Make sure that the resistance does not drop to zero for neutral 1240 !-- stratification 1241 IF ( ABS( surf%r_a(m) ) < 1.0_wp ) surf%r_a(m) = 1.0_wp 1242 ! 1243 !-- Second step: calculate canopy resistance r_canopy 1244 !-- f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation 1141 1245 1142 !-- f1: correction for incoming shortwave radiation (stomata close at 1143 !-- night) 1144 f1 = MIN( 1.0_wp, ( 0.004_wp * rad_sw_in(k,j,i) + 0.05_wp ) / & 1145 (0.81_wp * (0.004_wp * rad_sw_in(k,j,i) & 1146 + 1.0_wp)) ) 1147 1148 1149 1150 ! 1151 !-- f2: correction for soil moisture availability to plants (the 1152 !-- integrated soil moisture must thus be considered here) 1153 !-- f2 = 0 for very dry soils 1154 m_total = 0.0_wp 1155 DO ks = nzb_soil, nzt_soil 1156 m_total = m_total + root_fr(ks,j,i) & 1157 * MAX(m_soil(ks,j,i),m_wilt(j,i)) 1158 ENDDO 1159 1160 IF ( m_total > m_wilt(j,i) .AND. m_total < m_fc(j,i) ) THEN 1161 f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) ) 1162 ELSEIF ( m_total >= m_fc(j,i) ) THEN 1163 f2 = 1.0_wp 1164 ELSE 1165 f2 = 1.0E-20_wp 1166 ENDIF 1167 1168 ! 1169 !-- Calculate water vapour pressure at saturation 1170 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i) & 1171 - 273.16_wp ) / ( t_surface(j,i) - 35.86_wp ) ) 1172 1173 ! 1174 !-- f3: correction for vapour pressure deficit 1175 IF ( g_d(j,i) /= 0.0_wp ) THEN 1176 ! 1177 !-- Calculate vapour pressure 1178 e = qv1 * surface_pressure / 0.622_wp 1179 f3 = EXP ( -g_d(j,i) * (e_s - e) ) 1180 ELSE 1181 f3 = 1.0_wp 1182 ENDIF 1183 1184 ! 1185 !-- Calculate canopy resistance. In case that c_veg is 0 (bare soils), 1186 !-- this calculation is obsolete, as r_canopy is not used below. 1187 !-- To do: check for very dry soil -> r_canopy goes to infinity 1188 r_canopy(j,i) = r_canopy_min(j,i) / (lai(j,i) * f1 * f2 * f3 & 1189 + 1.0E-20_wp) 1190 1191 ! 1192 !-- Third step: calculate bare soil resistance r_soil. The Clapp & 1193 !-- Hornberger parametrization does not consider c_veg. 1194 IF ( soil_type_2d(j,i) /= 7 ) THEN 1195 m_min = c_veg(j,i) * m_wilt(j,i) + (1.0_wp - c_veg(j,i)) * & 1196 m_res(j,i) 1197 ELSE 1198 m_min = m_wilt(j,i) 1199 ENDIF 1200 1201 f2 = ( m_soil(nzb_soil,j,i) - m_min ) / ( m_fc(j,i) - m_min ) 1202 f2 = MAX(f2,1.0E-20_wp) 1203 f2 = MIN(f2,1.0_wp) 1204 1205 r_soil(j,i) = r_soil_min(j,i) / f2 1206 1207 ! 1208 !-- Calculate the maximum possible liquid water amount on plants and 1209 !-- bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is 1210 !-- assumed, while paved surfaces might hold up 1 mm of water. The 1211 !-- liquid water fraction for paved surfaces is calculated after 1212 !-- Noilhan & Planton (1989), while the ECMWF formulation is used for 1213 !-- vegetated surfaces and bare soils. 1214 IF ( pave_surface(j,i) ) THEN 1215 m_liq_eb_max = m_max_depth * 5.0_wp 1216 c_liq(j,i) = MIN( 1.0_wp, (m_liq_eb(j,i) / m_liq_eb_max)**0.67 ) 1217 ELSE 1218 m_liq_eb_max = m_max_depth * ( c_veg(j,i) * lai(j,i) & 1219 + (1.0_wp - c_veg(j,i)) ) 1220 c_liq(j,i) = MIN( 1.0_wp, m_liq_eb(j,i) / m_liq_eb_max ) 1221 ENDIF 1222 1223 ! 1224 !-- Calculate saturation specific humidity 1225 q_s = 0.622_wp * e_s / surface_pressure 1226 1227 ! 1228 !-- In case of dewfall, set evapotranspiration to zero 1229 !-- All super-saturated water is then removed from the air 1230 IF ( humidity .AND. q_s <= qv1 ) THEN 1231 r_canopy(j,i) = 0.0_wp 1232 r_soil(j,i) = 0.0_wp 1233 ENDIF 1234 1235 ! 1236 !-- Calculate coefficients for the total evapotranspiration 1237 !-- In case of water surface, set vegetation and soil fluxes to zero. 1238 !-- For pavements, only evaporation of liquid water is possible. 1239 IF ( water_surface(j,i) ) THEN 1240 f_qsws_veg = 0.0_wp 1241 f_qsws_soil = 0.0_wp 1242 f_qsws_liq = rho_lv / r_a(j,i) 1243 ELSEIF ( pave_surface (j,i) ) THEN 1244 f_qsws_veg = 0.0_wp 1245 f_qsws_soil = 0.0_wp 1246 f_qsws_liq = rho_lv * c_liq(j,i) / r_a(j,i) 1247 ELSE 1248 f_qsws_veg = rho_lv * c_veg(j,i) * (1.0_wp - c_liq(j,i))/ & 1249 (r_a(j,i) + r_canopy(j,i)) 1250 f_qsws_soil = rho_lv * (1.0_wp - c_veg(j,i)) / (r_a(j,i) + & 1251 r_soil(j,i)) 1252 f_qsws_liq = rho_lv * c_veg(j,i) * c_liq(j,i) / r_a(j,i) 1253 ENDIF 1246 !-- f1: correction for incoming shortwave radiation (stomata close at 1247 !-- night) 1248 f1 = MIN( 1.0_wp, ( 0.004_wp * rad_sw_in(k_rad,j+j_off,i+i_off) + 0.05_wp ) /& 1249 (0.81_wp * (0.004_wp * rad_sw_in(k_rad,j+j_off,i+i_off)& 1250 + 1.0_wp)) ) 1251 ! 1252 !-- f2: correction for soil moisture availability to plants (the 1253 !-- integrated soil moisture must thus be considered here) 1254 !-- f2 = 0 for very dry soils 1255 m_total = 0.0_wp 1256 DO ks = nzb_soil, nzt_soil 1257 m_total = m_total + surf%root_fr(ks,m) & 1258 * MAX( surf_m_soil%var_2d(ks,m), surf%m_wilt(m) ) 1259 ENDDO 1260 1261 IF ( m_total > surf%m_wilt(m) .AND. & 1262 m_total < surf%m_fc(m) ) THEN 1263 f2 = ( m_total - surf%m_wilt(m) ) / & 1264 ( surf%m_fc(m) - surf%m_wilt(m) ) 1265 ELSEIF ( m_total >= surf%m_fc(m) ) THEN 1266 f2 = 1.0_wp 1267 ELSE 1268 f2 = 1.0E-20_wp 1269 ENDIF 1270 ! 1271 !-- Calculate water vapour pressure at saturation 1272 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( surf_t_surface%var_1d(m) & 1273 - 273.16_wp ) / ( surf_t_surface%var_1d(m) - 35.86_wp ) ) 1274 ! 1275 !-- f3: correction for vapour pressure deficit 1276 IF ( surf%g_d(m) /= 0.0_wp ) THEN 1277 ! 1278 !-- Calculate vapour pressure 1279 e = qv1 * surface_pressure / 0.622_wp 1280 f3 = EXP ( - surf%g_d(m) * (e_s - e) ) 1281 ELSE 1282 f3 = 1.0_wp 1283 ENDIF 1284 ! 1285 !-- Calculate canopy resistance. In case that c_veg is 0 (bare soils), 1286 !-- this calculation is obsolete, as r_canopy is not used below. 1287 !-- To do: check for very dry soil -> r_canopy goes to infinity 1288 surf%r_canopy(m) = surf%r_canopy_min(m) / & 1289 ( surf%lai(m) * f1 * f2 * f3 + 1.0E-20_wp ) 1290 ! 1291 !-- Third step: calculate bare soil resistance r_soil. The Clapp & 1292 !-- Hornberger parametrization does not consider c_veg. 1293 IF ( surf%soil_type_2d(m) /= 7 ) THEN 1294 m_min = surf%c_veg(m) * surf%m_wilt(m) + & 1295 ( 1.0_wp - surf%c_veg(m) ) * surf%m_res(m) 1296 ELSE 1297 m_min = surf%m_wilt(m) 1298 ENDIF 1299 1300 f2 = ( surf_m_soil%var_2d(nzb_soil,m) - m_min ) / ( surf%m_fc(m) - m_min ) 1301 f2 = MAX( f2, 1.0E-20_wp ) 1302 f2 = MIN( f2, 1.0_wp ) 1303 1304 surf%r_soil(m) = surf%r_soil_min(m) / f2 1305 1306 ! 1307 !-- Calculate the maximum possible liquid water amount on plants and 1308 !-- bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is 1309 !-- assumed, while paved surfaces might hold up 1 mm of water. The 1310 !-- liquid water fraction for paved surfaces is calculated after 1311 !-- Noilhan & Planton (1989), while the ECMWF formulation is used for 1312 !-- vegetated surfaces and bare soils. 1313 IF ( surf%pave_surface(m) ) THEN 1314 m_liq_eb_max = m_max_depth * 5.0_wp 1315 surf%c_liq(m) = MIN( 1.0_wp, ( surf_m_liq_eb%var_1d(m) / m_liq_eb_max)**0.67 ) 1316 ELSE 1317 m_liq_eb_max = m_max_depth * ( surf%c_veg(m) * surf%lai(m)& 1318 + ( 1.0_wp - surf%c_veg(m) ) ) 1319 surf%c_liq(m) = MIN( 1.0_wp, surf_m_liq_eb%var_1d(m) / m_liq_eb_max ) 1320 ENDIF 1321 ! 1322 !-- Calculate saturation specific humidity 1323 q_s = 0.622_wp * e_s / surface_pressure 1324 ! 1325 !-- In case of dewfall, set evapotranspiration to zero 1326 !-- All super-saturated water is then removed from the air 1327 IF ( humidity .AND. q_s <= qv1 ) THEN 1328 surf%r_canopy(m) = 0.0_wp 1329 surf%r_soil(m) = 0.0_wp 1330 ENDIF 1331 1332 ! 1333 !-- Calculate coefficients for the total evapotranspiration 1334 !-- In case of water surface, set vegetation and soil fluxes to zero. 1335 !-- For pavements, only evaporation of liquid water is possible. 1336 IF ( surf%water_surface(m) ) THEN 1337 f_qsws_veg = 0.0_wp 1338 f_qsws_soil = 0.0_wp 1339 f_qsws_liq = rho_lv / surf%r_a(m) 1340 ELSEIF ( surf%pave_surface (m) ) THEN 1341 f_qsws_veg = 0.0_wp 1342 f_qsws_soil = 0.0_wp 1343 f_qsws_liq = rho_lv * surf%c_liq(m) / surf%r_a(m) 1344 ELSE 1345 f_qsws_veg = rho_lv * surf%c_veg(m) * & 1346 ( 1.0_wp - surf%c_liq(m) ) / & 1347 ( surf%r_a(m) + surf%r_canopy(m) ) 1348 f_qsws_soil = rho_lv * (1.0_wp - surf%c_veg(m) ) / & 1349 ( surf%r_a(m) + surf%r_soil(m) ) 1350 f_qsws_liq = rho_lv * surf%c_veg(m) * surf%c_liq(m) / & 1351 surf%r_a(m) 1352 ENDIF 1254 1353 ! 1255 1354 !-- If soil moisture is below wilting point, plants do no longer … … 1259 1358 ! ENDIF 1260 1359 1261 f_shf = rho_cp / r_a(j,i) 1262 f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq 1263 1264 ! 1265 !-- Calculate derivative of q_s for Taylor series expansion 1266 e_s_dt = e_s * ( 17.269_wp / (t_surface(j,i) - 35.86_wp) - & 1267 17.269_wp*(t_surface(j,i) - 273.16_wp) & 1268 / (t_surface(j,i) - 35.86_wp)**2 ) 1269 1270 dq_s_dt = 0.622_wp * e_s_dt / surface_pressure 1271 1272 ! 1273 !-- Add LW up so that it can be removed in prognostic equation 1274 rad_net_l(j,i) = rad_net(j,i) + rad_lw_out(nzb,j,i) 1275 1276 ! 1277 !-- Calculate new skin temperature 1278 IF ( humidity ) THEN 1279 1280 ! 1281 !-- Numerator of the prognostic equation 1282 coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i) & 1283 * t_surface(j,i) - rad_lw_out(nzb,j,i) & 1284 + f_shf * pt1 + f_qsws * ( qv1 - q_s & 1285 + dq_s_dt * t_surface(j,i) ) + lambda_surface & 1286 * t_soil(nzb_soil,j,i) 1287 1288 ! 1289 !-- Denominator of the prognostic equation 1290 coef_2 = rad_lw_out_change_0(j,i) + f_qsws * dq_s_dt & 1291 + lambda_surface + f_shf / exn 1292 ELSE 1293 1294 ! 1295 !-- Numerator of the prognostic equation 1296 coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i) & 1297 * t_surface(j,i) - rad_lw_out(nzb,j,i) & 1298 + f_shf * pt1 + lambda_surface & 1299 * t_soil(nzb_soil,j,i) 1300 1301 ! 1302 !-- Denominator of the prognostic equation 1303 coef_2 = rad_lw_out_change_0(j,i) + lambda_surface + f_shf / exn 1304 1305 ENDIF 1306 1307 tend = 0.0_wp 1308 1309 ! 1310 !-- Implicit solution when the surface layer has no heat capacity, 1311 !-- otherwise use RK3 scheme. 1312 t_surface_p(j,i) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp * & 1313 t_surface(j,i) ) / ( c_surface_tmp + coef_2 & 1314 * dt_3d * tsc(2) ) 1315 1316 ! 1317 !-- Add RK3 term 1318 IF ( c_surface_tmp /= 0.0_wp ) THEN 1319 1320 t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3) & 1321 * tt_surface_m(j,i) 1322 1323 ! 1324 !-- Calculate true tendency 1325 tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3) & 1326 * tt_surface_m(j,i)) / (dt_3d * tsc(2)) 1327 ! 1328 !-- Calculate t_surface tendencies for the next Runge-Kutta step 1329 IF ( timestep_scheme(1:5) == 'runge' ) THEN 1330 IF ( intermediate_timestep_count == 1 ) THEN 1331 tt_surface_m(j,i) = tend 1332 ELSEIF ( intermediate_timestep_count < & 1333 intermediate_timestep_count_max ) THEN 1334 tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp & 1335 * tt_surface_m(j,i) 1336 ENDIF 1360 f_shf = rho_cp / surf%r_a(m) 1361 f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq 1362 ! 1363 !-- Calculate derivative of q_s for Taylor series expansion 1364 e_s_dt = e_s * ( 17.269_wp / ( surf_t_surface%var_1d(m) - 35.86_wp) - & 1365 17.269_wp*( surf_t_surface%var_1d(m) - 273.16_wp) & 1366 / ( surf_t_surface%var_1d(m) - 35.86_wp)**2 ) 1367 1368 dq_s_dt = 0.622_wp * e_s_dt / surface_pressure 1369 ! 1370 !-- Add LW up so that it can be removed in prognostic equation 1371 surf%rad_net_l(m) = rad_net(j,i) + rad_lw_out(nzb,j,i) 1372 ! 1373 !-- Calculate new skin temperature 1374 IF ( humidity ) THEN 1375 ! 1376 !-- Numerator of the prognostic equation 1377 coef_1 = surf%rad_net_l(m) + rad_lw_out_change_0(j,i) & 1378 * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i) & 1379 + f_shf * pt1 + f_qsws * ( qv1 - q_s & 1380 + dq_s_dt * surf_t_surface%var_1d(m) ) + lambda_surface & 1381 * surf_t_soil%var_2d(nzb_soil,m) 1382 ! 1383 !-- Denominator of the prognostic equation 1384 coef_2 = rad_lw_out_change_0(j,i) + f_qsws * dq_s_dt & 1385 + lambda_surface + f_shf / exn 1386 ELSE 1387 ! 1388 !-- Numerator of the prognostic equation 1389 coef_1 = surf%rad_net_l(m) + rad_lw_out_change_0(j,i) & 1390 * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i) & 1391 + f_shf * pt1 + lambda_surface & 1392 * surf_t_soil%var_2d(nzb_soil,m) 1393 ! 1394 !-- Denominator of the prognostic equation 1395 coef_2 = rad_lw_out_change_0(j,i) + lambda_surface + f_shf / exn 1396 1397 ENDIF 1398 1399 tend = 0.0_wp 1400 1401 ! 1402 !-- Implicit solution when the surface layer has no heat capacity, 1403 !-- otherwise use RK3 scheme. 1404 surf_t_surface_p%var_1d(m) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *& 1405 surf_t_surface%var_1d(m) ) / ( c_surface_tmp + coef_2& 1406 * dt_3d * tsc(2) ) 1407 1408 ! 1409 !-- Add RK3 term 1410 IF ( c_surface_tmp /= 0.0_wp ) THEN 1411 1412 surf_t_surface_p%var_1d(m) = surf_t_surface_p%var_1d(m) + dt_3d * & 1413 tsc(3) * surf_tt_surface_m%var_1d(m) 1414 1415 ! 1416 !-- Calculate true tendency 1417 tend = ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) - & 1418 dt_3d * tsc(3) * surf_tt_surface_m%var_1d(m)) / (dt_3d * tsc(2)) 1419 ! 1420 !-- Calculate t_surface tendencies for the next Runge-Kutta step 1421 IF ( timestep_scheme(1:5) == 'runge' ) THEN 1422 IF ( intermediate_timestep_count == 1 ) THEN 1423 surf_tt_surface_m%var_1d(m) = tend 1424 ELSEIF ( intermediate_timestep_count < & 1425 intermediate_timestep_count_max ) THEN 1426 surf_tt_surface_m%var_1d(m) = -9.5625_wp * tend + & 1427 5.3125_wp * surf_tt_surface_m%var_1d(m) 1337 1428 ENDIF 1338 1429 ENDIF 1339 1340 ! 1341 ! -- In case of fast changes in the skin temperature, it is possible to1342 !-- update the radiative fluxes independently from the prescribed1343 !-- radiation call frequency. This effectively prevents oscillations,1344 !-- especially when setting skip_time_do_radiation /= 0. The threshold1345 !-- value of 0.2 used here is just a first guess. This method should be1346 !-- revised in the future as tests have shown that the threshold is1347 !-- often reached, when no oscillations would occur (causes immense1348 !-- computing time for the radiation code).1349 IF ( ABS( t_surface_p(j,i) - t_surface(j,i) ) > 0.2_wp .AND. & 1350 unscheduled_radiation_calls ) THEN1351 force_radiation_call_l = .TRUE.1352 ENDIF1353 1354 pt(k,j,i) = t_surface_p(j,i) / exn 1355 1356 ! 1357 !-- Calculate fluxes 1358 rad_net_l(j,i) = rad_net_l(j,i) + rad_lw_out_change_0(j,i) & 1359 * t_surface(j,i) - rad_lw_out(nzb,j,i) & 1360 - rad_lw_out_change_0(j,i) * t_surface_p(j,i)1361 1362 rad_net(j,i) = rad_net_l(j,i)1363 rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i) + rad_lw_out_change_0(j,i) &1364 * ( t_surface_p(j,i) - t_surface(j,i) ) 1365 1366 ghf_eb(j,i) = lambda_surface * (t_surface_p(j,i)&1367 - t_soil(nzb_soil,j,i))1368 1369 shf_eb(j,i) = - f_shf * ( pt1 - pt(k,j,i) )1370 1371 shf(j,i) = shf_eb(j,i) / rho_cp 1372 1373 IF ( humidity ) THEN 1374 qsws_eb(j,i) = - f_qsws * ( qv1 - q_s + dq_s_dt &1375 * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) ) 1376 1377 qsws(j,i) = qsws_eb(j,i) / rho_lv1378 1379 qsws_veg_eb(j,i) = - f_qsws_veg * ( qv1 - q_s &1380 + dq_s_dt * t_surface(j,i) - dq_s_dt & 1381 * t_surface_p(j,i) )1382 1383 qsws_soil_eb(j,i) = - f_qsws_soil* ( qv1 - q_s &1384 + dq_s_dt * t_surface(j,i) - dq_s_dt&1385 * t_surface_p(j,i) )1386 1387 qsws_liq_eb(j,i) = - f_qsws_liq* ( qv1 - q_s &1388 + dq_s_dt * t_surface(j,i) - dq_s_dt&1389 * t_surface_p(j,i) )1390 ENDIF 1391 1392 ! 1393 !-- Calculate the true surface resistance 1394 IF ( qsws_eb(j,i) == 0.0_wp ) THEN1395 r_s(j,i) = 1.0E10_wp 1396 ELSE 1397 r_s(j,i) = - rho_lv * ( qv1 - q_s + dq_s_dt & 1398 * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) ) &1399 / qsws_eb(j,i) - r_a(j,i)1400 ENDIF1401 1402 ! 1403 !-- Calculate change in liquid water reservoir due to dew fall or 1404 !-- evaporation of liquid water 1405 IF ( humidity ) THEN1406 ! 1407 ! -- If precipitation is activated, add rain water to qsws_liq_eb1408 !-- and qsws_soil_eb according the the vegetation coverage.1409 !-- precipitation_rate is given in mm.1410 IF ( precipitation) THEN1411 1412 ! 1413 !-- Add precipitation to liquid water reservoir, if possible.1414 !-- Otherwise, add the water to soil. In case of1415 !-- pavements, the exceeding water amount is implicitely removed 1416 !-- as runoff as qsws_soil_eb is then not used in the soil model 1417 IF ( m_liq_eb(j,i) /= m_liq_eb_max ) THEN 1418 qsws_liq_eb(j,i) = qsws_liq_eb(j,i) & 1419 + c_veg(j,i) * prr(k,j,i) * hyrho(k) & 1420 * 0.001_wp * rho_l * l_v 1421 ELSE 1422 qsws_soil_eb(j,i) = qsws_soil_eb(j,i) &1423 + c_veg(j,i) * prr(k,j,i) * hyrho(k)&1424 * 0.001_wp * rho_l * l_v1425 ENDIF1426 1427 !-- Add precipitation to bare soil according to the bare soil 1428 !-- coverage. 1429 qsws_soil_eb(j,i) = qsws_soil_eb(j,i) + (1.0_wp&1430 - c_veg(j,i)) * prr(k,j,i) * hyrho(k)&1431 1430 ENDIF 1431 1432 ! 1433 !-- In case of fast changes in the skin temperature, it is possible to 1434 !-- update the radiative fluxes independently from the prescribed 1435 !-- radiation call frequency. This effectively prevents oscillations, 1436 !-- especially when setting skip_time_do_radiation /= 0. The threshold 1437 !-- value of 0.2 used here is just a first guess. This method should be 1438 !-- revised in the future as tests have shown that the threshold is 1439 !-- often reached, when no oscillations would occur (causes immense 1440 !-- computing time for the radiation code). 1441 IF ( ABS( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) ) > 0.2_wp .AND. & 1442 unscheduled_radiation_calls ) THEN 1443 force_radiation_call_l = .TRUE. 1444 ENDIF 1445 1446 pt(k+k_off,j+j_off,i+i_off) = surf_t_surface_p%var_1d(m) / exn !is actually no air temperature 1447 surf%pt_surface(m) = surf_t_surface_p%var_1d(m) / exn 1448 1449 ! 1450 !-- Calculate fluxes 1451 surf%rad_net_l(m) = surf%rad_net_l(m) + & 1452 rad_lw_out_change_0(j,i) & 1453 * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i) & 1454 - rad_lw_out_change_0(j,i) * surf_t_surface_p%var_1d(m) 1455 1456 rad_net(j,i) = surf%rad_net_l(m) 1457 rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i) + rad_lw_out_change_0(j,i) * & 1458 ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) ) 1459 1460 surf%ghf_eb(m) = lambda_surface * ( surf_t_surface_p%var_1d(m) & 1461 - surf_t_soil%var_2d(nzb_soil,m) ) 1462 1463 surf%shf_eb(m) = - f_shf * ( pt1 - surf%pt_surface(m) ) 1464 1465 surf%shf(m) = surf%shf_eb(m) / rho_cp 1466 1467 IF ( humidity ) THEN 1468 surf%qsws_eb(m) = - f_qsws * ( qv1 - q_s + dq_s_dt & 1469 * surf_t_surface%var_1d(m) - dq_s_dt * & 1470 surf_t_surface_p%var_1d(m) ) 1471 1472 surf%qsws(m) = surf%qsws_eb(m) / rho_lv 1473 1474 surf%qsws_veg_eb(m) = - f_qsws_veg * ( qv1 - q_s & 1475 + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt & 1476 * surf_t_surface_p%var_1d(m) ) 1477 1478 surf%qsws_soil_eb(m) = - f_qsws_soil * ( qv1 - q_s & 1479 + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt & 1480 * surf_t_surface_p%var_1d(m) ) 1481 1482 surf%qsws_liq_eb(m) = - f_qsws_liq * ( qv1 - q_s & 1483 + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt & 1484 * surf_t_surface_p%var_1d(m) ) 1485 ENDIF 1486 1487 ! 1488 !-- Calculate the true surface resistance 1489 IF ( surf%qsws_eb(m) == 0.0_wp ) THEN 1490 surf%r_s(m) = 1.0E10_wp 1491 ELSE 1492 surf%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt & 1493 * surf_t_surface%var_1d(m) - dq_s_dt * & 1494 surf_t_surface_p%var_1d(m) ) / & 1495 surf%qsws_eb(m) - surf%r_a(m) 1496 ENDIF 1497 1498 ! 1499 !-- Calculate change in liquid water reservoir due to dew fall or 1500 !-- evaporation of liquid water 1501 IF ( humidity ) THEN 1502 ! 1503 !-- If precipitation is activated, add rain water to qsws_liq_eb 1504 !-- and qsws_soil_eb according the the vegetation coverage. 1505 !-- precipitation_rate is given in mm. 1506 IF ( precipitation ) THEN 1507 1508 ! 1509 !-- Add precipitation to liquid water reservoir, if possible. 1510 !-- Otherwise, add the water to soil. In case of 1511 !-- pavements, the exceeding water amount is implicitely removed 1512 !-- as runoff as qsws_soil_eb is then not used in the soil model 1513 IF ( surf_m_liq_eb%var_1d(m) /= m_liq_eb_max ) THEN 1514 surf%qsws_liq_eb(m) = surf%qsws_liq_eb(m) & 1515 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)& 1516 * hyrho(k+k_off) & 1517 * 0.001_wp * rho_l * l_v 1518 ELSE 1519 surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m) & 1520 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)& 1521 * hyrho(k+k_off) & 1522 * 0.001_wp * rho_l * l_v 1432 1523 ENDIF 1433 1524 1434 ! 1435 !-- If the air is saturated, check the reservoir water level 1436 IF ( qsws_eb(j,i) < 0.0_wp ) THEN 1437 1438 ! 1439 !-- Check if reservoir is full (avoid values > m_liq_eb_max) 1440 !-- In that case, qsws_liq_eb goes to qsws_soil_eb. In this 1441 !-- case qsws_veg_eb is zero anyway (because c_liq = 1), 1442 !-- so that tend is zero and no further check is needed 1443 IF ( m_liq_eb(j,i) == m_liq_eb_max ) THEN 1444 qsws_soil_eb(j,i) = qsws_soil_eb(j,i) & 1445 + qsws_liq_eb(j,i) 1446 1447 qsws_liq_eb(j,i) = 0.0_wp 1448 ENDIF 1449 1450 ! 1451 !-- In case qsws_veg_eb becomes negative (unphysical behavior), 1452 !-- let the water enter the liquid water reservoir as dew on the 1453 !-- plant 1454 IF ( qsws_veg_eb(j,i) < 0.0_wp ) THEN 1455 qsws_liq_eb(j,i) = qsws_liq_eb(j,i) + qsws_veg_eb(j,i) 1456 qsws_veg_eb(j,i) = 0.0_wp 1457 ENDIF 1458 ENDIF 1459 1460 tend = - qsws_liq_eb(j,i) * drho_l_lv 1461 m_liq_eb_p(j,i) = m_liq_eb(j,i) + dt_3d * ( tsc(2) * tend & 1462 + tsc(3) * tm_liq_eb_m(j,i) ) 1463 1464 ! 1465 !-- Check if reservoir is overfull -> reduce to maximum 1466 !-- (conservation of water is violated here) 1467 m_liq_eb_p(j,i) = MIN(m_liq_eb_p(j,i),m_liq_eb_max) 1468 1469 ! 1470 !-- Check if reservoir is empty (avoid values < 0.0) 1471 !-- (conservation of water is violated here) 1472 m_liq_eb_p(j,i) = MAX(m_liq_eb_p(j,i),0.0_wp) 1473 1474 1475 ! 1476 !-- Calculate m_liq_eb tendencies for the next Runge-Kutta step 1477 IF ( timestep_scheme(1:5) == 'runge' ) THEN 1478 IF ( intermediate_timestep_count == 1 ) THEN 1479 tm_liq_eb_m(j,i) = tend 1480 ELSEIF ( intermediate_timestep_count < & 1481 intermediate_timestep_count_max ) THEN 1482 tm_liq_eb_m(j,i) = -9.5625_wp * tend + 5.3125_wp & 1483 * tm_liq_eb_m(j,i) 1484 ENDIF 1525 !-- Add precipitation to bare soil according to the bare soil 1526 !-- coverage. 1527 surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m) + ( 1.0_wp & 1528 - surf%c_veg(m) ) * prr(k+k_off,j+j_off,i+i_off)& 1529 * hyrho(k+k_off) & 1530 * 0.001_wp * rho_l * l_v 1531 ENDIF 1532 1533 ! 1534 !-- If the air is saturated, check the reservoir water level 1535 IF ( surf%qsws_eb(m) < 0.0_wp ) THEN 1536 ! 1537 !-- Check if reservoir is full (avoid values > m_liq_eb_max) 1538 !-- In that case, qsws_liq_eb goes to qsws_soil_eb. In this 1539 !-- case qsws_veg_eb is zero anyway (because c_liq = 1), 1540 !-- so that tend is zero and no further check is needed 1541 IF ( surf_m_liq_eb%var_1d(m) == m_liq_eb_max ) THEN 1542 surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m) + surf%qsws_liq_eb(m) 1543 1544 surf%qsws_liq_eb(m) = 0.0_wp 1485 1545 ENDIF 1486 1546 1487 ENDIF 1488 1489 ENDDO 1547 ! 1548 !-- In case qsws_veg_eb becomes negative (unphysical behavior), 1549 !-- let the water enter the liquid water reservoir as dew on the 1550 !-- plant 1551 IF ( surf%qsws_veg_eb(m) < 0.0_wp ) THEN 1552 surf%qsws_liq_eb(m) = surf%qsws_liq_eb(m) + surf%qsws_veg_eb(m) 1553 surf%qsws_veg_eb(m) = 0.0_wp 1554 ENDIF 1555 ENDIF 1556 1557 tend = - surf%qsws_liq_eb(m) * drho_l_lv 1558 surf_m_liq_eb_p%var_1d(m) = surf_m_liq_eb%var_1d(m) + dt_3d * & 1559 ( tsc(2) * tend + & 1560 tsc(3) * surf_tm_liq_eb_m%var_1d(m) ) 1561 ! 1562 !-- Check if reservoir is overfull -> reduce to maximum 1563 !-- (conservation of water is violated here) 1564 surf_m_liq_eb_p%var_1d(m) = MIN( surf_m_liq_eb_p%var_1d(m),m_liq_eb_max ) 1565 1566 ! 1567 !-- Check if reservoir is empty (avoid values < 0.0) 1568 !-- (conservation of water is violated here) 1569 surf_m_liq_eb_p%var_1d(m) = MAX( surf_m_liq_eb_p%var_1d(m), 0.0_wp ) 1570 ! 1571 !-- Calculate m_liq_eb tendencies for the next Runge-Kutta step 1572 IF ( timestep_scheme(1:5) == 'runge' ) THEN 1573 IF ( intermediate_timestep_count == 1 ) THEN 1574 surf_tm_liq_eb_m%var_1d(m) = tend 1575 ELSEIF ( intermediate_timestep_count < & 1576 intermediate_timestep_count_max ) THEN 1577 surf_tm_liq_eb_m%var_1d(m) = -9.5625_wp * tend + & 1578 5.3125_wp * surf_tm_liq_eb_m%var_1d(m) 1579 ENDIF 1580 ENDIF 1581 1582 ENDIF 1583 1490 1584 ENDDO 1491 1585 … … 1497 1591 #if defined( __parallel ) 1498 1592 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr ) 1499 CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call, &1593 CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call, & 1500 1594 1, MPI_LOGICAL, MPI_LOR, comm2d, ierr ) 1501 1595 #else … … 1513 1607 ! 1514 1608 !-- Calculate new roughness lengths (for water surfaces only) 1515 CALL calc_z0_water_surface 1609 IF ( horizontal ) CALL calc_z0_water_surface 1610 1611 CONTAINS 1612 !------------------------------------------------------------------------------! 1613 ! Description: 1614 ! ------------ 1615 !> Calculation of specific humidity of the skin layer (surface). It is assumend 1616 !> that the skin is always saturated. 1617 !------------------------------------------------------------------------------! 1618 SUBROUTINE calc_q_surface 1619 1620 IMPLICIT NONE 1621 1622 REAL(wp) :: resistance !< aerodynamic and soil resistance term 1623 1624 DO m = 1, surf%ns 1625 1626 i = surf%i(m) 1627 j = surf%j(m) 1628 k = surf%k(m) 1629 1630 ! 1631 !-- Calculate water vapour pressure at saturation 1632 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * & 1633 ( surf_t_surface_p%var_1d(m) - 273.16_wp ) / & 1634 ( surf_t_surface_p%var_1d(m) - 35.86_wp ) & 1635 ) 1636 1637 ! 1638 !-- Calculate specific humidity at saturation 1639 q_s = 0.622_wp * e_s / surface_pressure 1640 1641 resistance = surf%r_a(m) / ( surf%r_a(m) + surf%r_s(m) ) 1642 1643 ! 1644 !-- Calculate specific humidity at surface 1645 IF ( cloud_physics ) THEN 1646 q(k+k_off,j+j_off,i+i_off) = resistance * q_s + & 1647 ( 1.0_wp - resistance ) * & 1648 ( q(k,j,i) - ql(k,j,i) ) 1649 ELSE 1650 q(k+k_off,j+j_off,i+i_off) = resistance * q_s + & 1651 ( 1.0_wp - resistance ) * & 1652 q(k,j,i) 1653 ENDIF 1654 1655 ! 1656 !-- Update virtual potential temperature 1657 vpt(k+k_off,j+j_off,i+i_off) = pt(k+k_off,j+j_off,i+i_off) * & 1658 ( 1.0_wp + 0.61_wp * q(k+k_off,j+j_off,i+i_off) ) 1659 1660 ENDDO 1661 1662 END SUBROUTINE calc_q_surface 1663 1516 1664 1517 1665 … … 1607 1755 IMPLICIT NONE 1608 1756 1609 INTEGER(iwp) :: i !< running index 1610 INTEGER(iwp) :: j !< running index 1611 INTEGER(iwp) :: k !< running index 1757 INTEGER(iwp) :: i !< running index 1758 INTEGER(iwp) :: i_off !< index offset of surface element, seen from atmospheric grid point 1759 INTEGER(iwp) :: j !< running index 1760 INTEGER(iwp) :: j_off !< index offset of surface element, seen from atmospheric grid point 1761 INTEGER(iwp) :: k !< running index 1762 INTEGER(iwp) :: l !< running index surface facing 1763 INTEGER(iwp) :: m !< running index 1612 1764 1613 1765 REAL(wp) :: pt1 !< potential temperature at first grid level 1614 1615 1766 1616 1767 ! 1617 1768 !-- Calculate Exner function 1618 1769 exn = ( surface_pressure / 1000.0_wp )**0.286_wp 1619 1620 1621 1770 ! 1622 1771 !-- If no cloud physics is used, rho_surface has not been calculated before … … 1634 1783 ! 1635 1784 !-- Set inital values for prognostic quantities 1636 tt_surface_m = 0.0_wp 1637 tt_soil_m = 0.0_wp 1638 tm_soil_m = 0.0_wp 1639 tm_liq_eb_m = 0.0_wp 1640 c_liq = 0.0_wp 1641 1642 ghf_eb = 0.0_wp 1643 shf_eb = rho_cp * shf 1785 !-- Horizontal surfaces 1786 tt_surface_h_m%var_1d = 0.0_wp 1787 tt_soil_h_m%var_2d = 0.0_wp 1788 tm_soil_h_m%var_2d = 0.0_wp 1789 tm_liq_eb_h_m%var_1d = 0.0_wp 1790 surf_lsm_h%c_liq = 0.0_wp 1791 1792 surf_lsm_h%ghf_eb = 0.0_wp 1793 surf_lsm_h%shf_eb = rho_cp * surf_lsm_h%shf 1644 1794 1645 1795 IF ( humidity ) THEN 1646 qsws_eb = rho_lv *qsws1796 surf_lsm_h%qsws_eb = rho_lv * surf_lsm_h%qsws 1647 1797 ELSE 1648 qsws_eb = 0.0_wp 1649 ENDIF 1650 1651 qsws_liq_eb = 0.0_wp 1652 qsws_soil_eb = 0.0_wp 1653 qsws_veg_eb = 0.0_wp 1654 1655 r_a = 50.0_wp 1656 r_s = 50.0_wp 1657 r_canopy = 0.0_wp 1658 r_soil = 0.0_wp 1798 surf_lsm_h%qsws_eb = 0.0_wp 1799 ENDIF 1800 1801 surf_lsm_h%qsws_liq_eb = 0.0_wp 1802 surf_lsm_h%qsws_soil_eb = 0.0_wp 1803 surf_lsm_h%qsws_veg_eb = 0.0_wp 1804 1805 surf_lsm_h%r_a = 50.0_wp 1806 surf_lsm_h%r_s = 50.0_wp 1807 surf_lsm_h%r_canopy = 0.0_wp 1808 surf_lsm_h%r_soil = 0.0_wp 1809 ! 1810 !-- Do the same for vertical surfaces 1811 DO l = 0, 3 1812 tt_surface_v_m(l)%var_1d = 0.0_wp 1813 tt_soil_v_m(l)%var_2d = 0.0_wp 1814 tm_soil_v_m(l)%var_2d = 0.0_wp 1815 tm_liq_eb_v_m(l)%var_1d = 0.0_wp 1816 surf_lsm_v(l)%c_liq = 0.0_wp 1817 1818 surf_lsm_v(l)%ghf_eb = 0.0_wp 1819 surf_lsm_v(l)%shf_eb = rho_cp * surf_lsm_v(l)%shf 1820 1821 IF ( humidity ) THEN 1822 surf_lsm_v(l)%qsws_eb = rho_lv * surf_lsm_v(l)%qsws 1823 ELSE 1824 surf_lsm_v(l)%qsws_eb = 0.0_wp 1825 ENDIF 1826 1827 surf_lsm_v(l)%qsws_liq_eb = 0.0_wp 1828 surf_lsm_v(l)%qsws_soil_eb = 0.0_wp 1829 surf_lsm_v(l)%qsws_veg_eb = 0.0_wp 1830 1831 surf_lsm_v(l)%r_a = 50.0_wp 1832 surf_lsm_v(l)%r_s = 50.0_wp 1833 surf_lsm_v(l)%r_canopy = 0.0_wp 1834 surf_lsm_v(l)%r_soil = 0.0_wp 1835 ENDDO 1659 1836 1660 1837 ! 1661 1838 !-- Allocate 3D soil model arrays 1662 ALLOCATE ( root_fr(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1663 ALLOCATE ( lambda_h(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1664 ALLOCATE ( rho_c_total(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1665 1666 lambda_h = 0.0_wp 1839 !-- First, for horizontal surfaces 1840 ALLOCATE ( surf_lsm_h%root_fr(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 1841 ALLOCATE ( surf_lsm_h%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 1842 ALLOCATE ( surf_lsm_h%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 1843 1844 surf_lsm_h%lambda_h = 0.0_wp 1667 1845 ! 1668 1846 !-- If required, allocate humidity-related variables for the soil model 1669 1847 IF ( humidity ) THEN 1670 ALLOCATE ( lambda_w(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1671 ALLOCATE ( gamma_w(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1672 1673 lambda_w = 0.0_wp 1674 ENDIF 1848 ALLOCATE ( surf_lsm_h%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 1849 ALLOCATE ( surf_lsm_h%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 1850 1851 surf_lsm_h%lambda_w = 0.0_wp 1852 ENDIF 1853 ! 1854 !-- For vertical surfaces 1855 DO l = 0, 3 1856 ALLOCATE ( surf_lsm_v(l)%root_fr(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 1857 ALLOCATE ( surf_lsm_v(l)%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 1858 ALLOCATE ( surf_lsm_v(l)%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 1859 1860 surf_lsm_v(l)%lambda_h = 0.0_wp 1861 ! 1862 !-- If required, allocate humidity-related variables for the soil model 1863 IF ( humidity ) THEN 1864 ALLOCATE ( surf_lsm_v(l)%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 1865 ALLOCATE ( surf_lsm_v(l)%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 1866 1867 surf_lsm_v(l)%lambda_w = 0.0_wp 1868 ENDIF 1869 ENDDO 1675 1870 1676 1871 ! … … 1735 1930 ! 1736 1931 !-- Map values to the respective 2D arrays 1737 alpha_vg = alpha_vangenuchten 1738 l_vg = l_vangenuchten 1739 n_vg = n_vangenuchten 1740 gamma_w_sat = hydraulic_conductivity 1741 m_sat = saturation_moisture 1742 m_fc = field_capacity 1743 m_wilt = wilting_point 1744 m_res = residual_moisture 1745 r_soil_min = min_soil_resistance 1932 !-- Horizontal surfaces 1933 surf_lsm_h%alpha_vg = alpha_vangenuchten 1934 surf_lsm_h%l_vg = l_vangenuchten 1935 surf_lsm_h%n_vg = n_vangenuchten 1936 surf_lsm_h%gamma_w_sat = hydraulic_conductivity 1937 surf_lsm_h%m_sat = saturation_moisture 1938 surf_lsm_h%m_fc = field_capacity 1939 surf_lsm_h%m_wilt = wilting_point 1940 surf_lsm_h%m_res = residual_moisture 1941 surf_lsm_h%r_soil_min = min_soil_resistance 1942 ! 1943 !-- Vertical surfaces 1944 DO l = 0, 3 1945 surf_lsm_v(l)%alpha_vg = alpha_vangenuchten 1946 surf_lsm_v(l)%l_vg = l_vangenuchten 1947 surf_lsm_v(l)%n_vg = n_vangenuchten 1948 surf_lsm_v(l)%gamma_w_sat = hydraulic_conductivity 1949 surf_lsm_v(l)%m_sat = saturation_moisture 1950 surf_lsm_v(l)%m_fc = field_capacity 1951 surf_lsm_v(l)%m_wilt = wilting_point 1952 surf_lsm_v(l)%m_res = residual_moisture 1953 surf_lsm_v(l)%r_soil_min = min_soil_resistance 1954 ENDDO 1955 1956 1746 1957 1747 1958 ! 1748 1959 !-- Initial run actions 1749 1960 IF ( TRIM( initializing_actions ) /= 'read_restart_data' ) THEN 1750 1751 t_soil = 0.0_wp 1752 m_liq_eb = 0.0_wp 1753 m_soil = 0.0_wp 1961 ! 1962 !-- First, for horizontal surfaces 1963 t_soil_h%var_2d = 0.0_wp 1964 m_soil_h%var_2d = 0.0_wp 1965 m_liq_eb_h%var_1d = 0.0_wp 1754 1966 1755 1967 ! … … 1758 1970 !-- wilting point) -> problems with devision by zero) 1759 1971 DO k = nzb_soil, nzt_soil 1760 t_soil (k,:,:)= soil_temperature(k)1761 m_soil (k,:,:) = MAX(soil_moisture(k),m_wilt(:,:))1972 t_soil_h%var_2d(k,:) = soil_temperature(k) 1973 m_soil_h%var_2d(k,:) = MAX(soil_moisture(k),surf_lsm_h%m_wilt(:)) 1762 1974 soil_moisture(k) = MAX(soil_moisture(k),wilting_point) 1763 1975 ENDDO 1764 t_soil (nzt_soil+1,:,:) = soil_temperature(nzt_soil+1)1976 t_soil_h%var_2d(nzt_soil+1,:) = soil_temperature(nzt_soil+1) 1765 1977 1766 1978 ! 1767 1979 !-- Calculate surface temperature 1768 t_surface = pt_surface * exn 1980 t_surface_h%var_1d(:) = pt_surface * exn 1981 surf_lsm_h%pt_surface(:) = pt_surface 1769 1982 1770 1983 ! 1771 1984 !-- Set artifical values for ts and us so that r_a has its initial value 1772 !-- for the first time step 1773 DO i = nxlg, nxrg 1774 DO j = nysg, nyng 1775 k = nzb_s_inner(j,i) 1985 !-- for the first time step. Only for interior core domain, not for ghost points 1986 DO m = 1, surf_lsm_h%ns 1987 i = surf_lsm_h%i(m) 1988 j = surf_lsm_h%j(m) 1989 k = surf_lsm_h%k(m) 1990 1991 IF ( cloud_physics ) THEN 1992 pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i) 1993 ELSE 1994 pt1 = pt(k,j,i) 1995 ENDIF 1996 1997 ! 1998 !-- Assure that r_a cannot be zero at model start 1999 IF ( pt1 == surf_lsm_h%pt_surface(m) ) pt1 = pt1 + 1.0E-10_wp 2000 2001 surf_lsm_h%us(m) = 0.1_wp 2002 surf_lsm_h%ts(m) = ( pt1 - surf_lsm_h%pt_surface(m) ) / surf_lsm_h%r_a(m) 2003 surf_lsm_h%shf(m) = - surf_lsm_h%us(m) * surf_lsm_h%ts(m) 2004 ENDDO 2005 ! 2006 !-- Vertical surfaces 2007 DO l = 0, 3 2008 2009 t_soil_v(l)%var_2d = 0.0_wp 2010 m_soil_v(l)%var_2d = 0.0_wp 2011 m_liq_eb_v(l)%var_1d = 0.0_wp 2012 2013 ! 2014 !-- Map user settings of T and q for each soil layer 2015 !-- (make sure that the soil moisture does not drop below the permanent 2016 !-- wilting point) -> problems with devision by zero) 2017 DO k = nzb_soil, nzt_soil 2018 t_soil_v(l)%var_2d(k,:) = soil_temperature(k) 2019 m_soil_v(l)%var_2d(k,:) = MAX(soil_moisture(k),surf_lsm_v(l)%m_wilt(:)) 2020 soil_moisture(k) = MAX(soil_moisture(k),wilting_point) 2021 ENDDO 2022 t_soil_v(l)%var_2d(nzt_soil+1,:) = soil_temperature(nzt_soil+1) 2023 2024 ! 2025 !-- Calculate surface temperature 2026 t_surface_v(l)%var_1d(:) = pt_surface * exn 2027 surf_lsm_h%pt_surface(:) = pt_surface 2028 2029 ! 2030 !-- Set artifical values for ts and us so that r_a has its initial value 2031 !-- for the first time step. Only for interior core domain, not for ghost points 2032 DO m = 1, surf_lsm_v(l)%ns 2033 i = surf_lsm_v(l)%i(m) 2034 j = surf_lsm_v(l)%j(m) 2035 k = surf_lsm_v(l)%k(m) 1776 2036 1777 2037 IF ( cloud_physics ) THEN 1778 pt1 = pt(k +1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i)2038 pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i) 1779 2039 ELSE 1780 pt1 = pt(k +1,j,i)2040 pt1 = pt(k,j,i) 1781 2041 ENDIF 1782 2042 1783 2043 ! 1784 2044 !-- Assure that r_a cannot be zero at model start 1785 IF ( pt1 == pt(k,j,i) ) pt1 = pt1 + 1.0E-10_wp1786 1787 us(j,i)= 0.1_wp1788 ts(j,i) = (pt1 - pt(k,j,i)) / r_a(j,i)1789 s hf(j,i) = - us(j,i) * ts(j,i)2045 IF ( pt1 == surf_lsm_h%pt_surface(m) ) pt1 = pt1 + 1.0E-10_wp 2046 2047 surf_lsm_v(l)%us(m) = 0.1_wp 2048 surf_lsm_v(l)%ts(m) = ( pt1 - surf_lsm_h%pt_surface(m) ) / surf_lsm_v(l)%r_a(m) 2049 surf_lsm_v(l)%shf(m) = - surf_lsm_v(l)%us(m) * surf_lsm_v(l)%ts(m) 1790 2050 ENDDO 1791 2051 ENDDO … … 1794 2054 !-- Actions for restart runs 1795 2055 ELSE 1796 1797 DO i = nxlg, nxrg 1798 DO j = nysg, nyng 1799 k = nzb_s_inner(j,i) 1800 t_surface(j,i) = pt(k,j,i) * exn 1801 ENDDO 2056 ! 2057 !-- Horizontal surfaces 2058 DO m = 1, surf_lsm_h%ns 2059 i = surf_lsm_h%i(m) 2060 j = surf_lsm_h%j(m) 2061 k = surf_lsm_h%k(m) 2062 t_surface_h%var_1d(m) = pt(k-1,j,i) * exn 1802 2063 ENDDO 1803 1804 ENDIF 1805 1806 DO k = nzb_soil, nzt_soil 1807 root_fr(k,:,:) = root_fraction(k) 2064 ! 2065 !-- Vertical surfaces 2066 DO l = 0, 3 2067 ! 2068 !-- Set index offset of surface element, seen from atmospheric grid point 2069 IF ( l == 0 ) THEN 2070 j_off = -1 2071 i_off = 0 2072 ELSEIF ( l == 1 ) THEN 2073 j_off = 1 2074 i_off = 0 2075 ELSEIF ( l == 2 ) THEN 2076 j_off = 0 2077 i_off = -1 2078 ELSEIF ( l == 3 ) THEN 2079 j_off = 0 2080 i_off = 1 2081 ENDIF 2082 DO m = 1, surf_lsm_v(l)%ns 2083 i = surf_lsm_v(l)%i(m) 2084 j = surf_lsm_v(l)%j(m) 2085 k = surf_lsm_v(l)%k(m) 2086 t_surface_v(l)%var_1d(m) = pt(k,j+j_off,i+i_off) * exn 2087 ENDDO 2088 ENDDO 2089 2090 ENDIF 2091 ! 2092 !-- Initialize root fraction 2093 !-- Horizontal surfaces 2094 DO m = 1, surf_lsm_h%ns 2095 i = surf_lsm_h%i(m) 2096 j = surf_lsm_h%j(m) 2097 2098 DO k = nzb_soil, nzt_soil 2099 surf_lsm_h%root_fr(k,m) = root_fraction(k) 2100 ENDDO 2101 ENDDO 2102 ! 2103 !-- Vertical surfaces 2104 DO l = 0, 3 2105 DO m = 1, surf_lsm_v(l)%ns 2106 i = surf_lsm_v(l)%i(m) 2107 j = surf_lsm_v(l)%j(m) 2108 2109 DO k = nzb_soil, nzt_soil 2110 surf_lsm_v(l)%root_fr(k,m) = root_fraction(k) 2111 ENDDO 2112 ENDDO 1808 2113 ENDDO 1809 2114 … … 1843 2148 1844 2149 IF ( ANY( root_fraction == 9999999.9_wp ) ) THEN 1845 DO k = nzb_soil, nzt_soil 1846 root_fr(k,:,:) = root_distribution(k,veg_type) 1847 root_fraction(k) = root_distribution(k,veg_type) 2150 DO m = 1, surf_lsm_h%ns 2151 i = surf_lsm_h%i(m) 2152 j = surf_lsm_h%j(m) 2153 2154 DO k = nzb_soil, nzt_soil 2155 surf_lsm_h%root_fr(k,m) = root_distribution(k,veg_type) 2156 root_fraction(k) = root_distribution(k,veg_type) 2157 ENDDO 2158 ENDDO 2159 DO l = 0, 3 2160 DO m = 1, surf_lsm_v(l)%ns 2161 i = surf_lsm_v(l)%i(m) 2162 j = surf_lsm_v(l)%j(m) 2163 2164 DO k = nzb_soil, nzt_soil 2165 surf_lsm_v(l)%root_fr(k,m) = root_distribution(k,veg_type) 2166 root_fraction(k) = root_distribution(k,veg_type) 2167 ENDDO 2168 ENDDO 1848 2169 ENDDO 1849 2170 ENDIF … … 1877 2198 !-- Map vegetation and soil types to 2D array to allow for heterogeneous 1878 2199 !-- surfaces via user interface see below 1879 veg_type_2d = veg_type 1880 soil_type_2d = soil_type 2200 !-- First for horizontal surfaces 2201 surf_lsm_h%veg_type_2d = veg_type 2202 surf_lsm_h%soil_type_2d = soil_type 1881 2203 1882 2204 ! 1883 2205 !-- Map vegetation parameters to the respective 2D arrays 1884 r_canopy_min = min_canopy_resistance 1885 lai = leaf_area_index 1886 c_veg = vegetation_coverage 1887 g_d = canopy_resistance_coefficient 1888 lambda_surface_s = lambda_surface_stable 1889 lambda_surface_u = lambda_surface_unstable 1890 f_sw_in = f_shortwave_incoming 1891 z0 = z0_eb 1892 z0h = z0h_eb 1893 z0q = z0q_eb 2206 surf_lsm_h%r_canopy_min = min_canopy_resistance 2207 surf_lsm_h%lai = leaf_area_index 2208 surf_lsm_h%c_veg = vegetation_coverage 2209 surf_lsm_h%g_d = canopy_resistance_coefficient 2210 surf_lsm_h%lambda_surface_s = lambda_surface_stable 2211 surf_lsm_h%lambda_surface_u = lambda_surface_unstable 2212 surf_lsm_h%f_sw_in = f_shortwave_incoming 2213 surf_lsm_h%z0 = z0_eb 2214 surf_lsm_h%z0h = z0h_eb 2215 surf_lsm_h%z0q = z0q_eb 2216 2217 !-- Vertical surfaces 2218 DO l = 0, 3 2219 surf_lsm_v(l)%veg_type_2d = veg_type 2220 surf_lsm_v(l)%soil_type_2d = soil_type 2221 2222 ! 2223 !-- Map vegetation parameters to the respective 2D arrays 2224 surf_lsm_v(l)%r_canopy_min = min_canopy_resistance 2225 surf_lsm_v(l)%lai = leaf_area_index 2226 surf_lsm_v(l)%c_veg = vegetation_coverage 2227 surf_lsm_v(l)%g_d = canopy_resistance_coefficient 2228 surf_lsm_v(l)%lambda_surface_s = lambda_surface_stable 2229 surf_lsm_v(l)%lambda_surface_u = lambda_surface_unstable 2230 surf_lsm_v(l)%f_sw_in = f_shortwave_incoming 2231 surf_lsm_v(l)%z0 = z0_eb 2232 surf_lsm_v(l)%z0h = z0h_eb 2233 surf_lsm_v(l)%z0q = z0q_eb 2234 ENDDO 1894 2235 1895 2236 ! … … 1900 2241 !-- Set flag parameter if vegetation type was set to a water surface. Also 1901 2242 !-- set temperature to a constant value in all "soil" layers. 1902 DO i = nxlg, nxrg 1903 DO j = nysg, nyng 1904 IF ( veg_type_2d(j,i) == 14 .OR. veg_type_2d(j,i) == 15 ) THEN 1905 water_surface(j,i) = .TRUE. 1906 t_soil(:,j,i) = t_surface(j,i) 1907 ELSEIF ( veg_type_2d(j,i) == 20 ) THEN 1908 pave_surface(j,i) = .TRUE. 1909 m_soil(:,j,i) = 0.0_wp 1910 ENDIF 1911 1912 ENDDO 2243 !-- For now, do not set water surface for vertical surfaces 2244 DO m = 1, surf_lsm_h%ns 2245 i = surf_lsm_h%i(m) 2246 j = surf_lsm_h%j(m) 2247 2248 IF ( surf_lsm_h%veg_type_2d(m) == 14 .OR. & 2249 surf_lsm_h%veg_type_2d(m) == 15 ) THEN 2250 surf_lsm_h%water_surface(m) = .TRUE. 2251 t_soil_h%var_2d(:,m) = t_surface_h%var_1d(m) 2252 ELSEIF ( surf_lsm_h%veg_type_2d(m) == 20 ) THEN 2253 surf_lsm_h%pave_surface(m) = .TRUE. 2254 m_soil_h%var_2d(:,m) = 0.0_wp 2255 ENDIF 2256 1913 2257 ENDDO 1914 2258 1915 2259 ! 1916 !-- Calculate new roughness lengths (for water surfaces only) 2260 !-- Calculate new roughness lengths (for water surfaces only, i.e. only 2261 !- horizontal surfaces) 1917 2262 CALL calc_z0_water_surface 1918 2263 1919 t_soil_p = t_soil 1920 m_soil_p = m_soil 1921 m_liq_eb_p = m_liq_eb 1922 t_surface_p = t_surface 2264 t_soil_h_p = t_soil_h 2265 m_soil_h_p = m_soil_h 2266 m_liq_eb_h_p = m_liq_eb_h 2267 t_surface_h_p = t_surface_h 2268 2269 t_soil_v_p = t_soil_v 2270 m_soil_v_p = m_soil_v 2271 m_liq_eb_v_p = m_liq_eb_v 2272 t_surface_v_p = t_surface_v 1923 2273 1924 2274 … … 1926 2276 !-- Store initial profiles of t_soil and m_soil (assuming they are 1927 2277 !-- horizontally homogeneous on this PE) 1928 hom(nzb_soil:nzt_soil,1,90,:) = SPREAD( t_soil(nzb_soil:nzt_soil, & 1929 nysg,nxlg), 2, & 1930 statistic_regions+1 ) 1931 hom(nzb_soil:nzt_soil,1,92,:) = SPREAD( m_soil(nzb_soil:nzt_soil, & 1932 nysg,nxlg), 2, & 1933 statistic_regions+1 ) 2278 hom(nzb_soil:nzt_soil,1,90,:) = SPREAD( t_soil_h%var_2d(nzb_soil:nzt_soil,1), & 2279 2, statistic_regions+1 ) 2280 hom(nzb_soil:nzt_soil,1,92,:) = SPREAD( m_soil_h%var_2d(nzb_soil:nzt_soil,1), & 2281 2, statistic_regions+1 ) 1934 2282 1935 2283 END SUBROUTINE lsm_init … … 1946 2294 IMPLICIT NONE 1947 2295 1948 ! 1949 !-- Allocate surface and soil temperature / humidity 2296 INTEGER(iwp) :: l !< index indicating facing of surface array 2297 2298 ! 2299 !-- Allocate surface and soil temperature / humidity. Please note, 2300 !-- these arrays are allocated according to surface-data structure, 2301 !-- even if they do not belong to the data type due to the 2302 !-- pointer arithmetric (TARGET attribute is not allowed in a data-type). 1950 2303 #if defined( __nopointer ) 1951 ALLOCATE ( m_liq_eb(nysg:nyng,nxlg:nxrg) ) 1952 ALLOCATE ( m_liq_eb_p(nysg:nyng,nxlg:nxrg) ) 1953 ALLOCATE ( m_soil(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1954 ALLOCATE ( m_soil_p(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1955 ALLOCATE ( t_surface(nysg:nyng,nxlg:nxrg) ) 1956 ALLOCATE ( t_surface_p(nysg:nyng,nxlg:nxrg) ) 1957 ALLOCATE ( t_soil(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) ) 1958 ALLOCATE ( t_soil_p(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) ) 2304 ! 2305 !-- Horizontal surfaces 2306 ALLOCATE ( m_liq_eb_h%var_1d(1:surf_lsm_h%ns) ) 2307 ALLOCATE ( m_liq_eb_h_p%var_1d(1:surf_lsm_h%ns) ) 2308 ALLOCATE ( t_surface_h%var_1d(1:surf_lsm_h%ns) ) 2309 ALLOCATE ( t_surface_h_p%var_1d(1:surf_lsm_h%ns) ) 2310 ALLOCATE ( m_soil_h%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2311 ALLOCATE ( m_soil_h_p%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2312 ALLOCATE ( t_soil_h%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) ) 2313 ALLOCATE ( t_soil_h_p%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) ) 2314 ! 2315 !-- Vertical surfaces 2316 DO l = 0, 3 2317 ALLOCATE ( m_liq_eb_v(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2318 ALLOCATE ( m_liq_eb_v(l)_p%var_1d(1:surf_lsm_v(l)%ns) ) 2319 ALLOCATE ( t_surface_v(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2320 ALLOCATE ( t_surface_v(l)_p%var_1d(1:surf_lsm_v(l)%ns) ) 2321 ALLOCATE ( m_soil_v(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2322 ALLOCATE ( m_soil_v(l)_p%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2323 ALLOCATE ( t_soil_v(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) ) 2324 ALLOCATE ( t_soil_v(l)_p%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) ) 2325 ENDDO 1959 2326 #else 1960 ALLOCATE ( m_liq_eb_1(nysg:nyng,nxlg:nxrg) ) 1961 ALLOCATE ( m_liq_eb_2(nysg:nyng,nxlg:nxrg) ) 1962 ALLOCATE ( m_soil_1(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1963 ALLOCATE ( m_soil_2(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1964 ALLOCATE ( t_surface_1(nysg:nyng,nxlg:nxrg) ) 1965 ALLOCATE ( t_surface_2(nysg:nyng,nxlg:nxrg) ) 1966 ALLOCATE ( t_soil_1(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) ) 1967 ALLOCATE ( t_soil_2(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) ) 2327 ! 2328 !-- Horizontal surfaces 2329 ALLOCATE ( m_liq_eb_h_1%var_1d(1:surf_lsm_h%ns) ) 2330 ALLOCATE ( m_liq_eb_h_2%var_1d(1:surf_lsm_h%ns) ) 2331 ALLOCATE ( t_surface_h_1%var_1d(1:surf_lsm_h%ns) ) 2332 ALLOCATE ( t_surface_h_2%var_1d(1:surf_lsm_h%ns) ) 2333 ALLOCATE ( m_soil_h_1%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2334 ALLOCATE ( m_soil_h_2%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2335 ALLOCATE ( t_soil_h_1%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) ) 2336 ALLOCATE ( t_soil_h_2%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) ) 2337 ! 2338 !-- Vertical surfaces 2339 DO l = 0, 3 2340 ALLOCATE ( m_liq_eb_v_1(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2341 ALLOCATE ( m_liq_eb_v_2(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2342 ALLOCATE ( t_surface_v_1(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2343 ALLOCATE ( t_surface_v_2(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2344 ALLOCATE ( m_soil_v_1(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2345 ALLOCATE ( m_soil_v_2(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2346 ALLOCATE ( t_soil_v_1(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) ) 2347 ALLOCATE ( t_soil_v_2(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) ) 2348 ENDDO 1968 2349 #endif 1969 2350 1970 2351 ! 1971 2352 !-- Allocate intermediate timestep arrays 1972 ALLOCATE ( tm_liq_eb_m(nysg:nyng,nxlg:nxrg) ) 1973 ALLOCATE ( tm_soil_m(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 1974 ALLOCATE ( tt_surface_m(nysg:nyng,nxlg:nxrg) ) 1975 ALLOCATE ( tt_soil_m(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) ) 2353 !-- Horizontal surfaces 2354 ALLOCATE ( tm_liq_eb_h_m%var_1d(1:surf_lsm_h%ns) ) 2355 ALLOCATE ( tt_surface_h_m%var_1d(1:surf_lsm_h%ns) ) 2356 ALLOCATE ( tm_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2357 ALLOCATE ( tt_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ) 2358 ! 2359 !-- Horizontal surfaces 2360 DO l = 0, 3 2361 ALLOCATE ( tm_liq_eb_v_m(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2362 ALLOCATE ( tt_surface_v_m(l)%var_1d(1:surf_lsm_v(l)%ns) ) 2363 ALLOCATE ( tm_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2364 ALLOCATE ( tt_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 2365 ENDDO 2366 ! 2367 !-- Allocate skin-surface temperature 2368 ALLOCATE ( surf_lsm_h%pt_surface(1:surf_lsm_h%ns) ) 2369 DO l = 0, 3 2370 ALLOCATE ( surf_lsm_v(l)%pt_surface(1:surf_lsm_v(l)%ns) ) 2371 ENDDO 1976 2372 1977 2373 ! 1978 2374 !-- Allocate 2D vegetation model arrays 1979 ALLOCATE ( alpha_vg(nysg:nyng,nxlg:nxrg) ) 1980 ALLOCATE ( building_surface(nysg:nyng,nxlg:nxrg) ) 1981 ALLOCATE ( c_liq(nysg:nyng,nxlg:nxrg) ) 1982 ALLOCATE ( c_veg(nysg:nyng,nxlg:nxrg) ) 1983 ALLOCATE ( f_sw_in(nysg:nyng,nxlg:nxrg) ) 1984 ALLOCATE ( ghf_eb(nysg:nyng,nxlg:nxrg) ) 1985 ALLOCATE ( gamma_w_sat(nysg:nyng,nxlg:nxrg) ) 1986 ALLOCATE ( g_d(nysg:nyng,nxlg:nxrg) ) 1987 ALLOCATE ( lai(nysg:nyng,nxlg:nxrg) ) 1988 ALLOCATE ( l_vg(nysg:nyng,nxlg:nxrg) ) 1989 ALLOCATE ( lambda_surface_u(nysg:nyng,nxlg:nxrg) ) 1990 ALLOCATE ( lambda_surface_s(nysg:nyng,nxlg:nxrg) ) 1991 ALLOCATE ( m_fc(nysg:nyng,nxlg:nxrg) ) 1992 ALLOCATE ( m_res(nysg:nyng,nxlg:nxrg) ) 1993 ALLOCATE ( m_sat(nysg:nyng,nxlg:nxrg) ) 1994 ALLOCATE ( m_wilt(nysg:nyng,nxlg:nxrg) ) 1995 ALLOCATE ( n_vg(nysg:nyng,nxlg:nxrg) ) 1996 ALLOCATE ( pave_surface(nysg:nyng,nxlg:nxrg) ) 1997 ALLOCATE ( qsws_eb(nysg:nyng,nxlg:nxrg) ) 1998 ALLOCATE ( qsws_soil_eb(nysg:nyng,nxlg:nxrg) ) 1999 ALLOCATE ( qsws_liq_eb(nysg:nyng,nxlg:nxrg) ) 2000 ALLOCATE ( qsws_veg_eb(nysg:nyng,nxlg:nxrg) ) 2001 ALLOCATE ( rad_net_l(nysg:nyng,nxlg:nxrg) ) 2002 ALLOCATE ( r_a(nysg:nyng,nxlg:nxrg) ) 2003 ALLOCATE ( r_canopy(nysg:nyng,nxlg:nxrg) ) 2004 ALLOCATE ( r_soil(nysg:nyng,nxlg:nxrg) ) 2005 ALLOCATE ( r_soil_min(nysg:nyng,nxlg:nxrg) ) 2006 ALLOCATE ( r_s(nysg:nyng,nxlg:nxrg) ) 2007 ALLOCATE ( r_canopy_min(nysg:nyng,nxlg:nxrg) ) 2008 ALLOCATE ( shf_eb(nysg:nyng,nxlg:nxrg) ) 2009 ALLOCATE ( soil_type_2d(nysg:nyng,nxlg:nxrg) ) 2010 ALLOCATE ( veg_type_2d(nysg:nyng,nxlg:nxrg) ) 2011 ALLOCATE ( water_surface(nysg:nyng,nxlg:nxrg) ) 2012 2013 water_surface = .FALSE. 2014 pave_surface = .FALSE. 2015 2375 !-- Horizontal surfaces 2376 ALLOCATE ( surf_lsm_h%alpha_vg(1:surf_lsm_h%ns) ) 2377 ALLOCATE ( surf_lsm_h%building_surface(1:surf_lsm_h%ns) ) 2378 ALLOCATE ( surf_lsm_h%c_liq(1:surf_lsm_h%ns) ) 2379 ALLOCATE ( surf_lsm_h%c_veg(1:surf_lsm_h%ns) ) 2380 ALLOCATE ( surf_lsm_h%f_sw_in(1:surf_lsm_h%ns) ) 2381 ALLOCATE ( surf_lsm_h%ghf_eb(1:surf_lsm_h%ns) ) 2382 ALLOCATE ( surf_lsm_h%gamma_w_sat(1:surf_lsm_h%ns) ) 2383 ALLOCATE ( surf_lsm_h%g_d(1:surf_lsm_h%ns) ) 2384 ALLOCATE ( surf_lsm_h%lai(1:surf_lsm_h%ns) ) 2385 ALLOCATE ( surf_lsm_h%l_vg(1:surf_lsm_h%ns) ) 2386 ALLOCATE ( surf_lsm_h%lambda_surface_u(1:surf_lsm_h%ns) ) 2387 ALLOCATE ( surf_lsm_h%lambda_surface_s(1:surf_lsm_h%ns) ) 2388 ALLOCATE ( surf_lsm_h%m_fc(1:surf_lsm_h%ns) ) 2389 ALLOCATE ( surf_lsm_h%m_res(1:surf_lsm_h%ns) ) 2390 ALLOCATE ( surf_lsm_h%m_sat(1:surf_lsm_h%ns) ) 2391 ALLOCATE ( surf_lsm_h%m_wilt(1:surf_lsm_h%ns) ) 2392 ALLOCATE ( surf_lsm_h%n_vg(1:surf_lsm_h%ns) ) 2393 ALLOCATE ( surf_lsm_h%pave_surface(1:surf_lsm_h%ns) ) 2394 ALLOCATE ( surf_lsm_h%qsws_eb(1:surf_lsm_h%ns) ) 2395 ALLOCATE ( surf_lsm_h%qsws_soil_eb(1:surf_lsm_h%ns) ) 2396 ALLOCATE ( surf_lsm_h%qsws_liq_eb(1:surf_lsm_h%ns) ) 2397 ALLOCATE ( surf_lsm_h%qsws_veg_eb(1:surf_lsm_h%ns) ) 2398 ALLOCATE ( surf_lsm_h%rad_net_l(1:surf_lsm_h%ns) ) 2399 ALLOCATE ( surf_lsm_h%r_a(1:surf_lsm_h%ns) ) 2400 ALLOCATE ( surf_lsm_h%r_canopy(1:surf_lsm_h%ns) ) 2401 ALLOCATE ( surf_lsm_h%r_soil(1:surf_lsm_h%ns) ) 2402 ALLOCATE ( surf_lsm_h%r_soil_min(1:surf_lsm_h%ns) ) 2403 ALLOCATE ( surf_lsm_h%r_s(1:surf_lsm_h%ns) ) 2404 ALLOCATE ( surf_lsm_h%r_canopy_min(1:surf_lsm_h%ns) ) 2405 ALLOCATE ( surf_lsm_h%shf_eb(1:surf_lsm_h%ns) ) 2406 ALLOCATE ( surf_lsm_h%soil_type_2d(1:surf_lsm_h%ns) ) 2407 ALLOCATE ( surf_lsm_h%veg_type_2d(1:surf_lsm_h%ns) ) 2408 ALLOCATE ( surf_lsm_h%water_surface(1:surf_lsm_h%ns) ) 2409 2410 surf_lsm_h%water_surface = .FALSE. 2411 surf_lsm_h%pave_surface = .FALSE. 2412 ! 2413 !-- Vertical surfaces 2414 DO l = 0, 3 2415 ALLOCATE ( surf_lsm_v(l)%alpha_vg(1:surf_lsm_v(l)%ns) ) 2416 ALLOCATE ( surf_lsm_v(l)%building_surface(1:surf_lsm_v(l)%ns) ) 2417 ALLOCATE ( surf_lsm_v(l)%c_liq(1:surf_lsm_v(l)%ns) ) 2418 ALLOCATE ( surf_lsm_v(l)%c_veg(1:surf_lsm_v(l)%ns) ) 2419 ALLOCATE ( surf_lsm_v(l)%f_sw_in(1:surf_lsm_v(l)%ns) ) 2420 ALLOCATE ( surf_lsm_v(l)%ghf_eb(1:surf_lsm_v(l)%ns) ) 2421 ALLOCATE ( surf_lsm_v(l)%gamma_w_sat(1:surf_lsm_v(l)%ns) ) 2422 ALLOCATE ( surf_lsm_v(l)%g_d(1:surf_lsm_v(l)%ns) ) 2423 ALLOCATE ( surf_lsm_v(l)%lai(1:surf_lsm_v(l)%ns) ) 2424 ALLOCATE ( surf_lsm_v(l)%l_vg(1:surf_lsm_v(l)%ns) ) 2425 ALLOCATE ( surf_lsm_v(l)%lambda_surface_u(1:surf_lsm_v(l)%ns) ) 2426 ALLOCATE ( surf_lsm_v(l)%lambda_surface_s(1:surf_lsm_v(l)%ns) ) 2427 ALLOCATE ( surf_lsm_v(l)%m_fc(1:surf_lsm_v(l)%ns) ) 2428 ALLOCATE ( surf_lsm_v(l)%m_res(1:surf_lsm_v(l)%ns) ) 2429 ALLOCATE ( surf_lsm_v(l)%m_sat(1:surf_lsm_v(l)%ns) ) 2430 ALLOCATE ( surf_lsm_v(l)%m_wilt(1:surf_lsm_v(l)%ns) ) 2431 ALLOCATE ( surf_lsm_v(l)%n_vg(1:surf_lsm_v(l)%ns) ) 2432 ALLOCATE ( surf_lsm_v(l)%pave_surface(1:surf_lsm_v(l)%ns) ) 2433 ALLOCATE ( surf_lsm_v(l)%qsws_eb(1:surf_lsm_v(l)%ns) ) 2434 ALLOCATE ( surf_lsm_v(l)%qsws_soil_eb(1:surf_lsm_v(l)%ns) ) 2435 ALLOCATE ( surf_lsm_v(l)%qsws_liq_eb(1:surf_lsm_v(l)%ns) ) 2436 ALLOCATE ( surf_lsm_v(l)%qsws_veg_eb(1:surf_lsm_v(l)%ns) ) 2437 ALLOCATE ( surf_lsm_v(l)%rad_net_l(1:surf_lsm_v(l)%ns) ) 2438 ALLOCATE ( surf_lsm_v(l)%r_a(1:surf_lsm_v(l)%ns) ) 2439 ALLOCATE ( surf_lsm_v(l)%r_canopy(1:surf_lsm_v(l)%ns) ) 2440 ALLOCATE ( surf_lsm_v(l)%r_soil(1:surf_lsm_v(l)%ns) ) 2441 ALLOCATE ( surf_lsm_v(l)%r_soil_min(1:surf_lsm_v(l)%ns) ) 2442 ALLOCATE ( surf_lsm_v(l)%r_s(1:surf_lsm_v(l)%ns) ) 2443 ALLOCATE ( surf_lsm_v(l)%r_canopy_min(1:surf_lsm_v(l)%ns) ) 2444 ALLOCATE ( surf_lsm_v(l)%shf_eb(1:surf_lsm_v(l)%ns) ) 2445 ALLOCATE ( surf_lsm_v(l)%soil_type_2d(1:surf_lsm_v(l)%ns) ) 2446 ALLOCATE ( surf_lsm_v(l)%veg_type_2d(1:surf_lsm_v(l)%ns) ) 2447 ALLOCATE ( surf_lsm_v(l)%water_surface(1:surf_lsm_v(l)%ns) ) 2448 2449 surf_lsm_v(l)%water_surface = .FALSE. 2450 surf_lsm_v(l)%pave_surface = .FALSE. 2451 ENDDO 2452 2016 2453 #if ! defined( __nopointer ) 2017 2454 ! 2018 2455 !-- Initial assignment of the pointers 2019 t_soil => t_soil_1; t_soil_p => t_soil_2 2020 t_surface => t_surface_1; t_surface_p => t_surface_2 2021 m_soil => m_soil_1; m_soil_p => m_soil_2 2022 m_liq_eb => m_liq_eb_1; m_liq_eb_p => m_liq_eb_2 2456 !-- Horizontal surfaces 2457 t_soil_h => t_soil_h_1; t_soil_h_p => t_soil_h_2 2458 t_surface_h => t_surface_h_1; t_surface_h_p => t_surface_h_2 2459 m_soil_h => m_soil_h_1; m_soil_h_p => m_soil_h_2 2460 m_liq_eb_h => m_liq_eb_h_1; m_liq_eb_h_p => m_liq_eb_h_2 2461 ! 2462 !-- Vertical surfaces 2463 t_soil_v => t_soil_v_1; t_soil_v_p => t_soil_v_2 2464 t_surface_v => t_surface_v_1; t_surface_v_p => t_surface_v_2 2465 m_soil_v => m_soil_v_1; m_soil_v_p => m_soil_v_2 2466 m_liq_eb_v => m_liq_eb_v_1; m_liq_eb_v_p => m_liq_eb_v_2 2023 2467 #endif 2024 2468 … … 2043 2487 conserve_water_content, & 2044 2488 f_shortwave_incoming, field_capacity, & 2045 hydraulic_conductivity, &2489 aero_resist_kray, hydraulic_conductivity, & 2046 2490 lambda_surface_stable, & 2047 2491 lambda_surface_unstable, leaf_area_index, & … … 2087 2531 !> temperature and water content. 2088 2532 !------------------------------------------------------------------------------! 2089 SUBROUTINE lsm_soil_model 2533 SUBROUTINE lsm_soil_model( horizontal, l ) 2090 2534 2091 2535 2092 2536 IMPLICIT NONE 2093 2537 2094 INTEGER(iwp) :: i !< running index 2095 INTEGER(iwp) :: j !< running index 2096 INTEGER(iwp) :: k !< running index 2097 2098 REAL(wp) :: h_vg !< Van Genuchten coef. h 2538 INTEGER(iwp) :: k !< running index 2539 INTEGER(iwp) :: l !< surface-data type index indication facing 2540 INTEGER(iwp) :: m !< running index 2541 2542 LOGICAL :: horizontal !< flag indication horizontal wall, required to set pointer accordingly 2543 2544 REAL(wp) :: h_vg !< Van Genuchten coef. h 2099 2545 2100 2546 REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: gamma_temp, & !< temp. gamma … … 2102 2548 tend !< tendency 2103 2549 2104 DO i = nxlg, nxrg 2105 DO j = nysg, nyng 2106 2107 IF ( pave_surface(j,i) ) THEN 2108 rho_c_total(nzb_soil,j,i) = pave_heat_capacity 2109 lambda_temp(nzb_soil) = pave_heat_conductivity 2550 TYPE(surf_type_lsm), POINTER :: surf_m_soil 2551 TYPE(surf_type_lsm), POINTER :: surf_m_soil_p 2552 TYPE(surf_type_lsm), POINTER :: surf_t_soil 2553 TYPE(surf_type_lsm), POINTER :: surf_t_soil_p 2554 TYPE(surf_type_lsm), POINTER :: surf_tm_soil_m 2555 TYPE(surf_type_lsm), POINTER :: surf_tt_soil_m 2556 2557 TYPE(surf_type), POINTER :: surf !< surface-date type variable 2558 2559 IF ( horizontal ) THEN 2560 surf => surf_lsm_h 2561 2562 surf_m_soil => m_soil_h 2563 surf_m_soil_p => m_soil_h_p 2564 surf_t_soil => t_soil_h 2565 surf_t_soil_p => t_soil_h_p 2566 surf_tm_soil_m => tm_soil_h_m 2567 surf_tt_soil_m => tt_soil_h_m 2568 ELSE 2569 surf => surf_lsm_v(l) 2570 2571 surf_m_soil => m_soil_v(l) 2572 surf_m_soil_p => m_soil_v_p(l) 2573 surf_t_soil => t_soil_v(l) 2574 surf_t_soil_p => t_soil_v_p(l) 2575 surf_tm_soil_m => tm_soil_v_m(l) 2576 surf_tt_soil_m => tt_soil_v_m(l) 2577 ENDIF 2578 2579 DO m = 1, surf%ns 2580 2581 IF ( surf%pave_surface(m) ) THEN 2582 surf%rho_c_total(nzb_soil,m) = pave_heat_capacity 2583 lambda_temp(nzb_soil) = pave_heat_conductivity 2584 ENDIF 2585 2586 IF ( .NOT. surf%water_surface(m) ) THEN 2587 DO k = nzb_soil, nzt_soil 2588 2589 IF ( surf%pave_surface(m) .AND. zs(k) <= pave_depth ) THEN 2590 2591 surf%rho_c_total(k,m) = pave_heat_capacity 2592 lambda_temp(k) = pave_heat_conductivity 2593 2594 ELSE 2595 ! 2596 !-- Calculate volumetric heat capacity of the soil, taking 2597 !-- into account water content 2598 surf%rho_c_total(k,m) = (rho_c_soil * & 2599 ( 1.0_wp - surf%m_sat(m) )& 2600 + rho_c_water * surf_m_soil%var_2d(k,m) ) 2601 2602 ! 2603 !-- Calculate soil heat conductivity at the center of the soil 2604 !-- layers 2605 lambda_h_sat = lambda_h_sm**(1.0_wp - surf%m_sat(m)) *& 2606 lambda_h_water ** surf_m_soil%var_2d(k,m) 2607 2608 ke = 1.0_wp + LOG10( MAX( 0.1_wp, surf_m_soil%var_2d(k,m) / & 2609 surf%m_sat(m) ) ) 2610 2611 lambda_temp(k) = ke * (lambda_h_sat - lambda_h_dry) + & 2612 lambda_h_dry 2613 ENDIF 2614 ENDDO 2615 2616 ! 2617 !-- Calculate soil heat conductivity (lambda_h) at the _stag level 2618 !-- using linear interpolation. For pavement surface, the 2619 !-- true pavement depth is considered 2620 DO k = nzb_soil, nzt_soil-1 2621 IF ( surf%pave_surface(m) .AND. zs(k) < pave_depth & 2622 .AND. zs(k+1) > pave_depth ) THEN 2623 surf%lambda_h(k,m) = ( pave_depth - zs(k) ) / dz_soil(k+1)& 2624 * lambda_temp(k) & 2625 + ( 1.0_wp - ( pave_depth - zs(k) ) & 2626 / dz_soil(k+1) ) * lambda_temp(k+1) 2627 ELSE 2628 surf%lambda_h(k,m) = ( lambda_temp(k+1) + lambda_temp(k) )& 2629 * 0.5_wp 2630 ENDIF 2631 ENDDO 2632 surf%lambda_h(nzt_soil,m) = lambda_temp(nzt_soil) 2633 2634 ! 2635 !-- Prognostic equation for soil temperature t_soil 2636 tend(:) = 0.0_wp 2637 2638 tend(nzb_soil) = ( 1.0_wp / surf%rho_c_total(nzb_soil,m) ) *& 2639 ( surf%lambda_h(nzb_soil,m) * ( surf_t_soil%var_2d(nzb_soil+1,m) & 2640 - surf_t_soil%var_2d(nzb_soil,m) ) * ddz_soil(nzb_soil+1) & 2641 + surf%ghf_eb(m) ) * ddz_soil_stag(nzb_soil) 2642 2643 DO k = nzb_soil+1, nzt_soil 2644 tend(k) = ( 1.0_wp / surf%rho_c_total(k,m) ) & 2645 * ( surf%lambda_h(k,m) & 2646 * ( surf_t_soil%var_2d(k+1,m) - surf_t_soil%var_2d(k,m) ) & 2647 * ddz_soil(k+1) & 2648 - surf%lambda_h(k-1,m) & 2649 * ( surf_t_soil%var_2d(k,m) - surf_t_soil%var_2d(k-1,m) ) & 2650 * ddz_soil(k) & 2651 ) * ddz_soil_stag(k) 2652 2653 ENDDO 2654 2655 surf_t_soil_p%var_2d(nzb_soil:nzt_soil,m) = surf_t_soil%var_2d(nzb_soil:nzt_soil,m) & 2656 + dt_3d * ( tsc(2) & 2657 * tend(nzb_soil:nzt_soil) & 2658 + tsc(3) & 2659 * surf_tt_soil_m%var_2d(nzb_soil:nzt_soil,m) ) 2660 2661 ! 2662 !-- Calculate t_soil tendencies for the next Runge-Kutta step 2663 IF ( timestep_scheme(1:5) == 'runge' ) THEN 2664 IF ( intermediate_timestep_count == 1 ) THEN 2665 DO k = nzb_soil, nzt_soil 2666 surf_tt_soil_m%var_2d(k,m) = tend(k) 2667 ENDDO 2668 ELSEIF ( intermediate_timestep_count < & 2669 intermediate_timestep_count_max ) THEN 2670 DO k = nzb_soil, nzt_soil 2671 surf_tt_soil_m%var_2d(k,m) = -9.5625_wp * tend(k) + 5.3125_wp & 2672 * surf_tt_soil_m%var_2d(k,m) 2673 ENDDO 2674 ENDIF 2110 2675 ENDIF 2111 2676 2112 IF ( .NOT. water_surface(j,i) ) THEN 2677 2678 DO k = nzb_soil, nzt_soil 2679 2680 ! 2681 !-- Calculate soil diffusivity at the center of the soil layers 2682 lambda_temp(k) = (- b_ch * surf%gamma_w_sat(m) * psi_sat & 2683 / surf%m_sat(m) ) * ( MAX( surf_m_soil%var_2d(k,m), & 2684 surf%m_wilt(m) ) / surf%m_sat(m) )**(& 2685 b_ch + 2.0_wp ) 2686 2687 ! 2688 !-- Parametrization of Van Genuchten 2689 IF ( soil_type /= 7 ) THEN 2690 ! 2691 !-- Calculate the hydraulic conductivity after Van Genuchten 2692 !-- (1980) 2693 h_vg = ( ( ( surf%m_res(m) - surf%m_sat(m) ) / & 2694 ( surf%m_res(m) - & 2695 MAX( surf_m_soil%var_2d(k,m), surf%m_wilt(m) ) & 2696 ) & 2697 )**( & 2698 surf%n_vg(m) / ( surf%n_vg(m) - 1.0_wp ) & 2699 ) - 1.0_wp & 2700 )**( 1.0_wp / surf%n_vg(m) ) / surf%alpha_vg(m) 2701 2702 gamma_temp(k) = surf%gamma_w_sat(m) * ( ( ( 1.0_wp + & 2703 ( surf%alpha_vg(m) * h_vg )**surf%n_vg(m)& 2704 )**( & 2705 1.0_wp - 1.0_wp / surf%n_vg(m)) - ( & 2706 surf%alpha_vg(m) * h_vg )**( surf%n_vg(m)& 2707 - 1.0_wp) )**2 ) & 2708 / ( ( 1.0_wp + ( surf%alpha_vg(m) * h_vg & 2709 )**surf%n_vg(m) )**( ( 1.0_wp - 1.0_wp & 2710 / surf%n_vg(m) ) * & 2711 ( surf%l_vg(m) + 2.0_wp) ) ) 2712 ! 2713 !-- Parametrization of Clapp & Hornberger 2714 ELSE 2715 gamma_temp(k) = surf%gamma_w_sat(m) * ( surf_m_soil%var_2d(k,m) & 2716 / surf%m_sat(m) )**(2.0_wp * b_ch + 3.0_wp) 2717 ENDIF 2718 2719 ENDDO 2720 2721 ! 2722 !-- Prognostic equation for soil moisture content. Only performed, 2723 !-- when humidity is enabled in the atmosphere and the surface type 2724 !-- is not pavement (implies dry soil below). 2725 IF ( humidity .AND. .NOT. surf%pave_surface(m) ) THEN 2726 ! 2727 !-- Calculate soil diffusivity (lambda_w) at the _stag level 2728 !-- using linear interpolation. To do: replace this with 2729 !-- ECMWF-IFS Eq. 8.81 2730 DO k = nzb_soil, nzt_soil-1 2731 2732 surf%lambda_w(k,m) = ( lambda_temp(k+1) + & 2733 lambda_temp(k) ) * 0.5_wp 2734 surf%gamma_w(k,m) = ( gamma_temp(k+1) + & 2735 gamma_temp(k) ) * 0.5_wp 2736 2737 ENDDO 2738 2739 ! 2740 ! 2741 !-- In case of a closed bottom (= water content is conserved), 2742 !-- set hydraulic conductivity to zero to that no water will be 2743 !-- lost in the bottom layer. 2744 IF ( conserve_water_content ) THEN 2745 surf%gamma_w(nzt_soil,m) = 0.0_wp 2746 ELSE 2747 surf%gamma_w(nzt_soil,m) = gamma_temp(nzt_soil) 2748 ENDIF 2749 2750 !-- The root extraction (= root_extr * qsws_veg_eb / (rho_l 2751 !-- * l_v)) ensures the mass conservation for water. The 2752 !-- transpiration of plants equals the cumulative withdrawals by 2753 !-- the roots in the soil. The scheme takes into account the 2754 !-- availability of water in the soil layers as well as the root 2755 !-- fraction in the respective layer. Layer with moisture below 2756 !-- wilting point will not contribute, which reflects the 2757 !-- preference of plants to take water from moister layers. 2758 ! 2759 !-- Calculate the root extraction (ECMWF 7.69, the sum of 2760 !-- root_extr = 1). The energy balance solver guarantees a 2761 !-- positive transpiration, so that there is no need for an 2762 !-- additional check. 2763 m_total = 0.0_wp 2113 2764 DO k = nzb_soil, nzt_soil 2114 2115 2116 IF ( pave_surface(j,i) .AND. zs(k) <= pave_depth ) THEN 2117 2118 rho_c_total(k,j,i) = pave_heat_capacity 2119 lambda_temp(k) = pave_heat_conductivity 2120 2121 ELSE 2122 ! 2123 !-- Calculate volumetric heat capacity of the soil, taking 2124 !-- into account water content 2125 rho_c_total(k,j,i) = (rho_c_soil * (1.0_wp - m_sat(j,i)) & 2126 + rho_c_water * m_soil(k,j,i)) 2127 2128 ! 2129 !-- Calculate soil heat conductivity at the center of the soil 2130 !-- layers 2131 lambda_h_sat = lambda_h_sm ** (1.0_wp - m_sat(j,i)) * & 2132 lambda_h_water ** m_soil(k,j,i) 2133 2134 ke = 1.0_wp + LOG10(MAX(0.1_wp,m_soil(k,j,i) & 2135 / m_sat(j,i))) 2136 2137 lambda_temp(k) = ke * (lambda_h_sat - lambda_h_dry) + & 2138 lambda_h_dry 2139 ENDIF 2140 2765 IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(m) ) THEN 2766 m_total = m_total + surf%root_fr(k,m) * surf_m_soil%var_2d(k,m) 2767 ENDIF 2768 ENDDO 2769 IF ( m_total > 0.0_wp ) THEN 2770 DO k = nzb_soil, nzt_soil 2771 IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(m) ) THEN 2772 root_extr(k) = surf%root_fr(k,m) * surf_m_soil%var_2d(k,m) & 2773 / m_total 2774 ELSE 2775 root_extr(k) = 0.0_wp 2776 ENDIF 2777 ENDDO 2778 ENDIF 2779 ! 2780 !-- Prognostic equation for soil water content m_soil_h. 2781 tend(:) = 0.0_wp 2782 2783 tend(nzb_soil) = ( surf%lambda_w(nzb_soil,m) * ( & 2784 surf_m_soil%var_2d(nzb_soil+1,m) - surf_m_soil%var_2d(nzb_soil,m) ) & 2785 * ddz_soil(nzb_soil+1) - surf%gamma_w(nzb_soil,m) - & 2786 ( & 2787 root_extr(nzb_soil) * surf%qsws_veg_eb(m) & 2788 + surf%qsws_soil_eb(m) ) * drho_l_lv ) & 2789 * ddz_soil_stag(nzb_soil) 2790 2791 DO k = nzb_soil+1, nzt_soil-1 2792 tend(k) = ( surf%lambda_w(k,m) * ( surf_m_soil%var_2d(k+1,m) & 2793 - surf_m_soil%var_2d(k,m) ) * ddz_soil(k+1) & 2794 - surf%gamma_w(k,m) & 2795 - surf%lambda_w(k-1,m) * ( surf_m_soil%var_2d(k,m) - & 2796 surf_m_soil%var_2d(k-1,m)) * ddz_soil(k) & 2797 + surf%gamma_w(k-1,m) - (root_extr(k) & 2798 * surf%qsws_veg_eb(m) * drho_l_lv) & 2799 ) * ddz_soil_stag(k) 2141 2800 ENDDO 2142 2143 ! 2144 !-- Calculate soil heat conductivity (lambda_h) at the _stag level 2145 !-- using linear interpolation. For pavement surface, the 2146 !-- true pavement depth is considered 2147 DO k = nzb_soil, nzt_soil-1 2148 IF ( pave_surface(j,i) .AND. zs(k) < pave_depth & 2149 .AND. zs(k+1) > pave_depth ) THEN 2150 lambda_h(k,j,i) = ( pave_depth - zs(k) ) / dz_soil(k+1) & 2151 * lambda_temp(k) & 2152 + ( 1.0_wp - ( pave_depth - zs(k) ) & 2153 / dz_soil(k+1) ) * lambda_temp(k+1) 2154 ELSE 2155 lambda_h(k,j,i) = ( lambda_temp(k+1) + lambda_temp(k) ) & 2156 * 0.5_wp 2157 ENDIF 2801 tend(nzt_soil) = ( - surf%gamma_w(nzt_soil,m) & 2802 - surf%lambda_w(nzt_soil-1,m) & 2803 * ( surf_m_soil%var_2d(nzt_soil,m) & 2804 - surf_m_soil%var_2d(nzt_soil-1,m)) & 2805 * ddz_soil(nzt_soil) & 2806 + surf%gamma_w(nzt_soil-1,m) - ( & 2807 root_extr(nzt_soil) & 2808 * surf%qsws_veg_eb(m) * drho_l_lv ) & 2809 ) * ddz_soil_stag(nzt_soil) 2810 2811 surf_m_soil_p%var_2d(nzb_soil:nzt_soil,m) = surf_m_soil%var_2d(nzb_soil:nzt_soil,m) & 2812 + dt_3d * ( tsc(2) * tend(:) & 2813 + tsc(3) * surf_tm_soil_m%var_2d(:,m) ) 2814 2815 ! 2816 !-- Account for dry soils (find a better solution here!) 2817 DO k = nzb_soil, nzt_soil 2818 IF ( surf_m_soil_p%var_2d(k,m) < 0.0_wp ) surf_m_soil_p%var_2d(k,m) = 0.0_wp 2158 2819 ENDDO 2159 lambda_h(nzt_soil,j,i) = lambda_temp(nzt_soil) 2160 2161 2162 2163 2164 ! 2165 !-- Prognostic equation for soil temperature t_soil 2166 tend(:) = 0.0_wp 2167 2168 tend(nzb_soil) = (1.0_wp/rho_c_total(nzb_soil,j,i)) * & 2169 ( lambda_h(nzb_soil,j,i) * ( t_soil(nzb_soil+1,j,i) & 2170 - t_soil(nzb_soil,j,i) ) * ddz_soil(nzb_soil+1) & 2171 + ghf_eb(j,i) ) * ddz_soil_stag(nzb_soil) 2172 2173 DO k = nzb_soil+1, nzt_soil 2174 tend(k) = (1.0_wp/rho_c_total(k,j,i)) & 2175 * ( lambda_h(k,j,i) & 2176 * ( t_soil(k+1,j,i) - t_soil(k,j,i) ) & 2177 * ddz_soil(k+1) & 2178 - lambda_h(k-1,j,i) & 2179 * ( t_soil(k,j,i) - t_soil(k-1,j,i) ) & 2180 * ddz_soil(k) & 2181 ) * ddz_soil_stag(k) 2182 2183 ENDDO 2184 2185 t_soil_p(nzb_soil:nzt_soil,j,i) = t_soil(nzb_soil:nzt_soil,j,i)& 2186 + dt_3d * ( tsc(2) & 2187 * tend(nzb_soil:nzt_soil) & 2188 + tsc(3) & 2189 * tt_soil_m(:,j,i) ) 2190 2191 ! 2192 !-- Calculate t_soil tendencies for the next Runge-Kutta step 2820 2821 ! 2822 !-- Calculate m_soil tendencies for the next Runge-Kutta step 2193 2823 IF ( timestep_scheme(1:5) == 'runge' ) THEN 2194 2824 IF ( intermediate_timestep_count == 1 ) THEN 2195 2825 DO k = nzb_soil, nzt_soil 2196 tt_soil_m(k,j,i) = tend(k)2826 surf_tm_soil_m%var_2d(k,m) = tend(k) 2197 2827 ENDDO 2198 2828 ELSEIF ( intermediate_timestep_count < & 2199 2829 intermediate_timestep_count_max ) THEN 2200 2830 DO k = nzb_soil, nzt_soil 2201 tt_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp&2202 * tt_soil_m(k,j,i)2831 surf_tm_soil_m%var_2d(k,m) = -9.5625_wp * tend(k) + 5.3125_wp & 2832 * surf_tm_soil_m%var_2d(k,m) 2203 2833 ENDDO 2204 2834 ENDIF 2205 2835 ENDIF 2206 2207 2208 DO k = nzb_soil, nzt_soil2209 2210 !2211 !-- Calculate soil diffusivity at the center of the soil layers2212 lambda_temp(k) = (- b_ch * gamma_w_sat(j,i) * psi_sat &2213 / m_sat(j,i) ) * ( MAX( m_soil(k,j,i), &2214 m_wilt(j,i) ) / m_sat(j,i) )**( &2215 b_ch + 2.0_wp )2216 2217 !2218 !-- Parametrization of Van Genuchten2219 IF ( soil_type /= 7 ) THEN2220 !2221 !-- Calculate the hydraulic conductivity after Van Genuchten2222 !-- (1980)2223 h_vg = ( ( (m_res(j,i) - m_sat(j,i)) / ( m_res(j,i) - &2224 MAX( m_soil(k,j,i), m_wilt(j,i) ) ) )**( &2225 n_vg(j,i) / (n_vg(j,i) - 1.0_wp ) ) - 1.0_wp &2226 )**( 1.0_wp / n_vg(j,i) ) / alpha_vg(j,i)2227 2228 2229 gamma_temp(k) = gamma_w_sat(j,i) * ( ( (1.0_wp + &2230 ( alpha_vg(j,i) * h_vg )**n_vg(j,i))**( &2231 1.0_wp - 1.0_wp / n_vg(j,i) ) - ( &2232 alpha_vg(j,i) * h_vg )**( n_vg(j,i) &2233 - 1.0_wp) )**2 ) &2234 / ( ( 1.0_wp + ( alpha_vg(j,i) * h_vg &2235 )**n_vg(j,i) )**( ( 1.0_wp - 1.0_wp &2236 / n_vg(j,i) ) *( l_vg(j,i) + 2.0_wp) ) )2237 2238 !2239 !-- Parametrization of Clapp & Hornberger2240 ELSE2241 gamma_temp(k) = gamma_w_sat(j,i) * ( m_soil(k,j,i) &2242 / m_sat(j,i) )**(2.0_wp * b_ch + 3.0_wp)2243 ENDIF2244 2245 ENDDO2246 2247 !2248 !-- Prognostic equation for soil moisture content. Only performed,2249 !-- when humidity is enabled in the atmosphere and the surface type2250 !-- is not pavement (implies dry soil below).2251 IF ( humidity .AND. .NOT. pave_surface(j,i) ) THEN2252 !2253 !-- Calculate soil diffusivity (lambda_w) at the _stag level2254 !-- using linear interpolation. To do: replace this with2255 !-- ECMWF-IFS Eq. 8.812256 DO k = nzb_soil, nzt_soil-12257 2258 lambda_w(k,j,i) = ( lambda_temp(k+1) + lambda_temp(k) ) &2259 * 0.5_wp2260 gamma_w(k,j,i) = ( gamma_temp(k+1) + gamma_temp(k) ) &2261 * 0.5_wp2262 2263 ENDDO2264 2265 !2266 !2267 !-- In case of a closed bottom (= water content is conserved),2268 !-- set hydraulic conductivity to zero to that no water will be2269 !-- lost in the bottom layer.2270 IF ( conserve_water_content ) THEN2271 gamma_w(nzt_soil,j,i) = 0.0_wp2272 ELSE2273 gamma_w(nzt_soil,j,i) = gamma_temp(nzt_soil)2274 ENDIF2275 2276 !-- The root extraction (= root_extr * qsws_veg_eb / (rho_l2277 !-- * l_v)) ensures the mass conservation for water. The2278 !-- transpiration of plants equals the cumulative withdrawals by2279 !-- the roots in the soil. The scheme takes into account the2280 !-- availability of water in the soil layers as well as the root2281 !-- fraction in the respective layer. Layer with moisture below2282 !-- wilting point will not contribute, which reflects the2283 !-- preference of plants to take water from moister layers.2284 2285 !2286 !-- Calculate the root extraction (ECMWF 7.69, the sum of2287 !-- root_extr = 1). The energy balance solver guarantees a2288 !-- positive transpiration, so that there is no need for an2289 !-- additional check.2290 m_total = 0.0_wp2291 DO k = nzb_soil, nzt_soil2292 IF ( m_soil(k,j,i) > m_wilt(j,i) ) THEN2293 m_total = m_total + root_fr(k,j,i) * m_soil(k,j,i)2294 ENDIF2295 ENDDO2296 2297 IF ( m_total > 0.0_wp ) THEN2298 DO k = nzb_soil, nzt_soil2299 IF ( m_soil(k,j,i) > m_wilt(j,i) ) THEN2300 root_extr(k) = root_fr(k,j,i) * m_soil(k,j,i) &2301 / m_total2302 ELSE2303 root_extr(k) = 0.0_wp2304 ENDIF2305 ENDDO2306 ENDIF2307 2308 !2309 !-- Prognostic equation for soil water content m_soil.2310 tend(:) = 0.0_wp2311 2312 tend(nzb_soil) = ( lambda_w(nzb_soil,j,i) * ( &2313 m_soil(nzb_soil+1,j,i) - m_soil(nzb_soil,j,i) ) &2314 * ddz_soil(nzb_soil+1) - gamma_w(nzb_soil,j,i) - ( &2315 root_extr(nzb_soil) * qsws_veg_eb(j,i) &2316 + qsws_soil_eb(j,i) ) * drho_l_lv ) &2317 * ddz_soil_stag(nzb_soil)2318 2319 DO k = nzb_soil+1, nzt_soil-12320 tend(k) = ( lambda_w(k,j,i) * ( m_soil(k+1,j,i) &2321 - m_soil(k,j,i) ) * ddz_soil(k+1) &2322 - gamma_w(k,j,i) &2323 - lambda_w(k-1,j,i) * (m_soil(k,j,i) - &2324 m_soil(k-1,j,i)) * ddz_soil(k) &2325 + gamma_w(k-1,j,i) - (root_extr(k) &2326 * qsws_veg_eb(j,i) * drho_l_lv) &2327 ) * ddz_soil_stag(k)2328 2329 ENDDO2330 tend(nzt_soil) = ( - gamma_w(nzt_soil,j,i) &2331 - lambda_w(nzt_soil-1,j,i) &2332 * (m_soil(nzt_soil,j,i) &2333 - m_soil(nzt_soil-1,j,i)) &2334 * ddz_soil(nzt_soil) &2335 + gamma_w(nzt_soil-1,j,i) - ( &2336 root_extr(nzt_soil) &2337 * qsws_veg_eb(j,i) * drho_l_lv ) &2338 ) * ddz_soil_stag(nzt_soil)2339 2340 m_soil_p(nzb_soil:nzt_soil,j,i) = m_soil(nzb_soil:nzt_soil,j,i)&2341 + dt_3d * ( tsc(2) * tend(:) &2342 + tsc(3) * tm_soil_m(:,j,i) )2343 2344 !2345 !-- Account for dry soils (find a better solution here!)2346 DO k = nzb_soil, nzt_soil2347 IF ( m_soil_p(k,j,i) < 0.0_wp ) m_soil_p(k,j,i) = 0.0_wp2348 ENDDO2349 2350 !2351 !-- Calculate m_soil tendencies for the next Runge-Kutta step2352 IF ( timestep_scheme(1:5) == 'runge' ) THEN2353 IF ( intermediate_timestep_count == 1 ) THEN2354 DO k = nzb_soil, nzt_soil2355 tm_soil_m(k,j,i) = tend(k)2356 ENDDO2357 ELSEIF ( intermediate_timestep_count < &2358 intermediate_timestep_count_max ) THEN2359 DO k = nzb_soil, nzt_soil2360 tm_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp&2361 * tm_soil_m(k,j,i)2362 ENDDO2363 ENDIF2364 ENDIF2365 2366 ENDIF2367 2368 2836 ENDIF 2369 2837 2370 ENDDO 2838 ENDIF 2839 2371 2840 ENDDO 2372 2841 … … 2386 2855 2387 2856 #if defined( __nopointer ) 2388 2389 t_surface = t_surface_p 2390 t_soil = t_soil_p 2857 ! 2858 !-- Horizontal surfaces 2859 t_surface_h = t_surface_h_p 2860 t_soil_h = t_soil_h_p 2391 2861 IF ( humidity ) THEN 2392 m_soil = m_soil_p 2393 m_liq_eb = m_liq_eb_p 2862 m_soil_h = m_soil_h_p 2863 m_liq_eb_h = m_liq_eb_h_p 2864 ENDIF 2865 ! 2866 !-- Vertical surfaces 2867 t_surface_v = t_surface_v_p 2868 t_soil_v = t_soil_v_p 2869 IF ( humidity ) THEN 2870 m_soil_v = m_soil_v_p 2871 m_liq_eb_v = m_liq_eb_v_p 2394 2872 ENDIF 2395 2873 … … 2399 2877 2400 2878 CASE ( 0 ) 2401 2402 t_surface => t_surface_1; t_surface_p => t_surface_2 2403 t_soil => t_soil_1; t_soil_p => t_soil_2 2879 ! 2880 !-- Horizontal surfaces 2881 t_surface_h => t_surface_h_1; t_surface_h_p => t_surface_h_2 2882 t_soil_h => t_soil_h_1; t_soil_h_p => t_soil_h_2 2404 2883 IF ( humidity ) THEN 2405 m_soil => m_soil_1; m_soil_p => m_soil_22406 m_liq_eb => m_liq_eb_1; m_liq_eb_p => m_liq_eb_22884 m_soil_h => m_soil_h_1; m_soil_h_p => m_soil_h_2 2885 m_liq_eb_h => m_liq_eb_h_1; m_liq_eb_h_p => m_liq_eb_h_2 2407 2886 ENDIF 2887 ! 2888 !-- Vertical surfaces 2889 t_surface_v => t_surface_v_1; t_surface_v_p => t_surface_v_2 2890 t_soil_v => t_soil_v_1; t_soil_v_p => t_soil_v_2 2891 IF ( humidity ) THEN 2892 m_soil_v => m_soil_v_1; m_soil_v_p => m_soil_v_2 2893 m_liq_eb_v => m_liq_eb_v_1; m_liq_eb_v_p => m_liq_eb_v_2 2894 ENDIF 2895 2408 2896 2409 2897 2410 2898 CASE ( 1 ) 2411 2412 t_surface => t_surface_2; t_surface_p => t_surface_1 2413 t_soil => t_soil_2; t_soil_p => t_soil_1 2899 ! 2900 !-- Horizontal surfaces 2901 t_surface_h => t_surface_h_2; t_surface_h_p => t_surface_h_1 2902 t_soil_h => t_soil_h_2; t_soil_h_p => t_soil_h_1 2414 2903 IF ( humidity ) THEN 2415 m_soil => m_soil_2; m_soil_p => m_soil_1 2416 m_liq_eb => m_liq_eb_2; m_liq_eb_p => m_liq_eb_1 2904 m_soil_h => m_soil_h_2; m_soil_h_p => m_soil_h_1 2905 m_liq_eb_h => m_liq_eb_h_2; m_liq_eb_h_p => m_liq_eb_h_1 2906 ENDIF 2907 ! 2908 !-- Vertical surfaces 2909 t_surface_v => t_surface_v_2; t_surface_v_p => t_surface_v_1 2910 t_soil_v => t_soil_v_2; t_soil_v_p => t_soil_v_1 2911 IF ( humidity ) THEN 2912 m_soil_v => m_soil_v_2; m_soil_v_p => m_soil_v_1 2913 m_liq_eb_v => m_liq_eb_v_2; m_liq_eb_v_p => m_liq_eb_v_1 2417 2914 ENDIF 2418 2915 … … 2445 2942 CHARACTER (LEN=*) :: variable !< 2446 2943 2447 INTEGER(iwp) :: i !< 2448 INTEGER(iwp) :: j !< 2449 INTEGER(iwp) :: k !< 2944 INTEGER(iwp) :: i !< 2945 INTEGER(iwp) :: j !< 2946 INTEGER(iwp) :: k !< 2947 INTEGER(iwp) :: m !< running index 2450 2948 2451 2949 IF ( mode == 'allocate' ) THEN … … 2553 3051 2554 3052 CASE ( 'c_liq*' ) 2555 DO i = nxlg, nxrg 2556 DO j = nysg, nyng 2557 c_liq_av(j,i) = c_liq_av(j,i) + c_liq(j,i) 3053 DO m = 1, surf_lsm_h%ns 3054 i = surf_lsm_h%i(m) 3055 j = surf_lsm_h%j(m) 3056 c_liq_av(j,i) = c_liq_av(j,i) + surf_lsm_h%c_liq(m) 3057 ENDDO 3058 3059 CASE ( 'c_soil*' ) 3060 DO m = 1, surf_lsm_h%ns 3061 i = surf_lsm_h%i(m) 3062 j = surf_lsm_h%j(m) 3063 c_soil_av(j,i) = c_soil_av(j,i) + (1.0 - surf_lsm_h%c_veg(m)) 3064 ENDDO 3065 3066 CASE ( 'c_veg*' ) 3067 DO m = 1, surf_lsm_h%ns 3068 i = surf_lsm_h%i(m) 3069 j = surf_lsm_h%j(m) 3070 c_veg_av(j,i) = c_veg_av(j,i) + surf_lsm_h%c_veg(m) 3071 ENDDO 3072 3073 CASE ( 'ghf_eb*' ) 3074 DO m = 1, surf_lsm_h%ns 3075 i = surf_lsm_h%i(m) 3076 j = surf_lsm_h%j(m) 3077 ghf_eb_av(j,i) = ghf_eb_av(j,i) + surf_lsm_h%ghf_eb(m) 3078 ENDDO 3079 3080 CASE ( 'lai*' ) 3081 DO m = 1, surf_lsm_h%ns 3082 i = surf_lsm_h%i(m) 3083 j = surf_lsm_h%j(m) 3084 lai_av(j,i) = lai_av(j,i) + surf_lsm_h%lai(m) 3085 ENDDO 3086 3087 CASE ( 'm_liq_eb*' ) 3088 DO m = 1, surf_lsm_h%ns 3089 i = surf_lsm_h%i(m) 3090 j = surf_lsm_h%j(m) 3091 m_liq_eb_av(j,i) = m_liq_eb_av(j,i) + m_liq_eb_h%var_1d(m) 3092 ENDDO 3093 3094 CASE ( 'm_soil' ) 3095 DO m = 1, surf_lsm_h%ns 3096 i = surf_lsm_h%i(m) 3097 j = surf_lsm_h%j(m) 3098 DO k = nzb_soil, nzt_soil 3099 m_soil_av(k,j,i) = m_soil_av(k,j,i) + m_soil_h%var_2d(k,m) 2558 3100 ENDDO 2559 3101 ENDDO 2560 3102 2561 CASE ( 'c_soil*' )2562 DO i = nxlg, nxrg2563 DO j = nysg, nyng2564 c_soil_av(j,i) = c_soil_av(j,i) + (1.0 - c_veg(j,i))2565 ENDDO2566 ENDDO2567 2568 CASE ( 'c_veg*' )2569 DO i = nxlg, nxrg2570 DO j = nysg, nyng2571 c_veg_av(j,i) = c_veg_av(j,i) + c_veg(j,i)2572 ENDDO2573 ENDDO2574 2575 CASE ( 'ghf_eb*' )2576 DO i = nxlg, nxrg2577 DO j = nysg, nyng2578 ghf_eb_av(j,i) = ghf_eb_av(j,i) + ghf_eb(j,i)2579 ENDDO2580 ENDDO2581 2582 CASE ( 'lai*' )2583 DO i = nxlg, nxrg2584 DO j = nysg, nyng2585 lai_av(j,i) = lai_av(j,i) + lai(j,i)2586 ENDDO2587 ENDDO2588 2589 CASE ( 'm_liq_eb*' )2590 DO i = nxlg, nxrg2591 DO j = nysg, nyng2592 m_liq_eb_av(j,i) = m_liq_eb_av(j,i) + m_liq_eb(j,i)2593 ENDDO2594 ENDDO2595 2596 CASE ( 'm_soil' )2597 DO i = nxlg, nxrg2598 DO j = nysg, nyng2599 DO k = nzb_soil, nzt_soil2600 m_soil_av(k,j,i) = m_soil_av(k,j,i) + m_soil(k,j,i)2601 ENDDO2602 ENDDO2603 ENDDO2604 2605 3103 CASE ( 'qsws_eb*' ) 2606 DO i = nxlg, nxrg2607 DO j = nysg, nyng2608 qsws_eb_av(j,i) = qsws_eb_av(j,i) + qsws_eb(j,i)2609 ENDDO3104 DO m = 1, surf_lsm_h%ns 3105 i = surf_lsm_h%i(m) 3106 j = surf_lsm_h%j(m) 3107 qsws_eb_av(j,i) = qsws_eb_av(j,i) + surf_lsm_h%qsws_eb(m) 2610 3108 ENDDO 2611 3109 2612 3110 CASE ( 'qsws_liq_eb*' ) 2613 DO i = nxlg, nxrg 2614 DO j = nysg, nyng 2615 qsws_liq_eb_av(j,i) = qsws_liq_eb_av(j,i) + qsws_liq_eb(j,i) 2616 ENDDO 3111 DO m = 1, surf_lsm_h%ns 3112 i = surf_lsm_h%i(m) 3113 j = surf_lsm_h%j(m) 3114 qsws_liq_eb_av(j,i) = qsws_liq_eb_av(j,i) + & 3115 surf_lsm_h%qsws_liq_eb(m) 2617 3116 ENDDO 2618 3117 2619 3118 CASE ( 'qsws_soil_eb*' ) 2620 DO i = nxlg, nxrg 2621 DO j = nysg, nyng 2622 qsws_soil_eb_av(j,i) = qsws_soil_eb_av(j,i) + qsws_soil_eb(j,i) 2623 ENDDO 3119 DO m = 1, surf_lsm_h%ns 3120 i = surf_lsm_h%i(m) 3121 j = surf_lsm_h%j(m) 3122 qsws_soil_eb_av(j,i) = qsws_soil_eb_av(j,i) + & 3123 surf_lsm_h%qsws_soil_eb(m) 2624 3124 ENDDO 2625 3125 2626 3126 CASE ( 'qsws_veg_eb*' ) 2627 DO i = nxlg, nxrg 2628 DO j = nysg, nyng 2629 qsws_veg_eb_av(j,i) = qsws_veg_eb_av(j,i) + qsws_veg_eb(j,i) 2630 ENDDO 3127 DO m = 1, surf_lsm_h%ns 3128 i = surf_lsm_h%i(m) 3129 j = surf_lsm_h%j(m) 3130 qsws_veg_eb_av(j,i) = qsws_veg_eb_av(j,i) + & 3131 surf_lsm_h%qsws_veg_eb(m) 2631 3132 ENDDO 2632 3133 2633 3134 CASE ( 'r_a*' ) 2634 DO i = nxlg, nxrg2635 DO j = nysg, nyng2636 r_a_av(j,i) = r_a_av(j,i) + r_a(j,i)2637 ENDDO3135 DO m = 1, surf_lsm_h%ns 3136 i = surf_lsm_h%i(m) 3137 j = surf_lsm_h%j(m) 3138 r_a_av(j,i) = r_a_av(j,i) + surf_lsm_h%r_a(m) 2638 3139 ENDDO 2639 3140 2640 3141 CASE ( 'r_s*' ) 2641 DO i = nxlg, nxrg2642 DO j = nysg, nyng2643 r_s_av(j,i) = r_s_av(j,i) + r_s(j,i)2644 ENDDO3142 DO m = 1, surf_lsm_h%ns 3143 i = surf_lsm_h%i(m) 3144 j = surf_lsm_h%j(m) 3145 r_s_av(j,i) = r_s_av(j,i) + surf_lsm_h%r_s(m) 2645 3146 ENDDO 2646 3147 2647 3148 CASE ( 'shf_eb*' ) 2648 DO i = nxlg, nxrg2649 DO j = nysg, nyng2650 shf_eb_av(j,i) = shf_eb_av(j,i) + shf_eb(j,i)2651 ENDDO3149 DO m = 1, surf_lsm_h%ns 3150 i = surf_lsm_h%i(m) 3151 j = surf_lsm_h%j(m) 3152 shf_eb_av(j,i) = shf_eb_av(j,i) + surf_lsm_h%shf_eb(m) 2652 3153 ENDDO 2653 3154 2654 3155 CASE ( 't_soil' ) 2655 DO i = nxlg, nxrg2656 DO j = nysg, nyng2657 DO k = nzb_soil, nzt_soil2658 t_soil_av(k,j,i) = t_soil_av(k,j,i) + t_soil(k,j,i)2659 ENDDO3156 DO m = 1, surf_lsm_h%ns 3157 i = surf_lsm_h%i(m) 3158 j = surf_lsm_h%j(m) 3159 DO k = nzb_soil, nzt_soil 3160 t_soil_av(k,j,i) = t_soil_av(k,j,i) + t_soil_h%var_2d(k,m) 2660 3161 ENDDO 2661 3162 ENDDO … … 2671 3172 2672 3173 CASE ( 'c_liq*' ) 2673 DO i = nxl g, nxrg2674 DO j = nys g, nyng3174 DO i = nxl, nxr 3175 DO j = nys, nyn 2675 3176 c_liq_av(j,i) = c_liq_av(j,i) / REAL( average_count_3d, KIND=wp ) 2676 3177 ENDDO … … 2678 3179 2679 3180 CASE ( 'c_soil*' ) 2680 DO i = nxl g, nxrg2681 DO j = nys g, nyng3181 DO i = nxl, nxr 3182 DO j = nys, nyn 2682 3183 c_soil_av(j,i) = c_soil_av(j,i) / REAL( average_count_3d, KIND=wp ) 2683 3184 ENDDO … … 2685 3186 2686 3187 CASE ( 'c_veg*' ) 2687 DO i = nxl g, nxrg2688 DO j = nys g, nyng3188 DO i = nxl, nxr 3189 DO j = nys, nyn 2689 3190 c_veg_av(j,i) = c_veg_av(j,i) / REAL( average_count_3d, KIND=wp ) 2690 3191 ENDDO … … 2692 3193 2693 3194 CASE ( 'ghf_eb*' ) 2694 DO i = nxl g, nxrg2695 DO j = nys g, nyng3195 DO i = nxl, nxr 3196 DO j = nys, nyn 2696 3197 ghf_eb_av(j,i) = ghf_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2697 3198 ENDDO … … 2699 3200 2700 3201 CASE ( 'lai*' ) 2701 DO i = nxl g, nxrg2702 DO j = nys g, nyng3202 DO i = nxl, nxr 3203 DO j = nys, nyn 2703 3204 lai_av(j,i) = lai_av(j,i) / REAL( average_count_3d, KIND=wp ) 2704 3205 ENDDO … … 2706 3207 2707 3208 CASE ( 'm_liq_eb*' ) 2708 DO i = nxl g, nxrg2709 DO j = nys g, nyng3209 DO i = nxl, nxr 3210 DO j = nys, nyn 2710 3211 m_liq_eb_av(j,i) = m_liq_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2711 3212 ENDDO … … 2713 3214 2714 3215 CASE ( 'm_soil' ) 2715 DO i = nxl g, nxrg2716 DO j = nys g, nyng3216 DO i = nxl, nxr 3217 DO j = nys, nyn 2717 3218 DO k = nzb_soil, nzt_soil 2718 3219 m_soil_av(k,j,i) = m_soil_av(k,j,i) / REAL( average_count_3d, KIND=wp ) … … 2722 3223 2723 3224 CASE ( 'qsws_eb*' ) 2724 DO i = nxl g, nxrg2725 DO j = nys g, nyng3225 DO i = nxl, nxr 3226 DO j = nys, nyn 2726 3227 qsws_eb_av(j,i) = qsws_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2727 3228 ENDDO … … 2729 3230 2730 3231 CASE ( 'qsws_liq_eb*' ) 2731 DO i = nxl g, nxrg2732 DO j = nys g, nyng3232 DO i = nxl, nxr 3233 DO j = nys, nyn 2733 3234 qsws_liq_eb_av(j,i) = qsws_liq_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2734 3235 ENDDO … … 2736 3237 2737 3238 CASE ( 'qsws_soil_eb*' ) 2738 DO i = nxl g, nxrg2739 DO j = nys g, nyng3239 DO i = nxl, nxr 3240 DO j = nys, nyn 2740 3241 qsws_soil_eb_av(j,i) = qsws_soil_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2741 3242 ENDDO … … 2743 3244 2744 3245 CASE ( 'qsws_veg_eb*' ) 2745 DO i = nxl g, nxrg2746 DO j = nys g, nyng3246 DO i = nxl, nxr 3247 DO j = nys, nyn 2747 3248 qsws_veg_eb_av(j,i) = qsws_veg_eb_av(j,i) / REAL( average_count_3d, KIND=wp ) 2748 3249 ENDDO … … 2750 3251 2751 3252 CASE ( 'r_a*' ) 2752 DO i = nxl g, nxrg2753 DO j = nys g, nyng3253 DO i = nxl, nxr 3254 DO j = nys, nyn 2754 3255 r_a_av(j,i) = r_a_av(j,i) / REAL( average_count_3d, KIND=wp ) 2755 3256 ENDDO … … 2757 3258 2758 3259 CASE ( 'r_s*' ) 2759 DO i = nxl g, nxrg2760 DO j = nys g, nyng3260 DO i = nxl, nxr 3261 DO j = nys, nyn 2761 3262 r_s_av(j,i) = r_s_av(j,i) / REAL( average_count_3d, KIND=wp ) 2762 3263 ENDDO … … 2764 3265 2765 3266 CASE ( 't_soil' ) 2766 DO i = nxl g, nxrg2767 DO j = nys g, nyng3267 DO i = nxl, nxr 3268 DO j = nys, nyn 2768 3269 DO k = nzb_soil, nzt_soil 2769 3270 t_soil_av(k,j,i) = t_soil_av(k,j,i) / REAL( average_count_3d, KIND=wp ) … … 2771 3272 ENDDO 2772 3273 ENDDO 3274 ! 3275 !-- 2773 3276 2774 3277 END SELECT … … 2837 3340 CHARACTER (LEN=*) :: variable !< 2838 3341 2839 INTEGER(iwp) :: av !< 2840 INTEGER(iwp) :: i !< 2841 INTEGER(iwp) :: j !< 2842 INTEGER(iwp) :: k !< 3342 INTEGER(iwp) :: av !< 3343 INTEGER(iwp) :: i !< running index 3344 INTEGER(iwp) :: j !< running index 3345 INTEGER(iwp) :: k !< running index 3346 INTEGER(iwp) :: m !< running index 2843 3347 INTEGER(iwp) :: nzb_do !< 2844 3348 INTEGER(iwp) :: nzt_do !< … … 2849 3353 REAL(wp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) :: local_pf !< 2850 3354 3355 2851 3356 found = .TRUE. 2852 3357 2853 3358 SELECT CASE ( TRIM( variable ) ) 2854 2855 3359 ! 3360 !-- Before data is transfered to local_pf, transfer is it 2D dummy variable and exchange ghost points therein. 3361 !-- However, at this point this is only required for instantaneous arrays, time-averaged quantities are already exchanged. 2856 3362 CASE ( 'c_liq*_xy' ) ! 2d-array 2857 3363 IF ( av == 0 ) THEN 2858 DO i = nxlg, nxrg2859 DO j = nysg, nyng2860 local_pf(i,j,nzb+1) = c_liq(j,i) * c_veg(j,i)2861 ENDDO3364 DO m = 1, surf_lsm_h%ns 3365 i = surf_lsm_h%i(m) 3366 j = surf_lsm_h%j(m) 3367 local_pf(i,j,nzb+1) = surf_lsm_h%c_liq(m) * surf_lsm_h%c_veg(m) 2862 3368 ENDDO 2863 3369 ELSE … … 2874 3380 CASE ( 'c_soil*_xy' ) ! 2d-array 2875 3381 IF ( av == 0 ) THEN 2876 DO i = nxlg, nxrg2877 DO j = nysg, nyng2878 local_pf(i,j,nzb+1) = 1.0_wp - c_veg(j,i)2879 ENDDO3382 DO m = 1, surf_lsm_h%ns 3383 i = surf_lsm_h%i(m) 3384 j = surf_lsm_h%j(m) 3385 local_pf(i,j,nzb+1) = 1.0_wp - surf_lsm_h%c_veg(m) 2880 3386 ENDDO 2881 3387 ELSE … … 2892 3398 CASE ( 'c_veg*_xy' ) ! 2d-array 2893 3399 IF ( av == 0 ) THEN 2894 DO i = nxlg, nxrg2895 DO j = nysg, nyng2896 local_pf(i,j,nzb+1) = c_veg(j,i)2897 ENDDO3400 DO m = 1, surf_lsm_h%ns 3401 i = surf_lsm_h%i(m) 3402 j = surf_lsm_h%j(m) 3403 local_pf(i,j,nzb+1) = surf_lsm_h%c_veg(m) 2898 3404 ENDDO 2899 3405 ELSE … … 2910 3416 CASE ( 'ghf_eb*_xy' ) ! 2d-array 2911 3417 IF ( av == 0 ) THEN 2912 DO i = nxlg, nxrg2913 DO j = nysg, nyng2914 local_pf(i,j,nzb+1) = ghf_eb(j,i)2915 ENDDO3418 DO m = 1, surf_lsm_h%ns 3419 i = surf_lsm_h%i(m) 3420 j = surf_lsm_h%j(m) 3421 local_pf(i,j,nzb+1) = surf_lsm_h%ghf_eb(m) 2916 3422 ENDDO 2917 3423 ELSE … … 2928 3434 CASE ( 'lai*_xy' ) ! 2d-array 2929 3435 IF ( av == 0 ) THEN 2930 DO i = nxlg, nxrg2931 DO j = nysg, nyng2932 local_pf(i,j,nzb+1) = lai(j,i)2933 ENDDO3436 DO m = 1, surf_lsm_h%ns 3437 i = surf_lsm_h%i(m) 3438 j = surf_lsm_h%j(m) 3439 local_pf(i,j,nzb+1) = surf_lsm_h%lai(m) 2934 3440 ENDDO 2935 3441 ELSE … … 2946 3452 CASE ( 'm_liq_eb*_xy' ) ! 2d-array 2947 3453 IF ( av == 0 ) THEN 2948 DO i = nxlg, nxrg2949 DO j = nysg, nyng2950 local_pf(i,j,nzb+1) = m_liq_eb(j,i)2951 ENDDO3454 DO m = 1, surf_lsm_h%ns 3455 i = surf_lsm_h%i(m) 3456 j = surf_lsm_h%j(m) 3457 local_pf(i,j,nzb+1) = m_liq_eb_h%var_1d(m) 2952 3458 ENDDO 2953 3459 ELSE … … 2964 3470 CASE ( 'm_soil_xy', 'm_soil_xz', 'm_soil_yz' ) 2965 3471 IF ( av == 0 ) THEN 2966 DO i = nxlg, nxrg2967 DO j = nysg, nyng2968 DO k = nzb_soil, nzt_soil2969 local_pf(i,j,k) = m_soil(k,j,i)2970 ENDDO3472 DO m = 1, surf_lsm_h%ns 3473 i = surf_lsm_h%i(m) 3474 j = surf_lsm_h%j(m) 3475 DO k = nzb_soil, nzt_soil 3476 local_pf(i,j,k) = m_soil_h%var_2d(k,m) 2971 3477 ENDDO 2972 3478 ENDDO … … 2988 3494 CASE ( 'qsws_eb*_xy' ) ! 2d-array 2989 3495 IF ( av == 0 ) THEN 2990 DO i = nxlg, nxrg2991 DO j = nysg, nyng2992 local_pf(i,j,nzb+1) = qsws_eb(j,i)2993 ENDDO3496 DO m = 1, surf_lsm_h%ns 3497 i = surf_lsm_h%i(m) 3498 j = surf_lsm_h%j(m) 3499 local_pf(i,j,nzb+1) = surf_lsm_h%qsws_eb(m) 2994 3500 ENDDO 2995 3501 ELSE … … 3006 3512 CASE ( 'qsws_liq_eb*_xy' ) ! 2d-array 3007 3513 IF ( av == 0 ) THEN 3008 DO i = nxlg, nxrg3009 DO j = nysg, nyng3010 local_pf(i,j,nzb+1) = qsws_liq_eb(j,i)3011 ENDDO3514 DO m = 1, surf_lsm_h%ns 3515 i = surf_lsm_h%i(m) 3516 j = surf_lsm_h%j(m) 3517 local_pf(i,j,nzb+1) = surf_lsm_h%qsws_liq_eb(m) 3012 3518 ENDDO 3013 3519 ELSE … … 3024 3530 CASE ( 'qsws_soil_eb*_xy' ) ! 2d-array 3025 3531 IF ( av == 0 ) THEN 3026 DO i = nxlg, nxrg3027 DO j = nysg, nyng3028 local_pf(i,j,nzb+1) = qsws_soil_eb(j,i)3029 ENDDO3532 DO m = 1, surf_lsm_h%ns 3533 i = surf_lsm_h%i(m) 3534 j = surf_lsm_h%j(m) 3535 local_pf(i,j,nzb+1) = surf_lsm_h%qsws_soil_eb(m) 3030 3536 ENDDO 3031 3537 ELSE … … 3042 3548 CASE ( 'qsws_veg_eb*_xy' ) ! 2d-array 3043 3549 IF ( av == 0 ) THEN 3044 DO i = nxlg, nxrg3045 DO j = nysg, nyng3046 local_pf(i,j,nzb+1) = qsws_veg_eb(j,i)3047 ENDDO3550 DO m = 1, surf_lsm_h%ns 3551 i = surf_lsm_h%i(m) 3552 j = surf_lsm_h%j(m) 3553 local_pf(i,j,nzb+1) = surf_lsm_h%qsws_veg_eb(m) 3048 3554 ENDDO 3049 3555 ELSE … … 3061 3567 CASE ( 'r_a*_xy' ) ! 2d-array 3062 3568 IF ( av == 0 ) THEN 3063 DO i = nxlg, nxrg3064 DO j = nysg, nyng3065 local_pf(i,j,nzb+1) = r_a(j,i)3066 ENDDO3569 DO m = 1, surf_lsm_h%ns 3570 i = surf_lsm_h%i(m) 3571 j = surf_lsm_h%j(m) 3572 local_pf(i,j,nzb+1) = surf_lsm_h%r_a(m) 3067 3573 ENDDO 3068 3574 ELSE … … 3079 3585 CASE ( 'r_s*_xy' ) ! 2d-array 3080 3586 IF ( av == 0 ) THEN 3081 DO i = nxlg, nxrg3082 DO j = nysg, nyng3083 local_pf(i,j,nzb+1) = r_s(j,i)3084 ENDDO3587 DO m = 1, surf_lsm_h%ns 3588 i = surf_lsm_h%i(m) 3589 j = surf_lsm_h%j(m) 3590 local_pf(i,j,nzb+1) = surf_lsm_h%r_s(m) 3085 3591 ENDDO 3086 3592 ELSE … … 3097 3603 CASE ( 'shf_eb*_xy' ) ! 2d-array 3098 3604 IF ( av == 0 ) THEN 3099 DO i = nxlg, nxrg3100 DO j = nysg, nyng3101 local_pf(i,j,nzb+1) = shf_eb(j,i)3102 ENDDO3605 DO m = 1, surf_lsm_h%ns 3606 i = surf_lsm_h%i(m) 3607 j = surf_lsm_h%j(m) 3608 local_pf(i,j,nzb+1) = surf_lsm_h%shf_eb(m) 3103 3609 ENDDO 3104 3610 ELSE … … 3115 3621 CASE ( 't_soil_xy', 't_soil_xz', 't_soil_yz' ) 3116 3622 IF ( av == 0 ) THEN 3117 DO i = nxlg, nxrg3118 DO j = nysg, nyng3119 DO k = nzb_soil, nzt_soil3120 local_pf(i,j,k) = t_soil(k,j,i)3121 ENDDO3623 DO m = 1, surf_lsm_h%ns 3624 i = surf_lsm_h%i(m) 3625 j = surf_lsm_h%j(m) 3626 DO k = nzb_soil, nzt_soil 3627 local_pf(i,j,k) = t_soil_h%var_2d(k,m) 3122 3628 ENDDO 3123 3629 ENDDO … … 3168 3674 INTEGER(iwp) :: j !< 3169 3675 INTEGER(iwp) :: k !< 3676 INTEGER(iwp) :: m !< running index 3170 3677 3171 3678 LOGICAL :: found !< … … 3178 3685 3179 3686 SELECT CASE ( TRIM( variable ) ) 3180 3687 ! 3688 !-- Requires 3D exchange 3181 3689 3182 3690 CASE ( 'm_soil' ) 3183 3691 3184 3692 IF ( av == 0 ) THEN 3185 DO i = nxlg, nxrg3186 DO j = nysg, nyng3187 DO k = nzb_soil, nzt_soil3188 local_pf(i,j,k) = m_soil(k,j,i)3189 ENDDO3190 ENDDO3693 DO m = 1, surf_lsm_h%ns 3694 i = surf_lsm_h%i(m) 3695 j = surf_lsm_h%j(m) 3696 DO k = nzb_soil, nzt_soil 3697 local_pf(i,j,k) = m_soil_h%var_2d(k,m) 3698 ENDDO 3191 3699 ENDDO 3192 3700 ELSE … … 3203 3711 3204 3712 IF ( av == 0 ) THEN 3205 DO i = nxlg, nxrg3206 DO j = nysg, nyng3207 DO k = nzb_soil, nzt_soil3208 local_pf(i,j,k) = t_soil(k,j,i)3209 ENDDO3713 DO m = 1, surf_lsm_h%ns 3714 i = surf_lsm_h%i(m) 3715 j = surf_lsm_h%j(m) 3716 DO k = nzb_soil, nzt_soil 3717 local_pf(i,j,k) = t_soil_h%var_2d(k,m) 3210 3718 ENDDO 3211 3719 ENDDO … … 3261 3769 WRITE ( 14 ) 'lai_av '; WRITE ( 14 ) lai_av 3262 3770 ENDIF 3263 WRITE ( 14 ) 'm_liq_eb '; WRITE ( 14 ) m_liq_eb3771 WRITE ( 14 ) 'm_liq_eb '; WRITE ( 14 ) m_liq_eb_h 3264 3772 IF ( ALLOCATED( m_liq_eb_av ) ) THEN 3265 3773 WRITE ( 14 ) 'm_liq_eb_av '; WRITE ( 14 ) m_liq_eb_av 3266 3774 ENDIF 3267 WRITE ( 14 ) 'm_soil '; WRITE ( 14 ) m_soil3775 WRITE ( 14 ) 'm_soil '; WRITE ( 14 ) m_soil_h 3268 3776 IF ( ALLOCATED( m_soil_av ) ) THEN 3269 3777 WRITE ( 14 ) 'm_soil_av '; WRITE ( 14 ) m_soil_av … … 3284 3792 WRITE ( 14 ) 'shf_eb_av '; WRITE ( 14 ) shf_eb_av 3285 3793 ENDIF 3286 WRITE ( 14 ) 't_soil '; WRITE ( 14 ) t_soil3794 WRITE ( 14 ) 't_soil '; WRITE ( 14 ) t_soil_h 3287 3795 IF ( ALLOCATED( t_soil_av ) ) THEN 3288 3796 WRITE ( 14 ) 't_soil_av '; WRITE ( 14 ) t_soil_av … … 3349 3857 tmp_3d2 !< 3350 3858 3859 REAL(wp), & 3860 DIMENSION(1:surf_lsm_h%ns) :: & 3861 tmp_walltype_1d !< 3862 3863 REAL(wp), & 3864 DIMENSION(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) :: & 3865 tmp_walltype_2d !< 3866 3867 REAL(wp), & 3868 DIMENSION(nzb_soil:nzt_soil,1:surf_lsm_h%ns) :: & 3869 tmp_walltype_2d2 !< 3870 3351 3871 3352 3872 IF ( initializing_actions == 'read_restart_data' ) THEN … … 3366 3886 nync = nynfa(i,k) + offset_ya(i,k) 3367 3887 3368 3369 3888 SELECT CASE ( TRIM( field_char ) ) 3889 3370 3890 3371 3891 CASE ( 'c_liq_av' ) … … 3374 3894 ENDIF 3375 3895 IF ( k == 1 ) READ ( 13 ) tmp_2d 3376 c_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3896 c_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3377 3897 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3378 3898 … … 3382 3902 ENDIF 3383 3903 IF ( k == 1 ) READ ( 13 ) tmp_2d 3384 c_soil_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3904 c_soil_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3385 3905 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3386 3906 … … 3390 3910 ENDIF 3391 3911 IF ( k == 1 ) READ ( 13 ) tmp_2d 3392 c_veg_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3912 c_veg_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3393 3913 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3394 3914 … … 3398 3918 ENDIF 3399 3919 IF ( k == 1 ) READ ( 13 ) tmp_2d 3400 ghf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3920 ghf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3401 3921 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3402 3922 3403 3923 CASE ( 'm_liq_eb' ) 3404 IF ( k == 1 ) READ ( 13 ) tmp_ 2d3405 m_liq_eb (nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&3406 tmp_ 2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)3924 IF ( k == 1 ) READ ( 13 ) tmp_walltype_1d !tmp_2d 3925 m_liq_eb_h%var_1d(1:surf_lsm_h%ns) = & 3926 tmp_walltype_1d(1:surf_lsm_h%ns) 3407 3927 3408 3928 CASE ( 'lai_av' ) … … 3411 3931 ENDIF 3412 3932 IF ( k == 1 ) READ ( 13 ) tmp_2d 3413 lai_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3933 lai_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3414 3934 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3415 3935 … … 3423 3943 3424 3944 CASE ( 'm_soil' ) 3425 IF ( k == 1 ) READ ( 13 ) tmp_3d2(:,:,:) 3426 m_soil(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3427 tmp_3d2(nzb_soil:nzt_soil,nysf-nbgp:nynf & 3428 +nbgp,nxlf-nbgp:nxrf+nbgp) 3945 IF ( k == 1 ) READ ( 13 ) tmp_walltype_2d2(:,:) 3946 m_soil_h%var_2d(:,1:surf_lsm_h%ns) = & 3947 tmp_walltype_2d2(:,1:surf_lsm_h%ns) 3429 3948 3430 3949 CASE ( 'm_soil_av' ) … … 3442 3961 ENDIF 3443 3962 IF ( k == 1 ) READ ( 13 ) tmp_2d 3444 qsws_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3963 qsws_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3445 3964 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3446 3965 … … 3450 3969 ENDIF 3451 3970 IF ( k == 1 ) READ ( 13 ) tmp_2d 3452 qsws_liq_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3971 qsws_liq_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3453 3972 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3454 3973 CASE ( 'qsws_soil_eb_av' ) … … 3473 3992 ENDIF 3474 3993 IF ( k == 1 ) READ ( 13 ) tmp_2d 3475 shf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &3994 shf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3476 3995 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3477 3996 3478 3997 CASE ( 't_soil' ) 3479 IF ( k == 1 ) READ ( 13 ) tmp_3d 3480 t_soil(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3481 tmp_3d(:,nysf-nbgp:nynf+nbgp, & 3482 nxlf-nbgp:nxrf+nbgp) 3998 IF ( k == 1 ) READ ( 13 ) tmp_walltype_2d(:,:) 3999 t_soil_h%var_2d(:,1:surf_lsm_h%ns) = & 4000 tmp_walltype_2d(:,1:surf_lsm_h%ns) 3483 4001 3484 4002 CASE ( 't_soil_av' ) … … 3488 4006 IF ( k == 1 ) READ ( 13 ) tmp_3d2(:,:,:) 3489 4007 t_soil_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = & 3490 tmp_3d (:,nysf-nbgp:nynf+nbgp, &4008 tmp_3d2(:,nysf-nbgp:nynf+nbgp, & 3491 4009 nxlf-nbgp:nxrf+nbgp) 3492 4010 … … 3525 4043 IMPLICIT NONE 3526 4044 3527 INTEGER :: i !< running index 3528 INTEGER :: j !< running index 4045 INTEGER(iwp) :: i !< running index 4046 INTEGER(iwp) :: j !< running index 4047 INTEGER(iwp) :: m !< running index 3529 4048 3530 4049 REAL(wp), PARAMETER :: alpha_ch = 0.018_wp !< Charnock constant (0.01-0.11). Use 0.01 for FLake and 0.018 for ECMWF … … 3533 4052 ! REAL(wp) :: re_0 !< near-surface roughness Reynolds number 3534 4053 3535 3536 DO i = nxlg, nxrg 3537 DO j = nysg, nyng 3538 IF ( water_surface(j,i) ) THEN 3539 3540 ! 3541 !-- Disabled: FLake parameterization. Ideally, the Charnock 3542 !-- coefficient should depend on the water depth and the fetch 3543 !-- length 3544 ! re_0 = z0(j,i) * us(j,i) / molecular_viscosity 4054 DO m = 1, surf_lsm_h%ns 4055 4056 i = surf_lsm_h%i(m) 4057 j = surf_lsm_h%j(m) 4058 4059 IF ( surf_lsm_h%water_surface(m) ) THEN 4060 4061 ! 4062 !-- Disabled: FLake parameterization. Ideally, the Charnock 4063 !-- coefficient should depend on the water depth and the fetch 4064 !-- length 4065 ! re_0 = z0(j,i) * us(j,i) / molecular_viscosity 3545 4066 ! 3546 ! z0(j,i) = MAX( 0.1_wp * molecular_viscosity / us(j,i), & 3547 ! alpha_ch * us(j,i) / g ) 3548 ! 3549 ! z0h(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 3.2_wp ) ) 3550 ! z0q(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 4.2_wp ) ) 3551 3552 ! 3553 !-- Set minimum roughness length for u* > 0.2 3554 ! IF ( us(j,i) > 0.2_wp ) THEN 3555 ! z0h(j,i) = MAX( 1.0E-5_wp, z0h(j,i) ) 3556 ! z0q(j,i) = MAX( 1.0E-5_wp, z0q(j,i) ) 3557 ! ENDIF 3558 3559 ! 3560 !-- ECMWF IFS model parameterization after Beljaars (1994). At low 3561 !-- wind speed, the sea surface becomes aerodynamically smooth and 3562 !-- the roughness scales with the viscosity. At high wind speed, the 3563 !-- Charnock relation is used. 3564 z0(j,i) = ( 0.11_wp * molecular_viscosity / us(j,i) ) & 3565 + ( alpha_ch * us(j,i)**2 / g ) 3566 3567 z0h(j,i) = 0.40_wp * molecular_viscosity / us(j,i) 3568 z0q(j,i) = 0.62_wp * molecular_viscosity / us(j,i) 3569 3570 ENDIF 3571 ENDDO 4067 ! z0(j,i) = MAX( 0.1_wp * molecular_viscosity / us(j,i), & 4068 ! alpha_ch * us(j,i) / g ) 4069 ! 4070 ! z0h(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 3.2_wp ) ) 4071 ! z0q(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 4.2_wp ) ) 4072 4073 ! 4074 !-- Set minimum roughness length for u* > 0.2 4075 ! IF ( us(j,i) > 0.2_wp ) THEN 4076 ! z0h(j,i) = MAX( 1.0E-5_wp, z0h(j,i) ) 4077 ! z0q(j,i) = MAX( 1.0E-5_wp, z0q(j,i) ) 4078 ! ENDIF 4079 4080 ! 4081 !-- ECMWF IFS model parameterization after Beljaars (1994). At low 4082 !-- wind speed, the sea surface becomes aerodynamically smooth and 4083 !-- the roughness scales with the viscosity. At high wind speed, the 4084 !-- Charnock relation is used. 4085 surf_lsm_h%z0(m) = ( 0.11_wp * molecular_viscosity / & 4086 surf_lsm_h%us(m) ) & 4087 + ( alpha_ch * surf_lsm_h%us(m)**2 / g ) 4088 4089 surf_lsm_h%z0h(m) = 0.40_wp * molecular_viscosity / & 4090 surf_lsm_h%us(m) 4091 surf_lsm_h%z0q(m) = 0.62_wp * molecular_viscosity / & 4092 surf_lsm_h%us(m) 4093 4094 ENDIF 3572 4095 ENDDO 3573 4096 … … 3575 4098 3576 4099 3577 !------------------------------------------------------------------------------!3578 ! Description:3579 ! ------------3580 !> Calculation of specific humidity of the skin layer (surface). It is assumend3581 !> that the skin is always saturated.3582 !------------------------------------------------------------------------------!3583 SUBROUTINE calc_q_surface3584 3585 IMPLICIT NONE3586 3587 INTEGER :: i !< running index3588 INTEGER :: j !< running index3589 INTEGER :: k !< running index3590 3591 REAL(wp) :: resistance !< aerodynamic and soil resistance term3592 3593 DO i = nxlg, nxrg3594 DO j = nysg, nyng3595 k = nzb_s_inner(j,i)3596 3597 !3598 !-- Calculate water vapour pressure at saturation3599 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface_p(j,i) &3600 - 273.16_wp ) / ( t_surface_p(j,i) - 35.86_wp ) )3601 3602 !3603 !-- Calculate specific humidity at saturation3604 q_s = 0.622_wp * e_s / surface_pressure3605 3606 resistance = r_a(j,i) / (r_a(j,i) + r_s(j,i))3607 3608 !3609 !-- Calculate specific humidity at surface3610 IF ( cloud_physics ) THEN3611 q(k,j,i) = resistance * q_s + (1.0_wp - resistance) &3612 * ( q(k+1,j,i) - ql(k+1,j,i) )3613 ELSE3614 q(k,j,i) = resistance * q_s + (1.0_wp - resistance) &3615 * q(k+1,j,i)3616 ENDIF3617 3618 !3619 !-- Update virtual potential temperature3620 vpt(k,j,i) = pt(k,j,i) * ( 1.0_wp + 0.61_wp * q(k,j,i) )3621 3622 ENDDO3623 ENDDO3624 3625 END SUBROUTINE calc_q_surface3626 3627 4100 3628 4101 END MODULE land_surface_model_mod -
palm/trunk/SOURCE/lpm.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 123 123 124 124 USE indices, & 125 ONLY: nxl, nxr, nys, nyn, nzb, nzb_max, nzt , nzb_w_inner125 ONLY: nxl, nxr, nys, nyn, nzb, nzb_max, nzt 126 126 127 127 USE kinds … … 365 365 !-- Increment time since last release 366 366 IF ( dt_3d_reached ) time_prel = time_prel + dt_3d 367 368 367 ! 369 368 !-- Move Particles local to PE to a different grid cell -
palm/trunk/SOURCE/lpm_advec.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 109 109 110 110 USE arrays_3d, & 111 ONLY: de_dx, de_dy, de_dz, diss, e, km, u, us, usws, v, vsws, w, zu, zw111 ONLY: de_dx, de_dy, de_dz, diss, e, km, u, v, w, zu, zw 112 112 113 113 USE cpulog … … 123 123 124 124 USE indices, & 125 ONLY: nzb, nzb_ s_inner, nzt125 ONLY: nzb, nzb_max, nzt, wall_flags_0 126 126 127 127 USE kinds … … 136 136 ONLY: hom 137 137 138 USE surface_mod, & 139 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 140 138 141 IMPLICIT NONE 139 142 … … 147 150 INTEGER(iwp) :: jlog !< index variable along y 148 151 INTEGER(iwp) :: k !< index variable along z 152 INTEGER(iwp) :: k_wall !< vertical index of topography top 149 153 INTEGER(iwp) :: kp !< index variable along z 150 154 INTEGER(iwp) :: kw !< index variable along z … … 152 156 INTEGER(iwp) :: nb !< block number particles are sorted in 153 157 INTEGER(iwp) :: num_gp !< number of adjacent grid points inside topography 158 INTEGER(iwp) :: surf_start !< Index on surface data-type for current grid box 154 159 155 160 INTEGER(iwp), DIMENSION(0:7) :: start_index !< start particle index for current block … … 194 199 REAL(wp) :: u_int_u !< x/y-interpolated u-component at particle position at upper vertical level 195 200 REAL(wp) :: us_int !< friction velocity at particle grid box 201 REAL(wp) :: usws_int !< surface momentum flux (u component) at particle grid box 196 202 REAL(wp) :: v_int_l !< x/y-interpolated v-component at particle position at lower vertical level 197 203 REAL(wp) :: v_int_u !< x/y-interpolated v-component at particle position at upper vertical level 204 REAL(wp) :: vsws_int !< surface momentum flux (u component) at particle grid box 198 205 REAL(wp) :: vv_int !< 199 206 REAL(wp) :: w_int_l !< x/y-interpolated w-component at particle position at lower vertical level … … 258 265 j = jp + block_offset(nb)%j_off 259 266 k = kp + block_offset(nb)%k_off 260 261 262 267 ! 263 268 !-- Interpolate u velocity-component … … 271 276 !-- Monin-Obukhov relations (if branch). 272 277 !-- First, check if particle is located below first vertical grid level 273 !-- (Prandtl-layer height)278 !-- above topography (Prandtl-layer height) 274 279 ilog = ( particles(n)%x + 0.5_wp * dx ) * ddx 275 280 jlog = ( particles(n)%y + 0.5_wp * dy ) * ddy 276 277 IF ( constant_flux_layer .AND. & 278 zv(n) - zw(nzb_s_inner(jlog,ilog)) < z_p ) THEN 281 ! 282 !-- Determine vertical index of topography top 283 k_wall = MAXLOC( & 284 MERGE( 1, 0, & 285 BTEST( wall_flags_0(nzb:nzb_max,jlog,ilog), 12 ) & 286 ), DIM = 1 & 287 ) - 1 288 289 IF ( constant_flux_layer .AND. zv(n) - zw(k_wall) < z_p ) THEN 279 290 ! 280 291 !-- Resolved-scale horizontal particle velocity is zero below z0. 281 IF ( zv(n) - zw( nzb_s_inner(jlog,ilog)) < z0_av_global ) THEN292 IF ( zv(n) - zw(k_wall) < z0_av_global ) THEN 282 293 u_int(n) = 0.0_wp 283 294 ELSE 284 295 ! 285 296 !-- Determine the sublayer. Further used as index. 286 height_p = ( zv(n) - zw( nzb_s_inner(jlog,ilog)) - z0_av_global ) &297 height_p = ( zv(n) - zw(k_wall) - z0_av_global ) & 287 298 * REAL( number_of_sublayers, KIND=wp ) & 288 299 * d_z_p_z0 … … 296 307 ) 297 308 ! 298 !-- Limit friction velocity. In narrow canyons or holes the 299 !-- friction velocity can become very small, resulting in a too 300 !-- large particle speed. 301 us_int = MAX( 0.5_wp * ( us(jlog,ilog) + us(jlog,ilog-1) ), & 302 0.01_wp ) 309 !-- Get friction velocity and momentum flux from new surface data 310 !-- types. 311 IF ( surf_def_h(0)%start_index(jlog,ilog) <= & 312 surf_def_h(0)%end_index(jlog,ilog) ) THEN 313 surf_start = surf_def_h(0)%start_index(jlog,ilog) 314 !-- Limit friction velocity. In narrow canyons or holes the 315 !-- friction velocity can become very small, resulting in a too 316 !-- large particle speed. 317 us_int = MAX( surf_def_h(0)%us(surf_start), 0.01_wp ) 318 usws_int = surf_def_h(0)%usws(surf_start) 319 ELSEIF ( surf_lsm_h%start_index(jlog,ilog) <= & 320 surf_lsm_h%end_index(jlog,ilog) ) THEN 321 surf_start = surf_lsm_h%start_index(jlog,ilog) 322 us_int = MAX( surf_lsm_h%us(surf_start), 0.01_wp ) 323 usws_int = surf_lsm_h%usws(surf_start) 324 ELSEIF ( surf_usm_h%start_index(jlog,ilog) <= & 325 surf_usm_h%end_index(jlog,ilog) ) THEN 326 surf_start = surf_usm_h%start_index(jlog,ilog) 327 us_int = MAX( surf_usm_h%us(surf_start), 0.01_wp ) 328 usws_int = surf_usm_h%usws(surf_start) 329 ENDIF 330 303 331 ! 304 332 !-- Neutral solution is applied for all situations, e.g. also for … … 308 336 !-- as sensitivity studies revealed no significant effect of 309 337 !-- using the neutral solution also for un/stable situations. 310 u_int(n) = -usws (jlog,ilog) / ( us_int * kappa + 1E-10_wp )&338 u_int(n) = -usws_int / ( us_int * kappa + 1E-10_wp ) & 311 339 * log_z_z0_int - u_gtrans 312 340 … … 352 380 ilog = ( particles(n)%x + 0.5_wp * dx ) * ddx 353 381 jlog = ( particles(n)%y + 0.5_wp * dy ) * ddy 354 IF ( constant_flux_layer .AND. & 355 zv(n) - zw(nzb_s_inner(jlog,ilog)) < z_p ) THEN 356 357 IF ( zv(n) - zw(nzb_s_inner(jlog,ilog)) < z0_av_global ) THEN 382 ! 383 !-- Determine vertical index of topography top 384 k_wall = MAXLOC( & 385 MERGE( 1, 0, & 386 BTEST( wall_flags_0(nzb:nzb_max,jlog,ilog), 12 ) & 387 ), DIM = 1 & 388 ) - 1 389 390 IF ( constant_flux_layer .AND. zv(n) - zw(k_wall) < z_p ) THEN 391 IF ( zv(n) - zw(k_wall) < z0_av_global ) THEN 358 392 ! 359 393 !-- Resolved-scale horizontal particle velocity is zero below z0. … … 365 399 !-- topography particle on u-grid can be above surface-layer height, 366 400 !-- whereas it can be below on v-grid. 367 height_p = ( zv(n) - zw( nzb_s_inner(jlog,ilog)) - z0_av_global ) &401 height_p = ( zv(n) - zw(k_wall) - z0_av_global ) & 368 402 * REAL( number_of_sublayers, KIND=wp ) & 369 403 * d_z_p_z0 … … 377 411 ) 378 412 ! 379 !-- Limit friction velocity. In narrow canyons or holes the 380 !-- friction velocity can become very small, resulting in a too 381 !-- large particle speed. 382 us_int = MAX( 0.5_wp * ( us(jlog,ilog) + us(jlog-1,ilog) ), & 383 0.01_wp ) 413 !-- Get friction velocity and momentum flux from new surface data 414 !-- types. 415 IF ( surf_def_h(0)%start_index(jlog,ilog) <= & 416 surf_def_h(0)%end_index(jlog,ilog) ) THEN 417 surf_start = surf_def_h(0)%start_index(jlog,ilog) 418 !-- Limit friction velocity. In narrow canyons or holes the 419 !-- friction velocity can become very small, resulting in a too 420 !-- large particle speed. 421 us_int = MAX( surf_def_h(0)%us(surf_start), 0.01_wp ) 422 vsws_int = surf_def_h(0)%usws(surf_start) 423 ELSEIF ( surf_lsm_h%start_index(jlog,ilog) <= & 424 surf_lsm_h%end_index(jlog,ilog) ) THEN 425 surf_start = surf_lsm_h%start_index(jlog,ilog) 426 us_int = MAX( surf_lsm_h%us(surf_start), 0.01_wp ) 427 vsws_int = surf_lsm_h%usws(surf_start) 428 ELSEIF ( surf_usm_h%start_index(jlog,ilog) <= & 429 surf_usm_h%end_index(jlog,ilog) ) THEN 430 surf_start = surf_usm_h%start_index(jlog,ilog) 431 us_int = MAX( surf_usm_h%us(surf_start), 0.01_wp ) 432 vsws_int = surf_usm_h%usws(surf_start) 433 ENDIF 384 434 ! 385 435 !-- Neutral solution is applied for all situations, e.g. also for … … 389 439 !-- as sensitivity studies revealed no significant effect of 390 440 !-- using the neutral solution also for un/stable situations. 391 v_int(n) = -vsws (jlog,ilog) / ( us_int * kappa + 1E-10_wp )&441 v_int(n) = -vsws_int / ( us_int * kappa + 1E-10_wp ) & 392 442 * log_z_z0_int - v_gtrans 393 443 … … 622 672 num_gp = 0 623 673 624 IF ( k > nzb_s_inner(j,i) .OR. nzb_s_inner(j,i) == 0 ) THEN 674 ! 675 !-- Determine vertical index of topography top at (j,i) 676 k_wall = MAXLOC( & 677 MERGE( 1, 0, & 678 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 679 ), DIM = 1 & 680 ) - 1 681 ! 682 !-- To do: Reconsider order of computations in order to avoid 683 !-- unnecessary index calculations. 684 IF ( k > k_wall .OR. k_wall == 0 ) THEN 625 685 num_gp = num_gp + 1 626 686 gp_outside_of_building(1) = 1 … … 634 694 de_dzi(num_gp) = de_dz(k,j,i) 635 695 ENDIF 636 IF ( k > nzb_s_inner(j+1,i) .OR. nzb_s_inner(j+1,i) == 0 ) THEN 696 697 ! 698 !-- Determine vertical index of topography top at (j+1,i) 699 k_wall = MAXLOC( & 700 MERGE( 1, 0, & 701 BTEST( wall_flags_0(nzb:nzb_max,j+1,i), 12 ) & 702 ), DIM = 1 & 703 ) - 1 704 IF ( k > k_wall .OR. k_wall == 0 ) THEN 637 705 num_gp = num_gp + 1 638 706 gp_outside_of_building(2) = 1 … … 647 715 ENDIF 648 716 649 IF ( k+1 > nzb_s_inner(j,i) .OR. nzb_s_inner(j,i) == 0 ) THEN 717 ! 718 !-- Determine vertical index of topography top at (j,i) 719 k_wall = MAXLOC( & 720 MERGE( 1, 0, & 721 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 722 ), DIM = 1 & 723 ) - 1 724 IF ( k+1 > k_wall .OR. k_wall == 0 ) THEN 650 725 num_gp = num_gp + 1 651 726 gp_outside_of_building(3) = 1 … … 660 735 ENDIF 661 736 662 IF ( k+1 > nzb_s_inner(j+1,i) .OR. nzb_s_inner(j+1,i) == 0 ) THEN 737 ! 738 !-- Determine vertical index of topography top at (j+1,i) 739 k_wall = MAXLOC( & 740 MERGE( 1, 0, & 741 BTEST( wall_flags_0(nzb:nzb_max,j+1,i), 12 ) & 742 ), DIM = 1 & 743 ) - 1 744 IF ( k+1 > k_wall .OR. k_wall == 0 ) THEN 663 745 num_gp = num_gp + 1 664 746 gp_outside_of_building(4) = 1 … … 673 755 ENDIF 674 756 675 IF ( k > nzb_s_inner(j,i+1) .OR. nzb_s_inner(j,i+1) == 0 ) THEN 757 ! 758 !-- Determine vertical index of topography top at (j,i+1) 759 k_wall = MAXLOC( & 760 MERGE( 1, 0, & 761 BTEST( wall_flags_0(nzb:nzb_max,j,i+1), 12 ) & 762 ), DIM = 1 & 763 ) - 1 764 IF ( k > k_wall .OR. k_wall == 0 ) THEN 676 765 num_gp = num_gp + 1 677 766 gp_outside_of_building(5) = 1 … … 686 775 ENDIF 687 776 688 IF ( k > nzb_s_inner(j+1,i+1) .OR. nzb_s_inner(j+1,i+1) == 0 ) THEN 777 ! 778 !-- Determine vertical index of topography top at (j+1,i+1) 779 k_wall = MAXLOC( & 780 MERGE( 1, 0, & 781 BTEST( wall_flags_0(nzb:nzb_max,j+1,i+1), 12 )& 782 ), DIM = 1 & 783 ) - 1 784 IF ( k > k_wall .OR. k_wall == 0 ) THEN 689 785 num_gp = num_gp + 1 690 786 gp_outside_of_building(6) = 1 … … 699 795 ENDIF 700 796 701 IF ( k+1 > nzb_s_inner(j,i+1) .OR. nzb_s_inner(j,i+1) == 0 ) THEN 797 ! 798 !-- Determine vertical index of topography top at (j,i+1) 799 k_wall = MAXLOC( & 800 MERGE( 1, 0, & 801 BTEST( wall_flags_0(nzb:nzb_max,j,i+1), 12 ) & 802 ), DIM = 1 & 803 ) - 1 804 IF ( k+1 > k_wall .OR. k_wall == 0 ) THEN 702 805 num_gp = num_gp + 1 703 806 gp_outside_of_building(7) = 1 … … 712 815 ENDIF 713 816 714 IF ( k+1 > nzb_s_inner(j+1,i+1) .OR. nzb_s_inner(j+1,i+1) == 0) THEN 817 ! 818 !-- Determine vertical index of topography top at (j+1,i+1) 819 k_wall = MAXLOC( & 820 MERGE( 1, 0, & 821 BTEST( wall_flags_0(nzb:nzb_max,j+1,i+1), 12 )& 822 ), DIM = 1 & 823 ) - 1 824 IF ( k+1 > k_wall .OR. k_wall == 0) THEN 715 825 num_gp = num_gp + 1 716 826 gp_outside_of_building(8) = 1 -
palm/trunk/SOURCE/lpm_boundary_conds.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography and surface concept 23 ! Rename character range into location, as range is an intrinsic. 23 24 ! 24 25 ! Former revisions: … … 78 79 !> (see offset_ocean_*) 79 80 !------------------------------------------------------------------------------! 80 SUBROUTINE lpm_boundary_conds( range)81 SUBROUTINE lpm_boundary_conds( location ) 81 82 82 83 … … 94 95 95 96 USE indices, & 96 ONLY: nxl, nxr, nyn, nys, nz, nzb _s_inner97 ONLY: nxl, nxr, nyn, nys, nz, nzb, nzb_max, wall_flags_0 97 98 98 99 USE kinds … … 107 108 IMPLICIT NONE 108 109 109 CHARACTER (LEN=*) :: range!<110 CHARACTER (LEN=*) :: location !< 110 111 111 112 INTEGER(iwp) :: inc !< dummy for sorting algorithmus … … 118 119 INTEGER(iwp) :: j2 !< grid index (x) of current particle position 119 120 INTEGER(iwp) :: j3 !< grid index (x) of intermediate particle position 121 INTEGER(iwp) :: k_wall !< vertical index of topography top 120 122 INTEGER(iwp) :: n !< particle number 121 123 INTEGER(iwp) :: t_index !< running index for intermediate particle timesteps in reflection algorithmus … … 167 169 168 170 169 IF ( range== 'bottom/top' ) THEN171 IF ( location == 'bottom/top' ) THEN 170 172 171 173 ! … … 232 234 ENDDO 233 235 234 ELSEIF ( range== 'walls' ) THEN236 ELSEIF ( location == 'walls' ) THEN 235 237 236 238 … … 281 283 ENDIF 282 284 ! 283 !-- Walls aligned in xy layer at which particle can be possiblly reflected 284 zwall1 = zw(nzb_s_inner(j2,i2)) 285 zwall2 = zw(nzb_s_inner(j1,i1)) 286 zwall3 = zw(nzb_s_inner(j1,i2)) 287 zwall4 = zw(nzb_s_inner(j2,i1)) 285 !-- Walls aligned in xy layer at which particle can be possiblly reflected. 286 !-- The construct of MERGE and BTEST is used to determine the topography- 287 !-- top index (former nzb_s_inner). 288 zwall1 = zw( MAXLOC( & 289 MERGE( 1, 0, & 290 BTEST( wall_flags_0(nzb:nzb_max,j2,i2), 12 ) & 291 ), DIM = 1 & 292 ) - 1 ) 293 zwall2 = zw( MAXLOC( & 294 MERGE( 1, 0, & 295 BTEST( wall_flags_0(nzb:nzb_max,j1,i1), 12 ) & 296 ), DIM = 1 & 297 ) - 1 ) 298 zwall3 = zw( MAXLOC( & 299 MERGE( 1, 0, & 300 BTEST( wall_flags_0(nzb:nzb_max,j1,i2), 12 ) & 301 ), DIM = 1 & 302 ) - 1 ) 303 zwall4 = zw( MAXLOC( & 304 MERGE( 1, 0, & 305 BTEST( wall_flags_0(nzb:nzb_max,j2,i1), 12 ) & 306 ), DIM = 1 & 307 ) - 1 ) 288 308 ! 289 309 !-- Initialize flags to check if particle reflection is necessary … … 469 489 !-- constant is required, as the particle position do not 470 490 !-- necessarily exactly match the wall location due to rounding 471 !-- errors. 491 !-- errors. At first, determine index of topography top at (j3,i3) 492 k_wall = MAXLOC( & 493 MERGE( 1, 0, & 494 BTEST( wall_flags_0(nzb:nzb_max,j3,i3), 12 ) & 495 ), DIM = 1 & 496 ) - 1 472 497 IF ( ABS( pos_x - xwall ) < eps .AND. & 473 pos_z <= zw( nzb_s_inner(j3,i3)).AND. &498 pos_z <= zw(k_wall) .AND. & 474 499 reach_x(t_index) .AND. & 475 500 .NOT. reflect_x ) THEN … … 504 529 ! 505 530 !-- Check if a particle needs to be reflected at any xz-wall. If 506 !-- necessary, carry out reflection. 531 !-- necessary, carry out reflection. At first, determine index of 532 !-- topography top at (j3,i3) 533 k_wall = MAXLOC( & 534 MERGE( 1, 0, & 535 BTEST( wall_flags_0(nzb:nzb_max,j3,i3), 12 ) & 536 ), DIM = 1 & 537 ) - 1 507 538 IF ( ABS( pos_y - ywall ) < eps .AND. & 508 pos_z <= zw( nzb_s_inner(j3,i3)).AND. &539 pos_z <= zw(k_wall) .AND. & 509 540 reach_y(t_index) .AND. & 510 541 .NOT. reflect_y ) THEN … … 525 556 ! 526 557 !-- Check if a particle needs to be reflected at any xy-wall. If 527 !-- necessary, carry out reflection. 558 !-- necessary, carry out reflection. 528 559 IF ( downwards .AND. reach_z(t_index) .AND. & 529 560 .NOT. reflect_z ) THEN 530 IF ( pos_z - zw(nzb_s_inner(j3,i3)) < eps ) THEN 561 ! 562 !-- Determine index of topography top at (j3,i3) and chick if 563 !-- particle is below. 564 k_wall = MAXLOC( & 565 MERGE( 1, 0, & 566 BTEST( wall_flags_0(nzb:nzb_max,j3,i3), 12 )& 567 ), DIM = 1 & 568 ) - 1 569 IF ( pos_z - zw(k_wall) < eps ) THEN 531 570 532 pos_z = MAX( 2.0_wp * zw( nzb_s_inner(j3,i3)) - pos_z, &533 zw( nzb_s_inner(j3,i3)) )571 pos_z = MAX( 2.0_wp * zw(k_wall) - pos_z, & 572 zw(k_wall) ) 534 573 535 574 particles(n)%speed_z = - particles(n)%speed_z -
palm/trunk/SOURCE/lpm_init.f90
r2224 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! Adjustments according to new topography realization 22 23 ! 23 24 ! … … 146 147 147 148 USE arrays_3d, & 148 ONLY: de_dx, de_dy, de_dz, zu, zw , z0149 ONLY: de_dx, de_dy, de_dz, zu, zw 149 150 150 151 USE control_parameters, & … … 157 158 USE indices, & 158 159 ONLY: nx, nxl, nxlg, nxrg, nxr, ny, nyn, nys, nyng, nysg, nz, nzb, & 159 nzb_ w_inner, nzt160 nzb_max, nzt, wall_flags_0 160 161 161 162 USE kinds … … 196 197 ONLY: random_function 197 198 199 USE surface_mod, & 200 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 201 198 202 IMPLICIT NONE 199 203 … … 287 291 number_of_particle_groups = max_number_of_particle_groups 288 292 ENDIF 293 ! 294 !-- Check if downward-facing walls exist. This case, reflection boundary 295 !-- conditions (as well as subgrid-scale velocities) may do not work 296 !-- propably (not realized so far). 297 IF ( surf_def_h(1)%ns >= 1 ) THEN 298 WRITE( message_string, * ) 'Overhanging topograpyh do not work '// & 299 'with particles' 300 CALL message( 'lpm_init', 'PA0212', 0, 1, 0, 6, 0 ) 301 302 ENDIF 289 303 290 304 ! … … 355 369 356 370 ALLOCATE ( log_z_z0(0:number_of_sublayers) ) 357 z_p 371 z_p = zu(nzb+1) - zw(nzb) 358 372 359 373 ! … … 362 376 !-- However, sensitivity studies showed that the effect is 363 377 !-- negligible. 364 z0_av_local = SUM( z0(nys:nyn,nxl:nxr) ) 378 z0_av_local = SUM( surf_def_h(0)%z0 ) + SUM( surf_lsm_h%z0 ) + & 379 SUM( surf_usm_h%z0 ) 365 380 z0_av_global = 0.0_wp 366 381 … … 577 592 INTEGER(iwp) :: j !< loop variable ( particles per point ) 578 593 INTEGER(iwp) :: jp !< index variable along y 594 INTEGER(iwp) :: k !< index variable along z 595 INTEGER(iwp) :: k_surf !< index of surface grid point 579 596 INTEGER(iwp) :: kp !< index variable along z 580 597 INTEGER(iwp) :: loop_stride !< loop variable for initialization … … 679 696 ! 680 697 !-- Determine the grid indices of the particle position 681 ip = ( tmp_particle%x + 0.5_wp * dx ) * ddx698 ip = ( tmp_particle%x + 0.5_wp * dx ) * ddx 682 699 jp = ( tmp_particle%y + 0.5_wp * dy ) * ddy 683 700 kp = tmp_particle%z / dz + 1 + offset_ocean_nzt 701 ! 702 !-- Determine surface level. Therefore, check for 703 !-- upward-facing wall on w-grid. MAXLOC will return 704 !-- the index of the lowest upward-facing wall. 705 k_surf = MAXLOC( & 706 MERGE( 1, 0, & 707 BTEST( wall_flags_0(nzb:nzb_max,jp,ip), 18 )& 708 ), DIM = 1 & 709 ) - 1 684 710 685 711 IF ( seed_follows_topography ) THEN 686 712 ! 687 713 !-- Particle height is given relative to topography 688 kp = kp + nzb_w_inner(jp,ip) 689 tmp_particle%z = tmp_particle%z + & 690 zw(nzb_w_inner(jp,ip)) 691 IF ( kp > nzt ) THEN 714 kp = kp + k_surf 715 tmp_particle%z = tmp_particle%z + zw(k_surf) 716 !-- Skip particle release if particle position is 717 !-- above model top, or within topography in case 718 !-- of overhanging structures. 719 IF ( kp > nzt .OR. & 720 .NOT. BTEST( wall_flags_0(kp,jp,ip), 0 ) ) THEN 692 721 pos_x = pos_x + pdx(i) 693 722 CYCLE xloop 694 723 ENDIF 724 ! 725 !-- Skip particle release if particle position is 726 !-- below surface, or within topography in case 727 !-- of overhanging structures. 695 728 ELSEIF ( .NOT. seed_follows_topography .AND. & 696 tmp_particle%z <= zw(nzb_w_inner(jp,ip)) ) THEN 729 tmp_particle%z <= zw(k_surf) .OR. & 730 .NOT. BTEST( wall_flags_0(kp,jp,ip), 0 ) )& 731 THEN 697 732 pos_x = pos_x + pdx(i) 698 733 CYCLE xloop … … 820 855 pdx(particles(n)%group) 821 856 particles(n)%x = particles(n)%x + & 822 MERGE( rand_contr, SIGN( dx, rand_contr ), &857 MERGE( rand_contr, SIGN( dx, rand_contr ), & 823 858 ABS( rand_contr ) < dx & 824 859 ) … … 828 863 pdy(particles(n)%group) 829 864 particles(n)%y = particles(n)%y + & 830 MERGE( rand_contr, SIGN( dy, rand_contr ), &865 MERGE( rand_contr, SIGN( dy, rand_contr ), & 831 866 ABS( rand_contr ) < dy & 832 867 ) … … 836 871 pdz(particles(n)%group) 837 872 particles(n)%z = particles(n)%z + & 838 MERGE( rand_contr, SIGN( dz, rand_contr ), &873 MERGE( rand_contr, SIGN( dz, rand_contr ), & 839 874 ABS( rand_contr ) < dz & 840 875 ) … … 854 889 i = ( particles(n)%x + 0.5_wp * dx ) * ddx 855 890 j = ( particles(n)%y + 0.5_wp * dy ) * ddy 856 IF ( particles(n)%z <= zw(nzb_w_inner(j,i)) ) THEN 891 k = particles(n)%z / dz + 1 + offset_ocean_nzt 892 ! 893 !-- Check if particle is within topography 894 IF ( .NOT. BTEST( wall_flags_0(k,j,i), 0 ) ) THEN 857 895 particles(n)%particle_mask = .FALSE. 858 896 deleted_particles = deleted_particles + 1 859 897 ENDIF 898 860 899 ENDDO 861 900 ENDDO -
palm/trunk/SOURCE/lpm_init_sgs_tke.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments according to new topography realization 23 23 ! 24 24 ! Former revisions: … … 73 73 74 74 USE indices, & 75 ONLY: nbgp, ngp_2dh_outer, nxl, nxr, nyn, nys, nzb, nzb_s_inner,&76 nzb_s_outer, nzt 75 ONLY: nbgp, ngp_2dh_outer, nxl, nxr, nyn, nys, nzb, & 76 nzb_s_outer, nzt, wall_flags_0 77 77 78 78 USE kinds … … 86 86 ONLY: flow_statistics_called, hom, sums, sums_l 87 87 88 USE surface_mod, & 89 ONLY: bc_h 90 88 91 IMPLICIT NONE 89 92 90 INTEGER(iwp) :: i !< 91 INTEGER(iwp) :: j !< 92 INTEGER(iwp) :: k !< 93 93 INTEGER(iwp) :: i !< index variable along x 94 INTEGER(iwp) :: j !< index variable along y 95 INTEGER(iwp) :: k !< index variable along z 96 INTEGER(iwp) :: m !< running index for the surface elements 97 98 REAL(wp) :: flag1 !< flag to mask topography 94 99 95 100 ! … … 99 104 DO k = nzb, nzt+1 100 105 101 IF ( k <= nzb_s_inner(j,i-1) .AND. k > nzb_s_inner(j,i) .AND. & 102 k > nzb_s_inner(j,i+1) ) & 106 IF ( .NOT. BTEST( wall_flags_0(k,j,i-1), 0 ) .AND. & 107 BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 108 BTEST( wall_flags_0(k,j,i+1), 0 ) ) & 103 109 THEN 104 110 de_dx(k,j,i) = 2.0_wp * sgs_wf_part * & 105 111 ( e(k,j,i+1) - e(k,j,i) ) * ddx 106 ELSEIF ( k > nzb_s_inner(j,i-1) .AND. k > nzb_s_inner(j,i) & 107 .AND. k <= nzb_s_inner(j,i+1) ) & 112 ELSEIF ( BTEST( wall_flags_0(k,j,i-1), 0 ) .AND. & 113 BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 114 .NOT. BTEST( wall_flags_0(k,j,i+1), 0 ) ) & 108 115 THEN 109 116 de_dx(k,j,i) = 2.0_wp * sgs_wf_part * & 110 117 ( e(k,j,i) - e(k,j,i-1) ) * ddx 111 ELSEIF ( k < nzb_s_inner(j,i) .AND. k < nzb_s_inner(j,i+1) ) & 118 ELSEIF ( .NOT. BTEST( wall_flags_0(k,j,i), 22 ) .AND. & 119 .NOT. BTEST( wall_flags_0(k,j,i+1), 22 ) ) & 112 120 THEN 113 121 de_dx(k,j,i) = 0.0_wp 114 ELSEIF ( k < nzb_s_inner(j,i-1) .AND. k < nzb_s_inner(j,i) ) & 122 ELSEIF ( .NOT. BTEST( wall_flags_0(k,j,i-1), 22 ) .AND. & 123 .NOT. BTEST( wall_flags_0(k,j,i), 22 ) ) & 115 124 THEN 116 125 de_dx(k,j,i) = 0.0_wp … … 119 128 ENDIF 120 129 121 IF ( k <= nzb_s_inner(j-1,i) .AND. k > nzb_s_inner(j,i) .AND. & 122 k > nzb_s_inner(j+1,i) ) & 130 IF ( .NOT. BTEST( wall_flags_0(k,j-1,i), 0 ) .AND. & 131 BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 132 BTEST( wall_flags_0(k,j+1,i), 0 ) ) & 123 133 THEN 124 134 de_dy(k,j,i) = 2.0_wp * sgs_wf_part * & 125 135 ( e(k,j+1,i) - e(k,j,i) ) * ddy 126 ELSEIF ( k > nzb_s_inner(j-1,i) .AND. k > nzb_s_inner(j,i) & 127 .AND. k <= nzb_s_inner(j+1,i) ) & 136 ELSEIF ( BTEST( wall_flags_0(k,j-1,i), 0 ) .AND. & 137 BTEST( wall_flags_0(k,j,i), 0 ) .AND. & 138 .NOT. BTEST( wall_flags_0(k,j+1,i), 0 ) ) & 128 139 THEN 129 140 de_dy(k,j,i) = 2.0_wp * sgs_wf_part * & 130 141 ( e(k,j,i) - e(k,j-1,i) ) * ddy 131 ELSEIF ( k < nzb_s_inner(j,i) .AND. k < nzb_s_inner(j+1,i) ) & 142 ELSEIF ( .NOT. BTEST( wall_flags_0(k,j,i), 22 ) .AND. & 143 .NOT. BTEST( wall_flags_0(k,j+1,i), 22 ) ) & 132 144 THEN 133 145 de_dy(k,j,i) = 0.0_wp 134 ELSEIF ( k < nzb_s_inner(j-1,i) .AND. k < nzb_s_inner(j,i) ) & 146 ELSEIF ( .NOT. BTEST( wall_flags_0(k,j-1,i), 22 ) .AND. & 147 .NOT. BTEST( wall_flags_0(k,j,i), 22 ) ) & 135 148 THEN 136 149 de_dy(k,j,i) = 0.0_wp … … 144 157 145 158 ! 146 !-- TKE gradient along z ,including bottom and top boundary conditions159 !-- TKE gradient along z at topograhy and including bottom and top boundary conditions 147 160 DO i = nxl, nxr 148 161 DO j = nys, nyn 149 150 DO k = nzb_s_inner(j,i)+2, nzt-1 151 de_dz(k,j,i) = 2.0_wp * sgs_wf_part * & 152 ( e(k+1,j,i) - e(k-1,j,i) ) / ( zu(k+1)-zu(k-1) ) 153 ENDDO 154 155 k = nzb_s_inner(j,i) 156 de_dz(nzb:k,j,i) = 0.0_wp 157 de_dz(k+1,j,i) = 2.0_wp * sgs_wf_part * & 158 ( e(k+2,j,i) - e(k+1,j,i) ) / ( zu(k+2) - zu(k+1) ) 162 DO k = nzb+1, nzt-1 163 ! 164 !-- Flag to mask topography 165 flag1 = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 166 167 de_dz(k,j,i) = 2.0_wp * sgs_wf_part * & 168 ( e(k+1,j,i) - e(k-1,j,i) ) / ( zu(k+1) - zu(k-1) ) & 169 * flag1 170 ENDDO 171 ! 172 !-- upward-facing surfaces 173 DO m = bc_h(0)%start_index(j,i), bc_h(0)%end_index(j,i) 174 k = bc_h(0)%k(m) 175 de_dz(k,j,i) = 2.0_wp * sgs_wf_part * & 176 ( e(k+1,j,i) - e(k,j,i) ) / ( zu(k+1) - zu(k) ) 177 ENDDO 178 ! 179 !-- downward-facing surfaces 180 DO m = bc_h(1)%start_index(j,i), bc_h(1)%end_index(j,i) 181 k = bc_h(1)%k(m) 182 de_dz(k,j,i) = 2.0_wp * sgs_wf_part * & 183 ( e(k,j,i) - e(k-1,j,i) ) / ( zu(k) - zu(k-1) ) 184 ENDDO 185 186 de_dz(nzb,j,i) = 0.0_wp 159 187 de_dz(nzt,j,i) = 0.0_wp 160 188 de_dz(nzt+1,j,i) = 0.0_wp 161 189 ENDDO 162 190 ENDDO 163 164 165 ! 166 !-- Lateral boundary conditions 191 ! 192 !-- Ghost point exchange 167 193 CALL exchange_horiz( de_dx, nbgp ) 168 194 CALL exchange_horiz( de_dy, nbgp ) … … 185 211 DO i = nxl, nxr 186 212 DO j = nys, nyn 187 DO k = nzb_s_outer(j,i), nzt+1 188 sums_l(k,1,0) = sums_l(k,1,0) + u(k,j,i) 189 sums_l(k,2,0) = sums_l(k,2,0) + v(k,j,i) 213 DO k = nzb, nzt+1 214 ! 215 !-- Flag indicate nzb_s_outer 216 flag1 = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 24 ) ) 217 218 sums_l(k,1,0) = sums_l(k,1,0) + u(k,j,i) * flag1 219 sums_l(k,2,0) = sums_l(k,2,0) + v(k,j,i) * flag1 190 220 ENDDO 191 221 ENDDO … … 221 251 DO i = nxl, nxr 222 252 DO j = nys, nyn 223 DO k = nzb_s_outer(j,i), nzt+1 224 sums_l(k,8,0) = sums_l(k,8,0) + e(k,j,i) 225 sums_l(k,30,0) = sums_l(k,30,0) + ( u(k,j,i) - hom(k,1,1,0) )**2 226 sums_l(k,31,0) = sums_l(k,31,0) + ( v(k,j,i) - hom(k,1,2,0) )**2 227 sums_l(k,32,0) = sums_l(k,32,0) + w(k,j,i)**2 253 DO k = nzb, nzt+1 254 ! 255 !-- Flag indicate nzb_s_outer 256 flag1 = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 24 ) ) 257 258 sums_l(k,8,0) = sums_l(k,8,0) + e(k,j,i) * flag1 259 sums_l(k,30,0) = sums_l(k,30,0) + ( u(k,j,i) - hom(k,1,1,0) )**2 * flag1 260 sums_l(k,31,0) = sums_l(k,31,0) + ( v(k,j,i) - hom(k,1,2,0) )**2 * flag1 261 sums_l(k,32,0) = sums_l(k,32,0) + w(k,j,i)**2 * flag1 228 262 ENDDO 229 263 ENDDO -
palm/trunk/SOURCE/ls_forcing_mod.f90
r2105 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adopt to new topography structure, even though no well-conceived topography 23 ! concept concerning nudging and large-scale for exist so far. 24 ! 25 ! Also adopt to new surface-structure, i.e. fluxes are obtained from data-types 23 26 ! 24 27 ! Former revisions: … … 356 359 357 360 USE arrays_3d, & 358 ONLY: p_surf, pt_surf, q_surf, qsws , qsws_surf, shf, shf_surf,&361 ONLY: p_surf, pt_surf, q_surf, qsws_surf, shf_surf, & 359 362 heatflux_input_conversion, waterflux_input_conversion, & 360 363 time_surf, time_vert, ug, ug_vert, vg, vg_vert … … 369 372 USE kinds 370 373 374 USE surface_mod, & 375 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 376 371 377 IMPLICIT NONE 372 378 373 379 INTEGER(iwp) :: nt !< 374 380 381 REAL(wp) :: dum_surf_flux !< 375 382 REAL(wp) :: fac !< 376 383 REAL(wp), INTENT(in) :: time !< … … 398 405 !-- In case of Neumann boundary condition pt_surface is needed for 399 406 !-- calculation of reference density 400 shf = ( shf_surf(nt) + fac * ( shf_surf(nt+1) - shf_surf(nt) )& 401 ) * heatflux_input_conversion(nzb) 402 pt_surface = pt_surf(nt) + fac * ( pt_surf(nt+1) - pt_surf(nt) ) 407 dum_surf_flux = ( shf_surf(nt) + fac * & 408 ( shf_surf(nt+1) - shf_surf(nt) ) & 409 ) * heatflux_input_conversion(nzb) 410 ! 411 !-- Save surface sensible heat flux on default, natural and urban surface 412 !-- type, if required 413 IF ( surf_def_h(0)%ns >= 1 ) surf_def_h(0)%shf(:) = dum_surf_flux 414 IF ( surf_lsm_h%ns >= 1 ) surf_lsm_h%shf(:) = dum_surf_flux 415 IF ( surf_usm_h%ns >= 1 ) surf_usm_h%shf(:) = dum_surf_flux 416 417 pt_surface = pt_surf(nt) + fac * ( pt_surf(nt+1) - pt_surf(nt) ) 403 418 404 419 ENDIF … … 411 426 412 427 ELSEIF ( ibc_q_b == 1 ) THEN 413 414 qsws = ( qsws_surf(nt) + fac * ( qsws_surf(nt+1) - qsws_surf(nt) ) & 415 ) * waterflux_input_conversion(nzb) 428 dum_surf_flux = ( qsws_surf(nt) + fac * & 429 ( qsws_surf(nt+1) - qsws_surf(nt) ) & 430 ) * waterflux_input_conversion(nzb) 431 ! 432 !-- Save surface sensible heat flux on default, natural and urban surface 433 !-- type, if required 434 IF ( surf_def_h(0)%ns >= 1 ) surf_def_h(0)%qsws(:) = dum_surf_flux 435 IF ( surf_lsm_h%ns >= 1 ) surf_lsm_h%qsws(:) = dum_surf_flux 436 IF ( surf_usm_h%ns >= 1 ) surf_usm_h%qsws(:) = dum_surf_flux 416 437 417 438 ENDIF … … 516 537 DO i = nxl, nxr 517 538 DO j = nys, nyn 518 DO k = nzb _u_inner(j,i)+1, nzt539 DO k = nzb+1, nzt 519 540 tend(k,j,i) = tend(k,j,i) + td_lsa_lpt(k,nt) + fac * & 520 ( td_lsa_lpt(k,nt+1) - td_lsa_lpt(k,nt) ) 541 ( td_lsa_lpt(k,nt+1) - td_lsa_lpt(k,nt) ) *& 542 MERGE( 1.0_wp, 0.0_wp, & 543 BTEST( wall_flags_0(k,j,i), 0 ) ) 521 544 ENDDO 522 545 ENDDO … … 527 550 DO i = nxl, nxr 528 551 DO j = nys, nyn 529 DO k = nzb _u_inner(j,i)+1, nzt552 DO k = nzb+1, nzt 530 553 tend(k,j,i) = tend(k,j,i) + td_lsa_q(k,nt) + fac * & 531 ( td_lsa_q(k,nt+1) - td_lsa_q(k,nt) ) 554 ( td_lsa_q(k,nt+1) - td_lsa_q(k,nt) ) * & 555 MERGE( 1.0_wp, 0.0_wp, & 556 BTEST( wall_flags_0(k,j,i), 0 ) ) 532 557 ENDDO 533 558 ENDDO … … 546 571 DO i = nxl, nxr 547 572 DO j = nys, nyn 548 DO k = nzb _u_inner(j,i)+1, nzt573 DO k = nzb+1, nzt 549 574 tend(k,j,i) = tend(k,j,i) + td_sub_lpt(k,nt) + fac * & 550 ( td_sub_lpt(k,nt+1) - td_sub_lpt(k,nt) ) 575 ( td_sub_lpt(k,nt+1) - td_sub_lpt(k,nt) )*& 576 MERGE( 1.0_wp, 0.0_wp, & 577 BTEST( wall_flags_0(k,j,i), 0 ) ) 551 578 ENDDO 552 579 ENDDO … … 557 584 DO i = nxl, nxr 558 585 DO j = nys, nyn 559 DO k = nzb _u_inner(j,i)+1, nzt586 DO k = nzb+1, nzt 560 587 tend(k,j,i) = tend(k,j,i) + td_sub_q(k,nt) + fac * & 561 ( td_sub_q(k,nt+1) - td_sub_q(k,nt) ) 588 ( td_sub_q(k,nt+1) - td_sub_q(k,nt) ) * & 589 MERGE( 1.0_wp, 0.0_wp, & 590 BTEST( wall_flags_0(k,j,i), 0 ) ) 562 591 ENDDO 563 592 ENDDO … … 618 647 CASE ( 'pt' ) 619 648 620 DO k = nzb _u_inner(j,i)+1, nzt649 DO k = nzb+1, nzt 621 650 tend(k,j,i) = tend(k,j,i) + td_lsa_lpt(k,nt) & 622 + fac * ( td_lsa_lpt(k,nt+1) - td_lsa_lpt(k,nt) ) 651 + fac * ( td_lsa_lpt(k,nt+1) - td_lsa_lpt(k,nt) )*& 652 MERGE( 1.0_wp, 0.0_wp, & 653 BTEST( wall_flags_0(k,j,i), 0 ) ) 623 654 ENDDO 624 655 625 656 CASE ( 'q' ) 626 657 627 DO k = nzb _u_inner(j,i)+1, nzt658 DO k = nzb+1, nzt 628 659 tend(k,j,i) = tend(k,j,i) + td_lsa_q(k,nt) & 629 + fac * ( td_lsa_q(k,nt+1) - td_lsa_q(k,nt) ) 660 + fac * ( td_lsa_q(k,nt+1) - td_lsa_q(k,nt) ) * & 661 MERGE( 1.0_wp, 0.0_wp, & 662 BTEST( wall_flags_0(k,j,i), 0 ) ) 630 663 ENDDO 631 664 … … 640 673 CASE ( 'pt' ) 641 674 642 DO k = nzb _u_inner(j,i)+1, nzt675 DO k = nzb+1, nzt 643 676 tend(k,j,i) = tend(k,j,i) + td_sub_lpt(k,nt) + fac * & 644 ( td_sub_lpt(k,nt+1) - td_sub_lpt(k,nt) ) 677 ( td_sub_lpt(k,nt+1) - td_sub_lpt(k,nt) ) * & 678 MERGE( 1.0_wp, 0.0_wp, & 679 BTEST( wall_flags_0(k,j,i), 0 ) ) 645 680 ENDDO 646 681 647 682 CASE ( 'q' ) 648 683 649 DO k = nzb _u_inner(j,i)+1, nzt684 DO k = nzb+1, nzt 650 685 tend(k,j,i) = tend(k,j,i) + td_sub_q(k,nt) + fac * & 651 ( td_sub_q(k,nt+1) - td_sub_q(k,nt) ) 686 ( td_sub_q(k,nt+1) - td_sub_q(k,nt) ) * & 687 MERGE( 1.0_wp, 0.0_wp, & 688 BTEST( wall_flags_0(k,j,i), 0 ) ) 652 689 ENDDO 653 690 -
palm/trunk/SOURCE/microphysics_mod.f90
r2156 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 402 402 403 403 USE indices, & 404 ONLY: nxlg, nxrg, ny sg, nyng, nzb_s_inner, nzt404 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 405 405 406 406 USE kinds … … 416 416 DO i = nxlg, nxrg 417 417 DO j = nysg, nyng 418 DO k = nzb _s_inner(j,i)+1, nzt418 DO k = nzb+1, nzt 419 419 IF ( qr(k,j,i) <= eps_sb ) THEN 420 420 qr(k,j,i) = 0.0_wp … … 422 422 ELSE 423 423 IF ( nr(k,j,i) * xrmin > qr(k,j,i) * hyrho(k) ) THEN 424 nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmin 424 nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmin * & 425 MERGE( 1.0_wp, 0.0_wp, & 426 BTEST( wall_flags_0(k,j,i), 0 ) ) 425 427 ELSEIF ( nr(k,j,i) * xrmax < qr(k,j,i) * hyrho(k) ) THEN 426 nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmax 428 nr(k,j,i) = qr(k,j,i) * hyrho(k) / xrmax * & 429 MERGE( 1.0_wp, 0.0_wp, & 430 BTEST( wall_flags_0(k,j,i), 0 ) ) 427 431 ENDIF 428 432 ENDIF … … 459 463 460 464 USE indices, & 461 ONLY: nxlg, nxrg, ny sg, nyng, nzb_s_inner, nzt465 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 462 466 463 467 USE kinds … … 472 476 REAL(wp) :: autocon !< 473 477 REAL(wp) :: dissipation !< 478 REAL(wp) :: flag !< flag to mask topography grid points 474 479 REAL(wp) :: k_au !< 475 480 REAL(wp) :: l_mix !< … … 487 492 DO i = nxlg, nxrg 488 493 DO j = nysg, nyng 489 DO k = nzb_s_inner(j,i)+1, nzt 494 DO k = nzb+1, nzt 495 ! 496 !-- Predetermine flag to mask topography 497 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 490 498 491 499 IF ( qc(k,j,i) > eps_sb ) THEN … … 554 562 autocon = MIN( autocon, qc(k,j,i) / dt_micro ) 555 563 556 qr(k,j,i) = qr(k,j,i) + autocon * dt_micro 557 qc(k,j,i) = qc(k,j,i) - autocon * dt_micro 558 nr(k,j,i) = nr(k,j,i) + autocon / x0 * hyrho(k) * dt_micro 564 qr(k,j,i) = qr(k,j,i) + autocon * dt_micro * flag 565 qc(k,j,i) = qc(k,j,i) - autocon * dt_micro * flag 566 nr(k,j,i) = nr(k,j,i) + autocon / x0 * hyrho(k) * dt_micro & 567 * flag 559 568 560 569 ENDIF … … 583 592 584 593 USE indices, & 585 ONLY: nxlg, nxrg, nyng, nysg, nzb _s_inner, nzt594 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 586 595 587 596 USE kinds … … 590 599 IMPLICIT NONE 591 600 592 INTEGER(iwp) :: i !< 593 INTEGER(iwp) :: j !< 594 INTEGER(iwp) :: k !< 601 INTEGER(iwp) :: i !< 602 INTEGER(iwp) :: j !< 603 INTEGER(iwp) :: k !< 604 INTEGER(iwp) :: k_wall !< topgraphy top index 595 605 596 606 REAL(wp) :: dqdt_precip !< 607 REAL(wp) :: flag !< flag to mask topography grid points 597 608 598 609 DO i = nxlg, nxrg 599 610 DO j = nysg, nyng 600 DO k = nzb_s_inner(j,i)+1, nzt 611 ! 612 !-- Determine vertical index of topography top 613 k_wall = MAXLOC( & 614 MERGE( 1, 0, & 615 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 616 ), DIM = 1 & 617 ) - 1 618 DO k = nzb+1, nzt 619 ! 620 !-- Predetermine flag to mask topography 621 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 601 622 602 623 IF ( qc(k,j,i) > ql_crit ) THEN … … 606 627 ENDIF 607 628 608 qc(k,j,i) = qc(k,j,i) - dqdt_precip * dt_micro 609 q(k,j,i) = q(k,j,i) - dqdt_precip * dt_micro 629 qc(k,j,i) = qc(k,j,i) - dqdt_precip * dt_micro * flag 630 q(k,j,i) = q(k,j,i) - dqdt_precip * dt_micro * flag 610 631 pt(k,j,i) = pt(k,j,i) + dqdt_precip * dt_micro * l_d_cp * & 611 pt_d_t(k) 632 pt_d_t(k) * flag 612 633 613 634 ! 614 635 !-- Compute the rain rate (stored on surface grid point) 615 prr(nzb_s_inner(j,i),j,i) = prr(nzb_s_inner(j,i),j,i) + & 616 dqdt_precip * dzw(k) 636 prr(k_wall,j,i) = prr(k_wall,j,i) + dqdt_precip * dzw(k) * flag 617 637 618 638 ENDDO … … 643 663 644 664 USE indices, & 645 ONLY: nxlg, nxrg, ny sg, nyng, nzb_s_inner, nzt665 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 646 666 647 667 USE kinds … … 654 674 655 675 REAL(wp) :: accr !< 676 REAL(wp) :: flag !< flag to mask topography grid points 656 677 REAL(wp) :: k_cr !< 657 678 REAL(wp) :: phi_ac !< … … 662 683 DO i = nxlg, nxrg 663 684 DO j = nysg, nyng 664 DO k = nzb_s_inner(j,i)+1, nzt 685 DO k = nzb+1, nzt 686 ! 687 !-- Predetermine flag to mask topography 688 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 665 689 666 690 IF ( ( qc(k,j,i) > eps_sb ) .AND. ( qr(k,j,i) > eps_sb ) ) THEN … … 690 714 accr = MIN( accr, qc(k,j,i) / dt_micro ) 691 715 692 qr(k,j,i) = qr(k,j,i) + accr * dt_micro 693 qc(k,j,i) = qc(k,j,i) - accr * dt_micro 716 qr(k,j,i) = qr(k,j,i) + accr * dt_micro * flag 717 qc(k,j,i) = qc(k,j,i) - accr * dt_micro * flag 694 718 695 719 ENDIF … … 724 748 725 749 USE indices, & 726 ONLY: nxlg, nxrg, ny sg, nyng, nzb_s_inner, nzt750 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 727 751 728 752 USE kinds … … 736 760 REAL(wp) :: breakup !< 737 761 REAL(wp) :: dr !< 762 REAL(wp) :: flag !< flag to mask topography grid points 738 763 REAL(wp) :: phi_br !< 739 764 REAL(wp) :: selfcoll !< … … 743 768 DO i = nxlg, nxrg 744 769 DO j = nysg, nyng 745 DO k = nzb_s_inner(j,i)+1, nzt 770 DO k = nzb+1, nzt 771 ! 772 !-- Predetermine flag to mask topography 773 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 774 746 775 IF ( qr(k,j,i) > eps_sb ) THEN 747 776 ! … … 763 792 764 793 selfcoll = MAX( breakup - selfcoll, -nr(k,j,i) / dt_micro ) 765 nr(k,j,i) = nr(k,j,i) + selfcoll * dt_micro 794 nr(k,j,i) = nr(k,j,i) + selfcoll * dt_micro * flag 766 795 767 796 ENDIF … … 796 825 797 826 USE indices, & 798 ONLY: nxlg, nxrg, ny sg, nyng, nzb_s_inner, nzt827 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 799 828 800 829 USE kinds … … 812 841 REAL(wp) :: evap_nr !< 813 842 REAL(wp) :: f_vent !< 843 REAL(wp) :: flag !< flag to mask topography grid points 814 844 REAL(wp) :: g_evap !< 815 845 REAL(wp) :: lambda_r !< … … 828 858 DO i = nxlg, nxrg 829 859 DO j = nysg, nyng 830 DO k = nzb_s_inner(j,i)+1, nzt 860 DO k = nzb+1, nzt 861 ! 862 !-- Predetermine flag to mask topography 863 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 864 831 865 IF ( qr(k,j,i) > eps_sb ) THEN 832 866 ! … … 916 950 -nr(k,j,i) / dt_micro ) 917 951 918 qr(k,j,i) = qr(k,j,i) + evap * dt_micro 919 nr(k,j,i) = nr(k,j,i) + evap_nr * dt_micro 952 qr(k,j,i) = qr(k,j,i) + evap * dt_micro * flag 953 nr(k,j,i) = nr(k,j,i) + evap_nr * dt_micro * flag 920 954 921 955 ENDIF … … 951 985 952 986 USE indices, & 953 ONLY: nxlg, nxrg, ny sg, nyng, nzb, nzb_s_inner, nzt987 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 954 988 955 989 USE kinds … … 965 999 INTEGER(iwp) :: k !< 966 1000 967 REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc !< 1001 REAL(wp) :: flag !< flag to mask topography grid points 1002 REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc !< 968 1003 969 1004 CALL cpu_log( log_point_s(59), 'sed_cloud', 'start' ) … … 973 1008 DO i = nxlg, nxrg 974 1009 DO j = nysg, nyng 975 DO k = nzt, nzb_s_inner(j,i)+1, -1 1010 DO k = nzt, nzb+1, -1 1011 ! 1012 !-- Predetermine flag to mask topography 1013 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 976 1014 977 1015 IF ( qc(k,j,i) > eps_sb ) THEN 978 1016 sed_qc(k) = sed_qc_const * nc_const**( -2.0_wp / 3.0_wp ) * & 979 ( qc(k,j,i) * hyrho(k) )**( 5.0_wp / 3.0_wp ) 1017 ( qc(k,j,i) * hyrho(k) )**( 5.0_wp / 3.0_wp ) * & 1018 flag 980 1019 ELSE 981 1020 sed_qc(k) = 0.0_wp … … 984 1023 sed_qc(k) = MIN( sed_qc(k), hyrho(k) * dzu(k+1) * q(k,j,i) / & 985 1024 dt_micro + sed_qc(k+1) & 986 ) 1025 ) * flag 987 1026 988 1027 q(k,j,i) = q(k,j,i) + ( sed_qc(k+1) - sed_qc(k) ) * & 989 ddzu(k+1) / hyrho(k) * dt_micro 1028 ddzu(k+1) / hyrho(k) * dt_micro * flag 990 1029 qc(k,j,i) = qc(k,j,i) + ( sed_qc(k+1) - sed_qc(k) ) * & 991 ddzu(k+1) / hyrho(k) * dt_micro 1030 ddzu(k+1) / hyrho(k) * dt_micro * flag 992 1031 pt(k,j,i) = pt(k,j,i) - ( sed_qc(k+1) - sed_qc(k) ) * & 993 1032 ddzu(k+1) / hyrho(k) * l_d_cp * & 994 pt_d_t(k) * dt_micro 1033 pt_d_t(k) * dt_micro * flag 995 1034 996 1035 ! … … 998 1037 IF ( call_microphysics_at_all_substeps ) THEN 999 1038 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) & 1000 * weight_substep(intermediate_timestep_count) 1039 * weight_substep(intermediate_timestep_count) & 1040 * flag 1001 1041 ELSE 1002 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) 1042 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * flag 1003 1043 ENDIF 1004 1044 … … 1032 1072 1033 1073 USE indices, & 1034 ONLY: nxlg, nxrg, ny sg, nyng, nzb, nzb_s_inner, nzt1074 ONLY: nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0 1035 1075 1036 1076 USE kinds … … 1039 1079 ONLY: weight_substep 1040 1080 1081 USE surface_mod, & 1082 ONLY : bc_h 1083 1041 1084 IMPLICIT NONE 1042 1085 1043 INTEGER(iwp) :: i !< 1044 INTEGER(iwp) :: j !< 1045 INTEGER(iwp) :: k !< 1046 INTEGER(iwp) :: k_run !< 1086 INTEGER(iwp) :: i !< running index x direction 1087 INTEGER(iwp) :: j !< running index y direction 1088 INTEGER(iwp) :: k !< running index z direction 1089 INTEGER(iwp) :: k_run !< 1090 INTEGER(iwp) :: l !< running index of surface type 1091 INTEGER(iwp) :: m !< running index surface elements 1092 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 1093 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 1047 1094 1048 1095 REAL(wp) :: c_run !< … … 1052 1099 REAL(wp) :: dr !< 1053 1100 REAL(wp) :: flux !< 1101 REAL(wp) :: flag !< flag to mask topography grid points 1054 1102 REAL(wp) :: lambda_r !< 1055 1103 REAL(wp) :: mu_r !< … … 1071 1119 DO i = nxlg, nxrg 1072 1120 DO j = nysg, nyng 1073 DO k = nzb_s_inner(j,i)+1, nzt 1121 DO k = nzb+1, nzt 1122 ! 1123 !-- Predetermine flag to mask topography 1124 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1125 1074 1126 IF ( qr(k,j,i) > eps_sb ) THEN 1075 1127 ! … … 1093 1145 ( mu_r + 1.0_wp ) ) & 1094 1146 ) & 1095 ) 1147 ) * flag 1096 1148 1097 1149 w_qr(k) = MAX( 0.1_wp, MIN( 20.0_wp, & … … 1101 1153 ( mu_r + 4.0_wp ) ) & 1102 1154 ) & 1103 ) 1155 ) * flag 1104 1156 ELSE 1105 1157 w_nr(k) = 0.0_wp … … 1108 1160 ENDDO 1109 1161 ! 1110 !-- Adjust boundary values 1111 w_nr(nzb_s_inner(j,i)) = w_nr(nzb_s_inner(j,i)+1) 1112 w_qr(nzb_s_inner(j,i)) = w_qr(nzb_s_inner(j,i)+1) 1162 !-- Adjust boundary values using surface data type. 1163 !-- Upward-facing 1164 surf_s = bc_h(0)%start_index(j,i) 1165 surf_e = bc_h(0)%end_index(j,i) 1166 DO m = surf_s, surf_e 1167 k = bc_h(0)%k(m) 1168 w_nr(k-1) = w_nr(k) 1169 w_qr(k-1) = w_qr(k) 1170 ENDDO 1171 ! 1172 !-- Downward-facing 1173 surf_s = bc_h(1)%start_index(j,i) 1174 surf_e = bc_h(1)%end_index(j,i) 1175 DO m = surf_s, surf_e 1176 k = bc_h(1)%k(m) 1177 w_nr(k+1) = w_nr(k) 1178 w_qr(k+1) = w_qr(k) 1179 ENDDO 1180 ! 1181 !-- Model top boundary value 1113 1182 w_nr(nzt+1) = 0.0_wp 1114 1183 w_qr(nzt+1) = 0.0_wp 1115 1184 ! 1116 1185 !-- Compute Courant number 1117 DO k = nzb_s_inner(j,i)+1, nzt 1186 DO k = nzb+1, nzt 1187 ! 1188 !-- Predetermine flag to mask topography 1189 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1190 1118 1191 c_nr(k) = 0.25_wp * ( w_nr(k-1) + & 1119 1192 2.0_wp * w_nr(k) + w_nr(k+1) ) * & 1120 dt_micro * ddzu(k) 1193 dt_micro * ddzu(k) * flag 1121 1194 c_qr(k) = 0.25_wp * ( w_qr(k-1) + & 1122 1195 2.0_wp * w_qr(k) + w_qr(k+1) ) * & 1123 dt_micro * ddzu(k) 1196 dt_micro * ddzu(k) * flag 1124 1197 ENDDO 1125 1198 ! … … 1127 1200 IF ( limiter_sedimentation ) THEN 1128 1201 1129 DO k = nzb_s_inner(j,i)+1, nzt 1202 DO k = nzb+1, nzt 1203 ! 1204 !-- Predetermine flag to mask topography 1205 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1206 1130 1207 d_mean = 0.5_wp * ( qr(k+1,j,i) - qr(k-1,j,i) ) 1131 1208 d_min = qr(k,j,i) - MIN( qr(k+1,j,i), qr(k,j,i), qr(k-1,j,i) ) … … 1134 1211 qr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min, & 1135 1212 2.0_wp * d_max, & 1136 ABS( d_mean ) ) 1213 ABS( d_mean ) ) & 1214 * flag 1137 1215 1138 1216 d_mean = 0.5_wp * ( nr(k+1,j,i) - nr(k-1,j,i) ) … … 1156 1234 ! 1157 1235 !-- Compute sedimentation flux 1158 DO k = nzt, nzb_s_inner(j,i)+1, -1 1159 ! 1160 !-- Sum up all rain drop number densities which contribute to the flux 1236 DO k = nzt, nzb+1, -1 1237 ! 1238 !-- Predetermine flag to mask topography 1239 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1240 ! 1241 !-- Sum up all rain drop number densities which contribute to the flux 1161 1242 !-- through k-1/2 1162 1243 flux = 0.0_wp … … 1167 1248 flux = flux + hyrho(k_run) * & 1168 1249 ( nr(k_run,j,i) + nr_slope(k_run) * & 1169 ( 1.0_wp - c_run ) * 0.5_wp ) * c_run * dzu(k_run) 1170 z_run = z_run + dzu(k_run) 1171 k_run = k_run + 1 1172 c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) ) 1250 ( 1.0_wp - c_run ) * 0.5_wp ) * c_run * dzu(k_run) & 1251 * flag 1252 z_run = z_run + dzu(k_run) * flag 1253 k_run = k_run + 1 * flag 1254 c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) ) & 1255 * flag 1173 1256 ENDDO 1174 1257 ! … … 1180 1263 ) 1181 1264 1182 sed_nr(k) = flux / dt_micro 1265 sed_nr(k) = flux / dt_micro * flag 1183 1266 nr(k,j,i) = nr(k,j,i) + ( sed_nr(k+1) - sed_nr(k) ) * & 1184 ddzu(k+1) / hyrho(k) * dt_micro 1267 ddzu(k+1) / hyrho(k) * dt_micro * flag 1185 1268 ! 1186 1269 !-- Sum up all rain water content which contributes to the flux … … 1195 1278 flux = flux + hyrho(k_run) * ( qr(k_run,j,i) + & 1196 1279 qr_slope(k_run) * ( 1.0_wp - c_run ) * & 1197 0.5_wp ) * c_run * dzu(k_run) 1198 z_run = z_run + dzu(k_run) 1199 k_run = k_run + 1 1200 c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) ) 1280 0.5_wp ) * c_run * dzu(k_run) * flag 1281 z_run = z_run + dzu(k_run) * flag 1282 k_run = k_run + 1 * flag 1283 c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) ) & 1284 * flag 1201 1285 1202 1286 ENDDO … … 1209 1293 ) 1210 1294 1211 sed_qr(k) = flux / dt_micro 1295 sed_qr(k) = flux / dt_micro * flag 1212 1296 1213 1297 qr(k,j,i) = qr(k,j,i) + ( sed_qr(k+1) - sed_qr(k) ) * & 1214 ddzu(k+1) / hyrho(k) * dt_micro 1298 ddzu(k+1) / hyrho(k) * dt_micro * flag 1215 1299 q(k,j,i) = q(k,j,i) + ( sed_qr(k+1) - sed_qr(k) ) * & 1216 ddzu(k+1) / hyrho(k) * dt_micro 1300 ddzu(k+1) / hyrho(k) * dt_micro * flag 1217 1301 pt(k,j,i) = pt(k,j,i) - ( sed_qr(k+1) - sed_qr(k) ) * & 1218 1302 ddzu(k+1) / hyrho(k) * l_d_cp * & 1219 pt_d_t(k) * dt_micro 1303 pt_d_t(k) * dt_micro * flag 1220 1304 ! 1221 1305 !-- Compute the rain rate 1222 1306 IF ( call_microphysics_at_all_substeps ) THEN 1223 1307 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) & 1224 * weight_substep(intermediate_timestep_count) 1308 * weight_substep(intermediate_timestep_count) & 1309 * flag 1225 1310 ELSE 1226 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) 1311 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) * flag 1227 1312 ENDIF 1228 1313 … … 1256 1341 1257 1342 USE indices, & 1258 ONLY: nxl, nxr, nys, nyn, nzb _s_inner1343 ONLY: nxl, nxr, nys, nyn, nzb, nzt, wall_flags_0 1259 1344 1260 1345 USE kinds 1261 1346 1347 USE surface_mod, & 1348 ONLY : bc_h 1349 1262 1350 IMPLICIT NONE 1263 1351 1264 INTEGER(iwp) :: i !: 1265 INTEGER(iwp) :: j !: 1266 1352 INTEGER(iwp) :: i !< running index x direction 1353 INTEGER(iwp) :: j !< running index y direction 1354 INTEGER(iwp) :: k !< running index y direction 1355 INTEGER(iwp) :: m !< running index surface elements 1356 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 1357 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 1267 1358 1268 1359 IF ( ( dt_do2d_xy - time_do2d_xy ) < precipitation_amount_interval .AND.& … … 1270 1361 intermediate_timestep_count == intermediate_timestep_count_max ) ) & 1271 1362 THEN 1272 1273 DO i = nxl, nxr 1274 DO j = nys, nyn1275 1276 precipitation_amount(j,i) = precipitation_amount(j,i) + &1277 prr(nzb_s_inner(j,i)+1,j,i) * &1278 hyrho(nzb_s_inner(j,i)+1) * dt_3d1279 1280 ENDDO1363 ! 1364 !-- Run over all upward-facing surface elements, i.e. non-natural, 1365 !-- natural and urban 1366 DO m = 1, bc_h(0)%ns 1367 i = bc_h(0)%i(m) 1368 j = bc_h(0)%j(m) 1369 k = bc_h(0)%k(m) 1370 precipitation_amount(j,i) = precipitation_amount(j,i) + & 1371 prr(k,j,i) * hyrho(k) * dt_3d 1281 1372 ENDDO 1373 1282 1374 ENDIF 1283 1375 … … 1410 1502 1411 1503 USE indices, & 1412 ONLY: nzb _s_inner, nzt1504 ONLY: nzb, nzt, wall_flags_0 1413 1505 1414 1506 USE kinds … … 1420 1512 INTEGER(iwp) :: k !< 1421 1513 1422 DO k = nzb_s_inner(j,i)+1, nzt 1514 REAL(wp) :: flag !< flag to indicate first grid level above surface 1515 1516 DO k = nzb+1, nzt 1517 ! 1518 !-- Predetermine flag to mask topography 1519 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1423 1520 1424 1521 IF ( qr_1d(k) <= eps_sb ) THEN … … 1431 1528 !-- too big weights of rain drops (Stevens and Seifert, 2008). 1432 1529 IF ( nr_1d(k) * xrmin > qr_1d(k) * hyrho(k) ) THEN 1433 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmin 1530 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmin * flag 1434 1531 ELSEIF ( nr_1d(k) * xrmax < qr_1d(k) * hyrho(k) ) THEN 1435 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmax 1532 nr_1d(k) = qr_1d(k) * hyrho(k) / xrmax * flag 1436 1533 ENDIF 1437 1534 … … 1463 1560 1464 1561 USE indices, & 1465 ONLY: nzb _s_inner, nzt1562 ONLY: nzb, nzt, wall_flags_0 1466 1563 1467 1564 USE kinds … … 1476 1573 REAL(wp) :: autocon !< 1477 1574 REAL(wp) :: dissipation !< 1575 REAL(wp) :: flag !< flag to indicate first grid level above surface 1478 1576 REAL(wp) :: k_au !< 1479 1577 REAL(wp) :: l_mix !< … … 1487 1585 REAL(wp) :: xc !< 1488 1586 1489 DO k = nzb_s_inner(j,i)+1, nzt 1587 DO k = nzb+1, nzt 1588 ! 1589 !-- Predetermine flag to mask topography 1590 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1490 1591 1491 1592 IF ( qc_1d(k) > eps_sb ) THEN … … 1551 1652 autocon = MIN( autocon, qc_1d(k) / dt_micro ) 1552 1653 1553 qr_1d(k) = qr_1d(k) + autocon * dt_micro 1554 qc_1d(k) = qc_1d(k) - autocon * dt_micro 1555 nr_1d(k) = nr_1d(k) + autocon / x0 * hyrho(k) * dt_micro 1654 qr_1d(k) = qr_1d(k) + autocon * dt_micro * flag 1655 qc_1d(k) = qc_1d(k) - autocon * dt_micro * flag 1656 nr_1d(k) = nr_1d(k) + autocon / x0 * hyrho(k) * dt_micro * flag 1556 1657 1557 1658 ENDIF … … 1575 1676 1576 1677 USE indices, & 1577 ONLY: nzb _s_inner, nzt1678 ONLY: nzb, nzb_max, nzt, wall_flags_0 1578 1679 1579 1680 USE kinds … … 1582 1683 IMPLICIT NONE 1583 1684 1584 INTEGER(iwp) :: i !< 1585 INTEGER(iwp) :: j !< 1586 INTEGER(iwp) :: k !< 1685 INTEGER(iwp) :: i !< 1686 INTEGER(iwp) :: j !< 1687 INTEGER(iwp) :: k !< 1688 INTEGER(iwp) :: k_wall !< topography top index 1587 1689 1588 1690 REAL(wp) :: dqdt_precip !< 1589 1590 DO k = nzb_s_inner(j,i)+1, nzt 1691 REAL(wp) :: flag !< flag to indicate first grid level above surface 1692 1693 ! 1694 !-- Determine vertical index of topography top 1695 k_wall = MAXLOC( & 1696 MERGE( 1, 0, & 1697 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1698 ), DIM = 1 & 1699 ) - 1 1700 DO k = nzb+1, nzt 1701 ! 1702 !-- Predetermine flag to mask topography 1703 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1591 1704 1592 1705 IF ( qc_1d(k) > ql_crit ) THEN … … 1596 1709 ENDIF 1597 1710 1598 qc_1d(k) = qc_1d(k) - dqdt_precip * dt_micro 1599 q_1d(k) = q_1d(k) - dqdt_precip * dt_micro 1600 pt_1d(k) = pt_1d(k) + dqdt_precip * dt_micro * l_d_cp * pt_d_t(k) 1711 qc_1d(k) = qc_1d(k) - dqdt_precip * dt_micro * flag 1712 q_1d(k) = q_1d(k) - dqdt_precip * dt_micro * flag 1713 pt_1d(k) = pt_1d(k) + dqdt_precip * dt_micro * l_d_cp * pt_d_t(k) * flag 1601 1714 1602 1715 ! 1603 1716 !-- Compute the rain rate (stored on surface grid point) 1604 prr(nzb_s_inner(j,i),j,i) = prr(nzb_s_inner(j,i),j,i) + & 1605 dqdt_precip * dzw(k) 1717 prr(k_wall,j,i) = prr(k_wall,j,i) + dqdt_precip * dzw(k) * flag 1606 1718 1607 1719 ENDDO … … 1626 1738 1627 1739 USE indices, & 1628 ONLY: nzb _s_inner, nzt1740 ONLY: nzb, nzt, wall_flags_0 1629 1741 1630 1742 USE kinds … … 1637 1749 1638 1750 REAL(wp) :: accr !< 1751 REAL(wp) :: flag !< flag to indicate first grid level above surface 1639 1752 REAL(wp) :: k_cr !< 1640 1753 REAL(wp) :: phi_ac !< 1641 1754 REAL(wp) :: tau_cloud !< 1642 1755 1643 DO k = nzb_s_inner(j,i)+1, nzt 1756 DO k = nzb+1, nzt 1757 ! 1758 !-- Predetermine flag to mask topography 1759 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1760 1644 1761 IF ( ( qc_1d(k) > eps_sb ) .AND. ( qr_1d(k) > eps_sb ) ) THEN 1645 1762 ! … … 1667 1784 accr = MIN( accr, qc_1d(k) / dt_micro ) 1668 1785 1669 qr_1d(k) = qr_1d(k) + accr * dt_micro 1670 qc_1d(k) = qc_1d(k) - accr * dt_micro 1786 qr_1d(k) = qr_1d(k) + accr * dt_micro * flag 1787 qc_1d(k) = qc_1d(k) - accr * dt_micro * flag 1671 1788 1672 1789 ENDIF … … 1691 1808 1692 1809 USE indices, & 1693 ONLY: nzb _s_inner, nzt1810 ONLY: nzb, nzt, wall_flags_0 1694 1811 1695 1812 USE kinds … … 1703 1820 REAL(wp) :: breakup !< 1704 1821 REAL(wp) :: dr !< 1822 REAL(wp) :: flag !< flag to indicate first grid level above surface 1705 1823 REAL(wp) :: phi_br !< 1706 1824 REAL(wp) :: selfcoll !< 1707 1825 1708 DO k = nzb_s_inner(j,i)+1, nzt 1826 DO k = nzb+1, nzt 1827 ! 1828 !-- Predetermine flag to mask topography 1829 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1830 1709 1831 IF ( qr_1d(k) > eps_sb ) THEN 1710 1832 ! … … 1724 1846 1725 1847 selfcoll = MAX( breakup - selfcoll, -nr_1d(k) / dt_micro ) 1726 nr_1d(k) = nr_1d(k) + selfcoll * dt_micro 1848 nr_1d(k) = nr_1d(k) + selfcoll * dt_micro * flag 1727 1849 1728 1850 ENDIF … … 1750 1872 1751 1873 USE indices, & 1752 ONLY: nzb _s_inner, nzt1874 ONLY: nzb, nzt, wall_flags_0 1753 1875 1754 1876 USE kinds … … 1766 1888 REAL(wp) :: evap_nr !< 1767 1889 REAL(wp) :: f_vent !< 1890 REAL(wp) :: flag !< flag to indicate first grid level above surface 1768 1891 REAL(wp) :: g_evap !< 1769 1892 REAL(wp) :: lambda_r !< … … 1778 1901 REAL(wp) :: xr !< 1779 1902 1780 DO k = nzb_s_inner(j,i)+1, nzt 1903 DO k = nzb+1, nzt 1904 ! 1905 !-- Predetermine flag to mask topography 1906 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1907 1781 1908 IF ( qr_1d(k) > eps_sb ) THEN 1782 1909 ! … … 1862 1989 -nr_1d(k) / dt_micro ) 1863 1990 1864 qr_1d(k) = qr_1d(k) + evap * dt_micro 1865 nr_1d(k) = nr_1d(k) + evap_nr * dt_micro 1991 qr_1d(k) = qr_1d(k) + evap * dt_micro * flag 1992 nr_1d(k) = nr_1d(k) + evap_nr * dt_micro * flag 1866 1993 1867 1994 ENDIF … … 1891 2018 1892 2019 USE indices, & 1893 ONLY: nzb, nzb _s_inner, nzt2020 ONLY: nzb, nzb, nzt, wall_flags_0 1894 2021 1895 2022 USE kinds … … 1904 2031 INTEGER(iwp) :: k !< 1905 2032 1906 REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc !< 2033 REAL(wp) :: flag !< flag to indicate first grid level above surface 2034 REAL(wp), DIMENSION(nzb:nzt+1) :: sed_qc !< 1907 2035 1908 2036 sed_qc(nzt+1) = 0.0_wp 1909 2037 1910 DO k = nzt, nzb_s_inner(j,i)+1, -1 2038 DO k = nzt, nzb+1, -1 2039 ! 2040 !-- Predetermine flag to mask topography 2041 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 2042 1911 2043 IF ( qc_1d(k) > eps_sb ) THEN 1912 2044 sed_qc(k) = sed_qc_const * nc_1d(k)**( -2.0_wp / 3.0_wp ) * & 1913 ( qc_1d(k) * hyrho(k) )**( 5.0_wp / 3.0_wp ) 2045 ( qc_1d(k) * hyrho(k) )**( 5.0_wp / 3.0_wp ) * flag 1914 2046 ELSE 1915 2047 sed_qc(k) = 0.0_wp … … 1918 2050 sed_qc(k) = MIN( sed_qc(k), hyrho(k) * dzu(k+1) * q_1d(k) / & 1919 2051 dt_micro + sed_qc(k+1) & 1920 ) 2052 ) * flag 1921 2053 1922 2054 q_1d(k) = q_1d(k) + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) / & 1923 hyrho(k) * dt_micro 2055 hyrho(k) * dt_micro * flag 1924 2056 qc_1d(k) = qc_1d(k) + ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) / & 1925 hyrho(k) * dt_micro 2057 hyrho(k) * dt_micro * flag 1926 2058 pt_1d(k) = pt_1d(k) - ( sed_qc(k+1) - sed_qc(k) ) * ddzu(k+1) / & 1927 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro 2059 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro * flag 1928 2060 1929 2061 ! 1930 2062 !-- Compute the precipitation rate of cloud (fog) droplets 1931 2063 IF ( call_microphysics_at_all_substeps ) THEN 1932 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * &1933 weight_substep(intermediate_timestep_count)2064 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * & 2065 weight_substep(intermediate_timestep_count) * flag 1934 2066 ELSE 1935 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) 2067 prr(k,j,i) = prr(k,j,i) + sed_qc(k) / hyrho(k) * flag 1936 2068 ENDIF 1937 2069 … … 1959 2091 1960 2092 USE indices, & 1961 ONLY: nzb, nzb _s_inner, nzt2093 ONLY: nzb, nzb, nzt, wall_flags_0 1962 2094 1963 2095 USE kinds … … 1966 2098 ONLY: weight_substep 1967 2099 2100 USE surface_mod, & 2101 ONLY : bc_h 2102 1968 2103 IMPLICIT NONE 1969 2104 1970 INTEGER(iwp) :: i !< 1971 INTEGER(iwp) :: j !< 1972 INTEGER(iwp) :: k !< 1973 INTEGER(iwp) :: k_run !< 2105 INTEGER(iwp) :: i !< running index x direction 2106 INTEGER(iwp) :: j !< running index y direction 2107 INTEGER(iwp) :: k !< running index z direction 2108 INTEGER(iwp) :: k_run !< 2109 INTEGER(iwp) :: m !< running index surface elements 2110 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 2111 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 1974 2112 1975 2113 REAL(wp) :: c_run !< … … 1979 2117 REAL(wp) :: dr !< 1980 2118 REAL(wp) :: flux !< 2119 REAL(wp) :: flag !< flag to indicate first grid level above surface 1981 2120 REAL(wp) :: lambda_r !< 1982 2121 REAL(wp) :: mu_r !< … … 1994 2133 ! 1995 2134 !-- Compute velocities 1996 DO k = nzb_s_inner(j,i)+1, nzt 2135 DO k = nzb+1, nzt 2136 ! 2137 !-- Predetermine flag to mask topography 2138 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 2139 1997 2140 IF ( qr_1d(k) > eps_sb ) THEN 1998 2141 ! … … 2013 2156 ( mu_r + 1.0_wp ) ) & 2014 2157 ) & 2015 ) 2158 ) * flag 2016 2159 w_qr(k) = MAX( 0.1_wp, MIN( 20.0_wp, & 2017 2160 a_term - b_term * ( 1.0_wp + & … … 2019 2162 ( mu_r + 4.0_wp ) ) & 2020 2163 ) & 2021 ) 2164 ) * flag 2022 2165 ELSE 2023 2166 w_nr(k) = 0.0_wp … … 2026 2169 ENDDO 2027 2170 ! 2028 !-- Adjust boundary values 2029 w_nr(nzb_s_inner(j,i)) = w_nr(nzb_s_inner(j,i)+1) 2030 w_qr(nzb_s_inner(j,i)) = w_qr(nzb_s_inner(j,i)+1) 2171 !-- Adjust boundary values using surface data type. 2172 !-- Upward facing non-natural 2173 surf_s = bc_h(0)%start_index(j,i) 2174 surf_e = bc_h(0)%end_index(j,i) 2175 DO m = surf_s, surf_e 2176 k = bc_h(0)%k(m) 2177 w_nr(k-1) = w_nr(k) 2178 w_qr(k-1) = w_qr(k) 2179 ENDDO 2180 ! 2181 !-- Downward facing non-natural 2182 surf_s = bc_h(1)%start_index(j,i) 2183 surf_e = bc_h(1)%end_index(j,i) 2184 DO m = surf_s, surf_e 2185 k = bc_h(1)%k(m) 2186 w_nr(k+1) = w_nr(k) 2187 w_qr(k+1) = w_qr(k) 2188 ENDDO 2189 ! 2190 !-- Neumann boundary condition at model top 2031 2191 w_nr(nzt+1) = 0.0_wp 2032 2192 w_qr(nzt+1) = 0.0_wp 2033 2193 ! 2034 2194 !-- Compute Courant number 2035 DO k = nzb_s_inner(j,i)+1, nzt 2195 DO k = nzb+1, nzt 2196 ! 2197 !-- Predetermine flag to mask topography 2198 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 2199 2036 2200 c_nr(k) = 0.25_wp * ( w_nr(k-1) + 2.0_wp * w_nr(k) + w_nr(k+1) ) * & 2037 dt_micro * ddzu(k) 2201 dt_micro * ddzu(k) * flag 2038 2202 c_qr(k) = 0.25_wp * ( w_qr(k-1) + 2.0_wp * w_qr(k) + w_qr(k+1) ) * & 2039 dt_micro * ddzu(k) 2203 dt_micro * ddzu(k) * flag 2040 2204 ENDDO 2041 2205 ! … … 2043 2207 IF ( limiter_sedimentation ) THEN 2044 2208 2045 DO k = nzb_s_inner(j,i)+1, nzt 2209 DO k = nzb+1, nzt 2210 ! 2211 !-- Predetermine flag to mask topography 2212 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 2213 2046 2214 d_mean = 0.5_wp * ( qr_1d(k+1) - qr_1d(k-1) ) 2047 2215 d_min = qr_1d(k) - MIN( qr_1d(k+1), qr_1d(k), qr_1d(k-1) ) … … 2050 2218 qr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min, & 2051 2219 2.0_wp * d_max, & 2052 ABS( d_mean ) ) 2220 ABS( d_mean ) ) * flag 2053 2221 2054 2222 d_mean = 0.5_wp * ( nr_1d(k+1) - nr_1d(k-1) ) … … 2058 2226 nr_slope(k) = SIGN(1.0_wp, d_mean) * MIN ( 2.0_wp * d_min, & 2059 2227 2.0_wp * d_max, & 2060 ABS( d_mean ) ) 2228 ABS( d_mean ) ) * flag 2061 2229 ENDDO 2062 2230 … … 2072 2240 ! 2073 2241 !-- Compute sedimentation flux 2074 DO k = nzt, nzb_s_inner(j,i)+1, -1 2075 ! 2076 !-- Sum up all rain drop number densities which contribute to the flux 2242 DO k = nzt, nzb+1, -1 2243 ! 2244 !-- Predetermine flag to mask topography 2245 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 2246 ! 2247 !-- Sum up all rain drop number densities which contribute to the flux 2077 2248 !-- through k-1/2 2078 2249 flux = 0.0_wp … … 2083 2254 flux = flux + hyrho(k_run) * & 2084 2255 ( nr_1d(k_run) + nr_slope(k_run) * ( 1.0_wp - c_run ) * & 2085 0.5_wp ) * c_run * dzu(k_run) 2086 z_run = z_run + dzu(k_run) 2087 k_run = k_run + 1 2088 c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) ) 2256 0.5_wp ) * c_run * dzu(k_run) * flag 2257 z_run = z_run + dzu(k_run) * flag 2258 k_run = k_run + 1 * flag 2259 c_run = MIN( 1.0_wp, c_nr(k_run) - z_run * ddzu(k_run) ) * flag 2089 2260 ENDDO 2090 2261 ! … … 2094 2265 hyrho(k) * dzu(k+1) * nr_1d(k) + sed_nr(k+1) * dt_micro ) 2095 2266 2096 sed_nr(k) = flux / dt_micro 2267 sed_nr(k) = flux / dt_micro * flag 2097 2268 nr_1d(k) = nr_1d(k) + ( sed_nr(k+1) - sed_nr(k) ) * ddzu(k+1) / & 2098 hyrho(k) * dt_micro 2269 hyrho(k) * dt_micro * flag 2099 2270 ! 2100 2271 !-- Sum up all rain water content which contributes to the flux … … 2109 2280 flux = flux + hyrho(k_run) * & 2110 2281 ( qr_1d(k_run) + qr_slope(k_run) * ( 1.0_wp - c_run ) * & 2111 0.5_wp ) * c_run * dzu(k_run) 2112 z_run = z_run + dzu(k_run) 2113 k_run = k_run + 1 2114 c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) ) 2282 0.5_wp ) * c_run * dzu(k_run) * flag 2283 z_run = z_run + dzu(k_run) * flag 2284 k_run = k_run + 1 * flag 2285 c_run = MIN( 1.0_wp, c_qr(k_run) - z_run * ddzu(k_run) ) * flag 2115 2286 2116 2287 ENDDO … … 2120 2291 hyrho(k) * dzu(k) * qr_1d(k) + sed_qr(k+1) * dt_micro ) 2121 2292 2122 sed_qr(k) = flux / dt_micro 2293 sed_qr(k) = flux / dt_micro * flag 2123 2294 2124 2295 qr_1d(k) = qr_1d(k) + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / & 2125 hyrho(k) * dt_micro 2296 hyrho(k) * dt_micro * flag 2126 2297 q_1d(k) = q_1d(k) + ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / & 2127 hyrho(k) * dt_micro 2298 hyrho(k) * dt_micro * flag 2128 2299 pt_1d(k) = pt_1d(k) - ( sed_qr(k+1) - sed_qr(k) ) * ddzu(k+1) / & 2129 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro 2300 hyrho(k) * l_d_cp * pt_d_t(k) * dt_micro * flag 2130 2301 ! 2131 2302 !-- Compute the rain rate 2132 2303 IF ( call_microphysics_at_all_substeps ) THEN 2133 2304 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) & 2134 * weight_substep(intermediate_timestep_count) 2305 * weight_substep(intermediate_timestep_count) * flag 2135 2306 ELSE 2136 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) 2307 prr(k,j,i) = prr(k,j,i) + sed_qr(k) / hyrho(k) * flag 2137 2308 ENDIF 2138 2309 … … 2162 2333 2163 2334 USE indices, & 2164 ONLY: nzb _s_inner2335 ONLY: nzb, nzt, wall_flags_0 2165 2336 2166 2337 USE kinds 2167 2338 2339 USE surface_mod, & 2340 ONLY : bc_h 2341 2168 2342 IMPLICIT NONE 2169 2343 2170 INTEGER(iwp) :: i !: 2171 INTEGER(iwp) :: j !: 2172 2344 INTEGER(iwp) :: i !< running index x direction 2345 INTEGER(iwp) :: j !< running index y direction 2346 INTEGER(iwp) :: k !< running index z direction 2347 INTEGER(iwp) :: m !< running index surface elements 2348 INTEGER(iwp) :: surf_e !< End index of surface elements at (j,i)-gridpoint 2349 INTEGER(iwp) :: surf_s !< Start index of surface elements at (j,i)-gridpoint 2173 2350 2174 2351 IF ( ( dt_do2d_xy - time_do2d_xy ) < precipitation_amount_interval .AND.& … … 2177 2354 THEN 2178 2355 2179 precipitation_amount(j,i) = precipitation_amount(j,i) + & 2180 prr(nzb_s_inner(j,i)+1,j,i) * & 2181 hyrho(nzb_s_inner(j,i)+1) * dt_3d 2356 surf_s = bc_h(0)%start_index(j,i) 2357 surf_e = bc_h(0)%end_index(j,i) 2358 DO m = surf_s, surf_e 2359 k = bc_h(0)%k(m) 2360 precipitation_amount(j,i) = precipitation_amount(j,i) + & 2361 prr(k,j,i) * hyrho(k) * dt_3d 2362 ENDDO 2363 2182 2364 ENDIF 2183 2365 -
palm/trunk/SOURCE/modules.f90
r2201 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Renamed wall_flags_0 and wall_flags_00 into advc_flags_1 and advc_flags_2, 23 ! respectively. Moreover, introduced further flag array wall_flags_0. 24 ! 25 ! Adjustments for new topography concept: 26 ! -fwxm, fwxp, fwym, fwyp, fxm, fxp, fym, fyp, rif_wall, wall_e_x, wall_e_y, 27 ! -wall_v, wall_u, wall_w_x, wall_w_y, wall_qflux, wall_sflux, wall_nrflux, 28 ! -wall_qrflux 29 ! 30 ! Adjustments for new surface concept: 31 ! +land_surface 32 ! -z0, z0h, z0q, us, ts, qs, qsws, nrs, nrsws, qrs, qrsws, ssws, ss, saswsb 33 ! -nzb_diff_u, nzb_diff_v, nzt_diff 34 ! -uswst, vswst, tswst, sswst, saswst, qswst, qrswst, nrswst, qswst_remote 35 ! 36 ! Generic tunnel setup: 37 ! +tunnel_height, tunnel_length, tunnel_width_x, tunnel_width_y, 38 ! +tunnel_wall_depth 39 ! 40 ! Topography input via netcdf 41 ! +lod 23 42 ! 24 43 ! Former revisions: … … 534 553 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: f3_mg !< 535 554 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: mean_inflow_profiles !< 536 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: nrs !<537 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: nrsws !<538 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: nrswst !<539 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ol !< Obukhov length540 555 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: precipitation_amount !< 541 556 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: precipitation_rate !< … … 543 558 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: pt_slope_ref !< 544 559 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qnudge !< 545 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qs !<546 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qsws !<547 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qswst !<548 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qswst_remote !<549 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qrs !<550 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qrsws !<551 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qrswst !<552 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: saswsb !<553 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: saswst !<554 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: shf !<555 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ss !<556 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssws !<557 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sswst !<558 560 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tnudge !< 559 561 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: td_lsa_lpt !< … … 563 565 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: total_2d_a !< 564 566 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: total_2d_o !< 565 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ts !<566 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tswst !<567 567 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ug_vert !< 568 568 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: unudge !< 569 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: us !<570 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: usws !<571 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: uswst !<572 569 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: vnudge !< 573 570 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: vg_vert !< 574 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: vsws !<575 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: vswst !<576 571 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wnudge !< 577 572 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wsubs_vert !< 578 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0 !< roughness length for momentum579 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0h !< roughness length for heat580 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0q !< roughness length for moisture581 573 582 574 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: d !< … … 744 736 #endif 745 737 746 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: rif_wall !<747 738 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: tri !< 748 739 … … 1014 1005 INTEGER(iwp) :: io_blocks = 1 !< 1015 1006 INTEGER(iwp) :: iran = -1234567 !< 1007 INTEGER(iwp) :: lod = 1 !< level of detail, topography input parameter 1016 1008 INTEGER(iwp) :: masks = 0 !< 1017 1009 INTEGER(iwp) :: maximum_grid_level !< … … 1130 1122 LOGICAL :: large_scale_forcing = .FALSE. !< 1131 1123 LOGICAL :: large_scale_subsidence = .FALSE. !< 1124 LOGICAL :: land_surface = .FALSE. !< flag parameter indicating wheather the lsm is used 1132 1125 LOGICAL :: lsf_exception = .FALSE. !< temporary flag for use of lsf with buildings on flat terrain 1133 1126 LOGICAL :: lsf_surf = .TRUE. !< … … 1183 1176 LOGICAL :: ws_scheme_sca = .FALSE. !< 1184 1177 LOGICAL :: ws_scheme_mom = .FALSE. !< 1185 1186 1178 LOGICAL :: data_output_xy(0:1) = .FALSE. !< 1187 1179 LOGICAL :: data_output_xz(0:1) = .FALSE. !< … … 1322 1314 REAL(wp) :: top_salinityflux = 9999999.9_wp !< 1323 1315 REAL(wp) :: top_scalarflux = 9999999.9_wp !< 1316 REAL(wp) :: tunnel_height = 9999999.9_wp !< height of tunnel outer wall 1317 REAL(wp) :: tunnel_length = 9999999.9_wp !< tunnel length 1318 REAL(wp) :: tunnel_width_x = 9999999.9_wp !< tunnel width in x, with respect to outer wall 1319 REAL(wp) :: tunnel_width_y = 9999999.9_wp !< tunnel width in y, with respect to outer wall 1320 REAL(wp) :: tunnel_wall_depth = 9999999.9_wp !< tunnel wall depth 1324 1321 REAL(wp) :: ug_surface = 0.0_wp !< 1325 1322 REAL(wp) :: u_bulk = 0.0_wp !< … … 1366 1363 REAL(wp) :: wall_heatflux(0:4) = 0.0_wp !< 1367 1364 REAL(wp) :: wall_humidityflux(0:4) = 0.0_wp !< 1368 REAL(wp) :: wall_nrflux(0:4) = 0.0_wp !<1369 REAL(wp) :: wall_qflux(0:4) = 0.0_wp !<1370 REAL(wp) :: wall_qrflux(0:4) = 0.0_wp !<1371 1365 REAL(wp) :: wall_salinityflux(0:4) = 0.0_wp !< 1372 REAL(wp) :: wall_sflux(0:4) = 0.0_wp !<1373 1366 REAL(wp) :: wall_scalarflux(0:4) = 0.0_wp !< 1374 1367 REAL(wp) :: subs_vertical_gradient(10) = 0.0_wp !< … … 1534 1527 REAL(wp), DIMENSION(:), ALLOCATABLE :: ddy2_mg !< 1535 1528 1536 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fwxm !<1537 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fwxp !<1538 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fwym !<1539 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fwyp !<1540 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fxm !<1541 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fxp !<1542 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fym !<1543 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: fyp !<1544 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_e_x !<1545 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_e_y !<1546 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_u !<1547 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_v !<1548 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_w_x !<1549 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: wall_w_y !<1550 1529 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zu_s_inner !< 1551 1530 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zw_w_inner !< … … 1594 1573 INTEGER(iwp) :: nzb_max !< 1595 1574 INTEGER(iwp) :: nzt !< 1596 INTEGER(iwp) :: nzt_diff !<1597 1575 1598 1576 INTEGER(idp), DIMENSION(:), ALLOCATABLE :: ngp_3d !< … … 1612 1590 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_diff_s_inner !< 1613 1591 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_diff_s_outer !< 1614 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_diff_u !<1615 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_diff_v !<1616 1592 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_inner !< 1617 1593 INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: nzb_outer !< … … 1627 1603 INTEGER(iwp), DIMENSION(:,:,:), POINTER :: flags !< 1628 1604 1629 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: wall_flags_0 !<1630 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: wall_flags_00 !<1631 1632 1605 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_1 !< 1633 1606 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_2 !< … … 1641 1614 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_10 !< 1642 1615 1643 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: rflags_s_inner !< 1644 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: rflags_invers !< 1616 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: advc_flags_1 !< flags used to degrade order of advection scheme 1617 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: advc_flags_2 !< flags used to degrade order of advection scheme 1618 INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: wall_flags_0 !< flags to mask topography 1645 1619 1646 1620 SAVE -
palm/trunk/SOURCE/netcdf_interface_mod.f90
r2210 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! Adjustments to new topography and surface concept 22 23 ! 23 ! 24 ! Topograpyh height arrays (zu_s_inner, zw_w_inner) are defined locally, output 25 ! only if parallel netcdf. 26 ! 27 ! Build interface for topography input: 28 ! - open file in read-only mode 29 ! - read global attributes 30 ! - read variables 31 ! 32 ! Bugfix in xy output (land-surface case) 33 ! 24 34 ! Former revisions: 25 35 ! ----------------- … … 198 208 MODULE netcdf_interface 199 209 200 USE control_parameters, ONLY: max_masks, fl_max, var_fl_max, varnamelength 210 USE control_parameters, & 211 ONLY: max_masks, fl_max, var_fl_max, varnamelength 201 212 USE kinds 202 213 #if defined( __netcdf ) … … 397 408 END INTERFACE netcdf_create_dim 398 409 410 INTERFACE netcdf_close_file 411 MODULE PROCEDURE netcdf_close_file 412 END INTERFACE netcdf_close_file 413 399 414 INTERFACE netcdf_create_file 400 415 MODULE PROCEDURE netcdf_create_file … … 409 424 END INTERFACE netcdf_define_header 410 425 426 INTERFACE netcdf_get_attribute 427 MODULE PROCEDURE netcdf_get_attribute 428 END INTERFACE netcdf_get_attribute 429 430 INTERFACE netcdf_get_variable 431 MODULE PROCEDURE netcdf_get_variable_2d 432 MODULE PROCEDURE netcdf_get_variable_3d 433 END INTERFACE netcdf_get_variable 434 411 435 INTERFACE netcdf_handle_error 412 436 MODULE PROCEDURE netcdf_handle_error 413 437 END INTERFACE netcdf_handle_error 414 438 439 INTERFACE netcdf_open_read_file 440 MODULE PROCEDURE netcdf_open_read_file 441 END INTERFACE netcdf_open_read_file 442 415 443 INTERFACE netcdf_open_write_file 416 444 MODULE PROCEDURE netcdf_open_write_file 417 445 END INTERFACE netcdf_open_write_file 418 446 419 PUBLIC netcdf_create_file, netcdf_define_header, netcdf_handle_error, & 420 netcdf_open_write_file 447 PUBLIC netcdf_create_file, netcdf_close_file, netcdf_define_header, & 448 netcdf_handle_error, netcdf_get_attribute, netcdf_get_variable, & 449 netcdf_open_read_file, netcdf_open_write_file 421 450 422 451 CONTAINS … … 434 463 USE control_parameters, & 435 464 ONLY: averaging_interval, averaging_interval_pr, & 436 data_output_pr, domask, dopr_n,&465 data_output_pr, domask, dopr_n, & 437 466 dopr_time_count, dopts_time_count, dots_time_count, & 438 do2d, do2d_xz_time_count, do3d, &467 do2d, do2d_xz_time_count, do3d, & 439 468 do2d_yz_time_count, dt_data_output_av, dt_do2d_xy, dt_do2d_xz, & 440 469 dt_do2d_yz, dt_do3d, mask_size, do2d_xy_time_count, & 441 do3d_time_count, domask_time_count, end_time, mask_i_global, & 442 mask_j_global, mask_k_global, message_string, mid, ntdim_2d_xy, & 470 do3d_time_count, domask_time_count, end_time, land_surface, & 471 lod, mask_size_l, mask_i, mask_i_global, mask_j, mask_j_global, & 472 mask_k_global, message_string, mid, ntdim_2d_xy, & 443 473 ntdim_2d_xz, ntdim_2d_yz, ntdim_3d, nz_do3d, prt_time_count, & 444 474 run_description_header, section, simulated_time, & … … 452 482 453 483 USE indices, & 454 ONLY: nx, n y, nz ,nzb, nzt484 ONLY: nx, nxl, nxr, ny, nys, nyn, nz ,nzb, nzt 455 485 456 486 USE kinds 457 487 458 488 USE land_surface_model_mod, & 459 ONLY: l and_surface, lsm_define_netcdf_grid, nzb_soil, nzt_soil, nzs, zs489 ONLY: lsm_define_netcdf_grid, nzb_soil, nzt_soil, nzs, zs 460 490 461 491 USE pegrid … … 750 780 ! 751 781 !-- In case of non-flat topography define 2d-arrays containing the height 752 !-- information 753 IF ( TRIM( topography ) /= 'flat' ) THEN 782 !-- information. Only for parallel netcdf output. 783 IF ( TRIM( topography ) /= 'flat' .AND. & 784 netcdf_data_format > 4 ) THEN 754 785 ! 755 786 !-- Define zusi = zu(nzb_s_inner) … … 992 1023 ! 993 1024 !-- In case of non-flat topography write height information 994 IF ( TRIM( topography ) /= 'flat' ) THEN 995 996 ALLOCATE( netcdf_data_2d(mask_size(mid,1),mask_size(mid,2)) ) 997 netcdf_data_2d = zu_s_inner( mask_i_global(mid,:mask_size(mid,1)),& 998 mask_j_global(mid,:mask_size(mid,2)) ) 999 1000 nc_stat = NF90_PUT_VAR( id_set_mask(mid,av), & 1001 id_var_zusi_mask(mid,av), & 1002 netcdf_data_2d, & 1003 start = (/ 1, 1 /), & 1004 count = (/ mask_size(mid,1), & 1005 mask_size(mid,2) /) ) 1025 IF ( TRIM( topography ) /= 'flat' .AND. & 1026 netcdf_data_format > 4 ) THEN 1027 1028 ALLOCATE( netcdf_data_2d(mask_size_l(mid,1),mask_size_l(mid,2)) ) 1029 netcdf_data_2d = zu_s_inner( mask_i(mid,:mask_size_l(mid,1)), & 1030 mask_j(mid,:mask_size_l(mid,2)) ) 1031 1032 nc_stat = NF90_PUT_VAR( id_set_mask(mid,av), & 1033 id_var_zusi_mask(mid,av), & 1034 netcdf_data_2d, & 1035 start = (/ 1, 1 /), & 1036 count = (/ mask_size_l(mid,1), & 1037 mask_size_l(mid,2) /) ) 1006 1038 CALL netcdf_handle_error( 'netcdf_define_header', 505 ) 1007 1039 1008 netcdf_data_2d = zw_w_inner( mask_i _global(mid,:mask_size(mid,1)),&1009 mask_j _global(mid,:mask_size(mid,2)) )1010 1011 nc_stat = NF90_PUT_VAR( id_set_mask(mid,av), &1012 id_var_zwwi_mask(mid,av), &1013 netcdf_data_2d, &1014 start = (/ 1, 1 /), &1015 count = (/ mask_size (mid,1),&1016 mask_size (mid,2) /) )1040 netcdf_data_2d = zw_w_inner( mask_i(mid,:mask_size_l(mid,1)), & 1041 mask_j(mid,:mask_size_l(mid,2)) ) 1042 1043 nc_stat = NF90_PUT_VAR( id_set_mask(mid,av), & 1044 id_var_zwwi_mask(mid,av), & 1045 netcdf_data_2d, & 1046 start = (/ 1, 1 /), & 1047 count = (/ mask_size_l(mid,1), & 1048 mask_size_l(mid,2) /) ) 1017 1049 CALL netcdf_handle_error( 'netcdf_define_header', 506 ) 1018 1050 … … 1283 1315 ! 1284 1316 !-- In case of non-flat topography define 2d-arrays containing the height 1285 !-- information 1286 IF ( TRIM( topography ) /= 'flat' ) THEN 1317 !-- information. Only output 2d topography information in case of parallel 1318 !-- output. 1319 IF ( TRIM( topography ) /= 'flat' .AND. & 1320 netcdf_data_format > 4 ) THEN 1287 1321 ! 1288 1322 !-- Define zusi = zu(nzb_s_inner) … … 1542 1576 CALL netcdf_handle_error( 'netcdf_define_header', 86 ) 1543 1577 1544 !1545 !-- In case of non-flat topography write height information1546 IF ( TRIM( topography ) /= 'flat' ) THEN1547 1548 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zusi_3d(av), &1549 zu_s_inner(0:nx+1,0:ny+1), &1550 start = (/ 1, 1 /), &1551 count = (/ nx+2, ny+2 /) )1552 CALL netcdf_handle_error( 'netcdf_define_header', 419 )1553 1554 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zwwi_3d(av), &1555 zw_w_inner(0:nx+1,0:ny+1), &1556 start = (/ 1, 1 /), &1557 count = (/ nx+2, ny+2 /) )1558 CALL netcdf_handle_error( 'netcdf_define_header', 420 )1559 1560 ENDIF1561 1562 1578 IF ( land_surface ) THEN 1563 1579 ! … … 1568 1584 CALL netcdf_handle_error( 'netcdf_define_header', 86 ) 1569 1585 ENDIF 1586 1587 ENDIF 1588 ! 1589 !-- In case of non-flat topography write height information. Only for 1590 !-- parallel netcdf output. 1591 IF ( TRIM( topography ) /= 'flat' .AND. & 1592 netcdf_data_format > 4 ) THEN 1593 1594 IF ( nxr == nx .AND. nyn /= ny ) THEN 1595 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zusi_3d(av), & 1596 zu_s_inner(nxl:nxr+1,nys:nyn), & 1597 start = (/ nxl+1, nys+1 /), & 1598 count = (/ nxr-nxl+2, nyn-nys+1 /) ) 1599 ELSEIF ( nxr /= nx .AND. nyn == ny ) THEN 1600 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zusi_3d(av), & 1601 zu_s_inner(nxl:nxr,nys:nyn+1), & 1602 start = (/ nxl+1, nys+1 /), & 1603 count = (/ nxr-nxl+1, nyn-nys+2 /) ) 1604 ELSEIF ( nxr == nx .AND. nyn == ny ) THEN 1605 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zusi_3d(av), & 1606 zu_s_inner(nxl:nxr+1,nys:nyn+1), & 1607 start = (/ nxl+1, nys+1 /), & 1608 count = (/ nxr-nxl+2, nyn-nys+2 /) ) 1609 ELSE 1610 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zusi_3d(av), & 1611 zu_s_inner(nxl:nxr,nys:nyn), & 1612 start = (/ nxl+1, nys+1 /), & 1613 count = (/ nxr-nxl+1, nyn-nys+1 /) ) 1614 ENDIF 1615 CALL netcdf_handle_error( 'netcdf_define_header', 419 ) 1616 1617 IF ( nxr == nx .AND. nyn /= ny ) THEN 1618 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zwwi_3d(av), & 1619 zw_w_inner(nxl:nxr+1,nys:nyn), & 1620 start = (/ nxl+1, nys+1 /), & 1621 count = (/ nxr-nxl+2, nyn-nys+1 /) ) 1622 ELSEIF ( nxr /= nx .AND. nyn == ny ) THEN 1623 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zwwi_3d(av), & 1624 zw_w_inner(nxl:nxr,nys:nyn+1), & 1625 start = (/ nxl+1, nys+1 /), & 1626 count = (/ nxr-nxl+1, nyn-nys+2 /) ) 1627 ELSEIF ( nxr == nx .AND. nyn == ny ) THEN 1628 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zwwi_3d(av), & 1629 zw_w_inner(nxl:nxr+1,nys:nyn+1), & 1630 start = (/ nxl+1, nys+1 /), & 1631 count = (/ nxr-nxl+2, nyn-nys+2 /) ) 1632 ELSE 1633 nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_zwwi_3d(av), & 1634 zw_w_inner(nxl:nxr,nys:nyn), & 1635 start = (/ nxl+1, nys+1 /), & 1636 count = (/ nxr-nxl+1, nyn-nys+1 /) ) 1637 ENDIF 1638 CALL netcdf_handle_error( 'netcdf_define_header', 420 ) 1570 1639 1571 1640 ENDIF … … 1841 1910 IF ( land_surface ) THEN 1842 1911 1843 ns_do = 01844 DO WHILE ( section(ns_do +1,1) <nzs )1912 ns_do = 1 1913 DO WHILE ( section(ns_do,1) /= -9999 .AND. ns <= nzs ) 1845 1914 ns_do = ns_do + 1 1846 1915 ENDDO … … 1900 1969 ! 1901 1970 !-- In case of non-flat topography define 2d-arrays containing the height 1902 !-- information 1903 IF ( TRIM( topography ) /= 'flat' ) THEN 1971 !-- information. Only for parallel netcdf output. 1972 IF ( TRIM( topography ) /= 'flat' .AND. & 1973 netcdf_data_format > 4 ) THEN 1904 1974 ! 1905 1975 !-- Define zusi = zu(nzb_s_inner) … … 2211 2281 DEALLOCATE( netcdf_data ) 2212 2282 2213 ! 2214 !-- In case of non-flat topography write height information 2215 IF ( TRIM( topography ) /= 'flat' ) THEN 2216 2217 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zusi_xy(av), & 2218 zu_s_inner(0:nx+1,0:ny+1), & 2219 start = (/ 1, 1 /), & 2220 count = (/ nx+2, ny+2 /) ) 2221 CALL netcdf_handle_error( 'netcdf_define_header', 427 ) 2222 2223 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zwwi_xy(av), & 2224 zw_w_inner(0:nx+1,0:ny+1), & 2225 start = (/ 1, 1 /), & 2226 count = (/ nx+2, ny+2 /) ) 2227 CALL netcdf_handle_error( 'netcdf_define_header', 428 ) 2228 2283 ENDIF 2284 2285 ! 2286 !-- In case of non-flat topography write height information. Only for 2287 !-- parallel netcdf output. 2288 IF ( TRIM( topography ) /= 'flat' .AND. & 2289 netcdf_data_format > 4 ) THEN 2290 2291 IF ( nxr == nx .AND. nyn /= ny ) THEN 2292 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zusi_xy(av), & 2293 zu_s_inner(nxl:nxr+1,nys:nyn), & 2294 start = (/ nxl+1, nys+1 /), & 2295 count = (/ nxr-nxl+2, nyn-nys+1 /) ) 2296 ELSEIF ( nxr /= nx .AND. nyn == ny ) THEN 2297 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zusi_xy(av), & 2298 zu_s_inner(nxl:nxr,nys:nyn+1), & 2299 start = (/ nxl+1, nys+1 /), & 2300 count = (/ nxr-nxl+1, nyn-nys+2 /) ) 2301 ELSEIF ( nxr == nx .AND. nyn == ny ) THEN 2302 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zusi_xy(av), & 2303 zu_s_inner(nxl:nxr+1,nys:nyn+1), & 2304 start = (/ nxl+1, nys+1 /), & 2305 count = (/ nxr-nxl+2, nyn-nys+2 /) ) 2306 ELSE 2307 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zusi_xy(av), & 2308 zu_s_inner(nxl:nxr,nys:nyn), & 2309 start = (/ nxl+1, nys+1 /), & 2310 count = (/ nxr-nxl+1, nyn-nys+1 /) ) 2229 2311 ENDIF 2230 2231 2312 CALL netcdf_handle_error( 'netcdf_define_header', 427 ) 2313 2314 IF ( nxr == nx .AND. nyn /= ny ) THEN 2315 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zwwi_xy(av), & 2316 zw_w_inner(nxl:nxr+1,nys:nyn), & 2317 start = (/ nxl+1, nys+1 /), & 2318 count = (/ nxr-nxl+2, nyn-nys+1 /) ) 2319 ELSEIF ( nxr /= nx .AND. nyn == ny ) THEN 2320 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zwwi_xy(av), & 2321 zw_w_inner(nxl:nxr,nys:nyn+1), & 2322 start = (/ nxl+1, nys+1 /), & 2323 count = (/ nxr-nxl+1, nyn-nys+2 /) ) 2324 ELSEIF ( nxr == nx .AND. nyn == ny ) THEN 2325 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zwwi_xy(av), & 2326 zw_w_inner(nxl:nxr+1,nys:nyn+1), & 2327 start = (/ nxl+1, nys+1 /), & 2328 count = (/ nxr-nxl+2, nyn-nys+2 /) ) 2329 ELSE 2330 nc_stat = NF90_PUT_VAR( id_set_xy(av), id_var_zwwi_xy(av), & 2331 zw_w_inner(nxl:nxr,nys:nyn), & 2332 start = (/ nxl+1, nys+1 /), & 2333 count = (/ nxr-nxl+1, nyn-nys+1 /) ) 2334 ENDIF 2335 CALL netcdf_handle_error( 'netcdf_define_header', 428 ) 2232 2336 2233 2337 ENDIF … … 5337 5441 ! Description: 5338 5442 ! ------------ 5443 !> Closes an existing netCDF file. 5444 !------------------------------------------------------------------------------! 5445 5446 SUBROUTINE netcdf_close_file( id, errno ) 5447 #if defined( __netcdf ) 5448 5449 USE pegrid 5450 5451 IMPLICIT NONE 5452 5453 INTEGER(iwp), INTENT(IN) :: errno !< error number 5454 INTEGER(iwp), INTENT(INOUT) :: id !< file id 5455 5456 nc_stat = NF90_CLOSE( id ) 5457 CALL netcdf_handle_error( 'netcdf_close', errno ) 5458 #endif 5459 END SUBROUTINE netcdf_close_file 5460 5461 !------------------------------------------------------------------------------! 5462 ! Description: 5463 ! ------------ 5464 !> Opens an existing netCDF file for reading only and gives back the id. 5465 !------------------------------------------------------------------------------! 5466 5467 SUBROUTINE netcdf_open_read_file( filename, id, errno ) 5468 #if defined( __netcdf ) 5469 5470 USE pegrid 5471 5472 IMPLICIT NONE 5473 5474 CHARACTER (LEN=*), INTENT(IN) :: filename !< filename 5475 INTEGER(iwp), INTENT(IN) :: errno !< error number 5476 INTEGER(iwp), INTENT(INOUT) :: id !< file id 5477 LOGICAL :: file_open = .FALSE. 5478 5479 nc_stat = NF90_OPEN( filename, NF90_NOWRITE, id ) 5480 5481 CALL netcdf_handle_error( 'netcdf_open_read_file', errno ) 5482 5483 #endif 5484 END SUBROUTINE netcdf_open_read_file 5485 5486 !------------------------------------------------------------------------------! 5487 ! Description: 5488 ! ------------ 5489 !> Reads the global attributes of a file 5490 !------------------------------------------------------------------------------! 5491 5492 SUBROUTINE netcdf_get_attribute( id, attribute_name, value, global, errno, variable_name ) 5493 #if defined( __netcdf ) 5494 5495 USE pegrid 5496 5497 IMPLICIT NONE 5498 5499 CHARACTER(LEN=*) :: attribute_name !< attribute name 5500 CHARACTER(LEN=*), OPTIONAL :: variable_name !< variable name 5501 5502 INTEGER(iwp), INTENT(IN) :: errno !< error number 5503 INTEGER(iwp), INTENT(INOUT) :: id !< file id 5504 INTEGER(iwp), INTENT(INOUT) :: value !< read value 5505 5506 INTEGER(iwp) :: id_var !< variable id 5507 5508 LOGICAL, INTENT(IN) :: global !< flag indicating global attributes 5509 5510 ! 5511 !-- Read global attribute 5512 IF ( global ) THEN 5513 nc_stat = NF90_GET_ATT( id, NF90_GLOBAL, TRIM( attribute_name ), value ) 5514 CALL netcdf_handle_error( 'netcdf_get_attribute global', errno ) 5515 ! 5516 !-- Read attributes referring to a single variable. Therefore, first inquire 5517 !-- variable id 5518 ELSE 5519 nc_stat = NF90_INQ_VARID( id, TRIM( variable_name ), id_var ) 5520 CALL netcdf_handle_error( 'netcdf_get_attribute', errno ) 5521 nc_stat = NF90_GET_ATT( id, id_var, TRIM( attribute_name ), value ) 5522 CALL netcdf_handle_error( 'netcdf_get_attribute', errno ) 5523 ENDIF 5524 #endif 5525 END SUBROUTINE netcdf_get_attribute 5526 5527 !------------------------------------------------------------------------------! 5528 ! Description: 5529 ! ------------ 5530 !> Reads a 2D REAL variable of a file. Reading is done processor-wise, 5531 !> i.e. each core reads its own domain, as well as in slices along x. 5532 !------------------------------------------------------------------------------! 5533 5534 SUBROUTINE netcdf_get_variable_2d( id, variable_name, i, var, errno ) 5535 #if defined( __netcdf ) 5536 5537 USE indices 5538 USE pegrid 5539 5540 IMPLICIT NONE 5541 5542 CHARACTER(LEN=*) :: variable_name !< attribute name 5543 INTEGER(iwp), INTENT(IN) :: errno !< error number 5544 INTEGER(iwp), INTENT(IN) :: i !< index along x direction 5545 5546 INTEGER(iwp), INTENT(INOUT) :: id !< file id 5547 5548 INTEGER(iwp) :: id_var !< variable id 5549 5550 REAL(wp), DIMENSION(nys:nyn), INTENT(INOUT) :: var !< variable to be read 5551 REAL(wp) :: var_dum 5552 ! 5553 !-- Inquire variable id 5554 nc_stat = NF90_INQ_VARID( id, TRIM( variable_name ), id_var ) 5555 ! 5556 !-- Get variable 5557 nc_stat = NF90_GET_VAR( id, id_var, var(nys:nyn), & 5558 start = (/ i+1, nys+1 /), & 5559 count = (/ 1, nyn - nys + 1 /) ) 5560 5561 CALL netcdf_handle_error( 'netcdf_get_variable', errno ) 5562 #endif 5563 END SUBROUTINE netcdf_get_variable_2d 5564 5565 !------------------------------------------------------------------------------! 5566 ! Description: 5567 ! ------------ 5568 !> Reads a 3D INTEGER variable of a file. Reading is done processor-wise, 5569 !> i.e. each core reads its own domain, as well as in slices along x. 5570 !------------------------------------------------------------------------------! 5571 5572 SUBROUTINE netcdf_get_variable_3d( id, variable_name, i, j, var, errno ) 5573 #if defined( __netcdf ) 5574 5575 USE indices 5576 USE pegrid 5577 5578 IMPLICIT NONE 5579 5580 CHARACTER(LEN=*) :: variable_name !< attribute name 5581 INTEGER(iwp), INTENT(IN) :: errno !< error number 5582 INTEGER(iwp), INTENT(IN) :: i !< index along x direction 5583 INTEGER(iwp), INTENT(IN) :: j !< index along y direction 5584 5585 INTEGER(iwp), INTENT(INOUT) :: id !< file id 5586 5587 INTEGER(iwp) :: id_var !< variable id 5588 INTEGER(iwp) :: id_z !< id of z-dimension 5589 INTEGER(iwp) :: nz_file !< number of grid-points in file 5590 5591 INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(INOUT) :: var !< variable to be read 5592 ! 5593 !-- Get dimension of z-axis 5594 nc_stat = NF90_INQ_DIMID( id, "z", id_z ) 5595 nc_stat = NF90_INQUIRE_DIMENSION( id, id_z, len = nz_file ) 5596 ! 5597 !-- Inquire variable id 5598 nc_stat = NF90_INQ_VARID( id, TRIM( variable_name ), id_var ) 5599 ! 5600 !-- Get variable 5601 nc_stat = NF90_GET_VAR( id, id_var, var(0:nz_file-1), & 5602 start = (/ i+1, j+1, 1 /), & 5603 count = (/ 1, 1, nz_file /) ) 5604 5605 CALL netcdf_handle_error( 'netcdf_get_variable', errno ) 5606 #endif 5607 END SUBROUTINE netcdf_get_variable_3d 5608 5609 !------------------------------------------------------------------------------! 5610 ! Description: 5611 ! ------------ 5339 5612 !> Opens an existing netCDF file for writing and gives back the id. 5340 5613 !> The parallel flag has to be TRUE for parallel netCDF output support. -
palm/trunk/SOURCE/nudging_mod.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 332 332 333 333 USE indices, & 334 ONLY: nxl, nxr, nys, nyn, nzb, nz b_u_inner, nzt334 ONLY: nxl, nxr, nys, nyn, nzb, nzt, wall_flags_0 335 335 336 336 USE kinds … … 372 372 DO j = nys, nyn 373 373 374 DO k = nzb _u_inner(j,i)+1, nzt374 DO k = nzb+1, nzt 375 375 376 376 tmp_tend = - ( hom(k,1,1,0) - ( unudge(k,nt) * dtp + & 377 377 unudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 378 378 379 tend(k,j,i) = tend(k,j,i) + tmp_tend 379 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 380 MERGE( 1.0_wp, 0.0_wp, & 381 BTEST( wall_flags_0(k,j,i), 1 ) ) 380 382 381 383 sums_ls_l(k,6) = sums_ls_l(k,6) + tmp_tend * & … … 393 395 DO j = nys, nyn 394 396 395 DO k = nzb _u_inner(j,i)+1, nzt397 DO k = nzb+1, nzt 396 398 397 399 tmp_tend = - ( hom(k,1,2,0) - ( vnudge(k,nt) * dtp + & 398 400 vnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 399 401 400 tend(k,j,i) = tend(k,j,i) + tmp_tend 402 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 403 MERGE( 1.0_wp, 0.0_wp, & 404 BTEST( wall_flags_0(k,j,i), 2 ) ) 401 405 402 406 sums_ls_l(k,7) = sums_ls_l(k,7) + tmp_tend * & … … 414 418 DO j = nys, nyn 415 419 416 DO k = nzb _u_inner(j,i)+1, nzt420 DO k = nzb+1, nzt 417 421 418 422 tmp_tend = - ( hom(k,1,4,0) - ( ptnudge(k,nt) * dtp + & 419 423 ptnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 420 424 421 tend(k,j,i) = tend(k,j,i) + tmp_tend 425 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 426 MERGE( 1.0_wp, 0.0_wp, & 427 BTEST( wall_flags_0(k,j,i), 0 ) ) 422 428 423 429 sums_ls_l(k,4) = sums_ls_l(k,4) + tmp_tend * & … … 435 441 DO j = nys, nyn 436 442 437 DO k = nzb _u_inner(j,i)+1, nzt443 DO k = nzb+1, nzt 438 444 439 445 tmp_tend = - ( hom(k,1,41,0) - ( qnudge(k,nt) * dtp + & 440 446 qnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 441 447 442 tend(k,j,i) = tend(k,j,i) + tmp_tend 448 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 449 MERGE( 1.0_wp, 0.0_wp, & 450 BTEST( wall_flags_0(k,j,i), 0 ) ) 443 451 444 452 sums_ls_l(k,5) = sums_ls_l(k,5) + tmp_tend * & … … 476 484 477 485 USE indices, & 478 ONLY: nxl, nxr, nys, nyn, nzb, nz b_u_inner, nzt486 ONLY: nxl, nxr, nys, nyn, nzb, nzt, wall_flags_0 479 487 480 488 USE kinds … … 514 522 CASE ( 'u' ) 515 523 516 DO k = nzb _u_inner(j,i)+1, nzt524 DO k = nzb+1, nzt 517 525 518 526 tmp_tend = - ( hom(k,1,1,0) - ( unudge(k,nt) * dtp + & 519 527 unudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 520 528 521 tend(k,j,i) = tend(k,j,i) + tmp_tend 529 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 530 MERGE( 1.0_wp, 0.0_wp, & 531 BTEST( wall_flags_0(k,j,i), 1 ) ) 522 532 523 533 sums_ls_l(k,6) = sums_ls_l(k,6) + tmp_tend & … … 529 539 CASE ( 'v' ) 530 540 531 DO k = nzb _u_inner(j,i)+1, nzt541 DO k = nzb+1, nzt 532 542 533 543 tmp_tend = - ( hom(k,1,2,0) - ( vnudge(k,nt) * dtp + & 534 544 vnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 535 545 536 tend(k,j,i) = tend(k,j,i) + tmp_tend 546 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 547 MERGE( 1.0_wp, 0.0_wp, & 548 BTEST( wall_flags_0(k,j,i), 2 ) ) 537 549 538 550 sums_ls_l(k,7) = sums_ls_l(k,7) + tmp_tend & … … 544 556 CASE ( 'pt' ) 545 557 546 DO k = nzb _u_inner(j,i)+1, nzt558 DO k = nzb+1, nzt 547 559 548 560 tmp_tend = - ( hom(k,1,4,0) - ( ptnudge(k,nt) * dtp + & 549 561 ptnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 550 562 551 tend(k,j,i) = tend(k,j,i) + tmp_tend 563 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 564 MERGE( 1.0_wp, 0.0_wp, & 565 BTEST( wall_flags_0(k,j,i), 0 ) ) 552 566 553 567 sums_ls_l(k,4) = sums_ls_l(k,4) + tmp_tend & … … 560 574 CASE ( 'q' ) 561 575 562 DO k = nzb _u_inner(j,i)+1, nzt576 DO k = nzb+1, nzt 563 577 564 578 tmp_tend = - ( hom(k,1,41,0) - ( qnudge(k,nt) * dtp + & 565 579 qnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k) 566 580 567 tend(k,j,i) = tend(k,j,i) + tmp_tend 581 tend(k,j,i) = tend(k,j,i) + tmp_tend * & 582 MERGE( 1.0_wp, 0.0_wp, & 583 BTEST( wall_flags_0(k,j,i), 0 ) ) 568 584 569 585 sums_ls_l(k,5) = sums_ls_l(k,5) + tmp_tend & -
palm/trunk/SOURCE/palm.f90
r2179 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Renamed wall_flags_0 and wall_flags_00 into advc_flags_1 and advc_flags_2, 23 ! respectively, within copyin statement. Moreover, introduced further flag 24 ! array wall_flags_0. 25 ! Remove unused variables from ONLY list. 23 26 ! 24 27 ! Former revisions: … … 165 168 166 169 USE control_parameters, & 170 167 171 ONLY: cloud_physics, constant_diffusion, coupling_char, coupling_mode,& 168 172 do2d_at_begin, do3d_at_begin, humidity, initializing_actions, & 169 io_blocks, io_group,&173 land_surface, io_blocks, io_group, & 170 174 large_scale_forcing, message_string, microphysics_seifert, & 171 175 nest_domain, neutral, & … … 179 183 ONLY: cpu_log, log_point, cpu_statistics 180 184 181 USE grid_variables, &182 ONLY: fxm, fxp, fym, fyp, fwxm, fwxp, fwym, fwyp, wall_e_x, wall_e_y, &183 wall_u, wall_v, wall_w_x, wall_w_y184 185 185 USE indices, & 186 ONLY: nbgp, ngp_2dh, ngp_2dh_s_inner, nzb_diff_s_inner, nzb_diff_s_outer, & 187 nzb_diff_u, nzb_diff_v, nzb_s_inner, nzb_s_outer, nzb_u_inner, & 188 nzb_u_outer, nzb_v_inner, nzb_v_outer, nzb_w_inner, & 189 nzb_w_outer, rflags_invers, rflags_s_inner, wall_flags_0, & 190 wall_flags_00 186 ONLY: nbgp 191 187 192 188 USE kinds 193 189 194 190 USE land_surface_model_mod, & 195 ONLY: l and_surface, lsm_last_actions191 ONLY: lsm_last_actions 196 192 197 193 USE ls_forcing_mod, & … … 213 209 USE radiation_model_mod, & 214 210 ONLY: radiation, radiation_last_actions 215 216 USE statistics, & 217 ONLY: hom, rmask, weight_pres, weight_substep 218 219 USE surface_layer_fluxes_mod, & 220 ONLY: pt1, qv1, uv_total 221 211 222 212 USE urban_surface_mod, & 223 213 ONLY: usm_write_restart_data -
palm/trunk/SOURCE/parin.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! typo corrected 23 ! +wall_salinityflux 24 ! +tunnel_height, tunnel_lenght, tunnel_width_x, tunnel_width_y, 25 ! tunnel_wall_depth 23 26 ! 24 27 ! Former revisions: … … 373 376 topography, topography_grid_convention, top_heatflux, & 374 377 top_momentumflux_u, top_momentumflux_v, top_salinityflux, & 375 top_scalarflux, transpose_compute_overlap, turbulent_inflow, & 376 turbulent_outflow, & 378 top_scalarflux, transpose_compute_overlap, & 379 tunnel_height, tunnel_length, tunnel_width_x, tunnel_width_y, & 380 tunnel_wall_depth, & 381 turbulent_inflow, turbulent_outflow, & 377 382 use_subsidence_tendencies, ug_surface, ug_vertical_gradient, & 378 383 ug_vertical_gradient_level, use_surface_fluxes, use_cmax, & … … 381 386 vg_vertical_gradient_level, v_bulk, v_profile, ventilation_effect,& 382 387 wall_adjustment, wall_heatflux, wall_humidityflux, & 383 wall_s calarflux, zeta_max, zeta_min, z0h_factor388 wall_salinityflux, wall_scalarflux, zeta_max, zeta_min, z0h_factor 384 389 385 390 NAMELIST /d3par/ averaging_interval, averaging_interval_pr, & … … 594 599 CALL wtm_parin 595 600 ! 596 !-- Check if virtual flights should be carried out and read &flight_par t601 !-- Check if virtual flights should be carried out and read &flight_par 597 602 !-- if required 598 603 CALL flight_parin -
palm/trunk/SOURCE/plant_canopy_model_mod.f90
r2214 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new topography concept 23 23 ! 24 24 ! Former revisions: … … 118 118 119 119 USE arrays_3d, & 120 ONLY: dzu, dzw, e, q, s, shf,tend, u, v, w, zu, zw120 ONLY: dzu, dzw, e, q, s, tend, u, v, w, zu, zw 121 121 122 122 USE indices, & 123 123 ONLY: nbgp, nxl, nxlg, nxlu, nxr, nxrg, nyn, nyng, nys, nysg, nysv, & 124 nz, nzb, nzb_ s_inner, nzb_u_inner, nzb_v_inner, nzb_w_inner, nzt124 nz, nzb, nzb_max, nzt, wall_flags_0 125 125 126 126 USE kinds … … 549 549 USE control_parameters, & 550 550 ONLY: coupling_char, dz, humidity, io_blocks, io_group, & 551 message_string, ocean, passive_scalar 552 553 USE control_parameters,&554 ONLY: urban_surface551 message_string, ocean, passive_scalar, urban_surface 552 553 USE surface_mod, & 554 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 555 555 556 556 IMPLICIT NONE … … 562 562 INTEGER(iwp) :: j !< running index 563 563 INTEGER(iwp) :: k !< running index 564 INTEGER(iwp) :: m !< running index 564 565 565 566 REAL(wp) :: int_bpdf !< vertical integral for lad-profile construction … … 639 640 canopy_height = pch_index * dz 640 641 641 DO k = nzb, pch_index642 DO k = 0, pch_index 642 643 int_bpdf = int_bpdf + & 643 644 ( ( ( zw(k) / canopy_height )**( alpha_lad-1.0_wp ) ) * & … … 649 650 ! 650 651 !-- Preliminary lad profile (defined on w-grid) 651 DO k = nzb, pch_index652 DO k = 0, pch_index 652 653 pre_lad(k) = lai_beta * & 653 654 ( ( ( zw(k) / canopy_height )**( alpha_lad-1.0_wp ) ) & … … 662 663 !-- when calculating the canopy tendencies) 663 664 lad(0) = pre_lad(0) 664 DO k = nzb+1, pch_index665 DO k = 1, pch_index 665 666 lad(k) = 0.5 * ( pre_lad(k-1) + pre_lad(k) ) 666 667 ENDDO … … 761 762 ENDDO 762 763 764 ! 765 !-- In areas with canopy the surface value of the canopy heat 766 !-- flux distribution overrides the surface heat flux (shf) 767 !-- Start with default surface type 768 DO m = 1, surf_def_h(0)%ns 769 k = surf_def_h(0)%k(m) 770 IF ( cum_lai_hf(0,j,i) /= 0.0_wp ) & 771 surf_def_h(0)%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) ) 772 ENDDO 773 ! 774 !-- Natural surfaces 775 DO m = 1, surf_lsm_h%ns 776 k = surf_lsm_h%k(m) 777 IF ( cum_lai_hf(0,j,i) /= 0.0_wp ) & 778 surf_lsm_h%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) ) 779 ENDDO 780 ! 781 !-- Urban surfaces 782 DO m = 1, surf_usm_h%ns 783 k = surf_usm_h%k(m) 784 IF ( cum_lai_hf(0,j,i) /= 0.0_wp ) & 785 surf_usm_h%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) ) 786 ENDDO 787 ! 763 788 ! 764 789 !-- Calculation of the heating rate (K/s) within the different layers of 765 !-- the plant canopy 790 !-- the plant canopy. Calculation is only necessary in areas covered with 791 !-- canopy. 792 !-- Within the different canopy layers the plant-canopy heating 793 !-- rate (pc_heating_rate) is calculated as the vertical 794 !-- divergence of the canopy heat fluxes at the top and bottom 795 !-- of the respective layer 766 796 DO i = nxlg, nxrg 767 797 DO j = nysg, nyng 768 ! 769 !-- Calculation only necessary in areas covered with canopy 770 IF ( cum_lai_hf(0,j,i) /= 0.0_wp ) THEN 771 !-- 772 !-- In areas with canopy the surface value of the canopy heat 773 !-- flux distribution overrides the surface heat flux (shf) 774 shf(j,i) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) ) 775 ! 776 !-- Within the different canopy layers the plant-canopy heating 777 !-- rate (pc_heating_rate) is calculated as the vertical 778 !-- divergence of the canopy heat fluxes at the top and bottom 779 !-- of the respective layer 780 DO k = 1, pch_index 781 pc_heating_rate(k,j,i) = cthf * & 782 ( exp(-ext_coef*cum_lai_hf(k,j,i)) - & 783 exp(-ext_coef*cum_lai_hf(k-1,j,i)) ) / dzw(k) 784 ENDDO 785 ENDIF 798 DO k = 1, pch_index 799 IF ( cum_lai_hf(0,j,i) /= 0.0_wp ) THEN 800 pc_heating_rate(k,j,i) = cthf * & 801 ( exp(-ext_coef*cum_lai_hf(k,j,i)) - & 802 exp(-ext_coef*cum_lai_hf(k-1,j,i) ) ) / dzw(k) 803 ENDIF 804 ENDDO 786 805 ENDDO 787 806 ENDDO … … 966 985 INTEGER(iwp) :: j !< running index 967 986 INTEGER(iwp) :: k !< running index 987 INTEGER(iwp) :: k_wall !< vertical index of topography top 968 988 INTEGER(iwp) :: kk !< running index for flat lad arrays 969 989 … … 987 1007 DO i = nxlu, nxr 988 1008 DO j = nys, nyn 989 DO k = nzb_u_inner(j,i)+1, nzb_u_inner(j,i)+pch_index 990 991 kk = k - nzb_u_inner(j,i) !- lad arrays are defined flat 1009 ! 1010 !-- Determine topography-top index on u-grid 1011 k_wall = MAXLOC( & 1012 MERGE( 1, 0, & 1013 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1014 ), DIM = 1 & 1015 ) - 1 1016 DO k = k_wall+1, k_wall+pch_index 1017 1018 kk = k - k_wall !- lad arrays are defined flat 992 1019 ! 993 1020 !-- In order to create sharp boundaries of the plant canopy, … … 1048 1075 DO i = nxl, nxr 1049 1076 DO j = nysv, nyn 1050 DO k = nzb_v_inner(j,i)+1, nzb_v_inner(j,i)+pch_index 1051 1052 kk = k - nzb_v_inner(j,i) !- lad arrays are defined flat 1077 ! 1078 !-- Determine topography-top index on v-grid 1079 k_wall = MAXLOC( & 1080 MERGE( 1, 0, & 1081 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1082 ), DIM = 1 & 1083 ) - 1 1084 DO k = k_wall+1, k_wall+pch_index 1085 1086 kk = k - k_wall !- lad arrays are defined flat 1053 1087 ! 1054 1088 !-- In order to create sharp boundaries of the plant canopy, … … 1109 1143 DO i = nxl, nxr 1110 1144 DO j = nys, nyn 1111 DO k = nzb_w_inner(j,i)+1, nzb_w_inner(j,i)+pch_index-1 1112 1113 kk = k - nzb_w_inner(j,i) !- lad arrays are defined flat 1145 ! 1146 !-- Determine topography-top index on w-grid 1147 k_wall = MAXLOC( & 1148 MERGE( 1, 0, & 1149 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1150 ), DIM = 1 & 1151 ) - 1 1152 DO k = k_wall+1, k_wall+pch_index-1 1153 1154 kk = k - k_wall !- lad arrays are defined flat 1114 1155 1115 1156 pre_tend = 0.0_wp … … 1157 1198 DO i = nxl, nxr 1158 1199 DO j = nys, nyn 1159 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1160 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1200 ! 1201 !-- Determine topography-top index on scalar-grid 1202 k_wall = MAXLOC( & 1203 MERGE( 1, 0, & 1204 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1205 ), DIM = 1 & 1206 ) - 1 1207 DO k = k_wall+1, k_wall+pch_index 1208 1209 kk = k - k_wall !- lad arrays are defined flat 1161 1210 tend(k,j,i) = tend(k,j,i) + pc_heating_rate(kk,j,i) 1162 1211 ENDDO … … 1169 1218 DO i = nxl, nxr 1170 1219 DO j = nys, nyn 1171 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1172 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1220 ! 1221 !-- Determine topography-top index on scalar-grid 1222 k_wall = MAXLOC( & 1223 MERGE( 1, 0, & 1224 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1225 ), DIM = 1 & 1226 ) - 1 1227 DO k = k_wall+1, k_wall+pch_index 1228 1229 kk = k - k_wall !- lad arrays are defined flat 1173 1230 tend(k,j,i) = tend(k,j,i) - & 1174 1231 lsec * & … … 1194 1251 DO i = nxl, nxr 1195 1252 DO j = nys, nyn 1196 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1197 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1253 ! 1254 !-- Determine topography-top index on scalar-grid 1255 k_wall = MAXLOC( & 1256 MERGE( 1, 0, & 1257 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1258 ), DIM = 1 & 1259 ) - 1 1260 DO k = k_wall+1, k_wall+pch_index 1261 1262 kk = k - k_wall !- lad arrays are defined flat 1198 1263 tend(k,j,i) = tend(k,j,i) - & 1199 1264 2.0_wp * cdc * & … … 1218 1283 DO i = nxl, nxr 1219 1284 DO j = nys, nyn 1220 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1221 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1285 ! 1286 !-- Determine topography-top index on scalar-grid 1287 k_wall = MAXLOC( & 1288 MERGE( 1, 0, & 1289 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1290 ), DIM = 1 & 1291 ) - 1 1292 DO k = k_wall+1, k_wall+pch_index 1293 1294 kk = k - k_wall !- lad arrays are defined flat 1222 1295 tend(k,j,i) = tend(k,j,i) - & 1223 1296 lsec * & … … 1288 1361 INTEGER(iwp) :: j !< running index 1289 1362 INTEGER(iwp) :: k !< running index 1363 INTEGER(iwp) :: k_wall !< vertical index of topography top 1290 1364 INTEGER(iwp) :: kk !< running index for flat lad arrays 1291 1365 … … 1307 1381 !-- u-component 1308 1382 CASE ( 1 ) 1309 DO k = nzb_u_inner(j,i)+1, nzb_u_inner(j,i)+pch_index 1310 1311 kk = k - nzb_u_inner(j,i) !- lad arrays are defined flat 1383 ! 1384 !-- Determine topography-top index on u-grid 1385 k_wall = MAXLOC( & 1386 MERGE( 1, 0, & 1387 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1388 ), DIM = 1 & 1389 ) - 1 1390 DO k = k_wall+1, k_wall+pch_index 1391 1392 kk = k - k_wall !- lad arrays are defined flat 1312 1393 ! 1313 1394 !-- In order to create sharp boundaries of the plant canopy, … … 1363 1444 !-- v-component 1364 1445 CASE ( 2 ) 1365 DO k = nzb_v_inner(j,i)+1, nzb_v_inner(j,i)+pch_index 1366 1367 kk = k - nzb_v_inner(j,i) !- lad arrays are defined flat 1446 ! 1447 !-- Determine topography-top index on v-grid 1448 k_wall = MAXLOC( & 1449 MERGE( 1, 0, & 1450 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1451 ), DIM = 1 & 1452 ) - 1 1453 DO k = k_wall+1, k_wall+pch_index 1454 1455 kk = k - k_wall !- lad arrays are defined flat 1368 1456 ! 1369 1457 !-- In order to create sharp boundaries of the plant canopy, … … 1419 1507 !-- w-component 1420 1508 CASE ( 3 ) 1421 DO k = nzb_w_inner(j,i)+1, nzb_w_inner(j,i)+pch_index-1 1422 1423 kk = k - nzb_w_inner(j,i) !- lad arrays are defined flat 1509 ! 1510 !-- Determine topography-top index on w-grid 1511 k_wall = MAXLOC( & 1512 MERGE( 1, 0, & 1513 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1514 ), DIM = 1 & 1515 ) - 1 1516 DO k = k_wall+1, k_wall+pch_index-1 1517 1518 kk = k - k_wall !- lad arrays are defined flat 1424 1519 1425 1520 pre_tend = 0.0_wp … … 1462 1557 !-- potential temperature 1463 1558 CASE ( 4 ) 1464 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1465 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1559 ! 1560 !-- Determine topography-top index on scalar grid 1561 k_wall = MAXLOC( & 1562 MERGE( 1, 0, & 1563 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1564 ), DIM = 1 & 1565 ) - 1 1566 DO k = k_wall+1, k_wall+pch_index 1567 kk = k - k_wall !- lad arrays are defined flat 1466 1568 tend(k,j,i) = tend(k,j,i) + pc_heating_rate(kk,j,i) 1467 1569 ENDDO … … 1471 1573 !-- humidity 1472 1574 CASE ( 5 ) 1473 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1474 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1575 ! 1576 !-- Determine topography-top index on scalar grid 1577 k_wall = MAXLOC( & 1578 MERGE( 1, 0, & 1579 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1580 ), DIM = 1 & 1581 ) - 1 1582 DO k = k_wall+1, k_wall+pch_index 1583 1584 kk = k - k_wall 1475 1585 tend(k,j,i) = tend(k,j,i) - & 1476 1586 lsec * & … … 1492 1602 !-- sgs-tke 1493 1603 CASE ( 6 ) 1494 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1495 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1604 ! 1605 !-- Determine topography-top index on scalar grid 1606 k_wall = MAXLOC( & 1607 MERGE( 1, 0, & 1608 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1609 ), DIM = 1 & 1610 ) - 1 1611 DO k = k_wall+1, k_wall+pch_index 1612 1613 kk = k - k_wall 1496 1614 tend(k,j,i) = tend(k,j,i) - & 1497 1615 2.0_wp * cdc * & … … 1513 1631 !-- scalar concentration 1514 1632 CASE ( 7 ) 1515 DO k = nzb_s_inner(j,i)+1, nzb_s_inner(j,i)+pch_index 1516 kk = k - nzb_s_inner(j,i) !- lad arrays are defined flat 1633 ! 1634 !-- Determine topography-top index on scalar grid 1635 k_wall = MAXLOC( & 1636 MERGE( 1, 0, & 1637 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1638 ), DIM = 1 & 1639 ) - 1 1640 DO k = k_wall+1, k_wall+pch_index 1641 1642 kk = k - k_wall 1517 1643 tend(k,j,i) = tend(k,j,i) - & 1518 1644 lsec * & -
palm/trunk/SOURCE/pmc_interface_mod.f90
r2230 r2232 21 21 ! Current revisions: 22 22 ! ------------------ 23 ! 23 ! Adjustments to new topography concept 24 24 ! 25 25 ! Former revisions: … … 139 139 USE arrays_3d, & 140 140 ONLY: dzu, dzw, e, e_p, nr, pt, pt_p, q, q_p, qr, u, u_p, v, v_p, & 141 w, w_p, zu, zw , z0141 w, w_p, zu, zw 142 142 #else 143 143 USE arrays_3d, & 144 144 ONLY: dzu, dzw, e, e_p, e_1, e_2, nr, nr_2, nr_p, pt, pt_p, pt_1, & 145 145 pt_2, q, q_p, q_1, q_2, qr, qr_2, s, s_2, u, u_p, u_1, u_2, v, & 146 v_p, v_1, v_2, w, w_p, w_1, w_2, zu, zw , z0146 v_p, v_1, v_2, w, w_p, w_1, w_2, zu, zw 147 147 #endif 148 148 … … 151 151 message_string, microphysics_seifert, nest_bound_l, nest_bound_r,& 152 152 nest_bound_s, nest_bound_n, nest_domain, neutral, passive_scalar,& 153 simulated_time, topography, volume_flow153 roughness_length, simulated_time, topography, volume_flow 154 154 155 155 USE cpulog, & … … 161 161 USE indices, & 162 162 ONLY: nbgp, nx, nxl, nxlg, nxlu, nxr, nxrg, ny, nyn, nyng, nys, nysg, & 163 nysv, nz, nzb, nzb_s_inner, nzb_u_inner, nzb_u_outer, & 164 nzb_v_inner, nzb_v_outer, nzb_w_inner, nzb_w_outer, nzt 163 nysv, nz, nzb, nzb_max, nzt, wall_flags_0 165 164 166 165 USE kinds … … 201 200 202 201 #endif 202 203 USE surface_mod, & 204 ONLY: surf_def_h, surf_lsm_h, surf_usm_h 203 205 204 206 IMPLICIT NONE … … 1310 1312 1311 1313 INTEGER(iwp) :: direction !: Wall normal index: 1=k, 2=j, 3=i. 1314 INTEGER(iwp) :: end_index !: End index of present surface data type 1312 1315 INTEGER(iwp) :: i !: 1313 1316 INTEGER(iwp) :: icorr !: … … 1319 1322 INTEGER(iwp) :: jw !: 1320 1323 INTEGER(iwp) :: k !: 1324 INTEGER(iwp) :: k_wall_u_ji !: 1325 INTEGER(iwp) :: k_wall_u_ji_p !: 1326 INTEGER(iwp) :: k_wall_u_ji_m !: 1327 INTEGER(iwp) :: k_wall_v_ji !: 1328 INTEGER(iwp) :: k_wall_v_ji_p !: 1329 INTEGER(iwp) :: k_wall_v_ji_m !: 1330 INTEGER(iwp) :: k_wall_w_ji !: 1331 INTEGER(iwp) :: k_wall_w_ji_p !: 1332 INTEGER(iwp) :: k_wall_w_ji_m !: 1321 1333 INTEGER(iwp) :: kb !: 1322 1334 INTEGER(iwp) :: kcorr !: 1323 1335 INTEGER(iwp) :: lc !: 1336 INTEGER(iwp) :: m !: Running index for surface data type 1324 1337 INTEGER(iwp) :: ni !: 1325 1338 INTEGER(iwp) :: nj !: 1326 1339 INTEGER(iwp) :: nk !: 1327 1340 INTEGER(iwp) :: nzt_topo_max !: 1341 INTEGER(iwp) :: start_index !: Start index of present surface data type 1328 1342 INTEGER(iwp) :: wall_index !: Index of the wall-node coordinate 1329 1343 1344 REAL(wp) :: z0_topo !: roughness at vertical walls 1330 1345 REAL(wp), ALLOCATABLE, DIMENSION(:) :: lcr !: 1331 1346 … … 1339 1354 DO i = nxl-1, nxl 1340 1355 DO j = nys, nyn 1341 nzt_topo_nestbc_l = MAX( nzt_topo_nestbc_l, nzb_u_inner(j,i), & 1342 nzb_v_inner(j,i), nzb_w_inner(j,i) ) 1356 ! 1357 !-- Concept need to be reconsidered for 3D-topography 1358 !-- Determine largest topography index on scalar grid 1359 nzt_topo_nestbc_l = MAX( nzt_topo_nestbc_l, & 1360 MAXLOC( & 1361 MERGE( 1, 0, & 1362 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1363 ), DIM = 1 & 1364 ) - 1 ) 1365 ! 1366 !-- Determine largest topography index on u grid 1367 nzt_topo_nestbc_l = MAX( nzt_topo_nestbc_l, & 1368 MAXLOC( & 1369 MERGE( 1, 0, & 1370 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1371 ), DIM = 1 & 1372 ) - 1 ) 1373 ! 1374 !-- Determine largest topography index on v grid 1375 nzt_topo_nestbc_l = MAX( nzt_topo_nestbc_l, & 1376 MAXLOC( & 1377 MERGE( 1, 0, & 1378 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1379 ), DIM = 1 & 1380 ) - 1 ) 1381 ! 1382 !-- Determine largest topography index on w grid 1383 nzt_topo_nestbc_l = MAX( nzt_topo_nestbc_l, & 1384 MAXLOC( & 1385 MERGE( 1, 0, & 1386 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1387 ), DIM = 1 & 1388 ) - 1 ) 1343 1389 ENDDO 1344 1390 ENDDO … … 1350 1396 i = nxr + 1 1351 1397 DO j = nys, nyn 1352 nzt_topo_nestbc_r = MAX( nzt_topo_nestbc_r, nzb_u_inner(j,i), & 1353 nzb_v_inner(j,i), nzb_w_inner(j,i) ) 1398 ! 1399 !-- Concept need to be reconsidered for 3D-topography 1400 !-- Determine largest topography index on scalar grid 1401 nzt_topo_nestbc_r = MAX( nzt_topo_nestbc_r, & 1402 MAXLOC( & 1403 MERGE( 1, 0, & 1404 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1405 ), DIM = 1 & 1406 ) - 1 ) 1407 ! 1408 !-- Determine largest topography index on u grid 1409 nzt_topo_nestbc_r = MAX( nzt_topo_nestbc_r, & 1410 MAXLOC( & 1411 MERGE( 1, 0, & 1412 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1413 ), DIM = 1 & 1414 ) - 1 ) 1415 ! 1416 !-- Determine largest topography index on v grid 1417 nzt_topo_nestbc_r = MAX( nzt_topo_nestbc_r, & 1418 MAXLOC( & 1419 MERGE( 1, 0, & 1420 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1421 ), DIM = 1 & 1422 ) - 1 ) 1423 ! 1424 !-- Determine largest topography index on w grid 1425 nzt_topo_nestbc_r = MAX( nzt_topo_nestbc_r, & 1426 MAXLOC( & 1427 MERGE( 1, 0, & 1428 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1429 ), DIM = 1 & 1430 ) - 1 ) 1354 1431 ENDDO 1355 1432 nzt_topo_nestbc_r = nzt_topo_nestbc_r + 1 … … 1360 1437 DO j = nys-1, nys 1361 1438 DO i = nxl, nxr 1362 nzt_topo_nestbc_s = MAX( nzt_topo_nestbc_s, nzb_u_inner(j,i), & 1363 nzb_v_inner(j,i), nzb_w_inner(j,i) ) 1439 ! 1440 !-- Concept need to be reconsidered for 3D-topography 1441 !-- Determine largest topography index on scalar grid 1442 nzt_topo_nestbc_s = MAX( nzt_topo_nestbc_s, & 1443 MAXLOC( & 1444 MERGE( 1, 0, & 1445 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1446 ), DIM = 1 & 1447 ) - 1 ) 1448 ! 1449 !-- Determine largest topography index on u grid 1450 nzt_topo_nestbc_s = MAX( nzt_topo_nestbc_s, & 1451 MAXLOC( & 1452 MERGE( 1, 0, & 1453 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1454 ), DIM = 1 & 1455 ) - 1 ) 1456 ! 1457 !-- Determine largest topography index on v grid 1458 nzt_topo_nestbc_s = MAX( nzt_topo_nestbc_s, & 1459 MAXLOC( & 1460 MERGE( 1, 0, & 1461 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1462 ), DIM = 1 & 1463 ) - 1 ) 1464 ! 1465 !-- Determine largest topography index on w grid 1466 nzt_topo_nestbc_s = MAX( nzt_topo_nestbc_s, & 1467 MAXLOC( & 1468 MERGE( 1, 0, & 1469 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1470 ), DIM = 1 & 1471 ) - 1 ) 1364 1472 ENDDO 1365 1473 ENDDO … … 1371 1479 j = nyn + 1 1372 1480 DO i = nxl, nxr 1373 nzt_topo_nestbc_n = MAX( nzt_topo_nestbc_n, nzb_u_inner(j,i), & 1374 nzb_v_inner(j,i), nzb_w_inner(j,i) ) 1481 ! 1482 !-- Concept need to be reconsidered for 3D-topography 1483 !-- Determine largest topography index on scalar grid 1484 nzt_topo_nestbc_n = MAX( nzt_topo_nestbc_n, & 1485 MAXLOC( & 1486 MERGE( 1, 0, & 1487 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 1488 ), DIM = 1 & 1489 ) - 1 ) 1490 ! 1491 !-- Determine largest topography index on u grid 1492 nzt_topo_nestbc_n = MAX( nzt_topo_nestbc_n, & 1493 MAXLOC( & 1494 MERGE( 1, 0, & 1495 BTEST( wall_flags_0(nzb:nzb_max,j,i), 14 ) & 1496 ), DIM = 1 & 1497 ) - 1 ) 1498 ! 1499 !-- Determine largest topography index on v grid 1500 nzt_topo_nestbc_n = MAX( nzt_topo_nestbc_n, & 1501 MAXLOC( & 1502 MERGE( 1, 0, & 1503 BTEST( wall_flags_0(nzb:nzb_max,j,i), 16 ) & 1504 ), DIM = 1 & 1505 ) - 1 ) 1506 ! 1507 !-- Determine largest topography index on w grid 1508 nzt_topo_nestbc_n = MAX( nzt_topo_nestbc_n, & 1509 MAXLOC( & 1510 MERGE( 1, 0, & 1511 BTEST( wall_flags_0(nzb:nzb_max,j,i), 18 ) & 1512 ), DIM = 1 & 1513 ) - 1 ) 1375 1514 ENDDO 1376 1515 nzt_topo_nestbc_n = nzt_topo_nestbc_n + 1 … … 1422 1561 !-- Left boundary for u 1423 1562 i = 0 1424 kb = nzb_u_inner(j,i) 1425 k = kb + 1 1426 wall_index = kb 1427 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1428 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1563 ! 1564 !-- For loglaw correction the roughness z0 is required. z0, however, 1565 !-- is part of the surfacetypes now, so call subroutine according 1566 !-- to the present surface tpye. 1567 !-- Default surface type 1568 IF ( surf_def_h(0)%start_index(j,i) <= & 1569 surf_def_h(0)%end_index(j,i) ) THEN 1570 start_index = surf_def_h(0)%start_index(j,i) 1571 end_index = surf_def_h(0)%end_index(j,i) 1572 DO m = start_index, end_index 1573 k = surf_def_h(0)%k(m) 1574 wall_index = k - 1 1575 kb = k - 1 1576 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1577 j, inc, wall_index, surf_def_h(0)%z0(m), & 1578 kb, direction, ncorr ) 1579 ENDDO 1580 ! 1581 !-- Natural surface type 1582 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1583 surf_lsm_h%end_index(j,i) ) THEN 1584 start_index = surf_lsm_h%start_index(j,i) 1585 end_index = surf_lsm_h%end_index(j,i) 1586 DO m = start_index, end_index 1587 k = surf_lsm_h%k(m) 1588 wall_index = k - 1 1589 kb = k - 1 1590 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1591 j, inc, wall_index, surf_lsm_h%z0(m), & 1592 kb, direction, ncorr ) 1593 ENDDO 1594 ! 1595 !-- Urban surface type 1596 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1597 surf_usm_h%end_index(j,i) ) THEN 1598 start_index = surf_usm_h%start_index(j,i) 1599 end_index = surf_usm_h%end_index(j,i) 1600 DO m = start_index, end_index 1601 k = surf_usm_h%k(m) 1602 wall_index = k - 1 1603 kb = k - 1 1604 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1605 j, inc, wall_index, surf_usm_h%z0(m), & 1606 kb, direction, ncorr ) 1607 ENDDO 1608 ENDIF 1429 1609 logc_u_l(1,k,j) = lc 1430 1610 logc_ratio_u_l(1,0:ncorr-1,k,j) = lcr(0:ncorr-1) … … 1433 1613 !-- Left boundary for v 1434 1614 i = -1 1435 kb = nzb_v_inner(j,i) 1436 k = kb + 1 1437 wall_index = kb 1438 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1439 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1615 ! 1616 !-- For loglaw correction the roughness z0 is required. z0, however, 1617 !-- is part of the surfacetypes now, so call subroutine according 1618 !-- to the present surface tpye. 1619 !-- Default surface type 1620 IF ( surf_def_h(0)%start_index(j,i) <= & 1621 surf_def_h(0)%end_index(j,i) ) THEN 1622 start_index = surf_def_h(0)%start_index(j,i) 1623 end_index = surf_def_h(0)%end_index(j,i) 1624 DO m = start_index, end_index 1625 k = surf_def_h(0)%k(m) 1626 wall_index = k - 1 1627 kb = k - 1 1628 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1629 j, inc, wall_index, surf_def_h(0)%z0(m), & 1630 kb, direction, ncorr ) 1631 ENDDO 1632 ! 1633 !-- Natural surface type 1634 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1635 surf_lsm_h%end_index(j,i) ) THEN 1636 start_index = surf_lsm_h%start_index(j,i) 1637 end_index = surf_lsm_h%end_index(j,i) 1638 DO m = start_index, end_index 1639 k = surf_lsm_h%k(m) 1640 wall_index = k - 1 1641 kb = k - 1 1642 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1643 j, inc, wall_index, surf_lsm_h%z0(m), & 1644 kb, direction, ncorr ) 1645 ENDDO 1646 ! 1647 !-- Urban surface type 1648 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1649 surf_usm_h%end_index(j,i) ) THEN 1650 start_index = surf_usm_h%start_index(j,i) 1651 end_index = surf_usm_h%end_index(j,i) 1652 DO m = start_index, end_index 1653 k = surf_usm_h%k(m) 1654 wall_index = k - 1 1655 kb = k - 1 1656 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1657 j, inc, wall_index, surf_usm_h%z0(m), & 1658 kb, direction, ncorr ) 1659 ENDDO 1660 ENDIF 1440 1661 logc_v_l(1,k,j) = lc 1441 1662 logc_ratio_v_l(1,0:ncorr-1,k,j) = lcr(0:ncorr-1) … … 1469 1690 !-- Right boundary for u 1470 1691 i = nxr + 1 1471 kb = nzb_u_inner(j,i) 1472 k = kb + 1 1473 wall_index = kb 1474 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1475 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1692 ! 1693 !-- For loglaw correction the roughness z0 is required. z0, however, 1694 !-- is part of the surfacetypes now, so call subroutine according 1695 !-- to the present surface tpye. 1696 !-- Default surface type 1697 IF ( surf_def_h(0)%start_index(j,i) <= & 1698 surf_def_h(0)%end_index(j,i) ) THEN 1699 start_index = surf_def_h(0)%start_index(j,i) 1700 end_index = surf_def_h(0)%end_index(j,i) 1701 DO m = start_index, end_index 1702 k = surf_def_h(0)%k(m) 1703 wall_index = k - 1 1704 kb = k - 1 1705 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1706 j, inc, wall_index, surf_def_h(0)%z0(m), & 1707 kb, direction, ncorr ) 1708 ENDDO 1709 ! 1710 !-- Natural surface type 1711 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1712 surf_lsm_h%end_index(j,i) ) THEN 1713 start_index = surf_lsm_h%start_index(j,i) 1714 end_index = surf_lsm_h%end_index(j,i) 1715 DO m = start_index, end_index 1716 k = surf_lsm_h%k(m) 1717 wall_index = k - 1 1718 kb = k - 1 1719 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1720 j, inc, wall_index, surf_lsm_h%z0(m), & 1721 kb, direction, ncorr ) 1722 ENDDO 1723 ! 1724 !-- Urban surface type 1725 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1726 surf_usm_h%end_index(j,i) ) THEN 1727 start_index = surf_usm_h%start_index(j,i) 1728 end_index = surf_usm_h%end_index(j,i) 1729 DO m = start_index, end_index 1730 k = surf_usm_h%k(m) 1731 wall_index = k - 1 1732 kb = k - 1 1733 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1734 j, inc, wall_index, surf_usm_h%z0(m), & 1735 kb, direction, ncorr ) 1736 ENDDO 1737 ENDIF 1738 1476 1739 logc_u_r(1,k,j) = lc 1477 1740 logc_ratio_u_r(1,0:ncorr-1,k,j) = lcr(0:ncorr-1) … … 1480 1743 !-- Right boundary for v 1481 1744 i = nxr + 1 1482 kb = nzb_v_inner(j,i) 1483 k = kb + 1 1484 wall_index = kb 1485 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1486 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1745 ! 1746 !-- For loglaw correction the roughness z0 is required. z0, however, 1747 !-- is part of the surfacetypes now, so call subroutine according 1748 !-- to the present surface tpye. 1749 !-- Default surface type 1750 IF ( surf_def_h(0)%start_index(j,i) <= & 1751 surf_def_h(0)%end_index(j,i) ) THEN 1752 start_index = surf_def_h(0)%start_index(j,i) 1753 end_index = surf_def_h(0)%end_index(j,i) 1754 DO m = start_index, end_index 1755 k = surf_def_h(0)%k(m) 1756 wall_index = k - 1 1757 kb = k - 1 1758 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1759 j, inc, wall_index, surf_def_h(0)%z0(m), & 1760 kb, direction, ncorr ) 1761 ENDDO 1762 ! 1763 !-- Natural surface type 1764 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1765 surf_lsm_h%end_index(j,i) ) THEN 1766 start_index = surf_lsm_h%start_index(j,i) 1767 end_index = surf_lsm_h%end_index(j,i) 1768 DO m = start_index, end_index 1769 k = surf_lsm_h%k(m) 1770 wall_index = k - 1 1771 kb = k - 1 1772 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1773 j, inc, wall_index, surf_lsm_h%z0(m), & 1774 kb, direction, ncorr ) 1775 ENDDO 1776 ! 1777 !-- Urban surface type 1778 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1779 surf_usm_h%end_index(j,i) ) THEN 1780 start_index = surf_usm_h%start_index(j,i) 1781 end_index = surf_usm_h%end_index(j,i) 1782 DO m = start_index, end_index 1783 k = surf_usm_h%k(m) 1784 wall_index = k - 1 1785 kb = k - 1 1786 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1787 j, inc, wall_index, surf_usm_h%z0(m), & 1788 kb, direction, ncorr ) 1789 ENDDO 1790 ENDIF 1487 1791 logc_v_r(1,k,j) = lc 1488 1792 logc_ratio_v_r(1,0:ncorr-1,k,j) = lcr(0:ncorr-1) … … 1516 1820 !-- South boundary for u 1517 1821 j = -1 1518 kb = nzb_u_inner(j,i) 1519 k = kb + 1 1520 wall_index = kb 1521 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1522 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1822 ! 1823 !-- For loglaw correction the roughness z0 is required. z0, however, 1824 !-- is part of the surfacetypes now, so call subroutine according 1825 !-- to the present surface tpye. 1826 !-- Default surface type 1827 IF ( surf_def_h(0)%start_index(j,i) <= & 1828 surf_def_h(0)%end_index(j,i) ) THEN 1829 start_index = surf_def_h(0)%start_index(j,i) 1830 end_index = surf_def_h(0)%end_index(j,i) 1831 DO m = start_index, end_index 1832 k = surf_def_h(0)%k(m) 1833 wall_index = k - 1 1834 kb = k - 1 1835 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1836 j, inc, wall_index, surf_def_h(0)%z0(m), & 1837 kb, direction, ncorr ) 1838 ENDDO 1839 ! 1840 !-- Natural surface type 1841 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1842 surf_lsm_h%end_index(j,i) ) THEN 1843 start_index = surf_lsm_h%start_index(j,i) 1844 end_index = surf_lsm_h%end_index(j,i) 1845 DO m = start_index, end_index 1846 k = surf_lsm_h%k(m) 1847 wall_index = k - 1 1848 kb = k - 1 1849 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1850 j, inc, wall_index, surf_lsm_h%z0(m), & 1851 kb, direction, ncorr ) 1852 ENDDO 1853 ! 1854 !-- Urban surface type 1855 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1856 surf_usm_h%end_index(j,i) ) THEN 1857 start_index = surf_usm_h%start_index(j,i) 1858 end_index = surf_usm_h%end_index(j,i) 1859 DO m = start_index, end_index 1860 k = surf_usm_h%k(m) 1861 wall_index = k - 1 1862 kb = k - 1 1863 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1864 j, inc, wall_index, surf_usm_h%z0(m), & 1865 kb, direction, ncorr ) 1866 ENDDO 1867 ENDIF 1523 1868 logc_u_s(1,k,i) = lc 1524 1869 logc_ratio_u_s(1,0:ncorr-1,k,i) = lcr(0:ncorr-1) … … 1527 1872 !-- South boundary for v 1528 1873 j = 0 1529 kb = nzb_v_inner(j,i) 1530 k = kb + 1 1531 wall_index = kb 1532 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1533 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1874 ! 1875 !-- For loglaw correction the roughness z0 is required. z0, however, 1876 !-- is part of the surfacetypes now, so call subroutine according 1877 !-- to the present surface tpye. 1878 !-- Default surface type 1879 IF ( surf_def_h(0)%start_index(j,i) <= & 1880 surf_def_h(0)%end_index(j,i) ) THEN 1881 start_index = surf_def_h(0)%start_index(j,i) 1882 end_index = surf_def_h(0)%end_index(j,i) 1883 DO m = start_index, end_index 1884 k = surf_def_h(0)%k(m) 1885 wall_index = k - 1 1886 kb = k - 1 1887 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1888 j, inc, wall_index, surf_def_h(0)%z0(m), & 1889 kb, direction, ncorr ) 1890 ENDDO 1891 ! 1892 !-- Natural surface type 1893 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1894 surf_lsm_h%end_index(j,i) ) THEN 1895 start_index = surf_lsm_h%start_index(j,i) 1896 end_index = surf_lsm_h%end_index(j,i) 1897 DO m = start_index, end_index 1898 k = surf_lsm_h%k(m) 1899 wall_index = k - 1 1900 kb = k - 1 1901 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1902 j, inc, wall_index, surf_lsm_h%z0(m), & 1903 kb, direction, ncorr ) 1904 ENDDO 1905 ! 1906 !-- Urban surface type 1907 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1908 surf_usm_h%end_index(j,i) ) THEN 1909 start_index = surf_usm_h%start_index(j,i) 1910 end_index = surf_usm_h%end_index(j,i) 1911 DO m = start_index, end_index 1912 k = surf_usm_h%k(m) 1913 wall_index = k - 1 1914 kb = k - 1 1915 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1916 j, inc, wall_index, surf_usm_h%z0(m), & 1917 kb, direction, ncorr ) 1918 ENDDO 1919 ENDIF 1534 1920 logc_v_s(1,k,i) = lc 1535 1921 logc_ratio_v_s(1,0:ncorr-1,k,i) = lcr(0:ncorr-1) … … 1563 1949 !-- North boundary for u 1564 1950 j = nyn + 1 1565 kb = nzb_u_inner(j,i) 1566 k = kb + 1 1567 wall_index = kb 1568 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1569 inc, wall_index, z0(j,i), kb, direction, ncorr ) 1951 ! 1952 !-- For loglaw correction the roughness z0 is required. z0, however, 1953 !-- is part of the surfacetypes now, so call subroutine according 1954 !-- to the present surface tpye. 1955 !-- Default surface type 1956 IF ( surf_def_h(0)%start_index(j,i) <= & 1957 surf_def_h(0)%end_index(j,i) ) THEN 1958 start_index = surf_def_h(0)%start_index(j,i) 1959 end_index = surf_def_h(0)%end_index(j,i) 1960 DO m = start_index, end_index 1961 k = surf_def_h(0)%k(m) 1962 wall_index = k - 1 1963 kb = k - 1 1964 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1965 j, inc, wall_index, surf_def_h(0)%z0(m), & 1966 kb, direction, ncorr ) 1967 ENDDO 1968 ! 1969 !-- Natural surface type 1970 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 1971 surf_lsm_h%end_index(j,i) ) THEN 1972 start_index = surf_lsm_h%start_index(j,i) 1973 end_index = surf_lsm_h%end_index(j,i) 1974 DO m = start_index, end_index 1975 k = surf_lsm_h%k(m) 1976 wall_index = k - 1 1977 kb = k - 1 1978 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1979 j, inc, wall_index, surf_lsm_h%z0(m), & 1980 kb, direction, ncorr ) 1981 ENDDO 1982 ! 1983 !-- Urban surface type 1984 ELSEIF ( surf_usm_h%start_index(j,i) <= & 1985 surf_usm_h%end_index(j,i) ) THEN 1986 start_index = surf_usm_h%start_index(j,i) 1987 end_index = surf_usm_h%end_index(j,i) 1988 DO m = start_index, end_index 1989 k = surf_usm_h%k(m) 1990 wall_index = k - 1 1991 kb = k - 1 1992 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 1993 j, inc, wall_index, surf_usm_h%z0(m), & 1994 kb, direction, ncorr ) 1995 ENDDO 1996 ENDIF 1570 1997 logc_u_n(1,k,i) = lc 1571 1998 logc_ratio_u_n(1,0:ncorr-1,k,i) = lcr(0:ncorr-1) … … 1574 2001 !-- North boundary for v 1575 2002 j = nyn + 1 1576 kb = nzb_v_inner(j,i) 1577 k = kb + 1 1578 wall_index = kb 1579 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j, & 1580 inc, wall_index, z0(j,i), kb, direction, ncorr ) 2003 ! 2004 !-- For loglaw correction the roughness z0 is required. z0, however, 2005 !-- is part of the surfacetypes now, so call subroutine according 2006 !-- to the present surface tpye. 2007 !-- Default surface type 2008 IF ( surf_def_h(0)%start_index(j,i) <= & 2009 surf_def_h(0)%end_index(j,i) ) THEN 2010 start_index = surf_def_h(0)%start_index(j,i) 2011 end_index = surf_def_h(0)%end_index(j,i) 2012 DO m = start_index, end_index 2013 k = surf_def_h(0)%k(m) 2014 wall_index = k - 1 2015 kb = k - 1 2016 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 2017 j, inc, wall_index, surf_def_h(0)%z0(m), & 2018 kb, direction, ncorr ) 2019 ENDDO 2020 ! 2021 !-- Natural surface type 2022 ELSEIF ( surf_lsm_h%start_index(j,i) <= & 2023 surf_lsm_h%end_index(j,i) ) THEN 2024 start_index = surf_lsm_h%start_index(j,i) 2025 end_index = surf_lsm_h%end_index(j,i) 2026 DO m = start_index, end_index 2027 k = surf_lsm_h%k(m) 2028 wall_index = k - 1 2029 kb = k - 1 2030 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 2031 j, inc, wall_index, surf_lsm_h%z0(m), & 2032 kb, direction, ncorr ) 2033 ENDDO 2034 ! 2035 !-- Urban surface type 2036 ELSEIF ( surf_usm_h%start_index(j,i) <= & 2037 surf_usm_h%end_index(j,i) ) THEN 2038 start_index = surf_usm_h%start_index(j,i) 2039 end_index = surf_usm_h%end_index(j,i) 2040 DO m = start_index, end_index 2041 k = surf_usm_h%k(m) 2042 wall_index = k - 1 2043 kb = k - 1 2044 CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, & 2045 j, inc, wall_index, surf_usm_h%z0(m), & 2046 kb, direction, ncorr ) 2047 ENDDO 2048 ENDIF 1581 2049 logc_v_n(1,k,i) = lc 1582 2050 logc_ratio_v_n(1,0:ncorr-1,k,i) = lcr(0:ncorr-1) … … 1590 2058 !-- Then vertical walls and corners if necessary 1591 2059 IF ( topography /= 'flat' ) THEN 2060 ! 2061 !-- Workaround, set z0 at vertical surfaces simply to the given roughness 2062 !-- lenth, which is required to determine the logarithmic correction 2063 !-- factors at the child boundaries, which are at the ghost-points. 2064 !-- The surface data type for vertical surfaces, however, is not defined 2065 !-- at ghost-points, so that no z0 can be retrieved at this point. 2066 !-- Maybe, revise this later and define vertical surface datattype also 2067 !-- at ghost-points. 2068 z0_topo = roughness_length 1592 2069 1593 2070 kb = 0 ! kb is not used when direction > 1 1594 2071 ! 1595 2072 !-- Left boundary 2073 2074 ! 2075 !-- Are loglaw-correction parameters also calculated inside topo? 1596 2076 IF ( nest_bound_l ) THEN 1597 2077 … … 1599 2079 1600 2080 DO j = nys, nyn 2081 k_wall_u_ji = MAXLOC( & 2082 MERGE( 1, 0, & 2083 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j,0), 26 ) & 2084 ), DIM = 1 & 2085 ) - 1 2086 k_wall_u_ji_p = MAXLOC( & 2087 MERGE( 1, 0, & 2088 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j+1,0), 26 )& 2089 ), DIM = 1 & 2090 ) - 1 2091 k_wall_u_ji_m = MAXLOC( & 2092 MERGE( 1, 0, & 2093 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j-1,0), 26 )& 2094 ), DIM = 1 & 2095 ) - 1 2096 2097 k_wall_w_ji = MAXLOC( & 2098 MERGE( 1, 0, & 2099 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j,-1), 28 )& 2100 ), DIM = 1 & 2101 ) - 1 2102 k_wall_w_ji_p = MAXLOC( & 2103 MERGE( 1, 0, & 2104 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j+1,-1), 28 )& 2105 ), DIM = 1 & 2106 ) - 1 2107 k_wall_w_ji_m = MAXLOC( & 2108 MERGE( 1, 0, & 2109 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_l,j-1,-1), 28 )& 2110 ), DIM = 1 & 2111 ) - 1 2112 1601 2113 DO k = nzb, nzt_topo_nestbc_l 2114 2115 i = 0 1602 2116 ! 1603 2117 !-- Wall for u on the south side, but not on the north side 1604 i = 0 1605 IF ( ( nzb_u_outer(j,i) > nzb_u_outer(j+1,i) ) .AND. & 1606 ( nzb_u_outer(j,i) == nzb_u_outer(j-1,i) ) ) & 2118 IF ( ( k_wall_u_ji > k_wall_u_ji_p ) .AND. & 2119 ( k_wall_u_ji == k_wall_u_ji_m ) ) & 1607 2120 THEN 1608 2121 inc = 1 1609 2122 wall_index = j 1610 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1611 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2123 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2124 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1612 2125 ! 1613 2126 !-- The direction of the wall-normal index is stored as the … … 1620 2133 ! 1621 2134 !-- Wall for u on the north side, but not on the south side 1622 i = 0 1623 IF ( ( nzb_u_outer(j,i) > nzb_u_outer(j-1,i) ) .AND. & 1624 ( nzb_u_outer(j,i) == nzb_u_outer(j+1,i) ) ) THEN 2135 IF ( ( k_wall_u_ji > k_wall_u_ji_m ) .AND. & 2136 ( k_wall_u_ji == k_wall_u_ji_p ) ) THEN 1625 2137 inc = -1 1626 2138 wall_index = j + 1 1627 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1628 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2139 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2140 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1629 2141 ! 1630 2142 !-- The direction of the wall-normal index is stored as the … … 1635 2147 ENDIF 1636 2148 2149 i = -1 1637 2150 ! 1638 2151 !-- Wall for w on the south side, but not on the north side. 1639 i = -1 1640 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j+1,i) ) .AND. &1641 ( nzb_w_outer(j,i) == nzb_w_outer(j-1,i) ) ) THEN2152 2153 IF ( ( k_wall_w_ji > k_wall_w_ji_p ) .AND. & 2154 ( k_wall_w_ji == k_wall_w_ji_m ) ) THEN 1642 2155 inc = 1 1643 2156 wall_index = j 1644 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1645 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2157 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2158 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1646 2159 ! 1647 2160 !-- The direction of the wall-normal index is stored as the … … 1654 2167 ! 1655 2168 !-- Wall for w on the north side, but not on the south side. 1656 i = -1 1657 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j-1,i) ) .AND. & 1658 ( nzb_w_outer(j,i) == nzb_w_outer(j+1,i) ) ) THEN 2169 IF ( ( k_wall_w_ji > k_wall_w_ji_m ) .AND. & 2170 ( k_wall_w_ji == k_wall_w_ji_p ) ) THEN 1659 2171 inc = -1 1660 2172 wall_index = j+1 1661 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1662 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2173 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2174 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1663 2175 ! 1664 2176 !-- The direction of the wall-normal index is stored as the … … 1682 2194 1683 2195 DO j = nys, nyn 2196 2197 k_wall_u_ji = MAXLOC( & 2198 MERGE( 1, 0, & 2199 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j,i), 26 ) & 2200 ), DIM = 1 & 2201 ) - 1 2202 k_wall_u_ji_p = MAXLOC( & 2203 MERGE( 1, 0, & 2204 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j+1,i), 26 )& 2205 ), DIM = 1 & 2206 ) - 1 2207 k_wall_u_ji_m = MAXLOC( & 2208 MERGE( 1, 0, & 2209 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j-1,i), 26 )& 2210 ), DIM = 1 & 2211 ) - 1 2212 2213 k_wall_w_ji = MAXLOC( & 2214 MERGE( 1, 0, & 2215 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j,i), 28 ) & 2216 ), DIM = 1 & 2217 ) - 1 2218 k_wall_w_ji_p = MAXLOC( & 2219 MERGE( 1, 0, & 2220 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j+1,i), 28 )& 2221 ), DIM = 1 & 2222 ) - 1 2223 k_wall_w_ji_m = MAXLOC( & 2224 MERGE( 1, 0, & 2225 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_r,j-1,i), 28 )& 2226 ), DIM = 1 & 2227 ) - 1 1684 2228 DO k = nzb, nzt_topo_nestbc_r 1685 2229 ! 1686 2230 !-- Wall for u on the south side, but not on the north side 1687 IF ( ( nzb_u_outer(j,i) > nzb_u_outer(j+1,i) ) .AND.&1688 ( nzb_u_outer(j,i) == nzb_u_outer(j-1,i)) ) THEN2231 IF ( ( k_wall_u_ji > k_wall_u_ji_p ) .AND. & 2232 ( k_wall_u_ji == k_wall_u_ji_m ) ) THEN 1689 2233 inc = 1 1690 2234 wall_index = j 1691 2235 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 1692 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2236 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1693 2237 ! 1694 2238 !-- The direction of the wall-normal index is stored as the … … 1701 2245 ! 1702 2246 !-- Wall for u on the north side, but not on the south side 1703 IF ( ( nzb_u_outer(j,i) > nzb_u_outer(j-1,i) ) .AND.&1704 ( nzb_u_outer(j,i) == nzb_u_outer(j+1,i)) ) THEN2247 IF ( ( k_wall_u_ji > k_wall_u_ji_m ) .AND. & 2248 ( k_wall_u_ji == k_wall_u_ji_p ) ) THEN 1705 2249 inc = -1 1706 2250 wall_index = j+1 1707 2251 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 1708 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2252 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1709 2253 ! 1710 2254 !-- The direction of the wall-normal index is stored as the … … 1717 2261 ! 1718 2262 !-- Wall for w on the south side, but not on the north side 1719 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j+1,i) ) .AND.&1720 ( nzb_w_outer(j,i) == nzb_w_outer(j-1,i)) ) THEN2263 IF ( ( k_wall_w_ji > k_wall_w_ji_p ) .AND. & 2264 ( k_wall_w_ji == k_wall_w_ji_m ) ) THEN 1721 2265 inc = 1 1722 2266 wall_index = j 1723 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1724 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2267 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2268 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1725 2269 ! 1726 2270 !-- The direction of the wall-normal index is stored as the … … 1733 2277 ! 1734 2278 !-- Wall for w on the north side, but not on the south side 1735 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j-1,i) ) .AND.&1736 ( nzb_w_outer(j,i) == nzb_w_outer(j+1,i)) ) THEN2279 IF ( ( k_wall_w_ji > k_wall_w_ji_m ) .AND. & 2280 ( k_wall_w_ji == k_wall_w_ji_p ) ) THEN 1737 2281 inc = -1 1738 2282 wall_index = j+1 1739 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1740 k, j, inc, wall_index, z0 (j,i), kb, direction, ncorr )2283 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2284 k, j, inc, wall_index, z0_topo, kb, direction, ncorr ) 1741 2285 1742 2286 ! … … 1760 2304 1761 2305 DO i = nxl, nxr 2306 2307 k_wall_v_ji = MAXLOC( & 2308 MERGE( 1, 0, & 2309 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,0,i), 27 ) & 2310 ), DIM = 1 & 2311 ) - 1 2312 k_wall_v_ji_p = MAXLOC( & 2313 MERGE( 1, 0, & 2314 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,0,i+1), 27 )& 2315 ), DIM = 1 & 2316 ) - 1 2317 k_wall_v_ji_m = MAXLOC( & 2318 MERGE( 1, 0, & 2319 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,0,i-1), 27 )& 2320 ), DIM = 1 & 2321 ) - 1 2322 2323 k_wall_w_ji = MAXLOC( & 2324 MERGE( 1, 0, & 2325 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,-1,i), 28 )& 2326 ), DIM = 1 & 2327 ) - 1 2328 k_wall_w_ji_p = MAXLOC( & 2329 MERGE( 1, 0, & 2330 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,-1,i+1), 28 )& 2331 ), DIM = 1 & 2332 ) - 1 2333 k_wall_w_ji_m = MAXLOC( & 2334 MERGE( 1, 0, & 2335 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_s,-1,i-1), 28 )& 2336 ), DIM = 1 & 2337 ) - 1 1762 2338 DO k = nzb, nzt_topo_nestbc_s 1763 2339 ! 1764 2340 !-- Wall for v on the left side, but not on the right side 1765 2341 j = 0 1766 IF ( ( nzb_v_outer(j,i) > nzb_v_outer(j,i+1) ) .AND.&1767 ( nzb_v_outer(j,i) == nzb_v_outer(j,i-1)) ) THEN2342 IF ( ( k_wall_v_ji > k_wall_v_ji_p ) .AND. & 2343 ( k_wall_v_ji == k_wall_v_ji_m ) ) THEN 1768 2344 inc = 1 1769 2345 wall_index = i 1770 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1771 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2346 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2347 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1772 2348 ! 1773 2349 !-- The direction of the wall-normal index is stored as the … … 1781 2357 !-- Wall for v on the right side, but not on the left side 1782 2358 j = 0 1783 IF ( ( nzb_v_outer(j,i) > nzb_v_outer(j,i-1) ) .AND.&1784 ( nzb_v_outer(j,i) == nzb_v_outer(j,i+1)) ) THEN2359 IF ( ( k_wall_v_ji > k_wall_v_ji_m ) .AND. & 2360 ( k_wall_v_ji == k_wall_v_ji_p ) ) THEN 1785 2361 inc = -1 1786 2362 wall_index = i+1 1787 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1788 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2363 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2364 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1789 2365 ! 1790 2366 !-- The direction of the wall-normal index is stored as the … … 1798 2374 !-- Wall for w on the left side, but not on the right side 1799 2375 j = -1 1800 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j,i+1) ) .AND.&1801 ( nzb_w_outer(j,i) == nzb_w_outer(j,i-1)) ) THEN2376 IF ( ( k_wall_w_ji > k_wall_w_ji_p ) .AND. & 2377 ( k_wall_w_ji == k_wall_w_ji_m ) ) THEN 1802 2378 inc = 1 1803 2379 wall_index = i 1804 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1805 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2380 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2381 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1806 2382 ! 1807 2383 !-- The direction of the wall-normal index is stored as the … … 1815 2391 !-- Wall for w on the right side, but not on the left side 1816 2392 j = -1 1817 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j,i-1) ) .AND.&1818 ( nzb_w_outer(j,i) == nzb_w_outer(j,i+1)) ) THEN2393 IF ( ( k_wall_w_ji > k_wall_w_ji_m ) .AND. & 2394 ( k_wall_w_ji == k_wall_w_ji_p ) ) THEN 1819 2395 inc = -1 1820 2396 wall_index = i+1 1821 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1822 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2397 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2398 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1823 2399 ! 1824 2400 !-- The direction of the wall-normal index is stored as the … … 1842 2418 1843 2419 DO i = nxl, nxr 2420 k_wall_v_ji = MAXLOC( & 2421 MERGE( 1, 0, & 2422 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i), 27 ) & 2423 ), DIM = 1 & 2424 ) - 1 2425 2426 k_wall_v_ji_p = MAXLOC( & 2427 MERGE( 1, 0, & 2428 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i+1), 27 )& 2429 ), DIM = 1 & 2430 ) - 1 2431 k_wall_v_ji_m = MAXLOC( & 2432 MERGE( 1, 0, & 2433 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i-1), 27 )& 2434 ), DIM = 1 & 2435 ) - 1 2436 2437 k_wall_w_ji = MAXLOC( & 2438 MERGE( 1, 0, & 2439 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i), 28 ) & 2440 ), DIM = 1 & 2441 ) - 1 2442 k_wall_w_ji_p = MAXLOC( & 2443 MERGE( 1, 0, & 2444 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i+1), 28 )& 2445 ), DIM = 1 & 2446 ) - 1 2447 k_wall_w_ji_m = MAXLOC( & 2448 MERGE( 1, 0, & 2449 BTEST( wall_flags_0(nzb:nzt_topo_nestbc_n,j,i-1), 28 )& 2450 ), DIM = 1 & 2451 ) - 1 1844 2452 DO k = nzb, nzt_topo_nestbc_n 1845 2453 ! 1846 2454 !-- Wall for v on the left side, but not on the right side 1847 IF ( ( nzb_v_outer(j,i) > nzb_v_outer(j,i+1) ) .AND.&1848 ( nzb_v_outer(j,i) == nzb_v_outer(j,i-1)) ) THEN2455 IF ( ( k_wall_v_ji > k_wall_v_ji_p ) .AND. & 2456 ( k_wall_v_ji == k_wall_v_ji_m ) ) THEN 1849 2457 inc = 1 1850 2458 wall_index = i 1851 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1852 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2459 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2460 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1853 2461 ! 1854 2462 !-- The direction of the wall-normal index is stored as the … … 1861 2469 ! 1862 2470 !-- Wall for v on the right side, but not on the left side 1863 IF ( ( nzb_v_outer(j,i) > nzb_v_outer(j,i-1) ) .AND.&1864 ( nzb_v_outer(j,i) == nzb_v_outer(j,i+1)) ) THEN2471 IF ( ( k_wall_v_ji > k_wall_v_ji_m ) .AND. & 2472 ( k_wall_v_ji == k_wall_v_ji_p ) ) THEN 1865 2473 inc = -1 1866 2474 wall_index = i + 1 1867 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1868 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2475 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2476 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1869 2477 ! 1870 2478 !-- The direction of the wall-normal index is stored as the … … 1877 2485 ! 1878 2486 !-- Wall for w on the left side, but not on the right side 1879 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j,i+1) ) .AND.&1880 ( nzb_w_outer(j,i) == nzb_w_outer(j,i-1)) ) THEN2487 IF ( ( k_wall_v_ji > k_wall_v_ji_p ) .AND. & 2488 ( k_wall_v_ji == k_wall_v_ji_m ) ) THEN 1881 2489 inc = 1 1882 2490 wall_index = i 1883 CALL pmci_define_loglaw_correction_parameters( lc, lcr, 1884 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2491 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 2492 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1885 2493 ! 1886 2494 !-- The direction of the wall-normal index is stored as the … … 1893 2501 ! 1894 2502 !-- Wall for w on the right side, but not on the left side 1895 IF ( ( nzb_w_outer(j,i) > nzb_w_outer(j,i-1) ) .AND.&1896 ( nzb_w_outer(j,i) == nzb_w_outer(j,i+1)) ) THEN2503 IF ( ( k_wall_v_ji > k_wall_v_ji_m ) .AND. & 2504 ( k_wall_v_ji == k_wall_v_ji_p ) ) THEN 1897 2505 inc = -1 1898 2506 wall_index = i+1 1899 2507 CALL pmci_define_loglaw_correction_parameters( lc, lcr, & 1900 k, i, inc, wall_index, z0 (j,i), kb, direction, ncorr )2508 k, i, inc, wall_index, z0_topo, kb, direction, ncorr ) 1901 2509 ! 1902 2510 !-- The direction of the wall-normal index is stored as the … … 2416 3024 2417 3025 2418 3026 SUBROUTINE pmci_init_tkefactor 2419 3027 2420 3028 ! … … 2426 3034 2427 3035 IMPLICIT NONE 3036 3037 INTEGER(iwp) :: k !: index variable along z 3038 INTEGER(iwp) :: k_wall !: topography-top index along z 3039 INTEGER(iwp) :: kc !: 3040 2428 3041 REAL(wp), PARAMETER :: cfw = 0.2_wp !: 2429 3042 REAL(wp), PARAMETER :: c_tkef = 0.6_wp !: … … 2434 3047 REAL(wp) :: height !: 2435 3048 REAL(wp), PARAMETER :: p13 = 1.0_wp/3.0_wp !: 2436 REAL(wp), PARAMETER :: p23 = 2.0_wp/3.0_wp !: 2437 INTEGER(iwp) :: k !: 2438 INTEGER(iwp) :: kc !: 2439 3049 REAL(wp), PARAMETER :: p23 = 2.0_wp/3.0_wp !: 2440 3050 2441 3051 IF ( nest_bound_l ) THEN … … 2444 3054 i = nxl - 1 2445 3055 DO j = nysg, nyng 2446 DO k = nzb_s_inner(j,i) + 1, nzt 3056 k_wall = MAXLOC( & 3057 MERGE( 1, 0, & 3058 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 3059 ), DIM = 1 & 3060 ) - 1 3061 3062 DO k = k_wall + 1, nzt 3063 2447 3064 kc = kco(k+1) 2448 3065 glsf = ( dx * dy * dzu(k) )**p13 2449 3066 glsc = ( cg%dx * cg%dy *cg%dzu(kc) )**p13 2450 height = zu(k) - zu( nzb_s_inner(j,i))3067 height = zu(k) - zu(k_wall) 2451 3068 fw = EXP( -cfw * height / glsf ) 2452 3069 tkefactor_l(k,j) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * & 2453 3070 ( glsf / glsc )**p23 ) 2454 3071 ENDDO 2455 tkefactor_l( nzb_s_inner(j,i),j) = c_tkef * fw03072 tkefactor_l(k_wall,j) = c_tkef * fw0 2456 3073 ENDDO 2457 3074 ENDIF … … 2462 3079 i = nxr + 1 2463 3080 DO j = nysg, nyng 2464 DO k = nzb_s_inner(j,i) + 1, nzt 3081 k_wall = MAXLOC( & 3082 MERGE( 1, 0, & 3083 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 3084 ), DIM = 1 & 3085 ) - 1 3086 3087 DO k = k_wall + 1, nzt 3088 2465 3089 kc = kco(k+1) 2466 3090 glsf = ( dx * dy * dzu(k) )**p13 2467 3091 glsc = ( cg%dx * cg%dy * cg%dzu(kc) )**p13 2468 height = zu(k) - zu( nzb_s_inner(j,i))3092 height = zu(k) - zu(k_wall) 2469 3093 fw = EXP( -cfw * height / glsf ) 2470 3094 tkefactor_r(k,j) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * & 2471 3095 ( glsf / glsc )**p23 ) 2472 3096 ENDDO 2473 tkefactor_r( nzb_s_inner(j,i),j) = c_tkef * fw03097 tkefactor_r(k_wall,j) = c_tkef * fw0 2474 3098 ENDDO 2475 3099 ENDIF … … 2480 3104 j = nys - 1 2481 3105 DO i = nxlg, nxrg 2482 DO k = nzb_s_inner(j,i) + 1, nzt 3106 k_wall = MAXLOC( & 3107 MERGE( 1, 0, & 3108 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 3109 ), DIM = 1 & 3110 ) - 1 3111 3112 DO k = k_wall + 1, nzt 3113 2483 3114 kc = kco(k+1) 2484 3115 glsf = ( dx * dy * dzu(k) )**p13 2485 3116 glsc = ( cg%dx * cg%dy * cg%dzu(kc) ) ** p13 2486 height = zu(k) - zu( nzb_s_inner(j,i))3117 height = zu(k) - zu(k_wall) 2487 3118 fw = EXP( -cfw*height / glsf ) 2488 3119 tkefactor_s(k,i) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * & 2489 3120 ( glsf / glsc )**p23 ) 2490 3121 ENDDO 2491 tkefactor_s( nzb_s_inner(j,i),i) = c_tkef * fw03122 tkefactor_s(k_wall,i) = c_tkef * fw0 2492 3123 ENDDO 2493 3124 ENDIF … … 2498 3129 j = nyn + 1 2499 3130 DO i = nxlg, nxrg 2500 DO k = nzb_s_inner(j,i)+1, nzt 3131 k_wall = MAXLOC( & 3132 MERGE( 1, 0, & 3133 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 3134 ), DIM = 1 & 3135 ) - 1 3136 DO k = k_wall + 1, nzt 3137 2501 3138 kc = kco(k+1) 2502 3139 glsf = ( dx * dy * dzu(k) )**p13 2503 3140 glsc = ( cg%dx * cg%dy * cg%dzu(kc) )**p13 2504 height = zu(k) - zu( nzb_s_inner(j,i))3141 height = zu(k) - zu(k_wall) 2505 3142 fw = EXP( -cfw * height / glsf ) 2506 tkefactor_n(k,i) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * 3143 tkefactor_n(k,i) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * & 2507 3144 ( glsf / glsc )**p23 ) 2508 3145 ENDDO 2509 tkefactor_n( nzb_s_inner(j,i),i) = c_tkef * fw03146 tkefactor_n(k_wall,i) = c_tkef * fw0 2510 3147 ENDDO 2511 3148 ENDIF … … 2513 3150 ALLOCATE( tkefactor_t(nysg:nyng,nxlg:nxrg) ) 2514 3151 k = nzt 3152 2515 3153 DO i = nxlg, nxrg 2516 3154 DO j = nysg, nyng 3155 ! 3156 !-- Determine vertical index for local topography top 3157 k_wall = MAXLOC( & 3158 MERGE( 1, 0, & 3159 BTEST( wall_flags_0(nzb:nzb_max,j,i), 12 ) & 3160 ), DIM = 1 & 3161 ) - 1 3162 2517 3163 kc = kco(k+1) 2518 3164 glsf = ( dx * dy * dzu(k) )**p13 2519 3165 glsc = ( cg%dx * cg%dy * cg%dzu(kc) )**p13 2520 height = zu(k) - zu( nzb_s_inner(j,i))3166 height = zu(k) - zu(k_wall) 2521 3167 fw = EXP( -cfw * height / glsf ) 2522 tkefactor_t(j,i) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * 3168 tkefactor_t(j,i) = c_tkef * ( fw0 * fw + ( 1.0_wp - fw ) * & 2523 3169 ( glsf / glsc )**p23 ) 2524 3170 ENDDO … … 2783 3429 INTEGER(iwp) :: jcn !: 2784 3430 INTEGER(iwp) :: jcs !: 3431 INTEGER(iwp) :: k !: 2785 3432 2786 3433 REAL(wp) :: waittime !: … … 2804 3451 !-- The interpolation. 2805 3452 CALL pmci_interp_tril_all ( u, uc, icu, jco, kco, r1xu, r2xu, r1yo, & 2806 r2yo, r1zo, r2zo, nzb_u_inner,'u' )3453 r2yo, r1zo, r2zo, 'u' ) 2807 3454 CALL pmci_interp_tril_all ( v, vc, ico, jcv, kco, r1xo, r2xo, r1yv, & 2808 r2yv, r1zo, r2zo, nzb_v_inner,'v' )3455 r2yv, r1zo, r2zo, 'v' ) 2809 3456 CALL pmci_interp_tril_all ( w, wc, ico, jco, kcw, r1xo, r2xo, r1yo, & 2810 r2yo, r1zw, r2zw, nzb_w_inner,'w' )3457 r2yo, r1zw, r2zw, 'w' ) 2811 3458 CALL pmci_interp_tril_all ( e, ec, ico, jco, kco, r1xo, r2xo, r1yo, & 2812 r2yo, r1zo, r2zo, nzb_s_inner,'e' )3459 r2yo, r1zo, r2zo, 'e' ) 2813 3460 2814 3461 IF ( .NOT. neutral ) THEN 2815 3462 CALL pmci_interp_tril_all ( pt, ptc, ico, jco, kco, r1xo, r2xo, & 2816 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,'s' )3463 r1yo, r2yo, r1zo, r2zo, 's' ) 2817 3464 ENDIF 2818 3465 … … 2820 3467 2821 3468 CALL pmci_interp_tril_all ( q, q_c, ico, jco, kco, r1xo, r2xo, r1yo, & 2822 r2yo, r1zo, r2zo, nzb_s_inner,'s' )3469 r2yo, r1zo, r2zo, 's' ) 2823 3470 2824 3471 IF ( cloud_physics .AND. microphysics_seifert ) THEN 2825 3472 ! CALL pmci_interp_tril_all ( qc, qcc, ico, jco, kco, r1xo, r2xo, & 2826 ! r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 2827 ! 's' ) 3473 ! r1yo, r2yo, r1zo, r2zo, 's' ) 2828 3474 CALL pmci_interp_tril_all ( qr, qrc, ico, jco, kco, r1xo, r2xo, & 2829 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 2830 's' ) 3475 r1yo, r2yo, r1zo, r2zo, 's' ) 2831 3476 ! CALL pmci_interp_tril_all ( nc, ncc, ico, jco, kco, r1xo, r2xo, & 2832 ! r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 2833 ! 's' ) 3477 ! r1yo, r2yo, r1zo, r2zo, 's' ) 2834 3478 CALL pmci_interp_tril_all ( nr, nrc, ico, jco, kco, r1xo, r2xo, & 2835 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 2836 's' ) 3479 r1yo, r2yo, r1zo, r2zo, 's' ) 2837 3480 ENDIF 2838 3481 … … 2841 3484 IF ( passive_scalar ) THEN 2842 3485 CALL pmci_interp_tril_all ( s, sc, ico, jco, kco, r1xo, r2xo, r1yo, & 2843 r2yo, r1zo, r2zo, nzb_s_inner,'s' )3486 r2yo, r1zo, r2zo, 's' ) 2844 3487 ENDIF 2845 3488 … … 2851 3494 DO i = nxlg, nxrg 2852 3495 DO j = nysg, nyng 2853 u(nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 2854 v(nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 2855 w(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 2856 e(nzb:nzb_s_inner(j,i),j,i) = 0.0_wp 2857 u_p(nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 2858 v_p(nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 2859 w_p(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 2860 e_p(nzb:nzb_s_inner(j,i),j,i) = 0.0_wp 3496 DO k = nzb, nzt 3497 u(k,j,i) = MERGE( u(k,j,i), 0.0_wp, & 3498 BTEST( wall_flags_0(k,j,i), 1 ) ) 3499 v(k,j,i) = MERGE( v(k,j,i), 0.0_wp, & 3500 BTEST( wall_flags_0(k,j,i), 2 ) ) 3501 w(k,j,i) = MERGE( w(k,j,i), 0.0_wp, & 3502 BTEST( wall_flags_0(k,j,i), 3 ) ) 3503 e(k,j,i) = MERGE( e(k,j,i), 0.0_wp, & 3504 BTEST( wall_flags_0(k,j,i), 0 ) ) 3505 u_p(k,j,i) = MERGE( u_p(k,j,i), 0.0_wp, & 3506 BTEST( wall_flags_0(k,j,i), 1 ) ) 3507 v_p(k,j,i) = MERGE( v_p(k,j,i), 0.0_wp, & 3508 BTEST( wall_flags_0(k,j,i), 2 ) ) 3509 w_p(k,j,i) = MERGE( w_p(k,j,i), 0.0_wp, & 3510 BTEST( wall_flags_0(k,j,i), 3 ) ) 3511 e_p(k,j,i) = MERGE( e_p(k,j,i), 0.0_wp, & 3512 BTEST( wall_flags_0(k,j,i), 0 ) ) 3513 ENDDO 2861 3514 ENDDO 2862 3515 ENDDO … … 2869 3522 2870 3523 SUBROUTINE pmci_interp_tril_all( f, fc, ic, jc, kc, r1x, r2x, r1y, r2y, & 2871 r1z, r2z, kb,var )3524 r1z, r2z, var ) 2872 3525 ! 2873 3526 !-- Interpolation of the internal values for the child-domain initialization … … 2881 3534 INTEGER(iwp), DIMENSION(nysg:nyng), INTENT(IN) :: jc !: 2882 3535 INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(IN) :: kc !: 2883 INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) :: kb !: 2884 2885 INTEGER(iwp) :: i !: 2886 INTEGER(iwp) :: ib !: 2887 INTEGER(iwp) :: ie !: 2888 INTEGER(iwp) :: j !: 2889 INTEGER(iwp) :: jb !: 2890 INTEGER(iwp) :: je !: 2891 INTEGER(iwp) :: k !: 2892 INTEGER(iwp) :: k1 !: 2893 INTEGER(iwp) :: kbc !: 2894 INTEGER(iwp) :: l !: 2895 INTEGER(iwp) :: m !: 2896 INTEGER(iwp) :: n !: 3536 3537 INTEGER(iwp) :: flag_nr !: Number of flag array to mask topography on respective u/v/w or s grid 3538 INTEGER(iwp) :: flag_nr2 !: Number of flag array to indicate vertical index of topography top on respective u/v/w or s grid 3539 INTEGER(iwp) :: i !: 3540 INTEGER(iwp) :: ib !: 3541 INTEGER(iwp) :: ie !: 3542 INTEGER(iwp) :: j !: 3543 INTEGER(iwp) :: jb !: 3544 INTEGER(iwp) :: je !: 3545 INTEGER(iwp) :: k !: 3546 INTEGER(iwp) :: k_wall !: 3547 INTEGER(iwp) :: k1 !: 3548 INTEGER(iwp) :: kbc !: 3549 INTEGER(iwp) :: l !: 3550 INTEGER(iwp) :: m !: 3551 INTEGER(iwp) :: n !: 2897 3552 2898 3553 REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg), INTENT(INOUT) :: f !: … … 2914 3569 REAL(wp) :: logzuc1 !: 2915 3570 REAL(wp) :: zuc1 !: 3571 REAL(wp) :: z0_topo !: roughness at vertical walls 2916 3572 2917 3573 … … 2945 3601 ENDIF 2946 3602 ! 3603 !-- Determine number of flag array to be used to mask topography 3604 IF ( var == 'u' ) THEN 3605 flag_nr = 1 3606 flag_nr2 = 14 3607 ELSEIF ( var == 'v' ) THEN 3608 flag_nr = 2 3609 flag_nr2 = 16 3610 ELSEIF ( var == 'w' ) THEN 3611 flag_nr = 3 3612 flag_nr2 = 18 3613 ELSE 3614 flag_nr = 0 3615 flag_nr2 = 12 3616 ENDIF 3617 ! 2947 3618 !-- Trilinear interpolation. 2948 3619 DO i = ib, ie 2949 3620 DO j = jb, je 2950 DO k = kb(j,i), nzt + 13621 DO k = nzb, nzt + 1 2951 3622 l = ic(i) 2952 3623 m = jc(j) … … 2970 3641 !-- too. 2971 3642 IF ( var == 'u' .OR. var == 'v' ) THEN 3643 z0_topo = roughness_length 2972 3644 DO i = ib, nxr 2973 3645 DO j = jb, nyn 3646 ! 3647 !-- Determine vertical index of topography top at grid point (j,i) 3648 k_wall = MAXLOC( & 3649 MERGE( 1, 0, & 3650 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 3651 ), DIM = 1 & 3652 ) - 1 3653 ! 3654 !-- kbc is the first coarse-grid point above the surface 2974 3655 kbc = 1 2975 ! 2976 !-- kbc is the first coarse-grid point above the surface 2977 DO WHILE ( cg%zu(kbc) < zu(kb(j,i)) ) 3656 DO WHILE ( cg%zu(kbc) < zu(k_wall) ) 2978 3657 kbc = kbc + 1 2979 3658 ENDDO 2980 3659 zuc1 = cg%zu(kbc) 2981 k1 = k b(j,i)+ 13660 k1 = k_wall + 1 2982 3661 DO WHILE ( zu(k1) < zuc1 ) 2983 3662 k1 = k1 + 1 2984 3663 ENDDO 2985 logzuc1 = LOG( ( zu(k1) - zu(k b(j,i)) ) / z0(j,i))2986 2987 k = k b(j,i)+ 13664 logzuc1 = LOG( ( zu(k1) - zu(k_wall) ) / z0_topo ) 3665 3666 k = k_wall + 1 2988 3667 DO WHILE ( zu(k) < zuc1 ) 2989 logratio = ( LOG( ( zu(k) - zu(k b(j,i)) ) / z0(j,i)) ) / &3668 logratio = ( LOG( ( zu(k) - zu(k_wall) ) / z0_topo ) ) / & 2990 3669 logzuc1 2991 3670 f(k,j,i) = logratio * f(k1,j,i) 2992 3671 k = k + 1 2993 3672 ENDDO 2994 f(k b(j,i),j,i) = 0.0_wp3673 f(k_wall,j,i) = 0.0_wp 2995 3674 ENDDO 2996 3675 ENDDO … … 3000 3679 DO i = ib, nxr 3001 3680 DO j = jb, nyn 3002 f(kb(j,i),j,i) = 0.0_wp 3003 ENDDO 3004 ENDDO 3681 ! 3682 !-- Determine vertical index of topography top at grid point (j,i) 3683 k_wall = MAXLOC( & 3684 MERGE( 1, 0, & 3685 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 3686 ), DIM = 1 & 3687 ) - 1 3688 3689 f(k_wall,j,i) = 0.0_wp 3690 ENDDO 3691 ENDDO 3005 3692 3006 3693 ENDIF … … 3137 3824 innor = dy 3138 3825 DO j = nys, nyn 3139 DO k = nzb_u_inner(j,i)+1, nzt 3140 volume_flow_l(1) = volume_flow_l(1) + innor * u(k,j,i) * dzw(k) 3826 DO k = nzb+1, nzt 3827 volume_flow_l(1) = volume_flow_l(1) + innor * u(k,j,i) * dzw(k) & 3828 * MERGE( 1.0_wp, 0.0_wp, & 3829 BTEST( wall_flags_0(k,j,i), 1 ) ) 3141 3830 ENDDO 3142 3831 ENDDO … … 3147 3836 innor = -dy 3148 3837 DO j = nys, nyn 3149 DO k = nzb_u_inner(j,i)+1, nzt 3150 volume_flow_l(1) = volume_flow_l(1) + innor * u(k,j,i) * dzw(k) 3838 DO k = nzb+1, nzt 3839 volume_flow_l(1) = volume_flow_l(1) + innor * u(k,j,i) * dzw(k) & 3840 * MERGE( 1.0_wp, 0.0_wp, & 3841 BTEST( wall_flags_0(k,j,i), 1 ) ) 3151 3842 ENDDO 3152 3843 ENDDO … … 3170 3861 innor = dx 3171 3862 DO i = nxl, nxr 3172 DO k = nzb_v_inner(j,i)+1, nzt 3173 volume_flow_l(2) = volume_flow_l(2) + innor * v(k,j,i) * dzw(k) 3863 DO k = nzb+1, nzt 3864 volume_flow_l(2) = volume_flow_l(2) + innor * v(k,j,i) * dzw(k) & 3865 * MERGE( 1.0_wp, 0.0_wp, & 3866 BTEST( wall_flags_0(k,j,i), 2 ) ) 3174 3867 ENDDO 3175 3868 ENDDO … … 3180 3873 innor = -dx 3181 3874 DO i = nxl, nxr 3182 DO k = nzb_v_inner(j,i)+1, nzt 3183 volume_flow_l(2) = volume_flow_l(2) + innor * v(k,j,i) * dzw(k) 3875 DO k = nzb+1, nzt 3876 volume_flow_l(2) = volume_flow_l(2) + innor * v(k,j,i) * dzw(k) & 3877 * MERGE( 1.0_wp, 0.0_wp, & 3878 BTEST( wall_flags_0(k,j,i), 2 ) ) 3184 3879 ENDDO 3185 3880 ENDDO … … 3340 4035 INTEGER(iwp) :: child_id !: 3341 4036 INTEGER(iwp) :: i !: 4037 INTEGER(iwp) :: ierr !: 3342 4038 INTEGER(iwp) :: j !: 3343 INTEGER(iwp) :: ierr!:4039 INTEGER(iwp) :: k !: 3344 4040 INTEGER(iwp) :: m !: 3345 4041 … … 3374 4070 DO i = nxlg, nxrg 3375 4071 DO j = nysg, nyng 3376 u(nzb:nzb_u_inner(j,i),j,i) = 0.0_wp 3377 v(nzb:nzb_v_inner(j,i),j,i) = 0.0_wp 3378 w(nzb:nzb_w_inner(j,i),j,i) = 0.0_wp 3379 e(nzb:nzb_s_inner(j,i),j,i) = 0.0_wp 4072 DO k = nzb, nzt+1 4073 u(k,j,i) = MERGE( u(k,j,i), 0.0_wp, & 4074 BTEST( wall_flags_0(k,j,i), 1 ) ) 4075 v(k,j,i) = MERGE( v(k,j,i), 0.0_wp, & 4076 BTEST( wall_flags_0(k,j,i), 2 ) ) 4077 w(k,j,i) = MERGE( w(k,j,i), 0.0_wp, & 4078 BTEST( wall_flags_0(k,j,i), 3 ) ) 4079 e(k,j,i) = MERGE( e(k,j,i), 0.0_wp, & 4080 BTEST( wall_flags_0(k,j,i), 0 ) ) 3380 4081 ! 3381 4082 !-- TO_DO: zero setting of temperature within topography creates … … 3385 4086 ! q(nzb:nzb_s_inner(j,i),j,i) = 0.0_wp 3386 4087 ! ENDIF 4088 ENDDO 3387 4089 ENDDO 3388 4090 ENDDO … … 3463 4165 IF ( nest_bound_l ) THEN 3464 4166 CALL pmci_interp_tril_lr( u, uc, icu, jco, kco, r1xu, r2xu, & 3465 r1yo, r2yo, r1zo, r2zo, nzb_u_inner,&4167 r1yo, r2yo, r1zo, r2zo, & 3466 4168 logc_u_l, logc_ratio_u_l, & 3467 4169 nzt_topo_nestbc_l, 'l', 'u' ) 3468 4170 3469 4171 CALL pmci_interp_tril_lr( v, vc, ico, jcv, kco, r1xo, r2xo, & 3470 r1yv, r2yv, r1zo, r2zo, nzb_v_inner,&4172 r1yv, r2yv, r1zo, r2zo, & 3471 4173 logc_v_l, logc_ratio_v_l, & 3472 4174 nzt_topo_nestbc_l, 'l', 'v' ) 3473 4175 3474 4176 CALL pmci_interp_tril_lr( w, wc, ico, jco, kcw, r1xo, r2xo, & 3475 r1yo, r2yo, r1zw, r2zw, nzb_w_inner,&4177 r1yo, r2yo, r1zw, r2zw, & 3476 4178 logc_w_l, logc_ratio_w_l, & 3477 4179 nzt_topo_nestbc_l, 'l', 'w' ) 3478 4180 3479 4181 CALL pmci_interp_tril_lr( e, ec, ico, jco, kco, r1xo, r2xo, & 3480 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&4182 r1yo, r2yo, r1zo, r2zo, & 3481 4183 logc_u_l, logc_ratio_u_l, & 3482 4184 nzt_topo_nestbc_l, 'l', 'e' ) … … 3484 4186 IF ( .NOT. neutral ) THEN 3485 4187 CALL pmci_interp_tril_lr( pt, ptc, ico, jco, kco, r1xo, r2xo, & 3486 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&4188 r1yo, r2yo, r1zo, r2zo, & 3487 4189 logc_u_l, logc_ratio_u_l, & 3488 4190 nzt_topo_nestbc_l, 'l', 's' ) … … 3492 4194 3493 4195 CALL pmci_interp_tril_lr( q, q_c, ico, jco, kco, r1xo, r2xo, & 3494 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&4196 r1yo, r2yo, r1zo, r2zo, & 3495 4197 logc_u_l, logc_ratio_u_l, & 3496 4198 nzt_topo_nestbc_l, 'l', 's' ) … … 3500 4202 ! CALL pmci_interp_tril_lr( qc, qcc, ico, jco, kco, r1xo, r2xo,& 3501 4203 ! r1yo, r2yo, r1zo, r2zo, & 3502 ! nzb_s_inner, logc_u_l,&4204 ! logc_u_l, & 3503 4205 ! logc_ratio_u_l, nzt_topo_nestbc_l, & 3504 4206 ! 'l', 's' ) … … 3506 4208 CALL pmci_interp_tril_lr( qr, qrc, ico, jco, kco, r1xo, r2xo,& 3507 4209 r1yo, r2yo, r1zo, r2zo, & 3508 nzb_s_inner, logc_u_l,&4210 logc_u_l, & 3509 4211 logc_ratio_u_l, nzt_topo_nestbc_l, & 3510 4212 'l', 's' ) … … 3512 4214 ! CALL pmci_interp_tril_lr( nc, ncc, ico, jco, kco, r1xo, r2xo,& 3513 4215 ! r1yo, r2yo, r1zo, r2zo, & 3514 ! nzb_s_inner, logc_u_l,&4216 ! logc_u_l, & 3515 4217 ! logc_ratio_u_l, nzt_topo_nestbc_l, & 3516 4218 ! 'l', 's' ) … … 3518 4220 CALL pmci_interp_tril_lr( nr, nrc, ico, jco, kco, r1xo, r2xo,& 3519 4221 r1yo, r2yo, r1zo, r2zo, & 3520 nzb_s_inner, logc_u_l,&4222 logc_u_l, & 3521 4223 logc_ratio_u_l, nzt_topo_nestbc_l, & 3522 4224 'l', 's' ) … … 3527 4229 IF ( passive_scalar ) THEN 3528 4230 CALL pmci_interp_tril_lr( s, sc, ico, jco, kco, r1xo, r2xo, & 3529 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&4231 r1yo, r2yo, r1zo, r2zo, & 3530 4232 logc_u_l, logc_ratio_u_l, & 3531 4233 nzt_topo_nestbc_l, 'l', 's' ) … … 3533 4235 3534 4236 IF ( TRIM( nesting_mode ) == 'one-way' ) THEN 3535 3536 CALL pmci_extrap_ifoutflow_lr( u, nzb_u_inner, 'l', 'u' ) 3537 CALL pmci_extrap_ifoutflow_lr( v, nzb_v_inner, 'l', 'v' ) 3538 CALL pmci_extrap_ifoutflow_lr( w, nzb_w_inner, 'l', 'w' ) 3539 CALL pmci_extrap_ifoutflow_lr( e, nzb_s_inner, 'l', 'e' ) 4237 CALL pmci_extrap_ifoutflow_lr( u, 'l', 'u' ) 4238 CALL pmci_extrap_ifoutflow_lr( v, 'l', 'v' ) 4239 CALL pmci_extrap_ifoutflow_lr( w, 'l', 'w' ) 4240 CALL pmci_extrap_ifoutflow_lr( e, 'l', 'e' ) 3540 4241 3541 4242 IF ( .NOT. neutral ) THEN 3542 CALL pmci_extrap_ifoutflow_lr( pt, nzb_s_inner,'l', 's' )4243 CALL pmci_extrap_ifoutflow_lr( pt, 'l', 's' ) 3543 4244 ENDIF 3544 4245 3545 4246 IF ( humidity ) THEN 3546 3547 CALL pmci_extrap_ifoutflow_lr( q, nzb_s_inner, 'l', 's' ) 4247 CALL pmci_extrap_ifoutflow_lr( q, 'l', 's' ) 3548 4248 3549 4249 IF ( cloud_physics .AND. microphysics_seifert ) THEN 3550 4250 3551 ! CALL pmci_extrap_ifoutflow_lr( qc, nzb_s_inner,'l', 's' )3552 CALL pmci_extrap_ifoutflow_lr( qr, nzb_s_inner,'l', 's' )3553 ! CALL pmci_extrap_ifoutflow_lr( nc, nzb_s_inner,'l', 's' )3554 CALL pmci_extrap_ifoutflow_lr( nr, nzb_s_inner,'l', 's' )4251 ! CALL pmci_extrap_ifoutflow_lr( qc, 'l', 's' ) 4252 CALL pmci_extrap_ifoutflow_lr( qr, 'l', 's' ) 4253 ! CALL pmci_extrap_ifoutflow_lr( nc, 'l', 's' ) 4254 CALL pmci_extrap_ifoutflow_lr( nr, 'l', 's' ) 3555 4255 3556 4256 ENDIF … … 3559 4259 3560 4260 IF ( passive_scalar ) THEN 3561 CALL pmci_extrap_ifoutflow_lr( s, nzb_s_inner,'l', 's' )4261 CALL pmci_extrap_ifoutflow_lr( s, 'l', 's' ) 3562 4262 ENDIF 3563 4263 … … 3569 4269 !-- Right border pe 3570 4270 IF ( nest_bound_r ) THEN 3571 3572 CALL pmci_interp_tril_lr( u, uc, icu, jco, kco, r1xu, r2xu, & 3573 r1yo, r2yo, r1zo, r2zo, nzb_u_inner, & 3574 logc_u_r, logc_ratio_u_r, & 4271 CALL pmci_interp_tril_lr( u, uc, icu, jco, kco, r1xu, r2xu, & 4272 r1yo, r2yo, r1zo, r2zo, & 4273 logc_u_r, logc_ratio_u_r, & 3575 4274 nzt_topo_nestbc_r, 'r', 'u' ) 3576 4275 3577 CALL pmci_interp_tril_lr( v, vc, ico, jcv, kco, r1xo, r2xo, &3578 r1yv, r2yv, r1zo, r2zo, nzb_v_inner,&3579 logc_v_r, logc_ratio_v_r, &4276 CALL pmci_interp_tril_lr( v, vc, ico, jcv, kco, r1xo, r2xo, & 4277 r1yv, r2yv, r1zo, r2zo, & 4278 logc_v_r, logc_ratio_v_r, & 3580 4279 nzt_topo_nestbc_r, 'r', 'v' ) 3581 4280 3582 CALL pmci_interp_tril_lr( w, wc, ico, jco, kcw, r1xo, r2xo, &3583 r1yo, r2yo, r1zw, r2zw, nzb_w_inner,&3584 logc_w_r, logc_ratio_w_r, &4281 CALL pmci_interp_tril_lr( w, wc, ico, jco, kcw, r1xo, r2xo, & 4282 r1yo, r2yo, r1zw, r2zw, & 4283 logc_w_r, logc_ratio_w_r, & 3585 4284 nzt_topo_nestbc_r, 'r', 'w' ) 3586 4285 3587 CALL pmci_interp_tril_lr( e, ec, ico, jco, kco, r1xo, r2xo, &3588 r1yo,r2yo, r1zo, r2zo, nzb_s_inner,&3589 logc_u_r, logc_ratio_u_r, &4286 CALL pmci_interp_tril_lr( e, ec, ico, jco, kco, r1xo, r2xo, & 4287 r1yo,r2yo, r1zo, r2zo, & 4288 logc_u_r, logc_ratio_u_r, & 3590 4289 nzt_topo_nestbc_r, 'r', 'e' ) 3591 4290 4291 3592 4292 IF ( .NOT. neutral ) THEN 3593 CALL pmci_interp_tril_lr( pt, ptc, ico, jco, kco, r1xo, r2xo, &3594 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&3595 logc_u_r, logc_ratio_u_r, &4293 CALL pmci_interp_tril_lr( pt, ptc, ico, jco, kco, r1xo, r2xo, & 4294 r1yo, r2yo, r1zo, r2zo, & 4295 logc_u_r, logc_ratio_u_r, & 3596 4296 nzt_topo_nestbc_r, 'r', 's' ) 4297 3597 4298 ENDIF 3598 4299 3599 4300 IF ( humidity ) THEN 3600 3601 CALL pmci_interp_tril_lr( q, q_c, ico, jco, kco, r1xo, r2xo, & 3602 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 3603 logc_u_r, logc_ratio_u_r, & 4301 CALL pmci_interp_tril_lr( q, q_c, ico, jco, kco, r1xo, r2xo, & 4302 r1yo, r2yo, r1zo, r2zo, & 4303 logc_u_r, logc_ratio_u_r, & 3604 4304 nzt_topo_nestbc_r, 'r', 's' ) 4305 3605 4306 3606 4307 IF ( cloud_physics .AND. microphysics_seifert ) THEN … … 3608 4309 ! CALL pmci_interp_tril_lr( qc, qcc, ico, jco, kco, r1xo, & 3609 4310 ! r2xo, r1yo, r2yo, r1zo, r2zo, & 3610 ! nzb_s_inner, logc_u_r,&4311 ! logc_u_r, & 3611 4312 ! logc_ratio_u_r, nzt_topo_nestbc_r,& 3612 4313 ! 'r', 's' ) … … 3614 4315 CALL pmci_interp_tril_lr( qr, qrc, ico, jco, kco, r1xo, & 3615 4316 r2xo, r1yo, r2yo, r1zo, r2zo, & 3616 nzb_s_inner, logc_u_r,&4317 logc_u_r, & 3617 4318 logc_ratio_u_r, nzt_topo_nestbc_r,& 3618 4319 'r', 's' ) … … 3620 4321 ! CALL pmci_interp_tril_lr( nc, ncc, ico, jco, kco, r1xo, & 3621 4322 ! r2xo, r1yo, r2yo, r1zo, r2zo, & 3622 ! nzb_s_inner, logc_u_r,&4323 ! logc_u_r, & 3623 4324 ! logc_ratio_u_r, nzt_topo_nestbc_r,& 3624 4325 ! 'r', 's' ) … … 3626 4327 CALL pmci_interp_tril_lr( nr, nrc, ico, jco, kco, r1xo, & 3627 4328 r2xo, r1yo, r2yo, r1zo, r2zo, & 3628 nzb_s_inner, logc_u_r,&4329 logc_u_r, & 3629 4330 logc_ratio_u_r, nzt_topo_nestbc_r,& 3630 4331 'r', 's' ) … … 3636 4337 IF ( passive_scalar ) THEN 3637 4338 CALL pmci_interp_tril_lr( s, sc, ico, jco, kco, r1xo, r2xo, & 3638 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&4339 r1yo, r2yo, r1zo, r2zo, & 3639 4340 logc_u_r, logc_ratio_u_r, & 3640 4341 nzt_topo_nestbc_r, 'r', 's' ) 4342 3641 4343 ENDIF 3642 4344 3643 4345 IF ( TRIM( nesting_mode ) == 'one-way' ) THEN 3644 3645 CALL pmci_extrap_ifoutflow_lr( u, nzb_u_inner, 'r', 'u' ) 3646 CALL pmci_extrap_ifoutflow_lr( v, nzb_v_inner, 'r', 'v' ) 3647 CALL pmci_extrap_ifoutflow_lr( w, nzb_w_inner, 'r', 'w' ) 3648 CALL pmci_extrap_ifoutflow_lr( e, nzb_s_inner, 'r', 'e' ) 4346 CALL pmci_extrap_ifoutflow_lr( u, 'r', 'u' ) 4347 CALL pmci_extrap_ifoutflow_lr( v, 'r', 'v' ) 4348 CALL pmci_extrap_ifoutflow_lr( w, 'r', 'w' ) 4349 CALL pmci_extrap_ifoutflow_lr( e, 'r', 'e' ) 3649 4350 3650 4351 IF ( .NOT. neutral ) THEN 3651 CALL pmci_extrap_ifoutflow_lr( pt, nzb_s_inner,'r', 's' )4352 CALL pmci_extrap_ifoutflow_lr( pt, 'r', 's' ) 3652 4353 ENDIF 3653 4354 3654 4355 IF ( humidity ) THEN 3655 3656 CALL pmci_extrap_ifoutflow_lr( q, nzb_s_inner, 'r', 's' ) 4356 CALL pmci_extrap_ifoutflow_lr( q, 'r', 's' ) 3657 4357 3658 4358 IF ( cloud_physics .AND. microphysics_seifert ) THEN 3659 ! CALL pmci_extrap_ifoutflow_lr( qc, nzb_s_inner,'r', 's' )3660 CALL pmci_extrap_ifoutflow_lr( qr, nzb_s_inner,'r', 's' )3661 ! CALL pmci_extrap_ifoutflow_lr( nc, nzb_s_inner,'r', 's' )3662 CALL pmci_extrap_ifoutflow_lr( nr, nzb_s_inner,'r', 's' )4359 ! CALL pmci_extrap_ifoutflow_lr( qc, 'r', 's' ) 4360 CALL pmci_extrap_ifoutflow_lr( qr, 'r', 's' ) 4361 ! CALL pmci_extrap_ifoutflow_lr( nc, 'r', 's' ) 4362 CALL pmci_extrap_ifoutflow_lr( nr, 'r', 's' ) 3663 4363 ENDIF 3664 4364 … … 3666 4366 3667 4367 IF ( passive_scalar ) THEN 3668 CALL pmci_extrap_ifoutflow_lr( s, nzb_s_inner,'r', 's' )4368 CALL pmci_extrap_ifoutflow_lr( s, 'r', 's' ) 3669 4369 ENDIF 3670 4370 ENDIF … … 3675 4375 !-- South border pe 3676 4376 IF ( nest_bound_s ) THEN 3677 CALL pmci_interp_tril_sn( u, uc, icu, jco, kco, r1xu, r2xu, &3678 r1yo, r2yo, r1zo, r2zo, nzb_u_inner,&3679 logc_u_s, logc_ratio_u_s, &4377 CALL pmci_interp_tril_sn( u, uc, icu, jco, kco, r1xu, r2xu, & 4378 r1yo, r2yo, r1zo, r2zo, & 4379 logc_u_s, logc_ratio_u_s, & 3680 4380 nzt_topo_nestbc_s, 's', 'u' ) 3681 3682 CALL pmci_interp_tril_sn( v, vc, ico, jcv, kco, r1xo, r2xo, & 3683 r1yv, r2yv, r1zo, r2zo, nzb_v_inner, & 3684 logc_v_s, logc_ratio_v_s, & 4381 CALL pmci_interp_tril_sn( v, vc, ico, jcv, kco, r1xo, r2xo, & 4382 r1yv, r2yv, r1zo, r2zo, & 4383 logc_v_s, logc_ratio_v_s, & 3685 4384 nzt_topo_nestbc_s, 's', 'v' ) 3686 3687 CALL pmci_interp_tril_sn( w, wc, ico, jco, kcw, r1xo, r2xo, & 3688 r1yo, r2yo, r1zw, r2zw, nzb_w_inner, & 3689 logc_w_s, logc_ratio_w_s, & 4385 CALL pmci_interp_tril_sn( w, wc, ico, jco, kcw, r1xo, r2xo, & 4386 r1yo, r2yo, r1zw, r2zw, & 4387 logc_w_s, logc_ratio_w_s, & 3690 4388 nzt_topo_nestbc_s, 's','w' ) 3691 3692 CALL pmci_interp_tril_sn( e, ec, ico, jco, kco, r1xo, r2xo, & 3693 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 3694 logc_u_s, logc_ratio_u_s, & 4389 CALL pmci_interp_tril_sn( e, ec, ico, jco, kco, r1xo, r2xo, & 4390 r1yo, r2yo, r1zo, r2zo, & 4391 logc_u_s, logc_ratio_u_s, & 3695 4392 nzt_topo_nestbc_s, 's', 'e' ) 3696 4393 3697 4394 IF ( .NOT. neutral ) THEN 3698 CALL pmci_interp_tril_sn( pt, ptc, ico, jco, kco, r1xo, r2xo, &3699 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&3700 logc_u_s, logc_ratio_u_s, &4395 CALL pmci_interp_tril_sn( pt, ptc, ico, jco, kco, r1xo, r2xo, & 4396 r1yo, r2yo, r1zo, r2zo, & 4397 logc_u_s, logc_ratio_u_s, & 3701 4398 nzt_topo_nestbc_s, 's', 's' ) 3702 4399 ENDIF 3703 4400 3704 4401 IF ( humidity ) THEN 3705 3706 CALL pmci_interp_tril_sn( q, q_c, ico, jco, kco, r1xo, r2xo, & 3707 r1yo,r2yo, r1zo, r2zo, nzb_s_inner, & 3708 logc_u_s, logc_ratio_u_s, & 4402 CALL pmci_interp_tril_sn( q, q_c, ico, jco, kco, r1xo, r2xo, & 4403 r1yo,r2yo, r1zo, r2zo, & 4404 logc_u_s, logc_ratio_u_s, & 3709 4405 nzt_topo_nestbc_s, 's', 's' ) 3710 4406 … … 3713 4409 ! CALL pmci_interp_tril_sn( qc, qcc, ico, jco, kco, r1xo, & 3714 4410 ! r2xo, r1yo,r2yo, r1zo, r2zo, & 3715 ! nzb_s_inner, logc_u_s,&4411 ! logc_u_s, & 3716 4412 ! logc_ratio_u_s, nzt_topo_nestbc_s,& 3717 4413 ! 's', 's' ) … … 3719 4415 CALL pmci_interp_tril_sn( qr, qrc, ico, jco, kco, r1xo, & 3720 4416 r2xo, r1yo,r2yo, r1zo, r2zo, & 3721 nzb_s_inner, logc_u_s,&4417 logc_u_s, & 3722 4418 logc_ratio_u_s, nzt_topo_nestbc_s,& 3723 4419 's', 's' ) … … 3725 4421 ! CALL pmci_interp_tril_sn( nc, ncc, ico, jco, kco, r1xo, & 3726 4422 ! r2xo, r1yo,r2yo, r1zo, r2zo, & 3727 ! nzb_s_inner, logc_u_s,&4423 ! logc_u_s, & 3728 4424 ! logc_ratio_u_s, nzt_topo_nestbc_s,& 3729 4425 ! 's', 's' ) … … 3731 4427 CALL pmci_interp_tril_sn( nr, nrc, ico, jco, kco, r1xo, & 3732 4428 r2xo, r1yo,r2yo, r1zo, r2zo, & 3733 nzb_s_inner, logc_u_s,&4429 logc_u_s, & 3734 4430 logc_ratio_u_s, nzt_topo_nestbc_s,& 3735 4431 's', 's' ) … … 3740 4436 3741 4437 IF ( passive_scalar ) THEN 3742 CALL pmci_interp_tril_sn( s, sc, ico, jco, kco, r1xo, r2xo, &3743 r1yo,r2yo, r1zo, r2zo, nzb_s_inner,&3744 logc_u_s, logc_ratio_u_s, &4438 CALL pmci_interp_tril_sn( s, sc, ico, jco, kco, r1xo, r2xo, & 4439 r1yo,r2yo, r1zo, r2zo, & 4440 logc_u_s, logc_ratio_u_s, & 3745 4441 nzt_topo_nestbc_s, 's', 's' ) 3746 4442 ENDIF 3747 4443 3748 4444 IF ( TRIM( nesting_mode ) == 'one-way' ) THEN 3749 3750 CALL pmci_extrap_ifoutflow_sn( u, nzb_u_inner, 's', 'u' ) 3751 CALL pmci_extrap_ifoutflow_sn( v, nzb_v_inner, 's', 'v' ) 3752 CALL pmci_extrap_ifoutflow_sn( w, nzb_w_inner, 's', 'w' ) 3753 CALL pmci_extrap_ifoutflow_sn( e, nzb_s_inner, 's', 'e' ) 4445 CALL pmci_extrap_ifoutflow_sn( u, 's', 'u' ) 4446 CALL pmci_extrap_ifoutflow_sn( v, 's', 'v' ) 4447 CALL pmci_extrap_ifoutflow_sn( w, 's', 'w' ) 4448 CALL pmci_extrap_ifoutflow_sn( e, 's', 'e' ) 3754 4449 3755 4450 IF ( .NOT. neutral ) THEN 3756 CALL pmci_extrap_ifoutflow_sn( pt, nzb_s_inner,'s', 's' )4451 CALL pmci_extrap_ifoutflow_sn( pt, 's', 's' ) 3757 4452 ENDIF 3758 4453 3759 4454 IF ( humidity ) THEN 3760 3761 CALL pmci_extrap_ifoutflow_sn( q, nzb_s_inner, 's', 's' ) 4455 CALL pmci_extrap_ifoutflow_sn( q, 's', 's' ) 3762 4456 3763 4457 IF ( cloud_physics .AND. microphysics_seifert ) THEN 3764 ! CALL pmci_extrap_ifoutflow_sn( qc, nzb_s_inner,'s', 's' )3765 CALL pmci_extrap_ifoutflow_sn( qr, nzb_s_inner,'s', 's' )3766 ! CALL pmci_extrap_ifoutflow_sn( nc, nzb_s_inner,'s', 's' )3767 CALL pmci_extrap_ifoutflow_sn( nr, nzb_s_inner,'s', 's' )4458 ! CALL pmci_extrap_ifoutflow_sn( qc, 's', 's' ) 4459 CALL pmci_extrap_ifoutflow_sn( qr, 's', 's' ) 4460 ! CALL pmci_extrap_ifoutflow_sn( nc, 's', 's' ) 4461 CALL pmci_extrap_ifoutflow_sn( nr, 's', 's' ) 3768 4462 3769 4463 ENDIF … … 3772 4466 3773 4467 IF ( passive_scalar ) THEN 3774 CALL pmci_extrap_ifoutflow_sn( s, nzb_s_inner,'s', 's' )4468 CALL pmci_extrap_ifoutflow_sn( s, 's', 's' ) 3775 4469 ENDIF 3776 4470 … … 3782 4476 !-- North border pe 3783 4477 IF ( nest_bound_n ) THEN 3784 3785 CALL pmci_interp_tril_sn( u, uc, icu, jco, kco, r1xu, r2xu, & 3786 r1yo, r2yo, r1zo, r2zo, nzb_u_inner, & 3787 logc_u_n, logc_ratio_u_n, & 4478 CALL pmci_interp_tril_sn( u, uc, icu, jco, kco, r1xu, r2xu, & 4479 r1yo, r2yo, r1zo, r2zo, & 4480 logc_u_n, logc_ratio_u_n, & 3788 4481 nzt_topo_nestbc_n, 'n', 'u' ) 3789 CALL pmci_interp_tril_sn( v, vc, ico, jcv, kco, r1xo, r2xo, & 3790 r1yv, r2yv, r1zo, r2zo, nzb_v_inner, & 3791 logc_v_n, logc_ratio_v_n, & 4482 4483 CALL pmci_interp_tril_sn( v, vc, ico, jcv, kco, r1xo, r2xo, & 4484 r1yv, r2yv, r1zo, r2zo, & 4485 logc_v_n, logc_ratio_v_n, & 3792 4486 nzt_topo_nestbc_n, 'n', 'v' ) 3793 CALL pmci_interp_tril_sn( w, wc, ico, jco, kcw, r1xo, r2xo, & 3794 r1yo, r2yo, r1zw, r2zw, nzb_w_inner, & 3795 logc_w_n, logc_ratio_w_n, & 4487 4488 CALL pmci_interp_tril_sn( w, wc, ico, jco, kcw, r1xo, r2xo, & 4489 r1yo, r2yo, r1zw, r2zw, & 4490 logc_w_n, logc_ratio_w_n, & 3796 4491 nzt_topo_nestbc_n, 'n', 'w' ) 3797 CALL pmci_interp_tril_sn( e, ec, ico, jco, kco, r1xo, r2xo, & 3798 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 3799 logc_u_n, logc_ratio_u_n, & 4492 4493 CALL pmci_interp_tril_sn( e, ec, ico, jco, kco, r1xo, r2xo, & 4494 r1yo, r2yo, r1zo, r2zo, & 4495 logc_u_n, logc_ratio_u_n, & 3800 4496 nzt_topo_nestbc_n, 'n', 'e' ) 3801 4497 3802 4498 IF ( .NOT. neutral ) THEN 3803 CALL pmci_interp_tril_sn( pt, ptc, ico, jco, kco, r1xo, r2xo, &3804 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&3805 logc_u_n, logc_ratio_u_n, &4499 CALL pmci_interp_tril_sn( pt, ptc, ico, jco, kco, r1xo, r2xo, & 4500 r1yo, r2yo, r1zo, r2zo, & 4501 logc_u_n, logc_ratio_u_n, & 3806 4502 nzt_topo_nestbc_n, 'n', 's' ) 3807 4503 ENDIF 3808 4504 3809 4505 IF ( humidity ) THEN 3810 3811 CALL pmci_interp_tril_sn( q, q_c, ico, jco, kco, r1xo, r2xo, & 3812 r1yo, r2yo, r1zo, r2zo, nzb_s_inner, & 3813 logc_u_n, logc_ratio_u_n, & 4506 CALL pmci_interp_tril_sn( q, q_c, ico, jco, kco, r1xo, r2xo, & 4507 r1yo, r2yo, r1zo, r2zo, & 4508 logc_u_n, logc_ratio_u_n, & 3814 4509 nzt_topo_nestbc_n, 'n', 's' ) 3815 4510 … … 3818 4513 ! CALL pmci_interp_tril_sn( qc, qcc, ico, jco, kco, r1xo, & 3819 4514 ! r2xo, r1yo, r2yo, r1zo, r2zo, & 3820 ! nzb_s_inner, logc_u_n,&4515 ! logc_u_n, & 3821 4516 ! logc_ratio_u_n, nzt_topo_nestbc_n,& 3822 4517 ! 'n', 's' ) … … 3824 4519 CALL pmci_interp_tril_sn( qr, qrc, ico, jco, kco, r1xo, & 3825 4520 r2xo, r1yo, r2yo, r1zo, r2zo, & 3826 nzb_s_inner, logc_u_n,&4521 logc_u_n, & 3827 4522 logc_ratio_u_n, nzt_topo_nestbc_n,& 3828 4523 'n', 's' ) … … 3830 4525 ! CALL pmci_interp_tril_sn( nc, ncc, ico, jco, kco, r1xo, & 3831 4526 ! r2xo, r1yo, r2yo, r1zo, r2zo, & 3832 ! nzb_s_inner, logc_u_n,&4527 ! logc_u_n, & 3833 4528 ! logc_ratio_u_n, nzt_topo_nestbc_n,& 3834 4529 ! 'n', 's' ) … … 3836 4531 CALL pmci_interp_tril_sn( nr, nrc, ico, jco, kco, r1xo, & 3837 4532 r2xo, r1yo, r2yo, r1zo, r2zo, & 3838 nzb_s_inner, logc_u_n,&4533 logc_u_n, & 3839 4534 logc_ratio_u_n, nzt_topo_nestbc_n,& 3840 4535 'n', 's' ) … … 3845 4540 3846 4541 IF ( passive_scalar ) THEN 3847 CALL pmci_interp_tril_sn( s, sc, ico, jco, kco, r1xo, r2xo, &3848 r1yo, r2yo, r1zo, r2zo, nzb_s_inner,&3849 logc_u_n, logc_ratio_u_n, &4542 CALL pmci_interp_tril_sn( s, sc, ico, jco, kco, r1xo, r2xo, & 4543 r1yo, r2yo, r1zo, r2zo, & 4544 logc_u_n, logc_ratio_u_n, & 3850 4545 nzt_topo_nestbc_n, 'n', 's' ) 3851 4546 ENDIF 3852 4547 3853 4548 IF ( TRIM( nesting_mode ) == 'one-way' ) THEN 3854 3855 CALL pmci_extrap_ifoutflow_sn( u, nzb_u_inner, 'n', 'u' ) 3856 CALL pmci_extrap_ifoutflow_sn( v, nzb_v_inner, 'n', 'v' ) 3857 CALL pmci_extrap_ifoutflow_sn( w, nzb_w_inner, 'n', 'w' ) 3858 CALL pmci_extrap_ifoutflow_sn( e, nzb_s_inner, 'n', 'e' ) 4549 CALL pmci_extrap_ifoutflow_sn( u, 'n', 'u' ) 4550 CALL pmci_extrap_ifoutflow_sn( v, 'n', 'v' ) 4551 CALL pmci_extrap_ifoutflow_sn( w, 'n', 'w' ) 4552 CALL pmci_extrap_ifoutflow_sn( e, 'n', 'e' ) 3859 4553 3860 4554 IF ( .NOT. neutral ) THEN 3861 CALL pmci_extrap_ifoutflow_sn( pt, nzb_s_inner,'n', 's' )4555 CALL pmci_extrap_ifoutflow_sn( pt, 'n', 's' ) 3862 4556 ENDIF 3863 4557 3864 4558 IF ( humidity ) THEN 3865 3866 CALL pmci_extrap_ifoutflow_sn( q, nzb_s_inner, 'n', 's' ) 4559 CALL pmci_extrap_ifoutflow_sn( q, 'n', 's' ) 3867 4560 3868 4561 IF ( cloud_physics .AND. microphysics_seifert ) THEN 3869 ! CALL pmci_extrap_ifoutflow_sn( qc, nzb_s_inner,'n', 's' )3870 CALL pmci_extrap_ifoutflow_sn( qr, nzb_s_inner,'n', 's' )3871 ! CALL pmci_extrap_ifoutflow_sn( nc, nzb_s_inner,'n', 's' )3872 CALL pmci_extrap_ifoutflow_sn( nr, nzb_s_inner,'n', 's' )4562 ! CALL pmci_extrap_ifoutflow_sn( qc, 'n', 's' ) 4563 CALL pmci_extrap_ifoutflow_sn( qr, 'n', 's' ) 4564 ! CALL pmci_extrap_ifoutflow_sn( nc, 'n', 's' ) 4565 CALL pmci_extrap_ifoutflow_sn( nr, 'n', 's' ) 3873 4566 ENDIF 3874 4567 … … 3876 4569 3877 4570 IF ( passive_scalar ) THEN 3878 CALL pmci_extrap_ifoutflow_sn( s, nzb_s_inner,'n', 's' )4571 CALL pmci_extrap_ifoutflow_sn( s, 'n', 's' ) 3879 4572 ENDIF 3880 4573 … … 3883 4576 ENDIF 3884 4577 3885 ENDIF ! :IF ( nesting_mode /= 'vertical' )4578 ENDIF ! IF ( nesting_mode /= 'vertical' ) 3886 4579 3887 4580 ! … … 4016 4709 4017 4710 SUBROUTINE pmci_interp_tril_lr( f, fc, ic, jc, kc, r1x, r2x, r1y, r2y, r1z, & 4018 r2z, kb, logc, logc_ratio, nzt_topo_nestbc,&4711 r2z, logc, logc_ratio, nzt_topo_nestbc, & 4019 4712 edge, var ) 4020 4713 ! … … 4040 4733 INTEGER(iwp), DIMENSION(nxlg:nxrg), INTENT(IN) :: ic !: 4041 4734 INTEGER(iwp), DIMENSION(nysg:nyng), INTENT(IN) :: jc !: 4042 INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) :: kb !:4043 4735 INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(IN) :: kc !: 4044 4736 INTEGER(iwp), DIMENSION(1:2,nzb:nzt_topo_nestbc,nys:nyn), & … … 4049 4741 CHARACTER(LEN=1), INTENT(IN) :: var !: 4050 4742 4051 INTEGER(iwp) :: i !: 4052 INTEGER(iwp) :: ib !: 4053 INTEGER(iwp) :: ibgp !: 4054 INTEGER(iwp) :: iw !: 4055 INTEGER(iwp) :: j !: 4056 INTEGER(iwp) :: jco !: 4057 INTEGER(iwp) :: jcorr !: 4058 INTEGER(iwp) :: jinc !: 4059 INTEGER(iwp) :: jw !: 4060 INTEGER(iwp) :: j1 !: 4061 INTEGER(iwp) :: k !: 4062 INTEGER(iwp) :: kco !: 4063 INTEGER(iwp) :: kcorr !: 4064 INTEGER(iwp) :: k1 !: 4065 INTEGER(iwp) :: l !: 4066 INTEGER(iwp) :: m !: 4067 INTEGER(iwp) :: n !: 4068 INTEGER(iwp) :: kbc !: 4743 INTEGER(iwp) :: flag_nr !: Number of flag array to mask topography on respective u/v/w or s grid 4744 INTEGER(iwp) :: flag_nr2 !: Number of flag array to indicate vertical index of topography top on respective u/v/w or s grid 4745 INTEGER(iwp) :: i !: 4746 INTEGER(iwp) :: ib !: 4747 INTEGER(iwp) :: ibgp !: 4748 INTEGER(iwp) :: iw !: 4749 INTEGER(iwp) :: j !: 4750 INTEGER(iwp) :: jco !: 4751 INTEGER(iwp) :: jcorr !: 4752 INTEGER(iwp) :: jinc !: 4753 INTEGER(iwp) :: jw !: 4754 INTEGER(iwp) :: j1 !: 4755 INTEGER(iwp) :: k !: 4756 INTEGER(iwp) :: k_wall !: vertical index of topography top 4757 INTEGER(iwp) :: kco !: 4758 INTEGER(iwp) :: kcorr !: 4759 INTEGER(iwp) :: k1 !: 4760 INTEGER(iwp) :: l !: 4761 INTEGER(iwp) :: m !: 4762 INTEGER(iwp) :: n !: 4763 INTEGER(iwp) :: kbc !: 4069 4764 4070 4765 REAL(wp) :: coarse_dx !: … … 4094 4789 ib = nxr + 2 4095 4790 ENDIF 4791 ! 4792 !-- Determine number of flag array to be used to mask topography 4793 IF ( var == 'u' ) THEN 4794 flag_nr = 1 4795 flag_nr2 = 14 4796 ELSEIF ( var == 'v' ) THEN 4797 flag_nr = 2 4798 flag_nr2 = 16 4799 ELSEIF ( var == 'w' ) THEN 4800 flag_nr = 3 4801 flag_nr2 = 18 4802 ELSE 4803 flag_nr = 0 4804 flag_nr2 = 12 4805 ENDIF 4096 4806 4097 4807 DO j = nys, nyn+1 4098 DO k = kb(j,i), nzt+14808 DO k = nzb, nzt+1 4099 4809 l = ic(i) 4100 4810 m = jc(j) … … 4119 4829 IF ( var == 'u' .OR. var == 'v' ) THEN 4120 4830 DO j = nys, nyn 4121 k = kb(j,i)+1 4831 ! 4832 !-- Determine vertical index of topography top at grid point (j,i) 4833 k_wall = MAXLOC( & 4834 MERGE( 1, 0, & 4835 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 )& 4836 ), DIM = 1 & 4837 ) - 1 4838 4839 k = k_wall+1 4122 4840 IF ( ( logc(1,k,j) /= 0 ) .AND. ( logc(2,k,j) == 0 ) ) THEN 4123 4841 k1 = logc(1,k,j) … … 4141 4859 !-- Solid surface only on south/north side of the node 4142 4860 DO j = nys, nyn 4143 DO k = kb(j,i)+1, nzt_topo_nestbc 4861 ! 4862 !-- Determine vertical index of topography top at grid point (j,i) 4863 k_wall = MAXLOC( & 4864 MERGE( 1, 0, & 4865 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 4866 ), DIM = 1 & 4867 ) - 1 4868 DO k = k_wall+1, nzt_topo_nestbc 4144 4869 IF ( ( logc(2,k,j) /= 0 ) .AND. ( logc(1,k,j) == 0 ) ) THEN 4145 4870 ! … … 4162 4887 IF ( var == 'u' ) THEN 4163 4888 DO j = nys, nyn 4164 k = kb(j,i) + 1 4889 ! 4890 !-- Determine vertical index of topography top at grid point (j,i) 4891 k_wall = MAXLOC( & 4892 MERGE( 1, 0, & 4893 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 4894 ), DIM = 1 & 4895 ) - 1 4896 k = k_wall + 1 4165 4897 IF ( ( logc(2,k,j) /= 0 ) .AND. ( logc(1,k,j) /= 0 ) ) THEN 4166 4898 k1 = logc(1,k,j) … … 4190 4922 IF ( edge == 'l' ) THEN 4191 4923 DO j = nys, nyn + 1 4192 DO k = kb(j,i), nzt + 1 4924 ! 4925 !-- Determine vertical index of topography top at grid point (j,i) 4926 k_wall = MAXLOC( & 4927 MERGE( 1, 0, & 4928 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 4929 ), DIM = 1 & 4930 ) - 1 4931 DO k = k_wall, nzt + 1 4193 4932 f(k,j,i) = tkefactor_l(k,j) * f(k,j,i) 4194 4933 ENDDO … … 4196 4935 ELSEIF ( edge == 'r' ) THEN 4197 4936 DO j = nys, nyn+1 4198 DO k = kb(j,i), nzt+1 4937 ! 4938 !-- Determine vertical index of topography top at grid point (j,i) 4939 k_wall = MAXLOC( & 4940 MERGE( 1, 0, & 4941 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 4942 ), DIM = 1 & 4943 ) - 1 4944 DO k = k_wall, nzt+1 4199 4945 f(k,j,i) = tkefactor_r(k,j) * f(k,j,i) 4200 4946 ENDDO … … 4220 4966 4221 4967 SUBROUTINE pmci_interp_tril_sn( f, fc, ic, jc, kc, r1x, r2x, r1y, r2y, r1z, & 4222 r2z, kb,logc, logc_ratio, &4968 r2z, logc, logc_ratio, & 4223 4969 nzt_topo_nestbc, edge, var ) 4224 4970 … … 4245 4991 INTEGER(iwp), DIMENSION(nxlg:nxrg), INTENT(IN) :: ic !: 4246 4992 INTEGER(iwp), DIMENSION(nysg:nyng), INTENT(IN) :: jc !: 4247 INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) :: kb !:4248 4993 INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(IN) :: kc !: 4249 4994 INTEGER(iwp), DIMENSION(1:2,nzb:nzt_topo_nestbc,nxl:nxr), & … … 4254 4999 CHARACTER(LEN=1), INTENT(IN) :: var !: 4255 5000 5001 INTEGER(iwp) :: flag_nr !: Number of flag array to mask topography on respective u/v/w or s grid 5002 INTEGER(iwp) :: flag_nr2 !: Number of flag array to indicate vertical index of topography top on respective u/v/w or s grid 4256 5003 INTEGER(iwp) :: i !: 4257 5004 INTEGER(iwp) :: iinc !: … … 4263 5010 INTEGER(iwp) :: jbgp !: 4264 5011 INTEGER(iwp) :: k !: 5012 INTEGER(iwp) :: k_wall !: vertical index of topography top 4265 5013 INTEGER(iwp) :: kcorr !: 4266 5014 INTEGER(iwp) :: kco !: … … 4297 5045 ENDIF 4298 5046 5047 ! 5048 !-- Determine number of flag array to be used to mask topography 5049 IF ( var == 'u' ) THEN 5050 flag_nr = 1 5051 flag_nr2 = 14 5052 ELSEIF ( var == 'v' ) THEN 5053 flag_nr = 2 5054 flag_nr2 = 16 5055 ELSEIF ( var == 'w' ) THEN 5056 flag_nr = 3 5057 flag_nr2 = 18 5058 ELSE 5059 flag_nr = 0 5060 flag_nr2 = 12 5061 ENDIF 5062 4299 5063 DO i = nxl, nxr+1 4300 DO k = kb(j,i), nzt+1 5064 ! 5065 !-- Determine vertical index of topography top at grid point (j,i) 5066 k_wall = MAXLOC( & 5067 MERGE( 1, 0, & 5068 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 )& 5069 ), DIM = 1 & 5070 ) - 1 5071 DO k = k_wall, nzt+1 4301 5072 l = ic(i) 4302 5073 m = jc(j) … … 4321 5092 IF ( var == 'u' .OR. var == 'v' ) THEN 4322 5093 DO i = nxl, nxr 4323 k = kb(j,i) + 1 5094 ! 5095 !-- Determine vertical index of topography top at grid point (j,i) 5096 k_wall = MAXLOC( & 5097 MERGE( 1, 0, & 5098 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 )& 5099 ), DIM = 1 & 5100 ) - 1 5101 5102 k = k_wall + 1 4324 5103 IF ( ( logc(1,k,i) /= 0 ) .AND. ( logc(2,k,i) == 0 ) ) THEN 4325 5104 k1 = logc(1,k,i) … … 4342 5121 IF ( var == 'v' .OR. var == 'w' ) THEN 4343 5122 DO i = nxl, nxr 4344 DO k = kb(j,i), nzt_topo_nestbc 5123 ! 5124 !-- Determine vertical index of topography top at grid point (j,i) 5125 k_wall = MAXLOC( & 5126 MERGE( 1, 0, & 5127 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 5128 ), DIM = 1 & 5129 ) - 1 5130 DO k = k_wall, nzt_topo_nestbc 4345 5131 ! 4346 5132 !-- Solid surface only on left/right side of the node … … 4365 5151 IF ( var == 'v' ) THEN 4366 5152 DO i = nxl, nxr 4367 k = kb(j,i) + 1 5153 ! 5154 !-- Determine vertical index of topography top at grid point (j,i) 5155 k_wall = MAXLOC( & 5156 MERGE( 1, 0, & 5157 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 5158 ), DIM = 1 & 5159 ) - 1 5160 k = k_wall + 1 4368 5161 IF ( ( logc(2,k,i) /= 0 ) .AND. ( logc(1,k,i) /= 0 ) ) THEN 4369 5162 k1 = logc(1,k,i) … … 4393 5186 IF ( edge == 's' ) THEN 4394 5187 DO i = nxl, nxr + 1 4395 DO k = kb(j,i), nzt+1 5188 ! 5189 !-- Determine vertical index of topography top at grid point (j,i) 5190 k_wall = MAXLOC( & 5191 MERGE( 1, 0, & 5192 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 5193 ), DIM = 1 & 5194 ) - 1 5195 DO k = k_wall, nzt+1 4396 5196 f(k,j,i) = tkefactor_s(k,i) * f(k,j,i) 4397 5197 ENDDO … … 4399 5199 ELSEIF ( edge == 'n' ) THEN 4400 5200 DO i = nxl, nxr + 1 4401 DO k = kb(j,i), nzt+1 5201 ! 5202 !-- Determine vertical index of topography top at grid point (j,i) 5203 k_wall = MAXLOC( & 5204 MERGE( 1, 0, & 5205 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr2 ) & 5206 ), DIM = 1 & 5207 ) - 1 5208 DO k = k_wall, nzt+1 4402 5209 f(k,j,i) = tkefactor_n(k,i) * f(k,j,i) 4403 5210 ENDDO … … 4510 5317 4511 5318 4512 SUBROUTINE pmci_extrap_ifoutflow_lr( f, kb,edge, var )5319 SUBROUTINE pmci_extrap_ifoutflow_lr( f, edge, var ) 4513 5320 ! 4514 5321 !-- After the interpolation of ghost-node values for the child-domain … … 4524 5331 CHARACTER(LEN=1), INTENT(IN) :: var !: 4525 5332 4526 INTEGER(iwp) :: i !:4527 INTEGER(iwp) :: i b!:4528 INTEGER(iwp) :: ib gp!:4529 INTEGER(iwp) :: i ed!:4530 INTEGER(iwp) :: j!:4531 INTEGER(iwp) :: k!:4532 4533 INTEGER(iwp) , DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) :: kb!:5333 INTEGER(iwp) :: flag_nr !: Number of flag array to mask topography on respective u/v/w or s grid 5334 INTEGER(iwp) :: i !: 5335 INTEGER(iwp) :: ib !: 5336 INTEGER(iwp) :: ibgp !: 5337 INTEGER(iwp) :: ied !: 5338 INTEGER(iwp) :: j !: 5339 INTEGER(iwp) :: k !: 5340 INTEGER(iwp) :: k_wall !: 4534 5341 4535 5342 REAL(wp) :: outnor !: … … 4557 5364 outnor = 1.0_wp 4558 5365 ENDIF 5366 ! 5367 !-- Determine number of flag array to be used to mask topography 5368 IF ( var == 'u' ) THEN 5369 flag_nr = 14 5370 ELSEIF ( var == 'v' ) THEN 5371 flag_nr = 16 5372 ELSEIF ( var == 'w' ) THEN 5373 flag_nr = 18 5374 ELSE 5375 flag_nr = 12 5376 ENDIF 4559 5377 4560 5378 DO j = nys, nyn+1 4561 DO k = kb(j,i), nzt+1 5379 ! 5380 !-- Determine vertical index of topography top at grid point (j,i) 5381 k_wall = MAXLOC( & 5382 MERGE( 1, 0, & 5383 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr ) & 5384 ), DIM = 1 & 5385 ) - 1 5386 DO k = k_wall, nzt+1 4562 5387 vdotnor = outnor * u(k,j,ied) 4563 5388 ! … … 4568 5393 ENDDO 4569 5394 IF ( (var == 'u' ) .OR. (var == 'v' ) .OR. (var == 'w') ) THEN 4570 f(k b(j,i),j,i) = 0.0_wp5395 f(k_wall,j,i) = 0.0_wp 4571 5396 ENDIF 4572 5397 ENDDO … … 4588 5413 4589 5414 4590 SUBROUTINE pmci_extrap_ifoutflow_sn( f, kb,edge, var )5415 SUBROUTINE pmci_extrap_ifoutflow_sn( f, edge, var ) 4591 5416 ! 4592 5417 !-- After the interpolation of ghost-node values for the child-domain … … 4601 5426 CHARACTER(LEN=1), INTENT(IN) :: var !: 4602 5427 5428 INTEGER(iwp) :: flag_nr !: Number of flag array to mask topography on respective u/v/w or s grid 4603 5429 INTEGER(iwp) :: i !: 4604 5430 INTEGER(iwp) :: j !: … … 4607 5433 INTEGER(iwp) :: jed !: 4608 5434 INTEGER(iwp) :: k !: 4609 4610 INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) :: kb !: 5435 INTEGER(iwp) :: k_wall !: 4611 5436 4612 5437 REAL(wp) :: outnor !: … … 4635 5460 ENDIF 4636 5461 5462 ! 5463 !-- Determine number of flag array to be used to mask topography 5464 IF ( var == 'u' ) THEN 5465 flag_nr = 14 5466 ELSEIF ( var == 'v' ) THEN 5467 flag_nr = 16 5468 ELSEIF ( var == 'w' ) THEN 5469 flag_nr = 18 5470 ELSE 5471 flag_nr = 12 5472 ENDIF 5473 4637 5474 DO i = nxl, nxr+1 4638 DO k = kb(j,i), nzt+1 5475 ! 5476 !-- Determine vertical index of topography top at grid point (j,i) 5477 k_wall = MAXLOC( & 5478 MERGE( 1, 0, & 5479 BTEST( wall_flags_0(nzb:nzb_max,j,i), flag_nr ) & 5480 ), DIM = 1 & 5481 ) - 1 5482 DO k = k_wall, nzt+1 4639 5483 vdotnor = outnor * v(k,jed,i) 4640 5484 ! … … 4645 5489 ENDDO 4646 5490 IF ( (var == 'u' ) .OR. (var == 'v' ) .OR. (var == 'w') ) THEN 4647 f(k b(j,i),j,i) = 0.0_wp5491 f(k_wall,j,i) = 0.0_wp 4648 5492 ENDIF 4649 5493 ENDDO -
palm/trunk/SOURCE/poismg_mod.f90
r2101 r2232 26 26 ! $Id$ 27 27 ! 28 ! 2084 2016-12-09 15:59:42Z knoop29 ! Bugfix: missing rho_air_mg even/odd sorting implemented30 !31 28 ! 2073 2016-11-30 14:34:05Z raasch 32 29 ! change of openmp directives in restrict … … 111 108 REAL(wp), DIMENSION(:,:), SAVE, ALLOCATABLE :: f1_mg_b, f2_mg_b, f3_mg_b !< blocked version of f1_mg ... 112 109 113 REAL(wp), DIMENSION(:,:), SAVE, ALLOCATABLE :: rho_air_mg_b !< blocked version of rho_air_mg114 115 110 INTERFACE poismg 116 111 MODULE PROCEDURE poismg … … 320 315 kp1 = k-ind_even_odd 321 316 r(k,j,i) = f_mg(k,j,i) & 322 - rho_air_mg _b(k,l) * ddx2_mg(l) * &317 - rho_air_mg(k,l) * ddx2_mg(l) * & 323 318 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 324 - rho_air_mg _b(k,l) * ddy2_mg(l) * &319 - rho_air_mg(k,l) * ddy2_mg(l) * & 325 320 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 326 321 - f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 333 328 kp1 = k+ind_even_odd+1 334 329 r(k,j,i) = f_mg(k,j,i) & 335 - rho_air_mg _b(k,l) * ddx2_mg(l) * &330 - rho_air_mg(k,l) * ddx2_mg(l) * & 336 331 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 337 - rho_air_mg _b(k,l) * ddy2_mg(l) * &332 - rho_air_mg(k,l) * ddy2_mg(l) * & 338 333 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 339 334 - f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 766 761 kp1 = k-ind_even_odd 767 762 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 768 rho_air_mg _b(k,l) * ddx2_mg(l) * &763 rho_air_mg(k,l) * ddx2_mg(l) * & 769 764 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 770 + rho_air_mg _b(k,l) * ddy2_mg(l) * &765 + rho_air_mg(k,l) * ddy2_mg(l) * & 771 766 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 772 767 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 785 780 kp1 = k-ind_even_odd 786 781 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 787 rho_air_mg _b(k,l) * ddx2_mg(l) * &782 rho_air_mg(k,l) * ddx2_mg(l) * & 788 783 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 789 + rho_air_mg _b(k,l) * ddy2_mg(l) * &784 + rho_air_mg(k,l) * ddy2_mg(l) * & 790 785 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 791 786 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 804 799 kp1 = k+ind_even_odd+1 805 800 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 806 rho_air_mg _b(k,l) * ddx2_mg(l) * &801 rho_air_mg(k,l) * ddx2_mg(l) * & 807 802 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 808 + rho_air_mg _b(k,l) * ddy2_mg(l) * &803 + rho_air_mg(k,l) * ddy2_mg(l) * & 809 804 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 810 805 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 823 818 kp1 = k+ind_even_odd+1 824 819 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 825 rho_air_mg _b(k,l) * ddx2_mg(l) * &820 rho_air_mg(k,l) * ddx2_mg(l) * & 826 821 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 827 + rho_air_mg _b(k,l) * ddy2_mg(l) * &822 + rho_air_mg(k,l) * ddy2_mg(l) * & 828 823 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 829 824 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 854 849 j = jj 855 850 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 856 rho_air_mg _b(k,l) * ddx2_mg(l) * &851 rho_air_mg(k,l) * ddx2_mg(l) * & 857 852 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 858 + rho_air_mg _b(k,l) * ddy2_mg(l) * &853 + rho_air_mg(k,l) * ddy2_mg(l) * & 859 854 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 860 855 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 863 858 j = jj+2 864 859 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 865 rho_air_mg _b(k,l) * ddx2_mg(l) * &860 rho_air_mg(k,l) * ddx2_mg(l) * & 866 861 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 867 + rho_air_mg _b(k,l) * ddy2_mg(l) * &862 + rho_air_mg(k,l) * ddy2_mg(l) * & 868 863 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 869 864 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 880 875 j = jj 881 876 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 882 rho_air_mg _b(k,l) * ddx2_mg(l) * &877 rho_air_mg(k,l) * ddx2_mg(l) * & 883 878 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 884 + rho_air_mg _b(k,l) * ddy2_mg(l) * &879 + rho_air_mg(k,l) * ddy2_mg(l) * & 885 880 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 886 881 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 889 884 j = jj+2 890 885 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 891 rho_air_mg _b(k,l) * ddx2_mg(l) * &886 rho_air_mg(k,l) * ddx2_mg(l) * & 892 887 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 893 + rho_air_mg _b(k,l) * ddy2_mg(l) * &888 + rho_air_mg(k,l) * ddy2_mg(l) * & 894 889 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 895 890 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 906 901 j = jj 907 902 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 908 rho_air_mg _b(k,l) * ddx2_mg(l) * &903 rho_air_mg(k,l) * ddx2_mg(l) * & 909 904 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 910 + rho_air_mg _b(k,l) * ddy2_mg(l) * &905 + rho_air_mg(k,l) * ddy2_mg(l) * & 911 906 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 912 907 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 915 910 j = jj+2 916 911 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 917 rho_air_mg _b(k,l) * ddx2_mg(l) * &912 rho_air_mg(k,l) * ddx2_mg(l) * & 918 913 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 919 + rho_air_mg _b(k,l) * ddy2_mg(l) * &914 + rho_air_mg(k,l) * ddy2_mg(l) * & 920 915 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 921 916 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 932 927 j = jj 933 928 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 934 rho_air_mg _b(k,l) * ddx2_mg(l) * &929 rho_air_mg(k,l) * ddx2_mg(l) * & 935 930 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 936 + rho_air_mg _b(k,l) * ddy2_mg(l) * &931 + rho_air_mg(k,l) * ddy2_mg(l) * & 937 932 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 938 933 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 941 936 j = jj+2 942 937 p_mg(k,j,i) = 1.0_wp / f1_mg_b(k,l) * ( & 943 rho_air_mg _b(k,l) * ddx2_mg(l) * &938 rho_air_mg(k,l) * ddx2_mg(l) * & 944 939 ( p_mg(k,j,i+1) + p_mg(k,j,i-1) ) & 945 + rho_air_mg _b(k,l) * ddy2_mg(l) * &940 + rho_air_mg(k,l) * ddy2_mg(l) * & 946 941 ( p_mg(k,j+1,i) + p_mg(k,j-1,i) ) & 947 942 + f2_mg_b(k,l) * p_mg(kp1,j,i) & … … 1758 1753 1759 1754 USE arrays_3d, & 1760 ONLY: f1_mg, f2_mg, f3_mg , rho_air_mg1755 ONLY: f1_mg, f2_mg, f3_mg 1761 1756 1762 1757 USE control_parameters, & … … 1784 1779 ALLOCATE( f1_mg_b(nzb:nzt+1,maximum_grid_level), & 1785 1780 f2_mg_b(nzb:nzt+1,maximum_grid_level), & 1786 f3_mg_b(nzb:nzt+1,maximum_grid_level), & 1787 rho_air_mg_b(nzb:nzt+1,maximum_grid_level) ) 1781 f3_mg_b(nzb:nzt+1,maximum_grid_level) ) 1788 1782 1789 1783 ! … … 1806 1800 f3_mg_b(nzb:nzt_mg(grid_level)+1,l), & 1807 1801 l ) 1808 CALL sort_k_to_even_odd_blocks( rho_air_mg(nzb+1:nzt_mg(grid_level),l), &1809 rho_air_mg_b(nzb:nzt_mg(grid_level)+1,l), &1810 l )1811 1802 ENDDO 1812 1803 -
palm/trunk/SOURCE/poismg_noopt.f90
r2101 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Bugfixes OpenMP 23 23 ! 24 24 ! Former revisions: … … 495 495 END SELECT 496 496 497 !$OMP PARALLEL PRIVATE (i,j,k,ic,jc,kc) 497 !$OMP PARALLEL PRIVATE (i,j,k,ic,jc,kc, rkjim,rkjip,rkjpi,rkjmi,rkjmim,rkjpim, & 498 !$OMP rkjmip, rkjpip,rkmji,rkmjim,rkmjip,rkmjpi,rkmjmi,rkmjmim,rkmjpim,rkmjmip,& 499 !$OMP rkmjpip ) 498 500 !$OMP DO 499 501 DO ic = nxl_mg(l), nxr_mg(l) -
palm/trunk/SOURCE/pres.f90
r2119 r2232 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! Adjustments to new topography and surface concept 23 23 ! 24 24 ! Former revisions: … … 156 156 USE indices, & 157 157 ONLY: nbgp, ngp_2dh_outer, nx, nxl, nxlg, nxl_mg, nxr, nxrg, nxr_mg, & 158 ny, nys, nysg, nys_mg, nyn, nyng, nyn_mg, nzb, nzb_s_inner, & 159 nzb_u_inner, nzb_v_inner, nzb_w_inner, nzt, nzt_mg, & 160 rflags_s_inner 158 ny, nys, nysg, nys_mg, nyn, nyng, nyn_mg, nzb, nzt, nzt_mg, & 159 wall_flags_0 161 160 162 161 USE kinds … … 176 175 weight_substep 177 176 177 USE surface_mod, & 178 ONLY : bc_h 179 178 180 IMPLICIT NONE 179 181 … … 181 183 INTEGER(iwp) :: j !< 182 184 INTEGER(iwp) :: k !< 185 INTEGER(iwp) :: m !< 183 186 184 187 REAL(wp) :: ddt_3d !< … … 269 272 ! 270 273 !-- Sum up the volume flow through the south/north boundary 271 DO k = nzb_u_inner(j,i)+1, nzt 272 volume_flow_l(1) = volume_flow_l(1) + u(k,j,i) * dzw(k) 274 DO k = nzb+1, nzt 275 volume_flow_l(1) = volume_flow_l(1) + u(k,j,i) * dzw(k) & 276 * MERGE( 1.0_wp, 0.0_wp, & 277 BTEST( wall_flags_0(k,j,i), 1 ) & 278 ) 273 279 ENDDO 274 280 ENDDO … … 285 291 286 292 DO j = nysg, nyng 287 DO k = nzb_u_inner(j,i)+1, nzt 288 u(k,j,i) = u(k,j,i) + volume_flow_offset(1) 293 DO k = nzb+1, nzt 294 u(k,j,i) = u(k,j,i) + volume_flow_offset(1) & 295 * MERGE( 1.0_wp, 0.0_wp, & 296 BTEST( wall_flags_0(k,j,i), 1 ) & 297 ) 289 298 ENDDO 290 299 ENDDO … … 308 317 ! 309 318 !-- Sum up the volume flow through the south/north boundary 310 DO k = nzb_v_inner(j,i)+1, nzt 311 volume_flow_l(2) = volume_flow_l(2) + v(k,j,i) * dzw(k) 319 DO k = nzb+1, nzt 320 volume_flow_l(2) = volume_flow_l(2) + v(k,j,i) * dzw(k) & 321 * MERGE( 1.0_wp, 0.0_wp, & 322 BTEST( wall_flags_0(k,j,i), 2 ) & 323 ) 312 324 ENDDO 313 325 ENDDO … … 324 336 325 337 DO i = nxlg, nxrg 326 DO k = nzb_v_inner(j,i)+1, nzt 327 v(k,j,i) = v(k,j,i) + volume_flow_offset(2) 338 DO k = nzb+1, nzt 339 v(k,j,i) = v(k,j,i) + volume_flow_offset(2) & 340 * MERGE( 1.0_wp, 0.0_wp, & 341 BTEST( wall_flags_0(k,j,i), 2 ) & 342 ) 328 343 ENDDO 329 344 ENDDO … … 350 365 DO i = nxl, nxr 351 366 DO j = nys, nyn 352 DO k = nzb_w_inner(j,i)+1, nzt 353 w_l_l(k) = w_l_l(k) + w(k,j,i) 367 DO k = nzb+1, nzt 368 w_l_l(k) = w_l_l(k) + w(k,j,i) & 369 * MERGE( 1.0_wp, 0.0_wp, & 370 BTEST( wall_flags_0(k,j,i), 3 ) & 371 ) 354 372 ENDDO 355 373 ENDDO … … 367 385 DO i = nxlg, nxrg 368 386 DO j = nysg, nyng 369 DO k = nzb_w_inner(j,i)+1, nzt 370 w(k,j,i) = w(k,j,i) - w_l(k) 387 DO k = nzb+1, nzt 388 w(k,j,i) = w(k,j,i) - w_l(k) & 389 * MERGE( 1.0_wp, 0.0_wp, & 390 BTEST( wall_flags_0(k,j,i), 3 ) & 391 ) 371 392 ENDDO 372 393 ENDDO … … 379 400 380 401 IF ( psolver(1:9) == 'multigrid' ) THEN 381 !$OMP PARALLEL DO SCHEDULE( STATIC ) 402 !$OMP PARALLEL DO SCHEDULE( STATIC ) PRIVATE (i,j,k) 382 403 DO i = nxl-1, nxr+1 383 404 DO j = nys-1, nyn+1 … … 388 409 ENDDO 389 410 ELSE 390 !$OMP PARALLEL DO SCHEDULE( STATIC ) 411 !$OMP PARALLEL DO SCHEDULE( STATIC ) PRIVATE (i,j,k) 391 412 DO i = nxl, nxr 392 413 DO j = nys, nyn … … 406 427 DO i = nxl, nxr 407 428 DO j = nys, nyn 408 DO k = nzb _s_inner(j,i)+1, nzt429 DO k = nzb+1, nzt 409 430 d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx + & 410 431 ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy + & 411 432 ( w(k,j,i) * rho_air_zw(k) - & 412 433 w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k) & 413 ) * ddt_3d * d_weight_pres 434 ) * ddt_3d * d_weight_pres & 435 * MERGE( 1.0_wp, 0.0_wp, & 436 BTEST( wall_flags_0(k,j,i), 0 ) & 437 ) 414 438 ENDDO 415 439 ! 416 440 !-- Compute possible PE-sum of divergences for flow_statistics 417 DO k = nzb_s_inner(j,i)+1, nzt 418 threadsum = threadsum + ABS( d(k,j,i) ) 441 DO k = nzb+1, nzt 442 threadsum = threadsum + ABS( d(k,j,i) ) & 443 * MERGE( 1.0_wp, 0.0_wp, & 444 BTEST( wall_flags_0(k,j,i), 0 ) & 445 ) 419 446 ENDDO 420 447 … … 438 465 ( w(k,j,i) * rho_air_zw(k) - & 439 466 w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k) & 440 ) * ddt_3d * d_weight_pres * rflags_s_inner(k,j,i) 467 ) * ddt_3d * d_weight_pres & 468 * MERGE( 1.0_wp, 0.0_wp, & 469 BTEST( wall_flags_0(k,j,i), 0 ) & 470 ) 441 471 ENDDO 442 472 ENDDO … … 484 514 !-- Store computed perturbation pressure and set boundary condition in 485 515 !-- z-direction 486 !$OMP PARALLEL DO 516 !$OMP PARALLEL DO PRIVATE (i,j,k) 487 517 DO i = nxl, nxr 488 518 DO j = nys, nyn … … 499 529 IF ( ibc_p_b == 1 ) THEN 500 530 ! 501 !-- Neumann (dp/dz = 0) 502 !$OMP PARALLEL DO 503 DO i = nxlg, nxrg 504 DO j = nysg, nyng 505 tend(nzb_s_inner(j,i),j,i) = tend(nzb_s_inner(j,i)+1,j,i) 506 ENDDO 531 !-- Neumann (dp/dz = 0). Using surfae data type, first for non-natural 532 !-- surfaces, then for natural and urban surfaces 533 !-- Upward facing 534 !$OMP PARALLEL DO PRIVATE( i, j, k ) 535 DO m = 1, bc_h(0)%ns 536 i = bc_h(0)%i(m) 537 j = bc_h(0)%j(m) 538 k = bc_h(0)%k(m) 539 tend(k-1,j,i) = tend(k,j,i) 540 ENDDO 541 ! 542 !-- Downward facing 543 !$OMP PARALLEL DO PRIVATE( i, j, k ) 544 DO m = 1, bc_h(1)%ns 545 i = bc_h(1)%i(m) 546 j = bc_h(1)%j(m) 547 k = bc_h(1)%k(m) 548 tend(k+1,j,i) = tend(k,j,i) 507 549 ENDDO 508 550 509 551 ELSE 510 552 ! 511 !-- Dirichlet 512 !$OMP PARALLEL DO 513 DO i = nxlg, nxrg 514 DO j = nysg, nyng 515 tend(nzb_s_inner(j,i),j,i) = 0.0_wp 516 ENDDO 553 !-- Dirichlet. Using surface data type, first for non-natural 554 !-- surfaces, then for natural and urban surfaces 555 !-- Upward facing 556 !$OMP PARALLEL DO PRIVATE( i, j, k ) 557 DO m = 1, bc_h(0)%ns 558 i = bc_h(0)%i(m) 559 j = bc_h(0)%j(m) 560 k = bc_h(0)%k(m) 561 tend(k-1,j,i) = 0.0_wp 562 ENDDO 563 ! 564 !-- Downward facing 565 !$OMP PARALLEL DO PRIVATE( i, j, k ) 566 DO m = 1, bc_h(1)%ns 567 i = bc_h(1)%i(m) 568 j = bc_h(1)%j(m) 569 k = bc_h(1)%k(m) 570 tend(k+1,j,i) = 0.0_wp 517 571 ENDDO 518 572 … … 524 578 ! 525 579 !-- Neumann 526 !$OMP PARALLEL DO 580 !$OMP PARALLEL DO PRIVATE (i,j,k) 527 581 DO i = nxlg, nxrg 528 582 DO j = nysg, nyng … … 534 588 ! 535 589 !-- Dirichlet 536 !$OMP PARALLEL DO 590 !$OMP PARALLEL DO PRIVATE (i,j,k) 537 591 DO i = nxlg, nxrg 538 592 DO j = nysg, nyng … … 646 700 DO j = nys, nyn 647 701 648 DO k = 1, nzt 649 IF ( k > nzb_w_inner(j,i) ) THEN 650 w(k,j,i) = w(k,j,i) - dt_3d * & 651 ( tend(k+1,j,i) - tend(k,j,i) ) * ddzu(k+1) * & 652 weight_pres_l 653 ENDIF 654 ENDDO 655 656 DO k = 1, nzt 657 IF ( k > nzb_u_inner(j,i) ) THEN 658 u(k,j,i) = u(k,j,i) - dt_3d * & 659 ( tend(k,j,i) - tend(k,j,i-1) ) * ddx * & 660 weight_pres_l 661 ENDIF 662 ENDDO 663 664 DO k = 1, nzt 665 IF ( k > nzb_v_inner(j,i) ) THEN 666 v(k,j,i) = v(k,j,i) - dt_3d * & 667 ( tend(k,j,i) - tend(k,j-1,i) ) * ddy * & 668 weight_pres_l 669 ENDIF 702 DO k = nzb+1, nzt 703 w(k,j,i) = w(k,j,i) - dt_3d * & 704 ( tend(k+1,j,i) - tend(k,j,i) ) * ddzu(k+1) & 705 * weight_pres_l & 706 * MERGE( 1.0_wp, 0.0_wp, & 707 BTEST( wall_flags_0(k,j,i), 3 ) & 708 ) 709 ENDDO 710 711 DO k = nzb+1, nzt 712 u(k,j,i) = u(k,j,i) - dt_3d * & 713 ( tend(k,j,i) - tend(k,j,i-1) ) * ddx & 714 * weight_pres_l & 715 * MERGE( 1.0_wp, 0.0_wp, & 716 BTEST( wall_flags_0(k,j,i), 1 ) & 717 ) 718 ENDDO 719 720 DO k = nzb+1, nzt 721 v(k,j,i) = v(k,j,i) - dt_3d * & 722 ( tend(k,j,i) - tend(k,j-1,i) ) * ddy & 723 * weight_pres_l & 724 * MERGE( 1.0_wp, 0.0_wp, & 725 BTEST( wall_flags_0(k,j,i), 2 ) & 726 ) 670 727 ENDDO 671 728 … … 676 733 ! 677 734 !-- Sum up the volume flow through the right and north boundary 678 IF ( conserve_volume_flow .AND. bc_lr_cyc .AND. bc_ns_cyc .AND. &735 IF ( conserve_volume_flow .AND. bc_lr_cyc .AND. bc_ns_cyc .AND. & 679 736 nxr == nx ) THEN 680 737 … … 683 740 DO j = nys, nyn 684 741 !$OMP CRITICAL 685 DO k = nzb_u_inner(j,nx) + 1, nzt 686 volume_flow_l(1) = volume_flow_l(1) + u(k,j,nx) * dzw(k) 742 DO k = nzb+1, nzt 743 volume_flow_l(1) = volume_flow_l(1) + u(k,j,nxr) * dzw(k) & 744 * MERGE( 1.0_wp, 0.0_wp, & 745 BTEST( wall_flags_0(k,j,nxr), 1 )& 746 ) 687 747 ENDDO 688 748 !$OMP END CRITICAL … … 692 752 ENDIF 693 753 694 IF ( conserve_volume_flow .AND. bc_ns_cyc .AND. bc_lr_cyc .AND. &754 IF ( conserve_volume_flow .AND. bc_ns_cyc .AND. bc_lr_cyc .AND. & 695 755 nyn == ny ) THEN 696 756 … … 699 759 DO i = nxl, nxr 700 760 !$OMP CRITICAL 701 DO k = nzb_v_inner(ny,i) + 1, nzt 702 volume_flow_l(2) = volume_flow_l(2) + v(k,ny,i) * dzw(k) 761 DO k = nzb+1, nzt 762 volume_flow_l(2) = volume_flow_l(2) + v(k,nyn,i) * dzw(k) & 763 * MERGE( 1.0_wp, 0.0_wp, & 764 BTEST( wall_flags_0(k,nyn,i), 2 )& 765 ) 703 766 ENDDO 704 767 !$OMP END CRITICAL … … 727 790 DO i = nxl, nxr 728 791 DO j = nys, nyn 729 DO k = nzb_u_inner(j,i) + 1, nzt 730 u(k,j,i) = u(k,j,i) + volume_flow_offset(1) 731 ENDDO 732 DO k = nzb_v_inner(j,i) + 1, nzt 733 v(k,j,i) = v(k,j,i) + volume_flow_offset(2) 792 DO k = nzb+1, nzt 793 u(k,j,i) = u(k,j,i) + volume_flow_offset(1) & 794 * MERGE( 1.0_wp, 0.0_wp, & 795 BTEST( wall_flags_0(k,j,i), 1 ) & 796 ) 797 ENDDO 798 DO k = nzb+1, nzt 799 v(k,j,i) = v(k,j,i) + volume_flow_offset(2) & 800 * MERGE( 1.0_wp, 0.0_wp, & 801 BTEST( wall_flags_0(k,j,i), 2 ) & 802 ) 734 803 ENDDO 735 804 ENDDO … … 768 837 DO i = nxl, nxr 769 838 DO j = nys, nyn 770 DO k = nzb_s_inner(j,i)+1, nzt 771 d(k,j,i) = ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx + & 772 ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy + & 773 ( w(k,j,i) * rho_air_zw(k) - & 774 w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k) 839 DO k = nzb+1, nzt 840 d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx + & 841 ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy + & 842 ( w(k,j,i) * rho_air_zw(k) - & 843 w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k) & 844 ) * MERGE( 1.0_wp, 0.0_wp, & 845 BTEST( wall_flags_0(k,j,i), 0 ) & 846 ) 775 847 ENDDO 776 848 DO k = nzb+1, nzt … … 783 855 DO i = nxl, nxr 784 856 DO j = nys, nyn 785 DO k = 1, nzt857 DO k = nzb+1, nzt 786 858 d(k,j,i) = ( ( u(k,j,i+1) - u(k,j,i) ) * rho_air(k) * ddx + & 787 859 ( v(k,j+1,i) - v(k,j,i) ) * rho_air(k) * ddy + & 788 860 ( w(k,j,i) * rho_air_zw(k) - & 789 861 w(k-1,j,i) * rho_air_zw(k-1) ) * ddzw(k) & 790 ) * rflags_s_inner(k,j,i) 862 ) * MERGE( 1.0_wp, 0.0_wp, & 863 BTEST( wall_flags_0(k,j,i), 0 ) & 864 ) 791 865 ENDDO 792 866 ENDDO -
palm/trunk/SOURCE/production_e.f90
r2127 r2232 20 20 ! Current revisions: 21 21 ! ----------------- 22 ! 22 ! Adjustments to new surface concept 23 23 ! 24 24 ! Former revisions: … … 106 106 !------------------------------------------------------------------------------! 107 107 MODULE production_e_mod 108 109 110 USE wall_fluxes_mod, &111 ONLY: wall_fluxes_e112 108 113 109 USE kinds … … 115 111 PRIVATE 116 112 PUBLIC production_e, production_e_init 117 118 LOGICAL, SAVE :: first_call = .TRUE. !<119 120 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: u_0 !<121 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: v_0 !<122 113 123 114 INTERFACE production_e … … 141 132 142 133 USE arrays_3d, & 143 ONLY: ddzw, dd2zu, kh, km, prho, pt, q, ql, qsws, qswst, shf, & 144 tend, tswst, u, v, vpt, w 134 ONLY: ddzw, dd2zu, kh, km, prho, pt, q, ql, tend, u, v, vpt, w 145 135 146 136 USE cloud_parameters, & … … 154 144 155 145 USE grid_variables, & 156 ONLY: ddx, dx, ddy, dy , wall_e_x, wall_e_y146 ONLY: ddx, dx, ddy, dy 157 147 158 148 USE indices, & 159 ONLY: nxl, nxr, nys, nyn, nzb, nzb_diff_s_inner, & 160 nzb_diff_s_outer, nzb_s_inner, nzt, nzt_diff 149 ONLY: nxl, nxr, nys, nyn, nzb, nzt, wall_flags_0 150 151 USE surface_mod, & 152 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 153 surf_usm_v 161 154 162 155 IMPLICIT NONE 163 156 164 INTEGER(iwp) :: i !< 165 INTEGER(iwp) :: j !< 166 INTEGER(iwp) :: k !< 167 168 REAL(wp) :: def !< 169 REAL(wp) :: dudx !< 170 REAL(wp) :: dudy !< 171 REAL(wp) :: dudz !< 172 REAL(wp) :: dvdx !< 173 REAL(wp) :: dvdy !< 174 REAL(wp) :: dvdz !< 175 REAL(wp) :: dwdx !< 176 REAL(wp) :: dwdy !< 177 REAL(wp) :: dwdz !< 157 INTEGER(iwp) :: i !< running index x-direction 158 INTEGER(iwp) :: j !< running index y-direction 159 INTEGER(iwp) :: k !< running index z-direction 160 INTEGER(iwp) :: l !< running index for different surface type orientation 161 INTEGER(iwp) :: m !< running index surface elements 162 INTEGER(iwp) :: surf_e !< end index of surface elements at given i-j position 163 INTEGER(iwp) :: surf_s !< start index of surface elements at given i-j position 164 165 REAL(wp) :: def !< 166 REAL(wp) :: flag !< flag to mask topography 178 167 REAL(wp) :: k1 !< 179 168 REAL(wp) :: k2 !< 180 REAL(wp) :: km_neutral !< 169 REAL(wp) :: km_neutral !< diffusion coefficient assuming neutral conditions - used to compute shear production at surfaces 181 170 REAL(wp) :: theta !< 182 171 REAL(wp) :: temp !< 183 184 ! REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) :: usvs, vsus, wsus, wsvs 185 REAL(wp), DIMENSION(nzb:nzt+1) :: usvs !< 186 REAL(wp), DIMENSION(nzb:nzt+1) :: vsus !< 187 REAL(wp), DIMENSION(nzb:nzt+1) :: wsus !< 188 REAL(wp), DIMENSION(nzb:nzt+1) :: wsvs !< 189 190 ! 191 !-- First calculate horizontal momentum flux u'v', w'v', v'u', w'u' at 192 !-- vertical walls, if neccessary 193 !-- So far, results are slightly different from the ij-Version. 194 !-- Therefore, ij-Version is called further below within the ij-loops. 195 ! IF ( topography /= 'flat' ) THEN 196 ! CALL wall_fluxes_e( usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, wall_e_y ) 197 ! CALL wall_fluxes_e( wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp, wall_e_y ) 198 ! CALL wall_fluxes_e( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp, wall_e_x ) 199 ! CALL wall_fluxes_e( wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, wall_e_x ) 200 ! ENDIF 201 172 REAL(wp) :: sign_dir !< sign of wall-tke flux, depending on wall orientation 173 REAL(wp) :: usvs !< momentum flux u"v" 174 REAL(wp) :: vsus !< momentum flux v"u" 175 REAL(wp) :: wsus !< momentum flux w"u" 176 REAL(wp) :: wsvs !< momentum flux w"v" 177 178 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dudx !< Gradient of u-component in x-direction 179 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dudy !< Gradient of u-component in y-direction 180 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dudz !< Gradient of u-component in z-direction 181 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dvdx !< Gradient of v-component in x-direction 182 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dvdy !< Gradient of v-component in y-direction 183 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dvdz !< Gradient of v-component in z-direction 184 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dwdx !< Gradient of w-component in x-direction 185 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dwdy !< Gradient of w-component in y-direction 186 REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) :: dwdz !< Gradient of w-component in z-direction 202 187 203 188 DO i = nxl, nxr 204 189 205 ! 206 !-- Calculate TKE production by shear 207 DO j = nys, nyn 208 DO k = nzb_diff_s_outer(j,i), nzt 209 210 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 211 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 212 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 213 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 214 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 215 216 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 217 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 218 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 219 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 220 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 221 222 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 223 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 224 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 225 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 226 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 227 228 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 229 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 230 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 231 232 IF ( def < 0.0_wp ) def = 0.0_wp 233 234 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 235 190 IF ( constant_flux_layer ) THEN 191 192 ! 193 !-- Calculate TKE production by shear. Calculate gradients at all grid 194 !-- points first, gradients at surface-bounded grid points will be 195 !-- overwritten further below. 196 DO j = nys, nyn 197 DO k = nzb+1, nzt 198 199 dudx(k,j) = ( u(k,j,i+1) - u(k,j,i) ) * ddx 200 dudy(k,j) = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 201 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 202 dudz(k,j) = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 203 u(k-1,j,i) - u(k-1,j,i+1) ) * & 204 dd2zu(k) 205 206 dvdx(k,j) = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 207 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 208 dvdy(k,j) = ( v(k,j+1,i) - v(k,j,i) ) * ddy 209 dvdz(k,j) = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 210 v(k-1,j,i) - v(k-1,j+1,i) ) * & 211 dd2zu(k) 212 213 dwdx(k,j) = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 214 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 215 dwdy(k,j) = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 216 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 217 dwdz(k,j) = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 218 219 ENDDO 236 220 ENDDO 237 ENDDO238 239 IF ( constant_flux_layer ) THEN240 221 241 222 ! … … 244 225 !-- 'bottom and wall: use u_0,v_0 and wall functions' 245 226 DO j = nys, nyn 246 247 IF ( ( wall_e_x(j,i) /= 0.0_wp ) .OR. ( wall_e_y(j,i) /= 0.0_wp ) ) & 248 THEN 249 250 k = nzb_diff_s_inner(j,i) - 1 251 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 252 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 253 u_0(j,i) - u_0(j,i+1) ) * dd2zu(k) 254 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 255 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 256 v_0(j,i) - v_0(j+1,i) ) * dd2zu(k) 257 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 258 259 IF ( wall_e_y(j,i) /= 0.0_wp ) THEN 260 ! 261 !-- Inconsistency removed: as the thermal stratification is 262 !-- not taken into account for the evaluation of the wall 263 !-- fluxes at vertical walls, the eddy viscosity km must not 264 !-- be used for the evaluation of the velocity gradients dudy 265 !-- and dwdy 266 !-- Note: The validity of the new method has not yet been 267 !-- shown, as so far no suitable data for a validation 268 !-- has been available 269 CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, & 270 usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp ) 271 CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, & 272 wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp ) 273 km_neutral = kappa * ( usvs(k)**2 + wsvs(k)**2 )**0.25_wp * & 274 0.5_wp * dy 275 IF ( km_neutral > 0.0_wp ) THEN 276 dudy = - wall_e_y(j,i) * usvs(k) / km_neutral 277 dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral 278 ELSE 279 dudy = 0.0_wp 280 dwdy = 0.0_wp 281 ENDIF 282 ELSE 283 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 284 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 285 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 286 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 287 ENDIF 288 289 IF ( wall_e_x(j,i) /= 0.0_wp ) THEN 290 ! 291 !-- Inconsistency removed: as the thermal stratification is 292 !-- not taken into account for the evaluation of the wall 293 !-- fluxes at vertical walls, the eddy viscosity km must not 294 !-- be used for the evaluation of the velocity gradients dvdx 295 !-- and dwdx 296 !-- Note: The validity of the new method has not yet been 297 !-- shown, as so far no suitable data for a validation 298 !-- has been available 299 CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, & 300 vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp ) 301 CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, & 302 wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp ) 303 km_neutral = kappa * ( vsus(k)**2 + wsus(k)**2 )**0.25_wp * & 304 0.5_wp * dx 305 IF ( km_neutral > 0.0_wp ) THEN 306 dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral 307 dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral 308 ELSE 309 dvdx = 0.0_wp 310 dwdx = 0.0_wp 311 ENDIF 312 ELSE 313 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 314 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 315 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 316 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 317 ENDIF 318 319 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 320 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 321 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 227 ! 228 !-- Compute gradients at north- and south-facing surfaces. 229 !-- First, for default surfaces, then for urban surfaces. 230 !-- Note, so far no natural vertical surfaces implemented 231 DO l = 0, 1 232 surf_s = surf_def_v(l)%start_index(j,i) 233 surf_e = surf_def_v(l)%end_index(j,i) 234 DO m = surf_s, surf_e 235 k = surf_def_v(l)%k(m) 236 usvs = surf_def_v(l)%mom_flux_tke(0,m) 237 wsvs = surf_def_v(l)%mom_flux_tke(1,m) 238 239 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 240 * 0.5_wp * dy 241 ! 242 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 243 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 244 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 245 dudy(k,j) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 246 dwdy(k,j) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 247 ENDDO 248 ! 249 !-- Natural surfaces 250 surf_s = surf_lsm_v(l)%start_index(j,i) 251 surf_e = surf_lsm_v(l)%end_index(j,i) 252 DO m = surf_s, surf_e 253 k = surf_lsm_v(l)%k(m) 254 usvs = surf_lsm_v(l)%mom_flux_tke(0,m) 255 wsvs = surf_lsm_v(l)%mom_flux_tke(1,m) 256 257 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 258 * 0.5_wp * dy 259 ! 260 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 261 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 262 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 263 dudy(k,j) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 264 dwdy(k,j) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 265 ENDDO 266 ! 267 !-- Urban surfaces 268 surf_s = surf_usm_v(l)%start_index(j,i) 269 surf_e = surf_usm_v(l)%end_index(j,i) 270 DO m = surf_s, surf_e 271 k = surf_usm_v(l)%k(m) 272 usvs = surf_usm_v(l)%mom_flux_tke(0,m) 273 wsvs = surf_usm_v(l)%mom_flux_tke(1,m) 274 275 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 276 * 0.5_wp * dy 277 ! 278 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 279 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 280 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 281 dudy(k,j) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 282 dwdy(k,j) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 283 ENDDO 284 ENDDO 285 ! 286 !-- Compute gradients at east- and west-facing walls 287 DO l = 2, 3 288 surf_s = surf_def_v(l)%start_index(j,i) 289 surf_e = surf_def_v(l)%end_index(j,i) 290 DO m = surf_s, surf_e 291 k = surf_def_v(l)%k(m) 292 vsus = surf_def_v(l)%mom_flux_tke(0,m) 293 wsus = surf_def_v(l)%mom_flux_tke(1,m) 294 295 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 296 * 0.5_wp * dx 297 ! 298 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 299 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 300 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 301 dvdx(k,j) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 302 dwdx(k,j) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 303 ENDDO 304 ! 305 !-- Natural surfaces 306 surf_s = surf_lsm_v(l)%start_index(j,i) 307 surf_e = surf_lsm_v(l)%end_index(j,i) 308 DO m = surf_s, surf_e 309 k = surf_lsm_v(l)%k(m) 310 vsus = surf_lsm_v(l)%mom_flux_tke(0,m) 311 wsus = surf_lsm_v(l)%mom_flux_tke(1,m) 312 313 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 314 * 0.5_wp * dx 315 ! 316 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 317 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 318 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 319 dvdx(k,j) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 320 dwdx(k,j) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 321 ENDDO 322 ! 323 !-- Urban surfaces 324 surf_s = surf_usm_v(l)%start_index(j,i) 325 surf_e = surf_usm_v(l)%end_index(j,i) 326 DO m = surf_s, surf_e 327 k = surf_usm_v(l)%k(m) 328 vsus = surf_usm_v(l)%mom_flux_tke(0,m) 329 wsus = surf_usm_v(l)%mom_flux_tke(1,m) 330 331 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 332 * 0.5_wp * dx 333 ! 334 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 335 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 336 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 337 dvdx(k,j) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 338 dwdx(k,j) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 339 ENDDO 340 ENDDO 341 ! 342 !-- Compute gradients at upward-facing surfaces 343 surf_s = surf_def_h(0)%start_index(j,i) 344 surf_e = surf_def_h(0)%end_index(j,i) 345 DO m = surf_s, surf_e 346 k = surf_def_h(0)%k(m) 347 ! 348 !-- Please note, actually, an interpolation of u_0 and v_0 349 !-- onto the grid center would be required. However, this 350 !-- would require several data transfers between 2D-grid and 351 !-- wall type. The effect of this missing interpolation is 352 !-- negligible. (See also production_e_init). 353 dudz(k,j) = ( u(k+1,j,i) - surf_def_h(0)%u_0(m) ) * dd2zu(k) 354 dvdz(k,j) = ( v(k+1,j,i) - surf_def_h(0)%v_0(m) ) * dd2zu(k) 355 356 ENDDO 357 ! 358 !-- Natural surfaces 359 surf_s = surf_lsm_h%start_index(j,i) 360 surf_e = surf_lsm_h%end_index(j,i) 361 DO m = surf_s, surf_e 362 k = surf_lsm_h%k(m) 363 ! 364 !-- Please note, actually, an interpolation of u_0 and v_0 365 !-- onto the grid center would be required. However, this 366 !-- would require several data transfers between 2D-grid and 367 !-- wall type. The effect of this missing interpolation is 368 !-- negligible. (See also production_e_init). 369 dudz(k,j) = ( u(k+1,j,i) - surf_lsm_h%u_0(m) ) * dd2zu(k) 370 dvdz(k,j) = ( v(k+1,j,i) - surf_lsm_h%v_0(m) ) * dd2zu(k) 371 372 ENDDO 373 ! 374 !-- Urban surfaces 375 surf_s = surf_usm_h%start_index(j,i) 376 surf_e = surf_usm_h%end_index(j,i) 377 DO m = surf_s, surf_e 378 k = surf_usm_h%k(m) 379 ! 380 !-- Please note, actually, an interpolation of u_0 and v_0 381 !-- onto the grid center would be required. However, this 382 !-- would require several data transfers between 2D-grid and 383 !-- wall type. The effect of this missing interpolation is 384 !-- negligible. (See also production_e_init). 385 dudz(k,j) = ( u(k+1,j,i) - surf_usm_h%u_0(m) ) * dd2zu(k) 386 dvdz(k,j) = ( v(k+1,j,i) - surf_usm_h%v_0(m) ) * dd2zu(k) 387 388 ENDDO 389 ! 390 !-- Compute gradients at downward-facing walls, only for 391 !-- non-natural default surfaces 392 surf_s = surf_def_h(1)%start_index(j,i) 393 surf_e = surf_def_h(1)%end_index(j,i) 394 DO m = surf_s, surf_e 395 k = surf_def_h(1)%k(m) 396 ! 397 !-- Please note, actually, an interpolation of u_0 and v_0 398 !-- onto the grid center would be required. However, this 399 !-- would require several data transfers between 2D-grid and 400 !-- wall type. The effect of this missing interpolation is 401 !-- negligible. (See also production_e_init). 402 dudz(k,j) = ( surf_def_h(1)%u_0(m) - u(k-1,j,i) ) * dd2zu(k) 403 dvdz(k,j) = ( surf_def_h(1)%v_0(m) - v(k-1,j,i) ) * dd2zu(k) 404 405 ENDDO 406 407 ENDDO 408 409 DO j = nys, nyn 410 DO k = nzb+1, nzt 411 412 def = 2.0_wp * ( dudx(k,j)**2 + dvdy(k,j)**2 + dwdz(k,j)**2 ) + & 413 dudy(k,j)**2 + dvdx(k,j)**2 + dwdx(k,j)**2 + & 414 dwdy(k,j)**2 + dudz(k,j)**2 + dvdz(k,j)**2 + & 415 2.0_wp * ( dvdx(k,j)*dudy(k,j) + dwdx(k,j)*dudz(k,j) + & 416 dwdy(k,j)*dvdz(k,j) ) 322 417 323 418 IF ( def < 0.0_wp ) def = 0.0_wp 324 419 325 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 326 327 328 ! 329 !-- (3) - will be executed only, if there is at least one level 330 !-- between (2) and (4), i.e. the topography must have a 331 !-- minimum height of 2 dz. Wall fluxes for this case have 332 !-- already been calculated for (2). 333 !-- 'wall only: use wall functions' 334 335 DO k = nzb_diff_s_inner(j,i), nzb_diff_s_outer(j,i)-2 336 337 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 338 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 339 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 340 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 341 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 342 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 343 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 344 345 IF ( wall_e_y(j,i) /= 0.0_wp ) THEN 346 ! 347 !-- Inconsistency removed: as the thermal stratification 348 !-- is not taken into account for the evaluation of the 349 !-- wall fluxes at vertical walls, the eddy viscosity km 350 !-- must not be used for the evaluation of the velocity 351 !-- gradients dudy and dwdy 352 !-- Note: The validity of the new method has not yet 353 !-- been shown, as so far no suitable data for a 354 !-- validation has been available 355 km_neutral = kappa * ( usvs(k)**2 + & 356 wsvs(k)**2 )**0.25_wp * 0.5_wp * dy 357 IF ( km_neutral > 0.0_wp ) THEN 358 dudy = - wall_e_y(j,i) * usvs(k) / km_neutral 359 dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral 360 ELSE 361 dudy = 0.0_wp 362 dwdy = 0.0_wp 363 ENDIF 364 ELSE 365 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 420 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 421 422 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def * flag 423 424 ENDDO 425 ENDDO 426 427 ELSEIF ( use_surface_fluxes ) THEN 428 429 DO j = nys, nyn 430 ! 431 !-- Calculate TKE production by shear. Here, no additional 432 !-- wall-bounded code is considered. 433 !-- Why? 434 DO k = nzb+1, nzt 435 436 dudx(k,j) = ( u(k,j,i+1) - u(k,j,i) ) * ddx 437 dudy(k,j) = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 366 438 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 367 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 439 dudz(k,j) = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 440 u(k-1,j,i) - u(k-1,j,i+1) ) * & 441 dd2zu(k) 442 443 dvdx(k,j) = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 444 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 445 dvdy(k,j) = ( v(k,j+1,i) - v(k,j,i) ) * ddy 446 dvdz(k,j) = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 447 v(k-1,j,i) - v(k-1,j+1,i) ) * & 448 dd2zu(k) 449 450 dwdx(k,j) = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 451 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 452 dwdy(k,j) = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 368 453 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 369 ENDIF 370 371 IF ( wall_e_x(j,i) /= 0.0_wp ) THEN 372 ! 373 !-- Inconsistency removed: as the thermal stratification 374 !-- is not taken into account for the evaluation of the 375 !-- wall fluxes at vertical walls, the eddy viscosity km 376 !-- must not be used for the evaluation of the velocity 377 !-- gradients dvdx and dwdx 378 !-- Note: The validity of the new method has not yet 379 !-- been shown, as so far no suitable data for a 380 !-- validation has been available 381 km_neutral = kappa * ( vsus(k)**2 + & 382 wsus(k)**2 )**0.25_wp * 0.5_wp * dx 383 IF ( km_neutral > 0.0_wp ) THEN 384 dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral 385 dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral 386 ELSE 387 dvdx = 0.0_wp 388 dwdx = 0.0_wp 389 ENDIF 390 ELSE 391 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 392 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 393 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 394 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 395 ENDIF 396 397 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 398 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 399 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 400 401 IF ( def < 0.0_wp ) def = 0.0_wp 402 403 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 404 405 ENDDO 406 407 ENDIF 408 409 ENDDO 410 411 ! 412 !-- (4) - will allways be executed. 413 !-- 'special case: free atmosphere' (as for case (0)) 414 DO j = nys, nyn 415 416 IF ( ( wall_e_x(j,i) /= 0.0_wp ) .OR. ( wall_e_y(j,i) /= 0.0_wp ) ) & 417 THEN 418 419 k = nzb_diff_s_outer(j,i)-1 420 421 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 422 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 423 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 424 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 425 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 426 427 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 428 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 429 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 430 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 431 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 432 433 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 434 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 435 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 436 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 437 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 438 439 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 440 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 441 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 454 dwdz(k,j) = ( w(k,j,i) - w(k-1,j,i) ) * & 455 ddzw(k) 456 457 def = 2.0_wp * ( & 458 dudx(k,j)**2 + dvdy(k,j)**2 + dwdz(k,j)**2 & 459 ) + & 460 dudy(k,j)**2 + dvdx(k,j)**2 + dwdx(k,j)**2 + & 461 dwdy(k,j)**2 + dudz(k,j)**2 + dvdz(k,j)**2 + & 462 2.0_wp * ( & 463 dvdx(k,j)*dudy(k,j) + dwdx(k,j)*dudz(k,j) + & 464 dwdy(k,j)*dvdz(k,j) & 465 ) 442 466 443 467 IF ( def < 0.0_wp ) def = 0.0_wp 444 468 445 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 446 447 ENDIF 448 449 ENDDO 450 451 ! 452 !-- Position without adjacent wall 453 !-- (1) - will allways be executed. 454 !-- 'bottom only: use u_0,v_0' 455 DO j = nys, nyn 456 457 IF ( ( wall_e_x(j,i) == 0.0_wp ) .AND. ( wall_e_y(j,i) == 0.0_wp ) ) & 458 THEN 459 460 k = nzb_diff_s_inner(j,i)-1 461 462 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 463 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 464 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 465 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 466 u_0(j,i) - u_0(j,i+1) ) * dd2zu(k) 467 468 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 469 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 470 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 471 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 472 v_0(j,i) - v_0(j+1,i) ) * dd2zu(k) 473 474 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 475 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 476 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 477 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 478 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 479 480 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 481 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 482 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 483 484 IF ( def < 0.0_wp ) def = 0.0_wp 485 486 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 487 488 ENDIF 489 490 ENDDO 491 492 ELSEIF ( use_surface_fluxes ) THEN 493 494 DO j = nys, nyn 495 496 k = nzb_diff_s_outer(j,i)-1 497 498 dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx 499 dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 500 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 501 dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 502 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 503 504 dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 505 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 506 dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy 507 dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 508 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 509 510 dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 511 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 512 dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 513 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 514 dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 515 516 def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) + & 517 dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + & 518 dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz ) 519 520 IF ( def < 0.0_wp ) def = 0.0_wp 521 522 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def 523 469 flag = MERGE( 1.0_wp, 0.0_wp, & 470 BTEST( wall_flags_0(k,j,i), 29 ) ) 471 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def * flag 472 473 ENDDO 524 474 ENDDO 525 475 … … 539 489 !-- in the bottom and top surface layer 540 490 DO j = nys, nyn 541 DO k = nzb _s_inner(j,i)+1, nzt491 DO k = nzb+1, nzt 542 492 tend(k,j,i) = tend(k,j,i) + & 543 493 kh(k,j,i) * g / rho_reference * & 544 494 ( prho(k+1,j,i) - prho(k-1,j,i) ) * & 545 dd2zu(k) 495 dd2zu(k) * & 496 MERGE( 1.0_wp, 0.0_wp, & 497 BTEST( wall_flags_0(k,j,i), 0 ) & 498 ) 546 499 ENDDO 547 500 ENDDO … … 550 503 551 504 DO j = nys, nyn 552 DO k = nzb_diff_s_inner(j,i), nzt_diff 553 tend(k,j,i) = tend(k,j,i) - & 554 kh(k,j,i) * g / pt_reference * & 555 ( pt(k+1,j,i) - pt(k-1,j,i) ) * & 556 dd2zu(k) 505 DO k = nzb+1, nzt 506 ! 507 !-- Flag 9 is used to mask top fluxes, flag 30 to mask 508 !-- surface fluxes 509 tend(k,j,i) = tend(k,j,i) - & 510 kh(k,j,i) * g / pt_reference * & 511 ( pt(k+1,j,i) - pt(k-1,j,i) ) * & 512 dd2zu(k) * & 513 MERGE( 1.0_wp, 0.0_wp, & 514 BTEST( wall_flags_0(k,j,i), 30 ) & 515 ) * & 516 MERGE( 1.0_wp, 0.0_wp, & 517 BTEST( wall_flags_0(k,j,i), 9 ) & 518 ) 557 519 ENDDO 558 520 559 521 IF ( use_surface_fluxes ) THEN 560 k = nzb_diff_s_inner(j,i)-1 561 tend(k,j,i) = tend(k,j,i) + g / pt_reference * & 562 shf(j,i) 522 ! 523 !-- Default surfaces, up- and downward-facing 524 DO l = 0, 1 525 surf_s = surf_def_h(l)%start_index(j,i) 526 surf_e = surf_def_h(l)%end_index(j,i) 527 DO m = surf_s, surf_e 528 k = surf_def_h(l)%k(m) 529 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 530 * surf_def_h(l)%shf(m) 531 ENDDO 532 ENDDO 533 ! 534 !-- Natural surfaces 535 surf_s = surf_lsm_h%start_index(j,i) 536 surf_e = surf_lsm_h%end_index(j,i) 537 DO m = surf_s, surf_e 538 k = surf_lsm_h%k(m) 539 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 540 * surf_lsm_h%shf(m) 541 ENDDO 542 ! 543 !-- Urban surfaces 544 surf_s = surf_usm_h%start_index(j,i) 545 surf_e = surf_usm_h%end_index(j,i) 546 DO m = surf_s, surf_e 547 k = surf_usm_h%k(m) 548 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 549 * surf_usm_h%shf(m) 550 ENDDO 563 551 ENDIF 564 552 565 553 IF ( use_top_fluxes ) THEN 566 k = nzt 567 tend(k,j,i) = tend(k,j,i) + g / pt_reference * & 568 tswst(j,i) 554 surf_s = surf_def_h(2)%start_index(j,i) 555 surf_e = surf_def_h(2)%end_index(j,i) 556 DO m = surf_s, surf_e 557 k = surf_def_h(2)%k(m) 558 tend(k,j,i) = tend(k,j,i) + g / pt_reference * & 559 surf_def_h(2)%shf(m) 560 ENDDO 569 561 ENDIF 570 562 ENDDO … … 579 571 !-- in the bottom and top surface layer 580 572 DO j = nys, nyn 581 DO k = nzb _s_inner(j,i)+1, nzt573 DO k = nzb+1, nzt 582 574 tend(k,j,i) = tend(k,j,i) + & 583 575 kh(k,j,i) * g / prho(k,j,i) * & 584 576 ( prho(k+1,j,i) - prho(k-1,j,i) ) * & 585 dd2zu(k) 577 dd2zu(k) * & 578 MERGE( 1.0_wp, 0.0_wp, & 579 BTEST( wall_flags_0(k,j,i), 0 ) & 580 ) 586 581 ENDDO 587 582 ENDDO … … 590 585 591 586 DO j = nys, nyn 592 DO k = nzb_diff_s_inner(j,i), nzt_diff 593 tend(k,j,i) = tend(k,j,i) - & 594 kh(k,j,i) * g / pt(k,j,i) * & 595 ( pt(k+1,j,i) - pt(k-1,j,i) ) * & 596 dd2zu(k) 587 DO k = nzb+1, nzt 588 ! 589 !-- Flag 9 is used to mask top fluxes, flag 30 to mask 590 !-- surface fluxes 591 tend(k,j,i) = tend(k,j,i) - & 592 kh(k,j,i) * g / pt(k,j,i) * & 593 ( pt(k+1,j,i) - pt(k-1,j,i) ) * & 594 dd2zu(k) * & 595 MERGE( 1.0_wp, 0.0_wp, & 596 BTEST( wall_flags_0(k,j,i), 30 ) & 597 ) * & 598 MERGE( 1.0_wp, 0.0_wp, & 599 BTEST( wall_flags_0(k,j,i), 9 ) & 600 ) 597 601 ENDDO 598 602 599 603 IF ( use_surface_fluxes ) THEN 600 k = nzb_diff_s_inner(j,i)-1 601 tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * & 602 shf(j,i) 604 ! 605 !-- Default surfaces, up- and downwrd-facing 606 DO l = 0, 1 607 surf_s = surf_def_h(l)%start_index(j,i) 608 surf_e = surf_def_h(l)%end_index(j,i) 609 DO m = surf_s, surf_e 610 k = surf_def_h(l)%k(m) 611 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 612 * surf_def_h(l)%shf(m) 613 ENDDO 614 ENDDO 615 ! 616 !-- Natural surfaces 617 surf_s = surf_lsm_h%start_index(j,i) 618 surf_e = surf_lsm_h%end_index(j,i) 619 DO m = surf_s, surf_e 620 k = surf_lsm_h%k(m) 621 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 622 * surf_lsm_h%shf(m) 623 ENDDO 624 ! 625 !-- Urban surfaces 626 surf_s = surf_usm_h%start_index(j,i) 627 surf_e = surf_usm_h%end_index(j,i) 628 DO m = surf_s, surf_e 629 k = surf_usm_h%k(m) 630 tend(k,j,i) = tend(k,j,i) + g / pt_reference & 631 * surf_usm_h%shf(m) 632 ENDDO 603 633 ENDIF 604 634 605 635 IF ( use_top_fluxes ) THEN 606 k = nzt 607 tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * & 608 tswst(j,i) 636 surf_s = surf_def_h(2)%start_index(j,i) 637 surf_e = surf_def_h(2)%end_index(j,i) 638 DO m = surf_s, surf_e 639 k = surf_def_h(2)%k(m) 640 tend(k,j,i) = tend(k,j,i) + g / pt_reference * & 641 surf_def_h(2)%shf(m) 642 ENDDO 609 643 ENDIF 610 644 ENDDO … … 618 652 DO j = nys, nyn 619 653 620 DO k = nzb_diff_s_inner(j,i), nzt_diff 621 654 DO k = nzb+1, nzt 655 ! 656 !-- Flag 9 is used to mask top fluxes, flag 30 to mask 657 !-- surface fluxes 622 658 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 623 659 k1 = 1.0_wp + 0.61_wp * q(k,j,i) … … 627 663 ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + & 628 664 k2 * ( q(k+1,j,i) - q(k-1,j,i) ) & 629 ) * dd2zu(k) 630 ELSE IF ( cloud_physics ) THEN 631 IF ( ql(k,j,i) == 0.0_wp ) THEN 632 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 633 k2 = 0.61_wp * pt(k,j,i) 634 ELSE 635 theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i) 636 temp = theta * t_d_pt(k) 637 k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp * & 638 ( q(k,j,i) - ql(k,j,i) ) * & 639 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) / & 640 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * & 641 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) ) 642 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 643 ENDIF 644 tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * & 645 g / vpt(k,j,i) * & 646 ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + & 647 k2 * ( q(k+1,j,i) - q(k-1,j,i) ) & 648 ) * dd2zu(k) 649 ELSE IF ( cloud_droplets ) THEN 650 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 651 k2 = 0.61_wp * pt(k,j,i) 652 tend(k,j,i) = tend(k,j,i) - & 653 kh(k,j,i) * g / vpt(k,j,i) * & 654 ( k1 * ( pt(k+1,j,i)- pt(k-1,j,i) ) + & 655 k2 * ( q(k+1,j,i) - q(k-1,j,i) ) - & 656 pt(k,j,i) * ( ql(k+1,j,i) - & 657 ql(k-1,j,i) ) ) * dd2zu(k) 658 ENDIF 659 660 ENDDO 661 662 ENDDO 663 664 IF ( use_surface_fluxes ) THEN 665 666 DO j = nys, nyn 667 668 k = nzb_diff_s_inner(j,i)-1 669 670 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 671 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 672 k2 = 0.61_wp * pt(k,j,i) 665 ) * dd2zu(k) * & 666 MERGE( 1.0_wp, 0.0_wp, & 667 BTEST( wall_flags_0(k,j,i), 30 ) & 668 ) * & 669 MERGE( 1.0_wp, 0.0_wp, & 670 BTEST( wall_flags_0(k,j,i), 9 ) & 671 ) 673 672 ELSE IF ( cloud_physics ) THEN 674 673 IF ( ql(k,j,i) == 0.0_wp ) THEN … … 685 684 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 686 685 ENDIF 686 tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * & 687 g / vpt(k,j,i) * & 688 ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + & 689 k2 * ( q(k+1,j,i) - q(k-1,j,i) ) & 690 ) * dd2zu(k) * & 691 MERGE( 1.0_wp, 0.0_wp, & 692 BTEST( wall_flags_0(k,j,i), 30 ) & 693 ) * & 694 MERGE( 1.0_wp, 0.0_wp, & 695 BTEST( wall_flags_0(k,j,i), 9 ) & 696 ) 687 697 ELSE IF ( cloud_droplets ) THEN 688 698 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 689 699 k2 = 0.61_wp * pt(k,j,i) 700 tend(k,j,i) = tend(k,j,i) - & 701 kh(k,j,i) * g / vpt(k,j,i) * & 702 ( k1 * ( pt(k+1,j,i)- pt(k-1,j,i) ) + & 703 k2 * ( q(k+1,j,i) - q(k-1,j,i) ) - & 704 pt(k,j,i) * ( ql(k+1,j,i) - & 705 ql(k-1,j,i) ) ) * dd2zu(k) * & 706 MERGE( 1.0_wp, 0.0_wp, & 707 BTEST( wall_flags_0(k,j,i), 30 ) & 708 ) * & 709 MERGE( 1.0_wp, 0.0_wp, & 710 BTEST( wall_flags_0(k,j,i), 9 ) & 711 ) 690 712 ENDIF 691 713 692 tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &693 ( k1* shf(j,i) + k2 * qsws(j,i) )694 714 ENDDO 695 715 716 ENDDO 717 718 IF ( use_surface_fluxes ) THEN 719 720 DO j = nys, nyn 721 ! 722 !-- Treat horizontal default surfaces, up- and downward-facing 723 DO l = 0, 1 724 surf_s = surf_def_h(l)%start_index(j,i) 725 surf_e = surf_def_h(l)%end_index(j,i) 726 DO m = surf_s, surf_e 727 k = surf_def_h(l)%k(m) 728 729 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 730 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 731 k2 = 0.61_wp * pt(k,j,i) 732 ELSE IF ( cloud_physics ) THEN 733 IF ( ql(k,j,i) == 0.0_wp ) THEN 734 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 735 k2 = 0.61_wp * pt(k,j,i) 736 ELSE 737 theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i) 738 temp = theta * t_d_pt(k) 739 k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp * & 740 ( q(k,j,i) - ql(k,j,i) ) * & 741 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) / & 742 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * & 743 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) ) 744 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 745 ENDIF 746 ELSE IF ( cloud_droplets ) THEN 747 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 748 k2 = 0.61_wp * pt(k,j,i) 749 ENDIF 750 751 tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * & 752 ( k1 * surf_def_h(l)%shf(m) + & 753 k2 * surf_def_h(l)%qsws(m) ) 754 ENDDO 755 ENDDO 756 ! 757 !-- Treat horizontal natural surfaces 758 surf_s = surf_lsm_h%start_index(j,i) 759 surf_e = surf_lsm_h%end_index(j,i) 760 DO m = surf_s, surf_e 761 k = surf_lsm_h%k(m) 762 763 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 764 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 765 k2 = 0.61_wp * pt(k,j,i) 766 ELSE IF ( cloud_physics ) THEN 767 IF ( ql(k,j,i) == 0.0_wp ) THEN 768 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 769 k2 = 0.61_wp * pt(k,j,i) 770 ELSE 771 theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i) 772 temp = theta * t_d_pt(k) 773 k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp * & 774 ( q(k,j,i) - ql(k,j,i) ) * & 775 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) / & 776 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * & 777 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) ) 778 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 779 ENDIF 780 ELSE IF ( cloud_droplets ) THEN 781 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 782 k2 = 0.61_wp * pt(k,j,i) 783 ENDIF 784 785 tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * & 786 ( k1 * surf_lsm_h%shf(m) + & 787 k2 * surf_lsm_h%qsws(m) ) 788 ENDDO 789 ! 790 !-- Treat horizontal urban surfaces 791 surf_s = surf_usm_h%start_index(j,i) 792 surf_e = surf_usm_h%end_index(j,i) 793 DO m = surf_s, surf_e 794 k = surf_lsm_h%k(m) 795 796 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 797 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 798 k2 = 0.61_wp * pt(k,j,i) 799 ELSE IF ( cloud_physics ) THEN 800 IF ( ql(k,j,i) == 0.0_wp ) THEN 801 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 802 k2 = 0.61_wp * pt(k,j,i) 803 ELSE 804 theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i) 805 temp = theta * t_d_pt(k) 806 k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp * & 807 ( q(k,j,i) - ql(k,j,i) ) * & 808 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) / & 809 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * & 810 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) ) 811 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 812 ENDIF 813 ELSE IF ( cloud_droplets ) THEN 814 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 815 k2 = 0.61_wp * pt(k,j,i) 816 ENDIF 817 818 tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * & 819 ( k1 * surf_usm_h%shf(m) + & 820 k2 * surf_usm_h%qsws(m) ) 821 ENDDO 822 823 ENDDO 824 696 825 ENDIF 697 826 … … 700 829 DO j = nys, nyn 701 830 702 k = nzt 831 surf_s = surf_def_h(2)%start_index(j,i) 832 surf_e = surf_def_h(2)%end_index(j,i) 833 DO m = surf_s, surf_e 834 k = surf_def_h(2)%k(m) 835 836 IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN 837 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 838 k2 = 0.61_wp * pt(k,j,i) 839 ELSE IF ( cloud_physics ) THEN 840 IF ( ql(k,j,i) == 0.0_wp ) THEN 841 k1 = 1.0_wp + 0.61_wp * q(k,j,i) 842 k2 = 0.61_wp * pt(k,j,i) 843 ELSE 844 theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i) 845 temp = theta * t_d_pt(k) 846 k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp * & 847 ( q(k,j,i) - ql(k,j,i) ) * & 848 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) / & 849 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * & 850 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) ) 851 k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp ) 852 ENDIF 853 ELSE IF ( cloud_droplets ) THEN 854 k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i) 855 k2 = 0.61_wp * pt(k,j,i) 856 ENDIF 857 858 tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * & 859 ( k1 * surf_def_h(2)%shf(m) + & 860 k2 * surf_def_h(2)%qsws(m) ) 861 862 ENDDO 863 864 ENDDO 865 866 ENDIF 867 868 ENDIF 869 870 ENDIF 871 872 ENDDO 873 874 END SUBROUTINE production_e 875 876 877 !------------------------------------------------------------------------------! 878 ! Description: 879 ! ------------ 880 !> Call for grid point i,j 881 !------------------------------------------------------------------------------! 882 SUBROUTINE production_e_ij( i, j ) 883 884 USE arrays_3d, & 885 ONLY: ddzw, dd2zu, kh, km, prho, pt, q, ql, tend, u, v, vpt, w 886 887 USE cloud_parameters, & 888 ONLY: l_d_cp, l_d_r, pt_d_t, t_d_pt 889 890 USE control_parameters, & 891 ONLY: cloud_droplets, cloud_physics, constant_flux_layer, g, & 892 humidity, kappa, neutral, ocean, pt_reference, & 893 rho_reference, use_single_reference_value, & 894 use_surface_fluxes, use_top_fluxes 895 896 USE grid_variables, & 897 ONLY: ddx, dx, ddy, dy 898 899 USE indices, & 900 ONLY: nxl, nxr, nys, nyn, nzb, nzb, nzt, wall_flags_0 901 902 USE surface_mod, & 903 ONLY : surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, & 904 surf_usm_v 905 906 IMPLICIT NONE 907 908 INTEGER(iwp) :: i !< running index x-direction 909 INTEGER(iwp) :: j !< running index y-direction 910 INTEGER(iwp) :: k !< running index z-direction 911 INTEGER(iwp) :: l !< running index for different surface type orientation 912 INTEGER(iwp) :: m !< running index surface elements 913 INTEGER(iwp) :: surf_e !< end index of surface elements at given i-j position 914 INTEGER(iwp) :: surf_s !< start index of surface elements at given i-j position 915 916 REAL(wp) :: def !< 917 REAL(wp) :: flag !< flag to mask topography 918 REAL(wp) :: k1 !< 919 REAL(wp) :: k2 !< 920 REAL(wp) :: km_neutral !< diffusion coefficient assuming neutral conditions - used to compute shear production at surfaces 921 REAL(wp) :: theta !< 922 REAL(wp) :: temp !< 923 REAL(wp) :: sign_dir !< sign of wall-tke flux, depending on wall orientation 924 REAL(wp) :: usvs !< momentum flux u"v" 925 REAL(wp) :: vsus !< momentum flux v"u" 926 REAL(wp) :: wsus !< momentum flux w"u" 927 REAL(wp) :: wsvs !< momentum flux w"v" 928 929 930 REAL(wp), DIMENSION(nzb+1:nzt) :: dudx !< Gradient of u-component in x-direction 931 REAL(wp), DIMENSION(nzb+1:nzt) :: dudy !< Gradient of u-component in y-direction 932 REAL(wp), DIMENSION(nzb+1:nzt) :: dudz !< Gradient of u-component in z-direction 933 REAL(wp), DIMENSION(nzb+1:nzt) :: dvdx !< Gradient of v-component in x-direction 934 REAL(wp), DIMENSION(nzb+1:nzt) :: dvdy !< Gradient of v-component in y-direction 935 REAL(wp), DIMENSION(nzb+1:nzt) :: dvdz !< Gradient of v-component in z-direction 936 REAL(wp), DIMENSION(nzb+1:nzt) :: dwdx !< Gradient of w-component in x-direction 937 REAL(wp), DIMENSION(nzb+1:nzt) :: dwdy !< Gradient of w-component in y-direction 938 REAL(wp), DIMENSION(nzb+1:nzt) :: dwdz !< Gradient of w-component in z-direction 939 940 941 IF ( constant_flux_layer ) THEN 942 ! 943 !-- Calculate TKE production by shear. Calculate gradients at all grid 944 !-- points first, gradients at surface-bounded grid points will be 945 !-- overwritten further below. 946 DO k = nzb+1, nzt 947 948 dudx(k) = ( u(k,j,i+1) - u(k,j,i) ) * ddx 949 dudy(k) = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 950 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 951 dudz(k) = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 952 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 953 954 dvdx(k) = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 955 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 956 dvdy(k) = ( v(k,j+1,i) - v(k,j,i) ) * ddy 957 dvdz(k) = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 958 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 959 960 dwdx(k) = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 961 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 962 dwdy(k) = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 963 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 964 dwdz(k) = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 965 966 ENDDO 967 ! 968 !-- Compute gradients at north- and south-facing surfaces. 969 !-- Note, no vertical natural surfaces so far. 970 DO l = 0, 1 971 ! 972 !-- Default surfaces 973 surf_s = surf_def_v(l)%start_index(j,i) 974 surf_e = surf_def_v(l)%end_index(j,i) 975 DO m = surf_s, surf_e 976 k = surf_def_v(l)%k(m) 977 usvs = surf_def_v(l)%mom_flux_tke(0,m) 978 wsvs = surf_def_v(l)%mom_flux_tke(1,m) 979 980 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 981 * 0.5_wp * dy 982 ! 983 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 984 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 985 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 986 dudy(k) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 987 dwdy(k) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 988 ENDDO 989 ! 990 !-- Natural surfaces 991 surf_s = surf_lsm_v(l)%start_index(j,i) 992 surf_e = surf_lsm_v(l)%end_index(j,i) 993 DO m = surf_s, surf_e 994 k = surf_lsm_v(l)%k(m) 995 usvs = surf_lsm_v(l)%mom_flux_tke(0,m) 996 wsvs = surf_lsm_v(l)%mom_flux_tke(1,m) 997 998 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 999 * 0.5_wp * dy 1000 ! 1001 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 1002 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 1003 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 1004 dudy(k) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 1005 dwdy(k) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 1006 ENDDO 1007 ! 1008 !-- Urban surfaces 1009 surf_s = surf_usm_v(l)%start_index(j,i) 1010 surf_e = surf_usm_v(l)%end_index(j,i) 1011 DO m = surf_s, surf_e 1012 k = surf_usm_v(l)%k(m) 1013 usvs = surf_usm_v(l)%mom_flux_tke(0,m) 1014 wsvs = surf_usm_v(l)%mom_flux_tke(1,m) 1015 1016 km_neutral = kappa * ( usvs**2 + wsvs**2 )**0.25_wp & 1017 * 0.5_wp * dy 1018 ! 1019 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 1020 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 1021 BTEST( wall_flags_0(k,j-1,i), 0 ) ) 1022 dudy(k) = sign_dir * usvs / ( km_neutral + 1E-10_wp ) 1023 dwdy(k) = sign_dir * wsvs / ( km_neutral + 1E-10_wp ) 1024 ENDDO 1025 ENDDO 1026 ! 1027 !-- Compute gradients at east- and west-facing walls 1028 DO l = 2, 3 1029 ! 1030 !-- Default surfaces 1031 surf_s = surf_def_v(l)%start_index(j,i) 1032 surf_e = surf_def_v(l)%end_index(j,i) 1033 DO m = surf_s, surf_e 1034 k = surf_def_v(l)%k(m) 1035 vsus = surf_def_v(l)%mom_flux_tke(0,m) 1036 wsus = surf_def_v(l)%mom_flux_tke(1,m) 1037 1038 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 1039 * 0.5_wp * dx 1040 ! 1041 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 1042 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 1043 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 1044 dvdx(k) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 1045 dwdx(k) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 1046 ENDDO 1047 ! 1048 !-- Natural surfaces 1049 surf_s = surf_lsm_v(l)%start_index(j,i) 1050 surf_e = surf_lsm_v(l)%end_index(j,i) 1051 DO m = surf_s, surf_e 1052 k = surf_lsm_v(l)%k(m) 1053 vsus = surf_lsm_v(l)%mom_flux_tke(0,m) 1054 wsus = surf_lsm_v(l)%mom_flux_tke(1,m) 1055 1056 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 1057 * 0.5_wp * dx 1058 ! 1059 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 1060 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 1061 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 1062 dvdx(k) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 1063 dwdx(k) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 1064 ENDDO 1065 ! 1066 !-- Urban surfaces 1067 surf_s = surf_usm_v(l)%start_index(j,i) 1068 surf_e = surf_usm_v(l)%end_index(j,i) 1069 DO m = surf_s, surf_e 1070 k = surf_usm_v(l)%k(m) 1071 vsus = surf_usm_v(l)%mom_flux_tke(0,m) 1072 wsus = surf_usm_v(l)%mom_flux_tke(1,m) 1073 1074 km_neutral = kappa * ( vsus**2 + wsus**2 )**0.25_wp & 1075 * 0.5_wp * dx 1076 ! 1077 !-- -1.0 for right-facing wall, 1.0 for left-facing wall 1078 sign_dir = MERGE( 1.0_wp, -1.0_wp, & 1079 BTEST( wall_flags_0(k,j,i-1), 0 ) ) 1080 dvdx(k) = sign_dir * vsus / ( km_neutral + 1E-10_wp ) 1081 dwdx(k) = sign_dir * wsus / ( km_neutral + 1E-10_wp ) 1082 ENDDO 1083 ENDDO 1084 ! 1085 !-- Compute gradients at upward-facing walls, first for 1086 !-- non-natural default surfaces 1087 surf_s = surf_def_h(0)%start_index(j,i) 1088 surf_e = surf_def_h(0)%end_index(j,i) 1089 DO m = surf_s, surf_e 1090 k = surf_def_h(0)%k(m) 1091 ! 1092 !-- Please note, actually, an interpolation of u_0 and v_0 1093 !-- onto the grid center would be required. However, this 1094 !-- would require several data transfers between 2D-grid and 1095 !-- wall type. The effect of this missing interpolation is 1096 !-- negligible. (See also production_e_init). 1097 dudz(k) = ( u(k+1,j,i) - surf_def_h(0)%u_0(m) ) * dd2zu(k) 1098 dvdz(k) = ( v(k+1,j,i) - surf_def_h(0)%v_0(m) ) * dd2zu(k) 1099 1100 ENDDO 1101 ! 1102 !-- Natural surfaces 1103 surf_s = surf_lsm_h%start_index(j,i) 1104 surf_e = surf_lsm_h%end_index(j,i) 1105 DO m = surf_s, surf_e 1106 k = surf_lsm_h%k(m) 1107 ! 1108 !-- Please note, actually, an interpolation of u_0 and v_0 1109 !-- onto the grid center would be required. However, this 1110 !-- would require several data transfers between 2D-grid and 1111 !-- wall type. The effect of this missing interpolation is 1112 !-- negligible. (See also production_e_init). 1113 dudz(k) = ( u(k+1,j,i) - surf_lsm_h%u_0(m) ) * dd2zu(k) 1114 dvdz(k) = ( v(k+1,j,i) - surf_lsm_h%v_0(m) ) * dd2zu(k) 1115 ENDDO 1116 ! 1117 !-- Urban surfaces 1118 surf_s = surf_usm_h%start_index(j,i) 1119 surf_e = surf_usm_h%end_index(j,i) 1120 DO m = surf_s, surf_e 1121 k = surf_usm_h%k(m) 1122 ! 1123 !-- Please note, actually, an interpolation of u_0 and v_0 1124 !-- onto the grid center would be required. However, this 1125 !-- would require several data transfers between 2D-grid and 1126 !-- wall type. The effect of this missing interpolation is 1127 !-- negligible. (See also production_e_init). 1128 dudz(k) = ( u(k+1,j,i) - surf_usm_h%u_0(m) ) * dd2zu(k) 1129 dvdz(k) = ( v(k+1,j,i) - surf_usm_h%v_0(m) ) * dd2zu(k) 1130 ENDDO 1131 ! 1132 !-- Compute gradients at downward-facing walls, only for 1133 !-- non-natural default surfaces 1134 surf_s = surf_def_h(1)%start_index(j,i) 1135 surf_e = surf_def_h(1)%end_index(j,i) 1136 DO m = surf_s, surf_e 1137 k = surf_def_h(1)%k(m) 1138 ! 1139 !-- Please note, actually, an interpolation of u_0 and v_0 1140 !-- onto the grid center would be required. However, this 1141 !-- would require several data transfers between 2D-grid and 1142 !-- wall type. The effect of this missing interpolation is 1143 !-- negligible. (See also production_e_init). 1144 dudz(k) = ( surf_def_h(1)%u_0(m) - u(k-1,j,i) ) * dd2zu(k) 1145 dvdz(k) = ( surf_def_h(1)%v_0(m) - v(k-1,j,i) ) * dd2zu(k) 1146 1147 ENDDO 1148 1149 DO k = nzb+1, nzt 1150 1151 def = 2.0_wp * ( dudx(k)**2 + dvdy(k)**2 + dwdz(k)**2 ) + & 1152 dudy(k)**2 + dvdx(k)**2 + dwdx(k)**2 + & 1153 dwdy(k)**2 + dudz(k)**2 + dvdz(k)**2 + & 1154 2.0_wp * ( dvdx(k)*dudy(k) + dwdx(k)*dudz(k) + dwdy(k)*dvdz(k) ) 1155 1156 IF ( def < 0.0_wp ) def = 0.0_wp 1157 1158 flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 1159 1160 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def * flag 1161 1162 ENDDO 1163 1164 ELSEIF ( use_surface_fluxes ) THEN 1165 ! 1166 !-- Calculate TKE production by shear. Here, no additional 1167 !-- wall-bounded code is considered. 1168 !-- Why? 1169 DO k = nzb+1, nzt 1170 1171 dudx(k) = ( u(k,j,i+1) - u(k,j,i) ) * ddx 1172 dudy(k) = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - & 1173 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy 1174 dudz(k) = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - & 1175 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k) 1176 1177 dvdx(k) = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - & 1178 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx 1179 dvdy(k) = ( v(k,j+1,i) - v(k,j,i) ) * ddy 1180 dvdz(k) = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - & 1181 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k) 1182 1183 dwdx(k) = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - & 1184 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx 1185 dwdy(k) = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - & 1186 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy 1187 dwdz(k) = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k) 1188 1189 def = 2.0_wp * ( dudx(k)**2 + dvdy(k)**2 + dwdz(k)**2 ) + & 1190 dudy(k)**2 + dvdx(k)**2 + dwdx(k)**2 + & 1191 dwdy(k)**2 + dudz(k)**2 + dvdz(k)**2 + & 1192 2.0_wp * ( dvdx(k)*dudy(k) + dwdx(k)*dudz(k) + dwdy(k)*dvdz(k) ) 1193 1194 IF ( def < 0.0_wp ) def = 0.0_wp 1195 1196 flag = MERGE( 1.0_wp, 0.0_wp, & 1197 BTEST( wall_flags_0(k,j,i), 29 ) ) 1198 tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def * flag 1199 1200 ENDDO 1201 1202 ENDIF 1203 1204 ! 1205 !-- If required, calculate TKE production by buoyancy 1206 IF ( .NOT. neutral ) THEN 1207 1208 IF ( .NOT. humidity ) THEN 1209 1210 IF ( use_single_reference_value ) THEN 1211 1212 IF ( ocean ) THEN 1213 ! 1214 !-- So far in the ocean no special treatment of density flux in 1215 !-- the bottom and top surface layer 1216 DO k = nzb+1, nzt 1217 tend(k,j,i) = tend(k,j,i) + & 1218 kh(k,j,i) * g / rho_reference * & 1219 ( prho(k+1,j,i) - prho(k-1,j,i) ) * & 1220 dd2zu(k) * &