PartMC 2.1.4
bin_average_size.F90
Go to the documentation of this file.
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