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

Last change on this file since 4564 was 4564, checked in by raasch, 4 years ago

Vertical nesting method of Huq et al. (2019) removed

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