PartMC
2.2.0
|
00001 ! Copyright (C) 2009-2011 Matthew West 00002 ! Licensed under the GNU General Public License version 2 or (at your 00003 ! option) any later version. See the file COPYING for details. 00004 00005 !> \file 00006 !> The bin_average_size program. 00007 00008 !> Read a NetCDF file, average the size of all particles within each 00009 !> bin, and write the data out as another NetCDF file. 00010 program bin_average_size 00011 00012 use pmc_aero_state 00013 use pmc_gas_data 00014 use pmc_gas_state 00015 use pmc_env_state 00016 use pmc_aero_data 00017 use pmc_bin_grid 00018 use pmc_output 00019 use netcdf 00020 00021 character(len=1000) :: in_filename, out_prefix 00022 type(bin_grid_t) :: bin_grid 00023 type(aero_data_t) :: aero_data 00024 type(aero_state_t) :: aero_state 00025 type(gas_data_t) :: gas_data 00026 type(gas_state_t) :: gas_state 00027 type(env_state_t) :: env_state 00028 integer :: n_bin, index, i_repeat, output_type 00029 real(kind=dp) :: d_min, d_max, time, del_t 00030 character(len=1000) :: tmp_str 00031 logical :: record_removals, dry_volume, bin_center, record_optical 00032 logical :: preserve_number 00033 character(len=PMC_UUID_LEN) :: uuid 00034 00035 ! process commandline arguments 00036 if (command_argument_count() .ne. 8) then 00037 write(6,*) 'Usage: bin_average_size <d_min> <d_max> <n_bin> ' & 00038 // '<"wet" or "dry"> <"center" or "average"> ' & 00039 // '<"number" or "volume"> ' & 00040 // '<input_filename> <output_prefix>' 00041 write(6,*) '' 00042 write(6,*) ' d_min: minimum bin diameter (m)' 00043 write(6,*) ' d_max: maximum bin diameter (m)' 00044 write(6,*) ' n_bin: number of bins' 00045 write(6,*) ' wet/dry: average wet or dry sizes' 00046 write(6,*) ' center/average: set new sizes to bin centers, ' & 00047 // 'or to average sizes' 00048 write(6,*) ' number/volume: preserve number or volume' 00049 write(6,*) ' input_filename: like scenario_0001_00000001.nc' 00050 write(6,*) ' output_prefix: like scenario_size_average' 00051 stop 2 00052 endif 00053 call get_command_argument(1, tmp_str) 00054 d_min = string_to_real(tmp_str) 00055 call get_command_argument(2, tmp_str) 00056 d_max = string_to_real(tmp_str) 00057 call get_command_argument(3, tmp_str) 00058 n_bin = string_to_integer(tmp_str) 00059 call get_command_argument(4, tmp_str) 00060 if (trim(tmp_str) == "wet") then 00061 dry_volume = .false. 00062 elseif (trim(tmp_str) == "dry") then 00063 dry_volume = .true. 00064 else 00065 write(6,*) 'Argument 4 must be "wet" or "dry", not ' & 00066 // trim(tmp_str) 00067 stop 1 00068 end if 00069 call get_command_argument(5, tmp_str) 00070 if (trim(tmp_str) == "center") then 00071 bin_center = .true. 00072 elseif (trim(tmp_str) == "average") then 00073 bin_center = .false. 00074 else 00075 write(6,*) 'Argument 5 must be "center" or "average", not ' & 00076 // trim(tmp_str) 00077 stop 1 00078 end if 00079 call get_command_argument(6, tmp_str) 00080 if (trim(tmp_str) == "number") then 00081 preserve_number = .true. 00082 elseif (trim(tmp_str) == "volume") then 00083 preserve_number = .false. 00084 else 00085 write(6,*) 'Argument 6 must be "number" or "volume", not ' & 00086 // trim(tmp_str) 00087 stop 1 00088 end if 00089 call get_command_argument(7, in_filename) 00090 call get_command_argument(8, out_prefix) 00091 00092 call pmc_mpi_init() 00093 00094 call bin_grid_allocate(bin_grid) 00095 call aero_data_allocate(aero_data) 00096 call aero_state_allocate(aero_state) 00097 call gas_data_allocate(gas_data) 00098 call gas_state_allocate(gas_state) 00099 call env_state_allocate(env_state) 00100 00101 call bin_grid_make(bin_grid, n_bin, diam2rad(d_min), diam2rad(d_max)) 00102 00103 call input_state(in_filename, index, time, del_t, i_repeat, uuid, & 00104 aero_data, aero_state, gas_data, gas_state, env_state) 00105 00106 if (dry_volume) then 00107 call aero_state_make_dry(aero_state, aero_data) 00108 end if 00109 00110 call aero_state_bin_average_size(aero_state, bin_grid, aero_data, & 00111 dry_volume, bin_center, preserve_number) 00112 00113 output_type = OUTPUT_TYPE_SINGLE 00114 record_removals = .false. 00115 record_optical = .true. 00116 call output_state(out_prefix, output_type, aero_data, aero_state, & 00117 gas_data, gas_state, env_state, index, time, del_t, i_repeat, & 00118 record_removals, record_optical, uuid) 00119 00120 call bin_grid_deallocate(bin_grid) 00121 call aero_data_deallocate(aero_data) 00122 call aero_state_deallocate(aero_state) 00123 call gas_data_deallocate(gas_data) 00124 call gas_state_deallocate(gas_state) 00125 call env_state_deallocate(env_state) 00126 00127 call pmc_mpi_finalize() 00128 00129 end program bin_average_size