Changeset 4671 for palm/trunk/SOURCE/urban_surface_mod.f90
- Timestamp:
- Sep 9, 2020 8:27:58 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/urban_surface_mod.f90
r4669 r4671 27 27 ! ----------------- 28 28 ! $Id$ 29 ! Radiative transfer model RTM version 4.1 30 ! - Implementation of downward facing USM and LSM surfaces 31 ! - Restructuralization EB call 32 ! - Improved debug logging 33 ! - Removal of deprecated CSV inputs 34 ! - Bugfixes 35 ! Author: J. Resler (Institute of Computer Science, Prague) 36 ! 37 ! 4669 2020-09-09 13:43:47Z pavelkrc 29 38 ! Fix calculation of force_radiation_call 30 39 ! … … 255 264 !> fraq(0,m) + fraq(1,m) = 0?! 256 265 !> @todo Use unit 90 for OPEN/CLOSE of input files (FK) 257 !> @todo Remove reading of old csv inputs258 266 !--------------------------------------------------------------------------------------------------! 259 267 MODULE urban_surface_mod … … 280 288 USE basic_constants_and_equations_mod, & 281 289 ONLY: c_p, & 290 degc_to_k, & 282 291 g, & 283 292 kappa, & 284 293 l_v, & 294 magnus_tl, & 285 295 pi, & 286 296 r_d, & … … 372 382 USE radiation_model_mod, & 373 383 ONLY: albedo_type, & 384 dirname, & 385 diridx, & 386 dirint, & 374 387 force_radiation_call, & 375 388 id, & 389 idown, & 376 390 ieast, & 377 391 inorth, & … … 379 393 iup, & 380 394 iwest, & 395 nd, & 381 396 nz_urban_b, & 382 397 nz_urban_t, & … … 404 419 ind_veg_wall, & 405 420 ind_wat_win, & 421 surf_type, & 406 422 surf_usm_h, & 407 423 surf_usm_v, & … … 461 477 !-- Configuration parameters (they can be setup in PALM config) 462 478 LOGICAL :: force_radiation_call_l = .FALSE. !< flag parameter for unscheduled radiation model calls 463 LOGICAL :: read_wall_temp_3d = .FALSE. !<464 LOGICAL :: usm_anthropogenic_heat = .FALSE. !< flag parameter indicating wheather the anthropogenic heat sources465 !< (e.g.transportation) are used466 LOGICAL :: usm_material_model = .TRUE. !< flag parameter indicating wheather the model of heat in materials is used467 479 LOGICAL :: usm_wall_mod = .FALSE. !< reduces conductivity of the first 2 wall layers by factor 0.1 468 480 469 481 470 482 INTEGER(iwp) :: building_type = 1 !< default building type (preleminary setting) 471 INTEGER(iwp) :: land_category = 2 !< default category for land surface472 INTEGER(iwp) :: pedestrian_category = 2 !< default category for wall surface in pedestrian zone473 483 INTEGER(iwp) :: roof_category = 2 !< default category for root surface 474 484 INTEGER(iwp) :: wall_category = 2 !< default category for wall surface over pedestrian zone … … 640 650 641 651 REAL(wp) :: ground_floor_level = 4.0_wp !< default ground floor level 642 REAL(wp) :: roof_height_limit = 4.0_wp !< height to distinguish between land surfaces and roofs643 644 652 645 653 ! … … 650 658 REAL(wp), DIMENSION(0:135,1:7) :: building_pars !< 651 659 ! 652 !-- Type for surface temperatures at vertical walls. Is not necessary for horizontal walls. 653 TYPE t_surf_vertical 654 REAL(wp), DIMENSION(:), ALLOCATABLE :: t !< 655 END TYPE t_surf_vertical 656 ! 657 !-- Type for wall temperatures at vertical walls. Is not necessary for horizontal walls. 658 TYPE t_wall_vertical 659 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: t !< 660 END TYPE t_wall_vertical 661 662 TYPE surf_type_usm 663 REAL(wp), DIMENSION(:), ALLOCATABLE :: var_usm_1d !< 1D prognostic variable 664 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: var_usm_2d !< 2D prognostic variable 665 END TYPE surf_type_usm 666 667 TYPE(surf_type_usm), POINTER :: m_liq_usm_h !< liquid water reservoir (m), horizontal surface elements 668 TYPE(surf_type_usm), POINTER :: m_liq_usm_h_p !< progn. liquid water reservoir (m), horizontal surface elements 669 670 TYPE(surf_type_usm), TARGET :: m_liq_usm_h_1 !< 671 TYPE(surf_type_usm), TARGET :: m_liq_usm_h_2 !< 672 673 TYPE(surf_type_usm), TARGET :: tm_liq_usm_h_m !< liquid water reservoir tendency (m), horizontal surface elements 674 ! 675 !-- Anthropogenic heat sources 676 INTEGER(iwp) :: naheatlayers = 1 !< number of layers of anthropogenic heat 677 678 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: aheat !< daily average of anthropogenic heat (W/m2) 679 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: aheatprof !< diurnal profiles of anthropogenic heat 680 !< for particular layers 681 682 ! 660 !-- Type for 1d surface variables as surface temperature and liquid water reservoir 661 TYPE surf_type_1d_usm 662 REAL(wp), DIMENSION(:), ALLOCATABLE :: val !< 663 END TYPE surf_type_1d_usm 664 ! 665 !-- Type for 2d surface variables as wall temperature 666 TYPE surf_type_2d_usm 667 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: val !< 668 END TYPE surf_type_2d_usm 683 669 !-- Wall surface model 684 670 !-- Wall surface model constants … … 688 674 689 675 INTEGER(iwp) :: soil_type !< 690 691 692 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: zwn_default = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)693 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: zwn_default_green = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)694 !< normalized soil, wall and roof, window and695 !< green layer depths (m/m)696 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: zwn_default_window = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)697 698 676 699 677 REAL(wp) :: m_total = 0.0_wp !< weighted total water content of the soil (m3/m3) … … 706 684 REAL(wp) :: window_inner_temperature = 295.0_wp !< temperature of the inner window 707 685 !< surface (~22 degrees C) (K) 708 709 686 ! 710 687 !-- Surface and material model variables for walls, ground, roofs 711 REAL(wp), DIMENSION(:), ALLOCATABLE :: zwn !< normalized wall layer depths (m) 712 REAL(wp), DIMENSION(:), ALLOCATABLE :: zwn_green !< normalized green layer depths (m) 713 REAL(wp), DIMENSION(:), ALLOCATABLE :: zwn_window !< normalized window layer depths (m) 714 715 REAL(wp), DIMENSION(:), POINTER :: t_surf_green_h !< 716 REAL(wp), DIMENSION(:), POINTER :: t_surf_green_h_p !< 717 REAL(wp), DIMENSION(:), POINTER :: t_surf_wall_h !< 718 REAL(wp), DIMENSION(:), POINTER :: t_surf_wall_h_p !< 719 REAL(wp), DIMENSION(:), POINTER :: t_surf_window_h !< 720 REAL(wp), DIMENSION(:), POINTER :: t_surf_window_h_p !< 721 722 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_green_h_1 !< 723 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_green_h_2 !< 724 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_wall_h_1 !< 725 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_wall_h_2 !< 726 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_window_h_1 !< 727 REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET :: t_surf_window_h_2 !< 728 729 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_green_v !< 730 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_green_v_p !< 731 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_wall_v !< 732 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_wall_v_p !< 733 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_window_v !< 734 TYPE(t_surf_vertical), DIMENSION(:), POINTER :: t_surf_window_v_p !< 735 736 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_green_v_1 !< 737 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_green_v_2 !< 738 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_wall_v_1 !< 739 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_wall_v_2 !< 740 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_window_v_1 !< 741 TYPE(t_surf_vertical), DIMENSION(0:3), TARGET :: t_surf_window_v_2 !< 688 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_green_h !< 689 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_green_h_p !< 690 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_wall_h !< 691 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_wall_h_p !< 692 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_window_h !< 693 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_window_h_p !< 694 695 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_green_h_1 !< 696 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_green_h_2 !< 697 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_wall_h_1 !< 698 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_wall_h_2 !< 699 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_window_h_1 !< 700 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: t_surf_window_h_2 !< 701 702 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_green_v !< 703 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_green_v_p !< 704 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_wall_v !< 705 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_wall_v_p !< 706 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_window_v !< 707 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: t_surf_window_v_p !< 708 709 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_green_v_1 !< 710 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_green_v_2 !< 711 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_wall_v_1 !< 712 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_wall_v_2 !< 713 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_window_v_1 !< 714 TYPE(surf_type_1d_usm), DIMENSION(0:3), TARGET :: t_surf_window_v_2 !< 742 715 743 716 ! 744 717 !-- Energy balance variables 745 !-- Parameters of the land, roof and wall surfaces 746 REAL(wp), DIMENSION(:,:), POINTER :: fc_h !< 747 REAL(wp), DIMENSION(:,:), POINTER :: rootfr_h !< 748 REAL(wp), DIMENSION(:,:), POINTER :: swc_h !< 749 REAL(wp), DIMENSION(:,:), POINTER :: swc_h_p !< 750 REAL(wp), DIMENSION(:,:), POINTER :: swc_res_h !< 751 REAL(wp), DIMENSION(:,:), POINTER :: swc_sat_h !< 752 REAL(wp), DIMENSION(:,:), POINTER :: t_green_h !< 753 REAL(wp), DIMENSION(:,:), POINTER :: t_green_h_p !< 754 REAL(wp), DIMENSION(:,:), POINTER :: t_wall_h !< 755 REAL(wp), DIMENSION(:,:), POINTER :: t_wall_h_p !< 756 REAL(wp), DIMENSION(:,:), POINTER :: wilt_h !< 757 REAL(wp), DIMENSION(:,:), POINTER :: t_window_h !< 758 REAL(wp), DIMENSION(:,:), POINTER :: t_window_h_p !< 759 760 761 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: fc_h_1 !< 762 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: rootfr_h_1 !< 763 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: swc_h_1 !< 764 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: swc_h_2 !< 765 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: swc_res_h_1 !< 766 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: swc_sat_h_1 !< 767 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_green_h_1 !< 768 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_green_h_2 !< 769 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_wall_h_1 !< 770 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_wall_h_2 !< 771 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: wilt_h_1 !< 772 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_window_h_1 !< 773 REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_window_h_2 !< 774 775 776 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_green_v !< 777 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_green_v_p !< 778 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_wall_v !< 779 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_wall_v_p !< 780 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_window_v !< 781 TYPE(t_wall_vertical), DIMENSION(:), POINTER :: t_window_v_p !< 782 783 784 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_green_v_1 !< 785 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_green_v_2 !< 786 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_wall_v_1 !< 787 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_wall_v_2 !< 788 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_window_v_1 !< 789 TYPE(t_wall_vertical), DIMENSION(0:3), TARGET :: t_window_v_2 !< 790 791 ! 792 !-- Surface and material parameter classes (surface_type) 793 !-- Albedo, emissivity, lambda_surf, roughness, thickness, volumetric heat capacity, thermal conductivity 794 CHARACTER(12), DIMENSION(:), ALLOCATABLE :: surface_type_names !< names of wall types (used only for reports) 795 796 INTEGER(iwp) :: n_surface_types !< number of the wall type categories 797 798 INTEGER(iwp), PARAMETER :: ialbedo = 1 !< albedo of the surface 799 INTEGER(iwp), PARAMETER :: icsurf = 6 !< Surface skin layer heat capacity (J m-2 K-1 ) 800 INTEGER(iwp), PARAMETER :: iemiss = 2 !< emissivity of the surface 801 INTEGER(iwp), PARAMETER :: ilambdah = 9 !< thermal conductivity lambda H 802 !< of the wall (W m-1 K-1 ) 803 INTEGER(iwp), PARAMETER :: ilambdas = 3 !< heat conductivity lambda S between surface 804 !< and material ( W m-2 K-1 ) 805 INTEGER(iwp), PARAMETER :: irhoC = 8 !< volumetric heat capacity rho*C of 806 !< the material ( J m-3 K-1 ) 807 INTEGER(iwp), PARAMETER :: irough = 4 !< roughness length z0 for movements 808 INTEGER(iwp), PARAMETER :: iroughh = 5 !< roughness length z0h for scalars 809 !< (heat, humidity,...) 810 INTEGER(iwp), PARAMETER :: ithick = 7 !< thickness of the surface (wall, roof, land) (m) 811 INTEGER(iwp), PARAMETER :: n_surface_params = 9 !< number of parameters for each type of the wall 812 813 814 INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: surface_type_codes !< codes of wall types 815 816 817 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: surface_params !< parameters of wall types 818 819 ! 718 !-- Parameters of the land, roof and wall surfaces (only for horizontal upward surfaces) 719 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: fc_h !< 720 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: rootfr_h !< 721 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: swc_h !< 722 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: swc_h_p !< 723 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: swc_res_h !< 724 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: swc_sat_h !< 725 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_green_h !< 726 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_green_h_p !< 727 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_wall_h !< 728 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_wall_h_p !< 729 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: wilt_h !< 730 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_window_h !< 731 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_window_h_p !< 732 733 734 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: fc_h_1 !< 735 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: rootfr_h_1 !< 736 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: swc_h_1 !< 737 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: swc_h_2 !< 738 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: swc_res_h_1 !< 739 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: swc_sat_h_1 !< 740 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_green_h_1 !< 741 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_green_h_2 !< 742 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_wall_h_1 !< 743 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_wall_h_2 !< 744 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: wilt_h_1 !< 745 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_window_h_1 !< 746 TYPE(surf_type_2d_usm), DIMENSION(0:1), TARGET :: t_window_h_2 !< 747 748 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_green_v !< 749 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_green_v_p !< 750 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_wall_v !< 751 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_wall_v_p !< 752 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_window_v !< 753 TYPE(surf_type_2d_usm), DIMENSION(:), POINTER :: t_window_v_p !< 754 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_green_v_1 !< 755 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_green_v_2 !< 756 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_wall_v_1 !< 757 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_wall_v_2 !< 758 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_window_v_1 !< 759 TYPE(surf_type_2d_usm), DIMENSION(0:3), TARGET :: t_window_v_2 !< 760 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: m_liq_usm_h !< liquid water reservoir (m), horizontal surface elements 761 TYPE(surf_type_1d_usm), DIMENSION(:), POINTER :: m_liq_usm_h_p !< progn. liquid water reservoir (m), horizontal surface elements 762 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: m_liq_usm_h_1 !< 763 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: m_liq_usm_h_2 !< 764 TYPE(surf_type_1d_usm), DIMENSION(0:1), TARGET :: tm_liq_usm_h_m !< liquid water reservoir tendency (m), horizontal surface elements 820 765 !-- Interfaces of subroutines accessed from outside of this module 821 766 INTERFACE usm_3d_data_averaging … … 851 796 END INTERFACE usm_init_arrays 852 797 853 INTERFACE usm_material_heat_model854 MODULE PROCEDURE usm_material_heat_model855 END INTERFACE usm_material_heat_model856 857 INTERFACE usm_green_heat_model858 MODULE PROCEDURE usm_green_heat_model859 END INTERFACE usm_green_heat_model860 861 798 INTERFACE usm_parin 862 799 MODULE PROCEDURE usm_parin … … 868 805 END INTERFACE usm_rrd_local 869 806 870 INTERFACE usm_ surface_energy_balance871 MODULE PROCEDURE usm_ surface_energy_balance872 END INTERFACE usm_ surface_energy_balance807 INTERFACE usm_energy_balance 808 MODULE PROCEDURE usm_energy_balance 809 END INTERFACE usm_energy_balance 873 810 874 811 INTERFACE usm_swap_timelevel … … 894 831 usm_init, & 895 832 usm_init_arrays, & 896 usm_material_heat_model, &897 833 usm_parin, & 898 834 usm_rrd_local, & 899 usm_ surface_energy_balance,&835 usm_energy_balance, & 900 836 usm_swap_timelevel, & 901 837 usm_wrd_local, & … … 912 848 t_window_h, & 913 849 t_window_v, & 914 usm_anthropogenic_heat, &915 usm_green_heat_model, &916 usm_material_model, &917 850 usm_wall_mod 918 851 … … 941 874 !-- Allocate radiation arrays which are part of the new data type. 942 875 !-- For horizontal surfaces. 943 ALLOCATE ( surf_usm_h%surfhf(1:surf_usm_h%ns) ) 944 ALLOCATE ( surf_usm_h%rad_net_l(1:surf_usm_h%ns) ) 876 DO l = 0, 1 877 ALLOCATE ( surf_usm_h(l)%surfhf(1:surf_usm_h(l)%ns) ) 878 ALLOCATE ( surf_usm_h(l)%rad_net_l(1:surf_usm_h(l)%ns) ) 879 ENDDO 945 880 ! 946 881 !-- For vertical surfaces … … 954 889 !-- Allocate arrays for wall surface model and define pointers 955 890 !-- Allocate array of wall types and wall parameters 956 ALLOCATE ( surf_usm_h%surface_types(1:surf_usm_h%ns) ) 957 ALLOCATE ( surf_usm_h%building_type(1:surf_usm_h%ns) ) 958 ALLOCATE ( surf_usm_h%building_type_name(1:surf_usm_h%ns) ) 959 surf_usm_h%building_type = 0 960 surf_usm_h%building_type_name = 'none' 891 DO l = 0, 1 892 ALLOCATE ( surf_usm_h(l)%surface_types(1:surf_usm_h(l)%ns) ) 893 ALLOCATE ( surf_usm_h(l)%building_type(1:surf_usm_h(l)%ns) ) 894 ALLOCATE ( surf_usm_h(l)%building_type_name(1:surf_usm_h(l)%ns) ) 895 surf_usm_h(l)%building_type = 0 896 surf_usm_h(l)%building_type_name = 'none' 897 ENDDO 961 898 DO l = 0, 3 962 899 ALLOCATE ( surf_usm_v(l)%surface_types(1:surf_usm_v(l)%ns) ) … … 969 906 !-- Allocate albedo_type and albedo. Each surface element has 3 values, 0: wall fraction, 970 907 !-- 1: green fraction, 2: window fraction. 971 ALLOCATE ( surf_usm_h%albedo_type(1:surf_usm_h%ns,0:2) ) 972 ALLOCATE ( surf_usm_h%albedo(1:surf_usm_h%ns,0:2) ) 973 surf_usm_h%albedo_type = albedo_type 908 DO l = 0, 1 909 ALLOCATE ( surf_usm_h(l)%albedo_type(1:surf_usm_h(l)%ns,0:2) ) 910 ALLOCATE ( surf_usm_h(l)%albedo(1:surf_usm_h(l)%ns,0:2) ) 911 surf_usm_h(l)%albedo_type = albedo_type 912 ENDDO 974 913 DO l = 0, 3 975 914 ALLOCATE ( surf_usm_v(l)%albedo_type(1:surf_usm_v(l)%ns,0:2) ) … … 980 919 ! 981 920 !-- Allocate indoor target temperature for summer and winter 982 ALLOCATE ( surf_usm_h%target_temp_summer(1:surf_usm_h%ns) ) 983 ALLOCATE ( surf_usm_h%target_temp_winter(1:surf_usm_h%ns) ) 921 DO l = 0, 1 922 ALLOCATE ( surf_usm_h(l)%target_temp_summer(1:surf_usm_h(l)%ns) ) 923 ALLOCATE ( surf_usm_h(l)%target_temp_winter(1:surf_usm_h(l)%ns) ) 924 ENDDO 984 925 DO l = 0, 3 985 926 ALLOCATE ( surf_usm_v(l)%target_temp_summer(1:surf_usm_v(l)%ns) ) … … 989 930 !-- In case the indoor model is applied, allocate memory for waste heat and indoor temperature. 990 931 IF ( indoor_model ) THEN 991 ALLOCATE ( surf_usm_h%waste_heat(1:surf_usm_h%ns) ) 992 surf_usm_h%waste_heat = 0.0_wp 932 DO l = 0, 1 933 ALLOCATE ( surf_usm_h(l)%waste_heat(1:surf_usm_h(l)%ns) ) 934 surf_usm_h(l)%waste_heat = 0.0_wp 935 ENDDO 993 936 DO l = 0, 3 994 937 ALLOCATE ( surf_usm_v(l)%waste_heat(1:surf_usm_v(l)%ns) ) … … 998 941 ! 999 942 !-- Allocate flag indicating ground floor level surface elements 1000 ALLOCATE ( surf_usm_h%ground_level(1:surf_usm_h%ns) ) 943 DO l = 0, 1 944 ALLOCATE ( surf_usm_h(l)%ground_level(1:surf_usm_h(l)%ns) ) 945 ENDDO 1001 946 DO l = 0, 3 1002 947 ALLOCATE ( surf_usm_v(l)%ground_level(1:surf_usm_v(l)%ns) ) 1003 948 ENDDO 1004 949 ! 1005 !-- Allocate arrays for relative surface fraction. 1006 !-- 0 - wall fraction, 1 - green fraction, 2 - window fraction 1007 ALLOCATE ( surf_usm_h%frac(1:surf_usm_h%ns,0:2) ) 1008 surf_usm_h%frac = 0.0_wp 1009 DO l = 0, 3 1010 ALLOCATE ( surf_usm_v(l)%frac(1:surf_usm_v(l)%ns,0:2) ) 1011 surf_usm_v(l)%frac = 0.0_wp 1012 ENDDO 950 !-- Allocate arrays for relative surface fraction. 951 !-- 0 - wall fraction, 1 - green fraction, 2 - window fraction 952 DO l = 0, 1 953 ALLOCATE ( surf_usm_h(l)%frac(1:surf_usm_h(l)%ns,0:2) ) 954 surf_usm_h(l)%frac = 0.0_wp 955 ENDDO 956 DO l = 0, 3 957 ALLOCATE ( surf_usm_v(l)%frac(1:surf_usm_v(l)%ns,0:2) ) 958 surf_usm_v(l)%frac = 0.0_wp 959 ENDDO 1013 960 1014 961 ! 1015 962 !-- Wall and roof surface parameters. First for horizontal surfaces 1016 ALLOCATE ( surf_usm_h%isroof_surf(1:surf_usm_h%ns) ) 1017 ALLOCATE ( surf_usm_h%lambda_surf(1:surf_usm_h%ns) ) 1018 ALLOCATE ( surf_usm_h%lambda_surf_window(1:surf_usm_h%ns) ) 1019 ALLOCATE ( surf_usm_h%lambda_surf_green(1:surf_usm_h%ns) ) 1020 ALLOCATE ( surf_usm_h%c_surface(1:surf_usm_h%ns) ) 1021 ALLOCATE ( surf_usm_h%c_surface_window(1:surf_usm_h%ns) ) 1022 ALLOCATE ( surf_usm_h%c_surface_green(1:surf_usm_h%ns) ) 1023 ALLOCATE ( surf_usm_h%transmissivity(1:surf_usm_h%ns) ) 1024 ALLOCATE ( surf_usm_h%lai(1:surf_usm_h%ns) ) 1025 ALLOCATE ( surf_usm_h%emissivity(1:surf_usm_h%ns,0:2) ) 1026 ALLOCATE ( surf_usm_h%r_a(1:surf_usm_h%ns) ) 1027 ALLOCATE ( surf_usm_h%r_a_green(1:surf_usm_h%ns) ) 1028 ALLOCATE ( surf_usm_h%r_a_window(1:surf_usm_h%ns) ) 1029 ALLOCATE ( surf_usm_h%green_type_roof(1:surf_usm_h%ns) ) 1030 ALLOCATE ( surf_usm_h%r_s(1:surf_usm_h%ns) ) 1031 963 DO l = 0, 1 964 ALLOCATE ( surf_usm_h(l)%isroof_surf(1:surf_usm_h(l)%ns) ) 965 ALLOCATE ( surf_usm_h(l)%lambda_surf(1:surf_usm_h(l)%ns) ) 966 ALLOCATE ( surf_usm_h(l)%lambda_surf_window(1:surf_usm_h(l)%ns) ) 967 ALLOCATE ( surf_usm_h(l)%lambda_surf_green(1:surf_usm_h(l)%ns) ) 968 ALLOCATE ( surf_usm_h(l)%c_surface(1:surf_usm_h(l)%ns) ) 969 ALLOCATE ( surf_usm_h(l)%c_surface_window(1:surf_usm_h(l)%ns) ) 970 ALLOCATE ( surf_usm_h(l)%c_surface_green(1:surf_usm_h(l)%ns) ) 971 ALLOCATE ( surf_usm_h(l)%transmissivity(1:surf_usm_h(l)%ns) ) 972 ALLOCATE ( surf_usm_h(l)%lai(1:surf_usm_h(l)%ns) ) 973 ALLOCATE ( surf_usm_h(l)%emissivity(1:surf_usm_h(l)%ns,0:2) ) 974 ALLOCATE ( surf_usm_h(l)%r_a(1:surf_usm_h(l)%ns) ) 975 ALLOCATE ( surf_usm_h(l)%r_a_green(1:surf_usm_h(l)%ns) ) 976 ALLOCATE ( surf_usm_h(l)%r_a_window(1:surf_usm_h(l)%ns) ) 977 ALLOCATE ( surf_usm_h(l)%green_type_roof(1:surf_usm_h(l)%ns) ) 978 ALLOCATE ( surf_usm_h(l)%r_s(1:surf_usm_h(l)%ns) ) 979 ENDDO 1032 980 ! 1033 981 !-- For vertical surfaces. … … 1050 998 ! 1051 999 !-- Allocate wall and roof material parameters. First for horizontal surfaces 1052 ALLOCATE ( surf_usm_h%thickness_wall(1:surf_usm_h%ns) ) 1053 ALLOCATE ( surf_usm_h%thickness_window(1:surf_usm_h%ns) ) 1054 ALLOCATE ( surf_usm_h%thickness_green(1:surf_usm_h%ns) ) 1055 ALLOCATE ( surf_usm_h%lambda_h(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1056 ALLOCATE ( surf_usm_h%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1057 ALLOCATE ( surf_usm_h%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1058 ALLOCATE ( surf_usm_h%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1059 ALLOCATE ( surf_usm_h%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1060 ALLOCATE ( surf_usm_h%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1061 1062 ALLOCATE ( surf_usm_h%rho_c_total_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1063 ALLOCATE ( surf_usm_h%n_vg_green(1:surf_usm_h%ns) ) 1064 ALLOCATE ( surf_usm_h%alpha_vg_green(1:surf_usm_h%ns) ) 1065 ALLOCATE ( surf_usm_h%l_vg_green(1:surf_usm_h%ns) ) 1066 ALLOCATE ( surf_usm_h%gamma_w_green_sat(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1067 ALLOCATE ( surf_usm_h%lambda_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1068 ALLOCATE ( surf_usm_h%gamma_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1069 ALLOCATE ( surf_usm_h%tswc_h_m(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1070 1000 DO l = 0, 1 1001 ALLOCATE ( surf_usm_h(l)%thickness_wall(1:surf_usm_h(l)%ns) ) 1002 ALLOCATE ( surf_usm_h(l)%thickness_window(1:surf_usm_h(l)%ns) ) 1003 ALLOCATE ( surf_usm_h(l)%thickness_green(1:surf_usm_h(l)%ns) ) 1004 ALLOCATE ( surf_usm_h(l)%lambda_h(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1005 ALLOCATE ( surf_usm_h(l)%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1006 ALLOCATE ( surf_usm_h(l)%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1007 ALLOCATE ( surf_usm_h(l)%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1008 ALLOCATE ( surf_usm_h(l)%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1009 ALLOCATE ( surf_usm_h(l)%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1010 1011 ALLOCATE ( surf_usm_h(l)%rho_c_total_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1012 ALLOCATE ( surf_usm_h(l)%n_vg_green(1:surf_usm_h(l)%ns) ) 1013 ALLOCATE ( surf_usm_h(l)%alpha_vg_green(1:surf_usm_h(l)%ns) ) 1014 ALLOCATE ( surf_usm_h(l)%l_vg_green(1:surf_usm_h(l)%ns) ) 1015 ALLOCATE ( surf_usm_h(l)%gamma_w_green_sat(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1016 ALLOCATE ( surf_usm_h(l)%lambda_w_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1017 ALLOCATE ( surf_usm_h(l)%gamma_w_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1018 ALLOCATE ( surf_usm_h(l)%tswc_h_m(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1019 ENDDO 1071 1020 ! 1072 1021 !-- For vertical surfaces. … … 1085 1034 ! 1086 1035 !-- Allocate green wall and roof vegetation and soil parameters. First horizontal surfaces 1087 ALLOCATE ( surf_usm_h%g_d(1:surf_usm_h%ns) ) 1088 ALLOCATE ( surf_usm_h%c_liq(1:surf_usm_h%ns) ) 1089 ALLOCATE ( surf_usm_h%qsws_liq(1:surf_usm_h%ns) ) 1090 ALLOCATE ( surf_usm_h%qsws_veg(1:surf_usm_h%ns) ) 1091 ALLOCATE ( surf_usm_h%r_canopy(1:surf_usm_h%ns) ) 1092 ALLOCATE ( surf_usm_h%r_canopy_min(1:surf_usm_h%ns) ) 1093 ALLOCATE ( surf_usm_h%pt_10cm(1:surf_usm_h%ns) ) 1094 1036 DO l = 0, 1 1037 ALLOCATE ( surf_usm_h(l)%g_d(1:surf_usm_h(l)%ns) ) 1038 ALLOCATE ( surf_usm_h(l)%c_liq(1:surf_usm_h(l)%ns) ) 1039 ALLOCATE ( surf_usm_h(l)%qsws_liq(1:surf_usm_h(l)%ns) ) 1040 ALLOCATE ( surf_usm_h(l)%qsws_veg(1:surf_usm_h(l)%ns) ) 1041 ALLOCATE ( surf_usm_h(l)%r_canopy(1:surf_usm_h(l)%ns) ) 1042 ALLOCATE ( surf_usm_h(l)%r_canopy_min(1:surf_usm_h(l)%ns) ) 1043 ALLOCATE ( surf_usm_h(l)%pt_10cm(1:surf_usm_h(l)%ns) ) 1044 ENDDO 1095 1045 ! 1096 1046 !-- For vertical surfaces. … … 1107 1057 ! 1108 1058 !-- Allocate wall and roof layers sizes. For horizontal surfaces. 1109 ALLOCATE ( zwn(nzb_wall:nzt_wall) ) 1110 ALLOCATE ( surf_usm_h%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1111 ALLOCATE ( zwn_window(nzb_wall:nzt_wall) ) 1112 ALLOCATE ( surf_usm_h%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1113 ALLOCATE ( zwn_green(nzb_wall:nzt_wall) ) 1114 ALLOCATE ( surf_usm_h%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1115 ALLOCATE ( surf_usm_h%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1116 ALLOCATE ( surf_usm_h%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1117 ALLOCATE ( surf_usm_h%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1118 ALLOCATE ( surf_usm_h%zw(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1119 ALLOCATE ( surf_usm_h%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1120 ALLOCATE ( surf_usm_h%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1121 ALLOCATE ( surf_usm_h%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1122 ALLOCATE ( surf_usm_h%zw_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1123 ALLOCATE ( surf_usm_h%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1124 ALLOCATE ( surf_usm_h%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1125 ALLOCATE ( surf_usm_h%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1126 ALLOCATE ( surf_usm_h%zw_green(nzb_wall:nzt_wall,1:surf_usm_h%ns) ) 1059 DO l = 0, 1 1060 ALLOCATE ( surf_usm_h(l)%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1061 ALLOCATE ( surf_usm_h(l)%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1062 ALLOCATE ( surf_usm_h(l)%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1063 ALLOCATE ( surf_usm_h(l)%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1064 ALLOCATE ( surf_usm_h(l)%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1065 ALLOCATE ( surf_usm_h(l)%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1066 ALLOCATE ( surf_usm_h(l)%zw(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1067 ALLOCATE ( surf_usm_h(l)%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1068 ALLOCATE ( surf_usm_h(l)%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1069 ALLOCATE ( surf_usm_h(l)%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1070 ALLOCATE ( surf_usm_h(l)%zw_window(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1071 ALLOCATE ( surf_usm_h(l)%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1072 ALLOCATE ( surf_usm_h(l)%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1073 ALLOCATE ( surf_usm_h(l)%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1074 ALLOCATE ( surf_usm_h(l)%zw_green(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1075 ENDDO 1127 1076 1128 1077 ! … … 1149 1098 !-- Allocate wall and roof temperature arrays, for horizontal walls. 1150 1099 !-- Allocate if required. Note, in case of restarts, some of these arrays might be already allocated. 1151 IF ( .NOT. ALLOCATED( t_surf_wall_h_1 ) ) & 1152 ALLOCATE ( t_surf_wall_h_1(1:surf_usm_h%ns) ) 1153 IF ( .NOT. ALLOCATED( t_surf_wall_h_2 ) ) & 1154 ALLOCATE ( t_surf_wall_h_2(1:surf_usm_h%ns) ) 1155 IF ( .NOT. ALLOCATED( t_wall_h_1 ) ) & 1156 ALLOCATE ( t_wall_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1157 IF ( .NOT. ALLOCATED( t_wall_h_2 ) ) & 1158 ALLOCATE ( t_wall_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1159 IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) ) & 1160 ALLOCATE ( t_surf_window_h_1(1:surf_usm_h%ns) ) 1161 IF ( .NOT. ALLOCATED( t_surf_window_h_2 ) ) & 1162 ALLOCATE ( t_surf_window_h_2(1:surf_usm_h%ns) ) 1163 IF ( .NOT. ALLOCATED( t_window_h_1 ) ) & 1164 ALLOCATE ( t_window_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1165 IF ( .NOT. ALLOCATED( t_window_h_2 ) ) & 1166 ALLOCATE ( t_window_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1167 IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) ) & 1168 ALLOCATE ( t_surf_green_h_1(1:surf_usm_h%ns) ) 1169 IF ( .NOT. ALLOCATED( t_surf_green_h_2 ) ) & 1170 ALLOCATE ( t_surf_green_h_2(1:surf_usm_h%ns) ) 1171 IF ( .NOT. ALLOCATED( t_green_h_1 ) ) & 1172 ALLOCATE ( t_green_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1173 IF ( .NOT. ALLOCATED( t_green_h_2 ) ) & 1174 ALLOCATE ( t_green_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1175 IF ( .NOT. ALLOCATED( swc_h_1 ) ) & 1176 ALLOCATE ( swc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1177 IF ( .NOT. ALLOCATED( swc_sat_h_1 ) ) & 1178 ALLOCATE ( swc_sat_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1179 IF ( .NOT. ALLOCATED( swc_res_h_1 ) ) & 1180 ALLOCATE ( swc_res_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1181 IF ( .NOT. ALLOCATED( swc_h_2 ) ) & 1182 ALLOCATE ( swc_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1183 IF ( .NOT. ALLOCATED( rootfr_h_1 ) ) & 1184 ALLOCATE ( rootfr_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1185 IF ( .NOT. ALLOCATED( wilt_h_1 ) ) & 1186 ALLOCATE ( wilt_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1187 IF ( .NOT. ALLOCATED( fc_h_1 ) ) & 1188 ALLOCATE ( fc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1189 1190 IF ( .NOT. ALLOCATED( m_liq_usm_h_1%var_usm_1d ) ) & 1191 ALLOCATE ( m_liq_usm_h_1%var_usm_1d(1:surf_usm_h%ns) ) 1192 IF ( .NOT. ALLOCATED( m_liq_usm_h_2%var_usm_1d ) ) & 1193 ALLOCATE ( m_liq_usm_h_2%var_usm_1d(1:surf_usm_h%ns) ) 1194 1100 DO l = 0, 1 1101 IF ( .NOT. ALLOCATED( t_surf_wall_h_1(l)%val ) ) & 1102 ALLOCATE ( t_surf_wall_h_1(l)%val(1:surf_usm_h(l)%ns) ) 1103 IF ( .NOT. ALLOCATED( t_surf_wall_h_2(l)%val ) ) & 1104 ALLOCATE ( t_surf_wall_h_2(l)%val(1:surf_usm_h(l)%ns) ) 1105 IF ( .NOT. ALLOCATED( t_wall_h_1(l)%val ) ) & 1106 ALLOCATE ( t_wall_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1107 IF ( .NOT. ALLOCATED( t_wall_h_2(l)%val ) ) & 1108 ALLOCATE ( t_wall_h_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1109 IF ( .NOT. ALLOCATED( t_surf_window_h_1(l)%val ) ) & 1110 ALLOCATE ( t_surf_window_h_1(l)%val(1:surf_usm_h(l)%ns) ) 1111 IF ( .NOT. ALLOCATED( t_surf_window_h_2(l)%val ) ) & 1112 ALLOCATE ( t_surf_window_h_2(l)%val(1:surf_usm_h(l)%ns) ) 1113 IF ( .NOT. ALLOCATED( t_window_h_1(l)%val ) ) & 1114 ALLOCATE ( t_window_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1115 IF ( .NOT. ALLOCATED( t_window_h_2(l)%val ) ) & 1116 ALLOCATE ( t_window_h_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1117 IF ( .NOT. ALLOCATED( t_surf_green_h_1(l)%val ) ) & 1118 ALLOCATE ( t_surf_green_h_1(l)%val(1:surf_usm_h(l)%ns) ) 1119 IF ( .NOT. ALLOCATED( t_surf_green_h_2(l)%val ) ) & 1120 ALLOCATE ( t_surf_green_h_2(l)%val(1:surf_usm_h(l)%ns) ) 1121 IF ( .NOT. ALLOCATED( t_green_h_1(l)%val ) ) & 1122 ALLOCATE ( t_green_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1123 IF ( .NOT. ALLOCATED( t_green_h_2(l)%val ) ) & 1124 ALLOCATE ( t_green_h_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1125 IF ( .NOT. ALLOCATED( swc_h_1(l)%val ) ) & 1126 ALLOCATE ( swc_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1127 IF ( .NOT. ALLOCATED( swc_sat_h_1(l)%val ) ) & 1128 ALLOCATE ( swc_sat_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1129 IF ( .NOT. ALLOCATED( swc_res_h_1(l)%val ) ) & 1130 ALLOCATE ( swc_res_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1131 IF ( .NOT. ALLOCATED( swc_h_2(l)%val ) ) & 1132 ALLOCATE ( swc_h_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1133 IF ( .NOT. ALLOCATED( rootfr_h_1(l)%val ) ) & 1134 ALLOCATE ( rootfr_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1135 IF ( .NOT. ALLOCATED( wilt_h_1(l)%val ) ) & 1136 ALLOCATE ( wilt_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1137 IF ( .NOT. ALLOCATED( fc_h_1(l)%val ) ) & 1138 ALLOCATE ( fc_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1139 1140 IF ( .NOT. ALLOCATED( m_liq_usm_h_1(l)%val ) ) & 1141 ALLOCATE ( m_liq_usm_h_1(l)%val(1:surf_usm_h(l)%ns) ) 1142 IF ( .NOT. ALLOCATED( m_liq_usm_h_2(l)%val ) ) & 1143 ALLOCATE ( m_liq_usm_h_2(l)%val(1:surf_usm_h(l)%ns) ) 1144 ENDDO 1195 1145 ! 1196 1146 !-- Initial assignment of the pointers … … 1213 1163 !-- Allocate if required. Note, in case of restarts, some of these arrays might be already allocated. 1214 1164 DO l = 0, 3 1215 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)% t) ) &1216 ALLOCATE ( t_surf_wall_v_1(l)% t(1:surf_usm_v(l)%ns) )1217 IF ( .NOT. ALLOCATED( t_surf_wall_v_2(l)% t) ) &1218 ALLOCATE ( t_surf_wall_v_2(l)% t(1:surf_usm_v(l)%ns) )1219 IF ( .NOT. ALLOCATED( t_wall_v_1(l)% t) ) &1220 ALLOCATE ( t_wall_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1221 IF ( .NOT. ALLOCATED( t_wall_v_2(l)% t) ) &1222 ALLOCATE ( t_wall_v_2(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1223 IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)% t) ) &1224 ALLOCATE ( t_surf_window_v_1(l)% t(1:surf_usm_v(l)%ns) )1225 IF ( .NOT. ALLOCATED( t_surf_window_v_2(l)% t) ) &1226 ALLOCATE ( t_surf_window_v_2(l)% t(1:surf_usm_v(l)%ns) )1227 IF ( .NOT. ALLOCATED( t_window_v_1(l)% t) ) &1228 ALLOCATE ( t_window_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1229 IF ( .NOT. ALLOCATED( t_window_v_2(l)% t) ) &1230 ALLOCATE ( t_window_v_2(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1231 IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)% t) ) &1232 ALLOCATE ( t_surf_green_v_1(l)% t(1:surf_usm_v(l)%ns) )1233 IF ( .NOT. ALLOCATED( t_surf_green_v_2(l)% t) ) &1234 ALLOCATE ( t_surf_green_v_2(l)% t(1:surf_usm_v(l)%ns) )1235 IF ( .NOT. ALLOCATED( t_green_v_1(l)% t) ) &1236 ALLOCATE ( t_green_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1237 IF ( .NOT. ALLOCATED( t_green_v_2(l)% t) ) &1238 ALLOCATE ( t_green_v_2(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )1165 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)%val ) ) & 1166 ALLOCATE ( t_surf_wall_v_1(l)%val(1:surf_usm_v(l)%ns) ) 1167 IF ( .NOT. ALLOCATED( t_surf_wall_v_2(l)%val ) ) & 1168 ALLOCATE ( t_surf_wall_v_2(l)%val(1:surf_usm_v(l)%ns) ) 1169 IF ( .NOT. ALLOCATED( t_wall_v_1(l)%val ) ) & 1170 ALLOCATE ( t_wall_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1171 IF ( .NOT. ALLOCATED( t_wall_v_2(l)%val ) ) & 1172 ALLOCATE ( t_wall_v_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1173 IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)%val ) ) & 1174 ALLOCATE ( t_surf_window_v_1(l)%val(1:surf_usm_v(l)%ns) ) 1175 IF ( .NOT. ALLOCATED( t_surf_window_v_2(l)%val ) ) & 1176 ALLOCATE ( t_surf_window_v_2(l)%val(1:surf_usm_v(l)%ns) ) 1177 IF ( .NOT. ALLOCATED( t_window_v_1(l)%val ) ) & 1178 ALLOCATE ( t_window_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1179 IF ( .NOT. ALLOCATED( t_window_v_2(l)%val ) ) & 1180 ALLOCATE ( t_window_v_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1181 IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)%val ) ) & 1182 ALLOCATE ( t_surf_green_v_1(l)%val(1:surf_usm_v(l)%ns) ) 1183 IF ( .NOT. ALLOCATED( t_surf_green_v_2(l)%val ) ) & 1184 ALLOCATE ( t_surf_green_v_2(l)%val(1:surf_usm_v(l)%ns) ) 1185 IF ( .NOT. ALLOCATED( t_green_v_1(l)%val ) ) & 1186 ALLOCATE ( t_green_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1187 IF ( .NOT. ALLOCATED( t_green_v_2(l)%val ) ) & 1188 ALLOCATE ( t_green_v_2(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 1239 1189 ENDDO 1240 1190 ! … … 1249 1199 ! 1250 1200 !-- Allocate intermediate timestep arrays. For horizontal surfaces. 1251 ALLOCATE ( surf_usm_h%tt_surface_wall_m(1:surf_usm_h%ns) ) 1252 ALLOCATE ( surf_usm_h%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1253 ALLOCATE ( surf_usm_h%tt_surface_window_m(1:surf_usm_h%ns) ) 1254 ALLOCATE ( surf_usm_h%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1255 ALLOCATE ( surf_usm_h%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 1256 ALLOCATE ( surf_usm_h%tt_surface_green_m(1:surf_usm_h%ns) ) 1257 1258 ! 1259 !-- Allocate intermediate timestep arrays 1260 !-- Horizontal surfaces 1261 ALLOCATE ( tm_liq_usm_h_m%var_usm_1d(1:surf_usm_h%ns) ) 1262 tm_liq_usm_h_m%var_usm_1d = 0.0_wp 1263 ! 1264 !-- Set inital values for prognostic quantities 1265 IF ( ALLOCATED( surf_usm_h%tt_surface_wall_m ) ) surf_usm_h%tt_surface_wall_m = 0.0_wp 1266 IF ( ALLOCATED( surf_usm_h%tt_wall_m ) ) surf_usm_h%tt_wall_m = 0.0_wp 1267 IF ( ALLOCATED( surf_usm_h%tt_surface_window_m ) ) surf_usm_h%tt_surface_window_m = 0.0_wp 1268 IF ( ALLOCATED( surf_usm_h%tt_window_m ) ) surf_usm_h%tt_window_m = 0.0_wp 1269 IF ( ALLOCATED( surf_usm_h%tt_green_m ) ) surf_usm_h%tt_green_m = 0.0_wp 1270 IF ( ALLOCATED( surf_usm_h%tt_surface_green_m ) ) surf_usm_h%tt_surface_green_m = 0.0_wp 1201 DO l = 0, 1 1202 ALLOCATE ( surf_usm_h(l)%tt_surface_wall_m(1:surf_usm_h(l)%ns) ) 1203 ALLOCATE ( surf_usm_h(l)%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1204 ALLOCATE ( surf_usm_h(l)%tt_surface_window_m(1:surf_usm_h(l)%ns) ) 1205 ALLOCATE ( surf_usm_h(l)%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1206 ALLOCATE ( surf_usm_h(l)%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 1207 ALLOCATE ( surf_usm_h(l)%tt_surface_green_m(1:surf_usm_h(l)%ns) ) 1208 ! 1209 !-- Allocate intermediate timestep arrays 1210 !-- Horizontal surfaces 1211 ALLOCATE ( tm_liq_usm_h_m(l)%val(1:surf_usm_h(l)%ns) ) 1212 tm_liq_usm_h_m(l)%val = 0.0_wp 1213 ! 1214 !-- Set inital values for prognostic quantities 1215 IF ( ALLOCATED( surf_usm_h(l)%tt_surface_wall_m ) ) surf_usm_h(l)%tt_surface_wall_m = 0.0_wp 1216 IF ( ALLOCATED( surf_usm_h(l)%tt_wall_m ) ) surf_usm_h(l)%tt_wall_m = 0.0_wp 1217 IF ( ALLOCATED( surf_usm_h(l)%tt_surface_window_m ) ) surf_usm_h(l)%tt_surface_window_m = 0.0_wp 1218 IF ( ALLOCATED( surf_usm_h(l)%tt_window_m ) ) surf_usm_h(l)%tt_window_m = 0.0_wp 1219 IF ( ALLOCATED( surf_usm_h(l)%tt_green_m ) ) surf_usm_h(l)%tt_green_m = 0.0_wp 1220 IF ( ALLOCATED( surf_usm_h(l)%tt_surface_green_m ) ) surf_usm_h(l)%tt_surface_green_m = 0.0_wp 1221 END DO 1271 1222 ! 1272 1223 !-- Now, for vertical surfaces … … 1287 1238 ! 1288 1239 !-- Allocate wall heat flux output arrays and set initial values. For horizontal surfaces 1289 ! ALLOCATE ( surf_usm_h%wshf(1:surf_usm_h%ns) ) !can be removed 1290 ALLOCATE ( surf_usm_h%ghf(1:surf_usm_h%ns) ) 1291 ALLOCATE ( surf_usm_h%wshf_eb(1:surf_usm_h%ns) ) 1292 ALLOCATE ( surf_usm_h%wghf_eb(1:surf_usm_h%ns) ) 1293 ALLOCATE ( surf_usm_h%wghf_eb_window(1:surf_usm_h%ns) ) 1294 ALLOCATE ( surf_usm_h%wghf_eb_green(1:surf_usm_h%ns) ) 1295 ALLOCATE ( surf_usm_h%iwghf_eb(1:surf_usm_h%ns) ) 1296 ALLOCATE ( surf_usm_h%iwghf_eb_window(1:surf_usm_h%ns) ) 1297 IF ( ALLOCATED( surf_usm_h%ghf ) ) surf_usm_h%ghf = 0.0_wp 1298 IF ( ALLOCATED( surf_usm_h%wshf ) ) surf_usm_h%wshf = 0.0_wp 1299 IF ( ALLOCATED( surf_usm_h%wshf_eb ) ) surf_usm_h%wshf_eb = 0.0_wp 1300 IF ( ALLOCATED( surf_usm_h%wghf_eb ) ) surf_usm_h%wghf_eb = 0.0_wp 1301 IF ( ALLOCATED( surf_usm_h%wghf_eb_window ) ) surf_usm_h%wghf_eb_window = 0.0_wp 1302 IF ( ALLOCATED( surf_usm_h%wghf_eb_green ) ) surf_usm_h%wghf_eb_green = 0.0_wp 1303 IF ( ALLOCATED( surf_usm_h%iwghf_eb ) ) surf_usm_h%iwghf_eb = 0.0_wp 1304 IF ( ALLOCATED( surf_usm_h%iwghf_eb_window ) ) surf_usm_h%iwghf_eb_window = 0.0_wp 1240 DO l = 0, 1 1241 ! ALLOCATE ( surf_usm_h(l)%wshf(1:surf_usm_h(l)%ns) ) !can be removed 1242 ALLOCATE ( surf_usm_h(l)%ghf(1:surf_usm_h(l)%ns) ) 1243 ALLOCATE ( surf_usm_h(l)%wshf_eb(1:surf_usm_h(l)%ns) ) 1244 ALLOCATE ( surf_usm_h(l)%wghf_eb(1:surf_usm_h(l)%ns) ) 1245 ALLOCATE ( surf_usm_h(l)%wghf_eb_window(1:surf_usm_h(l)%ns) ) 1246 ALLOCATE ( surf_usm_h(l)%wghf_eb_green(1:surf_usm_h(l)%ns) ) 1247 ALLOCATE ( surf_usm_h(l)%iwghf_eb(1:surf_usm_h(l)%ns) ) 1248 ALLOCATE ( surf_usm_h(l)%iwghf_eb_window(1:surf_usm_h(l)%ns) ) 1249 IF ( ALLOCATED( surf_usm_h(l)%ghf ) ) surf_usm_h(l)%ghf = 0.0_wp 1250 IF ( ALLOCATED( surf_usm_h(l)%wshf ) ) surf_usm_h(l)%wshf = 0.0_wp 1251 IF ( ALLOCATED( surf_usm_h(l)%wshf_eb ) ) surf_usm_h(l)%wshf_eb = 0.0_wp 1252 IF ( ALLOCATED( surf_usm_h(l)%wghf_eb ) ) surf_usm_h(l)%wghf_eb = 0.0_wp 1253 IF ( ALLOCATED( surf_usm_h(l)%wghf_eb_window ) ) surf_usm_h(l)%wghf_eb_window = 0.0_wp 1254 IF ( ALLOCATED( surf_usm_h(l)%wghf_eb_green ) ) surf_usm_h(l)%wghf_eb_green = 0.0_wp 1255 IF ( ALLOCATED( surf_usm_h(l)%iwghf_eb ) ) surf_usm_h(l)%iwghf_eb = 0.0_wp 1256 IF ( ALLOCATED( surf_usm_h(l)%iwghf_eb_window ) ) surf_usm_h(l)%iwghf_eb_window = 0.0_wp 1257 ENDDO 1305 1258 ! 1306 1259 !-- Now, for vertical surfaces … … 1348 1301 INTEGER(iwp) :: i, j, k, l, m, ids, idsint, iwl, istat !< runnin indices 1349 1302 CHARACTER(LEN=varnamelength) :: var !< trimmed variable 1350 INTEGER(iwp), PARAMETER :: nd = 5 !< number of directions 1351 CHARACTER(LEN=6), DIMENSION(0:nd-1), PARAMETER :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /) 1352 INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER :: dirint = (/ iup, isouth, inorth, iwest, ieast /) 1353 1354 1355 1356 1357 IF ( variable(1:4) == 'usm_' ) THEN ! Is such a check really required? 1303 LOGICAL :: horizontal 1304 1305 IF ( .NOT. variable(1:4) == 'usm_' ) RETURN ! Is such a check really required? 1358 1306 1359 1307 ! … … 1368 1316 ids = i 1369 1317 idsint = dirint(ids) 1318 l = diridx(ids) !> index of direction for _h and _v arrays 1370 1319 var = var(:k-j) 1371 1320 EXIT 1372 1321 ENDIF 1373 1322 ENDDO 1374 l = idsint - 2 ! Horizontal direction index - terrible hack !1375 IF ( l < 0 .OR. l > 3 ) THEN1376 l = -11377 ENDIF1378 1323 IF ( ids == -1 ) THEN 1379 1324 var = TRIM( variable ) 1325 ELSE 1326 !-- Horizontal direction flag 1327 IF ( idsint == iup .OR. idsint == idown ) THEN 1328 horizontal = .TRUE. 1329 ELSE 1330 horizontal = .FALSE. 1331 ENDIF 1380 1332 ENDIF 1381 1333 IF ( var(1:11) == 'usm_t_wall_' .AND. len( TRIM( var ) ) >= 12 ) THEN 1382 1334 ! 1383 !-- 1384 1385 1386 1387 1388 ! 1389 !-- 1390 1391 1335 !-- Wall layers 1336 READ( var(12:12), '(I1)', iostat=istat ) iwl 1337 IF ( istat == 0 .AND. iwl >= nzb_wall .AND. iwl <= nzt_wall ) THEN 1338 var = var(1:10) 1339 ELSE 1340 ! 1341 !-- Wrong wall layer index 1342 RETURN 1343 ENDIF 1392 1344 ENDIF 1393 1345 IF ( var(1:13) == 'usm_t_window_' .AND. len( TRIM(var) ) >= 14 ) THEN … … 1436 1388 !-- Array of sensible heat flux from surfaces 1437 1389 !-- Land surfaces 1438 IF ( l == -1) THEN1439 IF ( .NOT. ALLOCATED( surf_usm_h %wshf_eb_av ) ) THEN1440 ALLOCATE ( surf_usm_h %wshf_eb_av(1:surf_usm_h%ns) )1441 surf_usm_h %wshf_eb_av = 0.0_wp1390 IF ( horizontal ) THEN 1391 IF ( .NOT. ALLOCATED( surf_usm_h(l)%wshf_eb_av ) ) THEN 1392 ALLOCATE ( surf_usm_h(l)%wshf_eb_av(1:surf_usm_h(l)%ns) ) 1393 surf_usm_h(l)%wshf_eb_av = 0.0_wp 1442 1394 ENDIF 1443 1395 ELSE … … 1452 1404 !-- Array of latent heat flux from surfaces 1453 1405 !-- Land surfaces 1454 IF ( l == -1 .AND. .NOT. ALLOCATED( surf_usm_h%qsws_av ) ) THEN1455 ALLOCATE ( surf_usm_h %qsws_av(1:surf_usm_h%ns) )1456 surf_usm_h %qsws_av = 0.0_wp1406 IF ( horizontal .AND. .NOT. ALLOCATED( surf_usm_h(l)%qsws_av ) ) THEN 1407 ALLOCATE ( surf_usm_h(l)%qsws_av(1:surf_usm_h(l)%ns) ) 1408 surf_usm_h(l)%qsws_av = 0.0_wp 1457 1409 ELSE 1458 1410 IF ( .NOT. ALLOCATED( surf_usm_v(l)%qsws_av ) ) THEN … … 1466 1418 !-- Array of latent heat flux from vegetation surfaces 1467 1419 !-- Land surfaces 1468 IF ( l == -1 .AND. .NOT. ALLOCATED( surf_usm_h%qsws_veg_av ) ) THEN1469 ALLOCATE ( surf_usm_h %qsws_veg_av(1:surf_usm_h%ns) )1470 surf_usm_h %qsws_veg_av = 0.0_wp1420 IF ( horizontal .AND. .NOT. ALLOCATED( surf_usm_h(l)%qsws_veg_av ) ) THEN 1421 ALLOCATE ( surf_usm_h(l)%qsws_veg_av(1:surf_usm_h(l)%ns) ) 1422 surf_usm_h(l)%qsws_veg_av = 0.0_wp 1471 1423 ELSE 1472 1424 IF ( .NOT. ALLOCATED( surf_usm_v(l)%qsws_veg_av ) ) THEN … … 1480 1432 !-- Array of latent heat flux from surfaces with liquid 1481 1433 !-- Land surfaces 1482 IF ( l == -1 .AND. .NOT. ALLOCATED( surf_usm_h%qsws_liq_av ) ) THEN1483 ALLOCATE ( surf_usm_h %qsws_liq_av(1:surf_usm_h%ns) )1484 surf_usm_h %qsws_liq_av = 0.0_wp1434 IF ( horizontal .AND. .NOT. ALLOCATED( surf_usm_h(l)%qsws_liq_av ) ) THEN 1435 ALLOCATE ( surf_usm_h(l)%qsws_liq_av(1:surf_usm_h(l)%ns) ) 1436 surf_usm_h(l)%qsws_liq_av = 0.0_wp 1485 1437 ELSE 1486 1438 IF ( .NOT. ALLOCATED( surf_usm_v(l)%qsws_liq_av ) ) THEN … … 1496 1448 ! 1497 1449 !-- Array of heat flux from ground (wall, roof, land) 1498 IF ( l == -1) THEN1499 IF ( .NOT. ALLOCATED( surf_usm_h %wghf_eb_av ) ) THEN1500 ALLOCATE ( surf_usm_h %wghf_eb_av(1:surf_usm_h%ns) )1501 surf_usm_h %wghf_eb_av = 0.0_wp1450 IF ( horizontal ) THEN 1451 IF ( .NOT. ALLOCATED( surf_usm_h(l)%wghf_eb_av ) ) THEN 1452 ALLOCATE ( surf_usm_h(l)%wghf_eb_av(1:surf_usm_h(l)%ns) ) 1453 surf_usm_h(l)%wghf_eb_av = 0.0_wp 1502 1454 ENDIF 1503 1455 ELSE … … 1511 1463 ! 1512 1464 !-- Array of heat flux from window ground (wall, roof, land) 1513 IF ( l == -1) THEN1514 IF ( .NOT. ALLOCATED( surf_usm_h %wghf_eb_window_av ) ) THEN1515 ALLOCATE ( surf_usm_h %wghf_eb_window_av(1:surf_usm_h%ns) )1516 surf_usm_h %wghf_eb_window_av = 0.0_wp1465 IF ( horizontal ) THEN 1466 IF ( .NOT. ALLOCATED( surf_usm_h(l)%wghf_eb_window_av ) ) THEN 1467 ALLOCATE ( surf_usm_h(l)%wghf_eb_window_av(1:surf_usm_h(l)%ns) ) 1468 surf_usm_h(l)%wghf_eb_window_av = 0.0_wp 1517 1469 ENDIF 1518 1470 ELSE … … 1526 1478 ! 1527 1479 !-- Array of heat flux from green ground (wall, roof, land) 1528 IF ( l == -1) THEN1529 IF ( .NOT. ALLOCATED( surf_usm_h %wghf_eb_green_av ) ) THEN1530 ALLOCATE ( surf_usm_h %wghf_eb_green_av(1:surf_usm_h%ns) )1531 surf_usm_h %wghf_eb_green_av = 0.0_wp1480 IF ( horizontal ) THEN 1481 IF ( .NOT. ALLOCATED( surf_usm_h(l)%wghf_eb_green_av ) ) THEN 1482 ALLOCATE ( surf_usm_h(l)%wghf_eb_green_av(1:surf_usm_h(l)%ns) ) 1483 surf_usm_h(l)%wghf_eb_green_av = 0.0_wp 1532 1484 ENDIF 1533 1485 ELSE … … 1541 1493 ! 1542 1494 !-- Array of heat flux from indoor ground (wall, roof, land) 1543 IF ( l == -1) THEN1544 IF ( .NOT. ALLOCATED( surf_usm_h %iwghf_eb_av ) ) THEN1545 ALLOCATE ( surf_usm_h %iwghf_eb_av(1:surf_usm_h%ns) )1546 surf_usm_h %iwghf_eb_av = 0.0_wp1495 IF ( horizontal ) THEN 1496 IF ( .NOT. ALLOCATED( surf_usm_h(l)%iwghf_eb_av ) ) THEN 1497 ALLOCATE ( surf_usm_h(l)%iwghf_eb_av(1:surf_usm_h(l)%ns) ) 1498 surf_usm_h(l)%iwghf_eb_av = 0.0_wp 1547 1499 ENDIF 1548 1500 ELSE … … 1556 1508 ! 1557 1509 !-- Array of heat flux from indoor window ground (wall, roof, land) 1558 IF ( l == -1) THEN1559 IF ( .NOT. ALLOCATED( surf_usm_h %iwghf_eb_window_av ) ) THEN1560 ALLOCATE ( surf_usm_h %iwghf_eb_window_av(1:surf_usm_h%ns) )1561 surf_usm_h %iwghf_eb_window_av = 0.0_wp1510 IF ( horizontal ) THEN 1511 IF ( .NOT. ALLOCATED( surf_usm_h(l)%iwghf_eb_window_av ) ) THEN 1512 ALLOCATE ( surf_usm_h(l)%iwghf_eb_window_av(1:surf_usm_h(l)%ns) ) 1513 surf_usm_h(l)%iwghf_eb_window_av = 0.0_wp 1562 1514 ENDIF 1563 1515 ELSE … … 1571 1523 ! 1572 1524 !-- Surface temperature for surfaces 1573 IF ( l == -1) THEN1574 IF ( .NOT. ALLOCATED( surf_usm_h %t_surf_wall_av ) ) THEN1575 ALLOCATE ( surf_usm_h %t_surf_wall_av(1:surf_usm_h%ns) )1576 surf_usm_h %t_surf_wall_av = 0.0_wp1525 IF ( horizontal ) THEN 1526 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_surf_wall_av ) ) THEN 1527 ALLOCATE ( surf_usm_h(l)%t_surf_wall_av(1:surf_usm_h(l)%ns) ) 1528 surf_usm_h(l)%t_surf_wall_av = 0.0_wp 1577 1529 ENDIF 1578 1530 ELSE … … 1586 1538 ! 1587 1539 !-- Surface temperature for window surfaces 1588 IF ( l == -1) THEN1589 IF ( .NOT. ALLOCATED( surf_usm_h %t_surf_window_av ) ) THEN1590 ALLOCATE ( surf_usm_h %t_surf_window_av(1:surf_usm_h%ns) )1591 surf_usm_h %t_surf_window_av = 0.0_wp1540 IF ( horizontal ) THEN 1541 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_surf_window_av ) ) THEN 1542 ALLOCATE ( surf_usm_h(l)%t_surf_window_av(1:surf_usm_h(l)%ns) ) 1543 surf_usm_h(l)%t_surf_window_av = 0.0_wp 1592 1544 ENDIF 1593 1545 ELSE … … 1601 1553 ! 1602 1554 !-- Surface temperature for green surfaces 1603 IF ( l == -1) THEN1604 IF ( .NOT. ALLOCATED( surf_usm_h %t_surf_green_av ) ) THEN1605 ALLOCATE ( surf_usm_h %t_surf_green_av(1:surf_usm_h%ns) )1606 surf_usm_h %t_surf_green_av = 0.0_wp1555 IF ( horizontal ) THEN 1556 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_surf_green_av ) ) THEN 1557 ALLOCATE ( surf_usm_h(l)%t_surf_green_av(1:surf_usm_h(l)%ns) ) 1558 surf_usm_h(l)%t_surf_green_av = 0.0_wp 1607 1559 ENDIF 1608 1560 ELSE … … 1616 1568 ! 1617 1569 !-- Near surface (10cm) temperature for whole surfaces 1618 IF ( l == -1) THEN1619 IF ( .NOT. ALLOCATED( surf_usm_h %pt_10cm_av ) ) THEN1620 ALLOCATE ( surf_usm_h %pt_10cm_av(1:surf_usm_h%ns) )1621 surf_usm_h %pt_10cm_av = 0.0_wp1570 IF ( horizontal ) THEN 1571 IF ( .NOT. ALLOCATED( surf_usm_h(l)%pt_10cm_av ) ) THEN 1572 ALLOCATE ( surf_usm_h(l)%pt_10cm_av(1:surf_usm_h(l)%ns) ) 1573 surf_usm_h(l)%pt_10cm_av = 0.0_wp 1622 1574 ENDIF 1623 1575 ELSE … … 1631 1583 ! 1632 1584 !-- Wall temperature for iwl layer of walls and land 1633 IF ( l == -1) THEN1634 IF ( .NOT. ALLOCATED( surf_usm_h %t_wall_av ) ) THEN1635 ALLOCATE ( surf_usm_h %t_wall_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )1636 surf_usm_h %t_wall_av = 0.0_wp1585 IF ( horizontal ) THEN 1586 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_wall_av ) ) THEN 1587 ALLOCATE ( surf_usm_h(l)%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1588 surf_usm_h(l)%t_wall_av = 0.0_wp 1637 1589 ENDIF 1638 1590 ELSE … … 1646 1598 ! 1647 1599 !-- Window temperature for iwl layer of walls and land 1648 IF ( l == -1) THEN1649 IF ( .NOT. ALLOCATED( surf_usm_h %t_window_av ) ) THEN1650 ALLOCATE ( surf_usm_h %t_window_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )1651 surf_usm_h %t_window_av = 0.0_wp1600 IF ( horizontal ) THEN 1601 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_window_av ) ) THEN 1602 ALLOCATE ( surf_usm_h(l)%t_window_av(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1603 surf_usm_h(l)%t_window_av = 0.0_wp 1652 1604 ENDIF 1653 1605 ELSE … … 1661 1613 ! 1662 1614 !-- Green temperature for iwl layer of walls and land 1663 IF ( l == -1) THEN1664 IF ( .NOT. ALLOCATED( surf_usm_h %t_green_av ) ) THEN1665 ALLOCATE ( surf_usm_h %t_green_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )1666 surf_usm_h %t_green_av = 0.0_wp1615 IF ( horizontal ) THEN 1616 IF ( .NOT. ALLOCATED( surf_usm_h(l)%t_green_av ) ) THEN 1617 ALLOCATE ( surf_usm_h(l)%t_green_av(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1618 surf_usm_h(l)%t_green_av = 0.0_wp 1667 1619 ENDIF 1668 1620 ELSE … … 1675 1627 ! 1676 1628 !-- Soil water content for iwl layer of walls and land 1677 IF ( l == -1 .AND. .NOT. ALLOCATED( surf_usm_h%swc_av ) ) THEN1678 ALLOCATE ( surf_usm_h %swc_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )1679 surf_usm_h %swc_av = 0.0_wp1629 IF ( horizontal .AND. .NOT. ALLOCATED( surf_usm_h(l)%swc_av ) ) THEN 1630 ALLOCATE ( surf_usm_h(l)%swc_av(nzb_wall:nzt_wall,1:surf_usm_h(l)%ns) ) 1631 surf_usm_h(l)%swc_av = 0.0_wp 1680 1632 ELSE 1681 1633 IF ( .NOT. ALLOCATED( surf_usm_v(l)%swc_av ) ) THEN … … 1697 1649 ! 1698 1650 !-- Array of sensible heat flux from surfaces (land, roof, wall) 1699 IF ( l == -1) THEN1700 DO m = 1, surf_usm_h %ns1701 surf_usm_h %wshf_eb_av(m) = surf_usm_h%wshf_eb_av(m) + surf_usm_h%wshf_eb(m)1651 IF ( horizontal ) THEN 1652 DO m = 1, surf_usm_h(l)%ns 1653 surf_usm_h(l)%wshf_eb_av(m) = surf_usm_h(l)%wshf_eb_av(m) + surf_usm_h(l)%wshf_eb(m) 1702 1654 ENDDO 1703 1655 ELSE … … 1711 1663 ! 1712 1664 !-- Array of latent heat flux from surfaces (land, roof, wall) 1713 IF ( l == -1) THEN1714 DO m = 1, surf_usm_h %ns1715 surf_usm_h %qsws_av(m) = surf_usm_h%qsws_av(m) + surf_usm_h%qsws(m) * l_v1665 IF ( horizontal ) THEN 1666 DO m = 1, surf_usm_h(l)%ns 1667 surf_usm_h(l)%qsws_av(m) = surf_usm_h(l)%qsws_av(m) + surf_usm_h(l)%qsws(m) * l_v 1716 1668 ENDDO 1717 1669 ELSE … … 1725 1677 ! 1726 1678 !-- Array of latent heat flux from vegetation surfaces (land, roof, wall) 1727 IF ( l == -1) THEN1728 DO m = 1, surf_usm_h %ns1729 surf_usm_h %qsws_veg_av(m) = surf_usm_h%qsws_veg_av(m) + surf_usm_h%qsws_veg(m)1679 IF ( horizontal ) THEN 1680 DO m = 1, surf_usm_h(l)%ns 1681 surf_usm_h(l)%qsws_veg_av(m) = surf_usm_h(l)%qsws_veg_av(m) + surf_usm_h(l)%qsws_veg(m) 1730 1682 ENDDO 1731 1683 ELSE … … 1739 1691 ! 1740 1692 !-- Array of latent heat flux from surfaces with liquid (land, roof, wall) 1741 IF ( l == -1) THEN1742 DO m = 1, surf_usm_h %ns1743 surf_usm_h %qsws_liq_av(m) = surf_usm_h%qsws_liq_av(m) + &1744 surf_usm_h %qsws_liq(m)1693 IF ( horizontal ) THEN 1694 DO m = 1, surf_usm_h(l)%ns 1695 surf_usm_h(l)%qsws_liq_av(m) = surf_usm_h(l)%qsws_liq_av(m) + & 1696 surf_usm_h(l)%qsws_liq(m) 1745 1697 ENDDO 1746 1698 ELSE … … 1754 1706 ! 1755 1707 !-- Array of heat flux from ground (wall, roof, land) 1756 IF ( l == -1) THEN1757 DO m = 1, surf_usm_h %ns1758 surf_usm_h %wghf_eb_av(m) = surf_usm_h%wghf_eb_av(m) + &1759 surf_usm_h %wghf_eb(m)1708 IF ( horizontal ) THEN 1709 DO m = 1, surf_usm_h(l)%ns 1710 surf_usm_h(l)%wghf_eb_av(m) = surf_usm_h(l)%wghf_eb_av(m) + & 1711 surf_usm_h(l)%wghf_eb(m) 1760 1712 ENDDO 1761 1713 ELSE … … 1769 1721 ! 1770 1722 !-- Array of heat flux from window ground (wall, roof, land) 1771 IF ( l == -1) THEN1772 DO m = 1, surf_usm_h %ns1773 surf_usm_h %wghf_eb_window_av(m) = surf_usm_h%wghf_eb_window_av(m) + &1774 surf_usm_h %wghf_eb_window(m)1723 IF ( horizontal ) THEN 1724 DO m = 1, surf_usm_h(l)%ns 1725 surf_usm_h(l)%wghf_eb_window_av(m) = surf_usm_h(l)%wghf_eb_window_av(m) + & 1726 surf_usm_h(l)%wghf_eb_window(m) 1775 1727 ENDDO 1776 1728 ELSE … … 1784 1736 ! 1785 1737 !-- Array of heat flux from green ground (wall, roof, land) 1786 IF ( l == -1) THEN1787 DO m = 1, surf_usm_h %ns1788 surf_usm_h %wghf_eb_green_av(m) = surf_usm_h%wghf_eb_green_av(m) + &1789 surf_usm_h %wghf_eb_green(m)1738 IF ( horizontal ) THEN 1739 DO m = 1, surf_usm_h(l)%ns 1740 surf_usm_h(l)%wghf_eb_green_av(m) = surf_usm_h(l)%wghf_eb_green_av(m) + & 1741 surf_usm_h(l)%wghf_eb_green(m) 1790 1742 ENDDO 1791 1743 ELSE … … 1799 1751 ! 1800 1752 !-- Array of heat flux from indoor ground (wall, roof, land) 1801 IF ( l == -1) THEN1802 DO m = 1, surf_usm_h %ns1803 surf_usm_h %iwghf_eb_av(m) = surf_usm_h%iwghf_eb_av(m) + surf_usm_h%iwghf_eb(m)1753 IF ( horizontal ) THEN 1754 DO m = 1, surf_usm_h(l)%ns 1755 surf_usm_h(l)%iwghf_eb_av(m) = surf_usm_h(l)%iwghf_eb_av(m) + surf_usm_h(l)%iwghf_eb(m) 1804 1756 ENDDO 1805 1757 ELSE … … 1813 1765 ! 1814 1766 !-- Array of heat flux from indoor window ground (wall, roof, land) 1815 IF ( l == -1) THEN1816 DO m = 1, surf_usm_h %ns1817 surf_usm_h %iwghf_eb_window_av(m) = surf_usm_h%iwghf_eb_window_av(m) + &1818 surf_usm_h %iwghf_eb_window(m)1767 IF ( horizontal ) THEN 1768 DO m = 1, surf_usm_h(l)%ns 1769 surf_usm_h(l)%iwghf_eb_window_av(m) = surf_usm_h(l)%iwghf_eb_window_av(m) + & 1770 surf_usm_h(l)%iwghf_eb_window(m) 1819 1771 ENDDO 1820 1772 ELSE … … 1828 1780 ! 1829 1781 !-- Surface temperature for surfaces 1830 IF ( l == -1) THEN1831 DO m = 1, surf_usm_h %ns1832 surf_usm_h %t_surf_wall_av(m) = surf_usm_h%t_surf_wall_av(m) + t_surf_wall_h(m)1782 IF ( horizontal ) THEN 1783 DO m = 1, surf_usm_h(l)%ns 1784 surf_usm_h(l)%t_surf_wall_av(m) = surf_usm_h(l)%t_surf_wall_av(m) + t_surf_wall_h(l)%val(m) 1833 1785 ENDDO 1834 1786 ELSE 1835 1787 DO m = 1, surf_usm_v(l)%ns 1836 1788 surf_usm_v(l)%t_surf_wall_av(m) = surf_usm_v(l)%t_surf_wall_av(m) + & 1837 t_surf_wall_v(l)% t(m)1789 t_surf_wall_v(l)%val(m) 1838 1790 ENDDO 1839 1791 ENDIF … … 1842 1794 ! 1843 1795 !-- Surface temperature for window surfaces 1844 IF ( l == -1) THEN1845 DO m = 1, surf_usm_h %ns1846 surf_usm_h %t_surf_window_av(m) = surf_usm_h%t_surf_window_av(m) + &1847 t_surf_window_h( m)1796 IF ( horizontal ) THEN 1797 DO m = 1, surf_usm_h(l)%ns 1798 surf_usm_h(l)%t_surf_window_av(m) = surf_usm_h(l)%t_surf_window_av(m) + & 1799 t_surf_window_h(l)%val(m) 1848 1800 ENDDO 1849 1801 ELSE 1850 1802 DO m = 1, surf_usm_v(l)%ns 1851 1803 surf_usm_v(l)%t_surf_window_av(m) = surf_usm_v(l)%t_surf_window_av(m) + & 1852 t_surf_window_v(l)% t(m)1804 t_surf_window_v(l)%val(m) 1853 1805 ENDDO 1854 1806 ENDIF … … 1857 1809 ! 1858 1810 !-- Surface temperature for green surfaces 1859 IF ( l == -1) THEN1860 DO m = 1, surf_usm_h %ns1861 surf_usm_h %t_surf_green_av(m) = surf_usm_h%t_surf_green_av(m) + &1862 t_surf_green_h( m)1811 IF ( horizontal ) THEN 1812 DO m = 1, surf_usm_h(l)%ns 1813 surf_usm_h(l)%t_surf_green_av(m) = surf_usm_h(l)%t_surf_green_av(m) + & 1814 t_surf_green_h(l)%val(m) 1863 1815 ENDDO 1864 1816 ELSE 1865 1817 DO m = 1, surf_usm_v(l)%ns 1866 1818 surf_usm_v(l)%t_surf_green_av(m) = surf_usm_v(l)%t_surf_green_av(m) + & 1867 t_surf_green_v(l)% t(m)1819 t_surf_green_v(l)%val(m) 1868 1820 ENDDO 1869 1821 ENDIF … … 1872 1824 ! 1873 1825 !-- Near surface temperature for whole surfaces 1874 IF ( l == -1) THEN1875 DO m = 1, surf_usm_h %ns1876 surf_usm_h %pt_10cm_av(m) = surf_usm_h%pt_10cm_av(m) + &1877 surf_usm_h %pt_10cm(m)1826 IF ( horizontal ) THEN 1827 DO m = 1, surf_usm_h(l)%ns 1828 surf_usm_h(l)%pt_10cm_av(m) = surf_usm_h(l)%pt_10cm_av(m) + & 1829 surf_usm_h(l)%pt_10cm(m) 1878 1830 ENDDO 1879 1831 ELSE … … 1887 1839 ! 1888 1840 !-- Wall temperature for iwl layer of walls and land 1889 IF ( l == -1) THEN1890 DO m = 1, surf_usm_h %ns1891 surf_usm_h %t_wall_av(iwl,m) = surf_usm_h%t_wall_av(iwl,m) + &1892 t_wall_h( iwl,m)1841 IF ( horizontal ) THEN 1842 DO m = 1, surf_usm_h(l)%ns 1843 surf_usm_h(l)%t_wall_av(iwl,m) = surf_usm_h(l)%t_wall_av(iwl,m) + & 1844 t_wall_h(l)%val(iwl,m) 1893 1845 ENDDO 1894 1846 ELSE 1895 1847 DO m = 1, surf_usm_v(l)%ns 1896 1848 surf_usm_v(l)%t_wall_av(iwl,m) = surf_usm_v(l)%t_wall_av(iwl,m) + & 1897 t_wall_v(l)% t(iwl,m)1849 t_wall_v(l)%val(iwl,m) 1898 1850 ENDDO 1899 1851 ENDIF … … 1902 1854 ! 1903 1855 !-- Window temperature for iwl layer of walls and land 1904 IF ( l == -1) THEN1905 DO m = 1, surf_usm_h %ns1906 surf_usm_h %t_window_av(iwl,m) = surf_usm_h%t_window_av(iwl,m) + &1907 t_window_h(iwl,m)1856 IF ( horizontal ) THEN 1857 DO m = 1, surf_usm_h(l)%ns 1858 surf_usm_h(l)%t_window_av(iwl,m) = surf_usm_h(l)%t_window_av(iwl,m) + & 1859 t_window_h(l)%val(iwl,m) 1908 1860 ENDDO 1909 1861 ELSE 1910 1862 DO m = 1, surf_usm_v(l)%ns 1911 1863 surf_usm_v(l)%t_window_av(iwl,m) = surf_usm_v(l)%t_window_av(iwl,m) + & 1912 t_window_v(l)% t(iwl,m)1864 t_window_v(l)%val(iwl,m) 1913 1865 ENDDO 1914 1866 ENDIF … … 1917 1869 ! 1918 1870 !-- Green temperature for iwl layer of walls and land 1919 IF ( l == -1) THEN1920 DO m = 1, surf_usm_h %ns1921 surf_usm_h %t_green_av(iwl,m) = surf_usm_h%t_green_av(iwl,m) + t_green_h(iwl,m)1871 IF ( horizontal ) THEN 1872 DO m = 1, surf_usm_h(l)%ns 1873 surf_usm_h(l)%t_green_av(iwl,m) = surf_usm_h(l)%t_green_av(iwl,m) + t_green_h(l)%val(iwl,m) 1922 1874 ENDDO 1923 1875 ELSE 1924 1876 DO m = 1, surf_usm_v(l)%ns 1925 1877 surf_usm_v(l)%t_green_av(iwl,m) = surf_usm_v(l)%t_green_av(iwl,m) + & 1926 t_green_v(l)% t(iwl,m)1878 t_green_v(l)%val(iwl,m) 1927 1879 ENDDO 1928 1880 ENDIF … … 1931 1883 ! 1932 1884 !-- Soil water content for iwl layer of walls and land 1933 IF ( l == -1) THEN1934 DO m = 1, surf_usm_h %ns1935 surf_usm_h %swc_av(iwl,m) = surf_usm_h%swc_av(iwl,m) + swc_h(iwl,m)1885 IF ( horizontal ) THEN 1886 DO m = 1, surf_usm_h(l)%ns 1887 surf_usm_h(l)%swc_av(iwl,m) = surf_usm_h(l)%swc_av(iwl,m) + swc_h(l)%val(iwl,m) 1936 1888 ENDDO 1937 1889 ELSE … … 1950 1902 ! 1951 1903 !-- Array of sensible heat flux from surfaces (land, roof, wall) 1952 IF ( l == -1) THEN1953 DO m = 1, surf_usm_h %ns1954 surf_usm_h %wshf_eb_av(m) = surf_usm_h%wshf_eb_av(m) / &1904 IF ( horizontal ) THEN 1905 DO m = 1, surf_usm_h(l)%ns 1906 surf_usm_h(l)%wshf_eb_av(m) = surf_usm_h(l)%wshf_eb_av(m) / & 1955 1907 REAL( average_count_3d, kind=wp ) 1956 1908 ENDDO … … 1965 1917 ! 1966 1918 !-- Array of latent heat flux from surfaces (land, roof, wall) 1967 IF ( l == -1) THEN1968 DO m = 1, surf_usm_h %ns1969 surf_usm_h %qsws_av(m) = surf_usm_h%qsws_av(m) / &1919 IF ( horizontal ) THEN 1920 DO m = 1, surf_usm_h(l)%ns 1921 surf_usm_h(l)%qsws_av(m) = surf_usm_h(l)%qsws_av(m) / & 1970 1922 REAL( average_count_3d, kind=wp ) 1971 1923 ENDDO … … 1980 1932 ! 1981 1933 !-- Array of latent heat flux from vegetation surfaces (land, roof, wall) 1982 IF ( l == -1) THEN1983 DO m = 1, surf_usm_h %ns1984 surf_usm_h %qsws_veg_av(m) = surf_usm_h%qsws_veg_av(m) / &1934 IF ( horizontal ) THEN 1935 DO m = 1, surf_usm_h(l)%ns 1936 surf_usm_h(l)%qsws_veg_av(m) = surf_usm_h(l)%qsws_veg_av(m) / & 1985 1937 REAL( average_count_3d, kind=wp ) 1986 1938 ENDDO … … 1995 1947 ! 1996 1948 !-- Array of latent heat flux from surfaces with liquid (land, roof, wall) 1997 IF ( l == -1) THEN1998 DO m = 1, surf_usm_h %ns1999 surf_usm_h %qsws_liq_av(m) = surf_usm_h%qsws_liq_av(m) / &1949 IF ( horizontal ) THEN 1950 DO m = 1, surf_usm_h(l)%ns 1951 surf_usm_h(l)%qsws_liq_av(m) = surf_usm_h(l)%qsws_liq_av(m) / & 2000 1952 REAL( average_count_3d, kind=wp ) 2001 1953 ENDDO … … 2010 1962 ! 2011 1963 !-- Array of heat flux from ground (wall, roof, land) 2012 IF ( l == -1) THEN2013 DO m = 1, surf_usm_h %ns2014 surf_usm_h %wghf_eb_av(m) = surf_usm_h%wghf_eb_av(m) / &1964 IF ( horizontal ) THEN 1965 DO m = 1, surf_usm_h(l)%ns 1966 surf_usm_h(l)%wghf_eb_av(m) = surf_usm_h(l)%wghf_eb_av(m) / & 2015 1967 REAL( average_count_3d, kind=wp ) 2016 1968 ENDDO … … 2025 1977 ! 2026 1978 !-- Array of heat flux from window ground (wall, roof, land) 2027 IF ( l == -1) THEN2028 DO m = 1, surf_usm_h %ns2029 surf_usm_h %wghf_eb_window_av(m) = surf_usm_h%wghf_eb_window_av(m) / &1979 IF ( horizontal ) THEN 1980 DO m = 1, surf_usm_h(l)%ns 1981 surf_usm_h(l)%wghf_eb_window_av(m) = surf_usm_h(l)%wghf_eb_window_av(m) / & 2030 1982 REAL( average_count_3d, kind=wp ) 2031 1983 ENDDO … … 2040 1992 ! 2041 1993 !-- Array of heat flux from green ground (wall, roof, land) 2042 IF ( l == -1) THEN2043 DO m = 1, surf_usm_h %ns2044 surf_usm_h %wghf_eb_green_av(m) = surf_usm_h%wghf_eb_green_av(m) / &1994 IF ( horizontal ) THEN 1995 DO m = 1, surf_usm_h(l)%ns 1996 surf_usm_h(l)%wghf_eb_green_av(m) = surf_usm_h(l)%wghf_eb_green_av(m) / & 2045 1997 REAL( average_count_3d, kind=wp ) 2046 1998 ENDDO … … 2055 2007 ! 2056 2008 !-- Array of heat flux from indoor ground (wall, roof, land) 2057 IF ( l == -1) THEN2058 DO m = 1, surf_usm_h %ns2059 surf_usm_h %iwghf_eb_av(m) = surf_usm_h%iwghf_eb_av(m) / &2009 IF ( horizontal ) THEN 2010 DO m = 1, surf_usm_h(l)%ns 2011 surf_usm_h(l)%iwghf_eb_av(m) = surf_usm_h(l)%iwghf_eb_av(m) / & 2060 2012 REAL( average_count_3d, kind=wp ) 2061 2013 ENDDO … … 2070 2022 ! 2071 2023 !-- Array of heat flux from indoor window ground (wall, roof, land) 2072 IF ( l == -1) THEN2073 DO m = 1, surf_usm_h %ns2074 surf_usm_h %iwghf_eb_window_av(m) = surf_usm_h%iwghf_eb_window_av(m) / &2024 IF ( horizontal ) THEN 2025 DO m = 1, surf_usm_h(l)%ns 2026 surf_usm_h(l)%iwghf_eb_window_av(m) = surf_usm_h(l)%iwghf_eb_window_av(m) / & 2075 2027 REAL( average_count_3d, kind=wp ) 2076 2028 ENDDO … … 2085 2037 ! 2086 2038 !-- Surface temperature for surfaces 2087 IF ( l == -1) THEN2088 DO m = 1, surf_usm_h %ns2089 surf_usm_h %t_surf_wall_av(m) = surf_usm_h%t_surf_wall_av(m) / &2039 IF ( horizontal ) THEN 2040 DO m = 1, surf_usm_h(l)%ns 2041 surf_usm_h(l)%t_surf_wall_av(m) = surf_usm_h(l)%t_surf_wall_av(m) / & 2090 2042 REAL( average_count_3d, kind=wp ) 2091 2043 ENDDO … … 2100 2052 ! 2101 2053 !-- Surface temperature for window surfaces 2102 IF ( l == -1) THEN2103 DO m = 1, surf_usm_h %ns2104 surf_usm_h %t_surf_window_av(m) = surf_usm_h%t_surf_window_av(m) / &2054 IF ( horizontal ) THEN 2055 DO m = 1, surf_usm_h(l)%ns 2056 surf_usm_h(l)%t_surf_window_av(m) = surf_usm_h(l)%t_surf_window_av(m) / & 2105 2057 REAL( average_count_3d, kind=wp ) 2106 2058 ENDDO … … 2115 2067 ! 2116 2068 !-- Surface temperature for green surfaces 2117 IF ( l == -1) THEN2118 DO m = 1, surf_usm_h %ns2119 surf_usm_h %t_surf_green_av(m) = surf_usm_h%t_surf_green_av(m) / &2069 IF ( horizontal ) THEN 2070 DO m = 1, surf_usm_h(l)%ns 2071 surf_usm_h(l)%t_surf_green_av(m) = surf_usm_h(l)%t_surf_green_av(m) / & 2120 2072 REAL( average_count_3d, kind=wp ) 2121 2073 ENDDO … … 2130 2082 ! 2131 2083 !-- Near surface temperature for whole surfaces 2132 IF ( l == -1) THEN2133 DO m = 1, surf_usm_h %ns2134 surf_usm_h %pt_10cm_av(m) = surf_usm_h%pt_10cm_av(m) / &2084 IF ( horizontal ) THEN 2085 DO m = 1, surf_usm_h(l)%ns 2086 surf_usm_h(l)%pt_10cm_av(m) = surf_usm_h(l)%pt_10cm_av(m) / & 2135 2087 REAL( average_count_3d, kind=wp ) 2136 2088 ENDDO … … 2146 2098 ! 2147 2099 !-- Wall temperature for iwl layer of walls and land 2148 IF ( l == -1) THEN2149 DO m = 1, surf_usm_h %ns2150 surf_usm_h %t_wall_av(iwl,m) = surf_usm_h%t_wall_av(iwl,m) / &2100 IF ( horizontal ) THEN 2101 DO m = 1, surf_usm_h(l)%ns 2102 surf_usm_h(l)%t_wall_av(iwl,m) = surf_usm_h(l)%t_wall_av(iwl,m) / & 2151 2103 REAL( average_count_3d, kind=wp ) 2152 2104 ENDDO … … 2161 2113 ! 2162 2114 !-- Window temperature for iwl layer of walls and land 2163 IF ( l == -1) THEN2164 DO m = 1, surf_usm_h %ns2165 surf_usm_h %t_window_av(iwl,m) = surf_usm_h%t_window_av(iwl,m) / &2115 IF ( horizontal ) THEN 2116 DO m = 1, surf_usm_h(l)%ns 2117 surf_usm_h(l)%t_window_av(iwl,m) = surf_usm_h(l)%t_window_av(iwl,m) / & 2166 2118 REAL( average_count_3d, kind=wp ) 2167 2119 ENDDO … … 2176 2128 ! 2177 2129 !-- Green temperature for iwl layer of walls and land 2178 IF ( l == -1) THEN2179 DO m = 1, surf_usm_h %ns2180 surf_usm_h %t_green_av(iwl,m) = surf_usm_h%t_green_av(iwl,m) / &2130 IF ( horizontal ) THEN 2131 DO m = 1, surf_usm_h(l)%ns 2132 surf_usm_h(l)%t_green_av(iwl,m) = surf_usm_h(l)%t_green_av(iwl,m) / & 2181 2133 REAL( average_count_3d, kind=wp ) 2182 2134 ENDDO … … 2191 2143 ! 2192 2144 !-- Soil water content for iwl layer of walls and land 2193 IF ( l == -1) THEN2194 DO m = 1, surf_usm_h %ns2195 surf_usm_h %swc_av(iwl,m) = surf_usm_h%swc_av(iwl,m) / &2145 IF ( horizontal ) THEN 2146 DO m = 1, surf_usm_h(l)%ns 2147 surf_usm_h(l)%swc_av(iwl,m) = surf_usm_h(l)%swc_av(iwl,m) / & 2196 2148 REAL( average_count_3d, kind=wp ) 2197 2149 ENDDO … … 2208 2160 ENDIF 2209 2161 2210 ENDIF2211 2212 2162 END SUBROUTINE usm_3d_data_averaging 2213 2163 … … 2232 2182 INTEGER(iwp) :: m !< running index surface elements 2233 2183 2234 koff = surf_usm_h%koff 2235 DO m = 1, surf_usm_h%ns 2236 i = surf_usm_h%i(m) 2237 j = surf_usm_h%j(m) 2238 k = surf_usm_h%k(m) 2239 pt(k+koff,j,i) = pt(k,j,i) 2184 DO l = 0, 1 2185 koff = surf_usm_h(l)%koff 2186 DO m = 1, surf_usm_h(l)%ns 2187 i = surf_usm_h(l)%i(m) 2188 j = surf_usm_h(l)%j(m) 2189 k = surf_usm_h(l)%k(m) 2190 pt(k+koff,j,i) = pt(k,j,i) 2191 ENDDO 2240 2192 ENDDO 2241 2193 … … 2297 2249 'usm_t_window ', & 2298 2250 'usm_t_green '/) 2299 2300 INTEGER(iwp), PARAMETER :: nd = 5 !< number of directions2301 CHARACTER(LEN=6), DIMENSION(nd), PARAMETER :: dirname = & !< direction names2302 (/'_roof ','_south','_north','_west ','_east '/)2303 2251 2304 2252 LOGICAL :: lfound !< flag if the variable is found … … 2415 2363 message_string = 'topography /= "flat" is required when using the urban surface model' 2416 2364 CALL message( 'usm_check_parameters', 'PA0592', 1, 2, 0, 6, 0 ) 2417 ENDIF2418 !2419 !-- Naheatlayers2420 IF ( naheatlayers > nzt ) THEN2421 message_string = 'number of anthropogenic heat layers "naheatlayers" can not be larger ' // &2422 'than number of domain layers "nzt"'2423 CALL message( 'usm_check_parameters', 'PA0593', 1, 2, 0, 6, 0 )2424 2365 ENDIF 2425 2366 ! … … 2466 2407 INTEGER(iwp), INTENT(IN) :: nzt_do !< vertical upper limit of the data output (usually nz_do3d) 2467 2408 2468 INTEGER(iwp), PARAMETER :: nd = 5 !< number of directions2469 INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER :: dirint = (/ iup, isouth, inorth, iwest, ieast /) !<2470 INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER :: diridx = (/ -1, 1, 0, 3, 2 /)2471 !< index for surf_*_v: 0:3 = (North, South, East, West)2472 CHARACTER(LEN=6), DIMENSION(0:nd-1), PARAMETER :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /) !<2473 2474 2475 2409 INTEGER(iwp) :: ids, idsint, idsidx !< 2476 2410 INTEGER(iwp) :: i, j, k, iwl, istat, l, m !< running indices 2411 LOGICAL :: horizontal !< horizontal upward or downeard facing surface 2477 2412 2478 2413 LOGICAL, INTENT(OUT) :: found !< … … 2497 2432 ENDIF 2498 2433 ENDDO 2434 horizontal = ( ( idsint == iup ) .OR. (idsint == idown ) ) 2435 l = idsidx !< shorter direction index name 2436 2499 2437 IF ( ids == -1 ) THEN 2500 2438 var = TRIM( variable ) … … 2538 2476 ! 2539 2477 !-- Array of surface height (z) 2540 IF ( idsint == iup) THEN2541 DO m = 1, surf_usm_h %ns2542 i = surf_usm_h %i(m)2543 j = surf_usm_h %j(m)2544 k = surf_usm_h %k(m)2478 IF ( horizontal ) THEN 2479 DO m = 1, surf_usm_h(l)%ns 2480 i = surf_usm_h(l)%i(m) 2481 j = surf_usm_h(l)%j(m) 2482 k = surf_usm_h(l)%k(m) 2545 2483 temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, KIND = sp) ) 2546 2484 ENDDO 2547 2485 ELSE 2548 l = idsidx2549 2486 DO m = 1, surf_usm_v(l)%ns 2550 2487 i = surf_usm_v(l)%i(m) … … 2558 2495 ! 2559 2496 !-- Surface category 2560 IF ( idsint == iup) THEN2561 DO m = 1, surf_usm_h %ns2562 i = surf_usm_h %i(m)2563 j = surf_usm_h %j(m)2564 k = surf_usm_h %k(m)2565 temp_pf(k,j,i) = surf_usm_h %surface_types(m)2497 IF ( horizontal ) THEN 2498 DO m = 1, surf_usm_h(l)%ns 2499 i = surf_usm_h(l)%i(m) 2500 j = surf_usm_h(l)%j(m) 2501 k = surf_usm_h(l)%k(m) 2502 temp_pf(k,j,i) = surf_usm_h(l)%surface_types(m) 2566 2503 ENDDO 2567 2504 ELSE 2568 l = idsidx2569 2505 DO m = 1, surf_usm_v(l)%ns 2570 2506 i = surf_usm_v(l)%i(m) … … 2578 2514 ! 2579 2515 !-- Transmissivity window tiles 2580 IF ( idsint == iup) THEN2581 DO m = 1, surf_usm_h %ns2582 i = surf_usm_h %i(m)2583 j = surf_usm_h %j(m)2584 k = surf_usm_h %k(m)2585 temp_pf(k,j,i) = surf_usm_h %transmissivity(m)2516 IF ( horizontal ) THEN 2517 DO m = 1, surf_usm_h(l)%ns 2518 i = surf_usm_h(l)%i(m) 2519 j = surf_usm_h(l)%j(m) 2520 k = surf_usm_h(l)%k(m) 2521 temp_pf(k,j,i) = surf_usm_h(l)%transmissivity(m) 2586 2522 ENDDO 2587 2523 ELSE 2588 l = idsidx2589 2524 DO m = 1, surf_usm_v(l)%ns 2590 2525 i = surf_usm_v(l)%i(m) … … 2599 2534 !-- Array of sensible heat flux from surfaces 2600 2535 IF ( av == 0 ) THEN 2601 IF ( idsint == iup) THEN2602 DO m = 1, surf_usm_h %ns2603 i = surf_usm_h %i(m)2604 j = surf_usm_h %j(m)2605 k = surf_usm_h %k(m)2606 temp_pf(k,j,i) = surf_usm_h %wshf_eb(m)2536 IF ( horizontal ) THEN 2537 DO m = 1, surf_usm_h(l)%ns 2538 i = surf_usm_h(l)%i(m) 2539 j = surf_usm_h(l)%j(m) 2540 k = surf_usm_h(l)%k(m) 2541 temp_pf(k,j,i) = surf_usm_h(l)%wshf_eb(m) 2607 2542 ENDDO 2608 2543 ELSE 2609 l = idsidx2610 2544 DO m = 1, surf_usm_v(l)%ns 2611 2545 i = surf_usm_v(l)%i(m) … … 2616 2550 ENDIF 2617 2551 ELSE 2618 IF ( idsint == iup) THEN2619 DO m = 1, surf_usm_h %ns2620 i = surf_usm_h %i(m)2621 j = surf_usm_h %j(m)2622 k = surf_usm_h %k(m)2623 temp_pf(k,j,i) = surf_usm_h %wshf_eb_av(m)2552 IF ( horizontal ) THEN 2553 DO m = 1, surf_usm_h(l)%ns 2554 i = surf_usm_h(l)%i(m) 2555 j = surf_usm_h(l)%j(m) 2556 k = surf_usm_h(l)%k(m) 2557 temp_pf(k,j,i) = surf_usm_h(l)%wshf_eb_av(m) 2624 2558 ENDDO 2625 2559 ELSE 2626 l = idsidx2627 2560 DO m = 1, surf_usm_v(l)%ns 2628 2561 i = surf_usm_v(l)%i(m) … … 2639 2572 !-- Array of latent heat flux from surfaces 2640 2573 IF ( av == 0 ) THEN 2641 IF ( idsint == iup) THEN2642 DO m = 1, surf_usm_h %ns2643 i = surf_usm_h %i(m)2644 j = surf_usm_h %j(m)2645 k = surf_usm_h %k(m)2646 temp_pf(k,j,i) = surf_usm_h %qsws(m) * l_v2574 IF ( horizontal ) THEN 2575 DO m = 1, surf_usm_h(l)%ns 2576 i = surf_usm_h(l)%i(m) 2577 j = surf_usm_h(l)%j(m) 2578 k = surf_usm_h(l)%k(m) 2579 temp_pf(k,j,i) = surf_usm_h(l)%qsws(m) * l_v 2647 2580 ENDDO 2648 2581 ELSE 2649 l = idsidx2650 2582 DO m = 1, surf_usm_v(l)%ns 2651 2583 i = surf_usm_v(l)%i(m) … … 2656 2588 ENDIF 2657 2589 ELSE 2658 IF ( idsint == iup) THEN2659 DO m = 1, surf_usm_h %ns2660 i = surf_usm_h %i(m)2661 j = surf_usm_h %j(m)2662 k = surf_usm_h %k(m)2663 temp_pf(k,j,i) = surf_usm_h %qsws_av(m)2590 IF ( horizontal ) THEN 2591 DO m = 1, surf_usm_h(l)%ns 2592 i = surf_usm_h(l)%i(m) 2593 j = surf_usm_h(l)%j(m) 2594 k = surf_usm_h(l)%k(m) 2595 temp_pf(k,j,i) = surf_usm_h(l)%qsws_av(m) 2664 2596 ENDDO 2665 2597 ELSE 2666 l = idsidx2667 2598 DO m = 1, surf_usm_v(l)%ns 2668 2599 i = surf_usm_v(l)%i(m) … … 2678 2609 !-- Array of latent heat flux from vegetation surfaces 2679 2610 IF ( av == 0 ) THEN 2680 IF ( idsint == iup) THEN2681 DO m = 1, surf_usm_h %ns2682 i = surf_usm_h %i(m)2683 j = surf_usm_h %j(m)2684 k = surf_usm_h %k(m)2685 temp_pf(k,j,i) = surf_usm_h %qsws_veg(m)2611 IF ( horizontal ) THEN 2612 DO m = 1, surf_usm_h(l)%ns 2613 i = surf_usm_h(l)%i(m) 2614 j = surf_usm_h(l)%j(m) 2615 k = surf_usm_h(l)%k(m) 2616 temp_pf(k,j,i) = surf_usm_h(l)%qsws_veg(m) 2686 2617 ENDDO 2687 2618 ELSE 2688 l = idsidx2689 2619 DO m = 1, surf_usm_v(l)%ns 2690 2620 i = surf_usm_v(l)%i(m) … … 2695 2625 ENDIF 2696 2626 ELSE 2697 IF ( idsint == iup) THEN2698 DO m = 1, surf_usm_h %ns2699 i = surf_usm_h %i(m)2700 j = surf_usm_h %j(m)2701 k = surf_usm_h %k(m)2702 temp_pf(k,j,i) = surf_usm_h %qsws_veg_av(m)2627 IF ( horizontal ) THEN 2628 DO m = 1, surf_usm_h(l)%ns 2629 i = surf_usm_h(l)%i(m) 2630 j = surf_usm_h(l)%j(m) 2631 k = surf_usm_h(l)%k(m) 2632 temp_pf(k,j,i) = surf_usm_h(l)%qsws_veg_av(m) 2703 2633 ENDDO 2704 2634 ELSE 2705 l = idsidx2706 2635 DO m = 1, surf_usm_v(l)%ns 2707 2636 i = surf_usm_v(l)%i(m) … … 2717 2646 !-- Array of latent heat flux from surfaces with liquid 2718 2647 IF ( av == 0 ) THEN 2719 IF ( idsint == iup) THEN2720 DO m = 1, surf_usm_h %ns2721 i = surf_usm_h %i(m)2722 j = surf_usm_h %j(m)2723 k = surf_usm_h %k(m)2724 temp_pf(k,j,i) = surf_usm_h %qsws_liq(m)2648 IF ( horizontal ) THEN 2649 DO m = 1, surf_usm_h(l)%ns 2650 i = surf_usm_h(l)%i(m) 2651 j = surf_usm_h(l)%j(m) 2652 k = surf_usm_h(l)%k(m) 2653 temp_pf(k,j,i) = surf_usm_h(l)%qsws_liq(m) 2725 2654 ENDDO 2726 2655 ELSE 2727 l = idsidx2728 2656 DO m = 1, surf_usm_v(l)%ns 2729 2657 i = surf_usm_v(l)%i(m) … … 2734 2662 ENDIF 2735 2663 ELSE 2736 IF ( idsint == iup) THEN2737 DO m = 1, surf_usm_h %ns2738 i = surf_usm_h %i(m)2739 j = surf_usm_h %j(m)2740 k = surf_usm_h %k(m)2741 temp_pf(k,j,i) = surf_usm_h %qsws_liq_av(m)2664 IF ( horizontal ) THEN 2665 DO m = 1, surf_usm_h(l)%ns 2666 i = surf_usm_h(l)%i(m) 2667 j = surf_usm_h(l)%j(m) 2668 k = surf_usm_h(l)%k(m) 2669 temp_pf(k,j,i) = surf_usm_h(l)%qsws_liq_av(m) 2742 2670 ENDDO 2743 2671 ELSE 2744 l = idsidx2745 2672 DO m = 1, surf_usm_v(l)%ns 2746 2673 i = surf_usm_v(l)%i(m) … … 2756 2683 !-- Array of heat flux from ground (land, wall, roof) 2757 2684 IF ( av == 0 ) THEN 2758 IF ( idsint == iup) THEN2759 DO m = 1, surf_usm_h %ns2760 i = surf_usm_h %i(m)2761 j = surf_usm_h %j(m)2762 k = surf_usm_h %k(m)2763 temp_pf(k,j,i) = surf_usm_h %wghf_eb(m)2685 IF ( horizontal ) THEN 2686 DO m = 1, surf_usm_h(l)%ns 2687 i = surf_usm_h(l)%i(m) 2688 j = surf_usm_h(l)%j(m) 2689 k = surf_usm_h(l)%k(m) 2690 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb(m) 2764 2691 ENDDO 2765 2692 ELSE 2766 l = idsidx2767 2693 DO m = 1, surf_usm_v(l)%ns 2768 2694 i = surf_usm_v(l)%i(m) … … 2773 2699 ENDIF 2774 2700 ELSE 2775 IF ( idsint == iup) THEN2776 DO m = 1, surf_usm_h %ns2777 i = surf_usm_h %i(m)2778 j = surf_usm_h %j(m)2779 k = surf_usm_h %k(m)2780 temp_pf(k,j,i) = surf_usm_h %wghf_eb_av(m)2701 IF ( horizontal ) THEN 2702 DO m = 1, surf_usm_h(l)%ns 2703 i = surf_usm_h(l)%i(m) 2704 j = surf_usm_h(l)%j(m) 2705 k = surf_usm_h(l)%k(m) 2706 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb_av(m) 2781 2707 ENDDO 2782 2708 ELSE 2783 l = idsidx2784 2709 DO m = 1, surf_usm_v(l)%ns 2785 2710 i = surf_usm_v(l)%i(m) … … 2795 2720 !-- Array of heat flux from window ground (land, wall, roof) 2796 2721 IF ( av == 0 ) THEN 2797 IF ( idsint == iup) THEN2798 DO m = 1, surf_usm_h %ns2799 i = surf_usm_h %i(m)2800 j = surf_usm_h %j(m)2801 k = surf_usm_h %k(m)2802 temp_pf(k,j,i) = surf_usm_h %wghf_eb_window(m)2722 IF ( horizontal ) THEN 2723 DO m = 1, surf_usm_h(l)%ns 2724 i = surf_usm_h(l)%i(m) 2725 j = surf_usm_h(l)%j(m) 2726 k = surf_usm_h(l)%k(m) 2727 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb_window(m) 2803 2728 ENDDO 2804 2729 ELSE 2805 l = idsidx2806 2730 DO m = 1, surf_usm_v(l)%ns 2807 2731 i = surf_usm_v(l)%i(m) … … 2812 2736 ENDIF 2813 2737 ELSE 2814 IF ( idsint == iup) THEN2815 DO m = 1, surf_usm_h %ns2816 i = surf_usm_h %i(m)2817 j = surf_usm_h %j(m)2818 k = surf_usm_h %k(m)2819 temp_pf(k,j,i) = surf_usm_h %wghf_eb_window_av(m)2738 IF ( horizontal ) THEN 2739 DO m = 1, surf_usm_h(l)%ns 2740 i = surf_usm_h(l)%i(m) 2741 j = surf_usm_h(l)%j(m) 2742 k = surf_usm_h(l)%k(m) 2743 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb_window_av(m) 2820 2744 ENDDO 2821 2745 ELSE 2822 l = idsidx2823 2746 DO m = 1, surf_usm_v(l)%ns 2824 2747 i = surf_usm_v(l)%i(m) … … 2834 2757 !-- Array of heat flux from green ground (land, wall, roof) 2835 2758 IF ( av == 0 ) THEN 2836 IF ( idsint == iup) THEN2837 DO m = 1, surf_usm_h %ns2838 i = surf_usm_h %i(m)2839 j = surf_usm_h %j(m)2840 k = surf_usm_h %k(m)2841 temp_pf(k,j,i) = surf_usm_h %wghf_eb_green(m)2759 IF ( horizontal ) THEN 2760 DO m = 1, surf_usm_h(l)%ns 2761 i = surf_usm_h(l)%i(m) 2762 j = surf_usm_h(l)%j(m) 2763 k = surf_usm_h(l)%k(m) 2764 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb_green(m) 2842 2765 ENDDO 2843 2766 ELSE … … 2851 2774 ENDIF 2852 2775 ELSE 2853 IF ( idsint == iup) THEN2854 DO m = 1, surf_usm_h %ns2855 i = surf_usm_h %i(m)2856 j = surf_usm_h %j(m)2857 k = surf_usm_h %k(m)2858 temp_pf(k,j,i) = surf_usm_h %wghf_eb_green_av(m)2776 IF ( horizontal ) THEN 2777 DO m = 1, surf_usm_h(l)%ns 2778 i = surf_usm_h(l)%i(m) 2779 j = surf_usm_h(l)%j(m) 2780 k = surf_usm_h(l)%k(m) 2781 temp_pf(k,j,i) = surf_usm_h(l)%wghf_eb_green_av(m) 2859 2782 ENDDO 2860 2783 ELSE 2861 l = idsidx2862 2784 DO m = 1, surf_usm_v(l)%ns 2863 2785 i = surf_usm_v(l)%i(m) … … 2873 2795 !-- Array of heat flux from indoor ground (land, wall, roof) 2874 2796 IF ( av == 0 ) THEN 2875 IF ( idsint == iup) THEN2876 DO m = 1, surf_usm_h %ns2877 i = surf_usm_h %i(m)2878 j = surf_usm_h %j(m)2879 k = surf_usm_h %k(m)2880 temp_pf(k,j,i) = surf_usm_h %iwghf_eb(m)2797 IF ( horizontal ) THEN 2798 DO m = 1, surf_usm_h(l)%ns 2799 i = surf_usm_h(l)%i(m) 2800 j = surf_usm_h(l)%j(m) 2801 k = surf_usm_h(l)%k(m) 2802 temp_pf(k,j,i) = surf_usm_h(l)%iwghf_eb(m) 2881 2803 ENDDO 2882 2804 ELSE 2883 l = idsidx2884 2805 DO m = 1, surf_usm_v(l)%ns 2885 2806 i = surf_usm_v(l)%i(m) … … 2890 2811 ENDIF 2891 2812 ELSE 2892 IF ( idsint == iup) THEN2893 DO m = 1, surf_usm_h %ns2894 i = surf_usm_h %i(m)2895 j = surf_usm_h %j(m)2896 k = surf_usm_h %k(m)2897 temp_pf(k,j,i) = surf_usm_h %iwghf_eb_av(m)2813 IF ( horizontal ) THEN 2814 DO m = 1, surf_usm_h(l)%ns 2815 i = surf_usm_h(l)%i(m) 2816 j = surf_usm_h(l)%j(m) 2817 k = surf_usm_h(l)%k(m) 2818 temp_pf(k,j,i) = surf_usm_h(l)%iwghf_eb_av(m) 2898 2819 ENDDO 2899 2820 ELSE 2900 l = idsidx2901 2821 DO m = 1, surf_usm_v(l)%ns 2902 2822 i = surf_usm_v(l)%i(m) … … 2912 2832 !-- Array of heat flux from indoor window ground (land, wall, roof) 2913 2833 IF ( av == 0 ) THEN 2914 IF ( idsint == iup) THEN2915 DO m = 1, surf_usm_h %ns2916 i = surf_usm_h %i(m)2917 j = surf_usm_h %j(m)2918 k = surf_usm_h %k(m)2919 temp_pf(k,j,i) = surf_usm_h %iwghf_eb_window(m)2834 IF ( horizontal ) THEN 2835 DO m = 1, surf_usm_h(l)%ns 2836 i = surf_usm_h(l)%i(m) 2837 j = surf_usm_h(l)%j(m) 2838 k = surf_usm_h(l)%k(m) 2839 temp_pf(k,j,i) = surf_usm_h(l)%iwghf_eb_window(m) 2920 2840 ENDDO 2921 2841 ELSE 2922 l = idsidx2923 2842 DO m = 1, surf_usm_v(l)%ns 2924 2843 i = surf_usm_v(l)%i(m) … … 2929 2848 ENDIF 2930 2849 ELSE 2931 IF ( idsint == iup) THEN2932 DO m = 1, surf_usm_h %ns2933 i = surf_usm_h %i(m)2934 j = surf_usm_h %j(m)2935 k = surf_usm_h %k(m)2936 temp_pf(k,j,i) = surf_usm_h %iwghf_eb_window_av(m)2850 IF ( horizontal ) THEN 2851 DO m = 1, surf_usm_h(l)%ns 2852 i = surf_usm_h(l)%i(m) 2853 j = surf_usm_h(l)%j(m) 2854 k = surf_usm_h(l)%k(m) 2855 temp_pf(k,j,i) = surf_usm_h(l)%iwghf_eb_window_av(m) 2937 2856 ENDDO 2938 2857 ELSE 2939 l = idsidx2940 2858 DO m = 1, surf_usm_v(l)%ns 2941 2859 i = surf_usm_v(l)%i(m) … … 2951 2869 !-- Surface temperature for surfaces 2952 2870 IF ( av == 0 ) THEN 2953 IF ( idsint == iup) THEN2954 DO m = 1, surf_usm_h %ns2955 i = surf_usm_h %i(m)2956 j = surf_usm_h %j(m)2957 k = surf_usm_h %k(m)2958 temp_pf(k,j,i) = t_surf_wall_h( m)2871 IF ( horizontal ) THEN 2872 DO m = 1, surf_usm_h(l)%ns 2873 i = surf_usm_h(l)%i(m) 2874 j = surf_usm_h(l)%j(m) 2875 k = surf_usm_h(l)%k(m) 2876 temp_pf(k,j,i) = t_surf_wall_h(l)%val(m) 2959 2877 ENDDO 2960 2878 ELSE 2961 l = idsidx2962 2879 DO m = 1, surf_usm_v(l)%ns 2963 2880 i = surf_usm_v(l)%i(m) 2964 2881 j = surf_usm_v(l)%j(m) 2965 2882 k = surf_usm_v(l)%k(m) 2966 temp_pf(k,j,i) = t_surf_wall_v(l)% t(m)2883 temp_pf(k,j,i) = t_surf_wall_v(l)%val(m) 2967 2884 ENDDO 2968 2885 ENDIF 2969 2886 ELSE 2970 IF ( idsint == iup) THEN2971 DO m = 1, surf_usm_h %ns2972 i = surf_usm_h %i(m)2973 j = surf_usm_h %j(m)2974 k = surf_usm_h %k(m)2975 temp_pf(k,j,i) = surf_usm_h %t_surf_wall_av(m)2887 IF ( horizontal ) THEN 2888 DO m = 1, surf_usm_h(l)%ns 2889 i = surf_usm_h(l)%i(m) 2890 j = surf_usm_h(l)%j(m) 2891 k = surf_usm_h(l)%k(m) 2892 temp_pf(k,j,i) = surf_usm_h(l)%t_surf_wall_av(m) 2976 2893 ENDDO 2977 2894 ELSE 2978 l = idsidx2979 2895 DO m = 1, surf_usm_v(l)%ns 2980 2896 i = surf_usm_v(l)%i(m) … … 2990 2906 !-- Surface temperature for window surfaces 2991 2907 IF ( av == 0 ) THEN 2992 IF ( idsint == iup) THEN2993 DO m = 1, surf_usm_h %ns2994 i = surf_usm_h %i(m)2995 j = surf_usm_h %j(m)2996 k = surf_usm_h %k(m)2997 temp_pf(k,j,i) = t_surf_window_h( m)2908 IF ( horizontal ) THEN 2909 DO m = 1, surf_usm_h(l)%ns 2910 i = surf_usm_h(l)%i(m) 2911 j = surf_usm_h(l)%j(m) 2912 k = surf_usm_h(l)%k(m) 2913 temp_pf(k,j,i) = t_surf_window_h(l)%val(m) 2998 2914 ENDDO 2999 2915 ELSE 3000 l = idsidx3001 2916 DO m = 1, surf_usm_v(l)%ns 3002 2917 i = surf_usm_v(l)%i(m) 3003 2918 j = surf_usm_v(l)%j(m) 3004 2919 k = surf_usm_v(l)%k(m) 3005 temp_pf(k,j,i) = t_surf_window_v(l)% t(m)2920 temp_pf(k,j,i) = t_surf_window_v(l)%val(m) 3006 2921 ENDDO 3007 2922 ENDIF 3008 2923 3009 2924 ELSE 3010 IF ( idsint == iup) THEN3011 DO m = 1, surf_usm_h %ns3012 i = surf_usm_h %i(m)3013 j = surf_usm_h %j(m)3014 k = surf_usm_h %k(m)3015 temp_pf(k,j,i) = surf_usm_h %t_surf_window_av(m)2925 IF ( horizontal ) THEN 2926 DO m = 1, surf_usm_h(l)%ns 2927 i = surf_usm_h(l)%i(m) 2928 j = surf_usm_h(l)%j(m) 2929 k = surf_usm_h(l)%k(m) 2930 temp_pf(k,j,i) = surf_usm_h(l)%t_surf_window_av(m) 3016 2931 ENDDO 3017 2932 ELSE 3018 l = idsidx3019 2933 DO m = 1, surf_usm_v(l)%ns 3020 2934 i = surf_usm_v(l)%i(m) … … 3032 2946 !-- Surface temperature for green surfaces 3033 2947 IF ( av == 0 ) THEN 3034 IF ( idsint == iup) THEN3035 DO m = 1, surf_usm_h %ns3036 i = surf_usm_h %i(m)3037 j = surf_usm_h %j(m)3038 k = surf_usm_h %k(m)3039 temp_pf(k,j,i) = t_surf_green_h( m)2948 IF ( horizontal ) THEN 2949 DO m = 1, surf_usm_h(l)%ns 2950 i = surf_usm_h(l)%i(m) 2951 j = surf_usm_h(l)%j(m) 2952 k = surf_usm_h(l)%k(m) 2953 temp_pf(k,j,i) = t_surf_green_h(l)%val(m) 3040 2954 ENDDO 3041 2955 ELSE 3042 l = idsidx3043 2956 DO m = 1, surf_usm_v(l)%ns 3044 2957 i = surf_usm_v(l)%i(m) 3045 2958 j = surf_usm_v(l)%j(m) 3046 2959 k = surf_usm_v(l)%k(m) 3047 temp_pf(k,j,i) = t_surf_green_v(l)% t(m)2960 temp_pf(k,j,i) = t_surf_green_v(l)%val(m) 3048 2961 ENDDO 3049 2962 ENDIF 3050 2963 3051 2964 ELSE 3052 IF ( idsint == iup) THEN3053 DO m = 1, surf_usm_h %ns3054 i = surf_usm_h %i(m)3055 j = surf_usm_h %j(m)3056 k = surf_usm_h %k(m)3057 temp_pf(k,j,i) = surf_usm_h %t_surf_green_av(m)2965 IF ( horizontal ) THEN 2966 DO m = 1, surf_usm_h(l)%ns 2967 i = surf_usm_h(l)%i(m) 2968 j = surf_usm_h(l)%j(m) 2969 k = surf_usm_h(l)%k(m) 2970 temp_pf(k,j,i) = surf_usm_h(l)%t_surf_green_av(m) 3058 2971 ENDDO 3059 2972 ELSE 3060 l = idsidx3061 2973 DO m = 1, surf_usm_v(l)%ns 3062 2974 i = surf_usm_v(l)%i(m) … … 3074 2986 !-- Near surface temperature for whole surfaces 3075 2987 IF ( av == 0 ) THEN 3076 IF ( idsint == iup) THEN3077 DO m = 1, surf_usm_h %ns3078 i = surf_usm_h %i(m)3079 j = surf_usm_h %j(m)3080 k = surf_usm_h %k(m)3081 temp_pf(k,j,i) = surf_usm_h %pt_10cm(m)2988 IF ( horizontal ) THEN 2989 DO m = 1, surf_usm_h(l)%ns 2990 i = surf_usm_h(l)%i(m) 2991 j = surf_usm_h(l)%j(m) 2992 k = surf_usm_h(l)%k(m) 2993 temp_pf(k,j,i) = surf_usm_h(l)%pt_10cm(m) 3082 2994 ENDDO 3083 2995 ELSE 3084 l = idsidx3085 2996 DO m = 1, surf_usm_v(l)%ns 3086 2997 i = surf_usm_v(l)%i(m) … … 3093 3004 3094 3005 ELSE 3095 IF ( idsint == iup) THEN3096 DO m = 1, surf_usm_h %ns3097 i = surf_usm_h %i(m)3098 j = surf_usm_h %j(m)3099 k = surf_usm_h %k(m)3100 temp_pf(k,j,i) = surf_usm_h %pt_10cm_av(m)3006 IF ( horizontal ) THEN 3007 DO m = 1, surf_usm_h(l)%ns 3008 i = surf_usm_h(l)%i(m) 3009 j = surf_usm_h(l)%j(m) 3010 k = surf_usm_h(l)%k(m) 3011 temp_pf(k,j,i) = surf_usm_h(l)%pt_10cm_av(m) 3101 3012 ENDDO 3102 3013 ELSE 3103 l = idsidx3104 3014 DO m = 1, surf_usm_v(l)%ns 3105 3015 i = surf_usm_v(l)%i(m) … … 3116 3026 !-- Wall temperature for iwl layer of walls and land 3117 3027 IF ( av == 0 ) THEN 3118 IF ( idsint == iup) THEN3119 DO m = 1, surf_usm_h %ns3120 i = surf_usm_h %i(m)3121 j = surf_usm_h %j(m)3122 k = surf_usm_h %k(m)3123 temp_pf(k,j,i) = t_wall_h( iwl,m)3028 IF ( horizontal ) THEN 3029 DO m = 1, surf_usm_h(l)%ns 3030 i = surf_usm_h(l)%i(m) 3031 j = surf_usm_h(l)%j(m) 3032 k = surf_usm_h(l)%k(m) 3033 temp_pf(k,j,i) = t_wall_h(l)%val(iwl,m) 3124 3034 ENDDO 3125 3035 ELSE 3126 l = idsidx3127 3036 DO m = 1, surf_usm_v(l)%ns 3128 3037 i = surf_usm_v(l)%i(m) 3129 3038 j = surf_usm_v(l)%j(m) 3130 3039 k = surf_usm_v(l)%k(m) 3131 temp_pf(k,j,i) = t_wall_v(l)% t(iwl,m)3040 temp_pf(k,j,i) = t_wall_v(l)%val(iwl,m) 3132 3041 ENDDO 3133 3042 ENDIF 3134 3043 ELSE 3135 IF ( idsint == iup) THEN3136 DO m = 1, surf_usm_h %ns3137 i = surf_usm_h %i(m)3138 j = surf_usm_h %j(m)3139 k = surf_usm_h %k(m)3140 temp_pf(k,j,i) = surf_usm_h %t_wall_av(iwl,m)3044 IF ( horizontal ) THEN 3045 DO m = 1, surf_usm_h(l)%ns 3046 i = surf_usm_h(l)%i(m) 3047 j = surf_usm_h(l)%j(m) 3048 k = surf_usm_h(l)%k(m) 3049 temp_pf(k,j,i) = surf_usm_h(l)%t_wall_av(iwl,m) 3141 3050 ENDDO 3142 3051 ELSE 3143 l = idsidx3144 3052 DO m = 1, surf_usm_v(l)%ns 3145 3053 i = surf_usm_v(l)%i(m) … … 3155 3063 !-- Window temperature for iwl layer of walls and land 3156 3064 IF ( av == 0 ) THEN 3157 IF ( idsint == iup) THEN3158 DO m = 1, surf_usm_h %ns3159 i = surf_usm_h %i(m)3160 j = surf_usm_h %j(m)3161 k = surf_usm_h %k(m)3162 temp_pf(k,j,i) = t_window_h( iwl,m)3065 IF ( horizontal ) THEN 3066 DO m = 1, surf_usm_h(l)%ns 3067 i = surf_usm_h(l)%i(m) 3068 j = surf_usm_h(l)%j(m) 3069 k = surf_usm_h(l)%k(m) 3070 temp_pf(k,j,i) = t_window_h(l)%val(iwl,m) 3163 3071 ENDDO 3164 3072 ELSE 3165 l = idsidx3166 3073 DO m = 1, surf_usm_v(l)%ns 3167 3074 i = surf_usm_v(l)%i(m) 3168 3075 j = surf_usm_v(l)%j(m) 3169 3076 k = surf_usm_v(l)%k(m) 3170 temp_pf(k,j,i) = t_window_v(l)% t(iwl,m)3077 temp_pf(k,j,i) = t_window_v(l)%val(iwl,m) 3171 3078 ENDDO 3172 3079 ENDIF 3173 3080 ELSE 3174 IF ( idsint == iup) THEN3175 DO m = 1, surf_usm_h %ns3176 i = surf_usm_h %i(m)3177 j = surf_usm_h %j(m)3178 k = surf_usm_h %k(m)3179 temp_pf(k,j,i) = surf_usm_h %t_window_av(iwl,m)3081 IF ( horizontal ) THEN 3082 DO m = 1, surf_usm_h(l)%ns 3083 i = surf_usm_h(l)%i(m) 3084 j = surf_usm_h(l)%j(m) 3085 k = surf_usm_h(l)%k(m) 3086 temp_pf(k,j,i) = surf_usm_h(l)%t_window_av(iwl,m) 3180 3087 ENDDO 3181 3088 ELSE 3182 l = idsidx3183 3089 DO m = 1, surf_usm_v(l)%ns 3184 3090 i = surf_usm_v(l)%i(m) … … 3194 3100 !-- Green temperature for iwl layer of walls and land 3195 3101 IF ( av == 0 ) THEN 3196 IF ( idsint == iup) THEN3197 DO m = 1, surf_usm_h %ns3198 i = surf_usm_h %i(m)3199 j = surf_usm_h %j(m)3200 k = surf_usm_h %k(m)3201 temp_pf(k,j,i) = t_green_h( iwl,m)3102 IF ( horizontal ) THEN 3103 DO m = 1, surf_usm_h(l)%ns 3104 i = surf_usm_h(l)%i(m) 3105 j = surf_usm_h(l)%j(m) 3106 k = surf_usm_h(l)%k(m) 3107 temp_pf(k,j,i) = t_green_h(l)%val(iwl,m) 3202 3108 ENDDO 3203 3109 ELSE 3204 l = idsidx3205 3110 DO m = 1, surf_usm_v(l)%ns 3206 3111 i = surf_usm_v(l)%i(m) 3207 3112 j = surf_usm_v(l)%j(m) 3208 3113 k = surf_usm_v(l)%k(m) 3209 temp_pf(k,j,i) = t_green_v(l)% t(iwl,m)3114 temp_pf(k,j,i) = t_green_v(l)%val(iwl,m) 3210 3115 ENDDO 3211 3116 ENDIF 3212 3117 ELSE 3213 IF ( idsint == iup) THEN3214 DO m = 1, surf_usm_h %ns3215 i = surf_usm_h %i(m)3216 j = surf_usm_h %j(m)3217 k = surf_usm_h %k(m)3218 temp_pf(k,j,i) = surf_usm_h %t_green_av(iwl,m)3118 IF ( horizontal ) THEN 3119 DO m = 1, surf_usm_h(l)%ns 3120 i = surf_usm_h(l)%i(m) 3121 j = surf_usm_h(l)%j(m) 3122 k = surf_usm_h(l)%k(m) 3123 temp_pf(k,j,i) = surf_usm_h(l)%t_green_av(iwl,m) 3219 3124 ENDDO 3220 3125 ELSE 3221 l = idsidx3222 3126 DO m = 1, surf_usm_v(l)%ns 3223 3127 i = surf_usm_v(l)%i(m) … … 3233 3137 !-- Soil water content for iwl layer of walls and land 3234 3138 IF ( av == 0 ) THEN 3235 IF ( idsint == iup ) THEN 3236 DO m = 1, surf_usm_h%ns 3237 i = surf_usm_h%i(m) 3238 j = surf_usm_h%j(m) 3239 k = surf_usm_h%k(m) 3240 temp_pf(k,j,i) = swc_h(iwl,m) 3139 IF ( horizontal ) THEN 3140 DO m = 1, surf_usm_h(l)%ns 3141 i = surf_usm_h(l)%i(m) 3142 j = surf_usm_h(l)%j(m) 3143 k = surf_usm_h(l)%k(m) 3144 temp_pf(k,j,i) = swc_h(l)%val(iwl,m) 3145 ENDDO 3146 ENDIF 3147 ELSE 3148 IF ( horizontal ) THEN 3149 DO m = 1, surf_usm_h(l)%ns 3150 i = surf_usm_h(l)%i(m) 3151 j = surf_usm_h(l)%j(m) 3152 k = surf_usm_h(l)%k(m) 3153 temp_pf(k,j,i) = surf_usm_h(l)%swc_av(iwl,m) 3241 3154 ENDDO 3242 3155 ELSE 3243 3244 ENDIF3245 ELSE3246 IF ( idsint == iup ) THEN3247 DO m = 1, surf_usm_h%ns3248 i = surf_usm_h%i(m)3249 j = surf_usm_h%j(m)3250 k = surf_usm_h%k(m)3251 temp_pf(k,j,i) = surf_usm_h%swc_av(iwl,m)3252 ENDDO3253 ELSE3254 l = idsidx3255 3156 DO m = 1, surf_usm_v(l)%ns 3256 3157 i = surf_usm_v(l)%i(m) … … 3334 3235 !> Initialization of the wall surface model 3335 3236 !--------------------------------------------------------------------------------------------------! 3336 SUBROUTINE usm_init_ material_model3237 SUBROUTINE usm_init_wall_heat_model 3337 3238 3338 3239 IMPLICIT NONE … … 3340 3241 INTEGER(iwp) :: k, l, m !< running indices 3341 3242 3342 IF ( debug_output ) CALL debug_message( 'usm_init_ material_model', 'start' )3243 IF ( debug_output ) CALL debug_message( 'usm_init_wall_heat_model', 'start' ) 3343 3244 3344 3245 ! … … 3346 3247 !-- wall layers. 3347 3248 !-- First for horizontal surfaces: 3348 DO m = 1, surf_usm_h%ns 3349 3350 surf_usm_h%dz_wall(nzb_wall,m) = surf_usm_h%zw(nzb_wall,m) 3351 DO k = nzb_wall+1, nzt_wall 3352 surf_usm_h%dz_wall(k,m) = surf_usm_h%zw(k,m) - surf_usm_h%zw(k-1,m) 3249 DO l = 0, 1 3250 DO m = 1, surf_usm_h(l)%ns 3251 3252 surf_usm_h(l)%dz_wall(nzb_wall,m) = surf_usm_h(l)%zw(nzb_wall,m) 3253 DO k = nzb_wall+1, nzt_wall 3254 surf_usm_h(l)%dz_wall(k,m) = surf_usm_h(l)%zw(k,m) - surf_usm_h(l)%zw(k-1,m) 3255 ENDDO 3256 surf_usm_h(l)%dz_window(nzb_wall,m) = surf_usm_h(l)%zw_window(nzb_wall,m) 3257 DO k = nzb_wall+1, nzt_wall 3258 surf_usm_h(l)%dz_window(k,m) = surf_usm_h(l)%zw_window(k,m) - surf_usm_h(l)%zw_window(k-1,m) 3259 ENDDO 3260 3261 surf_usm_h(l)%dz_wall(nzt_wall+1,m) = surf_usm_h(l)%dz_wall(nzt_wall,m) 3262 3263 DO k = nzb_wall, nzt_wall-1 3264 surf_usm_h(l)%dz_wall_stag(k,m) = 0.5 * ( surf_usm_h(l)%dz_wall(k+1,m) + & 3265 surf_usm_h(l)%dz_wall(k,m) ) 3266 ENDDO 3267 surf_usm_h(l)%dz_wall_stag(nzt_wall,m) = surf_usm_h(l)%dz_wall(nzt_wall,m) 3268 3269 surf_usm_h(l)%dz_window(nzt_wall+1,m) = surf_usm_h(l)%dz_window(nzt_wall,m) 3270 3271 DO k = nzb_wall, nzt_wall-1 3272 surf_usm_h(l)%dz_window_stag(k,m) = 0.5 * ( surf_usm_h(l)%dz_window(k+1,m) + & 3273 surf_usm_h(l)%dz_window(k,m) ) 3274 ENDDO 3275 surf_usm_h(l)%dz_window_stag(nzt_wall,m) = surf_usm_h(l)%dz_window(nzt_wall,m) 3276 3277 IF (surf_usm_h(l)%green_type_roof(m) == 2.0_wp ) THEN 3278 ! 3279 !-- Extensive green roof 3280 !-- Set ratio of substrate layer thickness, soil-type and LAI 3281 soil_type = 3 3282 surf_usm_h(l)%lai(m) = 2.0_wp 3283 3284 surf_usm_h(l)%zw_green(nzb_wall,m) = 0.05_wp 3285 surf_usm_h(l)%zw_green(nzb_wall+1,m) = 0.10_wp 3286 surf_usm_h(l)%zw_green(nzb_wall+2,m) = 0.15_wp 3287 surf_usm_h(l)%zw_green(nzb_wall+3,m) = 0.20_wp 3288 ELSE 3289 ! 3290 !-- Intensiv green roof 3291 !-- Set ratio of substrate layer thickness, soil-type and LAI 3292 soil_type = 6 3293 surf_usm_h(l)%lai(m) = 4.0_wp 3294 3295 surf_usm_h(l)%zw_green(nzb_wall,m) = 0.05_wp 3296 surf_usm_h(l)%zw_green(nzb_wall+1,m) = 0.10_wp 3297 surf_usm_h(l)%zw_green(nzb_wall+2,m) = 0.40_wp 3298 surf_usm_h(l)%zw_green(nzb_wall+3,m) = 0.80_wp 3299 ENDIF 3300 3301 surf_usm_h(l)%dz_green(nzb_wall,m) = surf_usm_h(l)%zw_green(nzb_wall,m) 3302 DO k = nzb_wall+1, nzt_wall 3303 surf_usm_h(l)%dz_green(k,m) = surf_usm_h(l)%zw_green(k,m) - surf_usm_h(l)%zw_green(k-1,m) 3304 ENDDO 3305 surf_usm_h(l)%dz_green(nzt_wall+1,m) = surf_usm_h(l)%dz_green(nzt_wall,m) 3306 3307 DO k = nzb_wall, nzt_wall-1 3308 surf_usm_h(l)%dz_green_stag(k,m) = 0.5 * ( surf_usm_h(l)%dz_green(k+1,m) + & 3309 surf_usm_h(l)%dz_green(k,m) ) 3310 ENDDO 3311 surf_usm_h(l)%dz_green_stag(nzt_wall,m) = surf_usm_h(l)%dz_green(nzt_wall,m) 3312 3313 IF ( alpha_vangenuchten == 9999999.9_wp ) THEN 3314 alpha_vangenuchten = soil_pars(0,soil_type) 3315 ENDIF 3316 3317 IF ( l_vangenuchten == 9999999.9_wp ) THEN 3318 l_vangenuchten = soil_pars(1,soil_type) 3319 ENDIF 3320 3321 IF ( n_vangenuchten == 9999999.9_wp ) THEN 3322 n_vangenuchten = soil_pars(2,soil_type) 3323 ENDIF 3324 3325 IF ( hydraulic_conductivity == 9999999.9_wp ) THEN 3326 hydraulic_conductivity = soil_pars(3,soil_type) 3327 ENDIF 3328 3329 IF ( saturation_moisture == 9999999.9_wp ) THEN 3330 saturation_moisture = m_soil_pars(0,soil_type) 3331 ENDIF 3332 3333 IF ( field_capacity == 9999999.9_wp ) THEN 3334 field_capacity = m_soil_pars(1,soil_type) 3335 ENDIF 3336 3337 IF ( wilting_point == 9999999.9_wp ) THEN 3338 wilting_point = m_soil_pars(2,soil_type) 3339 ENDIF 3340 3341 IF ( residual_moisture == 9999999.9_wp ) THEN 3342 residual_moisture = m_soil_pars(3,soil_type) 3343 ENDIF 3344 3345 DO k = nzb_wall, nzt_wall+1 3346 swc_h(l)%val(k,m) = field_capacity 3347 rootfr_h(l)%val(k,m) = 0.5_wp 3348 surf_usm_h(l)%alpha_vg_green(m) = alpha_vangenuchten 3349 surf_usm_h(l)%l_vg_green(m) = l_vangenuchten 3350 surf_usm_h(l)%n_vg_green(m) = n_vangenuchten 3351 surf_usm_h(l)%gamma_w_green_sat(k,m) = hydraulic_conductivity 3352 swc_sat_h(l)%val(k,m) = saturation_moisture 3353 fc_h(l)%val(k,m) = field_capacity 3354 wilt_h(l)%val(k,m) = wilting_point 3355 swc_res_h(l)%val(k,m) = residual_moisture 3356 ENDDO 3357 3353 3358 ENDDO 3354 surf_usm_h%dz_window(nzb_wall,m) = surf_usm_h%zw_window(nzb_wall,m) 3355 DO k = nzb_wall+1, nzt_wall 3356 surf_usm_h%dz_window(k,m) = surf_usm_h%zw_window(k,m) - surf_usm_h%zw_window(k-1,m) 3357 ENDDO 3358 3359 surf_usm_h%dz_wall(nzt_wall+1,m) = surf_usm_h%dz_wall(nzt_wall,m) 3360 3361 DO k = nzb_wall, nzt_wall-1 3362 surf_usm_h%dz_wall_stag(k,m) = 0.5 * ( surf_usm_h%dz_wall(k+1,m) + & 3363 surf_usm_h%dz_wall(k,m) ) 3364 ENDDO 3365 surf_usm_h%dz_wall_stag(nzt_wall,m) = surf_usm_h%dz_wall(nzt_wall,m) 3366 3367 surf_usm_h%dz_window(nzt_wall+1,m) = surf_usm_h%dz_window(nzt_wall,m) 3368 3369 DO k = nzb_wall, nzt_wall-1 3370 surf_usm_h%dz_window_stag(k,m) = 0.5 * ( surf_usm_h%dz_window(k+1,m) + & 3371 surf_usm_h%dz_window(k,m) ) 3372 ENDDO 3373 surf_usm_h%dz_window_stag(nzt_wall,m) = surf_usm_h%dz_window(nzt_wall,m) 3374 3375 IF (surf_usm_h%green_type_roof(m) == 2.0_wp ) THEN 3376 ! 3377 !-- Extensive green roof 3378 !-- Set ratio of substrate layer thickness, soil-type and LAI 3379 soil_type = 3 3380 surf_usm_h%lai(m) = 2.0_wp 3381 3382 surf_usm_h%zw_green(nzb_wall,m) = 0.05_wp 3383 surf_usm_h%zw_green(nzb_wall+1,m) = 0.10_wp 3384 surf_usm_h%zw_green(nzb_wall+2,m) = 0.15_wp 3385 surf_usm_h%zw_green(nzb_wall+3,m) = 0.20_wp 3386 ELSE 3387 ! 3388 !-- Intensiv green roof 3389 !-- Set ratio of substrate layer thickness, soil-type and LAI 3390 soil_type = 6 3391 surf_usm_h%lai(m) = 4.0_wp 3392 3393 surf_usm_h%zw_green(nzb_wall,m) = 0.05_wp 3394 surf_usm_h%zw_green(nzb_wall+1,m) = 0.10_wp 3395 surf_usm_h%zw_green(nzb_wall+2,m) = 0.40_wp 3396 surf_usm_h%zw_green(nzb_wall+3,m) = 0.80_wp 3397 ENDIF 3398 3399 surf_usm_h%dz_green(nzb_wall,m) = surf_usm_h%zw_green(nzb_wall,m) 3400 DO k = nzb_wall+1, nzt_wall 3401 surf_usm_h%dz_green(k,m) = surf_usm_h%zw_green(k,m) - surf_usm_h%zw_green(k-1,m) 3402 ENDDO 3403 surf_usm_h%dz_green(nzt_wall+1,m) = surf_usm_h%dz_green(nzt_wall,m) 3404 3405 DO k = nzb_wall, nzt_wall-1 3406 surf_usm_h%dz_green_stag(k,m) = 0.5 * ( surf_usm_h%dz_green(k+1,m) + & 3407 surf_usm_h%dz_green(k,m) ) 3408 ENDDO 3409 surf_usm_h%dz_green_stag(nzt_wall,m) = surf_usm_h%dz_green(nzt_wall,m) 3410 3411 IF ( alpha_vangenuchten == 9999999.9_wp ) THEN 3412 alpha_vangenuchten = soil_pars(0,soil_type) 3413 ENDIF 3414 3415 IF ( l_vangenuchten == 9999999.9_wp ) THEN 3416 l_vangenuchten = soil_pars(1,soil_type) 3417 ENDIF 3418 3419 IF ( n_vangenuchten == 9999999.9_wp ) THEN 3420 n_vangenuchten = soil_pars(2,soil_type) 3421 ENDIF 3422 3423 IF ( hydraulic_conductivity == 9999999.9_wp ) THEN 3424 hydraulic_conductivity = soil_pars(3,soil_type) 3425 ENDIF 3426 3427 IF ( saturation_moisture == 9999999.9_wp ) THEN 3428 saturation_moisture = m_soil_pars(0,soil_type) 3429 ENDIF 3430 3431 IF ( field_capacity == 9999999.9_wp ) THEN 3432 field_capacity = m_soil_pars(1,soil_type) 3433 ENDIF 3434 3435 IF ( wilting_point == 9999999.9_wp ) THEN 3436 wilting_point = m_soil_pars(2,soil_type) 3437 ENDIF 3438 3439 IF ( residual_moisture == 9999999.9_wp ) THEN 3440 residual_moisture = m_soil_pars(3,soil_type) 3441 ENDIF 3442 3443 DO k = nzb_wall, nzt_wall+1 3444 swc_h(k,m) = field_capacity 3445 rootfr_h(k,m) = 0.5_wp 3446 surf_usm_h%alpha_vg_green(m) = alpha_vangenuchten 3447 surf_usm_h%l_vg_green(m) = l_vangenuchten 3448 surf_usm_h%n_vg_green(m) = n_vangenuchten 3449 surf_usm_h%gamma_w_green_sat(k,m) = hydraulic_conductivity 3450 swc_sat_h(k,m) = saturation_moisture 3451 fc_h(k,m) = field_capacity 3452 wilt_h(k,m) = wilting_point 3453 swc_res_h(k,m) = residual_moisture 3454 ENDDO 3455 3359 3360 surf_usm_h(l)%ddz_wall = 1.0_wp / surf_usm_h(l)%dz_wall 3361 surf_usm_h(l)%ddz_wall_stag = 1.0_wp / surf_usm_h(l)%dz_wall_stag 3362 surf_usm_h(l)%ddz_window = 1.0_wp / surf_usm_h(l)%dz_window 3363 surf_usm_h(l)%ddz_window_stag = 1.0_wp / surf_usm_h(l)%dz_window_stag 3364 surf_usm_h(l)%ddz_green = 1.0_wp / surf_usm_h(l)%dz_green 3365 surf_usm_h(l)%ddz_green_stag = 1.0_wp / surf_usm_h(l)%dz_green_stag 3456 3366 ENDDO 3457 3458 surf_usm_h%ddz_wall = 1.0_wp / surf_usm_h%dz_wall3459 surf_usm_h%ddz_wall_stag = 1.0_wp / surf_usm_h%dz_wall_stag3460 surf_usm_h%ddz_window = 1.0_wp / surf_usm_h%dz_window3461 surf_usm_h%ddz_window_stag = 1.0_wp / surf_usm_h%dz_window_stag3462 surf_usm_h%ddz_green = 1.0_wp / surf_usm_h%dz_green3463 surf_usm_h%ddz_green_stag = 1.0_wp / surf_usm_h%dz_green_stag3464 3367 ! 3465 3368 !-- For vertical surfaces … … 3512 3415 3513 3416 3514 IF ( debug_output ) CALL debug_message( 'usm_init_ material_model', 'end' )3515 3516 END SUBROUTINE usm_init_ material_model3417 IF ( debug_output ) CALL debug_message( 'usm_init_wall_heat_model', 'end' ) 3418 3419 END SUBROUTINE usm_init_wall_heat_model 3517 3420 3518 3421 … … 3601 3504 !-- from file, if available. This flag is later used to control initialization of surface attributes. 3602 3505 !-- Todo: for the moment disable initialization of building roofs with ground-floor-level properties. 3603 surf_usm_h%ground_level = .FALSE. 3506 DO l = 0, 1 3507 surf_usm_h(l)%ground_level = .FALSE. 3508 ENDDO 3604 3509 3605 3510 DO l = 0, 3 … … 3640 3545 ! 3641 3546 !-- Initialization of resistances. 3642 DO m = 1, surf_usm_h%ns 3643 surf_usm_h%r_a(m) = 50.0_wp 3644 surf_usm_h%r_a_green(m) = 50.0_wp 3645 surf_usm_h%r_a_window(m) = 50.0_wp 3547 DO l = 0, 1 3548 DO m = 1, surf_usm_h(l)%ns 3549 surf_usm_h(l)%r_a(m) = 50.0_wp 3550 surf_usm_h(l)%r_a_green(m) = 50.0_wp 3551 surf_usm_h(l)%r_a_window(m) = 50.0_wp 3552 ENDDO 3646 3553 ENDDO 3647 3554 DO l = 0, 3 … … 3655 3562 ! 3656 3563 !-- Map values onto horizontal elemements 3657 DO m = 1, surf_usm_h%ns 3658 surf_usm_h%r_canopy(m) = 200.0_wp !< canopy_resistance 3659 surf_usm_h%r_canopy_min(m) = 200.0_wp !< min_canopy_resistance 3660 surf_usm_h%g_d(m) = 0.0_wp !< canopy_resistance_coefficient 3564 DO l = 0, 1 3565 DO m = 1, surf_usm_h(l)%ns 3566 surf_usm_h(l)%r_canopy(m) = 200.0_wp !< canopy_resistance 3567 surf_usm_h(l)%r_canopy_min(m) = 200.0_wp !< min_canopy_resistance 3568 surf_usm_h(l)%g_d(m) = 0.0_wp !< canopy_resistance_coefficient 3569 ENDDO 3661 3570 ENDDO 3662 3571 ! … … 3674 3583 !-- follow a 3-level approach. 3675 3584 !-- Level 1 - initialization via default attributes 3676 DO m = 1, surf_usm_h%ns 3677 ! 3678 !-- Now, all horizontal surfaces are roof surfaces (?) 3679 surf_usm_h%isroof_surf(m) = .TRUE. 3680 surf_usm_h%surface_types(m) = roof_category !< default category for root surface 3681 ! 3682 !-- In order to distinguish between ground floor level and above-ground-floor level surfaces, 3683 !-- set input indices. 3684 3685 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 3686 surf_usm_h%ground_level(m) ) 3687 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) ) 3688 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) ) 3689 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) ) 3690 ! 3691 !-- Store building type and its name on each surface element 3692 surf_usm_h%building_type(m) = building_type 3693 surf_usm_h%building_type_name(m) = building_type_name(building_type) 3694 ! 3695 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 3696 surf_usm_h%frac(m,ind_veg_wall) = building_pars(ind_wall_frac_r,building_type) 3697 surf_usm_h%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,building_type) 3698 surf_usm_h%frac(m,ind_wat_win) = building_pars(ind_win_frac_r,building_type) 3699 surf_usm_h%lai(m) = building_pars(ind_lai_r,building_type) 3700 3701 surf_usm_h%rho_c_wall(nzb_wall,m) = building_pars(ind_hc1_wall_r,building_type) 3702 surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1_wall_r,building_type) 3703 surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2_wall_r,building_type) 3704 surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3_wall_r,building_type) 3705 surf_usm_h%lambda_h(nzb_wall,m) = building_pars(ind_tc1_wall_r,building_type) 3706 surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1_wall_r,building_type) 3707 surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2_wall_r,building_type) 3708 surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3_wall_r,building_type) 3709 surf_usm_h%rho_c_green(nzb_wall,m) = rho_c_soil !building_pars(ind_hc1_wall_r,building_type) 3710 surf_usm_h%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1_wall_r,building_type) 3711 surf_usm_h%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2_wall_r,building_type) 3712 surf_usm_h%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3_wall_r,building_type) 3713 surf_usm_h%lambda_h_green(nzb_wall,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type) 3714 surf_usm_h%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type) 3715 surf_usm_h%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2_wall_r,building_type) 3716 surf_usm_h%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3_wall_r,building_type) 3717 surf_usm_h%rho_c_window(nzb_wall,m) = building_pars(ind_hc1_win_r,building_type) 3718 surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win_r,building_type) 3719 surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win_r,building_type) 3720 surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win_r,building_type) 3721 surf_usm_h%lambda_h_window(nzb_wall,m) = building_pars(ind_tc1_win_r,building_type) 3722 surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,building_type) 3723 surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,building_type) 3724 surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,building_type) 3725 3726 surf_usm_h%target_temp_summer(m) = building_pars(ind_indoor_target_temp_summer,building_type) 3727 surf_usm_h%target_temp_winter(m) = building_pars(ind_indoor_target_temp_winter,building_type) 3728 ! 3729 !-- Emissivity of wall-, green- and window fraction 3730 surf_usm_h%emissivity(m,ind_veg_wall) = building_pars(ind_emis_wall_r,building_type) 3731 surf_usm_h%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,building_type) 3732 surf_usm_h%emissivity(m,ind_wat_win) = building_pars(ind_emis_win_r,building_type) 3733 3734 surf_usm_h%transmissivity(m) = building_pars(ind_trans_r,building_type) 3735 3736 surf_usm_h%z0(m) = building_pars(ind_z0,building_type) 3737 surf_usm_h%z0h(m) = building_pars(ind_z0qh,building_type) 3738 surf_usm_h%z0q(m) = building_pars(ind_z0qh,building_type) 3739 ! 3740 !-- Albedo type for wall fraction, green fraction, window fraction 3741 surf_usm_h%albedo_type(m,ind_veg_wall) = INT( building_pars(ind_alb_wall_r,building_type) ) 3742 surf_usm_h%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,building_type) ) 3743 surf_usm_h%albedo_type(m,ind_wat_win) = INT( building_pars(ind_alb_win_r,building_type) ) 3744 3745 surf_usm_h%zw(nzb_wall,m) = building_pars(ind_thick_1_wall_r,building_type) 3746 surf_usm_h%zw(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,building_type) 3747 surf_usm_h%zw(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,building_type) 3748 surf_usm_h%zw(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,building_type) 3749 3750 surf_usm_h%zw_green(nzb_wall,m) = building_pars(ind_thick_1_wall_r,building_type) 3751 surf_usm_h%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,building_type) 3752 surf_usm_h%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,building_type) 3753 surf_usm_h%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,building_type) 3754 3755 surf_usm_h%zw_window(nzb_wall,m) = building_pars(ind_thick_1_win_r,building_type) 3756 surf_usm_h%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win_r,building_type) 3757 surf_usm_h%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win_r,building_type) 3758 surf_usm_h%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win_r,building_type) 3759 3760 surf_usm_h%green_type_roof(m) = building_pars(ind_green_type_roof,building_type) 3761 3585 DO l = 0, 1 3586 DO m = 1, surf_usm_h(l)%ns 3587 ! 3588 !-- Now, all horizontal surfaces are roof surfaces (?) 3589 surf_usm_h(l)%isroof_surf(m) = .TRUE. 3590 surf_usm_h(l)%surface_types(m) = roof_category !< default category for root surface 3591 ! 3592 !-- In order to distinguish between ground floor level and above-ground-floor level surfaces, 3593 !-- set input indices. 3594 3595 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 3596 surf_usm_h(l)%ground_level(m) ) 3597 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h(l)%ground_level(m) ) 3598 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h(l)%ground_level(m) ) 3599 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h(l)%ground_level(m) ) 3600 ! 3601 !-- Store building type and its name on each surface element 3602 surf_usm_h(l)%building_type(m) = building_type 3603 surf_usm_h(l)%building_type_name(m) = building_type_name(building_type) 3604 ! 3605 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 3606 surf_usm_h(l)%frac(m,ind_veg_wall) = building_pars(ind_wall_frac_r,building_type) 3607 surf_usm_h(l)%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,building_type) 3608 surf_usm_h(l)%frac(m,ind_wat_win) = building_pars(ind_win_frac_r,building_type) 3609 surf_usm_h(l)%lai(m) = building_pars(ind_lai_r,building_type) 3610 3611 surf_usm_h(l)%rho_c_wall(nzb_wall,m) = building_pars(ind_hc1_wall_r,building_type) 3612 surf_usm_h(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1_wall_r,building_type) 3613 surf_usm_h(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2_wall_r,building_type) 3614 surf_usm_h(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3_wall_r,building_type) 3615 surf_usm_h(l)%lambda_h(nzb_wall,m) = building_pars(ind_tc1_wall_r,building_type) 3616 surf_usm_h(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1_wall_r,building_type) 3617 surf_usm_h(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2_wall_r,building_type) 3618 surf_usm_h(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3_wall_r,building_type) 3619 surf_usm_h(l)%rho_c_green(nzb_wall,m) = rho_c_soil !building_pars(ind_hc1_wall_r,building_type) 3620 surf_usm_h(l)%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1_wall_r,building_type) 3621 surf_usm_h(l)%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2_wall_r,building_type) 3622 surf_usm_h(l)%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3_wall_r,building_type) 3623 surf_usm_h(l)%lambda_h_green(nzb_wall,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type) 3624 surf_usm_h(l)%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type) 3625 surf_usm_h(l)%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2_wall_r,building_type) 3626 surf_usm_h(l)%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3_wall_r,building_type) 3627 surf_usm_h(l)%rho_c_window(nzb_wall,m) = building_pars(ind_hc1_win_r,building_type) 3628 surf_usm_h(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win_r,building_type) 3629 surf_usm_h(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win_r,building_type) 3630 surf_usm_h(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win_r,building_type) 3631 surf_usm_h(l)%lambda_h_window(nzb_wall,m) = building_pars(ind_tc1_win_r,building_type) 3632 surf_usm_h(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,building_type) 3633 surf_usm_h(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,building_type) 3634 surf_usm_h(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,building_type) 3635 3636 surf_usm_h(l)%target_temp_summer(m) = building_pars(ind_indoor_target_temp_summer,building_type) 3637 surf_usm_h(l)%target_temp_winter(m) = building_pars(ind_indoor_target_temp_winter,building_type) 3638 ! 3639 !-- Emissivity of wall-, green- and window fraction 3640 surf_usm_h(l)%emissivity(m,ind_veg_wall) = building_pars(ind_emis_wall_r,building_type) 3641 surf_usm_h(l)%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,building_type) 3642 surf_usm_h(l)%emissivity(m,ind_wat_win) = building_pars(ind_emis_win_r,building_type) 3643 3644 surf_usm_h(l)%transmissivity(m) = building_pars(ind_trans_r,building_type) 3645 3646 surf_usm_h(l)%z0(m) = building_pars(ind_z0,building_type) 3647 surf_usm_h(l)%z0h(m) = building_pars(ind_z0qh,building_type) 3648 surf_usm_h(l)%z0q(m) = building_pars(ind_z0qh,building_type) 3649 ! 3650 !-- Albedo type for wall fraction, green fraction, window fraction 3651 surf_usm_h(l)%albedo_type(m,ind_veg_wall) = INT( building_pars(ind_alb_wall_r,building_type) ) 3652 surf_usm_h(l)%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,building_type) ) 3653 surf_usm_h(l)%albedo_type(m,ind_wat_win) = INT( building_pars(ind_alb_win_r,building_type) ) 3654 3655 surf_usm_h(l)%zw(nzb_wall,m) = building_pars(ind_thick_1_wall_r,building_type) 3656 surf_usm_h(l)%zw(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,building_type) 3657 surf_usm_h(l)%zw(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,building_type) 3658 surf_usm_h(l)%zw(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,building_type) 3659 3660 surf_usm_h(l)%zw_green(nzb_wall,m) = building_pars(ind_thick_1_wall_r,building_type) 3661 surf_usm_h(l)%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,building_type) 3662 surf_usm_h(l)%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,building_type) 3663 surf_usm_h(l)%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,building_type) 3664 3665 surf_usm_h(l)%zw_window(nzb_wall,m) = building_pars(ind_thick_1_win_r,building_type) 3666 surf_usm_h(l)%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win_r,building_type) 3667 surf_usm_h(l)%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win_r,building_type) 3668 surf_usm_h(l)%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win_r,building_type) 3669 3670 surf_usm_h(l)%green_type_roof(m) = building_pars(ind_green_type_roof,building_type) 3671 ENDDO 3762 3672 ENDDO 3763 3673 … … 3918 3828 !-- Level 2 - initialization via building type read from file 3919 3829 IF ( building_type_f%from_file ) THEN 3920 DO m = 1, surf_usm_h%ns 3921 i = surf_usm_h%i(m) 3922 j = surf_usm_h%j(m) 3923 ! 3924 !-- For the moment, limit building type to 6 (to overcome errors in input file). 3925 st = building_type_f%var(j,i) 3926 IF ( st /= building_type_f%fill ) THEN 3927 3928 ! 3929 !-- In order to distinguish between ground floor level and above-ground-floor level 3930 !-- surfaces, set input indices. 3931 3932 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 3933 surf_usm_h%ground_level(m) ) 3934 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) ) 3935 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) ) 3936 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) ) 3937 ! 3938 !-- Store building type and its name on each surface element 3939 surf_usm_h%building_type(m) = st 3940 surf_usm_h%building_type_name(m) = building_type_name(st) 3941 ! 3942 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 3943 surf_usm_h%frac(m,ind_veg_wall) = building_pars(ind_wall_frac_r,st) 3944 surf_usm_h%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,st) 3945 surf_usm_h%frac(m,ind_wat_win) = building_pars(ind_win_frac_r,st) 3946 surf_usm_h%lai(m) = building_pars(ind_lai_r,st) 3947 3948 surf_usm_h%rho_c_wall(nzb_wall,m) = building_pars(ind_hc1_wall_r,st) 3949 surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1_wall_r,st) 3950 surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2_wall_r,st) 3951 surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3_wall_r,st) 3952 surf_usm_h%lambda_h(nzb_wall,m) = building_pars(ind_tc1_wall_r,st) 3953 surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1_wall_r,st) 3954 surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2_wall_r,st) 3955 surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3_wall_r,st) 3956 3957 surf_usm_h%rho_c_green(nzb_wall,m) = rho_c_soil !building_pars(ind_hc1_wall_r,st) 3958 surf_usm_h%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1_wall_r,st) 3959 surf_usm_h%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2_wall_r,st) 3960 surf_usm_h%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3_wall_r,st) 3961 surf_usm_h%lambda_h_green(nzb_wall,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st) 3962 surf_usm_h%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st) 3963 surf_usm_h%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2_wall_r,st) 3964 surf_usm_h%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3_wall_r,st) 3965 3966 surf_usm_h%rho_c_window(nzb_wall,m) = building_pars(ind_hc1_win_r,st) 3967 surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win_r,st) 3968 surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win_r,st) 3969 surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win_r,st) 3970 surf_usm_h%lambda_h_window(nzb_wall,m) = building_pars(ind_tc1_win_r,st) 3971 surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,st) 3972 surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,st) 3973 surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,st) 3974 3975 surf_usm_h%target_temp_summer(m) = building_pars(ind_indoor_target_temp_summer,st) 3976 surf_usm_h%target_temp_winter(m) = building_pars(ind_indoor_target_temp_winter,st) 3977 ! 3978 !-- Emissivity of wall-, green- and window fraction 3979 surf_usm_h%emissivity(m,ind_veg_wall) = building_pars(ind_emis_wall_r,st) 3980 surf_usm_h%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,st) 3981 surf_usm_h%emissivity(m,ind_wat_win) = building_pars(ind_emis_win_r,st) 3982 3983 surf_usm_h%transmissivity(m) = building_pars(ind_trans_r,st) 3984 3985 surf_usm_h%z0(m) = building_pars(ind_z0,st) 3986 surf_usm_h%z0h(m) = building_pars(ind_z0qh,st) 3987 surf_usm_h%z0q(m) = building_pars(ind_z0qh,st) 3988 ! 3989 !-- Albedo type for wall fraction, green fraction, window fraction 3990 surf_usm_h%albedo_type(m,ind_veg_wall) = INT( building_pars(ind_alb_wall_r,st) ) 3991 surf_usm_h%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,st) ) 3992 surf_usm_h%albedo_type(m,ind_wat_win) = INT( building_pars(ind_alb_win_r,st) ) 3993 3994 surf_usm_h%zw(nzb_wall,m) = building_pars(ind_thick_1_wall_r,st) 3995 surf_usm_h%zw(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st) 3996 surf_usm_h%zw(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st) 3997 surf_usm_h%zw(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st) 3998 3999 surf_usm_h%zw_green(nzb_wall,m) = building_pars(ind_thick_1_wall_r,st) 4000 surf_usm_h%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st) 4001 surf_usm_h%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st) 4002 surf_usm_h%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st) 4003 4004 surf_usm_h%zw_window(nzb_wall,m) = building_pars(ind_thick_1_win_r,st) 4005 surf_usm_h%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win_r,st) 4006 surf_usm_h%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win_r,st) 4007 surf_usm_h%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win_r,st) 4008 4009 surf_usm_h%green_type_roof(m) = building_pars(ind_green_type_roof,st) 4010 4011 ENDIF 3830 DO l = 0, 1 3831 DO m = 1, surf_usm_h(l)%ns 3832 i = surf_usm_h(l)%i(m) 3833 j = surf_usm_h(l)%j(m) 3834 ! 3835 !-- For the moment, limit building type to 6 (to overcome errors in input file). 3836 st = building_type_f%var(j,i) 3837 IF ( st /= building_type_f%fill ) THEN 3838 3839 ! 3840 !-- In order to distinguish between ground floor level and above-ground-floor level 3841 !-- surfaces, set input indices. 3842 3843 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 3844 surf_usm_h(l)%ground_level(m) ) 3845 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h(l)%ground_level(m) ) 3846 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h(l)%ground_level(m) ) 3847 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h(l)%ground_level(m) ) 3848 ! 3849 !-- Store building type and its name on each surface element 3850 surf_usm_h(l)%building_type(m) = st 3851 surf_usm_h(l)%building_type_name(m) = building_type_name(st) 3852 ! 3853 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 3854 surf_usm_h(l)%frac(m,ind_veg_wall) = building_pars(ind_wall_frac_r,st) 3855 surf_usm_h(l)%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,st) 3856 surf_usm_h(l)%frac(m,ind_wat_win) = building_pars(ind_win_frac_r,st) 3857 surf_usm_h(l)%lai(m) = building_pars(ind_lai_r,st) 3858 3859 surf_usm_h(l)%rho_c_wall(nzb_wall,m) = building_pars(ind_hc1_wall_r,st) 3860 surf_usm_h(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1_wall_r,st) 3861 surf_usm_h(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2_wall_r,st) 3862 surf_usm_h(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3_wall_r,st) 3863 surf_usm_h(l)%lambda_h(nzb_wall,m) = building_pars(ind_tc1_wall_r,st) 3864 surf_usm_h(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1_wall_r,st) 3865 surf_usm_h(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2_wall_r,st) 3866 surf_usm_h(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3_wall_r,st) 3867 3868 surf_usm_h(l)%rho_c_green(nzb_wall,m) = rho_c_soil !building_pars(ind_hc1_wall_r,st) 3869 surf_usm_h(l)%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1_wall_r,st) 3870 surf_usm_h(l)%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2_wall_r,st) 3871 surf_usm_h(l)%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3_wall_r,st) 3872 surf_usm_h(l)%lambda_h_green(nzb_wall,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st) 3873 surf_usm_h(l)%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st) 3874 surf_usm_h(l)%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2_wall_r,st) 3875 surf_usm_h(l)%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3_wall_r,st) 3876 3877 surf_usm_h(l)%rho_c_window(nzb_wall,m) = building_pars(ind_hc1_win_r,st) 3878 surf_usm_h(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win_r,st) 3879 surf_usm_h(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win_r,st) 3880 surf_usm_h(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win_r,st) 3881 surf_usm_h(l)%lambda_h_window(nzb_wall,m) = building_pars(ind_tc1_win_r,st) 3882 surf_usm_h(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,st) 3883 surf_usm_h(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,st) 3884 surf_usm_h(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,st) 3885 3886 surf_usm_h(l)%target_temp_summer(m) = building_pars(ind_indoor_target_temp_summer,st) 3887 surf_usm_h(l)%target_temp_winter(m) = building_pars(ind_indoor_target_temp_winter,st) 3888 ! 3889 !-- Emissivity of wall-, green- and window fraction 3890 surf_usm_h(l)%emissivity(m,ind_veg_wall) = building_pars(ind_emis_wall_r,st) 3891 surf_usm_h(l)%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,st) 3892 surf_usm_h(l)%emissivity(m,ind_wat_win) = building_pars(ind_emis_win_r,st) 3893 3894 surf_usm_h(l)%transmissivity(m) = building_pars(ind_trans_r,st) 3895 3896 surf_usm_h(l)%z0(m) = building_pars(ind_z0,st) 3897 surf_usm_h(l)%z0h(m) = building_pars(ind_z0qh,st) 3898 surf_usm_h(l)%z0q(m) = building_pars(ind_z0qh,st) 3899 ! 3900 !-- Albedo type for wall fraction, green fraction, window fraction 3901 surf_usm_h(l)%albedo_type(m,ind_veg_wall) = INT( building_pars(ind_alb_wall_r,st) ) 3902 surf_usm_h(l)%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,st) ) 3903 surf_usm_h(l)%albedo_type(m,ind_wat_win) = INT( building_pars(ind_alb_win_r,st) ) 3904 3905 surf_usm_h(l)%zw(nzb_wall,m) = building_pars(ind_thick_1_wall_r,st) 3906 surf_usm_h(l)%zw(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st) 3907 surf_usm_h(l)%zw(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st) 3908 surf_usm_h(l)%zw(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st) 3909 3910 surf_usm_h(l)%zw_green(nzb_wall,m) = building_pars(ind_thick_1_wall_r,st) 3911 surf_usm_h(l)%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st) 3912 surf_usm_h(l)%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st) 3913 surf_usm_h(l)%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st) 3914 3915 surf_usm_h(l)%zw_window(nzb_wall,m) = building_pars(ind_thick_1_win_r,st) 3916 surf_usm_h(l)%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win_r,st) 3917 surf_usm_h(l)%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win_r,st) 3918 surf_usm_h(l)%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win_r,st) 3919 3920 surf_usm_h(l)%green_type_roof(m) = building_pars(ind_green_type_roof,st) 3921 3922 ENDIF 3923 ENDDO 4012 3924 ENDDO 4013 3925 … … 4179 4091 !-- on level 1 or 2. 4180 4092 IF ( building_pars_f%from_file ) THEN 4181 DO m = 1, surf_usm_h%ns 4182 i = surf_usm_h%i(m) 4183 j = surf_usm_h%j(m) 4184 4185 ! 4186 !-- In order to distinguish between ground floor level and above-ground-floor level surfaces, 4187 !-- set input indices. 4188 ind_wall_frac = MERGE( ind_wall_frac_gfl, ind_wall_frac_agfl, & 4189 surf_usm_h%ground_level(m) ) 4190 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 4191 surf_usm_h%ground_level(m) ) 4192 ind_win_frac = MERGE( ind_win_frac_gfl, ind_win_frac_agfl, & 4193 surf_usm_h%ground_level(m) ) 4194 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) ) 4195 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) ) 4196 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) ) 4197 ind_hc1 = MERGE( ind_hc1_gfl, ind_hc1_agfl, surf_usm_h%ground_level(m) ) 4198 ind_hc2 = MERGE( ind_hc2_gfl, ind_hc2_agfl, surf_usm_h%ground_level(m) ) 4199 ind_hc3 = MERGE( ind_hc3_gfl, ind_hc3_agfl, surf_usm_h%ground_level(m) ) 4200 ind_tc1 = MERGE( ind_tc1_gfl, ind_tc1_agfl, surf_usm_h%ground_level(m) ) 4201 ind_tc2 = MERGE( ind_tc2_gfl, ind_tc2_agfl, surf_usm_h%ground_level(m) ) 4202 ind_tc3 = MERGE( ind_tc3_gfl, ind_tc3_agfl, surf_usm_h%ground_level(m) ) 4203 ind_emis_wall = MERGE( ind_emis_wall_gfl, ind_emis_wall_agfl, & 4204 surf_usm_h%ground_level(m) ) 4205 ind_emis_green = MERGE( ind_emis_green_gfl, ind_emis_green_agfl, & 4206 surf_usm_h%ground_level(m) ) 4207 ind_emis_win = MERGE( ind_emis_win_gfl, ind_emis_win_agfl, & 4208 surf_usm_h%ground_level(m) ) 4209 ind_trans = MERGE( ind_trans_gfl, ind_trans_agfl, surf_usm_h%ground_level(m) ) 4210 4211 ! 4212 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 4213 IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /= building_pars_f%fill ) & 4214 surf_usm_h%frac(m,ind_veg_wall) = building_pars_f%pars_xy(ind_wall_frac,j,i) 4215 4216 IF ( building_pars_f%pars_xy(ind_green_frac_r,j,i) /= building_pars_f%fill ) & 4217 surf_usm_h%frac(m,ind_pav_green) = building_pars_f%pars_xy(ind_green_frac_r,j,i) 4218 4219 IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /= building_pars_f%fill ) & 4220 surf_usm_h%frac(m,ind_wat_win) = building_pars_f%pars_xy(ind_win_frac,j,i) 4221 4222 IF ( building_pars_f%pars_xy(ind_lai_r,j,i) /= building_pars_f%fill ) & 4223 surf_usm_h%lai(m) = building_pars_f%pars_xy(ind_lai_r,j,i) 4224 4225 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4226 surf_usm_h%rho_c_wall(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4227 surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4228 ENDIF 4229 4230 4231 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4232 surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4233 4234 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4235 surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4236 4237 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4238 surf_usm_h%rho_c_green(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4239 surf_usm_h%rho_c_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4240 ENDIF 4241 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4242 surf_usm_h%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4243 4244 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4245 surf_usm_h%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4246 4247 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4248 surf_usm_h%rho_c_window(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4249 surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4250 ENDIF 4251 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4252 surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4253 4254 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4255 surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4256 4257 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4258 surf_usm_h%lambda_h(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4259 surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4260 ENDIF 4261 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4262 surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4263 4264 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4265 surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4266 4267 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4268 surf_usm_h%lambda_h_green(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4269 surf_usm_h%lambda_h_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4270 ENDIF 4271 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4272 surf_usm_h%lambda_h_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4273 4274 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4275 surf_usm_h%lambda_h_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4276 4277 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4278 surf_usm_h%lambda_h_window(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4279 surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4280 ENDIF 4281 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4282 surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4283 4284 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4285 surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4286 4287 IF ( building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i) /= & 4288 building_pars_f%fill ) & 4289 surf_usm_h%target_temp_summer(m) = & 4290 building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i) 4291 4292 IF ( building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i) /= & 4293 building_pars_f%fill ) & 4294 surf_usm_h%target_temp_winter(m) = & 4295 building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i) 4296 4297 IF ( building_pars_f%pars_xy(ind_emis_wall,j,i) /= building_pars_f%fill ) & 4298 surf_usm_h%emissivity(m,ind_veg_wall) = building_pars_f%pars_xy(ind_emis_wall,j,i) 4299 4300 IF ( building_pars_f%pars_xy(ind_emis_green,j,i) /= building_pars_f%fill ) & 4301 surf_usm_h%emissivity(m,ind_pav_green) = building_pars_f%pars_xy(ind_emis_green,j,i) 4302 4303 IF ( building_pars_f%pars_xy(ind_emis_win,j,i) /= building_pars_f%fill ) & 4304 surf_usm_h%emissivity(m,ind_wat_win) = building_pars_f%pars_xy(ind_emis_win,j,i) 4305 4306 IF ( building_pars_f%pars_xy(ind_trans,j,i) /= building_pars_f%fill ) & 4307 surf_usm_h%transmissivity(m) = building_pars_f%pars_xy(ind_trans,j,i) 4308 4309 IF ( building_pars_f%pars_xy(ind_z0,j,i) /= building_pars_f%fill ) & 4310 surf_usm_h%z0(m) = building_pars_f%pars_xy(ind_z0,j,i) 4311 4312 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill ) & 4313 surf_usm_h%z0h(m) = building_pars_f%pars_xy(ind_z0qh,j,i) 4314 4315 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill ) & 4316 surf_usm_h%z0q(m) = building_pars_f%pars_xy(ind_z0qh,j,i) 4317 4318 IF ( building_pars_f%pars_xy(ind_alb_wall_agfl,j,i) /= building_pars_f%fill ) & 4319 surf_usm_h%albedo_type(m,ind_veg_wall) = & 4320 building_pars_f%pars_xy(ind_alb_wall_agfl,j,i) 4321 4322 IF ( building_pars_f%pars_xy(ind_alb_green_agfl,j,i) /= building_pars_f%fill ) & 4323 surf_usm_h%albedo_type(m,ind_pav_green) = & 4324 building_pars_f%pars_xy(ind_alb_green_agfl,j,i) 4325 4326 IF ( building_pars_f%pars_xy(ind_alb_win_agfl,j,i) /= building_pars_f%fill ) & 4327 surf_usm_h%albedo_type(m,ind_wat_win) = & 4328 building_pars_f%pars_xy(ind_alb_win_agfl,j,i) 4329 4330 IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill ) & 4331 surf_usm_h%zw(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i) 4332 4333 IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill ) & 4334 surf_usm_h%zw(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i) 4335 4336 IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill ) & 4337 surf_usm_h%zw(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i) 4338 4339 IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill ) & 4340 surf_usm_h%zw(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i) 4341 4342 IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill ) & 4343 surf_usm_h%zw_green(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i) 4344 4345 IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill ) & 4346 surf_usm_h%zw_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i) 4347 4348 IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill ) & 4349 surf_usm_h%zw_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i) 4350 4351 IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill ) & 4352 surf_usm_h%zw_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i) 4093 DO l = 0, 1 4094 DO m = 1, surf_usm_h(l)%ns 4095 i = surf_usm_h(l)%i(m) 4096 j = surf_usm_h(l)%j(m) 4097 4098 ! 4099 !-- In order to distinguish between ground floor level and above-ground-floor level surfaces, 4100 !-- set input indices. 4101 ind_wall_frac = MERGE( ind_wall_frac_gfl, ind_wall_frac_agfl, & 4102 surf_usm_h(l)%ground_level(m) ) 4103 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, & 4104 surf_usm_h(l)%ground_level(m) ) 4105 ind_win_frac = MERGE( ind_win_frac_gfl, ind_win_frac_agfl, & 4106 surf_usm_h(l)%ground_level(m) ) 4107 ind_lai_r = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h(l)%ground_level(m) ) 4108 ind_z0 = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h(l)%ground_level(m) ) 4109 ind_z0qh = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h(l)%ground_level(m) ) 4110 ind_hc1 = MERGE( ind_hc1_gfl, ind_hc1_agfl, surf_usm_h(l)%ground_level(m) ) 4111 ind_hc2 = MERGE( ind_hc2_gfl, ind_hc2_agfl, surf_usm_h(l)%ground_level(m) ) 4112 ind_hc3 = MERGE( ind_hc3_gfl, ind_hc3_agfl, surf_usm_h(l)%ground_level(m) ) 4113 ind_tc1 = MERGE( ind_tc1_gfl, ind_tc1_agfl, surf_usm_h(l)%ground_level(m) ) 4114 ind_tc2 = MERGE( ind_tc2_gfl, ind_tc2_agfl, surf_usm_h(l)%ground_level(m) ) 4115 ind_tc3 = MERGE( ind_tc3_gfl, ind_tc3_agfl, surf_usm_h(l)%ground_level(m) ) 4116 ind_emis_wall = MERGE( ind_emis_wall_gfl, ind_emis_wall_agfl, & 4117 surf_usm_h(l)%ground_level(m) ) 4118 ind_emis_green = MERGE( ind_emis_green_gfl, ind_emis_green_agfl, & 4119 surf_usm_h(l)%ground_level(m) ) 4120 ind_emis_win = MERGE( ind_emis_win_gfl, ind_emis_win_agfl, & 4121 surf_usm_h(l)%ground_level(m) ) 4122 ind_trans = MERGE( ind_trans_gfl, ind_trans_agfl, surf_usm_h(l)%ground_level(m) ) 4123 4124 ! 4125 !-- Initialize relatvie wall- (0), green- (1) and window (2) fractions 4126 IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /= building_pars_f%fill ) & 4127 surf_usm_h(l)%frac(m,ind_veg_wall) = building_pars_f%pars_xy(ind_wall_frac,j,i) 4128 4129 IF ( building_pars_f%pars_xy(ind_green_frac_r,j,i) /= building_pars_f%fill ) & 4130 surf_usm_h(l)%frac(m,ind_pav_green) = building_pars_f%pars_xy(ind_green_frac_r,j,i) 4131 4132 IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /= building_pars_f%fill ) & 4133 surf_usm_h(l)%frac(m,ind_wat_win) = building_pars_f%pars_xy(ind_win_frac,j,i) 4134 4135 IF ( building_pars_f%pars_xy(ind_lai_r,j,i) /= building_pars_f%fill ) & 4136 surf_usm_h(l)%lai(m) = building_pars_f%pars_xy(ind_lai_r,j,i) 4137 4138 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4139 surf_usm_h(l)%rho_c_wall(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4140 surf_usm_h(l)%rho_c_wall(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4141 ENDIF 4142 4143 4144 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4145 surf_usm_h(l)%rho_c_wall(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4146 4147 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4148 surf_usm_h(l)%rho_c_wall(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4149 4150 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4151 surf_usm_h(l)%rho_c_green(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4152 surf_usm_h(l)%rho_c_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4153 ENDIF 4154 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4155 surf_usm_h(l)%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4156 4157 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4158 surf_usm_h(l)%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4159 4160 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill ) THEN 4161 surf_usm_h(l)%rho_c_window(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4162 surf_usm_h(l)%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i) 4163 ENDIF 4164 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill ) & 4165 surf_usm_h(l)%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i) 4166 4167 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill ) & 4168 surf_usm_h(l)%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i) 4169 4170 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4171 surf_usm_h(l)%lambda_h(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4172 surf_usm_h(l)%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4173 ENDIF 4174 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4175 surf_usm_h(l)%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4176 4177 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4178 surf_usm_h(l)%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4179 4180 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4181 surf_usm_h(l)%lambda_h_green(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4182 surf_usm_h(l)%lambda_h_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4183 ENDIF 4184 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4185 surf_usm_h(l)%lambda_h_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4186 4187 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4188 surf_usm_h(l)%lambda_h_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4189 4190 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill ) THEN 4191 surf_usm_h(l)%lambda_h_window(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4192 surf_usm_h(l)%lambda_h_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i) 4193 ENDIF 4194 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill ) & 4195 surf_usm_h(l)%lambda_h_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i) 4196 4197 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill ) & 4198 surf_usm_h(l)%lambda_h_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i) 4199 4200 IF ( building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i) /= & 4201 building_pars_f%fill ) & 4202 surf_usm_h(l)%target_temp_summer(m) = & 4203 building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i) 4204 4205 IF ( building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i) /= & 4206 building_pars_f%fill ) & 4207 surf_usm_h(l)%target_temp_winter(m) = & 4208 building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i) 4209 4210 IF ( building_pars_f%pars_xy(ind_emis_wall,j,i) /= building_pars_f%fill ) & 4211 surf_usm_h(l)%emissivity(m,ind_veg_wall) = building_pars_f%pars_xy(ind_emis_wall,j,i) 4212 4213 IF ( building_pars_f%pars_xy(ind_emis_green,j,i) /= building_pars_f%fill ) & 4214 surf_usm_h(l)%emissivity(m,ind_pav_green) = building_pars_f%pars_xy(ind_emis_green,j,i) 4215 4216 IF ( building_pars_f%pars_xy(ind_emis_win,j,i) /= building_pars_f%fill ) & 4217 surf_usm_h(l)%emissivity(m,ind_wat_win) = building_pars_f%pars_xy(ind_emis_win,j,i) 4218 4219 IF ( building_pars_f%pars_xy(ind_trans,j,i) /= building_pars_f%fill ) & 4220 surf_usm_h(l)%transmissivity(m) = building_pars_f%pars_xy(ind_trans,j,i) 4221 4222 IF ( building_pars_f%pars_xy(ind_z0,j,i) /= building_pars_f%fill ) & 4223 surf_usm_h(l)%z0(m) = building_pars_f%pars_xy(ind_z0,j,i) 4224 4225 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill ) & 4226 surf_usm_h(l)%z0h(m) = building_pars_f%pars_xy(ind_z0qh,j,i) 4227 4228 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill ) & 4229 surf_usm_h(l)%z0q(m) = building_pars_f%pars_xy(ind_z0qh,j,i) 4230 4231 IF ( building_pars_f%pars_xy(ind_alb_wall_agfl,j,i) /= building_pars_f%fill ) & 4232 surf_usm_h(l)%albedo_type(m,ind_veg_wall) = & 4233 building_pars_f%pars_xy(ind_alb_wall_agfl,j,i) 4234 4235 IF ( building_pars_f%pars_xy(ind_alb_green_agfl,j,i) /= building_pars_f%fill ) & 4236 surf_usm_h(l)%albedo_type(m,ind_pav_green) = & 4237 building_pars_f%pars_xy(ind_alb_green_agfl,j,i) 4238 4239 IF ( building_pars_f%pars_xy(ind_alb_win_agfl,j,i) /= building_pars_f%fill ) & 4240 surf_usm_h(l)%albedo_type(m,ind_wat_win) = & 4241 building_pars_f%pars_xy(ind_alb_win_agfl,j,i) 4242 4243 IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill ) & 4244 surf_usm_h(l)%zw(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i) 4245 4246 IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill ) & 4247 surf_usm_h(l)%zw(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i) 4248 4249 IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill ) & 4250 surf_usm_h(l)%zw(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i) 4251 4252 IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill ) & 4253 surf_usm_h(l)%zw(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i) 4254 4255 IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill ) & 4256 surf_usm_h(l)%zw_green(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i) 4257 4258 IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill ) & 4259 surf_usm_h(l)%zw_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i) 4260 4261 IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill ) & 4262 surf_usm_h(l)%zw_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i) 4263 4264 IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill ) & 4265 surf_usm_h(l)%zw_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i) 4266 ENDDO 4353 4267 ENDDO 4354 4268 … … 4558 4472 !-- Read building surface pars. If present, they override LOD1-LOD3 building pars where applicable 4559 4473 IF ( building_surface_pars_f%from_file ) THEN 4560 DO m = 1, surf_usm_h%ns 4561 i = surf_usm_h%i(m) 4562 j = surf_usm_h%j(m) 4563 k = surf_usm_h%k(m) 4564 ! 4565 !-- Iterate over surfaces in column, check height and orientation 4566 DO is = building_surface_pars_f%index_ji(1,j,i), & 4567 building_surface_pars_f%index_ji(2,j,i) 4568 IF ( building_surface_pars_f%coords(4,is) == -surf_usm_h%koff .AND. & 4569 building_surface_pars_f%coords(1,is) == k ) THEN 4570 4571 IF ( building_surface_pars_f%pars(ind_s_wall_frac,is) /= & 4572 building_surface_pars_f%fill ) & 4573 surf_usm_h%frac(m,ind_veg_wall) = & 4574 building_surface_pars_f%pars(ind_s_wall_frac,is) 4575 4576 IF ( building_surface_pars_f%pars(ind_s_green_frac_w,is) /= & 4577 building_surface_pars_f%fill ) & 4578 surf_usm_h%frac(m,ind_pav_green) = & 4579 building_surface_pars_f%pars(ind_s_green_frac_w,is) 4580 4581 IF ( building_surface_pars_f%pars(ind_s_green_frac_r,is) /= & 4582 building_surface_pars_f%fill ) & 4583 surf_usm_h%frac(m,ind_pav_green) = & 4584 building_surface_pars_f%pars(ind_s_green_frac_r,is) 4585 !TODO clarify: why should _w and _r be on the same surface? 4586 4587 IF ( building_surface_pars_f%pars(ind_s_win_frac,is) /= & 4588 building_surface_pars_f%fill ) & 4589 surf_usm_h%frac(m,ind_wat_win) = building_surface_pars_f%pars(ind_s_win_frac,is) 4590 4591 IF ( building_surface_pars_f%pars(ind_s_lai_r,is) /= & 4592 building_surface_pars_f%fill ) & 4593 surf_usm_h%lai(m) = building_surface_pars_f%pars(ind_s_lai_r,is) 4594 4595 IF ( building_surface_pars_f%pars(ind_s_hc1,is) /= & 4596 building_surface_pars_f%fill ) THEN 4597 surf_usm_h%rho_c_wall(nzb_wall:nzb_wall+1,m) = & 4598 building_surface_pars_f%pars(ind_s_hc1,is) 4599 surf_usm_h%rho_c_green(nzb_wall:nzb_wall+1,m) = & 4600 building_surface_pars_f%pars(ind_s_hc1,is) 4601 surf_usm_h%rho_c_window(nzb_wall:nzb_wall+1,m) = & 4602 building_surface_pars_f%pars(ind_s_hc1,is) 4474 DO l = 0, 1 4475 DO m = 1, surf_usm_h(l)%ns 4476 i = surf_usm_h(l)%i(m) 4477 j = surf_usm_h(l)%j(m) 4478 k = surf_usm_h(l)%k(m) 4479 ! 4480 !-- Iterate over surfaces in column, check height and orientation 4481 DO is = building_surface_pars_f%index_ji(1,j,i), & 4482 building_surface_pars_f%index_ji(2,j,i) 4483 IF ( building_surface_pars_f%coords(4,is) == -surf_usm_h(l)%koff .AND. & 4484 building_surface_pars_f%coords(1,is) == k ) THEN 4485 4486 IF ( building_surface_pars_f%pars(ind_s_wall_frac,is) /= & 4487 building_surface_pars_f%fill ) & 4488 surf_usm_h(l)%frac(m,ind_veg_wall) = & 4489 building_surface_pars_f%pars(ind_s_wall_frac,is) 4490 4491 IF ( building_surface_pars_f%pars(ind_s_green_frac_w,is) /= & 4492 building_surface_pars_f%fill ) & 4493 surf_usm_h(l)%frac(m,ind_pav_green) = & 4494 building_surface_pars_f%pars(ind_s_green_frac_w,is) 4495 4496 IF ( building_surface_pars_f%pars(ind_s_green_frac_r,is) /= & 4497 building_surface_pars_f%fill ) & 4498 surf_usm_h(l)%frac(m,ind_pav_green) = & 4499 building_surface_pars_f%pars(ind_s_green_frac_r,is) 4500 !TODO clarify: why should _w and _r be on the same surface? 4501 4502 IF ( building_surface_pars_f%pars(ind_s_win_frac,is) /= & 4503 building_surface_pars_f%fill ) & 4504 surf_usm_h(l)%frac(m,ind_wat_win) = building_surface_pars_f%pars(ind_s_win_frac,is) 4505 4506 IF ( building_surface_pars_f%pars(ind_s_lai_r,is) /= & 4507 building_surface_pars_f%fill ) & 4508 surf_usm_h(l)%lai(m) = building_surface_pars_f%pars(ind_s_lai_r,is) 4509 4510 IF ( building_surface_pars_f%pars(ind_s_hc1,is) /= & 4511 building_surface_pars_f%fill ) THEN 4512 surf_usm_h(l)%rho_c_wall(nzb_wall:nzb_wall+1,m) = & 4513 building_surface_pars_f%pars(ind_s_hc1,is) 4514 surf_usm_h(l)%rho_c_green(nzb_wall:nzb_wall+1,m) = & 4515 building_surface_pars_f%pars(ind_s_hc1,is) 4516 surf_usm_h(l)%rho_c_window(nzb_wall:nzb_wall+1,m) = & 4517 building_surface_pars_f%pars(ind_s_hc1,is) 4518 ENDIF 4519 4520 IF ( building_surface_pars_f%pars(ind_s_hc2,is) /= & 4521 building_surface_pars_f%fill ) THEN 4522 surf_usm_h(l)%rho_c_wall(nzb_wall+2,m) = & 4523 building_surface_pars_f%pars(ind_s_hc2,is) 4524 surf_usm_h(l)%rho_c_green(nzb_wall+2,m) = & 4525 building_surface_pars_f%pars(ind_s_hc2,is) 4526 surf_usm_h(l)%rho_c_window(nzb_wall+2,m) = & 4527 building_surface_pars_f%pars(ind_s_hc2,is) 4528 ENDIF 4529 4530 IF ( building_surface_pars_f%pars(ind_s_hc3,is) /= & 4531 building_surface_pars_f%fill ) THEN 4532 surf_usm_h(l)%rho_c_wall(nzb_wall+3,m) = & 4533 building_surface_pars_f%pars(ind_s_hc3,is) 4534 surf_usm_h(l)%rho_c_green(nzb_wall+3,m) = & 4535 building_surface_pars_f%pars(ind_s_hc3,is) 4536 surf_usm_h(l)%rho_c_window(nzb_wall+3,m) = & 4537 building_surface_pars_f%pars(ind_s_hc3,is) 4538 ENDIF 4539 4540 IF ( building_surface_pars_f%pars(ind_s_tc1,is) /= & 4541 building_surface_pars_f%fill ) THEN 4542 surf_usm_h(l)%lambda_h(nzb_wall:nzb_wall+1,m) = & 4543 building_surface_pars_f%pars(ind_s_tc1,is) 4544 surf_usm_h(l)%lambda_h_green(nzb_wall:nzb_wall+1,m) = & 4545 building_surface_pars_f%pars(ind_s_tc1,is) 4546 surf_usm_h(l)%lambda_h_window(nzb_wall:nzb_wall+1,m) = & 4547 building_surface_pars_f%pars(ind_s_tc1,is) 4548 ENDIF 4549 4550 IF ( building_surface_pars_f%pars(ind_s_tc2,is) /= & 4551 building_surface_pars_f%fill ) THEN 4552 surf_usm_h(l)%lambda_h(nzb_wall+2,m) = & 4553 building_surface_pars_f%pars(ind_s_tc2,is) 4554 surf_usm_h(l)%lambda_h_green(nzb_wall+2,m) = & 4555 building_surface_pars_f%pars(ind_s_tc2,is) 4556 surf_usm_h(l)%lambda_h_window(nzb_wall+2,m) = & 4557 building_surface_pars_f%pars(ind_s_tc2,is) 4558 ENDIF 4559 4560 IF ( building_surface_pars_f%pars(ind_s_tc3,is) /= & 4561 building_surface_pars_f%fill ) THEN 4562 surf_usm_h(l)%lambda_h(nzb_wall+3,m) = & 4563 building_surface_pars_f%pars(ind_s_tc3,is) 4564 surf_usm_h(l)%lambda_h_green(nzb_wall+3,m) = & 4565 building_surface_pars_f%pars(ind_s_tc3,is) 4566 surf_usm_h(l)%lambda_h_window(nzb_wall+3,m) = & 4567 building_surface_pars_f%pars(ind_s_tc3,is) 4568 ENDIF 4569 4570 IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) /= & 4571 building_surface_pars_f%fill ) & 4572 surf_usm_h(l)%target_temp_summer(m) = & 4573 building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) 4574 4575 IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) /= & 4576 building_surface_pars_f%fill ) & 4577 surf_usm_h(l)%target_temp_winter(m) = & 4578 building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) 4579 4580 IF ( building_surface_pars_f%pars(ind_s_emis_wall,is) /= & 4581 building_surface_pars_f%fill ) & 4582 surf_usm_h(l)%emissivity(m,ind_veg_wall) = & 4583 building_surface_pars_f%pars(ind_s_emis_wall,is) 4584 4585 IF ( building_surface_pars_f%pars(ind_s_emis_green,is) /= & 4586 building_surface_pars_f%fill ) & 4587 surf_usm_h(l)%emissivity(m,ind_pav_green) = & 4588 building_surface_pars_f%pars(ind_s_emis_green,is) 4589 4590 IF ( building_surface_pars_f%pars(ind_s_emis_win,is) /= & 4591 building_surface_pars_f%fill ) & 4592 surf_usm_h(l)%emissivity(m,ind_wat_win) = & 4593 building_surface_pars_f%pars(ind_s_emis_win,is) 4594 4595 IF ( building_surface_pars_f%pars(ind_s_trans,is) /= & 4596 building_surface_pars_f%fill ) & 4597 surf_usm_h(l)%transmissivity(m) = building_surface_pars_f%pars(ind_s_trans,is) 4598 4599 IF ( building_surface_pars_f%pars(ind_s_z0,is) /= & 4600 building_surface_pars_f%fill ) & 4601 surf_usm_h(l)%z0(m) = building_surface_pars_f%pars(ind_s_z0,is) 4602 4603 IF ( building_surface_pars_f%pars(ind_s_z0qh,is) /= & 4604 building_surface_pars_f%fill ) THEN 4605 surf_usm_h(l)%z0q(m) = building_surface_pars_f%pars(ind_s_z0qh,is) 4606 surf_usm_h(l)%z0h(m) = building_surface_pars_f%pars(ind_s_z0qh,is) 4607 ENDIF 4608 4609 EXIT ! Surface was found and processed 4603 4610 ENDIF 4604 4605 IF ( building_surface_pars_f%pars(ind_s_hc2,is) /= & 4606 building_surface_pars_f%fill ) THEN 4607 surf_usm_h%rho_c_wall(nzb_wall+2,m) = & 4608 building_surface_pars_f%pars(ind_s_hc2,is) 4609 surf_usm_h%rho_c_green(nzb_wall+2,m) = & 4610 building_surface_pars_f%pars(ind_s_hc2,is) 4611 surf_usm_h%rho_c_window(nzb_wall+2,m) = & 4612 building_surface_pars_f%pars(ind_s_hc2,is) 4613 ENDIF 4614 4615 IF ( building_surface_pars_f%pars(ind_s_hc3,is) /= & 4616 building_surface_pars_f%fill ) THEN 4617 surf_usm_h%rho_c_wall(nzb_wall+3,m) = & 4618 building_surface_pars_f%pars(ind_s_hc3,is) 4619 surf_usm_h%rho_c_green(nzb_wall+3,m) = & 4620 building_surface_pars_f%pars(ind_s_hc3,is) 4621 surf_usm_h%rho_c_window(nzb_wall+3,m) = & 4622 building_surface_pars_f%pars(ind_s_hc3,is) 4623 ENDIF 4624 4625 IF ( building_surface_pars_f%pars(ind_s_tc1,is) /= & 4626 building_surface_pars_f%fill ) THEN 4627 surf_usm_h%lambda_h(nzb_wall:nzb_wall+1,m) = & 4628 building_surface_pars_f%pars(ind_s_tc1,is) 4629 surf_usm_h%lambda_h_green(nzb_wall:nzb_wall+1,m) = & 4630 building_surface_pars_f%pars(ind_s_tc1,is) 4631 surf_usm_h%lambda_h_window(nzb_wall:nzb_wall+1,m) = & 4632 building_surface_pars_f%pars(ind_s_tc1,is) 4633 ENDIF 4634 4635 IF ( building_surface_pars_f%pars(ind_s_tc2,is) /= & 4636 building_surface_pars_f%fill ) THEN 4637 surf_usm_h%lambda_h(nzb_wall+2,m) = & 4638 building_surface_pars_f%pars(ind_s_tc2,is) 4639 surf_usm_h%lambda_h_green(nzb_wall+2,m) = & 4640 building_surface_pars_f%pars(ind_s_tc2,is) 4641 surf_usm_h%lambda_h_window(nzb_wall+2,m) = & 4642 building_surface_pars_f%pars(ind_s_tc2,is) 4643 ENDIF 4644 4645 IF ( building_surface_pars_f%pars(ind_s_tc3,is) /= & 4646 building_surface_pars_f%fill ) THEN 4647 surf_usm_h%lambda_h(nzb_wall+3,m) = & 4648 building_surface_pars_f%pars(ind_s_tc3,is) 4649 surf_usm_h%lambda_h_green(nzb_wall+3,m) = & 4650 building_surface_pars_f%pars(ind_s_tc3,is) 4651 surf_usm_h%lambda_h_window(nzb_wall+3,m) = & 4652 building_surface_pars_f%pars(ind_s_tc3,is) 4653 ENDIF 4654 4655 IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) /= & 4656 building_surface_pars_f%fill ) & 4657 surf_usm_h%target_temp_summer(m) = & 4658 building_surface_pars_f%pars(ind_s_indoor_target_temp_summer,is) 4659 4660 IF ( building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) /= & 4661 building_surface_pars_f%fill ) & 4662 surf_usm_h%target_temp_winter(m) = & 4663 building_surface_pars_f%pars(ind_s_indoor_target_temp_winter,is) 4664 4665 IF ( building_surface_pars_f%pars(ind_s_emis_wall,is) /= & 4666 building_surface_pars_f%fill ) & 4667 surf_usm_h%emissivity(m,ind_veg_wall) = & 4668 building_surface_pars_f%pars(ind_s_emis_wall,is) 4669 4670 IF ( building_surface_pars_f%pars(ind_s_emis_green,is) /= & 4671 building_surface_pars_f%fill ) & 4672 surf_usm_h%emissivity(m,ind_pav_green) = & 4673 building_surface_pars_f%pars(ind_s_emis_green,is) 4674 4675 IF ( building_surface_pars_f%pars(ind_s_emis_win,is) /= & 4676 building_surface_pars_f%fill ) & 4677 surf_usm_h%emissivity(m,ind_wat_win) = & 4678 building_surface_pars_f%pars(ind_s_emis_win,is) 4679 4680 IF ( building_surface_pars_f%pars(ind_s_trans,is) /= & 4681 building_surface_pars_f%fill ) & 4682 surf_usm_h%transmissivity(m) = building_surface_pars_f%pars(ind_s_trans,is) 4683 4684 IF ( building_surface_pars_f%pars(ind_s_z0,is) /= & 4685 building_surface_pars_f%fill ) & 4686 surf_usm_h%z0(m) = building_surface_pars_f%pars(ind_s_z0,is) 4687 4688 IF ( building_surface_pars_f%pars(ind_s_z0qh,is) /= & 4689 building_surface_pars_f%fill ) THEN 4690 surf_usm_h%z0q(m) = building_surface_pars_f%pars(ind_s_z0qh,is) 4691 surf_usm_h%z0h(m) = building_surface_pars_f%pars(ind_s_z0qh,is) 4692 ENDIF 4693 4694 EXIT ! Surface was found and processed 4695 ENDIF 4611 ENDDO 4696 4612 ENDDO 4697 4613 ENDDO … … 4842 4758 ENDIF 4843 4759 ! 4844 !-- Initialize albedo type via given type from static input file. Please note, even though 4845 !-- the albedo type has been already given by the pars, albedo_type overwrites these values. 4846 IF ( albedo_type_f%from_file ) THEN 4847 DO m = 1, surf_usm_h%ns 4848 i = surf_usm_h%i(m) 4849 j = surf_usm_h%j(m) 4850 IF ( albedo_type_f%var(j,i) /= albedo_type_f%fill ) & 4851 surf_usm_h%albedo_type(m,:) = albedo_type_f%var(j,i) 4852 ENDDO 4853 DO l = 0, 3 4854 DO m = 1, surf_usm_v(l)%ns 4855 i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff 4856 j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff 4857 4858 IF ( albedo_type_f%var(j,i) /= albedo_type_f%fill ) & 4859 surf_usm_v(l)%albedo_type(m,:) = albedo_type_f%var(j,i) 4860 ENDDO 4861 ENDDO 4862 ENDIF 4760 !-- Initialize albedo type via given type from static input file. Please note, even though 4761 !-- the albedo type has been already given by the pars, albedo_type overwrites these values. 4762 IF ( albedo_type_f%from_file ) THEN 4763 DO l = 0, 1 4764 DO m = 1, surf_usm_h(l)%ns 4765 i = surf_usm_h(l)%i(m) 4766 j = surf_usm_h(l)%j(m) 4767 IF ( albedo_type_f%var(j,i) /= albedo_type_f%fill ) & 4768 surf_usm_h(l)%albedo_type(m,:) = albedo_type_f%var(j,i) 4769 ENDDO 4770 ENDDO 4771 DO l = 0, 3 4772 DO m = 1, surf_usm_v(l)%ns 4773 i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff 4774 j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff 4775 IF ( albedo_type_f%var(j,i) /= albedo_type_f%fill ) & 4776 surf_usm_v(l)%albedo_type(m,:) = albedo_type_f%var(j,i) 4777 ENDDO 4778 ENDDO 4779 ENDIF 4863 4780 ! 4864 4781 !-- Run further checks to ensure that the respecitve material fractions are prescribed properly. 4865 4782 !-- Start with horizontal surfaces (roofs). 4866 4783 relative_fractions_corrected = .FALSE. 4867 DO m = 1, surf_usm_h%ns 4868 sum_frac = SUM( surf_usm_h%frac(m,:) ) 4869 IF ( sum_frac /= 1.0_wp ) THEN 4870 relative_fractions_corrected = .TRUE. 4871 ! 4872 !-- Normalize relative fractions to 1. Deviations from 1 can arise, e.g. by rounding errors 4873 !-- but also by inconsistent driver creation. 4874 IF ( sum_frac /= 0.0_wp ) THEN 4875 surf_usm_h%frac(m,:) = surf_usm_h%frac(m,:) / sum_frac 4876 ! 4877 !-- In case all relative fractions are erroneously set to zero, set wall fraction to 1. 4878 ELSE 4879 surf_usm_h%frac(m,ind_veg_wall) = 1.0_wp 4880 surf_usm_h%frac(m,ind_wat_win) = 0.0_wp 4881 surf_usm_h%frac(m,ind_pav_green) = 0.0_wp 4784 DO l = 0, 1 4785 DO m = 1, surf_usm_h(l)%ns 4786 sum_frac = SUM( surf_usm_h(l)%frac(m,:) ) 4787 IF ( sum_frac /= 1.0_wp ) THEN 4788 relative_fractions_corrected = .TRUE. 4789 ! 4790 !-- Normalize relative fractions to 1. Deviations from 1 can arise, e.g. by rounding errors 4791 !-- but also by inconsistent driver creation. 4792 IF ( sum_frac /= 0.0_wp ) THEN 4793 surf_usm_h(l)%frac(m,:) = surf_usm_h(l)%frac(m,:) / sum_frac 4794 ! 4795 !-- In case all relative fractions are erroneously set to zero, set wall fraction to 1. 4796 ELSE 4797 surf_usm_h(l)%frac(m,ind_veg_wall) = 1.0_wp 4798 surf_usm_h(l)%frac(m,ind_wat_win) = 0.0_wp 4799 surf_usm_h(l)%frac(m,ind_pav_green) = 0.0_wp 4800 ENDIF 4882 4801 ENDIF 4883 END IF4802 ENDDO 4884 4803 ENDDO 4885 4804 ! … … 4928 4847 ENDIF 4929 4848 ! 4930 !-- Read the surface_types array. 4931 !-- Please note, here also initialization of surface attributes is done as long as _urbsurf and 4932 !-- _surfpar files are available. Values from above will be overwritten. This might be removed 4933 !-- later, but is still in the code to enable compatibility with older model version. 4934 CALL usm_read_urban_surface_types() 4935 4936 CALL usm_init_material_model() 4849 !-- Initialization of the wall/roof materials 4850 CALL usm_init_wall_heat_model() 4937 4851 4938 4852 !-- Init skin layer properties (can be done after initialization of wall layers) 4939 4940 DO m = 1, surf_usm_h%ns 4941 i = surf_usm_h%i(m) 4942 j = surf_usm_h%j(m) 4943 4944 surf_usm_h%c_surface(m) = surf_usm_h%rho_c_wall(nzb_wall,m) * & 4945 surf_usm_h%dz_wall(nzb_wall,m) * 0.25_wp 4946 surf_usm_h%lambda_surf(m) = surf_usm_h%lambda_h(nzb_wall,m) * & 4947 surf_usm_h%ddz_wall(nzb_wall,m) * 2.0_wp 4948 surf_usm_h%c_surface_green(m) = surf_usm_h%rho_c_wall(nzb_wall,m) * & 4949 surf_usm_h%dz_wall(nzb_wall,m) * 0.25_wp 4950 surf_usm_h%lambda_surf_green(m) = surf_usm_h%lambda_h_green(nzb_wall,m) * & 4951 surf_usm_h%ddz_green(nzb_wall,m) * 2.0_wp 4952 surf_usm_h%c_surface_window(m) = surf_usm_h%rho_c_window(nzb_wall,m) * & 4953 surf_usm_h%dz_window(nzb_wall,m) * 0.25_wp 4954 surf_usm_h%lambda_surf_window(m) = surf_usm_h%lambda_h_window(nzb_wall,m) * & 4955 surf_usm_h%ddz_window(nzb_wall,m) * 2.0_wp 4853 DO l = 0, 1 4854 DO m = 1, surf_usm_h(l)%ns 4855 i = surf_usm_h(l)%i(m) 4856 j = surf_usm_h(l)%j(m) 4857 4858 surf_usm_h(l)%c_surface(m) = surf_usm_h(l)%rho_c_wall(nzb_wall,m) * & 4859 surf_usm_h(l)%dz_wall(nzb_wall,m) * 0.25_wp 4860 surf_usm_h(l)%lambda_surf(m) = surf_usm_h(l)%lambda_h(nzb_wall,m) * & 4861 surf_usm_h(l)%ddz_wall(nzb_wall,m) * 2.0_wp 4862 surf_usm_h(l)%c_surface_green(m) = surf_usm_h(l)%rho_c_wall(nzb_wall,m) * & 4863 surf_usm_h(l)%dz_wall(nzb_wall,m) * 0.25_wp 4864 surf_usm_h(l)%lambda_surf_green(m) = surf_usm_h(l)%lambda_h_green(nzb_wall,m) * & 4865 surf_usm_h(l)%ddz_green(nzb_wall,m) * 2.0_wp 4866 surf_usm_h(l)%c_surface_window(m) = surf_usm_h(l)%rho_c_window(nzb_wall,m) * & 4867 surf_usm_h(l)%dz_window(nzb_wall,m) * 0.25_wp 4868 surf_usm_h(l)%lambda_surf_window(m) = surf_usm_h(l)%lambda_h_window(nzb_wall,m) * & 4869 surf_usm_h(l)%ddz_window(nzb_wall,m) * 2.0_wp 4870 ENDDO 4956 4871 ENDDO 4957 4872 … … 4977 4892 4978 4893 ! 4979 !-- Init anthropogenic sources of heat4980 IF ( usm_anthropogenic_heat ) THEN4981 !4982 !-- Init anthropogenic sources of heat (from transportation for now)4983 CALL usm_read_anthropogenic_heat()4984 ENDIF4985 4986 !4987 4894 !-- Check for consistent initialization. 4988 4895 !-- Check if roughness length for momentum, or heat, exceed surface-layer height and decrease local 4989 4896 !-- roughness length where necessary. 4990 DO m = 1, surf_usm_h%ns 4991 IF ( surf_usm_h%z0(m) >= surf_usm_h%z_mo(m) ) THEN 4992 4993 surf_usm_h%z0(m) = 0.9_wp * surf_usm_h%z_mo(m) 4994 4995 WRITE( message_string, * ) 'z0 exceeds surface-layer height at horizontal urban ' // & 4996 'surface and is decreased appropriately at grid point ' // & 4997 '(i,j) = ', surf_usm_h%i(m), surf_usm_h%j(m) 4998 CALL message( 'urban_surface_model_mod', 'PA0503', 0, 0, myid, 6, 0 ) 4999 ENDIF 5000 IF ( surf_usm_h%z0h(m) >= surf_usm_h%z_mo(m) ) THEN 5001 5002 surf_usm_h%z0h(m) = 0.9_wp * surf_usm_h%z_mo(m) 5003 surf_usm_h%z0q(m) = 0.9_wp * surf_usm_h%z_mo(m) 5004 5005 WRITE( message_string, * ) 'z0h exceeds surface-layer height at horizontal urban ' // & 5006 'surface and is decreased appropriately at grid point ' // & 5007 '(i,j) = ', surf_usm_h%i(m), surf_usm_h%j(m) 5008 CALL message( 'urban_surface_model_mod', 'PA0507', 0, 0, myid, 6, 0 ) 5009 ENDIF 4897 DO l = 0, 1 4898 DO m = 1, surf_usm_h(l)%ns 4899 IF ( surf_usm_h(l)%z0(m) >= surf_usm_h(l)%z_mo(m) ) THEN 4900 4901 surf_usm_h(l)%z0(m) = 0.9_wp * surf_usm_h(l)%z_mo(m) 4902 4903 WRITE( message_string, * ) 'z0 exceeds surface-layer height at horizontal urban ' // & 4904 'surface and is decreased appropriately at grid point ' // & 4905 '(i,j) = ', surf_usm_h(l)%i(m), surf_usm_h(l)%j(m) 4906 CALL message( 'urban_surface_model_mod', 'PA0503', 0, 0, myid, 6, 0 ) 4907 ENDIF 4908 IF ( surf_usm_h(l)%z0h(m) >= surf_usm_h(l)%z_mo(m) ) THEN 4909 4910 surf_usm_h(l)%z0h(m) = 0.9_wp * surf_usm_h(l)%z_mo(m) 4911 surf_usm_h(l)%z0q(m) = 0.9_wp * surf_usm_h(l)%z_mo(m) 4912 4913 WRITE( message_string, * ) 'z0h exceeds surface-layer height at horizontal urban ' // & 4914 'surface and is decreased appropriately at grid point ' // & 4915 '(i,j) = ', surf_usm_h(l)%i(m), surf_usm_h(l)%j(m) 4916 CALL message( 'urban_surface_model_mod', 'PA0507', 0, 0, myid, 6, 0 ) 4917 ENDIF 4918 ENDDO 5010 4919 ENDDO 5011 4920 … … 5044 4953 !-- At horizontal surfaces. Please note, t_surf_wall_h is defined on a different data type, 5045 4954 !-- but with the same dimension. 5046 DO m = 1, surf_usm_h%ns 5047 i = surf_usm_h%i(m) 5048 j = surf_usm_h%j(m) 5049 k = surf_usm_h%k(m) 5050 5051 t_surf_wall_h(m) = pt(k,j,i) * exner(k) 5052 t_surf_window_h(m) = pt(k,j,i) * exner(k) 5053 t_surf_green_h(m) = pt(k,j,i) * exner(k) 5054 surf_usm_h%pt_surface(m) = pt(k,j,i) * exner(k) 4955 DO l = 0, 1 4956 DO m = 1, surf_usm_h(l)%ns 4957 i = surf_usm_h(l)%i(m) 4958 j = surf_usm_h(l)%j(m) 4959 k = surf_usm_h(l)%k(m) 4960 4961 t_surf_wall_h(l)%val(m) = pt(k,j,i) * exner(k) 4962 t_surf_window_h(l)%val(m) = pt(k,j,i) * exner(k) 4963 t_surf_green_h(l)%val(m) = pt(k,j,i) * exner(k) 4964 surf_usm_h(l)%pt_surface(m) = pt(k,j,i) * exner(k) 4965 ENDDO 5055 4966 ENDDO 5056 4967 ! … … 5062 4973 k = surf_usm_v(l)%k(m) 5063 4974 5064 t_surf_wall_v(l)% t(m) = pt(k,j,i) * exner(k)5065 t_surf_window_v(l)% t(m) = pt(k,j,i) * exner(k)5066 t_surf_green_v(l)% t(m) = pt(k,j,i) * exner(k)4975 t_surf_wall_v(l)%val(m) = pt(k,j,i) * exner(k) 4976 t_surf_window_v(l)%val(m) = pt(k,j,i) * exner(k) 4977 t_surf_green_v(l)%val(m) = pt(k,j,i) * exner(k) 5067 4978 surf_usm_v(l)%pt_surface(m) = pt(k,j,i) * exner(k) 5068 4979 ENDDO … … 5073 4984 !-- Note, at urban surfaces q_surface is initialized with 0. 5074 4985 IF ( humidity ) THEN 5075 DO m = 1, surf_usm_h%ns 5076 surf_usm_h%q_surface(m) = 0.0_wp 4986 DO l = 0, 1 4987 DO m = 1, surf_usm_h(l)%ns 4988 surf_usm_h(l)%q_surface(m) = 0.0_wp 4989 ENDDO 5077 4990 ENDDO 5078 4991 DO l = 0, 3 … … 5087 5000 !-- and profile is logaritmic (linear in nz). 5088 5001 !-- Horizontal surfaces 5089 DO m = 1, surf_usm_h%ns 5090 ! 5091 !-- Roof 5092 IF ( surf_usm_h%isroof_surf(m) ) THEN 5093 tin = roof_inner_temperature 5094 twin = window_inner_temperature 5095 ! 5096 !-- Normal land surface 5097 ELSE 5098 tin = soil_inner_temperature 5099 twin = window_inner_temperature 5100 ENDIF 5101 5102 DO k = nzb_wall, nzt_wall+1 5103 c = REAL( k - nzb_wall, wp ) / REAL( nzt_wall + 1 - nzb_wall , wp ) 5104 5105 t_wall_h(k,m) = ( 1.0_wp - c ) * t_surf_wall_h(m) + c * tin 5106 t_window_h(k,m) = ( 1.0_wp - c ) * t_surf_window_h(m) + c * twin 5107 t_green_h(k,m) = t_surf_wall_h(m) 5108 swc_h(k,m) = 0.5_wp 5109 swc_sat_h(k,m) = 0.95_wp 5110 swc_res_h(k,m) = 0.05_wp 5111 rootfr_h(k,m) = 0.1_wp 5112 wilt_h(k,m) = 0.1_wp 5113 fc_h(k,m) = 0.9_wp 5002 DO l = 0, 1 5003 DO m = 1, surf_usm_h(l)%ns 5004 ! 5005 !-- Roof 5006 IF ( surf_usm_h(l)%isroof_surf(m) ) THEN 5007 tin = roof_inner_temperature 5008 twin = window_inner_temperature 5009 ! 5010 !-- Normal land surface 5011 ELSE 5012 tin = soil_inner_temperature 5013 twin = window_inner_temperature 5014 ENDIF 5015 5016 DO k = nzb_wall, nzt_wall+1 5017 c = REAL( k - nzb_wall, wp ) / REAL( nzt_wall + 1 - nzb_wall , wp ) 5018 5019 t_wall_h(l)%val(k,m) = ( 1.0_wp - c ) * t_surf_wall_h(l)%val(m) + c * tin 5020 t_window_h(l)%val(k,m) = ( 1.0_wp - c ) * t_surf_window_h(l)%val(m) + c * twin 5021 t_green_h(l)%val(k,m) = t_surf_wall_h(l)%val(m) 5022 swc_h(l)%val(k,m) = 0.5_wp 5023 swc_sat_h(l)%val(k,m) = 0.95_wp 5024 swc_res_h(l)%val(k,m) = 0.05_wp 5025 rootfr_h(l)%val(k,m) = 0.1_wp 5026 wilt_h(l)%val(k,m) = 0.1_wp 5027 fc_h(l)%val(k,m) = 0.9_wp 5028 ENDDO 5114 5029 ENDDO 5115 5030 ENDDO … … 5125 5040 DO k = nzb_wall, nzt_wall+1 5126 5041 c = REAL( k - nzb_wall, wp ) / REAL( nzt_wall + 1 - nzb_wall , wp ) 5127 t_wall_v(l)% t(k,m) = ( 1.0_wp - c ) * t_surf_wall_v(l)%t(m) + c * tin5128 t_window_v(l)% t(k,m) = ( 1.0_wp - c ) * t_surf_window_v(l)%t(m) + c * twin5129 t_green_v(l)% t(k,m) = t_surf_wall_v(l)%t(m)5042 t_wall_v(l)%val(k,m) = ( 1.0_wp - c ) * t_surf_wall_v(l)%val(m) + c * tin 5043 t_window_v(l)%val(k,m) = ( 1.0_wp - c ) * t_surf_window_v(l)%val(m) + c * twin 5044 t_green_v(l)%val(k,m) = t_surf_wall_v(l)%val(m) 5130 5045 ENDDO 5131 5046 ENDDO 5132 5047 ENDDO 5133 5048 ENDIF 5134 5135 !5136 !-- If specified, replace constant wall temperatures with fully 3D values from file5137 IF ( read_wall_temp_3d ) CALL usm_read_wall_temperature()5138 5049 5139 5050 !-- … … 5159 5070 ! 5160 5071 !-- Set initial values for prognostic soil quantities 5161 IF ( TRIM( initializing_actions ) /= 'read_restart_data' ) THEN 5162 m_liq_usm_h%var_usm_1d = 0.0_wp 5163 ENDIF 5164 m_liq_usm_h_p = m_liq_usm_h 5165 ! 5166 !-- Set initial values for prognostic quantities 5167 !-- Horizontal surfaces 5168 surf_usm_h%c_liq = 0.0_wp 5169 surf_usm_h%qsws_liq = 0.0_wp 5170 surf_usm_h%qsws_veg = 0.0_wp 5072 DO l = 0, 1 5073 IF ( TRIM( initializing_actions ) /= 'read_restart_data' ) THEN 5074 m_liq_usm_h(l)%val = 0.0_wp 5075 ENDIF 5076 m_liq_usm_h_p(l)%val = m_liq_usm_h(l)%val 5077 ! 5078 !-- Set initial values for prognostic quantities 5079 !-- Horizontal surfaces 5080 surf_usm_h(l)%c_liq = 0.0_wp 5081 surf_usm_h(l)%qsws_liq = 0.0_wp 5082 surf_usm_h(l)%qsws_veg = 0.0_wp 5083 ENDDO 5171 5084 5172 5085 ! … … 5195 5108 !> during spinup to increase possible timestep. 5196 5109 !--------------------------------------------------------------------------------------------------! 5197 SUBROUTINE usm_ material_heat_model(during_spinup )5110 SUBROUTINE usm_wall_heat_model( horizontal, l, during_spinup ) 5198 5111 5199 5112 5200 5113 IMPLICIT NONE 5201 5114 5202 INTEGER(iwp) :: i,j,k,l,kw, m !< running indices 5203 5204 LOGICAL :: during_spinup !< if true, no calculation of window temperatures 5115 LOGICAL :: horizontal !< Flag indicating horizontal or vertical surfaces 5116 INTEGER(iwp) :: l !< direction index 5117 LOGICAL :: during_spinup !< if true, no calculation of window temperatures 5118 5119 INTEGER(iwp) :: i,j,k,kw, m !< running indices 5205 5120 5206 5121 REAL(wp) :: win_absorp !< absorption coefficient from transmissivity … … 5209 5124 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: wtend, wintend !< tendency 5210 5125 5211 5126 TYPE(surf_type), POINTER :: surf !< surface-date type variable 5127 TYPE(surf_type_2d_usm), POINTER :: t_wall 5128 TYPE(surf_type_2d_usm), POINTER :: t_wall_p 5129 TYPE(surf_type_2d_usm), POINTER :: t_window 5130 TYPE(surf_type_2d_usm), POINTER :: t_window_p 5131 TYPE(surf_type_2d_usm), POINTER :: t_green 5212 5132 5213 5133 IF ( debug_output_timestep ) THEN 5214 WRITE( debug_string, * ) 'usm_ material_heat_model | during_spinup: ', during_spinup5134 WRITE( debug_string, * ) 'usm_wall_heat_model: ', horizontal, l, during_spinup 5215 5135 CALL debug_message( debug_string, 'start' ) 5216 5136 ENDIF … … 5224 5144 ENDIF 5225 5145 5226 ! 5227 !-- For horizontal surfaces 5146 IF ( horizontal ) THEN 5147 surf => surf_usm_h(l) 5148 t_wall => t_wall_h(l) 5149 t_wall_p => t_wall_h_p(l) 5150 t_window => t_window_h(l) 5151 t_window_p => t_window_h_p(l) 5152 t_green => t_green_h(l) 5153 ELSE 5154 surf => surf_usm_v(l) 5155 t_wall => t_wall_v(l) 5156 t_wall_p => t_wall_v_p(l) 5157 t_window => t_window_v(l) 5158 t_window_p => t_window_v_p(l) 5159 t_green => t_green_v(l) 5160 ENDIF 5161 ! 5162 !-- Cycle for all surfaces in given direction 5228 5163 !$OMP DO SCHEDULE (STATIC) 5229 DO m = 1, surf _usm_h%ns5164 DO m = 1, surf%ns 5230 5165 ! 5231 5166 !-- Obtain indices 5232 i = surf _usm_h%i(m)5233 j = surf _usm_h%j(m)5234 k = surf _usm_h%k(m)5235 ! 5236 !-- Prognostic equation for ground/roof temperature t_wall _h5167 i = surf%i(m) 5168 j = surf%j(m) 5169 k = surf%k(m) 5170 ! 5171 !-- Prognostic equation for ground/roof temperature t_wall 5237 5172 wtend(:) = 0.0_wp 5238 wtend(nzb_wall) = ( 1.0_wp / surf _usm_h%rho_c_wall(nzb_wall,m) )&5239 * ( surf _usm_h%lambda_h(nzb_wall,m) * wall_mod(nzb_wall)&5240 * ( t_wall _h(nzb_wall+1,m) - t_wall_h(nzb_wall,m) )&5241 * surf _usm_h%ddz_wall(nzb_wall+1,m)&5242 + surf _usm_h%frac(m,ind_veg_wall)&5243 / ( surf _usm_h%frac(m,ind_veg_wall)&5244 + surf _usm_h%frac(m,ind_pav_green) )&5245 * surf _usm_h%wghf_eb(m)&5246 - surf _usm_h%frac(m,ind_pav_green)&5247 / ( surf _usm_h%frac(m,ind_veg_wall)&5248 + surf _usm_h%frac(m,ind_pav_green) )&5249 * ( surf _usm_h%lambda_h_green(nzt_wall,m)&5250 * wall_mod(nzt_wall) 5251 * surf _usm_h%ddz_green(nzt_wall,m)&5252 + surf _usm_h%lambda_h(nzb_wall,m)&5253 * wall_mod(nzb_wall) 5254 * surf _usm_h%ddz_wall(nzb_wall,m) )&5255 / ( surf _usm_h%ddz_green(nzt_wall,m)&5256 + surf _usm_h%ddz_wall(nzb_wall,m) )&5257 * ( t_wall _h(nzb_wall,m) - t_green_h(nzt_wall,m) )&5258 ) * surf _usm_h%ddz_wall_stag(nzb_wall,m)5259 ! 5260 !-- If indoor model is used inner wall layer is calculated by using iwghf (indoor wall ground heat flux)5173 wtend(nzb_wall) = ( 1.0_wp / surf%rho_c_wall(nzb_wall,m) ) & 5174 * ( surf%lambda_h(nzb_wall,m) * wall_mod(nzb_wall) & 5175 * ( t_wall%val(nzb_wall+1,m) - t_wall%val(nzb_wall,m) ) & 5176 * surf%ddz_wall(nzb_wall+1,m) & 5177 + surf%frac(m,ind_veg_wall) & 5178 / ( surf%frac(m,ind_veg_wall) & 5179 + surf%frac(m,ind_pav_green) ) & 5180 * surf%wghf_eb(m) & 5181 - surf%frac(m,ind_pav_green) & 5182 / ( surf%frac(m,ind_veg_wall) & 5183 + surf%frac(m,ind_pav_green) ) & 5184 * ( surf%lambda_h_green(nzt_wall,m) & 5185 * wall_mod(nzt_wall) & 5186 * surf%ddz_green(nzt_wall,m) & 5187 + surf%lambda_h(nzb_wall,m) & 5188 * wall_mod(nzb_wall) & 5189 * surf%ddz_wall(nzb_wall,m) ) & 5190 / ( surf%ddz_green(nzt_wall,m) & 5191 + surf%ddz_wall(nzb_wall,m) ) & 5192 * ( t_wall%val(nzb_wall,m) - t_green%val(nzt_wall,m) ) & 5193 ) * surf%ddz_wall_stag(nzb_wall,m) 5194 ! 5195 !-- If indoor model is used inner wall layer is calculated by using iwghf (indoor wall ground heat flux) 5261 5196 IF ( indoor_model ) THEN 5262 5197 DO kw = nzb_wall+1, nzt_wall-1 5263 wtend(kw) = ( 1.0_wp / surf_usm_h%rho_c_wall(kw,m) ) & 5264 * ( surf_usm_h%lambda_h(kw,m) & 5265 * wall_mod(kw) & 5266 * ( t_wall_h(kw+1,m) - t_wall_h(kw,m) ) & 5267 * surf_usm_h%ddz_wall(kw+1,m) & 5268 - surf_usm_h%lambda_h(kw-1,m) & 5269 * wall_mod(kw-1) & 5270 * ( t_wall_h(kw,m) - t_wall_h(kw-1,m) ) & 5271 * surf_usm_h%ddz_wall(kw,m) & 5272 ) * surf_usm_h%ddz_wall_stag(kw,m) 5198 wtend(kw) = ( 1.0_wp / surf%rho_c_wall(kw,m) ) & 5199 * ( surf%lambda_h(kw,m) * wall_mod(kw) & 5200 * ( t_wall%val(kw+1,m) - t_wall%val(kw,m) ) & 5201 * surf%ddz_wall(kw+1,m) & 5202 - surf%lambda_h(kw-1,m) * wall_mod(kw-1) & 5203 * ( t_wall%val(kw,m) - t_wall%val(kw-1,m) ) & 5204 * surf%ddz_wall(kw,m) & 5205 ) * surf%ddz_wall_stag(kw,m) 5273 5206 ENDDO 5274 wtend(nzt_wall) = ( 1.0_wp / surf _usm_h%rho_c_wall(nzt_wall,m) )&5275 * ( -surf _usm_h%lambda_h(nzt_wall-1,m) * wall_mod(nzt_wall-1)&5276 * ( t_wall _h(nzt_wall,m) - t_wall_h(nzt_wall-1,m) )&5277 * surf _usm_h%ddz_wall(nzt_wall,m)&5278 + surf _usm_h%iwghf_eb(m)&5279 ) * surf _usm_h%ddz_wall_stag(nzt_wall,m)5207 wtend(nzt_wall) = ( 1.0_wp / surf%rho_c_wall(nzt_wall,m) ) & 5208 * ( -surf%lambda_h(nzt_wall-1,m) * wall_mod(nzt_wall-1) & 5209 * ( t_wall%val(nzt_wall,m) - t_wall%val(nzt_wall-1,m) ) & 5210 * surf%ddz_wall(nzt_wall,m) & 5211 + surf%iwghf_eb(m) & 5212 ) * surf%ddz_wall_stag(nzt_wall,m) 5280 5213 ELSE 5281 5214 DO kw = nzb_wall+1, nzt_wall 5282 wtend(kw) = ( 1.0_wp / surf_usm_h%rho_c_wall(kw,m) ) & 5283 * ( surf_usm_h%lambda_h(kw,m) * wall_mod(kw) & 5284 * ( t_wall_h(kw+1,m) - t_wall_h(kw,m) ) & 5285 * surf_usm_h%ddz_wall(kw+1,m) & 5286 - surf_usm_h%lambda_h(kw-1,m) & 5287 * wall_mod(kw-1) & 5288 * ( t_wall_h(kw,m) - t_wall_h(kw-1,m) ) & 5289 * surf_usm_h%ddz_wall(kw,m) & 5290 ) * surf_usm_h%ddz_wall_stag(kw,m) 5215 wtend(kw) = ( 1.0_wp / surf%rho_c_wall(kw,m) ) & 5216 * ( surf%lambda_h(kw,m) * wall_mod(kw) & 5217 * ( t_wall%val(kw+1,m) - t_wall%val(kw,m) ) & 5218 * surf%ddz_wall(kw+1,m) & 5219 - surf%lambda_h(kw-1,m) * wall_mod(kw-1) & 5220 * ( t_wall%val(kw,m) - t_wall%val(kw-1,m) ) & 5221 * surf%ddz_wall(kw,m) & 5222 ) * surf%ddz_wall_stag(kw,m) 5291 5223 ENDDO 5292 5224 ENDIF 5293 5225 5294 t_wall_ h_p(nzb_wall:nzt_wall,m) = t_wall_h(nzb_wall:nzt_wall,m) + dt_3d&5295 * ( tsc(2) * wtend(nzb_wall:nzt_wall) + tsc(3) 5296 * surf _usm_h%tt_wall_m(nzb_wall:nzt_wall,m) )5297 5298 ! 5299 !-- During spinup the tempeature inside window layers is not calculated to make larger timesteps possible5226 t_wall_p%val(nzb_wall:nzt_wall,m) = t_wall%val(nzb_wall:nzt_wall,m) + dt_3d & 5227 * ( tsc(2) * wtend(nzb_wall:nzt_wall) + tsc(3) & 5228 * surf%tt_wall_m(nzb_wall:nzt_wall,m) ) 5229 5230 ! 5231 !-- During spinup the tempeature inside window layers is not calculated to make larger timesteps possible 5300 5232 IF ( .NOT. during_spinup ) THEN 5301 win_absorp = -log( surf_usm_h%transmissivity(m) ) / surf_usm_h%zw_window(nzt_wall,m) 5302 ! 5303 !-- Prognostic equation for ground/roof window temperature t_window_h takes absorption of 5304 !-- shortwave radiation into account 5233 win_absorp = -log( surf%transmissivity(m) ) / & 5234 surf%zw_window(nzt_wall,m) 5235 ! 5236 !-- Prognostic equation for ground/roof window temperature t_window takes absorption 5237 !-- of shortwave radiation into account 5305 5238 wintend(:) = 0.0_wp 5306 wintend(nzb_wall) = ( 1.0_wp / surf_usm_h%rho_c_window(nzb_wall,m) ) * & 5307 ( surf_usm_h%lambda_h_window(nzb_wall,m) & 5308 * ( t_window_h(nzb_wall+1,m) - t_window_h(nzb_wall,m) ) & 5309 * surf_usm_h%ddz_window(nzb_wall+1,m) & 5310 + surf_usm_h%wghf_eb_window(m) & 5311 + surf_usm_h%rad_sw_in(m) & 5312 * ( 1.0_wp - exp( -win_absorp * surf_usm_h%zw_window(nzb_wall,m) ) ) & 5313 ) * surf_usm_h%ddz_window_stag(nzb_wall,m) 5239 wintend(nzb_wall) = ( 1.0_wp / surf%rho_c_window(nzb_wall,m) ) & 5240 * ( surf%lambda_h_window(nzb_wall,m) & 5241 * ( t_window%val(nzb_wall+1,m) - t_window%val(nzb_wall,m) ) & 5242 * surf%ddz_window(nzb_wall+1,m) & 5243 + surf%wghf_eb_window(m) & 5244 + surf%rad_sw_in(m) & 5245 * ( 1.0_wp - exp( -win_absorp & 5246 * surf%zw_window(nzb_wall,m) ) ) & 5247 ) * surf%ddz_window_stag(nzb_wall,m) 5314 5248 5315 5249 IF ( indoor_model ) THEN 5316 5250 DO kw = nzb_wall+1, nzt_wall-1 5317 wintend(kw) = ( 1.0_wp / surf _usm_h%rho_c_window(kw,m) )&5318 * ( surf _usm_h%lambda_h_window(kw,m)&5319 * ( t_window _h(kw+1,m) - t_window_h(kw,m) )&5320 * surf _usm_h%ddz_window(kw+1,m)&5321 - surf _usm_h%lambda_h_window(kw-1,m)&5322 * ( t_window _h(kw,m) - t_window_h(kw-1,m) )&5323 * surf _usm_h%ddz_window(kw,m)&5324 + surf _usm_h%rad_sw_in(m)&5325 * ( exp( -win_absorp * surf _usm_h%zw_window(kw-1,m) )&5326 - exp(-win_absorp * surf _usm_h%zw_window(kw,m) )&5327 ) 5328 ) * surf _usm_h%ddz_window_stag(kw,m)5251 wintend(kw) = ( 1.0_wp / surf%rho_c_window(kw,m) ) & 5252 * ( surf%lambda_h_window(kw,m) & 5253 * ( t_window%val(kw+1,m) - t_window%val(kw,m) ) & 5254 * surf%ddz_window(kw+1,m) & 5255 - surf%lambda_h_window(kw-1,m) & 5256 * ( t_window%val(kw,m) - t_window%val(kw-1,m) ) & 5257 * surf%ddz_window(kw,m) & 5258 + surf%rad_sw_in(m) & 5259 * ( exp( -win_absorp * surf%zw_window(kw-1,m) ) & 5260 - exp(-win_absorp * surf%zw_window(kw,m) ) & 5261 ) & 5262 ) * surf%ddz_window_stag(kw,m) 5329 5263 5330 5264 ENDDO 5331 wintend(nzt_wall) = ( 1.0_wp / surf_usm_h%rho_c_window(nzt_wall,m) ) & 5332 * ( -surf_usm_h%lambda_h_window(nzt_wall-1,m) & 5333 * ( t_window_h(nzt_wall,m) - t_window_h(nzt_wall-1,m) ) & 5334 * surf_usm_h%ddz_window(nzt_wall,m) & 5335 + surf_usm_h%iwghf_eb_window(m) & 5336 + surf_usm_h%rad_sw_in(m) & 5337 * ( exp( -win_absorp * surf_usm_h%zw_window(nzt_wall-1,m) ) & 5338 - exp( -win_absorp * surf_usm_h%zw_window(nzt_wall,m) ) & 5339 ) & 5340 ) * surf_usm_h%ddz_window_stag(nzt_wall,m) 5265 wintend(nzt_wall) = ( 1.0_wp / surf%rho_c_window(nzt_wall,m) ) & 5266 * ( -surf%lambda_h_window(nzt_wall-1,m) & 5267 * ( t_window%val(nzt_wall,m) - t_window%val(nzt_wall-1,m) ) & 5268 * surf%ddz_window(nzt_wall,m) & 5269 + surf%iwghf_eb_window(m) & 5270 + surf%rad_sw_in(m) & 5271 * ( exp( -win_absorp & 5272 * surf%zw_window(nzt_wall-1,m) ) & 5273 - exp( -win_absorp & 5274 * surf%zw_window(nzt_wall,m) ) & 5275 ) & 5276 ) * surf%ddz_window_stag(nzt_wall,m) 5341 5277 ELSE 5342 5278 DO kw = nzb_wall+1, nzt_wall 5343 wintend(kw) = ( 1.0_wp / surf_usm_h%rho_c_window(kw,m) ) & 5344 * ( surf_usm_h%lambda_h_window(kw,m) & 5345 * ( t_window_h(kw+1,m) - t_window_h(kw,m) ) & 5346 * surf_usm_h%ddz_window(kw+1,m) & 5347 - surf_usm_h%lambda_h_window(kw-1,m) & 5348 * ( t_window_h(kw,m) & 5349 - t_window_h(kw-1,m) ) & 5350 * surf_usm_h%ddz_window(kw,m) + surf_usm_h%rad_sw_in(m) & 5351 * ( exp( -win_absorp * surf_usm_h%zw_window(kw-1,m) ) & 5352 - exp(-win_absorp * surf_usm_h%zw_window(kw,m) ) & 5353 ) & 5354 ) * surf_usm_h%ddz_window_stag(kw,m) 5279 wintend(kw) = ( 1.0_wp / surf%rho_c_window(kw,m) ) & 5280 * ( surf%lambda_h_window(kw,m) & 5281 * ( t_window%val(kw+1,m) - t_window%val(kw,m) ) & 5282 * surf%ddz_window(kw+1,m) & 5283 - surf%lambda_h_window(kw-1,m) & 5284 * ( t_window%val(kw,m) & 5285 - t_window%val(kw-1,m) ) & 5286 * surf%ddz_window(kw,m) & 5287 + surf%rad_sw_in(m) & 5288 * ( exp( -win_absorp * surf%zw_window(kw-1,m) ) & 5289 - exp(-win_absorp * surf%zw_window(kw,m) ) & 5290 ) & 5291 ) * surf%ddz_window_stag(kw,m) 5355 5292 5356 5293 ENDDO 5357 5294 ENDIF 5358 5295 5359 t_window_ h_p(nzb_wall:nzt_wall,m) = t_window_h(nzb_wall:nzt_wall,m) + dt_3d&5360 * ( tsc(2) * wintend(nzb_wall:nzt_wall) + tsc(3) 5361 * surf_usm_h%tt_window_m(nzb_wall:nzt_wall,m) )5296 t_window_p%val(nzb_wall:nzt_wall,m) = t_window%val(nzb_wall:nzt_wall,m) + dt_3d & 5297 * ( tsc(2) * wintend(nzb_wall:nzt_wall) + tsc(3) & 5298 * surf%tt_window_m(nzb_wall:nzt_wall,m) ) 5362 5299 5363 5300 ENDIF … … 5368 5305 IF ( intermediate_timestep_count == 1 ) THEN 5369 5306 DO kw = nzb_wall, nzt_wall 5370 surf _usm_h%tt_wall_m(kw,m) = wtend(kw)5307 surf%tt_wall_m(kw,m) = wtend(kw) 5371 5308 ENDDO 5372 5309 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5373 5310 DO kw = nzb_wall, nzt_wall 5374 surf _usm_h%tt_wall_m(kw,m) = -9.5625_wp * wtend(kw) + &5375 5.3125_wp * surf _usm_h%tt_wall_m(kw,m)5311 surf%tt_wall_m(kw,m) = -9.5625_wp * wtend(kw) + & 5312 5.3125_wp * surf%tt_wall_m(kw,m) 5376 5313 ENDDO 5377 5314 ENDIF … … 5384 5321 IF ( intermediate_timestep_count == 1 ) THEN 5385 5322 DO kw = nzb_wall, nzt_wall 5386 surf _usm_h%tt_window_m(kw,m) = wintend(kw)5323 surf%tt_window_m(kw,m) = wintend(kw) 5387 5324 ENDDO 5388 5325 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5389 5326 DO kw = nzb_wall, nzt_wall 5390 surf _usm_h%tt_window_m(kw,m) = -9.5625_wp * wintend(kw) + &5391 5.3125_wp * surf _usm_h%tt_window_m(kw,m)5327 surf%tt_window_m(kw,m) = -9.5625_wp * wintend(kw) + & 5328 5.3125_wp * surf%tt_window_m(kw,m) 5392 5329 ENDDO 5393 5330 ENDIF 5394 5331 ENDIF 5395 5332 ENDIF 5396 5397 5333 ENDDO 5398 5399 ! 5400 !-- For vertical surfaces 5401 !$OMP DO SCHEDULE (STATIC) 5402 DO l = 0, 3 5403 DO m = 1, surf_usm_v(l)%ns 5404 ! 5405 !-- Obtain indices 5406 i = surf_usm_v(l)%i(m) 5407 j = surf_usm_v(l)%j(m) 5408 k = surf_usm_v(l)%k(m) 5409 ! 5410 !-- Prognostic equation for wall temperature t_wall_v 5411 wtend(:) = 0.0_wp 5412 5413 wtend(nzb_wall) = ( 1.0_wp / surf_usm_v(l)%rho_c_wall(nzb_wall,m) ) & 5414 * ( surf_usm_v(l)%lambda_h(nzb_wall,m) & 5415 * wall_mod(nzb_wall) & 5416 * ( t_wall_v(l)%t(nzb_wall+1,m) & 5417 - t_wall_v(l)%t(nzb_wall,m) ) & 5418 * surf_usm_v(l)%ddz_wall(nzb_wall+1,m) & 5419 + surf_usm_v(l)%frac(m,ind_veg_wall) & 5420 / (surf_usm_v(l)%frac(m,ind_veg_wall) & 5421 + surf_usm_v(l)%frac(m,ind_pav_green) ) & 5422 * surf_usm_v(l)%wghf_eb(m) & 5423 - surf_usm_v(l)%frac(m,ind_pav_green) & 5424 / (surf_usm_v(l)%frac(m,ind_veg_wall) & 5425 + surf_usm_v(l)%frac(m,ind_pav_green) ) & 5426 * ( surf_usm_v(l)%lambda_h_green(nzt_wall,m) & 5427 * wall_mod(nzt_wall) & 5428 * surf_usm_v(l)%ddz_green(nzt_wall,m) & 5429 + surf_usm_v(l)%lambda_h(nzb_wall,m) & 5430 * wall_mod(nzb_wall) & 5431 * surf_usm_v(l)%ddz_wall(nzb_wall,m) ) & 5432 / ( surf_usm_v(l)%ddz_green(nzt_wall,m) & 5433 + surf_usm_v(l)%ddz_wall(nzb_wall,m) ) & 5434 * ( t_wall_v(l)%t(nzb_wall,m) & 5435 - t_green_v(l)%t(nzt_wall,m) ) & 5436 ) * surf_usm_v(l)%ddz_wall_stag(nzb_wall,m) 5437 5438 IF ( indoor_model ) THEN 5439 DO kw = nzb_wall+1, nzt_wall-1 5440 wtend(kw) = ( 1.0_wp / surf_usm_v(l)%rho_c_wall(kw,m) ) & 5441 * ( surf_usm_v(l)%lambda_h(kw,m) * wall_mod(kw) & 5442 * ( t_wall_v(l)%t(kw+1,m) - t_wall_v(l)%t(kw,m) ) & 5443 * surf_usm_v(l)%ddz_wall(kw+1,m) & 5444 - surf_usm_v(l)%lambda_h(kw-1,m) & 5445 * wall_mod(kw-1) & 5446 * ( t_wall_v(l)%t(kw,m) - t_wall_v(l)%t(kw-1,m) ) & 5447 * surf_usm_v(l)%ddz_wall(kw,m) & 5448 ) * surf_usm_v(l)%ddz_wall_stag(kw,m) 5334 !$OMP END PARALLEL 5335 5336 IF ( debug_output_timestep ) THEN 5337 WRITE( debug_string, * ) 'usm_wall_heat_model: ', horizontal, l, during_spinup 5338 CALL debug_message( debug_string, 'end' ) 5339 ENDIF 5340 5341 END SUBROUTINE usm_wall_heat_model 5342 5343 !--------------------------------------------------------------------------------------------------! 5344 ! Description: 5345 ! ------------ 5346 ! 5347 !> Green and substrate model as part of the urban surface model. The model predicts ground 5348 !> temperatures. 5349 !> 5350 !> Important: green-heat model crashes due to unknown reason. Green fraction is thus set to zero 5351 !> (in favor of wall fraction). 5352 !--------------------------------------------------------------------------------------------------! 5353 SUBROUTINE usm_green_heat_model( horizontal, l ) 5354 5355 5356 IMPLICIT NONE 5357 5358 LOGICAL :: horizontal !< Flag indicating horizontal or vertical surfaces 5359 INTEGER(iwp) :: l !< direction index 5360 5361 INTEGER(iwp) :: i, j, k, kw, m !< running indices 5362 5363 LOGICAL :: conserve_water_content = .TRUE. !< 5364 5365 REAL(wp) :: drho_l_lv !< frequently used parameter 5366 REAL(wp) :: h_vg !< Van Genuchten coef. h 5367 REAL(wp) :: ke, lambda_h_green_sat !< heat conductivity for saturated soil 5368 5369 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: gtend,tend !< tendency 5370 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: root_extr_green !< 5371 5372 REAL(wp), DIMENSION(nzb_wall:nzt_wall+1) :: gamma_green_temp !< temp. gamma 5373 REAL(wp), DIMENSION(nzb_wall:nzt_wall+1) :: lambda_green_temp !< temp. lambda 5374 5375 TYPE(surf_type), POINTER :: surf !< surface-date type variable 5376 TYPE(surf_type_2d_usm), POINTER :: t_wall 5377 TYPE(surf_type_2d_usm), POINTER :: t_green 5378 5379 IF ( debug_output_timestep ) THEN 5380 WRITE( debug_string, * ) 'usm_green_heat_model: ', horizontal, l 5381 CALL debug_message( debug_string, 'start' ) 5382 ENDIF 5383 5384 drho_l_lv = 1.0_wp / (rho_l * l_v) 5385 5386 ! 5387 !-- For horizontal upward surfaces. 5388 IF ( horizontal .AND. l==0 ) THEN 5389 surf => surf_usm_h(l) 5390 t_wall => t_wall_h(l) 5391 t_green => t_green_h(l) 5392 5393 !-- Set tendency array for soil moisture to zero 5394 IF ( surf%ns > 0 ) THEN 5395 IF ( intermediate_timestep_count == 1 ) surf%tswc_h_m = 0.0_wp 5396 ENDIF 5397 5398 !$OMP PARALLEL PRIVATE (m, i, j, k, kw, lambda_h_green_sat, ke, lambda_green_temp, gtend, & 5399 !$OMP& tend, h_vg, gamma_green_temp, m_total, root_extr_green) 5400 !$OMP DO SCHEDULE (STATIC) 5401 DO m = 1, surf%ns 5402 IF (surf%frac(m,ind_pav_green) > 0.0_wp) THEN 5403 ! 5404 !-- Obtain indices 5405 i = surf%i(m) 5406 j = surf%j(m) 5407 k = surf%k(m) 5408 5409 DO kw = nzb_wall, nzt_wall 5410 ! 5411 !-- Calculate volumetric heat capacity of the soil, taking into account water content 5412 surf%rho_c_total_green(kw,m) = (surf%rho_c_green(kw,m) & 5413 * (1.0_wp - swc_sat_h(l)%val(kw,m)) & 5414 + rho_c_water * swc_h(l)%val(kw,m)) 5415 5416 ! 5417 !-- Calculate soil heat conductivity at the center of the soil layers 5418 lambda_h_green_sat = lambda_h_green_sm ** ( 1.0_wp - swc_sat_h(l)%val(kw,m) ) & 5419 * lambda_h_water ** swc_h(l)%val(kw,m) 5420 5421 ke = 1.0_wp + LOG10( MAX( 0.1_wp,swc_h(l)%val(kw,m) / swc_sat_h(l)%val(kw,m) ) ) 5422 5423 lambda_green_temp(kw) = ke * (lambda_h_green_sat - lambda_h_green_dry) & 5424 + lambda_h_green_dry 5425 5449 5426 ENDDO 5450 wtend(nzt_wall) = ( 1.0_wp / surf_usm_v(l)%rho_c_wall(nzt_wall,m) ) & 5451 * ( -surf_usm_v(l)%lambda_h(nzt_wall-1,m) * wall_mod(nzt_wall-1) & 5452 * ( t_wall_v(l)%t(nzt_wall,m) - t_wall_v(l)%t(nzt_wall-1,m) ) & 5453 * surf_usm_v(l)%ddz_wall(nzt_wall,m) & 5454 + surf_usm_v(l)%iwghf_eb(m) & 5455 ) * surf_usm_v(l)%ddz_wall_stag(nzt_wall,m) 5456 ELSE 5427 lambda_green_temp(nzt_wall+1) = lambda_green_temp(nzt_wall) 5428 5429 5430 ! 5431 !-- Calculate soil heat conductivity (lambda_h) at the _stag level using linear interpolation. 5432 !-- For pavement surface, the true pavement depth is considered 5433 DO kw = nzb_wall, nzt_wall 5434 surf%lambda_h_green(kw,m) = ( lambda_green_temp(kw+1) + lambda_green_temp(kw) ) & 5435 * 0.5_wp 5436 ENDDO 5437 5438 t_green_h(l)%val(nzt_wall+1,m) = t_wall_h(l)%val(nzb_wall,m) 5439 ! 5440 !-- Prognostic equation for ground/roof temperature t_green_h 5441 gtend(:) = 0.0_wp 5442 gtend(nzb_wall) = ( 1.0_wp / surf%rho_c_total_green(nzb_wall,m) ) & 5443 * ( surf%lambda_h_green(nzb_wall,m) & 5444 * ( t_green_h(l)%val(nzb_wall+1,m) & 5445 - t_green_h(l)%val(nzb_wall,m) ) & 5446 * surf%ddz_green(nzb_wall+1,m) & 5447 + surf%wghf_eb_green(m) & 5448 ) * surf%ddz_green_stag(nzb_wall,m) 5449 5457 5450 DO kw = nzb_wall+1, nzt_wall 5458 wtend(kw) = ( 1.0_wp / surf_usm_v(l)%rho_c_wall(kw,m) ) & 5459 * ( surf_usm_v(l)%lambda_h(kw,m) * wall_mod(kw) & 5460 * ( t_wall_v(l)%t(kw+1,m) - t_wall_v(l)%t(kw,m) ) & 5461 * surf_usm_v(l)%ddz_wall(kw+1,m) & 5462 - surf_usm_v(l)%lambda_h(kw-1,m) & 5463 * wall_mod(kw-1) & 5464 * ( t_wall_v(l)%t(kw,m) - t_wall_v(l)%t(kw-1,m) ) & 5465 * surf_usm_v(l)%ddz_wall(kw,m) & 5466 ) * surf_usm_v(l)%ddz_wall_stag(kw,m) 5451 gtend(kw) = ( 1.0_wp / surf%rho_c_total_green(kw,m) ) & 5452 * ( surf%lambda_h_green(kw,m) & 5453 * ( t_green_h(l)%val(kw+1,m) - t_green_h(l)%val(kw,m) ) & 5454 * surf%ddz_green(kw+1,m) & 5455 - surf%lambda_h_green(kw-1,m) & 5456 * ( t_green_h(l)%val(kw,m) - t_green_h(l)%val(kw-1,m) ) & 5457 * surf%ddz_green(kw,m) & 5458 ) * surf%ddz_green_stag(kw,m) 5467 5459 ENDDO 5468 ENDIF 5469 5470 t_wall_v_p(l)%t(nzb_wall:nzt_wall,m) = t_wall_v(l)%t(nzb_wall:nzt_wall,m) + dt_3d & 5471 * ( tsc(2) * wtend(nzb_wall:nzt_wall) + tsc(3) & 5472 * surf_usm_v(l)%tt_wall_m(nzb_wall:nzt_wall, & 5473 m) ) 5474 5475 IF ( .NOT. during_spinup ) THEN 5476 win_absorp = -log( surf_usm_v(l)%transmissivity(m) ) / & 5477 surf_usm_v(l)%zw_window(nzt_wall,m) 5478 ! 5479 !-- Prognostic equation for window temperature t_window_v 5480 wintend(:) = 0.0_wp 5481 wintend(nzb_wall) = ( 1.0_wp / surf_usm_v(l)%rho_c_window(nzb_wall,m) ) & 5482 * ( surf_usm_v(l)%lambda_h_window(nzb_wall,m) & 5483 * ( t_window_v(l)%t(nzb_wall+1,m) & 5484 - t_window_v(l)%t(nzb_wall,m) ) & 5485 * surf_usm_v(l)%ddz_window(nzb_wall+1,m) & 5486 + surf_usm_v(l)%wghf_eb_window(m) & 5487 + surf_usm_v(l)%rad_sw_in(m) & 5488 * ( 1.0_wp - exp( -win_absorp & 5489 * surf_usm_v(l)%zw_window(nzb_wall,m) ) ) & 5490 ) * surf_usm_v(l)%ddz_window_stag(nzb_wall,m) 5491 5492 IF ( indoor_model ) THEN 5493 DO kw = nzb_wall+1, nzt_wall -1 5494 wintend(kw) = ( 1.0_wp / surf_usm_v(l)%rho_c_window(kw,m) ) & 5495 * ( surf_usm_v(l)%lambda_h_window(kw,m) & 5496 * ( t_window_v(l)%t(kw+1,m) - t_window_v(l)%t(kw,m) ) & 5497 * surf_usm_v(l)%ddz_window(kw+1,m) & 5498 - surf_usm_v(l)%lambda_h_window(kw-1,m) & 5499 * ( t_window_v(l)%t(kw,m) - t_window_v(l)%t(kw-1,m) ) & 5500 * surf_usm_v(l)%ddz_window(kw,m) & 5501 + surf_usm_v(l)%rad_sw_in(m) & 5502 * ( exp( -win_absorp * surf_usm_v(l)%zw_window(kw-1,m) ) & 5503 - exp(-win_absorp * surf_usm_v(l)%zw_window(kw,m) ) & 5504 ) & 5505 ) * surf_usm_v(l)%ddz_window_stag(kw,m) 5506 ENDDO 5507 wintend(nzt_wall) = ( 1.0_wp / surf_usm_v(l)%rho_c_window(nzt_wall,m) ) & 5508 * ( -surf_usm_v(l)%lambda_h_window(nzt_wall-1,m) & 5509 * ( t_window_v(l)%t(nzt_wall,m) & 5510 - t_window_v(l)%t(nzt_wall-1,m) ) & 5511 * surf_usm_v(l)%ddz_window(nzt_wall,m) & 5512 + surf_usm_v(l)%iwghf_eb_window(m) & 5513 + surf_usm_v(l)%rad_sw_in(m) & 5514 * ( exp( -win_absorp & 5515 * surf_usm_v(l)%zw_window(nzt_wall-1,m) ) & 5516 - exp(-win_absorp & 5517 * surf_usm_v(l)%zw_window(nzt_wall,m) ) & 5518 ) & 5519 ) * surf_usm_v(l)%ddz_window_stag(nzt_wall,m) 5520 ELSE 5521 DO kw = nzb_wall+1, nzt_wall 5522 wintend(kw) = ( 1.0_wp / surf_usm_v(l)%rho_c_window(kw,m) ) & 5523 * ( surf_usm_v(l)%lambda_h_window(kw,m) & 5524 * ( t_window_v(l)%t(kw+1,m) - t_window_v(l)%t(kw,m) ) & 5525 * surf_usm_v(l)%ddz_window(kw+1,m) & 5526 - surf_usm_v(l)%lambda_h_window(kw-1,m) & 5527 * ( t_window_v(l)%t(kw,m) - t_window_v(l)%t(kw-1,m) ) & 5528 * surf_usm_v(l)%ddz_window(kw,m) & 5529 + surf_usm_v(l)%rad_sw_in(m) & 5530 * ( exp( -win_absorp * surf_usm_v(l)%zw_window(kw-1,m) ) & 5531 - exp(-win_absorp & 5532 * surf_usm_v(l)%zw_window(kw,m) ) & 5533 ) & 5534 ) * surf_usm_v(l)%ddz_window_stag(kw,m) 5535 ENDDO 5536 ENDIF 5537 5538 t_window_v_p(l)%t(nzb_wall:nzt_wall,m) = t_window_v(l)%t(nzb_wall:nzt_wall,m) & 5539 + dt_3d * ( tsc(2) & 5540 * wintend(nzb_wall:nzt_wall) & 5541 + tsc(3) & 5542 * surf_usm_v(l)%tt_window_m(nzb_wall:nzt_wall,m) ) 5543 ENDIF 5544 5545 ! 5546 !-- Calculate t_wall tendencies for the next Runge-Kutta step 5547 IF ( timestep_scheme(1:5) == 'runge' ) THEN 5548 IF ( intermediate_timestep_count == 1 ) THEN 5549 DO kw = nzb_wall, nzt_wall 5550 surf_usm_v(l)%tt_wall_m(kw,m) = wtend(kw) 5551 ENDDO 5552 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5553 DO kw = nzb_wall, nzt_wall 5554 surf_usm_v(l)%tt_wall_m(kw,m) = - 9.5625_wp * wtend(kw) + & 5555 5.3125_wp * surf_usm_v(l)%tt_wall_m(kw,m) 5556 ENDDO 5557 ENDIF 5558 ENDIF 5559 5560 5561 IF ( .NOT. during_spinup ) THEN 5562 ! 5563 !-- Calculate t_window tendencies for the next Runge-Kutta step 5460 5461 t_green_h_p(l)%val(nzb_wall:nzt_wall,m) = t_green_h(l)%val(nzb_wall:nzt_wall,m) & 5462 + dt_3d * ( tsc(2) * gtend(nzb_wall:nzt_wall) + tsc(3) & 5463 * surf%tt_green_m(nzb_wall:nzt_wall,m) ) 5464 5465 5466 ! 5467 !-- Calculate t_green tendencies for the next Runge-Kutta step 5564 5468 IF ( timestep_scheme(1:5) == 'runge' ) THEN 5565 5469 IF ( intermediate_timestep_count == 1 ) THEN 5566 5470 DO kw = nzb_wall, nzt_wall 5567 surf _usm_v(l)%tt_window_m(kw,m) = wintend(kw)5471 surf%tt_green_m(kw,m) = gtend(kw) 5568 5472 ENDDO 5569 ELSEIF ( intermediate_timestep_count < 5473 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5570 5474 DO kw = nzb_wall, nzt_wall 5571 surf _usm_v(l)%tt_window_m(kw,m) = - 9.5625_wp * wintend(kw) + 5.3125_wp *&5572 surf_usm_v(l)%tt_window_m(kw,m)5475 surf%tt_green_m(kw,m) = -9.5625_wp * gtend(kw) + 5.3125_wp & 5476 * surf%tt_green_m(kw,m) 5573 5477 ENDDO 5574 5478 ENDIF 5575 5479 ENDIF 5576 ENDIF 5577 5578 ENDDO 5579 ENDDO 5580 !$OMP END PARALLEL 5581 5582 IF ( debug_output_timestep ) THEN 5583 WRITE( debug_string, * ) 'usm_material_heat_model | during_spinup: ', during_spinup 5584 CALL debug_message( debug_string, 'end' ) 5585 ENDIF 5586 5587 END SUBROUTINE usm_material_heat_model 5588 5589 !--------------------------------------------------------------------------------------------------! 5590 ! Description: 5591 ! ------------ 5592 ! 5593 !> Green and substrate model as part of the urban surface model. The model predicts ground 5594 !> temperatures. 5595 !> 5596 !> Important: gree-heat model crashes due to unknown reason. Green fraction is thus set to zero 5597 !> (in favor of wall fraction). 5598 !--------------------------------------------------------------------------------------------------! 5599 SUBROUTINE usm_green_heat_model 5600 5601 5602 IMPLICIT NONE 5603 5604 INTEGER(iwp) :: i, j, k, l, kw, m !< running indices 5605 5606 LOGICAL :: conserve_water_content = .TRUE. !< 5607 5608 REAL(wp) :: drho_l_lv !< frequently used parameter 5609 REAL(wp) :: h_vg !< Van Genuchten coef. h 5610 REAL(wp) :: ke, lambda_h_green_sat !< heat conductivity for saturated soil 5611 5612 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: gtend,tend !< tendency 5613 REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: root_extr_green !< 5614 5615 REAL(wp), DIMENSION(nzb_wall:nzt_wall+1) :: gamma_green_temp !< temp. gamma 5616 REAL(wp), DIMENSION(nzb_wall:nzt_wall+1) :: lambda_green_temp !< temp. lambda 5617 5618 5619 5620 5621 5622 IF ( debug_output_timestep ) CALL debug_message( 'usm_green_heat_model', 'start' ) 5623 5624 drho_l_lv = 1.0_wp / (rho_l * l_v) 5625 5626 ! 5627 !-- For horizontal surfaces. 5628 !-- Set tendency array for soil moisture to zero 5629 IF ( surf_usm_h%ns > 0 ) THEN 5630 IF ( intermediate_timestep_count == 1 ) surf_usm_h%tswc_h_m = 0.0_wp 5631 ENDIF 5632 5633 !$OMP PARALLEL PRIVATE (m, i, j, k, kw, lambda_h_green_sat, ke, lambda_green_temp, gtend, & 5634 !$OMP& tend, h_vg, gamma_green_temp, m_total, root_extr_green) 5635 !$OMP DO SCHEDULE (STATIC) 5636 DO m = 1, surf_usm_h%ns 5637 IF (surf_usm_h%frac(m,ind_pav_green) > 0.0_wp) THEN 5638 ! 5639 !-- Obtain indices 5640 i = surf_usm_h%i(m) 5641 j = surf_usm_h%j(m) 5642 k = surf_usm_h%k(m) 5643 5644 DO kw = nzb_wall, nzt_wall 5645 ! 5646 !-- Calculate volumetric heat capacity of the soil, taking into account water content 5647 surf_usm_h%rho_c_total_green(kw,m) = (surf_usm_h%rho_c_green(kw,m) & 5648 * (1.0_wp - swc_sat_h(kw,m)) & 5649 + rho_c_water * swc_h(kw,m)) 5650 5651 ! 5652 !-- Calculate soil heat conductivity at the center of the soil layers 5653 lambda_h_green_sat = lambda_h_green_sm ** ( 1.0_wp - swc_sat_h(kw,m) ) & 5654 * lambda_h_water ** swc_h(kw,m) 5655 5656 ke = 1.0_wp + LOG10( MAX( 0.1_wp,swc_h(kw,m) / swc_sat_h(kw,m) ) ) 5657 5658 lambda_green_temp(kw) = ke * (lambda_h_green_sat - lambda_h_green_dry) & 5659 + lambda_h_green_dry 5660 5661 ENDDO 5662 lambda_green_temp(nzt_wall+1) = lambda_green_temp(nzt_wall) 5663 5664 5665 ! 5666 !-- Calculate soil heat conductivity (lambda_h) at the _stag level using linear interpolation. 5667 !-- For pavement surface, the true pavement depth is considered 5668 DO kw = nzb_wall, nzt_wall 5669 surf_usm_h%lambda_h_green(kw,m) = ( lambda_green_temp(kw+1) + lambda_green_temp(kw) ) & 5670 * 0.5_wp 5671 ENDDO 5672 5673 t_green_h(nzt_wall+1,m) = t_wall_h(nzb_wall,m) 5674 ! 5675 !-- Prognostic equation for ground/roof temperature t_green_h 5676 gtend(:) = 0.0_wp 5677 gtend(nzb_wall) = ( 1.0_wp / surf_usm_h%rho_c_total_green(nzb_wall,m) ) & 5678 * ( surf_usm_h%lambda_h_green(nzb_wall,m) & 5679 * ( t_green_h(nzb_wall+1,m) & 5680 - t_green_h(nzb_wall,m) ) & 5681 * surf_usm_h%ddz_green(nzb_wall+1,m) & 5682 + surf_usm_h%wghf_eb_green(m) & 5683 ) * surf_usm_h%ddz_green_stag(nzb_wall,m) 5684 5685 DO kw = nzb_wall+1, nzt_wall 5686 gtend(kw) = ( 1.0_wp / surf_usm_h%rho_c_total_green(kw,m) ) & 5687 * ( surf_usm_h%lambda_h_green(kw,m) & 5688 * ( t_green_h(kw+1,m) - t_green_h(kw,m) ) & 5689 * surf_usm_h%ddz_green(kw+1,m) & 5690 - surf_usm_h%lambda_h_green(kw-1,m) & 5691 * ( t_green_h(kw,m) - t_green_h(kw-1,m) ) & 5692 * surf_usm_h%ddz_green(kw,m) & 5693 ) * surf_usm_h%ddz_green_stag(kw,m) 5694 ENDDO 5695 5696 t_green_h_p(nzb_wall:nzt_wall,m) = t_green_h(nzb_wall:nzt_wall,m) + dt_3d & 5697 * ( tsc(2) * gtend(nzb_wall:nzt_wall) + tsc(3) & 5698 * surf_usm_h%tt_green_m(nzb_wall:nzt_wall,m) ) 5699 5700 5701 ! 5702 !-- Calculate t_green tendencies for the next Runge-Kutta step 5703 IF ( timestep_scheme(1:5) == 'runge' ) THEN 5704 IF ( intermediate_timestep_count == 1 ) THEN 5705 DO kw = nzb_wall, nzt_wall 5706 surf_usm_h%tt_green_m(kw,m) = gtend(kw) 5707 ENDDO 5708 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5709 DO kw = nzb_wall, nzt_wall 5710 surf_usm_h%tt_green_m(kw,m) = -9.5625_wp * gtend(kw) + 5.3125_wp & 5711 * surf_usm_h%tt_green_m(kw,m) 5712 ENDDO 5713 ENDIF 5714 ENDIF 5715 5716 DO kw = nzb_wall, nzt_wall 5717 5718 ! 5719 !-- Calculate soil diffusivity at the center of the soil layers 5720 lambda_green_temp(kw) = ( - b_ch * surf_usm_h%gamma_w_green_sat(kw,m) * psi_sat & 5721 / swc_sat_h(kw,m) ) & 5722 * ( MAX( swc_h(kw,m), wilt_h(kw,m) ) / swc_sat_h(kw,m) )** & 5723 ( b_ch + 2.0_wp ) 5724 5725 ! 5726 !-- Parametrization of Van Genuchten 5727 IF ( soil_type /= 7 ) THEN 5728 ! 5729 !-- Calculate the hydraulic conductivity after Van Genuchten (1980) 5730 h_vg = ( ( (swc_res_h(kw,m) - swc_sat_h(kw,m)) / ( swc_res_h(kw,m) - & 5731 MAX( swc_h(kw,m), wilt_h(kw,m) ) ) )** & 5732 ( surf_usm_h%n_vg_green(m) / (surf_usm_h%n_vg_green(m) - 1.0_wp ) ) & 5733 - 1.0_wp & 5734 )** ( 1.0_wp / surf_usm_h%n_vg_green(m) ) / surf_usm_h%alpha_vg_green(m) 5735 5736 5737 gamma_green_temp(kw) = surf_usm_h%gamma_w_green_sat(kw,m) & 5738 * ( ( ( 1.0_wp + ( surf_usm_h%alpha_vg_green(m) * h_vg )** & 5739 surf_usm_h%n_vg_green(m) )** & 5740 ( 1.0_wp - 1.0_wp / surf_usm_h%n_vg_green(m) ) & 5741 - ( surf_usm_h%alpha_vg_green(m) * h_vg )** & 5742 ( surf_usm_h%n_vg_green(m) - 1.0_wp) )**2 & 5743 ) / ( ( 1.0_wp + ( surf_usm_h%alpha_vg_green(m) * h_vg )**& 5744 surf_usm_h%n_vg_green(m) )** & 5745 ( ( 1.0_wp - 1.0_wp / surf_usm_h%n_vg_green(m) ) & 5746 *( surf_usm_h%l_vg_green(m) + 2.0_wp) ) & 5747 ) 5748 5749 ! 5750 !-- Parametrization of Clapp & Hornberger 5751 ELSE 5752 gamma_green_temp(kw) = surf_usm_h%gamma_w_green_sat(kw,m) * ( swc_h(kw,m) & 5753 / swc_sat_h(kw,m) )**( 2.0_wp * b_ch + 3.0_wp ) 5754 ENDIF 5755 5756 ENDDO 5757 5758 ! 5759 !-- Prognostic equation for soil moisture content. Only performed, when humidity is enabled in 5760 !-- the atmosphere 5761 IF ( humidity ) THEN 5762 ! 5763 !-- Calculate soil diffusivity (lambda_w) at the _stag level using linear interpolation. 5764 !-- To do: replace this with ECMWF-IFS Eq. 8.81 5765 DO kw = nzb_wall, nzt_wall-1 5766 5767 surf_usm_h%lambda_w_green(kw,m) = ( lambda_green_temp(kw+1) & 5768 + lambda_green_temp(kw) ) & 5769 * 0.5_wp 5770 surf_usm_h%gamma_w_green(kw,m) = ( gamma_green_temp(kw+1) & 5771 + gamma_green_temp(kw) ) & 5772 * 0.5_wp 5480 5481 DO kw = nzb_wall, nzt_wall 5482 5483 ! 5484 !-- Calculate soil diffusivity at the center of the soil layers 5485 lambda_green_temp(kw) = ( - b_ch * surf%gamma_w_green_sat(kw,m) * psi_sat & 5486 / swc_sat_h(l)%val(kw,m) ) & 5487 * ( MAX( swc_h(l)%val(kw,m), wilt_h(l)%val(kw,m) ) & 5488 / swc_sat_h(l)%val(kw,m) )**( b_ch + 2.0_wp ) 5489 5490 ! 5491 !-- Parametrization of Van Genuchten 5492 IF ( soil_type /= 7 ) THEN 5493 ! 5494 !-- Calculate the hydraulic conductivity after Van Genuchten (1980) 5495 h_vg = ( ( (swc_res_h(l)%val(kw,m) - swc_sat_h(l)%val(kw,m)) & 5496 / ( swc_res_h(l)%val(kw,m) - & 5497 MAX( swc_h(l)%val(kw,m), wilt_h(l)%val(kw,m) ) ) )** & 5498 ( surf%n_vg_green(m) / (surf%n_vg_green(m) - 1.0_wp ) ) & 5499 - 1.0_wp & 5500 )** ( 1.0_wp / surf%n_vg_green(m) ) / surf%alpha_vg_green(m) 5501 5502 5503 gamma_green_temp(kw) = surf%gamma_w_green_sat(kw,m) & 5504 * ( ( ( 1.0_wp + ( surf%alpha_vg_green(m) * h_vg )** & 5505 surf%n_vg_green(m) )** & 5506 ( 1.0_wp - 1.0_wp / surf%n_vg_green(m) ) & 5507 - ( surf%alpha_vg_green(m) * h_vg )** & 5508 ( surf%n_vg_green(m) - 1.0_wp) )**2 & 5509 ) / ( ( 1.0_wp + ( surf%alpha_vg_green(m) * h_vg )**& 5510 surf%n_vg_green(m) )** & 5511 ( ( 1.0_wp - 1.0_wp / surf%n_vg_green(m) ) & 5512 *( surf%l_vg_green(m) + 2.0_wp) ) & 5513 ) 5514 5515 ! 5516 !-- Parametrization of Clapp & Hornberger 5517 ELSE 5518 gamma_green_temp(kw) = surf%gamma_w_green_sat(kw,m) * ( swc_h(l)%val(kw,m) & 5519 / swc_sat_h(l)%val(kw,m) )**( 2.0_wp * b_ch + 3.0_wp ) 5520 ENDIF 5773 5521 5774 5522 ENDDO 5775 5523 5776 5524 ! 5777 !-- In case of a closed bottom (= water content is conserved), set hydraulic conductivity 5778 !-- to zero so that no water will be lost in the bottom layer. 5779 IF ( conserve_water_content ) THEN 5780 surf_usm_h%gamma_w_green(kw,m) = 0.0_wp 5781 ELSE 5782 surf_usm_h%gamma_w_green(kw,m) = gamma_green_temp(nzt_wall) 5783 ENDIF 5784 5785 !-- The root extraction (= root_extr * qsws_veg / (rho_l * l_v)) ensures the mass 5786 !-- conservation for water. The transpiration of plants equals the cumulative withdrawals 5787 !-- by the roots in the soil. The scheme takes into account the availability of water in 5788 !-- the soil layers as well as the root fraction in the respective layer. Layer with 5789 !-- moisture below wilting point will not contribute, which reflects the preference of 5790 !-- plants to take water from moister layers. 5791 5792 ! 5793 !-- Calculate the root extraction (ECMWF 7.69, the sum of root_extr = 1). The energy 5794 !-- balance solver guarantees a positive transpiration, so that there is no need for an 5795 !-- additional check. 5796 m_total = 0.0_wp 5797 DO kw = nzb_wall, nzt_wall 5798 IF ( swc_h(kw,m) > wilt_h(kw,m) ) THEN 5799 m_total = m_total + rootfr_h(kw,m) * swc_h(kw,m) 5800 ENDIF 5801 ENDDO 5802 5803 IF ( m_total > 0.0_wp ) THEN 5525 !-- Prognostic equation for soil moisture content. Only performed, when humidity is enabled in 5526 !-- the atmosphere 5527 IF ( humidity ) THEN 5528 ! 5529 !-- Calculate soil diffusivity (lambda_w) at the _stag level using linear interpolation. 5530 !-- To do: replace this with ECMWF-IFS Eq. 8.81 5531 DO kw = nzb_wall, nzt_wall-1 5532 5533 surf%lambda_w_green(kw,m) = ( lambda_green_temp(kw+1) & 5534 + lambda_green_temp(kw) ) & 5535 * 0.5_wp 5536 surf%gamma_w_green(kw,m) = ( gamma_green_temp(kw+1) & 5537 + gamma_green_temp(kw) ) & 5538 * 0.5_wp 5539 5540 ENDDO 5541 5542 ! 5543 !-- In case of a closed bottom (= water content is conserved), set hydraulic conductivity 5544 !-- to zero so that no water will be lost in the bottom layer. 5545 IF ( conserve_water_content ) THEN 5546 surf%gamma_w_green(kw,m) = 0.0_wp 5547 ELSE 5548 surf%gamma_w_green(kw,m) = gamma_green_temp(nzt_wall) 5549 ENDIF 5550 5551 !-- The root extraction (= root_extr * qsws_veg / (rho_l * l_v)) ensures the mass 5552 !-- conservation for water. The transpiration of plants equals the cumulative withdrawals 5553 !-- by the roots in the soil. The scheme takes into account the availability of water in 5554 !-- the soil layers as well as the root fraction in the respective layer. Layer with 5555 !-- moisture below wilting point will not contribute, which reflects the preference of 5556 !-- plants to take water from moister layers. 5557 5558 ! 5559 !-- Calculate the root extraction (ECMWF 7.69, the sum of root_extr = 1). The energy 5560 !-- balance solver guarantees a positive transpiration, so that there is no need for an 5561 !-- additional check. 5562 m_total = 0.0_wp 5804 5563 DO kw = nzb_wall, nzt_wall 5805 IF ( swc_h(kw,m) > wilt_h(kw,m) ) THEN 5806 root_extr_green(kw) = rootfr_h(kw,m) * swc_h(kw,m) / m_total 5807 ELSE 5808 root_extr_green(kw) = 0.0_wp 5809 ENDIF 5564 IF ( swc_h(l)%val(kw,m) > wilt_h(l)%val(kw,m) ) THEN 5565 m_total = m_total + rootfr_h(l)%val(kw,m) * swc_h(l)%val(kw,m) 5566 ENDIF 5810 5567 ENDDO 5811 ENDIF 5812 5813 ! 5814 !-- Prognostic equation for soil water content m_soil. 5815 tend(:) = 0.0_wp 5816 5817 tend(nzb_wall) = ( surf_usm_h%lambda_w_green(nzb_wall,m) & 5818 * ( swc_h(nzb_wall+1,m) - swc_h(nzb_wall,m) ) & 5819 * surf_usm_h%ddz_green(nzb_wall+1,m) & 5820 - surf_usm_h%gamma_w_green(nzb_wall,m) & 5821 - ( root_extr_green(nzb_wall) * surf_usm_h%qsws_veg(m) & 5822 ! + surf_usm_h%qsws_soil_green(m) & 5823 ) * drho_l_lv ) & 5824 * surf_usm_h%ddz_green_stag(nzb_wall,m) 5825 5826 DO kw = nzb_wall+1, nzt_wall-1 5827 tend(kw) = ( surf_usm_h%lambda_w_green(kw,m) & 5828 * ( swc_h(kw+1,m) - swc_h(kw,m) ) & 5829 * surf_usm_h%ddz_green(kw+1,m) & 5830 - surf_usm_h%gamma_w_green(kw,m) & 5831 - surf_usm_h%lambda_w_green(kw-1,m) & 5832 * ( swc_h(kw,m) - swc_h(kw-1,m) ) & 5833 * surf_usm_h%ddz_green(kw,m) & 5834 + surf_usm_h%gamma_w_green(kw-1,m) & 5835 - (root_extr_green(kw) & 5836 * surf_usm_h%qsws_veg(m) & 5837 * drho_l_lv) & 5838 ) * surf_usm_h%ddz_green_stag(kw,m) 5839 5840 ENDDO 5841 tend(nzt_wall) = ( - surf_usm_h%gamma_w_green(nzt_wall,m) & 5842 - surf_usm_h%lambda_w_green(nzt_wall-1,m) & 5843 * (swc_h(nzt_wall,m) & 5844 - swc_h(nzt_wall-1,m)) & 5845 * surf_usm_h%ddz_green(nzt_wall,m) & 5846 + surf_usm_h%gamma_w_green(nzt_wall-1,m) & 5847 - ( root_extr_green(nzt_wall) & 5848 * surf_usm_h%qsws_veg(m) & 5849 * drho_l_lv ) & 5850 ) * surf_usm_h%ddz_green_stag(nzt_wall,m) 5851 5852 swc_h_p(nzb_wall:nzt_wall,m) = swc_h(nzb_wall:nzt_wall,m) + dt_3d & 5853 * ( tsc(2) * tend(:) + tsc(3) & 5854 * surf_usm_h%tswc_h_m(:,m) & 5855 ) 5856 5857 ! 5858 !-- Account for dry soils (find a better solution here!) 5859 DO kw = nzb_wall, nzt_wall 5860 IF ( swc_h_p(kw,m) < 0.0_wp ) swc_h_p(kw,m) = 0.0_wp 5861 ENDDO 5862 5863 ! 5864 !-- Calculate m_soil tendencies for the next Runge-Kutta step 5865 IF ( timestep_scheme(1:5) == 'runge' ) THEN 5866 IF ( intermediate_timestep_count == 1 ) THEN 5568 5569 IF ( m_total > 0.0_wp ) THEN 5867 5570 DO kw = nzb_wall, nzt_wall 5868 surf_usm_h%tswc_h_m(kw,m) = tend(kw) 5869 ENDDO 5870 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5871 DO kw = nzb_wall, nzt_wall 5872 surf_usm_h%tswc_h_m(kw,m) = -9.5625_wp * tend(kw) + 5.3125_wp & 5873 * surf_usm_h%tswc_h_m(kw,m) 5571 IF ( swc_h(l)%val(kw,m) > wilt_h(l)%val(kw,m) ) THEN 5572 root_extr_green(kw) = rootfr_h(l)%val(kw,m) * swc_h(l)%val(kw,m) / m_total 5573 ELSE 5574 root_extr_green(kw) = 0.0_wp 5575 ENDIF 5874 5576 ENDDO 5875 5577 ENDIF 5578 5579 ! 5580 !-- Prognostic equation for soil water content m_soil. 5581 tend(:) = 0.0_wp 5582 5583 tend(nzb_wall) = ( surf_usm_h(l)%lambda_w_green(nzb_wall,m) & 5584 * ( swc_h(l)%val(nzb_wall+1,m) - swc_h(l)%val(nzb_wall,m) ) & 5585 * surf_usm_h(l)%ddz_green(nzb_wall+1,m) & 5586 - surf_usm_h(l)%gamma_w_green(nzb_wall,m) & 5587 - ( root_extr_green(nzb_wall) * surf_usm_h(l)%qsws_veg(m) & 5588 ! + surf_usm_h(l)%qsws_soil_green(m) & 5589 ) * drho_l_lv ) & 5590 * surf_usm_h(l)%ddz_green_stag(nzb_wall,m) 5591 5592 DO kw = nzb_wall+1, nzt_wall-1 5593 tend(kw) = ( surf_usm_h(l)%lambda_w_green(kw,m) & 5594 * ( swc_h(l)%val(kw+1,m) - swc_h(l)%val(kw,m) ) & 5595 * surf_usm_h(l)%ddz_green(kw+1,m) & 5596 - surf_usm_h(l)%gamma_w_green(kw,m) & 5597 - surf_usm_h(l)%lambda_w_green(kw-1,m) & 5598 * ( swc_h(l)%val(kw,m) - swc_h(l)%val(kw-1,m) ) & 5599 * surf_usm_h(l)%ddz_green(kw,m) & 5600 + surf_usm_h(l)%gamma_w_green(kw-1,m) & 5601 - (root_extr_green(kw) & 5602 * surf_usm_h(l)%qsws_veg(m) & 5603 * drho_l_lv) & 5604 ) * surf_usm_h(l)%ddz_green_stag(kw,m) 5605 5606 ENDDO 5607 tend(nzt_wall) = ( - surf_usm_h(l)%gamma_w_green(nzt_wall,m) & 5608 - surf_usm_h(l)%lambda_w_green(nzt_wall-1,m) & 5609 * (swc_h(l)%val(nzt_wall,m) & 5610 - swc_h(l)%val(nzt_wall-1,m)) & 5611 * surf_usm_h(l)%ddz_green(nzt_wall,m) & 5612 + surf_usm_h(l)%gamma_w_green(nzt_wall-1,m) & 5613 - ( root_extr_green(nzt_wall) & 5614 * surf_usm_h(l)%qsws_veg(m) & 5615 * drho_l_lv ) & 5616 ) * surf_usm_h(l)%ddz_green_stag(nzt_wall,m) 5617 5618 swc_h_p(l)%val(nzb_wall:nzt_wall,m) = swc_h(l)%val(nzb_wall:nzt_wall,m) + dt_3d & 5619 * ( tsc(2) * tend(:) + tsc(3) & 5620 * surf_usm_h(l)%tswc_h_m(:,m) & 5621 ) 5622 5623 ! 5624 !-- Account for dry soils (find a better solution here!) 5625 DO kw = nzb_wall, nzt_wall 5626 IF ( swc_h_p(l)%val(kw,m) < 0.0_wp ) swc_h_p(l)%val(kw,m) = 0.0_wp 5627 ENDDO 5628 5629 ! 5630 !-- Calculate m_soil tendencies for the next Runge-Kutta step 5631 IF ( timestep_scheme(1:5) == 'runge' ) THEN 5632 IF ( intermediate_timestep_count == 1 ) THEN 5633 DO kw = nzb_wall, nzt_wall 5634 surf_usm_h(l)%tswc_h_m(kw,m) = tend(kw) 5635 ENDDO 5636 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 5637 DO kw = nzb_wall, nzt_wall 5638 surf_usm_h(l)%tswc_h_m(kw,m) = -9.5625_wp * tend(kw) + 5.3125_wp & 5639 * surf_usm_h(l)%tswc_h_m(kw,m) 5640 ENDDO 5641 ENDIF 5642 ENDIF 5876 5643 ENDIF 5877 ENDIF 5878 5644 5645 ENDIF 5646 ENDDO 5647 !$OMP END PARALLEL 5648 ELSE 5649 IF ( horizontal) THEN 5650 !-- For horizontal downward surfaces 5651 surf => surf_usm_h(l) 5652 t_wall => t_wall_h(l) 5653 t_green => t_green_h(l) 5654 ELSE 5655 !-- For vertical surfaces 5656 surf => surf_usm_v(l) 5657 t_wall => t_wall_v(l) 5658 t_green => t_green_v(l) 5879 5659 ENDIF 5880 5881 ENDDO 5882 !$OMP END PARALLEL 5883 5884 ! 5885 !-- For vertical surfaces 5886 DO l = 0, 3 5887 DO m = 1, surf_usm_v(l)%ns 5888 5889 IF (surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp) THEN 5660 !$OMP DO SCHEDULE (STATIC) 5661 DO m = 1, surf%ns 5662 IF (surf%frac(m,ind_pav_green) > 0.0_wp) THEN 5890 5663 ! 5891 5664 !-- No substrate layer for green walls / only groundbase green walls (ivy i.e.) -> Green layers get … … 5896 5669 ! ! 5897 5670 ! !-- Obtain indices 5898 ! i = surf _usm_v(l)%i(m)5899 ! j = surf _usm_v(l)%j(m)5900 ! k = surf _usm_v(l)%k(m)5901 ! 5902 ! t_green _v(l)%t(nzt_wall+1,m) = t_wall_v(l)%t(nzb_wall,m)5671 ! i = surf%i(m) 5672 ! j = surf%j(m) 5673 ! k = surf%k(m) 5674 ! 5675 ! t_green%val(nzt_wall+1,m) = t_wall%val(nzb_wall,m) 5903 5676 ! ! 5904 5677 ! !-- Prognostic equation for green temperature t_green_v 5905 5678 ! gtend(:) = 0.0_wp 5906 ! gtend(nzb_wall) = (1.0_wp / surf _usm_v(l)%rho_c_green(nzb_wall,m)) * &5907 ! ( surf _usm_v(l)%lambda_h_green(nzb_wall,m) * &5908 ! ( t_green _v(l)%t(nzb_wall+1,m) &5909 ! - t_green _v(l)%t(nzb_wall,m) ) * &5910 ! surf _usm_v(l)%ddz_green(nzb_wall+1,m) &5911 ! + surf _usm_v(l)%wghf_eb(m) ) * &5912 ! surf _usm_v(l)%ddz_green_stag(nzb_wall,m)5679 ! gtend(nzb_wall) = (1.0_wp / surf%rho_c_green(nzb_wall,m)) * & 5680 ! ( surf%lambda_h_green(nzb_wall,m) * & 5681 ! ( t_green%val(nzb_wall+1,m) & 5682 ! - t_green%val(nzb_wall,m) ) * & 5683 ! surf%ddz_green(nzb_wall+1,m) & 5684 ! + surf%wghf_eb(m) ) * & 5685 ! surf%ddz_green_stag(nzb_wall,m) 5913 5686 ! 5914 5687 ! DO kw = nzb_wall+1, nzt_wall 5915 ! gtend(kw) = (1.0_wp / surf _usm_v(l)%rho_c_green(kw,m)) &5916 ! * ( surf _usm_v(l)%lambda_h_green(kw,m) &5917 ! * ( t_green _v(l)%t(kw+1,m) - t_green_v(l)%t(kw,m) ) &5918 ! * surf _usm_v(l)%ddz_green(kw+1,m) &5919 ! - surf _usm_v(l)%lambda_h(kw-1,m) &5920 ! * ( t_green _v(l)%t(kw,m) - t_green_v(l)%t(kw-1,m) ) &5921 ! * surf _usm_v(l)%ddz_green(kw,m) ) &5922 ! * surf _usm_v(l)%ddz_green_stag(kw,m)5688 ! gtend(kw) = (1.0_wp / surf%rho_c_green(kw,m)) & 5689 ! * ( surf%lambda_h_green(kw,m) & 5690 ! * ( t_green%val(kw+1,m) - t_green%val(kw,m) ) & 5691 ! * surf%ddz_green(kw+1,m) & 5692 ! - surf%lambda_h(kw-1,m) & 5693 ! * ( t_green%val(kw,m) - t_green%val(kw-1,m) ) & 5694 ! * surf%ddz_green(kw,m) ) & 5695 ! * surf%ddz_green_stag(kw,m) 5923 5696 ! ENDDO 5924 5697 ! 5925 ! t_green_v_p(l)% t(nzb_wall:nzt_wall,m) = &5926 ! t_green _v(l)%t(nzb_wall:nzt_wall,m) &5698 ! t_green_v_p(l)%val(nzb_wall:nzt_wall,m) = & 5699 ! t_green%val(nzb_wall:nzt_wall,m) & 5927 5700 ! + dt_3d * ( tsc(2) & 5928 5701 ! * gtend(nzb_wall:nzt_wall) + tsc(3) & 5929 ! * surf _usm_v(l)%tt_green_m(nzb_wall:nzt_wall,m) )5702 ! * surf%tt_green_m(nzb_wall:nzt_wall,m) ) 5930 5703 ! 5931 5704 ! ! … … 5934 5707 ! IF ( intermediate_timestep_count == 1 ) THEN 5935 5708 ! DO kw = nzb_wall, nzt_wall 5936 ! surf _usm_v(l)%tt_green_m(kw,m) = gtend(kw)5709 ! surf%tt_green_m(kw,m) = gtend(kw) 5937 5710 ! ENDDO 5938 5711 ! ELSEIF ( intermediate_timestep_count < & 5939 5712 ! intermediate_timestep_count_max ) THEN 5940 5713 ! DO kw = nzb_wall, nzt_wall 5941 ! surf _usm_v(l)%tt_green_m(kw,m) = &5714 ! surf%tt_green_m(kw,m) = & 5942 5715 ! - 9.5625_wp * gtend(kw) + & 5943 ! 5.3125_wp * surf _usm_v(l)%tt_green_m(kw,m)5716 ! 5.3125_wp * surf%tt_green_m(kw,m) 5944 5717 ! ENDDO 5945 5718 ! ENDIF 5946 5719 ! ENDIF 5947 5948 5720 DO kw = nzb_wall, nzt_wall+1 5949 t_green _v(l)%t(kw,m) = t_wall_v(l)%t(nzb_wall,m)5721 t_green%val(kw,m) = t_wall%val(nzb_wall,m) 5950 5722 ENDDO 5951 5952 ENDIF 5953 5723 ENDIF 5954 5724 ENDDO 5955 ENDDO 5956 5957 IF ( debug_output_timestep ) CALL debug_message( 'usm_green_heat_model', 'end' ) 5725 ENDIF 5726 5727 IF ( debug_output_timestep ) THEN 5728 WRITE( debug_string, * ) 'usm_green_heat_model: ', horizontal, l 5729 CALL debug_message( debug_string, 'end' ) 5730 ENDIF 5958 5731 5959 5732 END SUBROUTINE usm_green_heat_model … … 5972 5745 NAMELIST /urban_surface_par/ & 5973 5746 building_type, & 5974 land_category, &5975 naheatlayers, &5976 pedestrian_category, &5977 read_wall_temp_3d, &5978 5747 roof_category, & 5979 5748 roof_inner_temperature, & … … 5981 5750 soil_inner_temperature, & 5982 5751 urban_surface, & 5983 usm_anthropogenic_heat, &5984 usm_material_model, &5985 5752 usm_wall_mod, & 5986 5753 wall_category, & … … 5991 5758 NAMELIST /urban_surface_parameters/ & 5992 5759 building_type, & 5993 land_category, &5994 naheatlayers, &5995 pedestrian_category, &5996 read_wall_temp_3d, &5997 5760 roof_category, & 5998 5761 roof_inner_temperature, & … … 6000 5763 soil_inner_temperature, & 6001 5764 urban_surface, & 6002 usm_anthropogenic_heat, &6003 usm_material_model, &6004 5765 usm_wall_mod, & 6005 5766 wall_category, & … … 6063 5824 6064 5825 END SUBROUTINE usm_parin 6065 6066 6067 !--------------------------------------------------------------------------------------------------!6068 ! Description:6069 ! ------------6070 !6071 !> This subroutine is part of the urban surface model.6072 !> It reads daily heat produced by anthropogenic source and the diurnal cycle of the heat.6073 !--------------------------------------------------------------------------------------------------!6074 SUBROUTINE usm_read_anthropogenic_heat6075 6076 INTEGER(iwp) :: i, ii, j, k !< running indices6077 6078 REAL(wp) :: heat !< anthropogenic heat6079 6080 !6081 !-- Allocation of array of sources of anthropogenic heat and their diural profile6082 ALLOCATE( aheat(naheatlayers,nys:nyn,nxl:nxr) )6083 ALLOCATE( aheatprof(naheatlayers,0:24) )6084 6085 !6086 !-- Read daily amount of heat and its daily cycle6087 aheat = 0.0_wp6088 DO ii = 0, io_blocks-16089 IF ( ii == io_group ) THEN6090 6091 !-- Open anthropogenic heat file6092 OPEN( 151, file = 'ANTHROPOGENIC_HEAT' // TRIM( coupling_char ), action = 'read', &6093 status = 'old', form = 'formatted', err = 11 )6094 i = 06095 j = 06096 DO6097 READ( 151, *, ERR=12, END=13 ) i, j, k, heat6098 IF ( i >= nxl .AND. i <= nxr .AND. j >= nys .AND. j <= nyn ) THEN6099 IF ( k <= naheatlayers .AND. k > topo_top_ind(j,i,0) ) THEN6100 !-- Write heat into the array6101 aheat(k,j,i) = heat6102 ENDIF6103 ENDIF6104 CYCLE6105 12 WRITE( message_string, '(a,2i4)' ) 'error in file ANTHROPOGENIC_HEAT' &6106 // TRIM( coupling_char ) // ' after line ', i, j6107 CALL message( 'usm_read_anthropogenic_heat', 'PA0515', 0, 1, 0, 6, 0 )6108 ENDDO6109 13 CLOSE( 151 )6110 CYCLE6111 11 message_string = 'file ANTHROPOGENIC_HEAT' // TRIM( coupling_char ) // ' does not exist'6112 CALL message( 'usm_read_anthropogenic_heat', 'PA0516', 1, 2, 0, 6, 0 )6113 ENDIF6114 6115 #if defined( __parallel )6116 CALL MPI_BARRIER( comm2d, ierr )6117 #endif6118 ENDDO6119 6120 !6121 !-- Read diurnal profiles of heat sources6122 aheatprof = 0.0_wp6123 DO ii = 0, io_blocks-16124 IF ( ii == io_group ) THEN6125 !6126 !-- Open anthropogenic heat profile file6127 OPEN( 151, file = 'ANTHROPOGENIC_HEAT_PROFILE' // TRIM( coupling_char ), &6128 action = 'read', status = 'old', form = 'formatted', err = 21 )6129 i = 06130 DO6131 READ( 151, *, err = 22, end = 23 ) i, k, heat6132 !6133 !-- Write heat into the array6134 IF ( i >= 0 .AND. i <= 24 .AND. k <= naheatlayers ) THEN6135 aheatprof(k,i) = heat6136 ENDIF6137 CYCLE6138 22 WRITE( message_string, '(a,i4)' ) 'error in file ANTHROPOGENIC_HEAT_PROFILE' // &6139 TRIM( coupling_char ) // ' after line ', i6140 CALL message( 'usm_read_anthropogenic_heat', 'PA0517', 0, 1, 0, 6, 0 )6141 ENDDO6142 aheatprof(:,24) = aheatprof(:,0)6143 23 CLOSE( 151 )6144 CYCLE6145 21 message_string = 'file ANTHROPOGENIC_HEAT_PROFILE'//TRIM(coupling_char)//' does not exist'6146 CALL message( 'usm_read_anthropogenic_heat', 'PA0518', 1, 2, 0, 6, 0 )6147 ENDIF6148 6149 #if defined( __parallel )6150 CALL MPI_BARRIER( comm2d, ierr )6151 #endif6152 ENDDO6153 6154 END SUBROUTINE usm_read_anthropogenic_heat6155 5826 6156 5827 … … 6173 5844 INTEGER(iwp) :: k !< running index over previous input files covering current local domain 6174 5845 INTEGER(iwp) :: l !< index variable for surface type 6175 INTEGER(iwp) :: ns_h_on_file_usm !< number of horizontal surface elements (urban type) on file6176 5846 INTEGER(iwp) :: nxlc !< index of left boundary on current subdomain 6177 5847 INTEGER(iwp) :: nxlf !< index of left boundary on former subdomain … … 6184 5854 INTEGER(iwp) :: nysf !< index of south boundary on former subdomain 6185 5855 INTEGER(iwp) :: nys_on_file !< index of south boundary on former local domain 5856 INTEGER(iwp) :: ns_h_on_file_usm(0:1) !< number of horizontal surface elements (urban type) on file 6186 5857 INTEGER(iwp) :: ns_v_on_file_usm(0:3) !< number of vertical surface elements (urban type) on file 6187 5858 ! … … 6194 5865 6195 5866 ! MS: Why are there individual temporary arrays that all have the same size? 6196 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tmp_surf_green_h !<6197 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tmp_surf_mliq_h !<6198 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tmp_surf_wall_h !<6199 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tmp_surf_waste_h !<6200 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tmp_surf_window_h !<6201 6202 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: tmp_green_h !<6203 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: tmp_wall_h !<6204 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: tmp_window_h !<6205 6206 TYPE( t_surf_vertical), DIMENSION(0:3), SAVE :: tmp_surf_green_v !<6207 TYPE( t_surf_vertical), DIMENSION(0:3), SAVE :: tmp_surf_wall_v !<6208 TYPE( t_surf_vertical), DIMENSION(0:3), SAVE :: tmp_surf_waste_v !<6209 TYPE( t_surf_vertical), DIMENSION(0:3), SAVE :: tmp_surf_window_v !<6210 6211 TYPE( t_wall_vertical), DIMENSION(0:3), SAVE :: tmp_green_v !<6212 TYPE( t_wall_vertical), DIMENSION(0:3), SAVE :: tmp_wall_v !<6213 TYPE( t_wall_vertical), DIMENSION(0:3), SAVE :: tmp_window_v !<5867 TYPE( surf_type_1d_usm ), DIMENSION(0:1), SAVE :: tmp_surf_green_h !< 5868 TYPE( surf_type_1d_usm ), DIMENSION(0:1), SAVE :: tmp_surf_mliq_h !< 5869 TYPE( surf_type_1d_usm ), DIMENSION(0:1), SAVE :: tmp_surf_wall_h !< 5870 TYPE( surf_type_1d_usm ), DIMENSION(0:1), SAVE :: tmp_surf_waste_h !< 5871 TYPE( surf_type_1d_usm ), DIMENSION(0:1), SAVE :: tmp_surf_window_h !< 5872 5873 TYPE( surf_type_2d_usm ), DIMENSION(0:1), SAVE :: tmp_green_h !< 5874 TYPE( surf_type_2d_usm ), DIMENSION(0:1), SAVE :: tmp_wall_h !< 5875 TYPE( surf_type_2d_usm ), DIMENSION(0:1), SAVE :: tmp_window_h !< 5876 5877 TYPE( surf_type_1d_usm ), DIMENSION(0:3), SAVE :: tmp_surf_green_v !< 5878 TYPE( surf_type_1d_usm ), DIMENSION(0:3), SAVE :: tmp_surf_wall_v !< 5879 TYPE( surf_type_1d_usm ), DIMENSION(0:3), SAVE :: tmp_surf_waste_v !< 5880 TYPE( surf_type_1d_usm ), DIMENSION(0:3), SAVE :: tmp_surf_window_v !< 5881 5882 TYPE( surf_type_2d_usm ), DIMENSION(0:3), SAVE :: tmp_green_v !< 5883 TYPE( surf_type_2d_usm ), DIMENSION(0:3), SAVE :: tmp_wall_v !< 5884 TYPE( surf_type_2d_usm ), DIMENSION(0:3), SAVE :: tmp_window_v !< 6214 5885 6215 5886 … … 6223 5894 READ ( 13 ) ns_h_on_file_usm 6224 5895 6225 IF ( ALLOCATED( tmp_surf_wall_h ) ) DEALLOCATE( tmp_surf_wall_h ) 6226 IF ( ALLOCATED( tmp_wall_h ) ) DEALLOCATE( tmp_wall_h ) 6227 IF ( ALLOCATED( tmp_surf_window_h ) ) DEALLOCATE( tmp_surf_window_h ) 6228 IF ( ALLOCATED( tmp_window_h) ) DEALLOCATE( tmp_window_h ) 6229 IF ( ALLOCATED( tmp_surf_green_h) ) DEALLOCATE( tmp_surf_green_h ) 6230 IF ( ALLOCATED( tmp_green_h) ) DEALLOCATE( tmp_green_h ) 6231 IF ( ALLOCATED( tmp_surf_mliq_h) ) DEALLOCATE( tmp_surf_mliq_h ) 6232 IF ( ALLOCATED( tmp_surf_waste_h) ) DEALLOCATE( tmp_surf_waste_h ) 5896 DO l = 0, 1 5897 IF ( ALLOCATED( tmp_surf_wall_h(l)%val ) ) DEALLOCATE( tmp_surf_wall_h(l)%val ) 5898 IF ( ALLOCATED( tmp_wall_h(l)%val ) ) DEALLOCATE( tmp_wall_h(l)%val ) 5899 IF ( ALLOCATED( tmp_surf_window_h(l)%val ) ) DEALLOCATE( tmp_surf_window_h(l)%val ) 5900 IF ( ALLOCATED( tmp_window_h(l)%val) ) DEALLOCATE( tmp_window_h(l)%val ) 5901 IF ( ALLOCATED( tmp_surf_green_h(l)%val) ) DEALLOCATE( tmp_surf_green_h(l)%val ) 5902 IF ( ALLOCATED( tmp_green_h(l)%val) ) DEALLOCATE( tmp_green_h(l)%val ) 5903 IF ( ALLOCATED( tmp_surf_mliq_h(l)%val) ) DEALLOCATE( tmp_surf_mliq_h(l)%val ) 5904 IF ( ALLOCATED( tmp_surf_waste_h(l)%val) ) DEALLOCATE( tmp_surf_waste_h(l)%val ) 5905 ENDDO 6233 5906 6234 5907 ! … … 6236 5909 !-- elements do not necessarily need to match the size of present surface elements on 6237 5910 !-- current processor, as the number of processors between restarts can change. 6238 ALLOCATE( tmp_surf_wall_h(1:ns_h_on_file_usm) ) 6239 ALLOCATE( tmp_wall_h(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm) ) 6240 ALLOCATE( tmp_surf_window_h(1:ns_h_on_file_usm) ) 6241 ALLOCATE( tmp_window_h(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm) ) 6242 ALLOCATE( tmp_surf_green_h(1:ns_h_on_file_usm) ) 6243 ALLOCATE( tmp_green_h(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm) ) 6244 ALLOCATE( tmp_surf_mliq_h(1:ns_h_on_file_usm) ) 6245 ALLOCATE( tmp_surf_waste_h(1:ns_h_on_file_usm) ) 5911 DO l = 0, 1 5912 ALLOCATE( tmp_surf_wall_h(l)%val(1:ns_h_on_file_usm(l)) ) 5913 ALLOCATE( tmp_wall_h(l)%val(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm(l) ) ) 5914 ALLOCATE( tmp_surf_window_h(l)%val(1:ns_h_on_file_usm(l)) ) 5915 ALLOCATE( tmp_window_h(l)%val(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm(l) ) ) 5916 ALLOCATE( tmp_surf_green_h(l)%val(1:ns_h_on_file_usm(l)) ) 5917 ALLOCATE( tmp_green_h(l)%val(nzb_wall:nzt_wall+1, 1:ns_h_on_file_usm(l) ) ) 5918 ALLOCATE( tmp_surf_mliq_h(l)%val(1:ns_h_on_file_usm(l)) ) 5919 ALLOCATE( tmp_surf_waste_h(l)%val(1:ns_h_on_file_usm(l)) ) 5920 ENDDO 6246 5921 6247 5922 ENDIF … … 6252 5927 6253 5928 DO l = 0, 3 6254 IF ( ALLOCATED( tmp_surf_wall_v(l)% t ) ) DEALLOCATE( tmp_surf_wall_v(l)%t)6255 IF ( ALLOCATED( tmp_wall_v(l)% t ) ) DEALLOCATE( tmp_wall_v(l)%t)6256 IF ( ALLOCATED( tmp_surf_window_v(l)% t ) ) DEALLOCATE( tmp_surf_window_v(l)%t)6257 IF ( ALLOCATED( tmp_window_v(l)% t ) ) DEALLOCATE( tmp_window_v(l)%t)6258 IF ( ALLOCATED( tmp_surf_green_v(l)% t ) ) DEALLOCATE( tmp_surf_green_v(l)%t)6259 IF ( ALLOCATED( tmp_green_v(l)% t ) ) DEALLOCATE( tmp_green_v(l)%t)6260 IF ( ALLOCATED( tmp_surf_waste_v(l)% t ) ) DEALLOCATE( tmp_surf_waste_v(l)%t)5929 IF ( ALLOCATED( tmp_surf_wall_v(l)%val ) ) DEALLOCATE( tmp_surf_wall_v(l)%val ) 5930 IF ( ALLOCATED( tmp_wall_v(l)%val ) ) DEALLOCATE( tmp_wall_v(l)%val ) 5931 IF ( ALLOCATED( tmp_surf_window_v(l)%val ) ) DEALLOCATE( tmp_surf_window_v(l)%val ) 5932 IF ( ALLOCATED( tmp_window_v(l)%val ) ) DEALLOCATE( tmp_window_v(l)%val ) 5933 IF ( ALLOCATED( tmp_surf_green_v(l)%val ) ) DEALLOCATE( tmp_surf_green_v(l)%val ) 5934 IF ( ALLOCATED( tmp_green_v(l)%val ) ) DEALLOCATE( tmp_green_v(l)%val ) 5935 IF ( ALLOCATED( tmp_surf_waste_v(l)%val ) ) DEALLOCATE( tmp_surf_waste_v(l)%val ) 6261 5936 ENDDO 6262 5937 … … 6266 5941 !-- current processor, as the number of processors between restarts can change. 6267 5942 DO l = 0, 3 6268 ALLOCATE( tmp_surf_wall_v(l)% t(1:ns_v_on_file_usm(l)) )6269 ALLOCATE( tmp_wall_v(l)% t(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) )6270 ALLOCATE( tmp_surf_window_v(l)% t(1:ns_v_on_file_usm(l)) )6271 ALLOCATE( tmp_window_v(l)% t(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) )6272 ALLOCATE( tmp_surf_green_v(l)% t(1:ns_v_on_file_usm(l)) )6273 ALLOCATE( tmp_green_v(l)% t(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) )6274 ALLOCATE( tmp_surf_waste_v(l)% t(1:ns_v_on_file_usm(l)) )5943 ALLOCATE( tmp_surf_wall_v(l)%val(1:ns_v_on_file_usm(l)) ) 5944 ALLOCATE( tmp_wall_v(l)%val(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) ) 5945 ALLOCATE( tmp_surf_window_v(l)%val(1:ns_v_on_file_usm(l)) ) 5946 ALLOCATE( tmp_window_v(l)%val(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) ) 5947 ALLOCATE( tmp_surf_green_v(l)%val(1:ns_v_on_file_usm(l)) ) 5948 ALLOCATE( tmp_green_v(l)%val(nzb_wall:nzt_wall+1, 1:ns_v_on_file_usm(l) ) ) 5949 ALLOCATE( tmp_surf_waste_v(l)%val(1:ns_v_on_file_usm(l)) ) 6275 5950 ENDDO 6276 5951 … … 6299 5974 ENDIF 6300 5975 6301 CASE ( 't_surf_wall_h ' )5976 CASE ( 't_surf_wall_h(0)' ) 6302 5977 IF ( k == 1 ) THEN 6303 IF ( .NOT. ALLOCATED( t_surf_wall_h_1 ) ) ALLOCATE( t_surf_wall_h_1(1:surf_usm_h%ns) ) 6304 READ ( 13 ) tmp_surf_wall_h 6305 ENDIF 6306 CALL surface_restore_elements( t_surf_wall_h_1, tmp_surf_wall_h, surf_usm_h%start_index, & 6307 start_index_on_file, end_index_on_file, nxlc, nysc, & 6308 nxlf, nxrf, nysf, nynf, nys_on_file, nyn_on_file, & 6309 nxl_on_file, nxr_on_file ) 5978 IF ( .NOT. ALLOCATED( t_surf_wall_h_1(0)%val ) ) & 5979 ALLOCATE( t_surf_wall_h_1(0)%val(1:surf_usm_h(0)%ns) ) 5980 READ ( 13 ) tmp_surf_wall_h(0)%val 5981 ENDIF 5982 CALL surface_restore_elements( t_surf_wall_h_1(0)%val, tmp_surf_wall_h(0)%val, & 5983 surf_usm_h(0)%start_index, start_index_on_file, & 5984 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 5985 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 5986 5987 CASE ( 't_surf_wall_h(1)' ) 5988 IF ( k == 1 ) THEN 5989 IF ( .NOT. ALLOCATED( t_surf_wall_h_1(1)%val ) ) & 5990 ALLOCATE( t_surf_wall_h_1(1)%val(1:surf_usm_h(1)%ns) ) 5991 READ ( 13 ) tmp_surf_wall_h(1)%val 5992 ENDIF 5993 CALL surface_restore_elements( t_surf_wall_h_1(1)%val, tmp_surf_wall_h(1)%val, & 5994 surf_usm_h(1)%start_index, start_index_on_file, & 5995 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 5996 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6310 5997 6311 5998 CASE ( 't_surf_wall_v(0)' ) 6312 5999 IF ( k == 1 ) THEN 6313 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(0)%t ) ) & 6314 ALLOCATE( t_surf_wall_v_1(0)%t(1:surf_usm_v(0)%ns) ) 6315 READ ( 13 ) tmp_surf_wall_v(0)%t 6316 ENDIF 6317 CALL surface_restore_elements( t_surf_wall_v_1(0)%t, tmp_surf_wall_v(0)%t, & 6000 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(0)%val ) ) & 6001 ALLOCATE( t_surf_wall_v_1(0)%val(1:surf_usm_v(0)%ns) ) 6002 READ ( 13 ) tmp_surf_wall_v(0)%val 6003 ENDIF 6004 CALL surface_restore_elements( t_surf_wall_v_1(0)%val, tmp_surf_wall_v(0)%val, & 6005 surf_usm_v(0)%start_index, start_index_on_file, & 6006 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6007 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6008 6009 CASE ( 't_surf_wall_v(1)' ) 6010 IF ( k == 1 ) THEN 6011 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(1)%val ) ) & 6012 ALLOCATE( t_surf_wall_v_1(1)%val(1:surf_usm_v(1)%ns) ) 6013 READ ( 13 ) tmp_surf_wall_v(1)%val 6014 ENDIF 6015 CALL surface_restore_elements( t_surf_wall_v_1(1)%val, tmp_surf_wall_v(1)%val, & 6016 surf_usm_v(1)%start_index, start_index_on_file, & 6017 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6018 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6019 6020 CASE ( 't_surf_wall_v(2)' ) 6021 IF ( k == 1 ) THEN 6022 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(2)%val ) ) & 6023 ALLOCATE( t_surf_wall_v_1(2)%val(1:surf_usm_v(2)%ns) ) 6024 READ ( 13 ) tmp_surf_wall_v(2)%val 6025 ENDIF 6026 CALL surface_restore_elements( t_surf_wall_v_1(2)%val, tmp_surf_wall_v(2)%val, & 6027 surf_usm_v(2)%start_index, start_index_on_file, & 6028 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6029 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6030 6031 CASE ( 't_surf_wall_v(3)' ) 6032 IF ( k == 1 ) THEN 6033 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(3)%val ) ) & 6034 ALLOCATE( t_surf_wall_v_1(3)%val(1:surf_usm_v(3)%ns) ) 6035 READ ( 13 ) tmp_surf_wall_v(3)%val 6036 ENDIF 6037 CALL surface_restore_elements( t_surf_wall_v_1(3)%val, tmp_surf_wall_v(3)%val, & 6038 surf_usm_v(3)%start_index, start_index_on_file, & 6039 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6040 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6041 6042 CASE ( 't_surf_window_h(0)' ) 6043 IF ( k == 1 ) THEN 6044 IF ( .NOT. ALLOCATED( t_surf_window_h_1(0)%val ) ) & 6045 ALLOCATE( t_surf_window_h_1(0)%val(1:surf_usm_h(0)%ns) ) 6046 READ ( 13 ) tmp_surf_window_h(0)%val 6047 ENDIF 6048 CALL surface_restore_elements( t_surf_window_h_1(0)%val, tmp_surf_window_h(0)%val, & 6049 surf_usm_h(0)%start_index, start_index_on_file, & 6050 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6051 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6052 6053 CASE ( 't_surf_window_h(1)' ) 6054 IF ( k == 1 ) THEN 6055 IF ( .NOT. ALLOCATED( t_surf_window_h_1(1)%val ) ) & 6056 ALLOCATE( t_surf_window_h_1(1)%val(1:surf_usm_h(1)%ns) ) 6057 READ ( 13 ) tmp_surf_window_h(1)%val 6058 ENDIF 6059 CALL surface_restore_elements( t_surf_window_h_1(1)%val, tmp_surf_window_h(1)%val, & 6060 surf_usm_h(1)%start_index, start_index_on_file, & 6061 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6062 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6063 6064 CASE ( 't_surf_window_v(0)' ) 6065 IF ( k == 1 ) THEN 6066 IF ( .NOT. ALLOCATED( t_surf_window_v_1(0)%val ) ) & 6067 ALLOCATE( t_surf_window_v_1(0)%val(1:surf_usm_v(0)%ns) ) 6068 READ ( 13 ) tmp_surf_window_v(0)%val 6069 ENDIF 6070 CALL surface_restore_elements( t_surf_window_v_1(0)%val, tmp_surf_window_v(0)%val, & 6318 6071 surf_usm_v(0)%start_index, start_index_on_file, & 6319 6072 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6320 6073 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6321 6074 6322 CASE ( 't_surf_w all_v(1)' )6075 CASE ( 't_surf_window_v(1)' ) 6323 6076 IF ( k == 1 ) THEN 6324 IF ( .NOT. ALLOCATED( t_surf_w all_v_1(1)%t ) )&6325 ALLOCATE( t_surf_w all_v_1(1)%t(1:surf_usm_v(1)%ns) )6326 READ ( 13 ) tmp_surf_w all_v(1)%t6327 ENDIF 6328 CALL surface_restore_elements( t_surf_w all_v_1(1)%t, tmp_surf_wall_v(1)%t,&6077 IF ( .NOT. ALLOCATED( t_surf_window_v_1(1)%val ) ) & 6078 ALLOCATE( t_surf_window_v_1(1)%val(1:surf_usm_v(1)%ns) ) 6079 READ ( 13 ) tmp_surf_window_v(1)%val 6080 ENDIF 6081 CALL surface_restore_elements( t_surf_window_v_1(1)%val, tmp_surf_window_v(1)%val, & 6329 6082 surf_usm_v(1)%start_index, start_index_on_file, & 6330 6083 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6331 6084 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6332 6085 6333 CASE ( 't_surf_w all_v(2)' )6086 CASE ( 't_surf_window_v(2)' ) 6334 6087 IF ( k == 1 ) THEN 6335 IF ( .NOT. ALLOCATED( t_surf_w all_v_1(2)%t ) )&6336 ALLOCATE( t_surf_w all_v_1(2)%t(1:surf_usm_v(2)%ns) )6337 READ ( 13 ) tmp_surf_w all_v(2)%t6338 ENDIF 6339 CALL surface_restore_elements( t_surf_w all_v_1(2)%t, tmp_surf_wall_v(2)%t,&6088 IF ( .NOT. ALLOCATED( t_surf_window_v_1(2)%val ) ) & 6089 ALLOCATE( t_surf_window_v_1(2)%val(1:surf_usm_v(2)%ns) ) 6090 READ ( 13 ) tmp_surf_window_v(2)%val 6091 ENDIF 6092 CALL surface_restore_elements( t_surf_window_v_1(2)%val, tmp_surf_window_v(2)%val, & 6340 6093 surf_usm_v(2)%start_index, start_index_on_file, & 6341 6094 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6342 6095 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6343 6096 6344 CASE ( 't_surf_w all_v(3)' )6097 CASE ( 't_surf_window_v(3)' ) 6345 6098 IF ( k == 1 ) THEN 6346 IF ( .NOT. ALLOCATED( t_surf_w all_v_1(3)%t ) )&6347 ALLOCATE( t_surf_w all_v_1(3)%t(1:surf_usm_v(3)%ns) )6348 READ ( 13 ) tmp_surf_w all_v(3)%t6349 ENDIF 6350 CALL surface_restore_elements( t_surf_w all_v_1(3)%t, tmp_surf_wall_v(3)%t,&6099 IF ( .NOT. ALLOCATED( t_surf_window_v_1(3)%val ) ) & 6100 ALLOCATE( t_surf_window_v_1(3)%val(1:surf_usm_v(3)%ns) ) 6101 READ ( 13 ) tmp_surf_window_v(3)%val 6102 ENDIF 6103 CALL surface_restore_elements( t_surf_window_v_1(3)%val, tmp_surf_window_v(3)%val, & 6351 6104 surf_usm_v(3)%start_index, start_index_on_file, & 6352 6105 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6353 6106 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6354 6107 6355 CASE ( 't_surf_green_h ' )6108 CASE ( 't_surf_green_h(0)' ) 6356 6109 IF ( k == 1 ) THEN 6357 IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) )&6358 ALLOCATE( t_surf_green_h_1( 1:surf_usm_h%ns) )6359 READ ( 13 ) tmp_surf_green_h 6360 ENDIF 6361 CALL surface_restore_elements( t_surf_green_h_1 , tmp_surf_green_h,&6362 surf_usm_h %start_index, start_index_on_file,&6110 IF ( .NOT. ALLOCATED( t_surf_green_h_1(0)%val ) ) & 6111 ALLOCATE( t_surf_green_h_1(0)%val(1:surf_usm_h(0)%ns) ) 6112 READ ( 13 ) tmp_surf_green_h(0)%val 6113 ENDIF 6114 CALL surface_restore_elements( t_surf_green_h_1(0)%val, tmp_surf_green_h(0)%val, & 6115 surf_usm_h(0)%start_index, start_index_on_file, & 6363 6116 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6364 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6117 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6118 6119 CASE ( 't_surf_green_h(1)' ) 6120 IF ( k == 1 ) THEN 6121 IF ( .NOT. ALLOCATED( t_surf_green_h_1(1)%val ) ) & 6122 ALLOCATE( t_surf_green_h_1(1)%val(1:surf_usm_h(1)%ns) ) 6123 READ ( 13 ) tmp_surf_green_h(1)%val 6124 ENDIF 6125 CALL surface_restore_elements( t_surf_green_h_1(1)%val, tmp_surf_green_h(1)%val, & 6126 surf_usm_h(1)%start_index, start_index_on_file, & 6127 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6128 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6365 6129 6366 6130 CASE ( 't_surf_green_v(0)' ) 6367 6131 IF ( k == 1 ) THEN 6368 IF ( .NOT. ALLOCATED( t_surf_green_v_1(0)% t) ) &6369 ALLOCATE( t_surf_green_v_1(0)% t(1:surf_usm_v(0)%ns) )6370 READ ( 13 ) tmp_surf_green_v(0)% t6371 ENDIF 6372 CALL surface_restore_elements( t_surf_green_v_1(0)% t, tmp_surf_green_v(0)%t, &6132 IF ( .NOT. ALLOCATED( t_surf_green_v_1(0)%val ) ) & 6133 ALLOCATE( t_surf_green_v_1(0)%val(1:surf_usm_v(0)%ns) ) 6134 READ ( 13 ) tmp_surf_green_v(0)%val 6135 ENDIF 6136 CALL surface_restore_elements( t_surf_green_v_1(0)%val, tmp_surf_green_v(0)%val, & 6373 6137 surf_usm_v(0)%start_index, start_index_on_file, & 6374 6138 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6375 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file )6139 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6376 6140 6377 6141 CASE ( 't_surf_green_v(1)' ) 6378 6142 IF ( k == 1 ) THEN 6379 IF ( .NOT. ALLOCATED( t_surf_green_v_1(1)% t) ) &6380 ALLOCATE( t_surf_green_v_1(1)% t(1:surf_usm_v(1)%ns) )6381 READ ( 13 ) tmp_surf_green_v(1)% t6382 ENDIF 6383 CALL surface_restore_elements( t_surf_green_v_1(1)% t, tmp_surf_green_v(1)%t, &6143 IF ( .NOT. ALLOCATED( t_surf_green_v_1(1)%val ) ) & 6144 ALLOCATE( t_surf_green_v_1(1)%val(1:surf_usm_v(1)%ns) ) 6145 READ ( 13 ) tmp_surf_green_v(1)%val 6146 ENDIF 6147 CALL surface_restore_elements( t_surf_green_v_1(1)%val, tmp_surf_green_v(1)%val, & 6384 6148 surf_usm_v(1)%start_index, start_index_on_file, & 6385 6149 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6388 6152 CASE ( 't_surf_green_v(2)' ) 6389 6153 IF ( k == 1 ) THEN 6390 IF ( .NOT. ALLOCATED( t_surf_green_v_1(2)% t) ) &6391 ALLOCATE( t_surf_green_v_1(2)% t(1:surf_usm_v(2)%ns) )6392 READ ( 13 ) tmp_surf_green_v(2)% t6393 ENDIF 6394 CALL surface_restore_elements( t_surf_green_v_1(2)% t, tmp_surf_green_v(2)%t, &6154 IF ( .NOT. ALLOCATED( t_surf_green_v_1(2)%val ) ) & 6155 ALLOCATE( t_surf_green_v_1(2)%val(1:surf_usm_v(2)%ns) ) 6156 READ ( 13 ) tmp_surf_green_v(2)%val 6157 ENDIF 6158 CALL surface_restore_elements( t_surf_green_v_1(2)%val, tmp_surf_green_v(2)%val, & 6395 6159 surf_usm_v(2)%start_index, start_index_on_file, & 6396 6160 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6399 6163 CASE ( 't_surf_green_v(3)' ) 6400 6164 IF ( k == 1 ) THEN 6401 IF ( .NOT. ALLOCATED( t_surf_green_v_1(3)% t) ) &6402 ALLOCATE( t_surf_green_v_1(3)% t(1:surf_usm_v(3)%ns) )6403 READ ( 13 ) tmp_surf_green_v(3)% t6404 ENDIF 6405 CALL surface_restore_elements( t_surf_green_v_1(3)% t, tmp_surf_green_v(3)%t, &6165 IF ( .NOT. ALLOCATED( t_surf_green_v_1(3)%val ) ) & 6166 ALLOCATE( t_surf_green_v_1(3)%val(1:surf_usm_v(3)%ns) ) 6167 READ ( 13 ) tmp_surf_green_v(3)%val 6168 ENDIF 6169 CALL surface_restore_elements( t_surf_green_v_1(3)%val, tmp_surf_green_v(3)%val, & 6406 6170 surf_usm_v(3)%start_index, start_index_on_file, & 6407 6171 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6408 6172 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6409 6173 6410 CASE ( ' t_surf_window_h' )6174 CASE ( 'm_liq_usm_h(0)' ) 6411 6175 IF ( k == 1 ) THEN 6412 IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) )&6413 ALLOCATE( t_surf_window_h_1(1:surf_usm_h%ns) )6414 READ ( 13 ) tmp_surf_ window_h6415 ENDIF 6416 CALL surface_restore_elements( t_surf_window_h_1, tmp_surf_window_h,&6417 surf_usm_h %start_index, start_index_on_file,&6176 IF ( .NOT. ALLOCATED( m_liq_usm_h(0)%val ) ) & 6177 ALLOCATE( m_liq_usm_h(0)%val(1:surf_usm_h(0)%ns) ) 6178 READ ( 13 ) tmp_surf_mliq_h(0)%val 6179 ENDIF 6180 CALL surface_restore_elements( m_liq_usm_h(0)%val, tmp_surf_mliq_h(0)%val, & 6181 surf_usm_h(0)%start_index, start_index_on_file, & 6418 6182 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6419 6183 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6420 6184 6421 CASE ( ' t_surf_window_v(0)' )6185 CASE ( 'm_liq_usm_h(1)' ) 6422 6186 IF ( k == 1 ) THEN 6423 IF ( .NOT. ALLOCATED( t_surf_window_v_1(0)%t ) )&6424 ALLOCATE( t_surf_window_v_1(0)%t(1:surf_usm_v(0)%ns) )6425 READ ( 13 ) tmp_surf_ window_v(0)%t6426 ENDIF 6427 CALL surface_restore_elements( t_surf_window_v_1(0)%t, tmp_surf_window_v(0)%t,&6428 surf_usm_ v(0)%start_index, start_index_on_file, &6187 IF ( .NOT. ALLOCATED( m_liq_usm_h(1)%val ) ) & 6188 ALLOCATE( m_liq_usm_h(1)%val(1:surf_usm_h(1)%ns) ) 6189 READ ( 13 ) tmp_surf_mliq_h(1)%val 6190 ENDIF 6191 CALL surface_restore_elements( m_liq_usm_h(1)%val, tmp_surf_mliq_h(1)%val, & 6192 surf_usm_h(1)%start_index, start_index_on_file, & 6429 6193 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6430 6194 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6431 6195 6432 CASE ( ' t_surf_window_v(1)' )6196 CASE ( 'waste_heat_h(0)' ) 6433 6197 IF ( k == 1 ) THEN 6434 IF ( .NOT. ALLOCATED( t_surf_window_v_1(1)%t ) )&6435 ALLOCATE( t_surf_window_v_1(1)%t(1:surf_usm_v(1)%ns) )6436 READ ( 13 ) tmp_surf_w indow_v(1)%t6437 ENDIF 6438 CALL surface_restore_elements( t_surf_window_v_1(1)%t, tmp_surf_window_v(1)%t,&6439 surf_usm_ v(1)%start_index, start_index_on_file, &6198 IF ( .NOT. ALLOCATED( surf_usm_h(0)%waste_heat ) ) & 6199 ALLOCATE( surf_usm_h(0)%waste_heat(1:surf_usm_h(0)%ns) ) 6200 READ ( 13 ) tmp_surf_waste_h(0)%val 6201 ENDIF 6202 CALL surface_restore_elements( surf_usm_h(0)%waste_heat, tmp_surf_waste_h(0)%val, & 6203 surf_usm_h(0)%start_index, start_index_on_file, & 6440 6204 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6441 6205 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6442 6206 6443 CASE ( ' t_surf_window_v(2)' )6207 CASE ( 'waste_heat_h(1)' ) 6444 6208 IF ( k == 1 ) THEN 6445 IF ( .NOT. ALLOCATED( t_surf_window_v_1(2)%t ) )&6446 ALLOCATE( t_surf_window_v_1(2)%t(1:surf_usm_v(2)%ns) )6447 READ ( 13 ) tmp_surf_w indow_v(2)%t6448 ENDIF 6449 CALL surface_restore_elements( t_surf_window_v_1(2)%t, tmp_surf_window_v(2)%t,&6450 surf_usm_ v(2)%start_index, start_index_on_file, &6209 IF ( .NOT. ALLOCATED( surf_usm_h(1)%waste_heat ) ) & 6210 ALLOCATE( surf_usm_h(1)%waste_heat(1:surf_usm_h(1)%ns) ) 6211 READ ( 13 ) tmp_surf_waste_h(1)%val 6212 ENDIF 6213 CALL surface_restore_elements( surf_usm_h(1)%waste_heat, tmp_surf_waste_h(1)%val, & 6214 surf_usm_h(1)%start_index, start_index_on_file, & 6451 6215 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6452 6216 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6453 6217 6454 CASE ( 't_surf_window_v(3)' )6455 IF ( k == 1 ) THEN6456 IF ( .NOT. ALLOCATED( t_surf_window_v_1(3)%t ) ) &6457 ALLOCATE( t_surf_window_v_1(3)%t(1:surf_usm_v(3)%ns) )6458 READ ( 13 ) tmp_surf_window_v(3)%t6459 ENDIF6460 CALL surface_restore_elements( t_surf_window_v_1(3)%t, tmp_surf_window_v(3)%t, &6461 surf_usm_v(3)%start_index, start_index_on_file, &6462 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, &6463 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file )6464 6465 CASE ( 'm_liq_usm_h' )6466 IF ( k == 1 ) THEN6467 IF ( .NOT. ALLOCATED( m_liq_usm_h%var_usm_1d ) ) &6468 ALLOCATE( m_liq_usm_h%var_usm_1d(1:surf_usm_h%ns) )6469 READ ( 13 ) tmp_surf_mliq_h6470 ENDIF6471 CALL surface_restore_elements( m_liq_usm_h%var_usm_1d, tmp_surf_mliq_h, &6472 surf_usm_h%start_index, start_index_on_file, &6473 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, &6474 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file )6475 6476 CASE ( 'waste_heat_h' )6477 IF ( k == 1 ) THEN6478 IF ( .NOT. ALLOCATED( surf_usm_h%waste_heat ) ) &6479 ALLOCATE( surf_usm_h%waste_heat(1:surf_usm_h%ns) )6480 READ ( 13 ) tmp_surf_waste_h6481 ENDIF6482 CALL surface_restore_elements( surf_usm_h%waste_heat, tmp_surf_waste_h, &6483 surf_usm_h%start_index, start_index_on_file, &6484 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, &6485 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file )6486 6218 6487 6219 CASE ( 'waste_heat_v(0)' ) … … 6489 6221 IF ( .NOT. ALLOCATED( surf_usm_v(0)%waste_heat ) ) & 6490 6222 ALLOCATE( surf_usm_v(0)%waste_heat(1:surf_usm_v(0)%ns) ) 6491 READ ( 13 ) tmp_surf_waste_v(0)% t6492 ENDIF 6493 CALL surface_restore_elements( surf_usm_v(0)%waste_heat, tmp_surf_waste_v(0)% t, &6223 READ ( 13 ) tmp_surf_waste_v(0)%val 6224 ENDIF 6225 CALL surface_restore_elements( surf_usm_v(0)%waste_heat, tmp_surf_waste_v(0)%val, & 6494 6226 surf_usm_v(0)%start_index, start_index_on_file, & 6495 6227 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6500 6232 IF ( .NOT. ALLOCATED( surf_usm_v(1)%waste_heat ) ) & 6501 6233 ALLOCATE( surf_usm_v(1)%waste_heat(1:surf_usm_v(1)%ns) ) 6502 READ ( 13 ) tmp_surf_waste_v(1)% t6503 ENDIF 6504 CALL surface_restore_elements( surf_usm_v(1)%waste_heat, tmp_surf_waste_v(1)% t, &6234 READ ( 13 ) tmp_surf_waste_v(1)%val 6235 ENDIF 6236 CALL surface_restore_elements( surf_usm_v(1)%waste_heat, tmp_surf_waste_v(1)%val, & 6505 6237 surf_usm_v(1)%start_index, start_index_on_file, & 6506 6238 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6511 6243 IF ( .NOT. ALLOCATED( surf_usm_v(2)%waste_heat ) ) & 6512 6244 ALLOCATE( surf_usm_v(2)%waste_heat(1:surf_usm_v(2)%ns) ) 6513 READ ( 13 ) tmp_surf_waste_v(2)% t6514 ENDIF 6515 CALL surface_restore_elements( surf_usm_v(2)%waste_heat, tmp_surf_waste_v(2)% t, &6245 READ ( 13 ) tmp_surf_waste_v(2)%val 6246 ENDIF 6247 CALL surface_restore_elements( surf_usm_v(2)%waste_heat, tmp_surf_waste_v(2)%val, & 6516 6248 surf_usm_v(2)%start_index, start_index_on_file, & 6517 6249 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6522 6254 IF ( .NOT. ALLOCATED( surf_usm_v(3)%waste_heat ) ) & 6523 6255 ALLOCATE( surf_usm_v(3)%waste_heat(1:surf_usm_v(3)%ns) ) 6524 READ ( 13 ) tmp_surf_waste_v(3)% t6525 ENDIF 6526 CALL surface_restore_elements( surf_usm_v(3)%waste_heat, tmp_surf_waste_v(3)% t, &6256 READ ( 13 ) tmp_surf_waste_v(3)%val 6257 ENDIF 6258 CALL surface_restore_elements( surf_usm_v(3)%waste_heat, tmp_surf_waste_v(3)%val, & 6527 6259 surf_usm_v(3)%start_index, start_index_on_file, & 6528 6260 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6529 6261 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6530 6262 6531 CASE ( 't_wall_h ' )6263 CASE ( 't_wall_h(0)' ) 6532 6264 IF ( k == 1 ) THEN 6533 IF ( .NOT. ALLOCATED( t_wall_h_1 ) )&6534 ALLOCATE( t_wall_h_1( nzb_wall:nzt_wall+1, 1:surf_usm_h%ns) )6535 READ ( 13 ) tmp_wall_h 6536 ENDIF 6537 CALL surface_restore_elements( t_wall_h_1 , tmp_wall_h, surf_usm_h%start_index,&6538 s tart_index_on_file, end_index_on_file,&6539 nxlc, nysc, nxlf, nxrf, nysf, nynf,&6265 IF ( .NOT. ALLOCATED( t_wall_h_1(0)%val ) ) & 6266 ALLOCATE( t_wall_h_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(0)%ns) ) 6267 READ ( 13 ) tmp_wall_h(0)%val 6268 ENDIF 6269 CALL surface_restore_elements( t_wall_h_1(0)%val, tmp_wall_h(0)%val, & 6270 surf_usm_h(0)%start_index, start_index_on_file, & 6271 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6540 6272 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6541 6273 6542 6543 6274 CASE ( 't_wall_h(1)' ) 6275 IF ( k == 1 ) THEN 6276 IF ( .NOT. ALLOCATED( t_wall_h_1(1)%val ) ) & 6277 ALLOCATE( t_wall_h_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(1)%ns) ) 6278 READ ( 13 ) tmp_wall_h(1)%val 6279 ENDIF 6280 CALL surface_restore_elements( t_wall_h_1(1)%val, tmp_wall_h(1)%val, & 6281 surf_usm_h(1)%start_index, start_index_on_file, & 6282 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6283 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6544 6284 6545 6285 CASE ( 't_wall_v(0)' ) 6546 6286 IF ( k == 1 ) THEN 6547 IF ( .NOT. ALLOCATED( t_wall_v_1(0)% t) ) &6548 ALLOCATE( t_wall_v_1(0)% t(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) )6549 READ ( 13 ) tmp_wall_v(0)% t6550 ENDIF 6551 CALL surface_restore_elements( t_wall_v_1(0)% t, tmp_wall_v(0)%t, &6287 IF ( .NOT. ALLOCATED( t_wall_v_1(0)%val ) ) & 6288 ALLOCATE( t_wall_v_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) ) 6289 READ ( 13 ) tmp_wall_v(0)%val 6290 ENDIF 6291 CALL surface_restore_elements( t_wall_v_1(0)%val, tmp_wall_v(0)%val, & 6552 6292 surf_usm_v(0)%start_index, start_index_on_file, & 6553 6293 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6556 6296 CASE ( 't_wall_v(1)' ) 6557 6297 IF ( k == 1 ) THEN 6558 IF ( .NOT. ALLOCATED( t_wall_v_1(1)% t) ) &6559 ALLOCATE( t_wall_v_1(1)% t(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) )6560 READ ( 13 ) tmp_wall_v(1)% t6561 ENDIF 6562 CALL surface_restore_elements( t_wall_v_1(1)% t, tmp_wall_v(1)%t, &6298 IF ( .NOT. ALLOCATED( t_wall_v_1(1)%val ) ) & 6299 ALLOCATE( t_wall_v_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) ) 6300 READ ( 13 ) tmp_wall_v(1)%val 6301 ENDIF 6302 CALL surface_restore_elements( t_wall_v_1(1)%val, tmp_wall_v(1)%val, & 6563 6303 surf_usm_v(1)%start_index, start_index_on_file, & 6564 6304 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6567 6307 CASE ( 't_wall_v(2)' ) 6568 6308 IF ( k == 1 ) THEN 6569 IF ( .NOT. ALLOCATED( t_wall_v_1(2)% t) ) &6570 ALLOCATE( t_wall_v_1(2)% t(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) )6571 READ ( 13 ) tmp_wall_v(2)% t6572 ENDIF 6573 CALL surface_restore_elements( t_wall_v_1(2)% t, tmp_wall_v(2)%t, &6309 IF ( .NOT. ALLOCATED( t_wall_v_1(2)%val ) ) & 6310 ALLOCATE( t_wall_v_1(2)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) ) 6311 READ ( 13 ) tmp_wall_v(2)%val 6312 ENDIF 6313 CALL surface_restore_elements( t_wall_v_1(2)%val, tmp_wall_v(2)%val, & 6574 6314 surf_usm_v(2)%start_index, start_index_on_file, & 6575 6315 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6578 6318 CASE ( 't_wall_v(3)' ) 6579 6319 IF ( k == 1 ) THEN 6580 IF ( .NOT. ALLOCATED( t_wall_v_1(3)% t) ) &6581 ALLOCATE( t_wall_v_1(3)% t(nzb_wall:nzt_wall+1, 1:surf_usm_v(3)%ns) )6582 READ ( 13 ) tmp_wall_v(3)% t6583 ENDIF 6584 CALL surface_restore_elements( t_wall_v_1(3)% t, tmp_wall_v(3)%t, &6320 IF ( .NOT. ALLOCATED( t_wall_v_1(3)%val ) ) & 6321 ALLOCATE( t_wall_v_1(3)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(3)%ns) ) 6322 READ ( 13 ) tmp_wall_v(3)%val 6323 ENDIF 6324 CALL surface_restore_elements( t_wall_v_1(3)%val, tmp_wall_v(3)%val, & 6585 6325 surf_usm_v(3)%start_index, start_index_on_file, & 6586 6326 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6587 6327 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6588 6328 6589 CASE ( 't_ green_h' )6329 CASE ( 't_window_h(0)' ) 6590 6330 IF ( k == 1 ) THEN 6591 IF ( .NOT. ALLOCATED( t_ green_h_1 ) )&6592 ALLOCATE( t_ green_h_1(nzb_wall:nzt_wall+1, 1:surf_usm_h%ns) )6593 READ ( 13 ) tmp_ green_h6594 ENDIF 6595 CALL surface_restore_elements( t_ green_h_1, tmp_green_h, surf_usm_h%start_index,&6596 s tart_index_on_file, end_index_on_file, nxlc, nysc,&6597 nxlf, nxrf, nysf, nynf, nys_on_file, nyn_on_file,&6598 n xl_on_file,nxr_on_file )6599 6600 CASE ( 't_ green_v(0)' )6331 IF ( .NOT. ALLOCATED( t_window_h_1(0)%val ) ) & 6332 ALLOCATE( t_window_h_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(0)%ns) ) 6333 READ ( 13 ) tmp_window_h(0)%val 6334 ENDIF 6335 CALL surface_restore_elements( t_window_h_1(0)%val, tmp_window_h(0)%val, & 6336 surf_usm_h(0)%start_index, start_index_on_file, & 6337 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6338 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6339 6340 CASE ( 't_window_h(1)' ) 6601 6341 IF ( k == 1 ) THEN 6602 IF ( .NOT. ALLOCATED( t_green_v_1(0)%t ) ) & 6603 ALLOCATE( t_green_v_1(0)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) ) 6604 READ ( 13 ) tmp_green_v(0)%t 6605 ENDIF 6606 CALL surface_restore_elements( t_green_v_1(0)%t, tmp_green_v(0)%t, & 6342 IF ( .NOT. ALLOCATED( t_window_h_1(1)%val ) ) & 6343 ALLOCATE( t_window_h_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(1)%ns) ) 6344 READ ( 13 ) tmp_window_h(1)%val 6345 ENDIF 6346 CALL surface_restore_elements( t_window_h_1(1)%val, tmp_window_h(1)%val, & 6347 surf_usm_h(1)%start_index, start_index_on_file, & 6348 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6349 nys_on_file, nyn_on_file, nxl_on_file, nxr_on_file ) 6350 6351 CASE ( 't_window_v(0)' ) 6352 IF ( k == 1 ) THEN 6353 IF ( .NOT. ALLOCATED( t_window_v_1(0)%val ) ) & 6354 ALLOCATE( t_window_v_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) ) 6355 READ ( 13 ) tmp_window_v(0)%val 6356 ENDIF 6357 CALL surface_restore_elements( t_window_v_1(0)%val, tmp_window_v(0)%val, & 6607 6358 surf_usm_v(0)%start_index, start_index_on_file, & 6608 6359 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6609 6360 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6610 6361 6611 CASE ( 't_ green_v(1)' )6362 CASE ( 't_window_v(1)' ) 6612 6363 IF ( k == 1 ) THEN 6613 IF ( .NOT. ALLOCATED( t_ green_v_1(1)%t ) )&6614 ALLOCATE( t_ green_v_1(1)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) )6615 READ ( 13 ) tmp_ green_v(1)%t6616 ENDIF 6617 CALL surface_restore_elements( t_ green_v_1(1)%t, tmp_green_v(1)%t,&6364 IF ( .NOT. ALLOCATED( t_window_v_1(1)%val ) ) & 6365 ALLOCATE( t_window_v_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) ) 6366 READ ( 13 ) tmp_window_v(1)%val 6367 ENDIF 6368 CALL surface_restore_elements( t_window_v_1(1)%val, tmp_window_v(1)%val, & 6618 6369 surf_usm_v(1)%start_index, start_index_on_file, & 6619 6370 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6620 6371 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6621 6372 6622 CASE ( 't_ green_v(2)' )6373 CASE ( 't_window_v(2)' ) 6623 6374 IF ( k == 1 ) THEN 6624 IF ( .NOT. ALLOCATED( t_ green_v_1(2)%t ) )&6625 ALLOCATE( t_ green_v_1(2)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) )6626 READ ( 13 ) tmp_ green_v(2)%t6627 ENDIF 6628 CALL surface_restore_elements( t_ green_v_1(2)%t, tmp_green_v(2)%t,&6375 IF ( .NOT. ALLOCATED( t_window_v_1(2)%val ) ) & 6376 ALLOCATE( t_window_v_1(2)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) ) 6377 READ ( 13 ) tmp_window_v(2)%val 6378 ENDIF 6379 CALL surface_restore_elements( t_window_v_1(2)%val, tmp_window_v(2)%val, & 6629 6380 surf_usm_v(2)%start_index, start_index_on_file, & 6630 6381 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6631 6382 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6632 6383 6633 CASE ( 't_ green_v(3)' )6384 CASE ( 't_window_v(3)' ) 6634 6385 IF ( k == 1 ) THEN 6635 IF ( .NOT. ALLOCATED( t_ green_v_1(3)%t ) )&6636 ALLOCATE( t_ green_v_1(3)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(3)%ns) )6637 READ ( 13 ) tmp_ green_v(3)%t6638 ENDIF 6639 CALL surface_restore_elements( t_ green_v_1(3)%t, tmp_green_v(3)%t,&6386 IF ( .NOT. ALLOCATED( t_window_v_1(3)%val ) ) & 6387 ALLOCATE( t_window_v_1(3)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(3)%ns) ) 6388 READ ( 13 ) tmp_window_v(3)%val 6389 ENDIF 6390 CALL surface_restore_elements( t_window_v_1(3)%val, tmp_window_v(3)%val, & 6640 6391 surf_usm_v(3)%start_index, start_index_on_file, & 6641 6392 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6642 6393 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6643 6394 6644 CASE ( 't_ window_h' )6395 CASE ( 't_green_h(0)' ) 6645 6396 IF ( k == 1 ) THEN 6646 IF ( .NOT. ALLOCATED( t_ window_h_1 ) )&6647 ALLOCATE( t_ window_h_1(nzb_wall:nzt_wall+1, 1:surf_usm_h%ns) )6648 READ ( 13 ) tmp_ window_h6649 ENDIF 6650 CALL surface_restore_elements( t_ window_h_1, tmp_window_h, surf_usm_h%start_index,&6651 s tart_index_on_file, end_index_on_file, nxlc, nysc,&6652 nxlf, nxrf, nysf, nynf, nys_on_file, nyn_on_file,&6653 n xl_on_file,nxr_on_file )6654 6655 CASE ( 't_ window_v(0)' )6397 IF ( .NOT. ALLOCATED( t_green_h_1(0)%val ) ) & 6398 ALLOCATE( t_green_h_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(0)%ns) ) 6399 READ ( 13 ) tmp_green_h(0)%val 6400 ENDIF 6401 CALL surface_restore_elements( t_green_h_1(0)%val, tmp_green_h(0)%val, & 6402 surf_usm_h(0)%start_index, start_index_on_file, & 6403 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6404 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6405 6406 CASE ( 't_green_h(1)' ) 6656 6407 IF ( k == 1 ) THEN 6657 IF ( .NOT. ALLOCATED( t_window_v_1(0)%t ) ) & 6658 ALLOCATE( t_window_v_1(0)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) ) 6659 READ ( 13 ) tmp_window_v(0)%t 6660 ENDIF 6661 CALL surface_restore_elements( t_window_v_1(0)%t, tmp_window_v(0)%t, & 6408 IF ( .NOT. ALLOCATED( t_green_h_1(1)%val ) ) & 6409 ALLOCATE( t_green_h_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_h(1)%ns) ) 6410 READ ( 13 ) tmp_green_h(1)%val 6411 ENDIF 6412 CALL surface_restore_elements( t_green_h_1(1)%val, tmp_green_h(1)%val, & 6413 surf_usm_h(1)%start_index, start_index_on_file, & 6414 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6415 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6416 6417 CASE ( 't_green_v(0)' ) 6418 IF ( k == 1 ) THEN 6419 IF ( .NOT. ALLOCATED( t_green_v_1(0)%val ) ) & 6420 ALLOCATE( t_green_v_1(0)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(0)%ns) ) 6421 READ ( 13 ) tmp_green_v(0)%val 6422 ENDIF 6423 CALL surface_restore_elements( t_green_v_1(0)%val, tmp_green_v(0)%val, & 6662 6424 surf_usm_v(0)%start_index, start_index_on_file, & 6663 6425 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6664 6426 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6665 6427 6666 CASE ( 't_ window_v(1)' )6428 CASE ( 't_green_v(1)' ) 6667 6429 IF ( k == 1 ) THEN 6668 IF ( .NOT. ALLOCATED( t_ window_v_1(1)%t ) )&6669 ALLOCATE( t_ window_v_1(1)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) )6670 READ ( 13 ) tmp_ window_v(1)%t6671 ENDIF 6672 CALL surface_restore_elements( t_ window_v_1(1)%t, tmp_window_v(1)%t,&6430 IF ( .NOT. ALLOCATED( t_green_v_1(1)%val ) ) & 6431 ALLOCATE( t_green_v_1(1)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(1)%ns) ) 6432 READ ( 13 ) tmp_green_v(1)%val 6433 ENDIF 6434 CALL surface_restore_elements( t_green_v_1(1)%val, tmp_green_v(1)%val, & 6673 6435 surf_usm_v(1)%start_index, start_index_on_file, & 6674 6436 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6675 6437 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6676 6438 6677 CASE ( 't_ window_v(2)' )6439 CASE ( 't_green_v(2)' ) 6678 6440 IF ( k == 1 ) THEN 6679 IF ( .NOT. ALLOCATED( t_ window_v_1(2)%t ) )&6680 ALLOCATE( t_ window_v_1(2)%t(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) )6681 READ ( 13 ) tmp_ window_v(2)%t6682 ENDIF 6683 CALL surface_restore_elements( t_ window_v_1(2)%t, tmp_window_v(2)%t,&6441 IF ( .NOT. ALLOCATED( t_green_v_1(2)%val ) ) & 6442 ALLOCATE( t_green_v_1(2)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(2)%ns) ) 6443 READ ( 13 ) tmp_green_v(2)%val 6444 ENDIF 6445 CALL surface_restore_elements( t_green_v_1(2)%val, tmp_green_v(2)%val, & 6684 6446 surf_usm_v(2)%start_index, start_index_on_file, & 6685 6447 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & 6686 6448 nys_on_file, nyn_on_file, nxl_on_file,nxr_on_file ) 6687 6449 6688 CASE ( 't_ window_v(3)' )6450 CASE ( 't_green_v(3)' ) 6689 6451 IF ( k == 1 ) THEN 6690 IF ( .NOT. ALLOCATED( t_ window_v_1(3)%t ) )&6691 ALLOCATE( t_ window_v_1(3)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(3)%ns) )6692 READ ( 13 ) tmp_ window_v(3)%t6693 ENDIF 6694 CALL surface_restore_elements( t_ window_v_1(3)%t, tmp_window_v(3)%t,&6452 IF ( .NOT. ALLOCATED( t_green_v_1(3)%val ) ) & 6453 ALLOCATE( t_green_v_1(3)%val(nzb_wall:nzt_wall+1, 1:surf_usm_v(3)%ns) ) 6454 READ ( 13 ) tmp_green_v(3)%val 6455 ENDIF 6456 CALL surface_restore_elements( t_green_v_1(3)%val, tmp_green_v(3)%val, & 6695 6457 surf_usm_v(3)%start_index, start_index_on_file, & 6696 6458 end_index_on_file, nxlc, nysc, nxlf, nxrf, nysf, nynf, & … … 6731 6493 LOGICAL :: ldum !< dummy variable 6732 6494 6733 6734 CALL rrd_mpi_io( 'usm_start_index_h', surf_usm_h%start_index ) 6735 CALL rrd_mpi_io( 'usm_end_index_h', surf_usm_h%end_index ) 6736 CALL rrd_mpi_io( 'usm_global_start_h', global_start ) 6737 6738 CALL rd_mpi_io_surface_filetypes( surf_usm_h%start_index, surf_usm_h%end_index, ldum, & 6739 global_start ) 6740 6741 IF ( .NOT. ALLOCATED( t_surf_wall_h_1 ) ) ALLOCATE( t_surf_wall_h_1(1:surf_usm_h%ns) ) 6742 CALL rrd_mpi_io_surface( 't_surf_wall_h', t_surf_wall_h_1 ) 6743 6744 IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) ) ALLOCATE( t_surf_window_h_1(1:surf_usm_h%ns) ) 6745 CALL rrd_mpi_io_surface( 't_surf_window_h', t_surf_window_h_1 ) 6746 6747 IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) ) ALLOCATE( t_surf_green_h_1(1:surf_usm_h%ns) ) 6748 CALL rrd_mpi_io_surface( 't_surf_green_h', t_surf_green_h_1 ) 6749 6495 DO l = 0, 1 6496 6497 WRITE( dum, '(I1)' ) l 6498 6499 CALL rrd_mpi_io( 'usm_start_index_h_' //dum, surf_usm_h(l)%start_index ) 6500 CALL rrd_mpi_io( 'usm_end_index_h_' //dum, surf_usm_h(l)%end_index ) 6501 CALL rrd_mpi_io( 'usm_global_start_h_' //dum, global_start ) 6502 6503 CALL rd_mpi_io_surface_filetypes( surf_usm_h(l)%start_index, surf_usm_h(l)%end_index, ldum, & 6504 global_start ) 6505 6506 IF ( .NOT. ALLOCATED( t_surf_wall_h_1(l)%val ) ) & 6507 ALLOCATE( t_surf_wall_h_1(l)%val(1:surf_usm_h(l)%ns) ) 6508 CALL rrd_mpi_io_surface( 't_surf_wall_h(' // dum // ')', t_surf_wall_h_1(l)%val ) 6509 6510 IF ( .NOT. ALLOCATED( t_surf_window_h_1(l)%val ) ) & 6511 ALLOCATE( t_surf_window_h_1(l)%val(1:surf_usm_h(l)%ns) ) 6512 CALL rrd_mpi_io_surface( 't_surf_window_h(' // dum // ')', t_surf_window_h_1(l)%val ) 6513 6514 IF ( .NOT. ALLOCATED( t_surf_green_h_1(l)%val ) ) & 6515 ALLOCATE( t_surf_green_h_1(l)%val(1:surf_usm_h(l)%ns) ) 6516 CALL rrd_mpi_io_surface( 't_surf_green_h(' // dum // ')', t_surf_green_h_1(l)%val ) 6517 6518 ENDDO 6750 6519 DO l = 0, 3 6751 6520 … … 6759 6528 global_start ) 6760 6529 6761 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)% t) ) &6762 ALLOCATE( t_surf_wall_v_1(l)% t(1:surf_usm_v(l)%ns) )6763 CALL rrd_mpi_io_surface( 't_surf_wall_v(' // dum // ')', t_surf_wall_v_1(l)% t)6764 6765 IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)% t) ) &6766 ALLOCATE( t_surf_window_v_1(l)% t(1:surf_usm_v(l)%ns) )6767 CALL rrd_mpi_io_surface( 't_surf_window_v(' // dum // ')', t_surf_window_v_1(l)% t)6768 6769 IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)% t) ) &6770 ALLOCATE( t_surf_green_v_1(l)% t(1:surf_usm_v(l)%ns) )6771 CALL rrd_mpi_io_surface( 't_surf_green_v(' // dum // ')', t_surf_green_v_1(l)% t)6530 IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)%val ) ) & 6531 ALLOCATE( t_surf_wall_v_1(l)%val(1:surf_usm_v(l)%ns) ) 6532 CALL rrd_mpi_io_surface( 't_surf_wall_v(' // dum // ')', t_surf_wall_v_1(l)%val ) 6533 6534 IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)%val ) ) & 6535 ALLOCATE( t_surf_window_v_1(l)%val(1:surf_usm_v(l)%ns) ) 6536 CALL rrd_mpi_io_surface( 't_surf_window_v(' // dum // ')', t_surf_window_v_1(l)%val ) 6537 6538 IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)%val ) ) & 6539 ALLOCATE( t_surf_green_v_1(l)%val(1:surf_usm_v(l)%ns) ) 6540 CALL rrd_mpi_io_surface( 't_surf_green_v(' // dum // ')', t_surf_green_v_1(l)%val) 6772 6541 6773 6542 ENDDO 6774 6543 6775 CALL rrd_mpi_io( 'usm_start_index_h_2', surf_usm_h%start_index ) 6776 CALL rrd_mpi_io( 'usm_end_index_h_2', surf_usm_h%end_index ) 6777 CALL rrd_mpi_io( 'usm_global_start_h_2', global_start ) 6778 6779 CALL rd_mpi_io_surface_filetypes( surf_usm_h%start_index, surf_usm_h%end_index, ldum, & 6780 global_start ) 6781 6782 IF ( .NOT. ALLOCATED( t_wall_h_1 ) ) & 6783 ALLOCATE( t_wall_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 6784 CALL rrd_mpi_io_surface( 't_wall_h', t_wall_h_1 ) 6785 6786 IF ( .NOT. ALLOCATED( t_window_h_1 ) ) & 6787 ALLOCATE( t_window_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 6788 CALL rrd_mpi_io_surface( 't_window_h', t_window_h_1 ) 6789 6790 IF ( .NOT. ALLOCATED( t_green_h_1 ) ) & 6791 ALLOCATE( t_green_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 6792 CALL rrd_mpi_io_surface( 't_green_h', t_green_h_1 ) 6544 DO l = 0, 1 6545 6546 WRITE( dum, '(I1)' ) l 6547 6548 CALL rrd_mpi_io( 'usm_start_index_h_2_' //dum, surf_usm_h(l)%start_index ) 6549 CALL rrd_mpi_io( 'usm_end_index_h_2_' //dum, surf_usm_h(l)%end_index ) 6550 CALL rrd_mpi_io( 'usm_global_start_h_2_' //dum, global_start ) 6551 6552 CALL rd_mpi_io_surface_filetypes( surf_usm_h(l)%start_index, surf_usm_h(l)%end_index, ldum, & 6553 global_start ) 6554 6555 IF ( .NOT. ALLOCATED( t_wall_h_1(l)%val ) ) & 6556 ALLOCATE( t_wall_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 6557 CALL rrd_mpi_io_surface( 't_wall_h(' // dum // ')', t_wall_h_1(l)%val ) 6558 6559 IF ( .NOT. ALLOCATED( t_window_h_1(l)%val ) ) & 6560 ALLOCATE( t_window_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 6561 CALL rrd_mpi_io_surface( 't_window_h(' // dum // ')', t_window_h_1(l)%val ) 6562 6563 IF ( .NOT. ALLOCATED( t_green_h_1(l)%val ) ) & 6564 ALLOCATE( t_green_h_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_h(l)%ns) ) 6565 CALL rrd_mpi_io_surface( 't_green_h(' // dum // ')', t_green_h_1(l)%val ) 6566 ENDDO 6793 6567 6794 6568 DO l = 0, 3 … … 6803 6577 global_start ) 6804 6578 6805 IF ( .NOT. ALLOCATED( t_wall_v_1(l)% t) ) &6806 ALLOCATE ( t_wall_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )6807 CALL rrd_mpi_io_surface( 't_wall_v(' // dum // ')', t_wall_v_1(l)% t)6808 6809 IF ( .NOT. ALLOCATED( t_window_v_1(l)% t) ) &6810 ALLOCATE ( t_window_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )6811 CALL rrd_mpi_io_surface( 't_window_v(' // dum // ')', t_window_v_1(l)% t)6812 6813 IF ( .NOT. ALLOCATED( t_green_v_1(l)% t) ) &6814 ALLOCATE ( t_green_v_1(l)% t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )6815 CALL rrd_mpi_io_surface( 't_green_v(' // dum // ')', t_green_v_1(l)% t)6579 IF ( .NOT. ALLOCATED( t_wall_v_1(l)%val ) ) & 6580 ALLOCATE ( t_wall_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 6581 CALL rrd_mpi_io_surface( 't_wall_v(' // dum // ')', t_wall_v_1(l)%val ) 6582 6583 IF ( .NOT. ALLOCATED( t_window_v_1(l)%val ) ) & 6584 ALLOCATE ( t_window_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 6585 CALL rrd_mpi_io_surface( 't_window_v(' // dum // ')', t_window_v_1(l)%val ) 6586 6587 IF ( .NOT. ALLOCATED( t_green_v_1(l)%val ) ) & 6588 ALLOCATE ( t_green_v_1(l)%val(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 6589 CALL rrd_mpi_io_surface( 't_green_v(' // dum // ')', t_green_v_1(l)%val ) 6816 6590 6817 6591 ENDDO 6818 6592 6819 6593 END SUBROUTINE usm_rrd_local_mpi 6820 6821 6822 6823 !--------------------------------------------------------------------------------------------------!6824 ! Description:6825 ! ------------6826 !6827 !> This subroutine reads walls, roofs and land categories and its parameters from input files.6828 !--------------------------------------------------------------------------------------------------!6829 SUBROUTINE usm_read_urban_surface_types6830 6831 USE netcdf_data_input_mod, &6832 ONLY: building_pars_f, &6833 building_type_f6834 6835 IMPLICIT NONE6836 6837 CHARACTER(12) :: wtn !<6838 6839 INTEGER(iwp) :: i, j !<6840 INTEGER(iwp) :: ii, ij, ip, it, iw, jw, k, kw, l, m !<6841 INTEGER(iwp) :: category !<6842 INTEGER(iwp) :: dirsn, dirwe, nz, roof !<6843 INTEGER(iwp) :: weheight1, wecat1, snheight1, sncat1 !<6844 INTEGER(iwp) :: weheight2, wecat2, snheight2, sncat2 !<6845 INTEGER(iwp) :: weheight3, wecat3, snheight3, sncat3 !<6846 INTEGER(iwp) :: wtc !<6847 6848 INTEGER(iwp), DIMENSION(0:17, nysg:nyng, nxlg:nxrg) :: usm_par !<6849 6850 LOGICAL :: ascii_file = .FALSE. !<6851 6852 REAL(wp) :: albedo, height, thick !<6853 REAL(wp) :: wealbedo1, wethick1, snalbedo1, snthick1 !<6854 REAL(wp) :: wealbedo2, wethick2, snalbedo2, snthick2 !<6855 REAL(wp) :: wealbedo3, wethick3, snalbedo3, snthick3 !<6856 6857 REAL(wp), DIMENSION(n_surface_params) :: wtp !<6858 6859 REAL(wp), DIMENSION(1:14, nysg:nyng, nxlg:nxrg) :: usm_val !<6860 6861 6862 IF ( debug_output ) CALL debug_message( 'usm_read_urban_surface_types', 'start' )6863 !6864 !-- If building_pars or building_type are already read from static input file, skip reading ASCII6865 !-- file.6866 IF ( building_type_f%from_file .OR. building_pars_f%from_file ) RETURN6867 !6868 !-- Check if ASCII input file exists. If not, return and initialize USM with default settings.6869 INQUIRE( FILE = 'SURFACE_PARAMETERS' // coupling_char, EXIST = ascii_file )6870 6871 IF ( .NOT. ascii_file ) RETURN6872 6873 !6874 !-- Read categories of walls and their parameters6875 DO ii = 0, io_blocks-16876 IF ( ii == io_group ) THEN6877 !6878 !-- Open urban surface file6879 OPEN( 151, file = 'SURFACE_PARAMETERS' // coupling_char, action = 'read', &6880 status = 'old', form = 'formatted', err = 15 )6881 !6882 !-- First test and get n_surface_types6883 k = 06884 l = 06885 DO6886 l = l+16887 READ( 151, *, err = 11, end = 12 ) wtc, wtp, wtn6888 k = k+16889 CYCLE6890 11 CONTINUE6891 ENDDO6892 12 n_surface_types = k6893 ALLOCATE( surface_type_names(n_surface_types) )6894 ALLOCATE( surface_type_codes(n_surface_types) )6895 ALLOCATE( surface_params(n_surface_params, n_surface_types) )6896 !6897 !-- Real reading6898 rewind( 151 )6899 k = 06900 DO6901 READ( 151, *, err = 13, end = 14 ) wtc, wtp, wtn6902 k = k+16903 surface_type_codes(k) = wtc6904 surface_params(:,k) = wtp6905 surface_type_names(k) = wtn6906 CYCLE6907 13 WRITE( 6,'(i3,a,2i5)') myid, 'readparams2 error k = ', k6908 FLUSH( 6 )6909 CONTINUE6910 ENDDO6911 14 CLOSE(151)6912 CYCLE6913 15 message_string = 'file SURFACE_PARAMETERS' // TRIM( coupling_char ) // ' does not exist'6914 CALL message( 'usm_read_urban_surface_types', 'PA0513', 1, 2, 0, 6, 0 )6915 ENDIF6916 ENDDO6917 6918 !6919 !-- Read types of surfaces6920 usm_par = 06921 DO ii = 0, io_blocks-16922 IF ( ii == io_group ) THEN6923 6924 !6925 !-- Open csv urban surface file6926 OPEN( 151, file = 'URBAN_SURFACE' // TRIM( coupling_char ), action = 'read', &6927 status = 'old', form = 'formatted', err = 23 )6928 6929 l = 06930 DO6931 6932 l = l+16933 !6934 !-- i, j, height, nz, roof, dirwe, dirsn, category, soilcat,6935 !-- weheight1, wecat1, snheight1, sncat1, weheight2, wecat2, snheight2, sncat2,6936 !-- weheight3, wecat3, snheight3, sncat36937 READ( 151, *, err = 21, end = 25 ) i, j, height, nz, roof, dirwe, dirsn, &6938 category, albedo, thick, &6939 weheight1, wecat1, wealbedo1, wethick1, &6940 weheight2, wecat2, wealbedo2, wethick2, &6941 weheight3, wecat3, wealbedo3, wethick3, &6942 snheight1, sncat1, snalbedo1, snthick1, &6943 snheight2, sncat2, snalbedo2, snthick2, &6944 snheight3, sncat3, snalbedo3, snthick36945 6946 IF ( i >= nxlg .AND. i <= nxrg .AND. j >= nysg .AND. j <= nyng ) THEN6947 !6948 !-- Write integer variables into array6949 usm_par(:,j,i) = (/1, nz, roof, dirwe, dirsn, category, &6950 weheight1, wecat1, weheight2, wecat2, weheight3, wecat3, &6951 snheight1, sncat1, snheight2, sncat2, snheight3, sncat3 /)6952 !6953 !-- Write real values into array6954 usm_val(:,j,i) = (/ albedo, thick, &6955 wealbedo1, wethick1, wealbedo2, wethick2, &6956 wealbedo3, wethick3, snalbedo1, snthick1, &6957 snalbedo2, snthick2, snalbedo3, snthick3 /)6958 ENDIF6959 CYCLE6960 21 WRITE( message_string, '(A,I5)') 'errors in file URBAN_SURFACE ' // &6961 TRIM( coupling_char ) // ' on line ', l6962 CALL message( 'usm_read_urban_surface_types', 'PA0512', 0, 1, 0, 6, 0 )6963 ENDDO6964 6965 23 message_string = 'file URBAN_SURFACE ' // TRIM( coupling_char ) // ' does not exist'6966 CALL message( 'usm_read_urban_surface_types', 'PA0514', 1, 2, 0, 6, 0 )6967 6968 25 CLOSE( 151 )6969 6970 ENDIF6971 #if defined( __parallel )6972 CALL MPI_BARRIER( comm2d, ierr )6973 #endif6974 ENDDO6975 6976 !6977 !-- Check completeness and formal correctness of the data6978 DO i = nxlg, nxrg6979 DO j = nysg, nyng6980 IF ( usm_par(0,j,i) /= 0 .AND. ( & !< incomplete data,supply default values later6981 usm_par(1,j,i) < nzb .OR. &6982 usm_par(1,j,i) > nzt .OR. & !< incorrect height (nz < nzb .OR. nz > nzt)6983 usm_par(2,j,i) < 0 .OR. &6984 usm_par(2,j,i) > 1 .OR. & !< incorrect roof sign6985 usm_par(3,j,i) < nzb-nzt .OR. &6986 usm_par(3,j,i) > nzt-nzb .OR. & !< incorrect west-east wall direction sign6987 usm_par(4,j,i) < nzb-nzt .OR. &6988 usm_par(4,j,i) > nzt-nzb .OR. & !< incorrect south-north wall direction sign6989 usm_par(6,j,i) < nzb .OR. &6990 usm_par(6,j,i) > nzt .OR. & !< incorrect pedestrian level height for west-east wall6991 usm_par(8,j,i) > nzt .OR. &6992 usm_par(10,j,i) > nzt .OR. & !< incorrect wall or roof level height for west-east wall6993 usm_par(12,j,i) < nzb .OR. &6994 usm_par(12,j,i) > nzt .OR. & !< incorrect pedestrian level height for south-north wall6995 usm_par(14,j,i) > nzt .OR. &6996 usm_par(16,j,i) > nzt & !< incorrect wall or roof level height for south-north wall6997 ) ) THEN6998 !6999 !-- Incorrect input data7000 WRITE( message_string, '(A,2I5)' ) &7001 'missing or incorrect data in file URBAN_SURFACE' // TRIM( coupling_char ) // &7002 ' for i,j=', i, j7003 CALL message( 'usm_read_urban_surface', 'PA0504', 1, 2, 0, 6, 0 )7004 ENDIF7005 7006 ENDDO7007 ENDDO7008 !7009 !-- Assign the surface types to the respective data type. First, for horizontal upward-facing7010 !-- surfaces. Further, set flag indicating that albedo is initialized via ASCI format, else it would7011 !-- be overwritten in the radiation model.7012 surf_usm_h%albedo_from_ascii = .TRUE.7013 DO m = 1, surf_usm_h%ns7014 iw = surf_usm_h%i(m)7015 jw = surf_usm_h%j(m)7016 kw = surf_usm_h%k(m)7017 7018 IF ( usm_par(5,jw,iw) == 0 ) THEN7019 7020 IF ( zu(kw) >= roof_height_limit ) THEN7021 surf_usm_h%isroof_surf(m) = .TRUE.7022 surf_usm_h%surface_types(m) = roof_category !< Default category for root surface7023 ELSE7024 surf_usm_h%isroof_surf(m) = .FALSE.7025 surf_usm_h%surface_types(m) = land_category !< Default category for land surface7026 ENDIF7027 7028 surf_usm_h%albedo(m,:) = -1.0_wp7029 surf_usm_h%thickness_wall(m) = -1.0_wp7030 surf_usm_h%thickness_green(m) = -1.0_wp7031 surf_usm_h%thickness_window(m) = -1.0_wp7032 ELSE7033 IF ( usm_par(2,jw,iw)==0 ) THEN7034 surf_usm_h%isroof_surf(m) = .FALSE.7035 surf_usm_h%thickness_wall(m) = -1.0_wp7036 surf_usm_h%thickness_window(m) = -1.0_wp7037 surf_usm_h%thickness_green(m) = -1.0_wp7038 ELSE7039 surf_usm_h%isroof_surf(m) = .TRUE.7040 surf_usm_h%thickness_wall(m) = usm_val(2,jw,iw)7041 surf_usm_h%thickness_window(m) = usm_val(2,jw,iw)7042 surf_usm_h%thickness_green(m) = usm_val(2,jw,iw)7043 ENDIF7044 surf_usm_h%surface_types(m) = usm_par(5,jw,iw)7045 surf_usm_h%albedo(m,:) = usm_val(1,jw,iw)7046 surf_usm_h%transmissivity(m) = 0.0_wp7047 ENDIF7048 !7049 !-- Find the type position7050 it = surf_usm_h%surface_types(m)7051 ip = -999997052 DO k = 1, n_surface_types7053 IF ( surface_type_codes(k) == it ) THEN7054 ip = k7055 EXIT7056 ENDIF7057 ENDDO7058 IF ( ip == -99999 ) THEN7059 !7060 !-- Land/roof category not found7061 WRITE(9, '(A, I5, A, 3I5)' ) 'land/roof category ', it, ' not found for i, j, k = ', &7062 iw, jw, kw7063 FLUSH( 9 )7064 IF ( surf_usm_h%isroof_surf(m) ) THEN7065 category = roof_category7066 ELSE7067 category = land_category7068 ENDIF7069 DO k = 1, n_surface_types7070 IF ( surface_type_codes(k) == roof_category ) THEN7071 ip = k7072 EXIT7073 ENDIF7074 ENDDO7075 IF ( ip == -99999 ) THEN7076 !7077 !-- Default land/roof category not found7078 WRITE( 9, '(A, I5, A, 3I5)' ) 'Default land/roof category ', category, ' not found!'7079 FLUSH( 9 )7080 ip = 17081 ENDIF7082 ENDIF7083 !7084 !-- Albedo7085 IF ( surf_usm_h%albedo(m,ind_veg_wall) < 0.0_wp ) THEN7086 surf_usm_h%albedo(m,:) = surface_params(ialbedo, ip)7087 ENDIF7088 !7089 !-- Albedo type is 0 (custom), others are replaced later7090 surf_usm_h%albedo_type(m,:) = 07091 !7092 !-- Transmissivity7093 IF ( surf_usm_h%transmissivity(m) < 0.0_wp ) THEN7094 surf_usm_h%transmissivity(m) = 0.0_wp7095 ENDIF7096 !7097 !-- Emissivity of the wall7098 surf_usm_h%emissivity(m,:) = surface_params(iemiss, ip)7099 !7100 !-- Heat conductivity λS between air and wall ( W mâ2 Kâ1 )7101 surf_usm_h%lambda_surf(m) = surface_params(ilambdas,ip)7102 surf_usm_h%lambda_surf_window(m) = surface_params(ilambdas,ip)7103 surf_usm_h%lambda_surf_green(m) = surface_params(ilambdas,ip)7104 !7105 !-- Roughness length for momentum, heat and humidity7106 surf_usm_h%z0(m) = surface_params(irough,ip)7107 surf_usm_h%z0h(m) = surface_params(iroughh,ip)7108 surf_usm_h%z0q(m) = surface_params(iroughh,ip)7109 !7110 !-- Surface skin layer heat capacity (J mâ2 Kâ1 )7111 surf_usm_h%c_surface(m) = surface_params(icsurf,ip)7112 surf_usm_h%c_surface_window(m) = surface_params(icsurf,ip)7113 surf_usm_h%c_surface_green(m) = surface_params(icsurf,ip)7114 !7115 !-- Wall material parameters:7116 !-- Thickness of the wall (m) missing values are replaced by default value for category7117 IF ( surf_usm_h%thickness_wall(m) <= 0.001_wp ) THEN7118 surf_usm_h%thickness_wall(m) = surface_params(ithick,ip)7119 ENDIF7120 IF ( surf_usm_h%thickness_window(m) <= 0.001_wp ) THEN7121 surf_usm_h%thickness_window(m) = surface_params(ithick,ip)7122 ENDIF7123 IF ( surf_usm_h%thickness_green(m) <= 0.001_wp ) THEN7124 surf_usm_h%thickness_green(m) = surface_params(ithick,ip)7125 ENDIF7126 !7127 !-- Volumetric heat capacity rho*C of the wall ( J mâ3 Kâ1 )7128 surf_usm_h%rho_c_wall(:,m) = surface_params(irhoC,ip)7129 surf_usm_h%rho_c_window(:,m) = surface_params(irhoC,ip)7130 surf_usm_h%rho_c_green(:,m) = surface_params(irhoC,ip)7131 !7132 !-- Thermal conductivity λH of the wall (W mâ1 Kâ1 )7133 surf_usm_h%lambda_h(:,m) = surface_params(ilambdah,ip)7134 surf_usm_h%lambda_h_window(:,m) = surface_params(ilambdah,ip)7135 surf_usm_h%lambda_h_green(:,m) = surface_params(ilambdah,ip)7136 7137 ENDDO7138 !7139 !-- For vertical surface elements ( 0 -- northward-facing, 1 -- southward-facing,7140 !-- 2 -- eastward-facing, 3 -- westward-facing )7141 DO l = 0, 37142 !7143 !-- Set flag indicating that albedo is initialized via ASCII format.7144 !-- Else it would be overwritten in the radiation model.7145 surf_usm_v(l)%albedo_from_ascii = .TRUE.7146 DO m = 1, surf_usm_v(l)%ns7147 i = surf_usm_v(l)%i(m)7148 j = surf_usm_v(l)%j(m)7149 kw = surf_usm_v(l)%k(m)7150 7151 IF ( l == 3 ) THEN ! Westward facing7152 iw = i7153 jw = j7154 ii = 67155 ij = 37156 ELSEIF ( l == 2 ) THEN7157 iw = i-17158 jw = j7159 ii = 67160 ij = 37161 ELSEIF ( l == 1 ) THEN7162 iw = i7163 jw = j7164 ii = 127165 ij = 97166 ELSEIF ( l == 0 ) THEN7167 iw = i7168 jw = j-17169 ii = 127170 ij = 97171 ENDIF7172 7173 IF ( iw < 0 .OR. jw < 0 ) THEN7174 !7175 !-- Wall on west or south border of the domain - assign default category7176 IF ( kw <= roof_height_limit ) THEN7177 surf_usm_v(l)%surface_types(m) = wall_category !< Default category for wall surface in wall zone7178 ELSE7179 surf_usm_v(l)%surface_types(m) = roof_category !< Default category for wall surface in roof zone7180 ENDIF7181 surf_usm_v(l)%albedo(m,:) = -1.0_wp7182 surf_usm_v(l)%thickness_wall(m) = -1.0_wp7183 surf_usm_v(l)%thickness_window(m) = -1.0_wp7184 surf_usm_v(l)%thickness_green(m) = -1.0_wp7185 surf_usm_v(l)%transmissivity(m) = -1.0_wp7186 ELSE IF ( kw <= usm_par(ii,jw,iw) ) THEN7187 !7188 !-- Pedestrian zone7189 IF ( usm_par(ii+1,jw,iw) == 0 ) THEN7190 surf_usm_v(l)%surface_types(m) = pedestrian_category !< Default category for wall surface in7191 !< Pedestrian zone7192 surf_usm_v(l)%albedo(m,:) = -1.0_wp7193 surf_usm_v(l)%thickness_wall(m) = -1.0_wp7194 surf_usm_v(l)%thickness_window(m) = -1.0_wp7195 surf_usm_v(l)%thickness_green(m) = -1.0_wp7196 surf_usm_v(l)%transmissivity(m) = -1.0_wp7197 ELSE7198 surf_usm_v(l)%surface_types(m) = usm_par(ii+1,jw,iw)7199 surf_usm_v(l)%albedo(m,:) = usm_val(ij,jw,iw)7200 surf_usm_v(l)%thickness_wall(m) = usm_val(ij+1,jw,iw)7201 surf_usm_v(l)%thickness_window(m) = usm_val(ij+1,jw,iw)7202 surf_usm_v(l)%thickness_green(m) = usm_val(ij+1,jw,iw)7203 surf_usm_v(l)%transmissivity(m) = 0.0_wp7204 ENDIF7205 ELSE IF ( kw <= usm_par(ii+2,jw,iw) ) THEN7206 !7207 !-- Wall zone7208 IF ( usm_par(ii+3,jw,iw) == 0 ) THEN7209 surf_usm_v(l)%surface_types(m) = wall_category !< default category for wall surface7210 surf_usm_v(l)%albedo(m,:) = -1.0_wp7211 surf_usm_v(l)%thickness_wall(m) = -1.0_wp7212 surf_usm_v(l)%thickness_window(m) = -1.0_wp7213 surf_usm_v(l)%thickness_green(m) = -1.0_wp7214 surf_usm_v(l)%transmissivity(m) = -1.0_wp7215 ELSE7216 surf_usm_v(l)%surface_types(m) = usm_par(ii+3,jw,iw)7217 surf_usm_v(l)%albedo(m,:) = usm_val(ij+2,jw,iw)7218 surf_usm_v(l)%thickness_wall(m) = usm_val(ij+3,jw,iw)7219 surf_usm_v(l)%thickness_window(m) = usm_val(ij+3,jw,iw)7220 surf_usm_v(l)%thickness_green(m) = usm_val(ij+3,jw,iw)7221 surf_usm_v(l)%transmissivity(m) = 0.0_wp7222 ENDIF7223 ELSE IF ( kw <= usm_par(ii+4,jw,iw) ) THEN7224 !7225 !-- Roof zone7226 IF ( usm_par(ii+5,jw,iw) == 0 ) THEN7227 surf_usm_v(l)%surface_types(m) = roof_category !< Default category for roof surface7228 surf_usm_v(l)%albedo(m,:) = -1.0_wp7229 surf_usm_v(l)%thickness_wall(m) = -1.0_wp7230 surf_usm_v(l)%thickness_window(m) = -1.0_wp7231 surf_usm_v(l)%thickness_green(m) = -1.0_wp7232 surf_usm_v(l)%transmissivity(m) = -1.0_wp7233 ELSE7234 surf_usm_v(l)%surface_types(m) = usm_par(ii+5,jw,iw)7235 surf_usm_v(l)%albedo(m,:) = usm_val(ij+4,jw,iw)7236 surf_usm_v(l)%thickness_wall(m) = usm_val(ij+5,jw,iw)7237 surf_usm_v(l)%thickness_window(m) = usm_val(ij+5,jw,iw)7238 surf_usm_v(l)%thickness_green(m) = usm_val(ij+5,jw,iw)7239 surf_usm_v(l)%transmissivity(m) = 0.0_wp7240 ENDIF7241 ELSE7242 WRITE( 9, *) 'Problem reading USM data:'7243 WRITE( 9, *) l,i,j,kw,topo_top_ind(j,i,0)7244 WRITE( 9, *) ii,iw,jw,kw,topo_top_ind(jw,iw,0)7245 WRITE( 9, *) usm_par(ii,jw,iw),usm_par(ii+1,jw,iw)7246 WRITE( 9, *) usm_par(ii+2,jw,iw),usm_par(ii+3,jw,iw)7247 WRITE( 9, *) usm_par(ii+4,jw,iw),usm_par(ii+5,jw,iw)7248 WRITE( 9, *) kw,roof_height_limit,wall_category,roof_category7249 FLUSH( 9 )7250 !7251 !-- Supply the default category7252 IF ( kw <= roof_height_limit ) THEN7253 surf_usm_v(l)%surface_types(m) = wall_category !< Default category for wall surface in wall zone7254 ELSE7255 surf_usm_v(l)%surface_types(m) = roof_category !< Default category for wall surface in roof zone7256 ENDIF7257 surf_usm_v(l)%albedo(m,:) = -1.0_wp7258 surf_usm_v(l)%thickness_wall(m) = -1.0_wp7259 surf_usm_v(l)%thickness_window(m) = -1.0_wp7260 surf_usm_v(l)%thickness_green(m) = -1.0_wp7261 surf_usm_v(l)%transmissivity(m) = -1.0_wp7262 ENDIF7263 !7264 !-- Find the type position7265 it = surf_usm_v(l)%surface_types(m)7266 ip = -999997267 DO k = 1, n_surface_types7268 IF ( surface_type_codes(k) == it ) THEN7269 ip = k7270 EXIT7271 ENDIF7272 ENDDO7273 IF ( ip == -99999 ) THEN7274 !7275 !-- Wall category not found7276 WRITE( 9, '(A,I7,A,3I5)' ) 'wall category ', it, ' not found for i,j,k = ', iw, jw, kw7277 FLUSH(9)7278 category = wall_category7279 DO k = 1, n_surface_types7280 IF ( surface_type_codes(k) == category ) THEN7281 ip = k7282 EXIT7283 ENDIF7284 ENDDO7285 IF ( ip == -99999 ) THEN7286 !7287 !-- Default wall category not found7288 WRITE ( 9, '(A,I5,A,3I5)' ) 'Default wall category', category, ' not found!'7289 FLUSH( 9 )7290 ip = 17291 ENDIF7292 ENDIF7293 7294 !7295 !-- Albedo7296 IF ( surf_usm_v(l)%albedo(m,ind_veg_wall) < 0.0_wp ) THEN7297 surf_usm_v(l)%albedo(m,:) = surface_params(ialbedo,ip)7298 ENDIF7299 !-- Albedo type is 0 (custom), others are replaced later7300 surf_usm_v(l)%albedo_type(m,:) = 07301 !-- Transmissivity of the windows7302 IF ( surf_usm_v(l)%transmissivity(m) < 0.0_wp ) THEN7303 surf_usm_v(l)%transmissivity(m) = 0.0_wp7304 ENDIF7305 !7306 !-- Emissivity of the wall7307 surf_usm_v(l)%emissivity(:,m) = surface_params(iemiss,ip)7308 !7309 !-- Heat conductivity lambda S between air and wall ( W m-2 K-1 )7310 surf_usm_v(l)%lambda_surf(m) = surface_params(ilambdas,ip)7311 surf_usm_v(l)%lambda_surf_window(m) = surface_params(ilambdas,ip)7312 surf_usm_v(l)%lambda_surf_green(m) = surface_params(ilambdas,ip)7313 !7314 !-- Roughness length7315 surf_usm_v(l)%z0(m) = surface_params(irough,ip)7316 surf_usm_v(l)%z0h(m) = surface_params(iroughh,ip)7317 surf_usm_v(l)%z0q(m) = surface_params(iroughh,ip)7318 !7319 !-- Surface skin layer heat capacity (J m-2 K-1 )7320 surf_usm_v(l)%c_surface(m) = surface_params(icsurf,ip)7321 surf_usm_v(l)%c_surface_window(m) = surface_params(icsurf,ip)7322 surf_usm_v(l)%c_surface_green(m) = surface_params(icsurf,ip)7323 !7324 !-- Wall material parameters:7325 !-- Thickness of the wall (m)7326 !-- Missing values are replaced by default value for category7327 IF ( surf_usm_v(l)%thickness_wall(m) <= 0.001_wp ) THEN7328 surf_usm_v(l)%thickness_wall(m) = surface_params(ithick,ip)7329 ENDIF7330 IF ( surf_usm_v(l)%thickness_window(m) <= 0.001_wp ) THEN7331 surf_usm_v(l)%thickness_window(m) = surface_params(ithick,ip)7332 ENDIF7333 IF ( surf_usm_v(l)%thickness_green(m) <= 0.001_wp ) THEN7334 surf_usm_v(l)%thickness_green(m) = surface_params(ithick,ip)7335 ENDIF7336 !7337 !-- Volumetric heat capacity rho*C of the wall ( J m-3 K-1 )7338 surf_usm_v(l)%rho_c_wall(:,m) = surface_params(irhoC,ip)7339 surf_usm_v(l)%rho_c_window(:,m) = surface_params(irhoC,ip)7340 surf_usm_v(l)%rho_c_green(:,m) = surface_params(irhoC,ip)7341 !7342 !-- Thermal conductivity lambda H of the wall (W m-1 K-1 )7343 surf_usm_v(l)%lambda_h(:,m) = surface_params(ilambdah,ip)7344 surf_usm_v(l)%lambda_h_window(:,m) = surface_params(ilambdah,ip)7345 surf_usm_v(l)%lambda_h_green(:,m) = surface_params(ilambdah,ip)7346 7347 ENDDO7348 ENDDO7349 7350 !7351 !-- Initialize wall layer thicknesses. Please note, this will be removed after migration to Palm7352 !-- input data standard.7353 DO k = nzb_wall, nzt_wall7354 zwn(k) = zwn_default(k)7355 zwn_green(k) = zwn_default_green(k)7356 zwn_window(k) = zwn_default_window(k)7357 ENDDO7358 !7359 !-- Apply for all particular surface grids. First for horizontal surfaces7360 DO m = 1, surf_usm_h%ns7361 surf_usm_h%zw(:,m) = zwn(:) * surf_usm_h%thickness_wall(m)7362 surf_usm_h%zw_green(:,m) = zwn_green(:) * surf_usm_h%thickness_green(m)7363 surf_usm_h%zw_window(:,m) = zwn_window(:) * surf_usm_h%thickness_window(m)7364 ENDDO7365 DO l = 0, 37366 DO m = 1, surf_usm_v(l)%ns7367 surf_usm_v(l)%zw(:,m) = zwn(:) * surf_usm_v(l)%thickness_wall(m)7368 surf_usm_v(l)%zw_green(:,m) = zwn_green(:) * surf_usm_v(l)%thickness_green(m)7369 surf_usm_v(l)%zw_window(:,m) = zwn_window(:) * surf_usm_v(l)%thickness_window(m)7370 ENDDO7371 ENDDO7372 7373 IF ( debug_output ) CALL debug_message( 'usm_read_urban_surface_types', 'end' )7374 7375 END SUBROUTINE usm_read_urban_surface_types7376 7377 7378 !--------------------------------------------------------------------------------------------------!7379 ! Description:7380 ! ------------7381 !7382 !> This function advances through the list of local surfaces to find given x, y, d, z coordinates7383 !--------------------------------------------------------------------------------------------------!7384 PURE FUNCTION find_surface( x, y, z, d ) result(isurfl)7385 7386 INTEGER(iwp) :: isurfl !<7387 INTEGER(iwp) :: isx, isy, isz !<7388 INTEGER(iwp), INTENT(in) :: d, x, y, z !<7389 7390 IF ( d == 0 ) THEN7391 DO isurfl = 1, surf_usm_h%ns7392 isx = surf_usm_h%i(isurfl)7393 isy = surf_usm_h%j(isurfl)7394 isz = surf_usm_h%k(isurfl)7395 IF ( isx==x .AND. isy==y .AND. isz==z ) RETURN7396 ENDDO7397 ELSE7398 DO isurfl = 1, surf_usm_v(d-1)%ns7399 isx = surf_usm_v(d-1)%i(isurfl)7400 isy = surf_usm_v(d-1)%j(isurfl)7401 isz = surf_usm_v(d-1)%k(isurfl)7402 IF ( isx==x .AND. isy==y .AND. isz==z ) RETURN7403 ENDDO7404 ENDIF7405 !7406 !-- coordinate not found7407 isurfl = -17408 7409 END FUNCTION7410 7411 7412 !--------------------------------------------------------------------------------------------------!7413 ! Description:7414 ! ------------7415 !7416 !> This subroutine reads temperatures of respective material layers in walls, roofs and ground from7417 !> input files. Data in the input file must be in standard order, i.e. horizontal surfaces first7418 !> ordered by x, y and then vertical surfaces ordered by x, y, direction, z7419 !--------------------------------------------------------------------------------------------------!7420 SUBROUTINE usm_read_wall_temperature7421 7422 INTEGER(iwp) :: d, i, ii, iline, j, k !< running indices7423 INTEGER(iwp) :: isurfl !<7424 7425 REAL(wp) :: rtsurf !<7426 REAL(wp), DIMENSION(nzb_wall:nzt_wall+1) :: rtwall !<7427 7428 7429 IF ( debug_output ) CALL debug_message( 'usm_read_wall_temperature', 'start' )7430 7431 DO ii = 0, io_blocks-17432 IF ( ii == io_group ) THEN7433 !7434 !-- Open wall temperature file7435 OPEN( 152, file = 'WALL_TEMPERATURE' // coupling_char, action = 'read', &7436 status = 'old', form = 'formatted', err = 15 )7437 7438 isurfl = 07439 iline = 17440 DO7441 rtwall = -9999.0_wp !< For incomplete lines7442 READ( 152, *, err = 13, end = 14 ) i, j, k, d, rtsurf, rtwall7443 7444 IF ( nxl <= i .AND. i <= nxr .AND. nys <= j .AND. j <= nyn) THEN !< Local processor7445 !-- identify surface id7446 isurfl = find_surface( i, j, k, d )7447 IF ( isurfl == -1 ) THEN7448 WRITE( message_string, '(a,4i5,a,i5,a)' ) 'Coordinates (xyzd) ', i, j, k, &7449 d, ' on line ', iline, ' in file WALL_TEMPERATURE are either not ' // &7450 'present or out of standard order of surfaces.'7451 CALL message( 'usm_read_wall_temperature', 'PA0521', 1, 2, 0, 6, 0 )7452 ENDIF7453 !7454 !-- Assign temperatures7455 IF ( d == 0 ) THEN7456 t_surf_wall_h(isurfl) = rtsurf7457 t_wall_h(:,isurfl) = rtwall(:)7458 t_window_h(:,isurfl) = rtwall(:)7459 t_green_h(:,isurfl) = rtwall(:)7460 ELSE7461 t_surf_wall_v(d-1)%t(isurfl) = rtsurf7462 t_wall_v(d-1)%t(:,isurfl) = rtwall(:)7463 t_window_v(d-1)%t(:,isurfl) = rtwall(:)7464 t_green_v(d-1)%t(:,isurfl) = rtwall(:)7465 ENDIF7466 ENDIF7467 7468 iline = iline + 17469 CYCLE7470 13 WRITE( message_string, '(a,i5,a)' ) 'Error reading line ', iline, &7471 ' in file WALL_TEMPERATURE.'7472 CALL message( 'usm_read_wall_temperature', 'PA0522', 1, 2, 0, 6, 0 )7473 ENDDO7474 14 CLOSE( 152 )7475 CYCLE7476 15 message_string = 'file WALL_TEMPERATURE' // TRIM( coupling_char ) // ' does not exist'7477 CALL message( 'usm_read_wall_temperature', 'PA0523', 1, 2, 0, 6, 0 )7478 ENDIF7479 #if defined( __parallel )7480 CALL MPI_BARRIER( comm2d, ierr )7481 #endif7482 ENDDO7483 7484 IF ( debug_output ) CALL debug_message( 'usm_read_wall_temperature', 'end' )7485 7486 END SUBROUTINE usm_read_wall_temperature7487 7488 7489 6594 7490 6595 !--------------------------------------------------------------------------------------------------! … … 7496 6601 !> No calculation of window surface temperatures during spinup to increase maximum possible timstep 7497 6602 !--------------------------------------------------------------------------------------------------! 7498 SUBROUTINE usm_surface_energy_balance( during_spinup ) 6603 SUBROUTINE usm_energy_balance( during_spinup ) 6604 6605 LOGICAL :: during_spinup !< flag indicating soil/wall spinup phase 6606 INTEGER(iwp) :: l !< loop index for surface types 6607 ! 6608 !-- Call for horizontal surfaces 6609 DO l = 0, 1 6610 CALL usm_surface_energy_balance( .TRUE., l, during_spinup ) 6611 CALL usm_green_heat_model( .TRUE., l ) 6612 CALL usm_wall_heat_model( .TRUE., l, during_spinup ) 6613 ENDDO 6614 ! 6615 !-- Call for vertical surfaces 6616 DO l = 0, 3 6617 CALL usm_surface_energy_balance( .FALSE., l, during_spinup ) 6618 CALL usm_green_heat_model( .FALSE., l ) 6619 CALL usm_wall_heat_model( .FALSE., l, during_spinup ) 6620 ENDDO 6621 6622 END SUBROUTINE usm_energy_balance 6623 6624 !--------------------------------------------------------------------------------------------------! 6625 ! Description: 6626 ! ------------ 6627 !> Solver for the energy balance at the ground/roof/wall surface. It follows the basic ideas and 6628 !> structure of lsm_energy_balance with many simplifications and adjustments. 6629 !> TODO better description 6630 !> No calculation of window surface temperatures during spinup to increase maximum possible timstep 6631 !--------------------------------------------------------------------------------------------------! 6632 SUBROUTINE usm_surface_energy_balance( horizontal, l, during_spinup ) 7499 6633 7500 6634 USE exchange_horiz_mod, & … … 7504 6638 IMPLICIT NONE 7505 6639 7506 INTEGER(iwp) :: dhour !< simulated hour of day (in UTC) 7507 INTEGER(iwp) :: i, j, k, l, m !< running indices 7508 INTEGER(iwp) :: i_off !< offset to determine index of surface element, seen from atmospheric grid point, for x 7509 INTEGER(iwp) :: j_off !< offset to determine index of surface element, seen from atmospheric grid point, for y 7510 INTEGER(iwp) :: k_off !< offset to determine index of surface element, seen from atmospheric grid point, for z 7511 7512 LOGICAL :: during_spinup !< flag indicating soil/wall spinup phase 7513 7514 REAL(wp) :: acoef !< actual coefficient of diurnal profile of anthropogenic heat 6640 LOGICAL :: horizontal !< Flag indicating horizontal or vertical surfaces 6641 INTEGER(iwp) :: l !< direction index 6642 LOGICAL :: during_spinup !< flag indicating soil/wall spinup phase 6643 6644 INTEGER(iwp) :: i, j, k, m !< running indices 6645 INTEGER(iwp) :: i_off !< offset to determine index of surface element, seen from atmospheric grid point, for x 6646 INTEGER(iwp) :: j_off !< offset to determine index of surface element, seen from atmospheric grid point, for y 6647 INTEGER(iwp) :: k_off !< offset to determine index of surface element, seen from atmospheric grid point, for z 6648 6649 7515 6650 REAL(wp) :: coef_1 !< first coeficient for prognostic equation 7516 6651 REAL(wp) :: coef_window_1 !< first coeficient for prognostic window equation … … 7519 6654 REAL(wp) :: coef_window_2 !< second coeficient for prognostic window equation 7520 6655 REAL(wp) :: coef_green_2 !< second coeficient for prognostic green wall equation 7521 REAL(wp) :: dtime !< simulated time of day (in UTC)7522 6656 REAL(wp) :: frac_win !< window fraction, used to restore original values during spinup 7523 6657 REAL(wp) :: frac_green !< green fraction, used to restore original values during spinup … … 7557 6691 ueff !< limited near-surface wind speed - used for calculation of resistance 7558 6692 6693 TYPE(surf_type), POINTER :: surf !< surface-date type variable 6694 TYPE(surf_type_1d_usm), POINTER :: t_surf_green !< 6695 TYPE(surf_type_1d_usm), POINTER :: t_surf_green_p !< 6696 TYPE(surf_type_1d_usm), POINTER :: t_surf_wall !< 6697 TYPE(surf_type_1d_usm), POINTER :: t_surf_wall_p !< 6698 TYPE(surf_type_1d_usm), POINTER :: t_surf_window !< 6699 TYPE(surf_type_1d_usm), POINTER :: t_surf_window_p !< 6700 TYPE(surf_type_2d_usm), POINTER :: t_green !< 6701 TYPE(surf_type_2d_usm), POINTER :: t_wall !< 6702 TYPE(surf_type_2d_usm), POINTER :: t_window !< 6703 6704 LOGICAL :: upward !< Flag indicating upward horizontal surfaces 7559 6705 7560 6706 IF ( debug_output_timestep ) THEN 7561 WRITE( debug_string, * ) 'usm_surface_energy_balance | during_spinup: ', during_spinup6707 WRITE( debug_string, * ) 'usm_surface_energy_balance:', horizontal, l, during_spinup 7562 6708 CALL debug_message( debug_string, 'start' ) 7563 6709 ENDIF 6710 6711 upward = .FALSE. 6712 IF ( horizontal ) THEN 6713 surf => surf_usm_h(l) 6714 t_surf_wall => t_surf_wall_h(l) 6715 t_surf_wall_p => t_surf_wall_h_p(l) 6716 t_surf_window => t_surf_window_h(l) 6717 t_surf_window_p => t_surf_window_h_p(l) 6718 t_surf_green => t_surf_green_h(l) 6719 t_surf_green_p => t_surf_green_h_p(l) 6720 t_wall => t_wall_h(l) 6721 t_window => t_window_h(l) 6722 t_green => t_green_h(l) 6723 IF ( l == 0 ) upward = .TRUE. 6724 ELSE 6725 surf => surf_usm_v(l) 6726 t_surf_wall => t_surf_wall_v(l) 6727 t_surf_wall_p => t_surf_wall_v_p(l) 6728 t_surf_window => t_surf_window_v(l) 6729 t_surf_window_p => t_surf_window_v_p(l) 6730 t_surf_green => t_surf_green_v(l) 6731 t_surf_green_p => t_surf_green_v_p(l) 6732 t_wall => t_wall_v(l) 6733 t_window => t_window_v(l) 6734 t_green => t_green_v(l) 6735 ENDIF 7564 6736 ! 7565 6737 !-- Index offset of surface element point with respect to adjoining atmospheric grid point 7566 k_off = surf _usm_h%koff7567 j_off = surf _usm_h%joff7568 i_off = surf _usm_h%ioff6738 k_off = surf%koff 6739 j_off = surf%joff 6740 i_off = surf%ioff 7569 6741 7570 6742 ! … … 7577 6749 !$OMP& stend_window, stend_green, tend, m_liq_max) 7578 6750 !$OMP DO SCHEDULE (STATIC) 7579 DO m = 1, surf _usm_h%ns6751 DO m = 1, surf%ns 7580 6752 ! 7581 6753 !-- During spinup set green and window fraction to zero and restore at the end of the loop. 7582 6754 !-- Note, this is a temporary fix and needs to be removed later. 7583 6755 IF ( during_spinup ) THEN 7584 frac_win = surf _usm_h%frac(m,ind_wat_win)7585 frac_wall = surf _usm_h%frac(m,ind_veg_wall)7586 frac_green = surf _usm_h%frac(m,ind_pav_green)7587 surf _usm_h%frac(m,ind_wat_win) = 0.0_wp7588 surf _usm_h%frac(m,ind_veg_wall) = 1.0_wp7589 surf _usm_h%frac(m,ind_pav_green) = 0.0_wp6756 frac_win = surf%frac(m,ind_wat_win) 6757 frac_wall = surf%frac(m,ind_veg_wall) 6758 frac_green = surf%frac(m,ind_pav_green) 6759 surf%frac(m,ind_wat_win) = 0.0_wp 6760 surf%frac(m,ind_veg_wall) = 1.0_wp 6761 surf%frac(m,ind_pav_green) = 0.0_wp 7590 6762 ENDIF 7591 6763 ! 7592 6764 !-- Get indices of respective grid point 7593 i = surf _usm_h%i(m)7594 j = surf _usm_h%j(m)7595 k = surf _usm_h%k(m)6765 i = surf%i(m) 6766 j = surf%j(m) 6767 k = surf%k(m) 7596 6768 ! 7597 6769 !-- TODO - how to calculate lambda_surface for horizontal surfaces 7598 !-- (lambda_surface is set according to stratification in land surface model) 7599 !-- MS: ??? 7600 IF ( surf_usm_h%ol(m) >= 0.0_wp ) THEN 7601 lambda_surface = surf_usm_h%lambda_surf(m) 7602 lambda_surface_window = surf_usm_h%lambda_surf_window(m) 7603 lambda_surface_green = surf_usm_h%lambda_surf_green(m) 7604 ELSE 7605 lambda_surface = surf_usm_h%lambda_surf(m) 7606 lambda_surface_window = surf_usm_h%lambda_surf_window(m) 7607 lambda_surface_green = surf_usm_h%lambda_surf_green(m) 7608 ENDIF 7609 7610 ! pt1 = pt(k,j,i) 6770 !-- (lambda_surface shoud be set according to stratification in land surface model) 6771 lambda_surface = surf%lambda_surf(m) 6772 lambda_surface_window = surf%lambda_surf_window(m) 6773 lambda_surface_green = surf%lambda_surf_green(m) 6774 7611 6775 IF ( humidity ) THEN 7612 6776 qv1 = q(k,j,i) … … 7616 6780 ! 7617 6781 !-- Calculate rho * c_p coefficient at surface layer 7618 rho_cp = c_p * hyp(k) / ( r_d * surf _usm_h%pt1(m) * exner(k) )7619 7620 IF ( surf _usm_h%frac(m,ind_pav_green) > 0.0_wp ) THEN6782 rho_cp = c_p * hyp(k) / ( r_d * surf%pt1(m) * exner(k) ) 6783 6784 IF ( surf%frac(m,ind_pav_green) > 0.0_wp ) THEN 7621 6785 ! 7622 6786 !-- Calculate frequently used parameters … … 7627 6791 ! 7628 6792 !-- Calculate aerodyamic resistance. 7629 !-- Calculation for horizontal surfaces follows LSM formulation pt, us, ts are not available for 7630 !-- the prognostic time step, data from the last time step is used here. 7631 ! 7632 !-- Workaround: use single r_a as stability is only treated for the average temperature 7633 surf_usm_h%r_a(m) = ( surf_usm_h%pt1(m) - surf_usm_h%pt_surface(m) ) / & 7634 ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp ) 7635 surf_usm_h%r_a_window(m) = surf_usm_h%r_a(m) 7636 surf_usm_h%r_a_green(m) = surf_usm_h%r_a(m) 7637 7638 ! r_a = ( surf_usm_h%pt1(m) - t_surf_h(m) / exner(k) ) / & 7639 ! ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp ) 7640 ! r_a_window = ( surf_usm_h%pt1(m) - t_surf_window_h(m) / exner(k) ) / & 7641 ! ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp ) 7642 ! r_a_green = ( surf_usm_h%pt1(m) - t_surf_green_h(m) / exner(k) ) / & 7643 ! ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp ) 6793 IF ( upward ) THEN 6794 !-- Calculation for horizontal upward facing surfaces follows LSM formulation 6795 !-- pt, us, ts are not available for the prognostic time step, data from the 6796 !-- last time step is used here. 6797 !-- Workaround: use single r_a as stability is only treated for the average temperature 6798 surf%r_a(m) = ( surf%pt1(m) - surf%pt_surface(m) ) / & 6799 ( surf%ts(m) * surf%us(m) + 1.0E-20_wp ) 6800 ELSE 6801 !-- Calculation of r_a for vertical and downward facing horizontal surfaces 6802 !-- 6803 !-- Heat transfer coefficient for forced convection along vertical walls follows formulation 6804 !-- in TUF3d model (Krayenhoff & Voogt, 2006) 6805 !-- 6806 !-- H = httc (Tsfc - Tair) 6807 !-- httc = rw * (11.8 + 4.2 * Ueff) - 4.0 6808 !-- 6809 !-- rw: Wall patch roughness relative to 1.0 for concrete 6810 !-- Ueff: Effective wind speed 6811 !-- - 4.0 is a reduction of Rowley et al (1930) formulation based on 6812 !-- Cole and Sturrock (1977) 6813 !-- 6814 !-- Ucan: Canyon wind speed 6815 !-- wstar: Convective velocity 6816 !-- Qs: Surface heat flux 6817 !-- zH: Height of the convective layer 6818 !-- wstar = (g/Tcan*Qs*zH)**(1./3.) 6819 !-- Effective velocity components must always be defined at scalar grid point. The wall 6820 !-- normal component is obtained by simple linear interpolation. (An alternative would be an 6821 !-- logarithmic interpolation.) Parameter roughness_concrete (default value = 0.001) is used 6822 !-- to calculation of roughness relative to concrete. Note, wind velocity is limited 6823 !-- to avoid division by zero. The nominator can become <= 0.0 for values z0 < 3*10E-4. 6824 ueff = MAX ( SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 + & 6825 ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 + & 6826 ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 ), & 6827 ( ( 4.0_wp + 0.1_wp ) & 6828 / ( surf%z0(m) * d_roughness_concrete ) & 6829 - 11.8_wp ) / 4.2_wp & 6830 ) 6831 6832 surf%r_a(m) = rho_cp / ( surf%z0(m) * d_roughness_concrete & 6833 * ( 11.8_wp + 4.2_wp * ueff ) - 4.0_wp ) 6834 ENDIF 7644 6835 7645 6836 !-- Make sure that the resistance does not drop to zero 7646 IF ( surf_usm_h%r_a(m) < 1.0_wp ) surf_usm_h%r_a(m) = 1.0_wp 7647 IF ( surf_usm_h%r_a_green(m) < 1.0_wp ) surf_usm_h%r_a_green(m) = 1.0_wp 7648 IF ( surf_usm_h%r_a_window(m) < 1.0_wp ) surf_usm_h%r_a_window(m) = 1.0_wp 7649 7650 ! 7651 !-- Make sure that the resistacne does not exceed a maxmium value in case of zero velocities 7652 IF ( surf_usm_h%r_a(m) > 300.0_wp ) surf_usm_h%r_a(m) = 300.0_wp 7653 IF ( surf_usm_h%r_a_green(m) > 300.0_wp ) surf_usm_h%r_a_green(m) = 300.0_wp 7654 IF ( surf_usm_h%r_a_window(m) > 300.0_wp ) surf_usm_h%r_a_window(m) = 300.0_wp 7655 6837 !-- end does not exceed a maxmium value in case of zero velocities 6838 IF ( surf%r_a(m) < 1.0_wp ) surf%r_a(m) = 1.0_wp 6839 IF ( surf%r_a(m) > 300.0_wp ) surf%r_a(m) = 300.0_wp 6840 ! 6841 !-- Aeorodynamical resistance for the window and green fractions are set to the same value 6842 surf%r_a_window(m) = surf%r_a(m) 6843 surf%r_a_green(m) = surf%r_a(m) 7656 6844 ! 7657 6845 !-- Factor for shf_eb 7658 f_shf = rho_cp / surf _usm_h%r_a(m)7659 f_shf_window = rho_cp / surf _usm_h%r_a_window(m)7660 f_shf_green = rho_cp / surf _usm_h%r_a_green(m)7661 7662 7663 IF ( surf_usm_h%frac(m,ind_pav_green) > 0.0_wp ) THEN 6846 f_shf = rho_cp / surf%r_a(m) 6847 f_shf_window = rho_cp / surf%r_a_window(m) 6848 f_shf_green = rho_cp / surf%r_a_green(m) 6849 6850 IF ( surf%frac(m,ind_pav_green) > 0.0_wp ) THEN 6851 ! 7664 6852 !-- Adapted from LSM: 7665 !-- Second step: calculate canopy resistance r_canopy f1-f3 here are defined as 1/f1-f3 as in7666 !-- ECMWF documentation6853 !-- Second step: calculate canopy resistance r_canopy. f1-f3 here are defined as 1/f1-f3 6854 !-- as in ECMWF documentation 7667 6855 7668 6856 !-- f1: Correction for incoming shortwave radiation (stomata close at night) 7669 f1 = MIN( 1.0_wp, ( 0.004_wp * surf _usm_h%rad_sw_in(m) + 0.05_wp ) / &7670 (0.81_wp * ( 0.004_wp * surf _usm_h%rad_sw_in(m) + 1.0_wp ) ) )6857 f1 = MIN( 1.0_wp, ( 0.004_wp * surf%rad_sw_in(m) + 0.05_wp ) / & 6858 (0.81_wp * ( 0.004_wp * surf%rad_sw_in(m) + 1.0_wp ) ) ) 7671 6859 ! 7672 6860 !-- f2: Correction for soil moisture availability to plants (the integrated soil moisture must 7673 6861 !-- thus be considered here) f2 = 0 for very dry soils 7674 m_total = 0.0_wp 7675 DO k = nzb_wall, nzt_wall+1 7676 m_total = m_total + rootfr_h(nzb_wall,m) * MAX( swc_h(nzb_wall,m),wilt_h(nzb_wall,m) ) 7677 ENDDO 7678 7679 IF ( m_total > wilt_h(nzb_wall,m) .AND. m_total < fc_h(nzb_wall,m) ) THEN 7680 f2 = ( m_total - wilt_h(nzb_wall,m) ) / (fc_h(nzb_wall,m) - wilt_h(nzb_wall,m) ) 7681 ELSEIF ( m_total >= fc_h(nzb_wall,m) ) THEN 7682 f2 = 1.0_wp 6862 IF ( upward ) THEN 6863 m_total = 0.0_wp 6864 DO k = nzb_wall, nzt_wall+1 6865 m_total = m_total + rootfr_h(l)%val(nzb_wall,m) & 6866 * MAX( swc_h(l)%val(nzb_wall,m),wilt_h(l)%val(nzb_wall,m) ) 6867 ENDDO 6868 6869 IF ( m_total > wilt_h(l)%val(nzb_wall,m) .AND. m_total < fc_h(l)%val(nzb_wall,m) ) THEN 6870 f2 = ( m_total - wilt_h(l)%val(nzb_wall,m) ) / (fc_h(l)%val(nzb_wall,m) - wilt_h(l)%val(nzb_wall,m) ) 6871 ELSEIF ( m_total >= fc_h(l)%val(nzb_wall,m) ) THEN 6872 f2 = 1.0_wp 6873 ELSE 6874 f2 = 1.0E-20_wp 6875 ENDIF 7683 6876 ELSE 7684 f2 = 1.0E-20_wp 7685 ENDIF 7686 6877 f2=1.0_wp 6878 ENDIF 7687 6879 ! 7688 6880 !-- Calculate water vapour pressure at saturation 7689 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surf_green_h(m) - 273.16_wp ) & 7690 / ( t_surf_green_h(m) - 35.86_wp ) ) 6881 e_s = 0.01_wp * magnus_tl( t_surf_green%val(m) ) 7691 6882 ! 7692 6883 !-- f3: Correction for vapour pressure deficit 7693 IF ( surf_usm_h%g_d(m) /= 0.0_wp ) THEN 7694 ! 7695 !-- Calculate vapour pressure 6884 IF ( surf%g_d(m) /= 0.0_wp ) THEN 6885 !-- Calculate vapour pressure 7696 6886 e = qv1 * surface_pressure / ( qv1 + 0.622_wp ) 7697 f3 = EXP ( - surf _usm_h%g_d(m) * (e_s - e) )6887 f3 = EXP ( - surf%g_d(m) * (e_s - e) ) 7698 6888 ELSE 7699 6889 f3 = 1.0_wp 7700 6890 ENDIF 7701 7702 6891 ! 7703 6892 !-- Calculate canopy resistance. In case that c_veg is 0 (bare soils), this calculation is 7704 6893 !-- obsolete, as r_canopy is not used below. 7705 6894 !-- To do: check for very dry soil -> r_canopy goes to infinity 7706 surf_usm_h%r_canopy(m) = surf_usm_h%r_canopy_min(m) / & 7707 ( surf_usm_h%lai(m) * f1 * f2 * f3 + 1.0E-20_wp ) 7708 7709 ! 7710 !-- Calculate the maximum possible liquid water amount on plants and bare surface. For 7711 !-- vegetated surfaces, a maximum depth of 0.2 mm is assumed, while paved surfaces might hold 7712 !-- up 1 mm of water. The liquid water fraction for paved surfaces is calculated after 7713 !-- Noilhan & Planton (1989), while the ECMWF formulation is used for vegetated surfaces and 7714 !-- bare soils. 7715 m_liq_max = m_max_depth * ( surf_usm_h%lai(m) ) 7716 7717 surf_usm_h%c_liq(m) = MIN( 1.0_wp, ( m_liq_usm_h%var_usm_1d(m) / m_liq_max )**0.67 ) 6895 surf%r_canopy(m) = surf%r_canopy_min(m) / & 6896 ( surf%lai(m) * f1 * f2 * f3 + 1.0E-20_wp ) 7718 6897 ! 7719 6898 !-- Calculate saturation specific humidity … … 7723 6902 !-- All super-saturated water is then removed from the air 7724 6903 IF ( humidity .AND. q_s <= qv1 ) THEN 7725 surf_usm_h%r_canopy(m) = 0.0_wp 7726 ENDIF 7727 7728 ! 7729 !-- Calculate coefficients for the total evapotranspiration 7730 !-- In case of water surface, set vegetation and soil fluxes to zero. 7731 !-- For pavements, only evaporation of liquid water is possible. 7732 f_qsws_veg = rho_lv * ( 1.0_wp - surf_usm_h%c_liq(m) ) / & 7733 ( surf_usm_h%r_a_green(m) + surf_usm_h%r_canopy(m) ) 7734 f_qsws_liq = rho_lv * surf_usm_h%c_liq(m) / surf_usm_h%r_a_green(m) 7735 7736 f_qsws = f_qsws_veg + f_qsws_liq 6904 surf%r_canopy(m) = 0.0_wp 6905 ENDIF 6906 6907 IF ( upward ) THEN 6908 !-- Calculate the maximum possible liquid water amount on plants and bare surface. For 6909 !-- vegetated surfaces, a maximum depth of 0.2 mm is assumed, while paved surfaces might hold 6910 !-- up 1 mm of water. The liquid water fraction for paved surfaces is calculated after 6911 !-- Noilhan & Planton (1989), while the ECMWF formulation is used for vegetated surfaces and 6912 !-- bare soils. 6913 m_liq_max = m_max_depth * ( surf%lai(m) ) 6914 surf%c_liq(m) = MIN( 1.0_wp, ( m_liq_usm_h(l)%val(m) / m_liq_max )**0.67 ) 6915 6916 ! 6917 !-- Calculate coefficients for the total evapotranspiration 6918 !-- In case of water surface, set vegetation and soil fluxes to zero. 6919 !-- For pavements, only evaporation of liquid water is possible. 6920 f_qsws_veg = rho_lv * ( 1.0_wp - surf%c_liq(m) ) / & 6921 ( surf%r_a_green(m) + surf%r_canopy(m) ) 6922 f_qsws_liq = rho_lv * surf%c_liq(m) / surf%r_a_green(m) 6923 f_qsws = f_qsws_veg + f_qsws_liq 6924 ELSE 6925 f_qsws_veg = rho_lv * ( 1.0_wp - 0.0_wp ) / & !surf%c_liq(m) ) / & 6926 ( surf%r_a_green(m) + surf%r_canopy(m) ) 6927 f_qsws_liq = 0._wp ! rho_lv * surf%c_liq(m) / surf%r_a_green(m) 6928 f_qsws = f_qsws_veg + f_qsws_liq 6929 ENDIF 7737 6930 ! 7738 6931 !-- Calculate derivative of q_s for Taylor series expansion 7739 e_s_dt = e_s * ( 17.269_wp / ( t_surf_green _h(m) - 35.86_wp ) - 17.269_wp&7740 * ( t_surf_green _h(m) - 273.16_wp ) / ( t_surf_green_h(m) - 35.86_wp )**2 )7741 6932 e_s_dt = e_s * ( 17.269_wp / ( t_surf_green%val(m) - 35.86_wp ) - 17.269_wp & 6933 * ( t_surf_green%val(m) - degc_to_k ) & 6934 / ( t_surf_green%val(m) - 35.86_wp )**2 ) 7742 6935 dq_s_dt = 0.622_wp * e_s_dt / ( surface_pressure - e_s_dt ) 7743 6936 ENDIF 7744 6937 ! 7745 6938 !-- Add LW up so that it can be removed in prognostic equation 7746 surf _usm_h%rad_net_l(m) = surf_usm_h%rad_sw_in(m) - surf_usm_h%rad_sw_out(m) +&7747 surf_usm_h%rad_lw_in(m) - surf_usm_h%rad_lw_out(m)6939 surf%rad_net_l(m) = surf%rad_sw_in(m) - surf%rad_sw_out(m) + & 6940 surf%rad_lw_in(m) - surf%rad_lw_out(m) 7748 6941 ! 7749 6942 !-- Numerator of the prognostic equation 7750 6943 !-- Todo: Adjust to tile approach. So far, emissivity for wall (element 0) is used 7751 coef_1 = surf_usm_h%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 7752 * surf_usm_h%emissivity(m,ind_veg_wall) * sigma_sb * t_surf_wall_h(m)**4 & 7753 + f_shf * surf_usm_h%pt1(m) + lambda_surface * t_wall_h(nzb_wall,m) 7754 7755 IF ( ( .NOT. during_spinup ) .AND. (surf_usm_h%frac(m,ind_wat_win) > 0.0_wp ) ) THEN 7756 coef_window_1 = surf_usm_h%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 7757 * surf_usm_h%emissivity(m,ind_wat_win) * sigma_sb & 7758 * t_surf_window_h(m)**4 + f_shf_window * surf_usm_h%pt1(m) & 7759 + lambda_surface_window * t_window_h(nzb_wall,m) 6944 !-- Rem: Coef +1 corresponds to -lwout included in calculation of radnet_l 6945 coef_1 = surf%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 6946 * surf%emissivity(m,ind_veg_wall) * sigma_sb * t_surf_wall%val(m)**4 & 6947 + f_shf * surf%pt1(m) + lambda_surface * t_wall%val(nzb_wall,m) 6948 6949 IF ( ( .NOT. during_spinup ) .AND. (surf%frac(m,ind_wat_win) > 0.0_wp ) ) THEN 6950 coef_window_1 = surf%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 6951 * surf%emissivity(m,ind_wat_win) * sigma_sb & 6952 * t_surf_window%val(m)**4 + f_shf_window * surf%pt1(m) & 6953 + lambda_surface_window * t_window%val(nzb_wall,m) 7760 6954 ENDIF 7761 IF ( ( humidity ) .AND. ( surf _usm_h%frac(m,ind_pav_green) > 0.0_wp ) ) THEN7762 coef_green_1 = surf_usm_h%rad_net_l(m) + ( 3.0_wp + 1.0_wp )&7763 * surf_usm_h%emissivity(m,ind_pav_green) * sigma_sb&7764 * t_surf_green_h(m)**4 + f_shf_green * surf_usm_h%pt1(m)&7765 + f_qsws * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m) )&7766 + lambda_surface_green * t_green_h(nzb_wall,m)6955 IF ( ( humidity ) .AND. ( surf%frac(m,ind_pav_green) > 0.0_wp ) ) THEN 6956 coef_green_1 = surf%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 6957 * surf%emissivity(m,ind_pav_green) * sigma_sb & 6958 * t_surf_green%val(m)**4 + f_shf_green * surf%pt1(m) & 6959 + f_qsws * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) ) & 6960 + lambda_surface_green * t_green%val(nzb_wall,m) 7767 6961 ELSE 7768 coef_green_1 = surf_usm_h%rad_net_l(m) + ( 3.0_wp + 1.0_wp )&7769 * surf_usm_h%emissivity(m,ind_pav_green) * sigma_sb * t_surf_green_h(m)**4 &7770 + f_shf_green * surf_usm_h%pt1(m) + lambda_surface_green&7771 * t_green_h(nzb_wall,m)6962 coef_green_1 = surf%rad_net_l(m) + ( 3.0_wp + 1.0_wp ) & 6963 * surf%emissivity(m,ind_pav_green) * sigma_sb * t_surf_green%val(m)**4 & 6964 + f_shf_green * surf%pt1(m) + lambda_surface_green & 6965 * t_green%val(nzb_wall,m) 7772 6966 ENDIF 7773 6967 ! 7774 6968 !-- Denominator of the prognostic equation 7775 coef_2 = 4.0_wp * surf _usm_h%emissivity(m,ind_veg_wall) * sigma_sb * t_surf_wall_h(m)**3&6969 coef_2 = 4.0_wp * surf%emissivity(m,ind_veg_wall) * sigma_sb * t_surf_wall%val(m)**3 & 7776 6970 + lambda_surface + f_shf / exner(k) 7777 IF ( ( .NOT. during_spinup ) .AND. ( surf _usm_h%frac(m,ind_wat_win) > 0.0_wp ) ) THEN7778 coef_window_2 = 4.0_wp * surf _usm_h%emissivity(m,ind_wat_win) * sigma_sb *&7779 t_surf_window _h(m)**3 + lambda_surface_window + f_shf_window / exner(k)6971 IF ( ( .NOT. during_spinup ) .AND. ( surf%frac(m,ind_wat_win) > 0.0_wp ) ) THEN 6972 coef_window_2 = 4.0_wp * surf%emissivity(m,ind_wat_win) * sigma_sb * & 6973 t_surf_window%val(m)**3 + lambda_surface_window + f_shf_window / exner(k) 7780 6974 ENDIF 7781 IF ( ( humidity ) .AND. ( surf _usm_h%frac(m,ind_pav_green) > 0.0_wp ) ) THEN7782 coef_green_2 = 4.0_wp * surf _usm_h%emissivity(m,ind_pav_green) * sigma_sb *&7783 t_surf_green _h(m)**3 + f_qsws * dq_s_dt + lambda_surface_green&6975 IF ( ( humidity ) .AND. ( surf%frac(m,ind_pav_green) > 0.0_wp ) ) THEN 6976 coef_green_2 = 4.0_wp * surf%emissivity(m,ind_pav_green) * sigma_sb * & 6977 t_surf_green%val(m)**3 + f_qsws * dq_s_dt + lambda_surface_green & 7784 6978 + f_shf_green / exner(k) 7785 6979 ELSE 7786 coef_green_2 = 4.0_wp * surf_usm_h%emissivity(m,ind_pav_green) * sigma_sb&7787 * t_surf_green_h(m)**3 + lambda_surface_green + f_shf_green / exner(k)6980 coef_green_2 = 4.0_wp * surf%emissivity(m,ind_pav_green) * sigma_sb & 6981 * t_surf_green%val(m)**3 + lambda_surface_green + f_shf_green / exner(k) 7788 6982 ENDIF 7789 6983 ! 7790 6984 !-- Implicit solution when the surface layer has no heat capacity, otherwise use RK3 scheme. 7791 t_surf_wall_ h_p(m) = ( coef_1 * dt_3d * tsc(2) + surf_usm_h%c_surface(m)&7792 * t_surf_wall_h(m) )&7793 / ( surf _usm_h%c_surface(m) + coef_2 * dt_3d * tsc(2) )7794 IF ( ( .NOT. during_spinup ) .AND. (surf _usm_h%frac(m,ind_wat_win) > 0.0_wp) ) THEN7795 t_surf_window_ h_p(m) = ( coef_window_1 * dt_3d * tsc(2) + surf_usm_h%c_surface_window(m)&7796 * t_surf_window_h(m) ) /&7797 ( surf_usm_h%c_surface_window(m) + coef_window_2 * dt_3d * tsc(2) )6985 t_surf_wall_p%val(m) = ( coef_1 * dt_3d * tsc(2) + surf%c_surface(m) & 6986 * t_surf_wall%val(m) ) & 6987 / ( surf%c_surface(m) + coef_2 * dt_3d * tsc(2) ) 6988 IF ( ( .NOT. during_spinup ) .AND. (surf%frac(m,ind_wat_win) > 0.0_wp) ) THEN 6989 t_surf_window_p%val(m) = ( coef_window_1 * dt_3d * tsc(2) + & 6990 surf%c_surface_window(m) * t_surf_window%val(m) ) / & 6991 ( surf%c_surface_window(m) + coef_window_2 * dt_3d * tsc(2) ) 7798 6992 ENDIF 7799 t_surf_green_ h_p(m) = ( coef_green_1 * dt_3d * tsc(2) + surf_usm_h%c_surface_green(m)&7800 * t_surf_green_h(m) )&7801 / ( surf_usm_h%c_surface_green(m) + coef_green_2 * dt_3d * tsc(2) )6993 t_surf_green_p%val(m) = ( coef_green_1 * dt_3d * tsc(2) + & 6994 surf%c_surface_green(m) * t_surf_green%val(m) ) & 6995 / ( surf%c_surface_green(m) + coef_green_2 * dt_3d * tsc(2) ) 7802 6996 ! 7803 6997 !-- Add RK3 term 7804 t_surf_wall_ h_p(m) = t_surf_wall_h_p(m) + dt_3d * tsc(3) * surf_usm_h%tt_surface_wall_m(m)7805 7806 t_surf_window_ h_p(m) = t_surf_window_h_p(m) + dt_3d * tsc(3) *&7807 surf _usm_h%tt_surface_window_m(m)7808 7809 t_surf_green_h_p(m) = t_surf_green_h_p(m) + dt_3d * tsc(3) * surf_usm_h%tt_surface_green_m(m)6998 t_surf_wall_p%val(m) = t_surf_wall_p%val(m) + dt_3d * tsc(3) * & 6999 surf%tt_surface_wall_m(m) 7000 t_surf_window_p%val(m) = t_surf_window_p%val(m) + dt_3d * tsc(3) * & 7001 surf%tt_surface_window_m(m) 7002 t_surf_green_p%val(m) = t_surf_green_p%val(m) + dt_3d * tsc(3) * & 7003 surf%tt_surface_green_m(m) 7810 7004 ! 7811 7005 !-- Store surface temperature on pt_surface. Further, in case humidity is used, store also 7812 7006 !-- vpt_surface, which is, due to the lack of moisture on roofs, simply assumed to be the surface 7813 7007 !-- temperature. 7814 surf _usm_h%pt_surface(m) = ( surf_usm_h%frac(m,ind_veg_wall) * t_surf_wall_h_p(m)&7815 + surf_usm_h%frac(m,ind_wat_win) * t_surf_window_h_p(m)&7816 + surf_usm_h%frac(m,ind_pav_green) * t_surf_green_h_p(m)&7817 7818 7819 IF ( humidity ) surf _usm_h%vpt_surface(m) = surf_usm_h%pt_surface(m)7008 surf%pt_surface(m) = ( surf%frac(m,ind_veg_wall) * t_surf_wall_p%val(m) & 7009 + surf%frac(m,ind_wat_win) * t_surf_window_p%val(m) & 7010 + surf%frac(m,ind_pav_green) * t_surf_green_p%val(m) & 7011 ) / exner(k) 7012 7013 IF ( humidity ) surf%vpt_surface(m) = surf%pt_surface(m) 7820 7014 ! 7821 7015 !-- Calculate true tendency 7822 stend_wall = ( t_surf_wall_ h_p(m) - t_surf_wall_h(m) - dt_3d * tsc(3) *&7823 surf _usm_h%tt_surface_wall_m(m) ) / ( dt_3d * tsc(2) )7824 stend_window = ( t_surf_window_ h_p(m) - t_surf_window_h(m) - dt_3d * tsc(3) *&7825 surf _usm_h%tt_surface_window_m(m) ) / ( dt_3d * tsc(2) )7826 stend_green = ( t_surf_green_ h_p(m) - t_surf_green_h(m) - dt_3d * tsc(3) *&7827 surf _usm_h%tt_surface_green_m(m) ) / ( dt_3d * tsc(2) )7016 stend_wall = ( t_surf_wall_p%val(m) - t_surf_wall%val(m) - dt_3d * tsc(3) * & 7017 surf%tt_surface_wall_m(m) ) / ( dt_3d * tsc(2) ) 7018 stend_window = ( t_surf_window_p%val(m) - t_surf_window%val(m) - dt_3d * tsc(3) * & 7019 surf%tt_surface_window_m(m) ) / ( dt_3d * tsc(2) ) 7020 stend_green = ( t_surf_green_p%val(m) - t_surf_green%val(m) - dt_3d * tsc(3) * & 7021 surf%tt_surface_green_m(m) ) / ( dt_3d * tsc(2) ) 7828 7022 ! 7829 7023 !-- Calculate t_surf tendencies for the next Runge-Kutta step 7830 7024 IF ( timestep_scheme(1:5) == 'runge' ) THEN 7831 7025 IF ( intermediate_timestep_count == 1 ) THEN 7832 surf _usm_h%tt_surface_wall_m(m) = stend_wall7833 surf _usm_h%tt_surface_window_m(m) = stend_window7834 surf _usm_h%tt_surface_green_m(m) = stend_green7026 surf%tt_surface_wall_m(m) = stend_wall 7027 surf%tt_surface_window_m(m) = stend_window 7028 surf%tt_surface_green_m(m) = stend_green 7835 7029 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 7836 surf _usm_h%tt_surface_wall_m(m) = -9.5625_wp * stend_wall +&7837 5.3125_wp * surf _usm_h%tt_surface_wall_m(m)7838 surf _usm_h%tt_surface_window_m(m) = -9.5625_wp * stend_window +&7839 5.3125_wp * surf _usm_h%tt_surface_window_m(m)7840 surf _usm_h%tt_surface_green_m(m) = -9.5625_wp * stend_green +&7841 5.3125_wp * surf _usm_h%tt_surface_green_m(m)7030 surf%tt_surface_wall_m(m) = -9.5625_wp * stend_wall + & 7031 5.3125_wp * surf%tt_surface_wall_m(m) 7032 surf%tt_surface_window_m(m) = -9.5625_wp * stend_window + & 7033 5.3125_wp * surf%tt_surface_window_m(m) 7034 surf%tt_surface_green_m(m) = -9.5625_wp * stend_green + & 7035 5.3125_wp * surf%tt_surface_green_m(m) 7842 7036 ENDIF 7843 7037 ENDIF … … 7845 7039 !-- In case of fast changes in the skin temperature, it is required to update the radiative 7846 7040 !-- fluxes in order to keep the solution stable 7847 IF ( ( ( ABS( t_surf_wall_ h_p(m) - t_surf_wall_h(m) ) > 1.0_wp ) .OR.&7848 ( ABS( t_surf_green_ h_p(m) - t_surf_green_h(m) ) > 1.0_wp ) .OR.&7849 ( ABS( t_surf_window_ h_p(m) - t_surf_window_h(m) ) > 1.0_wp ) )&7041 IF ( ( ( ABS( t_surf_wall_p%val(m) - t_surf_wall%val(m) ) > 1.0_wp ) .OR. & 7042 ( ABS( t_surf_green_p%val(m) - t_surf_green%val(m) ) > 1.0_wp ) .OR. & 7043 ( ABS( t_surf_window_p%val(m) - t_surf_window%val(m) ) > 1.0_wp ) ) & 7850 7044 .AND. unscheduled_radiation_calls ) THEN 7851 7045 force_radiation_call_l = .TRUE. 7852 7046 ENDIF 7853 7047 ! 7854 !-- Calculate fluxes7048 !-- Calculate new fluxes 7855 7049 !-- Rad_net_l is never used! 7856 surf _usm_h%rad_net_l(m) = surf_usm_h%rad_net_l(m) + surf_usm_h%frac(m,ind_veg_wall)&7857 * sigma_sb * surf _usm_h%emissivity(m,ind_veg_wall)&7858 * ( t_surf_wall_ h_p(m)**4 - t_surf_wall_h(m)**4 )&7859 + surf _usm_h%frac(m,ind_wat_win) * sigma_sb&7860 * surf _usm_h%emissivity(m,ind_wat_win)&7861 * ( t_surf_window_ h_p(m)**4 - t_surf_window_h(m)**4 )&7862 + surf _usm_h%frac(m,ind_pav_green) * sigma_sb&7863 * surf _usm_h%emissivity(m,ind_pav_green)&7864 * ( t_surf_green_ h_p(m)**4 - t_surf_green_h(m)**4 )7865 7866 surf _usm_h%wghf_eb(m) = lambda_surface * ( t_surf_wall_h_p(m) - t_wall_h(nzb_wall,m) )7867 surf _usm_h%wghf_eb_green(m) = lambda_surface_green&7868 * ( t_surf_green_ h_p(m) - t_green_h(nzb_wall,m) )7869 surf _usm_h%wghf_eb_window(m) = lambda_surface_window&7870 * ( t_surf_window_ h_p(m) - t_window_h(nzb_wall,m) )7050 surf%rad_net_l(m) = surf%rad_net_l(m) + surf%frac(m,ind_veg_wall) & 7051 * sigma_sb * surf%emissivity(m,ind_veg_wall) & 7052 * ( t_surf_wall_p%val(m)**4 - t_surf_wall%val(m)**4 ) & 7053 + surf%frac(m,ind_wat_win) * sigma_sb & 7054 * surf%emissivity(m,ind_wat_win) & 7055 * ( t_surf_window_p%val(m)**4 - t_surf_window%val(m)**4 ) & 7056 + surf%frac(m,ind_pav_green) * sigma_sb & 7057 * surf%emissivity(m,ind_pav_green) & 7058 * ( t_surf_green_p%val(m)**4 - t_surf_green%val(m)**4 ) 7059 7060 surf%wghf_eb(m) = lambda_surface * ( t_surf_wall_p%val(m) - t_wall%val(nzb_wall,m) ) 7061 surf%wghf_eb_green(m) = lambda_surface_green & 7062 * ( t_surf_green_p%val(m) - t_green%val(nzb_wall,m) ) 7063 surf%wghf_eb_window(m) = lambda_surface_window & 7064 * ( t_surf_window_p%val(m) - t_window%val(nzb_wall,m) ) 7871 7065 7872 7066 ! 7873 7067 !-- Ground/wall/roof surface heat flux 7874 surf _usm_h%wshf_eb(m) = - f_shf * ( surf_usm_h%pt1(m) - t_surf_wall_h_p(m) / exner(k) )&7875 * surf _usm_h%frac(m,ind_veg_wall) - f_shf_window&7876 * ( surf _usm_h%pt1(m) - t_surf_window_h_p(m) / exner(k) )&7877 * surf _usm_h%frac(m,ind_wat_win) - f_shf_green&7878 * ( surf _usm_h%pt1(m) - t_surf_green_h_p(m) / exner(k) )&7879 * surf _usm_h%frac(m,ind_pav_green)7068 surf%wshf_eb(m) = - f_shf * ( surf%pt1(m) - t_surf_wall_p%val(m) / exner(k) ) & 7069 * surf%frac(m,ind_veg_wall) - f_shf_window & 7070 * ( surf%pt1(m) - t_surf_window_p%val(m) / exner(k) ) & 7071 * surf%frac(m,ind_wat_win) - f_shf_green & 7072 * ( surf%pt1(m) - t_surf_green_p%val(m) / exner(k) ) & 7073 * surf%frac(m,ind_pav_green) 7880 7074 ! 7881 7075 !-- Store kinematic surface heat fluxes for utilization in other processes diffusion_s, 7882 7076 !-- surface_layer_fluxes,... 7883 surf _usm_h%shf(m) = surf_usm_h%wshf_eb(m) / c_p7077 surf%shf(m) = surf%wshf_eb(m) / c_p 7884 7078 ! 7885 7079 !-- If the indoor model is applied, further add waste heat from buildings to the kinematic flux. 7886 7080 IF ( indoor_model ) THEN 7887 surf _usm_h%shf(m) = surf_usm_h%shf(m) + surf_usm_h%waste_heat(m) / c_p7081 surf%shf(m) = surf%shf(m) + surf%waste_heat(m) / c_p 7888 7082 ENDIF 7889 7083 7890 7891 IF (surf_usm_h%frac(m,ind_pav_green) > 0.0_wp) THEN 7892 7893 7894 IF ( humidity ) THEN 7895 surf_usm_h%qsws(m) = - f_qsws * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m) - dq_s_dt & 7896 * t_surf_green_h_p(m) ) 7897 7898 surf_usm_h%qsws_veg(m) = - f_qsws_veg * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m) & 7899 - dq_s_dt * t_surf_green_h_p(m) ) 7900 7901 surf_usm_h%qsws_liq(m) = - f_qsws_liq * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m) & 7902 - dq_s_dt * t_surf_green_h_p(m) ) 7903 7904 ENDIF 7905 7906 ! 7907 !-- Calculate the true surface resistance 7908 IF ( .NOT. humidity ) THEN 7909 surf_usm_h%r_s(m) = 1.0E10_wp 7910 ELSE 7911 surf_usm_h%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m) - dq_s_dt & 7912 * t_surf_green_h_p(m) ) / (surf_usm_h%qsws(m) + 1.0E-20) & 7913 - surf_usm_h%r_a_green(m) 7914 ENDIF 7915 7916 ! 7917 !-- Calculate change in liquid water reservoir due to dew fall or evaporation of liquid water 7918 IF ( humidity ) THEN 7919 ! 7920 !-- If precipitation is activated, add rain water to qsws_liq and qsws_soil according the 7921 !-- the vegetation coverage. 7922 !-- precipitation_rate is given in mm. 7084 IF ( humidity .AND. surf%frac(m,ind_pav_green) > 0.0_wp ) THEN! 7085 !-- Calculate true surface resistance 7086 IF ( upward ) THEN 7087 surf%qsws(m) = - f_qsws * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7088 - dq_s_dt * t_surf_green_p%val(m) ) 7089 surf%qsws(m) = surf%qsws(m) / l_v 7090 surf%qsws_veg(m) = - f_qsws_veg * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7091 - dq_s_dt * t_surf_green_p%val(m) ) 7092 surf%qsws_liq(m) = - f_qsws_liq * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7093 - dq_s_dt * t_surf_green_p%val(m) ) 7094 surf%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7095 - dq_s_dt * t_surf_green_p%val(m) ) / & 7096 (surf%qsws(m) + 1.0E-20) - surf%r_a_green(m) 7923 7097 IF ( precipitation ) THEN 7924 7925 ! 7098 !-- Calculate change in liquid water reservoir due to dew fall or evaporation of liquid water 7099 !-- If precipitation is activated, add rain water to qsws_liq and qsws_soil according the 7100 !-- the vegetation coverage. Precipitation_rate is given in mm. 7926 7101 !-- Add precipitation to liquid water reservoir, if possible. Otherwise, add the water 7927 7102 !-- to soil. In case of pavements, the exceeding water amount is implicitely removed as 7928 7103 !-- runoff as qsws_soil is then not used in the soil model 7929 IF ( m_liq_usm_h %var_usm_1d(m) /= m_liq_max ) THEN7930 surf _usm_h%qsws_liq(m) = surf_usm_h%qsws_liq(m)&7931 + surf _usm_h%frac(m,ind_pav_green)&7932 * prr(k+k_off,j+j_off,i+i_off) * hyrho(k+k_off) 7104 IF ( m_liq_usm_h(l)%val(m) /= m_liq_max ) THEN 7105 surf%qsws_liq(m) = surf%qsws_liq(m) & 7106 + surf%frac(m,ind_pav_green) & 7107 * prr(k+k_off,j+j_off,i+i_off) * hyrho(k+k_off) & 7933 7108 * 0.001_wp * rho_l * l_v 7934 ENDIF 7935 7109 ENDIF 7936 7110 ENDIF 7937 7938 7111 ! 7939 7112 !-- If the air is saturated, check the reservoir water level 7940 IF ( surf_usm_h%qsws(m) < 0.0_wp ) THEN 7941 ! 7942 !-- Check if reservoir is full (avoid values > m_liq_max) In that case, qsws_liq goes to 7943 !-- qsws_soil. In this case qsws_veg is zero anyway (because c_liq = 1), so that tend is 7944 !-- zero and no further check is needed 7945 IF ( m_liq_usm_h%var_usm_1d(m) == m_liq_max ) THEN 7946 ! surf_usm_h%qsws_soil(m) = surf_usm_h%qsws_soil(m) + surf_usm_h%qsws_liq(m) 7947 surf_usm_h%qsws_liq(m) = 0.0_wp 7113 IF ( surf%qsws(m) < 0.0_wp ) THEN 7114 ! 7115 !-- Check if reservoir is full (avoid values > m_liq_max) In that case, qsws_liq goes to 7116 !-- qsws_soil. In this case qsws_veg is zero anyway (because c_liq = 1), so that tend is 7117 !-- zero and no further check is needed 7118 IF ( m_liq_usm_h(l)%val(m) == m_liq_max ) THEN 7119 surf%qsws_liq(m) = 0.0_wp 7948 7120 ENDIF 7949 7950 ! 7121 !-- In case qsws_veg becomes negative (unphysical behavior), let the water enter the 7122 !-- liquid water reservoir as dew on the plant 7123 IF ( surf%qsws_veg(m) < 0.0_wp ) THEN 7124 surf%qsws_liq(m) = surf%qsws_liq(m) + surf%qsws_veg(m) 7125 surf%qsws_veg(m) = 0.0_wp 7126 ENDIF 7127 ENDIF 7128 7129 tend = - surf%qsws_liq(m) * drho_l_lv 7130 m_liq_usm_h_p(l)%val(m) = m_liq_usm_h(l)%val(m) + dt_3d * & 7131 ( tsc(2) * tend + tsc(3) * tm_liq_usm_h_m(l)%val(m) ) 7132 ! 7133 !-- Check if reservoir is overfull -> reduce to maximum 7134 !-- (conservation of water is violated here) 7135 m_liq_usm_h_p(l)%val(m) = MIN( m_liq_usm_h_p(l)%val(m), m_liq_max ) 7136 ! 7137 !-- Check if reservoir is empty (avoid values < 0.0) (conservation of water is violated here) 7138 m_liq_usm_h_p(l)%val(m) = MAX( m_liq_usm_h_p(l)%val(m), 0.0_wp ) 7139 ! 7140 !-- Calculate m_liq tendencies for the next Runge-Kutta step 7141 IF ( timestep_scheme(1:5) == 'runge' ) THEN 7142 IF ( intermediate_timestep_count == 1 ) THEN 7143 tm_liq_usm_h_m(l)%val(m) = tend 7144 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN 7145 tm_liq_usm_h_m(l)%val(m) = -9.5625_wp * tend + & 7146 5.3125_wp * tm_liq_usm_h_m(l)%val(m) 7147 ENDIF 7148 ENDIF 7149 ELSE 7150 !-- Downward and vertical surfaces 7151 surf%qsws(m) = - f_qsws * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7152 - dq_s_dt * t_surf_green_p%val(m) ) 7153 surf%qsws(m) = surf%qsws(m) / l_v 7154 surf%qsws_veg(m) = - f_qsws_veg * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7155 - dq_s_dt * t_surf_green_p%val(m) ) 7156 surf%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt * t_surf_green%val(m) & 7157 - dq_s_dt * t_surf_green_p%val(m) ) / & 7158 (surf%qsws(m) + 1.0E-20) - surf%r_a_green(m) 7159 surf%qsws_liq(m) = 0._wp ! - f_qsws_liq * ( qv1 - q_s + dq_s_dt * t_surf_green_h(m)& 7160 ! - dq_s_dt * t_surf_green_h_p(m) ) 7161 !-- If the air is saturated, check the reservoir water level 7162 IF ( surf%qsws(m) < 0.0_wp ) THEN 7951 7163 !-- In case qsws_veg becomes negative (unphysical behavior), let the water enter the 7952 7164 !-- liquid water reservoir as dew on the plant 7953 IF ( surf_usm_h%qsws_veg(m) < 0.0_wp ) THEN 7954 surf_usm_h%qsws_liq(m) = surf_usm_h%qsws_liq(m) + surf_usm_h%qsws_veg(m) 7955 surf_usm_h%qsws_veg(m) = 0.0_wp 7165 IF ( surf%qsws_veg(m) < 0.0_wp ) THEN 7166 surf%qsws_veg(m) = 0.0_wp 7956 7167 ENDIF 7957 7168 ENDIF 7958 7959 surf_usm_h%qsws(m) = surf_usm_h%qsws(m) / l_v7960 7961 tend = - surf_usm_h%qsws_liq(m) * drho_l_lv7962 m_liq_usm_h_p%var_usm_1d(m) = m_liq_usm_h%var_usm_1d(m) + dt_3d * &7963 ( tsc(2) * tend + tsc(3) * tm_liq_usm_h_m%var_usm_1d(m) )7964 !7965 !-- Check if reservoir is overfull -> reduce to maximum (conservation of water is violated7966 !-- here)7967 m_liq_usm_h_p%var_usm_1d(m) = MIN( m_liq_usm_h_p%var_usm_1d(m), m_liq_max )7968 7969 !7970 !-- Check if reservoir is empty (avoid values < 0.0) (conservation of water is violated here)7971 m_liq_usm_h_p%var_usm_1d(m) = MAX( m_liq_usm_h_p%var_usm_1d(m), 0.0_wp )7972 !7973 !-- Calculate m_liq tendencies for the next Runge-Kutta step7974 IF ( timestep_scheme(1:5) == 'runge' ) THEN7975 IF ( intermediate_timestep_count == 1 ) THEN7976 tm_liq_usm_h_m%var_usm_1d(m) = tend7977 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN7978 tm_liq_usm_h_m%var_usm_1d(m) = -9.5625_wp * tend + &7979 5.3125_wp * tm_liq_usm_h_m%var_usm_1d(m)7980 ENDIF7981 ENDIF7982 7983 7169 ENDIF 7984 7170 ELSE 7985 surf _usm_h%r_s(m) = 1.0E10_wp7171 surf%r_s(m) = 1.0E10_wp 7986 7172 ENDIF 7987 7173 ! … … 7989 7175 !-- restored. 7990 7176 IF ( during_spinup ) THEN 7991 surf _usm_h%frac(m,ind_wat_win) = frac_win7992 surf _usm_h%frac(m,ind_veg_wall) = frac_wall7993 surf _usm_h%frac(m,ind_pav_green) = frac_green7177 surf%frac(m,ind_wat_win) = frac_win 7178 surf%frac(m,ind_veg_wall) = frac_wall 7179 surf%frac(m,ind_pav_green) = frac_green 7994 7180 ENDIF 7995 7996 ENDDO7997 !7998 !-- Now, treat vertical surface elements7999 !$OMP DO SCHEDULE (STATIC)8000 DO l = 0, 38001 DO m = 1, surf_usm_v(l)%ns8002 !8003 !-- During spinup set green and window fraction to zero and restore at the end of the loop.8004 !-- Note, this is a temporary fix and needs to be removed later.8005 IF ( during_spinup ) THEN8006 frac_win = surf_usm_v(l)%frac(m,ind_wat_win)8007 frac_wall = surf_usm_v(l)%frac(m,ind_veg_wall)8008 frac_green = surf_usm_v(l)%frac(m,ind_pav_green)8009 surf_usm_v(l)%frac(m,ind_wat_win) = 0.0_wp8010 surf_usm_v(l)%frac(m,ind_veg_wall) = 1.0_wp8011 surf_usm_v(l)%frac(m,ind_pav_green) = 0.0_wp8012 ENDIF8013 !8014 !-- Get indices of respective grid point8015 i = surf_usm_v(l)%i(m)8016 j = surf_usm_v(l)%j(m)8017 k = surf_usm_v(l)%k(m)8018 8019 !8020 !-- Please note, for vertical surfaces no Obukhov length is defined, since stratification8021 !-- is not considered in this case.8022 lambda_surface = surf_usm_v(l)%lambda_surf(m)8023 lambda_surface_window = surf_usm_v(l)%lambda_surf_window(m)8024 lambda_surface_green = surf_usm_v(l)%lambda_surf_green(m)8025 8026 ! pt1 = pt(k,j,i)8027 IF ( humidity ) THEN8028 qv1 = q(k,j,i)8029 ELSE8030 qv1 = 0.0_wp8031 ENDIF8032 !8033 !-- Calculate rho * c_p coefficient at wall layer8034 rho_cp = c_p * hyp(k) / ( r_d * surf_usm_v(l)%pt1(m) * exner(k) )8035 8036 IF (surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp ) THEN8037 !8038 !-- Calculate frequently used parameters8039 rho_lv = rho_cp / c_p * l_v8040 drho_l_lv = 1.0_wp / (rho_l * l_v)8041 ENDIF8042 8043 !-- Calculation of r_a for vertical surfaces8044 !--8045 !-- Heat transfer coefficient for forced convection along vertical walls follows formulation8046 !-- in TUF3d model (Krayenhoff & Voogt, 2006)8047 !--8048 !-- H = httc (Tsfc - Tair)8049 !-- httc = rw * (11.8 + 4.2 * Ueff) - 4.08050 !--8051 !-- rw: Wall patch roughness relative to 1.0 for concrete8052 !-- Ueff: Effective wind speed8053 !-- - 4.0 is a reduction of Rowley et al (1930) formulation based on8054 !-- Cole and Sturrock (1977)8055 !--8056 !-- Ucan: Canyon wind speed8057 !-- wstar: Convective velocity8058 !-- Qs: Surface heat flux8059 !-- zH: Height of the convective layer8060 !-- wstar = (g/Tcan*Qs*zH)**(1./3.)8061 !-- Effective velocity components must always be defined at scalar grid point. The wall8062 !-- normal component is obtained by simple linear interpolation. (An alternative would be an8063 !-- logarithmic interpolation.) Parameter roughness_concrete (default value = 0.001) is used8064 !-- to calculation of roughness relative to concrete. Note, wind velocity is limited8065 !-- to avoid division by zero. The nominator can become <= 0.0 for values z0 < 3*10E-4.8066 ueff = MAX ( SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 + &8067 ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 + &8068 ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 ), &8069 ( ( 4.0_wp + 0.1_wp ) &8070 / ( surf_usm_v(l)%z0(m) * d_roughness_concrete ) &8071 - 11.8_wp ) / 4.2_wp &8072 )8073 surf_usm_v(l)%r_a(m) = rho_cp / ( surf_usm_v(l)%z0(m) * d_roughness_concrete &8074 * ( 11.8_wp + 4.2_wp * ueff ) - 4.0_wp )8075 !8076 !-- Limit aerodynamic resistance8077 IF ( surf_usm_v(l)%r_a(m) < 1.0_wp ) surf_usm_v(l)%r_a(m) = 1.0_wp8078 IF ( surf_usm_v(l)%r_a(m) > 300.0_wp ) surf_usm_v(l)%r_a(m) = 300.0_wp8079 8080 f_shf = rho_cp / surf_usm_v(l)%r_a(m)8081 f_shf_window = rho_cp / surf_usm_v(l)%r_a(m)8082 f_shf_green = rho_cp / surf_usm_v(l)%r_a(m)8083 8084 IF ( surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp ) THEN8085 !8086 !-- Adapted from LSM:8087 !-- Second step: calculate canopy resistance r_canopy. f1-f3 here are defined as 1/f1-f38088 !-- as in ECMWF documentation f1: correction for incoming shortwave radiation (stomata8089 !-- close at night)8090 f1 = MIN( 1.0_wp, ( 0.004_wp * surf_usm_v(l)%rad_sw_in(m) + 0.05_wp ) &8091 / (0.81_wp * (0.004_wp * surf_usm_v(l)%rad_sw_in(m) + 1.0_wp) ) )8092 !8093 !-- f2: Correction for soil moisture availability to plants (the integrated soil moisture8094 !-- must thus be considered here) f2 = 0 for very dry soils8095 f2=1.0_wp8096 8097 !8098 !-- Calculate water vapour pressure at saturation8099 e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surf_green_v_p(l)%t(m) - 273.16_wp ) &8100 / ( t_surf_green_v_p(l)%t(m) - 35.86_wp ) )8101 !8102 !-- f3: Correction for vapour pressure deficit8103 IF ( surf_usm_v(l)%g_d(m) /= 0.0_wp ) THEN8104 !8105 !-- Calculate vapour pressure8106 e = qv1 * surface_pressure / ( qv1 + 0.622_wp )8107 f3 = EXP ( - surf_usm_v(l)%g_d(m) * (e_s - e) )8108 ELSE8109 f3 = 1.0_wp8110 ENDIF8111 !8112 !-- Calculate canopy resistance. In case that c_veg is 0 (bare soils), this calculation is8113 !-- obsolete, as r_canopy is not used below.8114 !-- To do: check for very dry soil -> r_canopy goes to infinity8115 surf_usm_v(l)%r_canopy(m) = surf_usm_v(l)%r_canopy_min(m) / &8116 ( surf_usm_v(l)%lai(m) * f1 * f2 * f3 + 1.0E-20_wp )8117 8118 !8119 !-- Calculate saturation specific humidity8120 q_s = 0.622_wp * e_s / ( surface_pressure - e_s )8121 !8122 !-- In case of dewfall, set evapotranspiration to zero. All super-saturated water is then8123 !-- removed from the air8124 IF ( humidity .AND. q_s <= qv1 ) THEN8125 surf_usm_v(l)%r_canopy(m) = 0.0_wp8126 ENDIF8127 8128 !8129 !-- Calculate coefficients for the total evapotranspiration8130 !-- In case of water surface, set vegetation and soil fluxes to zero.8131 !-- For pavements, only evaporation of liquid water is possible.8132 f_qsws_veg = rho_lv * &8133 ( 1.0_wp - 0.0_wp ) / & !surf_usm_h%c_liq(m) ) / &8134 ( surf_usm_v(l)%r_a(m) + surf_usm_v(l)%r_canopy(m) )8135 ! f_qsws_liq = rho_lv * surf_usm_h%c_liq(m) / surf_usm_h%r_a_green(m)8136 8137 f_qsws = f_qsws_veg! + f_qsws_liq8138 !8139 !-- Calculate derivative of q_s for Taylor series expansion8140 e_s_dt = e_s * ( 17.269_wp / ( t_surf_green_v_p(l)%t(m) - 35.86_wp) - 17.269_wp &8141 * ( t_surf_green_v_p(l)%t(m) - 273.16_wp) &8142 / ( t_surf_green_v_p(l)%t(m) - 35.86_wp)**2 )8143 8144 dq_s_dt = 0.622_wp * e_s_dt / ( surface_pressure - e_s_dt )8145 ENDIF8146 8147 !8148 !-- Add LW up so that it can be removed in prognostic equation8149 surf_usm_v(l)%rad_net_l(m) = surf_usm_v(l)%rad_sw_in(m) - surf_usm_v(l)%rad_sw_out(m) &8150 + surf_usm_v(l)%rad_lw_in(m) - surf_usm_v(l)%rad_lw_out(m)8151 !8152 !-- Numerator of the prognostic equation8153 coef_1 = surf_usm_v(l)%rad_net_l(m) + & ! Coef +1 corresponds to -lwout8154 ! included in calculation of radnet_l8155 ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(m,ind_veg_wall) * &8156 sigma_sb * t_surf_wall_v(l)%t(m) ** 4 + &8157 f_shf * surf_usm_v(l)%pt1(m) + &8158 lambda_surface * t_wall_v(l)%t(nzb_wall,m)8159 IF ( ( .NOT. during_spinup ) .AND. ( surf_usm_v(l)%frac(m,ind_wat_win) > 0.0_wp ) ) THEN8160 coef_window_1 = surf_usm_v(l)%rad_net_l(m) + & ! Coef +1 corresponds to -lwout8161 ! included in calculation of radnet_l8162 ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(m,ind_wat_win) * &8163 sigma_sb * t_surf_window_v(l)%t(m) ** 4 + &8164 f_shf * surf_usm_v(l)%pt1(m) + &8165 lambda_surface_window * t_window_v(l)%t(nzb_wall,m)8166 ENDIF8167 IF ( ( humidity ) .AND. ( surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp ) ) THEN8168 coef_green_1 = surf_usm_v(l)%rad_net_l(m) + & ! Coef +1 corresponds to -lwout8169 ! included in calculation of radnet_l8170 ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(m,ind_pav_green) * sigma_sb * &8171 t_surf_green_v(l)%t(m) ** 4 + &8172 f_shf * surf_usm_v(l)%pt1(m) + f_qsws * ( qv1 - q_s &8173 + dq_s_dt * t_surf_green_v(l)%t(m) ) + &8174 lambda_surface_green * t_wall_v(l)%t(nzb_wall,m)8175 ELSE8176 coef_green_1 = surf_usm_v(l)%rad_net_l(m) + & ! Coef +1 corresponds to -lwout included8177 ! in calculation of radnet_l8178 ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(m,ind_pav_green) * sigma_sb * &8179 t_surf_green_v(l)%t(m) ** 4 + &8180 f_shf * surf_usm_v(l)%pt1(m) + &8181 lambda_surface_green * t_wall_v(l)%t(nzb_wall,m)8182 ENDIF8183 8184 !8185 !-- Denominator of the prognostic equation8186 coef_2 = 4.0_wp * surf_usm_v(l)%emissivity(m,ind_veg_wall) * sigma_sb &8187 * t_surf_wall_v(l)%t(m)**3 + lambda_surface + f_shf / exner(k)8188 IF ( ( .NOT. during_spinup ) .AND. ( surf_usm_v(l)%frac(m,ind_wat_win) > 0.0_wp ) ) THEN8189 coef_window_2 = 4.0_wp * surf_usm_v(l)%emissivity(m,ind_wat_win) * sigma_sb &8190 * t_surf_window_v(l)%t(m)**3 + lambda_surface_window + f_shf / exner(k)8191 ENDIF8192 IF ( ( humidity ) .AND. ( surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp ) ) THEN8193 coef_green_2 = 4.0_wp * surf_usm_v(l)%emissivity(m,ind_pav_green) * sigma_sb &8194 * t_surf_green_v(l)%t(m)**3 + f_qsws * dq_s_dt &8195 + lambda_surface_green + f_shf / exner(k)8196 ELSE8197 coef_green_2 = 4.0_wp * surf_usm_v(l)%emissivity(m,ind_pav_green) * sigma_sb &8198 * t_surf_green_v(l)%t(m)**3 + lambda_surface_green + f_shf / exner(k)8199 ENDIF8200 !8201 !-- Implicit solution when the surface layer has no heat capacity, otherwise use RK3 scheme.8202 t_surf_wall_v_p(l)%t(m) = ( coef_1 * dt_3d * tsc(2) + surf_usm_v(l)%c_surface(m) &8203 * t_surf_wall_v(l)%t(m) ) / ( surf_usm_v(l)%c_surface(m) &8204 + coef_2 * dt_3d * tsc(2) )8205 IF ( ( .NOT. during_spinup ) .AND. ( surf_usm_v(l)%frac(m,ind_wat_win) > 0.0_wp ) ) THEN8206 t_surf_window_v_p(l)%t(m) = ( coef_window_1 * dt_3d * tsc(2) + &8207 surf_usm_v(l)%c_surface_window(m) &8208 * t_surf_window_v(l)%t(m) ) / &8209 ( surf_usm_v(l)%c_surface_window(m) &8210 + coef_window_2 * dt_3d * tsc(2) )8211 ENDIF8212 t_surf_green_v_p(l)%t(m) = ( coef_green_1 * dt_3d * tsc(2) + &8213 surf_usm_v(l)%c_surface_green(m) &8214 * t_surf_green_v(l)%t(m) ) / &8215 ( surf_usm_v(l)%c_surface_green(m) &8216 + coef_green_2 * dt_3d * tsc(2) )8217 !8218 !-- Add RK3 term8219 t_surf_wall_v_p(l)%t(m) = t_surf_wall_v_p(l)%t(m) + dt_3d * tsc(3) * &8220 surf_usm_v(l)%tt_surface_wall_m(m)8221 t_surf_window_v_p(l)%t(m) = t_surf_window_v_p(l)%t(m) + dt_3d * tsc(3) * &8222 surf_usm_v(l)%tt_surface_window_m(m)8223 t_surf_green_v_p(l)%t(m) = t_surf_green_v_p(l)%t(m) + dt_3d * tsc(3) * &8224 surf_usm_v(l)%tt_surface_green_m(m)8225 8226 !8227 !-- Store surface temperature. Further, in case humidity is used, store also vpt_surface,8228 !-- which is, due to the lack of moisture on roofs, simply assumed to be the surface temperature.8229 surf_usm_v(l)%pt_surface(m) = ( surf_usm_v(l)%frac(m,ind_veg_wall) &8230 * t_surf_wall_v_p(l)%t(m) &8231 + surf_usm_v(l)%frac(m,ind_wat_win) &8232 * t_surf_window_v_p(l)%t(m) &8233 + surf_usm_v(l)%frac(m,ind_pav_green) &8234 * t_surf_green_v_p(l)%t(m) ) / exner(k)8235 8236 IF ( humidity ) surf_usm_v(l)%vpt_surface(m) = surf_usm_v(l)%pt_surface(m)8237 !8238 !-- Calculate true tendency8239 stend_wall = ( t_surf_wall_v_p(l)%t(m) - t_surf_wall_v(l)%t(m) - dt_3d * tsc(3) * &8240 surf_usm_v(l)%tt_surface_wall_m(m) ) / ( dt_3d * tsc(2) )8241 stend_window = ( t_surf_window_v_p(l)%t(m) - t_surf_window_v(l)%t(m) - dt_3d * tsc(3) * &8242 surf_usm_v(l)%tt_surface_window_m(m) ) / ( dt_3d * tsc(2) )8243 stend_green = ( t_surf_green_v_p(l)%t(m) - t_surf_green_v(l)%t(m) - dt_3d * tsc(3) * &8244 surf_usm_v(l)%tt_surface_green_m(m) ) / ( dt_3d * tsc(2) )8245 8246 !8247 !-- Calculate t_surf_* tendencies for the next Runge-Kutta step8248 IF ( timestep_scheme(1:5) == 'runge' ) THEN8249 IF ( intermediate_timestep_count == 1 ) THEN8250 surf_usm_v(l)%tt_surface_wall_m(m) = stend_wall8251 surf_usm_v(l)%tt_surface_window_m(m) = stend_window8252 surf_usm_v(l)%tt_surface_green_m(m) = stend_green8253 ELSEIF ( intermediate_timestep_count < intermediate_timestep_count_max ) THEN8254 surf_usm_v(l)%tt_surface_wall_m(m) = -9.5625_wp * stend_wall + 5.3125_wp &8255 * surf_usm_v(l)%tt_surface_wall_m(m)8256 surf_usm_v(l)%tt_surface_green_m(m) = -9.5625_wp * stend_green + 5.3125_wp &8257 * surf_usm_v(l)%tt_surface_green_m(m)8258 surf_usm_v(l)%tt_surface_window_m(m) = -9.5625_wp * stend_window + 5.3125_wp &8259 * surf_usm_v(l)%tt_surface_window_m(m)8260 ENDIF8261 ENDIF8262 8263 !8264 !-- In case of fast changes in the skin temperature, it is required to update the radiative8265 !-- fluxes in order to keep the solution stable8266 8267 IF ( ( ( ABS( t_surf_wall_v_p(l)%t(m) - t_surf_wall_v(l)%t(m) ) > 1.0_wp ) .OR. &8268 ( ABS( t_surf_green_v_p(l)%t(m) - t_surf_green_v(l)%t(m) ) > 1.0_wp ) .OR. &8269 ( ABS( t_surf_window_v_p(l)%t(m) - t_surf_window_v(l)%t(m) ) > 1.0_wp ) ) &8270 .AND. unscheduled_radiation_calls ) THEN8271 force_radiation_call_l = .TRUE.8272 ENDIF8273 8274 !8275 !-- Calculate fluxes8276 !-- Prognostic rad_net_l is used just for output!8277 surf_usm_v(l)%rad_net_l(m) = surf_usm_v(l)%frac(m,ind_veg_wall) * &8278 ( surf_usm_v(l)%rad_net_l(m) + 3.0_wp * sigma_sb * &8279 t_surf_wall_v(l)%t(m)**4 - 4.0_wp * sigma_sb * &8280 t_surf_wall_v(l)%t(m)**3 * t_surf_wall_v_p(l)%t(m) ) &8281 + surf_usm_v(l)%frac(m,ind_wat_win) * &8282 ( surf_usm_v(l)%rad_net_l(m) + 3.0_wp * sigma_sb * &8283 t_surf_window_v(l)%t(m)**4 - 4.0_wp * sigma_sb * &8284 t_surf_window_v(l)%t(m)**3 * t_surf_window_v_p(l)%t(m) ) &8285 + surf_usm_v(l)%frac(m,ind_pav_green) * &8286 ( surf_usm_v(l)%rad_net_l(m) + 3.0_wp * sigma_sb * &8287 t_surf_green_v(l)%t(m)**4 - 4.0_wp * sigma_sb * &8288 t_surf_green_v(l)%t(m)**3 * t_surf_green_v_p(l)%t(m) )8289 8290 surf_usm_v(l)%wghf_eb_window(m) = lambda_surface_window * &8291 ( t_surf_window_v_p(l)%t(m) &8292 - t_window_v(l)%t(nzb_wall,m) )8293 surf_usm_v(l)%wghf_eb(m) = lambda_surface * ( t_surf_wall_v_p(l)%t(m) &8294 - t_wall_v(l)%t(nzb_wall,m) )8295 surf_usm_v(l)%wghf_eb_green(m) = lambda_surface_green * &8296 ( t_surf_green_v_p(l)%t(m) &8297 - t_green_v(l)%t(nzb_wall,m) )8298 8299 !8300 !-- Ground/wall/roof surface heat flux8301 surf_usm_v(l)%wshf_eb(m) = - f_shf * ( surf_usm_v(l)%pt1(m) - t_surf_wall_v_p(l)%t(m) &8302 / exner(k) ) * surf_usm_v(l)%frac(m,ind_veg_wall) &8303 - f_shf_window * ( surf_usm_v(l)%pt1(m) &8304 - t_surf_window_v_p(l)%t(m) / exner(k) ) &8305 * surf_usm_v(l)%frac(m,ind_wat_win) - f_shf_green &8306 * ( surf_usm_v(l)%pt1(m) - t_surf_green_v_p(l)%t(m) &8307 / exner(k) ) * surf_usm_v(l)%frac(m,ind_pav_green)8308 8309 !8310 !-- Store kinematic surface heat fluxes for utilization in other processes diffusion_s,8311 !-- surface_layer_fluxes,...8312 surf_usm_v(l)%shf(m) = surf_usm_v(l)%wshf_eb(m) / c_p8313 !8314 !-- If the indoor model is applied, further add waste heat from buildings to the kinematic8315 !-- flux.8316 IF ( indoor_model ) THEN8317 surf_usm_v(l)%shf(m) = surf_usm_v(l)%shf(m) + surf_usm_v(l)%waste_heat(m) / c_p8318 ENDIF8319 8320 IF ( surf_usm_v(l)%frac(m,ind_pav_green) > 0.0_wp ) THEN8321 8322 8323 IF ( humidity ) THEN8324 surf_usm_v(l)%qsws(m) = - f_qsws * ( qv1 - q_s + dq_s_dt &8325 * t_surf_green_v(l)%t(m) - dq_s_dt &8326 * t_surf_green_v_p(l)%t(m) )8327 8328 surf_usm_v(l)%qsws(m) = surf_usm_v(l)%qsws(m) / l_v8329 8330 surf_usm_v(l)%qsws_veg(m) = - f_qsws_veg * ( qv1 - q_s + dq_s_dt &8331 * t_surf_green_v(l)%t(m) - dq_s_dt &8332 * t_surf_green_v_p(l)%t(m) )8333 8334 ! surf_usm_h%qsws_liq(m) = - f_qsws_liq * ( qv1 - q_s + dq_s_dt &8335 ! * t_surf_green_h(m) - dq_s_dt &8336 ! * t_surf_green_h_p(m) )8337 ENDIF8338 8339 !8340 !-- Calculate the true surface resistance8341 IF ( .NOT. humidity ) THEN8342 surf_usm_v(l)%r_s(m) = 1.0E10_wp8343 ELSE8344 surf_usm_v(l)%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt * t_surf_green_v(l)%t(m) &8345 - dq_s_dt * t_surf_green_v_p(l)%t(m) ) / &8346 (surf_usm_v(l)%qsws(m) + 1.0E-20) - surf_usm_v(l)%r_a(m)8347 ENDIF8348 8349 !8350 !-- Calculate change in liquid water reservoir due to dew fall or evaporation of liquid8351 !-- water8352 IF ( humidity ) THEN8353 !8354 !-- If the air is saturated, check the reservoir water level8355 IF ( surf_usm_v(l)%qsws(m) < 0.0_wp ) THEN8356 8357 !8358 !-- In case qsws_veg becomes negative (unphysical behavior), let the water enter the8359 !-- liquid water reservoir as dew on the plant8360 IF ( surf_usm_v(l)%qsws_veg(m) < 0.0_wp ) THEN8361 ! surf_usm_h%qsws_liq(m) = surf_usm_h%qsws_liq(m) + surf_usm_h%qsws_veg(m)8362 surf_usm_v(l)%qsws_veg(m) = 0.0_wp8363 ENDIF8364 ENDIF8365 8366 ENDIF8367 ELSE8368 surf_usm_v(l)%r_s(m) = 1.0E10_wp8369 ENDIF8370 !8371 !-- During spinup green and window fraction are set to zero. Here, the original values are8372 !-- restored.8373 IF ( during_spinup ) THEN8374 surf_usm_v(l)%frac(m,ind_wat_win) = frac_win8375 surf_usm_v(l)%frac(m,ind_veg_wall) = frac_wall8376 surf_usm_v(l)%frac(m,ind_pav_green) = frac_green8377 ENDIF8378 8379 ENDDO8380 7181 8381 7182 ENDDO … … 8383 7184 8384 7185 ! 8385 !-- Add-up anthropogenic heat, for now only at upward-facing surfaces 8386 IF ( usm_anthropogenic_heat .AND. .NOT. during_spinup .AND. & 8387 intermediate_timestep_count == intermediate_timestep_count_max ) THEN 8388 ! 8389 !-- Application of the additional anthropogenic heat sources. We considere the traffic for now, 8390 !-- so all heat is absorbed to the first layer, generalization would be worth. 8391 !-- Calculation of actual profile coefficient 8392 !-- ??? check time_since_reference_point ??? 8393 CALL get_date_time( time_since_reference_point, hour = dhour, second_of_day = dtime ) 8394 8395 !-- TO_DO: activate, if testcase is available 8396 !-- !$OMP PARALLEL DO PRIVATE (i, j, k, acoef, rho_cp) 8397 !-- It may also improve performance to move topo_top_ind before the k-loop 8398 DO i = nxl, nxr 8399 DO j = nys, nyn 8400 DO k = nz_urban_b, min(nz_urban_t,naheatlayers) 8401 IF ( k > topo_top_ind(j,i,0) ) THEN 8402 ! 8403 !-- Increase of pt in box i,j,k in time dt_3d given to anthropogenic heat 8404 !-- aheat*acoef (W*m-2) 8405 !-- linear interpolation of coeficient 8406 acoef = ( REAL( dhour+1,wp ) - dtime / seconds_per_hour ) & 8407 * aheatprof(k, dhour) + & 8408 ( dtime / seconds_per_hour - REAL( dhour, wp ) ) & 8409 * aheatprof(k,dhour+1) 8410 IF ( aheat(k,j,i) > 0.0_wp ) THEN 8411 ! 8412 !-- Calculate rho * c_p coefficient at layer k 8413 rho_cp = c_p * hyp(k) / ( r_d * pt(k+1,j,i) * exner(k) ) 8414 pt(k,j,i) = pt(k,j,i) + aheat(k,j,i) * acoef * dt_3d / (exner(k) * rho_cp & 8415 * dz(1) ) 8416 ENDIF 8417 ENDIF 8418 ENDDO 8419 ENDDO 8420 ENDDO 8421 8422 ENDIF 8423 ! 8424 !-- pt and shf are defined on nxlg:nxrg,nysg:nyng .Get the borders from neighbours. 8425 CALL exchange_horiz( pt, nbgp ) 8426 ! 8427 !-- Calculation of force_radiation_call: 8428 !-- Make logical OR for all processes. 8429 !-- Force radiation call if at least one processor forces it. 8430 IF ( intermediate_timestep_count == intermediate_timestep_count_max-1 ) THEN 7186 !-- pt and shf are defined on nxlg:nxrg,nysg:nyng .Get the borders from neighbours. 7187 CALL exchange_horiz( pt, nbgp ) 7188 ! 7189 !-- Calculation of force_radiation_call: 7190 !-- Make logical OR for all processes. 7191 !-- Force radiation call if at least one processor forces it. 7192 IF ( intermediate_timestep_count == intermediate_timestep_count_max-1 ) THEN 8431 7193 #if defined( __parallel ) 8432 8433 8434 CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,&8435 8436 7194 IF ( .NOT. force_radiation_call ) THEN 7195 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr ) 7196 CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call, & 7197 1, MPI_LOGICAL, MPI_LOR, comm2d, ierr ) 7198 ENDIF 8437 7199 #else 8438 7200 force_radiation_call = force_radiation_call .OR. force_radiation_call_l 8439 7201 #endif 8440 force_radiation_call_l = .FALSE. 8441 ENDIF 8442 8443 ! ! 8444 ! !-- Calculate surface specific humidity 8445 ! IF ( humidity ) THEN 8446 ! CALL calc_q_surface_usm 8447 ! ENDIF 8448 8449 8450 ! CONTAINS 8451 ! !------------------------------------------------------------------------------------------------! 8452 ! ! Description: 8453 ! ! ------------ 8454 ! !> Calculation of specific humidity of the skin layer (surface). It is assumend that the skin is 8455 ! !> always saturated. 8456 ! !------------------------------------------------------------------------------------------------! 8457 ! SUBROUTINE calc_q_surface_usm 8458 ! 8459 ! IMPLICIT NONE 8460 ! 8461 ! REAL(wp) :: resistance !< aerodynamic and soil resistance term 8462 ! 8463 ! DO m = 1, surf_usm_h%ns 8464 ! 8465 ! i = surf_usm_h%i(m) 8466 ! j = surf_usm_h%j(m) 8467 ! k = surf_usm_h%k(m) 8468 ! 8469 !! 8470 !!-- Calculate water vapour pressure at saturation 8471 ! e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surf_green_h_p(m) - 273.16_wp ) / & 8472 ! ( t_surf_green_h_p(m) - 35.86_wp ) ) 8473 ! 8474 !! 8475 !!-- Calculate specific humidity at saturation 8476 ! q_s = 0.622_wp * e_s / ( surface_pressure - e_s ) 8477 ! 8478 !! surf_usm_h%r_a_green(m) = ( surf_usm_h%pt1(m) - t_surf_green_h(m) / exner(k) ) / & 8479 !! ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-10_wp ) 8480 !! 8481 !! !- Make sure that the resistance does not drop to zero 8482 !! IF ( ABS(surf_usm_h%r_a_green(m)) < 1.0E-10_wp ) surf_usm_h%r_a_green(m) = 1.0E-10_wp 8483 ! 8484 ! resistance = surf_usm_h%r_a_green(m) / ( surf_usm_h%r_a_green(m) + surf_usm_h%r_s(m) & 8485 ! + 1E-5_wp ) 8486 ! 8487 !! 8488 !!-- Calculate specific humidity at surface 8489 ! IF ( bulk_cloud_model ) THEN 8490 ! q(k,j,i) = resistance * q_s + ( 1.0_wp - resistance ) * ( q(k,j,i) - ql(k,j,i) ) 8491 ! ELSE 8492 ! q(k,j,i) = resistance * q_s + ( 1.0_wp - resistance ) * q(k,j,i) 8493 ! ENDIF 8494 ! 8495 !! 8496 !!-- Update virtual potential temperature 8497 ! vpt(k,j,i) = pt(k,j,i) * ( 1.0_wp + 0.61_wp * q(k,j,i) ) 8498 ! 8499 ! ENDDO 8500 ! 8501 !! 8502 !!--Now, treat vertical surface elements 8503 ! DO l = 0, 3 8504 ! DO m = 1, surf_usm_v(l)%ns 8505 !! 8506 !!-- Get indices of respective grid point 8507 ! i = surf_usm_v(l)%i(m) 8508 ! j = surf_usm_v(l)%j(m) 8509 ! k = surf_usm_v(l)%k(m) 8510 ! 8511 !! 8512 !!-- Calculate water vapour pressure at saturation 8513 ! e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surf_green_v_p(l)%t(m) - 273.16_wp ) / & 8514 ! ( t_surf_green_v_p(l)%t(m) - 35.86_wp ) ) 8515 ! 8516 !! 8517 !!-- Calculate specific humidity at saturation 8518 ! q_s = 0.622_wp * e_s / ( surface_pressure -e_s ) 8519 ! 8520 !! 8521 !!-- Calculate specific humidity at surface 8522 ! IF ( bulk_cloud_model ) THEN 8523 ! q(k,j,i) = ( q(k,j,i) - ql(k,j,i) ) 8524 ! ELSE 8525 ! q(k,j,i) = q(k,j,i) 8526 ! ENDIF 8527 !! 8528 !!-- Update virtual potential temperature 8529 ! vpt(k,j,i) = pt(k,j,i) * ( 1.0_wp + 0.61_wp * q(k,j,i) ) 8530 ! 8531 ! ENDDO 8532 ! 8533 ! ENDDO 8534 ! 8535 ! END SUBROUTINE calc_q_surface_usm 7202 force_radiation_call_l = .FALSE. 7203 ENDIF 8536 7204 8537 7205 IF ( debug_output_timestep ) THEN 8538 WRITE( debug_string, * ) 'usm_surface_energy_balance | during_spinup: ', during_spinup7206 WRITE( debug_string, * ) 'usm_surface_energy_balance: ', horizontal, l, during_spinup 8539 7207 CALL debug_message( debug_string, 'end' ) 8540 7208 ENDIF 8541 7209 8542 7210 END SUBROUTINE usm_surface_energy_balance 8543 8544 7211 8545 7212 !--------------------------------------------------------------------------------------------------! … … 8617 7284 8618 7285 CALL wrd_write_string( 'ns_h_on_file_usm' ) 8619 WRITE ( 14 ) surf_usm_h %ns7286 WRITE ( 14 ) surf_usm_h(0:1)%ns 8620 7287 8621 7288 CALL wrd_write_string( 'ns_v_on_file_usm' ) 8622 7289 WRITE ( 14 ) surf_usm_v(0:3)%ns 8623 7290 8624 CALL wrd_write_string( 'usm_start_index_h' ) 8625 WRITE ( 14 ) surf_usm_h%start_index 8626 8627 CALL wrd_write_string( 'usm_end_index_h' ) 8628 WRITE ( 14 ) surf_usm_h%end_index 8629 8630 CALL wrd_write_string( 't_surf_wall_h' ) 8631 WRITE ( 14 ) t_surf_wall_h 8632 8633 CALL wrd_write_string( 't_surf_window_h' ) 8634 WRITE ( 14 ) t_surf_window_h 8635 8636 CALL wrd_write_string( 't_surf_green_h' ) 8637 WRITE ( 14 ) t_surf_green_h 8638 8639 CALL wrd_write_string( 'm_liq_usm_h' ) 8640 WRITE ( 14 ) m_liq_usm_h%var_usm_1d 8641 ! 8642 !-- Write restart data which is especially needed for the urban-surface model. In order to do not 8643 !-- fill up the restart routines in surface_mod. Output of waste heat from indoor model. Restart 8644 !-- data is required in this special case, because the indoor model, where waste heat is 8645 !-- computed, is called each hour (current default), so that waste heat would have zero value 8646 !-- until next call of indoor model. 8647 IF ( indoor_model ) THEN 8648 CALL wrd_write_string( 'waste_heat_h' ) 8649 WRITE ( 14 ) surf_usm_h%waste_heat 8650 ENDIF 7291 DO l = 0, 1 7292 7293 CALL wrd_write_string( 'usm_start_index_h' ) 7294 WRITE ( 14 ) surf_usm_h(l)%start_index 7295 7296 CALL wrd_write_string( 'usm_end_index_h' ) 7297 WRITE ( 14 ) surf_usm_h(l)%end_index 7298 7299 WRITE( dum, '(I1)') l 7300 7301 CALL wrd_write_string( 't_surf_wall_h(' // dum // ')' ) 7302 WRITE ( 14 ) t_surf_wall_h(l)%val 7303 7304 CALL wrd_write_string( 't_surf_window_h(' // dum // ')' ) 7305 WRITE ( 14 ) t_surf_window_h(l)%val 7306 7307 CALL wrd_write_string( 't_surf_green_h(' // dum // ')' ) 7308 WRITE ( 14 ) t_surf_green_h(l)%val 7309 7310 CALL wrd_write_string( 'm_liq_usm_h(' // dum // ')' ) 7311 WRITE ( 14 ) m_liq_usm_h(l)%val 7312 ! 7313 !-- Write restart data which is especially needed for the urban-surface model. In order to do not 7314 !-- fill up the restart routines in surface_mod. Output of waste heat from indoor model. Restart 7315 !-- data is required in this special case, because the indoor model, where waste heat is 7316 !-- computed, is called each hour (current default), so that waste heat would have zero value 7317 !-- until next call of indoor model. 7318 IF ( indoor_model ) THEN 7319 CALL wrd_write_string( 'waste_heat_h(' // dum // ')' ) 7320 WRITE ( 14 ) surf_usm_h(l)%waste_heat 7321 ENDIF 7322 ENDDO 8651 7323 8652 7324 DO l = 0, 3 … … 8661 7333 8662 7334 CALL wrd_write_string( 't_surf_wall_v(' // dum // ')' ) 8663 WRITE ( 14 ) t_surf_wall_v(l)% t7335 WRITE ( 14 ) t_surf_wall_v(l)%val 8664 7336 8665 7337 CALL wrd_write_string( 't_surf_window_v(' // dum // ')' ) 8666 WRITE ( 14 ) t_surf_window_v(l)% t7338 WRITE ( 14 ) t_surf_window_v(l)%val 8667 7339 8668 7340 CALL wrd_write_string( 't_surf_green_v(' // dum // ')' ) 8669 WRITE ( 14 ) t_surf_green_v(l)% t7341 WRITE ( 14 ) t_surf_green_v(l)%val 8670 7342 8671 7343 IF ( indoor_model ) THEN … … 8676 7348 ENDDO 8677 7349 8678 CALL wrd_write_string( 'usm_start_index_h' ) 8679 WRITE ( 14 ) surf_usm_h%start_index 8680 8681 CALL wrd_write_string( 'usm_end_index_h' ) 8682 WRITE ( 14 ) surf_usm_h%end_index 8683 8684 CALL wrd_write_string( 't_wall_h' ) 8685 WRITE ( 14 ) t_wall_h 8686 8687 CALL wrd_write_string( 't_window_h' ) 8688 WRITE ( 14 ) t_window_h 8689 8690 CALL wrd_write_string( 't_green_h' ) 8691 WRITE ( 14 ) t_green_h 7350 DO l = 0, 1 7351 7352 CALL wrd_write_string( 'usm_start_index_h' ) 7353 WRITE ( 14 ) surf_usm_h(l)%start_index 7354 7355 CALL wrd_write_string( 'usm_end_index_h' ) 7356 WRITE ( 14 ) surf_usm_h(l)%end_index 7357 7358 WRITE( dum, '(I1)') l 7359 7360 CALL wrd_write_string( 't_wall_h(' // dum // ')' ) 7361 WRITE ( 14 ) t_wall_h(l)%val 7362 7363 CALL wrd_write_string( 't_window_h(' // dum // ')' ) 7364 WRITE ( 14 ) t_window_h(l)%val 7365 7366 CALL wrd_write_string( 't_green_h(' // dum // ')' ) 7367 WRITE ( 14 ) t_green_h(l)%val 7368 7369 ENDDO 8692 7370 8693 7371 DO l = 0, 3 … … 8702 7380 8703 7381 CALL wrd_write_string( 't_wall_v(' // dum // ')' ) 8704 WRITE ( 14 ) t_wall_v(l)% t7382 WRITE ( 14 ) t_wall_v(l)%val 8705 7383 8706 7384 CALL wrd_write_string( 't_window_v(' // dum // ')' ) 8707 WRITE ( 14 ) t_window_v(l)% t7385 WRITE ( 14 ) t_window_v(l)%val 8708 7386 8709 7387 CALL wrd_write_string( 't_green_v(' // dum // ')' ) 8710 WRITE ( 14 ) t_green_v(l)% t7388 WRITE ( 14 ) t_green_v(l)%val 8711 7389 8712 7390 ENDDO … … 8716 7394 !-- There is no information about the PE-grid necessary because the restart files consists of the 8717 7395 !-- whole domain. Therefore, ns_h_on_file_usm and ns_v_on_file_usm are not used with MPI-IO. 8718 CALL rd_mpi_io_surface_filetypes( surf_usm_h%start_index, surf_usm_h%end_index, & 8719 surface_data_to_write, global_start_index ) 8720 8721 CALL wrd_mpi_io( 'usm_start_index_h', surf_usm_h%start_index ) 8722 CALL wrd_mpi_io( 'usm_end_index_h', surf_usm_h%end_index ) 8723 CALL wrd_mpi_io( 'usm_global_start_h', global_start_index ) 8724 8725 CALL wrd_mpi_io_surface( 't_surf_wall_h', t_surf_wall_h ) 8726 CALL wrd_mpi_io_surface( 't_surf_window_h', t_surf_window_h ) 8727 CALL wrd_mpi_io_surface( 't_surf_green_h', t_surf_green_h ) 8728 8729 CALL wrd_mpi_io_surface( 'm_liq_usm_h', m_liq_usm_h%var_usm_1d ) 8730 IF ( indoor_model ) THEN 8731 CALL wrd_mpi_io_surface( 'waste_heat_h', surf_usm_h%waste_heat ) ! NEED TO BE CHECKED!!!!! 8732 ENDIF 7396 DO l = 0, 1 7397 7398 WRITE( dum, '(I1)') l 7399 7400 END DO 7401 CALL rd_mpi_io_surface_filetypes( surf_usm_h(l)%start_index, surf_usm_h(l)%end_index, & 7402 surface_data_to_write, global_start_index ) 7403 7404 CALL wrd_mpi_io( 'usm_start_index_h_' // dum, surf_usm_h(l)%start_index ) 7405 CALL wrd_mpi_io( 'usm_end_index_h_' // dum, surf_usm_h(l)%end_index ) 7406 CALL wrd_mpi_io( 'usm_global_start_h_' // dum, global_start_index ) 7407 7408 CALL wrd_mpi_io_surface( 't_surf_wall_h_' // dum, t_surf_wall_h(l)%val ) 7409 CALL wrd_mpi_io_surface( 't_surf_window_h_' // dum, t_surf_window_h(l)%val ) 7410 CALL wrd_mpi_io_surface( 't_surf_green_h_' // dum, t_surf_green_h(l)%val ) 7411 7412 CALL wrd_mpi_io_surface( 'm_liq_usm_h_' // dum, m_liq_usm_h(l)%val ) 7413 IF ( indoor_model ) THEN 7414 CALL wrd_mpi_io_surface( 'waste_heat_h_' // dum, surf_usm_h(l)%waste_heat ) ! NEED TO BE CHECKED!!!!! 7415 ENDIF 8733 7416 8734 7417 DO l = 0, 3 … … 8745 7428 IF ( .NOT. surface_data_to_write ) CYCLE 8746 7429 8747 CALL wrd_mpi_io_surface( 't_surf_wall_v(' // dum // ')', t_surf_wall_v(l)% t)8748 CALL wrd_mpi_io_surface( 't_surf_window_v(' // dum // ')', t_surf_window_v(l)% t)8749 CALL wrd_mpi_io_surface( 't_surf_green_v(' // dum // ')', t_surf_green_v(l)% t)7430 CALL wrd_mpi_io_surface( 't_surf_wall_v(' // dum // ')', t_surf_wall_v(l)%val ) 7431 CALL wrd_mpi_io_surface( 't_surf_window_v(' // dum // ')', t_surf_window_v(l)%val ) 7432 CALL wrd_mpi_io_surface( 't_surf_green_v(' // dum // ')', t_surf_green_v(l)%val ) 8750 7433 8751 7434 ENDDO 8752 7435 8753 CALL rd_mpi_io_surface_filetypes( surf_usm_h%start_index, surf_usm_h%end_index, & 8754 surface_data_to_write, global_start_index ) 8755 8756 CALL wrd_mpi_io( 'usm_start_index_h_2', surf_usm_h%start_index ) 8757 CALL wrd_mpi_io( 'usm_end_index_h_2', surf_usm_h%end_index ) 8758 CALL wrd_mpi_io( 'usm_global_start_h_2', global_start_index ) 8759 8760 CALL wrd_mpi_io_surface( 't_wall_h', t_wall_h ) 8761 CALL wrd_mpi_io_surface( 't_window_h', t_window_h ) 8762 CALL wrd_mpi_io_surface( 't_green_h', t_green_h ) 7436 DO l = 0, 1 7437 7438 WRITE( dum, '(I1)') l 7439 7440 CALL rd_mpi_io_surface_filetypes( surf_usm_h(l)%start_index, surf_usm_h(l)%end_index, & 7441 surface_data_to_write, global_start_index ) 7442 7443 CALL wrd_mpi_io( 'usm_start_index_h_2_' // dum, surf_usm_h(l)%start_index ) 7444 CALL wrd_mpi_io( 'usm_end_index_h_2_' // dum, surf_usm_h(l)%end_index ) 7445 CALL wrd_mpi_io( 'usm_global_start_h_2_' // dum, global_start_index ) 7446 7447 CALL wrd_mpi_io_surface( 't_wall_h_' // dum, t_wall_h(l)%val ) 7448 CALL wrd_mpi_io_surface( 't_window_h_' // dum, t_window_h(l)%val ) 7449 CALL wrd_mpi_io_surface( 't_green_h_' // dum, t_green_h(l)%val ) 7450 7451 ENDDO 8763 7452 8764 7453 DO l = 0, 3 … … 8775 7464 IF ( .NOT. surface_data_to_write ) CYCLE 8776 7465 8777 CALL wrd_mpi_io_surface( 't_wall_v(' // dum // ')', t_wall_v(l)% t)8778 CALL wrd_mpi_io_surface( 't_window_v(' // dum // ')', t_window_v(l)% t)8779 CALL wrd_mpi_io_surface( 't_green_v(' // dum // ')', t_green_v(l)% t)7466 CALL wrd_mpi_io_surface( 't_wall_v(' // dum // ')', t_wall_v(l)%val ) 7467 CALL wrd_mpi_io_surface( 't_window_v(' // dum // ')', t_window_v(l)%val ) 7468 CALL wrd_mpi_io_surface( 't_green_v(' // dum // ')', t_green_v(l)%val ) 8780 7469 8781 7470 ENDDO
Note: See TracChangeset
for help on using the changeset viewer.