source: palm/trunk/SOURCE/module_interface.f90 @ 3684

Last change on this file since 3684 was 3684, checked in by knoop, 2 years ago

Enabled module_interface_actions in time_integration and prognostic_equations

  • Property svn:keywords set to Id
File size: 49.5 KB
Line 
1!> @file module_interface.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-2019 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: module_interface.f90 3684 2019-01-20 20:20:58Z knoop $
27! Bugfix: made unit intend INOUT
28!
29! 3650 2019-01-04 13:01:33Z kanani
30! Add restart routines for biometeorology
31!
32! 3649 2019-01-02 16:52:21Z suehring
33! Initialize strings, in order to avoid compiler warnings for non-initialized
34! characters with intent(out) attribute
35!
36! 3648 2019-01-02 16:35:46Z suehring
37! Rename subroutines for surface-data output
38!
39! 3641 2018-12-23 22:10:01Z knoop
40! Initial implementation of the PALM module interface
41!
42!
43! Description:
44! ------------
45!> This is the interface between the PALM model core and all its modules.
46!>
47!------------------------------------------------------------------------------!
48MODULE module_interface
49
50   USE indices,                                                                &
51       ONLY:  nbgp, nxl, nxlg, nxr, nxrg, nys, nysg, nyn, nyng, nzb, nzt
52
53   USE kinds
54
55!- load module-specific control parameters.
56!- ToDo: move all of them to respective module or a dedicated central module
57
58   USE control_parameters,                                                     &
59       ONLY:  biometeorology,                                                  &
60              air_chemistry,                                                   &
61              land_surface,                                                    &
62              large_scale_forcing,                                             &
63              nesting_offline,                                                 &
64              nudging,                                                         &
65              ocean_mode,                                                      &
66              plant_canopy,                                                    &
67              salsa,                                                           &
68              surface_output,                                                  &
69              syn_turb_gen,                                                    &
70              urban_surface,                                                   &
71              virtual_flight,                                                  &
72              wind_turbine
73
74!- load interface routines of all PALM modules
75
76   USE biometeorology_mod,                                                     &
77       ONLY:  bio_parin,                                                       &
78              bio_check_parameters,                                            &
79              bio_check_data_output,                                           &
80              bio_header,                                                      &
81              bio_3d_data_averaging,                                           &
82              bio_data_output_2d,                                              &
83              bio_data_output_3d,                                              &
84              bio_rrd_global,                                                  &
85              bio_rrd_local,                                                   &
86              bio_wrd_global,                                                  &
87              bio_wrd_local
88
89   USE bulk_cloud_model_mod,                                                   &
90       ONLY:  bulk_cloud_model,                                                &
91              bcm_parin,                                                       &
92              bcm_check_parameters,                                            &
93              bcm_check_data_output_pr,                                        &
94              bcm_check_data_output,                                           &
95              bcm_header,                                                      &
96              bcm_swap_timelevel,                                              &
97              bcm_3d_data_averaging,                                           &
98              bcm_data_output_2d,                                              &
99              bcm_data_output_3d,                                              &
100              bcm_rrd_global,                                                  &
101              bcm_wrd_global,                                                  &
102              bcm_rrd_local,                                                   &
103              bcm_wrd_local
104
105   USE chemistry_model_mod,                                                    &
106       ONLY:  chem_parin,                                                      &
107              chem_check_parameters,                                           &
108              chem_check_data_output_pr,                                       &
109              chem_check_data_output,                                          &
110              chem_header,                                                     &
111              chem_swap_timelevel,                                             &
112              chem_3d_data_averaging,                                          &
113              chem_data_output_2d,                                             &
114              chem_data_output_3d,                                             &
115              chem_statistics,                                                 &
116              chem_rrd_local,                                                  &
117              chem_wrd_local
118
119   USE flight_mod,                                                             &
120       ONLY:  flight_parin,                                                    &
121              flight_header,                                                   &
122              flight_rrd_global,                                               &
123              flight_wrd_global
124
125   USE gust_mod,                                                               &
126       ONLY:  gust_module_enabled,                                             &
127              gust_parin,                                                      &
128              gust_check_parameters,                                           &
129              gust_check_data_output_pr,                                       &
130              gust_check_data_output,                                          &
131              gust_header,                                                     &
132              gust_actions,                                                    &
133              gust_swap_timelevel,                                             &
134              gust_3d_data_averaging,                                          &
135              gust_data_output_2d,                                             &
136              gust_data_output_3d,                                             &
137              gust_statistics,                                                 &
138              gust_rrd_global,                                                 &
139              gust_wrd_global,                                                 &
140              gust_rrd_local,                                                  &
141              gust_wrd_local
142
143   USE indoor_model_mod,                                                       &
144       ONLY:  im_parin
145
146   USE land_surface_model_mod,                                                 &
147       ONLY:  lsm_parin,                                                       &
148              lsm_check_parameters,                                            &
149              lsm_check_data_output_pr,                                        &
150              lsm_check_data_output,                                           &
151              lsm_header,                                                      &
152              lsm_swap_timelevel,                                              &
153              lsm_3d_data_averaging,                                           &
154              lsm_data_output_2d,                                              &
155              lsm_rrd_local,                                                   &
156              lsm_wrd_local
157
158   USE lsf_nudging_mod,                                                        &
159       ONLY:  lsf_nudging_check_parameters,                                    &
160              lsf_nudging_check_data_output_pr,                                &
161              lsf_nudging_header
162
163   USE multi_agent_system_mod,                                                 &
164       ONLY:  mas_parin
165
166   USE nesting_offl_mod,                                                       &
167       ONLY:  nesting_offl_parin,                                              &
168              nesting_offl_check_parameters,                                   &
169              nesting_offl_header
170
171   USE ocean_mod,                                                              &
172       ONLY:  ocean_parin,                                                     &
173              ocean_check_parameters,                                          &
174              ocean_check_data_output_pr,                                      &
175              ocean_check_data_output,                                         &
176              ocean_header,                                                    &
177              ocean_swap_timelevel,                                            &
178              ocean_3d_data_averaging,                                         &
179              ocean_data_output_2d,                                            &
180              ocean_data_output_3d,                                            &
181              ocean_rrd_global,                                                &
182              ocean_wrd_global,                                                &
183              ocean_rrd_local,                                                 &
184              ocean_wrd_local
185
186   USE plant_canopy_model_mod,                                                 &
187        ONLY: pcm_parin,                                                       &
188              pcm_check_parameters,                                            &
189              pcm_check_data_output,                                           &
190              pcm_header,                                                      &
191              pcm_data_output_3d
192
193   USE radiation_model_mod,                                                    &
194       ONLY:  radiation,                                                       &
195              radiation_parin,                                                 &
196              radiation_check_parameters,                                      &
197              radiation_check_data_output_pr,                                  &
198              radiation_check_data_output,                                     &
199              radiation_header,                                                &
200              radiation_3d_data_averaging,                                     &
201              radiation_data_output_2d,                                        &
202              radiation_data_output_3d,                                        &
203              radiation_rrd_local,                                             &
204              radiation_wrd_local
205
206   USE salsa_mod,                                                              &
207       ONLY:  salsa_parin,                                                     &
208              salsa_check_parameters,                                          &
209              salsa_check_data_output,                                         &
210              salsa_header,                                                    &
211              salsa_swap_timelevel,                                            &
212              salsa_3d_data_averaging,                                         &
213              salsa_data_output_2d,                                            &
214              salsa_data_output_3d,                                            &
215              salsa_rrd_local,                                                 &
216              salsa_wrd_local
217
218   USE spectra_mod,                                                            &
219       ONLY:  calculate_spectra,                                               &
220              spectra_parin,                                                   &
221              spectra_check_parameters,                                        &
222              spectra_header
223
224   USE surface_data_output_mod,                                                &
225       ONLY:  surface_data_output_parin,                                       &
226              surface_data_output_check_parameters
227
228   USE synthetic_turbulence_generator_mod,                                     &
229       ONLY:  stg_parin,                                                       &
230              stg_check_parameters,                                            &
231              stg_header,                                                      &
232              stg_rrd_global,                                                  &
233              stg_wrd_global
234
235   USE urban_surface_mod,                                                      &
236       ONLY:  usm_parin,                                                       &
237              usm_check_parameters,                                            &
238              usm_check_data_output,                                           &
239              usm_swap_timelevel,                                              &
240              usm_3d_data_averaging,                                           &
241              usm_rrd_local,                                                   &
242              usm_wrd_local
243
244   USE user_actions_mod,                                                       &
245       ONLY:  user_actions
246
247   USE user_read_restart_data_mod,                                             &
248       ONLY:  user_rrd_global,                                                 &
249              user_rrd_local
250
251   USE user_write_restart_data_mod,                                            &
252       ONLY:  user_wrd_global,                                                 &
253              user_wrd_local
254
255   USE virtual_measurement_mod,                                                &
256       ONLY:  vm_parin
257
258   USE wind_turbine_model_mod,                                                 &
259       ONLY:  wtm_parin,                                                       &
260              wtm_check_parameters,                                            &
261              wtm_rrd_global,                                                  &
262              wtm_wrd_global
263
264   IMPLICIT NONE
265
266   PRIVATE
267
268!
269!- Public functions
270   PUBLIC                                                                      &
271      module_interface_parin,                                                  &
272      module_interface_check_parameters,                                       &
273      module_interface_check_data_output_pr,                                   &
274      module_interface_check_data_output,                                      &
275      module_interface_define_netcdf_grid,                                     &
276      module_interface_init_arrays,                                            &
277      module_interface_init,                                                   &
278      module_interface_header,                                                 &
279      module_interface_actions,                                                &
280      module_interface_swap_timelevel,                                         &
281      module_interface_3d_data_averaging,                                      &
282      module_interface_data_output_2d,                                         &
283      module_interface_data_output_3d,                                         &
284      module_interface_statistics,                                             &
285      module_interface_rrd_global,                                             &
286      module_interface_wrd_global,                                             &
287      module_interface_rrd_local,                                              &
288      module_interface_wrd_local
289
290
291   INTERFACE module_interface_parin
292      MODULE PROCEDURE module_interface_parin
293   END INTERFACE module_interface_parin
294
295   INTERFACE module_interface_check_parameters
296      MODULE PROCEDURE module_interface_check_parameters
297   END INTERFACE module_interface_check_parameters
298
299   INTERFACE module_interface_check_data_output_pr
300      MODULE PROCEDURE module_interface_check_data_output_pr
301   END INTERFACE module_interface_check_data_output_pr
302
303   INTERFACE module_interface_check_data_output
304      MODULE PROCEDURE module_interface_check_data_output
305   END INTERFACE module_interface_check_data_output
306
307   INTERFACE module_interface_define_netcdf_grid
308      MODULE PROCEDURE module_interface_define_netcdf_grid
309   END INTERFACE module_interface_define_netcdf_grid
310
311   INTERFACE module_interface_init_arrays
312      MODULE PROCEDURE module_interface_init_arrays
313   END INTERFACE module_interface_init_arrays
314
315   INTERFACE module_interface_init
316      MODULE PROCEDURE module_interface_init
317   END INTERFACE module_interface_init
318
319   INTERFACE module_interface_header
320      MODULE PROCEDURE module_interface_header
321   END INTERFACE module_interface_header
322
323   INTERFACE module_interface_actions
324      MODULE PROCEDURE module_interface_actions
325      MODULE PROCEDURE module_interface_actions_ij
326   END INTERFACE module_interface_actions
327
328   INTERFACE module_interface_swap_timelevel
329      MODULE PROCEDURE module_interface_swap_timelevel
330   END INTERFACE module_interface_swap_timelevel
331
332   INTERFACE module_interface_3d_data_averaging
333      MODULE PROCEDURE module_interface_3d_data_averaging
334   END INTERFACE module_interface_3d_data_averaging
335
336   INTERFACE module_interface_data_output_2d
337      MODULE PROCEDURE module_interface_data_output_2d
338   END INTERFACE module_interface_data_output_2d
339
340   INTERFACE module_interface_data_output_3d
341      MODULE PROCEDURE module_interface_data_output_3d
342   END INTERFACE module_interface_data_output_3d
343
344   INTERFACE module_interface_statistics
345      MODULE PROCEDURE module_interface_statistics
346   END INTERFACE module_interface_statistics
347
348   INTERFACE module_interface_rrd_global
349      MODULE PROCEDURE module_interface_rrd_global
350   END INTERFACE module_interface_rrd_global
351
352   INTERFACE module_interface_wrd_global
353      MODULE PROCEDURE module_interface_wrd_global
354   END INTERFACE module_interface_wrd_global
355
356   INTERFACE module_interface_rrd_local
357      MODULE PROCEDURE module_interface_rrd_local
358   END INTERFACE module_interface_rrd_local
359
360   INTERFACE module_interface_wrd_local
361      MODULE PROCEDURE module_interface_wrd_local
362   END INTERFACE module_interface_wrd_local
363
364
365CONTAINS
366
367
368!------------------------------------------------------------------------------!
369! Description:
370! ------------
371!> Read module-specific parameter namelists
372!------------------------------------------------------------------------------!
373SUBROUTINE module_interface_parin
374
375
376   CALL bio_parin
377   CALL bcm_parin
378   CALL chem_parin
379   CALL flight_parin ! ToDo: rename module to match filename
380   CALL gust_parin
381   CALL im_parin
382   CALL lsm_parin
383   ! ToDo: create parin routine for large_scale_forcing and nudging (should be seperate modules or new module switch)
384   CALL mas_parin
385   CALL nesting_offl_parin
386   CALL ocean_parin
387   CALL pcm_parin
388   CALL radiation_parin
389   CALL salsa_parin
390   CALL spectra_parin
391   CALL surface_data_output_parin
392   CALL stg_parin
393   CALL user_parin ! ToDo: make user code a single Fortran module
394   CALL usm_parin
395   CALL vm_parin
396   CALL wtm_parin
397
398   CALL package_parin ! ToDo: deprecated, needs to be dissolved
399
400
401END SUBROUTINE module_interface_parin
402
403
404!------------------------------------------------------------------------------!
405! Description:
406! ------------
407!> Perform module-specific initialization checks
408!------------------------------------------------------------------------------!
409SUBROUTINE module_interface_check_parameters
410
411
412   IF ( biometeorology )       CALL bio_check_parameters
413   IF ( bulk_cloud_model )     CALL bcm_check_parameters
414   IF ( air_chemistry )        CALL chem_check_parameters
415   IF ( gust_module_enabled )  CALL gust_check_parameters
416   IF ( land_surface )         CALL lsm_check_parameters
417   IF ( large_scale_forcing  .OR.  nudging )  CALL lsf_nudging_check_parameters ! ToDo: create single module switch
418   IF ( nesting_offline )      CALL nesting_offl_check_parameters
419   IF ( ocean_mode )           CALL ocean_check_parameters
420   IF ( plant_canopy )         CALL pcm_check_parameters
421   IF ( radiation )            CALL radiation_check_parameters
422   IF ( salsa )                CALL salsa_check_parameters
423   IF ( calculate_spectra )    CALL spectra_check_parameters
424   IF ( surface_output )       CALL surface_data_output_check_parameters
425   IF ( syn_turb_gen )         CALL stg_check_parameters
426   IF ( urban_surface )        CALL usm_check_parameters
427   IF ( wind_turbine )         CALL wtm_check_parameters
428                               CALL user_check_parameters
429
430
431END SUBROUTINE module_interface_check_parameters
432
433
434!------------------------------------------------------------------------------!
435! Description:
436! ------------
437!> Check module-specific data output of profiles
438!------------------------------------------------------------------------------!
439SUBROUTINE module_interface_check_data_output_pr( variable, var_count, unit,   &
440                                                dopr_unit )
441
442
443   CHARACTER (LEN=*), INTENT(IN)    ::  variable  !< variable name
444   INTEGER(iwp),      INTENT(IN)    ::  var_count !< variable output array index
445   CHARACTER (LEN=*), INTENT(INOUT) ::  unit      !< physical unit of variable
446   CHARACTER (LEN=*), INTENT(OUT)   ::  dopr_unit !< local value of dopr_unit
447
448   IF ( unit == 'illegal' .AND.  bulk_cloud_model )  THEN
449      CALL bcm_check_data_output_pr( variable, var_count, unit, dopr_unit )
450   ENDIF
451
452   IF ( unit == 'illegal' .AND.  air_chemistry )  THEN
453      CALL chem_check_data_output_pr( variable, var_count, unit, dopr_unit )
454   ENDIF
455
456   IF ( unit == 'illegal'  .AND.  gust_module_enabled  )  THEN
457      CALL gust_check_data_output_pr( variable, var_count, unit, dopr_unit )
458   ENDIF
459
460   IF ( unit == 'illegal' )  THEN ! ToDo: add module switch if possible
461      CALL lsm_check_data_output_pr( variable, var_count, unit, dopr_unit )
462   ENDIF
463
464   IF ( unit == 'illegal' )  THEN ! ToDo: add module switch if possible
465      CALL lsf_nudging_check_data_output_pr( variable, var_count, unit, dopr_unit )
466   ENDIF
467
468   IF ( unit == 'illegal'  .AND.  ocean_mode )  THEN
469      CALL ocean_check_data_output_pr( variable, var_count, unit, dopr_unit )
470   ENDIF
471
472   IF ( unit == 'illegal' )  THEN
473      CALL radiation_check_data_output_pr( variable, var_count, unit, dopr_unit )
474   ENDIF
475
476   IF ( unit == 'illegal' )  THEN
477      unit = '' ! ToDo: Seems like a hack. Find a general soultion!
478      CALL user_check_data_output_pr( variable, var_count, unit )
479   ENDIF
480
481
482
483END SUBROUTINE module_interface_check_data_output_pr
484
485!------------------------------------------------------------------------------!
486! Description:
487! ------------
488!> Check module-specific 2D and 3D data output
489!------------------------------------------------------------------------------!
490SUBROUTINE module_interface_check_data_output( variable, unit, i, ilen, k )
491
492
493   CHARACTER (LEN=*), INTENT(IN)    ::  variable !< variable name
494   CHARACTER (LEN=*), INTENT(INOUT) ::  unit     !< physical unit of variable
495
496   INTEGER(iwp),      INTENT(IN)    :: i         !< ToDo: remove dummy argument, instead pass string from data_output
497   INTEGER(iwp),      INTENT(IN)    :: ilen      !< ToDo: remove dummy argument, instead pass string from data_output
498   INTEGER(iwp),      INTENT(IN)    :: k         !< ToDo: remove dummy argument, instead pass string from data_output
499
500   IF ( unit == 'illegal'  .AND.  biometeorology )  THEN
501      CALL bio_check_data_output( variable, unit, i, ilen, k )
502   ENDIF
503
504   IF ( unit == 'illegal'  .AND.  bulk_cloud_model  )  THEN
505      CALL bcm_check_data_output( variable, unit )
506   ENDIF
507
508   IF ( unit == 'illegal'  .AND.  air_chemistry                                &
509        .AND.  (variable(1:3) == 'kc_' .OR. variable(1:3) == 'em_') )  THEN  ! ToDo: remove aditional conditions
510      CALL chem_check_data_output( variable, unit, i, ilen, k )
511   ENDIF
512
513   IF ( unit == 'illegal'  .AND.  gust_module_enabled  )  THEN
514      CALL gust_check_data_output( variable, unit )
515   ENDIF
516
517   IF ( unit == 'illegal' )  THEN  ! ToDo: add module switch if possible
518      CALL lsm_check_data_output( variable, unit, i, ilen, k )
519   ENDIF
520
521   IF ( unit == 'illegal'  .AND.  ocean_mode )  THEN
522      CALL ocean_check_data_output( variable, unit )
523   ENDIF
524
525   IF ( unit == 'illegal'  .AND.  plant_canopy                                 &
526        .AND.  variable(1:4) == 'pcm_' )  THEN  ! ToDo: remove aditional conditions
527      CALL pcm_check_data_output( variable, unit )
528   ENDIF
529
530   IF ( unit == 'illegal' )  THEN
531      CALL radiation_check_data_output( variable, unit, i, ilen, k )
532   ENDIF
533
534   IF ( unit == 'illegal' .AND. salsa ) THEN
535       CALL salsa_check_data_output( variable, unit )
536   ENDIF
537
538   IF ( unit == 'illegal'  .AND.  urban_surface                      &
539        .AND.  variable(1:4) == 'usm_' )  THEN  ! ToDo: remove aditional conditions
540       CALL usm_check_data_output( variable, unit )
541   ENDIF
542
543   IF ( unit == 'illegal' )  THEN
544      unit = ''
545      CALL user_check_data_output( variable, unit )
546   ENDIF
547
548
549END SUBROUTINE module_interface_check_data_output
550
551
552!------------------------------------------------------------------------------!
553!
554! Description:
555! ------------
556!> Define appropriate grid for module-specific netcdf output variables.
557!------------------------------------------------------------------------------!
558SUBROUTINE module_interface_define_netcdf_grid( var, found,                    &
559                                                grid_x, grid_y, grid_z )
560
561
562   CHARACTER (LEN=*), INTENT(IN)  ::  var    !< variable name
563   LOGICAL,           INTENT(OUT) ::  found  !< indicates if variable was found
564   CHARACTER (LEN=*), INTENT(OUT) ::  grid_x !< netcdf dimension in x-direction
565   CHARACTER (LEN=*), INTENT(OUT) ::  grid_y !< netcdf dimension in y-direction
566   CHARACTER (LEN=*), INTENT(OUT) ::  grid_z !< netcdf dimension in z-direction
567!
568!--As long as no action is done in this subroutine, initialize strings with   
569!--intent(out) attribute, in order to avoid compiler warnings.
570   found  = .FALSE.
571   grid_x = 'none'
572   grid_y = 'none'
573   grid_z = 'none'
574
575END SUBROUTINE module_interface_define_netcdf_grid
576
577
578!------------------------------------------------------------------------------!
579! Description:
580! ------------
581!> Allocate module-specific arrays and pointers
582!------------------------------------------------------------------------------!
583SUBROUTINE module_interface_init_arrays
584
585
586END SUBROUTINE module_interface_init_arrays
587
588
589!------------------------------------------------------------------------------!
590! Description:
591! ------------
592!> Perform module-specific initialization
593!------------------------------------------------------------------------------!
594SUBROUTINE module_interface_init
595
596
597END SUBROUTINE module_interface_init
598
599
600!------------------------------------------------------------------------------!
601! Description:
602! ------------
603!> Gather module-specific header output
604!------------------------------------------------------------------------------!
605SUBROUTINE module_interface_header( io )
606
607
608   INTEGER(iwp), INTENT(IN) ::  io  !< unit of the output file
609
610
611   IF ( biometeorology      )  CALL bio_header ( io )
612   IF ( bulk_cloud_model    )  CALL bcm_header( io )
613   IF ( air_chemistry       )  CALL chem_header ( io )
614   IF ( virtual_flight      )  CALL flight_header( io )
615   IF ( gust_module_enabled )  CALL gust_header( io )
616   IF ( land_surface        )  CALL lsm_header( io )
617   IF ( large_scale_forcing )  CALL lsf_nudging_header( io )
618   IF ( nesting_offline     )  CALL nesting_offl_header( io )
619   IF ( ocean_mode          )  CALL ocean_header( io )
620   IF ( plant_canopy        )  CALL pcm_header( io )
621   IF ( radiation           )  CALL radiation_header( io )
622   IF ( salsa               )  CALL salsa_header( io )
623   IF ( calculate_spectra   )  CALL spectra_header( io )
624   IF ( syn_turb_gen        )  CALL stg_header( io )
625
626   CALL user_header( io ) ! ToDo: make user module switch
627
628
629END SUBROUTINE module_interface_header
630
631
632!------------------------------------------------------------------------------!
633! Description:
634! ------------
635!> Perform module-specific actions while in time-integration (cache-optimized)
636!------------------------------------------------------------------------------!
637SUBROUTINE module_interface_actions( location )
638
639
640   CHARACTER (LEN=*), INTENT(IN) ::  location !< call location string
641
642
643   IF ( gust_module_enabled )  CALL gust_actions( location )
644
645   CALL user_actions( location ) ! ToDo: make user module switch
646
647
648END SUBROUTINE module_interface_actions
649
650
651!------------------------------------------------------------------------------!
652! Description:
653! ------------
654!> Perform module-specific actions while in time-integration (vector-optimized)
655!------------------------------------------------------------------------------!
656SUBROUTINE module_interface_actions_ij( i, j, location )
657
658
659   INTEGER(iwp),      INTENT(IN) ::  i         !< grid index in x-direction
660   INTEGER(iwp),      INTENT(IN) ::  j         !< grid index in y-direction
661   CHARACTER (LEN=*), INTENT(IN) ::  location  !< call location string
662
663
664   IF ( gust_module_enabled )  CALL gust_actions( i, j, location )
665
666   CALL user_actions( i, j, location ) ! ToDo: make user module switch
667
668
669END SUBROUTINE module_interface_actions_ij
670
671
672!------------------------------------------------------------------------------!
673! Description:
674! ------------
675!> Swap the timelevel pointers for module-specific arrays
676!------------------------------------------------------------------------------!
677SUBROUTINE module_interface_swap_timelevel ( swap_mode )
678
679
680   INTEGER(iwp), INTENT(IN) :: swap_mode !< determines procedure of pointer swap
681
682   IF ( bulk_cloud_model    )  CALL bcm_swap_timelevel( swap_mode )
683   IF ( air_chemistry       )  CALL chem_swap_timelevel( swap_mode )
684   IF ( gust_module_enabled )  CALL gust_swap_timelevel( swap_mode )
685   IF ( land_surface        )  CALL lsm_swap_timelevel( swap_mode )
686   IF ( ocean_mode          )  CALL ocean_swap_timelevel( swap_mode )
687   IF ( salsa               )  CALL salsa_swap_timelevel( swap_mode )
688   IF ( urban_surface       )  CALL usm_swap_timelevel( swap_mode )
689
690
691END SUBROUTINE module_interface_swap_timelevel
692
693
694!------------------------------------------------------------------------------!
695!
696! Description:
697! ------------
698!> Perform module-specific averaging of 3D data
699!------------------------------------------------------------------------------!
700SUBROUTINE module_interface_3d_data_averaging( mode, variable )
701
702
703   CHARACTER (LEN=*), INTENT(IN) ::  mode     !< averaging interface mode
704   CHARACTER (LEN=*), INTENT(IN) ::  variable !< variable name
705
706   IF ( biometeorology      )  CALL bio_3d_data_averaging( mode, variable )
707   IF ( bulk_cloud_model    )  CALL bcm_3d_data_averaging( mode, variable )
708   IF ( air_chemistry       )  CALL chem_3d_data_averaging( mode, variable )
709   IF ( gust_module_enabled )  CALL gust_3d_data_averaging( mode, variable )
710   IF ( land_surface        )  CALL lsm_3d_data_averaging( mode, variable )
711   IF ( ocean_mode          )  CALL ocean_3d_data_averaging( mode, variable )
712   IF ( radiation           )  CALL radiation_3d_data_averaging( mode, variable )
713   IF ( salsa               )  CALL salsa_3d_data_averaging( mode, variable )
714   IF ( urban_surface       )  CALL usm_3d_data_averaging( mode, variable )
715
716   CALL user_3d_data_averaging( mode, variable ) ! ToDo: make user module switch
717
718
719END SUBROUTINE module_interface_3d_data_averaging
720
721!------------------------------------------------------------------------------!
722!
723! Description:
724! ------------
725!> Define module-specific 2D output variables
726!------------------------------------------------------------------------------!
727SUBROUTINE module_interface_data_output_2d( av, variable, found, grid, mode,   &
728                                            local_pf, two_d, nzb_do, nzt_do,   &
729                                            fill_value )
730
731   INTEGER(iwp),      INTENT(IN)    ::  av         !< flag for (non-)average output
732   CHARACTER (LEN=*), INTENT(IN)    ::  variable   !< variable name
733   LOGICAL,           INTENT(INOUT) ::  found      !< flag if output variable is found
734   CHARACTER (LEN=*), INTENT(INOUT) ::  grid       !< name of vertical grid
735   CHARACTER (LEN=*), INTENT(IN)    ::  mode       !< either 'xy', 'xz' or 'yz'
736   LOGICAL,           INTENT(OUT)   ::  two_d      !< flag for 2D variables
737   INTEGER(iwp),      INTENT(IN)    ::  nzb_do     !< vertical output index (bottom) (usually 0)
738   INTEGER(iwp),      INTENT(IN)    ::  nzt_do     !< vertical output index (top) (usually nz_do3d)
739   REAL(wp),          INTENT(IN)    ::  fill_value !< to be removed
740
741   REAL(wp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do), INTENT(OUT) ::  local_pf !< ToDo: can also be kind=sp
742
743
744   IF ( .NOT. found  .AND.  biometeorology )  THEN
745      CALL bio_data_output_2d(                                                 &
746              av, variable, found, grid, local_pf, two_d, nzb_do, nzt_do       &
747           )
748   ENDIF
749
750   IF ( .NOT. found  .AND.  bulk_cloud_model )  THEN
751      CALL bcm_data_output_2d(                                                 &
752              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do &
753           )
754   ENDIF
755
756   IF ( .NOT. found  .AND.  air_chemistry )  THEN
757      CALL chem_data_output_2d(                                                &
758              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do, fill_value &
759           )
760   ENDIF
761
762   IF ( .NOT. found  .AND.  gust_module_enabled )  THEN
763      CALL gust_data_output_2d(                                                &
764              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do, fill_value &
765           )
766   ENDIF
767
768   IF ( .NOT. found  .AND.  land_surface )  THEN
769      CALL lsm_data_output_2d(                                                 &
770              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do &
771           )
772   ENDIF
773
774   IF ( .NOT. found  .AND.  ocean_mode )  THEN
775      CALL ocean_data_output_2d(                                               &
776              av, variable, found, grid, mode, local_pf, nzb_do, nzt_do        &
777           )
778   ENDIF
779
780   IF ( .NOT. found  .AND.  radiation )  THEN
781      CALL radiation_data_output_2d(                                           &
782              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do &
783           )
784   ENDIF
785
786   IF ( .NOT. found  .AND.  salsa )  THEN
787      CALL salsa_data_output_2d(                                               &
788              av, variable, found, grid, mode, local_pf, two_d, nzb_do, nzt_do &
789           )
790   ENDIF
791
792   IF ( .NOT. found )  THEN  ! ToDo: make user module switch
793      CALL user_data_output_2d(                                                &
794              av, variable, found, grid, local_pf, two_d, nzb_do, nzt_do       &
795           )
796   ENDIF
797
798END SUBROUTINE module_interface_data_output_2d
799
800
801!------------------------------------------------------------------------------!
802!
803! Description:
804! ------------
805!> Define module-specific 3D output variables
806!------------------------------------------------------------------------------!
807SUBROUTINE module_interface_data_output_3d( av, variable, found, local_pf,     &
808                                            fill_value, resorted, nzb_do, nzt_do )
809
810
811   INTEGER(iwp),      INTENT(IN)    ::  av         !< flag for (non-)average output
812   CHARACTER (LEN=*), INTENT(IN)    ::  variable   !< variable name
813   LOGICAL,           INTENT(INOUT) ::  found      !< flag if output variable is found
814   REAL(wp),          INTENT(IN)    ::  fill_value !< ToDo: refactor
815   LOGICAL,           INTENT(OUT)   ::  resorted   !< flag if output has been resorted
816   INTEGER(iwp),      INTENT(IN)    ::  nzb_do     !< vertical output index (bottom) (usually 0)
817   INTEGER(iwp),      INTENT(IN)    ::  nzt_do     !< vertical output index (top) (usually nz_do3d)
818
819   REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do), INTENT(OUT) ::  local_pf
820
821
822   IF ( .NOT. found  .AND.  biometeorology )  THEN
823      CALL bio_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
824      resorted = .FALSE.
825   ENDIF
826
827   IF ( .NOT. found  .AND.  bulk_cloud_model )  THEN
828      CALL bcm_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
829      resorted = .TRUE.
830   ENDIF
831
832   IF ( .NOT. found  .AND.  air_chemistry )  THEN
833      CALL chem_data_output_3d( av, variable, found, local_pf, fill_value, nzb_do, nzt_do )
834      resorted = .TRUE.
835   ENDIF
836
837   IF ( .NOT. found  .AND.  gust_module_enabled )  THEN
838      CALL gust_data_output_3d( av, variable, found, local_pf, fill_value, nzb_do, nzt_do )
839      resorted = .TRUE.
840   ENDIF
841
842   IF ( .NOT. found  .AND.  ocean_mode )  THEN
843      CALL ocean_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
844      resorted = .TRUE.
845   ENDIF
846
847   IF ( .NOT. found  .AND.  plant_canopy )  THEN
848      CALL pcm_data_output_3d( av, variable, found, local_pf, fill_value, nzb_do, nzt_do )
849      resorted = .TRUE.
850   ENDIF
851
852   IF ( .NOT. found  .AND.  radiation )  THEN
853      CALL radiation_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
854      resorted = .TRUE.
855   ENDIF
856
857   IF ( .NOT. found  .AND.  salsa )  THEN
858      CALL salsa_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
859      resorted = .TRUE.
860   ENDIF
861
862   IF ( .NOT. found )  THEN  ! ToDo: make user module switch
863      CALL user_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
864      resorted = .TRUE.
865   ENDIF
866
867
868END SUBROUTINE module_interface_data_output_3d
869
870
871!------------------------------------------------------------------------------!
872! Description:
873! ------------
874!> Compute module-specific profile and timeseries data
875!------------------------------------------------------------------------------!
876SUBROUTINE module_interface_statistics( mode, sr, tn, dots_max )
877
878
879   CHARACTER (LEN=*), INTENT(IN) ::  mode     !< statistical analysis mode
880   INTEGER(iwp),      INTENT(IN) ::  sr       !<
881   INTEGER(iwp),      INTENT(IN) ::  tn       !<
882   INTEGER(iwp),      INTENT(IN) ::  dots_max !< maximum number of timeseries
883
884   IF ( gust_module_enabled )  CALL gust_statistics( mode, sr, tn, dots_max )
885   IF ( air_chemistry       )  CALL chem_statistics( mode, sr, tn )
886
887   CALL user_statistics( mode, sr, tn ) ! ToDo: make user module switch
888
889
890END SUBROUTINE module_interface_statistics
891
892
893!------------------------------------------------------------------------------!
894! Description:
895! ------------
896!> Read module-specific restart data globaly shared by all MPI ranks
897!------------------------------------------------------------------------------!
898SUBROUTINE module_interface_rrd_global( variable, found )
899
900
901   CHARACTER (LEN=*), INTENT(IN)  ::  variable !< name of global variable
902   LOGICAL,           INTENT(OUT) ::  found    !< flag if variable was found
903
904   IF ( .NOT. found )  CALL bio_rrd_global( found ) ! ToDo: change interface to pass variable
905   IF ( .NOT. found )  CALL bcm_rrd_global( found ) ! ToDo: change interface to pass variable
906   IF ( .NOT. found )  CALL flight_rrd_global( found ) ! ToDo: change interface to pass variable
907   IF ( .NOT. found )  CALL gust_rrd_global( found ) ! ToDo: change interface to pass variable
908   IF ( .NOT. found )  CALL ocean_rrd_global( found ) ! ToDo: change interface to pass variable
909   IF ( .NOT. found )  CALL stg_rrd_global ( found ) ! ToDo: change interface to pass variable
910   IF ( .NOT. found )  CALL wtm_rrd_global( found ) ! ToDo: change interface to pass variable
911
912   IF ( .NOT. found )  CALL user_rrd_global( found ) ! ToDo: change interface to pass variable
913
914
915END SUBROUTINE module_interface_rrd_global
916
917
918!------------------------------------------------------------------------------!
919! Description:
920! ------------
921!> Write module-specific restart data globaly shared by all MPI ranks
922!------------------------------------------------------------------------------!
923SUBROUTINE module_interface_wrd_global
924
925
926   IF ( biometeorology )       CALL bio_wrd_global
927   IF ( bulk_cloud_model )     CALL bcm_wrd_global
928   IF ( virtual_flight )       CALL flight_wrd_global
929   IF ( gust_module_enabled )  CALL gust_wrd_global
930   IF ( ocean_mode )           CALL ocean_wrd_global
931   IF ( syn_turb_gen )         CALL stg_wrd_global
932   IF ( wind_turbine )         CALL wtm_wrd_global
933
934   CALL user_wrd_global ! ToDo: make user module switch
935
936
937END SUBROUTINE module_interface_wrd_global
938
939
940!------------------------------------------------------------------------------!
941! Description:
942! ------------
943!> Read module-specific restart data specific to local MPI ranks
944!------------------------------------------------------------------------------!
945SUBROUTINE module_interface_rrd_local( variable, file_index, map_index,        &
946                                       nxlf, nxlc, nxl_on_file,                &
947                                       nxrf, nxrc, nxr_on_file,                &
948                                       nynf, nync, nyn_on_file,                &
949                                       nysf, nysc, nys_on_file,                &
950                                       tmp_2d, tmp_3d, found )
951
952
953   CHARACTER (LEN=*), INTENT(IN)  ::  variable     !< name of global variable
954   INTEGER(iwp),      INTENT(IN)  ::  file_index   !<
955   INTEGER(iwp),      INTENT(IN)  ::  map_index    !<
956   INTEGER(iwp),      INTENT(IN)  ::  nxlc         !<
957   INTEGER(iwp),      INTENT(IN)  ::  nxlf         !<
958   INTEGER(iwp),      INTENT(IN)  ::  nxl_on_file  !<
959   INTEGER(iwp),      INTENT(IN)  ::  nxrc         !<
960   INTEGER(iwp),      INTENT(IN)  ::  nxrf         !<
961   INTEGER(iwp),      INTENT(IN)  ::  nxr_on_file  !<
962   INTEGER(iwp),      INTENT(IN)  ::  nync         !<
963   INTEGER(iwp),      INTENT(IN)  ::  nynf         !<
964   INTEGER(iwp),      INTENT(IN)  ::  nyn_on_file  !<
965   INTEGER(iwp),      INTENT(IN)  ::  nysc         !<
966   INTEGER(iwp),      INTENT(IN)  ::  nysf         !<
967   INTEGER(iwp),      INTENT(IN)  ::  nys_on_file  !<
968   LOGICAL,           INTENT(OUT) ::  found        !< flag if variable was found
969
970   REAL(wp), DIMENSION(nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp), INTENT(OUT) :: tmp_2d   !<
971   REAL(wp), DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp), INTENT(OUT) :: tmp_3d   !<
972
973
974   IF ( .NOT. found ) CALL bio_rrd_local(                                      &
975                              found                                            &
976                           )
977
978   IF ( .NOT. found ) CALL bcm_rrd_local(                                      &
979                              file_index, map_index,                           &
980                              nxlf, nxlc, nxl_on_file,                         &
981                              nxrf, nxrc, nxr_on_file,                         &
982                              nynf, nync, nyn_on_file,                         &
983                              nysf, nysc, nys_on_file,                         &
984                              tmp_2d, tmp_3d, found                            &
985                           ) ! ToDo: change interface to pass variable
986
987   IF ( .NOT. found ) CALL chem_rrd_local(                                     &
988                              file_index, map_index,                           &
989                              nxlf, nxlc, nxl_on_file,                         &
990                              nxrf, nxrc, nxr_on_file,                         &
991                              nynf, nync, nyn_on_file,                         &
992                              nysf, nysc, nys_on_file,                         &
993                              tmp_3d, found                                    &
994                           ) ! ToDo: change interface to pass variable
995
996   IF ( .NOT. found ) CALL gust_rrd_local(                                     &
997                              file_index, map_index,                           &
998                              nxlf, nxlc, nxl_on_file,                         &
999                              nxrf, nxrc, nxr_on_file,                         &
1000                              nynf, nync, nyn_on_file,                         &
1001                              nysf, nysc, nys_on_file,                         &
1002                              tmp_2d, tmp_3d, found                            &
1003                           ) ! ToDo: change interface to pass variable
1004
1005   IF ( .NOT. found ) CALL lsm_rrd_local(                                      &
1006                              file_index, map_index,                           &
1007                              nxlf, nxlc, nxl_on_file,                         &
1008                              nxrf, nxrc, nxr_on_file,                         &
1009                              nynf, nync, nyn_on_file,                         &
1010                              nysf, nysc, nys_on_file,                         &
1011                              tmp_2d, found                                    &
1012                           ) ! ToDo: change interface to pass variable
1013
1014   IF ( .NOT. found ) CALL ocean_rrd_local(                                    &
1015                              file_index, map_index,                           &
1016                              nxlf, nxlc, nxl_on_file,                         &
1017                              nxrf, nxrc, nxr_on_file,                         &
1018                              nynf, nync, nyn_on_file,                         &
1019                              nysf, nysc, nys_on_file,                         &
1020                              tmp_2d, tmp_3d, found                            &
1021                           ) ! ToDo: change interface to pass variable
1022
1023   IF ( .NOT. found ) CALL radiation_rrd_local(                                &
1024                              file_index, map_index,                           &
1025                              nxlf, nxlc, nxl_on_file,                         &
1026                              nxrf, nxrc, nxr_on_file,                         &
1027                              nynf, nync, nyn_on_file,                         &
1028                              nysf, nysc, nys_on_file,                         &
1029                              tmp_2d, tmp_3d, found                            &
1030                           ) ! ToDo: change interface to pass variable
1031
1032   IF ( .NOT. found ) CALL salsa_rrd_local(                                    &
1033                              file_index, map_index,                           &
1034                              nxlf, nxlc, nxl_on_file,                         &
1035                              nxrf, nxrc, nxr_on_file,                         &
1036                              nynf, nync, nyn_on_file,                         &
1037                              nysf, nysc, nys_on_file,                         &
1038                              tmp_3d, found                                    &
1039                           ) ! ToDo: change interface to pass variable
1040
1041   IF ( .NOT. found ) CALL usm_rrd_local(                                      &
1042                              file_index, map_index,                           &
1043                              nxlf, nxlc, nxl_on_file,                         &
1044                              nxrf, nxrc, nxr_on_file,                         &
1045                              nynf, nync, nyn_on_file,                         &
1046                              nysf, nysc, nys_on_file,                         &
1047                              found                                            &
1048                           ) ! ToDo: change interface to pass variable
1049
1050   IF ( .NOT. found ) CALL user_rrd_local(                                     &
1051                              file_index, map_index,                           &
1052                              nxlf, nxlc, nxl_on_file,                         &
1053                              nxrf, nxrc, nxr_on_file,                         &
1054                              nynf, nync, nyn_on_file,                         &
1055                              nysf, nysc, nys_on_file,                         &
1056                              tmp_3d, found                                    &
1057                           ) ! ToDo: change interface to pass variable
1058
1059
1060END SUBROUTINE module_interface_rrd_local
1061
1062
1063!------------------------------------------------------------------------------!
1064! Description:
1065! ------------
1066!> Write module-specific restart data specific to local MPI ranks
1067!------------------------------------------------------------------------------!
1068SUBROUTINE module_interface_wrd_local
1069
1070
1071   IF ( biometeorology )       CALL bio_wrd_local
1072   IF ( bulk_cloud_model )     CALL bcm_wrd_local
1073   IF ( air_chemistry )        CALL chem_wrd_local
1074   IF ( gust_module_enabled )  CALL gust_wrd_local
1075   IF ( land_surface )         CALL lsm_wrd_local
1076   IF ( ocean_mode )           CALL ocean_wrd_local
1077   IF ( radiation )            CALL radiation_wrd_local
1078   IF ( salsa )                CALL salsa_wrd_local
1079   IF ( urban_surface )        CALL usm_wrd_local
1080
1081   CALL user_wrd_local ! ToDo: make user module switch
1082
1083
1084END SUBROUTINE module_interface_wrd_local
1085
1086
1087END MODULE module_interface
Note: See TracBrowser for help on using the repository browser.