PartMC  2.6.1
bin_average_size.F90
Go to the documentation of this file.
1 ! Copyright (C) 2009-2013 Matthew West
2 ! Licensed under the GNU General Public License version 2 or (at your
3 ! option) any later version. See the file COPYING for details.
4 
5 !> \file
6 !> The bin_average_size program.
7 
8 !> Read a NetCDF file, average the size of all particles within each
9 !> bin, and write the data out as another NetCDF file.
11 
12  use pmc_aero_state
13  use pmc_gas_data
14  use pmc_gas_state
15  use pmc_env_state
16  use pmc_aero_data
17  use pmc_bin_grid
18  use pmc_output
19  use netcdf
20 
21  character(len=1000) :: in_filename, out_prefix
22  type(bin_grid_t) :: bin_grid
23  type(aero_data_t) :: aero_data
24  type(aero_state_t) :: aero_state
25  type(gas_data_t) :: gas_data
26  type(gas_state_t) :: gas_state
27  type(env_state_t) :: env_state
28  integer :: n_bin, index, i_repeat, output_type
29  real(kind=dp) :: d_min, d_max, time, del_t
30  character(len=1000) :: tmp_str
31  logical :: record_removals, dry_volume, bin_center, record_optical
32  logical :: preserve_number
33  character(len=PMC_UUID_LEN) :: uuid
34 
35  ! process commandline arguments
36  if (command_argument_count() .ne. 8) then
37  write(6,*) 'Usage: bin_average_size <d_min> <d_max> <n_bin> ' &
38  // '<"wet" or "dry"> <"center" or "average"> ' &
39  // '<"number" or "volume"> ' &
40  // '<input_filename> <output_prefix>'
41  write(6,*) ''
42  write(6,*) ' d_min: minimum bin diameter (m)'
43  write(6,*) ' d_max: maximum bin diameter (m)'
44  write(6,*) ' n_bin: number of bins'
45  write(6,*) ' wet/dry: average wet or dry sizes'
46  write(6,*) ' center/average: set new sizes to bin centers, ' &
47  // 'or to average sizes'
48  write(6,*) ' number/volume: preserve number or volume'
49  write(6,*) ' input_filename: like scenario_0001_00000001.nc'
50  write(6,*) ' output_prefix: like scenario_size_average'
51  stop 2
52  endif
53  call get_command_argument(1, tmp_str)
54  d_min = string_to_real(tmp_str)
55  call get_command_argument(2, tmp_str)
56  d_max = string_to_real(tmp_str)
57  call get_command_argument(3, tmp_str)
58  n_bin = string_to_integer(tmp_str)
59  call get_command_argument(4, tmp_str)
60  if (trim(tmp_str) == "wet") then
61  dry_volume = .false.
62  elseif (trim(tmp_str) == "dry") then
63  dry_volume = .true.
64  else
65  write(6,*) 'Argument 4 must be "wet" or "dry", not ' &
66  // trim(tmp_str)
67  stop 1
68  end if
69  call get_command_argument(5, tmp_str)
70  if (trim(tmp_str) == "center") then
71  bin_center = .true.
72  elseif (trim(tmp_str) == "average") then
73  bin_center = .false.
74  else
75  write(6,*) 'Argument 5 must be "center" or "average", not ' &
76  // trim(tmp_str)
77  stop 1
78  end if
79  call get_command_argument(6, tmp_str)
80  if (trim(tmp_str) == "number") then
81  preserve_number = .true.
82  elseif (trim(tmp_str) == "volume") then
83  preserve_number = .false.
84  else
85  write(6,*) 'Argument 6 must be "number" or "volume", not ' &
86  // trim(tmp_str)
87  stop 1
88  end if
89  call get_command_argument(7, in_filename)
90  call get_command_argument(8, out_prefix)
91 
92  call pmc_mpi_init()
93 
94  call bin_grid_make(bin_grid, bin_grid_type_log, n_bin, diam2rad(d_min), &
95  diam2rad(d_max))
96 
97  call input_state(in_filename, index, time, del_t, i_repeat, uuid, &
98  aero_data, aero_state, gas_data, gas_state, env_state)
99 
100  if (dry_volume) then
101  call aero_state_make_dry(aero_state, aero_data)
102  end if
103 
104  call aero_state_bin_average_size(aero_state, bin_grid, aero_data, &
105  bin_center, preserve_number)
106 
107  output_type = output_type_single
108  record_removals = .false.
109  record_optical = .true.
110  call output_state(out_prefix, output_type, aero_data, aero_state, &
111  gas_data, gas_state, env_state, index, time, del_t, i_repeat, &
112  record_removals, record_optical, uuid)
113 
114  call pmc_mpi_finalize()
115 
116 end program bin_average_size
pmc_mpi::pmc_mpi_init
subroutine pmc_mpi_init()
Initialize MPI.
Definition: mpi.F90:56
pmc_aero_state::aero_state_make_dry
subroutine aero_state_make_dry(aero_state, aero_data)
Make all particles dry (water set to zero).
Definition: aero_state.F90:2157
pmc_gas_data::gas_data_t
Constant gas data.
Definition: gas_data.F90:35
pmc_output::input_state
subroutine input_state(filename, index, time, del_t, i_repeat, uuid, aero_data, aero_state, gas_data, gas_state, env_state)
Read the current state.
Definition: output.F90:498
pmc_gas_data
The gas_data_t structure and associated subroutines.
Definition: gas_data.F90:9
pmc_constants::dp
integer, parameter dp
Kind of a double precision real number.
Definition: constants.F90:12
pmc_output::output_state
subroutine output_state(prefix, output_type, aero_data, aero_state, gas_data, gas_state, env_state, index, time, del_t, i_repeat, record_removals, record_optical, uuid)
Write the current state.
Definition: output.F90:112
pmc_env_state::env_state_t
Current environment state.
Definition: env_state.F90:29
pmc_util::string_to_integer
integer function string_to_integer(string)
Convert a string to an integer.
Definition: util.F90:688
pmc_aero_state
The aero_state_t structure and assocated subroutines.
Definition: aero_state.F90:9
pmc_gas_state
The gas_state_t structure and associated subroutines.
Definition: gas_state.F90:9
pmc_mpi::pmc_mpi_finalize
subroutine pmc_mpi_finalize()
Shut down MPI.
Definition: mpi.F90:89
pmc_util::diam2rad
real(kind=dp) elemental function diam2rad(d)
Convert diameter (m) to radius (m).
Definition: util.F90:277
pmc_output::output_type_single
integer, parameter output_type_single
Type code for single output (one file for all processes, written by process 0).
Definition: output.F90:97
pmc_aero_state::aero_state_bin_average_size
subroutine aero_state_bin_average_size(aero_state, bin_grid, aero_data, bin_center, preserve_number)
Set each aerosol particle to have its original species ratios, but total volume given by the average ...
Definition: aero_state.F90:1960
pmc_env_state
The env_state_t structure and associated subroutines.
Definition: env_state.F90:9
pmc_gas_state::gas_state_t
Current state of the gas mixing ratios in the system.
Definition: gas_state.F90:33
pmc_aero_data::aero_data_t
Aerosol material properties and associated data.
Definition: aero_data.F90:49
pmc_output
Write data in NetCDF format.
Definition: output.F90:68
bin_average_size
program bin_average_size
Read a NetCDF file, average the size of all particles within each bin, and write the data out as anot...
Definition: bin_average_size.F90:10
pmc_bin_grid
The bin_grid_t structure and associated subroutines.
Definition: bin_grid.F90:9
pmc_aero_data
The aero_data_t structure and associated subroutines.
Definition: aero_data.F90:9
pmc_bin_grid::bin_grid_t
1D grid, either logarithmic or linear.
Definition: bin_grid.F90:33
pmc_bin_grid::bin_grid_type_log
integer, parameter bin_grid_type_log
Logarithmically spaced bin grid.
Definition: bin_grid.F90:23
pmc_bin_grid::bin_grid_make
subroutine bin_grid_make(bin_grid, type, n_bin, min, max)
Generates the bin grid given the range and number of bins.
Definition: bin_grid.F90:84
pmc_aero_state::aero_state_t
The current collection of aerosol particles.
Definition: aero_state.F90:63
string_to_real
real(kind=dp) function string_to_real(string)
Convert a string to a real.
Definition: numeric_average.F90:108