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

Last change on this file since 3685 was 3685, checked in by knoop, 5 years ago

Some interface calls moved to module_interface + cleanup

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