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

Last change on this file since 1960 was 1960, checked in by suehring, 8 years ago

Separate balance equations for humidity and passive_scalar

  • Property svn:keywords set to Id
File size: 46.8 KB
RevLine 
[1682]1!> @file time_integration.f90
[1036]2!--------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the terms
6! of the GNU General Public License as published by the Free Software Foundation,
7! either version 3 of the License, or (at your option) any later version.
8!
9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
10! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
12!
13! You should have received a copy of the GNU General Public License along with
14! PALM. If not, see <http://www.gnu.org/licenses/>.
15!
[1818]16! Copyright 1997-2016 Leibniz Universitaet Hannover
[1036]17!--------------------------------------------------------------------------------!
18!
[484]19! Current revisions:
[1092]20! ------------------
[1960]21! Separate humidity and passive scalar
[1928]22!
[1366]23! Former revisions:
24! -----------------
25! $Id: time_integration.f90 1960 2016-07-12 16:34:24Z suehring $
26!
[1958]27! 1957 2016-07-07 10:43:48Z suehring
28! flight module added
29!
[1933]30! 1919 2016-05-27 14:51:23Z raasch
31! Initial version of purely vertical nesting introduced.
[1928]32!
[1919]33! 1918 2016-05-27 14:35:57Z raasch
34! determination of time step moved to the end of the time step loop,
35! the first time step is now always calculated before the time step loop (i.e.
36! also in case of restart runs)
37!
[1917]38! 1914 2016-05-26 14:44:07Z witha
39! Added call for wind turbine model
40!
[1879]41! 1878 2016-04-19 12:30:36Z hellstea
42! Synchronization for nested runs rewritten
43!
[1854]44! 1853 2016-04-11 09:00:35Z maronga
45! Adjusted for use with radiation_scheme = constant
46!
[1851]47! 1849 2016-04-08 11:33:18Z hoffmann
48! Adapted for modularization of microphysics
49!
[1834]50! 1833 2016-04-07 14:23:03Z raasch
51! spectrum renamed spectra_mod, spectra related variables moved to spectra_mod
52!
[1832]53! 1831 2016-04-07 13:15:51Z hoffmann
54! turbulence renamed collision_turbulence
55!
[1823]56! 1822 2016-04-07 07:49:42Z hoffmann
57! icloud_scheme replaced by microphysics_*
58!
[1809]59! 1808 2016-04-05 19:44:00Z raasch
60! output message in case unscheduled radiation calls removed
61!
[1798]62! 1797 2016-03-21 16:50:28Z raasch
63! introduction of different datatransfer modes
64!
[1792]65! 1791 2016-03-11 10:41:25Z raasch
66! call of pmci_update_new removed
67!
[1787]68! 1786 2016-03-08 05:49:27Z raasch
69! +module spectrum
70!
[1784]71! 1783 2016-03-06 18:36:17Z raasch
72! switch back of netcdf data format for mask output moved to the mask output
73! routine
74!
[1782]75! 1781 2016-03-03 15:12:23Z raasch
76! some pmc calls removed at the beginning (before timeloop),
77! pmc initialization moved to the main program
78!
[1765]79! 1764 2016-02-28 12:45:19Z raasch
80! PMC_ACTIVE flags removed,
81! bugfix: nest synchronization after first call of timestep
82!
[1763]83! 1762 2016-02-25 12:31:13Z hellstea
84! Introduction of nested domain feature
85!
[1737]86! 1736 2015-12-04 08:56:33Z raasch
87! no perturbations added to total domain if energy limit has been set zero
88!
[1692]89! 1691 2015-10-26 16:17:44Z maronga
90! Added option for spin-ups without land surface and radiation models. Moved calls
91! for radiation and lan surface schemes.
92!
[1683]93! 1682 2015-10-07 23:56:08Z knoop
94! Code annotations made doxygen readable
95!
[1672]96! 1671 2015-09-25 03:29:37Z raasch
97! bugfix: ghostpoint exchange for array diss in case that sgs velocities are used
98! for particles
99!
[1586]100! 1585 2015-04-30 07:05:52Z maronga
101! Moved call of radiation scheme. Added support for RRTM
102!
[1552]103! 1551 2015-03-03 14:18:16Z maronga
104! Added interface for different radiation schemes.
105!
[1497]106! 1496 2014-12-02 17:25:50Z maronga
107! Added calls for the land surface model and radiation scheme
108!
[1403]109! 1402 2014-05-09 14:25:13Z raasch
110! location messages modified
111!
[1385]112! 1384 2014-05-02 14:31:06Z raasch
113! location messages added
114!
[1381]115! 1380 2014-04-28 12:40:45Z heinze
116! CALL of nudge_ref added
117! bc_pt_t_val and bc_q_t_val are updated in case nudging is used
118!
[1366]119! 1365 2014-04-22 15:03:56Z boeske
[1365]120! Reset sums_ls_l to zero at each timestep
121! +sums_ls_l
122! Calculation of reference state (previously in subroutine calc_mean_profile)
123
[1343]124! 1342 2014-03-26 17:04:47Z kanani
125! REAL constants defined as wp-kind
126!
[1321]127! 1320 2014-03-20 08:40:49Z raasch
[1320]128! ONLY-attribute added to USE-statements,
129! kind-parameters added to all INTEGER and REAL declaration statements,
130! kinds are defined in new module kinds,
131! old module precision_kind is removed,
132! revision history before 2012 removed,
133! comment fields (!:) to be used for variable explanations added to
134! all variable declaration statements
[1319]135! 1318 2014-03-17 13:35:16Z raasch
136! module interfaces removed
137!
[1309]138! 1308 2014-03-13 14:58:42Z fricke
139! +netcdf_data_format_save
140! For masked data, parallel netcdf output is not tested so far, hence
141! netcdf_data_format is switched back to non-paralell output.
142!
[1277]143! 1276 2014-01-15 13:40:41Z heinze
144! Use LSF_DATA also in case of Dirichlet bottom boundary condition for scalars
145!
[1258]146! 1257 2013-11-08 15:18:40Z raasch
147! acc-update-host directive for timestep removed
148!
[1242]149! 1241 2013-10-30 11:36:58Z heinze
150! Generalize calc_mean_profile for wider use
151! Determine shf and qsws in dependence on data from LSF_DATA
152! Determine ug and vg in dependence on data from LSF_DATA
[1222]153! 1221 2013-09-10 08:59:13Z raasch
154! host update of arrays before timestep is called
155!
[1182]156! 1179 2013-06-14 05:57:58Z raasch
157! mean profiles for reference state are only calculated if required,
158! small bugfix for background communication
159!
[1172]160! 1171 2013-05-30 11:27:45Z raasch
161! split of prognostic_equations deactivated (comment lines), for the time being
162!
[1132]163! 1128 2013-04-12 06:19:32Z raasch
[1128]164! asynchronous transfer of ghost point data realized for acc-optimized version:
165! prognostic_equations are first called two times for those points required for
166! the left-right and north-south exchange, respectively, and then for the
167! remaining points,
168! those parts requiring global communication moved from prognostic_equations to
169! here
[392]170!
[1116]171! 1115 2013-03-26 18:16:16Z hoffmann
172! calculation of qr and nr is restricted to precipitation
173!
[1114]174! 1113 2013-03-10 02:48:14Z raasch
175! GPU-porting of boundary conditions,
176! openACC directives updated
177! formal parameter removed from routine boundary_conds
178!
[1112]179! 1111 2013-03-08 23:54:10Z raasch
180! +internal timestep counter for cpu statistics added,
181! openACC directives updated
182!
[1093]183! 1092 2013-02-02 11:24:22Z raasch
184! unused variables removed
185!
[1066]186! 1065 2012-11-22 17:42:36Z hoffmann
187! exchange of diss (dissipation rate) in case of turbulence = .TRUE. added
188!
[1054]189! 1053 2012-11-13 17:11:03Z hoffmann
190! exchange of ghost points for nr, qr added
191!
[1037]192! 1036 2012-10-22 13:43:42Z raasch
193! code put under GPL (PALM 3.9)
194!
[1020]195! 1019 2012-09-28 06:46:45Z raasch
196! non-optimized version of prognostic_equations removed
197!
[1017]198! 1015 2012-09-27 09:23:24Z raasch
199! +call of prognostic_equations_acc
200!
[1002]201! 1001 2012-09-13 14:08:46Z raasch
202! all actions concerning leapfrog- and upstream-spline-scheme removed
203!
[850]204! 849 2012-03-15 10:35:09Z raasch
205! advec_particles renamed lpm, first_call_advec_particles renamed first_call_lpm
206!
[826]207! 825 2012-02-19 03:03:44Z raasch
208! wang_collision_kernel renamed wang_kernel
209!
[1]210! Revision 1.1  1997/08/11 06:19:04  raasch
211! Initial revision
212!
213!
214! Description:
215! ------------
[1682]216!> Integration in time of the model equations, statistical analysis and graphic
217!> output
[1]218!------------------------------------------------------------------------------!
[1682]219 SUBROUTINE time_integration
220 
[1]221
[1320]222    USE advec_ws,                                                              &
223        ONLY:  ws_statistics
224
225    USE arrays_3d,                                                             &
[1762]226        ONLY:  diss, dzu, e, e_p, nr_p, prho, pt, pt_p, pt_init, q_init, q,    &
[1960]227               ql, ql_c, ql_v, ql_vp, qr_p, q_p, ref_state, rho, s, s_p, sa_p, &
228               tend, u, u_p, v, vpt, v_p, w, w_p
[1320]229
[1365]230    USE calc_mean_profile_mod,                                                 &
[1320]231        ONLY:  calc_mean_profile
232
233    USE control_parameters,                                                    &
234        ONLY:  advected_distance_x, advected_distance_y, average_count_3d,     &
[1833]235               averaging_interval, averaging_interval_pr,                      &
236               bc_lr_cyc, bc_ns_cyc, bc_pt_t_val,                              &
[1380]237               bc_q_t_val, call_psolver_at_all_substeps, cloud_droplets,       &
[1691]238               cloud_physics, constant_flux_layer, constant_heatflux,          &
239               create_disturbances, dopr_n, constant_diffusion, coupling_mode, &
240               coupling_start_time, current_timestep_number,                   &
241               disturbance_created, disturbance_energy_limit, dist_range,      &
242               do_sum, dt_3d, dt_averaging_input, dt_averaging_input_pr,       &
243               dt_coupling, dt_data_output_av, dt_disturb, dt_do2d_xy,         &
244               dt_do2d_xz, dt_do2d_yz, dt_do3d, dt_domask,dt_dopts, dt_dopr,   &
[1833]245               dt_dopr_listing, dt_dots, dt_dvrp, dt_run_control,              &
[1320]246               end_time, first_call_lpm, galilei_transformation, humidity,     &
[1822]247               intermediate_timestep_count,                                    &
[1320]248               intermediate_timestep_count_max, large_scale_forcing,           &
[1822]249               loop_optimization, lsf_surf, lsf_vert, masks,                   &
250               microphysics_seifert, mid, nest_domain,                         &
[1783]251               neutral, nr_timesteps_this_run, nudging,                        &
[1822]252               ocean, on_device, passive_scalar,                               &
[1320]253               prho_reference, pt_reference, pt_slope_offset, random_heatflux, &
254               run_coupled, simulated_time, simulated_time_chr,                &
255               skip_time_do2d_xy, skip_time_do2d_xz, skip_time_do2d_yz,        &
256               skip_time_do3d, skip_time_domask, skip_time_dopr,               &
[1833]257               skip_time_data_output_av, sloping_surface,                      &
[1320]258               stop_dt, terminate_coupled, terminate_run, timestep_scheme,     &
259               time_coupling, time_do2d_xy, time_do2d_xz, time_do2d_yz,        &
260               time_do3d, time_domask, time_dopr, time_dopr_av,                &
261               time_dopr_listing, time_dopts, time_dosp, time_dosp_av,         &
262               time_dots, time_do_av, time_do_sla, time_disturb, time_dvrp,    &
[1496]263               time_run_control, time_since_reference_point,                   &
[1320]264               turbulent_inflow, use_initial_profile_as_reference,             &
[1957]265               use_single_reference_value, u_gtrans, v_gtrans, virtual_flight, &
266               ws_scheme_mom, ws_scheme_sca
[1320]267
268    USE cpulog,                                                                &
269        ONLY:  cpu_log, log_point, log_point_s
270
[1957]271    USE flight_mod,                                                            &
272        ONLY:  flight_measurement
273
274
[1320]275    USE indices,                                                               &
276        ONLY:  i_left, i_right, j_north, j_south, nbgp, nx, nxl, nxlg, nxr,    &
[1918]277               nxrg, nyn, nyng, nys, nysg, nzb, nzt, nzb_u_inner, nzb_v_inner
[1320]278
279    USE interaction_droplets_ptq_mod,                                          &
280        ONLY:  interaction_droplets_ptq
281
[1918]282    USE interfaces
283
[1320]284    USE kinds
285
[1496]286    USE land_surface_model_mod,                                                &
[1691]287        ONLY:  land_surface, lsm_energy_balance, lsm_soil_model,               &
288               skip_time_do_lsm
[1496]289
[1320]290    USE ls_forcing_mod,                                                        &
291        ONLY:  ls_forcing_surf, ls_forcing_vert
292
[1849]293    USE microphysics_mod,                                                      &
294        ONLY: collision_turbulence
295
[1365]296    USE nudge_mod,                                                             &
[1380]297        ONLY:  calc_tnudge, nudge_ref
[1365]298
[1320]299    USE particle_attributes,                                                   &
[1671]300        ONLY:  particle_advection, particle_advection_start,                   &
301               use_sgs_for_particles, wang_kernel
[1320]302
[1]303    USE pegrid
304
[1762]305    USE pmc_interface,                                                         &
[1933]306        ONLY:  nested_run, nesting_mode, pmci_datatrans,                       &
307               pmci_ensure_nest_mass_conservation, pmci_synchronize
[1762]308
[1320]309    USE production_e_mod,                                                      &
310        ONLY:  production_e_init
311
[1402]312    USE progress_bar,                                                          &
313        ONLY:  finish_progress_bar, output_progress_bar
314
[1320]315    USE prognostic_equations_mod,                                              &
316        ONLY:  prognostic_equations_acc, prognostic_equations_cache,           &
317               prognostic_equations_vector
318
[1496]319    USE radiation_model_mod,                                                   &
[1691]320        ONLY: dt_radiation, force_radiation_call, radiation,                   &
[1853]321              radiation_clearsky, radiation_constant, radiation_rrtmg,         &
322              radiation_scheme, skip_time_do_radiation, time_radiation
[1496]323
[1833]324    USE spectra_mod,                                                           &
325        ONLY: average_count_sp, averaging_interval_sp, calc_spectra, dt_dosp,  &
326              skip_time_dosp
[1786]327
[1320]328    USE statistics,                                                            &
[1918]329        ONLY:  flow_statistics_called, hom, pr_palm, sums_ls_l, u_max,         &
330               u_max_ijk, v_max, v_max_ijk, w_max, w_max_ijk
[1320]331
[1691]332    USE surface_layer_fluxes_mod,                                              &
333        ONLY:  surface_layer_fluxes
334
[1320]335    USE user_actions_mod,                                                      &
336        ONLY:  user_actions
337
[1914]338    USE wind_turbine_model_mod,                                                &
339        ONLY:  wind_turbine, wtm_forces
340
[1]341    IMPLICIT NONE
342
[1682]343    CHARACTER (LEN=9) ::  time_to_string          !<
[1]344
[1918]345    REAL(wp) ::  dt_3d_old  !< temporary storage of timestep to be used for
346                            !< steering of run control output interval
347
[1]348!
[1918]349!-- At beginning determine the first time step
350    CALL timestep
[667]351
[1764]352!
353!-- Synchronize the timestep in case of nested run.
354    IF ( nested_run )  THEN
[1878]355!
356!--    Synchronization by unifying the time step.
357!--    Global minimum of all time-steps is used for all.
358       CALL pmci_synchronize
[1764]359    ENDIF
360
[1918]361!
362!-- Determine and print out the run control quantities before the first time
363!-- step of this run. For the initial run, some statistics (e.g. divergence)
364!-- need to be determined first.
365    IF ( simulated_time == 0.0_wp )  CALL flow_statistics
[1]366    CALL run_control
367
[108]368!
369!-- Data exchange between coupled models in case that a call has been omitted
370!-- at the end of the previous run of a job chain.
[291]371    IF ( coupling_mode /= 'uncoupled'  .AND.  run_coupled )  THEN
[108]372!
373!--    In case of model termination initiated by the local model the coupler
374!--    must not be called because this would again cause an MPI hang.
[1918]375       DO WHILE ( time_coupling >= dt_coupling  .AND.  terminate_coupled == 0 )
[108]376          CALL surface_coupler
377          time_coupling = time_coupling - dt_coupling
378       ENDDO
[1918]379       IF (time_coupling == 0.0_wp  .AND.                                      &
380           time_since_reference_point < dt_coupling )                          &
[348]381       THEN
382          time_coupling = time_since_reference_point
383       ENDIF
[108]384    ENDIF
385
[1]386#if defined( __dvrp_graphics )
387!
388!-- Time measurement with dvrp software 
389    CALL DVRP_LOG_EVENT( 2, current_timestep_number )
390#endif
391
[1402]392    CALL location_message( 'start with time-stepping', .TRUE. )
[1]393!
394!-- Start of the time loop
395    DO  WHILE ( simulated_time < end_time  .AND.  .NOT. stop_dt  .AND. &
396                .NOT. terminate_run )
397
398       CALL cpu_log( log_point_s(10), 'timesteps', 'start' )
[1221]399
[1]400!
[1241]401!--    Determine ug, vg and w_subs in dependence on data from external file
402!--    LSF_DATA
[1365]403       IF ( large_scale_forcing .AND. lsf_vert )  THEN
[1241]404           CALL ls_forcing_vert ( simulated_time )
[1365]405           sums_ls_l = 0.0_wp
[1241]406       ENDIF
407
408!
[1380]409!--    Set pt_init and q_init to the current profiles taken from
410!--    NUDGING_DATA
411       IF ( nudging )  THEN
412           CALL nudge_ref ( simulated_time )
413!
414!--        Store temperature gradient at the top boundary for possible Neumann
415!--        boundary condition
416           bc_pt_t_val = ( pt_init(nzt+1) - pt_init(nzt) ) / dzu(nzt+1)
417           bc_q_t_val  = ( q_init(nzt+1) - q_init(nzt) ) / dzu(nzt+1)
418       ENDIF
419
420!
[1]421!--    Execute the user-defined actions
422       CALL user_actions( 'before_timestep' )
423
424!
[1914]425!--    Calculate forces by wind turbines
426       IF ( wind_turbine )  THEN
427
428          CALL cpu_log( log_point(55), 'wind_turbine', 'start' )
429
430          CALL wtm_forces
431
432          CALL cpu_log( log_point(55), 'wind_turbine', 'stop' )
433
434       ENDIF       
435       
436!
[1]437!--    Start of intermediate step loop
438       intermediate_timestep_count = 0
439       DO  WHILE ( intermediate_timestep_count < &
440                   intermediate_timestep_count_max )
441
442          intermediate_timestep_count = intermediate_timestep_count + 1
443
444!
445!--       Set the steering factors for the prognostic equations which depend
446!--       on the timestep scheme
447          CALL timestep_scheme_steering
448
449!
[1128]450!--       Calculate those variables needed in the tendency terms which need
451!--       global communication
[1179]452          IF ( .NOT. use_single_reference_value  .AND. &
453               .NOT. use_initial_profile_as_reference )  THEN
454!
455!--          Horizontally averaged profiles to be used as reference state in
456!--          buoyancy terms (WARNING: only the respective last call of
457!--          calc_mean_profile defines the reference state!)
[1365]458             IF ( .NOT. neutral )  THEN
459                CALL calc_mean_profile( pt, 4 )
460                ref_state(:)  = hom(:,1,4,0) ! this is used in the buoyancy term
461             ENDIF
462             IF ( ocean )  THEN
463                CALL calc_mean_profile( rho, 64 )
464                ref_state(:)  = hom(:,1,64,0)
465             ENDIF
466             IF ( humidity )  THEN
467                CALL calc_mean_profile( vpt, 44 )
468                ref_state(:)  = hom(:,1,44,0)
469             ENDIF
470
[1179]471          ENDIF
472
[1128]473          IF ( .NOT. constant_diffusion )  CALL production_e_init
474          IF ( ( ws_scheme_mom .OR. ws_scheme_sca )  .AND.  &
475               intermediate_timestep_count == 1 )  CALL ws_statistics
[1365]476!
477!--       In case of nudging calculate current nudging time scale and horizontal
[1380]478!--       means of u, v, pt and q
[1365]479          IF ( nudging )  THEN
480             CALL calc_tnudge( simulated_time )
481             CALL calc_mean_profile( u, 1 )
482             CALL calc_mean_profile( v, 2 )
483             CALL calc_mean_profile( pt, 4 )
484             CALL calc_mean_profile( q, 41 )
485          ENDIF
[1128]486
487!
[1]488!--       Solve the prognostic equations. A fast cache optimized version with
489!--       only one single loop is used in case of Piascek-Williams advection
490!--       scheme. NEC vector machines use a different version, because
491!--       in the other versions a good vectorization is prohibited due to
492!--       inlining problems.
[1019]493          IF ( loop_optimization == 'cache' )  THEN
494             CALL prognostic_equations_cache
495          ELSEIF ( loop_optimization == 'vector' )  THEN
[63]496             CALL prognostic_equations_vector
[1015]497          ELSEIF ( loop_optimization == 'acc' )  THEN
[1171]498             i_left  = nxl;         i_right = nxr
499             j_south = nys;         j_north = nyn
500             CALL prognostic_equations_acc
501
502!             i_left  = nxl;         i_right = nxl+nbgp-1
[1128]503!             j_south = nys;         j_north = nyn
504!             CALL prognostic_equations_acc
[1171]505!             i_left  = nxr-nbgp+1;  i_right = nxr
506!             j_south = nys;         j_north = nyn
507!             CALL prognostic_equations_acc
[1128]508
509!
510!--          Exchange of ghost points (lateral boundary conditions)
511             IF ( background_communication )  THEN
512
513                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
514               
515                send_receive = 'lr'
516                sendrecv_in_background = .TRUE.
517                req          = 0
518                req_count    = 0
519
520                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
521                   on_device = .TRUE.         ! to be removed after complete porting
522                ELSE                          ! of ghost point exchange
523                   !$acc update host( e_p, pt_p, u_p, v_p, w_p )
524                ENDIF
525
526                CALL exchange_horiz( u_p, nbgp )
527                CALL exchange_horiz( v_p, nbgp )
528                CALL exchange_horiz( w_p, nbgp )
529                CALL exchange_horiz( pt_p, nbgp )
530                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
531                IF ( ocean )  THEN
532                   CALL exchange_horiz( sa_p, nbgp )
533                   CALL exchange_horiz( rho, nbgp )
[1960]534                   CALL exchange_horiz( prho, nbgp )
[1128]535                ENDIF
[1960]536                IF ( humidity )  THEN
[1128]537                   CALL exchange_horiz( q_p, nbgp )
[1822]538                   IF ( cloud_physics .AND. microphysics_seifert )  THEN
[1128]539                      CALL exchange_horiz( qr_p, nbgp )
540                      CALL exchange_horiz( nr_p, nbgp )
541                   ENDIF
542                ENDIF
543                IF ( cloud_droplets )  THEN
544                   CALL exchange_horiz( ql, nbgp )
545                   CALL exchange_horiz( ql_c, nbgp )
546                   CALL exchange_horiz( ql_v, nbgp )
547                   CALL exchange_horiz( ql_vp, nbgp )
548                ENDIF
[1831]549                IF ( wang_kernel  .OR.  collision_turbulence  .OR.             &
550                     use_sgs_for_particles )  THEN
[1671]551                   CALL exchange_horiz( diss, nbgp )
552                ENDIF
[1960]553                IF ( passive_scalar )  CALL exchange_horiz( s_p, nbgp )
[1128]554
555                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
556                   on_device = .FALSE.        ! to be removed after complete porting
557                ELSE                          ! of ghost point exchange
558                   !$acc update device( e_p, pt_p, u_p, v_p, w_p )
559                ENDIF
560
561                sendrecv_in_background = .FALSE.
562
563                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'pause' )
564
565             ENDIF
566
[1171]567!             i_left  = nxl+nbgp;    i_right = nxr-nbgp
568!             j_south = nys;         j_north = nys+nbgp-1
569!             CALL prognostic_equations_acc
570!             i_left  = nxl+nbgp;    i_right = nxr-nbgp
571!             j_south = nyn-nbgp+1;  j_north = nyn
572!             CALL prognostic_equations_acc
[1128]573
574             IF ( background_communication )  THEN
575                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'start' )
576#if defined( __parallel )
577                CALL MPI_WAITALL( req_count, req, wait_stat, ierr )
578#endif
579                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'pause' )
580
581                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'continue' )
582
583                send_receive = 'ns'
584                sendrecv_in_background = .TRUE.
585                req          = 0
586                req_count    = 0
587
588                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
589                   on_device = .TRUE.         ! to be removed after complete porting
590                ELSE                          ! of ghost point exchange
591                   !$acc update host( e_p, pt_p, u_p, v_p, w_p )
592                ENDIF
593
594                CALL exchange_horiz( u_p, nbgp )
595                CALL exchange_horiz( v_p, nbgp )
596                CALL exchange_horiz( w_p, nbgp )
597                CALL exchange_horiz( pt_p, nbgp )
598                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
599                IF ( ocean )  THEN
600                   CALL exchange_horiz( sa_p, nbgp )
601                   CALL exchange_horiz( rho, nbgp )
602                  CALL exchange_horiz( prho, nbgp )
603                ENDIF
[1960]604                IF ( humidity )  THEN
[1128]605                   CALL exchange_horiz( q_p, nbgp )
[1822]606                   IF ( cloud_physics .AND. microphysics_seifert )  THEN
[1128]607                      CALL exchange_horiz( qr_p, nbgp )
608                      CALL exchange_horiz( nr_p, nbgp )
609                   ENDIF
610                ENDIF
611                IF ( cloud_droplets )  THEN
612                   CALL exchange_horiz( ql, nbgp )
613                   CALL exchange_horiz( ql_c, nbgp )
614                   CALL exchange_horiz( ql_v, nbgp )
615                   CALL exchange_horiz( ql_vp, nbgp )
616                ENDIF
[1831]617                IF ( wang_kernel  .OR.  collision_turbulence  .OR.             &
618                     use_sgs_for_particles )  THEN
[1671]619                   CALL exchange_horiz( diss, nbgp )
620                ENDIF
[1960]621                IF ( passive_scalar )  CALL exchange_horiz( s_p, nbgp )
[1128]622
623                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
624                   on_device = .FALSE.        ! to be removed after complete porting
625                ELSE                          ! of ghost point exchange
626                   !$acc update device( e_p, pt_p, u_p, v_p, w_p )
627                ENDIF
628
629                sendrecv_in_background = .FALSE.
630
631                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
632
633             ENDIF
634
[1171]635!             i_left  = nxl+nbgp;    i_right = nxr-nbgp
636!             j_south = nys+nbgp;    j_north = nyn-nbgp
637!             CALL prognostic_equations_acc
[1128]638
639             IF ( background_communication )  THEN
640                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'continue' )
641#if defined( __parallel )
642                CALL MPI_WAITALL( req_count, req, wait_stat, ierr )
643#endif
644                send_receive = 'al'
645                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'stop' )
646             ENDIF
647
[1]648          ENDIF
649
650!
[849]651!--       Particle transport/physics with the Lagrangian particle model
652!--       (only once during intermediate steps, because it uses an Euler-step)
[1128]653!--       ### particle model should be moved before prognostic_equations, in order
654!--       to regard droplet interactions directly
[63]655          IF ( particle_advection  .AND.                         &
656               simulated_time >= particle_advection_start  .AND. &
[1]657               intermediate_timestep_count == 1 )  THEN
[849]658             CALL lpm
659             first_call_lpm = .FALSE.
[1]660          ENDIF
661
662!
663!--       Interaction of droplets with temperature and specific humidity.
664!--       Droplet condensation and evaporation is calculated within
665!--       advec_particles.
666          IF ( cloud_droplets  .AND.  &
667               intermediate_timestep_count == intermediate_timestep_count_max )&
668          THEN
669             CALL interaction_droplets_ptq
670          ENDIF
671
672!
673!--       Exchange of ghost points (lateral boundary conditions)
[1128]674          IF ( .NOT. background_communication )  THEN
[1113]675
[1128]676             CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
[1113]677
[1128]678             IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
679                on_device = .TRUE.         ! to be removed after complete porting
680             ELSE                          ! of ghost point exchange
681                !$acc update host( e_p, pt_p, u_p, v_p, w_p )
[1053]682             ENDIF
[1]683
[1128]684             CALL exchange_horiz( u_p, nbgp )
685             CALL exchange_horiz( v_p, nbgp )
686             CALL exchange_horiz( w_p, nbgp )
687             CALL exchange_horiz( pt_p, nbgp )
688             IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
689             IF ( ocean )  THEN
690                CALL exchange_horiz( sa_p, nbgp )
691                CALL exchange_horiz( rho, nbgp )
692                CALL exchange_horiz( prho, nbgp )
693             ENDIF
[1960]694             IF ( humidity )  THEN
[1128]695                CALL exchange_horiz( q_p, nbgp )
[1822]696                IF ( cloud_physics .AND. microphysics_seifert )  THEN
[1128]697                   CALL exchange_horiz( qr_p, nbgp )
698                   CALL exchange_horiz( nr_p, nbgp )
699                ENDIF
700             ENDIF
701             IF ( cloud_droplets )  THEN
702                CALL exchange_horiz( ql, nbgp )
703                CALL exchange_horiz( ql_c, nbgp )
704                CALL exchange_horiz( ql_v, nbgp )
705                CALL exchange_horiz( ql_vp, nbgp )
706             ENDIF
[1831]707             IF ( wang_kernel  .OR.  collision_turbulence  .OR.                &
708                  use_sgs_for_particles )  THEN
[1671]709                CALL exchange_horiz( diss, nbgp )
710             ENDIF
[1960]711             IF ( passive_scalar )  CALL exchange_horiz( s_p, nbgp )     
[1128]712
713             IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
714                on_device = .FALSE.        ! to be removed after complete porting
715             ELSE                          ! of ghost point exchange
716                !$acc update device( e_p, pt_p, u_p, v_p, w_p )
717             ENDIF
718
719             CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
720
[1113]721          ENDIF
722
[1]723!
724!--       Boundary conditions for the prognostic quantities (except of the
725!--       velocities at the outflow in case of a non-cyclic lateral wall)
[1113]726          CALL boundary_conds
[1]727
728!
[73]729!--       Swap the time levels in preparation for the next time step.
730          CALL swap_timelevel
731
[1764]732          IF ( nested_run )  THEN
[1797]733
[1764]734             CALL cpu_log( log_point(60), 'nesting', 'start' )
[1762]735!
[1933]736!--          Domain nesting. The data transfer subroutines pmci_parent_datatrans
737!--          and pmci_child_datatrans are called inside the wrapper
[1797]738!--          subroutine pmci_datatrans according to the control parameters
739!--          nesting_mode and nesting_datatransfer_mode.
740!--          TO_DO: why is nesting_mode given as a parameter here?
741             CALL pmci_datatrans( nesting_mode )
[1762]742
[1933]743             IF ( TRIM( nesting_mode ) == 'two-way' .OR.                               &
744                  nesting_mode == 'vertical' )  THEN
[1762]745!
[1933]746!--             Exchange_horiz is needed for all parent-domains after the
[1764]747!--             anterpolation
748                CALL exchange_horiz( u, nbgp )
749                CALL exchange_horiz( v, nbgp )
750                CALL exchange_horiz( w, nbgp )
[1960]751                IF ( .NOT. neutral            )  CALL exchange_horiz( pt, nbgp )
752                IF ( humidity                 )  CALL exchange_horiz( q, nbgp  )
753                IF ( passive_scalar           )  CALL exchange_horiz( s, nbgp  )
754                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e, nbgp  )
[1762]755             ENDIF
756!
[1764]757!--          Correct the w top-BC in nest domains to ensure mass conservation.
[1933]758!--          This action must never be done for the root domain. Vertical
759!--          nesting implies mass conservation.
[1764]760             IF ( nest_domain )  THEN
761                CALL pmci_ensure_nest_mass_conservation
762             ENDIF
763
764             CALL cpu_log( log_point(60), 'nesting', 'stop' )
765
[1762]766          ENDIF
767
768!
[1]769!--       Temperature offset must be imposed at cyclic boundaries in x-direction
770!--       when a sloping surface is used
771          IF ( sloping_surface )  THEN
[707]772             IF ( nxl ==  0 )  pt(:,:,nxlg:nxl-1) = pt(:,:,nxlg:nxl-1) - &
773                                                    pt_slope_offset
774             IF ( nxr == nx )  pt(:,:,nxr+1:nxrg) = pt(:,:,nxr+1:nxrg) + &
775                                                    pt_slope_offset
[1]776          ENDIF
777
778!
[151]779!--       Impose a turbulent inflow using the recycling method
780          IF ( turbulent_inflow )  CALL  inflow_turbulence
781
782!
[1]783!--       Impose a random perturbation on the horizontal velocity field
[106]784          IF ( create_disturbances  .AND.                                      &
785               ( call_psolver_at_all_substeps  .AND.                           &
[1]786               intermediate_timestep_count == intermediate_timestep_count_max )&
[106]787          .OR. ( .NOT. call_psolver_at_all_substeps  .AND.                     &
788               intermediate_timestep_count == 1 ) )                            &
[1]789          THEN
790             time_disturb = time_disturb + dt_3d
791             IF ( time_disturb >= dt_disturb )  THEN
[1111]792                !$acc update host( u, v )
[1113]793                IF ( numprocs == 1 )  on_device = .FALSE.  ! workaround, remove later
[1736]794                IF ( disturbance_energy_limit /= 0.0_wp  .AND.                 &
795                     hom(nzb+5,1,pr_palm,0) < disturbance_energy_limit )  THEN
[75]796                   CALL disturb_field( nzb_u_inner, tend, u )
797                   CALL disturb_field( nzb_v_inner, tend, v )
[707]798                ELSEIF ( .NOT. bc_lr_cyc  .OR.  .NOT. bc_ns_cyc )  THEN
[1]799!
800!--                Runs with a non-cyclic lateral wall need perturbations
801!--                near the inflow throughout the whole simulation
802                   dist_range = 1
[75]803                   CALL disturb_field( nzb_u_inner, tend, u )
804                   CALL disturb_field( nzb_v_inner, tend, v )
[1]805                   dist_range = 0
806                ENDIF
[1113]807                IF ( numprocs == 1 )  on_device = .TRUE.  ! workaround, remove later
[1111]808                !$acc update device( u, v )
[1]809                time_disturb = time_disturb - dt_disturb
810             ENDIF
811          ENDIF
812
813!
814!--       Reduce the velocity divergence via the equation for perturbation
815!--       pressure.
[106]816          IF ( intermediate_timestep_count == 1  .OR. &
817                call_psolver_at_all_substeps )  THEN
[1]818             CALL pres
819          ENDIF
820
821!
822!--       If required, compute liquid water content
[1015]823          IF ( cloud_physics )  THEN
824             CALL calc_liquid_water_content
825             !$acc update device( ql )
826          ENDIF
[1115]827!
828!--       If required, compute virtual potential temperature
829          IF ( humidity )  THEN
830             CALL compute_vpt 
831             !$acc update device( vpt )
832          ENDIF 
[1585]833
[1]834!
835!--       Compute the diffusion quantities
836          IF ( .NOT. constant_diffusion )  THEN
837
838!
[1276]839!--          Determine surface fluxes shf and qsws and surface values
840!--          pt_surface and q_surface in dependence on data from external
841!--          file LSF_DATA respectively
842             IF ( ( large_scale_forcing .AND. lsf_surf ) .AND. &
843                 intermediate_timestep_count == intermediate_timestep_count_max )&
844             THEN
845                CALL ls_forcing_surf ( simulated_time )
846             ENDIF
847
848!
[1691]849!--          First the vertical fluxes in the surface (constant flux) layer are computed
850             IF ( constant_flux_layer )  THEN
851                CALL cpu_log( log_point(19), 'surface_layer_fluxes', 'start' )
852                CALL surface_layer_fluxes
853                CALL cpu_log( log_point(19), 'surface_layer_fluxes', 'stop' )
[1]854             ENDIF
[1241]855
[1]856!
[1691]857!--          If required, solve the energy balance for the surface and run soil
858!--          model
859             IF ( land_surface .AND. simulated_time > skip_time_do_lsm)  THEN
860
861                CALL cpu_log( log_point(54), 'land_surface', 'start' )
862                CALL lsm_energy_balance
863                CALL lsm_soil_model
864                CALL cpu_log( log_point(54), 'land_surface', 'stop' )
865             ENDIF
866!
[1]867!--          Compute the diffusion coefficients
868             CALL cpu_log( log_point(17), 'diffusivities', 'start' )
[75]869             IF ( .NOT. humidity ) THEN
[97]870                IF ( ocean )  THEN
[388]871                   CALL diffusivities( prho, prho_reference )
[97]872                ELSE
873                   CALL diffusivities( pt, pt_reference )
874                ENDIF
[1]875             ELSE
[97]876                CALL diffusivities( vpt, pt_reference )
[1]877             ENDIF
878             CALL cpu_log( log_point(17), 'diffusivities', 'stop' )
879
880          ENDIF
881
[1691]882!
883!--       If required, calculate radiative fluxes and heating rates
884          IF ( radiation .AND. intermediate_timestep_count                     &
885               == intermediate_timestep_count_max .AND. simulated_time >    &
886               skip_time_do_radiation )  THEN
887
888               time_radiation = time_radiation + dt_3d
889
890             IF ( time_radiation >= dt_radiation .OR. force_radiation_call )   &
891             THEN
892
893                CALL cpu_log( log_point(50), 'radiation', 'start' )
894
895                IF ( .NOT. force_radiation_call )  THEN
896                   time_radiation = time_radiation - dt_radiation
897                ENDIF
898
899                IF ( radiation_scheme == 'clear-sky' )  THEN
900                   CALL radiation_clearsky
901                ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
902                   CALL radiation_rrtmg
[1853]903                ELSE
904                   CALL radiation_constant
[1691]905                ENDIF
906
907                CALL cpu_log( log_point(50), 'radiation', 'stop' )
908             ENDIF
909          ENDIF
910
[1]911       ENDDO   ! Intermediate step loop
912
913!
914!--    Increase simulation time and output times
[1111]915       nr_timesteps_this_run      = nr_timesteps_this_run + 1
[291]916       current_timestep_number    = current_timestep_number + 1
917       simulated_time             = simulated_time   + dt_3d
918       simulated_time_chr         = time_to_string( simulated_time )
919       time_since_reference_point = simulated_time - coupling_start_time
920
[1957]921
922
[1]923       IF ( simulated_time >= skip_time_data_output_av )  THEN
924          time_do_av         = time_do_av       + dt_3d
925       ENDIF
926       IF ( simulated_time >= skip_time_do2d_xy )  THEN
927          time_do2d_xy       = time_do2d_xy     + dt_3d
928       ENDIF
929       IF ( simulated_time >= skip_time_do2d_xz )  THEN
930          time_do2d_xz       = time_do2d_xz     + dt_3d
931       ENDIF
932       IF ( simulated_time >= skip_time_do2d_yz )  THEN
933          time_do2d_yz       = time_do2d_yz     + dt_3d
934       ENDIF
935       IF ( simulated_time >= skip_time_do3d    )  THEN
936          time_do3d          = time_do3d        + dt_3d
937       ENDIF
[410]938       DO  mid = 1, masks
939          IF ( simulated_time >= skip_time_domask(mid) )  THEN
940             time_domask(mid)= time_domask(mid) + dt_3d
941          ENDIF
942       ENDDO
[1]943       time_dvrp          = time_dvrp        + dt_3d
944       IF ( simulated_time >= skip_time_dosp )  THEN
945          time_dosp       = time_dosp        + dt_3d
946       ENDIF
947       time_dots          = time_dots        + dt_3d
[849]948       IF ( .NOT. first_call_lpm )  THEN
[1]949          time_dopts      = time_dopts       + dt_3d
950       ENDIF
951       IF ( simulated_time >= skip_time_dopr )  THEN
952          time_dopr       = time_dopr        + dt_3d
953       ENDIF
954       time_dopr_listing          = time_dopr_listing        + dt_3d
955       time_run_control   = time_run_control + dt_3d
956
957!
[102]958!--    Data exchange between coupled models
[291]959       IF ( coupling_mode /= 'uncoupled'  .AND.  run_coupled )  THEN
[102]960          time_coupling = time_coupling + dt_3d
[343]961
[108]962!
963!--       In case of model termination initiated by the local model
964!--       (terminate_coupled > 0), the coupler must be skipped because it would
965!--       cause an MPI intercomminucation hang.
966!--       If necessary, the coupler will be called at the beginning of the
967!--       next restart run.
968          DO WHILE ( time_coupling >= dt_coupling .AND. terminate_coupled == 0 )
[102]969             CALL surface_coupler
970             time_coupling = time_coupling - dt_coupling
971          ENDDO
972       ENDIF
973
974!
[46]975!--    Execute user-defined actions
976       CALL user_actions( 'after_integration' )
977
978!
[1]979!--    If Galilei transformation is used, determine the distance that the
980!--    model has moved so far
981       IF ( galilei_transformation )  THEN
982          advected_distance_x = advected_distance_x + u_gtrans * dt_3d
983          advected_distance_y = advected_distance_y + v_gtrans * dt_3d
984       ENDIF
985
986!
987!--    Check, if restart is necessary (because cpu-time is expiring or
988!--    because it is forced by user) and set stop flag
[108]989!--    This call is skipped if the remote model has already initiated a restart.
990       IF ( .NOT. terminate_run )  CALL check_for_restart
[1]991
992!
993!--    Carry out statistical analysis and output at the requested output times.
994!--    The MOD function is used for calculating the output time counters (like
995!--    time_dopr) in order to regard a possible decrease of the output time
996!--    interval in case of restart runs
997
998!
999!--    Set a flag indicating that so far no statistics have been created
1000!--    for this time step
1001       flow_statistics_called = .FALSE.
1002
1003!
1004!--    If required, call flow_statistics for averaging in time
[1342]1005       IF ( averaging_interval_pr /= 0.0_wp  .AND.  &
[1]1006            ( dt_dopr - time_dopr ) <= averaging_interval_pr  .AND.  &
1007            simulated_time >= skip_time_dopr )  THEN
1008          time_dopr_av = time_dopr_av + dt_3d
1009          IF ( time_dopr_av >= dt_averaging_input_pr )  THEN
1010             do_sum = .TRUE.
1011             time_dopr_av = MOD( time_dopr_av, &
1012                                    MAX( dt_averaging_input_pr, dt_3d ) )
1013          ENDIF
1014       ENDIF
1015       IF ( do_sum )  CALL flow_statistics
1016
1017!
[410]1018!--    Sum-up 3d-arrays for later output of time-averaged 2d/3d/masked data
[1342]1019       IF ( averaging_interval /= 0.0_wp  .AND.                                &
[1]1020            ( dt_data_output_av - time_do_av ) <= averaging_interval  .AND. &
1021            simulated_time >= skip_time_data_output_av )                    &
1022       THEN
1023          time_do_sla = time_do_sla + dt_3d
1024          IF ( time_do_sla >= dt_averaging_input )  THEN
1025             CALL sum_up_3d_data
1026             average_count_3d = average_count_3d + 1
1027             time_do_sla = MOD( time_do_sla, MAX( dt_averaging_input, dt_3d ) )
1028          ENDIF
1029       ENDIF
1030
1031!
1032!--    Calculate spectra for time averaging
[1342]1033       IF ( averaging_interval_sp /= 0.0_wp  .AND.  &
[1]1034            ( dt_dosp - time_dosp ) <= averaging_interval_sp  .AND.  &
1035            simulated_time >= skip_time_dosp )  THEN
1036          time_dosp_av = time_dosp_av + dt_3d
1037          IF ( time_dosp_av >= dt_averaging_input_pr )  THEN
1038             CALL calc_spectra
1039             time_dosp_av = MOD( time_dosp_av, &
1040                                 MAX( dt_averaging_input_pr, dt_3d ) )
1041          ENDIF
1042       ENDIF
1043
1044!
[1957]1045!--    Call flight module and output data
1046       IF ( virtual_flight )  THEN
1047          CALL flight_measurement
1048          CALL data_output_flight
1049       ENDIF
1050
1051!
[1]1052!--    Profile output (ASCII) on file
1053       IF ( time_dopr_listing >= dt_dopr_listing )  THEN
1054          CALL print_1d
1055          time_dopr_listing = MOD( time_dopr_listing, MAX( dt_dopr_listing, &
1056                                                           dt_3d ) )
1057       ENDIF
1058
1059!
1060!--    Graphic output for PROFIL
1061       IF ( time_dopr >= dt_dopr )  THEN
1062          IF ( dopr_n /= 0 )  CALL data_output_profiles
1063          time_dopr = MOD( time_dopr, MAX( dt_dopr, dt_3d ) )
[1342]1064          time_dopr_av = 0.0_wp    ! due to averaging (see above)
[1]1065       ENDIF
1066
1067!
1068!--    Graphic output for time series
1069       IF ( time_dots >= dt_dots )  THEN
[48]1070          CALL data_output_tseries
[1]1071          time_dots = MOD( time_dots, MAX( dt_dots, dt_3d ) )
1072       ENDIF
1073
1074!
1075!--    Output of spectra (formatted for use with PROFIL), in case of no
1076!--    time averaging, spectra has to be calculated before
1077       IF ( time_dosp >= dt_dosp )  THEN
1078          IF ( average_count_sp == 0 )  CALL calc_spectra
1079          CALL data_output_spectra
1080          time_dosp = MOD( time_dosp, MAX( dt_dosp, dt_3d ) )
1081       ENDIF
1082
1083!
1084!--    2d-data output (cross-sections)
1085       IF ( time_do2d_xy >= dt_do2d_xy )  THEN
1086          CALL data_output_2d( 'xy', 0 )
1087          time_do2d_xy = MOD( time_do2d_xy, MAX( dt_do2d_xy, dt_3d ) )
1088       ENDIF
1089       IF ( time_do2d_xz >= dt_do2d_xz )  THEN
1090          CALL data_output_2d( 'xz', 0 )
1091          time_do2d_xz = MOD( time_do2d_xz, MAX( dt_do2d_xz, dt_3d ) )
1092       ENDIF
1093       IF ( time_do2d_yz >= dt_do2d_yz )  THEN
1094          CALL data_output_2d( 'yz', 0 )
1095          time_do2d_yz = MOD( time_do2d_yz, MAX( dt_do2d_yz, dt_3d ) )
1096       ENDIF
1097
1098!
1099!--    3d-data output (volume data)
1100       IF ( time_do3d >= dt_do3d )  THEN
1101          CALL data_output_3d( 0 )
1102          time_do3d = MOD( time_do3d, MAX( dt_do3d, dt_3d ) )
1103       ENDIF
1104
1105!
[1783]1106!--    Masked data output
[410]1107       DO  mid = 1, masks
1108          IF ( time_domask(mid) >= dt_domask(mid) )  THEN
1109             CALL data_output_mask( 0 )
1110             time_domask(mid) = MOD( time_domask(mid),  &
1111                                     MAX( dt_domask(mid), dt_3d ) )
1112          ENDIF
1113       ENDDO
1114
1115!
1116!--    Output of time-averaged 2d/3d/masked data
[1]1117       IF ( time_do_av >= dt_data_output_av )  THEN
1118          CALL average_3d_data
1119          CALL data_output_2d( 'xy', 1 )
1120          CALL data_output_2d( 'xz', 1 )
1121          CALL data_output_2d( 'yz', 1 )
1122          CALL data_output_3d( 1 )
[410]1123          DO  mid = 1, masks
1124             CALL data_output_mask( 1 )
1125          ENDDO
[1]1126          time_do_av = MOD( time_do_av, MAX( dt_data_output_av, dt_3d ) )
1127       ENDIF
1128
1129!
1130!--    Output of particle time series
[253]1131       IF ( particle_advection )  THEN
1132          IF ( time_dopts >= dt_dopts  .OR. &
1133               ( simulated_time >= particle_advection_start  .AND. &
[849]1134                 first_call_lpm ) )  THEN
[253]1135             CALL data_output_ptseries
1136             time_dopts = MOD( time_dopts, MAX( dt_dopts, dt_3d ) )
1137          ENDIF
[1]1138       ENDIF
1139
1140!
1141!--    Output of dvrp-graphics (isosurface, particles, slicer)
1142#if defined( __dvrp_graphics )
1143       CALL DVRP_LOG_EVENT( -2, current_timestep_number-1 )
1144#endif
1145       IF ( time_dvrp >= dt_dvrp )  THEN
1146          CALL data_output_dvrp
1147          time_dvrp = MOD( time_dvrp, MAX( dt_dvrp, dt_3d ) )
1148       ENDIF
1149#if defined( __dvrp_graphics )
1150       CALL DVRP_LOG_EVENT( 2, current_timestep_number )
1151#endif
1152
1153!
1154!--    If required, set the heat flux for the next time step at a random value
1155       IF ( constant_heatflux  .AND.  random_heatflux )  CALL disturb_heatflux
1156
1157!
1158!--    Execute user-defined actions
1159       CALL user_actions( 'after_timestep' )
1160
[1402]1161!
[1918]1162!--    Determine size of next time step. Save timestep dt_3d because it is
1163!--    newly calculated in routine timestep, but required further below for
1164!--    steering the run control output interval
1165       dt_3d_old = dt_3d
1166       CALL timestep
1167
1168!
[1925]1169!--    Synchronize the timestep in case of nested run.
1170       IF ( nested_run )  THEN
1171!
1172!--       Synchronize by unifying the time step.
1173!--       Global minimum of all time-steps is used for all.
1174          CALL pmci_synchronize
1175       ENDIF
1176
1177!
[1918]1178!--    Computation and output of run control parameters.
1179!--    This is also done whenever perturbations have been imposed
1180       IF ( time_run_control >= dt_run_control  .OR.                     &
1181            timestep_scheme(1:5) /= 'runge'  .OR.  disturbance_created ) &
1182       THEN
1183!          IF ( current_timestep_number == 1 )  THEN
1184!             IF ( nxl < 7 .AND.  nxr > 7 .AND. nys < 7 .AND. nyn > 7 )  THEN
1185!                u(10,7,7) = 0.55
1186!             ENDIF
1187!             PRINT*, 'calculating minmax'
1188!             CALL global_min_max( nzb, nzt+1, nysg, nyng, nxlg, nxrg, u,       &
1189!                                  'abs', 0.0_wp, u_max, u_max_ijk )
1190!             CALL global_min_max( nzb, nzt+1, nysg, nyng, nxlg, nxrg, v,       &
1191!                                  'abs', 0.0_wp, v_max, v_max_ijk )
1192!             CALL global_min_max( nzb, nzt+1, nysg, nyng, nxlg, nxrg, w,       &
1193!                                  'abs', 0.0_wp, w_max, w_max_ijk )
1194!             PRINT*, 'calculated u_max = ', u_max, '  myid = ', myid
1195!          ENDIF
1196          CALL run_control
1197          IF ( time_run_control >= dt_run_control )  THEN
1198             time_run_control = MOD( time_run_control, &
1199                                     MAX( dt_run_control, dt_3d_old ) )
1200          ENDIF
1201       ENDIF
1202
1203!
[1402]1204!--    Output elapsed simulated time in form of a progress bar on stdout
1205       IF ( myid == 0 )  CALL output_progress_bar
1206
[1]1207       CALL cpu_log( log_point_s(10), 'timesteps', 'stop' )
1208
[667]1209
[1]1210    ENDDO   ! time loop
1211
[1402]1212    IF ( myid == 0 )  CALL finish_progress_bar
1213
[1]1214#if defined( __dvrp_graphics )
1215    CALL DVRP_LOG_EVENT( -2, current_timestep_number )
1216#endif
1217
[1402]1218    CALL location_message( 'finished time-stepping', .TRUE. )
[1384]1219
[1]1220 END SUBROUTINE time_integration
Note: See TracBrowser for help on using the repository browser.