Changeset 4150 for palm/trunk/SOURCE


Ignore:
Timestamp:
Aug 8, 2019 8:00:47 PM (5 years ago)
Author:
suehring
Message:

Framework to input single surface variables independent on land/urban-surface model via static input file provided. This way, input and initialization of heterogeneous roughness was already added.

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r4131 r4150  
    2525! -----------------
    2626! $Id$
     27! Input of additional surface variables independent on land- or urban-surface
     28! model
     29!
     30! 4131 2019-08-02 11:06:18Z monakurppa
    2731! Allocate sums and sums_l to allow profile output for salsa variables.
    2832!
     
    661665
    662666    USE netcdf_data_input_mod,                                                 &
    663         ONLY:  init_3d,                              &
    664                netcdf_data_input_init_3d, netcdf_data_input_interpolate
    665 
     667        ONLY:  char_fill,                                                      &
     668               check_existence,                                                &
     669               close_input_file,                                               &
     670               get_attribute,                                                  &
     671               get_variable,                                                   &
     672               init_3d,                                                        &
     673               input_pids_static,                                              &
     674               inquire_num_variables,                                          &
     675               inquire_variable_names,                                         &
     676               input_file_static,                                              &
     677               netcdf_data_input_init_3d,                                      &
     678               open_read_file,                                                 &
     679               real_2d
     680               
    666681    USE nesting_offl_mod,                                                      &
    667682        ONLY:  nesting_offl_init
     
    695710
    696711    USE surface_mod,                                                           &
    697         ONLY :  init_surface_arrays, init_surfaces, surf_def_h, surf_lsm_h,    &
    698                 surf_usm_h, get_topography_top_index_ji
     712        ONLY :  init_single_surface_properties,                                &
     713                init_surface_arrays,                                           &
     714                init_surfaces,                                                 &
     715                surf_def_h,                                                    &
     716                surf_def_v,                                                    &
     717                surf_lsm_h,                                                    &
     718                surf_usm_h,                                                    &
     719                get_topography_top_index_ji
    699720
    700721#if defined( _OPENACC )
     
    710731    IMPLICIT NONE
    711732
    712     INTEGER(iwp) ::  i             !< grid index in x direction
    713     INTEGER(iwp) ::  ind_array(1)  !< dummy used to determine start index for external pressure forcing
    714     INTEGER(iwp) ::  j             !< grid index in y direction
    715     INTEGER(iwp) ::  k             !< grid index in z direction
    716     INTEGER(iwp) ::  k_surf        !< surface level index
    717     INTEGER(iwp) ::  m             !< index of surface element in surface data type
    718     INTEGER(iwp) ::  sr            !< index of statistic region
     733    CHARACTER(LEN=50), DIMENSION(:), ALLOCATABLE ::  vars_pids_static  !< variable names in static input file
     734   
     735    INTEGER(iwp) ::  i                    !< grid index in x direction
     736    INTEGER(iwp) ::  ind_array(1)         !< dummy used to determine start index for external pressure forcing
     737    INTEGER(iwp) ::  j                    !< grid index in y direction
     738    INTEGER(iwp) ::  k                    !< grid index in z direction
     739    INTEGER(iwp) ::  k_surf               !< surface level index
     740    INTEGER(iwp) ::  l                    !< running index over surface orientation   
     741    INTEGER(iwp) ::  m                    !< index of surface element in surface data type   
     742    INTEGER(iwp) ::  num_vars_pids_static !< number of variables in static input file
     743    INTEGER(iwp) ::  nz_u_shift           !< topography-top index on u-grid, used to vertically shift initial profiles
     744    INTEGER(iwp) ::  nz_v_shift           !< topography-top index on v-grid, used to vertically shift initial profiles
     745    INTEGER(iwp) ::  nz_w_shift           !< topography-top index on w-grid, used to vertically shift initial profiles
     746    INTEGER(iwp) ::  nz_s_shift           !< topography-top index on scalar-grid, used to vertically shift initial profiles
     747    INTEGER(iwp) ::  nz_u_shift_l         !< topography-top index on u-grid, used to vertically shift initial profiles
     748    INTEGER(iwp) ::  nz_v_shift_l         !< topography-top index on v-grid, used to vertically shift initial profiles
     749    INTEGER(iwp) ::  nz_w_shift_l         !< topography-top index on w-grid, used to vertically shift initial profiles
     750    INTEGER(iwp) ::  nz_s_shift_l         !< topography-top index on scalar-grid, used to vertically shift initial profiles
     751    INTEGER(iwp) ::  nzt_l                !< index of top PE boundary for multigrid level
     752    INTEGER(iwp) ::  pids_static_id       !< file id for static input file
     753    INTEGER(iwp) ::  sr                   !< index of statistic region
    719754
    720755    INTEGER(iwp), DIMENSION(:), ALLOCATABLE   ::  ngp_2dh_l  !< toal number of horizontal grid points in statistical region on subdomain
     
    723758    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  ngp_2dh_s_inner_l  !< number of horizontal non-topography grid points on subdomain
    724759
     760
     761   
    725762    REAL(wp), DIMENSION(:), ALLOCATABLE ::  init_l        !< dummy array used for averaging 3D data to obtain inital profiles
    726763    REAL(wp), DIMENSION(:), ALLOCATABLE ::  p_hydrostatic !< hydrostatic pressure
    727764
    728     INTEGER(iwp) ::  l       !< loop variable
    729     INTEGER(iwp) ::  nzt_l   !< index of top PE boundary for multigrid level
    730765    REAL(wp) ::  dx_l !< grid spacing along x on different multigrid level
    731766    REAL(wp) ::  dy_l !< grid spacing along y on different multigrid level
     
    738773    REAL(wp), DIMENSION(:), ALLOCATABLE ::  ngp_3d_inner_tmp  !< total number of non-topography grid points
    739774
    740     INTEGER(iwp) ::  nz_u_shift   !< topography-top index on u-grid, used to vertically shift initial profiles
    741     INTEGER(iwp) ::  nz_v_shift   !< topography-top index on v-grid, used to vertically shift initial profiles
    742     INTEGER(iwp) ::  nz_w_shift   !< topography-top index on w-grid, used to vertically shift initial profiles
    743     INTEGER(iwp) ::  nz_s_shift   !< topography-top index on scalar-grid, used to vertically shift initial profiles
    744     INTEGER(iwp) ::  nz_u_shift_l !< topography-top index on u-grid, used to vertically shift initial profiles
    745     INTEGER(iwp) ::  nz_v_shift_l !< topography-top index on v-grid, used to vertically shift initial profiles
    746     INTEGER(iwp) ::  nz_w_shift_l !< topography-top index on w-grid, used to vertically shift initial profiles
    747     INTEGER(iwp) ::  nz_s_shift_l !< topography-top index on scalar-grid, used to vertically shift initial profiles
    748 
    749 
     775    TYPE(real_2d) ::  tmp_2d !< temporary variable to input additional surface-data from static file
     776   
    750777    CALL location_message( 'model initialization', 'start' )
    751778
     
    16191646          ENDDO
    16201647       ENDIF
    1621 
    16221648!
    16231649!--    Initialization of the turbulence recycling method
     
    20052031       ENDIF
    20062032
     2033    ENDIF
     2034!
     2035!-- In the following, surface properties can be further initialized with
     2036!-- input from static driver file.
     2037!-- At the moment this affects only default surfaces. For example,
     2038!-- roughness length or sensible / latent heat fluxes can be initialized
     2039!-- heterogeneously for default surfaces. Therefore, a generic routine
     2040!-- from netcdf_data_input_mod is called to read a 2D array.
     2041    IF ( input_pids_static )  THEN
     2042!
     2043!--    Open the static input file
     2044       CALL open_read_file( TRIM( input_file_static ) //                    &
     2045                            TRIM( coupling_char ),                          &
     2046                            pids_static_id )
     2047                           
     2048       CALL inquire_num_variables( pids_static_id, num_vars_pids_static )
     2049!
     2050!--    Allocate memory to store variable names and read them
     2051       ALLOCATE( vars_pids_static(1:num_vars_pids_static) )
     2052       CALL inquire_variable_names( pids_static_id, vars_pids_static )
     2053                           
     2054       ALLOCATE( tmp_2d%var(nys:nyn,nxl:nxr) )
     2055       tmp_2d%var = 0.0_wp
     2056!
     2057!--    Input roughness length.
     2058       IF ( check_existence( vars_pids_static, 'z0' ) )  THEN
     2059!
     2060!--       Read _FillValue attribute
     2061          CALL get_attribute( pids_static_id, char_fill, tmp_2d%fill,          &
     2062                              .FALSE., 'z0' )                                 
     2063!                                                                             
     2064!--       Read variable                                                       
     2065          CALL get_variable( pids_static_id, 'z0', tmp_2d%var,                 &
     2066                             nxl, nxr, nys, nyn )                             
     2067!                                                                             
     2068!--       Initialize roughness length. Note, z0 will be only initialized at   
     2069!--       default-type surfaces. At natural or urban z0 is implicitly         
     2070!--       initialized bythe respective parameter lists.                       
     2071!--       Initialize horizontal surface elements.                             
     2072          CALL init_single_surface_properties( surf_def_h(0)%z0,               &
     2073                                               tmp_2d%var,                     &
     2074                                               surf_def_h(0)%ns,               &
     2075                                               tmp_2d%fill,                    &
     2076                                               surf_def_h(0)%i,                &
     2077                                               surf_def_h(0)%j )               
     2078!                                                                             
     2079!--       Initialize roughness also at vertical surface elements.             
     2080!--       Note, the actual 2D input arrays are only defined on the             
     2081!--       subdomain. Therefore, pass the index arrays with their respective   
     2082!--       offset values.                                                       
     2083          DO  l = 0, 3                                                         
     2084             CALL init_single_surface_properties(                              &
     2085                                         surf_def_v(l)%z0,                     &
     2086                                         tmp_2d%var,                           &
     2087                                         surf_def_v(l)%ns,                     &
     2088                                         tmp_2d%fill,                          &
     2089                                         surf_def_v(l)%i + surf_def_v(l)%ioff, &
     2090                                         surf_def_v(l)%j + surf_def_v(l)%joff )
     2091          ENDDO
     2092         
     2093       ENDIF
     2094!
     2095!--    Additional variables, e.g. shf, qsws, etc, can be initialized the
     2096!--    same way.
     2097                           
     2098       DEALLOCATE( tmp_2d%var )
     2099!
     2100!--    Finally, close the input file.
     2101       CALL close_input_file( pids_static_id )
    20072102    ENDIF
    20082103!
  • palm/trunk/SOURCE/netcdf_data_input_mod.f90

    r4125 r4150  
    2525! -----------------
    2626! $Id$
     27! Some variables are given the public attribute, in order to call netcdf input
     28! from single routines
     29!
     30! 4125 2019-07-29 13:31:44Z suehring
    2731! To enable netcdf-parallel access for lateral boundary data (dynamic input),
    2832! zero number of elements are passed to the respective get_variable routine
     
    944948
    945949!
     950!-- Public data structures
     951    PUBLIC real_2d
     952!
    946953!-- Public variables
    947954    PUBLIC albedo_pars_f, albedo_type_f, basal_area_density_f, buildings_f,    &
    948            building_id_f, building_pars_f, building_type_f,                    &
     955           building_id_f, building_pars_f, building_type_f, char_fill,         &
    949956           chem_emis, chem_emis_att, chem_emis_att_type, chem_emis_val_type,   &
    950957           coord_ref_sys,                                                      &
  • palm/trunk/SOURCE/surface_mod.f90

    r4104 r4150  
    2626! -----------------
    2727! $Id$
     28! Generic routine to initialize single surface properties added
     29!
     30! 4104 2019-07-17 17:08:20Z suehring
    2831! Bugfix, initialization of index space for boundary data structure accidantly
    2932! run over ghost points, causing a segmentation fault.
     
    642645    END INTERFACE init_bc
    643646
     647    INTERFACE init_single_surface_properties
     648       MODULE PROCEDURE init_single_surface_properties
     649    END INTERFACE init_single_surface_properties
     650   
    644651    INTERFACE init_surfaces
    645652       MODULE PROCEDURE init_surfaces
     
    685692!
    686693!-- Public subroutines and functions
    687     PUBLIC get_topography_top_index, get_topography_top_index_ji, init_bc, init_surfaces,          &
    688            init_surface_arrays, surface_rrd_local, surface_restore_elements, surface_wrd_local,    &
    689            surface_last_actions
     694    PUBLIC get_topography_top_index,                                                               &
     695           get_topography_top_index_ji,                                                            &
     696           init_bc,                                                                                &
     697           init_single_surface_properties,                                                         &
     698           init_surfaces,                                                                          &
     699           init_surface_arrays,                                                                    &
     700           surface_last_actions,                                                                   &
     701           surface_rrd_local,                                                                      &
     702           surface_restore_elements,                                                               &
     703           surface_wrd_local
    690704
    691705#if defined( _OPENACC )
     
    30353049    END SUBROUTINE init_surfaces
    30363050
     3051! Description:
     3052! ------------
     3053!> Initialize single surface properties from 2D input arrays
     3054!------------------------------------------------------------------------------!
     3055    SUBROUTINE init_single_surface_properties( var_surf, var_2d,               &
     3056                                               ns, fill_value,                 &
     3057                                               index_space_i,                  &
     3058                                               index_space_j                   &
     3059                                             )
     3060   
     3061       INTEGER(iwp) ::  m  !< running index over surface elements
     3062       INTEGER(iwp) ::  ns !< number of surface elements in var_surf
     3063
     3064       INTEGER(iwp), DIMENSION(1:ns) ::  index_space_i !< grid indices along x direction where surface properties should be defined
     3065       INTEGER(iwp), DIMENSION(1:ns) ::  index_space_j !< grid indices along y direction where surface properties should be defined
     3066       
     3067       REAL(wp) ::  fill_value !< fill value in var_2d
     3068       
     3069       REAL(wp), DIMENSION(1:ns) ::  var_surf !< 1D surface variable that should be initialized
     3070       REAL(wp), DIMENSION(nys:nyn,nxl:nxr) ::  var_2d !< input variable
     3071
     3072       DO  m = 1, ns
     3073          IF ( var_2d(index_space_j(m),index_space_i(m)) /= fill_value )  THEN
     3074             var_surf(m) = var_2d(index_space_j(m),index_space_i(m))
     3075          ENDIF
     3076       ENDDO
     3077       
     3078    END SUBROUTINE init_single_surface_properties
    30373079
    30383080!------------------------------------------------------------------------------!
Note: See TracChangeset for help on using the changeset viewer.