Ignore:
Timestamp:
Oct 7, 2019 1:29:08 PM (2 years ago)
Author:
suehring
Message:

Land-surface model: Revise limitation for soil moisture in case it exceeds its saturation value; Revise initialization of soil moisture and temperature in a nested run in case dynamic input information is available. This case, the soil within the child domains can be initialized separately; As part of this revision, migrate the netcdf input of soil temperature / moisture to this module, as well as the routine to inter/extrapolate soil profiles between different grids.; Plant-canopy: Check if any LAD is prescribed when plant-canopy model is applied, in order to avoid crashes in the radiation transfer model; Surface-layer fluxes: Initialization of Obukhov length also at vertical surfaces (if allocated); Urban-surface model: Add checks to ensure that relative fractions of walls, windowns and green surfaces sum-u to one; Revise message calls dealing with local checks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/land_surface_model_mod.f90

    r4251 r4258  
    2525! -----------------
    2626! $Id$
     27! - Revise limitation for soil moisture in case it exceeds its saturation
     28!   value (J. Resler)
     29! - Revise initialization of soil moisture and temperature in a nested run in
     30!   case dynamic input information is available. This case, the soil within
     31!   the child domains can be initialized separately. (J. Resler, M. Suehring)
     32! - As part of this revision, migrate the netcdf input of soil temperature /
     33!   moisture to this module, as well as the routine to inter/extrapolate soil
     34!   profiles between different grids.
     35!
     36! 4251 2019-10-02 12:07:38Z maronga
    2737! Bugfix: albedo_types for vegetation_type look-up table corrected.
    2838!
     
    174184
    175185    USE control_parameters,                                                    &
    176         ONLY:  cloud_droplets, coupling_start_time,                            &
     186        ONLY:  cloud_droplets,                                                 &
     187               coupling_char,                                                  &
     188               coupling_start_time,                                            &
    177189               debug_output, debug_output_timestep, debug_string,              &
    178190               dt_3d,                                                          &
     
    183195               surface_pressure, timestep_scheme, tsc,                         &
    184196               time_since_reference_point
     197               
     198    USE cpulog,                                                                &
     199        ONLY:  cpu_log, log_point_s
    185200
    186201    USE indices,                                                               &
     
    192207    USE netcdf_data_input_mod,                                                 &
    193208        ONLY :  building_type_f,                                               &
     209                char_fill,                                                     &
     210                char_lod,                                                      &
     211                check_existence,                                               &
     212                close_input_file,                                              &
     213                get_attribute,                                                 &
     214                get_dimension_length,                                          &
     215                get_variable,                                                  &
    194216                init_3d,                                                       &
    195217                input_file_dynamic,                                            &
    196218                input_pids_dynamic,                                            &
    197219                input_pids_static,                                             &
    198                 netcdf_data_input_interpolate,                                 &
    199                 netcdf_data_input_init_lsm,                                    &
     220                inquire_num_variables,                                         &
     221                inquire_variable_names,                                        &
     222                num_var_pids,                                                  &
     223                open_read_file,                                                &
     224                pids_id,                                                       &
    200225                pavement_pars_f,                                               &
    201226                pavement_subsurface_pars_f,                                    &
     
    205230                soil_type_f,                                                   &
    206231                surface_fraction_f,                                            &
     232                vars_pids,                                                     &
    207233                vegetation_pars_f,                                             &
    208234                vegetation_type_f,                                             &
    209235                water_pars_f,                                                  &
    210                 water_type_f
     236                water_type_f             
    211237
    212238    USE kinds
     
    22762302           ONLY:  nx, ny, topo_min_level
    22772303
     2304       USE pmc_handle_communicator,                                            &
     2305        ONLY:  pmc_is_rootmodel
     2306           
    22782307       USE pmc_interface,                                                      &
    22792308           ONLY:  nested_run
    22802309   
    22812310       IMPLICIT NONE
    2282 
    2283        LOGICAL      ::  init_msoil_from_parent   !< flag controlling initialization of soil moisture in nested child domains
    2284        LOGICAL      ::  init_tsoil_from_parent   !< flag controlling initialization of soil temperature in nested child domains
    22852311
    22862312       INTEGER(iwp) ::  i                       !< running index
     
    22952321       INTEGER(iwp) ::  st                      !< soil-type index
    22962322       INTEGER(iwp) ::  n_soil_layers_total     !< temperature variable, stores the total number of soil layers + 4
    2297 
    2298        REAL(wp), DIMENSION(:), ALLOCATABLE ::  bound, bound_root_fr  !< temporary arrays for storing index bounds
    2299        REAL(wp), DIMENSION(:), ALLOCATABLE ::  pr_soil_init !< temporary array used for averaging soil profiles
     2323#if defined( __parallel )
     2324       INTEGER(iwp) ::  nzs_root                !< number of soil layers in root domain (used in case soil data needs to be
     2325                                                !< transferred from root model to child models)   
     2326                                               
     2327       REAL(wp), DIMENSION(:), ALLOCATABLE ::  m_soil_root    !< domain-averaged soil moisture profile in root domain
     2328       REAL(wp), DIMENSION(:), ALLOCATABLE ::  t_soil_root    !< domain-averaged soil temperature profile in root domain
     2329#endif
     2330       REAL(wp), DIMENSION(:), ALLOCATABLE ::  bound          !< temporary arrays for storing index bounds
     2331       REAL(wp), DIMENSION(:), ALLOCATABLE ::  bound_root_fr  !< temporary arrays for storing index bounds
     2332       REAL(wp), DIMENSION(:), ALLOCATABLE ::  pr_soil_init   !< temporary array used for averaging soil profiles
     2333#if defined( __parallel )
     2334       REAL(wp), DIMENSION(:), ALLOCATABLE ::  z_soil_root    !< vertical dimension of soil grid in root domain
     2335#endif
    23002336
    23012337       IF ( debug_output )  CALL debug_message( 'lsm_init', 'start' )
     
    40184054       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
    40194055!
    4020 !--       Read soil properties from dynamic input file.
    4021           IF ( INDEX( initializing_actions, 'inifor' ) /= 0 )                  &
    4022              CALL netcdf_data_input_init_lsm
    4023 !
    4024 !--       In case no dynamic input is available for a child domain but root
    4025 !--       domain is initialized with dynamic input file, the different soil
    4026 !--       properties can lead to significant discrepancies in the atmospheric
    4027 !--       surface forcing. For this reason, the child domain
    4028 !--       is initialized with mean soil profiles from the root domain, even if
    4029 !--       no initialization with inifor is set.
    4030           init_tsoil_from_parent = .FALSE.
    4031           init_msoil_from_parent = .FALSE.
    4032           IF ( nested_run )  THEN
    4033 #if defined( __parallel )
    4034              CALL MPI_ALLREDUCE( init_3d%from_file_tsoil,                      &
    4035                                  init_tsoil_from_parent,                       &
    4036                                  1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr )
    4037              CALL MPI_ALLREDUCE( init_3d%from_file_msoil,                      &
    4038                                  init_msoil_from_parent,                       &
    4039                                  1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr )
    4040 #endif
    4041           ENDIF
    4042 !
    40434056!--       First, initialize soil temperature and moisture.
    40444057!--       According to the initialization for surface and soil parameters,
     
    40704083          ENDDO
    40714084!
    4072 !--       Initialization of soil moisture and temperature from file.
    4073 !--       In case of no dynamic input file is available for the child domain,
    4074 !--       transfer soil mean profiles from the root-parent domain onto all
    4075 !--       child domains.
    4076           IF ( init_msoil_from_parent )  THEN
    4077 !
    4078 !--          Child domains will be only initialized with horizontally
    4079 !--          averaged soil profiles in parent domain (for sake of simplicity).
    4080 !--          If required, average soil data on root parent domain before
    4081 !--          distribute onto child domains.
    4082              IF ( init_3d%from_file_msoil  .AND.  init_3d%lod_msoil == 2 )     &
    4083              THEN
    4084                 ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
    4085 
    4086                 DO  k = 0, init_3d%nzs-1
    4087                    pr_soil_init(k) = SUM( init_3d%msoil_3d(k,nys:nyn,nxl:nxr)  )
    4088                 ENDDO
    4089 !
    4090 !--             Allocate 1D array for soil-moisture profile (will not be
    4091 !--             allocated in lod==2 case).
    4092                 ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
    4093                 init_3d%msoil_1d = 0.0_wp
    4094 #if defined( __parallel )
    4095                 CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%msoil_1d(0),      &
    4096                                     SIZE(pr_soil_init),                        &
    4097                                     MPI_REAL, MPI_SUM, comm2d, ierr )
    4098 #endif
    4099                 init_3d%msoil_1d = init_3d%msoil_1d /                          &
    4100                                         REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
    4101                 DEALLOCATE( pr_soil_init )
     4085!--       Level 2 initialization of the soil, read soil properties from
     4086!--       dynamic input file.
     4087          IF ( input_pids_dynamic )  THEN
     4088!
     4089!--          CPU measurement
     4090             CALL cpu_log( log_point_s(85), 'NetCDF input init', 'start' )
     4091#if defined ( __netcdf )
     4092!
     4093!--          Open file in read-only mode
     4094             CALL open_read_file( TRIM( input_file_dynamic ) //                &
     4095                                  TRIM( coupling_char ), pids_id )
     4096!
     4097!--          Inquire all variable names
     4098             CALL inquire_num_variables( pids_id, num_var_pids )
     4099!
     4100!--          Allocate memory to store variable names.
     4101             ALLOCATE( vars_pids(1:num_var_pids) )
     4102             CALL inquire_variable_names( pids_id, vars_pids )
     4103!           
     4104!--          Read vertical dimension for soil depth.
     4105             IF ( check_existence( vars_pids, 'zsoil' ) )                      &
     4106                CALL get_dimension_length( pids_id, init_3d%nzs, 'zsoil' )
     4107!           
     4108!--          Read also the horizontal dimensions required for soil initialization.
     4109!--          Please note, in case of non-nested runs or in case of root domain,
     4110!--          these data is already available, but will be read again for the sake
     4111!--          of clearness.
     4112             CALL get_dimension_length( pids_id, init_3d%nx, 'x'  )
     4113             CALL get_dimension_length( pids_id, init_3d%ny, 'y'  )
     4114!           
     4115!--          Check for correct horizontal and vertical dimension. Please note,
     4116!--          in case of non-nested runs or in case of root domain, these checks
     4117!--          are already performed
     4118             IF ( init_3d%nx-1 /= nx  .OR.  init_3d%ny-1 /= ny )  THEN
     4119                message_string = 'Number of horizontal grid points in '//      &
     4120                                 'dynamic input file does not match ' //       &
     4121                                 'the number of numeric grid points.'
     4122                CALL message( 'lsm_init', 'PA0543', 1, 2, 0, 6, 0 )
    41024123             ENDIF
    4103           ENDIF
    4104           IF ( init_tsoil_from_parent )  THEN
    4105              IF ( init_3d%from_file_tsoil  .AND.  init_3d%lod_tsoil == 2 )  THEN
    4106                 ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
    4107 
    4108                 DO  k = 0, init_3d%nzs-1
    4109                    pr_soil_init(k) = SUM( init_3d%tsoil_3d(k,nys:nyn,nxl:nxr)  )
    4110                 ENDDO
    4111 !
    4112 !--             Allocate 1D array for soil-temperature profile (will not be
    4113 !--             allocated in lod==2 case).
    4114                 ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
    4115                 init_3d%tsoil_1d = 0.0_wp
    4116 #if defined( __parallel )
    4117                 CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%tsoil_1d(0),      &
    4118                                     SIZE(pr_soil_init),                        &
    4119                                     MPI_REAL, MPI_SUM, comm2d, ierr )
    4120 #endif
    4121                 init_3d%tsoil_1d = init_3d%tsoil_1d /                          &
    4122                                         REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
    4123                 DEALLOCATE( pr_soil_init )
    4124 
     4124!           
     4125!--          Read vertical dimensions. Later, these are required for eventual
     4126!--          inter- and extrapolations of the initialization data.
     4127             IF ( check_existence( vars_pids, 'zsoil' ) )  THEN
     4128                ALLOCATE( init_3d%z_soil(1:init_3d%nzs) )
     4129                CALL get_variable( pids_id, 'zsoil', init_3d%z_soil )
    41254130             ENDIF
    4126           ENDIF
    4127           IF ( init_msoil_from_parent  .OR.  init_tsoil_from_parent )  THEN
    4128 !
    4129 !--          Distribute soil grid information on file from root to all childs.
    4130 !--          Only process with rank 0 sends the information.
    4131 #if defined( __parallel )
    4132              CALL MPI_BCAST( init_3d%nzs,    1,                                &
    4133                              MPI_INTEGER, 0, MPI_COMM_WORLD, ierr )
    4134 #endif
    4135 
    4136              IF ( .NOT.  ALLOCATED( init_3d%z_soil ) )                         &
    4137                 ALLOCATE( init_3d%z_soil(1:init_3d%nzs) )
    4138 #if defined( __parallel )
    4139              CALL MPI_BCAST( init_3d%z_soil, SIZE(init_3d%z_soil),             &
    4140                              MPI_REAL, 0, MPI_COMM_WORLD, ierr )
    4141 #endif
    4142           ENDIF
    4143 !
    4144 !--       ALLOCATE arrays on child domains and set control attributes.
    4145 !--       Note, 1d soil profiles are allocated even though soil information
    4146 !--       is already read from dynamic file in one child domain.
    4147 !--       This case, however, data is not used for further initialization
    4148 !--       since the LoD=2.
    4149           IF ( init_msoil_from_parent )  THEN
    4150              IF ( .NOT. ALLOCATED( init_3d%msoil_1d ) )  THEN
    4151                 ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
    4152                 IF( .NOT. init_3d%from_file_msoil )  init_3d%lod_msoil = 1
     4131!           
     4132!--          Read initial data for soil moisture
     4133             IF ( check_existence( vars_pids, 'init_soil_m' ) )  THEN
     4134!           
     4135!--             Read attributes for the fill value and level-of-detail
     4136                CALL get_attribute( pids_id, char_fill,                        &
     4137                                    init_3d%fill_msoil,                        &
     4138                                    .FALSE., 'init_soil_m' )
     4139                CALL get_attribute( pids_id, char_lod,                         &
     4140                                    init_3d%lod_msoil,                         &
     4141                                    .FALSE., 'init_soil_m' )
     4142!           
     4143!--             level-of-detail 1 - read initialization profile
     4144                IF ( init_3d%lod_msoil == 1 )  THEN
     4145                   ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
     4146           
     4147                   CALL get_variable( pids_id, 'init_soil_m',                  &
     4148                                      init_3d%msoil_1d(0:init_3d%nzs-1) )
     4149!           
     4150!--             level-of-detail 2 - read 3D initialization data
     4151                ELSEIF ( init_3d%lod_msoil == 2 )  THEN
     4152                   ALLOCATE ( init_3d%msoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr) )
     4153           
     4154                  CALL get_variable( pids_id, 'init_soil_m',                   &   
     4155                             init_3d%msoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr),&
     4156                             nxl, nxr, nys, nyn, 0, init_3d%nzs-1 )
     4157           
     4158                ENDIF
    41534159                init_3d%from_file_msoil = .TRUE.
    41544160             ENDIF
    4155           ENDIF
    4156           IF ( init_tsoil_from_parent )  THEN
    4157              IF ( .NOT. ALLOCATED( init_3d%tsoil_1d ) )  THEN
    4158                 ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
    4159                 IF( .NOT. init_3d%from_file_tsoil )  init_3d%lod_tsoil = 1
     4161!           
     4162!--          Read soil temperature
     4163             IF ( check_existence( vars_pids, 'init_soil_t' ) )  THEN
     4164!           
     4165!--             Read attributes for the fill value and level-of-detail
     4166                CALL get_attribute( pids_id, char_fill,                        &
     4167                                    init_3d%fill_tsoil,                        &
     4168                                    .FALSE., 'init_soil_t' )
     4169                CALL get_attribute( pids_id, char_lod,                         &
     4170                                    init_3d%lod_tsoil,                         &
     4171                                    .FALSE., 'init_soil_t' )
     4172!           
     4173!--             level-of-detail 1 - read initialization profile
     4174                IF ( init_3d%lod_tsoil == 1 )  THEN
     4175                   ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
     4176           
     4177                   CALL get_variable( pids_id, 'init_soil_t',                  &
     4178                                      init_3d%tsoil_1d(0:init_3d%nzs-1) )
     4179           
     4180!           
     4181!--             level-of-detail 2 - read 3D initialization data
     4182                ELSEIF ( init_3d%lod_tsoil == 2 )  THEN
     4183                   ALLOCATE ( init_3d%tsoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr) )
     4184                   
     4185                   CALL get_variable( pids_id, 'init_soil_t',                  &   
     4186                             init_3d%tsoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr),&
     4187                             nxl, nxr, nys, nyn, 0, init_3d%nzs-1 )
     4188                ENDIF
    41604189                init_3d%from_file_tsoil = .TRUE.
    41614190             ENDIF
    4162           ENDIF
    4163 !
    4164 !--       Distribute soil profiles from root to all childs
    4165           IF ( init_msoil_from_parent )  THEN
     4191!           
     4192!--          Close input file
     4193             CALL close_input_file( pids_id )
     4194#endif     
     4195!           
     4196!--          End of CPU measurement
     4197             CALL cpu_log( log_point_s(85), 'NetCDF input init', 'stop' )
     4198          ENDIF
     4199!
     4200!--       In case no dynamic input is available for a child domain but the
     4201!--       parent is initialized with dynamic input file, the different soil
     4202!--       states can lead to significant discrepancies in the atmospheric
     4203!--       surface forcing. For this reason, the child domain is initialized with
     4204!--       domain-averaged soil profiles from the root domain, even if
     4205!--       no initialization with inifor is set. Note, as long as a dynamic
     4206!--       input file with soil information is available for the child domain,
     4207!--       the input file information will be used.
     4208          IF ( nested_run )  THEN
    41664209#if defined( __parallel )
    4167              CALL MPI_BCAST( init_3d%msoil_1d, SIZE(init_3d%msoil_1d),         &
     4210!
     4211!--          In case of a nested run, first average the soil profiles in the
     4212!--          root domain.
     4213             IF ( pmc_is_rootmodel() )  THEN
     4214!           
     4215!--             Child domains will be only initialized with horizontally
     4216!--             averaged soil profiles in parent domain (for sake of simplicity).
     4217!--             If required, average soil data on root parent domain before the
     4218!--             soil profiles are distributed onto the child domains.
     4219!--             Start with soil moisture.
     4220                IF ( init_3d%from_file_msoil  .AND.  init_3d%lod_msoil == 2 )  &
     4221                THEN
     4222                   ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
     4223                   DO  k = 0, init_3d%nzs-1
     4224                      pr_soil_init(k) = SUM( init_3d%msoil_3d(k,nys:nyn,nxl:nxr)  )
     4225                   ENDDO
     4226!           
     4227!--                Allocate 1D array for soil-moisture profile (will not be
     4228!--                allocated in lod==2 case).
     4229                   ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
     4230                   init_3d%msoil_1d = 0.0_wp
     4231                   CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%msoil_1d(0),   &
     4232                                       SIZE(pr_soil_init),                     &
     4233                                       MPI_REAL, MPI_SUM, comm2d, ierr )
     4234             
     4235                   init_3d%msoil_1d = init_3d%msoil_1d /                       &
     4236                                        REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
     4237                   DEALLOCATE( pr_soil_init )
     4238                ENDIF
     4239!
     4240!--             Proceed with soil temperature.
     4241                IF ( init_3d%from_file_tsoil  .AND.  init_3d%lod_tsoil == 2 )  &
     4242                THEN
     4243                   ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
     4244             
     4245                   DO  k = 0, init_3d%nzs-1
     4246                      pr_soil_init(k) = SUM( init_3d%tsoil_3d(k,nys:nyn,nxl:nxr)  )
     4247                   ENDDO
     4248!           
     4249!--                Allocate 1D array for soil-temperature profile (will not be
     4250!--                allocated in lod==2 case).
     4251                   ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
     4252                   init_3d%tsoil_1d = 0.0_wp
     4253                   CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%tsoil_1d(0),   &
     4254                                       SIZE(pr_soil_init),                     &
     4255                                       MPI_REAL, MPI_SUM, comm2d, ierr )
     4256                   init_3d%tsoil_1d = init_3d%tsoil_1d /                       &
     4257                                        REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
     4258                   DEALLOCATE( pr_soil_init )
     4259             
     4260                ENDIF
     4261             ENDIF
     4262!
     4263!--          Broadcast number of soil layers in root model to all childs.
     4264!--          Note, only process 0 in COMM_WORLD is sending.
     4265             IF ( pmc_is_rootmodel() )  nzs_root = init_3d%nzs
     4266             
     4267             CALL MPI_BCAST( nzs_root, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr )
     4268!           
     4269!--          Allocate dummy arrays for soil moisture and temperature profiles
     4270!--          on all domains.             
     4271             ALLOCATE( z_soil_root(1:nzs_root)   )
     4272             ALLOCATE( m_soil_root(0:nzs_root-1) )
     4273             ALLOCATE( t_soil_root(0:nzs_root-1) )
     4274!
     4275!--          Distribute the mean soil profiles to all child domains.
     4276             IF ( pmc_is_rootmodel() )  THEN
     4277                z_soil_root = init_3d%z_soil
     4278                m_soil_root = init_3d%msoil_1d
     4279                t_soil_root = init_3d%tsoil_1d
     4280             ENDIF
     4281             
     4282             CALL MPI_BCAST( z_soil_root, SIZE( z_soil_root ),                 &
     4283                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )               
     4284             CALL MPI_BCAST( m_soil_root, SIZE( m_soil_root ),                 &
     4285                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )               
     4286             CALL MPI_BCAST( t_soil_root, SIZE( t_soil_root ),                 &
    41684287                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )
     4288!
     4289!--          In the following, the child domains decide whether they take
     4290!--          the information from the root domain or not.
     4291             IF ( .NOT. pmc_is_rootmodel() )  THEN
     4292!
     4293!--             If soil moisture or temperature isn't in dynamic input file for
     4294!--             the child, take the information provided from the root model.
     4295!--             Start with z-dimension
     4296                IF ( .NOT. init_3d%from_file_msoil  .OR.                       &
     4297                     .NOT. init_3d%from_file_msoil    )  THEN
     4298                   init_3d%nzs = nzs_root
     4299                   ALLOCATE( init_3d%z_soil(1:init_3d%nzs) )
     4300                   init_3d%z_soil(1:init_3d%nzs) = z_soil_root
     4301                ENDIF
     4302!               
     4303!--             Take soil moisture. Note, control flags from_file... and LoD
     4304!--             need to be set.
     4305                IF ( .NOT. init_3d%from_file_msoil )  THEN
     4306                   ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
     4307                   init_3d%lod_msoil = 1
     4308                   init_3d%from_file_msoil = .TRUE.
     4309                   
     4310                   init_3d%msoil_1d = m_soil_root             
     4311                ENDIF
     4312!               
     4313!--             Take soil temperature. Note, control flags from_file... and LoD
     4314!--             need to be set.
     4315                IF (  .NOT. init_3d%from_file_tsoil )  THEN
     4316                   ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
     4317                   init_3d%lod_tsoil = 1
     4318                   init_3d%from_file_tsoil = .TRUE.
     4319                   
     4320                   init_3d%tsoil_1d = t_soil_root 
     4321                ENDIF
     4322             ENDIF
     4323             
     4324             DEALLOCATE( z_soil_root )
     4325             DEALLOCATE( m_soil_root )
     4326             DEALLOCATE( t_soil_root )
     4327          ENDIF
    41694328#endif
    4170                    
    4171           ENDIF
    4172           IF ( init_tsoil_from_parent )  THEN
    4173 #if defined( __parallel )
    4174              CALL MPI_BCAST( init_3d%tsoil_1d, SIZE(init_3d%tsoil_1d),         &
    4175                              MPI_REAL, 0, MPI_COMM_WORLD, ierr )
    4176 #endif
    4177           ENDIF
    41784329!
    41794330!--       Proceed with Level 2 initialization.
     
    41854336                        surf_lsm_h%pavement_surface(m) )  THEN
    41864337
    4187                       CALL netcdf_data_input_interpolate(                      &
     4338                      CALL interpolate_soil_profile(                           &
    41884339                                       m_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
    41894340                                       init_3d%msoil_1d(:),                    &
     
    41974348                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
    41984349                           surf_lsm_v(l)%pavement_surface(m) )  THEN
    4199                          CALL netcdf_data_input_interpolate(                   &
     4350                         CALL interpolate_soil_profile(                        &
    42004351                                       m_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
    42014352                                       init_3d%msoil_1d(:),                    &
     
    42154366
    42164367                      IF ( init_3d%msoil_3d(0,j,i) /= init_3d%fill_msoil )     &
    4217                          CALL netcdf_data_input_interpolate(                   &
     4368                         CALL interpolate_soil_profile(                        &
    42184369                                       m_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
    42194370                                       init_3d%msoil_3d(:,j,i),                &
     
    42364387                         
    42374388                         IF ( init_3d%msoil_3d(0,j,i) /= init_3d%fill_msoil )  &
    4238                             CALL netcdf_data_input_interpolate(                &
     4389                            CALL interpolate_soil_profile(                     &
    42394390                                       m_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
    42404391                                       init_3d%msoil_3d(:,j,i),                &
     
    42554406                   IF ( surf_lsm_h%vegetation_surface(m)  .OR.                 &
    42564407                        surf_lsm_h%pavement_surface(m) )  THEN
    4257                       CALL netcdf_data_input_interpolate(                      &
     4408                      CALL interpolate_soil_profile(                           &
    42584409                                       t_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
    42594410                                       init_3d%tsoil_1d(:),                    &
     
    42704421                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
    42714422                           surf_lsm_v(l)%pavement_surface(m) )  THEN
    4272                         CALL netcdf_data_input_interpolate(                    &
     4423                        CALL interpolate_soil_profile(                         &
    42734424                                       t_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
    42744425                                       init_3d%tsoil_1d(:),                    &
     
    42924443                     
    42934444                      IF ( init_3d%tsoil_3d(0,j,i) /= init_3d%fill_tsoil )     &
    4294                          CALL netcdf_data_input_interpolate(                   &
     4445                         CALL interpolate_soil_profile(                        &
    42954446                                       t_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
    42964447                                       init_3d%tsoil_3d(:,j,i),                &
     
    43164467                         
    43174468                         IF ( init_3d%tsoil_3d(0,j,i) /= init_3d%fill_tsoil )  &
    4318                             CALL netcdf_data_input_interpolate(                &
     4469                            CALL interpolate_soil_profile(                     &
    43194470                                       t_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
    43204471                                       init_3d%tsoil_3d(:,j,i),                &
     
    52985449!--                (mass conservation is violated here)
    52995450                   DO  k = nzb_soil, nzt_soil
    5300                       surf_m_soil_p%var_2d(k,m) = MIN( surf_m_soil_p%var_2d(k,m), surf_m_soil_p%var_2d(k,m) )
     5451                      surf_m_soil_p%var_2d(k,m) = MIN( surf_m_soil_p%var_2d(k,m), surf%m_sat(k,m) )
    53015452                      surf_m_soil_p%var_2d(k,m) = MAX( surf_m_soil_p%var_2d(k,m), 0.0_wp )                     
    53025453                   ENDDO
     
    70617212
    70627213    END SUBROUTINE calc_z0_water_surface
     7214   
     7215
     7216!------------------------------------------------------------------------------!
     7217! Description:
     7218! ------------
     7219!>  Vertical interpolation and extrapolation of 1D soil profile input from
     7220!>  dynamic input file onto the numeric vertical soil grid.
     7221!------------------------------------------------------------------------------!
     7222    SUBROUTINE interpolate_soil_profile( var, var_file, z_grid, z_file,        &
     7223                                         nzb_var, nzt_var, nzb_file, nzt_file )
     7224
     7225       IMPLICIT NONE
     7226
     7227       INTEGER(iwp) ::  k        !< running index z-direction file
     7228       INTEGER(iwp) ::  kk       !< running index z-direction stretched model grid
     7229       INTEGER(iwp) ::  ku       !< upper index bound along z-direction for varialbe from file
     7230       INTEGER(iwp) ::  nzb_var  !< lower bound of final array
     7231       INTEGER(iwp) ::  nzt_var  !< upper bound of final array
     7232       INTEGER(iwp) ::  nzb_file !< lower bound of file array
     7233       INTEGER(iwp) ::  nzt_file !< upper bound of file array
     7234
     7235       REAL(wp), DIMENSION(nzb_var:nzt_var)   ::  z_grid   !< grid levels on numeric grid
     7236       REAL(wp), DIMENSION(nzb_file:nzt_file) ::  z_file   !< grid levels on file grid
     7237       REAL(wp), DIMENSION(nzb_var:nzt_var)   ::  var      !< treated variable
     7238       REAL(wp), DIMENSION(nzb_file:nzt_file) ::  var_file !< temporary variable
     7239
     7240       ku = nzt_file
     7241
     7242       DO  k = nzb_var, nzt_var
     7243!
     7244!--       Determine index on Inifor grid which is closest to the actual height
     7245          kk = MINLOC( ABS( z_file - z_grid(k) ), DIM = 1 )
     7246!
     7247!--       If closest index on Inifor grid is smaller than top index,
     7248!--       interpolate the data
     7249          IF ( kk < nzt_file )  THEN
     7250             IF ( z_file(kk) - z_grid(k) <= 0.0_wp )  THEN
     7251                var(k) = var_file(kk) + ( var_file(kk+1) - var_file(kk) ) /    &
     7252                                        ( z_file(kk+1)   - z_file(kk)   ) *    &
     7253                                        ( z_grid(k)      - z_file(kk)   )
     7254
     7255             ELSEIF ( z_file(kk) - z_grid(k) > 0.0_wp )  THEN
     7256                var(k) = var_file(kk-1) + ( var_file(kk) - var_file(kk-1) ) /  &
     7257                                          ( z_file(kk)   - z_file(kk-1)   ) *  &
     7258                                          ( z_grid(k)    - z_file(kk-1)   )
     7259             ENDIF
     7260!
     7261!--       Extrapolate if actual height is above the highest Inifor level by the last value
     7262          ELSE
     7263             var(k) = var_file(ku)
     7264          ENDIF
     7265
     7266       ENDDO
     7267
     7268    END SUBROUTINE interpolate_soil_profile
    70637269
    70647270!
Note: See TracChangeset for help on using the changeset viewer.