PartMC 2.1.4
|
00001 ! Copyright (C) 2009-2010 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_aero_weight 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_weight_t) :: aero_weight 00025 type(aero_state_t) :: aero_state 00026 type(gas_data_t) :: gas_data 00027 type(gas_state_t) :: gas_state 00028 type(env_state_t) :: env_state 00029 integer :: n_bin, index, i_repeat, output_type 00030 real(kind=dp) :: d_min, d_max, time, del_t 00031 character(len=1000) :: tmp_str 00032 logical :: record_removals, dry_volume, bin_center, record_optical 00033 logical :: preserve_number 00034 character(len=PMC_UUID_LEN) :: uuid 00035 00036 ! process commandline arguments 00037 if (command_argument_count() .ne. 8) then 00038 write(6,*) 'Usage: bin_average_size <d_min> <d_max> <n_bin> ' & 00039 // '<"wet" or "dry"> <"center" or "average"> ' & 00040 // '<"number" or "volume"> ' & 00041 // '<input_filename> <output_prefix>' 00042 write(6,*) '' 00043 write(6,*) ' d_min: minimum bin diameter (m)' 00044 write(6,*) ' d_max: maximum bin diameter (m)' 00045 write(6,*) ' n_bin: number of bins' 00046 write(6,*) ' wet/dry: average wet or dry sizes' 00047 write(6,*) ' center/average: set new sizes to bin centers, ' & 00048 // 'or to average sizes' 00049 write(6,*) ' number/volume: preserve number or volume' 00050 write(6,*) ' input_filename: like scenario_0001_00000001.nc' 00051 write(6,*) ' output_prefix: like scenario_size_average' 00052 stop 2 00053 endif 00054 call get_command_argument(1, tmp_str) 00055 d_min = string_to_real(tmp_str) 00056 call get_command_argument(2, tmp_str) 00057 d_max = string_to_real(tmp_str) 00058 call get_command_argument(3, tmp_str) 00059 n_bin = string_to_integer(tmp_str) 00060 call get_command_argument(4, tmp_str) 00061 if (trim(tmp_str) == "wet") then 00062 dry_volume = .false. 00063 elseif (trim(tmp_str) == "dry") then 00064 dry_volume = .true. 00065 else 00066 write(6,*) 'Argument 4 must be "wet" or "dry", not ' & 00067 // trim(tmp_str) 00068 stop 1 00069 end if 00070 call get_command_argument(5, tmp_str) 00071 if (trim(tmp_str) == "center") then 00072 bin_center = .true. 00073 elseif (trim(tmp_str) == "average") then 00074 bin_center = .false. 00075 else 00076 write(6,*) 'Argument 5 must be "center" or "average", not ' & 00077 // trim(tmp_str) 00078 stop 1 00079 end if 00080 call get_command_argument(6, tmp_str) 00081 if (trim(tmp_str) == "number") then 00082 preserve_number = .true. 00083 elseif (trim(tmp_str) == "volume") then 00084 preserve_number = .false. 00085 else 00086 write(6,*) 'Argument 6 must be "number" or "volume", not ' & 00087 // trim(tmp_str) 00088 stop 1 00089 end if 00090 call get_command_argument(7, in_filename) 00091 call get_command_argument(8, out_prefix) 00092 00093 call pmc_mpi_init() 00094 00095 call bin_grid_allocate(bin_grid) 00096 call aero_data_allocate(aero_data) 00097 call aero_weight_allocate(aero_weight) 00098 call aero_state_allocate(aero_state) 00099 call gas_data_allocate(gas_data) 00100 call gas_state_allocate(gas_state) 00101 call env_state_allocate(env_state) 00102 00103 call bin_grid_make(bin_grid, n_bin, diam2rad(d_min), diam2rad(d_max)) 00104 00105 call input_state(in_filename, bin_grid, aero_data, & 00106 aero_weight, aero_state, gas_data, gas_state, env_state, & 00107 index, time, del_t, i_repeat, uuid) 00108 00109 if (dry_volume) then 00110 call aero_state_make_dry(aero_state, bin_grid, aero_data) 00111 end if 00112 00113 call aero_state_bin_average_size(aero_state, bin_grid, aero_data, & 00114 aero_weight, dry_volume, bin_center, preserve_number) 00115 00116 output_type = OUTPUT_TYPE_SINGLE 00117 record_removals = .false. 00118 record_optical = .true. 00119 call output_state(out_prefix, output_type, bin_grid, aero_data, & 00120 aero_weight, aero_state, gas_data, gas_state, env_state, & 00121 index, time, del_t, i_repeat, record_removals, record_optical, uuid) 00122 00123 call bin_grid_deallocate(bin_grid) 00124 call aero_data_deallocate(aero_data) 00125 call aero_weight_deallocate(aero_weight) 00126 call aero_state_deallocate(aero_state) 00127 call gas_data_deallocate(gas_data) 00128 call gas_state_deallocate(gas_state) 00129 call env_state_deallocate(env_state) 00130 00131 call pmc_mpi_finalize() 00132 00133 end program bin_average_size