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

Last change on this file since 3648 was 3648, checked in by suehring, 5 years ago

Rename surface_output_mod into surface_data_output_mod, same with all corresponding subroutines

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