source: palm/trunk/SOURCE/time_integration.f90 @ 4505

Last change on this file since 4505 was 4502, checked in by schwenkel, 4 years ago

Implementation of ice microphysics

  • Property svn:keywords set to Id
File size: 73.7 KB
Line 
1!> @file time_integration.f90
2!------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2020 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: time_integration.f90 4502 2020-04-17 16:14:16Z schwenkel $
27! Implementation of ice microphysics
28!
29! 4472 2020-03-24 12:21:00Z Giersch
30! OPENACC COPYIN directive for ddx and ddy added
31!
32! 4466 2020-03-20 16:14:41Z suehring
33! Add advection fluxes to ACC copyin
34!
35! 4457 2020-03-11 14:20:43Z raasch
36! use statement for exchange horiz added
37!
38! 4444 2020-03-05 15:59:50Z raasch
39! bugfix: cpp-directives for serial mode added
40!
41! 4420 2020-02-24 14:13:56Z maronga
42! Added output control for wind turbine model
43!
44! 4403 2020-02-12 13:08:46Z banzhafs
45! Allowing both existing and on-demand emission read modes
46!
47! 4360 2020-01-07 11:25:50Z suehring
48! Bugfix, hour_call_emis uninitialized at first call of time_integration
49!
50! 4346 2019-12-18 11:55:56Z motisi
51! Introduction of wall_flags_total_0, which currently sets bits based on static
52! topography information used in wall_flags_static_0
53!
54! 4329 2019-12-10 15:46:36Z motisi
55! Renamed wall_flags_0 to wall_flags_static_0
56!
57! 4281 2019-10-29 15:15:39Z schwenkel
58! Moved boundary conditions to module interface
59!
60! 4276 2019-10-28 16:03:29Z schwenkel
61! Further modularization of lpm code components
62!
63! 4275 2019-10-28 15:34:55Z schwenkel
64! Move call oft lpm to the end of intermediate timestep loop
65!
66! 4268 2019-10-17 11:29:38Z schwenkel
67! Removing module specific boundary conditions an put them into their modules
68!
69! 4227 2019-09-10 18:04:34Z gronemeier
70! implement new palm_date_time_mod
71!
72! 4226 2019-09-10 17:03:24Z suehring
73! Changes in interface for the offline nesting
74!
75! 4182 2019-08-22 15:20:23Z scharf
76! Corrected "Former revisions" section
77!
78! 4170 2019-08-19 17:12:31Z gronemeier
79! copy diss, diss_p, tdiss_m to GPU
80!
81! 4144 2019-08-06 09:11:47Z raasch
82! relational operators .EQ., .NE., etc. replaced by ==, /=, etc.
83!
84! 4126 2019-07-30 11:09:11Z gronemeier
85! renamed routine to calculate uv exposure
86!
87! 4111 2019-07-22 18:16:57Z suehring
88! advc_flags_1 / advc_flags_2 renamed to advc_flags_m / advc_flags_s
89!
90! 4069 2019-07-01 14:05:51Z Giersch
91! Masked output running index mid has been introduced as a local variable to
92! avoid runtime error (Loop variable has been modified) in time_integration
93!
94! 4064 2019-07-01 05:33:33Z gronemeier
95! Moved call to radiation module out of intermediate time loop
96!
97! 4048 2019-06-21 21:00:21Z knoop
98! Moved production_e_init call into turbulence_closure_mod
99!
100! 4047 2019-06-21 18:58:09Z knoop
101! Added remainings of swap_timelevel upon its dissolution
102!
103! 4043 2019-06-18 16:59:00Z schwenkel
104! Further LPM modularization
105!
106! 4039 2019-06-18 10:32:41Z suehring
107! Rename subroutines in module for diagnostic quantities
108!
109! 4029 2019-06-14 14:04:35Z raasch
110! exchange of ghost points and boundary conditions separated for chemical species and SALSA module,
111! bugfix: decycling of chemistry species after nesting data transfer
112!
113! 4022 2019-06-12 11:52:39Z suehring
114! Call synthetic turbulence generator at last RK3 substep right after boundary
115! conditions are updated in offline nesting in order to assure that
116! perturbations are always imposed
117!
118! 4017 2019-06-06 12:16:46Z schwenkel
119! Mass (volume) flux correction included to ensure global mass conservation for child domains.
120!
121! 3994 2019-05-22 18:08:09Z suehring
122! output of turbulence intensity added
123!
124! 3988 2019-05-22 11:32:37Z kanani
125! Implement steerable output interval for virtual measurements
126!
127! 3968 2019-05-13 11:04:01Z suehring
128! replace nspec_out with n_matched_vars
129!
130! 3929 2019-04-24 12:52:08Z banzhafs
131! Reverse changes back from revision 3878: use chem_boundary_conds instead of
132! chem_boundary_conds_decycle
133!
134!
135! 3885 2019-04-11 11:29:34Z kanani
136! Changes related to global restructuring of location messages and introduction
137! of additional debug messages
138!
139! 3879 2019-04-08 20:25:23Z knoop
140! Moved wtm_forces to module_interface_actions
141!
142! 3872 2019-04-08 15:03:06Z knoop
143! Modifications made for salsa:
144! - Call salsa_emission_update at each time step but do the checks within
145!   salsa_emission_update (i.e. skip_time_do_salsa >= time_since_reference_point
146!   and next_aero_emission_update <= time_since_reference_point ).
147! - Renamed nbins --> nbins_aerosol, ncc_tot --> ncomponents_mass and
148!   ngast --> ngases_salsa and loop indices b, c and sg to ib, ic and ig
149! - Apply nesting for salsa variables
150! - Removed cpu_log calls speciffic for salsa.
151!
152! 3833 2019-03-28 15:04:04Z forkel
153! added USE chem_gasphase_mod, replaced nspec by nspec since fixed compounds are not integrated
154!
155! 3820 2019-03-27 11:53:41Z forkel
156! renamed do_emiss to emissions_anthropogenic (ecc)
157!
158!
159! 3774 2019-03-04 10:52:49Z moh.hefny
160! rephrase if statement to avoid unallocated array in case of
161! nesting_offline is false (crashing during debug mode)
162!
163! 3761 2019-02-25 15:31:42Z raasch $
164! module section re-formatted and openacc required variables moved to separate section,
165! re-formatting to 100 char line width
166!
167! 3745 2019-02-15 18:57:56Z suehring
168! Call indoor model after first timestep
169!
170! 3744 2019-02-15 18:38:58Z suehring
171! - Moved call of bio_calculate_thermal_index_maps from biometeorology module to
172! time_integration to make sure averaged input is updated before calculating.
173!
174! 3739 2019-02-13 08:05:17Z dom_dwd_user
175! Removed everything related to "time_bio_results" as this is never used.
176!
177! 3724 2019-02-06 16:28:23Z kanani
178! Correct double-used log_point_s unit
179!
180! 3719 2019-02-06 13:10:18Z kanani
181! - removed wind_turbine cpu measurement, since same time is measured inside
182!   wtm_forces subroutine as special measures
183! - moved the numerous vnest cpulog to special measures
184! - extended radiation cpulog over entire radiation part,
185!   moved radiation_interactions cpulog to special measures
186! - moved some cpu_log calls to this routine for better overview
187!
188! 3705 2019-01-29 19:56:39Z suehring
189! Data output for virtual measurements added
190!
191! 3704 2019-01-29 19:51:41Z suehring
192! Rename subroutines for surface-data output
193!
194! 3647 2019-01-02 14:10:44Z kanani
195! Bugfix: add time_since_reference_point to IF clause for data_output calls
196! (otherwise skip_time_* values don't come into affect with dt_do* = 0.0).
197! Clean up indoor_model and biometeorology model call.
198!
199! Revision 1.1  1997/08/11 06:19:04  raasch
200! Initial revision
201!
202!
203! Description:
204! ------------
205!> Integration in time of the model equations, statistical analysis and graphic
206!> output
207!------------------------------------------------------------------------------!
208 SUBROUTINE time_integration
209
210
211    USE advec_ws,                                                                                  &
212        ONLY:  ws_statistics
213
214    USE arrays_3d,                                                                                 &
215        ONLY:  diss, diss_p, dzu, e_p, nc_p, nr_p, prho, pt, pt_p, pt_init, q, qc_p, qr_p, q_init, &
216               q_p, ref_state, rho_ocean, sa_p, s_p, tend, u, u_p, v, vpt, v_p, w_p,               &
217               qi_p, ni_p
218
219#if defined( __parallel )  &&  ! defined( _OPENACC )
220    USE arrays_3d,                                                                                 &
221        ONLY:  e, nc, nr, qc, qr, s, w, qi, ni
222#endif
223
224    USE biometeorology_mod,                                                                        &
225        ONLY:  bio_calculate_thermal_index_maps, thermal_comfort, bio_calculate_uv_exposure,       &
226               uv_exposure
227
228    USE bulk_cloud_model_mod,                                                                      &
229        ONLY: bulk_cloud_model, calc_liquid_water_content, collision_turbulence,                   &
230              microphysics_morrison, microphysics_seifert, microphysics_ice_extension
231
232    USE calc_mean_profile_mod,                                                                     &
233        ONLY:  calc_mean_profile
234
235    USE chem_emissions_mod,                                                                        &
236        ONLY:  chem_emissions_setup, chem_emissions_update_on_demand
237
238    USE chem_gasphase_mod,                                                                         &
239        ONLY:  nvar
240
241    USE chem_modules,                                                                              &
242        ONLY:  bc_cs_t_val, chem_species, emissions_anthropogenic, emiss_read_legacy_mode,         &
243               n_matched_vars
244
245#if defined( __parallel )
246    USE chem_modules,                                                                              &
247        ONLY:  cs_name
248#endif
249
250    USE chemistry_model_mod,                                                                       &
251        ONLY:  chem_boundary_conds
252
253    USE control_parameters,                                                                        &
254        ONLY:  advected_distance_x, advected_distance_y, air_chemistry, average_count_3d,          &
255               averaging_interval, averaging_interval_pr, bc_lr_cyc, bc_ns_cyc, bc_pt_t_val,       &
256               bc_q_t_val, biometeorology, call_psolver_at_all_substeps,  child_domain,            &
257               constant_flux_layer, constant_heatflux, create_disturbances,        &
258               dopr_n, constant_diffusion, coupling_mode, coupling_start_time,                     &
259               current_timestep_number, disturbance_created, disturbance_energy_limit, dist_range, &
260               do_sum, dt_3d, dt_averaging_input, dt_averaging_input_pr, dt_coupling,              &
261               dt_data_output_av, dt_disturb, dt_do2d_xy, dt_do2d_xz, dt_do2d_yz, dt_do3d,         &
262               dt_domask,dt_dopts, dt_dopr, dt_dopr_listing, dt_dots, dt_run_control,              &
263               end_time, first_call_lpm, first_call_mas, galilei_transformation, humidity,         &
264               indoor_model, intermediate_timestep_count, intermediate_timestep_count_max,         &
265               land_surface, large_scale_forcing, loop_optimization, lsf_surf, lsf_vert, masks,    &
266               multi_agent_system_end, multi_agent_system_start, nesting_offline, neutral,         &
267               nr_timesteps_this_run, nudging, ocean_mode, passive_scalar, pt_reference,           &
268               pt_slope_offset, random_heatflux, rans_tke_e, run_coupled, salsa,                   &
269               simulated_time, simulated_time_chr, skip_time_do2d_xy, skip_time_do2d_xz,           &
270               skip_time_do2d_yz, skip_time_do3d, skip_time_domask, skip_time_dopr,                &
271               skip_time_data_output_av, sloping_surface, stop_dt, surface_output,                 &
272               terminate_coupled, terminate_run, timestep_scheme, time_coupling, time_do2d_xy,     &
273               time_do2d_xz, time_do2d_yz, time_do3d, time_domask, time_dopr, time_dopr_av,        &
274               time_dopr_listing, time_dopts, time_dosp, time_dosp_av, time_dots, time_do_av,      &
275               time_do_sla, time_disturb, time_run_control, time_since_reference_point,            &
276               turbulent_inflow, turbulent_outflow, urban_surface,                                 &
277               use_initial_profile_as_reference, use_single_reference_value, u_gtrans, v_gtrans,   &
278               virtual_flight, virtual_measurement, ws_scheme_mom, ws_scheme_sca, timestep_count
279
280#if defined( __parallel )
281    USE control_parameters,                                                                        &
282        ONLY:  rans_mode
283#endif
284
285    USE cpulog,                                                                                    &
286        ONLY:  cpu_log, log_point, log_point_s
287
288    USE diagnostic_output_quantities_mod,                                                          &
289        ONLY:  doq_calculate,                                                                      &
290               timestep_number_at_prev_calc
291
292    USE exchange_horiz_mod,                                                                        &
293        ONLY:  exchange_horiz
294
295    USE flight_mod,                                                                                &
296        ONLY:  flight_measurement
297
298    USE grid_variables,                                                                            &
299        ONLY:  ddx, ddy
300
301    USE indices,                                                                                   &
302        ONLY:  nbgp, nx, nxl, nxlg, nxr, nxrg, nzb, nzt
303
304    USE indoor_model_mod,                                                                          &
305        ONLY:  dt_indoor, im_main_heatcool, time_indoor
306
307    USE interfaces
308
309    USE kinds
310
311    USE land_surface_model_mod,                                                                    &
312        ONLY:  lsm_boundary_condition, lsm_energy_balance, lsm_soil_model, skip_time_do_lsm
313
314    USE lagrangian_particle_model_mod,                                                             &
315        ONLY:  lpm_data_output_ptseries
316
317    USE lsf_nudging_mod,                                                                           &
318        ONLY:  calc_tnudge, ls_forcing_surf, ls_forcing_vert, nudge_ref
319
320    USE module_interface,                                                                          &
321        ONLY:  module_interface_actions, module_interface_swap_timelevel,                          &
322               module_interface_boundary_conditions
323
324    USE multi_agent_system_mod,                                                                    &
325        ONLY:  agents_active, multi_agent_system
326
327    USE nesting_offl_mod,                                                                          &
328        ONLY:  nesting_offl_bc,                                                                    &
329               nesting_offl_geostrophic_wind,                                                      &
330               nesting_offl_input,                                                                 &
331               nesting_offl_interpolation_factor,                                                  &
332               nesting_offl_mass_conservation
333
334    USE netcdf_data_input_mod,                                                                     &
335        ONLY:  chem_emis, chem_emis_att
336
337    USE ocean_mod,                                                                                 &
338        ONLY:  prho_reference
339
340    USE palm_date_time_mod,                                                                        &
341        ONLY:  get_date_time
342
343    USE particle_attributes,                                                                       &
344        ONLY:  particle_advection, particle_advection_start, use_sgs_for_particles, wang_kernel
345
346    USE pegrid
347
348#if defined( __parallel )
349    USE pmc_interface,                                                                             &
350        ONLY:  nested_run, nesting_mode, pmci_boundary_conds, pmci_datatrans, pmci_synchronize,    &
351        pmci_ensure_nest_mass_conservation, pmci_ensure_nest_mass_conservation_vertical,           &
352        pmci_set_swaplevel
353#endif
354
355    USE progress_bar,                                                                              &
356        ONLY:  finish_progress_bar, output_progress_bar
357
358    USE prognostic_equations_mod,                                                                  &
359        ONLY:  prognostic_equations_cache, prognostic_equations_vector
360
361    USE radiation_model_mod,                                                                       &
362        ONLY: dt_radiation, force_radiation_call, radiation, radiation_control,                    &
363              radiation_interaction, radiation_interactions, skip_time_do_radiation, time_radiation
364
365    USE salsa_mod,                                                                                 &
366        ONLY: aerosol_number, aerosol_mass, bc_am_t_val, bc_an_t_val, bc_gt_t_val,                 &
367              nbins_aerosol, ncomponents_mass, ngases_salsa, salsa_boundary_conds,                 &
368              salsa_emission_update, salsa_gas, salsa_gases_from_chem, skip_time_do_salsa
369
370    USE spectra_mod,                                                                               &
371        ONLY: average_count_sp, averaging_interval_sp, calc_spectra, dt_dosp, skip_time_dosp
372
373    USE statistics,                                                                                &
374        ONLY:  flow_statistics_called, hom, pr_palm, sums_ls_l
375
376
377    USE surface_layer_fluxes_mod,                                                                  &
378        ONLY:  surface_layer_fluxes
379
380    USE surface_data_output_mod,                                                                   &
381        ONLY:  average_count_surf, averaging_interval_surf, dt_dosurf, dt_dosurf_av,               &
382               surface_data_output, surface_data_output_averaging, skip_time_dosurf,               &
383               skip_time_dosurf_av, time_dosurf, time_dosurf_av
384
385    USE surface_mod,                                                                               &
386        ONLY:  surf_def_h, surf_lsm_h, surf_usm_h
387
388    USE synthetic_turbulence_generator_mod,                                                        &
389        ONLY:  dt_stg_call, dt_stg_adjust, parametrize_inflow_turbulence, stg_adjust, stg_main,    &
390               time_stg_adjust, time_stg_call, use_syn_turb_gen
391
392    USE turbulence_closure_mod,                                                                    &
393        ONLY:  tcm_diffusivities
394
395    USE urban_surface_mod,                                                                         &
396        ONLY:  usm_boundary_condition, usm_material_heat_model, usm_material_model,                &
397               usm_surface_energy_balance, usm_green_heat_model
398
399    USE vertical_nesting_mod,                                                                      &
400        ONLY:  vnested, vnest_init
401
402#if defined( __parallel )
403    USE vertical_nesting_mod,                                                                      &
404        ONLY:  vnest_anterpolate, vnest_anterpolate_e, vnest_boundary_conds,                       &
405               vnest_boundary_conds_khkm, vnest_deallocate, vnest_init_fine, vnest_start_time
406#endif
407
408    USE virtual_measurement_mod,                                                                   &
409        ONLY:  dt_virtual_measurement,                                                             &
410               time_virtual_measurement,                                                           &
411               vm_data_output,                                                                     &
412               vm_sampling,                                                                        &
413               vm_time_start
414
415
416    USE wind_turbine_model_mod,                                                                    &
417        ONLY:  dt_data_output_wtm, time_wtm, wind_turbine, wtm_data_output
418
419#if defined( _OPENACC )
420    USE arrays_3d,                                                                                 &
421        ONLY:  d, dd2zu, ddzu, ddzw,                                                               &
422               diss_l_u,                                                                           &
423               diss_l_v,                                                                           &
424               diss_l_w,                                                                           &
425               diss_s_u,                                                                           &
426               diss_s_v,                                                                           &
427               diss_s_w,                                                                           &
428               drho_air, drho_air_zw, dzw, e,                                                      &
429               flux_l_u,                                                                           &
430               flux_l_v,                                                                           &
431               flux_l_w,                                                                           &
432               flux_s_u,                                                                           &
433               flux_s_v,                                                                           &
434               flux_s_w,                                                                           &
435               heatflux_output_conversion,                                                         &
436               kh, km, momentumflux_output_conversion, nc, nr, p, ptdf_x, ptdf_y, qc, qr, rdf,     &
437               rdf_sc, rho_air, rho_air_zw, s, tdiss_m, te_m, tpt_m, tu_m, tv_m, tw_m, ug, u_init, &
438               u_stokes_zu, vg, v_init, v_stokes_zu, w, zu, qi, ni
439
440    USE control_parameters,                                                                        &
441        ONLY:  tsc
442
443    USE indices,                                                                                   &
444        ONLY:  advc_flags_m, advc_flags_s, nyn, nyng, nys, nysg, nz, nzb_max, wall_flags_total_0
445
446    USE statistics,                                                                                &
447        ONLY:  rmask, statistic_regions, sums_l, sums_l_l, sums_us2_ws_l,                          &
448               sums_wsus_ws_l, sums_vs2_ws_l, sums_wsvs_ws_l, sums_ws2_ws_l, sums_wspts_ws_l,      &
449               sums_wsqs_ws_l, sums_wssas_ws_l, sums_wsqcs_ws_l, sums_wsqrs_ws_l, sums_wsncs_ws_l, &
450               sums_wsnrs_ws_l, sums_wsss_ws_l, weight_substep, sums_salsa_ws_l,                   &
451               sums_wsqis_ws_l, sums_wsnis_ws_l
452
453    USE surface_mod,                                                                               &
454        ONLY:  bc_h, enter_surface_arrays, exit_surface_arrays
455#endif
456
457
458    IMPLICIT NONE
459
460    CHARACTER (LEN=9) ::  time_to_string   !<
461
462    INTEGER(iwp) ::  hour                !< hour of current time
463    INTEGER(iwp) ::  hour_call_emis = -1 !< last hour where emission was called
464    INTEGER(iwp) ::  ib                  !< index for aerosol size bins
465    INTEGER(iwp) ::  ic                  !< index for aerosol mass bins
466    INTEGER(iwp) ::  icc                 !< additional index for aerosol mass bins
467    INTEGER(iwp) ::  ig                  !< index for salsa gases
468    INTEGER(iwp) ::  lsp                 !<
469    INTEGER(iwp) ::  mid                 !< masked output running index
470#if defined( __parallel )
471    INTEGER(iwp) ::  lsp_usr             !<
472    INTEGER(iwp) ::  n                   !< loop counter for chemistry species
473#endif
474
475    REAL(wp) ::  dt_3d_old  !< temporary storage of timestep to be used for
476                            !< steering of run control output interval
477    REAL(wp) ::  time_since_reference_point_save  !< original value of
478                                                  !< time_since_reference_point
479
480
481!
482!-- Copy data from arrays_3d
483!$ACC DATA &
484!$ACC COPY(d(nzb+1:nzt,nys:nyn,nxl:nxr)) &
485!$ACC COPY(diss(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
486!$ACC COPY(e(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
487!$ACC COPY(u(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
488!$ACC COPY(v(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
489!$ACC COPY(w(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
490!$ACC COPY(kh(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
491!$ACC COPY(km(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
492!$ACC COPY(p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
493!$ACC COPY(pt(nzb:nzt+1,nysg:nyng,nxlg:nxrg))
494
495!$ACC DATA &
496!$ACC COPYIN(diss_l_u(0:nz+1,nys:nyn,0), flux_l_u(0:nz+1,nys:nyn,0)) &
497!$ACC COPYIN(diss_l_v(0:nz+1,nys:nyn,0), flux_l_v(0:nz+1,nys:nyn,0)) &
498!$ACC COPYIN(diss_l_w(0:nz+1,nys:nyn,0), flux_l_w(0:nz+1,nys:nyn,0)) &
499!$ACC COPYIN(diss_s_u(0:nz+1,0), flux_s_u(0:nz+1,0)) &
500!$ACC COPYIN(diss_s_v(0:nz+1,0), flux_s_v(0:nz+1,0)) &
501!$ACC COPYIN(diss_s_w(0:nz+1,0), flux_s_w(0:nz+1,0)) &
502!$ACC COPY(diss_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
503!$ACC COPY(e_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
504!$ACC COPY(u_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
505!$ACC COPY(v_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
506!$ACC COPY(w_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
507!$ACC COPY(pt_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
508!$ACC COPY(tend(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
509!$ACC COPY(tdiss_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
510!$ACC COPY(te_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
511!$ACC COPY(tu_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
512!$ACC COPY(tv_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
513!$ACC COPY(tw_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
514!$ACC COPY(tpt_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg))
515
516!$ACC DATA &
517!$ACC COPYIN(rho_air(nzb:nzt+1), drho_air(nzb:nzt+1)) &
518!$ACC COPYIN(rho_air_zw(nzb:nzt+1), drho_air_zw(nzb:nzt+1)) &
519!$ACC COPYIN(zu(nzb:nzt+1)) &
520!$ACC COPYIN(dzu(1:nzt+1), dzw(1:nzt+1)) &
521!$ACC COPYIN(ddzu(1:nzt+1), dd2zu(1:nzt)) &
522!$ACC COPYIN(ddzw(1:nzt+1)) &
523!$ACC COPYIN(heatflux_output_conversion(nzb:nzt+1)) &
524!$ACC COPYIN(momentumflux_output_conversion(nzb:nzt+1)) &
525!$ACC COPYIN(rdf(nzb+1:nzt), rdf_sc(nzb+1:nzt)) &
526!$ACC COPYIN(ptdf_x(nxlg:nxrg), ptdf_y(nysg:nyng)) &
527!$ACC COPYIN(ref_state(0:nz+1)) &
528!$ACC COPYIN(u_init(0:nz+1), v_init(0:nz+1)) &
529!$ACC COPYIN(u_stokes_zu(nzb:nzt+1), v_stokes_zu(nzb:nzt+1)) &
530!$ACC COPYIN(pt_init(0:nz+1)) &
531!$ACC COPYIN(ug(0:nz+1), vg(0:nz+1))
532
533!
534!-- Copy data from control_parameters
535!$ACC DATA &
536!$ACC COPYIN(tsc(1:5))
537
538!
539!-- Copy data from grid_variables
540!$ACC DATA &
541!$ACC COPYIN(ddx, ddy)
542
543!
544!-- Copy data from indices
545!$ACC DATA &
546!$ACC COPYIN(advc_flags_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
547!$ACC COPYIN(advc_flags_s(nzb:nzt+1,nysg:nyng,nxlg:nxrg)) &
548!$ACC COPYIN(wall_flags_total_0(nzb:nzt+1,nysg:nyng,nxlg:nxrg))
549
550!
551!-- Copy data from surface_mod
552!$ACC DATA &
553!$ACC COPYIN(bc_h(0:1)) &
554!$ACC COPYIN(bc_h(0)%i(1:bc_h(0)%ns)) &
555!$ACC COPYIN(bc_h(0)%j(1:bc_h(0)%ns)) &
556!$ACC COPYIN(bc_h(0)%k(1:bc_h(0)%ns)) &
557!$ACC COPYIN(bc_h(1)%i(1:bc_h(1)%ns)) &
558!$ACC COPYIN(bc_h(1)%j(1:bc_h(1)%ns)) &
559!$ACC COPYIN(bc_h(1)%k(1:bc_h(1)%ns))
560
561!
562!-- Copy data from statistics
563!$ACC DATA &
564!$ACC COPYIN(hom(0:nz+1,1:2,1:4,0)) &
565!$ACC COPYIN(rmask(nysg:nyng,nxlg:nxrg,0:statistic_regions)) &
566!$ACC COPYIN(weight_substep(1:intermediate_timestep_count_max)) &
567!$ACC COPY(sums_l(nzb:nzt+1,1:pr_palm,0)) &
568!$ACC COPY(sums_l_l(nzb:nzt+1,0:statistic_regions,0)) &
569!$ACC COPY(sums_us2_ws_l(nzb:nzt+1,0)) &
570!$ACC COPY(sums_wsus_ws_l(nzb:nzt+1,0)) &
571!$ACC COPY(sums_vs2_ws_l(nzb:nzt+1,0)) &
572!$ACC COPY(sums_wsvs_ws_l(nzb:nzt+1,0)) &
573!$ACC COPY(sums_ws2_ws_l(nzb:nzt+1,0)) &
574!$ACC COPY(sums_wspts_ws_l(nzb:nzt+1,0)) &
575!$ACC COPY(sums_wssas_ws_l(nzb:nzt+1,0)) &
576!$ACC COPY(sums_wsqs_ws_l(nzb:nzt+1,0)) &
577!$ACC COPY(sums_wsqcs_ws_l(nzb:nzt+1,0)) &
578!$ACC COPY(sums_wsqis_ws_l(nzb:nzt+1,0)) &
579!$ACC COPY(sums_wsqrs_ws_l(nzb:nzt+1,0)) &
580!$ACC COPY(sums_wsncs_ws_l(nzb:nzt+1,0)) &
581!$ACC COPY(sums_wsnis_ws_l(nzb:nzt+1,0)) &
582!$ACC COPY(sums_wsnrs_ws_l(nzb:nzt+1,0)) &
583!$ACC COPY(sums_wsss_ws_l(nzb:nzt+1,0)) &
584!$ACC COPY(sums_salsa_ws_l(nzb:nzt+1,0))
585
586!
587!-- Next statement is to avoid compiler warnings about unused variables. Please
588!-- remove in case that you are using them. ddx and ddy need to be defined in
589!-- time_integration because of ACC COPYIN directive.
590    ddx = ddx
591    ddy = ddy
592
593#if defined( _OPENACC )
594    CALL enter_surface_arrays
595#endif
596
597!
598!-- At beginning determine the first time step
599    CALL timestep
600
601#if defined( __parallel )
602!
603!-- Synchronize the timestep in case of nested run.
604    IF ( nested_run )  THEN
605!
606!--    Synchronization by unifying the time step.
607!--    Global minimum of all time-steps is used for all.
608       CALL pmci_synchronize
609    ENDIF
610#endif
611
612!
613!-- Determine and print out the run control quantities before the first time
614!-- step of this run. For the initial run, some statistics (e.g. divergence)
615!-- need to be determined first --> CALL flow_statistics at the beginning of
616!-- run_control
617    CALL run_control
618!
619!-- Data exchange between coupled models in case that a call has been omitted
620!-- at the end of the previous run of a job chain.
621    IF ( coupling_mode /= 'uncoupled'  .AND.  run_coupled  .AND. .NOT. vnested )  THEN
622!
623!--    In case of model termination initiated by the local model the coupler
624!--    must not be called because this would again cause an MPI hang.
625       DO WHILE ( time_coupling >= dt_coupling  .AND.  terminate_coupled == 0 )
626          CALL surface_coupler
627          time_coupling = time_coupling - dt_coupling
628       ENDDO
629       IF (time_coupling == 0.0_wp  .AND.  time_since_reference_point < dt_coupling )  THEN
630          time_coupling = time_since_reference_point
631       ENDIF
632    ENDIF
633
634    CALL location_message( 'atmosphere (and/or ocean) time-stepping', 'start' )
635
636!
637!-- Start of the time loop
638    DO  WHILE ( simulated_time < end_time  .AND.  .NOT. stop_dt  .AND. .NOT. terminate_run )
639
640       CALL cpu_log( log_point_s(10), 'timesteps', 'start' )
641
642#if defined( __parallel )
643!
644!--    Vertical nesting: initialize fine grid
645       IF ( vnested ) THEN
646          IF ( .NOT. vnest_init  .AND.  simulated_time >= vnest_start_time )  THEN
647             CALL cpu_log( log_point_s(22), 'vnest_init', 'start' )
648             CALL vnest_init_fine
649             vnest_init = .TRUE.
650             CALL cpu_log( log_point_s(22), 'vnest_init', 'stop' )
651          ENDIF
652       ENDIF
653#endif
654
655!
656!--    Determine ug, vg and w_subs in dependence on data from external file
657!--    LSF_DATA
658       IF ( large_scale_forcing .AND. lsf_vert )  THEN
659           CALL ls_forcing_vert ( simulated_time )
660           sums_ls_l = 0.0_wp
661       ENDIF
662
663!
664!--    Set pt_init and q_init to the current profiles taken from
665!--    NUDGING_DATA
666       IF ( nudging )  THEN
667           CALL nudge_ref ( simulated_time )
668!
669!--        Store temperature gradient at the top boundary for possible Neumann
670!--        boundary condition
671           bc_pt_t_val = ( pt_init(nzt+1) - pt_init(nzt) ) / dzu(nzt+1)
672           bc_q_t_val  = ( q_init(nzt+1) - q_init(nzt) ) / dzu(nzt+1)
673           IF ( air_chemistry )  THEN
674              DO  lsp = 1, nvar
675                 bc_cs_t_val = (  chem_species(lsp)%conc_pr_init(nzt+1)                            &
676                                - chem_species(lsp)%conc_pr_init(nzt) )                            &
677                               / dzu(nzt+1)
678              ENDDO
679           ENDIF
680           IF ( salsa  .AND.  time_since_reference_point >= skip_time_do_salsa )  THEN
681              DO  ib = 1, nbins_aerosol
682                 bc_an_t_val = ( aerosol_number(ib)%init(nzt+1) - aerosol_number(ib)%init(nzt) ) / &
683                               dzu(nzt+1)
684                 DO  ic = 1, ncomponents_mass
685                    icc = ( ic - 1 ) * nbins_aerosol + ib
686                    bc_am_t_val = ( aerosol_mass(icc)%init(nzt+1) - aerosol_mass(icc)%init(nzt) ) /&
687                                  dzu(nzt+1)
688                 ENDDO
689              ENDDO
690              IF ( .NOT. salsa_gases_from_chem )  THEN
691                 DO  ig = 1, ngases_salsa
692                    bc_gt_t_val = ( salsa_gas(ig)%init(nzt+1) - salsa_gas(ig)%init(nzt) ) /        &
693                                  dzu(nzt+1)
694                 ENDDO
695              ENDIF
696           ENDIF
697       ENDIF
698!
699!--    Input of boundary data.
700       IF ( nesting_offline )  CALL nesting_offl_input
701!
702!--    Execute all other module actions routines
703       CALL module_interface_actions( 'before_timestep' )
704
705!--    Start of intermediate step loop
706       intermediate_timestep_count = 0
707       DO  WHILE ( intermediate_timestep_count < intermediate_timestep_count_max )
708
709          intermediate_timestep_count = intermediate_timestep_count + 1
710
711!
712!--       Set the steering factors for the prognostic equations which depend
713!--       on the timestep scheme
714          CALL timestep_scheme_steering
715
716!
717!--       Calculate those variables needed in the tendency terms which need
718!--       global communication
719          IF ( .NOT. use_single_reference_value  .AND.  .NOT. use_initial_profile_as_reference )   &
720          THEN
721!
722!--          Horizontally averaged profiles to be used as reference state in
723!--          buoyancy terms (WARNING: only the respective last call of
724!--          calc_mean_profile defines the reference state!)
725             IF ( .NOT. neutral )  THEN
726                CALL calc_mean_profile( pt, 4 )
727                ref_state(:)  = hom(:,1,4,0) ! this is used in the buoyancy term
728             ENDIF
729             IF ( ocean_mode )  THEN
730                CALL calc_mean_profile( rho_ocean, 64 )
731                ref_state(:)  = hom(:,1,64,0)
732             ENDIF
733             IF ( humidity )  THEN
734                CALL calc_mean_profile( vpt, 44 )
735                ref_state(:)  = hom(:,1,44,0)
736             ENDIF
737!
738!--          Assure that ref_state does not become zero at any level
739!--          ( might be the case if a vertical level is completely occupied
740!--            with topography ).
741             ref_state = MERGE( MAXVAL(ref_state), ref_state, ref_state == 0.0_wp )
742          ENDIF
743
744          IF ( ( ws_scheme_mom .OR. ws_scheme_sca )  .AND.  intermediate_timestep_count == 1 )     &
745          THEN
746             CALL ws_statistics
747          ENDIF
748!
749!--       In case of nudging calculate current nudging time scale and horizontal
750!--       means of u, v, pt and q
751          IF ( nudging )  THEN
752             CALL calc_tnudge( simulated_time )
753             CALL calc_mean_profile( u, 1 )
754             CALL calc_mean_profile( v, 2 )
755             CALL calc_mean_profile( pt, 4 )
756             CALL calc_mean_profile( q, 41 )
757          ENDIF
758!
759!--       Execute all other module actions routunes
760          CALL module_interface_actions( 'before_prognostic_equations' )
761!
762!--       Solve the prognostic equations. A fast cache optimized version with
763!--       only one single loop is used in case of Piascek-Williams advection
764!--       scheme. NEC vector machines use a different version, because
765!--       in the other versions a good vectorization is prohibited due to
766!--       inlining problems.
767          IF ( loop_optimization == 'cache' )  THEN
768             CALL prognostic_equations_cache
769          ELSEIF ( loop_optimization == 'vector' )  THEN
770             CALL prognostic_equations_vector
771          ENDIF
772!
773!--       Movement of agents in multi agent system
774          IF ( agents_active  .AND.  time_since_reference_point >= multi_agent_system_start  .AND. &
775               time_since_reference_point <= multi_agent_system_end  .AND.                         &
776               intermediate_timestep_count == 1 )                                                  &
777          THEN
778             CALL multi_agent_system
779             first_call_mas = .FALSE.
780          ENDIF
781
782!
783!--       Exchange of ghost points (lateral boundary conditions)
784          CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
785
786          CALL exchange_horiz( u_p, nbgp )
787          CALL exchange_horiz( v_p, nbgp )
788          CALL exchange_horiz( w_p, nbgp )
789          CALL exchange_horiz( pt_p, nbgp )
790          IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
791          IF ( rans_tke_e  .OR.  wang_kernel  .OR.  collision_turbulence                           &
792               .OR.  use_sgs_for_particles )  THEN
793             IF ( rans_tke_e )  THEN
794                CALL exchange_horiz( diss_p, nbgp )
795             ELSE
796                CALL exchange_horiz( diss, nbgp )
797             ENDIF
798          ENDIF
799          IF ( ocean_mode )  THEN
800             CALL exchange_horiz( sa_p, nbgp )
801             CALL exchange_horiz( rho_ocean, nbgp )
802             CALL exchange_horiz( prho, nbgp )
803          ENDIF
804          IF ( humidity )  THEN
805             CALL exchange_horiz( q_p, nbgp )
806             IF ( bulk_cloud_model .AND. microphysics_morrison )  THEN
807                CALL exchange_horiz( qc_p, nbgp )
808                CALL exchange_horiz( nc_p, nbgp )
809             ENDIF
810             IF ( bulk_cloud_model .AND. microphysics_seifert )  THEN
811                CALL exchange_horiz( qr_p, nbgp )
812                CALL exchange_horiz( nr_p, nbgp )
813             ENDIF
814             IF ( bulk_cloud_model .AND. microphysics_ice_extension )  THEN
815                CALL exchange_horiz( qi_p, nbgp )
816                CALL exchange_horiz( ni_p, nbgp )
817             ENDIF
818          ENDIF
819          IF ( passive_scalar )  CALL exchange_horiz( s_p, nbgp )
820          IF ( air_chemistry )  THEN
821             DO  lsp = 1, nvar
822                CALL exchange_horiz( chem_species(lsp)%conc_p, nbgp )
823             ENDDO
824          ENDIF
825
826          IF ( salsa  .AND.  time_since_reference_point >= skip_time_do_salsa )  THEN
827             DO  ib = 1, nbins_aerosol
828                CALL exchange_horiz( aerosol_number(ib)%conc_p, nbgp )
829                DO  ic = 1, ncomponents_mass
830                   icc = ( ic - 1 ) * nbins_aerosol + ib
831                   CALL exchange_horiz( aerosol_mass(icc)%conc_p, nbgp )
832                ENDDO
833             ENDDO
834             IF ( .NOT. salsa_gases_from_chem )  THEN
835                DO  ig = 1, ngases_salsa
836                   CALL exchange_horiz( salsa_gas(ig)%conc_p, nbgp )
837                ENDDO
838             ENDIF
839          ENDIF
840          CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
841
842!
843!--       Boundary conditions for the prognostic quantities (except of the
844!--       velocities at the outflow in case of a non-cyclic lateral wall) and
845!--       boundary conditions for module-specific variables
846          CALL module_interface_boundary_conditions
847!
848!--       Incrementing timestep counter
849          timestep_count = timestep_count + 1
850
851          CALL cpu_log( log_point(28), 'swap_timelevel', 'start' )
852!
853!--       Set the swap level for all modules
854          CALL module_interface_swap_timelevel( MOD( timestep_count, 2) )
855
856#if defined( __parallel )
857!
858!--       Set the swap level for steering the pmc data transfer
859          IF ( nested_run )  CALL pmci_set_swaplevel( MOD( timestep_count, 2) + 1 )  !> @todo: why the +1 ?
860#endif
861
862          CALL cpu_log( log_point(28), 'swap_timelevel', 'stop' )
863
864#if defined( __parallel )
865!
866!--       Vertical nesting: Interpolate fine grid data to the coarse grid
867          IF ( vnest_init ) THEN
868             CALL cpu_log( log_point_s(37), 'vnest_anterpolate', 'start' )
869             CALL vnest_anterpolate
870             CALL cpu_log( log_point_s(37), 'vnest_anterpolate', 'stop' )
871          ENDIF
872
873          IF ( nested_run )  THEN
874
875             CALL cpu_log( log_point(60), 'nesting', 'start' )
876!
877!--          Domain nesting. The data transfer subroutines pmci_parent_datatrans
878!--          and pmci_child_datatrans are called inside the wrapper
879!--          subroutine pmci_datatrans according to the control parameters
880!--          nesting_mode and nesting_datatransfer_mode.
881!--          TO_DO: why is nesting_mode given as a parameter here?
882             CALL pmci_datatrans( nesting_mode )
883
884             IF ( TRIM( nesting_mode ) == 'two-way' .OR.  nesting_mode == 'vertical' )  THEN
885
886                CALL cpu_log( log_point_s(92), 'exchange-horiz-nest', 'start' )
887!
888!--             Exchange_horiz is needed for all parent-domains after the
889!--             anterpolation
890                CALL exchange_horiz( u, nbgp )
891                CALL exchange_horiz( v, nbgp )
892                CALL exchange_horiz( w, nbgp )
893                IF ( .NOT. neutral )  CALL exchange_horiz( pt, nbgp )
894
895                IF ( humidity )  THEN
896
897                   CALL exchange_horiz( q, nbgp )
898
899                   IF ( bulk_cloud_model  .AND.  microphysics_morrison )  THEN
900                       CALL exchange_horiz( qc, nbgp )
901                       CALL exchange_horiz( nc, nbgp )
902                   ENDIF
903                   IF ( bulk_cloud_model  .AND.  microphysics_seifert )  THEN
904                       CALL exchange_horiz( qr, nbgp )
905                       CALL exchange_horiz( nr, nbgp )
906                   ENDIF
907                   IF ( bulk_cloud_model  .AND.  microphysics_ice_extension )  THEN
908                       CALL exchange_horiz( qi, nbgp )
909                       CALL exchange_horiz( ni, nbgp )
910                   ENDIF
911                ENDIF
912
913                IF ( passive_scalar )  CALL exchange_horiz( s, nbgp )
914
915                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e, nbgp )
916
917                IF ( .NOT. constant_diffusion  .AND.  rans_mode  .AND.  rans_tke_e )  THEN
918                   CALL exchange_horiz( diss, nbgp )
919                ENDIF
920
921                IF ( air_chemistry )  THEN
922                   DO  n = 1, nvar
923                      CALL exchange_horiz( chem_species(n)%conc, nbgp )
924                   ENDDO
925                ENDIF
926
927                IF ( salsa  .AND. time_since_reference_point >= skip_time_do_salsa )  THEN
928                   DO  ib = 1, nbins_aerosol
929                      CALL exchange_horiz( aerosol_number(ib)%conc, nbgp )
930                      DO  ic = 1, ncomponents_mass
931                         icc = ( ic - 1 ) * nbins_aerosol + ib
932                         CALL exchange_horiz( aerosol_mass(icc)%conc, nbgp )
933                      ENDDO
934                   ENDDO
935                   IF ( .NOT. salsa_gases_from_chem )  THEN
936                      DO  ig = 1, ngases_salsa
937                         CALL exchange_horiz( salsa_gas(ig)%conc, nbgp )
938                      ENDDO
939                   ENDIF
940                ENDIF
941                CALL cpu_log( log_point_s(92), 'exchange-horiz-nest', 'stop' )
942
943             ENDIF
944
945!
946!--          Set boundary conditions again after interpolation and anterpolation.
947             CALL pmci_boundary_conds
948
949!
950!--          Set chemistry boundary conditions (decycling)
951             IF ( air_chemistry )  THEN
952                DO  lsp = 1, nvar
953                   lsp_usr = 1
954                   DO WHILE ( TRIM( cs_name( lsp_usr ) ) /= 'novalue' )
955                      IF ( TRIM( chem_species(lsp)%name ) == TRIM( cs_name(lsp_usr) ) )  THEN
956                         CALL chem_boundary_conds( chem_species(lsp)%conc,                         &
957                                                   chem_species(lsp)%conc_pr_init )
958                      ENDIF
959                      lsp_usr = lsp_usr + 1
960                   ENDDO
961                ENDDO
962             ENDIF
963
964!
965!--          Set SALSA boundary conditions (decycling)
966             IF ( salsa  .AND. time_since_reference_point >= skip_time_do_salsa )  THEN
967                DO  ib = 1, nbins_aerosol
968                   CALL salsa_boundary_conds( aerosol_number(ib)%conc, aerosol_number(ib)%init )
969                   DO  ic = 1, ncomponents_mass
970                      icc = ( ic - 1 ) * nbins_aerosol + ib
971                      CALL salsa_boundary_conds( aerosol_mass(icc)%conc, aerosol_mass(icc)%init )
972                   ENDDO
973                ENDDO
974                IF ( .NOT. salsa_gases_from_chem )  THEN
975                   DO  ig = 1, ngases_salsa
976                      CALL salsa_boundary_conds( salsa_gas(ig)%conc, salsa_gas(ig)%init )
977                   ENDDO
978                ENDIF
979             ENDIF
980
981             CALL cpu_log( log_point(60), 'nesting', 'stop' )
982
983          ENDIF
984#endif
985
986!
987!--       Temperature offset must be imposed at cyclic boundaries in x-direction
988!--       when a sloping surface is used
989          IF ( sloping_surface )  THEN
990             IF ( nxl ==  0 )  pt(:,:,nxlg:nxl-1) = pt(:,:,nxlg:nxl-1) - pt_slope_offset
991             IF ( nxr == nx )  pt(:,:,nxr+1:nxrg) = pt(:,:,nxr+1:nxrg) + pt_slope_offset
992          ENDIF
993
994!
995!--       Impose a turbulent inflow using the recycling method
996          IF ( turbulent_inflow )  CALL inflow_turbulence
997
998!
999!--       Set values at outflow boundary using the special outflow condition
1000          IF ( turbulent_outflow )  CALL outflow_turbulence
1001
1002!
1003!--       Impose a random perturbation on the horizontal velocity field
1004          IF ( create_disturbances  .AND.  ( call_psolver_at_all_substeps  .AND.                   &
1005               intermediate_timestep_count == intermediate_timestep_count_max )                    &
1006               .OR. ( .NOT. call_psolver_at_all_substeps  .AND.  intermediate_timestep_count == 1 ) ) &
1007          THEN
1008             time_disturb = time_disturb + dt_3d
1009             IF ( time_disturb >= dt_disturb )  THEN
1010                IF ( disturbance_energy_limit /= 0.0_wp  .AND.                                     &
1011                     hom(nzb+5,1,pr_palm,0) < disturbance_energy_limit )  THEN
1012                   CALL disturb_field( 'u', tend, u )
1013                   CALL disturb_field( 'v', tend, v )
1014                ELSEIF ( ( .NOT. bc_lr_cyc  .OR.  .NOT. bc_ns_cyc )                                &
1015                         .AND. .NOT. child_domain  .AND.  .NOT.  nesting_offline )                 &
1016                THEN
1017!
1018!--                Runs with a non-cyclic lateral wall need perturbations
1019!--                near the inflow throughout the whole simulation
1020                   dist_range = 1
1021                   CALL disturb_field( 'u', tend, u )
1022                   CALL disturb_field( 'v', tend, v )
1023                   dist_range = 0
1024                ENDIF
1025                time_disturb = time_disturb - dt_disturb
1026             ENDIF
1027          ENDIF
1028
1029!
1030!--       Map forcing data derived from larger scale model onto domain
1031!--       boundaries. Further, update geostrophic wind components.
1032          IF ( nesting_offline  .AND.  intermediate_timestep_count ==                              &
1033                                       intermediate_timestep_count_max  )  THEN
1034!--          Determine interpolation factor before boundary conditions and geostrophic wind
1035!--          is updated.
1036             CALL nesting_offl_interpolation_factor
1037             CALL nesting_offl_bc
1038             CALL nesting_offl_geostrophic_wind
1039          ENDIF
1040!
1041!--       Impose a turbulent inflow using synthetic generated turbulence.
1042          IF ( use_syn_turb_gen  .AND.                                                             &
1043               intermediate_timestep_count == intermediate_timestep_count_max )  THEN
1044             CALL cpu_log( log_point(57), 'synthetic_turbulence_gen', 'start' )
1045             CALL stg_main
1046             CALL cpu_log( log_point(57), 'synthetic_turbulence_gen', 'stop' )
1047          ENDIF
1048!
1049!--       Ensure mass conservation. This need to be done after imposing
1050!--       synthetic turbulence and top boundary condition for pressure is set to
1051!--       Neumann conditions.
1052!--       Is this also required in case of Dirichlet?
1053          IF ( nesting_offline )  CALL nesting_offl_mass_conservation
1054!
1055!--       Reduce the velocity divergence via the equation for perturbation
1056!--       pressure.
1057          IF ( intermediate_timestep_count == 1  .OR. &
1058                call_psolver_at_all_substeps )  THEN
1059
1060             IF (  vnest_init ) THEN
1061#if defined( __parallel )
1062!
1063!--             Compute pressure in the CG, interpolate top boundary conditions
1064!--             to the FG and then compute pressure in the FG
1065                IF ( coupling_mode == 'vnested_crse' )  CALL pres
1066
1067                CALL cpu_log( log_point_s(30), 'vnest_bc', 'start' )
1068                CALL vnest_boundary_conds
1069                CALL cpu_log( log_point_s(30), 'vnest_bc', 'stop' )
1070
1071                IF ( coupling_mode == 'vnested_fine' )  CALL pres
1072
1073!--             Anterpolate TKE, satisfy Germano Identity
1074                CALL cpu_log( log_point_s(28), 'vnest_anter_e', 'start' )
1075                CALL vnest_anterpolate_e
1076                CALL cpu_log( log_point_s(28), 'vnest_anter_e', 'stop' )
1077#else
1078                CONTINUE
1079#endif
1080
1081             ELSE
1082#if defined( __parallel )
1083!
1084!--             Mass (volume) flux correction to ensure global mass conservation for child domains.
1085                IF ( child_domain )  THEN
1086                   IF ( nesting_mode == 'vertical' )  THEN
1087                      CALL pmci_ensure_nest_mass_conservation_vertical
1088                   ELSE
1089                      CALL pmci_ensure_nest_mass_conservation
1090                   ENDIF
1091                ENDIF
1092#endif
1093                CALL pres
1094
1095             ENDIF
1096
1097          ENDIF
1098!
1099!--       Particle transport/physics with the Lagrangian particle model
1100!--       (only once during intermediate steps, because it uses an Euler-step)
1101!--       ### particle model should be moved before prognostic_equations, in order
1102!--       to regard droplet interactions directly
1103
1104          CALL module_interface_actions( 'after_pressure_solver' )
1105!
1106!--       Interaction of droplets with temperature and mixing ratio.
1107!--       Droplet condensation and evaporation is calculated within
1108!--       advec_particles.
1109!
1110!--       If required, compute liquid water content
1111          IF ( bulk_cloud_model )  THEN
1112             CALL calc_liquid_water_content
1113          ENDIF
1114!
1115!--       If required, compute virtual potential temperature
1116          IF ( humidity )  THEN
1117             CALL compute_vpt
1118          ENDIF
1119
1120!
1121!--       Compute the diffusion quantities
1122          IF ( .NOT. constant_diffusion )  THEN
1123
1124!
1125!--          Determine surface fluxes shf and qsws and surface values
1126!--          pt_surface and q_surface in dependence on data from external
1127!--          file LSF_DATA respectively
1128             IF ( ( large_scale_forcing .AND. lsf_surf ) .AND.                                     &
1129                 intermediate_timestep_count == intermediate_timestep_count_max )                  &
1130             THEN
1131                CALL ls_forcing_surf( simulated_time )
1132             ENDIF
1133
1134!
1135!--          First the vertical (and horizontal) fluxes in the surface
1136!--          (constant flux) layer are computed
1137             IF ( constant_flux_layer )  THEN
1138                CALL cpu_log( log_point(19), 'surface_layer_fluxes', 'start' )
1139                CALL surface_layer_fluxes
1140                CALL cpu_log( log_point(19), 'surface_layer_fluxes', 'stop' )
1141             ENDIF
1142!
1143!--          If required, solve the energy balance for the surface and run soil
1144!--          model. Call for horizontal as well as vertical surfaces
1145             IF ( land_surface .AND. time_since_reference_point >= skip_time_do_lsm)  THEN
1146
1147                CALL cpu_log( log_point(54), 'land_surface', 'start' )
1148!
1149!--             Call for horizontal upward-facing surfaces
1150                CALL lsm_energy_balance( .TRUE., -1 )
1151                CALL lsm_soil_model( .TRUE., -1, .TRUE. )
1152!
1153!--             Call for northward-facing surfaces
1154                CALL lsm_energy_balance( .FALSE., 0 )
1155                CALL lsm_soil_model( .FALSE., 0, .TRUE. )
1156!
1157!--             Call for southward-facing surfaces
1158                CALL lsm_energy_balance( .FALSE., 1 )
1159                CALL lsm_soil_model( .FALSE., 1, .TRUE. )
1160!
1161!--             Call for eastward-facing surfaces
1162                CALL lsm_energy_balance( .FALSE., 2 )
1163                CALL lsm_soil_model( .FALSE., 2, .TRUE. )
1164!
1165!--             Call for westward-facing surfaces
1166                CALL lsm_energy_balance( .FALSE., 3 )
1167                CALL lsm_soil_model( .FALSE., 3, .TRUE. )
1168
1169!
1170!--             At the end, set boundary conditons for potential temperature
1171!--             and humidity after running the land-surface model. This
1172!--             might be important for the nesting, where arrays are transfered.
1173                CALL lsm_boundary_condition
1174
1175
1176                CALL cpu_log( log_point(54), 'land_surface', 'stop' )
1177             ENDIF
1178!
1179!--          If required, solve the energy balance for urban surfaces and run
1180!--          the material heat model
1181             IF (urban_surface) THEN
1182                CALL cpu_log( log_point(74), 'urban_surface', 'start' )
1183
1184                CALL usm_surface_energy_balance( .FALSE. )
1185                IF ( usm_material_model )  THEN
1186                   CALL usm_green_heat_model
1187                   CALL usm_material_heat_model ( .FALSE. )
1188                ENDIF
1189
1190!
1191!--             At the end, set boundary conditons for potential temperature
1192!--             and humidity after running the urban-surface model. This
1193!--             might be important for the nesting, where arrays are transfered.
1194                CALL usm_boundary_condition
1195
1196                CALL cpu_log( log_point(74), 'urban_surface', 'stop' )
1197             ENDIF
1198!
1199!--          Compute the diffusion coefficients
1200             CALL cpu_log( log_point(17), 'diffusivities', 'start' )
1201             IF ( .NOT. humidity ) THEN
1202                IF ( ocean_mode )  THEN
1203                   CALL tcm_diffusivities( prho, prho_reference )
1204                ELSE
1205                   CALL tcm_diffusivities( pt, pt_reference )
1206                ENDIF
1207             ELSE
1208                CALL tcm_diffusivities( vpt, pt_reference )
1209             ENDIF
1210             CALL cpu_log( log_point(17), 'diffusivities', 'stop' )
1211
1212#if defined( __parallel )
1213!
1214!--          Vertical nesting: set fine grid eddy viscosity top boundary condition
1215             IF ( vnest_init )  CALL vnest_boundary_conds_khkm
1216#endif
1217
1218          ENDIF
1219
1220       ENDDO   ! Intermediate step loop
1221
1222!
1223!--    Will be used at some point by flow_statistics.
1224       !$ACC UPDATE &
1225       !$ACC HOST(sums_l_l(nzb:nzt+1,0:statistic_regions,0)) &
1226       !$ACC HOST(sums_us2_ws_l(nzb:nzt+1,0)) &
1227       !$ACC HOST(sums_wsus_ws_l(nzb:nzt+1,0)) &
1228       !$ACC HOST(sums_vs2_ws_l(nzb:nzt+1,0)) &
1229       !$ACC HOST(sums_wsvs_ws_l(nzb:nzt+1,0)) &
1230       !$ACC HOST(sums_ws2_ws_l(nzb:nzt+1,0)) &
1231       !$ACC HOST(sums_wspts_ws_l(nzb:nzt+1,0)) &
1232       !$ACC HOST(sums_wssas_ws_l(nzb:nzt+1,0)) &
1233       !$ACC HOST(sums_wsqs_ws_l(nzb:nzt+1,0)) &
1234       !$ACC HOST(sums_wsqcs_ws_l(nzb:nzt+1,0)) &
1235       !$ACC HOST(sums_wsqis_ws_l(nzb:nzt+1,0)) &
1236       !$ACC HOST(sums_wsqrs_ws_l(nzb:nzt+1,0)) &
1237       !$ACC HOST(sums_wsncs_ws_l(nzb:nzt+1,0)) &
1238       !$ACC HOST(sums_wsnis_ws_l(nzb:nzt+1,0)) &
1239       !$ACC HOST(sums_wsnrs_ws_l(nzb:nzt+1,0)) &
1240       !$ACC HOST(sums_wsss_ws_l(nzb:nzt+1,0)) &
1241       !$ACC HOST(sums_salsa_ws_l(nzb:nzt+1,0))
1242
1243!
1244!--    If required, calculate radiative fluxes and heating rates
1245       IF ( radiation  .AND.  time_since_reference_point > skip_time_do_radiation )  THEN
1246
1247          time_radiation = time_radiation + dt_3d
1248
1249          IF ( time_radiation >= dt_radiation  .OR.  force_radiation_call )  THEN
1250
1251             CALL cpu_log( log_point(50), 'radiation', 'start' )
1252
1253             IF ( .NOT. force_radiation_call )  THEN
1254                time_radiation = time_radiation - dt_radiation
1255             ENDIF
1256
1257!
1258!--          Adjust the current time to the time step of the radiation model.
1259!--          Needed since radiation is pre-calculated and stored only on apparent
1260!--          solar positions
1261             time_since_reference_point_save = time_since_reference_point
1262             time_since_reference_point = REAL( FLOOR( time_since_reference_point /             &
1263                                                       dt_radiation ), wp ) * dt_radiation
1264
1265             CALL radiation_control
1266
1267             IF ( ( urban_surface  .OR.  land_surface )  .AND.  radiation_interactions )  THEN
1268                CALL cpu_log( log_point_s(46), 'radiation_interaction', 'start' )
1269                CALL radiation_interaction
1270                CALL cpu_log( log_point_s(46), 'radiation_interaction', 'stop' )
1271             ENDIF
1272
1273!
1274!--          Return the current time to its original value
1275             time_since_reference_point = time_since_reference_point_save
1276
1277             CALL cpu_log( log_point(50), 'radiation', 'stop' )
1278
1279          ENDIF
1280       ENDIF
1281
1282
1283!
1284!-- 20200203 (ECC)
1285!-- allows for emission update mode in legacy mode as well as on-demand mode
1286!-- note that under on-demand mode emission update is no longer restricted to
1287!-- an hourly frequency, but whenever the simulation time corresponds to an
1288!-- inrement in emission timestamp value
1289
1290!
1291!-- If required, consider chemical emissions
1292
1293       IF  ( air_chemistry .AND. emissions_anthropogenic )  THEN
1294
1295          IF  ( emiss_read_legacy_mode )  THEN
1296!
1297!-- get hourly index and updates emission data when the hour is passed
1298
1299             CALL get_date_time( time_since_reference_point, hour=hour )
1300
1301             IF  ( hour_call_emis /= hour )   THEN
1302
1303                CALL chem_emissions_setup( chem_emis_att, chem_emis, n_matched_vars )
1304                hour_call_emis = hour
1305
1306             ENDIF
1307
1308          ELSE
1309
1310             CALL chem_emissions_update_on_demand
1311
1312          ENDIF
1313
1314       ENDIF
1315
1316
1317!
1318!--    If required, consider aerosol emissions for the salsa model
1319       IF ( salsa )  THEN
1320!
1321!--       Call emission routine to update emissions if needed
1322          CALL salsa_emission_update
1323
1324       ENDIF
1325!
1326!--    If required, calculate indoor temperature, waste heat, heat flux
1327!--    through wall, etc.
1328!--    dt_indoor steers the frequency of the indoor model calculations.
1329!--    Note, at first timestep indoor model is called, in order to provide
1330!--    a waste heat flux.
1331       IF ( indoor_model )  THEN
1332
1333          time_indoor = time_indoor + dt_3d
1334
1335          IF ( time_indoor >= dt_indoor  .OR.  current_timestep_number == 0 )  THEN
1336
1337             time_indoor = time_indoor - dt_indoor
1338
1339             CALL cpu_log( log_point(76), 'indoor_model', 'start' )
1340             CALL im_main_heatcool
1341             CALL cpu_log( log_point(76), 'indoor_model', 'stop' )
1342
1343          ENDIF
1344       ENDIF
1345!
1346!--    Increase simulation time and output times
1347       nr_timesteps_this_run      = nr_timesteps_this_run + 1
1348       current_timestep_number    = current_timestep_number + 1
1349       simulated_time             = simulated_time   + dt_3d
1350       time_since_reference_point = simulated_time - coupling_start_time
1351       simulated_time_chr         = time_to_string( time_since_reference_point )
1352
1353
1354       IF ( time_since_reference_point >= skip_time_data_output_av )  THEN
1355          time_do_av         = time_do_av       + dt_3d
1356       ENDIF
1357       IF ( time_since_reference_point >= skip_time_do2d_xy )  THEN
1358          time_do2d_xy       = time_do2d_xy     + dt_3d
1359       ENDIF
1360       IF ( time_since_reference_point >= skip_time_do2d_xz )  THEN
1361          time_do2d_xz       = time_do2d_xz     + dt_3d
1362       ENDIF
1363       IF ( time_since_reference_point >= skip_time_do2d_yz )  THEN
1364          time_do2d_yz       = time_do2d_yz     + dt_3d
1365       ENDIF
1366       IF ( time_since_reference_point >= skip_time_do3d    )  THEN
1367          time_do3d          = time_do3d        + dt_3d
1368       ENDIF
1369       DO  mid = 1, masks
1370          IF ( time_since_reference_point >= skip_time_domask(mid) )  THEN
1371             time_domask(mid)= time_domask(mid) + dt_3d
1372          ENDIF
1373       ENDDO
1374       IF ( time_since_reference_point >= skip_time_dosp )  THEN
1375          time_dosp       = time_dosp        + dt_3d
1376       ENDIF
1377       time_dots          = time_dots        + dt_3d
1378       IF ( .NOT. first_call_lpm )  THEN
1379          time_dopts      = time_dopts       + dt_3d
1380       ENDIF
1381       IF ( time_since_reference_point >= skip_time_dopr )  THEN
1382          time_dopr       = time_dopr        + dt_3d
1383       ENDIF
1384       time_dopr_listing  = time_dopr_listing + dt_3d
1385       time_run_control   = time_run_control + dt_3d
1386!
1387!--    Increment time-counter for surface output
1388       IF ( surface_output )  THEN
1389          IF ( time_since_reference_point >= skip_time_dosurf )  THEN
1390             time_dosurf    = time_dosurf + dt_3d
1391          ENDIF
1392          IF ( time_since_reference_point >= skip_time_dosurf_av )  THEN
1393             time_dosurf_av = time_dosurf_av + dt_3d
1394          ENDIF
1395       ENDIF
1396!
1397!--    Increment time-counter for virtual measurements
1398       IF ( virtual_measurement  .AND.  vm_time_start <= time_since_reference_point )  THEN
1399          time_virtual_measurement = time_virtual_measurement + dt_3d
1400       ENDIF
1401
1402!
1403!--    Increment time-counter for wind turbine data output
1404       IF ( wind_turbine )  THEN
1405          time_wtm = time_wtm + dt_3d
1406       ENDIF
1407
1408!
1409!--    In case of synthetic turbulence generation and parametrized turbulence
1410!--    information, update the time counter and if required, adjust the
1411!--    STG to new atmospheric conditions.
1412       IF ( use_syn_turb_gen  )  THEN
1413          IF ( parametrize_inflow_turbulence )  THEN
1414             time_stg_adjust = time_stg_adjust + dt_3d
1415             IF ( time_stg_adjust >= dt_stg_adjust )  THEN
1416                CALL cpu_log( log_point(57), 'synthetic_turbulence_gen', 'start' )
1417                CALL stg_adjust
1418                CALL cpu_log( log_point(57), 'synthetic_turbulence_gen', 'stop' )
1419             ENDIF
1420          ENDIF
1421          time_stg_call = time_stg_call + dt_3d
1422       ENDIF
1423
1424!
1425!--    Data exchange between coupled models
1426       IF ( coupling_mode /= 'uncoupled'  .AND.  run_coupled  .AND.  .NOT. vnested )  THEN
1427          time_coupling = time_coupling + dt_3d
1428
1429!
1430!--       In case of model termination initiated by the local model
1431!--       (terminate_coupled > 0), the coupler must be skipped because it would
1432!--       cause an MPI intercomminucation hang.
1433!--       If necessary, the coupler will be called at the beginning of the
1434!--       next restart run.
1435          DO WHILE ( time_coupling >= dt_coupling  .AND.  terminate_coupled == 0 )
1436             CALL surface_coupler
1437             time_coupling = time_coupling - dt_coupling
1438          ENDDO
1439       ENDIF
1440
1441!
1442!--    Biometeorology calculation of stationary thermal indices
1443!--    Todo (kanani): biometeorology needs own time_... treatment.
1444!--                   It might be that time_do2d_xy differs from time_do3d,
1445!--                   and then we might get trouble with the biomet output,
1446!--                   because we can have 2d and/or 3d biomet output!!
1447       IF ( biometeorology                                                                         &
1448            .AND. ( ( time_do3d >= dt_do3d  .AND.  time_since_reference_point >= skip_time_do3d )  &
1449                  .OR.                                                                             &
1450            ( time_do2d_xy >= dt_do2d_xy  .AND.  time_since_reference_point >= skip_time_do2d_xy ) &
1451                    ) )  THEN
1452!
1453!--       If required, do thermal comfort calculations
1454          IF ( thermal_comfort )  THEN
1455             CALL bio_calculate_thermal_index_maps ( .FALSE. )
1456          ENDIF
1457!
1458!--       If required, do UV exposure calculations
1459          IF ( uv_exposure )  THEN
1460             CALL bio_calculate_uv_exposure
1461          ENDIF
1462       ENDIF
1463
1464!
1465!--    Execute alle other module actions routunes
1466       CALL module_interface_actions( 'after_integration' )
1467
1468!
1469!--    If Galilei transformation is used, determine the distance that the
1470!--    model has moved so far
1471       IF ( galilei_transformation )  THEN
1472          advected_distance_x = advected_distance_x + u_gtrans * dt_3d
1473          advected_distance_y = advected_distance_y + v_gtrans * dt_3d
1474       ENDIF
1475
1476!
1477!--    Check, if restart is necessary (because cpu-time is expiring or
1478!--    because it is forced by user) and set stop flag
1479!--    This call is skipped if the remote model has already initiated a restart.
1480       IF ( .NOT. terminate_run )  CALL check_for_restart
1481
1482!
1483!--    Carry out statistical analysis and output at the requested output times.
1484!--    The MOD function is used for calculating the output time counters (like
1485!--    time_dopr) in order to regard a possible decrease of the output time
1486!--    interval in case of restart runs
1487
1488!
1489!--    Set a flag indicating that so far no statistics have been created
1490!--    for this time step
1491       flow_statistics_called = .FALSE.
1492
1493!
1494!--    If required, call flow_statistics for averaging in time
1495       IF ( averaging_interval_pr /= 0.0_wp  .AND.                                                 &
1496            ( dt_dopr - time_dopr ) <= averaging_interval_pr  .AND.                                &
1497            time_since_reference_point >= skip_time_dopr )  THEN
1498          time_dopr_av = time_dopr_av + dt_3d
1499          IF ( time_dopr_av >= dt_averaging_input_pr )  THEN
1500             do_sum = .TRUE.
1501             time_dopr_av = MOD( time_dopr_av, MAX( dt_averaging_input_pr, dt_3d ) )
1502          ENDIF
1503       ENDIF
1504       IF ( do_sum )  CALL flow_statistics
1505
1506!
1507!--    Sum-up 3d-arrays for later output of time-averaged 2d/3d/masked data
1508       IF ( averaging_interval /= 0.0_wp  .AND.                                                    &
1509            ( dt_data_output_av - time_do_av ) <= averaging_interval  .AND.                        &
1510            time_since_reference_point >= skip_time_data_output_av )                               &
1511       THEN
1512          time_do_sla = time_do_sla + dt_3d
1513          IF ( time_do_sla >= dt_averaging_input )  THEN
1514             IF ( current_timestep_number > timestep_number_at_prev_calc )                         &
1515                CALL doq_calculate
1516
1517             CALL sum_up_3d_data
1518             average_count_3d = average_count_3d + 1
1519             time_do_sla = MOD( time_do_sla, MAX( dt_averaging_input, dt_3d ) )
1520          ENDIF
1521       ENDIF
1522!
1523!--    Average surface data
1524       IF ( surface_output )  THEN
1525          IF ( averaging_interval_surf /= 0.0_wp                                                   &
1526                .AND.  ( dt_dosurf_av - time_dosurf_av ) <= averaging_interval_surf                &
1527                .AND.  time_since_reference_point >= skip_time_dosurf_av )  THEN
1528             IF ( time_dosurf_av >= dt_averaging_input )  THEN
1529                CALL surface_data_output_averaging
1530                average_count_surf = average_count_surf + 1
1531             ENDIF
1532          ENDIF
1533       ENDIF
1534
1535!
1536!--    Calculate spectra for time averaging
1537       IF ( averaging_interval_sp /= 0.0_wp  .AND. ( dt_dosp - time_dosp ) <= averaging_interval_sp&
1538            .AND.  time_since_reference_point >= skip_time_dosp )  THEN
1539          time_dosp_av = time_dosp_av + dt_3d
1540          IF ( time_dosp_av >= dt_averaging_input_pr )  THEN
1541             CALL calc_spectra
1542             time_dosp_av = MOD( time_dosp_av, MAX( dt_averaging_input_pr, dt_3d ) )
1543          ENDIF
1544       ENDIF
1545
1546!
1547!--    Call flight module and output data
1548       IF ( virtual_flight )  THEN
1549          CALL flight_measurement
1550          CALL data_output_flight
1551       ENDIF
1552!
1553!--    Take virtual measurements
1554       IF ( virtual_measurement  .AND.  time_virtual_measurement >= dt_virtual_measurement         &
1555                                 .AND.  vm_time_start <= time_since_reference_point )  THEN
1556          CALL vm_sampling
1557          CALL vm_data_output
1558          time_virtual_measurement = MOD(      time_virtual_measurement,                           &
1559                                          MAX( dt_virtual_measurement, dt_3d ) )
1560       ENDIF
1561
1562!
1563!--    Output wind turbine data
1564       IF ( wind_turbine  .AND.  time_wtm >= dt_data_output_wtm )  THEN
1565          CALL wtm_data_output
1566          time_wtm = MOD( time_wtm, MAX( dt_data_output_wtm, dt_3d ) )
1567       ENDIF
1568
1569!
1570!--    Profile output (ASCII) on file
1571       IF ( time_dopr_listing >= dt_dopr_listing )  THEN
1572          CALL print_1d
1573          time_dopr_listing = MOD( time_dopr_listing, MAX( dt_dopr_listing, dt_3d ) )
1574       ENDIF
1575
1576!
1577!--    Graphic output for PROFIL
1578       IF ( time_dopr >= dt_dopr  .AND.  time_since_reference_point >= skip_time_dopr )  THEN
1579          IF ( dopr_n /= 0 )  CALL data_output_profiles
1580          time_dopr = MOD( time_dopr, MAX( dt_dopr, dt_3d ) )
1581          time_dopr_av = 0.0_wp    ! due to averaging (see above)
1582       ENDIF
1583
1584!
1585!--    Graphic output for time series
1586       IF ( time_dots >= dt_dots )  THEN
1587          CALL data_output_tseries
1588          time_dots = MOD( time_dots, MAX( dt_dots, dt_3d ) )
1589       ENDIF
1590
1591!
1592!--    Output of spectra (formatted for use with PROFIL), in case of no
1593!--    time averaging, spectra has to be calculated before
1594       IF ( time_dosp >= dt_dosp  .AND.  time_since_reference_point >= skip_time_dosp )  THEN
1595          IF ( average_count_sp == 0 )  CALL calc_spectra
1596          CALL data_output_spectra
1597          time_dosp = MOD( time_dosp, MAX( dt_dosp, dt_3d ) )
1598       ENDIF
1599
1600!
1601!--    2d-data output (cross-sections)
1602       IF ( time_do2d_xy >= dt_do2d_xy  .AND.  time_since_reference_point >= skip_time_do2d_xy )  THEN
1603          IF ( current_timestep_number > timestep_number_at_prev_calc )                            &
1604             CALL doq_calculate
1605
1606          CALL data_output_2d( 'xy', 0 )
1607          time_do2d_xy = MOD( time_do2d_xy, MAX( dt_do2d_xy, dt_3d ) )
1608       ENDIF
1609       IF ( time_do2d_xz >= dt_do2d_xz  .AND.  time_since_reference_point >= skip_time_do2d_xz )  THEN
1610          IF ( current_timestep_number > timestep_number_at_prev_calc )                            &
1611
1612             CALL doq_calculate
1613          CALL data_output_2d( 'xz', 0 )
1614          time_do2d_xz = MOD( time_do2d_xz, MAX( dt_do2d_xz, dt_3d ) )
1615       ENDIF
1616       IF ( time_do2d_yz >= dt_do2d_yz  .AND.  time_since_reference_point >= skip_time_do2d_yz )  THEN
1617          IF ( current_timestep_number > timestep_number_at_prev_calc )                            &
1618             CALL doq_calculate
1619
1620          CALL data_output_2d( 'yz', 0 )
1621          time_do2d_yz = MOD( time_do2d_yz, MAX( dt_do2d_yz, dt_3d ) )
1622       ENDIF
1623
1624!
1625!--    3d-data output (volume data)
1626       IF ( time_do3d >= dt_do3d  .AND.  time_since_reference_point >= skip_time_do3d )  THEN
1627          IF ( current_timestep_number > timestep_number_at_prev_calc )                            &
1628             CALL doq_calculate
1629
1630          CALL data_output_3d( 0 )
1631          time_do3d = MOD( time_do3d, MAX( dt_do3d, dt_3d ) )
1632       ENDIF
1633
1634!
1635!--    Masked data output
1636       DO  mid = 1, masks
1637          IF ( time_domask(mid) >= dt_domask(mid)                                                  &
1638               .AND.  time_since_reference_point >= skip_time_domask(mid) )  THEN
1639             IF ( current_timestep_number > timestep_number_at_prev_calc )                         &
1640                CALL doq_calculate
1641
1642             CALL data_output_mask( 0, mid )
1643             time_domask(mid) = MOD( time_domask(mid), MAX( dt_domask(mid), dt_3d ) )
1644          ENDIF
1645       ENDDO
1646
1647!
1648!--    Output of time-averaged 2d/3d/masked data
1649       IF ( time_do_av >= dt_data_output_av                                                        &
1650            .AND.  time_since_reference_point >= skip_time_data_output_av )  THEN
1651          CALL average_3d_data
1652!
1653!--       Udate thermal comfort indices based on updated averaged input
1654          IF ( biometeorology  .AND.  thermal_comfort )  THEN
1655             CALL bio_calculate_thermal_index_maps ( .TRUE. )
1656          ENDIF
1657          CALL data_output_2d( 'xy', 1 )
1658          CALL data_output_2d( 'xz', 1 )
1659          CALL data_output_2d( 'yz', 1 )
1660          CALL data_output_3d( 1 )
1661          DO  mid = 1, masks
1662             CALL data_output_mask( 1, mid )
1663          ENDDO
1664          time_do_av = MOD( time_do_av, MAX( dt_data_output_av, dt_3d ) )
1665       ENDIF
1666!
1667!--    Output of surface data, instantaneous and averaged data
1668       IF ( surface_output )  THEN
1669          IF ( time_dosurf >= dt_dosurf  .AND.  time_since_reference_point >= skip_time_dosurf )  THEN
1670             CALL surface_data_output( 0 )
1671             time_dosurf = MOD( time_dosurf, MAX( dt_dosurf, dt_3d ) )
1672          ENDIF
1673          IF ( time_dosurf_av >= dt_dosurf_av  .AND.  time_since_reference_point >= skip_time_dosurf_av )  THEN
1674             CALL surface_data_output( 1 )
1675             time_dosurf_av = MOD( time_dosurf_av, MAX( dt_dosurf_av, dt_3d ) )
1676          ENDIF
1677       ENDIF
1678
1679!
1680!--    Output of particle time series
1681       IF ( particle_advection )  THEN
1682          IF ( time_dopts >= dt_dopts  .OR.                                                        &
1683               ( time_since_reference_point >= particle_advection_start  .AND.                     &
1684                 first_call_lpm ) )  THEN
1685             CALL lpm_data_output_ptseries
1686             time_dopts = MOD( time_dopts, MAX( dt_dopts, dt_3d ) )
1687          ENDIF
1688       ENDIF
1689
1690!
1691!--    If required, set the heat flux for the next time step to a random value
1692       IF ( constant_heatflux  .AND.  random_heatflux )  THEN
1693          IF ( surf_def_h(0)%ns >= 1 )  THEN
1694             CALL cpu_log( log_point(23), 'disturb_heatflux', 'start' )
1695             CALL disturb_heatflux( surf_def_h(0) )
1696             CALL cpu_log( log_point(23), 'disturb_heatflux', 'stop' )
1697          ENDIF
1698          IF ( surf_lsm_h%ns    >= 1 )  THEN
1699             CALL cpu_log( log_point(23), 'disturb_heatflux', 'start' )
1700             CALL disturb_heatflux( surf_lsm_h    )
1701             CALL cpu_log( log_point(23), 'disturb_heatflux', 'stop' )
1702          ENDIF
1703          IF ( surf_usm_h%ns    >= 1 )  THEN
1704             CALL cpu_log( log_point(23), 'disturb_heatflux', 'start' )
1705             CALL disturb_heatflux( surf_usm_h    )
1706             CALL cpu_log( log_point(23), 'disturb_heatflux', 'stop' )
1707          ENDIF
1708       ENDIF
1709
1710!
1711!--    Execute alle other module actions routunes
1712       CALL module_interface_actions( 'after_timestep' )
1713
1714!
1715!--    Determine size of next time step. Save timestep dt_3d because it is
1716!--    newly calculated in routine timestep, but required further below for
1717!--    steering the run control output interval
1718       dt_3d_old = dt_3d
1719       CALL timestep
1720
1721#if defined( __parallel )
1722!
1723!--    Synchronize the timestep in case of nested run.
1724       IF ( nested_run )  THEN
1725!
1726!--       Synchronize by unifying the time step.
1727!--       Global minimum of all time-steps is used for all.
1728          CALL pmci_synchronize
1729       ENDIF
1730#endif
1731
1732!
1733!--    Computation and output of run control parameters.
1734!--    This is also done whenever perturbations have been imposed
1735       IF ( time_run_control >= dt_run_control  .OR.                                               &
1736            timestep_scheme(1:5) /= 'runge'  .OR.  disturbance_created )                           &
1737       THEN
1738          CALL run_control
1739          IF ( time_run_control >= dt_run_control )  THEN
1740             time_run_control = MOD( time_run_control, MAX( dt_run_control, dt_3d_old ) )
1741          ENDIF
1742       ENDIF
1743
1744!
1745!--    Output elapsed simulated time in form of a progress bar on stdout
1746       IF ( myid == 0 )  CALL output_progress_bar
1747
1748       CALL cpu_log( log_point_s(10), 'timesteps', 'stop' )
1749
1750
1751    ENDDO   ! time loop
1752
1753#if defined( _OPENACC )
1754    CALL exit_surface_arrays
1755#endif
1756!$ACC END DATA
1757!$ACC END DATA
1758!$ACC END DATA
1759!$ACC END DATA
1760!$ACC END DATA
1761!$ACC END DATA
1762!$ACC END DATA
1763!$ACC END DATA
1764
1765#if defined( __parallel )
1766!
1767!-- Vertical nesting: Deallocate variables initialized for vertical nesting
1768    IF ( vnest_init )  CALL vnest_deallocate
1769#endif
1770
1771    IF ( myid == 0 )  CALL finish_progress_bar
1772
1773    CALL location_message( 'atmosphere (and/or ocean) time-stepping', 'finished' )
1774
1775 END SUBROUTINE time_integration
Note: See TracBrowser for help on using the repository browser.