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