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

Last change on this file since 2175 was 2175, checked in by maronga, 7 years ago

last commit documented

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