Ignore:
Timestamp:
Oct 7, 2019 1:29:08 PM (5 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/netcdf_data_input_mod.f90

    r4247 r4258  
    2525! -----------------
    2626! $Id$
     27! - Migrate input of soil temperature and moisture to land-surface model.
     28! - Remove interpolate routines and move the only required subroutine to
     29!   land-surface model.
     30!
     31! 4247 2019-09-30 10:18:24Z pavelkrc
    2732! Add reading and processing of building_surface_pars
    2833!
     
    608613    PRIVATE
    609614
    610     INTERFACE netcdf_data_input_interpolate
    611        MODULE PROCEDURE netcdf_data_input_interpolate_1d
    612        MODULE PROCEDURE netcdf_data_input_interpolate_1d_soil
    613        MODULE PROCEDURE netcdf_data_input_interpolate_2d
    614        MODULE PROCEDURE netcdf_data_input_interpolate_3d
    615     END INTERFACE netcdf_data_input_interpolate
    616 
    617615    INTERFACE netcdf_data_input_check_dynamic
    618616       MODULE PROCEDURE netcdf_data_input_check_dynamic
     
    650648    END INTERFACE netcdf_data_input_init_3d
    651649   
    652     INTERFACE netcdf_data_input_init_lsm
    653        MODULE PROCEDURE netcdf_data_input_init_lsm
    654     END INTERFACE netcdf_data_input_init_lsm
    655 
    656650    INTERFACE netcdf_data_input_surface_data
    657651       MODULE PROCEDURE netcdf_data_input_surface_data
     
    733727!
    734728!-- Public subroutines
    735     PUBLIC netcdf_data_input_check_dynamic, netcdf_data_input_check_static,    &
     729    PUBLIC netcdf_data_input_check_dynamic,                                    &
     730           netcdf_data_input_check_static,                                     &
    736731           netcdf_data_input_chemistry_data,                                   &
    737732           get_dimension_length,                                               &
    738733           netcdf_data_input_inquire_file,                                     &
    739            netcdf_data_input_init, netcdf_data_input_init_lsm,                 &
    740            netcdf_data_input_init_3d, netcdf_data_input_att,                   &
    741            netcdf_data_input_interpolate,                                      &
    742            netcdf_data_input_surface_data, netcdf_data_input_topo,             &
     734           netcdf_data_input_init,                                             &
     735           netcdf_data_input_init_3d,                                          &
     736           netcdf_data_input_att,                                              &
     737           netcdf_data_input_surface_data,                                     &
     738           netcdf_data_input_topo,                                             &
    743739           netcdf_data_input_var,                                              &
    744740           get_attribute,                                                      &
     
    29142910       IF ( init_3d%nx-1 /= nx  .OR.  init_3d%nxu-1 /= nx - 1  .OR.            &
    29152911            init_3d%ny-1 /= ny  .OR.  init_3d%nyv-1 /= ny - 1 )  THEN
    2916           message_string = 'Number of inifor horizontal grid points  '//       &
    2917                            'does not match the number of numeric grid '//      &
    2918                            'points.'
     2912          message_string = 'Number of horizontal grid points in '//            &
     2913                           'dynamic input file does not match ' //             &
     2914                           'the number of numeric grid points.'
    29192915          CALL message( 'netcdf_data_input_mod', 'PA0543', 1, 2, 0, 6, 0 )
    29202916       ENDIF
    29212917
    29222918       IF ( init_3d%nzu /= nz )  THEN
    2923           message_string = 'Number of inifor vertical grid points ' //         &
    2924                            'does not match the number of numeric grid '//      &
    2925                            'points.'
     2919          message_string = 'Number of vertical grid points in '//              &
     2920                           'dynamic input file does not match ' //             &
     2921                           'the number of numeric grid points.'
    29262922          CALL message( 'netcdf_data_input_mod', 'PA0543', 1, 2, 0, 6, 0 )
    29272923       ENDIF
     
    33533349
    33543350    END SUBROUTINE netcdf_data_input_init_3d
    3355    
    3356 !------------------------------------------------------------------------------!
    3357 ! Description:
    3358 ! ------------
    3359 !> Reads initialization data of u, v, w, pt, q, geostrophic wind components,
    3360 !> as well as soil moisture and soil temperature, derived from larger-scale
    3361 !> model (COSMO) by Inifor.
    3362 !------------------------------------------------------------------------------!
    3363     SUBROUTINE netcdf_data_input_init_lsm
    3364 
    3365        USE control_parameters,                                                 &
    3366            ONLY:  message_string
    3367 
    3368        USE indices,                                                            &
    3369            ONLY:  nx, nxl, nxr, ny, nyn, nys
    3370 
    3371        IMPLICIT NONE
    3372 
    3373        CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE ::  var_names !< string containing all variables on file
    3374      
    3375        INTEGER(iwp) ::  id_dynamic !< NetCDF id of dynamic input file
    3376        INTEGER(iwp) ::  num_vars   !< number of variables in netcdf input file
    3377 
    3378 !
    3379 !--    Skip routine if no input file with dynamic input data is available.
    3380        IF ( .NOT. input_pids_dynamic )  RETURN
    3381 !
    3382 !--    CPU measurement
    3383        CALL cpu_log( log_point_s(85), 'NetCDF input init', 'start' )
    3384 
    3385 #if defined ( __netcdf )
    3386 !
    3387 !--    Open file in read-only mode
    3388        CALL open_read_file( TRIM( input_file_dynamic ) //                      &
    3389                             TRIM( coupling_char ), id_dynamic )
    3390 
    3391 !
    3392 !--    At first, inquire all variable names.
    3393        CALL inquire_num_variables( id_dynamic, num_vars )
    3394 !
    3395 !--    Allocate memory to store variable names.
    3396        ALLOCATE( var_names(1:num_vars) )
    3397        CALL inquire_variable_names( id_dynamic, var_names )
    3398 !
    3399 !--    Read vertical dimension for soil depth.
    3400        IF ( check_existence( var_names, 'zsoil' ) )                            &
    3401           CALL get_dimension_length( id_dynamic, init_3d%nzs, 'zsoil' )
    3402 !
    3403 !--    Read also the horizontal dimensions required for soil initialization.
    3404 !--    Please note, in case of non-nested runs or in case of root domain,
    3405 !--    these data is already available, but will be read again for the sake
    3406 !--    of clearness.
    3407        CALL get_dimension_length( id_dynamic, init_3d%nx, 'x'  )
    3408        CALL get_dimension_length( id_dynamic, init_3d%ny, 'y'  )
    3409 !
    3410 !--    Check for correct horizontal and vertical dimension. Please note,
    3411 !--    in case of non-nested runs or in case of root domain, these checks
    3412 !--    are already performed
    3413        IF ( init_3d%nx-1 /= nx  .OR.  init_3d%ny-1 /= ny )  THEN
    3414           message_string = 'Number of inifor horizontal grid points  '//       &
    3415                            'does not match the number of numeric grid points.'
    3416           CALL message( 'netcdf_data_input_mod', 'PA0543', 1, 2, 0, 6, 0 )
    3417        ENDIF
    3418 !
    3419 !--    Read vertical dimensions. Later, these are required for eventual
    3420 !--    inter- and extrapolations of the initialization data.
    3421        IF ( check_existence( var_names, 'zsoil' ) )  THEN
    3422           ALLOCATE( init_3d%z_soil(1:init_3d%nzs) )
    3423           CALL get_variable( id_dynamic, 'zsoil', init_3d%z_soil )
    3424        ENDIF
    3425 !
    3426 !--    Read initial data for soil moisture
    3427        IF ( check_existence( var_names, 'init_soil_m' ) )  THEN
    3428 !
    3429 !--       Read attributes for the fill value and level-of-detail
    3430           CALL get_attribute( id_dynamic, char_fill,                           &
    3431                               init_3d%fill_msoil,                              &
    3432                               .FALSE., 'init_soil_m' )
    3433           CALL get_attribute( id_dynamic, char_lod,                            &
    3434                               init_3d%lod_msoil,                               &
    3435                               .FALSE., 'init_soil_m' )
    3436 !
    3437 !--       level-of-detail 1 - read initialization profile
    3438           IF ( init_3d%lod_msoil == 1 )  THEN
    3439              ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
    3440 
    3441              CALL get_variable( id_dynamic, 'init_soil_m',                     &
    3442                                 init_3d%msoil_1d(0:init_3d%nzs-1) )
    3443 !
    3444 !--       level-of-detail 2 - read 3D initialization data
    3445           ELSEIF ( init_3d%lod_msoil == 2 )  THEN
    3446              ALLOCATE ( init_3d%msoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr) )
    3447 
    3448             CALL get_variable( id_dynamic, 'init_soil_m',                      &   
    3449                              init_3d%msoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr),&
    3450                              nxl, nxr, nys, nyn, 0, init_3d%nzs-1 )
    3451 
    3452           ENDIF
    3453           init_3d%from_file_msoil = .TRUE.
    3454        ENDIF
    3455 !
    3456 !--    Read soil temperature
    3457        IF ( check_existence( var_names, 'init_soil_t' ) )  THEN
    3458 !
    3459 !--       Read attributes for the fill value and level-of-detail
    3460           CALL get_attribute( id_dynamic, char_fill,                           &
    3461                               init_3d%fill_tsoil,                              &
    3462                               .FALSE., 'init_soil_t' )
    3463           CALL get_attribute( id_dynamic, char_lod,                            &
    3464                               init_3d%lod_tsoil,                               &
    3465                               .FALSE., 'init_soil_t' )
    3466 !
    3467 !--       level-of-detail 1 - read initialization profile
    3468           IF ( init_3d%lod_tsoil == 1 )  THEN
    3469              ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
    3470 
    3471              CALL get_variable( id_dynamic, 'init_soil_t',                     &
    3472                                 init_3d%tsoil_1d(0:init_3d%nzs-1) )
    3473 
    3474 !
    3475 !--       level-of-detail 2 - read 3D initialization data
    3476           ELSEIF ( init_3d%lod_tsoil == 2 )  THEN
    3477              ALLOCATE ( init_3d%tsoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr) )
    3478              
    3479              CALL get_variable( id_dynamic, 'init_soil_t',                     &   
    3480                              init_3d%tsoil_3d(0:init_3d%nzs-1,nys:nyn,nxl:nxr),&
    3481                              nxl, nxr, nys, nyn, 0, init_3d%nzs-1 )
    3482           ENDIF
    3483           init_3d%from_file_tsoil = .TRUE.
    3484        ENDIF
    3485 !
    3486 !--    Close input file
    3487        CALL close_input_file( id_dynamic )
    3488 #endif
    3489 !
    3490 !--    End of CPU measurement
    3491        CALL cpu_log( log_point_s(85), 'NetCDF input init', 'stop' )
    3492 
    3493     END SUBROUTINE netcdf_data_input_init_lsm   
    34943351
    34953352!------------------------------------------------------------------------------!
     
    35843441                message_string = 'Reading 3D building data - vertical ' //     &
    35853442                                 'coordinate do not match numeric grid.'
    3586                 CALL message( 'netcdf_data_input_mod', 'PA0553', 2, 2, myid, 6, 0 )
     3443                CALL message( 'netcdf_data_input_mod', 'PA0553', 2, 2, 0, 6, 0 )
    35873444             ENDIF
    35883445          ENDIF
     
    42274084
    42284085    END SUBROUTINE resize_array_4d_real
    4229    
    4230 !------------------------------------------------------------------------------!
    4231 ! Description:
    4232 ! ------------
    4233 !> Vertical interpolation and extrapolation of 1D variables.
    4234 !------------------------------------------------------------------------------!
    4235     SUBROUTINE netcdf_data_input_interpolate_1d( var, z_grid, z_file)
    4236 
    4237        IMPLICIT NONE
    4238 
    4239        INTEGER(iwp) ::  k       !< running index z-direction file
    4240        INTEGER(iwp) ::  kk      !< running index z-direction stretched model grid
    4241        INTEGER(iwp) ::  kl      !< lower index bound along z-direction
    4242        INTEGER(iwp) ::  ku      !< upper index bound along z-direction
    4243 
    4244        REAL(wp), DIMENSION(:) ::  z_grid                  !< grid levels on numeric grid
    4245        REAL(wp), DIMENSION(:) ::  z_file                  !< grid levels on file grid
    4246        REAL(wp), DIMENSION(:), INTENT(INOUT) ::  var      !< treated variable
    4247        REAL(wp), DIMENSION(:), ALLOCATABLE   ::  var_tmp  !< temporary variable
    4248 
    4249 
    4250        kl = LBOUND(var,1)
    4251        ku = UBOUND(var,1)
    4252        ALLOCATE( var_tmp(kl:ku) )
    4253 
    4254        DO  k = kl, ku
    4255 
    4256           kk = MINLOC( ABS( z_file - z_grid(k) ), DIM = 1 )
    4257 
    4258           IF ( kk < ku )  THEN
    4259              IF ( z_file(kk) - z_grid(k) <= 0.0_wp )  THEN
    4260                 var_tmp(k) = var(kk) +                                         &
    4261                                        ( var(kk+1)        - var(kk)    ) /     &
    4262                                        ( z_file(kk+1)     - z_file(kk) ) *     &
    4263                                        ( z_grid(k)        - z_file(kk) )
    4264 
    4265              ELSEIF ( z_file(kk) - z_grid(k) > 0.0_wp )  THEN
    4266                 var_tmp(k) = var(kk-1) +                                       &
    4267                                          ( var(kk)     - var(kk-1)    ) /      &
    4268                                          ( z_file(kk)  - z_file(kk-1) ) *      &
    4269                                          ( z_grid(k)   - z_file(kk-1) )
    4270              ENDIF
    4271 !
    4272 !--       Extrapolate
    4273           ELSE
    4274 
    4275              var_tmp(k) = var(ku) +   ( var(ku)    - var(ku-1)      ) /        &
    4276                                       ( z_file(ku) - z_file(ku-1)   ) *        &
    4277                                       ( z_grid(k)  - z_file(ku)     )
    4278 
    4279           ENDIF
    4280 
    4281        ENDDO
    4282        var(:) = var_tmp(:)
    4283 
    4284        DEALLOCATE( var_tmp )
    4285 
    4286 
    4287     END SUBROUTINE netcdf_data_input_interpolate_1d
    4288 
    4289 
    4290 !------------------------------------------------------------------------------!
    4291 ! Description:
    4292 ! ------------
    4293 !> Vertical interpolation and extrapolation of 1D variables from Inifor grid
    4294 !> onto Palm grid, where both have same dimension. Please note, the passed
    4295 !> paramter list in 1D version is different compared to 2D version.
    4296 !------------------------------------------------------------------------------!
    4297     SUBROUTINE netcdf_data_input_interpolate_1d_soil( var, var_file,           &
    4298                                                       z_grid, z_file,          &
    4299                                                       nzb_var, nzt_var,        &
    4300                                                       nzb_file, nzt_file )
    4301 
    4302        IMPLICIT NONE
    4303 
    4304        INTEGER(iwp) ::  k        !< running index z-direction file
    4305        INTEGER(iwp) ::  kk       !< running index z-direction stretched model grid
    4306        INTEGER(iwp) ::  ku       !< upper index bound along z-direction for varialbe from file
    4307        INTEGER(iwp) ::  nzb_var  !< lower bound of final array
    4308        INTEGER(iwp) ::  nzt_var  !< upper bound of final array
    4309        INTEGER(iwp) ::  nzb_file !< lower bound of file array
    4310        INTEGER(iwp) ::  nzt_file !< upper bound of file array
    4311 
    4312 !        LOGICAL, OPTIONAL ::  zsoil !< flag indicating reverse z-axis, i.e. zsoil instead of height, e.g. in case of ocean or soil
    4313 
    4314        REAL(wp), DIMENSION(nzb_var:nzt_var)   ::  z_grid   !< grid levels on numeric grid
    4315        REAL(wp), DIMENSION(nzb_file:nzt_file) ::  z_file   !< grid levels on file grid
    4316        REAL(wp), DIMENSION(nzb_var:nzt_var)   ::  var      !< treated variable
    4317        REAL(wp), DIMENSION(nzb_file:nzt_file) ::  var_file !< temporary variable
    4318 
    4319        ku = nzt_file
    4320 
    4321        DO  k = nzb_var, nzt_var
    4322 !
    4323 !--       Determine index on Inifor grid which is closest to the actual height
    4324           kk = MINLOC( ABS( z_file - z_grid(k) ), DIM = 1 )
    4325 !
    4326 !--       If closest index on Inifor grid is smaller than top index,
    4327 !--       interpolate the data
    4328           IF ( kk < nzt_file )  THEN
    4329              IF ( z_file(kk) - z_grid(k) <= 0.0_wp )  THEN
    4330                 var(k) = var_file(kk) + ( var_file(kk+1) - var_file(kk) ) /    &
    4331                                         ( z_file(kk+1)   - z_file(kk)   ) *    &
    4332                                         ( z_grid(k)      - z_file(kk)   )
    4333 
    4334              ELSEIF ( z_file(kk) - z_grid(k) > 0.0_wp )  THEN
    4335                 var(k) = var_file(kk-1) + ( var_file(kk) - var_file(kk-1) ) /  &
    4336                                           ( z_file(kk)   - z_file(kk-1)   ) *  &
    4337                                           ( z_grid(k)    - z_file(kk-1)   )
    4338              ENDIF
    4339 !
    4340 !--       Extrapolate if actual height is above the highest Inifor level by the last value
    4341           ELSE
    4342              var(k) = var_file(ku)
    4343           ENDIF
    4344 
    4345        ENDDO
    4346 
    4347     END SUBROUTINE netcdf_data_input_interpolate_1d_soil
    4348 
    4349 !------------------------------------------------------------------------------!
    4350 ! Description:
    4351 ! ------------
    4352 !> Vertical interpolation and extrapolation of 2D variables at lateral boundaries.
    4353 !------------------------------------------------------------------------------!
    4354     SUBROUTINE netcdf_data_input_interpolate_2d( var, z_grid, z_file)
    4355 
    4356        IMPLICIT NONE
    4357 
    4358        INTEGER(iwp) ::  i       !< running index x- or y -direction
    4359        INTEGER(iwp) ::  il      !< lower index bound along x- or y-direction
    4360        INTEGER(iwp) ::  iu      !< upper index bound along x- or y-direction
    4361        INTEGER(iwp) ::  k       !< running index z-direction file
    4362        INTEGER(iwp) ::  kk      !< running index z-direction stretched model grid
    4363        INTEGER(iwp) ::  kl      !< lower index bound along z-direction
    4364        INTEGER(iwp) ::  ku      !< upper index bound along z-direction
    4365 
    4366        REAL(wp), DIMENSION(:) ::  z_grid                  !< grid levels on numeric grid
    4367        REAL(wp), DIMENSION(:) ::  z_file                  !< grid levels on file grid
    4368        REAL(wp), DIMENSION(:,:), INTENT(INOUT) ::  var    !< treated variable
    4369        REAL(wp), DIMENSION(:), ALLOCATABLE   ::  var_tmp  !< temporary variable
    4370 
    4371 
    4372        il = LBOUND(var,2)
    4373        iu = UBOUND(var,2)
    4374        kl = LBOUND(var,1)
    4375        ku = UBOUND(var,1)
    4376        ALLOCATE( var_tmp(kl:ku) )
    4377 
    4378        DO  i = il, iu
    4379           DO  k = kl, ku
    4380 
    4381              kk = MINLOC( ABS( z_file - z_grid(k) ), DIM = 1 )
    4382 
    4383              IF ( kk < ku )  THEN
    4384                 IF ( z_file(kk) - z_grid(k) <= 0.0_wp )  THEN
    4385                    var_tmp(k) = var(kk,i) +                                    &
    4386                                           ( var(kk+1,i)      - var(kk,i)  ) /  &
    4387                                           ( z_file(kk+1)     - z_file(kk) ) *  &
    4388                                           ( z_grid(k)        - z_file(kk) )
    4389 
    4390                 ELSEIF ( z_file(kk) - z_grid(k) > 0.0_wp )  THEN
    4391                    var_tmp(k) = var(kk-1,i) +                                  &
    4392                                             ( var(kk,i)   - var(kk-1,i)  ) /   &
    4393                                             ( z_file(kk)  - z_file(kk-1) ) *   &
    4394                                             ( z_grid(k)   - z_file(kk-1) )
    4395                 ENDIF
    4396 !
    4397 !--          Extrapolate
    4398              ELSE
    4399 
    4400                 var_tmp(k) = var(ku,i) + ( var(ku,i)  - var(ku-1,i)    ) /     &
    4401                                          ( z_file(ku) - z_file(ku-1)   ) *     &
    4402                                          ( z_grid(k)  - z_file(ku)     )
    4403 
    4404              ENDIF
    4405 
    4406           ENDDO
    4407           var(:,i) = var_tmp(:)
    4408 
    4409        ENDDO
    4410 
    4411        DEALLOCATE( var_tmp )
    4412 
    4413 
    4414     END SUBROUTINE netcdf_data_input_interpolate_2d
    4415 
    4416 !------------------------------------------------------------------------------!
    4417 ! Description:
    4418 ! ------------
    4419 !> Vertical interpolation and extrapolation of 3D variables.
    4420 !------------------------------------------------------------------------------!
    4421     SUBROUTINE netcdf_data_input_interpolate_3d( var, z_grid, z_file )
    4422 
    4423        IMPLICIT NONE
    4424 
    4425        INTEGER(iwp) ::  i       !< running index x-direction
    4426        INTEGER(iwp) ::  il      !< lower index bound along x-direction
    4427        INTEGER(iwp) ::  iu      !< upper index bound along x-direction
    4428        INTEGER(iwp) ::  j       !< running index y-direction
    4429        INTEGER(iwp) ::  jl      !< lower index bound along x-direction
    4430        INTEGER(iwp) ::  ju      !< upper index bound along x-direction
    4431        INTEGER(iwp) ::  k       !< running index z-direction file
    4432        INTEGER(iwp) ::  kk      !< running index z-direction stretched model grid
    4433        INTEGER(iwp) ::  kl      !< lower index bound along z-direction
    4434        INTEGER(iwp) ::  ku      !< upper index bound along z-direction
    4435 
    4436        REAL(wp), DIMENSION(:) ::  z_grid                      !< grid levels on numeric grid
    4437        REAL(wp), DIMENSION(:) ::  z_file                      !< grid levels on file grid
    4438        REAL(wp), DIMENSION(:,:,:), INTENT(INOUT) ::  var      !< treated variable
    4439        REAL(wp), DIMENSION(:), ALLOCATABLE       ::  var_tmp  !< temporary variable
    4440 
    4441        il = LBOUND(var,3)
    4442        iu = UBOUND(var,3)
    4443        jl = LBOUND(var,2)
    4444        ju = UBOUND(var,2)
    4445        kl = LBOUND(var,1)
    4446        ku = UBOUND(var,1)
    4447 
    4448        ALLOCATE( var_tmp(kl:ku) )
    4449 
    4450        DO  i = il, iu
    4451           DO  j = jl, ju
    4452              DO  k = kl, ku
    4453 
    4454                 kk = MINLOC( ABS( z_file - z_grid(k) ), DIM = 1 )
    4455 
    4456                 IF ( kk < ku )  THEN
    4457                    IF ( z_file(kk) - z_grid(k) <= 0.0_wp )  THEN
    4458                       var_tmp(k) = var(kk,j,i) +                               &
    4459                                              ( var(kk+1,j,i) - var(kk,j,i) ) / &
    4460                                              ( z_file(kk+1)  - z_file(kk)  ) * &
    4461                                              ( z_grid(k)     - z_file(kk)  )
    4462 
    4463                    ELSEIF ( z_file(kk) - z_grid(k) > 0.0_wp )  THEN
    4464                       var_tmp(k) = var(kk-1,j,i) +                             &
    4465                                              ( var(kk,j,i) - var(kk-1,j,i) ) / &
    4466                                              ( z_file(kk)  - z_file(kk-1)  ) * &
    4467                                              ( z_grid(k)   - z_file(kk-1)  )
    4468                    ENDIF
    4469 !
    4470 !--             Extrapolate
    4471                 ELSE
    4472                    var_tmp(k) = var(ku,j,i) +                                  &
    4473                                        ( var(ku,j,i)  - var(ku-1,j,i)   ) /    &
    4474                                        ( z_file(ku)   - z_file(ku-1)    ) *    &
    4475                                        ( z_grid(k)    - z_file(ku)      )
    4476 
    4477                 ENDIF
    4478              ENDDO
    4479              var(:,j,i) = var_tmp(:)
    4480           ENDDO
    4481        ENDDO
    4482 
    4483        DEALLOCATE( var_tmp )
    4484 
    4485 
    4486     END SUBROUTINE netcdf_data_input_interpolate_3d
    44874086
    44884087!------------------------------------------------------------------------------!
Note: See TracChangeset for help on using the changeset viewer.