Ignore:
Timestamp:
May 10, 2020 5:05:07 PM (5 years ago)
Author:
raasch
Message:

salsa: added reading/writing of global restart data + reading/writing restart data with MPI-IO, bugfix for MPI-IO in plant_canopy_model_mod, tutorial user-interface dispersion_eularian_and_lpm_extended updated

File:
1 edited

Legend:

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

    r4512 r4525  
    2626! -----------------
    2727! $Id$
     28! added reading/writing of global restart data,
     29! added reading/writing restart data with MPI-IO,
     30! variable write_binary_salsa removed
     31!
     32! 4512 2020-04-30 12:55:34Z monakurppa
    2833! Fixed a bug in component_index_constructor: index out of bounds if all chemical
    2934! components are used
     
    306311               bc_radiation_s, coupling_char, debug_output, dt_3d, intermediate_timestep_count,    &
    307312               intermediate_timestep_count_max, land_surface, max_pr_salsa, message_string,        &
    308                monotonic_limiter_z, plant_canopy, pt_surface, salsa, scalar_advec,                 &
    309                surface_pressure, time_since_reference_point, timestep_scheme, tsc, urban_surface,  &
    310                ws_scheme_sca
     313               monotonic_limiter_z, plant_canopy, pt_surface, restart_data_format_output, salsa,   &
     314               scalar_advec, surface_pressure, time_since_reference_point, timestep_scheme, tsc,   &
     315               urban_surface, ws_scheme_sca
    311316
    312317    USE indices,                                                                                   &
     
    320325
    321326    USE pegrid
     327
     328    USE restart_data_mpi_io_mod,                                                                   &
     329        ONLY:  rd_mpi_io_check_array, rrd_mpi_io, rrd_mpi_io_global_array, wrd_mpi_io,             &
     330               wrd_mpi_io_global_array
    322331
    323332    USE statistics,                                                                                &
     
    551560    LOGICAL ::  salsa_gases_from_chem   = .FALSE.  !< Transfer the gaseous components to SALSA
    552561    LOGICAL ::  van_der_waals_coagc     = .FALSE.  !< Include van der Waals and viscous forces in coagulation
    553     LOGICAL ::  write_binary_salsa      = .TRUE.   !< read binary for salsa
    554562
    555563!
     
    986994    END INTERFACE salsa_prognostic_equations
    987995
     996    INTERFACE salsa_rrd_global
     997       MODULE PROCEDURE salsa_rrd_global_ftn
     998       MODULE PROCEDURE salsa_rrd_global_mpi
     999    END INTERFACE salsa_rrd_global
     1000
    9881001    INTERFACE salsa_rrd_local
    989        MODULE PROCEDURE salsa_rrd_local
     1002       MODULE PROCEDURE salsa_rrd_local_ftn
     1003       MODULE PROCEDURE salsa_rrd_local_mpi
    9901004    END INTERFACE salsa_rrd_local
    9911005
     
    10021016       MODULE PROCEDURE salsa_tendency_ij
    10031017    END INTERFACE salsa_tendency
     1018
     1019    INTERFACE salsa_wrd_global
     1020       MODULE PROCEDURE salsa_wrd_global
     1021    END INTERFACE salsa_wrd_global
    10041022
    10051023    INTERFACE salsa_wrd_local
     
    10351053           salsa_parin,                   &
    10361054           salsa_prognostic_equations,    &
     1055           salsa_rrd_global,              &
    10371056           salsa_rrd_local,               &
    10381057           salsa_statistics,              &
    10391058           salsa_swap_timelevel,          &
     1059           salsa_wrd_global,              &
    10401060           salsa_wrd_local
    10411061
     
    11301150                                     ocnv_init,                                &
    11311151                                     ocsv_init,                                &
    1132                                      read_restart_data_salsa,                  &
    11331152                                     reglim,                                   &
    11341153                                     salsa,                                    &
     
    11391158                                     skip_time_do_salsa,                       &
    11401159                                     surface_aerosol_flux,                     &
    1141                                      van_der_waals_coagc,                      &
    1142                                      write_binary_salsa
     1160                                     van_der_waals_coagc
    11431161
    11441162    line = ' '
     
    29722990! Description:
    29732991! ------------
    2974 !> This routine reads the respective restart data.
    2975 !------------------------------------------------------------------------------!
    2976  SUBROUTINE salsa_rrd_local( k, nxlf, nxlc, nxl_on_file, nxrf, nxrc, nxr_on_file, nynf, nync,      &
    2977                              nyn_on_file, nysf, nysc, nys_on_file, tmp_3d, found )
     2992!> Read module-specific global restart data (Fortran binary format).
     2993!------------------------------------------------------------------------------!
     2994 SUBROUTINE salsa_rrd_global_ftn( found )
     2995
     2996    USE control_parameters,                                                    &
     2997        ONLY: length, restart_string
     2998
     2999
     3000    IMPLICIT NONE
     3001
     3002    LOGICAL, INTENT(OUT)  ::  found
     3003
     3004
     3005    found = .TRUE.
     3006
     3007    SELECT CASE ( restart_string(1:length) )
     3008
     3009       CASE ( 'listspec' )
     3010          READ ( 13 )  listspec
     3011
     3012       CASE ( 'nbin' )
     3013          READ ( 13 )  nbin
     3014
     3015       CASE ( 'nf2a' )
     3016          READ ( 13 )  nf2a
     3017
     3018       CASE ( 'ncc' )
     3019          READ ( 13 )  ncc
     3020
     3021       CASE ( 'mass_fracs_a' )
     3022          READ ( 13 )  mass_fracs_a
     3023
     3024       CASE ( 'mass_fracs_b' )
     3025          READ ( 13 )  mass_fracs_b
     3026
     3027       CASE DEFAULT
     3028
     3029          found = .FALSE.
     3030
     3031    END SELECT
     3032
     3033 END SUBROUTINE salsa_rrd_global_ftn
     3034
     3035
     3036!------------------------------------------------------------------------------!
     3037! Description:
     3038! ------------
     3039!> Read module-specific global restart data (MPI-IO).
     3040!------------------------------------------------------------------------------!
     3041 SUBROUTINE salsa_rrd_global_mpi
     3042
     3043    IMPLICIT NONE
     3044
     3045    CHARACTER(LEN=1) ::  counter  !< counter used for output-variable names
     3046
     3047    INTEGER(iwp) ::  i  !< loop counter
     3048
     3049
     3050    DO  i = 1, 7
     3051       WRITE( counter, '(I1)' )  i
     3052       CALL rrd_mpi_io( 'listspec_' // counter, listspec(i) )
     3053    ENDDO
     3054
     3055    CALL rrd_mpi_io_global_array( 'nbin', nbin )
     3056    CALL rrd_mpi_io( 'nf2a', nf2a )
     3057    CALL rrd_mpi_io( 'ncc', ncc )
     3058    CALL rrd_mpi_io_global_array( 'mass_fracs_a', mass_fracs_a )
     3059    CALL rrd_mpi_io_global_array( 'mass_fracs_b', mass_fracs_b )
     3060
     3061 END SUBROUTINE salsa_rrd_global_mpi
     3062
     3063
     3064!------------------------------------------------------------------------------!
     3065! Description:
     3066! ------------
     3067!> Read module-specific local restart data arrays (Fortran binary format).
     3068!------------------------------------------------------------------------------!
     3069 SUBROUTINE salsa_rrd_local_ftn( k, nxlf, nxlc, nxl_on_file, nxrf, nxrc, nxr_on_file, nynf, nync,  &
     3070                                 nyn_on_file, nysf, nysc, nys_on_file, tmp_3d, found )
    29783071
    29793072    USE control_parameters,                                                                        &
     
    30043097       DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) :: tmp_3d   !<
    30053098
    3006     found = .FALSE.
    3007 
    3008     IF ( read_restart_data_salsa )  THEN
     3099    found = .TRUE.
    30093100
    30103101       SELECT CASE ( restart_string(1:length) )
    30113102
    3012           CASE ( 'aerosol_mass' )
    3013              DO  ic = 1, ncomponents_mass * nbins_aerosol
     3103       CASE ( 'aerosol_mass' )
     3104          DO  ic = 1, ncomponents_mass * nbins_aerosol
     3105             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3106             aerosol_mass(ic)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                    &
     3107                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3108          ENDDO
     3109
     3110       CASE ( 'aerosol_number' )
     3111          DO  ib = 1, nbins_aerosol
     3112             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3113             aerosol_number(ib)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                  &
     3114                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3115          ENDDO
     3116
     3117       CASE( 'salsa_gases_av' )
     3118          IF ( .NOT. ALLOCATED( salsa_gases_av ) )  THEN
     3119             ALLOCATE( salsa_gases_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ngases_salsa) )
     3120          ENDIF
     3121          DO  ig = 1, ngases_salsa
     3122             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3123             salsa_gases_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ig) =                        &
     3124                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3125          ENDDO
     3126
     3127       CASE ( 'ldsa_av' )
     3128          IF ( .NOT. ALLOCATED( ldsa_av ) )  ALLOCATE( ldsa_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3129          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3130          ldsa_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3131                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3132
     3133       CASE ( 'mbins_av' )
     3134          IF ( .NOT. ALLOCATED( mbins_av ) )  THEN
     3135             ALLOCATE( mbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
     3136          ENDIF
     3137          DO  ib = 1, nbins_aerosol
     3138             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3139             mbins_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ib) =                              &
     3140                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3141          ENDDO
     3142
     3143       CASE ( 'nbins_av' )
     3144          IF ( .NOT. ALLOCATED( nbins_av ) )  THEN
     3145             ALLOCATE( nbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
     3146          ENDIF
     3147          DO  ib = 1, nbins_aerosol
     3148             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3149             nbins_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ib) =                              &
     3150                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3151          ENDDO
     3152
     3153       CASE ( 'ntot_av' )
     3154          IF ( .NOT. ALLOCATED( ntot_av ) )  ALLOCATE( ntot_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3155          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3156          ntot_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3157                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3158          found = .TRUE.
     3159
     3160       CASE ( 'nufp_av' )
     3161          IF ( .NOT. ALLOCATED( nufp_av ) )  ALLOCATE( nufp_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3162          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3163          nufp_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3164                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3165
     3166       CASE ( 'pm01_av' )
     3167          IF ( .NOT. ALLOCATED( pm01_av ) )  ALLOCATE( pm01_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3168          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3169          pm01_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3170                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3171
     3172       CASE ( 'pm25_av' )
     3173          IF ( .NOT. ALLOCATED( pm25_av ) )  ALLOCATE( pm25_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3174          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3175          pm25_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3176                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3177
     3178       CASE ( 'pm10_av' )
     3179          IF ( .NOT. ALLOCATED( pm10_av ) )  ALLOCATE( pm10_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3180          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3181          pm10_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                     &
     3182                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3183
     3184       CASE ( 's_mass_av' )
     3185          IF ( .NOT. ALLOCATED( s_mass_av ) )  THEN
     3186             ALLOCATE( s_mass_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ncomponents_mass) )
     3187          ENDIF
     3188          DO  ic = 1, ncomponents_mass
     3189             IF ( k == 1 )  READ ( 13 ) tmp_3d
     3190             s_mass_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ic) =                             &
     3191                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3192          ENDDO
     3193
     3194       CASE ( 's_h2o_av' )
     3195          IF ( .NOT. ALLOCATED( s_h2o_av ) )  ALLOCATE( s_h2o_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3196          IF ( k == 1 )  READ ( 13 ) tmp_3d
     3197          s_h2o_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                    &
     3198                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
     3199
     3200       CASE ( 'salsa_gas' )
     3201          IF ( .NOT. salsa_gases_from_chem )  THEN
     3202             DO  ig = 1, ngases_salsa
    30143203                IF ( k == 1 )  READ ( 13 ) tmp_3d
    3015                 aerosol_mass(ic)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                 &
     3204                salsa_gas(ig)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                    &
    30163205                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    30173206             ENDDO
    3018              found = .TRUE.
    3019 
    3020           CASE ( 'aerosol_number' )
    3021              DO  ib = 1, nbins_aerosol
    3022                 IF ( k == 1 )  READ ( 13 ) tmp_3d
    3023                 aerosol_number(ib)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =               &
    3024                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3025              ENDDO
    3026              found = .TRUE.
    3027 
    3028           CASE( 'salsa_gases_av' )
    3029              IF ( .NOT. ALLOCATED( salsa_gases_av ) )  THEN
    3030                 ALLOCATE( salsa_gases_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ngases_salsa) )
    3031              ENDIF
    3032              DO  ig = 1, ngases_salsa
    3033                 IF ( k == 1 )  READ ( 13 ) tmp_3d
    3034                 salsa_gases_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ig) =                     &
    3035                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3036              ENDDO
    3037              found = .TRUE.
    3038 
    3039           CASE ( 'ldsa_av' )
    3040              IF ( .NOT. ALLOCATED( ldsa_av ) )  ALLOCATE( ldsa_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3041              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3042              ldsa_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3043                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3044              found = .TRUE.
    3045 
    3046           CASE ( 'mbins_av' )
    3047              IF ( .NOT. ALLOCATED( mbins_av ) )  THEN
    3048                 ALLOCATE( mbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
    3049              ENDIF
    3050              DO  ib = 1, nbins_aerosol
    3051                 IF ( k == 1 )  READ ( 13 ) tmp_3d
    3052                 mbins_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ib) =                           &
    3053                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3054                 found = .TRUE.
    3055              ENDDO
    3056 
    3057           CASE ( 'nbins_av' )
    3058              IF ( .NOT. ALLOCATED( nbins_av ) )  THEN
    3059                 ALLOCATE( nbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
    3060              ENDIF
    3061              DO  ib = 1, nbins_aerosol
    3062                 IF ( k == 1 )  READ ( 13 ) tmp_3d
    3063                 nbins_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ib) =                           &
    3064                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3065                 found = .TRUE.
    3066              ENDDO
    3067 
    3068           CASE ( 'ntot_av' )
    3069              IF ( .NOT. ALLOCATED( ntot_av ) )  ALLOCATE( ntot_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3070              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3071              ntot_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3072                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3073              found = .TRUE.
    3074 
    3075           CASE ( 'nufp_av' )
    3076              IF ( .NOT. ALLOCATED( nufp_av ) )  ALLOCATE( nufp_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3077              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3078              nufp_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3079                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3080              found = .TRUE.
    3081 
    3082           CASE ( 'pm01_av' )
    3083              IF ( .NOT. ALLOCATED( pm01_av ) )  ALLOCATE( pm01_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3084              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3085              pm01_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3086                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3087              found = .TRUE.
    3088 
    3089           CASE ( 'pm25_av' )
    3090              IF ( .NOT. ALLOCATED( pm25_av ) )  ALLOCATE( pm25_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3091              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3092              pm25_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3093                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3094              found = .TRUE.
    3095 
    3096           CASE ( 'pm10_av' )
    3097              IF ( .NOT. ALLOCATED( pm10_av ) )  ALLOCATE( pm10_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3098              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3099              pm10_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                  &
    3100                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3101              found = .TRUE.
    3102 
    3103           CASE ( 's_mass_av' )
    3104              IF ( .NOT. ALLOCATED( s_mass_av ) )  THEN
    3105                 ALLOCATE( s_mass_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ncomponents_mass) )
    3106              ENDIF
    3107              DO  ic = 1, ncomponents_mass
    3108                 IF ( k == 1 )  READ ( 13 ) tmp_3d
    3109                 s_mass_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp,ic) =                          &
    3110                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3111              ENDDO
    3112              found = .TRUE.
    3113 
    3114           CASE ( 's_h2o_av' )
    3115              IF ( .NOT. ALLOCATED( s_h2o_av ) )  ALLOCATE( s_h2o_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    3116              IF ( k == 1 )  READ ( 13 ) tmp_3d
    3117              s_h2o_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                                 &
    3118                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3119              found = .TRUE.
    3120 
    3121           CASE ( 'salsa_gas' )
    3122              IF ( .NOT. salsa_gases_from_chem )  THEN
    3123                 DO  ig = 1, ngases_salsa
    3124                    IF ( k == 1 )  READ ( 13 ) tmp_3d
    3125                    salsa_gas(ig)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                 &
    3126                                                    tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
    3127                 ENDDO
    3128                 found = .TRUE.
    3129              ENDIF
    3130 
    3131           CASE DEFAULT
    3132              found = .FALSE.
    3133 
    3134        END SELECT
    3135     ENDIF
    3136 
    3137  END SUBROUTINE salsa_rrd_local
     3207          ENDIF
     3208
     3209       CASE DEFAULT
     3210          found = .FALSE.
     3211
     3212    END SELECT
     3213
     3214 END SUBROUTINE salsa_rrd_local_ftn
     3215
    31383216
    31393217!------------------------------------------------------------------------------!
    31403218! Description:
    31413219! ------------
    3142 !> This routine writes the respective restart data.
     3220!> Read module-specific local restart data arrays (MPI-IO).
     3221!------------------------------------------------------------------------------!
     3222 SUBROUTINE salsa_rrd_local_mpi
     3223
     3224    USE indices,                                                               &
     3225        ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzt
     3226
     3227    IMPLICIT NONE
     3228
     3229    CHARACTER(LEN=3) ::  counter  !< counter used for input-variable names
     3230
     3231    INTEGER(iwp) ::  ib  !<
     3232    INTEGER(iwp) ::  ic  !<
     3233    INTEGER(iwp) ::  ig  !<
     3234
     3235    LOGICAL ::  array_found  !<
     3236
     3237    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  tmp_3d  !< temporary array to store aerosal data
     3238                                                        !< as single 3d-standard arrays
     3239
     3240
     3241    ALLOCATE( tmp_3d(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3242
     3243    DO  ic = 1, nbins_aerosol * ncomponents_mass
     3244       WRITE( counter, '(I3.3)')  ic
     3245       CALL rrd_mpi_io( 'aerosol_mass_' // counter, tmp_3d )
     3246       aerosol_mass(ic)%conc = tmp_3d
     3247    ENDDO
     3248
     3249    DO  ib = 1, nbins_aerosol
     3250       WRITE( counter, '(I3.3)')  ib
     3251       CALL rrd_mpi_io( 'aerosol_number_' // counter, tmp_3d )
     3252       aerosol_number(ic)%conc = tmp_3d
     3253    ENDDO
     3254
     3255    IF ( .NOT. salsa_gases_from_chem )  THEN
     3256       CALL rd_mpi_io_check_array( 'salsa_gases_av_001', found = array_found )
     3257       IF ( array_found )  THEN
     3258          IF ( .NOT. ALLOCATED( salsa_gases_av ) )  THEN
     3259             ALLOCATE( salsa_gases_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:ngases_salsa) )
     3260          ENDIF
     3261          DO  ig = 1, ngases_salsa
     3262             WRITE( counter, '(I3.3)')  ig
     3263             CALL rrd_mpi_io( 'salsa_gases_av_' // counter , tmp_3d )
     3264             salsa_gases_av(:,:,:,ig) = tmp_3d
     3265          ENDDO
     3266       ENDIF
     3267    ENDIF
     3268
     3269    CALL rd_mpi_io_check_array( 'ldsa_av', found = array_found )
     3270    IF ( array_found )  THEN
     3271       IF ( .NOT. ALLOCATED( ldsa_av ) )  ALLOCATE( ldsa_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3272       CALL rrd_mpi_io( 'ldsa_av', ldsa_av )
     3273    ENDIF
     3274
     3275    CALL rd_mpi_io_check_array( 'mbins_av_001', found = array_found )
     3276    IF ( array_found )  THEN
     3277       IF ( .NOT. ALLOCATED( mbins_av ) )  THEN
     3278          ALLOCATE( mbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:nbins_aerosol) )
     3279       ENDIF
     3280       DO  ib = 1, nbins_aerosol
     3281          WRITE( counter, '(I3.3)')  ib
     3282          CALL rrd_mpi_io( 'mbins_av_' // counter, tmp_3d )
     3283          mbins_av(:,:,:,ib) = tmp_3d
     3284       ENDDO
     3285    ENDIF
     3286
     3287    CALL rd_mpi_io_check_array( 'nbins_av_001', found = array_found )
     3288    IF ( array_found )  THEN
     3289       IF ( .NOT. ALLOCATED( nbins_av ) )  THEN
     3290          ALLOCATE( nbins_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:nbins_aerosol) )
     3291       ENDIF
     3292       DO  ib = 1, nbins_aerosol
     3293          WRITE( counter, '(I3.3)')  ib
     3294          CALL rrd_mpi_io( 'nbins_av_' // counter, tmp_3d )
     3295          nbins_av(:,:,:,ib) = tmp_3d
     3296       ENDDO
     3297    ENDIF
     3298
     3299    CALL rd_mpi_io_check_array( 'ntot_av', found = array_found )
     3300    IF ( array_found )  THEN
     3301       IF ( .NOT. ALLOCATED( ntot_av ) )  ALLOCATE( ntot_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3302       CALL rrd_mpi_io( 'ntot_av', ntot_av )
     3303    ENDIF
     3304
     3305    CALL rd_mpi_io_check_array( 'nufp_av', found = array_found )
     3306    IF ( array_found )  THEN
     3307       IF ( .NOT. ALLOCATED( nufp_av ) )  ALLOCATE( nufp_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3308       CALL rrd_mpi_io( 'nufp_av', nufp_av )
     3309    ENDIF
     3310
     3311    CALL rd_mpi_io_check_array( 'pm01_av', found = array_found )
     3312    IF ( array_found )  THEN
     3313       IF ( .NOT. ALLOCATED( pm01_av ) )  ALLOCATE( pm01_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3314       CALL rrd_mpi_io( 'pm01_av', pm01_av )
     3315    ENDIF
     3316
     3317    CALL rd_mpi_io_check_array( 'pm25_av', found = array_found )
     3318    IF ( array_found )  THEN
     3319       IF ( .NOT. ALLOCATED( pm25_av ) )  ALLOCATE( pm25_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3320       CALL rrd_mpi_io( 'pm25_av', pm25_av )
     3321    ENDIF
     3322
     3323    CALL rd_mpi_io_check_array( 'pm10_av', found = array_found )
     3324    IF ( array_found )  THEN
     3325       IF ( .NOT. ALLOCATED( pm10_av ) )  ALLOCATE( pm10_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3326       CALL rrd_mpi_io( 'pm10_av', pm10_av )
     3327    ENDIF
     3328
     3329    CALL rd_mpi_io_check_array( 's_h20_av', found = array_found )
     3330    IF ( array_found )  THEN
     3331       IF ( .NOT. ALLOCATED( s_h2o_av ) )  ALLOCATE( s_h2o_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3332       CALL rrd_mpi_io( 's_h2o_av', s_h2o_av )
     3333    ENDIF
     3334
     3335    CALL rd_mpi_io_check_array( 's_mass_av_001', found = array_found )
     3336    IF ( array_found )  THEN
     3337       IF ( .NOT. ALLOCATED( s_mass_av ) )  THEN
     3338          ALLOCATE( s_mass_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:ncomponents_mass) )
     3339       ENDIF
     3340       DO  ic = 1, ncomponents_mass
     3341          WRITE( counter, '(I3.3)')  ib
     3342          CALL rrd_mpi_io( 's_mass_av_' // counter, tmp_3d )
     3343          s_mass_av(:,:,:,ic) = tmp_3d
     3344       ENDDO
     3345    ENDIF
     3346
     3347    IF ( .NOT. salsa_gases_from_chem )  THEN
     3348       DO  ig = 1, ngases_salsa
     3349          WRITE( counter, '(I3.3)')  ig
     3350          CALL rrd_mpi_io( 'salsa_gas_' // counter, tmp_3d )
     3351          salsa_gas(ig)%conc = tmp_3d
     3352       ENDDO
     3353    ENDIF
     3354
     3355    DEALLOCATE( tmp_3d )
     3356
     3357 END SUBROUTINE salsa_rrd_local_mpi
     3358
     3359
     3360!------------------------------------------------------------------------------!
     3361! Description:
     3362! ------------
     3363!> Write module-specific global restart data.
     3364!------------------------------------------------------------------------------!
     3365 SUBROUTINE salsa_wrd_global
     3366
     3367    IMPLICIT NONE
     3368
     3369    CHARACTER(LEN=1) ::  counter  !< counter used for output-variable names
     3370
     3371    INTEGER(iwp) ::  i  !< loop counter
     3372
     3373    IF ( TRIM( restart_data_format_output ) == 'fortran_binary' )  THEN
     3374
     3375       CALL wrd_write_string( 'listpec' )
     3376       WRITE ( 14 )  listspec
     3377
     3378       CALL wrd_write_string( 'nbin' )
     3379       WRITE ( 14 )  nbin
     3380
     3381       CALL wrd_write_string( 'nf2a' )
     3382       WRITE ( 14 )  nf2a
     3383
     3384       CALL wrd_write_string( 'ncc' )
     3385       WRITE ( 14 )  ncc
     3386
     3387       CALL wrd_write_string( 'mass_fracs_a' )
     3388       WRITE ( 14 )  mass_fracs_a
     3389
     3390       CALL wrd_write_string( 'mass_fracs_b' )
     3391       WRITE ( 14 )  mass_fracs_b
     3392
     3393    ELSEIF ( TRIM( restart_data_format_output ) == 'mpi' )  THEN
     3394
     3395       DO  i = 1, 7
     3396          WRITE( counter, '(I1)' )  i
     3397          CALL wrd_mpi_io( 'listspec_' // counter, listspec(i) )
     3398       ENDDO
     3399
     3400       CALL wrd_mpi_io_global_array( 'nbin', nbin )
     3401       CALL wrd_mpi_io( 'nf2a', nf2a )
     3402       CALL wrd_mpi_io( 'ncc', ncc )
     3403       CALL wrd_mpi_io_global_array( 'mass_fracs_a', mass_fracs_a )
     3404       CALL wrd_mpi_io_global_array( 'mass_fracs_b', mass_fracs_b )
     3405
     3406    ENDIF
     3407
     3408 END SUBROUTINE salsa_wrd_global
     3409
     3410
     3411!------------------------------------------------------------------------------!
     3412! Description:
     3413! ------------
     3414!> This routine writes the respective local restart data.
    31433415!> Note that the following input variables in PARIN have to be equal between
    31443416!> restart runs:
    3145 !>    listspec, nbin, nbin2, nf2a, ncc, mass_fracs_a, mass_fracs_b
     3417!>    listspec, nbin, nf2a, ncc, mass_fracs_a, mass_fracs_b
    31463418!------------------------------------------------------------------------------!
    31473419 SUBROUTINE salsa_wrd_local
    31483420
    3149     USE control_parameters,                                                                        &
    3150         ONLY:  write_binary
    3151 
    31523421    IMPLICIT NONE
     3422
     3423    CHARACTER(LEN=3) ::  counter  !< counter used for output-variable names
    31533424
    31543425    INTEGER(iwp) ::  ib   !<
     
    31563427    INTEGER(iwp) ::  ig  !<
    31573428
    3158     IF ( write_binary  .AND.  write_binary_salsa )  THEN
     3429    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  tmp_3d  !< temporary array to store aerosal data
     3430                                                        !< as single 3d-standard arrays
     3431
     3432    IF ( TRIM( restart_data_format_output ) == 'fortran_binary' )  THEN
    31593433
    31603434       CALL wrd_write_string( 'aerosol_mass' )
     
    31793453
    31803454       IF ( ALLOCATED( ldsa_av ) )  THEN
    3181        CALL wrd_write_string( 'ldsa_av' )
    3182        WRITE ( 14 )  ldsa_av
     3455          CALL wrd_write_string( 'ldsa_av' )
     3456          WRITE ( 14 )  ldsa_av
    31833457       ENDIF
    31843458
     
    32403514          ENDDO
    32413515       ENDIF
     3516
     3517    ELSEIF ( TRIM( restart_data_format_output ) == 'mpi' )  THEN
     3518
     3519       ALLOCATE( tmp_3d(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     3520
     3521       DO  ic = 1, nbins_aerosol * ncomponents_mass
     3522          WRITE( counter, '(I3.3)')  ic
     3523          tmp_3d = aerosol_mass(ic)%conc
     3524          CALL wrd_mpi_io( 'aerosol_mass_' // counter, tmp_3d )
     3525       ENDDO
     3526
     3527       DO  ib = 1, nbins_aerosol
     3528          WRITE( counter, '(I3.3)')  ib
     3529          tmp_3d = aerosol_number(ib)%conc
     3530          CALL wrd_mpi_io( 'aerosol_number_' // counter, tmp_3d )
     3531       ENDDO
     3532
     3533       IF (  .NOT. salsa_gases_from_chem )  THEN
     3534
     3535          IF ( ALLOCATED( salsa_gases_av ) )  THEN
     3536             DO  ig = 1, ngases_salsa
     3537                WRITE( counter, '(I3.3)')  ig
     3538                tmp_3d = salsa_gases_av(:,:,:,ig)
     3539                CALL wrd_mpi_io( 'salsa_gases_av_' // counter, tmp_3d )
     3540             ENDDO
     3541          ENDIF
     3542       ENDIF
     3543
     3544       IF ( ALLOCATED( ldsa_av ) )  CALL wrd_mpi_io( 'ldsa_av', ldsa_av )
     3545
     3546
     3547       IF ( ALLOCATED( mbins_av ) )  THEN
     3548          DO  ib = 1, nbins_aerosol
     3549             WRITE( counter, '(I3.3)')  ib
     3550             tmp_3d = mbins_av(:,:,:,ib)
     3551             CALL wrd_mpi_io( 'mbins_av_' // counter, tmp_3d )
     3552          ENDDO
     3553       ENDIF
     3554
     3555       IF ( ALLOCATED( nbins_av ) )  THEN
     3556          DO  ib = 1, nbins_aerosol
     3557             WRITE( counter, '(I3.3)')  ib
     3558             tmp_3d = nbins_av(:,:,:,ib)
     3559             CALL wrd_mpi_io( 'nbins_av_' // counter, tmp_3d )
     3560          ENDDO
     3561       ENDIF
     3562
     3563       IF ( ALLOCATED( ntot_av )  )  CALL wrd_mpi_io( 'ntot_av', ntot_av )
     3564       IF ( ALLOCATED( nufp_av )  )  CALL wrd_mpi_io( 'nufp_av', nufp_av )
     3565       IF ( ALLOCATED( pm01_av )  )  CALL wrd_mpi_io( 'pm01_av', pm01_av )
     3566       IF ( ALLOCATED( pm25_av )  )  CALL wrd_mpi_io( 'pm25_av', pm25_av )
     3567       IF ( ALLOCATED( pm10_av )  )  CALL wrd_mpi_io( 'pm10_av', pm10_av )
     3568       IF ( ALLOCATED( s_h2o_av ) )  CALL wrd_mpi_io( 's_h2o_av', s_h2o_av )
     3569
     3570       IF ( ALLOCATED( s_mass_av ) )  THEN
     3571          DO  ic = 1, ncomponents_mass
     3572             WRITE( counter, '(I3.3)')  ic
     3573             tmp_3d = s_mass_av(:,:,:,ic)
     3574             CALL wrd_mpi_io( 's_mass_av_' // counter, tmp_3d )
     3575          ENDDO
     3576       ENDIF
     3577
     3578       IF ( .NOT. salsa_gases_from_chem )  THEN
     3579          DO  ig = 1, ngases_salsa
     3580             WRITE( counter, '(I3.3)')  ig
     3581             tmp_3d = salsa_gas(ig)%conc
     3582             CALL wrd_mpi_io( 'salsa_gas_' // counter, tmp_3d )
     3583          ENDDO
     3584       ENDIF
     3585
     3586       DEALLOCATE( tmp_3d )
    32423587
    32433588    ENDIF
     
    1306713412
    1306813413    USE control_parameters,                                                                        &
    13069         ONLY:  end_time, initializing_actions, spinup_time
     13414        ONLY:  end_time, spinup_time
    1307013415
    1307113416    USE palm_date_time_mod,                                                                        &
     
    1313913484!
    1314013485!--    Initialize boundary data. Please note, do not initialize boundaries in case of restart runs.
    13141        IF ( TRIM( initializing_actions ) /= 'read_restart_data'  .AND.  read_restart_data_salsa )  &
    13142        THEN
     13486       IF ( .NOT. read_restart_data_salsa )  THEN
    1314313487          IF ( bc_dirichlet_l )  THEN
    1314413488             DO  ib = 1, nbins_aerosol
Note: See TracChangeset for help on using the changeset viewer.