!> @file modules.f90
!--------------------------------------------------------------------------------------------------!
! This file is part of the PALM model system.
!
! PALM is free software: you can redistribute it and/or modify it under the terms of the GNU General
! Public License as published by the Free Software Foundation, either version 3 of the License, or
! (at your option) any later version.
!
! PALM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
! implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
! Public License for more details.
!
! You should have received a copy of the GNU General Public License along with PALM. If not, see
! .
!
! Copyright 1997-2021 Leibniz Universitaet Hannover
!--------------------------------------------------------------------------------------------------!
!
! Description:
! ------------
!> Definition of global variables
!--------------------------------------------------------------------------------------------------!
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of variables for special advection schemes.
!--------------------------------------------------------------------------------------------------!
MODULE advection
USE kinds
REAL(wp), DIMENSION(:), ALLOCATABLE :: aex !< exponential coefficient for the Bott-Chlond advection scheme
REAL(wp), DIMENSION(:), ALLOCATABLE :: bex !< exponential coefficient for the Bott-Chlond advection scheme
REAL(wp), DIMENSION(:), ALLOCATABLE :: dex !< exponential coefficient for the Bott-Chlond advection scheme
REAL(wp), DIMENSION(:), ALLOCATABLE :: eex !< exponential coefficient for the Bott-Chlond advection scheme
SAVE
END MODULE advection
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> The variable in this module is used by multi_agent_system_mod AND netcdf_interface_mod. It must
!> be here to avoid circular dependency.
!> This is a workaround.
!--------------------------------------------------------------------------------------------------!
MODULE mas_global_attributes
USE kinds
INTEGER(iwp) :: dim_size_agtnum !< size of agent number dimension for netCDF output
SAVE
END MODULE mas_global_attributes
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of all arrays defined on the computational grid.
!--------------------------------------------------------------------------------------------------!
MODULE arrays_3d
USE kinds
REAL(wp), DIMENSION(:), ALLOCATABLE :: d_exner !< ratio of potential and actual temperature
REAL(wp), DIMENSION(:), ALLOCATABLE :: ddzu !< 1/dzu
REAL(wp), DIMENSION(:), ALLOCATABLE :: ddzu_pres !< modified ddzu for pressure solver
REAL(wp), DIMENSION(:), ALLOCATABLE :: dd2zu !< 1/(dzu(k)+dzu(k+1))
REAL(wp), DIMENSION(:), ALLOCATABLE :: drho_air !< inverse air density profile on the uv grid
REAL(wp), DIMENSION(:), ALLOCATABLE :: drho_air_zw !< inverse air density profile on the w grid
REAL(wp), DIMENSION(:), ALLOCATABLE :: dzu !< vertical grid size (u-grid)
REAL(wp), DIMENSION(:), ALLOCATABLE :: ddzw !< 1/dzw
REAL(wp), DIMENSION(:), ALLOCATABLE :: dzw !< vertical grid size (w-grid)
REAL(wp), DIMENSION(:), ALLOCATABLE :: exner !< ratio of actual and potential temperature
REAL(wp), DIMENSION(:), ALLOCATABLE :: heatflux_input_conversion !< conversion factor array for heatflux input
REAL(wp), DIMENSION(:), ALLOCATABLE :: heatflux_output_conversion !< conversion factor array for heatflux output
REAL(wp), DIMENSION(:), ALLOCATABLE :: hyp !< hydrostatic pressure
REAL(wp), DIMENSION(:), ALLOCATABLE :: hyrho !< density of air calculated with hydrostatic pressure
REAL(wp), DIMENSION(:), ALLOCATABLE :: inflow_damping_factor !< used for turbulent inflow
!< (non-cyclic boundary conditions)
REAL(wp), DIMENSION(:), ALLOCATABLE :: momentumflux_input_conversion !< conversion factor array for momentumflux input
REAL(wp), DIMENSION(:), ALLOCATABLE :: momentumflux_output_conversion !< conversion factor array for momentumflux output
REAL(wp), DIMENSION(:), ALLOCATABLE :: ptdf_x !< damping factor for potential temperature in
!< x-direction
REAL(wp), DIMENSION(:), ALLOCATABLE :: ptdf_y !< damping factor for potential temperature in
!< y-direction
REAL(wp), DIMENSION(:), ALLOCATABLE :: pt_init !< initial profile of potential temperature
REAL(wp), DIMENSION(:), ALLOCATABLE :: q_init !< initial profile of total water mixing ratio
!< (or total water content with active cloud physics)
REAL(wp), DIMENSION(:), ALLOCATABLE :: rdf !< rayleigh damping factor for velocity components
REAL(wp), DIMENSION(:), ALLOCATABLE :: rdf_sc !< rayleigh damping factor for scalar quantities
REAL(wp), DIMENSION(:), ALLOCATABLE :: ref_state !< reference state of potential temperature
!< (and density in case of ocean simulation)
REAL(wp), DIMENSION(:), ALLOCATABLE :: rho_air !< air density profile on the uv grid
REAL(wp), DIMENSION(:), ALLOCATABLE :: rho_air_zw !< air density profile on the w grid
REAL(wp), DIMENSION(:), ALLOCATABLE :: s_init !< initial profile of passive scalar concentration
REAL(wp), DIMENSION(:), ALLOCATABLE :: sa_init !< initial profile of salinity (ocean)
REAL(wp), DIMENSION(:), ALLOCATABLE :: ug !< geostrophic wind component in x-direction
REAL(wp), DIMENSION(:), ALLOCATABLE :: u_init !< initial profile of horizontal velocity component u
REAL(wp), DIMENSION(:), ALLOCATABLE :: u_stokes_zu !< u-component of Stokes drift velocity at zu levels
REAL(wp), DIMENSION(:), ALLOCATABLE :: u_stokes_zw !< u-component of Stokes drift velocity at zw levels
REAL(wp), DIMENSION(:), ALLOCATABLE :: vg !< geostrophic wind component in y-direction
REAL(wp), DIMENSION(:), ALLOCATABLE :: v_init !< initial profile of horizontal velocity component v
REAL(wp), DIMENSION(:), ALLOCATABLE :: v_stokes_zu !< v-component of Stokes drift velocity at zu levels
REAL(wp), DIMENSION(:), ALLOCATABLE :: v_stokes_zw !< v-component of Stokes drift velocity at zw levels
REAL(wp), DIMENSION(:), ALLOCATABLE :: waterflux_input_conversion !< conversion factor array for waterflux input
REAL(wp), DIMENSION(:), ALLOCATABLE :: waterflux_output_conversion !< conversion factor array for waterflux output
REAL(wp), DIMENSION(:), ALLOCATABLE :: w_subs !< subsidence/ascent velocity
REAL(wp), DIMENSION(:), ALLOCATABLE :: x !< horizontal grid coordinate of v-grid (in m)
REAL(wp), DIMENSION(:), ALLOCATABLE :: xu !< horizontal grid coordinate of u-grid (in m)
REAL(wp), DIMENSION(:), ALLOCATABLE :: y !< horizontal grid coordinate of u-grid (in m)
REAL(wp), DIMENSION(:), ALLOCATABLE :: yv !< horizontal grid coordinate of v-grid (in m)
REAL(wp), DIMENSION(:), ALLOCATABLE :: zu !< vertical grid coordinate of u-grid (in m)
REAL(wp), DIMENSION(:), ALLOCATABLE :: zw !< vertical grid coordinate of w-grid (in m)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: c_u !< phase speed of u-velocity component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: c_v !< phase speed of v-velocity component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: c_w !< phase speed of w-velocity component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_diss !< artificial numerical dissipation flux at south face of grid
!< box - TKE dissipation
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_e !< artificial numerical dissipation flux at south face of grid
!< box - subgrid-scale TKE
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_nc !< artificial numerical dissipation flux at south face of grid
!< box - clouddrop-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_ng !< artificial numerical dissipation flux at south face of grid
!< box - graupel number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_ni !< artificial numerical dissipation flux at south face of grid
!< box - ice crystal-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_nr !< artificial numerical dissipation flux at south face of grid
!< box - raindrop-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_ns !< artificial numerical dissipation flux at south face of grid
!< box - snow-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_pt !< artificial numerical dissipation flux at south face of grid
!< box - potential temperature
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_q !< artificial numerical dissipation flux at south face of grid
!< box - total water mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_qc !< artificial numerical dissipation flux at south face of grid
!< box - cloudwater mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_qg !< artificial numerical dissipation flux at south face of grid
!< box - graupel mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_qi !< artificial numerical dissipation flux at south face of grid
!< box - ice crystal mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_qr !< artificial numerical dissipation flux at south face of grid
!< box - rainwater mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_qs !< artificial numerical dissipation flux at south face of grid
!< box - snow mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_s !< artificial numerical dissipation flux at south face of grid
!< box - passive scalar
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_sa !< artificial numerical dissipation flux at south face of grid
!< box - salinity
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_u !< artificial numerical dissipation flux at south face of grid
!< box - u-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_v !< artificial numerical dissipation flux at south face of grid
!< box - v-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: diss_s_w !< artificial numerical dissipation flux at south face of grid
!< box - w-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: dzu_mg !< vertical grid size (u-grid) for multigrid pressure solver
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: dzw_mg !< vertical grid size (w-grid) for multigrid pressure solver
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_diss !< 6th-order advective flux at south face of grid box -
!< TKE dissipation
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_e !< 6th-order advective flux at south face of grid box -
!< subgrid-scale TKE
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_nc !< 6th-order advective flux at south face of grid box -
!< clouddrop-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_ng !< 6th-order advective flux at south face of grid box -
!< graupel-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_ni !< 6th-order advective flux at south face of grid box -
!< icecrystal-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_nr !< 6th-order advective flux at south face of grid box -
!< raindrop-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_ns !< 6th-order advective flux at south face of grid box -
!< graupel-number concentration
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_pt !< 6th-order advective flux at south face of grid box -
!< potential temperature
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_q !< 6th-order advective flux at south face of grid box -
!< total water mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_qc !< 6th-order advective flux at south face of grid box -
!< cloudwater mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_qg !< 6th-order advective flux at south face of grid box -
!< graupel mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_qi !< 6th-order advective flux at south face of grid box -
!< ice crystal mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_qr !< 6th-order advective flux at south face of grid box -
!< rainwater mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_qs !< 6th-order advective flux at south face of grid box -
!< snow mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_s !< 6th-order advective flux at south face of grid box -
!< passive scalar
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_sa !< 6th-order advective flux at south face of grid box -
!< salinity
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_u !< 6th-order advective flux at south face of grid box -
!< u-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_v !< 6th-order advective flux at south face of grid box -
!< v-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: flux_s_w !< 6th-order advective flux at south face of grid box -
!< w-component
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: f1_mg !< grid factor used in right hand side of Gauss-Seidel equation
!< (multigrid)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: f2_mg !< grid factor used in right hand side of Gauss-Seidel equation
!< (multigrid)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: f3_mg !< grid factor used in right hand side of Gauss-Seidel equation
!< (multigrid)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: mean_inflow_profiles !< used for turbulent inflow (non-cyclic boundary conditions)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: precipitation_amount !< precipitation amount due to gravitational settling
!< (bulk microphysics)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: pt_slope_ref !< potential temperature in rotated coordinate system
!< (in case of sloped surface)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: rho_air_mg !< air density profiles on the uv grid for multigrid
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: rho_air_zw_mg !< air density profiles on the w grid for multigrid
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: total_2d_a !< horizontal array to store the total domain data, used for
!< atmosphere-ocean coupling (atmosphere data)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: total_2d_o !< horizontal array to store the total domain data, used for
!< atmosphere-ocean coupling (ocean data)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: d !< divergence
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: de_dx !< gradient of sgs tke in x-direction (lpm)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: de_dy !< gradient of sgs tke in y-direction (lpm)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: de_dz !< gradient of sgs tke in z-direction (lpm)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_diss !< artificial numerical dissipation flux at left face of grid box -
!< TKE dissipation
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_e !< artificial numerical dissipation flux at left face of grid box -
!< subgrid-scale TKE
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_nc !< artificial numerical dissipation flux at left face of grid box -
!< clouddrop-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_ng !< artificial numerical dissipation flux at left face of grid box -
!< graupel-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_ni !< artificial numerical dissipation flux at left face of grid box -
!< ice crystal-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_nr !< artificial numerical dissipation flux at left face of grid box -
!< raindrop-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_ns !< artificial numerical dissipation flux at left face of grid box -
!< snow-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_pt !< artificial numerical dissipation flux at left face of grid box -
!< potential temperature
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_q !< artificial numerical dissipation flux at left face of grid box -
!< total water mixing ratio
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_qc !< artificial numerical dissipation flux at left face of grid box -
!< cloudwater
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_qg !< artificial numerical dissipation flux at left face of grid box -
!< graupel
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_qi !< artificial numerical dissipation flux at left face of grid box -
!< ice crystal
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_qr !< artificial numerical dissipation flux at left face of grid box -
!< rainwater
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_qs !< artificial numerical dissipation flux at left face of grid box -
!< snow
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_s !< artificial numerical dissipation flux at left face of grid box -
!< passive scalar
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_sa !< artificial numerical dissipation flux at left face of grid box -
!< salinity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_u !< artificial numerical dissipation flux at left face of grid box -
!< u-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_v !< artificial numerical dissipation flux at left face of grid box -
!< v-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: diss_l_w !< artificial numerical dissipation flux at left face of grid box -
!< w-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_diss !< 6th-order advective flux at south face of grid box - TKE dissipation
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_e !< 6th-order advective flux at south face of grid box - subgrid-scale
!< TKE
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_nc !< 6th-order advective flux at south face of grid box - clouddrop-number
!< concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_ng !< 6th-order advective flux at south face of grid box -
!< graupel-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_ni !< 6th-order advective flux at south face of grid box -
!< ice crystal-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_nr !< 6th-order advective flux at south face of grid box - raindrop-number
!< concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_ns !< 6th-order advective flux at south face of grid box - snow-number concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_pt !< 6th-order advective flux at south face of grid box - potential
!< temperature
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_q !< 6th-order advective flux at south face of grid box - mixing ratio
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_qc !< 6th-order advective flux at south face of grid box - cloudwater
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_qg !< 6th-order advective flux at south face of grid box - graupel
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_qi !< 6th-order advective flux at south face of grid box - ice crystal
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_qr !< 6th-order advective flux at south face of grid box - rainwater
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_qs !< 6th-order advective flux at south face of grid box - snow
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_s !< 6th-order advective flux at south face of grid box - passive scalar
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_sa !< 6th-order advective flux at south face of grid box - salinity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_u !< 6th-order advective flux at south face of grid box - u-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_v !< 6th-order advective flux at south face of grid box - v-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: flux_l_w !< 6th-order advective flux at south face of grid box - w-component
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: kh !< eddy diffusivity for heat
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: km !< eddy diffusivity for momentum
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: prr !< rain rate
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: p_loc !< local array in multigrid/sor solver containing the pressure which is
!< iteratively advanced in each iteration step
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: tend !< tendency field (time integration)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: diss_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: diss_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: diss_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: e_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: e_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: e_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: p !< pointer: perturbation pressure
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: prho_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nc_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nc_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nc_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ng_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ng_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ng_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ni_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ni_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ni_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nr_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nr_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nr_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ns_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ns_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ns_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pt_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pt_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pt_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: q_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: q_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: q_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qc_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qc_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qc_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qf_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qg_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qg_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qg_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qi_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qi_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qi_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_v !< pointer: volume of liquid water
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_vp !< pointer: liquid water weighting factor
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qr_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qr_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qr_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qs_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qs_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qs_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: rho_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: s_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: s_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: s_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: sa_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: sa_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: sa_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: u_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: u_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: u_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: v_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: v_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: v_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: vpt_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: w_1 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: w_2 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: w_3 !< pointer for swapping of timelevels for respective quantity
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: diss !< pointer: TKE dissipation
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: diss_p !< pointer: prognostic value of TKE dissipation
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: e !< pointer: subgrid-scale turbulence kinetic energy (sgs tke)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: e_p !< pointer: prognostic value of sgs tke
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: nc !< pointer: cloud drop number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: nc_p !< pointer: prognostic value of cloud drop number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ng !< pointer: graupel number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ng_p !< pointer: prognostic value of graupel number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ni !< pointer: ice crystal number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ni_p !< pointer: prognostic value of ice crystal number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: nr !< pointer: rain drop number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: nr_p !< pointer: prognostic value of rain drop number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ns !< pointer: snow number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ns_p !< pointer: prognostic value of snow number density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: prho !< pointer: potential density
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: pt !< pointer: potential temperature
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: pt_p !< pointer: prognostic value of potential temperature
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: q !< pointer: mixing ratio
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: q_p !< pointer: prognostic value of mixing ratio
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qc !< pointer: cloud water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qc_p !< pointer: prognostic value cloud water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qf !< pointer: frozen water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qg !< pointer: graupel water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qg_p !< pointer: prognostic value graupel water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qi !< pointer: ice crystal content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qi_p !< pointer: prognostic value ice crystal content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ql !< pointer: liquid water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ql_c !< pointer: change in liquid water content due to
!< condensation/evaporation during last time step
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qr !< pointer: rain water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qr_p !< pointer: prognostic value of rain water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qs !< pointer: rain water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: qs_p !< pointer: prognostic value of rain water content
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: rho_ocean !< pointer: density of ocean
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: s !< pointer: passive scalar
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: s_p !< pointer: prognostic value of passive scalar
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: sa !< pointer: ocean salinity
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: sa_p !< pointer: prognostic value of ocean salinity
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tdiss_m !< pointer: weighted tendency of diss for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: te_m !< pointer: weighted tendency of e for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tnc_m !< pointer: weighted tendency of nc for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tng_m !< pointer: weighted tendency of ng for previous sub-timestep (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tni_m !< pointer: weighted tendency of ni for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tnr_m !< pointer: weighted tendency of nr for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tns_m !< pointer: weighted tendency of ns for previous sub-timestep (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tpt_m !< pointer: weighted tendency of pt for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tq_m !< pointer: weighted tendency of q for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tqc_m !< pointer: weighted tendency of qc for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tqg_m !< pointer: weighted tendency of qg for previous sub-timestep (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tqi_m !< pointer: weighted tendency of qi for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tqr_m !< pointer: weighted tendency of qr for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tqs_m !< pointer: weighted tendency of qs for previous sub-timestep (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ts_m !< pointer: weighted tendency of s for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tsa_m !< pointer: weighted tendency of sa for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tu_m !< pointer: weighted tendency of u for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tv_m !< pointer: weighted tendency of v for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: tw_m !< pointer: weighted tendency of w for previous sub-timestep
!< (Runge-Kutta)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: u !< pointer: horizontal velocity component u (x-direction)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: u_p !< pointer: prognostic value of u
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: v !< pointer: horizontal velocity component v (y-direction)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: v_p !< pointer: prognostic value of v
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: vpt !< pointer: virtual potential temperature
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: w !< pointer: vertical velocity component w (z-direction)
REAL(wp), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: w_p !< pointer: prognostic value of w
SAVE
END MODULE arrays_3d
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of variables needed for time-averaging of 2d/3d data.
!--------------------------------------------------------------------------------------------------!
MODULE averaging
USE kinds
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ghf_av !< avg. ground heat flux
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: lwp_av !< avg. liquid water path
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ol_av !< avg. Obukhov length
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: pres_drag_x_av !< avg. pressure drag on yz-surfaces
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: pres_drag_y_av !< avg. pressure drag on xz-surfaces
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qsurf_av !< avg. surface mixing ratio
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: qsws_av !< avg. surface moisture flux
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: r_a_av !< avg. resistance
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssurf_av !< avg. surface passive scalar
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssws_av !< avg. surface scalar flux
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: shf_av !< avg. surface heat flux
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tsurf_av !< avg. surface temperature
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ts_av !< avg. characteristic temperature scale
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: us_av !< avg. friction velocity
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0_av !< avg. roughness length for momentum
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0h_av !< avg. roughness length for heat
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: z0q_av !< avg. roughness length for moisture
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: diss_av !< avg. tke dissipation rate
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: e_av !< avg. subgrid-scale tke
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: kh_av !< avg. eddy diffusivity for heat
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: km_av !< avg. eddy diffusivity for momentum
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: lpt_av !< avg. liquid water potential temperature
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nc_av !< avg. cloud drop number density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ng_av !< avg. graupel drop number density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ni_av !< avg. ice crystal number density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: nr_av !< avg. rain drop number density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ns_av !< avg. snow drop number density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: p_av !< avg. perturbation pressure
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pc_av !< avg. particle/droplet concentration
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pr_av !< avg. particle/droplet radius
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: prr_av !< avg. precipitation rate
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: pt_av !< avg. potential temperature
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: q_av !< avg. mixing ratio
!< (or total water content with active cloud physics)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qc_av !< avg. cloud water content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qg_av !< avg. graupel water content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qi_av !< avg. ice crystal content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_av !< avg. liquid water content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_c_av !< avg. change in liquid water content due to
!< condensation/evaporation during last time step
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_v_av !< avg. volume of liquid water
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: ql_vp_av !< avg. liquid water weighting factor
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qr_av !< avg. rain water content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qs_av !< avg. snow water content
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: qv_av !< avg. water vapor content (mixing ratio)
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: rho_ocean_av !< avg. ocean density
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: s_av !< avg. passive scalar
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: sa_av !< avg. salinity
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: u_av !< avg. horizontal velocity component u
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: v_av !< avg. horizontal velocity component v
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: vpt_av !< avg. virtual potential temperature
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: w_av !< avg. vertical velocity component
END MODULE averaging
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of parameters for program control
!--------------------------------------------------------------------------------------------------!
MODULE control_parameters
USE kinds
TYPE file_status
LOGICAL :: opened !< file is currently open
LOGICAL :: opened_before !< file is currently closed, but has been openend before
END TYPE file_status
INTEGER(iwp), PARAMETER :: fl_max = 500 !< maximum number of virtual-flight measurements
INTEGER, PARAMETER :: mask_xyz_dimension = 100 !< limit of mask dimensions (100 points in each direction)
INTEGER, PARAMETER :: max_masks = 50 !< maximum number of masks
INTEGER(iwp), PARAMETER :: var_fl_max = 20 !< maximum number of different sampling variables in virtual flight
!< measurements
INTEGER(iwp), PARAMETER :: varnamelength = 30 !< length of output variable names
TYPE(file_status), DIMENSION(200+2*max_masks) :: & !< indicates if file is open or if it has been opened before
openfile = file_status(.FALSE.,.FALSE.)
CHARACTER (LEN=1) :: cycle_mg = 'w' !< namelist parameter (see documentation)
CHARACTER (LEN=1) :: timestep_reason = ' ' !< 'A'dvection or 'D'iffusion criterion, written to
!< RUN_CONTROL file
CHARACTER (LEN=5) :: run_zone = ' ' !< time zone of simulation run
CHARACTER (LEN=8) :: coupling_char = '' !< appended to filenames in coupled or nested runs
!< ('_O': ocean PE,
!< '_NV': vertically nested atmosphere PE, '_N##': PE of
!< nested domain ##
CHARACTER (LEN=8) :: run_time = ' ' !< time of simulation run
CHARACTER (LEN=9) :: simulated_time_chr !< simulated time, printed to RUN_CONTROL file
CHARACTER (LEN=10) :: run_date = ' ' !< date of simulation run
CHARACTER (LEN=11) :: topography_grid_convention = ' ' !< namelist parameter
CHARACTER (LEN=26) :: version_string = ' ' !< PALM version
CHARACTER (LEN=12) :: user_interface_current_revision = ' ' !< revision number of the currently used user-interface
!< (must match user_interface_required_revision)
CHARACTER (LEN=12) :: user_interface_required_revision = ' ' !< required user-interface revision number
CHARACTER (LEN=16) :: conserve_volume_flow_mode = 'default' !< namelist parameter
CHARACTER (LEN=16) :: loop_optimization = 'cache' !< namelist parameter
CHARACTER (LEN=16) :: momentum_advec = 'ws-scheme' !< namelist parameter
CHARACTER (LEN=16) :: psolver = 'poisfft' !< namelist parameter
CHARACTER (LEN=16) :: scalar_advec = 'ws-scheme' !< namelist parameter
CHARACTER (LEN=20) :: approximation = 'boussinesq' !< namelist parameter
CHARACTER (LEN=20) :: bc_e_b = 'neumann' !< namelist parameter
CHARACTER (LEN=20) :: bc_lr = 'cyclic' !< namelist parameter
CHARACTER (LEN=20) :: bc_ns = 'cyclic' !< namelist parameter
CHARACTER (LEN=20) :: bc_p_b = 'neumann' !< namelist parameter
CHARACTER (LEN=20) :: bc_p_t = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: bc_pt_b = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: bc_pt_t = 'initial_gradient' !< namelist parameter
CHARACTER (LEN=20) :: bc_q_b = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: bc_q_t = 'neumann' !< namelist parameter
CHARACTER (LEN=20) :: bc_s_b = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: bc_s_t = 'initial_gradient' !< namelist parameter
CHARACTER (LEN=20) :: bc_uv_b = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: bc_uv_t = 'dirichlet' !< namelist parameter
CHARACTER (LEN=20) :: coupling_mode = 'uncoupled' !< coupling mode for atmosphere-ocean coupling
CHARACTER (LEN=20) :: coupling_mode_remote = 'uncoupled' !< coupling mode of the remote process in case of coupled
!< atmosphere-ocean runs
CHARACTER (LEN=20) :: dissipation_1d = 'detering' !< namelist parameter
CHARACTER (LEN=20) :: fft_method = 'temperton-algorithm' !< namelist parameter
CHARACTER (LEN=20) :: mixing_length_1d = 'blackadar' !< namelist parameter
CHARACTER (LEN=20) :: random_generator = 'random-parallel' !< namelist parameter
CHARACTER (LEN=20) :: reference_state = 'initial_profile' !< namelist parameter
CHARACTER (LEN=20) :: restart_data_format = 'fortran_binary' !< namelist parameter
CHARACTER (LEN=20) :: restart_data_format_input = 'undefined' !< namelist parameter
CHARACTER (LEN=20) :: restart_data_format_output = 'undefined' !< namelist parameter
CHARACTER (LEN=20) :: timestep_scheme = 'runge-kutta-3' !< namelist parameter
CHARACTER (LEN=20) :: turbulence_closure = '1.5-order' !< namelist parameter
CHARACTER (LEN=23) :: origin_date_time = '2019-06-21 12:00:00 +00' !< date and time to be simulated
CHARACTER (LEN=40) :: flux_input_mode = 'approximation-specific' !< type of flux input: dynamic or kinematic
CHARACTER (LEN=40) :: flux_output_mode = 'approximation-specific' !< type of flux output: dynamic or kinematic
CHARACTER (LEN=40) :: topography = 'flat' !< namelist parameter
CHARACTER (LEN=64) :: host = '????' !< configuration identifier as given by palmrun option -c,
!< ENVPAR namelist parameter provided by palmrun
CHARACTER (LEN=80) :: log_message !< user-defined message for debugging (sse data_log.f90)
CHARACTER (LEN=80) :: recycling_method_for_thermodynamic_quantities = 'turbulent_fluctuation' !< namelist parameter
CHARACTER (LEN=80) :: run_identifier !< run identifier as given by palmrun option -r, ENVPAR
!< namelist parameter provided by palmrun
CHARACTER (LEN=100) :: initializing_actions = ' ' !< namelist parameter
CHARACTER (LEN=100) :: restart_string = ' ' !< for storing strings in case of writing/reading restart
!< data
CHARACTER (LEN=210) :: run_description_header !< string containing diverse run informations as run
!< identifier, coupling mode, host, ensemble number, run
!< date and time
CHARACTER (LEN=1000) :: debug_string = ' ' !<.....
CHARACTER (LEN=1000) :: message_string = ' ' !< dynamic string for error message output
CHARACTER (LEN=varnamelength), DIMENSION(300) :: data_output_pr_user = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(500) :: data_output_pr = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(500) :: data_output = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(500) :: data_output_user = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(500) :: doav = ' ' !< label array for multi-dimensional,
!< averaged output quantities
CHARACTER (LEN=varnamelength), DIMENSION(max_masks,100) :: data_output_masks = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(max_masks,100) :: data_output_masks_user = ' ' !< namelist parameter
CHARACTER (LEN=varnamelength), DIMENSION(0:1,500) :: do2d = ' ' !< label array for 2d output
!< quantities
CHARACTER (LEN=varnamelength), DIMENSION(0:1,500) :: do3d = ' ' !< label array for 3d output
!< quantities
CHARACTER (LEN=varnamelength), DIMENSION(max_masks,0:1,100) :: domask = ' ' !< label array for multi-dimensional,
!< masked output quantities
INTEGER(iwp) :: abort_mode = 1 !< abort condition (nested runs)
INTEGER(iwp) :: agt_time_count = 0 !< number of output intervals for agent data output
INTEGER(iwp) :: average_count_pr = 0 !< number of samples in vertical-profile output
INTEGER(iwp) :: average_count_3d = 0 !< number of samples in 3d output
INTEGER(iwp) :: current_timestep_number = 0 !< current timestep number, printed to RUN_CONTROL file
INTEGER(iwp) :: coupling_topology = 0 !< switch for atmosphere-ocean-coupling: 0: same number of grid points and
!< PEs along x and y in atmosphere and ocean, otherwise 1
INTEGER(iwp) :: dist_range = 0 !< switch for steering the horizontal disturbance range, 1: inflow
!< disturbances in case of non-cyclic horizontal BC, 0: otherwise
INTEGER(iwp) :: disturbance_level_ind_b !< lowest grid index where flow disturbance is applied
INTEGER(iwp) :: disturbance_level_ind_t !< highest grid index where flow disturbance is applied
INTEGER(iwp) :: doav_n = 0 !< number of 2d/3d output quantities subject to time averaging
INTEGER(iwp) :: dopr_n = 0 !< number of profile output quantities subject to time averaging
INTEGER(iwp) :: dopr_time_count = 0 !< number of output intervals for profile output
INTEGER(iwp) :: dopts_time_count = 0 !< number of output intervals for particle data timeseries
INTEGER(iwp) :: dots_time_count = 0 !< number of output intervals for timeseries output
INTEGER(iwp) :: dp_level_ind_b = 0 !< lowest grid index for external pressure gradient forcing
INTEGER(iwp) :: ensemble_member_nr = 0 !< namelist parameter
INTEGER(iwp) :: gamma_mg !< switch for steering the multigrid cycle: 1: v-cycle, 2: w-cycle
INTEGER(iwp) :: gathered_size !< number of total domain grid points of the grid level which is gathered on
!< PE0 (multigrid solver)
INTEGER(iwp) :: grid_level !< current grid level handled in the multigrid solver
INTEGER(iwp) :: ibc_e_b !< integer flag for bc_e_b
INTEGER(iwp) :: ibc_p_b !< integer flag for bc_p_b
INTEGER(iwp) :: ibc_p_t !< integer flag for bc_p_t
INTEGER(iwp) :: ibc_pt_b !< integer flag for bc_pt_b
INTEGER(iwp) :: ibc_pt_t !< integer flag for bc_pt_t
INTEGER(iwp) :: ibc_q_b !< integer flag for bc_q_b
INTEGER(iwp) :: ibc_q_t !< integer flag for bc_q_t
INTEGER(iwp) :: ibc_s_b !< integer flag for bc_s_b
INTEGER(iwp) :: ibc_s_t !< integer flag for bc_s_t
INTEGER(iwp) :: ibc_uv_b !< integer flag for bc_uv_b
INTEGER(iwp) :: ibc_uv_t !< integer flag for bc_uv_t
INTEGER(iwp) :: inflow_disturbance_begin = -1 !< namelist parameter
INTEGER(iwp) :: inflow_disturbance_end = -1 !< namelist parameter
INTEGER(iwp) :: intermediate_timestep_count !< number of current Runge-Kutta substep
INTEGER(iwp) :: intermediate_timestep_count_max !< maximum number of Runge-Kutta substeps
INTEGER(iwp) :: io_group = 0 !< I/O group to which the PE belongs (= #PE / io_blocks)
INTEGER(iwp) :: io_blocks = 1 !< number of blocks for which I/O is done in sequence (total number of PEs /
!< maximum_parallel_io_streams)
INTEGER(iwp) :: iran = -1234567 !< integer random number used for flow disturbances
INTEGER(iwp) :: length = 0 !< integer that specifies the length of a string in case of writing/reading
!< restart data
INTEGER(iwp) :: masks = 0 !< counter for number of masked output quantities
INTEGER(iwp) :: maximum_grid_level !< number of grid levels that the multigrid solver is using
INTEGER(iwp) :: maximum_parallel_io_streams = -1 !< maximum number of parallel io streams that the underlying parallel file
!< system allows, set with palmrun option -w, ENVPAR namelist parameter, provided by palmrun
INTEGER(iwp) :: max_pr_salsa = 0 !< number of salsa profiles (must not change within a job chain)
INTEGER(iwp) :: max_pr_user = 0 !< number of user-defined profiles (must not change within a job chain)
INTEGER(iwp) :: max_pr_user_tmp = 0 !< number of user-defined profiles that is temporary stored to check it
!< against max_pr_user in case of restarts
INTEGER(iwp) :: mgcycles = 0 !< number of multigrid cycles that the multigrid solver has actually carried
!< out
INTEGER(iwp) :: mg_cycles = 4 !< namelist parameter
INTEGER(iwp) :: mg_switch_to_pe0_level = -1 !< namelist parameter
INTEGER(iwp) :: ngsrb = 2 !< namelist parameter
INTEGER(iwp) :: nr_timesteps_this_run = 0 !< number of timesteps (cpu time measurements)
INTEGER(iwp) :: nsor = 20 !< namelist parameter
INTEGER(iwp) :: nsor_ini = 100 !< namelist parameter
INTEGER(iwp) :: n_sor !< number of iterations to be used in SOR-scheme
INTEGER(iwp) :: normalizing_region = 0 !< namelist parameter
INTEGER(iwp) :: num_mean_inflow_profiles = 7 !< number of mean inflow profiles in case of turbulent inflow
INTEGER(iwp) :: num_leg=0 !< number of different legs in virtual flight measurements
INTEGER(iwp) :: num_var_fl !< number of sampling/output variables in virtual flight measurements
INTEGER(iwp) :: num_var_fl_user=0 !< number of user-defined sampling/output variables in virtual flight
!< measurements
INTEGER(iwp) :: number_stretch_level_start !< number of user-specified start levels for stretching
INTEGER(iwp) :: number_stretch_level_end !< number of user-specified end levels for stretching
INTEGER(iwp) :: nz_do3d = -9999 !< namelist parameter
INTEGER(iwp) :: prt_time_count = 0 !< number of output intervals for particle data output
INTEGER(iwp) :: recycling_plane !< position of recycling plane along x (in grid points) in case of turbulence
!< recycling
INTEGER(iwp) :: runnr = 0 !< number of run in job chain
INTEGER(iwp) :: subdomain_size !< number of grid points in (3d) subdomain including ghost points
INTEGER(iwp) :: symmetry_flag = 0 !< flag for sterring the symmetric behavior of the bottom and top boundary
INTEGER(iwp) :: terminate_coupled = 0 !< switch for steering termination in case of coupled runs
INTEGER(iwp) :: terminate_coupled_remote = 0 !< switch for steering termination in case of coupled runs (condition of the
!< remote model)
INTEGER(iwp) :: timestep_count = 0 !< number of timesteps carried out since the beginning of the initial run
INTEGER(iwp) :: y_shift = 0 !< namelist parameter
INTEGER(iwp) :: dist_nxl(0:1) !< left boundary of disturbance region
INTEGER(iwp) :: dist_nxr(0:1) !< right boundary of disturbance region
INTEGER(iwp) :: dist_nyn(0:1) !< north boundary of disturbance region
INTEGER(iwp) :: dist_nys(0:1) !< south boundary of disturbance region
INTEGER(iwp) :: do2d_no(0:1) = 0 !< number of 2d output quantities
INTEGER(iwp) :: do2d_xy_time_count(0:1) = 0 !< number of output intervals for 2d data (xy)
INTEGER(iwp) :: do2d_xz_time_count(0:1) = 0 !< number of output intervals for 2d data (xz)
INTEGER(iwp) :: do2d_yz_time_count(0:1) = 0 !< number of output intervals for 2d data (yz)
INTEGER(iwp) :: do3d_no(0:1) = 0 !< number of 3d output quantities
INTEGER(iwp) :: do3d_time_count(0:1) = 0 !< number of output intervals for 3d data
INTEGER(iwp) :: domask_no(max_masks,0:1) = 0 !< number of masked output quantities
INTEGER(iwp) :: domask_time_count(max_masks,0:1) !< number of output intervals for masked data
INTEGER(iwp) :: dz_stretch_level_end_index(9) !< vertical grid level index until which the vertical grid spacing
!< is stretched
INTEGER(iwp) :: dz_stretch_level_start_index(9) !< vertical grid level index above which the vertical grid spacing
!< is stretched
INTEGER(iwp) :: mask_size(max_masks,3) = -1 !< size of mask array per mask and dimension (for netcdf output)
INTEGER(iwp) :: mask_size_l(max_masks,3) = -1 !< subdomain size of mask array per mask and dimension
!< (for netcdf output)
INTEGER(iwp) :: mask_start_l(max_masks,3) = -1 !< subdomain start index of mask array (for netcdf output)
INTEGER(iwp) :: pt_vertical_gradient_level_ind(10) = -9999 !< grid index values of pt_vertical_gradient_level(s)
INTEGER(iwp) :: q_vertical_gradient_level_ind(10) = -9999 !< grid index values of q_vertical_gradient_level(s)
INTEGER(iwp) :: s_vertical_gradient_level_ind(10) = -9999 !< grid index values of s_vertical_gradient_level(s)
INTEGER(iwp) :: section(100,3) !< collective array for section_xy/xz/yz
INTEGER(iwp) :: section_xy(100) = -9999 !< namelist parameter
INTEGER(iwp) :: section_xz(100) = -9999 !< namelist parameter
INTEGER(iwp) :: section_yz(100) = -9999 !< namelist parameter
INTEGER(iwp) :: ug_vertical_gradient_level_ind(10) = -9999 !< grid index values of ug_vertical_gradient_level(s)
INTEGER(iwp) :: vg_vertical_gradient_level_ind(10) = -9999 !< grid index values of vg_vertical_gradient_level(s)
INTEGER(iwp) :: subs_vertical_gradient_level_i(10) = -9999 !< grid index values of subs_vertical_gradient_level(s)
INTEGER(iwp), DIMENSION(0:1) :: ntdim_2d_xy !< number of output intervals for 2d data (xy)
INTEGER(iwp), DIMENSION(0:1) :: ntdim_2d_xz !< number of output intervals for 2d data (xz)
INTEGER(iwp), DIMENSION(0:1) :: ntdim_2d_yz !< number of output intervals for 2d data (yz)
INTEGER(iwp), DIMENSION(0:1) :: ntdim_3d !< number of output intervals for 3d data
INTEGER(iwp), DIMENSION(max_masks,mask_xyz_dimension) :: mask_k_over_surface = -1 !< namelist parameter, k index of height
! Definition of grid spacings.
!--------------------------------------------------------------------------------------------------!
MODULE grid_variables
USE kinds
REAL(wp) :: ddx !< 1/dx
REAL(wp) :: ddx2 !< 1/dx2
REAL(wp) :: dx = 1.0_wp !< horizontal grid size (along x-direction)
REAL(wp) :: dx2 !< dx*dx
REAL(wp) :: ddy !< 1/dy
REAL(wp) :: ddy2 !< 1/dy2
REAL(wp) :: dy = 1.0_wp !< horizontal grid size (along y-direction)
REAL(wp) :: dy2 !< dy*dy
REAL(wp), DIMENSION(:), ALLOCATABLE :: ddx2_mg !< 1/dx_l**2 (dx_l: grid spacing along x on different multigrid level)
REAL(wp), DIMENSION(:), ALLOCATABLE :: ddy2_mg !< 1/dy_l**2 (dy_l: grid spacing along y on different multigrid level)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zu_s_inner !< height of topography top on scalar grid
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zw_w_inner !< height of topography top on w grid
SAVE
END MODULE grid_variables
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of array bounds, number of gridpoints, and wall flag arrays.
!--------------------------------------------------------------------------------------------------!
MODULE indices
USE kinds
INTEGER(iwp) :: nbgp = 3 !< number of boundary ghost points
INTEGER(iwp) :: ngp_sums !< number of vertical profile grid points time number of output profiles - used for allreduce
!< statements in MPI calls
INTEGER(iwp) :: ngp_sums_ls !< number of vertical profile grid points time number of large-scale forcing profiles - used for
!< allreduce statements in MPI calls
INTEGER(iwp) :: nnx !< number of subdomain grid points in x-direction
INTEGER(iwp) :: nx = 0 !< nx+1 = total number of grid points in x-direction
INTEGER(iwp) :: nx_a !< in coupled atmosphere-ocean runs: total number of grid points along x (atmosphere)
INTEGER(iwp) :: nx_o !< in coupled atmosphere-ocean runs: total number of grid points along x (ocean)
INTEGER(iwp) :: nxl !< left-most grid index of subdomain (excluding ghost points)
INTEGER(iwp) :: nxlg !< left-most grid index of subdomain (including ghost points)
INTEGER(iwp) :: nxlu !< =nxl+1 (at left domain boundary with inflow from left), else =nxl
!< (used for u-velocity component)
INTEGER(iwp) :: nxr !< right-most grid index of subdomain (excluding ghost points)
INTEGER(iwp) :: nxrg !< right-most grid index of subdomain (including ghost points)
INTEGER(iwp) :: nx_on_file !< nx of previous run in job chain
INTEGER(iwp) :: nny !< number of subdomain grid points in y-direction
INTEGER(iwp) :: ny = 0 !< ny+1 = total number of grid points in y-direction
INTEGER(iwp) :: ny_a !< in coupled atmosphere-ocean runs: total number of grid points along y (atmosphere)
INTEGER(iwp) :: ny_o !< in coupled atmosphere-ocean runs: total number of grid points along y (ocean)
INTEGER(iwp) :: nyn !< north-most grid index of subdomain (excluding ghost points)
INTEGER(iwp) :: nyng !< north-most grid index of subdomain (including ghost points)
INTEGER(iwp) :: nys !< south-most grid index of subdomain (excluding ghost points)
INTEGER(iwp) :: nysg !< south-most grid index of subdomain (including ghost points)
INTEGER(iwp) :: nysv !< =nys+1 (at south domain boundary with inflow from south), else =nys
!< (used for v-velocity component)
INTEGER(iwp) :: ny_on_file !< ny of previous run in job chain
INTEGER(iwp) :: nnz !< number of subdomain grid points in z-direction
INTEGER(iwp) :: nz = 0 !< total number of grid points in z-direction
INTEGER(iwp) :: nzb !< bottom grid index of computational domain
INTEGER(iwp) :: nzb_diff !< will be removed
INTEGER(iwp) :: nzb_max !< vertical index of topography top
INTEGER(iwp) :: nzt !< nzt+1 = top grid index of computational domain
INTEGER(iwp) :: topo_min_level !< minimum topography-top index (usually equal to nzb)
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nnx_pe !< grid points along x-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nny_pe !< grid points along y-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nxl_pe !< lower index bound along x-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nxr_pe !< upper index bound along x-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nyn_pe !< lower index bound along y-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nys_pe !< lower index bound along y-direction for every PE
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_2dh !< number of grid points of a horizontal cross section through the
!< total domain
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_2dh_wgrid !< number of prognostic w-grid points of a horizontal cross section
!< through the total domain
INTEGER(idp), DIMENSION(:), ALLOCATABLE :: ngp_3d !< number of grid points of the total domain
INTEGER(idp), DIMENSION(:), ALLOCATABLE :: ngp_3d_inner !< ! need to have 64 bit for grids > 2E9
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nxl_mg !< left-most grid index of subdomain on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nxr_mg !< right-most grid index of subdomain on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nyn_mg !< north-most grid index of subdomain on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nys_mg !< south-most grid index of subdomain on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: nzt_mg !< top-most grid index of subdomain on different multigrid level
INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: mg_loc_ind !< internal array to store index bounds of all PEs of that
!< multigrid level where data is collected to PE0
INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: ngp_2dh_outer !< number of horizontal grid points which are non-topography and
!< non-surface-bounded
INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: ngp_2dh_s_inner !< number of horizontal grid points which are non-topography
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_1 !< topograpyh masking flag on multigrid level 1
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_2 !< topograpyh masking flag on multigrid level 2
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_3 !< topograpyh masking flag on multigrid level 3
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_4 !< topograpyh masking flag on multigrid level 4
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_5 !< topograpyh masking flag on multigrid level 5
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_6 !< topograpyh masking flag on multigrid level 6
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_7 !< topograpyh masking flag on multigrid level 7
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_8 !< topograpyh masking flag on multigrid level 8
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_9 !< topograpyh masking flag on multigrid level 9
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: wall_flags_10 !< topograpyh masking flag on multigrid level 10
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: advc_flags_m !< flags used to degrade order of advection scheme for
!< momentum
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: advc_flags_s !< flags used to degrade order of advection scheme for
!< scalar quantities
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: topo_top_ind !< precalculated topography top indices
INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE :: topo_flags !< flags to mask topography and surface-bounded grid
!< points
INTEGER(iwp), DIMENSION(:,:,:), POINTER :: flags !< pointer to wall_flags_1-10
SAVE
END MODULE indices
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Interfaces for special subroutines which use optional parameters.
!--------------------------------------------------------------------------------------------------!
MODULE interfaces
INTERFACE
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> @todo Missing subroutine description.
!--------------------------------------------------------------------------------------------------!
SUBROUTINE global_min_max ( i1, i2, j1, j2, k1, k2, array, mode, offset, result, result_ijk,&
result1, result1_ijk )
USE kinds
CHARACTER (LEN=*), INTENT(IN) :: mode !< mode of global min/max function: can be 'min', 'max',
!< 'minmax', 'abs', or 'absoff'
INTEGER(iwp), INTENT(IN) :: i1 !< internal index of min/max function
INTEGER(iwp), INTENT(IN) :: i2 !< internal index of min/max function
INTEGER(iwp), INTENT(IN) :: j1 !< internal index of min/max function
INTEGER(iwp), INTENT(IN) :: j2 !< internal index of min/max function
INTEGER(iwp), INTENT(IN) :: k1 !< internal index of min/max function
INTEGER(iwp), INTENT(IN) :: k2 !< internal index of min/max function
INTEGER(iwp) :: result_ijk(3) !< grid index result of min/max function
INTEGER(iwp), OPTIONAL :: result1_ijk(3) !< optional grid index result of min/max function
REAL(wp) :: offset !< min/max function calculates absolute value with respect to
!< an offset
REAL(wp) :: result !< result of min/max function
REAL(wp), OPTIONAL :: result1 !< optional result of min/max function
REAL(wp), INTENT(IN) :: array(i1:i2,j1:j2,k1:k2) !< input array of min/max function
END SUBROUTINE global_min_max
END INTERFACE
SAVE
END MODULE interfaces
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Interfaces for subroutines with pointer arguments called in prognostic_equations.
!--------------------------------------------------------------------------------------------------!
MODULE pointer_interfaces
INTERFACE
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> @todo Missing subroutine description.
!--------------------------------------------------------------------------------------------------!
SUBROUTINE advec_s_bc( sk, sk_char )
USE kinds
CHARACTER (LEN=*), INTENT(IN) :: sk_char !< string for treated scalar in Bott-Chlond scheme
REAL(wp), DIMENSION(:,:,:), POINTER :: sk !< treated scalar array in Bott-Chlond scheme
END SUBROUTINE advec_s_bc
END INTERFACE
SAVE
END MODULE pointer_interfaces
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of variables which define processor topology and the exchange of ghost point layers.
!> This module must be placed in all routines containing MPI-calls.
!--------------------------------------------------------------------------------------------------!
MODULE pegrid
USE kinds
#if defined( __parallel )
USE MPI, &
ONLY: MPI_STATUS_SIZE
PRIVATE MPI_STATUS_SIZE
#endif
CHARACTER(LEN=2) :: send_receive = 'al' !<
CHARACTER(LEN=7) :: myid_char = '' !< character string containing processor id number
INTEGER(iwp) :: comm1dx !< communicator for domain decomposition along x
INTEGER(iwp) :: comm1dy !< communicator for domain decomposition along y
INTEGER(iwp) :: comm2d !< standard 2d (xy) communicator used in PALM for the process group the PE belongs
!< to
INTEGER(iwp) :: comm_inter !< intercommunicator that connects atmosphere/ocean process groups
INTEGER(iwp) :: comm_palm !< internal communicator used during the MPI setup at the beginning of a run
INTEGER(iwp) :: id_inflow = 0 !< myidx of procs at inflow (turbulent inflow method)
INTEGER(iwp) :: id_outflow = 0 !< myidx of procs at outflow (turbulent outflow method)
INTEGER(iwp) :: id_outflow_source = 0 !< myidx of procs including ouflow source plane (turbulent outflow method)
INTEGER(iwp) :: id_recycling = 0 !< myidx of procs containing the recycling plane (turbulence recycling method)
INTEGER(iwp) :: ierr !< standard error parameter in MPI calls
INTEGER(iwp) :: myid = 0 !< id number of processor element
INTEGER(iwp) :: myidx = 0 !< id number of processor elements with same position along x-direction
INTEGER(iwp) :: myidy = 0 !< id number of processor elements with same position along y-direction
INTEGER(iwp) :: ndim = 2 !< dimension of the virtual PE grid
LOGICAL :: non_uniform_subdomain = .FALSE. !< This model setup allows irregular grid distribution
INTEGER(iwp) :: ngp_a !< used in atmosphere/ocean coupling: total number of horizontal grid points
!< (atmosphere)
INTEGER(iwp) :: ngp_o !< used in atmosphere/ocean coupling: total number of horizontal grid points
!< (ocean)
INTEGER(iwp) :: ngp_xy !< used in atmosphere/ocean coupling: number of grid points of the subdomain
INTEGER(iwp) :: ngp_y !< number of subdomain grid points along y including ghost points
INTEGER(iwp) :: npex = -1 !< number of processor elements in x-direction
INTEGER(iwp) :: npey = -1 !< number of processor elements in y-direction
INTEGER(iwp) :: numprocs = 1 !< total number of appointed processor elements
INTEGER(iwp) :: numprocs_previous_run = -1 !< total number of appointed processor elements in previous run (job chain)
INTEGER(iwp) :: pleft !< MPI id of left neigbour pe
INTEGER(iwp) :: pnorth !< MPI id of right neigbour pe
INTEGER(iwp) :: pright !< MPI id of south neigbour pe
INTEGER(iwp) :: psouth !< MPI id of north neigbour pe
INTEGER(iwp) :: req_count = 0 !< MPI return variable - checks if Send-Receive operation is already finished
INTEGER(iwp) :: sendrecvcount_xy !< number of subdomain gridpoints to be exchanged in direct transpositions
!< (y --> x, or x --> y) or second (2d) transposition x --> y
INTEGER(iwp) :: sendrecvcount_yz !< number of subdomain gridpoints to be exchanged in third (2d) transposition
!< y --> z
INTEGER(iwp) :: sendrecvcount_zx !< number of subdomain gridpoints to be exchanged in first (2d) transposition
!< z --> x
INTEGER(iwp) :: sendrecvcount_zyd !< number of subdomain gridpoints to be exchanged in direct transpositions z --> y (used for calculating spectra)
INTEGER(iwp) :: target_id !< in atmosphere/ocean coupling: id of the ocean/atmosphere counterpart PE with
!< whom the atmosphere/ocean PE exchanges data
INTEGER(iwp) :: tasks_per_node = -9999 !< MPI tasks per compute node
INTEGER(iwp) :: threads_per_task = 1 !< number of OPENMP threads per MPI task
INTEGER(iwp) :: type_x !< derived MPI datatype for 2-D ghost-point exchange - north / south
INTEGER(iwp) :: type_xy !< derived MPI datatype for 2-D ghost-point exchange - north / south
INTEGER(iwp) :: type_y !< derived MPI datatype for 2-D exchange in atmosphere-ocean coupler
INTEGER(iwp) :: req(100) !< MPI return variable indicating if send-receive operation is finished
INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: hor_index_bounds !< horizontal index bounds
INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE :: hor_index_bounds_previous_run !< horizontal index bounds of previous run
LOGICAL :: collective_wait = .FALSE. !< switch to set an explicit MPI barrier in front of all collective MPI calls
TYPE virtual_pe_grid
INTEGER(iwp) :: mpi_communicator !< MPI communicator id
INTEGER(iwp) :: pleft !< MPI id of left neigbour pe
INTEGER(iwp) :: pright !< MPI id of right neigbour pe
INTEGER(iwp) :: psouth !< MPI id of south neigbour pe
INTEGER(iwp) :: pnorth !< MPI id of north neigbour pe
END TYPE virtual_pe_grid
TYPE(virtual_pe_grid) :: communicator_configurations(4) !< stores the four possible 2d virtual grids:
!< cyclic, cyclic along x, cyclic along y, non-cyclic
#if defined( __parallel )
INTEGER(iwp) :: ibuf(12) !< internal buffer for calculating MPI settings
INTEGER(iwp) :: pcoord(2) !< PE coordinates along x and y
INTEGER(iwp) :: status(MPI_STATUS_SIZE) !< MPI status variable used in various MPI calls
INTEGER(iwp) :: type_x_byte !< derived MPI datatype for 2-D 8-bit integer ghost-point exchange - north / south
INTEGER(iwp) :: type_y_byte !< derived MPI datatype for 2-D integer ghost-point exchange - left / right
INTEGER(iwp), DIMENSION(MPI_STATUS_SIZE,100) :: wait_stat !< MPI status variable used in various MPI calls
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_xz !< number of ghost points in xz-plane on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_xz_int !< number of ghost points in xz-plane on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_yz !< number of ghost points in yz-plane on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: ngp_yz_int !< number of ghost points in yz-plane on different multigrid level
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_x_int !< derived MPI datatype for 2-D integer ghost-point exchange - north /
!< south
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_xz !< derived MPI datatype for 3-D integer ghost-point exchange - north /
!< south
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_xz_int !< derived MPI datatype for 3-D integer ghost-point exchange - north /
!< south
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_y_int !< derived MPI datatype for 2-D integer ghost-point exchange - left /
!< right
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_yz !< derived MPI datatype for 3-D integer ghost-point exchange - left /
!< right
INTEGER(iwp), DIMENSION(:), ALLOCATABLE :: type_yz_int !< derived MPI datatype for 3-D integer ghost-point exchange - left /
!< right
LOGICAL :: left_border_pe = .FALSE. !< = .TRUE. if PE is on left border of computational domain
LOGICAL :: north_border_pe = .FALSE. !< = .TRUE. if PE is on north border of computational domain
LOGICAL :: reorder = .TRUE. !< switch to allow MPI the reorder of ranking (e.g. row-major or column-major)
LOGICAL :: right_border_pe = .FALSE. !< = .TRUE. if PE is on right border of computational domain
LOGICAL :: south_border_pe = .FALSE. !< = .TRUE. if PE is on south border of computational domain
LOGICAL, DIMENSION(2) :: cyclic = (/ .TRUE. , .TRUE. /) !< boundary conditions of the virtual PE grid
LOGICAL, DIMENSION(2) :: remain_dims !< internal array used to determine sub-topologies for transpositions
#endif
SAVE
END MODULE pegrid
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of variables which control PROFIL-output.
!--------------------------------------------------------------------------------------------------!
MODULE profil_parameter
USE kinds
INTEGER(iwp), PARAMETER :: crmax = 100 !< maximum number of coordinate systems for profile output
CHARACTER (LEN=27), DIMENSION(20) :: cross_ts_profiles = & !< time series to be plotted into one coordinate system, respectively
(/ ' E E* ', &
' dt ', &
' u* w* ', &
' th* ', &
' umax vmax wmax ', &
' div_old div_new ', &
' zi_wtheta zi_theta ', &
' w"theta"0 w"theta" wtheta ', &
' theta(0) theta(zp) ', &
' splux spluy spluz ', &
' L ', &
( ' ', i9 = 1, 9 ) /)
CHARACTER (LEN=100), DIMENSION(crmax) :: cross_profiles = & !< quantities to be plotted into one coordinate system, respectively
(/ ' u v ', &
' pt ', &
' w"theta" w*theta* w*theta*BC wtheta wthetaBC ', &
' w"u" w*u* wu w"v" w*v* wv ', &
' km kh ', &
' l ', &
( ' ', i9 = 1, 94 ) /)
INTEGER(iwp) :: profile_columns = 2 !< number of coordinate systems on a profile plot per column
INTEGER(iwp) :: profile_rows = 3 !< number of coordinate systems on a profile plot per row
INTEGER(iwp) :: dopr_index(500) = 0 !< index number of respective profile quantity
INTEGER(iwp) :: dopr_initial_index(500) = 0 !< index number of initial profiles to be output
SAVE
END MODULE profil_parameter
!--------------------------------------------------------------------------------------------------!
! Description:
! ------------
!> Definition of statistical quantities, e.g. global sums.
!--------------------------------------------------------------------------------------------------!
MODULE statistics
USE kinds
CHARACTER (LEN=40) :: region(0:9) = 'total domain ' !< label for statistic region
INTEGER(iwp) :: pr_palm = 200 !< maximum number of output profiles
INTEGER(iwp) :: statistic_regions = 0 !< identifier for statistic regions
INTEGER(iwp) :: u_max_ijk(3) = -1 !< index values (i,j,k) of location where u_max occurs
INTEGER(iwp) :: v_max_ijk(3) = -1 !< index values (i,j,k) of location where v_max occurs
INTEGER(iwp) :: w_max_ijk(3) = -1 !< index values (i,j,k) of location where w_max occurs
LOGICAL :: flow_statistics_called = .FALSE. !< flag that tells other routines if flow statistics was executed
!< (after each timestep)
REAL(wp) :: u_max = 0.0_wp !< maximum of absolute u-veloctiy in entire domain
REAL(wp) :: v_max = 0.0_wp !< maximum of absolute v-veloctiy in entire domain
REAL(wp) :: w_max = 0.0_wp !< maximum of absolute w-veloctiy in entire domain
REAL(wp), DIMENSION(2) :: z_i !< inversion height
REAL(wp), DIMENSION(:), ALLOCATABLE :: mean_surface_level_height !< mean surface level height for the different statistic
!< regions
REAL(wp), DIMENSION(:), ALLOCATABLE :: sums_divnew_l !< subdomain sum (_l) of divergence after pressure
!< solver call (new)
REAL(wp), DIMENSION(:), ALLOCATABLE :: sums_divold_l !< subdomain sum (_l) of divergence before pressure
!< solver call (old)
REAL(wp), DIMENSION(:), ALLOCATABLE :: weight_pres !< substep weighting factor for pressure solver
REAL(wp), DIMENSION(:), ALLOCATABLE :: weight_substep !< weighting factor for substeps in timestepping
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums !< global sum array for the various output quantities
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_ls_l !< subdomain sum of large scale forcing and nudging tendencies
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_salsa_ws_l !< subdomain sum of vertical salsa flux w's'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_us2_ws_l !< subdomain sum of horizontal momentum flux u'u'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_vs2_ws_l !< subdomain sum of horizontal momentum flux v'v'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_ws2_ws_l !< subdomain sum of vertical momentum flux w'w'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsncs_ws_l !< subdomain sum of vertical clouddrop-number concentration flux
!< w'nc' (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsngs_ws_l !< subdomain sum of vertical graupel-number concentration flux w'nc' (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsnis_ws_l !< subdomain sum of vertical ice crystal concentration flux w'ni'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsnrs_ws_l !< subdomain sum of vertical raindrop-number concentration flux w'nr'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsnss_ws_l !< subdomain sum of vertical snow-number concentration flux w'ns' (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wssas_ws_l !< subdomain sum of vertical salinity flux w'sa'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsss_ws_l !< subdomain sum of vertical passive scalar flux w's'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wspts_ws_l !< subdomain sum of vertical sensible heat flux w'pt'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqcs_ws_l !< subdomain sum of vertical cloudwater flux w'qc'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqgs_ws_l !< subdomain sum of vertical graupel flux w'qg' (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqis_ws_l !< subdomain sum of vertical ice crystal flux w'qi'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqrs_ws_l !< subdomain sum of vertical rainwater flux w'qr'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqss_ws_l !< subdomain sum of vertical snow flux w'qs' (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsqs_ws_l !< subdomain sum of vertical latent heat flux w'q'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsts_bc_l !< subdomain sum of sensible heat flux in Bott-Chlond scheme
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsus_ws_l !< subdomain sum of vertical momentum flux w'u'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sums_wsvs_ws_l !< subdomain sum of vertical momentum flux w'v'
!< (5th-order advection scheme only)
REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ts_value !< timeseries output array for the various output quantities
REAL(wp), DIMENSION(:,:), POINTER :: sums_wschs_ws_l !< subdomain sum of vertical chemistry flux w'ch'
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: hom_sum !< sum array for horizontal mean
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: rmask !< REAL flag array (0.0 or 1.0) for statistic regions
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: sums_l !< subdomain sum (_l) gathered for various quantities
REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: sums_l_l !< subdomain sum (_l) of mixing length from diffusivities
REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: hom !< horizontal mean of various quantities (profiles/timeseries)
SAVE
END MODULE statistics