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

Last change on this file since 3650 was 3650, checked in by kanani, 2 years ago

Bugfix/additions to enable restarts with biometeorology (biometeorology_mod, module_interface)

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