!> @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=12) :: revision = ' ' !< PALM revision number CHARACTER (LEN=12) :: version = ' ' !< PALM version number 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