Ignore:
Timestamp:
Apr 7, 2016 2:23:03 PM (8 years ago)
Author:
raasch
Message:

spectrum renamed spactra_par and further modularized, POINTER-attributes added in coupler-routines to avoid gfortran error messages

File:
1 moved

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/spectra_mod.f90

    r1832 r1833  
    1 !> @file spectrum.f90
     1!> @file spectra_mod.f90
    22!--------------------------------------------------------------------------------!
    33! This file is part of PALM.
     
    1919! Current revisions:
    2020! -----------------
    21 !
     21! file renamed, reading the spectra_par NAMELIST moved from package_parin to
     22! here
    2223!
    2324! Former revisions:
     
    9192!>            transpose_zyd needs modification).
    9293!------------------------------------------------------------------------------!
    93  MODULE spectrum
     94 MODULE spectra_mod
    9495
    9596    USE kinds
     
    9798    PRIVATE
    9899
    99     CHARACTER (LEN=6),  DIMENSION(1:5) ::  header_char = (/ 'PS(u) ', 'PS(v) ',&
    100                                            'PS(w) ', 'PS(pt)', 'PS(q) ' /)
    101     CHARACTER (LEN=2),  DIMENSION(10)  ::  spectra_direction = 'x'
    102     CHARACTER (LEN=10), DIMENSION(10)  ::  data_output_sp  = ' '
    103     CHARACTER (LEN=25), DIMENSION(1:5) ::  utext_char =                    &
    104                                            (/ '-power spectrum of u     ', &
    105                                               '-power spectrum of v     ', &
    106                                               '-power spectrum of w     ', &
    107                                               '-power spectrum of ^1185 ', &
    108                                               '-power spectrum of q     ' /)
    109     CHARACTER (LEN=39), DIMENSION(1:5) ::  ytext_char =                        &
    110                                  (/ 'k ^2236 ^2566^2569<u(k) in m>2s>->2    ', &
    111                                     'k ^2236 ^2566^2569<v(k) in m>2s>->2    ', &
    112                                     'k ^2236 ^2566^2569<w(k) in m>2s>->2    ', &
    113                                     'k ^2236 ^2566^2569<^1185(k) in m>2s>->2', &
    114                                     'k ^2236 ^2566^2569<q(k) in m>2s>->2    ' /)
    115 
    116     INTEGER(iwp) ::  klist_x = 0, klist_y = 0, n_sp_x = 0, n_sp_y = 0
    117 
    118     INTEGER(iwp) ::  comp_spectra_level(100) = 999999,                   &
    119                      lstyles(100) = (/ 0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    120                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    121                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    122                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    123                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    124                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    125                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    126                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    127                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8,    &
    128                                        0, 7, 3, 10, 1, 4, 9, 2, 6, 8 /), &
    129                      plot_spectra_level(100) = 999999
    130 
    131     REAL(wp)    ::  time_to_start_sp = 0.0_wp
    132 
    133     PUBLIC  comp_spectra_level, data_output_sp, header_char, klist_x, klist_y, &
    134             lstyles, n_sp_x, n_sp_y, plot_spectra_level, spectra_direction,    &
    135             utext_char, ytext_char
     100    CHARACTER (LEN=2),  DIMENSION(10) ::  spectra_direction = 'x'
     101    CHARACTER (LEN=10), DIMENSION(10) ::  data_output_sp  = ' '
     102
     103    INTEGER(iwp) ::  average_count_sp = 0
     104    INTEGER(iwp) ::  dosp_time_count = 0
     105    INTEGER(iwp) ::  n_sp_x = 0, n_sp_y = 0
     106
     107    INTEGER(iwp) ::  comp_spectra_level(100) = 999999
     108
     109    LOGICAL ::  calculate_spectra   = .FALSE.  !< internal switch that spectra are calculated
     110    LOGICAL ::  spectra_initialized = .FALSE.  !< internal switch that spectra related quantities are initialized
     111
     112    REAL(wp) ::  averaging_interval_sp = 9999999.9_wp  !< averaging interval for spectra output
     113    REAL(wp) ::  dt_dosp = 9999999.9_wp                !< time interval for spectra output
     114    REAL(wp) ::  skip_time_dosp = 9999999.9_wp         !< no output of spectra data before this interval has passed
     115
     116    REAL(wp), DIMENSION(:), ALLOCATABLE ::  var_d
     117
     118    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  spectrum_x, spectrum_y
    136119
    137120    SAVE
     
    153136    END INTERFACE calc_spectra_y
    154137
    155     PUBLIC calc_spectra
     138    INTERFACE spectra_check_parameters
     139       MODULE PROCEDURE spectra_check_parameters
     140    END INTERFACE spectra_check_parameters
     141
     142    INTERFACE spectra_header
     143       MODULE PROCEDURE spectra_header
     144    END INTERFACE spectra_header
     145
     146    INTERFACE spectra_init
     147       MODULE PROCEDURE spectra_init
     148    END INTERFACE spectra_init
     149
     150    INTERFACE spectra_parin
     151       MODULE PROCEDURE spectra_parin
     152    END INTERFACE spectra_parin
     153
     154    PUBLIC average_count_sp, averaging_interval_sp, calc_spectra,              &
     155           calculate_spectra, comp_spectra_level, data_output_sp,              &
     156           dosp_time_count, dt_dosp, n_sp_x, n_sp_y, plot_spectra_level,       &
     157           skip_time_dosp, spectra_check_parameters, spectra_direction,        &
     158           spectra_header, spectra_init, spectra_parin, spectrum_x,            &
     159           spectrum_y, var_d
    156160
    157161
    158162 CONTAINS
     163
     164!------------------------------------------------------------------------------!
     165! Description:
     166! ------------
     167!> Parin for &spectra_par for calculating spectra
     168!------------------------------------------------------------------------------!
     169    SUBROUTINE spectra_parin
     170
     171       USE control_parameters,                                                 &
     172           ONLY:  dt_data_output
     173
     174       IMPLICIT NONE
     175
     176       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current  &
     177                                    !< line of the parameter file
     178
     179       NAMELIST /spectra_par/  averaging_interval_sp, comp_spectra_level,      &
     180                               data_output_sp, dt_dosp, skip_time_dosp,        &
     181                               spectra_direction
     182
     183
     184!
     185!--    Position the namelist-file at the beginning (it was already opened in
     186!--    parin), search for the namelist-group of the package and position the
     187!--    file at this line.
     188       line = ' '
     189
     190!
     191!--    Try to find the spectra package
     192       REWIND ( 11 )
     193       line = ' '
     194       DO   WHILE ( INDEX( line, '&spectra_par' ) == 0 )
     195          READ ( 11, '(A)', END=10 )  line
     196       ENDDO
     197       BACKSPACE ( 11 )
     198
     199!
     200!--    Read namelist
     201       READ ( 11, spectra_par )
     202
     203!
     204!--    Default setting of dt_dosp here (instead of check_parameters), because
     205!--    its current value is needed in init_pegrid
     206       IF ( dt_dosp == 9999999.9_wp )  dt_dosp = dt_data_output
     207
     208!
     209!--    Set general switch that spectra shall be calculated
     210       calculate_spectra = .TRUE.
     211
     212 10    CONTINUE
     213
     214    END SUBROUTINE spectra_parin
     215
     216
     217
     218!------------------------------------------------------------------------------!
     219! Description:
     220! ------------
     221!> Initialization of spectra related variables
     222!------------------------------------------------------------------------------!
     223    SUBROUTINE spectra_init
     224
     225       USE indices,                                                            &
     226           ONLY:  nx, ny, nzb, nzt
     227
     228       IMPLICIT NONE
     229
     230       IF ( spectra_initialized )  RETURN
     231
     232       IF ( dt_dosp /= 9999999.9_wp )  THEN
     233          ALLOCATE( spectrum_x( 1:nx/2, 1:10, 1:10 ),                          &
     234                    spectrum_y( 1:ny/2, 1:10, 1:10 ) )
     235          spectrum_x = 0.0_wp
     236          spectrum_y = 0.0_wp
     237
     238          ALLOCATE( var_d(nzb:nzt+1) )
     239          var_d = 0.0_wp
     240       ENDIF
     241
     242       spectra_initialized = .TRUE.
     243
     244    END SUBROUTINE spectra_init
     245
     246
     247
     248!------------------------------------------------------------------------------!
     249! Description:
     250! ------------
     251!> Check spectra related quantities
     252!------------------------------------------------------------------------------!
     253    SUBROUTINE spectra_check_parameters
     254
     255       USE control_parameters,                                                 &
     256           ONLY:  averaging_interval, message_string, skip_time_data_output
     257
     258       IMPLICIT NONE
     259
     260!
     261!--    Check the average interval
     262       IF ( averaging_interval_sp == 9999999.9_wp )  THEN
     263          averaging_interval_sp = averaging_interval
     264       ENDIF
     265
     266       IF ( averaging_interval_sp > dt_dosp )  THEN
     267          WRITE( message_string, * )  'averaging_interval_sp = ',              &
     268                averaging_interval_sp, ' must be <= dt_dosp = ', dt_dosp
     269          CALL message( 'spectra_check_parameters', 'PA0087', 1, 2, 0, 6, 0 )
     270       ENDIF
     271
     272!
     273!--    Set the default skip time interval for data output, if necessary
     274       IF ( skip_time_dosp == 9999999.9_wp )                                   &
     275                                          skip_time_dosp = skip_time_data_output
     276
     277    END SUBROUTINE spectra_check_parameters
     278
     279
     280
     281!------------------------------------------------------------------------------!
     282! Description:
     283! ------------
     284!> Header output for spectra
     285!>
     286!> @todo Output of netcdf data format and compression level
     287!------------------------------------------------------------------------------!
     288    SUBROUTINE spectra_header ( io )
     289
     290       USE control_parameters,                                                 &
     291           ONLY:  dt_averaging_input_pr
     292
     293!       USE netcdf_interface,                                                  &
     294!           ONLY:  netcdf_data_format_string, netcdf_deflate
     295
     296       IMPLICIT NONE
     297
     298       CHARACTER (LEN=40) ::  output_format       !< internal string
     299
     300       INTEGER(iwp) ::  i                         !< internal counter
     301       INTEGER(iwp), INTENT(IN) ::  io            !< Unit of the output file
     302
     303!
     304!--    Spectra output
     305       IF ( dt_dosp /= 9999999.9_wp )  THEN
     306          WRITE ( io, 1 )
     307
     308!          output_format = netcdf_data_format_string
     309!          IF ( netcdf_deflate == 0 )  THEN
     310!             WRITE ( io, 2 )  output_format
     311!          ELSE
     312!             WRITE ( io, 3 )  TRIM( output_format ), netcdf_deflate
     313!          ENDIF
     314          WRITE ( io, 2 )  'see profiles or other quantities'
     315          WRITE ( io, 4 )  dt_dosp
     316          IF ( skip_time_dosp /= 0.0_wp )  WRITE ( io, 5 )  skip_time_dosp
     317          WRITE ( io, 6 )  ( data_output_sp(i), i = 1,10 ),     &
     318                           ( spectra_direction(i), i = 1,10 ),  &
     319                           ( comp_spectra_level(i), i = 1,100 ), &
     320                           averaging_interval_sp, dt_averaging_input_pr
     321       ENDIF
     322
     323     1 FORMAT ('    Spectra:')
     324     2 FORMAT ('       Output format: ',A/)
     325     3 FORMAT ('       Output format: ',A, '   compressed with level: ',I1/)
     326     4 FORMAT ('       Output every ',F7.1,' s'/)
     327     5 FORMAT ('       No output during initial ',F8.2,' s')
     328     6 FORMAT ('       Arrays:     ', 10(A5,',')/                         &
     329               '       Directions: ', 10(A5,',')/                         &
     330               '       height levels  k = ', 20(I3,',')/                  &
     331               '                          ', 20(I3,',')/                  &
     332               '                          ', 20(I3,',')/                  &
     333               '                          ', 20(I3,',')/                  &
     334               '                          ', 19(I3,','),I3,'.'/           &
     335               '       Time averaged over ', F7.1, ' s,' /                &
     336               '       Profiles for the time averaging are taken every ', &
     337                    F6.1,' s')
     338
     339    END SUBROUTINE spectra_header
     340
     341
    159342
    160343    SUBROUTINE calc_spectra
     
    164347
    165348       USE control_parameters,                                                 &
    166            ONLY:  average_count_sp, bc_lr_cyc, bc_ns_cyc, message_string, psolver
     349           ONLY:  bc_lr_cyc, bc_ns_cyc, message_string, psolver
    167350
    168351       USE cpulog,                                                             &
     
    191374
    192375       CALL cpu_log( log_point(30), 'calc_spectra', 'start' )
     376
     377!
     378!--    Initialize spectra related quantities
     379       CALL spectra_init
    193380
    194381!
     
    308495
    309496       USE statistics,                                                         &
    310            ONLY:  hom, var_d
     497           ONLY:  hom
    311498
    312499
     
    411598           ONLY:  comm2d, ierr, myid
    412599
    413        USE statistics,                                                         &
    414            ONLY:  spectrum_x, var_d
    415 
    416600       USE transpose_indices,                                                  &
    417601           ONLY:  nyn_x, nys_x, nzb_x, nzt_x
     
    554738           ONLY:  comm2d, ierr, myid
    555739
    556        USE statistics,                                                         &
    557            ONLY:  spectrum_y, var_d
    558 
    559740       USE transpose_indices,                                                  &
    560741           ONLY:  nxl_yd, nxr_yd, nzb_yd, nzt_yd
     
    669850    END SUBROUTINE calc_spectra_y
    670851
    671  END MODULE spectrum
     852 END MODULE spectra_mod
Note: See TracChangeset for help on using the changeset viewer.