Changeset 4525 for palm/trunk/SOURCE/salsa_mod.f90
- Timestamp:
- May 10, 2020 5:05:07 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/salsa_mod.f90
r4512 r4525 26 26 ! ----------------- 27 27 ! $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 28 33 ! Fixed a bug in component_index_constructor: index out of bounds if all chemical 29 34 ! components are used … … 306 311 bc_radiation_s, coupling_char, debug_output, dt_3d, intermediate_timestep_count, & 307 312 intermediate_timestep_count_max, land_surface, max_pr_salsa, message_string, & 308 monotonic_limiter_z, plant_canopy, pt_surface, salsa, scalar_advec,&309 s urface_pressure, time_since_reference_point, timestep_scheme, tsc, urban_surface,&310 ws_scheme_sca313 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 311 316 312 317 USE indices, & … … 320 325 321 326 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 322 331 323 332 USE statistics, & … … 551 560 LOGICAL :: salsa_gases_from_chem = .FALSE. !< Transfer the gaseous components to SALSA 552 561 LOGICAL :: van_der_waals_coagc = .FALSE. !< Include van der Waals and viscous forces in coagulation 553 LOGICAL :: write_binary_salsa = .TRUE. !< read binary for salsa554 562 555 563 ! … … 986 994 END INTERFACE salsa_prognostic_equations 987 995 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 988 1001 INTERFACE salsa_rrd_local 989 MODULE PROCEDURE salsa_rrd_local 1002 MODULE PROCEDURE salsa_rrd_local_ftn 1003 MODULE PROCEDURE salsa_rrd_local_mpi 990 1004 END INTERFACE salsa_rrd_local 991 1005 … … 1002 1016 MODULE PROCEDURE salsa_tendency_ij 1003 1017 END INTERFACE salsa_tendency 1018 1019 INTERFACE salsa_wrd_global 1020 MODULE PROCEDURE salsa_wrd_global 1021 END INTERFACE salsa_wrd_global 1004 1022 1005 1023 INTERFACE salsa_wrd_local … … 1035 1053 salsa_parin, & 1036 1054 salsa_prognostic_equations, & 1055 salsa_rrd_global, & 1037 1056 salsa_rrd_local, & 1038 1057 salsa_statistics, & 1039 1058 salsa_swap_timelevel, & 1059 salsa_wrd_global, & 1040 1060 salsa_wrd_local 1041 1061 … … 1130 1150 ocnv_init, & 1131 1151 ocsv_init, & 1132 read_restart_data_salsa, &1133 1152 reglim, & 1134 1153 salsa, & … … 1139 1158 skip_time_do_salsa, & 1140 1159 surface_aerosol_flux, & 1141 van_der_waals_coagc, & 1142 write_binary_salsa 1160 van_der_waals_coagc 1143 1161 1144 1162 line = ' ' … … 2972 2990 ! Description: 2973 2991 ! ------------ 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 ) 2978 3071 2979 3072 USE control_parameters, & … … 3004 3097 DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) :: tmp_3d !< 3005 3098 3006 found = .FALSE. 3007 3008 IF ( read_restart_data_salsa ) THEN 3099 found = .TRUE. 3009 3100 3010 3101 SELECT CASE ( restart_string(1:length) ) 3011 3102 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 3014 3203 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) = & 3016 3205 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp) 3017 3206 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 3138 3216 3139 3217 !------------------------------------------------------------------------------! 3140 3218 ! Description: 3141 3219 ! ------------ 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. 3143 3415 !> Note that the following input variables in PARIN have to be equal between 3144 3416 !> restart runs: 3145 !> listspec, nbin, n bin2, nf2a, ncc, mass_fracs_a, mass_fracs_b3417 !> listspec, nbin, nf2a, ncc, mass_fracs_a, mass_fracs_b 3146 3418 !------------------------------------------------------------------------------! 3147 3419 SUBROUTINE salsa_wrd_local 3148 3420 3149 USE control_parameters, &3150 ONLY: write_binary3151 3152 3421 IMPLICIT NONE 3422 3423 CHARACTER(LEN=3) :: counter !< counter used for output-variable names 3153 3424 3154 3425 INTEGER(iwp) :: ib !< … … 3156 3427 INTEGER(iwp) :: ig !< 3157 3428 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 3159 3433 3160 3434 CALL wrd_write_string( 'aerosol_mass' ) … … 3179 3453 3180 3454 IF ( ALLOCATED( ldsa_av ) ) THEN 3181 CALL wrd_write_string( 'ldsa_av' )3182 WRITE ( 14 ) ldsa_av3455 CALL wrd_write_string( 'ldsa_av' ) 3456 WRITE ( 14 ) ldsa_av 3183 3457 ENDIF 3184 3458 … … 3240 3514 ENDDO 3241 3515 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 ) 3242 3587 3243 3588 ENDIF … … 13067 13412 13068 13413 USE control_parameters, & 13069 ONLY: end_time, initializing_actions,spinup_time13414 ONLY: end_time, spinup_time 13070 13415 13071 13416 USE palm_date_time_mod, & … … 13139 13484 ! 13140 13485 !-- 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 13143 13487 IF ( bc_dirichlet_l ) THEN 13144 13488 DO ib = 1, nbins_aerosol
Note: See TracChangeset
for help on using the changeset viewer.