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

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

M Makefile

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